@gabvdl/ui 0.0.14
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 +95 -0
- package/dist/components/button/button.d.ts +39 -0
- package/dist/components/button/button.d.ts.map +1 -0
- package/dist/components/button/button.js +72 -0
- package/dist/components/button/button.js.map +1 -0
- package/dist/components/button/index.d.ts +5 -0
- package/dist/components/button/index.d.ts.map +1 -0
- package/dist/components/button/tooltip.d.ts +31 -0
- package/dist/components/button/tooltip.d.ts.map +1 -0
- package/dist/components/button/tooltip.js +83 -0
- package/dist/components/button/tooltip.js.map +1 -0
- package/dist/components/changelog/changelog.d.ts +52 -0
- package/dist/components/changelog/changelog.d.ts.map +1 -0
- package/dist/components/changelog/changelog.js +164 -0
- package/dist/components/changelog/changelog.js.map +1 -0
- package/dist/components/changelog/index.d.ts +3 -0
- package/dist/components/changelog/index.d.ts.map +1 -0
- package/dist/components/copy-button/copy-button.d.ts +16 -0
- package/dist/components/copy-button/copy-button.d.ts.map +1 -0
- package/dist/components/copy-button/copy-button.js +40 -0
- package/dist/components/copy-button/copy-button.js.map +1 -0
- package/dist/components/copy-button/index.d.ts +3 -0
- package/dist/components/copy-button/index.d.ts.map +1 -0
- package/dist/components/drop-zone/drop-zone.d.ts +20 -0
- package/dist/components/drop-zone/drop-zone.d.ts.map +1 -0
- package/dist/components/drop-zone/drop-zone.js +54 -0
- package/dist/components/drop-zone/drop-zone.js.map +1 -0
- package/dist/components/drop-zone/index.d.ts +5 -0
- package/dist/components/drop-zone/index.d.ts.map +1 -0
- package/dist/components/drop-zone/use-file-drop.d.ts +45 -0
- package/dist/components/drop-zone/use-file-drop.d.ts.map +1 -0
- package/dist/components/drop-zone/use-file-drop.js +97 -0
- package/dist/components/drop-zone/use-file-drop.js.map +1 -0
- package/dist/components/element-picker/element-picker-field.d.ts +30 -0
- package/dist/components/element-picker/element-picker-field.d.ts.map +1 -0
- package/dist/components/element-picker/element-picker-field.js +273 -0
- package/dist/components/element-picker/element-picker-field.js.map +1 -0
- package/dist/components/element-picker/element-picker.d.ts +45 -0
- package/dist/components/element-picker/element-picker.d.ts.map +1 -0
- package/dist/components/element-picker/element-picker.js +179 -0
- package/dist/components/element-picker/element-picker.js.map +1 -0
- package/dist/components/element-picker/element-preview.d.ts +23 -0
- package/dist/components/element-picker/element-preview.d.ts.map +1 -0
- package/dist/components/element-picker/element-preview.js +72 -0
- package/dist/components/element-picker/element-preview.js.map +1 -0
- package/dist/components/element-picker/index.d.ts +12 -0
- package/dist/components/element-picker/index.d.ts.map +1 -0
- package/dist/components/element-picker/parse.d.ts +32 -0
- package/dist/components/element-picker/parse.d.ts.map +1 -0
- package/dist/components/element-picker/parse.js +230 -0
- package/dist/components/element-picker/parse.js.map +1 -0
- package/dist/components/element-picker/types.d.ts +72 -0
- package/dist/components/element-picker/types.d.ts.map +1 -0
- package/dist/components/element-picker/use-element-picker.d.ts +56 -0
- package/dist/components/element-picker/use-element-picker.d.ts.map +1 -0
- package/dist/components/element-picker/use-element-picker.js +201 -0
- package/dist/components/element-picker/use-element-picker.js.map +1 -0
- package/dist/components/empty-state/empty-state.d.ts +16 -0
- package/dist/components/empty-state/empty-state.d.ts.map +1 -0
- package/dist/components/empty-state/empty-state.js +41 -0
- package/dist/components/empty-state/empty-state.js.map +1 -0
- package/dist/components/empty-state/index.d.ts +3 -0
- package/dist/components/empty-state/index.d.ts.map +1 -0
- package/dist/components/floating-panel/dock-context.d.ts +66 -0
- package/dist/components/floating-panel/dock-context.d.ts.map +1 -0
- package/dist/components/floating-panel/dock-context.js +96 -0
- package/dist/components/floating-panel/dock-context.js.map +1 -0
- package/dist/components/floating-panel/dock.d.ts +26 -0
- package/dist/components/floating-panel/dock.d.ts.map +1 -0
- package/dist/components/floating-panel/dock.js +46 -0
- package/dist/components/floating-panel/dock.js.map +1 -0
- package/dist/components/floating-panel/floating-panel.d.ts +69 -0
- package/dist/components/floating-panel/floating-panel.d.ts.map +1 -0
- package/dist/components/floating-panel/floating-panel.js +285 -0
- package/dist/components/floating-panel/floating-panel.js.map +1 -0
- package/dist/components/floating-panel/index.d.ts +7 -0
- package/dist/components/floating-panel/index.d.ts.map +1 -0
- package/dist/components/fuzzy-list/fuzzy-list.d.ts +96 -0
- package/dist/components/fuzzy-list/fuzzy-list.d.ts.map +1 -0
- package/dist/components/fuzzy-list/fuzzy-list.js +127 -0
- package/dist/components/fuzzy-list/fuzzy-list.js.map +1 -0
- package/dist/components/fuzzy-list/index.d.ts +4 -0
- package/dist/components/fuzzy-list/index.d.ts.map +1 -0
- package/dist/components/global-search/global-search.d.ts +78 -0
- package/dist/components/global-search/global-search.d.ts.map +1 -0
- package/dist/components/global-search/global-search.js +181 -0
- package/dist/components/global-search/global-search.js.map +1 -0
- package/dist/components/global-search/hotkey.d.ts +23 -0
- package/dist/components/global-search/hotkey.d.ts.map +1 -0
- package/dist/components/global-search/hotkey.js +41 -0
- package/dist/components/global-search/hotkey.js.map +1 -0
- package/dist/components/global-search/index.d.ts +5 -0
- package/dist/components/global-search/index.d.ts.map +1 -0
- package/dist/components/iframe-preview/iframe-preview.d.ts +64 -0
- package/dist/components/iframe-preview/iframe-preview.d.ts.map +1 -0
- package/dist/components/iframe-preview/iframe-preview.js +257 -0
- package/dist/components/iframe-preview/iframe-preview.js.map +1 -0
- package/dist/components/iframe-preview/index.d.ts +3 -0
- package/dist/components/iframe-preview/index.d.ts.map +1 -0
- package/dist/components/image-viewer/image-viewer.d.ts +30 -0
- package/dist/components/image-viewer/image-viewer.d.ts.map +1 -0
- package/dist/components/image-viewer/image-viewer.js +226 -0
- package/dist/components/image-viewer/image-viewer.js.map +1 -0
- package/dist/components/image-viewer/index.d.ts +4 -0
- package/dist/components/image-viewer/index.d.ts.map +1 -0
- package/dist/components/image-viewer/progressive-image.d.ts +20 -0
- package/dist/components/image-viewer/progressive-image.d.ts.map +1 -0
- package/dist/components/image-viewer/progressive-image.js +62 -0
- package/dist/components/image-viewer/progressive-image.js.map +1 -0
- package/dist/components/image-viewer/viewable-image.d.ts +17 -0
- package/dist/components/image-viewer/viewable-image.d.ts.map +1 -0
- package/dist/components/image-viewer/viewable-image.js +38 -0
- package/dist/components/image-viewer/viewable-image.js.map +1 -0
- package/dist/components/input/index.d.ts +3 -0
- package/dist/components/input/index.d.ts.map +1 -0
- package/dist/components/input/input.d.ts +15 -0
- package/dist/components/input/input.d.ts.map +1 -0
- package/dist/components/input/input.js +56 -0
- package/dist/components/input/input.js.map +1 -0
- package/dist/components/modal/index.d.ts +5 -0
- package/dist/components/modal/index.d.ts.map +1 -0
- package/dist/components/modal/modal-context.d.ts +37 -0
- package/dist/components/modal/modal-context.d.ts.map +1 -0
- package/dist/components/modal/modal-context.js +81 -0
- package/dist/components/modal/modal-context.js.map +1 -0
- package/dist/components/modal/modal.d.ts +28 -0
- package/dist/components/modal/modal.d.ts.map +1 -0
- package/dist/components/modal/modal.js +94 -0
- package/dist/components/modal/modal.js.map +1 -0
- package/dist/components/nav-2d/index.d.ts +3 -0
- package/dist/components/nav-2d/index.d.ts.map +1 -0
- package/dist/components/nav-2d/nav-2d.d.ts +59 -0
- package/dist/components/nav-2d/nav-2d.d.ts.map +1 -0
- package/dist/components/nav-2d/nav-2d.js +290 -0
- package/dist/components/nav-2d/nav-2d.js.map +1 -0
- package/dist/components/phone-preview/index.d.ts +3 -0
- package/dist/components/phone-preview/index.d.ts.map +1 -0
- package/dist/components/phone-preview/phone-preview.d.ts +45 -0
- package/dist/components/phone-preview/phone-preview.d.ts.map +1 -0
- package/dist/components/phone-preview/phone-preview.js +117 -0
- package/dist/components/phone-preview/phone-preview.js.map +1 -0
- package/dist/components/progressive-bash/index.d.ts +7 -0
- package/dist/components/progressive-bash/index.d.ts.map +1 -0
- package/dist/components/progressive-bash/parse.d.ts +88 -0
- package/dist/components/progressive-bash/parse.d.ts.map +1 -0
- package/dist/components/progressive-bash/parse.js +120 -0
- package/dist/components/progressive-bash/parse.js.map +1 -0
- package/dist/components/progressive-bash/playback.d.ts +50 -0
- package/dist/components/progressive-bash/playback.d.ts.map +1 -0
- package/dist/components/progressive-bash/playback.js +19 -0
- package/dist/components/progressive-bash/playback.js.map +1 -0
- package/dist/components/progressive-bash/progressive-bash.d.ts +97 -0
- package/dist/components/progressive-bash/progressive-bash.d.ts.map +1 -0
- package/dist/components/progressive-bash/progressive-bash.js +377 -0
- package/dist/components/progressive-bash/progressive-bash.js.map +1 -0
- package/dist/components/progressive-list/index.d.ts +3 -0
- package/dist/components/progressive-list/index.d.ts.map +1 -0
- package/dist/components/progressive-list/progressive-list.d.ts +55 -0
- package/dist/components/progressive-list/progressive-list.d.ts.map +1 -0
- package/dist/components/progressive-list/progressive-list.js +83 -0
- package/dist/components/progressive-list/progressive-list.js.map +1 -0
- package/dist/components/progressive-table/index.d.ts +3 -0
- package/dist/components/progressive-table/index.d.ts.map +1 -0
- package/dist/components/progressive-table/progressive-table.d.ts +58 -0
- package/dist/components/progressive-table/progressive-table.d.ts.map +1 -0
- package/dist/components/progressive-table/progressive-table.js +86 -0
- package/dist/components/progressive-table/progressive-table.js.map +1 -0
- package/dist/components/progressive-text/index.d.ts +3 -0
- package/dist/components/progressive-text/index.d.ts.map +1 -0
- package/dist/components/progressive-text/progressive-text.d.ts +54 -0
- package/dist/components/progressive-text/progressive-text.d.ts.map +1 -0
- package/dist/components/progressive-text/progressive-text.js +97 -0
- package/dist/components/progressive-text/progressive-text.js.map +1 -0
- package/dist/components/progressive-timeline/index.d.ts +3 -0
- package/dist/components/progressive-timeline/index.d.ts.map +1 -0
- package/dist/components/progressive-timeline/progressive-timeline.d.ts +46 -0
- package/dist/components/progressive-timeline/progressive-timeline.d.ts.map +1 -0
- package/dist/components/progressive-timeline/progressive-timeline.js +62 -0
- package/dist/components/progressive-timeline/progressive-timeline.js.map +1 -0
- package/dist/components/relative-time/index.d.ts +3 -0
- package/dist/components/relative-time/index.d.ts.map +1 -0
- package/dist/components/relative-time/relative-time.d.ts +14 -0
- package/dist/components/relative-time/relative-time.d.ts.map +1 -0
- package/dist/components/relative-time/relative-time.js +15 -0
- package/dist/components/relative-time/relative-time.js.map +1 -0
- package/dist/components/resizable-layout/index.d.ts +3 -0
- package/dist/components/resizable-layout/index.d.ts.map +1 -0
- package/dist/components/resizable-layout/resizable-layout.d.ts +113 -0
- package/dist/components/resizable-layout/resizable-layout.d.ts.map +1 -0
- package/dist/components/resizable-layout/resizable-layout.js +398 -0
- package/dist/components/resizable-layout/resizable-layout.js.map +1 -0
- package/dist/components/rich-input/compose.d.ts +13 -0
- package/dist/components/rich-input/compose.d.ts.map +1 -0
- package/dist/components/rich-input/compose.js +28 -0
- package/dist/components/rich-input/compose.js.map +1 -0
- package/dist/components/rich-input/index.d.ts +5 -0
- package/dist/components/rich-input/index.d.ts.map +1 -0
- package/dist/components/rich-input/parts.d.ts +53 -0
- package/dist/components/rich-input/parts.d.ts.map +1 -0
- package/dist/components/rich-input/parts.js +285 -0
- package/dist/components/rich-input/parts.js.map +1 -0
- package/dist/components/rich-input/rich-input.d.ts +64 -0
- package/dist/components/rich-input/rich-input.d.ts.map +1 -0
- package/dist/components/rich-input/rich-input.js +351 -0
- package/dist/components/rich-input/rich-input.js.map +1 -0
- package/dist/components/rich-input/types.d.ts +92 -0
- package/dist/components/rich-input/types.d.ts.map +1 -0
- package/dist/components/rich-input/use-draft.d.ts +9 -0
- package/dist/components/rich-input/use-draft.d.ts.map +1 -0
- package/dist/components/rich-input/use-draft.js +47 -0
- package/dist/components/rich-input/use-draft.js.map +1 -0
- package/dist/components/rich-input/use-file-upload.d.ts +18 -0
- package/dist/components/rich-input/use-file-upload.d.ts.map +1 -0
- package/dist/components/rich-input/use-file-upload.js +88 -0
- package/dist/components/rich-input/use-file-upload.js.map +1 -0
- package/dist/components/rich-input/use-guidelines.d.ts +16 -0
- package/dist/components/rich-input/use-guidelines.d.ts.map +1 -0
- package/dist/components/rich-input/use-guidelines.js +85 -0
- package/dist/components/rich-input/use-guidelines.js.map +1 -0
- package/dist/components/rich-input/use-input-history.d.ts +22 -0
- package/dist/components/rich-input/use-input-history.d.ts.map +1 -0
- package/dist/components/rich-input/use-input-history.js +61 -0
- package/dist/components/rich-input/use-input-history.js.map +1 -0
- package/dist/components/rich-input/use-mention.d.ts +24 -0
- package/dist/components/rich-input/use-mention.d.ts.map +1 -0
- package/dist/components/rich-input/use-mention.js +54 -0
- package/dist/components/rich-input/use-mention.js.map +1 -0
- package/dist/components/search-input/index.d.ts +3 -0
- package/dist/components/search-input/index.d.ts.map +1 -0
- package/dist/components/search-input/search-input.d.ts +14 -0
- package/dist/components/search-input/search-input.d.ts.map +1 -0
- package/dist/components/search-input/search-input.js +63 -0
- package/dist/components/search-input/search-input.js.map +1 -0
- package/dist/components/skeleton/index.d.ts +3 -0
- package/dist/components/skeleton/index.d.ts.map +1 -0
- package/dist/components/skeleton/skeleton.d.ts +19 -0
- package/dist/components/skeleton/skeleton.d.ts.map +1 -0
- package/dist/components/skeleton/skeleton.js +29 -0
- package/dist/components/skeleton/skeleton.js.map +1 -0
- package/dist/components/spinner/index.d.ts +3 -0
- package/dist/components/spinner/index.d.ts.map +1 -0
- package/dist/components/spinner/spinner.d.ts +11 -0
- package/dist/components/spinner/spinner.d.ts.map +1 -0
- package/dist/components/spinner/spinner.js +32 -0
- package/dist/components/spinner/spinner.js.map +1 -0
- package/dist/components/status-badge/index.d.ts +3 -0
- package/dist/components/status-badge/index.d.ts.map +1 -0
- package/dist/components/status-badge/status-badge.d.ts +31 -0
- package/dist/components/status-badge/status-badge.d.ts.map +1 -0
- package/dist/components/status-badge/status-badge.js +53 -0
- package/dist/components/status-badge/status-badge.js.map +1 -0
- package/dist/components/theme/index.d.ts +5 -0
- package/dist/components/theme/index.d.ts.map +1 -0
- package/dist/components/theme/theme-toggle.d.ts +11 -0
- package/dist/components/theme/theme-toggle.d.ts.map +1 -0
- package/dist/components/theme/theme-toggle.js +57 -0
- package/dist/components/theme/theme-toggle.js.map +1 -0
- package/dist/components/theme/theme.d.ts +29 -0
- package/dist/components/theme/theme.d.ts.map +1 -0
- package/dist/components/theme/theme.js +70 -0
- package/dist/components/theme/theme.js.map +1 -0
- package/dist/components/toast/index.d.ts +3 -0
- package/dist/components/toast/index.d.ts.map +1 -0
- package/dist/components/toast/toast.d.ts +64 -0
- package/dist/components/toast/toast.d.ts.map +1 -0
- package/dist/components/toast/toast.js +155 -0
- package/dist/components/toast/toast.js.map +1 -0
- package/dist/components/virtual-list/index.d.ts +3 -0
- package/dist/components/virtual-list/index.d.ts.map +1 -0
- package/dist/components/virtual-list/virtual-list.d.ts +71 -0
- package/dist/components/virtual-list/virtual-list.d.ts.map +1 -0
- package/dist/components/virtual-list/virtual-list.js +65 -0
- package/dist/components/virtual-list/virtual-list.js.map +1 -0
- package/dist/hooks/index.d.ts +12 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/use-copy-to-clipboard.d.ts +26 -0
- package/dist/hooks/use-copy-to-clipboard.d.ts.map +1 -0
- package/dist/hooks/use-copy-to-clipboard.js +36 -0
- package/dist/hooks/use-copy-to-clipboard.js.map +1 -0
- package/dist/hooks/use-debounced-value.d.ts +23 -0
- package/dist/hooks/use-debounced-value.d.ts.map +1 -0
- package/dist/hooks/use-debounced-value.js +19 -0
- package/dist/hooks/use-debounced-value.js.map +1 -0
- package/dist/hooks/use-intersection.d.ts +25 -0
- package/dist/hooks/use-intersection.d.ts.map +1 -0
- package/dist/hooks/use-intersection.js +38 -0
- package/dist/hooks/use-intersection.js.map +1 -0
- package/dist/hooks/use-local-storage.d.ts +12 -0
- package/dist/hooks/use-local-storage.d.ts.map +1 -0
- package/dist/hooks/use-local-storage.js +43 -0
- package/dist/hooks/use-local-storage.js.map +1 -0
- package/dist/hooks/use-long-press.d.ts +37 -0
- package/dist/hooks/use-long-press.d.ts.map +1 -0
- package/dist/hooks/use-long-press.js +39 -0
- package/dist/hooks/use-long-press.js.map +1 -0
- package/dist/hooks/use-media-query.d.ts +17 -0
- package/dist/hooks/use-media-query.d.ts.map +1 -0
- package/dist/hooks/use-media-query.js +37 -0
- package/dist/hooks/use-media-query.js.map +1 -0
- package/dist/hooks/use-overlay.d.ts +20 -0
- package/dist/hooks/use-overlay.d.ts.map +1 -0
- package/dist/hooks/use-overlay.js +42 -0
- package/dist/hooks/use-overlay.js.map +1 -0
- package/dist/image-viewer.css +152 -0
- package/dist/index.d.ts +67 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +161 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/format.d.ts +19 -0
- package/dist/lib/format.d.ts.map +1 -0
- package/dist/lib/format.js +62 -0
- package/dist/lib/format.js.map +1 -0
- package/dist/lib/highlight.d.ts +15 -0
- package/dist/lib/highlight.d.ts.map +1 -0
- package/dist/lib/highlight.js +39 -0
- package/dist/lib/highlight.js.map +1 -0
- package/dist/lib/search.d.ts +40 -0
- package/dist/lib/search.d.ts.map +1 -0
- package/dist/lib/search.js +91 -0
- package/dist/lib/search.js.map +1 -0
- package/dist/lib/utils.d.ts +4 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/lib/utils.js +9 -0
- package/dist/lib/utils.js.map +1 -0
- package/dist/overlay.css +78 -0
- package/dist/styles.css +6 -0
- package/dist/theme.css +81 -0
- package/dist/tooltip.css +53 -0
- package/dist/virtual-list.css +29 -0
- package/package.json +77 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { ReactNode, Ref } from 'react';
|
|
2
|
+
import { FloatingGeom, PanelPlacement } from './dock-context';
|
|
3
|
+
/** Imperative handle exposed via {@link FloatingPanelProps.apiRef}. */
|
|
4
|
+
export interface FloatingPanelHandle {
|
|
5
|
+
/** Pop the panel out to a free-floating window. */
|
|
6
|
+
float: () => void;
|
|
7
|
+
/** Snap the panel back into a dock (defaults to its home `dockId`). */
|
|
8
|
+
dock: (dockId?: string) => void;
|
|
9
|
+
/** Float if docked, dock if floating. */
|
|
10
|
+
toggle: () => void;
|
|
11
|
+
/** Move/resize the floating box. */
|
|
12
|
+
setGeom: (geom: Partial<FloatingGeom>) => void;
|
|
13
|
+
isDocked: () => boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface FloatingPanelProps {
|
|
16
|
+
/** Stable id — required so a {@link DockProvider} can track this panel. */
|
|
17
|
+
id: string;
|
|
18
|
+
/** Title shown in the header and the dock tab. */
|
|
19
|
+
title?: ReactNode;
|
|
20
|
+
/** Small icon shown before the title (header + tab). */
|
|
21
|
+
icon?: ReactNode;
|
|
22
|
+
children: ReactNode;
|
|
23
|
+
/**
|
|
24
|
+
* Home dock id. Enables docking (drag the header onto any {@link Dock} to
|
|
25
|
+
* snap in; drag a tab out to float). Requires a {@link DockProvider} ancestor.
|
|
26
|
+
*/
|
|
27
|
+
dockId?: string;
|
|
28
|
+
/** Start docked in `dockId`. @default `true` when `dockId` is set, else `false` */
|
|
29
|
+
defaultDocked?: boolean;
|
|
30
|
+
/** Initial floating box; unset fields fall back to a bottom-right default. */
|
|
31
|
+
defaultGeom?: Partial<FloatingGeom>;
|
|
32
|
+
minWidth?: number;
|
|
33
|
+
minHeight?: number;
|
|
34
|
+
/** Allow edge/corner resizing while floating. @default true */
|
|
35
|
+
resizable?: boolean;
|
|
36
|
+
/** Allow header dragging. @default true */
|
|
37
|
+
draggable?: boolean;
|
|
38
|
+
/** Show a close button in the header. */
|
|
39
|
+
onClose?: () => void;
|
|
40
|
+
/** Extra header controls, rendered before the dock/close buttons. */
|
|
41
|
+
actions?: ReactNode;
|
|
42
|
+
/** Fired whenever the placement changes (float ⇄ dock, move, resize). */
|
|
43
|
+
onPlacementChange?: (placement: PanelPlacement) => void;
|
|
44
|
+
className?: string;
|
|
45
|
+
headerClassName?: string;
|
|
46
|
+
bodyClassName?: string;
|
|
47
|
+
apiRef?: Ref<FloatingPanelHandle>;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* A draggable, resizable floating window that can also **dock** into a
|
|
51
|
+
* {@link Dock}. Drag the header onto a dock's drop area to snap in; drag its tab
|
|
52
|
+
* back out to float again. Multiple panels sharing one dock become tabs.
|
|
53
|
+
*
|
|
54
|
+
* Works standalone (no {@link DockProvider}) as a plain floating window, or —
|
|
55
|
+
* inside a provider, with a `dockId` — as a dockable panel. The children keep
|
|
56
|
+
* their React state across float ⇄ dock (the DOM node moves via a portal, the
|
|
57
|
+
* component instances do not remount).
|
|
58
|
+
*
|
|
59
|
+
* ```tsx
|
|
60
|
+
* <DockProvider>
|
|
61
|
+
* <FloatingPanel id="terminal" dockId="bottom" title="Terminal">
|
|
62
|
+
* <TerminalBody />
|
|
63
|
+
* </FloatingPanel>
|
|
64
|
+
* <Dock id="bottom" className="h-64" />
|
|
65
|
+
* </DockProvider>
|
|
66
|
+
* ```
|
|
67
|
+
*/
|
|
68
|
+
export declare function FloatingPanel({ id, title, icon, children, dockId, defaultDocked, defaultGeom, minWidth, minHeight, resizable, draggable, onClose, actions, onPlacementChange, className, headerClassName, bodyClassName, apiRef, }: FloatingPanelProps): import("react").JSX.Element | null;
|
|
69
|
+
//# sourceMappingURL=floating-panel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"floating-panel.d.ts","sourceRoot":"","sources":["../../../src/components/floating-panel/floating-panel.tsx"],"names":[],"mappings":"AAAA,OAAO,EAQL,KAAK,SAAS,EACd,KAAK,GAAG,EACT,MAAM,OAAO,CAAC;AAIf,OAAO,EAAkB,KAAK,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAMxF,uEAAuE;AACvE,MAAM,WAAW,mBAAmB;IAClC,mDAAmD;IACnD,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,uEAAuE;IACvE,IAAI,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC,yCAAyC;IACzC,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,oCAAoC;IACpC,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC;IAC/C,QAAQ,EAAE,MAAM,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,2EAA2E;IAC3E,EAAE,EAAE,MAAM,CAAC;IACX,kDAAkD;IAClD,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,wDAAwD;IACxD,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,QAAQ,EAAE,SAAS,CAAC;IACpB;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mFAAmF;IACnF,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IACpC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,yCAAyC;IACzC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,qEAAqE;IACrE,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,yEAAyE;IACzE,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,cAAc,KAAK,IAAI,CAAC;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,GAAG,CAAC,mBAAmB,CAAC,CAAC;CACnC;AAoCD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,aAAa,CAAC,EAC5B,EAAE,EACF,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,MAAM,EACN,aAAa,EACb,WAAW,EACX,QAAgB,EAChB,SAAiB,EACjB,SAAgB,EAChB,SAAgB,EAChB,OAAO,EACP,OAAO,EACP,iBAAiB,EACjB,SAAS,EACT,eAAe,EACf,aAAa,EACb,MAAM,GACP,EAAE,kBAAkB,sCA6TpB"}
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
import { jsxs as m, Fragment as Q, jsx as i } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo as re, useState as ie, useCallback as X, useEffect as j, useRef as $, useImperativeHandle as ce } from "react";
|
|
3
|
+
import { createPortal as F } from "react-dom";
|
|
4
|
+
import { cn as k } from "../../lib/utils.js";
|
|
5
|
+
import { useDockContext as se } from "./dock-context.js";
|
|
6
|
+
const de = 280, le = 160, ue = 5;
|
|
7
|
+
function L(o, w, x) {
|
|
8
|
+
if (typeof window > "u") return o;
|
|
9
|
+
const p = window.innerWidth, l = window.innerHeight, v = Math.max(w, Math.min(o.width, p)), g = Math.max(x, Math.min(o.height, l)), c = Math.max(0, Math.min(o.x, p - v)), s = Math.max(0, Math.min(o.y, l - g));
|
|
10
|
+
return { x: c, y: s, width: v, height: g };
|
|
11
|
+
}
|
|
12
|
+
function H(o, w, x) {
|
|
13
|
+
const p = typeof window < "u" ? window.innerWidth : 1280, l = typeof window < "u" ? window.innerHeight : 800, v = (o == null ? void 0 : o.width) ?? Math.min(560, p - 48), g = (o == null ? void 0 : o.height) ?? Math.min(380, l - 48), c = (o == null ? void 0 : o.x) ?? p - v - 24, s = (o == null ? void 0 : o.y) ?? l - g - 24;
|
|
14
|
+
return L({ x: c, y: s, width: v, height: g }, w, x);
|
|
15
|
+
}
|
|
16
|
+
const ae = [
|
|
17
|
+
{ edge: "n", cursor: "ns-resize", style: { top: -3, left: 8, right: 8, height: 7 } },
|
|
18
|
+
{ edge: "s", cursor: "ns-resize", style: { bottom: -3, left: 8, right: 8, height: 7 } },
|
|
19
|
+
{ edge: "e", cursor: "ew-resize", style: { right: -3, top: 8, bottom: 8, width: 7 } },
|
|
20
|
+
{ edge: "w", cursor: "ew-resize", style: { left: -3, top: 8, bottom: 8, width: 7 } },
|
|
21
|
+
{ edge: "ne", cursor: "nesw-resize", style: { top: -4, right: -4, width: 12, height: 12 } },
|
|
22
|
+
{ edge: "nw", cursor: "nwse-resize", style: { top: -4, left: -4, width: 12, height: 12 } },
|
|
23
|
+
{ edge: "se", cursor: "nwse-resize", style: { bottom: -4, right: -4, width: 14, height: 14 } },
|
|
24
|
+
{ edge: "sw", cursor: "nesw-resize", style: { bottom: -4, left: -4, width: 12, height: 12 } }
|
|
25
|
+
];
|
|
26
|
+
function be({
|
|
27
|
+
id: o,
|
|
28
|
+
title: w,
|
|
29
|
+
icon: x,
|
|
30
|
+
children: p,
|
|
31
|
+
dockId: l,
|
|
32
|
+
defaultDocked: v,
|
|
33
|
+
defaultGeom: g,
|
|
34
|
+
minWidth: c = de,
|
|
35
|
+
minHeight: s = le,
|
|
36
|
+
resizable: C = !0,
|
|
37
|
+
draggable: O = !0,
|
|
38
|
+
onClose: U,
|
|
39
|
+
actions: W,
|
|
40
|
+
onPlacementChange: Y,
|
|
41
|
+
className: V,
|
|
42
|
+
headerClassName: Z,
|
|
43
|
+
bodyClassName: q,
|
|
44
|
+
apiRef: ee
|
|
45
|
+
}) {
|
|
46
|
+
const d = se(), h = !!d && !!l, J = re(() => h && (v ?? !!l) && l ? { mode: "docked", dockId: l } : { mode: "floating", ...H(g, c, s) }, []), [te, oe] = ie(J), t = (h ? d.getPlacement(o) : void 0) ?? te, u = X(
|
|
47
|
+
(e) => {
|
|
48
|
+
h ? d.setPlacement(o, e) : oe(e), Y == null || Y(e);
|
|
49
|
+
},
|
|
50
|
+
[h, d, o, Y]
|
|
51
|
+
);
|
|
52
|
+
j(() => {
|
|
53
|
+
if (d)
|
|
54
|
+
return d.registerPanel(o, J), () => d.unregisterPanel(o);
|
|
55
|
+
}, []);
|
|
56
|
+
const G = $(
|
|
57
|
+
t.mode === "floating" ? t : H(g, c, s)
|
|
58
|
+
);
|
|
59
|
+
t.mode === "floating" && (G.current = t);
|
|
60
|
+
const A = X(
|
|
61
|
+
(e) => {
|
|
62
|
+
const n = { ...G.current, ...e };
|
|
63
|
+
u({ mode: "floating", ...L(n, c, s) });
|
|
64
|
+
},
|
|
65
|
+
[u, c, s]
|
|
66
|
+
), D = X(
|
|
67
|
+
(e) => {
|
|
68
|
+
const n = e ?? l;
|
|
69
|
+
n && u({ mode: "docked", dockId: n });
|
|
70
|
+
},
|
|
71
|
+
[u, l]
|
|
72
|
+
);
|
|
73
|
+
ce(
|
|
74
|
+
ee,
|
|
75
|
+
() => ({
|
|
76
|
+
float: () => A(),
|
|
77
|
+
dock: (e) => D(e),
|
|
78
|
+
toggle: () => t.mode === "docked" ? A() : D(),
|
|
79
|
+
setGeom: (e) => A(e),
|
|
80
|
+
isDocked: () => t.mode === "docked"
|
|
81
|
+
}),
|
|
82
|
+
[A, D, t.mode]
|
|
83
|
+
), j(() => {
|
|
84
|
+
if (t.mode !== "floating") return;
|
|
85
|
+
const e = () => {
|
|
86
|
+
const n = L(t, c, s);
|
|
87
|
+
(n.x !== t.x || n.y !== t.y || n.width !== t.width || n.height !== t.height) && u({ mode: "floating", ...n });
|
|
88
|
+
};
|
|
89
|
+
return window.addEventListener("resize", e), () => window.removeEventListener("resize", e);
|
|
90
|
+
}, [t, u, c, s]);
|
|
91
|
+
const E = $(null);
|
|
92
|
+
j(() => () => {
|
|
93
|
+
var e;
|
|
94
|
+
return (e = E.current) == null ? void 0 : e.cleanup();
|
|
95
|
+
}, []);
|
|
96
|
+
const R = X(
|
|
97
|
+
(e, n) => {
|
|
98
|
+
if (!O) return;
|
|
99
|
+
e.preventDefault();
|
|
100
|
+
const N = e.clientX, b = e.clientY;
|
|
101
|
+
let r, y = t.mode === "floating";
|
|
102
|
+
t.mode === "floating" ? r = t : r = L(
|
|
103
|
+
{ ...G.current, x: N - 60, y: b - 14 },
|
|
104
|
+
c,
|
|
105
|
+
s
|
|
106
|
+
), document.body.style.userSelect = "none";
|
|
107
|
+
const P = (a) => {
|
|
108
|
+
const f = a.clientX - N, M = a.clientY - b;
|
|
109
|
+
if (!y) {
|
|
110
|
+
if (Math.hypot(f, M) < ue) return;
|
|
111
|
+
y = !0, u({ mode: "floating", ...r });
|
|
112
|
+
}
|
|
113
|
+
const S = L({ ...r, x: r.x + f, y: r.y + M }, c, s);
|
|
114
|
+
u({ mode: "floating", ...S }), h && d.setHoverDock(d.findDockAt(a.clientX, a.clientY));
|
|
115
|
+
}, z = (a) => {
|
|
116
|
+
if (I(), h) {
|
|
117
|
+
const f = d.findDockAt(a.clientX, a.clientY);
|
|
118
|
+
if (d.setHoverDock(null), y && f) {
|
|
119
|
+
D(f);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
!y && (n != null && n.fromDockTab) && t.mode === "docked" && d.setActive(t.dockId, o);
|
|
123
|
+
}
|
|
124
|
+
}, I = () => {
|
|
125
|
+
window.removeEventListener("pointermove", P), window.removeEventListener("pointerup", z), document.body.style.userSelect = "", E.current = null;
|
|
126
|
+
};
|
|
127
|
+
E.current = { cleanup: I }, window.addEventListener("pointermove", P), window.addEventListener("pointerup", z);
|
|
128
|
+
},
|
|
129
|
+
[O, t, u, h, d, D, o, c, s]
|
|
130
|
+
), ne = X(
|
|
131
|
+
(e, n) => {
|
|
132
|
+
if (!C || t.mode !== "floating") return;
|
|
133
|
+
e.preventDefault(), e.stopPropagation();
|
|
134
|
+
const N = e.clientX, b = e.clientY, r = t;
|
|
135
|
+
document.body.style.userSelect = "none";
|
|
136
|
+
const y = (I) => {
|
|
137
|
+
const a = I.clientX - N, f = I.clientY - b;
|
|
138
|
+
let { x: M, y: S, width: T, height: B } = r;
|
|
139
|
+
n.includes("e") && (T = r.width + a), n.includes("s") && (B = r.height + f), n.includes("w") && (T = r.width - a, M = r.x + a, T < c && (M = r.x + (r.width - c))), n.includes("n") && (B = r.height - f, S = r.y + f, B < s && (S = r.y + (r.height - s))), u({ mode: "floating", ...L({ x: M, y: S, width: T, height: B }, c, s) });
|
|
140
|
+
}, P = () => z(), z = () => {
|
|
141
|
+
window.removeEventListener("pointermove", y), window.removeEventListener("pointerup", P), document.body.style.userSelect = "", E.current = null;
|
|
142
|
+
};
|
|
143
|
+
E.current = { cleanup: z }, window.addEventListener("pointermove", y), window.addEventListener("pointerup", P);
|
|
144
|
+
},
|
|
145
|
+
[C, t, u, c, s]
|
|
146
|
+
), _ = /* @__PURE__ */ m(Q, { children: [
|
|
147
|
+
W,
|
|
148
|
+
h && (t.mode === "docked" ? /* @__PURE__ */ i(
|
|
149
|
+
"button",
|
|
150
|
+
{
|
|
151
|
+
type: "button",
|
|
152
|
+
"aria-label": "Pop out",
|
|
153
|
+
onPointerDown: (e) => R(e),
|
|
154
|
+
className: "rounded p-1 text-muted-foreground hover:bg-muted hover:text-foreground",
|
|
155
|
+
children: /* @__PURE__ */ i(me, {})
|
|
156
|
+
}
|
|
157
|
+
) : /* @__PURE__ */ i(
|
|
158
|
+
"button",
|
|
159
|
+
{
|
|
160
|
+
type: "button",
|
|
161
|
+
"aria-label": "Dock",
|
|
162
|
+
onClick: () => D(),
|
|
163
|
+
className: "rounded p-1 text-muted-foreground hover:bg-muted hover:text-foreground",
|
|
164
|
+
children: /* @__PURE__ */ i(fe, {})
|
|
165
|
+
}
|
|
166
|
+
)),
|
|
167
|
+
U && /* @__PURE__ */ i(
|
|
168
|
+
"button",
|
|
169
|
+
{
|
|
170
|
+
type: "button",
|
|
171
|
+
"aria-label": "Close",
|
|
172
|
+
onClick: U,
|
|
173
|
+
className: "rounded p-1 text-muted-foreground hover:bg-muted hover:text-foreground",
|
|
174
|
+
children: /* @__PURE__ */ i(he, {})
|
|
175
|
+
}
|
|
176
|
+
)
|
|
177
|
+
] });
|
|
178
|
+
if (t.mode === "docked" && h) {
|
|
179
|
+
const e = d.getDock(t.dockId), n = d.activeInDock(t.dockId) === o, b = d.panelsInDock(t.dockId).length > 1;
|
|
180
|
+
return /* @__PURE__ */ m(Q, { children: [
|
|
181
|
+
(e == null ? void 0 : e.tabBar) && F(
|
|
182
|
+
/* @__PURE__ */ m(
|
|
183
|
+
"button",
|
|
184
|
+
{
|
|
185
|
+
type: "button",
|
|
186
|
+
"data-active": n,
|
|
187
|
+
onPointerDown: (r) => R(r, { fromDockTab: !0 }),
|
|
188
|
+
className: k(
|
|
189
|
+
"flex items-center gap-1.5 border-b-2 px-3 py-1.5 text-xs font-medium transition-colors",
|
|
190
|
+
"touch-none select-none",
|
|
191
|
+
n ? "border-primary text-foreground" : "border-transparent text-muted-foreground hover:text-foreground",
|
|
192
|
+
!b && "hidden"
|
|
193
|
+
),
|
|
194
|
+
children: [
|
|
195
|
+
x,
|
|
196
|
+
/* @__PURE__ */ i("span", { className: "max-w-[16ch] truncate", children: w })
|
|
197
|
+
]
|
|
198
|
+
}
|
|
199
|
+
),
|
|
200
|
+
e.tabBar
|
|
201
|
+
),
|
|
202
|
+
(e == null ? void 0 : e.content) && n && F(
|
|
203
|
+
/* @__PURE__ */ m("div", { className: k("flex h-full min-h-0 w-full flex-col", V), children: [
|
|
204
|
+
!b && (w || _) && /* @__PURE__ */ m(
|
|
205
|
+
"div",
|
|
206
|
+
{
|
|
207
|
+
onPointerDown: (r) => R(r),
|
|
208
|
+
className: k(
|
|
209
|
+
"flex shrink-0 cursor-move touch-none items-center gap-1.5 border-b border-border px-2 py-1",
|
|
210
|
+
Z
|
|
211
|
+
),
|
|
212
|
+
children: [
|
|
213
|
+
x,
|
|
214
|
+
/* @__PURE__ */ i("span", { className: "flex-1 truncate text-xs font-medium", children: w }),
|
|
215
|
+
_
|
|
216
|
+
]
|
|
217
|
+
}
|
|
218
|
+
),
|
|
219
|
+
/* @__PURE__ */ i("div", { className: k("min-h-0 flex-1 overflow-hidden", q), children: p })
|
|
220
|
+
] }),
|
|
221
|
+
e.content
|
|
222
|
+
)
|
|
223
|
+
] });
|
|
224
|
+
}
|
|
225
|
+
if (t.mode !== "floating") return null;
|
|
226
|
+
const K = /* @__PURE__ */ m(
|
|
227
|
+
"div",
|
|
228
|
+
{
|
|
229
|
+
role: "dialog",
|
|
230
|
+
className: k(
|
|
231
|
+
"fixed z-50 flex flex-col overflow-hidden rounded-lg border border-border bg-background shadow-2xl",
|
|
232
|
+
"ring-1 ring-black/5",
|
|
233
|
+
V
|
|
234
|
+
),
|
|
235
|
+
style: { left: t.x, top: t.y, width: t.width, height: t.height },
|
|
236
|
+
children: [
|
|
237
|
+
/* @__PURE__ */ m(
|
|
238
|
+
"div",
|
|
239
|
+
{
|
|
240
|
+
onPointerDown: (e) => R(e),
|
|
241
|
+
className: k(
|
|
242
|
+
"flex shrink-0 cursor-move touch-none items-center gap-1.5 border-b border-border bg-muted/40 px-2 py-1.5",
|
|
243
|
+
Z
|
|
244
|
+
),
|
|
245
|
+
children: [
|
|
246
|
+
x,
|
|
247
|
+
/* @__PURE__ */ i("span", { className: "flex-1 truncate text-xs font-medium", children: w }),
|
|
248
|
+
_
|
|
249
|
+
]
|
|
250
|
+
}
|
|
251
|
+
),
|
|
252
|
+
/* @__PURE__ */ i("div", { className: k("min-h-0 flex-1 overflow-hidden", q), children: p }),
|
|
253
|
+
C && ae.map((e) => /* @__PURE__ */ i(
|
|
254
|
+
"div",
|
|
255
|
+
{
|
|
256
|
+
onPointerDown: (n) => ne(n, e.edge),
|
|
257
|
+
className: "absolute touch-none",
|
|
258
|
+
style: { ...e.style, cursor: e.cursor }
|
|
259
|
+
},
|
|
260
|
+
e.edge
|
|
261
|
+
))
|
|
262
|
+
]
|
|
263
|
+
}
|
|
264
|
+
);
|
|
265
|
+
return typeof document < "u" ? F(K, document.body) : K;
|
|
266
|
+
}
|
|
267
|
+
function he() {
|
|
268
|
+
return /* @__PURE__ */ i("svg", { width: "12", height: "12", viewBox: "0 0 12 12", fill: "none", "aria-hidden": !0, children: /* @__PURE__ */ i("path", { d: "M3 3l6 6M9 3l-6 6", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round" }) });
|
|
269
|
+
}
|
|
270
|
+
function fe() {
|
|
271
|
+
return /* @__PURE__ */ m("svg", { width: "12", height: "12", viewBox: "0 0 12 12", fill: "none", "aria-hidden": !0, children: [
|
|
272
|
+
/* @__PURE__ */ i("rect", { x: "1", y: "1", width: "10", height: "10", rx: "1.5", stroke: "currentColor", strokeWidth: "1.2" }),
|
|
273
|
+
/* @__PURE__ */ i("path", { d: "M1 8h10", stroke: "currentColor", strokeWidth: "1.2" })
|
|
274
|
+
] });
|
|
275
|
+
}
|
|
276
|
+
function me() {
|
|
277
|
+
return /* @__PURE__ */ m("svg", { width: "12", height: "12", viewBox: "0 0 12 12", fill: "none", "aria-hidden": !0, children: [
|
|
278
|
+
/* @__PURE__ */ i("path", { d: "M4.5 2H2v8h8V7.5", stroke: "currentColor", strokeWidth: "1.2", strokeLinecap: "round" }),
|
|
279
|
+
/* @__PURE__ */ i("path", { d: "M7 2h3v3M10 2L5.5 6.5", stroke: "currentColor", strokeWidth: "1.2", strokeLinecap: "round", strokeLinejoin: "round" })
|
|
280
|
+
] });
|
|
281
|
+
}
|
|
282
|
+
export {
|
|
283
|
+
be as FloatingPanel
|
|
284
|
+
};
|
|
285
|
+
//# sourceMappingURL=floating-panel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"floating-panel.js","sources":["../../../src/components/floating-panel/floating-panel.tsx"],"sourcesContent":["import {\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type CSSProperties,\n type ReactNode,\n type Ref,\n} from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { cn } from '../../lib/utils';\nimport { useDockContext, type FloatingGeom, type PanelPlacement } from './dock-context';\n\nconst MIN_W = 280;\nconst MIN_H = 160;\nconst DRAG_THRESHOLD = 5; // px a docked tab must travel before it pops out\n\n/** Imperative handle exposed via {@link FloatingPanelProps.apiRef}. */\nexport interface FloatingPanelHandle {\n /** Pop the panel out to a free-floating window. */\n float: () => void;\n /** Snap the panel back into a dock (defaults to its home `dockId`). */\n dock: (dockId?: string) => void;\n /** Float if docked, dock if floating. */\n toggle: () => void;\n /** Move/resize the floating box. */\n setGeom: (geom: Partial<FloatingGeom>) => void;\n isDocked: () => boolean;\n}\n\nexport interface FloatingPanelProps {\n /** Stable id — required so a {@link DockProvider} can track this panel. */\n id: string;\n /** Title shown in the header and the dock tab. */\n title?: ReactNode;\n /** Small icon shown before the title (header + tab). */\n icon?: ReactNode;\n children: ReactNode;\n /**\n * Home dock id. Enables docking (drag the header onto any {@link Dock} to\n * snap in; drag a tab out to float). Requires a {@link DockProvider} ancestor.\n */\n dockId?: string;\n /** Start docked in `dockId`. @default `true` when `dockId` is set, else `false` */\n defaultDocked?: boolean;\n /** Initial floating box; unset fields fall back to a bottom-right default. */\n defaultGeom?: Partial<FloatingGeom>;\n minWidth?: number;\n minHeight?: number;\n /** Allow edge/corner resizing while floating. @default true */\n resizable?: boolean;\n /** Allow header dragging. @default true */\n draggable?: boolean;\n /** Show a close button in the header. */\n onClose?: () => void;\n /** Extra header controls, rendered before the dock/close buttons. */\n actions?: ReactNode;\n /** Fired whenever the placement changes (float ⇄ dock, move, resize). */\n onPlacementChange?: (placement: PanelPlacement) => void;\n className?: string;\n headerClassName?: string;\n bodyClassName?: string;\n apiRef?: Ref<FloatingPanelHandle>;\n}\n\nfunction clampGeom(g: FloatingGeom, minW: number, minH: number): FloatingGeom {\n if (typeof window === 'undefined') return g;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const width = Math.max(minW, Math.min(g.width, vw));\n const height = Math.max(minH, Math.min(g.height, vh));\n const x = Math.max(0, Math.min(g.x, vw - width));\n const y = Math.max(0, Math.min(g.y, vh - height));\n return { x, y, width, height };\n}\n\nfunction seedGeom(defaults: Partial<FloatingGeom> | undefined, minW: number, minH: number): FloatingGeom {\n const vw = typeof window !== 'undefined' ? window.innerWidth : 1280;\n const vh = typeof window !== 'undefined' ? window.innerHeight : 800;\n const width = defaults?.width ?? Math.min(560, vw - 48);\n const height = defaults?.height ?? Math.min(380, vh - 48);\n const x = defaults?.x ?? vw - width - 24;\n const y = defaults?.y ?? vh - height - 24;\n return clampGeom({ x, y, width, height }, minW, minH);\n}\n\ntype ResizeEdge = 'n' | 's' | 'e' | 'w' | 'ne' | 'nw' | 'se' | 'sw';\n\nconst RESIZE_HANDLES: { edge: ResizeEdge; cursor: string; style: CSSProperties }[] = [\n { edge: 'n', cursor: 'ns-resize', style: { top: -3, left: 8, right: 8, height: 7 } },\n { edge: 's', cursor: 'ns-resize', style: { bottom: -3, left: 8, right: 8, height: 7 } },\n { edge: 'e', cursor: 'ew-resize', style: { right: -3, top: 8, bottom: 8, width: 7 } },\n { edge: 'w', cursor: 'ew-resize', style: { left: -3, top: 8, bottom: 8, width: 7 } },\n { edge: 'ne', cursor: 'nesw-resize', style: { top: -4, right: -4, width: 12, height: 12 } },\n { edge: 'nw', cursor: 'nwse-resize', style: { top: -4, left: -4, width: 12, height: 12 } },\n { edge: 'se', cursor: 'nwse-resize', style: { bottom: -4, right: -4, width: 14, height: 14 } },\n { edge: 'sw', cursor: 'nesw-resize', style: { bottom: -4, left: -4, width: 12, height: 12 } },\n];\n\n/**\n * A draggable, resizable floating window that can also **dock** into a\n * {@link Dock}. Drag the header onto a dock's drop area to snap in; drag its tab\n * back out to float again. Multiple panels sharing one dock become tabs.\n *\n * Works standalone (no {@link DockProvider}) as a plain floating window, or —\n * inside a provider, with a `dockId` — as a dockable panel. The children keep\n * their React state across float ⇄ dock (the DOM node moves via a portal, the\n * component instances do not remount).\n *\n * ```tsx\n * <DockProvider>\n * <FloatingPanel id=\"terminal\" dockId=\"bottom\" title=\"Terminal\">\n * <TerminalBody />\n * </FloatingPanel>\n * <Dock id=\"bottom\" className=\"h-64\" />\n * </DockProvider>\n * ```\n */\nexport function FloatingPanel({\n id,\n title,\n icon,\n children,\n dockId,\n defaultDocked,\n defaultGeom,\n minWidth = MIN_W,\n minHeight = MIN_H,\n resizable = true,\n draggable = true,\n onClose,\n actions,\n onPlacementChange,\n className,\n headerClassName,\n bodyClassName,\n apiRef,\n}: FloatingPanelProps) {\n const dockCtx = useDockContext();\n const canDock = !!dockCtx && !!dockId;\n\n const initialPlacement = useMemo<PanelPlacement>(() => {\n const docked = defaultDocked ?? !!dockId;\n if (canDock && docked && dockId) return { mode: 'docked', dockId };\n return { mode: 'floating', ...seedGeom(defaultGeom, minWidth, minHeight) };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Placement: owned by the provider when docking is available, else local.\n const [localPlacement, setLocalPlacement] = useState<PanelPlacement>(initialPlacement);\n const placement = (canDock ? dockCtx!.getPlacement(id) : undefined) ?? localPlacement;\n\n const applyPlacement = useCallback(\n (next: PanelPlacement) => {\n if (canDock) dockCtx!.setPlacement(id, next);\n else setLocalPlacement(next);\n onPlacementChange?.(next);\n },\n [canDock, dockCtx, id, onPlacementChange],\n );\n\n // Register with the provider once so it appears in dock tab order.\n useEffect(() => {\n if (!dockCtx) return;\n dockCtx.registerPanel(id, initialPlacement);\n return () => dockCtx.unregisterPanel(id);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Last floating box, so docking then re-floating restores size/position.\n const lastGeom = useRef<FloatingGeom>(\n placement.mode === 'floating' ? placement : seedGeom(defaultGeom, minWidth, minHeight),\n );\n if (placement.mode === 'floating') lastGeom.current = placement;\n\n const floatTo = useCallback(\n (geom?: Partial<FloatingGeom>) => {\n const base = { ...lastGeom.current, ...geom };\n applyPlacement({ mode: 'floating', ...clampGeom(base, minWidth, minHeight) });\n },\n [applyPlacement, minWidth, minHeight],\n );\n\n const dockTo = useCallback(\n (target?: string) => {\n const t = target ?? dockId;\n if (!t) return;\n applyPlacement({ mode: 'docked', dockId: t });\n },\n [applyPlacement, dockId],\n );\n\n useImperativeHandle(\n apiRef,\n () => ({\n float: () => floatTo(),\n dock: (d?: string) => dockTo(d),\n toggle: () => (placement.mode === 'docked' ? floatTo() : dockTo()),\n setGeom: (g: Partial<FloatingGeom>) => floatTo(g),\n isDocked: () => placement.mode === 'docked',\n }),\n [floatTo, dockTo, placement.mode],\n );\n\n // Keep floating box on-screen when the viewport shrinks.\n useEffect(() => {\n if (placement.mode !== 'floating') return;\n const onResize = () => {\n const c = clampGeom(placement, minWidth, minHeight);\n if (c.x !== placement.x || c.y !== placement.y || c.width !== placement.width || c.height !== placement.height) {\n applyPlacement({ mode: 'floating', ...c });\n }\n };\n window.addEventListener('resize', onResize);\n return () => window.removeEventListener('resize', onResize);\n }, [placement, applyPlacement, minWidth, minHeight]);\n\n // ---- Drag / resize gesture ------------------------------------------------\n const gesture = useRef<{\n cleanup: () => void;\n } | null>(null);\n useEffect(() => () => gesture.current?.cleanup(), []);\n\n const beginMove = useCallback(\n (e: React.PointerEvent, opts?: { fromDockTab?: boolean }) => {\n if (!draggable) return;\n e.preventDefault();\n const startX = e.clientX;\n const startY = e.clientY;\n // Floating box at gesture start (float now if popping out of a tab).\n let origin: FloatingGeom;\n let floating = placement.mode === 'floating';\n if (placement.mode === 'floating') {\n origin = placement;\n } else {\n // Popping out: place the window under the cursor.\n origin = clampGeom(\n { ...lastGeom.current, x: startX - 60, y: startY - 14 },\n minWidth,\n minHeight,\n );\n }\n\n document.body.style.userSelect = 'none';\n\n const onMove = (ev: PointerEvent) => {\n const dx = ev.clientX - startX;\n const dy = ev.clientY - startY;\n if (!floating) {\n if (Math.hypot(dx, dy) < DRAG_THRESHOLD) return; // still a click on the tab\n floating = true;\n applyPlacement({ mode: 'floating', ...origin });\n }\n const next = clampGeom({ ...origin, x: origin.x + dx, y: origin.y + dy }, minWidth, minHeight);\n applyPlacement({ mode: 'floating', ...next });\n if (canDock) dockCtx!.setHoverDock(dockCtx!.findDockAt(ev.clientX, ev.clientY));\n };\n const onUp = (ev: PointerEvent) => {\n cleanup();\n if (canDock) {\n const target = dockCtx!.findDockAt(ev.clientX, ev.clientY);\n dockCtx!.setHoverDock(null);\n if (floating && target) {\n dockTo(target);\n return;\n }\n if (!floating && opts?.fromDockTab) {\n // A plain click on an inactive tab: activate it, stay docked.\n if (placement.mode === 'docked') dockCtx!.setActive(placement.dockId, id);\n }\n }\n };\n const cleanup = () => {\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', onUp);\n document.body.style.userSelect = '';\n gesture.current = null;\n };\n gesture.current = { cleanup };\n window.addEventListener('pointermove', onMove);\n window.addEventListener('pointerup', onUp);\n },\n [draggable, placement, applyPlacement, canDock, dockCtx, dockTo, id, minWidth, minHeight],\n );\n\n const beginResize = useCallback(\n (e: React.PointerEvent, edge: ResizeEdge) => {\n if (!resizable || placement.mode !== 'floating') return;\n e.preventDefault();\n e.stopPropagation();\n const startX = e.clientX;\n const startY = e.clientY;\n const origin = placement;\n document.body.style.userSelect = 'none';\n\n const onMove = (ev: PointerEvent) => {\n const dx = ev.clientX - startX;\n const dy = ev.clientY - startY;\n let { x, y, width, height } = origin;\n if (edge.includes('e')) width = origin.width + dx;\n if (edge.includes('s')) height = origin.height + dy;\n if (edge.includes('w')) {\n width = origin.width - dx;\n x = origin.x + dx;\n if (width < minWidth) x = origin.x + (origin.width - minWidth);\n }\n if (edge.includes('n')) {\n height = origin.height - dy;\n y = origin.y + dy;\n if (height < minHeight) y = origin.y + (origin.height - minHeight);\n }\n applyPlacement({ mode: 'floating', ...clampGeom({ x, y, width, height }, minWidth, minHeight) });\n };\n const onUp = () => cleanup();\n const cleanup = () => {\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', onUp);\n document.body.style.userSelect = '';\n gesture.current = null;\n };\n gesture.current = { cleanup };\n window.addEventListener('pointermove', onMove);\n window.addEventListener('pointerup', onUp);\n },\n [resizable, placement, applyPlacement, minWidth, minHeight],\n );\n\n // ---- Header (shared by floating chrome and dock tab-active bar) -----------\n const headerControls = (\n <>\n {actions}\n {canDock &&\n (placement.mode === 'docked' ? (\n <button\n type=\"button\"\n aria-label=\"Pop out\"\n onPointerDown={(e) => beginMove(e)}\n className=\"rounded p-1 text-muted-foreground hover:bg-muted hover:text-foreground\"\n >\n <PopOutIcon />\n </button>\n ) : (\n <button\n type=\"button\"\n aria-label=\"Dock\"\n onClick={() => dockTo()}\n className=\"rounded p-1 text-muted-foreground hover:bg-muted hover:text-foreground\"\n >\n <DockIcon />\n </button>\n ))}\n {onClose && (\n <button\n type=\"button\"\n aria-label=\"Close\"\n onClick={onClose}\n className=\"rounded p-1 text-muted-foreground hover:bg-muted hover:text-foreground\"\n >\n <CloseIcon />\n </button>\n )}\n </>\n );\n\n // ---- Docked rendering: portal tab + (if active) body into the dock --------\n if (placement.mode === 'docked' && canDock) {\n const dock = dockCtx!.getDock(placement.dockId);\n const isActive = dockCtx!.activeInDock(placement.dockId) === id;\n const members = dockCtx!.panelsInDock(placement.dockId);\n const showTab = members.length > 1; // single panel: no tab strip, just body\n return (\n <>\n {dock?.tabBar &&\n createPortal(\n <button\n type=\"button\"\n data-active={isActive}\n onPointerDown={(e) => beginMove(e, { fromDockTab: true })}\n className={cn(\n 'flex items-center gap-1.5 border-b-2 px-3 py-1.5 text-xs font-medium transition-colors',\n 'touch-none select-none',\n isActive\n ? 'border-primary text-foreground'\n : 'border-transparent text-muted-foreground hover:text-foreground',\n !showTab && 'hidden',\n )}\n >\n {icon}\n <span className=\"max-w-[16ch] truncate\">{title}</span>\n </button>,\n dock.tabBar,\n )}\n {dock?.content &&\n isActive &&\n createPortal(\n <div className={cn('flex h-full min-h-0 w-full flex-col', className)}>\n {!showTab && (title || headerControls) && (\n <div\n onPointerDown={(e) => beginMove(e)}\n className={cn(\n 'flex shrink-0 cursor-move touch-none items-center gap-1.5 border-b border-border px-2 py-1',\n headerClassName,\n )}\n >\n {icon}\n <span className=\"flex-1 truncate text-xs font-medium\">{title}</span>\n {headerControls}\n </div>\n )}\n <div className={cn('min-h-0 flex-1 overflow-hidden', bodyClassName)}>{children}</div>\n </div>,\n dock.content,\n )}\n </>\n );\n }\n\n // ---- Floating rendering: portal a fixed window to <body> ------------------\n if (placement.mode !== 'floating') return null;\n const win = (\n <div\n role=\"dialog\"\n className={cn(\n 'fixed z-50 flex flex-col overflow-hidden rounded-lg border border-border bg-background shadow-2xl',\n 'ring-1 ring-black/5',\n className,\n )}\n style={{ left: placement.x, top: placement.y, width: placement.width, height: placement.height }}\n >\n <div\n onPointerDown={(e) => beginMove(e)}\n className={cn(\n 'flex shrink-0 cursor-move touch-none items-center gap-1.5 border-b border-border bg-muted/40 px-2 py-1.5',\n headerClassName,\n )}\n >\n {icon}\n <span className=\"flex-1 truncate text-xs font-medium\">{title}</span>\n {headerControls}\n </div>\n <div className={cn('min-h-0 flex-1 overflow-hidden', bodyClassName)}>{children}</div>\n {resizable &&\n RESIZE_HANDLES.map((h) => (\n <div\n key={h.edge}\n onPointerDown={(e) => beginResize(e, h.edge)}\n className=\"absolute touch-none\"\n style={{ ...h.style, cursor: h.cursor }}\n />\n ))}\n </div>\n );\n\n return typeof document !== 'undefined' ? createPortal(win, document.body) : win;\n}\n\nfunction CloseIcon() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden>\n <path d=\"M3 3l6 6M9 3l-6 6\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n );\n}\nfunction DockIcon() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden>\n <rect x=\"1\" y=\"1\" width=\"10\" height=\"10\" rx=\"1.5\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n <path d=\"M1 8h10\" stroke=\"currentColor\" strokeWidth=\"1.2\" />\n </svg>\n );\n}\nfunction PopOutIcon() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" aria-hidden>\n <path d=\"M4.5 2H2v8h8V7.5\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" />\n <path d=\"M7 2h3v3M10 2L5.5 6.5\" stroke=\"currentColor\" strokeWidth=\"1.2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n );\n}\n"],"names":["MIN_W","MIN_H","DRAG_THRESHOLD","clampGeom","g","minW","minH","vw","vh","width","height","x","y","seedGeom","defaults","RESIZE_HANDLES","FloatingPanel","id","title","icon","children","dockId","defaultDocked","defaultGeom","minWidth","minHeight","resizable","draggable","onClose","actions","onPlacementChange","className","headerClassName","bodyClassName","apiRef","dockCtx","useDockContext","canDock","initialPlacement","useMemo","localPlacement","setLocalPlacement","useState","placement","applyPlacement","useCallback","next","useEffect","lastGeom","useRef","floatTo","geom","base","dockTo","target","t","useImperativeHandle","d","onResize","c","gesture","_a","beginMove","opts","startX","startY","origin","floating","onMove","ev","dx","dy","onUp","cleanup","beginResize","edge","headerControls","jsxs","Fragment","jsx","PopOutIcon","DockIcon","CloseIcon","dock","isActive","showTab","createPortal","e","cn","win","h"],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { FloatingPanel } from './floating-panel';
|
|
2
|
+
export type { FloatingPanelProps, FloatingPanelHandle } from './floating-panel';
|
|
3
|
+
export { Dock } from './dock';
|
|
4
|
+
export type { DockProps } from './dock';
|
|
5
|
+
export { DockProvider, useDockContext } from './dock-context';
|
|
6
|
+
export type { DockContextValue, PanelPlacement, FloatingGeom } from './dock-context';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/floating-panel/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,YAAY,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAChF,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,YAAY,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC9D,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { Key, ReactNode } from 'react';
|
|
2
|
+
import { FuseOptionKey, FuseResultMatch, IFuseOptions } from 'fuse.js';
|
|
3
|
+
/** What `renderItem` receives for each row. */
|
|
4
|
+
export interface FuzzyRenderContext<T> {
|
|
5
|
+
/** The row's data object. */
|
|
6
|
+
item: T;
|
|
7
|
+
/** Its index within the currently shown (filtered) list. */
|
|
8
|
+
index: number;
|
|
9
|
+
/** The live search query (trimmed). */
|
|
10
|
+
query: string;
|
|
11
|
+
/** Fuse match metadata for this row (empty when the query is empty). */
|
|
12
|
+
matches: readonly FuseResultMatch[];
|
|
13
|
+
/** Whether this row is the keyboard-focused one. */
|
|
14
|
+
active: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Render one searched string field with its fuzzy matches wrapped in `<mark>`.
|
|
17
|
+
* Pass `{ snippet: true }` for long fields (windowed, with ellipses); the
|
|
18
|
+
* default highlights the whole value inline. Falls back to the plain value
|
|
19
|
+
* when there's no match.
|
|
20
|
+
*/
|
|
21
|
+
highlight: (key: string, opts?: {
|
|
22
|
+
snippet?: boolean;
|
|
23
|
+
window?: number;
|
|
24
|
+
}) => ReactNode;
|
|
25
|
+
/** Fire `onSelect` for this row. */
|
|
26
|
+
select: () => void;
|
|
27
|
+
}
|
|
28
|
+
export interface FuzzyListProps<T> {
|
|
29
|
+
/** The data to search — any array of JSON-like objects. */
|
|
30
|
+
items: T[];
|
|
31
|
+
/** Fields Fuse should search. Accepts dotted paths and weighted keys. */
|
|
32
|
+
keys: FuseOptionKey<T>[];
|
|
33
|
+
/** Render one row from its {@link FuzzyRenderContext}. */
|
|
34
|
+
renderItem: (ctx: FuzzyRenderContext<T>) => ReactNode;
|
|
35
|
+
/** Stable React key per row (defaults to the array index). */
|
|
36
|
+
getItemKey?: (item: T, index: number) => Key;
|
|
37
|
+
/** Called when a row is activated (click or Enter). */
|
|
38
|
+
onSelect?: (item: T, index: number) => void;
|
|
39
|
+
placeholder?: string;
|
|
40
|
+
/** Shown when nothing matches (defaults to "No matches."). */
|
|
41
|
+
emptyState?: ReactNode;
|
|
42
|
+
/** Focus the search box on mount. */
|
|
43
|
+
autoFocus?: boolean;
|
|
44
|
+
/** Cap the number of results (Fuse `limit`). */
|
|
45
|
+
limit?: number;
|
|
46
|
+
/** First-paint row-height guess for the virtual list, px. Default 60 (compact
|
|
47
|
+
* rows). Bump it when rendering taller rows/cards to cut first-paint jank. */
|
|
48
|
+
estimateSize?: number;
|
|
49
|
+
/** Off-screen rows kept mounted as a scroll buffer. Default 8. */
|
|
50
|
+
overscan?: number;
|
|
51
|
+
/** Show the "N of M" count line above the list. */
|
|
52
|
+
showCount?: boolean;
|
|
53
|
+
/**
|
|
54
|
+
* How long to wait (ms) after the last keystroke before re-running the search.
|
|
55
|
+
* The input stays instant; only the Fuse pass and the re-render of the list
|
|
56
|
+
* trail behind it, which is what keeps a big index from stuttering while
|
|
57
|
+
* typing. Default 400. Set `0` to search on every keystroke.
|
|
58
|
+
*/
|
|
59
|
+
debounce?: number;
|
|
60
|
+
/** Extra Fuse options, merged over the defaults. */
|
|
61
|
+
fuseOptions?: IFuseOptions<T>;
|
|
62
|
+
/** Anything to render inline to the right of the search box. */
|
|
63
|
+
toolbar?: ReactNode;
|
|
64
|
+
/** Called with the live (un-debounced) query on every keystroke. */
|
|
65
|
+
onQueryChange?: (query: string) => void;
|
|
66
|
+
className?: string;
|
|
67
|
+
inputClassName?: string;
|
|
68
|
+
listClassName?: string;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* A generic, self-contained fuzzy-search list. Give it any array of JSON-like
|
|
72
|
+
* objects, the {@link FuzzyListProps.keys} to search, and a `renderItem` render
|
|
73
|
+
* function — it owns the search box, the Fuse index, keyboard navigation and
|
|
74
|
+
* match highlighting. Reads its colours from the design tokens.
|
|
75
|
+
*
|
|
76
|
+
* The search box is quote-aware: a bare query fuzzy-matches, while any
|
|
77
|
+
* `"double-quoted"` segment must appear as an exact (case-insensitive)
|
|
78
|
+
* substring. The two can mix — `parser "utils.ts"` fuzzy-matches `parser` and
|
|
79
|
+
* then keeps only rows whose fields contain the literal `utils.ts`.
|
|
80
|
+
*
|
|
81
|
+
* ```tsx
|
|
82
|
+
* <FuzzyList
|
|
83
|
+
* items={services}
|
|
84
|
+
* keys={['name', 'desc']}
|
|
85
|
+
* getItemKey={(s) => s.name}
|
|
86
|
+
* renderItem={({ highlight, active }) => (
|
|
87
|
+
* <div data-active={active}>
|
|
88
|
+
* <strong>{highlight('name')}</strong>
|
|
89
|
+
* <p>{highlight('desc', { snippet: true })}</p>
|
|
90
|
+
* </div>
|
|
91
|
+
* )}
|
|
92
|
+
* />
|
|
93
|
+
* ```
|
|
94
|
+
*/
|
|
95
|
+
export declare function FuzzyList<T>({ items, keys, renderItem, getItemKey, onSelect, placeholder, emptyState, autoFocus, limit, estimateSize, overscan, showCount, debounce, fuseOptions, toolbar, onQueryChange, className, inputClassName, listClassName, }: FuzzyListProps<T>): import("react").JSX.Element;
|
|
96
|
+
//# sourceMappingURL=fuzzy-list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fuzzy-list.d.ts","sourceRoot":"","sources":["../../../src/components/fuzzy-list/fuzzy-list.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAwC,KAAK,GAAG,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACvF,OAAa,EAAE,KAAK,aAAa,EAAE,KAAK,eAAe,EAAE,KAAK,YAAY,EAAE,MAAM,SAAS,CAAC;AAY5F,+CAA+C;AAC/C,MAAM,WAAW,kBAAkB,CAAC,CAAC;IACnC,6BAA6B;IAC7B,IAAI,EAAE,CAAC,CAAC;IACR,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,wEAAwE;IACxE,OAAO,EAAE,SAAS,eAAe,EAAE,CAAC;IACpC,oDAAoD;IACpD,MAAM,EAAE,OAAO,CAAC;IAChB;;;;;OAKG;IACH,SAAS,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,SAAS,CAAC;IACrF,oCAAoC;IACpC,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED,MAAM,WAAW,cAAc,CAAC,CAAC;IAC/B,2DAA2D;IAC3D,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,yEAAyE;IACzE,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;IACzB,0DAA0D;IAC1D,UAAU,EAAE,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;IACtD,8DAA8D;IAC9D,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,GAAG,CAAC;IAC7C,uDAAuD;IACvD,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8DAA8D;IAC9D,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,qCAAqC;IACrC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;kFAC8E;IAC9E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kEAAkE;IAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oDAAoD;IACpD,WAAW,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;IAC9B,gEAAgE;IAChE,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,oEAAoE;IACpE,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAkBD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,EAC3B,KAAK,EACL,IAAI,EACJ,UAAU,EACV,UAAU,EACV,QAAQ,EACR,WAAuB,EACvB,UAA0B,EAC1B,SAAS,EACT,KAAK,EACL,YAAiB,EACjB,QAAY,EACZ,SAAgB,EAChB,QAAc,EACd,WAAW,EACX,OAAO,EACP,aAAa,EACb,SAAS,EACT,cAAc,EACd,aAAa,GACd,EAAE,cAAc,CAAC,CAAC,CAAC,+BAuHnB"}
|