UNPKG

4.17 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4Object.defineProperty(exports, "__esModule", {
5 value: true
6});
7exports.default = mergeSlotProps;
8var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9var _clsx = _interopRequireDefault(require("clsx"));
10var _extractEventHandlers = _interopRequireDefault(require("./extractEventHandlers"));
11var _omitEventHandlers = _interopRequireDefault(require("./omitEventHandlers"));
12/**
13 * Merges the slot component internal props (usually coming from a hook)
14 * with the externally provided ones.
15 *
16 * The merge order is (the latter overrides the former):
17 * 1. The internal props (specified as a getter function to work with get*Props hook result)
18 * 2. Additional props (specified internally on a Base UI component)
19 * 3. External props specified on the owner component. These should only be used on a root slot.
20 * 4. External props specified in the `slotProps.*` prop.
21 * 5. The `className` prop - combined from all the above.
22 * @param parameters
23 * @returns
24 */
25function mergeSlotProps(parameters) {
26 const {
27 getSlotProps,
28 additionalProps,
29 externalSlotProps,
30 externalForwardedProps,
31 className
32 } = parameters;
33 if (!getSlotProps) {
34 // The simpler case - getSlotProps is not defined, so no internal event handlers are defined,
35 // so we can simply merge all the props without having to worry about extracting event handlers.
36 const joinedClasses = (0, _clsx.default)(externalForwardedProps == null ? void 0 : externalForwardedProps.className, externalSlotProps == null ? void 0 : externalSlotProps.className, className, additionalProps == null ? void 0 : additionalProps.className);
37 const mergedStyle = (0, _extends2.default)({}, additionalProps == null ? void 0 : additionalProps.style, externalForwardedProps == null ? void 0 : externalForwardedProps.style, externalSlotProps == null ? void 0 : externalSlotProps.style);
38 const props = (0, _extends2.default)({}, additionalProps, externalForwardedProps, externalSlotProps);
39 if (joinedClasses.length > 0) {
40 props.className = joinedClasses;
41 }
42 if (Object.keys(mergedStyle).length > 0) {
43 props.style = mergedStyle;
44 }
45 return {
46 props,
47 internalRef: undefined
48 };
49 }
50
51 // In this case, getSlotProps is responsible for calling the external event handlers.
52 // We don't need to include them in the merged props because of this.
53
54 const eventHandlers = (0, _extractEventHandlers.default)((0, _extends2.default)({}, externalForwardedProps, externalSlotProps));
55 const componentsPropsWithoutEventHandlers = (0, _omitEventHandlers.default)(externalSlotProps);
56 const otherPropsWithoutEventHandlers = (0, _omitEventHandlers.default)(externalForwardedProps);
57 const internalSlotProps = getSlotProps(eventHandlers);
58
59 // The order of classes is important here.
60 // Emotion (that we use in libraries consuming Base UI) depends on this order
61 // to properly override style. It requires the most important classes to be last
62 // (see https://github.com/mui/material-ui/pull/33205) for the related discussion.
63 const joinedClasses = (0, _clsx.default)(internalSlotProps == null ? void 0 : internalSlotProps.className, additionalProps == null ? void 0 : additionalProps.className, className, externalForwardedProps == null ? void 0 : externalForwardedProps.className, externalSlotProps == null ? void 0 : externalSlotProps.className);
64 const mergedStyle = (0, _extends2.default)({}, internalSlotProps == null ? void 0 : internalSlotProps.style, additionalProps == null ? void 0 : additionalProps.style, externalForwardedProps == null ? void 0 : externalForwardedProps.style, externalSlotProps == null ? void 0 : externalSlotProps.style);
65 const props = (0, _extends2.default)({}, internalSlotProps, additionalProps, otherPropsWithoutEventHandlers, componentsPropsWithoutEventHandlers);
66 if (joinedClasses.length > 0) {
67 props.className = joinedClasses;
68 }
69 if (Object.keys(mergedStyle).length > 0) {
70 props.style = mergedStyle;
71 }
72 return {
73 props,
74 internalRef: internalSlotProps.ref
75 };
76}
\No newline at end of file