Аналитика данных · Новый ресурс

Дизайн-система Palantir Blueprint.

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

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

Palantir Blueprint Предпросмотр интерфейса дизайн-системы

Фильтруйте по названию или типу, выбирайте набор данных, меняйте плотность строк и оформление, проверяйте заметку к проверке перед обновлением локального статуса.

Таблица наборов данных и панель проверкиОткрыть полный пример
Нативная Blueprint 6.21.0 с React 18.3.1. Оригинальная адаптивная компоновка рабочей области; сервера и сохранённой проверки нет. · Справочник по реализации
02

Palantir Blueprint Справочник по дизайн-системе

Ядро Blueprint 6.21.0, опубликованное CSS, и нативные компоненты React. Здесь приведены отдельные значения токенов светлой темы; для тёмного оформления используйте тёмную тему библиотеки, а не инвертируйте значения вручную. В примере CSS отдельно отмечены решения по компоновке приложения.

Цвета назначения и состояния взаимодействия

Источник
Название / правилоЗначение / конфигурацияПрименение
--bp-intent-primary-rest#2d72d2 Используйте заданную семантическую роль; сочетания состояний и цветов переднего плана должны оставаться согласованными.
--bp-intent-primary-hover#215db0 Используйте заданную семантическую роль; сочетания состояний и цветов переднего плана должны оставаться согласованными.
--bp-intent-primary-active#184a90 Используйте заданную семантическую роль; сочетания состояний и цветов переднего плана должны оставаться согласованными.
--bp-intent-primary-disabled#4c90f0 Используйте заданную семантическую роль; сочетания состояний и цветов переднего плана должны оставаться согласованными.
--bp-intent-primary-foreground#ffffff Используйте заданную семантическую роль; сочетания состояний и цветов переднего плана должны оставаться согласованными.
--bp-intent-success-rest#238551 Используйте заданную семантическую роль; сочетания состояний и цветов переднего плана должны оставаться согласованными.
--bp-intent-success-hover#1c6e42 Используйте заданную семантическую роль; сочетания состояний и цветов переднего плана должны оставаться согласованными.
--bp-intent-success-active#165a36 Используйте заданную семантическую роль; сочетания состояний и цветов переднего плана должны оставаться согласованными.
--bp-intent-success-disabled#32a467 Используйте заданную семантическую роль; сочетания состояний и цветов переднего плана должны оставаться согласованными.
--bp-intent-success-foreground#ffffff Используйте заданную семантическую роль; сочетания состояний и цветов переднего плана должны оставаться согласованными.
--bp-intent-warning-rest#c87619 Используйте заданную семантическую роль; сочетания состояний и цветов переднего плана должны оставаться согласованными.
--bp-intent-warning-hover#935610 Используйте заданную семантическую роль; сочетания состояний и цветов переднего плана должны оставаться согласованными.
--bp-intent-warning-active#77450d Используйте заданную семантическую роль; сочетания состояний и цветов переднего плана должны оставаться согласованными.
--bp-intent-warning-disabled#ec9a3c Используйте заданную семантическую роль; сочетания состояний и цветов переднего плана должны оставаться согласованными.
--bp-intent-warning-foreground#111418 Используйте заданную семантическую роль; сочетания состояний и цветов переднего плана должны оставаться согласованными.
--bp-intent-danger-rest#cd4246 Используйте заданную семантическую роль; сочетания состояний и цветов переднего плана должны оставаться согласованными.
--bp-intent-danger-hover#ac2f33 Используйте заданную семантическую роль; сочетания состояний и цветов переднего плана должны оставаться согласованными.
--bp-intent-danger-active#8e292c Используйте заданную семантическую роль; сочетания состояний и цветов переднего плана должны оставаться согласованными.
--bp-intent-danger-disabled#e76a6e Используйте заданную семантическую роль; сочетания состояний и цветов переднего плана должны оставаться согласованными.
--bp-intent-danger-foreground#ffffff Используйте заданную семантическую роль; сочетания состояний и цветов переднего плана должны оставаться согласованными.

Шкала типографики и начертания

Источник
Название / правилоЗначение / конфигурацияПрименение
--bp-typography-size-body-x-small10pxМасштабы основного текста, меток и вспомогательных данных; не используйте мелкие метаданные как основной размер текста для чтения.
--bp-typography-size-body-small12pxМасштабы основного текста, меток и вспомогательных данных; не используйте мелкие метаданные как основной размер текста для чтения.
--bp-typography-size-body-medium14pxМасштабы основного текста, меток и вспомогательных данных; не используйте мелкие метаданные как основной размер текста для чтения.
--bp-typography-size-body-large16pxМасштабы основного текста, меток и вспомогательных данных; не используйте мелкие метаданные как основной размер текста для чтения.
--bp-typography-size-heading-small16pxПрименяйте роль на указанном уровне иерархии; для чисел в таблицах дополнительно можно использовать табличные цифры.
--bp-typography-size-heading-medium20pxПрименяйте роль на указанном уровне иерархии; для чисел в таблицах дополнительно можно использовать табличные цифры.
--bp-typography-size-heading-large24pxПрименяйте роль на указанном уровне иерархии; для чисел в таблицах дополнительно можно использовать табличные цифры.
--bp-typography-size-heading-x-large28pxПрименяйте роль на указанном уровне иерархии; для чисел в таблицах дополнительно можно использовать табличные цифры.
--bp-typography-size-heading-display46pxПрименяйте роль на указанном уровне иерархии; для чисел в таблицах дополнительно можно использовать табличные цифры.
--bp-typography-size-code-small12pxПрименяйте роль на указанном уровне иерархии; для чисел в таблицах дополнительно можно использовать табличные цифры.
--bp-typography-size-code-medium13pxПрименяйте роль на указанном уровне иерархии; для чисел в таблицах дополнительно можно использовать табличные цифры.
--bp-typography-size-code-large14pxПрименяйте роль на указанном уровне иерархии; для чисел в таблицах дополнительно можно использовать табличные цифры.
--bp-typography-weight-default400Применяйте роль на указанном уровне иерархии; для чисел в таблицах дополнительно можно использовать табличные цифры.
--bp-typography-weight-bold600Применяйте роль на указанном уровне иерархии; для чисел в таблицах дополнительно можно использовать табличные цифры.
--bp-typography-line-height-default1.28581Применяйте роль на указанном уровне иерархии; для чисел в таблицах дополнительно можно использовать табличные цифры.
--bp-typography-line-height-large1.5Применяйте роль на указанном уровне иерархии; для чисел в таблицах дополнительно можно использовать табличные цифры.

Фоновые поверхности, границы и семантический текст

Источник
Название / правилоЗначение / конфигурацияПрименение
--bp-surface-border-color-default#5f6b7c1fИспользуйте заданную семантическую роль; сочетания состояний и цветов переднего плана должны оставаться согласованными.
--bp-surface-border-color-strong#5f6b7c40Используйте заданную семантическую роль; сочетания состояний и цветов переднего плана должны оставаться согласованными.
--bp-surface-border-width1pxИспользуйте заданную семантическую роль; сочетания состояний и цветов переднего плана должны оставаться согласованными.
--bp-surface-border-radius4pxИспользуйте заданную семантическую роль; сочетания состояний и цветов переднего плана должны оставаться согласованными.
--bp-surface-spacing4pxИспользуйте заданную семантическую роль; сочетания состояний и цветов переднего плана должны оставаться согласованными.
--bp-surface-background-color-default-rest#ffffff Используйте заданную семантическую роль; сочетания состояний и цветов переднего плана должны оставаться согласованными.
--bp-surface-background-color-default-hover#f6f7f9 Используйте заданную семантическую роль; сочетания состояний и цветов переднего плана должны оставаться согласованными.
--bp-typography-color-default-rest#1c2127 Используйте заданную семантическую роль; сочетания состояний и цветов переднего плана должны оставаться согласованными.
--bp-typography-color-muted#5f6b7c Используйте заданную семантическую роль; сочетания состояний и цветов переднего плана должны оставаться согласованными.

Фокус и анимация

Источник
Название / правилоЗначение / конфигурацияПрименение
--bp-emphasis-transition-duration100msИспользуйте заданную семантическую роль; сочетания состояний и цветов переднего плана должны оставаться согласованными.
--bp-emphasis-ease-defaultcubic-bezier(0.4, 1, 0.75, 0.9)Используйте заданную семантическую роль; сочетания состояний и цветов переднего плана должны оставаться согласованными.
--bp-emphasis-ease-bouncecubic-bezier(0.54, 1.12, 0.38, 1.11)Используйте заданную семантическую роль; сочетания состояний и цветов переднего плана должны оставаться согласованными.
--bp-emphasis-focus-color#2d72d2 Используйте заданную семантическую роль; сочетания состояний и цветов переднего плана должны оставаться согласованными.
--bp-emphasis-focus-width2pxИспользуйте заданную семантическую роль; сочетания состояний и цветов переднего плана должны оставаться согласованными.
--bp-emphasis-focus-offset2pxИспользуйте заданную семантическую роль; сочетания состояний и цветов переднего плана должны оставаться согласованными.
--bp-emphasis-motion-reduced0Используйте заданную семантическую роль; сочетания состояний и цветов переднего плана должны оставаться согласованными.

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

Источник
Название / правилоЗначение / конфигурацияПрименение
HTMLTablestriped · interactive · condensedНативная семантическая таблица; свойство condensed меняет плотность, но не данные.
InputGroupvalue · onChange · intentУправляемый поиск и заметка к проверке; приложение задаёт намерение danger для невалидных данных.
FormGrouplabelFor · helperText · intentСвяжите поле с видимой меткой и объясните, почему заметка невалидна.
HTMLSelectoptions · value · onChangeНативный элемент select для небольшого фиксированного набора типов данных.
Tagminimal · intentСопровождайте текст статуса оформлением success или warning.
Buttonintent="primary" · type="submit"Сохраняйте локальный результат проверки с помощью настоящей формы; кнопки выбора остаются второстепенными.
Switchchecked · onChangeНезависимые элементы управления оформлением и плотностью.
Calloutintent · titleОбъясняйте отсутствие результатов или исход действия; не передавайте статус только с помощью цвета.
03

Palantir Blueprint Полное руководство по дизайн-системе

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

DESIGN-palantir-blueprint.md

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

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

Дизайн-система Palantir Blueprint: рабочая область для работы с данными

Плотные элементы управления с чёткой последовательностью чтения

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

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

Используйте контракт пакета v6

Пример собран с @blueprintjs/core 6.21.0. Пространство имён CSS — bp6, а опубликованные семантические токены начинаются с --bp-. Таблица стилей bp5 не заменяет компоненты CSS версии v6. Импортируйте таблицу стилей пакета один раз в точке входа приложения, а правила компоновки приложения задавайте для отдельного класса.

Дизайн-система Palantir Blueprint: назначение цветов и роли

Отделяйте статус записи от её выбора

Тег warning означает, что набор данных требует проверки; строка с основным оттенком показывает, что он выбран. Это независимые значения. При отметке записи как проверенной её метка и намерение меняются на success, а выбранным остаётся тот же набор данных. Для каждого статуса в таблице есть текст, поэтому смысл не зависит только от цвета.

Ограничивайте тёмный режим уровнем компонентов

В примере к обёртке добавлен класс bp6-dark, чтобы нативные компоненты применяли тёмные стили. Приведённые выше значения светлой темы — справочный снимок, а не указание переопределять стили каждого компонента. При добавлении портала, например Dialog, убедитесь, что его содержимое получает тот же контекст темы: обёртки, которая не содержит портал, недостаточно.

Palantir Blueprint — типографика дизайн-системы для записей и метаданных

Сначала изучите шкалу основного текста, затем выбирайте заголовки

Опубликованные размеры основного текста: 10, 12, 14 и 16px; средний размер — 14px. Названия наборов данных набраны основным кеглем. Для идентификаторов и типов записей используется вспомогательный текст, а числовые количества записей набраны табличными цифрами, чтобы их было проще сравнивать при изменении значений. Руководство не рекомендует использовать 10px для основного содержимого.

Создайте компактную иерархию в панели сведений

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

Palantir Blueprint — таблица, фильтры и панель сведений дизайн-системы

Сохраняйте семантику таблицы

HTMLTable предоставляет нативную таблицу со стилями Blueprint. Кнопки в первой ячейке позволяют выбирать записи и доступны с клавиатуры; в примере обработчик строки, работающий только при нажатии указателем, не является единственным способом выбора. Свойство interactive включает подсветку строки при наведении, а condensed независимо от фильтрации переключает плотность.

Сделайте поток управляемых данных наглядным

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

Palantir Blueprint — интервалы, поверхности и плотность дизайн-системы

Используйте меньшую единицу, не превращая каждый отступ в крошечный

Опубликованный токен интервала для поверхностей — 4px. В рабочей области используются кратные значения: 12px между элементами фильтра, 20px между коллекцией и панелью сведений, 24px вокруг настольного примера. Это композиционные решения, показанные в CSS. Токен радиуса скругления 4px помогает сохранить сдержанную геометрию элементов управления и поверхностей.

Сначала измените компоновку, а не убирайте подписи

При контрольной точке приложения 800px из примера панель сведений перемещается под коллекцию. Фильтры переносятся на следующую строку, внутренний отступ основной области уменьшается до 16px, а для таблицы при необходимости появляется отдельная горизонтальная прокрутка. Эта контрольная точка относится к данной рабочей области и не представлена как официальная универсальная контрольная точка Blueprint.

Palantir Blueprint — проверка и пустые состояния дизайн-системы

Проверка данных — часть операции проверки записи

При отправке пустой заметки для InputGroup и FormGroup задаётся намерение danger, отображается поясняющий вспомогательный текст, а фокус перемещается в поле. После ввода текста ошибка очищается. При успешной отправке изменяется только выбранная локальная запись, заметка очищается, а в Callout об успехе явно указано, что данные не отправлялись.

Разместите способ восстановления рядом с пустой коллекцией

Callout для состояния «Ничего не найдено» предлагает очистить фильтры. Он сбрасывает поисковый запрос и выбор типа, возвращая всю коллекцию. Строки не удаляются, панель сведений не изменяется. Следующие границы состояний заданы намеренно:

  • Выбор меняет отображаемую запись, а не статус её проверки.
  • Компактный режим меняет плотность, но не порядок записей.
  • Смена темы меняет внешний вид, но не текущие фильтры.
  • После успешной локальной проверки изменяется одна запись и отображается сообщение о результате.

Palantir Blueprint — фокус и доступное использование компонентов дизайн-системы

Добавьте подпись к каждому нативному элементу управления

Для поиска InputGroup получает доступное имя, а для поля проверки — id, связанный с подписью. У HTMLSelect есть собственное имя, Switch отображает видимые подписи, а каждую запись можно открыть настоящей кнопкой. Используйте API этих библиотечных компонентов, а не заменяйте элементы управления стилизованными div.

Сохраняйте видимую индикацию фокуса

В справочнике пакета указаны ширина обводки фокуса 2px и смещение 2px. Индикация фокуса должна оставаться заметной на Card и выбранных строках. Пользователи клавиатуры должны иметь возможность последовательно перейти к фильтрам, кнопкам строк и форме проверки. Абзац состояния и Callout об успехе в примере сообщают о результатах, не перемещая читателя на другой экран.

Palantir Blueprint — установка и границы приложения дизайн-системы

Запустите тот же исходный код, что и в примере

Ниже приведены полный исходный код App и приложение CSS. App монтируется в корневой элемент, созданный шаблоном Vite React. Установка закреплённой версии основного пакета предоставляет нативные компоненты и пакет CSS; для текстового примера не нужны скрытые ресурсы дизайн-системы.

Дополните процесс проверки реальным механизмом сохранения

Palantir Blueprint — примеры компонентов дизайн-системы

main.jsx — приложение для проверки наборов данных целиком

Полная композиция из нативных компонентов: фильтрация, выбор, плотность, тема, проверка поля и локальный результат проверки.

jsx
import React, { useState } from "react";
import { createRoot } from "react-dom/client";
import {
  Button,
  Card,
  Callout,
  FormGroup,
  HTMLSelect,
  HTMLTable,
  InputGroup,
  Switch,
  Tag,
} from "@blueprintjs/core";
import "@blueprintjs/core/lib/css/blueprint.css";
import "./blueprint.css";
const initial = [
  {
    id: "D-1042",
    name: "Harbor sensors",
    type: "Telemetry",
    rows: "18,420",
    owner: "Maya",
    status: "Reviewed",
  },
  {
    id: "D-1043",
    name: "Transit stops",
    type: "Reference",
    rows: "842",
    owner: "Alex",
    status: "Needs review",
  },
  {
    id: "D-1044",
    name: "Water samples",
    type: "Field survey",
    rows: "2,608",
    owner: "Sam",
    status: "Reviewed",
  },
  {
    id: "D-1045",
    name: "Street survey",
    type: "Field survey",
    rows: "4,120",
    owner: "Lee",
    status: "Needs review",
  },
];
function App() {
  const [dark, setDark] = useState(false),
    [compact, setCompact] = useState(false),
    [query, setQuery] = useState(""),
    [rows, setRows] = useState(initial),
    [selected, setSelected] = useState(initial[1]),
    [note, setNote] = useState(""),
    [notice, setNotice] = useState(""),
    [error, setError] = useState(false),
    [type, setType] = useState("All");
  const visible = rows.filter(
    (r) =>
      r.name.toLowerCase().includes(query.toLowerCase()) &&
      (type === "All" || r.type === type),
  );
  function review(e) {
    e.preventDefault();
    if (!note.trim()) {
      setError(true);
      document.getElementById("review-note").focus();
      return;
    }
    const updated = { ...selected, status: "Reviewed" };
    setRows(rows.map((r) => (r.id === selected.id ? updated : r)));
    setSelected(updated);
    setNotice(
      `${selected.name} marked reviewed in this local example. No data was sent.`,
    );
    setNote("");
    setError(false);
  }
  return (
    <main className={"specimen " + (dark ? "bp6-dark" : "")}>
      <header>
        <div>
          <span className="eyebrow">BLUEPRINT · DATA WORKSPACE</span>
          <h1 className="bp6-heading">Dataset review</h1>
          <p className="bp6-text-muted">
            Inspect a record and attach a review note.
          </p>
        </div>
        <Switch
          label="Dark theme"
          checked={dark}
          onChange={(e) => setDark(e.target.checked)}
        />
      </header>
      <div className="workbench">
        <Card className="collection">
          <div className="toolbar">
            <InputGroup
              aria-label="Find a dataset"
              placeholder="Find a dataset…"
              value={query}
              onChange={(e) => setQuery(e.target.value)}
            />
            <HTMLSelect
              aria-label="Dataset type"
              value={type}
              onChange={(e) => setType(e.target.value)}
              options={["All", "Telemetry", "Reference", "Field survey"]}
            />
            <Switch
              label="Compact rows"
              checked={compact}
              onChange={(e) => setCompact(e.target.checked)}
            />
          </div>
          <p className="bp6-text-small bp6-text-muted" role="status">
            {visible.length} matching datasets
          </p>
          <div className="table-scroll">
            <HTMLTable
              striped
              interactive
              condensed={compact}
              style={{ width: "100%" }}
            >
              <thead>
                <tr>
                  <th>Name</th>
                  <th>Records</th>
                  <th>Status</th>
                </tr>
              </thead>
              <tbody>
                {visible.map((r) => (
                  <tr
                    key={r.id}
                    className={selected.id === r.id ? "selected" : ""}
                  >
                    <td>
                      <Button
                        variant="minimal"
                        onClick={() => {
                          setSelected(r);
                          setError(false);
                          setNote("");
                        }}
                        text={r.name}
                      />
                      <div className="bp6-text-small bp6-text-muted">
                        {r.id} · {r.type}
                      </div>
                    </td>
                    <td className="numeric">{r.rows}</td>
                    <td>
                      <Tag
                        minimal
                        intent={r.status === "Reviewed" ? "success" : "warning"}
                      >
                        {r.status}
                      </Tag>
                    </td>
                  </tr>
                ))}
              </tbody>
            </HTMLTable>
          </div>
          {!visible.length && (
            <Callout title="No matching datasets">
              Clear the search or choose a different dataset type.
              <Button
                variant="minimal"
                onClick={() => {
                  setQuery("");
                  setType("All");
                }}
              >
                Clear filters
              </Button>
            </Callout>
          )}
        </Card>
        <Card className="inspector">
          <span className="eyebrow">SELECTED DATASET</span>
          <h2 className="bp6-heading">{selected.name}</h2>
          <dl>
            <dt>Dataset ID</dt>
            <dd>
              <code>{selected.id}</code>
            </dd>
            <dt>Owner</dt>
            <dd>{selected.owner}</dd>
            <dt>Type</dt>
            <dd>{selected.type}</dd>
            <dt>Records</dt>
            <dd>{selected.rows}</dd>
          </dl>
          <form onSubmit={review}>
            <FormGroup
              label="Review note"
              labelFor="review-note"
              intent={error ? "danger" : "none"}
              helperText={
                error
                  ? "Add a note describing what you checked."
                  : "A short note keeps the decision understandable."
              }
            >
              <InputGroup
                id="review-note"
                value={note}
                intent={error ? "danger" : "none"}
                aria-invalid={error}
                onChange={(e) => {
                  setNote(e.target.value);
                  setError(false);
                }}
              />
            </FormGroup>
            <Button intent="primary" type="submit" fill>
              Mark reviewed locally
            </Button>
          </form>
          <p className="bp6-text-small bp6-text-muted">
            Selection, filters and review notes exist only in this preview.
          </p>
        </Card>
      </div>
      {notice && (
        <Callout intent="success" role="status">
          {notice}
        </Callout>
      )}
      <footer>
        Native Blueprint 6.21.0 · HTMLTable, Card, FormGroup, InputGroup,
        Switch, Tag and Callout.
      </footer>
    </main>
  );
}
createRoot(document.getElementById("root")).render(<App />);

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

  • Сохраните этот код как src/main.jsx, а следующий пример — как src/blueprint.css.
  • Вызов createRoot использует корневой элемент из index.html шаблона Vite React.

blueprint.css — адаптивная компоновка рабочей области

Правила компоновки приложения дополняют импортированные нативные компоненты CSS. Контрольная точка 800px и панель сведений шириной 260px — явно заданные решения для этого примера.

css
* {
  box-sizing: border-box;
}
body {
  margin: 0;
}
.specimen {
  padding: 24px;
  background: #f6f7f9;
  color: #1c2127;
  font-size: 14px;
}
.specimen.bp6-dark {
  background: #252a31;
  color: #f6f7f9;
}
.specimen header {
  display: flex;
  justify-content: space-between;
  gap: 16px;
  align-items: center;
  margin-bottom: 24px;
}
.eyebrow {
  font-size: 10px;
  font-weight: 600;
  letter-spacing: 0.08em;
  color: var(--bp-typography-color-muted);
}
h1.bp6-heading {
  margin: 8px 0;
  font-size: 28px;
}
.workbench {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 260px;
  gap: 20px;
}
.collection,
.inspector {
  min-width: 0;
}
.toolbar {
  display: flex;
  flex-wrap: wrap;
  gap: 12px;
  align-items: center;
}
.toolbar > .bp6-input-group {
  flex: 1;
  min-width: 150px;
}
.toolbar .bp6-control {
  margin: 0;
}
.table-scroll {
  overflow: auto;
}
table td {
  vertical-align: middle !important;
}
.numeric {
  font-variant-numeric: tabular-nums;
}
tr.selected td {
  background: #2d72d20d !important;
}
.inspector h2 {
  font-size: 20px;
  margin-top: 12px;
}
.inspector dl {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 12px;
  margin: 24px 0;
}
.inspector dt {
  color: var(--bp-typography-color-muted);
}
.inspector dd {
  margin: 0;
}
.inspector form {
  border-top: 1px solid var(--bp-surface-border-color-default);
  padding-top: 20px;
}
.inspector p {
  margin: 16px 0 0;
}
.specimen > .bp6-callout {
  margin-top: 20px;
}
.specimen footer {
  font-size: 11px;
  margin-top: 24px;
  color: var(--bp-typography-color-muted);
}
@media (max-width: 800px) {
  .workbench {
    grid-template-columns: 1fr;
  }
  .specimen {
    padding: 16px;
  }
  .specimen header {
    align-items: start;
  }
  .toolbar {
    gap: 16px;
  }
  h1.bp6-heading {
    font-size: 24px;
  }
}
@media (prefers-reduced-motion: reduce) {
  * {
    transition: none !important;
  }
}

.bp6-dark .eyebrow,
.bp6-dark .inspector dt,
.bp6-dark footer {
  color: #abb3bf;
}

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

  • Класс bp6-dark включает тему библиотеки; фон холста примера — CSS приложения.
04

Palantir Blueprint — настройка AI-агента дизайн-системы

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

Нативный пример был собран и запущен с помощью React 18.3.1 и Blueprint 6.21.0. Используйте версию Node.js, совместимую с выбранной вами версией Vite. Оба файла приложения приведены выше.

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

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

Промпт для AI-агента
Создайте рабочую область для проверки наборов данных с помощью Blueprint 6.21.0. Изучите предоставленные токены и полный пример React/CSS. Сохраните нативные HTMLTable, InputGroup/FormGroup с подписями, Tags состояния и доступный с клавиатуры выбор строк. Не связывайте состояния фильтра, выбора, плотности, оформления и проверки. Добавляйте реальный сервис сохранения только после предоставления его API; отображайте состояния ожидания и ошибки, не теряя заметку. Сохраните адаптивную панель сведений и видимую индикацию фокуса.
05

Palantir Blueprint — источники и область применения дизайн-системы

OpenDesign — руководство по приложению для Blueprint 6.21.0 с оригинальным примером проверки наборов данных, использующим настоящий пакет React. Названия наборов данных и результаты проверки — локальные примеры данных. Компоновка рабочей области реализована в коде приложения; справочные значения взяты из опубликованного пакета соответствующей версии.