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

チップ検索ブロック

SearchByChipコンポーネントは、ReactとTypeScriptで構築された完全にカスタマイズ可能でアクセシブルなチップ検索インターフェースです。モダンなデザインパターン、クリック可能なチップセクション、フィルタリングと検索機能のための柔軟なカスタマイズオプションを備えた完全なチップベースの検索体験を提供します。


🚀 インストール

npm install @nodeblocks/frontend-search-by-chip-block@0.2.0

📖 使用法

import {SearchByChip} from '@nodeblocks/frontend-search-by-chip-block';
ライブエディター
function SimpleSearchByChip() {
  const chips = [
    {value: 'web', label: 'Web開発'},
    {value: 'mobile', label: 'モバイルアプリ'},
    {value: 'cloud', label: 'クラウドサービス'},
    {value: 'analytics', label: 'データ分析'},
    {value: 'ai', label: 'AI & 機械学習'},
  ];

  const handleChipClick = (value) => {
    console.log('チップがクリックされました:', value);
  };

  return (
    <SearchByChip
      searchByChipTitle="サービスを検索"
      sectionTitle="人気のカテゴリ"
      subtitle="カテゴリで閲覧して必要なものを見つける"
      onClickChip={handleChipClick}
      chips={chips}
    >
      <SearchByChip.Title />
      <SearchByChip.Subtitle />
      <SearchByChip.ChipSection />
    </SearchByChip>
  );
}
結果
Loading...

🔧 プロパティリファレンス

メインコンポーネントプロパティ

プロパティデフォルト説明
searchByChipTitleReactNode必須チップ検索セクションのメインタイトル
sectionTitleReactNode必須チップセクションのタイトル
subtitleReactNode必須メインタイトルの下に表示されるサブタイトルテキスト
onClickChip(value: string) => void必須チップがクリックされたときにトリガーされるコールバック関数
chipsChip[]必須表示するチップオブジェクトの配列
classNamestringundefinedコンテナのスタイリング用の追加CSSクラス名
sxSxProps<Theme>下記参照カスタムスタイリング用のMUIシステムプロパティ
childrenBlocksOverrideundefinedデフォルトブロックをオーバーライドするか、カスタムチップコンポーネントを追加する関数

デフォルトsx:

{
p: 2,
gap: 0.5,
bgcolor: 'background.paper',
textAlign: 'center',
containerType: 'inline-size'
}

注意: メインコンポーネントはすべてのMUI Stackプロパティを継承します。

サブコンポーネント

SearchByChipコンポーネントは複数のサブコンポーネントを提供します。すべてのサブコンポーネントは、メインコンポーネントのコンテキストからデフォルト値を受け取り、プロパティを通じてこれらの値をオーバーライドできます。

SearchByChip.Title

検索セクションのメインタイトルをレンダリングします。

プロパティデフォルト説明
childrenReactNodeコンテキストのsearchByChipTitleデフォルトタイトルレンダリングをオーバーライドするカスタムコンテンツ
searchByChipTitleReactNodeコンテキストからタイトルテキスト(コンテキストをオーバーライド)
variantstring'h4'Typographyバリアント
componentElementType'h1'ルートノードに使用されるコンポーネント
sxSxProps<Theme>undefinedカスタムスタイリング用のMUIシステムプロパティ

注意: このコンポーネントはすべてのMUI Typographyプロパティを継承します。

SearchByChip.Subtitle

メインタイトルの下にサブタイトルをレンダリングします。

プロパティデフォルト説明
childrenReactNodeコンテキストのsubtitleデフォルトサブタイトルレンダリングをオーバーライドするカスタムコンテンツ
subtitleReactNodeコンテキストからサブタイトルテキスト(コンテキストをオーバーライド)
variantstring'h6'Typographyバリアント
componentElementType'h6'ルートノードに使用されるコンポーネント
sxSxProps<Theme>{ color: 'primary.main' }カスタムスタイリング用のMUIシステムプロパティ

注意: このコンポーネントはすべてのMUI Typographyプロパティを継承します。

SearchByChip.SectionTitle

チップセクションのタイトルをレンダリングします。

プロパティデフォルト説明
childrenReactNodeコンテキストのsectionTitleデフォルトセクションタイトルレンダリングをオーバーライドするカスタムコンテンツ
sectionTitleReactNodeコンテキストからセクションタイトルテキスト(コンテキストをオーバーライド)
variantstring'body1'Typographyバリアント
componentElementType'h6'ルートノードに使用されるコンポーネント
sxSxProps<Theme>下記参照カスタムスタイリング用のMUIシステムプロパティ

デフォルトsx:

{
px: 2,
py: 1.875,
fontWeight: theme.typography.h6.fontWeight
}

注意: このコンポーネントはすべてのMUI Typographyプロパティを継承します。

SearchByChip.ChipItem

個々のクリック可能なチップボタンをレンダリングします。

プロパティデフォルト説明
onClickChip(value: string) => void必須チップクリックイベントのコールバック関数
valuestring必須チップの一意の値識別子
labelReactNode必須チップの表示テキスト
startIconReactNode<SearchByChip.ChipIcon />チップの先頭に表示されるアイコン
variant'text' | 'outlined' | 'contained''outlined'ボタンバリアント
size'small' | 'medium' | 'large''small'ボタンサイズ
sxSxProps<Theme>下記参照カスタムスタイリング用のMUIシステムプロパティ

デフォルトsx:

{
'&&': {
fontWeight: theme.typography.fontWeightLight,
py: '7px',
px: 2,
borderColor: 'grey.50',
bgcolor: 'background.paper'
},
'&:hover': {
boxShadow: '0 2px 6px rgba(0, 0, 0, 0.1)'
}
}

注意: このコンポーネントはすべてのMUI Buttonプロパティを継承します(childrenを除く)。

SearchByChip.ChipIcon

チップのデフォルトのチェックマークアイコンをレンダリングします。

プロパティデフォルト説明
sxSxProps<Theme>{ width: 16, height: 16, color: 'primary.main' }カスタムスタイリング用のMUIシステムプロパティ

注意: このコンポーネントはMUI SvgIconを使用し、チェックマークアイコンをレンダリングします。プロパティは受け取りませんが、デフォルトのスタイリングを使用します。

SearchByChip.ChipSection

セクションタイトルとチップアイテムを含むチップのコンテナをレンダリングします。

プロパティデフォルト説明
childrenReactNodeデフォルトチップレンダリングデフォルトチップセクションレンダリングをオーバーライドするカスタムコンテンツ
chipsChip[]コンテキストから表示するチップオブジェクトの配列(コンテキストをオーバーライド)
sectionTitleReactNodeコンテキストからチップセクションのタイトル(コンテキストをオーバーライド)
onClickChip(value: string) => voidコンテキストからチップクリックのコールバック(コンテキストをオーバーライド)
sxSxProps<Theme>undefinedカスタムスタイリング用のMUIシステムプロパティ

注意: このコンポーネントはすべてのMUI Stackプロパティを継承します。内部でSearchByChip.SectionTitleSearchByChip.ChipItem要素を持つflexコンテナをレンダリングします。


🎨 設定例

カスタムタイトルスタイリング

<SearchByChip.Title variant="h3" sx={{color: 'primary.main', fontWeight: 700}} />

カスタムチップアイテムスタイリング

<SearchByChip.ChipItem
value="custom"
label="カスタムチップ"
onClickChip={(value) => console.log(value)}
variant="contained"
sx={{borderRadius: 4, px: 3}}
/>

カスタムチップセクション

<SearchByChip.ChipSection
sx={{
bgcolor: 'grey.50',
borderRadius: 2,
p: 2,
}}
/>

カスタムスタイリング

function CustomStyledSearchByChip() {
const chips = [
{value: 'frontend', label: 'フロントエンド'},
{value: 'backend', label: 'バックエンド'},
{value: 'devops', label: 'DevOps'},
{value: 'design', label: 'デザイン'},
];

return (
<SearchByChip
searchByChipTitle="カテゴリを検索"
sectionTitle="カテゴリを選択"
subtitle="下の人気カテゴリから選択"
onClickChip={value => console.log('クリック:', value)}
chips={chips}
sx={{
bgcolor: 'grey.50',
p: 4,
borderRadius: 3,
}}
>
<SearchByChip.Title
sx={{
color: 'primary.dark',
fontWeight: 700,
fontSize: 28,
}}
/>
<SearchByChip.Subtitle
sx={{
color: 'text.secondary',
mb: 2,
}}
/>
<SearchByChip.ChipSection
sx={{
'& .MuiButton-root': {
bgcolor: 'primary.main',
color: 'white',
borderRadius: 2,
'&:hover': {
bgcolor: 'primary.dark',
},
},
}}
/>
</SearchByChip>
);
}

アイコン付きチップ

function SearchByChipWithIcons() {
const chips = [
{value: 'web', label: 'Web', icon: <span>🌐</span>},
{value: 'mobile', label: 'モバイル', icon: <span>📱</span>},
{value: 'desktop', label: 'デスクトップ', icon: <span>🖥️</span>},
{value: 'cloud', label: 'クラウド', icon: <span>☁️</span>},
];

return (
<SearchByChip
searchByChipTitle="プラットフォーム選択"
sectionTitle="プラットフォームを選択"
subtitle="開発したいプラットフォームを選択"
onClickChip={value => console.log('プラットフォーム:', value)}
chips={chips}
sx={{
p: 4,
bgcolor: '#f8fafc',
borderRadius: 2,
}}
>
<SearchByChip.Title />
<SearchByChip.Subtitle />
<SearchByChip.ChipSection />
</SearchByChip>
);
}

🔧 TypeScriptサポート

包括的な型定義による完全なTypeScriptサポート:

import {SearchByChip} from '@nodeblocks/frontend-search-by-chip-block';
import React from 'react';

interface ChipData {
value: string;
label: string;
icon?: React.ReactNode;
}

function TypedSearchByChip() {
const searchChips: ChipData[] = [
{value: 'react', label: 'React'},
{value: 'typescript', label: 'TypeScript'},
{value: 'nodejs', label: 'Node.js'},
{value: 'graphql', label: 'GraphQL'},
{value: 'aws', label: 'AWS'},
];

const handleChipClick = (value: string): void => {
console.log('選択された技術:', value);
// Navigate or filter logic
};

return (
<SearchByChip
searchByChipTitle="技術を検索"
sectionTitle="人気の技術"
subtitle="チップをクリックして技術でフィルタリング"
onClickChip={handleChipClick}
chips={searchChips}
spacing={3}
sx={{
maxWidth: 800,
mx: 'auto',
p: 4,
}}
>
<SearchByChip.Title />
<SearchByChip.Subtitle />
<SearchByChip.SectionTitle />
<SearchByChip.ChipSection />
</SearchByChip>
);
}

📝 注意事項

  • メインコンポーネントはデフォルトでパディング、gap、中央揃えのテキスト配置を持つMUI Stackを使用します。
  • すべてのTypographyコンポーネント(TitleSubtitleSectionTitle)はMUI Typographyプロパティを継承します。
  • ChipItemはデフォルトでvariant="outlined"size="small"を持つMUI Buttonを使用します。
  • 各チップにはデフォルトのstartIconをオーバーライドするカスタムiconプロパティを設定できます。
  • デフォルトのChipIconはMUI SvgIcon経由でレンダリングされるチェックマークSVGです。
  • ChipSectionはレスポンシブなチップレイアウトのためにコンテナクエリ(containerType: 'inline-size')を使用します。
  • コンテキスト値(searchByChipTitlesubtitlesectionTitlechipsonClickChip)はReact Contextを介して共有され、サブコンポーネントレベルでオーバーライドできます。

React、TypeScript、MUIを使用して❤️で構築されました。