@dashfoo/react 0.3.0 → 0.5.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 CHANGED
@@ -15,7 +15,7 @@ paint.
15
15
  It builds on three engines:
16
16
 
17
17
  - **[react-resizable-panels](https://github.com/bvaughn/react-resizable-panels)** for splitter resize (the resize adapter is the only file that imports it).
18
- - **[@dnd-kit/dom](https://github.com/clauderic/dnd-kit) 0.4** — the framework-agnostic core (no React bindings) — for drag (the drag adapter is the only file that touches it; pointer-only).
18
+ - **[@dnd-kit/dom](https://github.com/clauderic/dnd-kit) 0.5** — the framework-agnostic core (no React bindings) — for drag (the drag adapter is the only file that touches it; pointer-only).
19
19
  - **[@dashfoo/core](https://www.npmjs.com/package/@dashfoo/core)** for the document: a zod schema, a pure reducer, and the XState machines that drive state and the drag lifecycle.
20
20
 
21
21
  ## Install
@@ -59,34 +59,38 @@ a sized parent and add your CSS (see the [attribute reference](#data-dashfoo-att
59
59
 
60
60
  ## `DashfooLayout` props
61
61
 
62
- | Prop | Type | Default | Description |
63
- | ------------------------- | -------------------------------------------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------- |
64
- | `model` | `Dashfoo` | — | Controlled document. When set, the prop is the source of truth. |
65
- | `defaultModel` | `Dashfoo` | — | Uncontrolled initial document. The component owns it from there. |
66
- | `onModelChange` | `(model: Dashfoo, action?: Action) => void` | — | Called after every change with the next model and the action that caused it. |
67
- | `components` | `Record<string, ComponentType<{ node: TabNode }>>` | — | Registry mapping `tab.component` keys to components. |
68
- | `factory` | `(tab: TabNode) => ReactNode` | — | Render override. When provided, it resolves every tab and `components` is ignored. |
69
- | `persist` | `string \| { key; storage?; debounceMs? }` | — | Auto-save the model (uncontrolled mode only). A bare string is a localStorage key. |
70
- | `onAction` | `(action: Action) => Action \| null` | — | Intercept each action before it commits — return it, a replacement, or `null` to veto. |
71
- | `onActiveTabsetChange` | `(id: string \| undefined) => void` | — | Fires when the active tabset changes. |
72
- | `onMaximizedTabsetChange` | `(id: string \| undefined) => void` | — | Fires when a tabset is maximized or restored. |
73
- | `renderTabLabel` | `(tab: TabNode) => ReactNode` | — | Override the tab label (the accessible name stays `tab.name`). |
74
- | `renderTabsetToolbar` | `(tabset: TabsetNode) => ReactNode` | — | Inject custom controls into a tabset's toolbar. |
75
- | `editable` | `boolean` | `true` | `false` renders a static layout: no drag, close, rename, or splitter resize. Tab selection, maximize, and the ref API keep working. |
76
- | `closableTabs` | `boolean` | `true` | Show the per-tab close control. |
77
- | `renamableTabs` | `boolean` | `true` | Allow double-click inline rename. |
78
- | `maximizable` | `boolean` | `true` | Show the tabset maximize/restore control. |
79
- | `draggableTabs` | `boolean` | `true` | Allow individual tabs to be dragged between tabsets. |
80
- | `draggableTabsets` | `boolean` | `true` | Show the grip that drags a whole tabset. |
81
- | `resizableSplits` | `boolean` | `true` | Allow dragging the splitters; `false` disables them in place (gutters keep their size). |
82
- | `keepMounted` | `boolean` | `false` | Keep inactive tab panels mounted (hidden) so their state survives a tab switch. |
62
+ | Prop | Type | Default | Description |
63
+ | ------------------------- | ----------------------------------------------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
64
+ | `model` | `Dashfoo` | — | Controlled document. When set, the prop is the source of truth. |
65
+ | `defaultModel` | `Dashfoo` | — | Uncontrolled initial document. The component owns it from there. |
66
+ | `onModelChange` | `(model: Dashfoo, action?: Action) => void` | — | Called after every change with the next model and the action that caused it. |
67
+ | `components` | `Record<string, ComponentType<{ node: TabNode }>>` | — | Registry mapping `tab.component` keys to components. |
68
+ | `factory` | `(tab: TabNode) => ReactNode` | — | Render override. When provided, it resolves every tab and `components` is ignored. |
69
+ | `persist` | `string \| { key; storage?; debounceMs? }` | — | Auto-save the model (uncontrolled mode only). A bare string is a localStorage key. |
70
+ | `onAction` | `(action: Action) => Action \| null` | — | Intercept each action before it commits — return it, a replacement, or `null` to veto. |
71
+ | `onActiveTabsetChange` | `(id: string \| undefined) => void` | — | Fires when the active tabset changes. |
72
+ | `onMaximizedTabsetChange` | `(id: string \| undefined) => void` | — | Fires when a tabset is maximized or restored. |
73
+ | `renderTabLabel` | `(tab: TabNode) => ReactNode` | — | Override the tab label (the accessible name stays `tab.name`). |
74
+ | `renderTabsetToolbar` | `(tabset: TabsetNode) => ReactNode` | — | Inject custom controls into a tabset's toolbar. |
75
+ | `editable` | `boolean` | `true` | `false` renders a static layout: no drag, close, rename, or splitter resize. Tab selection, maximize, and the ref API keep working. |
76
+ | `closableTabs` | `boolean` | `true` | Show the per-tab close control. |
77
+ | `renamableTabs` | `boolean` | `true` | Allow double-click inline rename. |
78
+ | `maximizable` | `boolean` | `true` | Show the tabset maximize/restore control. |
79
+ | `floatable` | `boolean` | `false` | Show a per-tabset control that floats the panel into a movable, resizable overlay, and render any floating panels. See below. |
80
+ | `draggableTabs` | `boolean` | `true` | Allow individual tabs to be dragged between tabsets. |
81
+ | `draggableTabsets` | `boolean` | `true` | Show the grip that drags a whole tabset. |
82
+ | `resizableSplits` | `boolean` | `true` | Allow dragging the splitters; `false` disables them in place (gutters keep their size). |
83
+ | `keepMounted` | `boolean` | `false` | Keep inactive tab panels mounted (hidden) so their state survives a tab switch. |
84
+ | `responsive` | `{ maxWidth: number; orientation? }` | — | At/below `maxWidth` (the layout's own container width) render a stacked column and lock drag + resize. View-only projection — no remount, state preserved. See below. |
85
+ | `snap` | `{ step?: number; divisions?: number \| "panels"; threshold?: number }` | — | Magnetic splitter snapping onto a grid — the union of `step` (multiples of a fixed percent) and `divisions` (even splits: `100/d`, or `"panels"` to divide by the row's panel count, so a 3-panel row snaps to thirds). Within `threshold` percent (default `4`) it snaps and commits on release as one undo step. Off when omitted; replaces `global.snap`; a row overrides via its own `snap` (`{}` disables). Locked off in compact mode. |
83
86
 
84
87
  You must pass either `model` or `defaultModel`. Passing neither throws.
85
88
 
86
89
  A `ref` exposes a `DashfooHandle` for imperative control:
87
- `addTab`, `closeTab`, `selectTab`, `renameTab`, `maximizeTabset`, `dispatch`,
88
- `getModel`, `undo` / `redo` / `canUndo` / `canRedo`, and `resetLayout()` (reset to
89
- the original `defaultModel`, clearing undo history and any persisted copy).
90
+ `addTab`, `closeTab`, `selectTab`, `renameTab`, `maximizeTabset`, `floatTab`,
91
+ `dockFloat`, `dispatch`, `getModel`, `undo` / `redo` / `canUndo` / `canRedo`,
92
+ and `resetLayout()` (reset to the original `defaultModel`, clearing undo history and
93
+ any persisted copy).
90
94
 
91
95
  ```tsx
92
96
  const ref = useRef<DashfooHandle>(null);
@@ -173,6 +177,7 @@ with the right role and ARIA wiring, ready for you to style.
173
177
  - **Close** — a `[data-dashfoo="tab-close"]` button next to each tab label, shown when closing is enabled. Dispatches `deleteTab`.
174
178
  - **Rename** — double-click a tab to swap its label for a `[data-dashfoo="tab-rename"]` input. Enter commits, Escape cancels, blur commits. A trimmed, changed value dispatches `renameTab`; focus returns to the tab afterward.
175
179
  - **Maximize** — a `[data-dashfoo="tabset-maximize"]` toggle in the tabset toolbar. Dispatches `setMaximizedTabset`; one maximized tabset fills the frame and `aria-pressed` reflects state.
180
+ - **Float** — a `[data-dashfoo="tabset-float"]` button in the tabset toolbar, shown when `floatable`. Floats the tabset into a movable, resizable overlay (`floatTabset`); the float's `[data-dashfoo="float-dock"]` control docks it back (`dockFloat`). See "Floating panels" below.
176
181
  - **Tabs** — roving-tabindex keyboard model (WAI-ARIA APG): Arrow keys move and select, Home/End jump to the ends, focus follows selection.
177
182
  - **Drag-to-dock** — drag a tab to restack it or split a tabset (when split-dock is on). A `[data-dashfoo="dock-indicator"]` previews where it lands.
178
183
 
@@ -250,6 +255,77 @@ keyboard access.
250
255
  | `label` | `string` | `""` | The drag preview chip text. |
251
256
  | `disabled` | `boolean` | `false` | Unregisters the source while true. |
252
257
 
258
+ ## Responsive layouts
259
+
260
+ Panels are weight-based, so the tree already scales with its container. To
261
+ _restructure_ on small screens, give `DashfooLayout` a `responsive` prop:
262
+
263
+ ```tsx
264
+ <DashfooLayout defaultModel={model} factory={renderPanel} responsive={{ maxWidth: 720 }} />
265
+ ```
266
+
267
+ At or below `maxWidth` — measured on the layout's own container, not the viewport
268
+ — the layout renders as a single stacked column and **locks every structural
269
+ interaction** (tab/tabset drag, split resize), leaving tap-to-switch and
270
+ maximize. This mirrors VS Code: docking is a desktop interaction, so narrow
271
+ screens get a read-only, navigable view instead of unusable hit targets.
272
+
273
+ The stacked view is a **derived projection** — the model in the store is never
274
+ mutated, so the layout is never remounted and widening past `maxWidth` restores
275
+ the desktop arrangement exactly. Undo history, persistence, selection, and
276
+ mounted panels all survive the breakpoint cross. The theme grows tab hit targets
277
+ to 44px under `@media (pointer: coarse)` so tap-to-switch stays usable.
278
+
279
+ Hand-built layouts (the `Layout.*` primitives) get the same behavior with
280
+ `useContainerWidth` + `stackModel`; for _distinct_ per-breakpoint models, use
281
+ `useResponsiveModel`. Both feed reactive props with no `key`/remount.
282
+
283
+ ## Floating panels
284
+
285
+ Pass `floatable` to let a panel float out into a movable, resizable overlay,
286
+ FlexLayout style:
287
+
288
+ ```tsx
289
+ <DashfooLayout defaultModel={model} factory={renderPanel} floatable />
290
+ ```
291
+
292
+ Each tabset toolbar gains a `[data-dashfoo="tabset-float"]` control that floats the
293
+ whole tabset into an overlay (dispatching `floatTabset`). Drag its
294
+ `[data-dashfoo="float-titlebar"]` to move it anywhere on the page, the edge/corner
295
+ handles to resize, the `[data-dashfoo="float-minimize"]` control to collapse it to a
296
+ chip, and the `[data-dashfoo="float-dock"]` "Dock back" control to return it
297
+ (`dockFloat`). Floating panels are first-class model nodes (`Dashfoo.floats` in
298
+ `@dashfoo/core`), so they serialize and round-trip like docked panels.
299
+
300
+ How it works:
301
+
302
+ - **Same React tree, full drag-dock.** A float renders through the normal
303
+ `Layout.Rows` in the same tree, sharing one drag manager with the docked layout —
304
+ so app context (a theme provider, a query client), event handling, your
305
+ stylesheet, and **dragging tabs into and out of a float** all just work. The
306
+ overlay is `pointer-events: none`, so empty space stays click-through to the
307
+ docked layout underneath.
308
+ - **Drag anywhere + resize commit one step.** The overlay is viewport-fixed, so a
309
+ float drags across the whole page. Drag and resize update the DOM imperatively and
310
+ dispatch a single `moveFloat` on release, so a drag is one undo step.
311
+ - **Named, renamable title.** Each float carries its own name ("Panel", "Panel 1",
312
+ …), shown as the window title — never the active tab's. Double-click the title to
313
+ rename it (`renameFloat`).
314
+ - **Minimize.** The minimize control collapses a float to a chip
315
+ (`setFloatMinimized`); tapping the chip restores it to its saved rect.
316
+ - **Dock back as a panel.** "Dock back" returns the float as its own panel — all its
317
+ tabs, grouped — instead of flattening them into another tabset.
318
+ - **Bring to front.** Clicking anywhere in a float — body, a tab, or chrome —
319
+ raises it above the others.
320
+ - **Honors `editable`.** Under `editable={false}` a float is static: its content
321
+ stays selectable and it still raises to the front, but move, resize, rename,
322
+ minimize, and dock-back are switched off (no `moveFloat` / `renameFloat` /
323
+ `setFloatMinimized` / `dockFloat`).
324
+
325
+ Hand-built layouts opt in by wrapping the tree's content with `Layout.FloatLayer`
326
+ (passing `floats` + `global`) and adding `Tabset.FloatButton`. `Tabset.FloatButton`
327
+ hides itself (and warns) if no `Layout.FloatLayer` is present.
328
+
253
329
  ## Persistence
254
330
 
255
331
  The `persist` prop saves an uncontrolled layout and restores it on load. It loads
@@ -285,7 +361,7 @@ in `onModelChange`.
285
361
 
286
362
  The lower-level `usePersistence` load/save primitive (that `persist` is built on)
287
363
  is also exported, for hosts that drive the store directly. See the
288
- [persistence guide](https://docs.dashfoo.dev/persistence) for the storage seam,
364
+ [persistence guide](https://docs.dashfoo.com/persistence) for the storage seam,
289
365
  validation pipeline, and SSR notes.
290
366
 
291
367
  ### Options
@@ -343,14 +419,27 @@ you.
343
419
  | `tab` | `button` | `role="tab"`. Carries `aria-selected` and `data-tab-id`. |
344
420
  | `tab-close` | `button` | Per-tab close. `aria-label="Close <name>"`. |
345
421
  | `tab-rename` | `input` | Inline rename editor, shown during a rename. |
346
- | `tabset-toolbar` | `div` | Trailing controls in the strip: overflow menu, grip, custom toolbar slot, maximize. |
422
+ | `tabset-toolbar` | `div` | Trailing controls in the strip: overflow menu, grip, custom toolbar slot, pop-out, maximize. |
347
423
  | `tab-overflow-root` | `div` | Wraps the overflow trigger and its menu; rendered when tabs don't fit the strip. |
348
424
  | `tab-overflow` | `button` | Overflow menu trigger. `aria-label="More tabs"`. |
349
425
  | `tab-overflow-menu` | `div` | `role="menu"`, lists the hidden tabs while open. |
350
426
  | `tab-overflow-item` | `button` | `role="menuitem"`, one hidden tab; selecting it activates the tab. |
351
427
  | `tabset-grip` | `button` | Drags the whole tabset. `aria-label="Move tabset"`; shown when `draggableTabsets` is on and the tabset is not maximized. |
428
+ | `tabset-float` | `button` | Floats the tabset into a movable overlay. `aria-label="Float panel"`; shown when `floatable` is on and not maximized. |
352
429
  | `tabset-maximize` | `button` | Maximize/restore toggle. `aria-pressed` reflects state. |
353
430
  | `tabcontent` | `div` | `role="tabpanel"`, the active tab's content (or empty when none). |
431
+ | `float-overlay` | `div` | The `pointer-events: none` overlay covering the layout; holds the floats. |
432
+ | `float` | `div` | A floating panel's elevated frame. `display: flex; flex-direction: column`, positioned absolutely. |
433
+ | `float-titlebar` | `div` | The float's drag handle / title bar (grip + title + dock control). |
434
+ | `float-grip` | `span` | Drag-affordance dots in the title bar (decorative, `aria-hidden`). |
435
+ | `float-title` | `span` | The float's window title (its own name); double-click to rename. `aria-hidden` grip precedes it. |
436
+ | `float-rename` | `input` | The inline title editor, shown while renaming. `aria-label="Rename <name>"`. |
437
+ | `float-minimize` | `button` | Collapses the float to a chip. `aria-label="Minimize panel"`. |
438
+ | `float-dock` | `button` | Docks the panel back into the main layout. `aria-label="Dock panel back into the main layout"`. |
439
+ | `float-body` | `div` | The float's content area; holds the panel's layout. |
440
+ | `float-resize` | `div` | An edge/corner resize handle (eight in total); `data-edge` is the direction. |
441
+ | `float-chip` | `button` | A minimized float: a rounded chip you click (or drag) to restore. |
442
+ | `float-chip-label` | `span` | The chip's panel title. |
354
443
  | `dock-indicator` | `div` | The drag preview overlay (insertion line or zone pane). `pointer-events: none`. |
355
444
  | `drag-preview` | `div` | The chip that follows the pointer during a drag, showing the dragged label. |
356
445
  | `separator` | rrp `Separator` | rrp emits `data-separator` with `aria-orientation`; style splitters here. |
@@ -427,24 +516,26 @@ and overlays outside the layout observe the same drag).
427
516
  same parts yourself when you need custom chrome. Two compound namespaces, same
428
517
  pattern as `Panel`:
429
518
 
430
- | Part | Element | Role |
431
- | ----------------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------- |
432
- | `Layout.Root` | `div[data-dashfoo="layout"]` | Creates the layout store. Takes `model`, `dispatch`, `renderTab`, and the chrome flags `DashfooLayout` accepts. |
433
- | `Layout.DragLayer` | none (overlays) | Opts the tree into drag-dock. Omit it and everything else still works, just without dragging. |
434
- | `Layout.Rows` | rrp split tree | Renders a `RowNode` recursively. `renderTabset` swaps in a custom tabset composition at every leaf. |
435
- | `Layout.Tabset` | — | The stock tabset composition, for leaves that don't need custom chrome. |
436
- | `Tabset.Root` | `div[data-dashfoo="tabset"]` | Creates the per-tabset store; owns drop registration, overflow measurement, and focus restore after close. |
437
- | `Tabset.TabStrip` | `div[data-dashfoo="tabstrip"]` | The strip row (drag hit-testing targets this attribute). |
438
- | `Tabset.Tablist` | `div[data-dashfoo="tablist"]` | `role="tablist"` + roving-tabindex arrow/Home/End navigation. |
439
- | `Tabset.Tab` | `span[data-dashfoo="tab-item"]` | Per-tab wrapper; provides identity to the parts inside. |
440
- | `Tabset.Trigger` | `button[data-dashfoo="tab"]` | The tab button: select on click, rename on double-click, draggable. Children override the label. |
441
- | `Tabset.RenameInput` | `input[data-dashfoo="tab-rename"]` | Inline rename editor; renders only while its tab is being renamed. |
442
- | `Tabset.CloseButton` | `button[data-dashfoo="tab-close"]` | Closes the tab with focus restore; hides when the tab isn't closable. |
443
- | `Tabset.Content` | `div[data-dashfoo="tabcontent"]` | The `role="tabpanel"` pane(s); honors `keepMounted`. Children render-prop overrides `renderTab`. |
444
- | `Tabset.Toolbar` | `div[data-dashfoo="tabset-toolbar"]` | Trailing toolbar container. |
445
- | `Tabset.OverflowMenu` | menu button | Lists clipped tabs; hides when nothing overflows. |
446
- | `Tabset.Grip` | `button[data-dashfoo="tabset-grip"]` | Drag handle for the whole tabset; hides when tabset dragging is off. |
447
- | `Tabset.MaximizeButton` | `button[data-dashfoo="tabset-maximize"]` | Maximize/restore toggle; hides when maximize is off. |
519
+ | Part | Element | Role |
520
+ | ----------------------- | ---------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- |
521
+ | `Layout.Root` | `div[data-dashfoo="layout"]` | Creates the layout store. Takes `model`, `dispatch`, `renderTab`, and the chrome flags `DashfooLayout` accepts. |
522
+ | `Layout.DragLayer` | none (overlays) | Opts the tree into drag-dock. Omit it and everything else still works, just without dragging. |
523
+ | `Layout.Rows` | rrp split tree | Renders a `RowNode` recursively. `renderTabset` swaps in a custom tabset composition at every leaf. |
524
+ | `Layout.Tabset` | — | The stock tabset composition, for leaves that don't need custom chrome. |
525
+ | `Layout.FloatLayer` | overlay | Wrap the tree's content to enable floating panels; renders `model.floats` as draggable overlays. Takes `floats` + `global`. |
526
+ | `Tabset.Root` | `div[data-dashfoo="tabset"]` | Creates the per-tabset store; owns drop registration, overflow measurement, and focus restore after close. |
527
+ | `Tabset.TabStrip` | `div[data-dashfoo="tabstrip"]` | The strip row (drag hit-testing targets this attribute). |
528
+ | `Tabset.Tablist` | `div[data-dashfoo="tablist"]` | `role="tablist"` + roving-tabindex arrow/Home/End navigation. |
529
+ | `Tabset.Tab` | `span[data-dashfoo="tab-item"]` | Per-tab wrapper; provides identity to the parts inside. |
530
+ | `Tabset.Trigger` | `button[data-dashfoo="tab"]` | The tab button: select on click, rename on double-click, draggable. Children override the label. |
531
+ | `Tabset.RenameInput` | `input[data-dashfoo="tab-rename"]` | Inline rename editor; renders only while its tab is being renamed. |
532
+ | `Tabset.CloseButton` | `button[data-dashfoo="tab-close"]` | Closes the tab with focus restore; hides when the tab isn't closable. |
533
+ | `Tabset.Content` | `div[data-dashfoo="tabcontent"]` | The `role="tabpanel"` pane(s); honors `keepMounted`. Children render-prop overrides `renderTab`. |
534
+ | `Tabset.Toolbar` | `div[data-dashfoo="tabset-toolbar"]` | Trailing toolbar container. |
535
+ | `Tabset.OverflowMenu` | menu button | Lists clipped tabs; hides when nothing overflows. |
536
+ | `Tabset.Grip` | `button[data-dashfoo="tabset-grip"]` | Drag handle for the whole tabset; hides when tabset dragging is off. |
537
+ | `Tabset.MaximizeButton` | `button[data-dashfoo="tabset-maximize"]` | Maximize/restore toggle; hides when maximize is off. |
538
+ | `Tabset.FloatButton` | `button[data-dashfoo="tabset-float"]` | Floats the tabset into a movable overlay; hides when `floatable` is off or the tabset is maximized. |
448
539
 
449
540
  All parts spread native props (`className`, `style`, handlers) like `Panel`;
450
541
  the structural attributes (`role`, ids, `data-dashfoo`) are applied after the
@@ -557,7 +648,8 @@ type Persistence;
557
648
  type PersistConfig;
558
649
 
559
650
  // Responsive
560
- useResponsiveModel;
651
+ useContainerWidth; // [ref, width] via ResizeObserver — the hand-built building block
652
+ useResponsiveModel; // per-breakpoint model + lock flags (no remount)
561
653
  matchBreakpoint; // does a breakpoint apply at a given width
562
654
  activeBreakpoint; // first matching breakpoint, else the last (the catch-all)
563
655
  type Breakpoint;
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { Action, Dashfoo, DockLocation, DragSubject, DropIntent, RowNode, TabNode, TabsetNode } from "@dashfoo/core";
2
- import { ComponentProps, ComponentType, ReactNode } from "react";
1
+ import { Action, Dashfoo, DockLocation, DragSubject, DropIntent, FloatNode, GlobalAttributes, Orientation, RowNode, SnapConfig, TabNode, TabsetNode } from "@dashfoo/core";
2
+ import { ComponentProps, ComponentType, ReactNode, Ref } from "react";
3
3
  import { DragDropManager } from "@dnd-kit/dom";
4
4
  //#region src/hooks/persistence.d.ts
5
5
  type StorageAdapter = {
@@ -40,6 +40,8 @@ type DashfooHandle = {
40
40
  canUndo: () => boolean;
41
41
  closeTab: (tabId: string) => void;
42
42
  dispatch: (action: Action) => void;
43
+ dockFloat: (floatId: string) => void;
44
+ floatTab: (tabId: string) => void;
43
45
  getModel: () => Dashfoo;
44
46
  maximizeTabset: (tabsetId: string | null) => void;
45
47
  redo: () => void;
@@ -56,6 +58,7 @@ type DashfooLayoutProps = {
56
58
  draggableTabsets?: boolean;
57
59
  editable?: boolean;
58
60
  factory?: (tab: TabNode) => ReactNode;
61
+ floatable?: boolean;
59
62
  keepMounted?: boolean;
60
63
  maximizable?: boolean;
61
64
  model?: Dashfoo;
@@ -68,6 +71,11 @@ type DashfooLayoutProps = {
68
71
  renderTabLabel?: (tab: TabNode) => ReactNode;
69
72
  renderTabsetToolbar?: (tabset: TabsetNode) => ReactNode;
70
73
  resizableSplits?: boolean;
74
+ responsive?: {
75
+ maxWidth: number;
76
+ orientation?: Orientation;
77
+ };
78
+ snap?: SnapConfig;
71
79
  };
72
80
  declare const DashfooLayout: import("react").ForwardRefExoticComponent<DashfooLayoutProps & import("react").RefAttributes<DashfooHandle>>;
73
81
  //#endregion
@@ -101,6 +109,13 @@ type DragProviderProps = {
101
109
  splitDock?: boolean;
102
110
  };
103
111
  //#endregion
112
+ //#region src/components/float-layer.d.ts
113
+ type FloatLayerProps = {
114
+ children: ReactNode;
115
+ floats: Array<FloatNode>;
116
+ global: GlobalAttributes;
117
+ };
118
+ //#endregion
104
119
  //#region src/components/layout-root.d.ts
105
120
  type LayoutRootProps = Omit<ComponentProps<"div">, "children"> & {
106
121
  children: ReactNode;
@@ -109,6 +124,7 @@ type LayoutRootProps = Omit<ComponentProps<"div">, "children"> & {
109
124
  draggableTabs?: boolean;
110
125
  draggableTabsets?: boolean;
111
126
  editable?: boolean;
127
+ floatable?: boolean;
112
128
  keepMounted?: boolean;
113
129
  maximizable?: boolean;
114
130
  model: Dashfoo;
@@ -117,6 +133,8 @@ type LayoutRootProps = Omit<ComponentProps<"div">, "children"> & {
117
133
  renderTabLabel?: (tab: TabNode) => ReactNode;
118
134
  renderTabsetToolbar?: (tabset: TabsetNode) => ReactNode;
119
135
  resizableSplits?: boolean;
136
+ rootRef?: Ref<HTMLDivElement>;
137
+ snap?: SnapConfig;
120
138
  };
121
139
  //#endregion
122
140
  //#region src/components/row-view.d.ts
@@ -137,6 +155,11 @@ declare const Layout: {
137
155
  onCommit,
138
156
  splitDock
139
157
  }: DragProviderProps) => import("react").ReactNode;
158
+ readonly FloatLayer: ({
159
+ children,
160
+ floats,
161
+ global
162
+ }: FloatLayerProps) => import("react").ReactNode;
140
163
  readonly Root: ({
141
164
  children,
142
165
  closableTabs,
@@ -144,6 +167,7 @@ declare const Layout: {
144
167
  draggableTabs,
145
168
  draggableTabsets,
146
169
  editable,
170
+ floatable,
147
171
  keepMounted,
148
172
  maximizable,
149
173
  model,
@@ -152,6 +176,8 @@ declare const Layout: {
152
176
  renderTabLabel,
153
177
  renderTabsetToolbar,
154
178
  resizableSplits,
179
+ rootRef,
180
+ snap,
155
181
  style,
156
182
  ...props
157
183
  }: LayoutRootProps) => import("react").ReactNode;
@@ -193,6 +219,7 @@ type TabsetContentProps = Omit<ComponentProps<"div">, "children"> & {
193
219
  type TabsetToolbarProps = ComponentProps<"div">;
194
220
  type TabsetGripProps = ComponentProps<"button">;
195
221
  type TabsetMaximizeButtonProps = ComponentProps<"button">;
222
+ type TabsetFloatButtonProps = ComponentProps<"button">;
196
223
  //#endregion
197
224
  //#region src/components/tabset/tabset-root.d.ts
198
225
  type TabsetRootProps = ComponentProps<"div"> & {
@@ -221,6 +248,11 @@ declare const Tabset: {
221
248
  style,
222
249
  ...props
223
250
  }: TabsetContentProps) => import("react").ReactNode;
251
+ readonly FloatButton: ({
252
+ children,
253
+ onClick,
254
+ ...props
255
+ }: TabsetFloatButtonProps) => import("react").ReactNode;
224
256
  readonly Grip: ({
225
257
  children,
226
258
  ref: userRef,
@@ -317,6 +349,7 @@ type LayoutState = {
317
349
  draggableTabs: boolean;
318
350
  draggableTabsets: boolean;
319
351
  editable: boolean;
352
+ floatable: boolean;
320
353
  keepMounted: boolean;
321
354
  maximizable: boolean;
322
355
  maximizedTabsetId: string | undefined;
@@ -325,6 +358,7 @@ type LayoutState = {
325
358
  renderTabLabel: ((tab: TabNode) => ReactNode) | undefined;
326
359
  renderTabsetToolbar: ((tabset: TabsetNode) => ReactNode) | undefined;
327
360
  resizableSplits: boolean;
361
+ snap: SnapConfig | null;
328
362
  splitDock: boolean;
329
363
  tabLocation: "bottom" | "top";
330
364
  tabsetMinSize: number;
@@ -334,6 +368,7 @@ declare const useLayout: <T>(selector: (state: LayoutState) => T) => T;
334
368
  //#endregion
335
369
  //#region src/hooks/responsive.d.ts
336
370
  type Breakpoint = {
371
+ compact?: boolean;
337
372
  id: string;
338
373
  model: Dashfoo;
339
374
  query?: {
@@ -348,11 +383,15 @@ type UseResponsiveModelOptions = {
348
383
  type ResponsiveModel = {
349
384
  breakpoint: string;
350
385
  containerRef: (element: HTMLElement | null) => void;
351
- defaultModel: Dashfoo;
352
- key: string;
386
+ draggableTabs: boolean;
387
+ draggableTabsets: boolean;
388
+ isCompact: boolean;
389
+ model: Dashfoo;
390
+ resizableSplits: boolean;
353
391
  };
354
392
  declare const matchBreakpoint: (breakpoint: Breakpoint, width: number) => boolean;
355
393
  declare const activeBreakpoint: (breakpoints: Array<Breakpoint>, width: number) => Breakpoint;
394
+ declare const useContainerWidth: () => [(element: HTMLElement | null) => void, number];
356
395
  declare const useResponsiveModel: ({
357
396
  breakpoints
358
397
  }: UseResponsiveModelOptions) => ResponsiveModel;
@@ -377,5 +416,5 @@ type UseDashfooStoreOptions = {
377
416
  };
378
417
  declare const useDashfooStore: (options: UseDashfooStoreOptions) => DashfooStore;
379
418
  //#endregion
380
- export { type Breakpoint, DashfooDragProvider, type DashfooHandle, DashfooLayout, type DashfooLayoutProps, type DashfooStore, type ExternalTabSourceOptions, Layout, type DragProviderProps as LayoutDragLayerProps, type LayoutRootProps, type RowViewProps as LayoutRowsProps, type LayoutState, type TabsetViewProps as LayoutTabsetProps, Panel, type PanelBadgeProps, type PanelBodyProps, type PanelHeaderProps, type PanelIconProps, type PanelRootProps, type PanelTitleProps, type PersistConfig, type Persistence, type ResponsiveModel, type StorageAdapter, type TabComponent, type TabContextValue, Tabset, type TabsetCloseButtonProps, type TabsetContentProps, type TabsetGripProps, type TabsetMaximizeButtonProps, type TabsetRenameInputProps, type TabsetRootProps, type TabsetState, type TabsetTabProps, type TabsetTabStripProps, type TabsetTablistProps, type TabsetToolbarProps, type TabsetTriggerProps, type UseDashfooStoreOptions, type UseResponsiveModelOptions, activeBreakpoint, localStorageAdapter, matchBreakpoint, memoryStorageAdapter, useDashfooStore, useDragSubject, useDropIntent, useExternalTabSource, useLayout, usePersistence, useResponsiveModel, useTab, useTabset };
419
+ export { type Breakpoint, DashfooDragProvider, type DashfooHandle, DashfooLayout, type DashfooLayoutProps, type DashfooStore, type ExternalTabSourceOptions, Layout, type DragProviderProps as LayoutDragLayerProps, type FloatLayerProps as LayoutFloatLayerProps, type LayoutRootProps, type RowViewProps as LayoutRowsProps, type LayoutState, type TabsetViewProps as LayoutTabsetProps, Panel, type PanelBadgeProps, type PanelBodyProps, type PanelHeaderProps, type PanelIconProps, type PanelRootProps, type PanelTitleProps, type PersistConfig, type Persistence, type ResponsiveModel, type StorageAdapter, type TabComponent, type TabContextValue, Tabset, type TabsetCloseButtonProps, type TabsetContentProps, type TabsetFloatButtonProps, type TabsetGripProps, type TabsetMaximizeButtonProps, type TabsetRenameInputProps, type TabsetRootProps, type TabsetState, type TabsetTabProps, type TabsetTabStripProps, type TabsetTablistProps, type TabsetToolbarProps, type TabsetTriggerProps, type UseDashfooStoreOptions, type UseResponsiveModelOptions, activeBreakpoint, localStorageAdapter, matchBreakpoint, memoryStorageAdapter, useContainerWidth, useDashfooStore, useDragSubject, useDropIntent, useExternalTabSource, useLayout, usePersistence, useResponsiveModel, useTab, useTabset };
381
420
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/hooks/persistence.ts","../src/components/dashfoo-layout.tsx","../src/components/drag-root.tsx","../src/hooks/drag-hooks.tsx","../src/components/drag-adapter.tsx","../src/components/layout-root.tsx","../src/components/row-view.tsx","../src/components/tabset/tabset-view.tsx","../src/components/layout.tsx","../src/components/panel.tsx","../src/components/tabset/tabset-tab-controls.tsx","../src/components/tabset/tabset-content.tsx","../src/components/tabset/tabset-toolbar.tsx","../src/components/tabset/tabset-root.tsx","../src/components/tabset/tabset-tab.tsx","../src/components/tabset/tabset-tablist.tsx","../src/components/tabset/tabset.ts","../src/components/tab-overflow.tsx","../src/components/tabset/tabset-store.ts","../src/hooks/layout-store.ts","../src/hooks/responsive.ts","../src/hooks/store.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/hooks/persistence.ts","../src/components/dashfoo-layout.tsx","../src/components/drag-root.tsx","../src/hooks/drag-hooks.tsx","../src/components/drag-adapter.tsx","../src/components/float-layer.tsx","../src/components/layout-root.tsx","../src/components/row-view.tsx","../src/components/tabset/tabset-view.tsx","../src/components/layout.tsx","../src/components/panel.tsx","../src/components/tabset/tabset-tab-controls.tsx","../src/components/tabset/tabset-content.tsx","../src/components/tabset/tabset-toolbar.tsx","../src/components/tabset/tabset-root.tsx","../src/components/tabset/tabset-tab.tsx","../src/components/tabset/tabset-tablist.tsx","../src/components/tabset/tabset.ts","../src/components/tab-overflow.tsx","../src/components/tabset/tabset-store.ts","../src/hooks/layout-store.ts","../src/hooks/responsive.ts","../src/hooks/store.ts"],"mappings":"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"}