@destyler/popper 0.0.3 → 0.0.4

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/dist/index.cjs CHANGED
@@ -1,419 +1,20 @@
1
1
  'use strict';
2
2
 
3
- const vue = require('vue');
4
- const shared = require('@destyler/shared');
5
- const primitive = require('@destyler/primitive');
6
- const composition = require('@destyler/composition');
7
- const vue$1 = require('@floating-ui/vue');
8
- const arrow = require('@destyler/arrow');
3
+ const index = require('./component.cjs');
4
+ require('vue');
5
+ require('@destyler/shared');
6
+ require('@destyler/primitive');
7
+ require('@destyler/composition');
8
+ require('@floating-ui/vue');
9
+ require('@destyler/arrow');
10
+ require('@destyler/arrow/component');
9
11
 
10
- const [injectPopperRootContext, providePopperRootContext] = shared.createContext("DestylerPopperRoot");
11
- const DestylerPopperRoot = vue.defineComponent({
12
- name: "DestylerPopperRoot",
13
- setup() {
14
- const anchor = vue.ref();
15
- providePopperRootContext({
16
- anchor,
17
- onAnchorChange: (element) => anchor.value = element
18
- });
19
- },
20
- render() {
21
- return this.$slots.default?.();
22
- }
23
- });
24
12
 
25
- const destylerPopperAnchorProps = {
26
- as: {
27
- type: [String, Object],
28
- required: false,
29
- default: "div"
30
- },
31
- asChild: {
32
- type: Boolean,
33
- required: false,
34
- default: false
35
- },
36
- element: {
37
- type: Object
38
- }
39
- };
40
- const DestylerPopperAnchor = vue.defineComponent({
41
- name: "DestylerPopperAnchor",
42
- props: destylerPopperAnchorProps,
43
- setup(props) {
44
- const { forwardRef, currentElement } = composition.useForwardExpose();
45
- const rootContext = injectPopperRootContext();
46
- vue.watch(currentElement, () => {
47
- rootContext.onAnchorChange(props.element ?? currentElement.value);
48
- });
49
- return {
50
- forwardRef
51
- };
52
- },
53
- render() {
54
- return vue.h(primitive.DestylerPrimitive, {
55
- as: this.$props.as,
56
- asChild: this.$props.asChild,
57
- ref: (el) => this.forwardRef(el)
58
- }, {
59
- default: () => this.$slots.default?.()
60
- });
61
- }
62
- });
63
13
 
64
- function isNotNull(value) {
65
- return value !== null;
66
- }
67
- function transformOrigin(options) {
68
- return {
69
- name: "transformOrigin",
70
- options,
71
- fn(data) {
72
- const { placement, rects, middlewareData } = data;
73
- const cannotCenterArrow = middlewareData.arrow?.centerOffset !== 0;
74
- const isArrowHidden = cannotCenterArrow;
75
- const arrowWidth = isArrowHidden ? 0 : options.arrowWidth;
76
- const arrowHeight = isArrowHidden ? 0 : options.arrowHeight;
77
- const [placedSide, placedAlign] = getSideAndAlignFromPlacement(placement);
78
- const noArrowAlign = { start: "0%", center: "50%", end: "100%" }[placedAlign];
79
- const arrowXCenter = (middlewareData.arrow?.x ?? 0) + arrowWidth / 2;
80
- const arrowYCenter = (middlewareData.arrow?.y ?? 0) + arrowHeight / 2;
81
- let x = "";
82
- let y = "";
83
- if (placedSide === "bottom") {
84
- x = isArrowHidden ? noArrowAlign : `${arrowXCenter}px`;
85
- y = `${-arrowHeight}px`;
86
- } else if (placedSide === "top") {
87
- x = isArrowHidden ? noArrowAlign : `${arrowXCenter}px`;
88
- y = `${rects.floating.height + arrowHeight}px`;
89
- } else if (placedSide === "right") {
90
- x = `${-arrowHeight}px`;
91
- y = isArrowHidden ? noArrowAlign : `${arrowYCenter}px`;
92
- } else if (placedSide === "left") {
93
- x = `${rects.floating.width + arrowHeight}px`;
94
- y = isArrowHidden ? noArrowAlign : `${arrowYCenter}px`;
95
- }
96
- return { data: { x, y } };
97
- }
98
- };
99
- }
100
- function getSideAndAlignFromPlacement(placement) {
101
- const [side, align = "center"] = placement.split("-");
102
- return [side, align];
103
- }
104
-
105
- const [injectPopperContentContext, providePopperContentContext] = shared.createContext("DestylerPopperContent");
106
- const destylerPopperContentProps = {
107
- as: {
108
- type: [String, Object],
109
- required: false,
110
- default: "div"
111
- },
112
- asChild: {
113
- type: Boolean,
114
- required: false,
115
- default: false
116
- },
117
- side: {
118
- type: String,
119
- required: false,
120
- default: "bottom"
121
- },
122
- sideOffset: {
123
- type: Number,
124
- required: false,
125
- default: 0
126
- },
127
- align: {
128
- type: String,
129
- required: false,
130
- default: "center"
131
- },
132
- alignOffset: {
133
- type: Number,
134
- required: false,
135
- default: 0
136
- },
137
- avoidCollisions: {
138
- type: Boolean,
139
- required: false,
140
- default: true
141
- },
142
- collisionBoundary: {
143
- type: [Object, Array, null],
144
- required: false,
145
- default: () => []
146
- },
147
- collisionPadding: {
148
- type: [Number, Object],
149
- required: false,
150
- default: 0
151
- },
152
- arrowPadding: {
153
- type: Number,
154
- required: false,
155
- default: 0
156
- },
157
- sticky: {
158
- type: String,
159
- required: false,
160
- default: "partial"
161
- },
162
- hideWhenDetached: {
163
- type: Boolean,
164
- required: false,
165
- default: false
166
- },
167
- updatePositionStrategy: {
168
- type: String,
169
- required: false,
170
- default: "optimized"
171
- },
172
- onPlaced: {
173
- type: Function,
174
- required: false
175
- },
176
- prioritizePosition: {
177
- type: Boolean,
178
- required: false,
179
- default: false
180
- }
181
- };
182
- const DestylerPopperContent = vue.defineComponent({
183
- name: "DestylerPopperContent",
184
- inheritAttrs: false,
185
- props: destylerPopperContentProps,
186
- setup(props, { attrs }) {
187
- const rootContext = injectPopperRootContext();
188
- const { forwardRef, currentElement: contentElement } = composition.useForwardExpose();
189
- const floatingRef = vue.ref();
190
- const arrow = vue.ref();
191
- const { width: arrowWidth, height: arrowHeight } = composition.useSize(arrow);
192
- const desiredPlacement = vue.computed(() => props.side + (props.align !== "center" ? `-${props.align}` : ""));
193
- const collisionPadding = vue.computed(() => {
194
- return typeof props.collisionPadding === "number" ? props.collisionPadding : { top: 0, right: 0, bottom: 0, left: 0, ...props.collisionPadding };
195
- });
196
- const boundary = vue.computed(() => {
197
- return Array.isArray(props.collisionBoundary) ? props.collisionBoundary : [props.collisionBoundary];
198
- });
199
- const detectOverflowOptions = vue.computed(() => {
200
- return {
201
- padding: collisionPadding.value,
202
- boundary: boundary.value.filter(isNotNull),
203
- // with `strategy: 'fixed'`, this is the only way to get it to respect boundaries
204
- altBoundary: boundary.value.length > 0
205
- };
206
- });
207
- const computedMiddleware = shared.computedEager(() => {
208
- return [
209
- vue$1.offset({
210
- mainAxis: props.sideOffset + arrowHeight.value,
211
- alignmentAxis: props.alignOffset
212
- }),
213
- props.avoidCollisions && vue$1.shift({
214
- mainAxis: true,
215
- crossAxis: !!props.prioritizePosition,
216
- limiter: props.sticky === "partial" ? vue$1.limitShift() : void 0,
217
- ...detectOverflowOptions.value
218
- }),
219
- !props.prioritizePosition && props.avoidCollisions && vue$1.flip({
220
- ...detectOverflowOptions.value
221
- }),
222
- vue$1.size({
223
- ...detectOverflowOptions.value,
224
- apply: ({ elements, rects, availableWidth, availableHeight }) => {
225
- const { width: anchorWidth, height: anchorHeight } = rects.reference;
226
- const contentStyle = elements.floating.style;
227
- Object.assign(elements.floating.style, {
228
- maxWidth: `${availableWidth}px`,
229
- maxHeight: `${availableHeight}px`
230
- });
231
- contentStyle.setProperty(
232
- "--destyler_popper_available_width",
233
- `${availableWidth}px`
234
- );
235
- contentStyle.setProperty(
236
- "--destyler_popper_available_height",
237
- `${availableHeight}px`
238
- );
239
- contentStyle.setProperty(
240
- "--destyler_popper_anchor_width",
241
- `${anchorWidth}px`
242
- );
243
- contentStyle.setProperty(
244
- "--destyler_popper_anchor_height",
245
- `${anchorHeight}px`
246
- );
247
- }
248
- }),
249
- arrow.value && vue$1.arrow({ element: arrow.value, padding: props.arrowPadding }),
250
- transformOrigin({
251
- arrowWidth: arrowWidth.value,
252
- arrowHeight: arrowHeight.value
253
- }),
254
- props.hideWhenDetached && vue$1.hide({ strategy: "referenceHidden", ...detectOverflowOptions.value })
255
- ];
256
- });
257
- const { floatingStyles, placement, isPositioned, middlewareData } = vue$1.useFloating(
258
- rootContext.anchor,
259
- floatingRef,
260
- {
261
- strategy: "fixed",
262
- placement: desiredPlacement,
263
- whileElementsMounted: (...args) => {
264
- const cleanup = vue$1.autoUpdate(...args, {
265
- animationFrame: props.updatePositionStrategy === "always"
266
- });
267
- return cleanup;
268
- },
269
- middleware: computedMiddleware
270
- }
271
- );
272
- const placedSide = vue.computed(() => getSideAndAlignFromPlacement(placement.value)[0]);
273
- const placedAlign = vue.computed(() => getSideAndAlignFromPlacement(placement.value)[1]);
274
- vue.watchEffect(() => {
275
- if (isPositioned.value)
276
- props.onPlaced?.();
277
- });
278
- const cannotCenterArrow = vue.computed(
279
- () => middlewareData.value.arrow?.centerOffset !== 0
280
- );
281
- const contentZIndex = vue.ref("");
282
- vue.watchEffect(() => {
283
- if (contentElement.value)
284
- contentZIndex.value = window.getComputedStyle(contentElement.value).zIndex;
285
- });
286
- const arrowX = vue.computed(() => middlewareData.value.arrow?.x ?? 0);
287
- const arrowY = vue.computed(() => middlewareData.value.arrow?.y ?? 0);
288
- providePopperContentContext({
289
- placedSide,
290
- onArrowChange: (element) => arrow.value = element,
291
- arrowX,
292
- arrowY,
293
- shouldHideArrow: cannotCenterArrow
294
- });
295
- return {
296
- floatingRef,
297
- floatingStyles,
298
- isPositioned,
299
- contentZIndex,
300
- middlewareData,
301
- forwardRef,
302
- placedSide,
303
- placedAlign,
304
- attrStyle: attrs.style
305
- };
306
- },
307
- render() {
308
- return vue.h("div", {
309
- "data-destyler-popper-content-wrapper": "",
310
- "ref": "floatingRef",
311
- "style": {
312
- ...this.floatingStyles,
313
- transform: this.isPositioned ? this.floatingStyles.transform : "translate(0, -200%)",
314
- minWidth: "max-content",
315
- zIndex: this.contentZIndex,
316
- ["--destyler_popper_transform_origin"]: [
317
- this.middlewareData.transformOrigin?.x,
318
- this.middlewareData.transformOrigin?.y
319
- ].join(" ")
320
- }
321
- }, vue.h(primitive.DestylerPrimitive, vue.mergeProps(this.$attrs, {
322
- "ref": (el) => this.forwardRef(el),
323
- "as": this.$props.as,
324
- "asChild": this.$props.asChild,
325
- "data-side": this.placedSide,
326
- "data-align": this.placedAlign,
327
- "style": {
328
- animation: !this.isPositioned ? "none" : void 0,
329
- opacity: this.middlewareData.hide?.referenceHidden ? 0 : void 0
330
- }
331
- }), {
332
- default: () => this.$slots.default?.()
333
- }));
334
- }
335
- });
336
-
337
- const OPPOSITE_SIDE = {
338
- top: "bottom",
339
- right: "left",
340
- bottom: "top",
341
- left: "right"
342
- };
343
- const destylerPopperArrowProps = {
344
- asChild: {
345
- type: Boolean,
346
- required: false,
347
- default: false
348
- },
349
- width: {
350
- type: Number,
351
- required: false,
352
- default: 5
353
- },
354
- height: {
355
- type: Number,
356
- required: false,
357
- default: 10
358
- },
359
- as: {
360
- type: [String, Object],
361
- required: false,
362
- default: "svg"
363
- }
364
- };
365
- const DestylerPopperArrow = vue.defineComponent({
366
- name: "DestylerPopperArrow",
367
- inheritAttrs: false,
368
- props: destylerPopperArrowProps,
369
- setup() {
370
- const contentContext = injectPopperContentContext();
371
- const baseSide = vue.computed(() => OPPOSITE_SIDE[contentContext.placedSide.value]);
372
- return {
373
- contentContext,
374
- baseSide
375
- };
376
- },
377
- render() {
378
- return vue.h("span", {
379
- ref: (el) => {
380
- this.contentContext.onArrowChange(el);
381
- return void 0;
382
- },
383
- style: {
384
- position: "absolute",
385
- left: this.contentContext.arrowX?.value ? `${this.contentContext.arrowX?.value}px` : void 0,
386
- top: this.contentContext.arrowY?.value ? `${this.contentContext.arrowY?.value}px` : void 0,
387
- [this.baseSide]: 0,
388
- transformOrigin: {
389
- top: "",
390
- right: "0 0",
391
- bottom: "center 0",
392
- left: "100% 0"
393
- }[this.contentContext.placedSide.value],
394
- transform: {
395
- top: "translateY(100%)",
396
- right: "translateY(50%) rotate(90deg) translateX(-50%)",
397
- bottom: `rotate(180deg)`,
398
- left: "translateY(50%) rotate(-90deg) translateX(50%)"
399
- }[this.contentContext.placedSide.value],
400
- visibility: this.contentContext.shouldHideArrow.value ? "hidden" : void 0
401
- }
402
- }, vue.h(arrow.DestylerArrow, vue.mergeProps(this.$attrs, {
403
- as: this.$props.as,
404
- asChild: this.$props.asChild,
405
- width: this.$props.width,
406
- height: this.$props.height,
407
- style: {
408
- display: "block"
409
- }
410
- }), {
411
- default: () => this.$slots.default?.()
412
- }));
413
- }
414
- });
415
-
416
- exports.DestylerPopperAnchor = DestylerPopperAnchor;
417
- exports.DestylerPopperArrow = DestylerPopperArrow;
418
- exports.DestylerPopperContent = DestylerPopperContent;
419
- exports.DestylerPopperRoot = DestylerPopperRoot;
14
+ exports.PopperAnchor = index.PopperAnchor;
15
+ exports.PopperArrow = index.PopperArrow;
16
+ exports.PopperContent = index.PopperContent;
17
+ exports.PopperRoot = index.PopperRoot;
18
+ exports.popperAnchorProps = index.popperAnchorProps;
19
+ exports.popperArrowProps = index.popperArrowProps;
20
+ exports.popperContentProps = index.popperContentProps;