|
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