@crossed/ui
Version:
A universal & performant styling library for React Native, Next.js & React
165 lines (164 loc) • 6.08 kB
JavaScript
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var Popover_exports = {};
__export(Popover_exports, {
Content: () => Content,
Popover: () => Popover,
PopoverConfigProvider: () => PopoverConfigProvider,
Root: () => Root,
Trigger: () => Trigger,
usePopoverConfig: () => usePopoverConfig
});
module.exports = __toCommonJS(Popover_exports);
var import_jsx_runtime = require("react/jsx-runtime");
var import_react = require("react");
var import_Sheet = require("./Sheet/index");
var import_core = require("@crossed/core");
var import_styled = require("@crossed/styled");
var import_Floating = require("./Floating");
var import_react2 = require("@floating-ui/react");
var import_dom = require("@floating-ui/dom");
var import_react_native_reanimated = require("react-native-reanimated");
var import_useMedia = require("../useMedia");
var import_react_focus_on = require("react-focus-on");
const [PopoverConfigProvider, usePopoverConfig] = (0, import_core.createScope)({});
const useFloatinCompat = import_styled.isWeb ? (placement, offSetValue) => (0, import_react2.useFloating)({
placement,
middleware: [(0, import_dom.flip)({ crossAxis: true }), (0, import_react2.offset)(offSetValue)],
whileElementsMounted: import_react2.autoUpdate
}) : () => ({
refs: {},
floatingStyles: {}
});
const stylesDyn = (0, import_styled.createStyles)(() => ({ dyn: (e) => e }));
const [FloatingUiProvider, useFloatingUi] = (0, import_core.createScope)(
{}
);
const Root = (0, import_react.memo)(
({
children,
placement = "bottom-end",
triggerStrategy = "onPress",
offsetValue = 10,
...props
}) => {
const { refs, floatingStyles } = useFloatinCompat(placement, offsetValue);
const { md } = (0, import_useMedia.useMedia)();
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
PopoverConfigProvider,
{
showSheet: !import_styled.isWeb || !md,
triggerStrategy,
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
import_Floating.Floating,
{
triggerStrategy: !md && triggerStrategy === "onPointerEnter" ? "onPress" : triggerStrategy,
removeScroll: false,
...props,
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
FloatingUiProvider,
{
refs,
floatingStyles,
children
}
)
}
)
}
);
}
);
const Trigger = (0, import_react.memo)(
(0, import_react.forwardRef)((props, ref) => {
const { refs } = useFloatingUi();
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
import_Floating.Floating.Trigger,
{
...props,
ref: (0, import_core.composeRefs)(ref, refs.setReference)
}
);
})
);
const Content = (0, import_react.memo)(
(0, import_react.forwardRef)(({ children, style }, ref) => {
const { showSheet } = usePopoverConfig();
return showSheet ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ContentNative, { children, style }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ContentWeb, { ref, children, style });
})
);
const ContentWeb = (0, import_react.memo)(
(0, import_react.forwardRef)(({ children, style }, ref) => {
const { refs, floatingStyles } = useFloatingUi();
const { onClose, open } = (0, import_Floating.useFloatingContext)();
const { triggerStrategy } = usePopoverConfig();
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_Floating.Floating.Portal, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
import_react_focus_on.FocusOn,
{
onClickOutside: onClose,
onEscapeKey: onClose,
enabled: open && triggerStrategy === "onPress",
children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
import_Floating.Floating.Content,
{
entering: import_react_native_reanimated.FadeIn,
exiting: import_react_native_reanimated.FadeOut,
ref: (0, import_core.composeRefs)(ref, refs.setFloating),
style: (0, import_styled.composeStyles)(
(0, import_styled.inlineStyle)(() => ({
base: { position: "absolute" }
})),
stylesDyn.dyn(floatingStyles),
style
),
children
}
)
}
) });
})
);
const ContentNative = ({
children
}) => {
const { open, onClose } = (0, import_Floating.useFloatingContext)();
const refSheet = (0, import_react.useRef)(null);
(0, import_react.useEffect)(() => {
var _a, _b;
if (open) {
(_a = refSheet.current) == null ? void 0 : _a.show();
} else {
(_b = refSheet.current) == null ? void 0 : _b.hide();
}
}, [open]);
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_Sheet.Sheet, { ref: refSheet, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_Sheet.Sheet.Content, { onClose, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_Sheet.Sheet.Padded, { children }) }) });
};
const Popover = (0, import_core.withStaticProperties)(Root, {
Trigger,
Content
});
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
Content,
Popover,
PopoverConfigProvider,
Root,
Trigger,
usePopoverConfig
});
//# sourceMappingURL=Popover.js.map