FAQブロック
FAQコンポーネントは、ReactとTypeScriptで構築された完全にカスタマイズ可能でアクセシブルなFAQアコーディオンです。モダンなデザインパターン、展開/折りたたみ可能なセクション、柔軟なカスタマイズオプションを備えた完全なよくある質問インターフェースを提供します。一貫したスタイリングのためにMUIコンポーネント上に構築されています。
🚀 インストール
npm install @nodeblocks/frontend-faq-block@0.2.0
📖 使用法
import {FAQ} from '@nodeblocks/frontend-faq-block';
- 基本的な使用法
- 高度な使用法
function SimpleFAQ() { const faqItems = [ { question: "このサービスは何ですか?", answer: "これはビジネス運営を効率的に管理するのに役立つ包括的なプラットフォームです。" }, { question: "どのように始めればよいですか?", answer: "アカウントにサインアップし、プロファイルを完成させれば、すぐにすべての機能を使い始めることができます。" }, { question: "無料トライアルはありますか?", answer: "はい、すべての機能に完全にアクセスできる14日間の無料トライアルを提供しています。クレジットカードは不要です。" }, { question: "サポートに連絡するにはどうすればよいですか?", answer: "メール、ライブチャット、または営業時間内にサポートホットラインに電話することでサポートチームに連絡できます。" } ]; return ( <FAQ faqTitle="よくある質問" subtitle="私たちのサービスに関する最も一般的な質問への回答を見つけてください" items={faqItems} > <FAQ.Title /> <FAQ.ItemList /> </FAQ> ); }
function AdvancedFAQ() { const faqItems = [ { question: "私たちのプラットフォームの独自性は何ですか?", answer: "私たちのプラットフォームは、AI駆動の分析と直感的なデザインを組み合わせて、比類のないビジネスインサイトと自動化機能を提供します。" }, { question: "エンタープライズソリューションを提供していますか?", answer: "はい、専用サポート、高度なセキュリティ機能、スケーラブルなインフラストラクチャを備えたカスタマイズされたエンタープライズソリューションを提供しています。" }, { question: "プラットフォームのセキュリティはどの程度ですか?", answer: "銀行レベルの暗号化、多要素認証を実装し、SOC 2 Type IIおよびGDPRを含む業界標準に準拠しています。" }, { question: "どのような統合が利用可能ですか?", answer: "Slack、Salesforce、HubSpot、Google Workspace、Microsoft 365を含む200以上の人気ビジネスツールと統合しています。" } ]; return ( <FAQ faqTitle="エンタープライズソリューション" subtitle="ビジネス意思決定者のための包括的な回答" items={faqItems} className="custom-faq" sx={{ backgroundColor: '#f8f9fa', border: '1px solid #e9ecef', borderRadius: '12px', padding: '32px', maxWidth: '800px', margin: '0 auto', }} > {({defaultBlocks}) => ({ blocks: { ...defaultBlocks, stats: ( <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fit, minmax(150px, 1fr))', gap: '16px', marginBottom: '32px', padding: '20px', backgroundColor: '#e3f2fd', borderRadius: '8px', border: '1px solid #bbdefb', }} > <div style={{textAlign: 'center'}}> <div style={{ fontSize: '24px', fontWeight: 'bold', color: '#1976d2', }} > 99.9% </div> <div style={{fontSize: '14px', color: '#666'}}>アップタイム</div> </div> <div style={{textAlign: 'center'}}> <div style={{ fontSize: '24px', fontWeight: 'bold', color: '#1976d2', }} > 24/7 </div> <div style={{fontSize: '14px', color: '#666'}}>サポート</div> </div> <div style={{textAlign: 'center'}}> <div style={{ fontSize: '24px', fontWeight: 'bold', color: '#1976d2', }} > 200+ </div> <div style={{fontSize: '14px', color: '#666'}}>統合</div> </div> </div> ), helpSection: ( <div style={{ marginTop: '32px', padding: '24px', backgroundColor: '#fff3e0', borderRadius: '8px', border: '1px solid #ffcc02', textAlign: 'center', }} > <h3 style={{ margin: '0 0 16px 0', color: '#f57c00', fontSize: '20px', fontWeight: 'bold', }} > 🤝 さらにサポートが必要ですか? </h3> <p style={{ margin: '0 0 20px 0', color: '#666', lineHeight: '1.6', }} > 専門チームがプラットフォームを最大限に活用できるようサポートします。 </p> <div style={{display: 'flex', justifyContent: 'center', gap: '16px'}}> <button style={{ padding: '12px 24px', backgroundColor: '#2196f3', color: 'white', border: 'none', borderRadius: '6px', cursor: 'pointer', fontWeight: 'bold', }} > 📞 デモ予約 </button> <button style={{ padding: '12px 24px', backgroundColor: '#4caf50', color: 'white', border: 'none', borderRadius: '6px', cursor: 'pointer', fontWeight: 'bold', }} > 💬 ライブチャット </button> </div> </div> ), }, blockOrder: ['title', 'stats', 'itemList', 'helpSection'], })} </FAQ> ); }
🔧 プロパティリファレンス
メインコンポーネントプロパティ
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
faqTitle | ReactNode | 必須 | FAQセクションの上部に表示されるメインタイトル |
subtitle | ReactNode | 必須 | メインタイトルの下に表示されるサブタイトルまたは説明 |
items | Array<{question: string, answer: string}> | 必須 | 質問と回答を含むFAQアイテムの配列 |
className | string | undefined | FAQコンテナのスタイリング用の追加CSSクラス名 |
sx | SxProps<Theme> | { px: 2, py: 5 } | カスタムスタイリング用のMUIシステムプロパティ |
children | BlocksOverride | undefined | デフォルトレンダリングをオーバーライドするカスタムブロックコンポーネント |
注意: このコンポーネントはすべてのMUI Stackコンポーネントプロパティを継承します。デフォルトspacing={5}。
サブコンポーネント
FAQコンポーネントは複数のサブコンポーネントを提供します。すべてのサブコンポーネントは、メインコンポーネントのコンテキストからデフォルト値を受け取り、プロパティを通じてこれらの値をオーバーライドできます。
FAQ.Title
MUI StackとTypographyコンポーネントを使用してFAQタイトルセクションをレンダリングします。
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
faqTitle | ReactNode | コンテキスト値 | タイトルコンテンツ(コンテキストをオーバーライド) |
subtitle | ReactNode | コンテキスト値 | サブタイトルコンテンツ(コンテキストをオーバーライド) |
children | ReactNode | コンテキストのfaqTitle | カスタムコンテンツ - faqTitleをオーバーライド |
className | string | undefined | スタイリング用の追加CSSクラス名 |
sx | SxProps<Theme> | { textAlign: 'center' } | カスタムスタイリング用のMUIシステムプロパティ |
注意: このコンポーネントはすべてのMUI Stackコンポーネントプロパティを継承します。タイトルはTypography variant="h6"とcolor="primary.main"でレンダリングされます。サブタイトルはTypography variant="h4"でレンダリングされます。タイトルとサブタイトル間の内部スペーシングは1にハードコードされています。
FAQ.Item
MUI Accordionを使用して個別のFAQアコーディオンアイテムをレンダリングします。
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
question | string | 必須 | アコーディオンヘッダーに表示する質問テキスト |
answer | string | 必須 | アコーディオンが展開されたときに表示する回答テキスト |
index | number | 必須 | FAQリスト内のこのアイテムのインデックス |
isActive | boolean | 必須 | このアコーディオンアイテムが現在展開されているかどうか |
onToggle | (index: number) => void | 必須 | アコーディオンの状態を切り替えるコールバック関数 |
className | string | undefined | スタイリング用の追加CSSクラス名 |
sx | SxProps<Theme> | undefined | カスタムスタイリング用のMUIシステムプロパティ |
注意: このコンポーネントはすべてのMUI Accordionコンポーネントプロパティ(onToggleを除く)を継承します。質問はprimary.main色で"Q."プレフィックス付きで表示されます。
FAQ.ItemList
MUI Stackを使用して仕切り付きのFAQアイテムリストをレンダリングします。
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
items | Array<{question: string, answer: string}> | コンテキスト値 | FAQアイテム配列(コンテキストをオーバーライド) |
activeIndex | number | null | コンテキスト値 | 現在アクティブ/展開されているアイテムインデックス(コンテキストをオーバーライド) |
toggleAccordion | (index: number) => void | コンテキスト値 | トグルコールバック(コンテキストをオーバーライド) |
className | string | undefined | スタイリング用の追加CSSクラス名 |
sx | SxProps<Theme> | undefined | カスタムスタイリング用のMUIシステムプロパティ |
注意: このコンポーネントはすべてのMUI Stackコンポーネントプロパティを継承します。アイテムリストの前後にDividerをレンダリングします。
🎨 設定例
カスタムタイトルスタイリング
<FAQ.Title
sx={{
textAlign: 'left',
backgroundColor: 'primary.light',
p: 3,
borderRadius: 2
}}>
カスタムFAQタイトル
</FAQ.Title>
カスタムアイテムリストスタイリング
<FAQ.ItemList
sx={{
backgroundColor: 'background.paper',
borderRadius: 2,
boxShadow: 1,
p: 2
}}
/>
🔧 TypeScriptサポート
包括的な型定義による完全なTypeScriptサポート:
import {FAQ} from '@nodeblocks/frontend-faq-block';
import {StackProps, AccordionProps} from '@mui/material';
import {ReactNode} from 'react';
// 個別FAQアイテムインターフェース
interface FAQItem {
question: string;
answer: string;
}
// メインコンポーネントプロパティはMUI StackPropsを拡張
interface FAQProps extends Omit<StackProps, 'children'> {
faqTitle: ReactNode;
subtitle: ReactNode;
items: FAQItem[];
children?: BlocksOverride;
}
// MUIスタイリングの例
function CustomStyledFAQ() {
const faqData: FAQItem[] = [
{
question: 'どのような支払い方法を受け付けていますか?',
answer: '主要クレジットカード、PayPal、銀行振込をすべて受け付けています。',
},
{
question: 'サブスクリプションをキャンセルするにはどうすればよいですか?',
answer: 'アカウント設定からいつでもサブスクリプションをキャンセルできます。',
},
];
return (
<FAQ
faqTitle="カスタマーサポート"
subtitle="よくある質問への迅速な回答を得る"
items={faqData}
className="my-custom-faq"
spacing={4}
sx={{maxWidth: 800, mx: 'auto'}}
>
<FAQ.Title sx={{textAlign: 'left'}}>🙋♀️ よくある質問</FAQ.Title>
<FAQ.ItemList sx={{mt: 2}} />
</FAQ>
);
}
📝 注意事項
- コンポーネントはデフォルトで
spacing={5}のMUIStackを使用してレイアウトします - デフォルトパディングは
px: 2(水平)とpy: 5(垂直)です - FAQアイテムは
ExpandMoreアイコン付きのMUIAccordionを使用します - タイトルセクションはメインタイトルを
variant="h6"でprimary.main色で表示します - サブタイトルは
variant="h4"で表示されます - 質問は
primary.main色で太字スタイリングの"Q."プレフィックス付きです DividerコンポーネントはFAQアイテムリストの前後にレンダリングされます- 一度に1つのアコーディオンアイテムのみ展開可能です(
activeIndex状態で制御) - すべてのサブコンポーネントはMUIシステムスタイリング用の
sxプロパティをサポートします - ブロックオーバーライドパターンにより、デフォルトブロック間にカスタムブロックを挿入できます
React、TypeScript、MUIを使用して❤️で構築されました。