@accelint/design-toolkit 9.12.0 → 10.0.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/catalog-info.yaml +1 -1
- package/dist/components/accordion/context.d.ts +2 -2
- package/dist/components/accordion/group.d.ts +2 -2
- package/dist/components/accordion/header.d.ts +2 -2
- package/dist/components/accordion/index.d.ts +2 -2
- package/dist/components/accordion/panel.d.ts +2 -2
- package/dist/components/accordion/trigger.d.ts +2 -2
- package/dist/components/action-bar/index.d.ts +2 -2
- package/dist/components/audio/index.d.ts +2 -2
- package/dist/components/avatar/context.d.ts +4 -4
- package/dist/components/avatar/index.d.ts +2 -2
- package/dist/components/badge/context.d.ts +4 -4
- package/dist/components/badge/index.d.ts +2 -2
- package/dist/components/breadcrumbs/index.d.ts +2 -2
- package/dist/components/breadcrumbs/item.d.ts +2 -2
- package/dist/components/button/context.d.ts +8 -8
- package/dist/components/button/index.d.ts +2 -2
- package/dist/components/button/link.d.ts +2 -2
- package/dist/components/button/toggle.d.ts +2 -2
- package/dist/components/carousel/context.d.ts +4 -4
- package/dist/components/carousel/gallery.d.ts +2 -2
- package/dist/components/carousel/index.d.ts +2 -2
- package/dist/components/carousel/navigation.d.ts +3 -3
- package/dist/components/carousel/position.d.ts +2 -2
- package/dist/components/carousel/select.d.ts +2 -2
- package/dist/components/carousel/viewer.d.ts +2 -2
- package/dist/components/checkbox/context.d.ts +3 -3
- package/dist/components/checkbox/group.d.ts +2 -2
- package/dist/components/checkbox/index.d.ts +2 -2
- package/dist/components/chip/context.d.ts +4 -4
- package/dist/components/chip/deletable.d.ts +2 -2
- package/dist/components/chip/index.d.ts +2 -2
- package/dist/components/chip/list.d.ts +4 -4
- package/dist/components/chip/selectable.d.ts +2 -2
- package/dist/components/classification-badge/context.d.ts +4 -4
- package/dist/components/classification-badge/index.d.ts +2 -2
- package/dist/components/classification-banner/context.d.ts +4 -4
- package/dist/components/classification-banner/index.d.ts +2 -2
- package/dist/components/clock/index.d.ts +2 -2
- package/dist/components/color-picker/index.d.ts +2 -2
- package/dist/components/combobox-field/context.d.ts +4 -4
- package/dist/components/combobox-field/index.d.ts +2 -2
- package/dist/components/coordinate-field/context.d.ts +6 -6
- package/dist/components/coordinate-field/index.d.ts +2 -2
- package/dist/components/coordinate-field/segment.d.ts +2 -2
- package/dist/components/date-field/index.d.ts +2 -2
- package/dist/components/deferred-collection/index.d.ts +2 -2
- package/dist/components/details-list/context.d.ts +4 -4
- package/dist/components/details-list/index.d.ts +2 -2
- package/dist/components/details-list/label.d.ts +2 -2
- package/dist/components/details-list/value.d.ts +2 -2
- package/dist/components/dialog/content.d.ts +2 -2
- package/dist/components/dialog/context.d.ts +2 -2
- package/dist/components/dialog/footer.d.ts +2 -2
- package/dist/components/dialog/index.d.ts +2 -2
- package/dist/components/dialog/title.d.ts +2 -2
- package/dist/components/divider/context.d.ts +4 -4
- package/dist/components/divider/index.d.ts +2 -2
- package/dist/components/drawer/back.d.ts +2 -2
- package/dist/components/drawer/close.d.ts +2 -2
- package/dist/components/drawer/content.d.ts +2 -2
- package/dist/components/drawer/footer.d.ts +2 -2
- package/dist/components/drawer/header-title.d.ts +2 -2
- package/dist/components/drawer/header.d.ts +2 -2
- package/dist/components/drawer/index.d.ts +2 -2
- package/dist/components/drawer/layout-main.d.ts +2 -2
- package/dist/components/drawer/layout.d.ts +2 -2
- package/dist/components/drawer/menu-item.d.ts +2 -2
- package/dist/components/drawer/menu.d.ts +2 -2
- package/dist/components/drawer/panel.d.ts +2 -2
- package/dist/components/drawer/trigger.d.ts +2 -2
- package/dist/components/drawer/view.d.ts +2 -2
- package/dist/components/flashcard/index.d.ts +9 -9
- package/dist/components/flashcard/index.js +1 -1
- package/dist/components/flashcard/index.js.map +1 -1
- package/dist/components/flashcard/styles.module.css +4 -0
- package/dist/components/floating-card/constants.d.ts +26 -0
- package/dist/components/floating-card/constants.js +40 -0
- package/dist/components/floating-card/constants.js.map +1 -0
- package/dist/components/floating-card/context.d.ts +38 -6
- package/dist/components/floating-card/context.js +24 -3
- package/dist/components/floating-card/context.js.map +1 -1
- package/dist/components/floating-card/hooks/use-card-layout.d.ts +36 -0
- package/dist/components/floating-card/hooks/use-card-layout.js +106 -0
- package/dist/components/floating-card/hooks/use-card-layout.js.map +1 -0
- package/dist/components/floating-card/hooks/use-drag.d.ts +62 -0
- package/dist/components/floating-card/hooks/use-drag.js +100 -0
- package/dist/components/floating-card/hooks/use-drag.js.map +1 -0
- package/dist/components/floating-card/hooks/use-mouse-interaction.d.ts +58 -0
- package/dist/components/floating-card/hooks/use-mouse-interaction.js +91 -0
- package/dist/components/floating-card/hooks/use-mouse-interaction.js.map +1 -0
- package/dist/components/floating-card/hooks/use-resize.d.ts +56 -0
- package/dist/components/floating-card/hooks/use-resize.js +98 -0
- package/dist/components/floating-card/hooks/use-resize.js.map +1 -0
- package/dist/components/floating-card/index.d.ts +6 -2
- package/dist/components/floating-card/index.js +24 -32
- package/dist/components/floating-card/index.js.map +1 -1
- package/dist/components/floating-card/panel.d.ts +69 -0
- package/dist/components/floating-card/panel.js +111 -0
- package/dist/components/floating-card/panel.js.map +1 -0
- package/dist/components/floating-card/provider.d.ts +10 -6
- package/dist/components/floating-card/provider.js +159 -153
- package/dist/components/floating-card/provider.js.map +1 -1
- package/dist/components/floating-card/styles.module.css +93 -39
- package/dist/components/floating-card/types.d.ts +51 -10
- package/dist/components/floating-card/utils.d.ts +8 -85
- package/dist/components/floating-card/utils.js +12 -38
- package/dist/components/floating-card/utils.js.map +1 -1
- package/dist/components/gantt/components/base-elements/range.d.ts +2 -2
- package/dist/components/gantt/components/containers/external/gantt-panel-container/index.d.ts +2 -2
- package/dist/components/gantt/components/containers/internal/index.d.ts +2 -2
- package/dist/components/gantt/components/containers/internal/layout-container/index.d.ts +2 -2
- package/dist/components/gantt/components/containers/internal/virtualized-content-height-container/index.d.ts +2 -2
- package/dist/components/gantt/components/content-row/block.d.ts +2 -2
- package/dist/components/gantt/components/content-row/bracket.d.ts +3 -3
- package/dist/components/gantt/components/content-row/icon-marker.d.ts +2 -2
- package/dist/components/gantt/components/content-row/index.d.ts +2 -2
- package/dist/components/gantt/components/content-row/marker.d.ts +2 -2
- package/dist/components/gantt/components/content-row/spacer.d.ts +2 -2
- package/dist/components/gantt/components/current-time/index.d.ts +2 -2
- package/dist/components/gantt/components/header/index.d.ts +3 -3
- package/dist/components/gantt/components/panel-row/index.d.ts +2 -2
- package/dist/components/gantt/components/rows-virtualizer/index.d.ts +3 -3
- package/dist/components/gantt/components/timeline/index.d.ts +2 -2
- package/dist/components/gantt/context/index.d.ts +4 -4
- package/dist/components/gantt/context/store/index.d.ts +4 -4
- package/dist/components/gantt/context/temporal-data/index.d.ts +4 -4
- package/dist/components/gantt/hooks/use-layout-subscription/index.js +8 -8
- package/dist/components/gantt/hooks/use-layout-subscription/index.js.map +1 -1
- package/dist/components/hero/context.d.ts +2 -2
- package/dist/components/hero/index.d.ts +2 -2
- package/dist/components/hero/subtitle.d.ts +3 -3
- package/dist/components/hotkey/context.d.ts +2 -2
- package/dist/components/hotkey/index.d.ts +2 -2
- package/dist/components/hotkey/set.d.ts +2 -2
- package/dist/components/icon/context.d.ts +4 -4
- package/dist/components/icon/index.d.ts +2 -2
- package/dist/components/input/context.d.ts +2 -2
- package/dist/components/input/index.d.ts +2 -2
- package/dist/components/kanban/card-body.d.ts +2 -2
- package/dist/components/kanban/card-header-actions.d.ts +2 -2
- package/dist/components/kanban/card-header-title.d.ts +2 -2
- package/dist/components/kanban/card-header.d.ts +2 -2
- package/dist/components/kanban/card.d.ts +2 -2
- package/dist/components/kanban/column-actions.d.ts +2 -2
- package/dist/components/kanban/column-container.d.ts +2 -2
- package/dist/components/kanban/column-content.d.ts +2 -2
- package/dist/components/kanban/column-header-actions.d.ts +2 -2
- package/dist/components/kanban/column-header-drag-handle.d.ts +2 -2
- package/dist/components/kanban/column-header-title.d.ts +2 -2
- package/dist/components/kanban/column-header.d.ts +2 -2
- package/dist/components/kanban/column.d.ts +2 -2
- package/dist/components/kanban/context.d.ts +2 -2
- package/dist/components/kanban/header-actions.d.ts +2 -2
- package/dist/components/kanban/header-search.d.ts +2 -2
- package/dist/components/kanban/header-title.d.ts +2 -2
- package/dist/components/kanban/header.d.ts +2 -2
- package/dist/components/kanban/kanban.d.ts +4 -4
- package/dist/components/label/context.d.ts +4 -4
- package/dist/components/label/index.d.ts +2 -2
- package/dist/components/lines/index.d.ts +2 -2
- package/dist/components/link/context.d.ts +2 -2
- package/dist/components/link/index.d.ts +2 -2
- package/dist/components/list/context.d.ts +2 -2
- package/dist/components/list/index.d.ts +2 -2
- package/dist/components/list/item-content.d.ts +2 -2
- package/dist/components/list/item-description.d.ts +2 -2
- package/dist/components/list/item-title.d.ts +2 -2
- package/dist/components/list/item.d.ts +2 -2
- package/dist/components/media-controls/context.d.ts +4 -4
- package/dist/components/media-controls/fullscreen-button.d.ts +2 -2
- package/dist/components/media-controls/index.d.ts +2 -2
- package/dist/components/media-controls/mute-button.d.ts +2 -2
- package/dist/components/media-controls/play-button.d.ts +2 -2
- package/dist/components/media-controls/playback-rate.d.ts +2 -2
- package/dist/components/media-controls/seek-button.d.ts +2 -2
- package/dist/components/media-controls/time-display.d.ts +2 -2
- package/dist/components/media-controls/time-range.d.ts +2 -2
- package/dist/components/media-controls/volume-slider.d.ts +2 -2
- package/dist/components/menu/context.d.ts +2 -2
- package/dist/components/menu/index.d.ts +2 -2
- package/dist/components/menu/item-description.d.ts +2 -2
- package/dist/components/menu/item-label.d.ts +2 -2
- package/dist/components/menu/item.d.ts +2 -2
- package/dist/components/menu/section.d.ts +2 -2
- package/dist/components/menu/separator.d.ts +2 -2
- package/dist/components/menu/submenu.d.ts +2 -2
- package/dist/components/notice/index.d.ts +3 -2
- package/dist/components/notice/index.js +3 -3
- package/dist/components/notice/index.js.map +1 -1
- package/dist/components/notice/list.d.ts +2 -2
- package/dist/components/notice/list.js +14 -5
- package/dist/components/notice/list.js.map +1 -1
- package/dist/components/notice/notice-icon.d.ts +2 -2
- package/dist/components/notice/types.d.ts +6 -5
- package/dist/components/notice/utils.d.ts +11 -1
- package/dist/components/notice/utils.js +16 -1
- package/dist/components/notice/utils.js.map +1 -1
- package/dist/components/options/context.d.ts +2 -2
- package/dist/components/options/index.d.ts +2 -2
- package/dist/components/options/item-content.d.ts +2 -2
- package/dist/components/options/item-description.d.ts +2 -2
- package/dist/components/options/item-label.d.ts +2 -2
- package/dist/components/options/item.d.ts +2 -2
- package/dist/components/options/section.d.ts +2 -2
- package/dist/components/pagination/context.d.ts +2 -2
- package/dist/components/pagination/index.d.ts +2 -2
- package/dist/components/pagination/next.d.ts +2 -2
- package/dist/components/pagination/pages.d.ts +2 -2
- package/dist/components/pagination/prev.d.ts +2 -2
- package/dist/components/popover/content.d.ts +2 -2
- package/dist/components/popover/footer.d.ts +2 -2
- package/dist/components/popover/index.d.ts +2 -2
- package/dist/components/popover/title.d.ts +2 -2
- package/dist/components/popover/trigger.d.ts +2 -2
- package/dist/components/query-builder/action-element.d.ts +2 -2
- package/dist/components/query-builder/actions.d.ts +4 -4
- package/dist/components/query-builder/combinator-selector.d.ts +2 -2
- package/dist/components/query-builder/index.d.ts +2 -2
- package/dist/components/query-builder/rule-group.d.ts +4 -4
- package/dist/components/query-builder/rule.d.ts +2 -2
- package/dist/components/query-builder/value-editor.d.ts +2 -2
- package/dist/components/query-builder/value-selector.d.ts +2 -2
- package/dist/components/radio/context.d.ts +3 -3
- package/dist/components/radio/group.d.ts +2 -2
- package/dist/components/radio/index.d.ts +2 -2
- package/dist/components/search-field/context.d.ts +4 -4
- package/dist/components/search-field/index.d.ts +2 -2
- package/dist/components/select-field/context.d.ts +4 -4
- package/dist/components/select-field/index.d.ts +2 -2
- package/dist/components/sidenav/avatar.d.ts +2 -2
- package/dist/components/sidenav/content.d.ts +2 -2
- package/dist/components/sidenav/context.d.ts +2 -2
- package/dist/components/sidenav/footer.d.ts +2 -2
- package/dist/components/sidenav/header.d.ts +2 -2
- package/dist/components/sidenav/index.d.ts +2 -2
- package/dist/components/sidenav/item.d.ts +2 -2
- package/dist/components/sidenav/link.d.ts +2 -2
- package/dist/components/sidenav/menu-item.d.ts +2 -2
- package/dist/components/sidenav/menu.d.ts +2 -2
- package/dist/components/sidenav/trigger.d.ts +2 -2
- package/dist/components/skeleton/index.d.ts +2 -2
- package/dist/components/slider/index.d.ts +2 -2
- package/dist/components/status-indicator/index.d.ts +2 -2
- package/dist/components/switch/context.d.ts +4 -4
- package/dist/components/switch/index.d.ts +2 -2
- package/dist/components/table/body.d.ts +4 -3
- package/dist/components/table/body.js.map +1 -1
- package/dist/components/table/cell.d.ts +4 -3
- package/dist/components/table/cell.js.map +1 -1
- package/dist/components/table/context.d.ts +2 -2
- package/dist/components/table/features.d.ts +80 -0
- package/dist/components/table/features.js +61 -0
- package/dist/components/table/features.js.map +1 -0
- package/dist/components/table/header-cell.d.ts +4 -3
- package/dist/components/table/header-cell.js.map +1 -1
- package/dist/components/table/header.d.ts +4 -3
- package/dist/components/table/header.js.map +1 -1
- package/dist/components/table/index.d.ts +2 -2
- package/dist/components/table/index.js +40 -49
- package/dist/components/table/index.js.map +1 -1
- package/dist/components/table/row-ordering-feature.d.ts +88 -0
- package/dist/components/table/row-ordering-feature.js +115 -0
- package/dist/components/table/row-ordering-feature.js.map +1 -0
- package/dist/components/table/row.d.ts +4 -3
- package/dist/components/table/row.js.map +1 -1
- package/dist/components/table/types.d.ts +15 -13
- package/dist/components/tabs/context.d.ts +6 -6
- package/dist/components/tabs/index.d.ts +2 -2
- package/dist/components/tabs/list.d.ts +2 -2
- package/dist/components/tabs/panel.d.ts +2 -2
- package/dist/components/tabs/tab.d.ts +2 -2
- package/dist/components/text-area-field/context.d.ts +4 -4
- package/dist/components/text-area-field/index.d.ts +2 -2
- package/dist/components/text-field/context.d.ts +4 -4
- package/dist/components/text-field/index.d.ts +2 -2
- package/dist/components/time-field/index.d.ts +2 -2
- package/dist/components/time-field/styles.module.css +4 -0
- package/dist/components/tooltip/context.d.ts +2 -2
- package/dist/components/tooltip/index.d.ts +2 -2
- package/dist/components/tooltip/trigger.d.ts +2 -2
- package/dist/components/tree/context.d.ts +3 -3
- package/dist/components/tree/index.d.ts +2 -2
- package/dist/components/tree/item-actions.d.ts +2 -2
- package/dist/components/tree/item-content.d.ts +2 -2
- package/dist/components/tree/item-description.d.ts +2 -2
- package/dist/components/tree/item-label.d.ts +2 -2
- package/dist/components/tree/item-prefix-icon.d.ts +2 -2
- package/dist/components/tree/item.d.ts +2 -2
- package/dist/components/tree/lines.d.ts +2 -2
- package/dist/components/video/index.d.ts +2 -2
- package/dist/components/view-stack/context.d.ts +2 -2
- package/dist/components/view-stack/index.d.ts +2 -2
- package/dist/components/view-stack/trigger.d.ts +2 -2
- package/dist/components/view-stack/view.d.ts +2 -2
- package/dist/index.d.ts +5 -3
- package/dist/index.js +4 -2
- package/dist/providers/portal.d.ts +2 -2
- package/dist/providers/theme-provider.d.ts +2 -2
- package/package.json +20 -14
|
@@ -11,15 +11,12 @@
|
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
13
|
|
|
14
|
-
import {
|
|
14
|
+
import { DEFAULT_DIMENSIONS, DEFAULT_POSITION } from "./constants.js";
|
|
15
|
+
import { useFloatingCard, useFloatingCardRegistry } from "./context.js";
|
|
15
16
|
import { useEffect } from "react";
|
|
16
17
|
import { createPortal } from "react-dom";
|
|
17
18
|
|
|
18
19
|
//#region src/components/floating-card/index.tsx
|
|
19
|
-
const defaultDimensions = {
|
|
20
|
-
width: 300,
|
|
21
|
-
height: 400
|
|
22
|
-
};
|
|
23
20
|
/**
|
|
24
21
|
* Renders its children into a floating card using React portals.
|
|
25
22
|
*
|
|
@@ -37,6 +34,10 @@ const defaultDimensions = {
|
|
|
37
34
|
* @remarks
|
|
38
35
|
* - Requires `FloatingCardProvider` as an ancestor.
|
|
39
36
|
* - The floating card is only rendered if a valid DOM reference exists for the given `id`.
|
|
37
|
+
* - `initialDimensions` and `initialPosition` are applied each time the card
|
|
38
|
+
* opens. While it stays open, later changes to them are ignored so a user's
|
|
39
|
+
* own drag or resize is never overridden; closing and reopening starts the
|
|
40
|
+
* card from those values again.
|
|
40
41
|
*
|
|
41
42
|
* @example
|
|
42
43
|
* ```tsx
|
|
@@ -62,29 +63,22 @@ const defaultDimensions = {
|
|
|
62
63
|
* ```
|
|
63
64
|
*/
|
|
64
65
|
function FloatingCard({ id, children, title, isOpen = true, initialDimensions, initialPosition }) {
|
|
65
|
-
const { cards,
|
|
66
|
-
const {
|
|
67
|
-
const {
|
|
66
|
+
const { cards, closeCard } = useFloatingCard();
|
|
67
|
+
const { openCard } = useFloatingCardRegistry();
|
|
68
|
+
const { width, height } = initialDimensions ?? DEFAULT_DIMENSIONS;
|
|
69
|
+
const { x, y } = initialPosition ?? DEFAULT_POSITION;
|
|
68
70
|
useEffect(() => {
|
|
69
|
-
if (!floatingCardApi) return;
|
|
70
71
|
if (!isOpen) {
|
|
71
|
-
|
|
72
|
+
closeCard(id);
|
|
72
73
|
return;
|
|
73
74
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
height,
|
|
82
|
-
x,
|
|
83
|
-
y
|
|
84
|
-
}
|
|
85
|
-
});
|
|
86
|
-
panel.group.locked = "no-drop-target";
|
|
87
|
-
}
|
|
75
|
+
openCard(id, title, {
|
|
76
|
+
x,
|
|
77
|
+
y
|
|
78
|
+
}, {
|
|
79
|
+
width,
|
|
80
|
+
height
|
|
81
|
+
});
|
|
88
82
|
}, [
|
|
89
83
|
id,
|
|
90
84
|
title,
|
|
@@ -93,16 +87,14 @@ function FloatingCard({ id, children, title, isOpen = true, initialDimensions, i
|
|
|
93
87
|
height,
|
|
94
88
|
x,
|
|
95
89
|
y,
|
|
96
|
-
|
|
90
|
+
openCard,
|
|
91
|
+
closeCard
|
|
97
92
|
]);
|
|
98
93
|
useEffect(() => {
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
floatingCardApi,
|
|
104
|
-
id
|
|
105
|
-
]);
|
|
94
|
+
return () => {
|
|
95
|
+
closeCard(id);
|
|
96
|
+
};
|
|
97
|
+
}, [id, closeCard]);
|
|
106
98
|
return isOpen && cards[id] ? createPortal(children, cards[id]) : null;
|
|
107
99
|
}
|
|
108
100
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../src/components/floating-card/index.tsx"],"sourcesContent":["/*\n * Copyright 2026 Hypergiant Galactic Systems Inc. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport { type PropsWithChildren, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport {
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/components/floating-card/index.tsx"],"sourcesContent":["/*\n * Copyright 2026 Hypergiant Galactic Systems Inc. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport { type PropsWithChildren, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport { DEFAULT_DIMENSIONS, DEFAULT_POSITION } from './constants';\nimport { useFloatingCard, useFloatingCardRegistry } from './context';\nimport type { FloatingCardProps } from './types';\n\n/**\n * Renders its children into a floating card using React portals.\n *\n * The `FloatingCard` component registers itself with the floating card engine on mount\n * and renders its children into the corresponding DOM node via a portal.\n *\n * @param id - Unique identifier for the floating card.\n * @param title - Optional title displayed in the floating card header.\n * @param isOpen - Whether the floating card is rendered. Defaults to `true`.\n * @param initialDimensions - Initial width and height of the floating card. Defaults to `{ width: 300, height: 400 }`.\n * @param initialPosition - Initial x and y coordinates of the floating card.\n * @param children - React children to render inside the floating card.\n * @returns The floating card component (portaled content) or null.\n *\n * @remarks\n * - Requires `FloatingCardProvider` as an ancestor.\n * - The floating card is only rendered if a valid DOM reference exists for the given `id`.\n * - `initialDimensions` and `initialPosition` are applied each time the card\n * opens. While it stays open, later changes to them are ignored so a user's\n * own drag or resize is never overridden; closing and reopening starts the\n * card from those values again.\n *\n * @example\n * ```tsx\n * import { uuid } from '@accelint/core/utility/uuid';\n *\n * const cardId = uuid();\n * const [isOpen, setIsOpen] = useState(true);\n *\n * <FloatingCardProvider>\n * <FloatingCard\n * id={cardId}\n * title=\"Settings Panel\"\n * isOpen={isOpen}\n * initialDimensions={{ width: 400, height: 500 }}\n * >\n * <SettingsForm />\n * </FloatingCard>\n *\n * <button onClick={() => setIsOpen(!isOpen)}>\n * Toggle Panel\n * </button>\n * </FloatingCardProvider>\n * ```\n */\nexport function FloatingCard({\n id,\n children,\n title,\n isOpen = true,\n initialDimensions,\n initialPosition,\n}: PropsWithChildren<FloatingCardProps>) {\n const { cards, closeCard } = useFloatingCard();\n const { openCard } = useFloatingCardRegistry();\n\n const { width, height } = initialDimensions ?? DEFAULT_DIMENSIONS;\n const { x, y } = initialPosition ?? DEFAULT_POSITION;\n\n useEffect(() => {\n if (!isOpen) {\n closeCard(id);\n\n return;\n }\n\n openCard(id, title, { x, y }, { width, height });\n }, [id, title, isOpen, width, height, x, y, openCard, closeCard]);\n\n // Unregister on unmount so a card removed from the tree leaves no panel behind.\n useEffect(() => {\n return () => {\n closeCard(id);\n };\n }, [id, closeCard]);\n\n return isOpen && cards[id] ? createPortal(children, cards[id]) : null;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+DA,SAAgB,aAAa,EAC3B,IACA,UACA,OACA,SAAS,MACT,mBACA,mBACuC;CACvC,MAAM,EAAE,OAAO,cAAc,iBAAiB;CAC9C,MAAM,EAAE,aAAa,yBAAyB;CAE9C,MAAM,EAAE,OAAO,WAAW,qBAAqB;CAC/C,MAAM,EAAE,GAAG,MAAM,mBAAmB;AAEpC,iBAAgB;AACd,MAAI,CAAC,QAAQ;AACX,aAAU,GAAG;AAEb;;AAGF,WAAS,IAAI,OAAO;GAAE;GAAG;GAAG,EAAE;GAAE;GAAO;GAAQ,CAAC;IAC/C;EAAC;EAAI;EAAO;EAAQ;EAAO;EAAQ;EAAG;EAAG;EAAU;EAAU,CAAC;AAGjE,iBAAgB;AACd,eAAa;AACX,aAAU,GAAG;;IAEd,CAAC,IAAI,UAAU,CAAC;AAEnB,QAAO,UAAU,MAAM,MAAM,aAAa,UAAU,MAAM,IAAI,GAAG"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026 Hypergiant Galactic Systems Inc. All rights reserved.
|
|
3
|
+
* This file is licensed to you under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
* you may not use this file except in compliance with the License. You may obtain a copy
|
|
5
|
+
* of the License at https://www.apache.org/licenses/LICENSE-2.0
|
|
6
|
+
*
|
|
7
|
+
* Unless required by applicable law or agreed to in writing, software distributed under
|
|
8
|
+
* the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
|
|
9
|
+
* OF ANY KIND, either express or implied. See the License for the specific language
|
|
10
|
+
* governing permissions and limitations under the License.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { Bounds, Dimensions, FloatingCardLayout, Position } from "./types.js";
|
|
14
|
+
import { ReactNode, RefCallback } from "react";
|
|
15
|
+
import * as react_jsx_runtime98 from "react/jsx-runtime";
|
|
16
|
+
import { UniqueId } from "@accelint/core/utility/uuid";
|
|
17
|
+
|
|
18
|
+
//#region src/components/floating-card/panel.d.ts
|
|
19
|
+
type FloatingCardPanelProps = {
|
|
20
|
+
/** Identifier of the card this panel renders. */
|
|
21
|
+
id: UniqueId;
|
|
22
|
+
/** Current geometry and stacking order. */
|
|
23
|
+
layout: FloatingCardLayout;
|
|
24
|
+
/** Whether the card is pinned, which freezes drag and resize. */
|
|
25
|
+
isPinned: boolean;
|
|
26
|
+
/** Header content rendered before the title. */
|
|
27
|
+
header: ReactNode;
|
|
28
|
+
/** Header content rendered after the title, typically actions. */
|
|
29
|
+
actions: ReactNode;
|
|
30
|
+
/** Reads the provider's box so gestures can be constrained to it. */
|
|
31
|
+
getBounds: () => Bounds;
|
|
32
|
+
/** Registers the portal target that card children render into. */
|
|
33
|
+
contentRef: RefCallback<HTMLDivElement>;
|
|
34
|
+
/** Raises this card above its siblings. */
|
|
35
|
+
onFocus: () => void;
|
|
36
|
+
/** Commits a new position during a drag. */
|
|
37
|
+
onMove: (position: Position) => void;
|
|
38
|
+
/** Commits new geometry during a resize. */
|
|
39
|
+
onResize: (dimensions: Dimensions, position: Position) => void;
|
|
40
|
+
/** Accessible name for the card, taken from its title. */
|
|
41
|
+
label: string;
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Renders one floating card: its chrome, its drag surface, and the portal
|
|
45
|
+
* target its children mount into.
|
|
46
|
+
*
|
|
47
|
+
* @param props - {@link FloatingCardPanelProps}
|
|
48
|
+
* @returns The positioned card element.
|
|
49
|
+
*
|
|
50
|
+
* @remarks
|
|
51
|
+
* Presentational only -- all geometry is owned by the provider and passed in,
|
|
52
|
+
* so this component stays a pure function of its props.
|
|
53
|
+
*/
|
|
54
|
+
declare function FloatingCardPanel({
|
|
55
|
+
id,
|
|
56
|
+
layout,
|
|
57
|
+
isPinned,
|
|
58
|
+
header,
|
|
59
|
+
actions,
|
|
60
|
+
getBounds,
|
|
61
|
+
contentRef,
|
|
62
|
+
onFocus,
|
|
63
|
+
onMove,
|
|
64
|
+
onResize,
|
|
65
|
+
label
|
|
66
|
+
}: FloatingCardPanelProps): react_jsx_runtime98.JSX.Element;
|
|
67
|
+
//#endregion
|
|
68
|
+
export { FloatingCardPanel, FloatingCardPanelProps };
|
|
69
|
+
//# sourceMappingURL=panel.d.ts.map
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2026 Hypergiant Galactic Systems Inc. All rights reserved.
|
|
3
|
+
* This file is licensed to you under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
* you may not use this file except in compliance with the License. You may obtain a copy
|
|
5
|
+
* of the License at https://www.apache.org/licenses/LICENSE-2.0
|
|
6
|
+
*
|
|
7
|
+
* Unless required by applicable law or agreed to in writing, software distributed under
|
|
8
|
+
* the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
|
|
9
|
+
* OF ANY KIND, either express or implied. See the License for the specific language
|
|
10
|
+
* governing permissions and limitations under the License.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
import { useDrag } from "./hooks/use-drag.js";
|
|
15
|
+
import { useResize } from "./hooks/use-resize.js";
|
|
16
|
+
import { useCallback, useMemo } from "react";
|
|
17
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
18
|
+
import styles from "./styles.module.css";
|
|
19
|
+
|
|
20
|
+
//#region src/components/floating-card/panel.tsx
|
|
21
|
+
/** Handles rendered around the card, paired with the cursor each one shows. */
|
|
22
|
+
const RESIZE_HANDLES = [
|
|
23
|
+
"n",
|
|
24
|
+
"s",
|
|
25
|
+
"e",
|
|
26
|
+
"w",
|
|
27
|
+
"ne",
|
|
28
|
+
"nw",
|
|
29
|
+
"se",
|
|
30
|
+
"sw"
|
|
31
|
+
];
|
|
32
|
+
/**
|
|
33
|
+
* Renders one floating card: its chrome, its drag surface, and the portal
|
|
34
|
+
* target its children mount into.
|
|
35
|
+
*
|
|
36
|
+
* @param props - {@link FloatingCardPanelProps}
|
|
37
|
+
* @returns The positioned card element.
|
|
38
|
+
*
|
|
39
|
+
* @remarks
|
|
40
|
+
* Presentational only -- all geometry is owned by the provider and passed in,
|
|
41
|
+
* so this component stays a pure function of its props.
|
|
42
|
+
*/
|
|
43
|
+
function FloatingCardPanel({ id, layout, isPinned, header, actions, getBounds, contentRef, onFocus, onMove, onResize, label }) {
|
|
44
|
+
const { position, dimensions, zIndex } = layout;
|
|
45
|
+
const { handleStart } = useDrag({
|
|
46
|
+
disabled: isPinned,
|
|
47
|
+
position,
|
|
48
|
+
dimensions,
|
|
49
|
+
getBounds,
|
|
50
|
+
onPositionChange: onMove,
|
|
51
|
+
onDragStart: onFocus
|
|
52
|
+
});
|
|
53
|
+
const { getHandleProps } = useResize({
|
|
54
|
+
disabled: isPinned,
|
|
55
|
+
position,
|
|
56
|
+
dimensions,
|
|
57
|
+
getBounds,
|
|
58
|
+
onResize,
|
|
59
|
+
onResizeStart: onFocus
|
|
60
|
+
});
|
|
61
|
+
const handleHeaderPointerDown = useCallback((event) => {
|
|
62
|
+
onFocus();
|
|
63
|
+
handleStart(event.nativeEvent);
|
|
64
|
+
}, [handleStart, onFocus]);
|
|
65
|
+
const style = useMemo(() => ({
|
|
66
|
+
left: position.x,
|
|
67
|
+
top: position.y,
|
|
68
|
+
width: dimensions.width,
|
|
69
|
+
height: dimensions.height,
|
|
70
|
+
zIndex
|
|
71
|
+
}), [
|
|
72
|
+
position.x,
|
|
73
|
+
position.y,
|
|
74
|
+
dimensions.width,
|
|
75
|
+
dimensions.height,
|
|
76
|
+
zIndex
|
|
77
|
+
]);
|
|
78
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
79
|
+
"aria-label": label,
|
|
80
|
+
"aria-modal": "false",
|
|
81
|
+
className: styles.panel,
|
|
82
|
+
"data-pinned": isPinned || void 0,
|
|
83
|
+
onPointerDown: onFocus,
|
|
84
|
+
role: "dialog",
|
|
85
|
+
style,
|
|
86
|
+
children: [
|
|
87
|
+
/* @__PURE__ */ jsxs("div", {
|
|
88
|
+
className: styles.header,
|
|
89
|
+
onPointerDown: handleHeaderPointerDown,
|
|
90
|
+
children: [header, /* @__PURE__ */ jsx("div", {
|
|
91
|
+
className: styles.headerActions,
|
|
92
|
+
children: actions
|
|
93
|
+
})]
|
|
94
|
+
}),
|
|
95
|
+
/* @__PURE__ */ jsx("div", {
|
|
96
|
+
className: styles.content,
|
|
97
|
+
ref: contentRef
|
|
98
|
+
}),
|
|
99
|
+
isPinned ? null : RESIZE_HANDLES.map((handle) => /* @__PURE__ */ jsx("div", {
|
|
100
|
+
"aria-hidden": "true",
|
|
101
|
+
className: styles[`resize-${handle}`],
|
|
102
|
+
"data-handle": handle,
|
|
103
|
+
...getHandleProps(handle)
|
|
104
|
+
}, `${id}-resize-${handle}`))
|
|
105
|
+
]
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
//#endregion
|
|
110
|
+
export { FloatingCardPanel };
|
|
111
|
+
//# sourceMappingURL=panel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"panel.js","names":["RESIZE_HANDLES: readonly ResizeHandle[]"],"sources":["../../../src/components/floating-card/panel.tsx"],"sourcesContent":["// __private-exports\n/*\n * Copyright 2026 Hypergiant Galactic Systems Inc. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport { useCallback, useMemo } from 'react';\nimport { useDrag } from './hooks/use-drag';\nimport { useResize } from './hooks/use-resize';\nimport styles from './styles.module.css';\nimport type { UniqueId } from '@accelint/core/utility/uuid';\nimport type { ReactNode, RefCallback } from 'react';\nimport type {\n Bounds,\n Dimensions,\n FloatingCardLayout,\n Position,\n ResizeHandle,\n} from './types';\n\n/** Handles rendered around the card, paired with the cursor each one shows. */\nconst RESIZE_HANDLES: readonly ResizeHandle[] = [\n 'n',\n 's',\n 'e',\n 'w',\n 'ne',\n 'nw',\n 'se',\n 'sw',\n];\n\nexport type FloatingCardPanelProps = {\n /** Identifier of the card this panel renders. */\n id: UniqueId;\n /** Current geometry and stacking order. */\n layout: FloatingCardLayout;\n /** Whether the card is pinned, which freezes drag and resize. */\n isPinned: boolean;\n /** Header content rendered before the title. */\n header: ReactNode;\n /** Header content rendered after the title, typically actions. */\n actions: ReactNode;\n /** Reads the provider's box so gestures can be constrained to it. */\n getBounds: () => Bounds;\n /** Registers the portal target that card children render into. */\n contentRef: RefCallback<HTMLDivElement>;\n /** Raises this card above its siblings. */\n onFocus: () => void;\n /** Commits a new position during a drag. */\n onMove: (position: Position) => void;\n /** Commits new geometry during a resize. */\n onResize: (dimensions: Dimensions, position: Position) => void;\n /** Accessible name for the card, taken from its title. */\n label: string;\n};\n\n/**\n * Renders one floating card: its chrome, its drag surface, and the portal\n * target its children mount into.\n *\n * @param props - {@link FloatingCardPanelProps}\n * @returns The positioned card element.\n *\n * @remarks\n * Presentational only -- all geometry is owned by the provider and passed in,\n * so this component stays a pure function of its props.\n */\nexport function FloatingCardPanel({\n id,\n layout,\n isPinned,\n header,\n actions,\n getBounds,\n contentRef,\n onFocus,\n onMove,\n onResize,\n label,\n}: FloatingCardPanelProps) {\n const { position, dimensions, zIndex } = layout;\n\n const { handleStart } = useDrag({\n disabled: isPinned,\n position,\n dimensions,\n getBounds,\n onPositionChange: onMove,\n onDragStart: onFocus,\n });\n\n const { getHandleProps } = useResize({\n disabled: isPinned,\n position,\n dimensions,\n getBounds,\n onResize,\n onResizeStart: onFocus,\n });\n\n const handleHeaderPointerDown = useCallback(\n (event: React.PointerEvent<HTMLDivElement>) => {\n onFocus();\n handleStart(event.nativeEvent);\n },\n [handleStart, onFocus],\n );\n\n const style = useMemo(\n () => ({\n left: position.x,\n top: position.y,\n width: dimensions.width,\n height: dimensions.height,\n zIndex,\n }),\n [position.x, position.y, dimensions.width, dimensions.height, zIndex],\n );\n\n return (\n // biome-ignore lint/a11y/useKeyWithClickEvents: pointerdown only raises the card; every control inside stays keyboard reachable.\n <div\n aria-label={label}\n // Cards coexist with the rest of the application rather than blocking it,\n // so the dialog is explicitly non-modal.\n aria-modal='false'\n className={styles.panel}\n data-pinned={isPinned || undefined}\n onPointerDown={onFocus}\n role='dialog'\n style={style}\n >\n <div className={styles.header} onPointerDown={handleHeaderPointerDown}>\n {header}\n <div className={styles.headerActions}>{actions}</div>\n </div>\n\n <div className={styles.content} ref={contentRef} />\n\n {isPinned\n ? null\n : RESIZE_HANDLES.map((handle) => (\n <div\n aria-hidden='true'\n className={styles[`resize-${handle}`]}\n data-handle={handle}\n key={`${id}-resize-${handle}`}\n {...getHandleProps(handle)}\n />\n ))}\n </div>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AA4BA,MAAMA,iBAA0C;CAC9C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;;;;;;;;;;;;AAsCD,SAAgB,kBAAkB,EAChC,IACA,QACA,UACA,QACA,SACA,WACA,YACA,SACA,QACA,UACA,SACyB;CACzB,MAAM,EAAE,UAAU,YAAY,WAAW;CAEzC,MAAM,EAAE,gBAAgB,QAAQ;EAC9B,UAAU;EACV;EACA;EACA;EACA,kBAAkB;EAClB,aAAa;EACd,CAAC;CAEF,MAAM,EAAE,mBAAmB,UAAU;EACnC,UAAU;EACV;EACA;EACA;EACA;EACA,eAAe;EAChB,CAAC;CAEF,MAAM,0BAA0B,aAC7B,UAA8C;AAC7C,WAAS;AACT,cAAY,MAAM,YAAY;IAEhC,CAAC,aAAa,QAAQ,CACvB;CAED,MAAM,QAAQ,eACL;EACL,MAAM,SAAS;EACf,KAAK,SAAS;EACd,OAAO,WAAW;EAClB,QAAQ,WAAW;EACnB;EACD,GACD;EAAC,SAAS;EAAG,SAAS;EAAG,WAAW;EAAO,WAAW;EAAQ;EAAO,CACtE;AAED,QAEE,qBAAC;EACC,cAAY;EAGZ,cAAW;EACX,WAAW,OAAO;EAClB,eAAa,YAAY;EACzB,eAAe;EACf,MAAK;EACE;;GAEP,qBAAC;IAAI,WAAW,OAAO;IAAQ,eAAe;eAC3C,QACD,oBAAC;KAAI,WAAW,OAAO;eAAgB;MAAc;KACjD;GAEN,oBAAC;IAAI,WAAW,OAAO;IAAS,KAAK;KAAc;GAElD,WACG,OACA,eAAe,KAAK,WAClB,oBAAC;IACC,eAAY;IACZ,WAAW,OAAO,UAAU;IAC5B,eAAa;IAEb,GAAI,eAAe,OAAO;MADrB,GAAG,GAAG,UAAU,SAErB,CACF;;GACF"}
|
|
@@ -11,28 +11,31 @@
|
|
|
11
11
|
*/
|
|
12
12
|
|
|
13
13
|
import { FloatingCardProviderProps } from "./types.js";
|
|
14
|
-
import * as
|
|
14
|
+
import * as react_jsx_runtime99 from "react/jsx-runtime";
|
|
15
15
|
|
|
16
16
|
//#region src/components/floating-card/provider.d.ts
|
|
17
17
|
|
|
18
18
|
/**
|
|
19
19
|
* Provides a context and layout area for floating cards within the application.
|
|
20
20
|
*
|
|
21
|
-
* Wraps children with floating card context and renders
|
|
22
|
-
*
|
|
21
|
+
* Wraps children with floating card context and renders each registered card as
|
|
22
|
+
* a draggable, resizable panel bounded by the provider's own box.
|
|
23
23
|
*
|
|
24
24
|
* @param props - The props for the FloatingCardProvider component.
|
|
25
25
|
* @param props.children - Child components rendered inside the floating card provider.
|
|
26
26
|
* @param props.icon - Optional icon rendered in all card headers (static or factory).
|
|
27
27
|
* @param props.headerActions - Optional action buttons for card headers (static or factory).
|
|
28
|
+
* @param props.initialPinned - Card IDs that start pinned.
|
|
29
|
+
* @param props.bounds - Region cards are confined to. Defaults to `'provider'`.
|
|
28
30
|
* @param props.className - Additional CSS class names for styling.
|
|
29
31
|
* @returns The FloatingCardProvider component that manages floating card layout and context.
|
|
30
32
|
*
|
|
31
33
|
* @remarks
|
|
32
34
|
* - Manages registration and cleanup of floating card DOM references
|
|
33
35
|
* - Exposes closeCard, togglePinCard, and isPinned via context
|
|
34
|
-
* -
|
|
35
|
-
*
|
|
36
|
+
* - Cards are bounded within the provider element by default; `bounds='viewport'`
|
|
37
|
+
* lets them move anywhere on screen
|
|
38
|
+
* - Cards are dragged by their header; pinning a card freezes drag and resize
|
|
36
39
|
*
|
|
37
40
|
* @example
|
|
38
41
|
* ```tsx
|
|
@@ -55,8 +58,9 @@ declare function FloatingCardProvider({
|
|
|
55
58
|
icon,
|
|
56
59
|
headerActions,
|
|
57
60
|
initialPinned,
|
|
61
|
+
bounds,
|
|
58
62
|
className
|
|
59
|
-
}: FloatingCardProviderProps):
|
|
63
|
+
}: FloatingCardProviderProps): react_jsx_runtime99.JSX.Element;
|
|
60
64
|
//#endregion
|
|
61
65
|
export { FloatingCardProvider };
|
|
62
66
|
//# sourceMappingURL=provider.d.ts.map
|