states/
├── ui/
│ ├── sidebar/ # サイドバー状態 ✅
│ ├── editor/ # エディター状態 ✅
│ ├── device.ts # デバイス状態 ✅
│ ├── page.ts # ページUI状態 ✅
│ ├── toc.ts # TOC状態 ✅
│ ├── untitled-page.ts # 無題ページ状態 ✅
│ ├── page-abilities.ts # ページ権限判定状態 ✅ DERIVED ATOM!
│ ├── unsaved-warning.ts # 未保存警告状態 ✅ JOTAI PATTERN!
│ └── modal/ # 個別モーダルファイル ✅
│ ├── page-create.ts # ページ作成モーダル ✅
│ ├── page-delete.ts # ページ削除モーダル ✅
│ ├── empty-trash.ts # ゴミ箱空モーダル ✅
│ ├── delete-attachment.ts # 添付ファイル削除 ✅
│ ├── delete-bookmark-folder.ts # ブックマークフォルダ削除 ✅
│ ├── update-user-group-confirm.ts # ユーザーグループ更新確認 ✅
│ ├── page-select.ts # ページ選択モーダル ✅
│ ├── page-presentation.ts # プレゼンテーションモーダル ✅
│ ├── put-back-page.ts # ページ復元モーダル ✅
│ ├── granted-groups-inheritance-select.ts # 権限グループ継承選択 ✅
│ ├── drawio.ts # Draw.ioモーダル ✅
│ ├── handsontable.ts # Handsontableモーダル ✅
│ ├── private-legacy-pages-migration.ts # プライベートレガシーページ移行 ✅
│ ├── descendants-page-list.ts # 子孫ページリスト ✅
│ ├── conflict-diff.ts # 競合差分モーダル ✅
│ ├── page-bulk-export-select.ts # ページ一括エクスポート選択 ✅
│ ├── drawio-for-editor.ts # エディタ用Draw.io ✅
│ ├── link-edit.ts # リンク編集モーダル ✅
│ └── template.ts # テンプレートモーダル ✅
├── page/ # ページ関連状態 ✅
├── server-configurations/ # サーバー設定状態 ✅
├── global/ # グローバル状態 ✅
├── socket-io/ # Socket.IO状態 ✅
├── context.ts # 共通コンテキスト ✅
└── features/
└── openai/
└── client/
└── states/ # OpenAI専用状態 ✅
├── index.ts # exports ✅
└── unified-merge-view.ts # UnifiedMergeView状態 ✅
features/ # Feature Directory Pattern ✅
└── page-tree/ # ページツリー機能 ✅ (NEW!)
├── index.ts # メインエクスポート
├── client/
│ ├── components/ # 汎用UIコンポーネント
│ │ ├── SimplifiedItemsTree.tsx
│ │ ├── TreeItemLayout.tsx
│ │ └── SimpleItemContent.tsx
│ ├── hooks/ # 汎用フック
│ │ ├── use-data-loader.ts
│ │ └── use-scroll-to-selected-item.ts
│ ├── interfaces/ # インターフェース定義
│ │ └── index.ts # TreeItemProps, TreeItemToolProps
│ └── states/ # Jotai状態 ✅
│ ├── page-tree-update.ts # ツリー更新状態
│ └── page-tree-desc-count-map.ts # 子孫カウント状態
└── constants/
└── index.ts # ROOT_PAGE_VIRTUAL_ID
states/ui/)modal/ 配下に個別モーダルファイルstates/)page/ ディレクトリserver-configurations/ ディレクトリglobal/ ディレクトリsocket-io/ ディレクトリstates/features/ および features/)OpenAI機能: states/features/openai/client/states/
ページツリー機能: features/page-tree/client/states/ ✅ (Feature Directory Pattern)
features/{feature-name}/ パターンは、特定機能に関連するコンポーネント、フック、状態、定数をすべて一箇所に集約する構造。
適用例: features/page-tree/
features/page-tree/
├── index.ts # 全エクスポートの集約
├── client/
│ ├── components/ # UIコンポーネント
│ ├── hooks/ # カスタムフック
│ ├── interfaces/ # 型定義
│ └── states/ # Jotai状態
└── constants/ # 定数
インポート方法:
import {
SimplifiedItemsTree,
TreeItemLayout,
usePageTreeInformationUpdate,
ROOT_PAGE_VIRTUAL_ID
} from '~/features/page-tree';
{機能名}.ts (例: device.ts, toc.ts){機能名}/ ディレクトリ(例: sidebar/, editor/)modal/{モーダル名}.ts(例: modal/page-create.ts)index.ts でのre-export_atomsForDerivedAbilities 特殊名exportcomponents/
├── import from states/ui/ # UI状態
├── import from states/page/ # ページ状態
├── import from states/global/ # グローバル状態
└── import from states/features/ # 機能別状態
states/ui/
├── 内部相互参照可能
└── states/page/, states/global/ からのimport
states/features/{feature}/
├── states/ui/ からのimport
├── 他のfeatures からのimport禁止
└── 独立性を保つ
states/page/internal-atoms.ts → _atomsForDerivedAbilities
states/ui/editor/atoms.ts → _atomsForDerivedAbilities
states/global/global.ts → _atomsForDerivedAbilities
states/context.ts → _atomsForDerivedAbilities
states/ui/、専用 → features/{feature-name}/client/states/features/ 配下に集約以下の条件を満たす場合は features/ 配下に配置:
例: features/page-tree/ は SimplifiedItemsTree, TreeItemLayout, useDataLoader, page-tree-update.ts などが密接に関連
2025-11-28 (Feature Directory Pattern 追加)