@kaizen/components 1.80.1 → 1.80.3
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/codemods/README.md +12 -0
- package/codemods/renameV2ComponentImportsAndUsages/index.ts +19 -0
- package/codemods/renameV2ComponentImportsAndUsages/renameV2ComponentImportsAndUsages.spec.ts +390 -0
- package/codemods/renameV2ComponentImportsAndUsages/renameV2ComponentImportsAndUsages.ts +230 -0
- package/codemods/utils/index.ts +1 -0
- package/codemods/utils/updateJsxElementTagName.spec.ts +129 -0
- package/codemods/utils/updateJsxElementTagName.ts +56 -0
- package/codemods/utils/updateKaioImports.spec.ts +82 -0
- package/codemods/utils/updateKaioImports.ts +16 -7
- package/dist/cjs/src/__alpha__/SingleSelect/SingleSelect.cjs +69 -16
- package/dist/cjs/src/__alpha__/SingleSelect/context/SingleSelectContext.cjs +13 -0
- package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/Popover/Popover.cjs +54 -0
- package/dist/cjs/src/__alpha__/SingleSelect/{SingleSelect.module.css.cjs → subcomponents/Popover/Popover.module.css.cjs} +1 -1
- package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/Popover/utils/usePopoverPositioning.cjs +94 -0
- package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/Popover/utils/usePositioningStyles.cjs +69 -0
- package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/Popover/utils/useSupportsAnchorPositioning.cjs +12 -0
- package/dist/cjs/src/__alpha__/SingleSelect/subcomponents/Trigger/Trigger.cjs +41 -5
- package/dist/esm/src/__alpha__/SingleSelect/SingleSelect.mjs +60 -10
- package/dist/esm/src/__alpha__/SingleSelect/context/SingleSelectContext.mjs +10 -0
- package/dist/esm/src/__alpha__/SingleSelect/subcomponents/Popover/Popover.mjs +49 -0
- package/dist/esm/src/__alpha__/SingleSelect/subcomponents/Popover/Popover.module.css.mjs +4 -0
- package/dist/esm/src/__alpha__/SingleSelect/subcomponents/Popover/utils/usePopoverPositioning.mjs +92 -0
- package/dist/esm/src/__alpha__/SingleSelect/subcomponents/Popover/utils/usePositioningStyles.mjs +67 -0
- package/dist/esm/src/__alpha__/SingleSelect/subcomponents/Popover/utils/useSupportsAnchorPositioning.mjs +10 -0
- package/dist/esm/src/__alpha__/SingleSelect/subcomponents/Trigger/Trigger.mjs +43 -7
- package/dist/styles.css +8958 -8934
- package/dist/types/__alpha__/SingleSelect/SingleSelect.d.ts +7 -9
- package/dist/types/__alpha__/SingleSelect/context/SingleSelectContext.d.ts +12 -0
- package/dist/types/__alpha__/SingleSelect/context/index.d.ts +1 -0
- package/dist/types/__alpha__/SingleSelect/subcomponents/List/List.d.ts +2 -1
- package/dist/types/__alpha__/SingleSelect/subcomponents/ListItem/ListItem.d.ts +2 -1
- package/dist/types/__alpha__/SingleSelect/subcomponents/ListSection/ListSection.d.ts +2 -1
- package/dist/types/__alpha__/SingleSelect/subcomponents/Popover/Popover.d.ts +6 -0
- package/dist/types/__alpha__/SingleSelect/subcomponents/Popover/index.d.ts +1 -0
- package/dist/types/__alpha__/SingleSelect/subcomponents/Popover/utils/index.d.ts +2 -0
- package/dist/types/__alpha__/SingleSelect/subcomponents/Popover/utils/usePopoverPositioning.d.ts +4 -0
- package/dist/types/__alpha__/SingleSelect/subcomponents/Popover/utils/usePositioningStyles.d.ts +4 -0
- package/dist/types/__alpha__/SingleSelect/subcomponents/Popover/utils/useSupportsAnchorPositioning.d.ts +1 -0
- package/dist/types/__alpha__/SingleSelect/subcomponents/Trigger/Trigger.d.ts +2 -1
- package/dist/types/__alpha__/SingleSelect/subcomponents/index.d.ts +1 -0
- package/dist/types/__alpha__/SingleSelect/types.d.ts +45 -0
- package/package.json +4 -4
- package/src/Notification/GlobalNotification/_docs/GlobalNotification.stickersheet.stories.tsx +2 -1
- package/src/Notification/InlineNotification/_docs/InlineNotification.stickersheet.stories.tsx +4 -1
- package/src/Notification/ToastNotification/_docs/ToastNotification.stickersheet.stories.tsx +20 -6
- package/src/Notification/subcomponents/GenericNotification/_mixins.scss +5 -3
- package/src/__alpha__/SingleSelect/SingleSelect.tsx +79 -14
- package/src/__alpha__/SingleSelect/_docs/SingleSelect.mdx +5 -2
- package/src/__alpha__/SingleSelect/_docs/SingleSelect.spec.stories.tsx +100 -0
- package/src/__alpha__/SingleSelect/_docs/SingleSelect.stickersheet.stories.tsx +4 -4
- package/src/__alpha__/SingleSelect/_docs/SingleSelect.stories.tsx +21 -2
- package/src/__alpha__/SingleSelect/context/SingleSelectContext.tsx +21 -0
- package/src/__alpha__/SingleSelect/context/index.ts +1 -0
- package/src/__alpha__/SingleSelect/subcomponents/List/List.module.css +0 -1
- package/src/__alpha__/SingleSelect/subcomponents/List/List.tsx +2 -1
- package/src/__alpha__/SingleSelect/subcomponents/ListItem/ListItem.module.css +7 -0
- package/src/__alpha__/SingleSelect/subcomponents/ListItem/ListItem.tsx +2 -1
- package/src/__alpha__/SingleSelect/subcomponents/ListSection/ListSection.tsx +3 -1
- package/src/__alpha__/SingleSelect/subcomponents/Popover/Popover.module.css +24 -0
- package/src/__alpha__/SingleSelect/subcomponents/Popover/Popover.tsx +54 -0
- package/src/__alpha__/SingleSelect/subcomponents/Popover/index.ts +1 -0
- package/src/__alpha__/SingleSelect/subcomponents/Popover/utils/index.ts +2 -0
- package/src/__alpha__/SingleSelect/subcomponents/Popover/utils/usePopoverPositioning.ts +108 -0
- package/src/__alpha__/SingleSelect/subcomponents/Popover/utils/usePositioningStyles.ts +75 -0
- package/src/__alpha__/SingleSelect/subcomponents/Popover/utils/useSupportsAnchorPositioning.ts +13 -0
- package/src/__alpha__/SingleSelect/subcomponents/Trigger/Trigger.module.css +1 -0
- package/src/__alpha__/SingleSelect/subcomponents/Trigger/Trigger.tsx +29 -7
- package/src/__alpha__/SingleSelect/subcomponents/index.ts +1 -0
- package/src/__alpha__/SingleSelect/types.ts +58 -0
- package/dist/esm/src/__alpha__/SingleSelect/SingleSelect.module.css.mjs +0 -4
- package/src/__alpha__/SingleSelect/SingleSelect.module.css +0 -9
- package/src/__alpha__/SingleSelect/SingleSelect.spec.tsx +0 -26
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var React = require('react');
|
|
4
|
+
var useSupportsAnchorPositioning = function () {
|
|
5
|
+
return React.useMemo(function () {
|
|
6
|
+
if (typeof window === 'undefined' || typeof CSS === 'undefined') {
|
|
7
|
+
return false;
|
|
8
|
+
}
|
|
9
|
+
return CSS.supports('position-anchor', 'auto') || CSS.supports('position-try-fallbacks: flip-block');
|
|
10
|
+
}, []);
|
|
11
|
+
};
|
|
12
|
+
exports.useSupportsAnchorPositioning = useSupportsAnchorPositioning;
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
var React = require('react');
|
|
4
4
|
var reactAriaComponents = require('react-aria-components');
|
|
5
5
|
var Icon = require('../../../../__next__/Icon/Icon.cjs');
|
|
6
|
+
var SingleSelectContext = require('../../context/SingleSelectContext.cjs');
|
|
6
7
|
var Trigger_module = require('./Trigger.module.css.cjs');
|
|
7
8
|
function _interopDefault(e) {
|
|
8
9
|
return e && e.__esModule ? e : {
|
|
@@ -10,12 +11,47 @@ function _interopDefault(e) {
|
|
|
10
11
|
};
|
|
11
12
|
}
|
|
12
13
|
var React__default = /*#__PURE__*/_interopDefault(React);
|
|
13
|
-
|
|
14
|
-
return
|
|
15
|
-
|
|
16
|
-
}
|
|
14
|
+
function flattenItems(items) {
|
|
15
|
+
return items.flatMap(function (item) {
|
|
16
|
+
return 'options' in item ? item.options : item;
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
var Trigger = function (_a) {
|
|
20
|
+
var buttonRef = _a.buttonRef;
|
|
21
|
+
var _b = SingleSelectContext.useSingleSelectContext(),
|
|
22
|
+
isOpen = _b.isOpen,
|
|
23
|
+
setOpen = _b.setOpen,
|
|
24
|
+
selectedKey = _b.selectedKey,
|
|
25
|
+
items = _b.items,
|
|
26
|
+
anchorName = _b.anchorName;
|
|
27
|
+
var flattenedItems = React.useMemo(function () {
|
|
28
|
+
return flattenItems(items);
|
|
29
|
+
}, [items]);
|
|
30
|
+
var selectedLabel = React.useMemo(function () {
|
|
31
|
+
var _a;
|
|
32
|
+
var key = selectedKey;
|
|
33
|
+
var item = flattenedItems.find(function (i) {
|
|
34
|
+
return i.value === key;
|
|
35
|
+
});
|
|
36
|
+
return (_a = item === null || item === void 0 ? void 0 : item.label) !== null && _a !== void 0 ? _a : React__default.default.createElement("div", null);
|
|
37
|
+
}, [flattenedItems, selectedKey]);
|
|
38
|
+
return React__default.default.createElement("div", {
|
|
39
|
+
style: {
|
|
40
|
+
position: 'relative'
|
|
41
|
+
}
|
|
42
|
+
}, React__default.default.createElement(reactAriaComponents.Button, {
|
|
43
|
+
className: Trigger_module.button,
|
|
44
|
+
ref: buttonRef,
|
|
45
|
+
onPress: function () {
|
|
46
|
+
return setOpen(!isOpen);
|
|
47
|
+
},
|
|
48
|
+
"aria-expanded": isOpen,
|
|
49
|
+
style: {
|
|
50
|
+
'--anchor-name': anchorName
|
|
51
|
+
}
|
|
52
|
+
}, selectedLabel, React__default.default.createElement(Icon.Icon, {
|
|
17
53
|
name: "keyboard_arrow_down",
|
|
18
54
|
isPresentational: true
|
|
19
|
-
}));
|
|
55
|
+
})));
|
|
20
56
|
};
|
|
21
57
|
exports.Trigger = Trigger;
|
|
@@ -1,22 +1,72 @@
|
|
|
1
1
|
import { __rest, __assign } from 'tslib';
|
|
2
|
-
import React from 'react';
|
|
3
|
-
import {
|
|
2
|
+
import React, { useId, useMemo, isValidElement, cloneElement } from 'react';
|
|
3
|
+
import { useSelectState } from '@react-stately/select';
|
|
4
|
+
import { Select } from 'react-aria-components';
|
|
5
|
+
import { SingleSelectContext } from './context/SingleSelectContext.mjs';
|
|
4
6
|
import { List } from './subcomponents/List/List.mjs';
|
|
5
7
|
import { ListSection } from './subcomponents/ListSection/ListSection.mjs';
|
|
6
8
|
import { ListItem } from './subcomponents/ListItem/ListItem.mjs';
|
|
7
9
|
import { Trigger } from './subcomponents/Trigger/Trigger.mjs';
|
|
8
|
-
import
|
|
10
|
+
import { Popover } from './subcomponents/Popover/Popover.mjs';
|
|
9
11
|
const SingleSelect = /*#__PURE__*/function () {
|
|
10
12
|
const SingleSelect = function (_a) {
|
|
11
|
-
var
|
|
13
|
+
var items = _a.items,
|
|
14
|
+
onSelectionChange = _a.onSelectionChange,
|
|
12
15
|
children = _a.children,
|
|
13
|
-
restProps = __rest(_a, ["
|
|
14
|
-
|
|
15
|
-
|
|
16
|
+
restProps = __rest(_a, ["items", "onSelectionChange", "children"]);
|
|
17
|
+
var buttonRef = React.useRef(null);
|
|
18
|
+
var popoverRef = React.useRef(null);
|
|
19
|
+
var racPopoverRef = React.useRef(null);
|
|
20
|
+
var uniqueId = useId();
|
|
21
|
+
var anchorName = "--trigger-".concat(uniqueId);
|
|
22
|
+
var state = useSelectState({
|
|
23
|
+
items: items
|
|
24
|
+
});
|
|
25
|
+
var handleOnSelectionChange = React.useCallback(function (keys) {
|
|
26
|
+
var key = null;
|
|
27
|
+
if (keys instanceof Set && keys.size > 0) {
|
|
28
|
+
key = Array.from(keys)[0];
|
|
29
|
+
}
|
|
30
|
+
state.setSelectedKey(key);
|
|
31
|
+
if (onSelectionChange) {
|
|
32
|
+
onSelectionChange(key);
|
|
33
|
+
}
|
|
34
|
+
}, [state, onSelectionChange]);
|
|
35
|
+
// Cloning children here to allow users to pass in a custom ListItem or ListSection
|
|
36
|
+
// and still have the SingleSelect handle selection state
|
|
37
|
+
var injectedChildren = useMemo(function () {
|
|
38
|
+
if (! /*#__PURE__*/isValidElement(children)) return null;
|
|
39
|
+
var selectedKeys = state.selectedKey ? new Set([state.selectedKey]) : new Set();
|
|
40
|
+
return /*#__PURE__*/cloneElement(children, {
|
|
41
|
+
selectionMode: 'single',
|
|
42
|
+
selectedKeys: selectedKeys,
|
|
43
|
+
onSelectionChange: handleOnSelectionChange,
|
|
44
|
+
autoFocus: 'first'
|
|
45
|
+
});
|
|
46
|
+
}, [children, handleOnSelectionChange, state.selectedKey]);
|
|
47
|
+
return /*#__PURE__*/React.createElement(SingleSelectContext.Provider, {
|
|
48
|
+
value: {
|
|
49
|
+
isOpen: state.isOpen,
|
|
50
|
+
setOpen: state.setOpen,
|
|
51
|
+
selectedKey: state.selectedKey,
|
|
52
|
+
items: items,
|
|
53
|
+
anchorName: anchorName
|
|
54
|
+
}
|
|
55
|
+
}, /*#__PURE__*/React.createElement(Select
|
|
56
|
+
// TODO: allow user to pass in label
|
|
57
|
+
, __assign({
|
|
58
|
+
"aria-label": 'single-select',
|
|
59
|
+
onSelectionChange: function (key) {
|
|
60
|
+
return handleOnSelectionChange(key != null ? new Set([key]) : new Set());
|
|
61
|
+
},
|
|
16
62
|
placeholder: ""
|
|
17
|
-
}, restProps), /*#__PURE__*/React.createElement(Trigger,
|
|
18
|
-
|
|
19
|
-
},
|
|
63
|
+
}, restProps), /*#__PURE__*/React.createElement(Trigger, {
|
|
64
|
+
buttonRef: buttonRef
|
|
65
|
+
}), state.isOpen && (/*#__PURE__*/React.createElement(Popover, {
|
|
66
|
+
buttonRef: buttonRef,
|
|
67
|
+
popoverRef: popoverRef,
|
|
68
|
+
racPopoverRef: racPopoverRef
|
|
69
|
+
}, injectedChildren))));
|
|
20
70
|
};
|
|
21
71
|
SingleSelect.displayName = 'SingleSelect';
|
|
22
72
|
SingleSelect.List = List;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { createContext, useContext } from 'react';
|
|
2
|
+
var SingleSelectContext = /*#__PURE__*/createContext(undefined);
|
|
3
|
+
var useSingleSelectContext = function () {
|
|
4
|
+
var context = useContext(SingleSelectContext);
|
|
5
|
+
if (!context) {
|
|
6
|
+
throw new Error('useSingleSelectContext must be used within a SingleSelectContext.Provider');
|
|
7
|
+
}
|
|
8
|
+
return context;
|
|
9
|
+
};
|
|
10
|
+
export { SingleSelectContext, useSingleSelectContext };
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import React, { useMemo, useLayoutEffect } from 'react';
|
|
2
|
+
import { Popover as Popover$1 } from 'react-aria-components';
|
|
3
|
+
import { useSingleSelectContext } from '../../context/SingleSelectContext.mjs';
|
|
4
|
+
import { usePositioningStyles } from './utils/usePositioningStyles.mjs';
|
|
5
|
+
import styles from './Popover.module.css.mjs';
|
|
6
|
+
const Popover = /*#__PURE__*/function () {
|
|
7
|
+
const Popover = function (_a) {
|
|
8
|
+
var buttonRef = _a.buttonRef,
|
|
9
|
+
popoverRef = _a.popoverRef,
|
|
10
|
+
racPopoverRef = _a.racPopoverRef,
|
|
11
|
+
children = _a.children;
|
|
12
|
+
var _b = useSingleSelectContext(),
|
|
13
|
+
isOpen = _b.isOpen,
|
|
14
|
+
setOpen = _b.setOpen,
|
|
15
|
+
anchorName = _b.anchorName;
|
|
16
|
+
var _c = usePositioningStyles(buttonRef, popoverRef, anchorName),
|
|
17
|
+
popoverStyle = _c.popoverStyle,
|
|
18
|
+
isPositioned = _c.isPositioned;
|
|
19
|
+
var shouldShowPopover = useMemo(function () {
|
|
20
|
+
return isOpen && isPositioned;
|
|
21
|
+
}, [isOpen, isPositioned]);
|
|
22
|
+
useLayoutEffect(function () {
|
|
23
|
+
var popover = popoverRef.current;
|
|
24
|
+
if (!(popover === null || popover === void 0 ? void 0 : popover.showPopover) || !(popover === null || popover === void 0 ? void 0 : popover.hidePopover)) return;
|
|
25
|
+
if (shouldShowPopover) {
|
|
26
|
+
popover.showPopover();
|
|
27
|
+
} else {
|
|
28
|
+
popover.hidePopover();
|
|
29
|
+
}
|
|
30
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
31
|
+
}, [shouldShowPopover]);
|
|
32
|
+
return /*#__PURE__*/React.createElement(Popover$1, {
|
|
33
|
+
shouldUpdatePosition: false,
|
|
34
|
+
trigger: "manual",
|
|
35
|
+
isOpen: isOpen,
|
|
36
|
+
onOpenChange: setOpen,
|
|
37
|
+
ref: racPopoverRef
|
|
38
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
39
|
+
// @ts-expect-error - popover attribute is not included in current ts version, ignore type error
|
|
40
|
+
popover: "manual",
|
|
41
|
+
ref: popoverRef,
|
|
42
|
+
className: styles.popover,
|
|
43
|
+
style: popoverStyle
|
|
44
|
+
}, children));
|
|
45
|
+
};
|
|
46
|
+
Popover.displayName = 'SingleSelect.Popover';
|
|
47
|
+
return Popover;
|
|
48
|
+
}();
|
|
49
|
+
export { Popover };
|
package/dist/esm/src/__alpha__/SingleSelect/subcomponents/Popover/utils/usePopoverPositioning.mjs
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { __assign } from 'tslib';
|
|
2
|
+
import { useState, useRef, useCallback, useEffect } from 'react';
|
|
3
|
+
function usePopoverPositioning(_a) {
|
|
4
|
+
var triggerRef = _a.triggerRef,
|
|
5
|
+
popoverRef = _a.popoverRef,
|
|
6
|
+
_b = _a.direction,
|
|
7
|
+
direction = _b === void 0 ? 'ltr' : _b,
|
|
8
|
+
_c = _a.offset,
|
|
9
|
+
offset = _c === void 0 ? 4 : _c,
|
|
10
|
+
_d = _a.preferredPlacement,
|
|
11
|
+
preferredPlacement = _d === void 0 ? 'bottom' : _d;
|
|
12
|
+
var _e = useState({
|
|
13
|
+
top: preferredPlacement === 'bottom' ? offset : 'auto',
|
|
14
|
+
bottom: preferredPlacement === 'top' ? offset : 'auto',
|
|
15
|
+
insetInlineStart: 0,
|
|
16
|
+
maxHeight: 300 // TODO: update this based on designs
|
|
17
|
+
}),
|
|
18
|
+
position = _e[0],
|
|
19
|
+
setPosition = _e[1];
|
|
20
|
+
var _f = useState(true),
|
|
21
|
+
isPositioned = _f[0],
|
|
22
|
+
setIsPositioned = _f[1];
|
|
23
|
+
var mountedRef = useRef(false);
|
|
24
|
+
var isSSR = typeof window === 'undefined';
|
|
25
|
+
var updatePosition = useCallback(function () {
|
|
26
|
+
var _a;
|
|
27
|
+
if (isSSR) return;
|
|
28
|
+
var trigger = triggerRef.current;
|
|
29
|
+
var popover = popoverRef.current;
|
|
30
|
+
if (!mountedRef.current || !trigger || !(popover === null || popover === void 0 ? void 0 : popover.isConnected)) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
var triggerRect = trigger.getBoundingClientRect();
|
|
34
|
+
if (!triggerRect) return;
|
|
35
|
+
var doc = trigger.ownerDocument;
|
|
36
|
+
var win = (_a = doc === null || doc === void 0 ? void 0 : doc.defaultView) !== null && _a !== void 0 ? _a : window;
|
|
37
|
+
var isRTL = direction === 'rtl';
|
|
38
|
+
var inlineStart = isRTL ? win.innerWidth - triggerRect.right : triggerRect.left;
|
|
39
|
+
var triggerTop = triggerRect.top;
|
|
40
|
+
var triggerBottom = triggerRect.bottom;
|
|
41
|
+
var viewportHeight = win.innerHeight;
|
|
42
|
+
var spaceAbove = triggerTop;
|
|
43
|
+
var spaceBelow = viewportHeight - triggerBottom;
|
|
44
|
+
var shouldFlip = preferredPlacement === 'bottom' && spaceBelow < 200 && spaceAbove > spaceBelow;
|
|
45
|
+
var top;
|
|
46
|
+
var bottom;
|
|
47
|
+
var maxHeight;
|
|
48
|
+
if (shouldFlip) {
|
|
49
|
+
top = 'auto';
|
|
50
|
+
bottom = viewportHeight - triggerTop + offset;
|
|
51
|
+
maxHeight = Math.max(0, spaceAbove - offset);
|
|
52
|
+
} else {
|
|
53
|
+
top = triggerBottom + offset;
|
|
54
|
+
bottom = 'auto';
|
|
55
|
+
maxHeight = Math.max(0, spaceBelow - offset);
|
|
56
|
+
}
|
|
57
|
+
var newPosition = {
|
|
58
|
+
top: top,
|
|
59
|
+
bottom: bottom,
|
|
60
|
+
insetInlineStart: inlineStart,
|
|
61
|
+
maxHeight: maxHeight
|
|
62
|
+
};
|
|
63
|
+
setPosition(newPosition);
|
|
64
|
+
setIsPositioned(true);
|
|
65
|
+
}, [triggerRef, popoverRef, direction, offset, preferredPlacement, isSSR]);
|
|
66
|
+
useEffect(function () {
|
|
67
|
+
if (typeof window === 'undefined') return;
|
|
68
|
+
mountedRef.current = true;
|
|
69
|
+
var triggerEl = triggerRef.current;
|
|
70
|
+
updatePosition();
|
|
71
|
+
var resizeObserver = new ResizeObserver(function () {
|
|
72
|
+
updatePosition();
|
|
73
|
+
});
|
|
74
|
+
if (triggerEl) resizeObserver.observe(triggerEl);
|
|
75
|
+
var onWindowResize = function () {
|
|
76
|
+
return updatePosition();
|
|
77
|
+
};
|
|
78
|
+
window.addEventListener('resize', onWindowResize, {
|
|
79
|
+
passive: true
|
|
80
|
+
});
|
|
81
|
+
return function () {
|
|
82
|
+
mountedRef.current = false;
|
|
83
|
+
resizeObserver.disconnect();
|
|
84
|
+
window.removeEventListener('resize', onWindowResize);
|
|
85
|
+
setIsPositioned(false);
|
|
86
|
+
};
|
|
87
|
+
}, [updatePosition, triggerRef]);
|
|
88
|
+
return __assign(__assign({}, position), {
|
|
89
|
+
isPositioned: isPositioned
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
export { usePopoverPositioning };
|
package/dist/esm/src/__alpha__/SingleSelect/subcomponents/Popover/utils/usePositioningStyles.mjs
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { useMemo } from 'react';
|
|
2
|
+
import { useLocale } from '@react-aria/i18n';
|
|
3
|
+
import { usePopoverPositioning } from './usePopoverPositioning.mjs';
|
|
4
|
+
import { useSupportsAnchorPositioning } from './useSupportsAnchorPositioning.mjs';
|
|
5
|
+
var CSS_PROPS = {
|
|
6
|
+
POSITION_ANCHOR: '--position-anchor',
|
|
7
|
+
POSITION_AREA: '--position-area'
|
|
8
|
+
};
|
|
9
|
+
var DEFAULTS = {
|
|
10
|
+
MAX_HEIGHT: '300px'
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Generates manual positioning styles for browsers without anchor positioning support or SSR
|
|
14
|
+
*/
|
|
15
|
+
var getManualPositioningStyles = function (positionData) {
|
|
16
|
+
return {
|
|
17
|
+
top: positionData.top,
|
|
18
|
+
bottom: positionData.bottom,
|
|
19
|
+
insetInlineStart: positionData.insetInlineStart,
|
|
20
|
+
maxHeight: positionData.maxHeight,
|
|
21
|
+
left: 'auto',
|
|
22
|
+
right: 'auto',
|
|
23
|
+
position: 'fixed'
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
var getAnchorPositioningStyles = function (anchorName, positionData) {
|
|
27
|
+
var _a;
|
|
28
|
+
var _b;
|
|
29
|
+
var styles = (_a = {
|
|
30
|
+
maxHeight: (_b = positionData.maxHeight) !== null && _b !== void 0 ? _b : DEFAULTS.MAX_HEIGHT
|
|
31
|
+
}, _a[CSS_PROPS.POSITION_ANCHOR] = anchorName, _a[CSS_PROPS.POSITION_AREA] = positionData.top === 'auto' ? 'top' : 'bottom', _a);
|
|
32
|
+
return styles;
|
|
33
|
+
};
|
|
34
|
+
var usePositioningStyles = function (buttonRef, popoverRef, anchorName) {
|
|
35
|
+
var direction = useLocale().direction;
|
|
36
|
+
var hasAnchorSupport = useSupportsAnchorPositioning();
|
|
37
|
+
var _a = usePopoverPositioning({
|
|
38
|
+
triggerRef: buttonRef,
|
|
39
|
+
popoverRef: popoverRef,
|
|
40
|
+
direction: direction,
|
|
41
|
+
preferredPlacement: 'bottom'
|
|
42
|
+
}),
|
|
43
|
+
top = _a.top,
|
|
44
|
+
bottom = _a.bottom,
|
|
45
|
+
insetInlineStart = _a.insetInlineStart,
|
|
46
|
+
maxHeight = _a.maxHeight,
|
|
47
|
+
isPositioned = _a.isPositioned;
|
|
48
|
+
var positionData = useMemo(function () {
|
|
49
|
+
return {
|
|
50
|
+
top: top,
|
|
51
|
+
bottom: bottom,
|
|
52
|
+
insetInlineStart: insetInlineStart,
|
|
53
|
+
maxHeight: maxHeight
|
|
54
|
+
};
|
|
55
|
+
}, [top, bottom, insetInlineStart, maxHeight]);
|
|
56
|
+
var popoverStyle = useMemo(function () {
|
|
57
|
+
if (hasAnchorSupport === null || !hasAnchorSupport) {
|
|
58
|
+
return getManualPositioningStyles(positionData);
|
|
59
|
+
}
|
|
60
|
+
return getAnchorPositioningStyles(anchorName, positionData);
|
|
61
|
+
}, [hasAnchorSupport, anchorName, positionData]);
|
|
62
|
+
return {
|
|
63
|
+
popoverStyle: popoverStyle,
|
|
64
|
+
isPositioned: isPositioned
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
export { usePositioningStyles };
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { useMemo } from 'react';
|
|
2
|
+
var useSupportsAnchorPositioning = function () {
|
|
3
|
+
return useMemo(function () {
|
|
4
|
+
if (typeof window === 'undefined' || typeof CSS === 'undefined') {
|
|
5
|
+
return false;
|
|
6
|
+
}
|
|
7
|
+
return CSS.supports('position-anchor', 'auto') || CSS.supports('position-try-fallbacks: flip-block');
|
|
8
|
+
}, []);
|
|
9
|
+
};
|
|
10
|
+
export { useSupportsAnchorPositioning };
|
|
@@ -1,13 +1,49 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { Button
|
|
1
|
+
import React, { useMemo } from 'react';
|
|
2
|
+
import { Button } from 'react-aria-components';
|
|
3
3
|
import { Icon } from '../../../../__next__/Icon/Icon.mjs';
|
|
4
|
+
import { useSingleSelectContext } from '../../context/SingleSelectContext.mjs';
|
|
4
5
|
import styles from './Trigger.module.css.mjs';
|
|
5
|
-
|
|
6
|
-
return
|
|
7
|
-
|
|
8
|
-
}
|
|
6
|
+
function flattenItems(items) {
|
|
7
|
+
return items.flatMap(function (item) {
|
|
8
|
+
return 'options' in item ? item.options : item;
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
var Trigger = function (_a) {
|
|
12
|
+
var buttonRef = _a.buttonRef;
|
|
13
|
+
var _b = useSingleSelectContext(),
|
|
14
|
+
isOpen = _b.isOpen,
|
|
15
|
+
setOpen = _b.setOpen,
|
|
16
|
+
selectedKey = _b.selectedKey,
|
|
17
|
+
items = _b.items,
|
|
18
|
+
anchorName = _b.anchorName;
|
|
19
|
+
var flattenedItems = useMemo(function () {
|
|
20
|
+
return flattenItems(items);
|
|
21
|
+
}, [items]);
|
|
22
|
+
var selectedLabel = useMemo(function () {
|
|
23
|
+
var _a;
|
|
24
|
+
var key = selectedKey;
|
|
25
|
+
var item = flattenedItems.find(function (i) {
|
|
26
|
+
return i.value === key;
|
|
27
|
+
});
|
|
28
|
+
return (_a = item === null || item === void 0 ? void 0 : item.label) !== null && _a !== void 0 ? _a : /*#__PURE__*/React.createElement("div", null);
|
|
29
|
+
}, [flattenedItems, selectedKey]);
|
|
30
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
31
|
+
style: {
|
|
32
|
+
position: 'relative'
|
|
33
|
+
}
|
|
34
|
+
}, /*#__PURE__*/React.createElement(Button, {
|
|
35
|
+
className: styles.button,
|
|
36
|
+
ref: buttonRef,
|
|
37
|
+
onPress: function () {
|
|
38
|
+
return setOpen(!isOpen);
|
|
39
|
+
},
|
|
40
|
+
"aria-expanded": isOpen,
|
|
41
|
+
style: {
|
|
42
|
+
'--anchor-name': anchorName
|
|
43
|
+
}
|
|
44
|
+
}, selectedLabel, /*#__PURE__*/React.createElement(Icon, {
|
|
9
45
|
name: "keyboard_arrow_down",
|
|
10
46
|
isPresentational: true
|
|
11
|
-
}));
|
|
47
|
+
})));
|
|
12
48
|
};
|
|
13
49
|
export { Trigger };
|