データ分析 · 新しいリソース

Palantir Blueprint デザインシステム.

Blueprintを使って、密度の高いデータワークスペースを構築します。検証済みのタイポグラフィと意図のトークン、選択可能なデータセットテーブル、レビュー用インスペクター、完全なReactソースを備えています。

OpenDesign ガイド8章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種類が少数かつ固定されたデータセットには、ネイティブのセレクトを使用します。
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 のスタイルシートは、v6 コンポーネントの CSS の代わりにはなりません。パッケージのスタイルシートはアプリケーションのエントリーポイントで一度だけインポートし、アプリケーションのレイアウトルールは別のクラスにスコープします。

Palantir Blueprint デザインシステムの意図と色の役割

レコードのステータスと選択状態を分ける

warning の Tag はデータセットに確認が必要であることを示し、プライマリカラーで色付けされた行は選択中であることを示します。この2つの意味は独立しています。行を確認済みにするとラベルと intent は success に変わりますが、同じデータセットが選択されたままです。テーブルには各ステータスを示すテキストもあり、色だけに意味を担わせていません。

ダークモードはコンポーネント境界で適用する

このサンプルではラッパーに bp6-dark を追加し、ネイティブコンポーネントがダークモード用のスタイルを適用できるようにしています。上記のライトテーマの値は参考用のスナップショットであり、すべてのコンポーネントを上書きする指示ではありません。Dialog などのポータルを導入する場合は、描画されたコンテンツにも同じテーマコンテキストが適用されるようにしてください。ポータルを内包しないラッパーでは不十分です。

Palantir Blueprint レコードとメタデータのためのデザインシステムのタイポグラフィ

見出しを選ぶ前に本文の文字サイズを確認する

公開されている本文の文字サイズには 10、12、14、16px があり、標準の本文サイズは 14px です。データセット名には本文と同じ主要な文字サイズを使います。ID とレコード種別には補足テキストを使い、数値のレコード件数には表形式数字を使うことで、値が変わっても比較しやすくしています。主要なコンテンツに 10px を使うことは推奨していません。

インスペクターに簡潔な階層を設ける

インスペクターでは 20px の見出しと定義リストを使い、ID、担当者、種別、件数を表示します。ラベルと値は、安定した2列の配置で揃えます。確認メモはこれらの情報の後に区切り線を挟んで配置し、アクションをテーブルフィルターと誤認しないようにします。

Palantir Blueprint デザインシステムのテーブル、フィルター、インスペクター

テーブルのセマンティクスを保つ

HTMLTable は Blueprint のスタイルを適用したネイティブなテーブルを提供します。最初のセル内のボタンでレコードを選択でき、キーボードでも操作できます。この例では、ポインター操作専用の行ハンドラーだけを選択手段にしていません。interactive prop は行のホバー時のスタイルを適用し、condensed はフィルタリングとは独立して表示密度を切り替えます。

制御されたデータフローを明確にする

  1. 表示名でデータセットを検索します。
  2. 種別セレクターで同じコレクションを絞り込みます。
  3. 名前のボタンを選択してインスペクターに読み込みます。
  4. 確認メモを入力し、ローカルで確認を送信します。

Palantir Blueprint デザインシステムの間隔、サーフェス、表示密度

単位を小さくしても、すべての間隔を狭くしない

公開されているサーフェス間隔のトークンは 4px です。このワークベンチでは、アプリケーション側でその倍数を使っています。フィルターコントロール間は 12px、コレクションとインスペクターの間は 20px、デスクトップ用サンプルの周囲は 24px です。これらは CSS に示すレイアウト上の設計判断です。4px の角丸トークンにより、コントロールとサーフェスの形状を控えめにしています。

ラベルを削る前にレイアウトを変える

この例では、アプリケーション独自のブレークポイントである 800px で、インスペクターをコレクションの下に移動します。フィルターは折り返し、メインのパディングは 16px になり、必要に応じてテーブル専用の横スクロール領域が使われます。このブレークポイントはこのワークベンチ固有のものであり、Blueprint 全体に適用される公式のブレークポイントとして示しているわけではありません。

Palantir Blueprint デザインシステムの確認と空の状態

バリデーションは確認操作に含める

空のメモを送信すると、InputGroup と FormGroup の intent が danger に設定され、説明用の補助テキストが表示され、フィールドにフォーカスが移ります。テキストを入力するとエラーは解除されます。有効な内容を送信すると、選択中のローカルレコードだけが変更され、メモがクリアされます。また、データは送信されていないことを明記した成功 Callout が表示されます。

空のコレクションの近くに復帰手段を設ける

該当する結果がない場合の Callout には「フィルターをクリア」が表示されます。これを選択すると、検索クエリと種別セレクターの両方がリセットされ、コレクション全体が再表示されます。行の削除やインスペクターの変更は行いません。以下の状態の境界は意図的に設けています。

  • 選択を変えると、確認対象のレコードが変わります。確認ステータスは変わりません。
  • コンパクトモードで変わるのは表示密度であり、レコードの順序ではありません。
  • テーマを変えると見た目が変わります。現在のフィルターは変わりません。
  • ローカルでの確認に成功すると、1件のレコードが変更され、結果が通知されます。

Palantir Blueprint デザインシステムのフォーカスとアクセシブルなコンポーネントの使い方

各ネイティブコントロールにラベルを付ける

InputGroup には検索用のアクセシブルな名前を設定し、ラベル付きの確認フィールドには id を設定します。HTMLSelect には名前を付け、Switch には見えるラベルを表示します。また、各レコードは実際のボタンから開けるようにします。コントロールをスタイル付きの div に置き換えるのではなく、ライブラリの API を使ってください。

フォーカス表示を見える状態に保つ

パッケージのリファレンスでは、フォーカスの幅とオフセットがそれぞれ 2px とされています。Card や選択中の行の上でも、フォーカス表示が見えるようにしてください。キーボード利用者が、文書の順序に沿ってフィルター、行のボタン、確認フォームに移動できる必要があります。この例では、ステータスの段落と成功 Callout で結果を伝え、別の画面へ移動させません。

Palantir Blueprint デザインシステムのインストールとアプリケーションの境界

サンプルと同じソースを実行する

完全な App のソースとアプリケーション CSS を以下に示します。App は、Vite の React テンプレートが生成するルート要素にマウントされます。バージョンを固定した core パッケージをインストールすると、ネイティブコンポーネントとパッケージ 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の呼び出しでは、ViteのReact index.htmlにあるルート要素を使用します。

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 デザインシステム エージェントのセットアップ

実装の出発点

ネイティブプレビューはReact 18.3.1とBlueprint 6.21.0でバンドルして実行しました。選択したViteのリリースがサポートするNode.jsバージョンを使用してください。アプリケーションファイルはどちらも上記に記載しています。

シェル
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、ステータスを示すTag、キーボードで選択できる行を維持してください。フィルター、選択、密度、表示設定、レビュー状態はそれぞれ独立させてください。APIが提供された場合に限り、実際の保存サービスを追加してください。メモを失わずに、処理中と失敗のレスポンスを表示してください。レスポンシブなインスペクターと、視認できるフォーカス状態も維持してください。
05

Palantir Blueprint デザインシステムの出典と対象範囲

Blueprint 6.21.0を対象とするOpenDesignアプリケーションガイドです。実際のReactパッケージを実行する、独自のデータセットレビュー例を掲載しています。データセット名とレビュー結果はローカルのサンプルデータです。ワークベンチのレイアウトはアプリケーションコードで、リファレンス値はバージョンを指定した公開パッケージに基づいています。