@once-ui-system/core 1.5.14 → 1.6.1
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/dist/components/ArrowNavigationContext.js +1 -1
- package/dist/components/ArrowNavigationContext.js.map +1 -1
- package/dist/components/Carousel.d.ts.map +1 -1
- package/dist/components/Carousel.js +5 -9
- package/dist/components/Carousel.js.map +1 -1
- package/dist/components/Carousel.module.scss +16 -0
- package/dist/components/ClientFlex.d.ts +6 -6
- package/dist/components/ClientFlex.d.ts.map +1 -1
- package/dist/components/ClientFlex.js +21 -18
- package/dist/components/ClientFlex.js.map +1 -1
- package/dist/components/ClientGrid.d.ts +6 -6
- package/dist/components/ClientGrid.d.ts.map +1 -1
- package/dist/components/ClientGrid.js +21 -18
- package/dist/components/ClientGrid.js.map +1 -1
- package/dist/components/ContextMenu.d.ts.map +1 -1
- package/dist/components/ContextMenu.js +32 -41
- package/dist/components/ContextMenu.js.map +1 -1
- package/dist/components/Dialog.d.ts.map +1 -1
- package/dist/components/Dialog.js +57 -30
- package/dist/components/Dialog.js.map +1 -1
- package/dist/components/DropdownWrapper.d.ts.map +1 -1
- package/dist/components/DropdownWrapper.js +128 -174
- package/dist/components/DropdownWrapper.js.map +1 -1
- package/dist/components/Flex.d.ts +6 -6
- package/dist/components/Flex.d.ts.map +1 -1
- package/dist/components/Flex.js.map +1 -1
- package/dist/components/Grid.d.ts +6 -6
- package/dist/components/Grid.d.ts.map +1 -1
- package/dist/components/Grid.js.map +1 -1
- package/dist/components/Heading.d.ts +1 -1
- package/dist/components/Heading.d.ts.map +1 -1
- package/dist/components/Heading.js +20 -9
- package/dist/components/Heading.js.map +1 -1
- package/dist/components/MasonryGrid.d.ts +9 -1
- package/dist/components/MasonryGrid.d.ts.map +1 -1
- package/dist/components/MasonryGrid.js +2 -2
- package/dist/components/MasonryGrid.js.map +1 -1
- package/dist/components/MatrixFx.d.ts.map +1 -1
- package/dist/components/MatrixFx.js +57 -6
- package/dist/components/MatrixFx.js.map +1 -1
- package/dist/components/ScrollLock.d.ts +8 -0
- package/dist/components/ScrollLock.d.ts.map +1 -0
- package/dist/components/ScrollLock.js +112 -0
- package/dist/components/ScrollLock.js.map +1 -0
- package/dist/components/ServerFlex.d.ts +6 -6
- package/dist/components/ServerFlex.d.ts.map +1 -1
- package/dist/components/ServerFlex.js +199 -56
- package/dist/components/ServerFlex.js.map +1 -1
- package/dist/components/ServerGrid.d.ts +6 -6
- package/dist/components/ServerGrid.d.ts.map +1 -1
- package/dist/components/ServerGrid.js +154 -27
- package/dist/components/ServerGrid.js.map +1 -1
- package/dist/components/Text.d.ts +1 -1
- package/dist/components/Text.d.ts.map +1 -1
- package/dist/components/Text.js +20 -9
- package/dist/components/Text.js.map +1 -1
- package/dist/components/Textarea.js +1 -1
- package/dist/components/Textarea.js.map +1 -1
- package/dist/components/ThemeInit.d.ts +20 -0
- package/dist/components/ThemeInit.d.ts.map +1 -0
- package/dist/components/ThemeInit.js +47 -0
- package/dist/components/ThemeInit.js.map +1 -0
- package/dist/components/index.d.ts +2 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +2 -0
- package/dist/components/index.js.map +1 -1
- package/dist/contexts/LayoutProvider.d.ts.map +1 -1
- package/dist/contexts/LayoutProvider.js +0 -8
- package/dist/contexts/LayoutProvider.js.map +1 -1
- package/dist/css/styles.css +1 -1
- package/dist/css/styles.css.map +1 -1
- package/dist/css/tokens.css +1 -1
- package/dist/css/tokens.css.map +1 -1
- package/dist/hooks/useResponsiveClasses.d.ts +1 -1
- package/dist/hooks/useResponsiveClasses.d.ts.map +1 -1
- package/dist/hooks/useResponsiveClasses.js +23 -23
- package/dist/hooks/useResponsiveClasses.js.map +1 -1
- package/dist/interfaces.d.ts +57 -35
- package/dist/interfaces.d.ts.map +1 -1
- package/dist/modules/data/Legend.d.ts +1 -0
- package/dist/modules/data/Legend.d.ts.map +1 -1
- package/dist/modules/data/Legend.js +2 -2
- package/dist/modules/data/Legend.js.map +1 -1
- package/dist/modules/data/LineChart.d.ts.map +1 -1
- package/dist/modules/data/LineChart.js +1 -1
- package/dist/modules/data/LineChart.js.map +1 -1
- package/dist/package.json +1 -1
- package/dist/styles/border.scss +4 -0
- package/dist/styles/typography.scss +20 -0
- package/dist/tokens/theme.scss +1 -0
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
3
|
import React, { useEffect, useCallback, useRef, forwardRef, useState, useContext, } from "react";
|
|
4
4
|
import ReactDOM from "react-dom";
|
|
5
5
|
import classNames from "classnames";
|
|
6
|
-
import { Column, Flex, Heading, IconButton, Text } from ".";
|
|
6
|
+
import { Column, Flex, Heading, IconButton, ScrollLock, Text } from ".";
|
|
7
7
|
import styles from "./Dialog.module.scss";
|
|
8
8
|
const DialogContext = React.createContext({
|
|
9
9
|
stackedDialogOpen: false,
|
|
@@ -75,11 +75,37 @@ const Dialog = forwardRef(({ isOpen, onClose, title, description, children, stac
|
|
|
75
75
|
}
|
|
76
76
|
}, [isOpen, handleKeyDown]);
|
|
77
77
|
useEffect(() => {
|
|
78
|
+
// Find the portal container (direct child of body that contains the dialog)
|
|
79
|
+
const getPortalContainer = () => {
|
|
80
|
+
let portalContainer = dialogRef.current;
|
|
81
|
+
while (portalContainer && portalContainer.parentElement !== document.body) {
|
|
82
|
+
portalContainer = portalContainer.parentElement;
|
|
83
|
+
}
|
|
84
|
+
return portalContainer;
|
|
85
|
+
};
|
|
86
|
+
// Cleanup function to restore inert state
|
|
87
|
+
const cleanup = () => {
|
|
88
|
+
// Restore inert on all body children
|
|
89
|
+
document.body.childNodes.forEach((node) => {
|
|
90
|
+
if (node instanceof HTMLElement) {
|
|
91
|
+
node.inert = false;
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
// Also restore inert on any dialogs (for stacked dialog case)
|
|
95
|
+
if (stack) {
|
|
96
|
+
const dialogs = document.querySelectorAll('[role="dialog"]');
|
|
97
|
+
dialogs.forEach((dialog) => {
|
|
98
|
+
if (dialog instanceof HTMLElement) {
|
|
99
|
+
dialog.inert = false;
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
};
|
|
78
104
|
if (isOpen) {
|
|
79
|
-
|
|
80
|
-
// Make everything outside the dialog inert
|
|
105
|
+
const portalContainer = getPortalContainer();
|
|
106
|
+
// Make everything outside the dialog inert, except the dialog's own portal container
|
|
81
107
|
document.body.childNodes.forEach((node) => {
|
|
82
|
-
if (node instanceof HTMLElement && node !==
|
|
108
|
+
if (node instanceof HTMLElement && node !== portalContainer) {
|
|
83
109
|
node.inert = true;
|
|
84
110
|
}
|
|
85
111
|
});
|
|
@@ -92,6 +118,8 @@ const Dialog = forwardRef(({ isOpen, onClose, title, description, children, stac
|
|
|
92
118
|
}
|
|
93
119
|
});
|
|
94
120
|
}
|
|
121
|
+
// Return cleanup function for when component unmounts or isOpen changes
|
|
122
|
+
return cleanup;
|
|
95
123
|
}
|
|
96
124
|
else {
|
|
97
125
|
// If this is a stacked dialog closing, restore interactivity to base dialog
|
|
@@ -110,7 +138,6 @@ const Dialog = forwardRef(({ isOpen, onClose, title, description, children, stac
|
|
|
110
138
|
node.inert = false;
|
|
111
139
|
}
|
|
112
140
|
});
|
|
113
|
-
document.body.style.overflow = "unset";
|
|
114
141
|
}
|
|
115
142
|
}
|
|
116
143
|
}, [isOpen, stack]);
|
|
@@ -148,31 +175,31 @@ const Dialog = forwardRef(({ isOpen, onClose, title, description, children, stac
|
|
|
148
175
|
}, [isVisible, onClose, stack, base]);
|
|
149
176
|
if (!isVisible)
|
|
150
177
|
return null;
|
|
151
|
-
return ReactDOM.createPortal(_jsx(Flex, { ref: ref, transition: "macro-medium", background: "overlay", position: "fixed", zIndex: base ? 8 : 9, top: "0", left: "0", right: "0", bottom: "0", className: classNames(styles.overlay, {
|
|
152
|
-
[styles.open]: isAnimating,
|
|
153
|
-
}), center: true, padding: "l", role: "dialog", "aria-modal": "true", "aria-labelledby": "dialog-title", children: _jsx(Flex, { fill: true, center: true, transition: "macro-medium", style: {
|
|
154
|
-
transform: base ? "scale(0.94) translateY(-1.25rem)" : "",
|
|
155
|
-
}, children: _jsxs(Column, { position: "unset", className: classNames(styles.dialog, {
|
|
178
|
+
return ReactDOM.createPortal(_jsxs(_Fragment, { children: [_jsx(ScrollLock, { enabled: isOpen, allowScrollInElement: dialogRef }), _jsx(Flex, { ref: ref, transition: "macro-medium", background: "overlay", position: "fixed", zIndex: base ? 8 : 9, top: "0", left: "0", right: "0", bottom: "0", className: classNames(styles.overlay, {
|
|
156
179
|
[styles.open]: isAnimating,
|
|
157
|
-
}), style: {
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
180
|
+
}), center: true, padding: "l", role: "dialog", "aria-modal": "true", "aria-labelledby": "dialog-title", children: _jsx(Flex, { fill: true, center: true, transition: "macro-medium", style: {
|
|
181
|
+
transform: base ? "scale(0.94) translateY(-1.25rem)" : "",
|
|
182
|
+
}, children: _jsxs(Column, { position: "unset", className: classNames(styles.dialog, {
|
|
183
|
+
[styles.open]: isAnimating,
|
|
184
|
+
}), style: {
|
|
185
|
+
minHeight: minHeight ? `${minHeight}px` : undefined,
|
|
186
|
+
}, ref: dialogRef, fillWidth: true, transition: "macro-medium", shadow: "xl", radius: "xl", border: "neutral-medium", background: "neutral-weak", tabIndex: -1, onKeyDown: (e) => {
|
|
187
|
+
if (e.key === "Tab") {
|
|
188
|
+
const focusableElements = Array.from(dialogRef.current?.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])') || []);
|
|
189
|
+
if (focusableElements.length === 0)
|
|
190
|
+
return;
|
|
191
|
+
const firstElement = focusableElements[0];
|
|
192
|
+
const lastElement = focusableElements[focusableElements.length - 1];
|
|
193
|
+
if (e.shiftKey && document.activeElement === firstElement) {
|
|
194
|
+
e.preventDefault();
|
|
195
|
+
lastElement.focus();
|
|
196
|
+
}
|
|
197
|
+
else if (!e.shiftKey && document.activeElement === lastElement) {
|
|
198
|
+
e.preventDefault();
|
|
199
|
+
firstElement.focus();
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}, ...rest, children: [_jsxs(Column, { as: "header", paddingX: "24", paddingTop: "24", paddingBottom: "s", gap: "4", children: [_jsxs(Flex, { fillWidth: true, horizontal: "between", gap: "8", children: [typeof title === "string" ? (_jsx(Heading, { id: "dialog-title", variant: "heading-strong-l", children: title })) : (title), _jsx(IconButton, { icon: "close", size: "m", variant: "tertiary", tooltip: "Close", onClick: onClose })] }), description && (_jsx(Text, { variant: "body-default-s", onBackground: "neutral-weak", children: description }))] }), _jsx(Column, { as: "section", paddingX: "24", paddingBottom: "24", flex: 1, overflowY: "auto", children: children }), footer && (_jsx(Flex, { borderTop: "neutral-medium", as: "footer", horizontal: "end", padding: "12", gap: "8", children: footer }))] }) }) })] }), document.body);
|
|
176
203
|
});
|
|
177
204
|
Dialog.displayName = "Dialog";
|
|
178
205
|
export { Dialog };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Dialog.js","sourceRoot":"","sources":["../../src/components/Dialog.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,EAAE,EAEZ,SAAS,EACT,WAAW,EACX,MAAM,EACN,UAAU,EACV,QAAQ,EACR,UAAU,GACX,MAAM,OAAO,CAAC;AACf,OAAO,QAAQ,MAAM,WAAW,CAAC;AACjC,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"Dialog.js","sourceRoot":"","sources":["../../src/components/Dialog.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DropdownWrapper.d.ts","sourceRoot":"","sources":["../../src/components/DropdownWrapper.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAKZ,SAAS,EAMV,MAAM,OAAO,CAAC;AAEf,OAAO,EAOL,SAAS,EACV,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAE/D,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,OAAO,EAAE,SAAS,CAAC;IACnB,QAAQ,EAAE,SAAS,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAKD,QAAA,MAAM,eAAe,
|
|
1
|
+
{"version":3,"file":"DropdownWrapper.d.ts","sourceRoot":"","sources":["../../src/components/DropdownWrapper.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAKZ,SAAS,EAMV,MAAM,OAAO,CAAC;AAEf,OAAO,EAOL,SAAS,EACV,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAE/D,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,OAAO,EAAE,SAAS,CAAC;IACnB,QAAQ,EAAE,SAAS,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAKD,QAAA,MAAM,eAAe,6FAiuBpB,CAAC;AAGF,OAAO,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
-
import React, { useState, useRef, useEffect,
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
+
import React, { useState, useRef, useEffect, forwardRef, useImperativeHandle, useCallback, } from "react";
|
|
4
4
|
import { createPortal } from "react-dom";
|
|
5
5
|
import { useFloating, shift, offset, flip, size, autoUpdate, } from "@floating-ui/react-dom";
|
|
6
|
-
import { Flex, Dropdown, Column, Row, FocusTrap, ArrowNavigation } from ".";
|
|
6
|
+
import { Flex, Dropdown, Column, Row, FocusTrap, ArrowNavigation, ScrollLock } from ".";
|
|
7
7
|
import styles from "./DropdownWrapper.module.scss";
|
|
8
8
|
// Global state to track the last opened dropdown
|
|
9
9
|
let dropdownCounter = 0;
|
|
@@ -103,52 +103,6 @@ const DropdownWrapper = forwardRef(({ trigger, dropdown, selectedOption, minHeig
|
|
|
103
103
|
}, [mounted]);
|
|
104
104
|
// Store the previously focused element to restore focus when dropdown closes
|
|
105
105
|
const previouslyFocusedElement = useRef(null);
|
|
106
|
-
// Lock/unlock body scroll when dropdown opens/closes
|
|
107
|
-
useLayoutEffect(() => {
|
|
108
|
-
if (isOpen) {
|
|
109
|
-
// Store current scroll position
|
|
110
|
-
const scrollY = window.scrollY;
|
|
111
|
-
const scrollX = window.scrollX;
|
|
112
|
-
// Prevent scroll via events instead of hiding overflow
|
|
113
|
-
const preventScroll = (e) => {
|
|
114
|
-
// Allow scroll if it's inside the dropdown content
|
|
115
|
-
const target = e.target;
|
|
116
|
-
if (dropdownRef.current?.contains(target)) {
|
|
117
|
-
return; // Allow dropdown content to scroll
|
|
118
|
-
}
|
|
119
|
-
e.preventDefault();
|
|
120
|
-
e.stopPropagation();
|
|
121
|
-
// Restore scroll position if it changed
|
|
122
|
-
window.scrollTo(scrollX, scrollY);
|
|
123
|
-
};
|
|
124
|
-
// Add event listeners to prevent scrolling on page body
|
|
125
|
-
document.body.addEventListener('wheel', preventScroll, { passive: false });
|
|
126
|
-
document.body.addEventListener('touchmove', preventScroll, { passive: false });
|
|
127
|
-
window.addEventListener('scroll', preventScroll, { passive: false });
|
|
128
|
-
// Prevent keyboard scrolling
|
|
129
|
-
const preventKeyScroll = (e) => {
|
|
130
|
-
const ke = e;
|
|
131
|
-
const scrollKeys = ['ArrowUp', 'ArrowDown', 'PageUp', 'PageDown', 'Home', 'End', ' '];
|
|
132
|
-
if (scrollKeys.includes(ke.key)) {
|
|
133
|
-
// Allow keyboard scroll if focus is inside dropdown
|
|
134
|
-
const target = ke.target;
|
|
135
|
-
if (dropdownRef.current?.contains(target)) {
|
|
136
|
-
return; // Allow dropdown content to scroll with keyboard
|
|
137
|
-
}
|
|
138
|
-
ke.preventDefault();
|
|
139
|
-
window.scrollTo(scrollX, scrollY);
|
|
140
|
-
}
|
|
141
|
-
};
|
|
142
|
-
window.addEventListener('keydown', preventKeyScroll);
|
|
143
|
-
return () => {
|
|
144
|
-
// Remove all event listeners
|
|
145
|
-
document.body.removeEventListener('wheel', preventScroll);
|
|
146
|
-
document.body.removeEventListener('touchmove', preventScroll);
|
|
147
|
-
window.removeEventListener('scroll', preventScroll);
|
|
148
|
-
window.removeEventListener('keydown', preventKeyScroll);
|
|
149
|
-
};
|
|
150
|
-
}
|
|
151
|
-
}, [isOpen]);
|
|
152
106
|
// Force update when dropdown opens
|
|
153
107
|
useEffect(() => {
|
|
154
108
|
if (isOpen && mounted) {
|
|
@@ -412,139 +366,139 @@ const DropdownWrapper = forwardRef(({ trigger, dropdown, selectedOption, minHeig
|
|
|
412
366
|
// Arrow key navigation will be handled by ArrowNavigation component
|
|
413
367
|
// Enter/Space key selection will be handled by ArrowNavigation component
|
|
414
368
|
}, [isOpen, handleOpenChange, handleArrowNavigation]);
|
|
415
|
-
return (_jsxs(Column, { fillWidth: fillWidth, fitWidth: !fillWidth, transition: "macro-medium", style: {
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
? undefined
|
|
419
|
-
: (e) => {
|
|
420
|
-
if (!isOpen) {
|
|
421
|
-
handleOpenChange(true);
|
|
422
|
-
return;
|
|
423
|
-
}
|
|
424
|
-
}, onKeyDown: handleKeyDown, tabIndex: -1, role: "button", "aria-haspopup": "listbox", "aria-expanded": isOpen, "data-role": "dropdown-wrapper", children: [_jsx(Row, { ref: triggerRef, fillWidth: fillWidth, fitWidth: !fillWidth, onClick: disableTriggerClick
|
|
369
|
+
return (_jsxs(_Fragment, { children: [_jsx(ScrollLock, { enabled: isOpen, allowScrollInElement: dropdownRef }), _jsxs(Column, { fillWidth: fillWidth, fitWidth: !fillWidth, transition: "macro-medium", style: {
|
|
370
|
+
...style,
|
|
371
|
+
}, className: className, ref: wrapperRef, onClick: disableTriggerClick
|
|
425
372
|
? undefined
|
|
426
373
|
: (e) => {
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
handleOpenChange(false);
|
|
374
|
+
if (!isOpen) {
|
|
375
|
+
handleOpenChange(true);
|
|
430
376
|
return;
|
|
431
377
|
}
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
createPortal(_jsx(FocusTrap, { active: isOpen, onEscape: () => handleOpenChange(false), autoFocus: true, restoreFocus: true, children: handleArrowNavigation ? (_jsx(ArrowNavigation, { layout: navigationLayout, itemCount: optionsCount, columns: typeof columns === "string" ? parseInt(columns, 10) || 8 : columns, onSelect: handleOptionSelect, onFocusChange: handleFocusChange, wrap: true, autoFocus: true, initialFocusedIndex: focusedIndex, itemSelector: '.option, [role="option"], [data-value]', role: navigationLayout === "grid" ? "grid" : "listbox", "aria-label": "Dropdown options", disabled: window.lastOpenedDropdown !== dropdownId.current, children: _jsx(Flex, { zIndex: 9, className: `${styles.fadeIn} dropdown-portal`, minWidth: minWidth, ref: dropdownRef, style: {
|
|
439
|
-
position: strategy,
|
|
440
|
-
top: y ?? 0,
|
|
441
|
-
left: x ?? 0,
|
|
442
|
-
}, "data-role": "dropdown-portal", "data-is-dropdown": "true", "data-dropdown-id": dropdownId.current, "data-is-active": window.lastOpenedDropdown === dropdownId.current, onKeyDown: (e) => {
|
|
443
|
-
// If handleArrowNavigation is false, let all keyboard events pass through
|
|
444
|
-
if (!handleArrowNavigation) {
|
|
378
|
+
}, onKeyDown: handleKeyDown, tabIndex: -1, role: "button", "aria-haspopup": "listbox", "aria-expanded": isOpen, "data-role": "dropdown-wrapper", children: [_jsx(Row, { ref: triggerRef, fillWidth: fillWidth, fitWidth: !fillWidth, onClick: disableTriggerClick
|
|
379
|
+
? undefined
|
|
380
|
+
: (e) => {
|
|
381
|
+
// If already open, close on trigger click
|
|
382
|
+
if (isOpen) {
|
|
383
|
+
handleOpenChange(false);
|
|
445
384
|
return;
|
|
446
385
|
}
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
}, children: _jsx(Dropdown, { minWidth: minWidth, radius: "l", padding: "0", selectedOption: selectedOption, onSelect: (value) => {
|
|
478
|
-
onSelect?.(value);
|
|
479
|
-
if (closeAfterClick) {
|
|
480
|
-
handleOpenChange(false);
|
|
481
|
-
setFocusedIndex(-1);
|
|
482
|
-
}
|
|
483
|
-
}, children: React.Children.map(dropdown, (child) => {
|
|
484
|
-
if (React.isValidElement(child)) {
|
|
485
|
-
// Only add onClick handler to elements that have data-value or are interactive
|
|
486
|
-
const childElement = child;
|
|
487
|
-
const hasDataValue = childElement.props["data-value"] ||
|
|
488
|
-
childElement.props.value ||
|
|
489
|
-
childElement.type === "button" ||
|
|
490
|
-
childElement.props.role === "option";
|
|
491
|
-
if (hasDataValue) {
|
|
492
|
-
// Cast the child element to any to avoid TypeScript errors with unknown props
|
|
493
|
-
return React.cloneElement(childElement, {
|
|
494
|
-
onClick: (val) => {
|
|
495
|
-
onSelect?.(val);
|
|
496
|
-
if (closeAfterClick) {
|
|
497
|
-
handleOpenChange(false);
|
|
498
|
-
setFocusedIndex(-1);
|
|
499
|
-
}
|
|
500
|
-
},
|
|
501
|
-
});
|
|
386
|
+
handleOpenChange(true);
|
|
387
|
+
}, onKeyDown: (e) => {
|
|
388
|
+
handleKeyDown(e);
|
|
389
|
+
}, role: "button", "data-is-dropdown": "true", "aria-haspopup": "true", "aria-expanded": isOpen, className: "dropdown-trigger", children: trigger }), isOpen &&
|
|
390
|
+
dropdown &&
|
|
391
|
+
isBrowser &&
|
|
392
|
+
createPortal(_jsx(FocusTrap, { active: isOpen, onEscape: () => handleOpenChange(false), autoFocus: true, restoreFocus: true, children: handleArrowNavigation ? (_jsx(ArrowNavigation, { layout: navigationLayout, itemCount: optionsCount, columns: typeof columns === "string" ? parseInt(columns, 10) || 8 : columns, onSelect: handleOptionSelect, onFocusChange: handleFocusChange, wrap: true, autoFocus: true, initialFocusedIndex: focusedIndex, itemSelector: '.option, [role="option"], [data-value]', role: navigationLayout === "grid" ? "grid" : "listbox", "aria-label": "Dropdown options", disabled: window.lastOpenedDropdown !== dropdownId.current, children: _jsx(Flex, { zIndex: 9, className: `${styles.fadeIn} dropdown-portal`, minWidth: minWidth, ref: dropdownRef, style: {
|
|
393
|
+
position: strategy,
|
|
394
|
+
top: y ?? 0,
|
|
395
|
+
left: x ?? 0,
|
|
396
|
+
}, "data-role": "dropdown-portal", "data-is-dropdown": "true", "data-dropdown-id": dropdownId.current, "data-is-active": window.lastOpenedDropdown === dropdownId.current, onKeyDown: (e) => {
|
|
397
|
+
// If handleArrowNavigation is false, let all keyboard events pass through
|
|
398
|
+
if (!handleArrowNavigation) {
|
|
399
|
+
return;
|
|
400
|
+
}
|
|
401
|
+
// Let FocusTrap handle Tab key
|
|
402
|
+
// Let ArrowNavigation handle arrow keys
|
|
403
|
+
if (e.key !== "Tab" &&
|
|
404
|
+
e.key !== "ArrowUp" &&
|
|
405
|
+
e.key !== "ArrowDown" &&
|
|
406
|
+
e.key !== "ArrowLeft" &&
|
|
407
|
+
e.key !== "ArrowRight") {
|
|
408
|
+
handleKeyDown(e);
|
|
409
|
+
}
|
|
410
|
+
}, onMouseDown: (e) => {
|
|
411
|
+
// Allow interactive elements (inputs, buttons, etc.) to work normally
|
|
412
|
+
const target = e.target;
|
|
413
|
+
const isInteractive = target.closest('input, textarea, select, button, [role="button"], a');
|
|
414
|
+
if (!isInteractive) {
|
|
415
|
+
e.preventDefault();
|
|
502
416
|
}
|
|
503
|
-
|
|
504
|
-
|
|
417
|
+
}, onPointerDown: (e) => {
|
|
418
|
+
// Allow interactive elements (inputs, buttons, etc.) to work normally
|
|
419
|
+
const target = e.target;
|
|
420
|
+
const isInteractive = target.closest('input, textarea, select, button, [role="button"], a');
|
|
421
|
+
if (!isInteractive) {
|
|
422
|
+
e.preventDefault();
|
|
423
|
+
}
|
|
424
|
+
}, onTouchStart: (e) => {
|
|
425
|
+
// Allow interactive elements (inputs, buttons, etc.) to work normally
|
|
426
|
+
const target = e.target;
|
|
427
|
+
const isInteractive = target.closest('input, textarea, select, button, [role="button"], a');
|
|
428
|
+
if (!isInteractive) {
|
|
429
|
+
e.preventDefault();
|
|
430
|
+
}
|
|
431
|
+
}, children: _jsx(Dropdown, { minWidth: minWidth, radius: "l", padding: "0", selectedOption: selectedOption, onSelect: (value) => {
|
|
432
|
+
onSelect?.(value);
|
|
433
|
+
if (closeAfterClick) {
|
|
434
|
+
handleOpenChange(false);
|
|
435
|
+
setFocusedIndex(-1);
|
|
436
|
+
}
|
|
437
|
+
}, children: React.Children.map(dropdown, (child) => {
|
|
438
|
+
if (React.isValidElement(child)) {
|
|
439
|
+
// Only add onClick handler to elements that have data-value or are interactive
|
|
440
|
+
const childElement = child;
|
|
441
|
+
const hasDataValue = childElement.props["data-value"] ||
|
|
442
|
+
childElement.props.value ||
|
|
443
|
+
childElement.type === "button" ||
|
|
444
|
+
childElement.props.role === "option";
|
|
445
|
+
if (hasDataValue) {
|
|
446
|
+
// Cast the child element to any to avoid TypeScript errors with unknown props
|
|
447
|
+
return React.cloneElement(childElement, {
|
|
448
|
+
onClick: (val) => {
|
|
449
|
+
onSelect?.(val);
|
|
450
|
+
if (closeAfterClick) {
|
|
451
|
+
handleOpenChange(false);
|
|
452
|
+
setFocusedIndex(-1);
|
|
453
|
+
}
|
|
454
|
+
},
|
|
455
|
+
});
|
|
456
|
+
}
|
|
457
|
+
// Return the child unchanged if it doesn't need an onClick handler
|
|
458
|
+
return child;
|
|
459
|
+
}
|
|
460
|
+
return child;
|
|
461
|
+
}) }) }) })) : (_jsx(Flex, { zIndex: 9, className: `${styles.fadeIn} dropdown-portal`, minWidth: minWidth, ref: dropdownRef, style: {
|
|
462
|
+
position: strategy,
|
|
463
|
+
top: y ?? 0,
|
|
464
|
+
left: x ?? 0,
|
|
465
|
+
}, "data-role": "dropdown-portal", "data-is-dropdown": "true", "data-dropdown-id": dropdownId.current, "data-is-active": window.lastOpenedDropdown === dropdownId.current, onKeyDown: (e) => {
|
|
466
|
+
// If handleArrowNavigation is false, let all keyboard events pass through
|
|
467
|
+
if (!handleArrowNavigation) {
|
|
468
|
+
return;
|
|
505
469
|
}
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
if (!isInteractive) {
|
|
539
|
-
e.preventDefault();
|
|
540
|
-
}
|
|
541
|
-
}, children: _jsx(Dropdown, { minWidth: minWidth, radius: "l", padding: "0", selectedOption: selectedOption, onSelect: (value) => {
|
|
542
|
-
onSelect?.(value);
|
|
543
|
-
if (closeAfterClick) {
|
|
544
|
-
handleOpenChange(false);
|
|
545
|
-
setFocusedIndex(-1);
|
|
546
|
-
}
|
|
547
|
-
}, children: dropdown }) })) }), document.body)] }));
|
|
470
|
+
// Let FocusTrap handle Tab key
|
|
471
|
+
if (e.key !== "Tab") {
|
|
472
|
+
handleKeyDown(e);
|
|
473
|
+
}
|
|
474
|
+
}, onMouseDown: (e) => {
|
|
475
|
+
// Allow interactive elements (inputs, buttons, etc.) to work normally
|
|
476
|
+
const target = e.target;
|
|
477
|
+
const isInteractive = target.closest('input, textarea, select, button, [role="button"], a');
|
|
478
|
+
if (!isInteractive) {
|
|
479
|
+
e.preventDefault();
|
|
480
|
+
}
|
|
481
|
+
}, onPointerDown: (e) => {
|
|
482
|
+
// Allow interactive elements (inputs, buttons, etc.) to work normally
|
|
483
|
+
const target = e.target;
|
|
484
|
+
const isInteractive = target.closest('input, textarea, select, button, [role="button"], a');
|
|
485
|
+
if (!isInteractive) {
|
|
486
|
+
e.preventDefault();
|
|
487
|
+
}
|
|
488
|
+
}, onTouchStart: (e) => {
|
|
489
|
+
// Allow interactive elements (inputs, buttons, etc.) to work normally
|
|
490
|
+
const target = e.target;
|
|
491
|
+
const isInteractive = target.closest('input, textarea, select, button, [role="button"], a');
|
|
492
|
+
if (!isInteractive) {
|
|
493
|
+
e.preventDefault();
|
|
494
|
+
}
|
|
495
|
+
}, children: _jsx(Dropdown, { minWidth: minWidth, radius: "l", padding: "0", selectedOption: selectedOption, onSelect: (value) => {
|
|
496
|
+
onSelect?.(value);
|
|
497
|
+
if (closeAfterClick) {
|
|
498
|
+
handleOpenChange(false);
|
|
499
|
+
setFocusedIndex(-1);
|
|
500
|
+
}
|
|
501
|
+
}, children: dropdown }) })) }), document.body)] })] }));
|
|
548
502
|
});
|
|
549
503
|
DropdownWrapper.displayName = "DropdownWrapper";
|
|
550
504
|
export { DropdownWrapper };
|