@sanity/ui 2.6.4-canary.2 → 2.6.4
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/index.d.mts +6 -42
- package/dist/index.d.ts +6 -42
- package/dist/index.esm.js +156 -90
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +154 -88
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +156 -90
- package/dist/index.mjs.map +1 -1
- package/package.json +34 -26
- package/src/core/components/breadcrumbs/breadcrumbs.tsx +6 -15
- package/src/core/components/dialog/dialog.tsx +21 -12
- package/src/core/components/menu/menu.tsx +18 -11
- package/src/core/components/menu/menuButton.tsx +1 -1
- package/src/core/components/menu/menuContext.ts +1 -1
- package/src/core/components/menu/useMenuController.ts +17 -11
- package/src/core/components/toast/styles.ts +1 -2
- package/src/core/components/toast/useToast.ts +0 -1
- package/src/core/components/tree/tree.tsx +0 -1
- package/src/core/components/tree/treeItem.tsx +0 -1
- package/src/core/helpers/focus.ts +0 -1
- package/src/core/helpers/scroll.ts +0 -1
- package/src/core/hooks/_internal/index.ts +1 -0
- package/src/core/hooks/_internal/useUnique.ts +34 -0
- package/src/core/hooks/index.ts +2 -3
- package/src/core/hooks/useClickOutside.ts +72 -38
- package/src/core/hooks/useElementSize.ts +0 -1
- package/src/core/hooks/useMediaIndex/useMediaIndex.ts +10 -2
- package/src/core/hooks/usePrefersDark.ts +55 -10
- package/src/core/hooks/usePrefersReducedMotion.ts +56 -10
- package/src/core/primitives/popover/__workshop__/AlignedStory.tsx +7 -9
- package/src/core/primitives/tooltip/__workshop__/customPortal.tsx +6 -8
- package/src/core/primitives/tooltip/tooltip.tsx +21 -25
- package/src/core/primitives/tooltip/tooltipDelayGroup/tooltipDelayGroupProvider.tsx +0 -1
- package/src/core/utils/layer/layerProvider.tsx +0 -1
- package/src/core/utils/portal/__workshop__/named.tsx +8 -10
- package/src/core/utils/portal/portalProvider.tsx +3 -2
- package/src/core/hooks/useMatchMedia.ts +0 -46
package/dist/index.js
CHANGED
|
@@ -126,26 +126,45 @@ function useArrayProp(val, defaultVal) {
|
|
|
126
126
|
[__perf_hash__]
|
|
127
127
|
);
|
|
128
128
|
}
|
|
129
|
+
function _getElements(element, elementsArg) {
|
|
130
|
+
const ret = [element];
|
|
131
|
+
for (const el of elementsArg)
|
|
132
|
+
Array.isArray(el) ? ret.push(...el) : ret.push(el);
|
|
133
|
+
return ret.filter(Boolean);
|
|
134
|
+
}
|
|
129
135
|
function useClickOutside(listener, elementsArg = EMPTY_ARRAY, boundaryElement) {
|
|
130
|
-
const
|
|
131
|
-
|
|
132
|
-
|
|
136
|
+
const [element, setElement] = react.useState(null), [elements, setElements] = react.useState(() => _getElements(element, elementsArg)), elementsRef = react.useRef(elements);
|
|
137
|
+
return react.useEffect(() => {
|
|
138
|
+
const prevElements = elementsRef.current, nextElements = _getElements(element, elementsArg);
|
|
139
|
+
if (prevElements.length !== nextElements.length) {
|
|
140
|
+
setElements(nextElements), elementsRef.current = nextElements;
|
|
133
141
|
return;
|
|
134
|
-
|
|
135
|
-
for (const el of
|
|
136
|
-
if (
|
|
142
|
+
}
|
|
143
|
+
for (const el of prevElements)
|
|
144
|
+
if (!nextElements.includes(el)) {
|
|
145
|
+
setElements(nextElements), elementsRef.current = nextElements;
|
|
137
146
|
return;
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
147
|
+
}
|
|
148
|
+
for (const el of nextElements)
|
|
149
|
+
if (!prevElements.includes(el)) {
|
|
150
|
+
setElements(nextElements), elementsRef.current = nextElements;
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
}, [element, elementsArg]), react.useEffect(() => {
|
|
154
|
+
if (!listener) return;
|
|
155
|
+
const handleWindowMouseDown = (evt) => {
|
|
156
|
+
const target = evt.target;
|
|
157
|
+
if (target instanceof Node && !(boundaryElement && !boundaryElement.contains(target))) {
|
|
158
|
+
for (const el of elements)
|
|
159
|
+
if (target === el || el.contains(target))
|
|
160
|
+
return;
|
|
161
|
+
listener(evt);
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
return window.addEventListener("mousedown", handleWindowMouseDown), () => {
|
|
165
|
+
window.removeEventListener("mousedown", handleWindowMouseDown);
|
|
166
|
+
};
|
|
167
|
+
}, [boundaryElement, listener, elements]), setElement;
|
|
149
168
|
}
|
|
150
169
|
var resizeObservers = [], hasActiveObservations = function() {
|
|
151
170
|
return resizeObservers.some(function(ro) {
|
|
@@ -480,27 +499,9 @@ function useElementRect(element) {
|
|
|
480
499
|
const elementSize = useElementSize(element);
|
|
481
500
|
return (elementSize == null ? void 0 : elementSize._contentRect) || null;
|
|
482
501
|
}
|
|
483
|
-
function useForwardedRef(ref) {
|
|
484
|
-
const innerRef = react.useRef(null);
|
|
485
|
-
return react.useImperativeHandle(ref, () => innerRef.current), innerRef;
|
|
486
|
-
}
|
|
487
502
|
function useGlobalKeyDown(onKeyDown) {
|
|
488
503
|
return react.useEffect(() => (addEventListener("keydown", onKeyDown), () => removeEventListener("keydown", onKeyDown)), [onKeyDown]);
|
|
489
504
|
}
|
|
490
|
-
function useMatchMedia(mediaQueryString, getServerSnapshot2) {
|
|
491
|
-
const { subscribe: subscribe2, getSnapshot } = react.useMemo(() => {
|
|
492
|
-
let MEDIA_QUERY_CACHE;
|
|
493
|
-
const getMatchMedia = () => (MEDIA_QUERY_CACHE || (MEDIA_QUERY_CACHE = window.matchMedia(mediaQueryString)), MEDIA_QUERY_CACHE);
|
|
494
|
-
return {
|
|
495
|
-
subscribe: (onStoreChange) => {
|
|
496
|
-
const matchMedia = getMatchMedia();
|
|
497
|
-
return matchMedia.addEventListener("change", onStoreChange), () => matchMedia.removeEventListener("change", onStoreChange);
|
|
498
|
-
},
|
|
499
|
-
getSnapshot: () => getMatchMedia().matches
|
|
500
|
-
};
|
|
501
|
-
}, [mediaQueryString]);
|
|
502
|
-
return react.useDebugValue(mediaQueryString), react.useSyncExternalStore(subscribe2, getSnapshot, getServerSnapshot2);
|
|
503
|
-
}
|
|
504
505
|
function getGlobalScope() {
|
|
505
506
|
if (typeof globalThis < "u") return globalThis;
|
|
506
507
|
if (typeof window < "u") return window;
|
|
@@ -543,6 +544,7 @@ function useTheme() {
|
|
|
543
544
|
function useTheme_v2() {
|
|
544
545
|
return theme.getTheme_v2(styledComponents.useTheme());
|
|
545
546
|
}
|
|
547
|
+
const MEDIA_STORE_CACHE = /* @__PURE__ */ new WeakMap();
|
|
546
548
|
function _getMediaQuery(media, index) {
|
|
547
549
|
return index === 0 ? `screen and (max-width: ${media[index] - 1}px)` : index === media.length ? `screen and (min-width: ${media[index - 1]}px)` : `screen and (min-width: ${media[index - 1]}px) and (max-width: ${media[index] - 1}px)`;
|
|
548
550
|
}
|
|
@@ -577,18 +579,57 @@ function _createMediaStore(media) {
|
|
|
577
579
|
};
|
|
578
580
|
} };
|
|
579
581
|
}
|
|
580
|
-
function getServerSnapshot() {
|
|
582
|
+
function getServerSnapshot$2() {
|
|
581
583
|
return 0;
|
|
582
584
|
}
|
|
583
585
|
function useMediaIndex() {
|
|
584
|
-
const { media } = useTheme_v2()
|
|
585
|
-
|
|
586
|
+
const { media } = useTheme_v2();
|
|
587
|
+
let store = MEDIA_STORE_CACHE.get(media);
|
|
588
|
+
return store || (store = _createMediaStore(media), MEDIA_STORE_CACHE.set(media, store)), react.useSyncExternalStore(store.subscribe, store.getSnapshot, getServerSnapshot$2);
|
|
589
|
+
}
|
|
590
|
+
let MEDIA_QUERY_CACHE$1;
|
|
591
|
+
function getMatchMedia$1() {
|
|
592
|
+
return MEDIA_QUERY_CACHE$1 || (MEDIA_QUERY_CACHE$1 = window.matchMedia("(prefers-color-scheme: dark)")), MEDIA_QUERY_CACHE$1;
|
|
586
593
|
}
|
|
587
|
-
function
|
|
588
|
-
|
|
594
|
+
function subscribe$2(onStoreChange) {
|
|
595
|
+
const matchMedia = getMatchMedia$1();
|
|
596
|
+
return matchMedia.addEventListener("change", onStoreChange), () => matchMedia.removeEventListener("change", onStoreChange);
|
|
589
597
|
}
|
|
590
|
-
function
|
|
591
|
-
return
|
|
598
|
+
function getSnapshot$1() {
|
|
599
|
+
return getMatchMedia$1().matches;
|
|
600
|
+
}
|
|
601
|
+
function getServerSnapshot$1() {
|
|
602
|
+
return !1;
|
|
603
|
+
}
|
|
604
|
+
function usePrefersDark() {
|
|
605
|
+
return react.useSyncExternalStore(subscribe$2, getSnapshot$1, getServerSnapshot$1);
|
|
606
|
+
}
|
|
607
|
+
let MEDIA_QUERY_CACHE;
|
|
608
|
+
function getMatchMedia() {
|
|
609
|
+
return MEDIA_QUERY_CACHE || (MEDIA_QUERY_CACHE = window.matchMedia("(prefers-reduced-motion: reduce)")), MEDIA_QUERY_CACHE;
|
|
610
|
+
}
|
|
611
|
+
function subscribe$1(onStoreChange) {
|
|
612
|
+
const matchMedia = getMatchMedia();
|
|
613
|
+
return matchMedia.addEventListener("change", onStoreChange), () => matchMedia.removeEventListener("change", onStoreChange);
|
|
614
|
+
}
|
|
615
|
+
function getSnapshot() {
|
|
616
|
+
return getMatchMedia().matches;
|
|
617
|
+
}
|
|
618
|
+
function getServerSnapshot() {
|
|
619
|
+
return !1;
|
|
620
|
+
}
|
|
621
|
+
function usePrefersReducedMotion() {
|
|
622
|
+
return react.useSyncExternalStore(subscribe$1, getSnapshot, getServerSnapshot);
|
|
623
|
+
}
|
|
624
|
+
function useForwardedRef(ref) {
|
|
625
|
+
const innerRef = react.useRef(null);
|
|
626
|
+
return react.useImperativeHandle(ref, () => innerRef.current), innerRef;
|
|
627
|
+
}
|
|
628
|
+
function useCustomValidity(ref, customValidity) {
|
|
629
|
+
react.useEffect(() => {
|
|
630
|
+
var _a;
|
|
631
|
+
(_a = ref.current) == null || _a.setCustomValidity(customValidity || "");
|
|
632
|
+
}, [customValidity, ref]);
|
|
592
633
|
}
|
|
593
634
|
function responsiveBorderStyle() {
|
|
594
635
|
return [border, borderTop, borderRight, borderBottom, borderLeft];
|
|
@@ -3014,6 +3055,16 @@ function Portal(props) {
|
|
|
3014
3055
|
const { children, __unstable_name: name } = props, portal = usePortal(), portalElement = (name ? portal.elements && portal.elements[name] : portal.element) || ((_a = portal.elements) == null ? void 0 : _a.default);
|
|
3015
3056
|
return portalElement ? reactDom.createPortal(children, portalElement) : null;
|
|
3016
3057
|
}
|
|
3058
|
+
function useUnique(value) {
|
|
3059
|
+
const valueRef = react.useRef(value);
|
|
3060
|
+
return _isEqual(valueRef.current, value) || (valueRef.current = value), valueRef.current;
|
|
3061
|
+
}
|
|
3062
|
+
function _isEqual(objA, objB) {
|
|
3063
|
+
if (!objA || !objB)
|
|
3064
|
+
return objA === objB;
|
|
3065
|
+
const keysA = Object.keys(objA), keysB = Object.keys(objB);
|
|
3066
|
+
return keysA.length !== keysB.length ? !1 : keysA.every((key2) => objA[key2] === objB[key2]);
|
|
3067
|
+
}
|
|
3017
3068
|
function useMounted() {
|
|
3018
3069
|
return react.useSyncExternalStore(
|
|
3019
3070
|
subscribe,
|
|
@@ -3024,7 +3075,7 @@ function useMounted() {
|
|
|
3024
3075
|
const subscribe = () => () => {
|
|
3025
3076
|
};
|
|
3026
3077
|
function PortalProvider(props) {
|
|
3027
|
-
const { boundaryElement, children, element, __unstable_elements:
|
|
3078
|
+
const { boundaryElement, children, element, __unstable_elements: elementsProp } = props, elements = useUnique(elementsProp), mounted = useMounted(), value = react.useMemo(() => ({
|
|
3028
3079
|
version: 0,
|
|
3029
3080
|
boundaryElement: boundaryElement || null,
|
|
3030
3081
|
element: element || mounted ? document.body : null,
|
|
@@ -4287,6 +4338,7 @@ function TooltipDelayGroupProvider(props) {
|
|
|
4287
4338
|
}
|
|
4288
4339
|
const Root$a = styledComponents.styled(Layer)`
|
|
4289
4340
|
pointer-events: none;
|
|
4341
|
+
max-width: ${({ $maxWidth }) => $maxWidth}px;
|
|
4290
4342
|
`, Tooltip = react.forwardRef(function(props, forwardedRef) {
|
|
4291
4343
|
var _a, _b, _c, _d, _e, _f, _g;
|
|
4292
4344
|
const boundaryElementContext = useBoundaryElement(), { layer } = useTheme_v2(), {
|
|
@@ -4308,21 +4360,18 @@ const Root$a = styledComponents.styled(Layer)`
|
|
|
4308
4360
|
...restProps
|
|
4309
4361
|
} = props, animate = usePrefersReducedMotion() ? !1 : _animate, fallbackPlacements = useArrayProp(fallbackPlacementsProp), ref = react.useRef(null), [referenceElement, setReferenceElement] = react.useState(null), arrowRef = react.useRef(null), rootBoundary = "viewport";
|
|
4310
4362
|
react.useImperativeHandle(forwardedRef, () => ref.current);
|
|
4311
|
-
const portal = usePortal(), portalElement = typeof portalProp == "string" ? ((_c = portal.elements) == null ? void 0 : _c[portalProp]) || null : portal.element,
|
|
4363
|
+
const portal = usePortal(), portalElement = typeof portalProp == "string" ? ((_c = portal.elements) == null ? void 0 : _c[portalProp]) || null : portal.element, mounted = useMounted(), tooltipWidth = react.useMemo(() => {
|
|
4364
|
+
const availableWidths = [
|
|
4365
|
+
...boundaryElement ? [boundaryElement.offsetWidth] : [],
|
|
4366
|
+
portalElement != null && portalElement.offsetWidth || mounted ? document.body.offsetWidth : (
|
|
4367
|
+
// We don't actually know what the width of the body is during SSR, so we'll just assume it's 800px or larger
|
|
4368
|
+
800
|
|
4369
|
+
)
|
|
4370
|
+
];
|
|
4371
|
+
return Math.min(...availableWidths) - DEFAULT_TOOLTIP_PADDING * 2;
|
|
4372
|
+
}, [boundaryElement, mounted, portalElement]), middleware = react.useMemo(() => {
|
|
4312
4373
|
const ret = [];
|
|
4313
4374
|
return ret.push(
|
|
4314
|
-
reactDom$1.size({
|
|
4315
|
-
apply({ elements }) {
|
|
4316
|
-
const availableWidths = [
|
|
4317
|
-
...boundaryElement ? [boundaryElement.offsetWidth] : [],
|
|
4318
|
-
(portalElement == null ? void 0 : portalElement.offsetWidth) || document.body.offsetWidth
|
|
4319
|
-
], tooltipWidth = Math.min(...availableWidths) - DEFAULT_TOOLTIP_PADDING * 2;
|
|
4320
|
-
Object.assign(elements.floating.style, {
|
|
4321
|
-
maxWidth: tooltipWidth > 0 ? `${tooltipWidth}px` : void 0
|
|
4322
|
-
});
|
|
4323
|
-
}
|
|
4324
|
-
})
|
|
4325
|
-
), ret.push(
|
|
4326
4375
|
reactDom$1.flip({
|
|
4327
4376
|
boundary: boundaryElement || void 0,
|
|
4328
4377
|
fallbackPlacements,
|
|
@@ -4336,7 +4385,7 @@ const Root$a = styledComponents.styled(Layer)`
|
|
|
4336
4385
|
padding: DEFAULT_TOOLTIP_PADDING
|
|
4337
4386
|
})
|
|
4338
4387
|
), arrowProp && ret.push(reactDom$1.arrow({ element: arrowRef, padding: DEFAULT_TOOLTIP_PADDING })), animate && ret.push(origin), ret;
|
|
4339
|
-
}, [animate, arrowProp, boundaryElement, fallbackPlacements
|
|
4388
|
+
}, [animate, arrowProp, boundaryElement, fallbackPlacements]), { floatingStyles, placement, middlewareData, refs, update } = reactDom$1.useFloating({
|
|
4340
4389
|
middleware,
|
|
4341
4390
|
placement: placementProp,
|
|
4342
4391
|
whileElementsMounted: reactDom$1.autoUpdate
|
|
@@ -4446,6 +4495,7 @@ const Root$a = styledComponents.styled(Layer)`
|
|
|
4446
4495
|
ref: setFloating,
|
|
4447
4496
|
style: floatingStyles,
|
|
4448
4497
|
zOffset,
|
|
4498
|
+
$maxWidth: tooltipWidth,
|
|
4449
4499
|
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
4450
4500
|
TooltipCard,
|
|
4451
4501
|
{
|
|
@@ -4911,8 +4961,8 @@ const AUTOCOMPLETE_LISTBOX_IGNORE_KEYS = [
|
|
|
4911
4961
|
appearance: none;
|
|
4912
4962
|
margin: -4px;
|
|
4913
4963
|
`, Breadcrumbs = react.forwardRef(function(props, ref) {
|
|
4914
|
-
const { children, maxLength, separator, space: spaceRaw = 2, ...restProps } = props, space = useArrayProp(spaceRaw), [open, setOpen] = react.useState(!1),
|
|
4915
|
-
useClickOutside(collapse,
|
|
4964
|
+
const { children, maxLength, separator, space: spaceRaw = 2, ...restProps } = props, space = useArrayProp(spaceRaw), [open, setOpen] = react.useState(!1), [expandElement, setExpandElement] = react.useState(null), [popoverElement, setPopoverElement] = react.useState(null), collapse = react.useCallback(() => setOpen(!1), []), expand = react.useCallback(() => setOpen(!0), []);
|
|
4965
|
+
useClickOutside(collapse, [expandElement, popoverElement]);
|
|
4916
4966
|
const rawItems = react.useMemo(() => react.Children.toArray(children).filter(react.isValidElement), [children]), items = react.useMemo(() => {
|
|
4917
4967
|
const len = rawItems.length;
|
|
4918
4968
|
if (maxLength && len > maxLength) {
|
|
@@ -4927,7 +4977,7 @@ const AUTOCOMPLETE_LISTBOX_IGNORE_KEYS = [
|
|
|
4927
4977
|
open,
|
|
4928
4978
|
placement: "top",
|
|
4929
4979
|
portal: !0,
|
|
4930
|
-
ref:
|
|
4980
|
+
ref: setPopoverElement,
|
|
4931
4981
|
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
4932
4982
|
ExpandButton,
|
|
4933
4983
|
{
|
|
@@ -4935,7 +4985,7 @@ const AUTOCOMPLETE_LISTBOX_IGNORE_KEYS = [
|
|
|
4935
4985
|
mode: "bleed",
|
|
4936
4986
|
onClick: open ? collapse : expand,
|
|
4937
4987
|
padding: 1,
|
|
4938
|
-
ref:
|
|
4988
|
+
ref: setExpandElement,
|
|
4939
4989
|
selected: open,
|
|
4940
4990
|
text: "\u2026"
|
|
4941
4991
|
}
|
|
@@ -5060,8 +5110,8 @@ const Root$7 = styledComponents.styled(Layer)(responsivePaddingStyle, dialogStyl
|
|
|
5060
5110
|
scheme,
|
|
5061
5111
|
shadow: shadowProp,
|
|
5062
5112
|
width: widthProp
|
|
5063
|
-
} = props, portal = usePortal(), portalElement = portalProp ? ((_a = portal.elements) == null ? void 0 : _a[portalProp]) || null : portal.element, boundaryElement = useBoundaryElement().element, radius = useArrayProp(radiusProp), shadow = useArrayProp(shadowProp), width = useArrayProp(widthProp), ref = react.useRef(null), contentRef = react.useRef(null), layer = useLayer(), { isTopLayer } = layer, labelId = `${id}_label`, showCloseButton = !!onClose && hideCloseButton === !1, showHeader = !!header || showCloseButton;
|
|
5064
|
-
|
|
5113
|
+
} = props, portal = usePortal(), portalElement = portalProp ? ((_a = portal.elements) == null ? void 0 : _a[portalProp]) || null : portal.element, boundaryElement = useBoundaryElement().element, radius = useArrayProp(radiusProp), shadow = useArrayProp(shadowProp), width = useArrayProp(widthProp), ref = react.useRef(null), [rootElement, setRootElement] = react.useState(null), contentRef = react.useRef(null), layer = useLayer(), { isTopLayer } = layer, labelId = `${id}_label`, showCloseButton = !!onClose && hideCloseButton === !1, showHeader = !!header || showCloseButton;
|
|
5114
|
+
react.useImperativeHandle(forwardedRef, () => ref.current), react.useImperativeHandle(
|
|
5065
5115
|
forwardedContentRef,
|
|
5066
5116
|
() => contentRef.current
|
|
5067
5117
|
), react.useEffect(() => {
|
|
@@ -5076,13 +5126,20 @@ const Root$7 = styledComponents.styled(Layer)(responsivePaddingStyle, dialogStyl
|
|
|
5076
5126
|
[boundaryElement, isTopLayer, onClose, portalElement]
|
|
5077
5127
|
)
|
|
5078
5128
|
), useClickOutside(
|
|
5079
|
-
(
|
|
5080
|
-
|
|
5081
|
-
|
|
5082
|
-
|
|
5083
|
-
|
|
5084
|
-
|
|
5085
|
-
|
|
5129
|
+
react.useCallback(
|
|
5130
|
+
(event) => {
|
|
5131
|
+
if (!isTopLayer || !onClickOutside) return;
|
|
5132
|
+
const target = event.target;
|
|
5133
|
+
target && !isTargetWithinScope(boundaryElement, portalElement, target) || onClickOutside();
|
|
5134
|
+
},
|
|
5135
|
+
[boundaryElement, isTopLayer, onClickOutside, portalElement]
|
|
5136
|
+
),
|
|
5137
|
+
[rootElement]
|
|
5138
|
+
);
|
|
5139
|
+
const setRef = react.useCallback((el) => {
|
|
5140
|
+
setRootElement(el), ref.current = el;
|
|
5141
|
+
}, []);
|
|
5142
|
+
return /* @__PURE__ */ jsxRuntime.jsx(DialogContainer, { "data-ui": "DialogCard", width, children: /* @__PURE__ */ jsxRuntime.jsx(DialogCardRoot, { radius, ref: setRef, scheme, shadow, children: /* @__PURE__ */ jsxRuntime.jsxs(DialogLayout, { direction: "column", children: [
|
|
5086
5143
|
showHeader && /* @__PURE__ */ jsxRuntime.jsx(DialogHeader, { children: /* @__PURE__ */ jsxRuntime.jsxs(Flex, { align: "center", padding: 3, children: [
|
|
5087
5144
|
/* @__PURE__ */ jsxRuntime.jsx(Box, { flex: 1, padding: 2, children: header && /* @__PURE__ */ jsxRuntime.jsx(Text, { id: labelId, size: 1, weight: "semibold", children: header }) }),
|
|
5088
5145
|
showCloseButton && /* @__PURE__ */ jsxRuntime.jsx(Box, { flex: "none", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -5260,13 +5317,13 @@ function _sortElements(rootElement, elements) {
|
|
|
5260
5317
|
elements.sort(_sort);
|
|
5261
5318
|
}
|
|
5262
5319
|
function useMenuController(props) {
|
|
5263
|
-
const { onKeyDown, originElement, shouldFocus
|
|
5320
|
+
const { onKeyDown, originElement, shouldFocus } = props, elementsRef = react.useRef([]), [rootElement, setRootElement] = react.useState(null), [activeIndex, _setActiveIndex] = react.useState(-1), activeIndexRef = react.useRef(activeIndex), activeElement = elementsRef.current[activeIndex] || null, mounted = !!rootElement, setActiveIndex = react.useCallback((nextActiveIndex) => {
|
|
5264
5321
|
_setActiveIndex(nextActiveIndex), activeIndexRef.current = nextActiveIndex;
|
|
5265
5322
|
}, []), mount = react.useCallback(
|
|
5266
5323
|
(element, selected) => {
|
|
5267
5324
|
if (!element) return () => {
|
|
5268
5325
|
};
|
|
5269
|
-
if (elementsRef.current.indexOf(element) === -1 && (elementsRef.current.push(element), _sortElements(
|
|
5326
|
+
if (elementsRef.current.indexOf(element) === -1 && (elementsRef.current.push(element), _sortElements(rootElement, elementsRef.current)), selected) {
|
|
5270
5327
|
const selectedIndex = elementsRef.current.indexOf(element);
|
|
5271
5328
|
setActiveIndex(selectedIndex);
|
|
5272
5329
|
}
|
|
@@ -5275,7 +5332,7 @@ function useMenuController(props) {
|
|
|
5275
5332
|
idx > -1 && elementsRef.current.splice(idx, 1);
|
|
5276
5333
|
};
|
|
5277
5334
|
},
|
|
5278
|
-
[
|
|
5335
|
+
[rootElement, setActiveIndex]
|
|
5279
5336
|
), handleKeyDown = react.useCallback(
|
|
5280
5337
|
(event) => {
|
|
5281
5338
|
if (event.key === "Tab") {
|
|
@@ -5330,13 +5387,13 @@ function useMenuController(props) {
|
|
|
5330
5387
|
},
|
|
5331
5388
|
[setActiveIndex]
|
|
5332
5389
|
), handleItemMouseLeave = react.useCallback(() => {
|
|
5333
|
-
|
|
5334
|
-
|
|
5335
|
-
}, [rootElementRef, setActiveIndex]);
|
|
5390
|
+
setActiveIndex(-2), rootElement == null || rootElement.focus();
|
|
5391
|
+
}, [setActiveIndex, rootElement]);
|
|
5336
5392
|
return react.useEffect(() => {
|
|
5337
5393
|
if (!mounted) return;
|
|
5338
5394
|
const rafId = window.requestAnimationFrame(() => {
|
|
5339
|
-
|
|
5395
|
+
const _activeIndex = activeIndexRef.current;
|
|
5396
|
+
if (_activeIndex === -1) {
|
|
5340
5397
|
if (shouldFocus === "first") {
|
|
5341
5398
|
const el = _getFocusableElements(elementsRef.current)[0];
|
|
5342
5399
|
if (el) {
|
|
@@ -5353,7 +5410,7 @@ function useMenuController(props) {
|
|
|
5353
5410
|
}
|
|
5354
5411
|
return;
|
|
5355
5412
|
}
|
|
5356
|
-
const element = elementsRef.current[
|
|
5413
|
+
const element = elementsRef.current[_activeIndex] || null;
|
|
5357
5414
|
element == null || element.focus();
|
|
5358
5415
|
});
|
|
5359
5416
|
return () => {
|
|
@@ -5365,7 +5422,9 @@ function useMenuController(props) {
|
|
|
5365
5422
|
handleItemMouseEnter,
|
|
5366
5423
|
handleItemMouseLeave,
|
|
5367
5424
|
handleKeyDown,
|
|
5368
|
-
mount
|
|
5425
|
+
mount,
|
|
5426
|
+
rootElement,
|
|
5427
|
+
setRootElement
|
|
5369
5428
|
};
|
|
5370
5429
|
}
|
|
5371
5430
|
const Root$5 = styledComponents.styled(Box)`
|
|
@@ -5397,18 +5456,23 @@ const Root$5 = styledComponents.styled(Box)`
|
|
|
5397
5456
|
handleItemMouseEnter,
|
|
5398
5457
|
handleItemMouseLeave,
|
|
5399
5458
|
handleKeyDown,
|
|
5400
|
-
mount
|
|
5401
|
-
|
|
5459
|
+
mount,
|
|
5460
|
+
rootElement,
|
|
5461
|
+
setRootElement
|
|
5462
|
+
} = useMenuController({ onKeyDown, originElement, shouldFocus }), handleRefChange = react.useCallback(
|
|
5402
5463
|
(el) => {
|
|
5403
|
-
|
|
5464
|
+
setRootElement(el), ref.current = el;
|
|
5404
5465
|
},
|
|
5405
|
-
[
|
|
5466
|
+
[setRootElement]
|
|
5406
5467
|
);
|
|
5407
5468
|
react.useEffect(() => {
|
|
5408
5469
|
onItemSelect && onItemSelect(activeIndex);
|
|
5409
5470
|
}, [activeIndex, onItemSelect]), useClickOutside(
|
|
5410
|
-
(
|
|
5411
|
-
|
|
5471
|
+
react.useCallback(
|
|
5472
|
+
(event) => isTopLayer && onClickOutside && onClickOutside(event),
|
|
5473
|
+
[isTopLayer, onClickOutside]
|
|
5474
|
+
),
|
|
5475
|
+
[rootElement]
|
|
5412
5476
|
), useGlobalKeyDown(
|
|
5413
5477
|
react.useCallback(
|
|
5414
5478
|
(event) => {
|
|
@@ -5416,7 +5480,10 @@ const Root$5 = styledComponents.styled(Box)`
|
|
|
5416
5480
|
},
|
|
5417
5481
|
[isTopLayer, onEscape]
|
|
5418
5482
|
)
|
|
5419
|
-
)
|
|
5483
|
+
), react.useEffect(() => {
|
|
5484
|
+
if (!(!rootElement || !registerElement))
|
|
5485
|
+
return registerElement(rootElement);
|
|
5486
|
+
}, [registerElement, rootElement]);
|
|
5420
5487
|
const value = react.useMemo(
|
|
5421
5488
|
() => ({
|
|
5422
5489
|
version: 0,
|
|
@@ -6092,7 +6159,7 @@ const CustomInline = styledComponents.styled(Inline)`
|
|
|
6092
6159
|
}
|
|
6093
6160
|
100% {
|
|
6094
6161
|
width: 100%;
|
|
6095
|
-
}
|
|
6162
|
+
}
|
|
6096
6163
|
`, LOADING_BAR_HEIGHT = 2;
|
|
6097
6164
|
function rootStyles(props) {
|
|
6098
6165
|
const { color } = getTheme_v2.getTheme_v2(props.theme), loadingBarColor = color.button.default[props.tone].enabled.bg;
|
|
@@ -6789,7 +6856,6 @@ exports.useElementSize = useElementSize;
|
|
|
6789
6856
|
exports.useForwardedRef = useForwardedRef;
|
|
6790
6857
|
exports.useGlobalKeyDown = useGlobalKeyDown;
|
|
6791
6858
|
exports.useLayer = useLayer;
|
|
6792
|
-
exports.useMatchMedia = useMatchMedia;
|
|
6793
6859
|
exports.useMediaIndex = useMediaIndex;
|
|
6794
6860
|
exports.usePortal = usePortal;
|
|
6795
6861
|
exports.usePrefersDark = usePrefersDark;
|