Skip to content
This repository was archived by the owner on Sep 20, 2024. It is now read-only.

Commit cbb800c

Browse files
committed
fix: use-popper
1 parent 2dbc3d9 commit cbb800c

File tree

2 files changed

+18
-375
lines changed

2 files changed

+18
-375
lines changed

packages/c-popper/src/index.ts

Lines changed: 2 additions & 365 deletions
Original file line numberDiff line numberDiff line change
@@ -1,365 +1,2 @@
1-
import { filterUndefined } from '@chakra-ui/utils';
2-
import { ref, onUnmounted, onBeforeUpdate, onMounted, nextTick, watch } from 'vue';
3-
import { popperGenerator, eventListeners, arrow, offset, flip, preventOverflow, popperOffsets, computeStyles, applyStyles } from '@popperjs/core';
4-
5-
function _extends() {
6-
_extends = Object.assign || function (target) {
7-
for (var i = 1; i < arguments.length; i++) {
8-
var source = arguments[i];
9-
10-
for (var key in source) {
11-
if (Object.prototype.hasOwnProperty.call(source, key)) {
12-
target[key] = source[key];
13-
}
14-
}
15-
}
16-
17-
return target;
18-
};
19-
20-
return _extends.apply(this, arguments);
21-
}
22-
23-
var toVar = function toVar(value, fallback) {
24-
return {
25-
"var": value,
26-
varRef: fallback ? "var(" + value + ", " + fallback + ")" : "var(" + value + ")"
27-
};
28-
};
29-
30-
var popperCSSVars = {
31-
arrowShadowColor: toVar("--popper-arrow-shadow-color"),
32-
arrowSize: toVar("--popper-arrow-size", "8px"),
33-
arrowSizeHalf: toVar("--popper-arrow-size-half"),
34-
arrowBg: toVar("--popper-arrow-bg"),
35-
transformOrigin: toVar("--popper-transform-origin"),
36-
arrowOffset: toVar("--popper-arrow-offset")
37-
};
38-
function getBoxShadow(placement) {
39-
if (placement.includes("top")) return "1px 1px 1px 0 var(--popper-arrow-shadow-color)";
40-
if (placement.includes("bottom")) return "-1px -1px 1px 0 var(--popper-arrow-shadow-color)";
41-
if (placement.includes("right")) return "-1px 1px 1px 0 var(--popper-arrow-shadow-color)";
42-
if (placement.includes("left")) return "1px -1px 1px 0 var(--popper-arrow-shadow-color)";
43-
}
44-
var transforms = {
45-
top: "bottom center",
46-
"top-start": "bottom left",
47-
"top-end": "bottom right",
48-
bottom: "top center",
49-
"bottom-start": "top left",
50-
"bottom-end": "top right",
51-
left: "right center",
52-
"left-start": "right top",
53-
"left-end": "right bottom",
54-
right: "left center",
55-
"right-start": "left top",
56-
"right-end": "left bottom"
57-
};
58-
var toTransformOrigin = function toTransformOrigin(placement) {
59-
return transforms[placement];
60-
};
61-
var defaultEventListeners = {
62-
scroll: true,
63-
resize: true
64-
};
65-
function getEventListenerOptions(value) {
66-
var eventListeners;
67-
68-
if (typeof value === "object") {
69-
eventListeners = {
70-
enabled: true,
71-
options: Object.assign(defaultEventListeners, value)
72-
};
73-
} else {
74-
eventListeners = {
75-
enabled: value,
76-
options: defaultEventListeners
77-
};
78-
}
79-
80-
return eventListeners;
81-
}
82-
83-
/* -------------------------------------------------------------------------------------------------
84-
The match width modifier sets the popper width to match the reference.
85-
It us useful for custom selects, autocomplete, etc.
86-
* -----------------------------------------------------------------------------------------------*/
87-
88-
var matchWidth = {
89-
name: "matchWidth",
90-
enabled: true,
91-
phase: "beforeWrite",
92-
requires: ["computeStyles"],
93-
fn: function fn(_ref) {
94-
var state = _ref.state;
95-
state.styles.popper.width = state.rects.reference.width + "px";
96-
},
97-
effect: function effect(_ref2) {
98-
var state = _ref2.state;
99-
return function () {
100-
var reference = state.elements.reference;
101-
state.elements.popper.style.width = reference.offsetWidth + "px";
102-
};
103-
}
104-
};
105-
/* -------------------------------------------------------------------------------------------------
106-
The transform origin modifier sets the css `transformOrigin` value of the popper
107-
based on the dynamic placement state of the popper.
108-
109-
Useful when we need to animate/transition the popper.
110-
* -----------------------------------------------------------------------------------------------*/
111-
112-
var transformOrigin = {
113-
name: "transformOrigin",
114-
enabled: true,
115-
phase: "write",
116-
fn: function fn(_ref3) {
117-
var state = _ref3.state;
118-
setTransformOrigin(state);
119-
},
120-
effect: function effect(_ref4) {
121-
var state = _ref4.state;
122-
return function () {
123-
setTransformOrigin(state);
124-
};
125-
}
126-
};
127-
128-
var setTransformOrigin = function setTransformOrigin(state) {
129-
state.elements.popper.style.setProperty(popperCSSVars.transformOrigin["var"], toTransformOrigin(state.placement));
130-
};
131-
/* -------------------------------------------------------------------------------------------------
132-
The position arrow modifier adds width, height and overrides the `top/left/right/bottom`
133-
styles generated by popper.js to properly position the arrow
134-
* -----------------------------------------------------------------------------------------------*/
135-
136-
137-
var positionArrow = {
138-
name: "positionArrow",
139-
enabled: true,
140-
phase: "afterWrite",
141-
fn: function fn(_ref5) {
142-
var state = _ref5.state;
143-
setArrowStyles(state);
144-
}
145-
};
146-
147-
var setArrowStyles = function setArrowStyles(state) {
148-
var _state$elements;
149-
150-
if (!state.placement) return;
151-
var overrides = getArrowStyle(state.placement);
152-
153-
if ((_state$elements = state.elements) != null && _state$elements.arrow && overrides) {
154-
var _Object$assign, _vars;
155-
156-
Object.assign(state.elements.arrow.style, (_Object$assign = {}, _Object$assign[overrides.property] = overrides.value, _Object$assign.width = popperCSSVars.arrowSize.varRef, _Object$assign.height = popperCSSVars.arrowSize.varRef, _Object$assign.zIndex = -1, _Object$assign));
157-
var vars = (_vars = {}, _vars[popperCSSVars.arrowSizeHalf["var"]] = "calc(" + popperCSSVars.arrowSize.varRef + " / 2)", _vars[popperCSSVars.arrowOffset["var"]] = "calc(" + popperCSSVars.arrowSizeHalf.varRef + " * -1)", _vars);
158-
159-
for (var property in vars) {
160-
state.elements.arrow.style.setProperty(property, vars[property]);
161-
}
162-
}
163-
};
164-
165-
var getArrowStyle = function getArrowStyle(placement) {
166-
if (placement.startsWith("top")) {
167-
return {
168-
property: "bottom",
169-
value: popperCSSVars.arrowOffset.varRef
170-
};
171-
}
172-
173-
if (placement.startsWith("bottom")) {
174-
return {
175-
property: "top",
176-
value: popperCSSVars.arrowOffset.varRef
177-
};
178-
}
179-
180-
if (placement.startsWith("left")) {
181-
return {
182-
property: "right",
183-
value: popperCSSVars.arrowOffset.varRef
184-
};
185-
}
186-
187-
if (placement.startsWith("right")) {
188-
return {
189-
property: "left",
190-
value: popperCSSVars.arrowOffset.varRef
191-
};
192-
}
193-
};
194-
/* -------------------------------------------------------------------------------------------------
195-
The inner arrow modifier, sets the placement styles for the inner arrow that forms
196-
the popper arrow tip.
197-
* -----------------------------------------------------------------------------------------------*/
198-
199-
200-
var innerArrow = {
201-
name: "innerArrow",
202-
enabled: true,
203-
phase: "main",
204-
requires: ["arrow"],
205-
fn: function fn(_ref6) {
206-
var state = _ref6.state;
207-
setInnerArrowStyles(state);
208-
},
209-
effect: function effect(_ref7) {
210-
var state = _ref7.state;
211-
return function () {
212-
setInnerArrowStyles(state);
213-
};
214-
}
215-
};
216-
217-
var setInnerArrowStyles = function setInnerArrowStyles(state) {
218-
if (!state.elements.arrow) return;
219-
var inner = state.elements.arrow.querySelector("[data-popper-arrow-inner]");
220-
if (!inner) return;
221-
Object.assign(inner.style, {
222-
transform: "rotate(45deg)",
223-
background: popperCSSVars.arrowBg.varRef,
224-
top: 0,
225-
left: 0,
226-
width: "100%",
227-
height: "100%",
228-
position: "absolute",
229-
zIndex: "inherit",
230-
boxShadow: getBoxShadow(state.placement)
231-
});
232-
};
233-
234-
/* -------------------------------------------------------------------------------------------------
235-
We're initializing our own `createPopper` function with our opinionated defaults to
236-
keep the bundle size low.
237-
238-
@see https://popper.js.org/docs/v2/tree-shaking/
239-
* -----------------------------------------------------------------------------------------------*/
240-
241-
var defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles];
242-
function createPopperFn(options) {
243-
var _options$offset;
244-
245-
return popperGenerator({
246-
defaultOptions: {
247-
placement: "bottom",
248-
strategy: "absolute",
249-
modifiers: []
250-
},
251-
defaultModifiers: [].concat(defaultModifiers, [positionArrow, innerArrow, transformOrigin, _extends({}, eventListeners, getEventListenerOptions(options.eventListeners)), _extends({}, arrow, {
252-
options: {
253-
padding: options.arrowPadding
254-
}
255-
}), _extends({}, offset, {
256-
options: {
257-
offset: (_options$offset = options.offset) != null ? _options$offset : [0, options.gutter]
258-
}
259-
}), _extends({}, flip, {
260-
enabled: !!options.flip,
261-
options: {
262-
padding: 8
263-
}
264-
}), _extends({}, preventOverflow, {
265-
enabled: !!options.preventOverflow,
266-
options: {
267-
boundary: options.boundary || "clippingParents"
268-
}
269-
}), _extends({}, matchWidth, {
270-
enabled: !!options.matchWidth
271-
})])
272-
});
273-
}
274-
275-
var defaultProps = {
276-
placement: "bottom",
277-
strategy: "absolute",
278-
flip: true,
279-
gutter: 8,
280-
arrowPadding: 8,
281-
preventOverflow: true,
282-
eventListeners: true,
283-
modifiers: []
284-
};
285-
function usePopper(props) {
286-
var _popperInstance$value2, _popperInstance$value3;
287-
288-
if (props === void 0) {
289-
props = {};
290-
}
291-
292-
var options = _extends({}, defaultProps, filterUndefined(props));
293-
294-
var _options$modifiers = options.modifiers,
295-
modifiers = _options$modifiers === void 0 ? [] : _options$modifiers,
296-
placement = options.placement,
297-
strategy = options.strategy;
298-
var createPopper = ref(createPopperFn(options));
299-
300-
var _reference = ref(null);
301-
302-
var _popper = ref(null);
303-
304-
var popperInstance = ref(null); // cleanup previous instance handler
305-
306-
var cleanup = ref(function () {});
307-
var unsubscribe;
308-
onUnmounted(function () {
309-
var _popperInstance$value;
310-
311-
(_popperInstance$value = popperInstance.value) == null ? void 0 : _popperInstance$value.destroy();
312-
popperInstance.value = null;
313-
unsubscribe == null ? void 0 : unsubscribe();
314-
});
315-
316-
var setup = function setup() {
317-
nextTick().then(function () {
318-
if (!_reference.value || !_popper.value) return;
319-
cleanup.value == null ? void 0 : cleanup.value();
320-
popperInstance.value = createPopper.value(_reference.value, _popper.value, {
321-
placement: placement,
322-
modifiers: modifiers,
323-
strategy: strategy
324-
});
325-
popperInstance.value.forceUpdate();
326-
cleanup.value = popperInstance.value.destroy;
327-
});
328-
};
329-
330-
onBeforeUpdate(function () {
331-
// clear refs
332-
_reference.value = null;
333-
_popper.value = null;
334-
});
335-
onMounted(function () {
336-
nextTick().then(function () {
337-
unsubscribe = watch(function () {
338-
return [_reference, _popper];
339-
}, setup, {
340-
immediate: true,
341-
flush: "post"
342-
});
343-
});
344-
});
345-
return {
346-
update: (_popperInstance$value2 = popperInstance.value) == null ? void 0 : _popperInstance$value2.update,
347-
forceUpdate: (_popperInstance$value3 = popperInstance.value) == null ? void 0 : _popperInstance$value3.forceUpdate,
348-
reference: function reference(el) {
349-
if (el) {
350-
_reference.value = el.$el || el;
351-
setup();
352-
}
353-
},
354-
referenceEl: _reference,
355-
popper: function popper(el) {
356-
if (el) {
357-
_popper.value = el.$el || el;
358-
setup();
359-
}
360-
},
361-
popperEl: _popper
362-
};
363-
}
364-
365-
export { popperCSSVars, usePopper };
1+
export * from "./use-popper"
2+
export { popperCSSVars } from "./utils"

0 commit comments

Comments
 (0)