メインコンテンツまでスキップ

SSD コンポーネント

これらは COMPOSITOR.window.composition の内側で組み立てて ウィンドウ装飾を描くための部品です。shoji_wm から import します。

import {Box, Label, Button, AppIcon, Image, ShaderEffect, WindowBorder} from 'shoji_wm';

<ManagedWindow/><ClientWindow/>ウィンドウの合成 ページで解説しています。

共通の prop

すべてのコンポーネントが受け付けます(ComponentProps 由来)。

Prop意味
childrenノード子コンポーネント
styleSSDStyle視覚スタイル。スタイルリファレンス を参照
idstringターゲット無効化のための安定したノード id
onHoverChange(hovered: boolean) => voidポインターの出入り
onActiveChange(active: boolean) => void押下/解放

すべての style 値(および多くの prop)は、素の値かシグナルのどちらも受け付けるので、 リアクティブに更新されます。


<Box/>

子要素を水平または垂直に整列するフレックスボックス風コンテナです。

Prop意味
direction"row" | "column" | "horizontal" | "vertical"レイアウト軸(デフォルト "row"
splitDirection2 パネルレイアウトの分割方向
styleSSDStyleスタイル
<Box direction="row" style={{gap: 8, padding: 4, alignItems: 'center'}}>
<AppIcon icon={window.icon} style={{width: 16, height: 16}} />
<Label text={window.title} style={{flexGrow: 1}} />
</Box>

<Label/>

テキスト文字列を描画します。

Prop意味
textstring(またはシグナル)表示するテキスト
styleSSDStylefontSizefontWeightfontFamilycolortextAlignlineHeight でフォントと色を指定
<Label
text={window.title}
style={{color: '#f5f7fa', fontSize: 13, fontWeight: 600, fontFamily: ['Noto Sans CJK JP', 'Noto Color Emoji']}}
/>

<Button/>

クリックでアクションをトリガーするプレス可能な領域です。

Prop意味
onClick() => void または WindowActionDescriptorクリック時のアクション
onHoverChange(hovered: boolean) => void視覚フィードバック用のホバー追跡
styleSSDStyleスタイル

onClick はコールバック、または組み込みウィンドウ操作用に windowAction(...) が返す ディスクリプタを受け付けます。操作は "close""maximize""unmaximize""minimize""fullscreen""unfullscreen" です。

import {Button, windowAction} from 'shoji_wm';

// 組み込みアクション
<Button onClick={windowAction('close')} style={{width: 12, height: 12}} />

// カスタムハンドラ+ホバーフィードバック
const [hover, setHover] = useState(false);
<Button
onHoverChange={setHover}
onClick={() => window.minimize()}
style={{width: 16, height: 16, borderRadius: 8, background: hover((h) => h ? '#FFFFFF40' : '#FFFFFF20')}}
/>

<AppIcon/>

ウィンドウのアプリケーションアイコンを描画します。

Prop意味
iconWindowIcon | undefined(またはシグナル)window.icon を渡すとリアクティブに更新
styleSSDStyleサイズ指定
<AppIcon icon={window.icon} style={{width: 16, height: 16}} />

<Image/>

ファイルパス(設定パッケージルートからの相対)またはリアクティブなソースから画像を 表示します。

Prop意味
srcstring(またはシグナル)画像パス
fit"contain" | "cover" | "fill"画像がボックスを満たす方法
styleSSDStyleサイズ/配置
<Image src="./assets/x.svg" style={{width: 16, height: 16, pointerEvents: 'none'}} />

ShaderEffect

<ShaderEffect/> は子要素が占める領域にコンパイル済み GPU エフェクトを適用する コンテナです。shader の作り方は エフェクト を参照してください。

Prop意味
shaderCompiledEffectHandle描画するコンパイル済みエフェクト
directionDirection子要素のレイアウト軸(<Box/> と同様)
styleSSDStyleスタイル
<ShaderEffect shader={frostedGlass} direction="row" style={{height: 28, paddingX: 8, alignItems: 'center'}}>
<Label text={window.title} />
</ShaderEffect>

WindowBorder

<WindowBorder/><ClientWindow/> の周囲に置き、ボーダーを描画してインタラクティブな リサイズの当たり判定を提供するクロムコンテナです。

Prop意味
styleSSDStyleborderborderRadiusbackground などでボーダーを指定
interactionWindowBorderInteractionリサイズの当たり判定

interaction.resizeHitArea は単一の数値か、{edgePx?, cornerPx?}(エッジ沿いと コーナーのつかみ厚)です。

<WindowBorder
style={{border: {px: 2, color: borderColor}, borderRadius: 10}}
interaction={{resizeHitArea: {edgePx: 8, cornerPx: 14}}}
>
<ClientWindow />
</WindowBorder>

スタイルリファレンス

style prop は SSDStyle です。すべての値はシグナルにできます。長さは特記なき限り 論理ピクセルです。

サイズ

widthheight(数値または "100%" のような文字列)・minWidthminHeightmaxWidthmaxHeightflexGrowflexShrink

余白

gappaddingpaddingXpaddingYpaddingTop/Right/Bottom/LeftmarginmarginXmarginYmarginTop/Right/Bottom/Left

レイアウトと位置

alignItems"start" | "center" | "end" | "stretch")・justifyContent"start" | "center" | "end" | "space-between")・position"relative" | "absolute")・insettoprightbottomleftzIndexoverflow"visible" | "hidden")・pointerEvents"auto" | "none")・ transform{translateX, translateY, scale, scaleX, scaleY})。

外観

backgroundcoloropacityvisiblecursorborderRadius

ボーダー: borderborderTopborderRightborderBottomborderLeft(各 {px, color})に加えて borderFit"normal" | "fit-children")。

テキスト(<Label/> 用)

fontSizefontWeight"normal" | "medium" | "semibold" | "bold" または数値)・ fontFamily(文字列、またはフォールバックの文字列配列)・textAlign"start" | "center" | "end")・lineHeight

const style: SSDStyle = {
height: 28,
paddingX: 8,
gap: 8,
alignItems: 'center',
background: window.isFocused((f) => (f ? '#1f2430cc' : '#2a2f3acc')),
borderRadius: 8,
};