変数の定義
注意
テーマAPIを有効にするには、StyleX Babel構成でunstable_moduleResolution
オプションを有効にする必要があります。
StyleXには、アトミックスタイルを生成するコンポーネントのスタイルを作成するだけでなく、信頼性が高く、予測可能でタイプセーフな方法でCSSカスタムプロパティ(CSS変数)を定義するためのAPIもあります。
デザインのインスピレーション
StyleXのテーマAPIの設計は、ReactのContext APIに直接触発されています。変数は、Reactコンテキストが作成される方法と同様に、デフォルト値を使用して定義され、テーマを作成して、UIサブツリーのこれらの変数に異なる値を「提供」できます。
変数の定義
変数のグループは、stylex.defineVars
関数を使用して定義されます。
tokens.stylex.js
import * as stylex from '@stylexjs/stylex';
export const tokens = stylex.defineVars({
primaryText: 'black',
secondaryText: '#333',
accent: 'blue',
background: 'white',
lineColor: 'gray',
borderRadius: '4px',
fontFamily: 'system-ui, sans-serif',
fontSize: '16px',
});
この関数もコンパイル時に処理され、CSS変数名が自動的に生成されます。
これにより、HTMLドキュメントの:root
で変数が定義されます。それらは定数としてインポートされ、stylex.create
呼び出し内で使用できます。
メディアクエリの使用
変数の値は、メディアクエリに基づいて変化する可能性があります。
tokens.stylex.js
import * as stylex from '@stylexjs/stylex';
// A constant can be used to avoid repeating the media query
const DARK = '@media (prefers-color-scheme: dark)';
export const colors = stylex.defineVars({
primaryText: {default: 'black', [DARK]: 'white'},
secondaryText: {default: '#333', [DARK]: '#ccc'},
accent: {default: 'blue', [DARK]: 'lightblue'},
background: {default: 'white', [DARK]: 'black'},
lineColor: {default: 'gray', [DARK]: 'lightgray'},
});
同様に、@supports
も使用できます。
変数を定義する際のルール
変数は、stylex.create
呼び出し内で使用できる唯一の非ローカル値の型です。これは、いくつかのルールを強制することにより可能になります。
1. 変数は.stylex.js
ファイルで定義する必要があります
変数は、次のいずれかの拡張子を持つファイルにある必要があります。
.stylex.js
.stylex.mjs
.stylex.cjs
.stylex.ts
.stylex.tsx
.stylex.jsx
2. 変数は名前付きエクスポートである必要があります
すべてのstylex.defineVars
呼び出しは、名前付きエクスポートである必要があります。
許可:
// ✅ - Named export
export const colors = stylex.defineVars({
/* ... */
});
const sizeVars = { ... };
// ✅ - Another Named export
export const sizes = stylex.defineVars(sizeVars);
許可しない:
// ❌ - Only named exports are allowed
export default stylex.defineVars({
/* ... */
});
// ❌ - The variable must be exported directly
const x = stylex.defineVars({
/* ... */
});
export const colors = x;
// ❌ - The variables cannot be nested within another object
export const colors = {
foregrounds: stylex.defineVars({
/* ... */
}),
backgrounds: stylex.defineVars({
/* ... */
}),
};
3. ファイル内で他のエクスポートは許可されていません
今のところ、.stylex.js
ファイルはCSS変数を定義するためだけに使用されます。