@aiquants/resize-panels 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,192 @@
1
+ # @aiquants/resize-panels
2
+
3
+ React 向けのリサイズ可能なパネルレイアウトコンポーネント集です。`~/components/elements/ResizablePanels` で培ったロジックをパッケージ化し、任意のアプリケーションから再利用できるようにしました。
4
+
5
+ ## 主な特徴
6
+
7
+ - `PanelGroup` と `Panel` と `PanelResizeHandle` を中核に、リデューサーでレイアウトと DOM 計測を同期
8
+ - `calculateSnapThreshold` とノイズ除去ロジックでリサイズ時の揺らぎを抑え、意図しない折りたたみを防止
9
+ - `collapsible` パネルと `usePanelControls` により、ドラッグ操作と UI 操作の両方で折りたたみ / 展開を制御
10
+ - `autoSaveId` を指定するとローカルストレージにパネルサイズを自動保存し、再読み込み時に復元
11
+ - `showDebugInfo` を使えば `PanelDebugInfo` とグローバルオーバーレイで計測結果や制約違反を可視化
12
+
13
+ ## インストール
14
+
15
+ ワークスペース内で利用する場合は `pnpm` を利用します。
16
+
17
+ ```bash
18
+ pnpm add @aiquants/resize-panels
19
+ ```
20
+
21
+ モノレポ内から参照する場合は `package.json` に次のように記載します。
22
+
23
+ ```json
24
+ {
25
+ "dependencies": {
26
+ "@aiquants/resize-panels": "workspace:*"
27
+ }
28
+ }
29
+ ```
30
+
31
+ ## クイックスタート
32
+
33
+ ```tsx
34
+ import { useId } from "react"
35
+ import { PanelGroup, Panel, PanelResizeHandle } from "@aiquants/resize-panels"
36
+
37
+ export const Example = () => {
38
+ const baseId = useId()
39
+
40
+ return (
41
+ <PanelGroup id={`${baseId}-group`} direction="horizontal" className="h-96">
42
+ <Panel id={`${baseId}-left`} defaultSize={{ value: 200, unit: "pixels" }} className="bg-slate-100">
43
+ 左パネル
44
+ </Panel>
45
+ <PanelResizeHandle id={`${baseId}-handle`} />
46
+ <Panel id={`${baseId}-right`} defaultSize={{ value: 60, unit: "percentage" }} className="bg-slate-50">
47
+ 右パネル
48
+ </Panel>
49
+ </PanelGroup>
50
+ )
51
+ }
52
+ ```
53
+
54
+ ### 折りたたみを有効にする
55
+
56
+ `Panel` に `collapsible` を指定すると、対応する `PanelResizeHandle` を端までドラッグしたタイミングで自動的に折りたたみ・展開が行われます。`defaultCollapsed` を併用すると初期状態を折りたたみ済みに設定できます。
57
+
58
+ ```tsx
59
+ <PanelGroup direction="horizontal" className="h-96">
60
+ <Panel id="sidebar" defaultSize={{ value: 240, unit: "pixels" }} collapsible>
61
+ サイドバー
62
+ </Panel>
63
+ <PanelResizeHandle id="handle" />
64
+ <Panel id="main" defaultSize={{ value: 60, unit: "percentage" }}>
65
+ メインコンテンツ
66
+ </Panel>
67
+ </PanelGroup>
68
+ ```
69
+
70
+ ### UI から折りたたみ / 展開を切り替える
71
+
72
+ `usePanelControls(panelId)` フックを使うと、任意の UI から対象パネルを折りたたみ・展開・トグルできます。ボタンを配置するコンポーネントは `PanelGroup` の配下(コンテキスト内)に置いてください。折りたたみ後もボタンを表示したい場合は、別パネルやヘッダーなど常に可視な場所に設置します。
73
+
74
+ ```tsx
75
+ import { PanelGroup, Panel, PanelResizeHandle, usePanelControls } from "@aiquants/resize-panels"
76
+
77
+ const PanelToggleButtons = ({ panelId, label }: { panelId: string; label: string }) => {
78
+ const { isCollapsed, collapse, expand, toggle } = usePanelControls(panelId)
79
+
80
+ return (
81
+ <div className="flex items-center gap-2">
82
+ <span>{label}</span>
83
+ <button onClick={() => collapse()} disabled={isCollapsed}>
84
+ 折りたたむ
85
+ </button>
86
+ <button onClick={() => expand()} disabled={!isCollapsed}>
87
+ 展開する
88
+ </button>
89
+ <button onClick={() => toggle()}>
90
+ {isCollapsed ? "展開に切り替え" : "折りたたみに切り替え"}
91
+ </button>
92
+ </div>
93
+ )
94
+ }
95
+
96
+ export const Example = () => (
97
+ <PanelGroup direction="horizontal" className="h-96">
98
+ <Panel id="sidebar" defaultSize={{ value: 240, unit: "pixels" }} collapsible>
99
+ <PanelToggleButtons panelId="sidebar" label="サイドバー" />
100
+ </Panel>
101
+ <PanelResizeHandle id="split" />
102
+ <Panel id="main" defaultSize={{ value: 60, unit: "percentage" }}>
103
+ <PanelToggleButtons panelId="details" label="詳細パネル" />
104
+ </Panel>
105
+ <PanelResizeHandle id="split-right" />
106
+ <Panel id="details" defaultSize={{ value: 40, unit: "percentage" }} collapsible>
107
+ 詳細
108
+ </Panel>
109
+ </PanelGroup>
110
+ )
111
+ ```
112
+
113
+ `collapse()` はパネルを非表示にし、`expand()` はドラッグ操作と同じロジックで直前のサイズや推奨サイズを復元します。`toggle()` を使うと現在の状態に応じて自動的に切り替わります。
114
+
115
+ ## コンポーネント API
116
+
117
+ ### PanelGroup の主なプロパティ
118
+
119
+ | プロパティ | 型 | 説明 |
120
+ |-------------|----|------|
121
+ | `id` | `string` | `data-panel-group-id` にも反映される識別子。複数グループを並べる場合は指定を推奨 |
122
+ | `direction` | `'horizontal' \| 'vertical'` | パネルの配置方向 |
123
+ | `className` / `style` | `string` / `React.CSSProperties` | コンテナの見た目を調整するための追加スタイル |
124
+ | `children` | `React.ReactNode` | グループ内の `Panel` と `PanelResizeHandle` を並べるための子要素 |
125
+ | `showDebugInfo` | `boolean` | `PanelDebugInfo` とグローバルオーバーレイを表示して計測結果と制約違反を可視化 |
126
+ | `onLayout` | `(sizes: number[]) => void` | リサイズや初期化のたびに最新のピクセルサイズ配列を通知 |
127
+ | `autoSaveId` | `string` | 指定すると `localStorage` にパネルサイズを保存・復元 |
128
+
129
+ ### Panel の主なプロパティ
130
+
131
+ | プロパティ | 型 | 説明 |
132
+ |-------------|----|------|
133
+ | `id` | `string` | パネル識別子。省略時はランダム生成だが、SSR との整合のため明示指定を推奨 |
134
+ | `defaultSize` | `{ value: number; unit: 'pixels' \| 'percentage' } \| number` | 初期サイズ。数値のみの場合はパーセンテージとして扱う |
135
+ | `minSize` / `maxSize` | `FlexibleSize` | パネルの最小・最大サイズ制約。ピクセル・割合で指定可能 |
136
+ | `collapsible` | `boolean` | ハンドルを端までドラッグした際に折りたたみ可能にするかどうか |
137
+ | `defaultCollapsed` | `boolean` | 初期状態を折りたたみ済みにするかどうか |
138
+ | `pixelAdjustPriority` | `number` | 余白調整時にピクセル基準パネルへ割り当てる優先度 |
139
+ | `className` / `style` | `string` / `React.CSSProperties` | パネル本体の見た目をカスタマイズ |
140
+
141
+ ### PanelResizeHandle の主なプロパティ
142
+
143
+ | プロパティ | 型 | 説明 |
144
+ |-------------|----|------|
145
+ | `id` | `string` | ハンドル識別子。省略時はランダム生成 |
146
+ | `disabled` | `boolean` | `true` にするとドラッグ操作を無効化 |
147
+ | `onDragging` | `(isDragging: boolean) => void` | ドラッグ開始 / 終了ごとに呼び出されるコールバック |
148
+ | `className` / `style` | `string` / `React.CSSProperties` | ハンドル見た目を追加カスタマイズ |
149
+ | `children` | `React.ReactNode` | 独自のハンドルインジケーターを描画する場合に使用 |
150
+
151
+ ## フックとユーティリティ
152
+
153
+ - `useResizablePanels`: `PanelGroup` 内部実装でも利用しているフック。カスタムコンテナを作る場合に役立ちます。
154
+ - `usePanelGroup`: コンテキストを直接参照し、パネルリストやレイアウト情報を取得できます。
155
+ - `usePanelControls`: 特定パネルに対する折りたたみ / 展開操作を提供します。
156
+ - `generatePanelId` と `generateResizeHandleId`: SSR と CSR の双方で衝突しにくい ID を生成します。
157
+ - `saveLayout` と `loadLayout`: 任意のタイミングでレイアウトを永続化 / 復元できます。
158
+ - `getPanelElement`, `getPanelGroupElement`, `getResizeHandleElement`: `data-*` 属性をもとに DOM 要素を取得します。
159
+
160
+ ## レイアウト保存と復元
161
+
162
+ `PanelGroup` に `autoSaveId` を指定すると、`ResizeObserver` が安定した後のパネルサイズを 200ms デバウンス付きで `localStorage` に保存します。ページを再読み込みすると `loadLayout(autoSaveId)` の結果が自動的に反映され、ピクセル基準パネルと割合基準パネルの両方が復元されます。手動で制御したい場合は公開ユーティリティの `saveLayout` / `loadLayout` を直接呼び出してください。
163
+
164
+ ## デバッグと可視化
165
+
166
+ `PanelGroup` の `showDebugInfo` を有効にすると、各 `Panel` に `PanelDebugInfo` が表示され、折りたたみ状態・計測サイズ・保持中の割合が即座に確認できます。同時にグローバルオーバーレイが開き、コンテナの実測サイズ、制約違反の有無、ハンドル厚み(`PANEL_HANDLE_THICKNESS` で定義された 8px)なども一覧できます。
167
+
168
+ ## スナップとノイズ対策の挙動
169
+
170
+ `PanelResizeHandle` と `Panel` の両方で `calculateSnapThreshold` を利用し、コンテナサイズに応じたゼロスナップ閾値を共有しています。`Panel` コンポーネントでは ResizeObserver が一時的に極端な値を返した場合でも、`noiseThreshold` を用いたフィルタでチラつきを防ぎ、リデューサーが保持する状態と DOM 計測値の整合を保ちます。
171
+
172
+ ## スタイル
173
+
174
+ `src/styles.css` で Tailwind CSS レイヤーを読み込んでいます。グローバルに取り込み済みの環境では追加設定不要ですが、個別プロジェクトでユーティリティクラスを無効化したい場合はローカルの Tailwind 設定でオーバーライドしてください。
175
+
176
+ ## デモ
177
+
178
+ モノレポ内に簡易デモアプリを用意しています。
179
+
180
+ ```bash
181
+ pnpm --filter '@aiquants/resize-panels-demo' dev
182
+ ```
183
+
184
+ `http://localhost:5175` にアクセスすると複数レイアウトを含むデモを確認できます。
185
+
186
+ ## ビルド
187
+
188
+ ```bash
189
+ pnpm --filter '@aiquants/resize-panels' build
190
+ ```
191
+
192
+ 生成物は `dist` に出力されます。
@@ -0,0 +1,8 @@
1
+ import { PanelProps } from './types';
2
+
3
+ /**
4
+ * Render a resizable panel within a managed group, keeping DOM measurements in sync with reducer state.
5
+ * 管理対象グループ内で DOM 計測とリデューサー状態を同期させながらリサイズ可能パネルを描画するコンポーネント。
6
+ */
7
+ export declare const Panel: import('react').MemoExoticComponent<({ id: providedId, defaultSize, minSize, maxSize, className, style, children, order, collapsible, defaultCollapsed, pixelAdjustPriority }: PanelProps) => import("react/jsx-runtime").JSX.Element>;
8
+ //# sourceMappingURL=Panel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Panel.d.ts","sourceRoot":"","sources":["../src/Panel.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAGzC;;;GAGG;AACH,eAAO,MAAM,KAAK,iLAA2M,UAAU,6CAmerO,CAAA"}
@@ -0,0 +1,29 @@
1
+ import { PanelDirection, PanelLayoutData } from './types';
2
+
3
+ type PanelDebugInfoProps = {
4
+ panel: PanelLayoutData | undefined;
5
+ isLastFlexiblePanel: boolean;
6
+ measuredPixelSize: number;
7
+ measuredPercentageSize: number;
8
+ containerAxisSize: number;
9
+ direction: PanelDirection;
10
+ };
11
+ type FormatPanelDebugInfoArgs = {
12
+ panel: PanelLayoutData | undefined;
13
+ isLastFlexiblePanel: boolean;
14
+ measuredPixelSize: number;
15
+ measuredPercentageSize: number;
16
+ containerAxisSize: number;
17
+ containerLabel: string;
18
+ };
19
+ type FormattedPanelDebugInfo = {
20
+ stateValueDisplay: string;
21
+ measuredValueDisplay: string;
22
+ containerDisplay: string;
23
+ headlineLabel: string;
24
+ titleText: string;
25
+ };
26
+ export declare const formatPanelDebugInfo: ({ panel, isLastFlexiblePanel, measuredPixelSize, measuredPercentageSize, containerAxisSize, containerLabel }: FormatPanelDebugInfoArgs) => FormattedPanelDebugInfo;
27
+ export declare const PanelDebugInfo: import('react').MemoExoticComponent<({ panel, isLastFlexiblePanel, measuredPixelSize, measuredPercentageSize, containerAxisSize, direction }: PanelDebugInfoProps) => import("react/jsx-runtime").JSX.Element>;
28
+ export {};
29
+ //# sourceMappingURL=PanelDebugInfo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PanelDebugInfo.d.ts","sourceRoot":"","sources":["../src/PanelDebugInfo.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAE9D,KAAK,mBAAmB,GAAG;IACvB,KAAK,EAAE,eAAe,GAAG,SAAS,CAAA;IAClC,mBAAmB,EAAE,OAAO,CAAA;IAC5B,iBAAiB,EAAE,MAAM,CAAA;IACzB,sBAAsB,EAAE,MAAM,CAAA;IAC9B,iBAAiB,EAAE,MAAM,CAAA;IACzB,SAAS,EAAE,cAAc,CAAA;CAC5B,CAAA;AAED,KAAK,wBAAwB,GAAG;IAC5B,KAAK,EAAE,eAAe,GAAG,SAAS,CAAA;IAClC,mBAAmB,EAAE,OAAO,CAAA;IAC5B,iBAAiB,EAAE,MAAM,CAAA;IACzB,sBAAsB,EAAE,MAAM,CAAA;IAC9B,iBAAiB,EAAE,MAAM,CAAA;IACzB,cAAc,EAAE,MAAM,CAAA;CACzB,CAAA;AAED,KAAK,uBAAuB,GAAG;IAC3B,iBAAiB,EAAE,MAAM,CAAA;IACzB,oBAAoB,EAAE,MAAM,CAAA;IAC5B,gBAAgB,EAAE,MAAM,CAAA;IACxB,aAAa,EAAE,MAAM,CAAA;IACrB,SAAS,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,eAAO,MAAM,oBAAoB,GAAI,8GAA8G,wBAAwB,KAAG,uBAkB7K,CAAA;AAED,eAAO,MAAM,cAAc,gJAAkH,mBAAmB,6CAgG9J,CAAA"}
@@ -0,0 +1,8 @@
1
+ import { PanelGroupProps } from './types';
2
+
3
+ /**
4
+ * Provide layout context and container for coordinated panels.
5
+ * 連動するパネルのためのレイアウトコンテキストとコンテナを提供するコンポーネント。
6
+ */
7
+ export declare const PanelGroup: (props: PanelGroupProps) => import("react/jsx-runtime").JSX.Element;
8
+ //# sourceMappingURL=PanelGroup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PanelGroup.d.ts","sourceRoot":"","sources":["../src/PanelGroup.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAQH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AA+B9C;;;GAGG;AACH,eAAO,MAAM,UAAU,GAAI,OAAO,eAAe,4CA+KhD,CAAA"}
@@ -0,0 +1,8 @@
1
+ import { PanelResizeHandleProps } from './types';
2
+
3
+ /**
4
+ * Render an interactive divider that manages adjacent panel resizing gestures.
5
+ * 隣接パネルのリサイズ操作を管理するインタラクティブなディバイダーを描画するコンポーネント。
6
+ */
7
+ export declare const PanelResizeHandle: import('react').MemoExoticComponent<({ id, disabled, className, style, children, onDragging }: PanelResizeHandleProps) => import("react/jsx-runtime").JSX.Element>;
8
+ //# sourceMappingURL=PanelResizeHandle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PanelResizeHandle.d.ts","sourceRoot":"","sources":["../src/PanelResizeHandle.tsx"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EASH,KAAK,sBAAsB,EAE9B,MAAM,SAAS,CAAA;AAGhB;;;GAGG;AACH,eAAO,MAAM,iBAAiB,iGAA2E,sBAAsB,6CAmjB7H,CAAA"}
@@ -0,0 +1,13 @@
1
+ import { PanelGroupContextValue } from './types';
2
+
3
+ /**
4
+ * Provide shared panel group state to descendant components.
5
+ * 子孫コンポーネントへパネルグループの共有状態を提供するコンテキスト。
6
+ */
7
+ export declare const PanelGroupContext: import('react').Context<PanelGroupContextValue | null>;
8
+ /**
9
+ * Access panel group behaviors and layout data from the nearest provider.
10
+ * 最も近いプロバイダーからパネルグループの振る舞いとレイアウトデータを取得するフック。
11
+ */
12
+ export declare const usePanelGroup: () => PanelGroupContextValue;
13
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAA;AAErD;;;GAGG;AACH,eAAO,MAAM,iBAAiB,wDAAqD,CAAA;AAEnF;;;GAGG;AACH,eAAO,MAAM,aAAa,8BAMzB,CAAA"}
@@ -0,0 +1,62 @@
1
+ import { ContainerSize, PanelDirection, PanelLayoutData, ResizeHandleLayoutData } from './types';
2
+
3
+ /**
4
+ * Snapshot of the debug overlay state across panel groups.
5
+ * デバッグオーバーレイのスナップショット状態を表す構造体。
6
+ */
7
+ export type DebugOverlaySnapshot = {
8
+ ownerId: string | null;
9
+ groups: DebugGroupState[];
10
+ };
11
+ /**
12
+ * Aggregated state for a panel group tracked by the debug overlay.
13
+ * デバッグオーバーレイが追跡するパネルグループの集約状態。
14
+ */
15
+ export type DebugGroupState = {
16
+ groupId: string;
17
+ displayName: string;
18
+ direction: PanelDirection;
19
+ containerSize: ContainerSize;
20
+ panels: PanelLayoutData[];
21
+ handles: ResizeHandleLayoutData[];
22
+ index: number;
23
+ };
24
+ type DebugGroupUpdate = {
25
+ displayName: string;
26
+ direction: PanelDirection;
27
+ containerSize: ContainerSize;
28
+ panels: PanelLayoutData[];
29
+ handles: ResizeHandleLayoutData[];
30
+ };
31
+ /**
32
+ * Subscribe to the identifier of the panel group that renders the overlay.
33
+ * オーバーレイを描画するパネルグループ識別子を購読するフック。
34
+ */
35
+ export declare const useDebugOverlayOwnerId: () => string | null;
36
+ /**
37
+ * Subscribe to the aggregate debug overlay snapshot.
38
+ * 集約されたデバッグオーバーレイのスナップショットを購読するフック。
39
+ */
40
+ export declare const useDebugOverlaySnapshot: () => DebugOverlaySnapshot;
41
+ /**
42
+ * Enable a panel group for inclusion in the debug overlay.
43
+ * デバッグオーバーレイへの取り込み対象としてパネルグループを有効化するメソッド。
44
+ */
45
+ export declare const enableDebugOverlayGroup: (groupId: string) => void;
46
+ /**
47
+ * Disable a panel group from the debug overlay without erasing cached data.
48
+ * キャッシュを保持したままパネルグループをデバッグオーバーレイ対象から外すメソッド。
49
+ */
50
+ export declare const disableDebugOverlayGroup: (groupId: string) => void;
51
+ /**
52
+ * Persist the latest panel group measurements into the debug overlay store.
53
+ * 最新のパネルグループ測定値をデバッグオーバーレイストアに保存するメソッド。
54
+ */
55
+ export declare const updateDebugOverlayGroup: (groupId: string, update: DebugGroupUpdate) => void;
56
+ /**
57
+ * Remove a panel group from the debug overlay store entirely.
58
+ * パネルグループをデバッグオーバーレイストアから完全に削除するメソッド。
59
+ */
60
+ export declare const removeDebugOverlayGroup: (groupId: string) => void;
61
+ export {};
62
+ //# sourceMappingURL=debugOverlayStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debugOverlayStore.d.ts","sourceRoot":"","sources":["../src/debugOverlayStore.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAA;AAErG;;;GAGG;AACH,MAAM,MAAM,oBAAoB,GAAG;IAC/B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,MAAM,EAAE,eAAe,EAAE,CAAA;CAC5B,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG;IAC1B,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,cAAc,CAAA;IACzB,aAAa,EAAE,aAAa,CAAA;IAC5B,MAAM,EAAE,eAAe,EAAE,CAAA;IACzB,OAAO,EAAE,sBAAsB,EAAE,CAAA;IACjC,KAAK,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,KAAK,gBAAgB,GAAG;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,SAAS,EAAE,cAAc,CAAA;IACzB,aAAa,EAAE,aAAa,CAAA;IAC5B,MAAM,EAAE,eAAe,EAAE,CAAA;IACzB,OAAO,EAAE,sBAAsB,EAAE,CAAA;CACpC,CAAA;AAmQD;;;GAGG;AACH,eAAO,MAAM,sBAAsB,qBAElC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,uBAAuB,4BAEnC,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,uBAAuB,GAAI,SAAS,MAAM,SAEtD,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,wBAAwB,GAAI,SAAS,MAAM,SAEvD,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,uBAAuB,GAAI,SAAS,MAAM,EAAE,QAAQ,gBAAgB,SAEhF,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,uBAAuB,GAAI,SAAS,MAAM,SAEtD,CAAA"}
@@ -0,0 +1,44 @@
1
+ import { CSSProperties } from 'react';
2
+ import { LayoutConstraintViolation, PanelGroupProps, PanelLayoutData, PanelMeasurement, ResizeHandleLayoutData } from './types';
3
+
4
+ /**
5
+ * Orchestrate registration, constraint resolution, measurement sync, and persistence for a panel group.
6
+ * パネルグループにおける登録処理・制約判定・計測同期・永続化の統括。
7
+ */
8
+ export declare const useResizablePanels: ({ direction, style, onLayout, autoSaveId, showDebugInfo }: PanelGroupProps) => {
9
+ groupRef: import('react').RefObject<HTMLDivElement | null>;
10
+ contextValue: {
11
+ direction: import('./types').PanelDirection;
12
+ panels: PanelLayoutData[];
13
+ containerSize: {
14
+ width: number;
15
+ height: number;
16
+ };
17
+ isContainerReady: boolean;
18
+ showDebugInfo: boolean;
19
+ registerPanel: (panel: PanelLayoutData) => void;
20
+ unregisterPanel: (id: string) => void;
21
+ resizePanels: (leftId: string, rightId: string, leftSize: number, rightSize: number) => void;
22
+ collapsePanel: (id: string) => void;
23
+ expandPanel: (id: string, targetSize?: number) => void;
24
+ getPanel: (id: string) => PanelLayoutData | undefined;
25
+ reportPanelMeasurement: (panelId: string, measurement: PanelMeasurement | null) => void;
26
+ panelMeasurements: Record<string, PanelMeasurement>;
27
+ reportHandleMeasurement: (handleId: string, measurement: ResizeHandleLayoutData | null) => void;
28
+ handleMeasurements: Record<string, ResizeHandleLayoutData>;
29
+ layoutConstraintViolation: LayoutConstraintViolation | null;
30
+ };
31
+ groupStyle: CSSProperties;
32
+ };
33
+ /**
34
+ * Provide imperative helpers for toggling a specific panel while preserving stored sizing.
35
+ * 特定パネルの保存済みサイズを維持しつつ開閉を制御する命令型ユーティリティを提供するカスタムフック。
36
+ */
37
+ export declare const usePanelControls: (panelId: string) => {
38
+ panel: PanelLayoutData | undefined;
39
+ isCollapsed: boolean;
40
+ collapse: () => void;
41
+ expand: (targetSize?: number) => void;
42
+ toggle: () => void;
43
+ };
44
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,KAAK,aAAa,EAAkF,MAAM,OAAO,CAAA;AAG1H,OAAO,KAAK,EAAE,yBAAyB,EAAE,eAAe,EAAE,eAAe,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAA;AAGpI;;;GAGG;AACH,eAAO,MAAM,kBAAkB,GAAI,2DAAmE,eAAe;;;;;;;;;;;+BAmavE,eAAe;8BAKhB,MAAM;+BAkBlC,MAAM,WAAW,MAAM,YAAY,MAAM,aAAa,MAAM;4BAmFhE,MAAM;0BAaN,MAAM,eAAe,MAAM;uBAa3B,MAAM;0CAWsC,MAAM,eAAe,gBAAgB,GAAG,IAAI;;4CA6B1C,MAAM,eAAe,sBAAsB,GAAG,IAAI;;;;;CA4F5G,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,gBAAgB,GAAI,SAAS,MAAM;;;;0BAS1B,MAAM;;CAwB3B,CAAA"}
@@ -0,0 +1,24 @@
1
+
2
+ export { PanelGroupContext, usePanelGroup } from './context';
3
+ export { usePanelControls, useResizablePanels } from './hooks';
4
+ export { Panel } from './Panel';
5
+ export { PanelGroup } from './PanelGroup';
6
+ export { PanelResizeHandle } from './PanelResizeHandle';
7
+ export type { ContainerAxisMeasurement, ContainerSize, FlexibleSize, PanelDirection, PanelGroupContextValue, PanelGroupProps, PanelLayoutData, PanelProps, PanelResizeHandleProps, SizeConfig, SizeUnit, } from './types';
8
+ export { clamp, generatePanelId, getConstraintInPixels, getContainerSize, loadLayout, normalizeSizeConfig, saveLayout, } from './utils';
9
+ /**
10
+ * Locate a panel element in the DOM by its data attribute.
11
+ * data 属性を手がかりにパネル要素を DOM から取得する補助関数。
12
+ */
13
+ export declare const getPanelElement: (id: string) => HTMLElement | null;
14
+ /**
15
+ * Locate a panel group element in the DOM by its data attribute.
16
+ * data 属性を手がかりにパネルグループ要素を DOM から取得する補助関数。
17
+ */
18
+ export declare const getPanelGroupElement: (id: string) => HTMLElement | null;
19
+ /**
20
+ * Locate a resize handle element in the DOM by its data attribute.
21
+ * data 属性を手がかりにリサイズハンドル要素を DOM から取得する補助関数。
22
+ */
23
+ export declare const getResizeHandleElement: (id: string) => HTMLElement | null;
24
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,cAAc,CAAA;AAErB,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAC5D,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAA;AAC9D,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAEvD,YAAY,EACR,wBAAwB,EACxB,aAAa,EACb,YAAY,EACZ,cAAc,EACd,sBAAsB,EACtB,eAAe,EACf,eAAe,EACf,UAAU,EACV,sBAAsB,EACtB,UAAU,EACV,QAAQ,GACX,MAAM,SAAS,CAAA;AAEhB,OAAO,EACH,KAAK,EACL,eAAe,EACf,qBAAqB,EACrB,gBAAgB,EAChB,UAAU,EACV,mBAAmB,EACnB,UAAU,GACb,MAAM,SAAS,CAAA;AAEhB;;;GAGG;AACH,eAAO,MAAM,eAAe,GAAI,IAAI,MAAM,KAAG,WAAW,GAAG,IAE1D,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,oBAAoB,GAAI,IAAI,MAAM,KAAG,WAAW,GAAG,IAE/D,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,sBAAsB,GAAI,IAAI,MAAM,KAAG,WAAW,GAAG,IAEjE,CAAA"}