🧩 Nodeblocks フロントエンドブロック
モダンなビジネスアプリケーションのための完全なコンポーネントライブラリ ⚡
Nodeblocks フロントエンドブロックへようこそ - アプリケーション開発を加速するために設計された32種類の本番環境対応Reactコンポーネントの包括的なコレクションです。これらのモジュール式でカスタマイズ可能なブロックは、アプリケーションに命を吹き込むビジュアルビルディングブロックです。
📋 目次
🎯 フロントエンドブロックとは?
フロントエンドブロックは、アプリケーションのビジュアル基盤となる構築済みのカスタマイズ可能なReactコンポーネントです。各ブロックの特長:
- 🎨 完全なカスタマイズ性: ブランドやデザイン要件に適応
- 🔧 本番環境対応: TypeScriptで構築、テスト済み、最適化済み
- 🧩 モジュール式: 単体でも組み合わせても使用可能
- ⚡ パフォーマンス最適化: モダンなReactベストプラクティスで構築
🏗️ コンポーネントカテゴリ
🌟 共通コンポーネント
あらゆるアプリケーションの基本ビルディングブロック
| コンポーネント | 説明 |
|---|---|
| navbar | レスポンシブデザインのメインナビゲーションバー |
| side-navigation | 折りたたみ式サイドバーナビゲーション |
| breadcrumb | ページ階層のナビゲーションパンくずリスト |
| footer | プロフェッショナルなフッターコンポーネント |
| hero | 目を引くヒーローセクション |
| error-block | 美しいエラーメッセージ表示 |
| faq | よくある質問セクション |
| chat-conversation | リアルタイムチャットインターフェース |
| chat-conversation-list | チャット会話管理 |
| settings | アプリケーション設定インターフェース |
| filter-search-panel | 高度な検索とフィルタリング |
| filter-list | フィルタ可能なリストコンポーネント |
| search-by-chips | タグベースの検索機能 |
| merits | 実績とメリット表示 |
| how-to-use | ユーザーガイドと説明コンポーネント |
👥 ユーザー管理
完全なユーザー認証・管理スイート
| コンポーネント | 説明 |
|---|---|
| sign-in | ユーザー認証とログイン |
| sign-up | 新規ユーザー登録 |
| reset-password | パスワード復旧機能 |
| list-users | ユーザー管理と一覧表示 |
| basic-information | ユーザープロフィールと情報フォーム |
🏢 組織管理
エンタープライズグレードの組織機能
| コンポーネント | 説明 |
|---|---|
| create-organization | 組織作成ワークフロー |
| view-organization | 組織詳細と情報 |
| list-organizations | 組織一覧と管理 |
| list-invites | 組織招待管理 |
📦 商品管理
包括的な商品ライフサイクル管理
| コンポーネント | 説明 |
|---|---|
| create-product | 商品作成インターフェース |
| view-product | 詳細な商品情報表示 |
| list-products-table | テーブル形式の商品一覧 |
| list-products-grid | グリッド形式の商品表示 |
| attribute-selection | 商品属性管理 |
🛒 受注管理
完全な受注処理ワークフロー
| コンポーネント | 説明 |
|---|---|
| view-order | 受注詳細と情報 |
| list-order | 受注一覧と管理 |
| list-order-table | テーブル形式の受注管理 |
✨ 主な特長
🎨 デザインシステム統合
- 全コンポーネントで一貫したスタイリング
- カスタマイズ可能なテーマシステム
- レスポンシブデザインパターン
- モダンなUI/UXベストプラクティス
🔧 開発者体験
- 完全なTypeScriptサポート
- 包括的なドキュメント
- 明確なPropsインターフェース
- 直感的なコンポーネントAPI
🚀 パフォーマンス
- 本番使用向けに最適化
- 遅延読み込みサポート
- 最小限のバンドル影響
- 効率的なレンダリングパターン
📱 アクセシビリティ
- キーボードナビゲーションサポート
- スクリーンリーダー互換性
- フォーカス管理
🚀 はじめに
インストール
まず、テーマパッケージをインストールします(すべてのコンポーネントで必須):
npm install @nodeblocks/frontend-theme
その後、必要に応じて個別のコンポーネントをインストールします:
npm install @nodeblocks/frontend-navbar-block@0.2.0
npm install @nodeblocks/frontend-signin-block@0.3.0
⚠️ 重要: アプリケーションは必ず
@nodeblocks/frontend-themeのThemeProviderでラップしてください。これがないとコンポーネントが正しくレンダリングされない場合があります。詳細はテーマガイドを参照してください。
基本的な使い方
import { ThemeProvider } from '@nodeblocks/frontend-theme';
import { Navbar } from '@nodeblocks/frontend-navbar-block';
import { SignIn } from '@nodeblocks/frontend-signin-block';
function App() {
return (
<ThemeProvider>
<Navbar
leftContent={<Navbar.Logo src="/logo.png" alt="Logo" />}
centerContent={
<div style={{ display: 'flex', gap: 16 }}>
<Navbar.Link href="/home">ホーム</Navbar.Link>
<Navbar.Link href="/products">商品</Navbar.Link>
</div>
}
rightContent={<Navbar.ButtonLink href="/login">ログイン</Navbar.ButtonLink>}
sx={{ backgroundColor: 'white', boxShadow: 1 }}>
<Navbar.Left />
<Navbar.Center />
<Navbar.Right />
</Navbar>
<SignIn
onSubmit={(formData) => console.log('ログイン:', formData)}
onChange={(setError, getValues, clearErrors) => {
const values = getValues();
if (!values.email) {
setError('email', { message: 'メールアドレスは必須です', type: 'required' });
} else {
clearErrors('email');
}
}}
signupUrl="#signup"
resetPasswordUrl="#reset-password">
<SignIn.SignInTitle>おかえりなさい</SignIn.SignInTitle>
<SignIn.EmailField label="メールアドレス" placeholder="メールアドレスを入力" />
<SignIn.PasswordField label="パスワード" placeholder="パスワードを入力" />
<SignIn.SignInButton>サインイン</SignIn.SignInButton>
</SignIn>
</ThemeProvider>
);
}
💡 使用例
# テーマパッケージ(必須)
npm install @nodeblocks/frontend-theme
# Eコマース例のコンポーネント
npm install @nodeblocks/frontend-navbar-block@0.2.0
npm install @nodeblocks/frontend-footer-block@0.2.0
npm install @nodeblocks/frontend-list-products-grid-block@0.2.0
🏪 Eコマースアプリケーション
import { ThemeProvider } from '@nodeblocks/frontend-theme';
import { Footer } from '@nodeblocks/frontend-footer-block';
import { ListProductsGrid } from '@nodeblocks/frontend-list-products-grid-block';
import { Navbar } from '@nodeblocks/frontend-navbar-block';
export default function EcommerceApp() {
const products = [
{
title: 'プレミアムヘッドフォン',
subtitle: '高品質オーディオ',
imageUrl: '/headphones.jpg',
chips: [{ label: '新着' }],
tags: [{ icon: 'shopping_bag' as const, label: '電子機器' }],
linkProps: {
href: '/products/1',
onNavigate: () => console.log('商品を表示'),
},
},
];
return (
<ThemeProvider>
<Navbar
leftContent={<Navbar.Logo src="/logo.png" alt="ストア" style={{ height: 32 }} />}
centerContent={
<div style={{ display: 'flex', gap: 16 }}>
<Navbar.Link href="/home">ホーム</Navbar.Link>
<Navbar.Link href="/products">商品</Navbar.Link>
</div>
}
rightContent={<Navbar.ButtonLink href="/cart">カート (0)</Navbar.ButtonLink>}
sx={{ backgroundColor: 'white', boxShadow: 1 }}>
<Navbar.Left />
<Navbar.Center />
<Navbar.Right />
</Navbar>
<main style={{ display: 'flex', flexDirection: 'column', minHeight: '100vh', backgroundColor: 'white' }}>
<ListProductsGrid listProductsGridTitle="注目の商品" subtitle="最新コレクション">
<ListProductsGrid.Title />
<ListProductsGrid.Items>
{products.map(product => (
<ListProductsGrid.Items.GridCard key={product.title} {...product} />
))}
</ListProductsGrid.Items>
</ListProductsGrid>
<Footer
logoSrc="/logo.png"
copyright="© 2025 Nodeblocks. All rights reserved."
content={<div>お問い合わせ: info@example.com</div>}
sx={{ marginTop: 'auto' }}>
<Footer.Logo />
<Footer.Content />
<Footer.Copyright />
</Footer>
</main>
</ThemeProvider>
);
}
🏢 エンタープライズダッシュボード
npm install @nodeblocks/frontend-side-navigation-block@0.3.0
npm install @nodeblocks/frontend-list-users-block@0.2.0
npm install @nodeblocks/frontend-filter-search-panel-block@0.3.0
import { useState } from 'react';
import { ThemeProvider } from '@nodeblocks/frontend-theme';
import { FilterSearchPanel } from '@nodeblocks/frontend-filter-search-panel-block';
import { ListUsers } from '@nodeblocks/frontend-list-users-block';
import { SideNavigation } from '@nodeblocks/frontend-side-navigation-block';
export default function DashboardApp() {
const [isMenuOpen, setIsMenuOpen] = useState(false);
return (
<ThemeProvider>
<div style={{ display: 'flex', backgroundColor: 'white', height: '100vh', alignItems: 'start' }}>
<SideNavigation
isFloating={true}
isMenuOpen={isMenuOpen}
setIsMenuOpen={setIsMenuOpen}
links={[
{ text: 'ダッシュボード', href: '/dashboard' },
{ text: 'ユーザー', href: '/users' },
{ text: '設定', href: '/settings' },
]}
sx={{ height: '100vh', width: '200px' }}
/>
<main style={{ flex: 1, paddingLeft: '20px', paddingRight: '20px' }}>
<FilterSearchPanel
onSearch={({ search }) => console.log('検索:', search)}
filters={[
{ label: 'アクティブ', key: 'status-active', groupName: 'ステータス' },
{ label: '管理者', key: 'role-admin', groupName: '権限' },
]}
onClickRemoveFilter={(filter) => console.log('フィルター削除:', filter)}
searchPlaceholder="ユーザーを検索..."
/>
<ListUsers
listUsersTitle="チームメンバー"
labels={{
emptyStateMessage: 'ユーザーが見つかりません',
headerRow: {
name: '名前',
status: 'ステータス',
createdAt: '作成日',
},
cellData: {
statusInUse: 'アクティブ',
statusNotInUse: '非アクティブ',
},
}}
data={[
{ id: '1', name: '山田 太郎', status: 'active', createdAt: '2025-01-15T10:30:00Z' },
{ id: '2', name: '鈴木 花子', status: 'inactive', createdAt: '2025-01-20T09:15:00Z' },
]}
rowHref={(row) => `#users/${row.id}`}
onNavigate={(path) => console.log('ナビゲート:', path)}>
<ListUsers.Header>
<ListUsers.Title />
</ListUsers.Header>
<ListUsers.Content />
</ListUsers>
</main>
</div>
</ThemeProvider>
);
}
🔗 ドメインアプリとの統合
フロントエンドブロックはNodeblocks ドメインアプリとシームレスに連携し、完全なアプリケーションソリューションを提供できます:
- ブロックが提供: ビジュアルコンポーネントとユーザーインターフェース
- ドメインアプリが提供: ビジネスロジックと状態管理
- 両者を組み合わせることで: 完全な本番環境対応アプリケーションを実現
📈 メリット
⚡ スピード
- 開発時間を70%削減
- 面倒なUI開発をスキップ
- ビジネスロジックに集中
🎨 品質
- 本番環境でテスト済みのコンポーネント
- 一貫したデザイン言語
- プロフェッショナルな外観
🔧 柔軟性
- コンポーネントを自由に組み合わせ
- ニーズに合わせてカスタマイズ
- 独自のブロックで拡張
💰 コスト効率
- 開発コストの削減
- 市場投入までの時間短縮
- メンテナンスオーバーヘッドの軽減
Basalの Nodeblocks チームが❤️を込めて構築しました