ウィジェットのスタイル設定

ウィジェットの外観はトークンの集まりです。パーツの種類ごとの角の丸み、コントロールとバーのサイズ、文字、枠線、影、 選択中のボタンの見せ方、そしてツールバーと描画ツールを端に沿わせるか浮かせるか。プリセットから始めて、好きなところを 変えられます。色はテーマ(dark / light。API リファレンスを参照)が 受け持ち、どの外観もどちらのテーマとも組み合わせられます。

● デモ自分だけの外観ブラウザー内で生成したシミュレーション市場データ

プリセット

プリセット外観
studio(既定)コントロールは 7 px、メニューは 11 px、ダイアログは 16 px の角丸。グループは区切り線ではなく余白で分け、メニューは 柔らかい影の上に浮かび、時間足のボタンはセグメント型のトラックに収まり、選択中のボタンは淡い色で塗られます。
terminal高密度で角張った外観。角は 2 px、コントロールは 26 px、グループの間に区切り線が入り、ラベルは大文字で、選択中の ボタンには下線が付きます。チャート上の価格ラベルも角張った形になります。
capsule価格ラベルも含め、あらゆる所がピル形です。ツールバーと描画ツールは島のように浮かび、メニューはすりガラス風で、 選択中のボタンは塗りつぶしのピルになります。

外観を選ぶ

import { ChartWidget, ChartWidgetGrid } from '@tradecanvas/chart/widget'

const widget = new ChartWidget(host, { ui: 'terminal' })
widget.setUI('capsule')        // in place: nothing is rebuilt
widget.getUI()                 // every token, resolved

// A grid: every chart and the grid's bar, and the charts it adds later
const grid = new ChartWidgetGrid(host, { layout: '2x2', widget: { ui: 'terminal' } })
grid.setUI('studio')
grid.getUI()

独自の外観

テーマはプリセット(指定しなければ Studio)から始まり、指定した項目だけを変更します。スケールで設定した角の丸みは、 そのスケールに従うすべてのパーツに反映されます。パーツ個別の値を設定した場合は、そちらが使われます。

widget.setUI({
  preset: 'studio',
  radius: { xs: 3, sm: 5, md: 10, lg: 12, xl: 18 },  // the scale, px (999: pills)
  components: { dialog: 20, tag: 0 },                // a part's own corners
  density: 'compact',                                // compact · comfortable · spacious
  sizes: { toolbar: 40 },                            // px; wins over density
  font: {
    family: "'Manrope', system-ui, sans-serif",
    mono: "'JetBrains Mono', monospace",
    size: 13, weight: 500, strongWeight: 600,
    labelCase: 'uppercase', labelTracking: 0.06,      // small labels
  },
  borders: { width: 1, separators: true },           // rules between toolbar groups
  shadows: { menu: '0 12px 30px rgba(0, 0, 0, 0.4)' },
  blur: 12,                                          // frosted floating surfaces, px
  active: 'solid',                                   // tint · solid · underline
  toolbar: 'floating',                               // docked · floating
  sidebar: 'floating',
  intervals: 'segmented',                            // plain · segmented
  tagRadius: 999,                                    // the chart's price tags and pills
})
フィールド設定する内容
radius角の丸みのスケール xs、sm、md、lg、xl(px、0–999)。
componentsパーツ個別の角の丸み:control(ボタン)、input、menu、dialog、 panel(アラート、データウィンドウ、注文チケット)、tooltip、tag、toast、 toolbar と sidebar(浮かせたときに見える、それ自体の枠)。既定では、コントロールと入力欄は md、メニューとパネルは lg、ダイアログは xl、ツールチップとタグは sm に従います。
density / sizestoolbar の高さ、control と controlSmall の高さ、icon、 sidebar の幅、menuItem の高さ(px)。
fontフォントファミリー(CSS のリスト)、本文の size(11–20 px。小さいサイズはこれに連動)、ウェイト、そしてセクション 見出しなど小さなラベルの大文字・小文字と字間(em)。
borders枠線の太さと、ツールバーのグループ間や描画ツールの間に区切り線を入れるかどうか。
shadowsメニュー、ダイアログ、ツールチップの CSS の影。
blurすりガラス風のメニュー(px)。0 より大きいと、メニューの背後にチャートがぼけて透けて見えます。
active選択中のボタンの見せ方:淡い色の塗り、塗りつぶしのピル、または下線。
toolbar / sidebar端に沿わせるか、島のように浮かせるか。
intervals時間足のボタンをそのまま並べるか、セグメント型のトラックに収めるか。
tagRadiusチャートが描く価格ラベル、軸のピル、注文バッジの角の丸み。

使えない値(範囲外の値や、宣言の外に抜け出しうる CSS)は無視され、プリセットの値がそのまま残ります。

フォント

ウィジェットはフォントを読み込みません。名前を指定するだけで、ブラウザーがリストの順にフォールバックします。 Studio は Manrope、次に Inter、Terminal は IBM Plex Sans Condensed と IBM Plex Mono、Capsule は Sora を指定しています。 使いたいフォントは自分で読み込んでください。

<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600;700&display=swap">

CSS 変数

トークンは、ウィジェットのルート要素(とそのダイアログ)に設定された CSS 変数です。ui オプションがなければ 値はスタイルシートのもの(つまり Studio の値)のままなので、独自の CSS で設定できます。ウィジェットは自身の スタイルシートをページの先頭に置くため、.tcw-root に書いたあなたのルールが優先されます。ui を指定すると、ウィジェットが要素に直接値を書き込み、そちらが優先されます。

.tcw-root {
  --tcw-radius: 4px;            /* the md corner: buttons and fields follow it */
  --tcw-dialog-radius: 12px;
  --tcw-control-h: 28px;
  --tcw-font: 'Inter', system-ui, sans-serif;
}
変数元になる設定
--tcw-radius-xs、-sm、--tcw-radius、-lg、-xlradius
--tcw-control-radius、--tcw-input-radius、--tcw-menu-radius、--tcw-dialog-radius、--tcw-panel-radius、--tcw-tooltip-radius、--tcw-tag-radius、--tcw-toast-radius、--tcw-toolbar-radius、--tcw-sidebar-radiuscomponents
--tcw-toolbar-h、--tcw-control-h、--tcw-control-h-sm、--tcw-icon、--tcw-sidebar-w、--tcw-menu-item-hsizes
--tcw-font、--tcw-font-mono、--tcw-font-size(と -sm、-xs、-lg)、--tcw-weight、--tcw-weight-strong、--tcw-label-case、--tcw-label-trackingfont
--tcw-border-w、--tcw-sep-wborders
--tcw-menu-shadow、--tcw-dialog-shadow、--tcw-tooltip-shadowshadows
--tcw-blur、--tcw-surface-opacityblur

レイアウトの切り替えは、同じ要素の data 属性として公開されており、独自の CSS に使えます: data-tcw-ui(プリセット)、data-tcw-active、data-tcw-toolbar、 data-tcw-sidebar、data-tcw-intervals、data-tcw-separators(on / off)。

チャートの見た目:スタイルのオーバーライド

テーマはチャート全体の色を決めます。チャートが描くどの部分も、キーで個別に設定できます:方向ごとのグリッド線、 クロスヘア、軸、ペイン、凡例、最新価格、出来高、セッションの区切り、そしてチャートタイプごとのメイン系列。 設定していないキーはテーマに従うので、テーマを切り替えれば設定していない部分の色も変わります。

import { Chart } from '@tradecanvas/chart'

const chart = new Chart(host, {
  overrides: { 'grid.vertical.visible': false },       // 最初から
})

chart.applyOverrides({
  'series.candlestick.upColor': '#26a69a',              // 上昇/下落のあるタイプはすべてこれに従う
  'series.candlestick.downColor': '#ef5350',
  'grid.horizontal.style': 'dotted',
  'crosshair.vertical.style': 'solid',
  'crosshair.labelBackground': '#2962ff',
  'lastPrice.style': 'solid',
  'panes.background': '#0d1117',
  'legend.textColor': '#c9d1d9',
})
chart.applyOverrides({ 'legend.textColor': null })      // null でキーを外す
chart.resetOverrides(['grid.horizontal.style'])         // またはキーを指定
chart.setOverrides({ 'background.color': '#000' })      // レイヤーをまるごと

chart.getStyleValue('series.bar.upColor')               // '#26a69a': キーの最終的な値
chart.getStyle().grid.vertical                          // { visible: false, color, style, width }
chart.on('styleChange', (e) => e.payload.layer)         // 'host' | 'user'

キー

キー設定する内容
background.colorチャートの背景(ペインに独自の背景がなければペインも)。
panes.background, .separatorColor, .titleColorインジケーターのペイン:背景、上端のバー、名前。
grid.horizontal.*, grid.vertical.*visible、color、style(solid · dashed · dotted)、width。方向ごとに別々。
crosshair.horizontal.*, crosshair.vertical.*クロスヘアの線にも同じ 4 つ(既定は破線)。
crosshair.labelBackground, .labelTextColor軸とペインの目盛り上の価格・時刻ラベル。
axis.price.lineColor, .textColor, axis.time.*各軸の線とラベル(ペインの目盛りは価格軸に従う)。
legend.textColor, .labelColor凡例の値と、そのラベル(O、H、L、Vol)。
lastPrice.visible, .upColor, .downColor, .style, .width最新価格の線とタグ。未設定なら色はメイン系列に従う。
volume.upColor, .downColor出来高のバー。
sessionBreaks.color, .style, .width日・週・月の区切り線。
highLow.color, watermark.color高値・安値の線、ウォーターマーク。
trading.buyColor, .sellColor, .profitColor, .lossColor, .entryColor注文(買い・売り)とポジション(利益・損失・エントリー)。チャート上と価格軸の両方で、取引設定の色より優先されます。
markers.longColor, .shortColor, .neutralColorシグナルのマーク。それ自身のスタイルより優先されます。
tradeZones.profitColor, .lossColor, .activeColor取引ゾーン:勝ち、負け、建玉中。
drawings.handleColor選択中の描画のハンドル(未設定なら白)。
series.<type>.*そのタイプで描かれるときのメイン系列:upColor、downColor、wickUpColor、 wickDownColor(ローソク足、平均足、出来高ローソク足、エクイボリューム)、color / lineColor と lineWidth(ライン、ステップライン、マーカー付きライン、エリア、HLC エリア、ベースライン)、topColor と bottomColor(エリア、HLC エリア)。

CHART_STYLE_KEYS にはすべてのキーと値の種類が並び、TypeScript が書いた時点でキーと値を検査します。 上昇/下落の色は series.candlestick.*、線の色と太さは series.line.*、塗りは series.area.*、最後にテーマに従います。実体の色を設定すると、ヒゲもその色になります。 不明なキーや値は警告とともに無視されます。

アプリのものとユーザーのもの

オーバーライドには 2 つのレイヤーがあります。あなたのもの(layer: 'host'、既定)はテーマを切り替えても残り、 保存されません。ユーザーのもの(layer: 'user')はあなたのものより優先され、設定したテーマごとに保たれ — ダークテーマで選んだ色はダークテーマに戻ると戻ってきます — saveState() で保存されます。ウィジェットの設定は ユーザーのレイヤーに書き込み、リセットはどのテーマでもそのテーマの色に戻します。 「スタイル」タブはこれらのキーでチャートの各部分を設定し、表示中のチャートタイプの色も含みます。「取引」タブは注文、 ポジション、シグナルのマーク、取引ゾーンの色を設定します。部品自身に任せた色は「自動」と表示され、「自動」で戻せます。

chart.applyOverrides({ 'background.color': '#0b0b0f' }, { layer: 'user' })
chart.getOverrides({ layer: 'user' })                 // 現在のテーマでのユーザーのもの
chart.getTheme()                           // 設定したとおりのテーマ:オーバーライドは別に持つ

グリッドとクロスヘアのオプション(grid.hLineColor、crosshair.vLine.style…)は対応するキーの 省略形です。複数チャートのグリッドはすべてのチャートにオーバーライドを適用します:grid.applyOverrides(patch)。 React、Vue、Svelte のコンポーネントは overrides プロパティで受け取ります。

インジケーターのプロットとペイン

// プロットごとの線種と表示、キーで指定(色と太さは colors / lineWidths のまま)
chart.updateIndicatorStyle(macdId, { plots: { signal: { lineStyle: 'dashed' }, histogram: { visible: false } } })

// これから追加する同じ種類のインジケーターの初期スタイル
chart.setIndicatorDefaults('ema', { colors: ['#f5a623'], lineWidths: [2] })

// ペイン独自の背景と区切り線。インジケーターとともに保存
chart.setPaneStyle(rsiId, { background: '#101418', separator: '#f5a623' })

非表示のプロットは値タグも凡例の値も出ません。すべてのインジケーターが非表示のプロットを描かず、ほぼすべてが プロットの線種にも従います。独自の図形を描く一部(パラボリック SAR の点、Supertrend、ジグザグ、 出来高プロファイル)は自分の線を保ちます。

チャートのラベル

ウィジェットは tagRadius を自身のチャートに渡します(chartOptions.shapes で指定した形は、 setUI を呼ぶまで保たれます)。ウィジェットを使わない素の Chart では、形を自分で設定して ください。この設定はテーマを切り替えても保たれます。この形は、価格ラベル、軸とクロスヘアのピル、注文・ポジション・ ブラケット注文のラベル、前期間のレベルのラベルに使われます。

const chart = new Chart(host, { shapes: { tagRadius: 4 } })
chart.setShapes({ tagRadius: 999 })   // pill price tags, axis pills and order badges
chart.getShapes()

OHLCV 凡例

チャート上部の凡例はポインタ下のバー(なければ最後のバー)を表示します:始値、高値、安値、終値、変化と出来高。各値は桁が変わっても位置を保つので、リアルタイムの更新でちらつきません。まるごと消すことも、必要な行だけにすることもできます。ウィジェットではルックのフォントを、その下に並ぶインジケーター行と同じサイズで使います。setUI は自前の setLegend の後でもそれを設定し直します。

new Chart(host, { features: { legend: false } })   // no legend at all
chart.setLegend({ visible: false })                  // or at any time
chart.setLegend({
  showSymbol: false, showOHLC: true, showChange: true, showVolume: false,
  position: 'top-right',
  fontSize: 11,
  fontFamily: 'Inter, sans-serif',                   // null: the theme's font
})

// The widget: start with it off (the user can still turn it on in Settings)
new ChartWidget(host, { chartOptions: { features: { legend: false } } })

出来高の色

出来高バーはテーマの volumeUp と volumeDown (または volume.* キー) を使います。volumeColor(candleColor) はローソク足の色を出来高用の透明度にした色を返すので、独自のテーマでもバーはローソク足の背景にとどまります。widget の設定でローソク足の色を変えたときは、widget が自動でこれを行います。プリセットを元に candleUp / candleDown だけを変えたテーマでも、出来高はその色になります。

import { DARK_THEME, volumeColor } from '@tradecanvas/chart'

chart.setTheme({
  ...DARK_THEME,
  candleUp: '#26a17b',
  candleDown: '#e0525f',
  volumeUp: volumeColor('#26a17b'),
  volumeDown: volumeColor('#e0525f'),
})