メリットブロック
Meritsコンポーネントは、ReactとTypeScriptで構築された完全にカスタマイズ可能でアクセシブルなメリット/ベネフィット表示ブロックです。企業のメリット、ベネフィット、または機能を紹介するための完全なインターフェースを、モダンなデザインパターン、柔軟なカスタマイズオプション、レスポンシブレイアウトとともに提供します。
🚀 インストール
npm install @nodeblocks/frontend-merits-block@0.2.0
📖 使用法
import {Merits} from '@nodeblocks/frontend-merits-block';
- 基本的な使用法
- 高度な使用法
function SimpleMerits() { const meritsData = [ { imageUrl: '/img/undraw_docusaurus_mountain.svg', text: '迅速な配送', subtext: '注文を迅速かつ効率的にお届けします', }, { imageUrl: '/img/undraw_docusaurus_react.svg', text: '品質保証', subtext: 'すべての製品で最高品質を保証します', }, { imageUrl: '/img/undraw_docusaurus_tree.svg', text: '24時間サポート', subtext: 'あらゆるニーズに対応する24時間体制のカスタマーサポート', }, ]; return ( <Merits subtitle="なぜ私たちを選ぶのか" meritsTitle="私たちの主要なベネフィット" buttonText="詳細を見る" buttonHref="#about" items={meritsData} sx={{backgroundColor: 'white', padding: 2}} > <Merits.Header /> <Merits.Content /> <Merits.ActionBar /> </Merits> ); }
function AdvancedMerits() { const meritsData = [ { imageUrl: '/img/undraw_docusaurus_mountain.svg', text: '迅速な配送', subtext: '注文を迅速かつ効率的にお届けします' }, { imageUrl: '/img/undraw_docusaurus_react.svg', text: '品質保証', subtext: 'すべての製品で最高品質を保証します' }, { imageUrl: '/img/undraw_docusaurus_tree.svg', text: '24時間サポート', subtext: 'あらゆるニーズに対応する24時間体制のカスタマーサポート', }, ]; return ( <Merits subtitle="なぜ私たちを選ぶのか" meritsTitle="私たちの主要なベネフィット" buttonText="詳細を見る" buttonHref="#about" items={meritsData} sx={{ background: 'linear-gradient(180deg, #f8fafc 0%, #e2e8f0 100%)', padding: {xs: 3, md: 6}, borderRadius: 4, }} > {({defaultBlocks, defaultBlockOrder}) => ({ blocks: { ...defaultBlocks, header: { ...defaultBlocks.header, props: { ...defaultBlocks.header.props, spacing: 2, sx: { textAlign: 'center', mb: 4, '& .nbb-merits-merit-subtitle': { color: '#6366f1', fontWeight: 800, textTransform: 'uppercase', letterSpacing: 2, fontSize: '0.875rem', }, '& .nbb-merits-merit-title': { fontSize: {xs: 32, md: 48}, fontWeight: 700, background: 'linear-gradient(135deg, #1e293b 0%, #475569 100%)', backgroundClip: 'text', WebkitBackgroundClip: 'text', WebkitTextFillColor: 'transparent', }, }, }, }, content: { ...defaultBlocks.content, props: { ...defaultBlocks.content.props, direction: {xs: 'column', md: 'row'}, spacing: 4, sx: { '& .nbb-merits-merit-item': { backgroundColor: 'white', borderRadius: 3, padding: 4, boxShadow: '0 4px 20px rgba(0,0,0,0.08)', transition: 'all 0.3s ease', '&:hover': { transform: 'translateY(-8px)', boxShadow: '0 12px 40px rgba(99,102,241,0.15)', }, }, '& .nbb-merits-merit-image': { height: 160, objectFit: 'contain', }, '& .nbb-merits-merit-text': { color: '#1e293b', fontWeight: 700, }, '& .nbb-merits-merit-subtext': { color: '#64748b', textAlign: 'center', }, }, }, }, actionBar: { ...defaultBlocks.actionBar, props: { ...defaultBlocks.actionBar.props, sx: { mt: 4, '& .nbb-merits-merit-button': { background: 'linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%)', borderRadius: 3, px: 5, py: 1.5, fontSize: 18, fontWeight: 600, textTransform: 'none', boxShadow: '0 4px 20px rgba(99,102,241,0.4)', '&:hover': { background: 'linear-gradient(135deg, #4f46e5 0%, #7c3aed 100%)', boxShadow: '0 8px 30px rgba(99,102,241,0.5)', }, }, }, }, }, }, blockOrder: defaultBlockOrder, })} </Merits> ); }
🔧 プロパティリファレンス
メインコンポーネントプロパティ
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
subtitle | ReactNode | 必須 | メインタイトルの上に表示されるサブタイトルテキスト |
meritsTitle | ReactNode | 必須 | メリットセクションのメインタイトル |
buttonText | string | 必須 | アクションボタンのテキストコンテンツ |
buttonHref | string | 必須 | アクションボタンリンクのURLまたはパス |
items | MeritProps[] | 必須 | 表示するメリット項目の配列 |
spacing | number | ResponsiveValue | 6 | 子要素間のスペーシング |
direction | StackDirection | 'column' | 子要素のレイアウト方向 |
className | string | undefined | コンテナのスタイリング用の追加CSSクラス名 |
sx | SxProps<Theme> | undefined | カスタムスタイリング用のMUIシステムプロパティ |
children | BlocksOverride | undefined | デフォルトレンダリングをオーバーライドするカスタムブロックコンポーネント |
注意: メインコンポーネントはすべてのMUI Stackプロパティを継承します。
サブコンポーネント
Meritsコンポーネントは複数のサブコンポーネントを提供します。すべてのサブコンポーネントは、メインコンポーネントのコンテキストからデフォルト値を受け取り、プロパティを通じてこれらの値をオーバーライドできます。
Merits.Header
サブタイトルとメインタイトルを含むヘッダーセクションをレンダリングします。
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
children | ReactNode | デフォルトヘッダーコンテンツ | デフォルトヘッダーレンダリングをオーバーライドするカスタムコンテンツ |
spacing | number | ResponsiveValue | 1 | サブタイトルとタイトル間のスペーシング |
alignItems | string | 'stretch' | 子要素の配置 |
sx | SxProps<Theme> | { textAlign: 'center' } | カスタムスタイリング用のMUIシステムプロパティ |
注意: このコンポーネントはすべてのMUI Stackプロパティを継承します。childrenが提供されない場合、内部でMeritSubtitleとMeritTitleをレンダリングします。
Merits.Content
メリット項目を行レイアウトでレンダリングします。
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
children | ReactNode | デフォルトメリット項目 | デフォルトメリット項目レンダリングをオーバーライドするカスタムコンテンツ |
items | MeritProps[] | コンテキストから | 表示するメリット項目の配列(コンテキストのitemsをオーバーライド) |
direction | StackDirection | 'row' | メリット項目のレイアウト方向 |
spacing | number | ResponsiveValue | 5 | メリット項目間のスペーシング |
sx | SxProps<Theme> | undefined | カスタムスタイリング用のMUIシステムプロパティ |
注意: このコンポーネントはすべてのMUI Stackプロパティを継承します。各メリット項目はMeritImage、MeritText、MeritSubtextを含むMeritItemとしてレンダリングされます。
Merits.Content.MeritImage
メリット項目の画像をレンダリングします。
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
src | string | undefined | 画像のURL |
alt | string | 'merit image' | 画像の代替テキスト |
component | string | 'img' | ルートノードに使用されるコンポーネント(固定) |
sx | SxProps<Theme> | { maxWidth: '100%', height: 225 } | カスタムスタイリング用のMUIシステムプロパティ |
注意: このコンポーネントはすべてのMUI Box<'img'>プロパティを継承します。
Merits.Content.MeritText
メリット項目のメインテキストをレンダリングします。
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
children | ReactNode | 項目データから | メリットのテキストコンテンツ |
variant | string | 'h4' | Typographyバリアント |
sx | SxProps<Theme> | 下記参照 | カスタムスタイリング用のMUIシステムプロパティ |
デフォルトsx:
{
fontWeight: 600,
textAlign: 'center',
fontSize: 25,
lineHeight: 1.5
}
注意: このコンポーネントはすべてのMUI Typographyプロパティを継承します。
MeritSubtext(内部)
メリット項目のセカンダリテキスト/説明をレンダリングします。
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
children | ReactNode | 項目データから | メリットのサブテキストコンテンツ |
variant | string | 'body1' | Typographyバリアント |
sx | SxProps<Theme> | 下記参照 | カスタムスタイリング用のMUIシステムプロパティ |
デフォルトsx:
{
lineHeight: 1.72,
alignSelf: 'center',
fontWeight: 300
}
注意: このコンポーネントはすべてのMUI Typographyプロパティを継承します。これはメリット項目をレンダリングする際に使用される内部コンポーネントです。
MeritItem(内部)
各メリットのコンテナコンポーネント。
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
children | ReactNode | 必須 | メリット項目のコンテンツ |
spacing | number | ResponsiveValue | 2 | 画像、テキスト、サブテキスト間のスペーシング |
alignItems | string | 'stretch' | 子要素の配置 |
sx | SxProps<Theme> | 下記参照 | カスタムスタイリング用のMUIシステムプロパティ |
デフォルトsx:
{
minWidth: 0,
flex: 1,
paddingBottom: 4
}
注意: このコンポーネントはすべてのMUI Stackプロパティを継承します。これはメリット項目をレンダリングする際に使用される内部コンポーネントです。
Merits.ActionBar
コールトゥアクションボタン付きのアクションバーをレンダリングします。
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
children | ReactNode | デフォルトボタン | デフォルトアクションバーレンダリングをオーバーライドするカスタムコンテンツ |
buttonHref | string | コンテキストから | ボタンのURL(コンテキストのbuttonHrefをオーバーライド) |
buttonText | string | コンテキストから | ボタンのテキスト(コンテキストのbuttonTextをオーバーライド) |
spacing | number | ResponsiveValue | 1 | 子要素間のスペーシング |
alignItems | string | 'stretch' | 子要素の配置 |
sx | SxProps<Theme> | { textAlign: 'center' } | カスタムスタイリング用のMUIシステムプロパティ |
注意: このコンポーネントはすべてのMUI Stackプロパティを継承します。デフォルトでMerits.ActionBar.Buttonコンポーネントをレンダリングします。
Merits.ActionBar.Button
コールトゥアクションボタンをレンダリングします。
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
children | ReactNode | コンテキストから | ボタン内に表示するテキスト |
href | string | コンテキストから | ボタンリンクのURL |
variant | string | 'contained' | ボタンバリアント |
size | string | 'large' | ボタンサイズ |
color | string | 'primary' | ボタンカラー |
disabled | boolean | false | ボタンが無効かどうか |
onClick | function | undefined | クリックハンドラー関数 |
sx | SxProps<Theme> | 下記参照 | カスタムスタイリング用のMUIシステムプロパティ |
デフォルトsx:
{
fontSize: 22,
alignSelf: 'center',
fontWeight: 600,
lineHeight: 1.5
}
注意: このコンポーネントはすべてのMUI Buttonプロパティを継承します。
🎨 設定例
カスタムヘッダースタイリング
<Merits.Header sx={{mb: 4, textAlign: 'center'}} />
カスタムコンテンツレイアウト
<Merits.Content direction={{xs: 'column', md: 'row'}} spacing={4} />
カスタムアクションボタン
<Merits.ActionBar sx={{mt: 4}}>
<Merits.ActionBar.Button href="#get-started" sx={{px: 6, py: 2}}>
🚀 今すぐ始める
</Merits.ActionBar.Button>
</Merits.ActionBar>
カスタムスタイリング例
<Merits
subtitle="なぜ私たちのプラットフォームを選ぶのか"
meritsTitle="モダンビジネス向けに構築"
buttonText="無料トライアル開始"
buttonHref="#signup"
items={meritsData}
spacing={8}
sx={{backgroundColor: '#f8f9fa', padding: 4}}
>
<Merits.Header sx={{mb: 4}} />
<Merits.Content direction={{xs: 'column', md: 'row'}} spacing={4} />
<Merits.ActionBar sx={{mt: 4}}>
<Merits.ActionBar.Button href="#get-started" sx={{px: 6, py: 2}}>
🚀 今すぐ始める
</Merits.ActionBar.Button>
</Merits.ActionBar>
</Merits>
ブロックオーバーライドパターン
<Merits {...props}>
{({defaultBlocks, defaultBlockOrder}) => ({
blocks: {
...defaultBlocks,
header: {
...defaultBlocks.header,
props: {
...defaultBlocks.header.props,
spacing: 2,
sx: {
textAlign: 'center',
mb: 4,
},
},
},
},
blockOrder: defaultBlockOrder,
})}
</Merits>
🔧 TypeScriptサポート
包括的な型定義による完全なTypeScriptサポート:
import {Merits} from '@nodeblocks/frontend-merits-block';
import {ReactNode} from 'react';
interface MeritProps {
imageUrl: string;
text: ReactNode;
subtext: ReactNode;
}
function TypedMerits() {
const meritsData: MeritProps[] = [
{
imageUrl: '/icons/analytics.svg',
text: '強力な分析',
subtext: 'ビジネスパフォーマンスの詳細なインサイトを取得',
},
{
imageUrl: '/icons/automation.svg',
text: 'スマート自動化',
subtext: '繰り返しタスクを自動化し、重要なことに集中',
},
{
imageUrl: '/icons/integration.svg',
text: 'シームレスな統合',
subtext: '200以上の人気ツールやサービスと接続',
},
];
return (
<Merits
subtitle="プラットフォームのベネフィット"
meritsTitle="成功に必要なすべて"
buttonText="機能を探索"
buttonHref="#features"
items={meritsData}
spacing={6}
direction="column"
sx={{
backgroundColor: 'background.paper',
borderRadius: 3,
boxShadow: 2,
p: 4,
maxWidth: 1200,
mx: 'auto',
}}
>
<Merits.Header sx={{textAlign: 'center'}} />
<Merits.Content />
<Merits.ActionBar>
<Merits.ActionBar.Button
variant="contained"
href="#pricing"
sx={{
fontSize: 22,
alignSelf: 'center',
fontWeight: 600,
lineHeight: 1.5,
}}
>
料金プランを表示
</Merits.ActionBar.Button>
</Merits.ActionBar>
</Merits>
);
}
📝 注意事項
- メインコンポーネントはデフォルトでMUI
Stackをdirection="column"とspacing={6}で使用します。 - すべてのサブコンポーネントはMUIコンポーネントプロパティを継承し、スタイリング用の
sxプロパティをサポートします。 - Headerコンポーネントは
childrenが提供されない限り、内部でMeritSubtitle(Typography h4)とMeritTitle(Typography h1)をレンダリングします。 - Contentコンポーネントはデフォルトで水平行に項目をレンダリングします。レスポンシブレイアウトには
direction={{ xs: 'column', md: 'row' }}を使用します。 - 各メリット項目は
spacing={2}とflex: 1を持つMeritItemStackコンテナでラップされます。 - ActionBar.Buttonはデフォルトで
variant="contained"とsize="large"を持つMUI Buttonを使用します。 - コンテキスト値(
subtitle、meritsTitle、buttonText、buttonHref、items)はReact Contextを介して共有され、サブコンポーネントレベルでオーバーライドできます。
React、TypeScript、MUIを使用して❤️で構築されました。