yuyeon 0.0.12 → 0.0.14
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/style.css +1 -1
- package/dist/yuyeon.mjs +2370 -1926
- package/dist/yuyeon.umd.js +1 -1
- package/lib/components/card/YCard.scss +5 -0
- package/lib/components/chip/YChip.mjs +1 -0
- package/lib/components/chip/YChip.mjs.map +1 -1
- package/lib/components/chip/YChip.scss +7 -0
- package/lib/components/dialog/YDialog.mjs +24 -15
- package/lib/components/dialog/YDialog.mjs.map +1 -1
- package/lib/components/dialog/YDialog.scss +12 -0
- package/lib/components/dropdown/YDropdown.mjs +7 -0
- package/lib/components/dropdown/YDropdown.mjs.map +1 -0
- package/lib/components/dropdown/index.mjs +2 -0
- package/lib/components/dropdown/index.mjs.map +1 -0
- package/lib/components/layer/YLayer.mjs +99 -49
- package/lib/components/layer/YLayer.mjs.map +1 -1
- package/lib/components/menu/YMenu.mjs +20 -110
- package/lib/components/menu/YMenu.mjs.map +1 -1
- package/lib/components/pagination/YPagination.mjs +18 -7
- package/lib/components/pagination/YPagination.mjs.map +1 -1
- package/lib/components/pagination/YPagination.scss +10 -1
- package/lib/components/table/YDataTableBody.mjs +14 -2
- package/lib/components/table/YDataTableBody.mjs.map +1 -1
- package/lib/composables/coordinate/arrangement.mjs +14 -0
- package/lib/composables/coordinate/arrangement.mjs.map +1 -0
- package/lib/composables/coordinate/index.mjs +67 -0
- package/lib/composables/coordinate/index.mjs.map +1 -0
- package/lib/composables/coordinate/levitation.mjs +300 -0
- package/lib/composables/coordinate/levitation.mjs.map +1 -0
- package/lib/composables/coordinate/types.mjs +2 -0
- package/lib/composables/coordinate/types.mjs.map +1 -0
- package/lib/composables/coordinate/utils/point.mjs +55 -0
- package/lib/composables/coordinate/utils/point.mjs.map +1 -0
- package/lib/styles/base.scss +6 -0
- package/lib/styles/settings/provided.scss +33 -35
- package/lib/util/Rect.mjs +12 -0
- package/lib/util/Rect.mjs.map +1 -1
- package/lib/util/anchor.mjs +53 -0
- package/lib/util/anchor.mjs.map +1 -0
- package/lib/util/reactivity.mjs +14 -0
- package/lib/util/reactivity.mjs.map +1 -0
- package/package.json +1 -1
- package/types/components/chip/YChip.d.ts +1 -0
- package/types/components/dialog/YDialog.d.ts +1625 -8
- package/types/components/layer/YLayer.d.ts +1786 -1
- package/types/components/menu/YMenu.d.ts +1701 -43
- package/types/components/pagination/YPagination.d.ts +34 -14
- package/types/components/snackbar/YSnackbar.d.ts +2 -2
- package/types/components/table/YDataTable.d.ts +8 -8
- package/types/components/table/YDataTableBody.d.ts +4 -0
- package/types/components/table/YDataTableCell.d.ts +3 -3
- package/types/components/table/YDataTableServer.d.ts +8 -8
- package/types/components/table/composibles/header.d.ts +2 -2
- package/types/components/table/composibles/selection.d.ts +4 -4
- package/types/components/tooltip/YTooltip.d.ts +1620 -6
- package/types/composables/coordinate/arrangement.d.ts +6 -0
- package/types/composables/coordinate/index.d.ts +1638 -0
- package/types/composables/coordinate/levitation.d.ts +6 -0
- package/types/composables/coordinate/types.d.ts +6 -0
- package/types/composables/coordinate/utils/point.d.ts +21 -0
- package/types/util/Rect.d.ts +36 -0
- package/types/util/anchor.d.ts +23 -0
- package/types/util/reactivity.d.ts +2 -0
- package/types/util/scroll.d.ts +3 -0
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
import { computed, nextTick, onScopeDispose, ref, watch } from "vue";
|
|
2
|
+
import { MutableRect, getOverflow } from "../../util/Rect.mjs";
|
|
3
|
+
import { $computed } from "../../util/reactivity.mjs";
|
|
4
|
+
import { getScrollParents } from "../../util/scroll.mjs";
|
|
5
|
+
import { getBoundingPureRect, pixelCeil, pixelRound, toStyleSizeValue } from "../../util/ui.mjs";
|
|
6
|
+
import { anchorToPoint, getOffset } from "./utils/point.mjs";
|
|
7
|
+
import { flipAlign, flipCorner, flipSide, getAxis, parseAnchor } from "../../util/anchor.mjs";
|
|
8
|
+
import { clamp } from "../../util/common.mjs";
|
|
9
|
+
export function applyLevitation(props, state, coordinate, coordinateStyles) {
|
|
10
|
+
const {
|
|
11
|
+
contentEl,
|
|
12
|
+
baseEl,
|
|
13
|
+
active
|
|
14
|
+
} = state;
|
|
15
|
+
const isRtl = ref(false);
|
|
16
|
+
|
|
17
|
+
/* Content Limitations */
|
|
18
|
+
const [minWidth, minHeight, maxWidth, maxHeight] = ['minWidth', 'minHeight', 'maxWidth', 'maxHeight'].map(key => {
|
|
19
|
+
return computed(() => {
|
|
20
|
+
const val = parseFloat(props[key]);
|
|
21
|
+
return isNaN(val) ? Infinity : val;
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
/* Offset */
|
|
26
|
+
const offset = computed(() => {
|
|
27
|
+
if (Array.isArray(props.offset)) {
|
|
28
|
+
return props.offset;
|
|
29
|
+
}
|
|
30
|
+
if (typeof props.offset === 'string') {
|
|
31
|
+
const offset = props.offset.split(' ').map(parseFloat);
|
|
32
|
+
if (offset.length < 2) offset.push(0);
|
|
33
|
+
return offset;
|
|
34
|
+
}
|
|
35
|
+
return typeof props.offset === 'number' ? [props.offset, 0] : [0, 0];
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
/* Observing Update */
|
|
39
|
+
let observe = false;
|
|
40
|
+
const resizeObserver = new ResizeObserver(() => {
|
|
41
|
+
if (observe) updateCoordinate();
|
|
42
|
+
});
|
|
43
|
+
watch([state.baseEl, state.contentEl], (_ref, _ref2) => {
|
|
44
|
+
let [neoBaseEl, neoContentEl] = _ref;
|
|
45
|
+
let [oldBaseEl, oldContentEl] = _ref2;
|
|
46
|
+
if (oldBaseEl) resizeObserver.unobserve(oldBaseEl);
|
|
47
|
+
if (neoBaseEl) resizeObserver.observe(neoBaseEl);
|
|
48
|
+
if (oldContentEl) resizeObserver.unobserve(oldContentEl);
|
|
49
|
+
if (neoContentEl) resizeObserver.observe(neoContentEl);
|
|
50
|
+
}, {
|
|
51
|
+
immediate: true
|
|
52
|
+
});
|
|
53
|
+
onScopeDispose(() => {
|
|
54
|
+
resizeObserver.disconnect();
|
|
55
|
+
});
|
|
56
|
+
function getIgnoreInsetRect(el) {
|
|
57
|
+
const rect = getBoundingPureRect(el);
|
|
58
|
+
rect.x -= parseFloat(el.style.left || '0');
|
|
59
|
+
rect.y -= parseFloat(el.style.top || '0');
|
|
60
|
+
return rect;
|
|
61
|
+
}
|
|
62
|
+
function updateCoordinate() {
|
|
63
|
+
observe = false;
|
|
64
|
+
const $base = baseEl.value;
|
|
65
|
+
const $content = contentEl.value;
|
|
66
|
+
requestAnimationFrame(() => {
|
|
67
|
+
requestAnimationFrame(() => observe = true);
|
|
68
|
+
});
|
|
69
|
+
if (!$base || !$content) return;
|
|
70
|
+
const {
|
|
71
|
+
viewportMargin
|
|
72
|
+
} = props;
|
|
73
|
+
const baseRect = $base.getBoundingClientRect();
|
|
74
|
+
const contentRect = getIgnoreInsetRect($content);
|
|
75
|
+
const scrollParents = getScrollParents($content);
|
|
76
|
+
if (scrollParents.length < 1) {
|
|
77
|
+
scrollParents.push(document.documentElement);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Viewport area
|
|
82
|
+
*/
|
|
83
|
+
const viewport = scrollParents.reduce((box, el) => {
|
|
84
|
+
const rect = el.getBoundingClientRect();
|
|
85
|
+
const scrollBox = new MutableRect({
|
|
86
|
+
x: el === document.documentElement ? 0 : rect.x,
|
|
87
|
+
y: el === document.documentElement ? 0 : rect.y,
|
|
88
|
+
width: el.clientWidth,
|
|
89
|
+
height: el.clientHeight
|
|
90
|
+
});
|
|
91
|
+
if (box) {
|
|
92
|
+
return new MutableRect({
|
|
93
|
+
x: Math.max(box.left, scrollBox.left),
|
|
94
|
+
y: Math.max(box.top, scrollBox.top),
|
|
95
|
+
width: Math.min(box.right, scrollBox.right) - Math.max(box.left, scrollBox.left),
|
|
96
|
+
height: Math.min(box.bottom, scrollBox.bottom) - Math.max(box.top, scrollBox.top)
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
return scrollBox;
|
|
100
|
+
}, undefined);
|
|
101
|
+
viewport.x += viewportMargin;
|
|
102
|
+
viewport.y += viewportMargin;
|
|
103
|
+
viewport.width -= viewportMargin * 2;
|
|
104
|
+
viewport.height -= viewportMargin * 2;
|
|
105
|
+
const {
|
|
106
|
+
preferredAnchor,
|
|
107
|
+
preferredOrigin
|
|
108
|
+
} = $computed(() => {
|
|
109
|
+
const location = `${props.position} ${props.align}`;
|
|
110
|
+
const parsedAnchor = parseAnchor(location, false);
|
|
111
|
+
const parsedOrigin = props.origin === 'overlap' ? parsedAnchor : props.origin === 'auto' ? flipSide(parsedAnchor) : parseAnchor(props.origin, false);
|
|
112
|
+
|
|
113
|
+
// Some combinations of props may produce an invalid origin
|
|
114
|
+
if (parsedAnchor.side === parsedOrigin.side && parsedAnchor.align === flipAlign(parsedOrigin).align) {
|
|
115
|
+
return {
|
|
116
|
+
preferredAnchor: flipCorner(parsedAnchor),
|
|
117
|
+
preferredOrigin: flipCorner(parsedOrigin)
|
|
118
|
+
};
|
|
119
|
+
} else {
|
|
120
|
+
return {
|
|
121
|
+
preferredAnchor: parsedAnchor,
|
|
122
|
+
preferredOrigin: parsedOrigin
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
let placement = {
|
|
127
|
+
anchor: preferredAnchor.value,
|
|
128
|
+
origin: preferredOrigin.value
|
|
129
|
+
};
|
|
130
|
+
function checkOverflow(_placement) {
|
|
131
|
+
const box = new MutableRect(contentRect);
|
|
132
|
+
const targetPoint = anchorToPoint(_placement.anchor, baseRect);
|
|
133
|
+
const contentPoint = anchorToPoint(_placement.origin, box);
|
|
134
|
+
let {
|
|
135
|
+
x,
|
|
136
|
+
y
|
|
137
|
+
} = getOffset(targetPoint, contentPoint);
|
|
138
|
+
switch (_placement.anchor.side) {
|
|
139
|
+
case 'top':
|
|
140
|
+
y -= offset.value[0];
|
|
141
|
+
break;
|
|
142
|
+
case 'bottom':
|
|
143
|
+
y += offset.value[0];
|
|
144
|
+
break;
|
|
145
|
+
case 'left':
|
|
146
|
+
x -= offset.value[0];
|
|
147
|
+
break;
|
|
148
|
+
case 'right':
|
|
149
|
+
x += offset.value[0];
|
|
150
|
+
break;
|
|
151
|
+
}
|
|
152
|
+
switch (_placement.anchor.align) {
|
|
153
|
+
case 'top':
|
|
154
|
+
y -= offset.value[1];
|
|
155
|
+
break;
|
|
156
|
+
case 'bottom':
|
|
157
|
+
y += offset.value[1];
|
|
158
|
+
break;
|
|
159
|
+
case 'left':
|
|
160
|
+
x -= offset.value[1];
|
|
161
|
+
break;
|
|
162
|
+
case 'right':
|
|
163
|
+
x += offset.value[1];
|
|
164
|
+
break;
|
|
165
|
+
}
|
|
166
|
+
box.x += x;
|
|
167
|
+
box.y += y;
|
|
168
|
+
box.width = Math.min(box.width, maxWidth.value);
|
|
169
|
+
box.height = Math.min(box.height, maxHeight.value);
|
|
170
|
+
const overflows = getOverflow(box, viewport);
|
|
171
|
+
return {
|
|
172
|
+
overflows,
|
|
173
|
+
x,
|
|
174
|
+
y
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
let x = 0;
|
|
178
|
+
let y = 0;
|
|
179
|
+
const available = {
|
|
180
|
+
x: 0,
|
|
181
|
+
y: 0
|
|
182
|
+
};
|
|
183
|
+
const flipped = {
|
|
184
|
+
x: false,
|
|
185
|
+
y: false
|
|
186
|
+
};
|
|
187
|
+
let resets = -1;
|
|
188
|
+
while (true) {
|
|
189
|
+
if (resets++ > 10) {
|
|
190
|
+
break;
|
|
191
|
+
}
|
|
192
|
+
const {
|
|
193
|
+
x: _x,
|
|
194
|
+
y: _y,
|
|
195
|
+
overflows
|
|
196
|
+
} = checkOverflow(placement);
|
|
197
|
+
x += _x;
|
|
198
|
+
y += _y;
|
|
199
|
+
contentRect.x += _x;
|
|
200
|
+
contentRect.y += _y;
|
|
201
|
+
|
|
202
|
+
// flip
|
|
203
|
+
{
|
|
204
|
+
const axis = getAxis(placement.anchor);
|
|
205
|
+
const hasOverflowX = overflows.x.before || overflows.x.after;
|
|
206
|
+
const hasOverflowY = overflows.y.before || overflows.y.after;
|
|
207
|
+
let reset = false;
|
|
208
|
+
['x', 'y'].forEach(key => {
|
|
209
|
+
if (key === 'x' && hasOverflowX && !flipped.x || key === 'y' && hasOverflowY && !flipped.y) {
|
|
210
|
+
const newPlacement = {
|
|
211
|
+
anchor: {
|
|
212
|
+
...placement.anchor
|
|
213
|
+
},
|
|
214
|
+
origin: {
|
|
215
|
+
...placement.origin
|
|
216
|
+
}
|
|
217
|
+
};
|
|
218
|
+
const flip = key === 'x' ? axis === 'y' ? flipAlign : flipSide : axis === 'y' ? flipSide : flipAlign;
|
|
219
|
+
newPlacement.anchor = flip(newPlacement.anchor);
|
|
220
|
+
newPlacement.origin = flip(newPlacement.origin);
|
|
221
|
+
const {
|
|
222
|
+
overflows: newOverflows
|
|
223
|
+
} = checkOverflow(newPlacement);
|
|
224
|
+
if (newOverflows[key].before <= overflows[key].before && newOverflows[key].after <= overflows[key].after || newOverflows[key].before + newOverflows[key].after < (overflows[key].before + overflows[key].after) / 2) {
|
|
225
|
+
placement = newPlacement;
|
|
226
|
+
reset = flipped[key] = true;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
});
|
|
230
|
+
if (reset) continue;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// shift
|
|
234
|
+
if (overflows.x.before) {
|
|
235
|
+
x += overflows.x.before;
|
|
236
|
+
contentRect.x += overflows.x.before;
|
|
237
|
+
}
|
|
238
|
+
if (overflows.x.after) {
|
|
239
|
+
x -= overflows.x.after;
|
|
240
|
+
contentRect.x -= overflows.x.after;
|
|
241
|
+
}
|
|
242
|
+
if (overflows.y.before) {
|
|
243
|
+
y += overflows.y.before;
|
|
244
|
+
contentRect.y += overflows.y.before;
|
|
245
|
+
}
|
|
246
|
+
if (overflows.y.after) {
|
|
247
|
+
y -= overflows.y.after;
|
|
248
|
+
contentRect.y -= overflows.y.after;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// size
|
|
252
|
+
{
|
|
253
|
+
const overflows = getOverflow(contentRect, viewport);
|
|
254
|
+
available.x = viewport.width - overflows.x.before - overflows.x.after;
|
|
255
|
+
available.y = viewport.height - overflows.y.before - overflows.y.after;
|
|
256
|
+
x += overflows.x.before;
|
|
257
|
+
contentRect.x += overflows.x.before;
|
|
258
|
+
y += overflows.y.before;
|
|
259
|
+
contentRect.y += overflows.y.before;
|
|
260
|
+
}
|
|
261
|
+
break;
|
|
262
|
+
}
|
|
263
|
+
const axis = getAxis(placement.anchor);
|
|
264
|
+
Object.assign(coordinateStyles.value, {
|
|
265
|
+
'--y-levitation-anchor-origin': `${placement.anchor.side} ${placement.anchor.align}`,
|
|
266
|
+
transformOrigin: `${placement.origin.side} ${placement.origin.align}`,
|
|
267
|
+
top: toStyleSizeValue(pixelRound(y)),
|
|
268
|
+
left: isRtl.value ? undefined : toStyleSizeValue(pixelRound(x)),
|
|
269
|
+
right: isRtl.value ? toStyleSizeValue(pixelRound(-x)) : undefined,
|
|
270
|
+
minWidth: toStyleSizeValue(axis === 'y' ? Math.min(minWidth.value, baseRect.width) : minWidth.value),
|
|
271
|
+
maxWidth: toStyleSizeValue(pixelCeil(clamp(available.x, minWidth.value === Infinity ? 0 : minWidth.value, maxWidth.value))),
|
|
272
|
+
maxHeight: toStyleSizeValue(pixelCeil(clamp(available.y, minHeight.value === Infinity ? 0 : minHeight.value, maxHeight.value)))
|
|
273
|
+
});
|
|
274
|
+
return {
|
|
275
|
+
available,
|
|
276
|
+
contentRect
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
watch(() => [props.offset, props.minWidth, props.minHeight, props.maxWidth, props.maxHeight], () => updateCoordinate());
|
|
280
|
+
nextTick(() => {
|
|
281
|
+
const result = updateCoordinate();
|
|
282
|
+
if (!result) return;
|
|
283
|
+
const {
|
|
284
|
+
available,
|
|
285
|
+
contentRect
|
|
286
|
+
} = result;
|
|
287
|
+
if (contentRect.height > available.y) {
|
|
288
|
+
requestAnimationFrame(() => {
|
|
289
|
+
updateCoordinate();
|
|
290
|
+
requestAnimationFrame(() => {
|
|
291
|
+
updateCoordinate();
|
|
292
|
+
});
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
});
|
|
296
|
+
return {
|
|
297
|
+
updateCoordinate
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
//# sourceMappingURL=levitation.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"levitation.mjs","names":["computed","nextTick","onScopeDispose","ref","watch","MutableRect","getOverflow","$computed","getScrollParents","getBoundingPureRect","pixelCeil","pixelRound","toStyleSizeValue","anchorToPoint","getOffset","flipAlign","flipCorner","flipSide","getAxis","parseAnchor","clamp","applyLevitation","props","state","coordinate","coordinateStyles","contentEl","baseEl","active","isRtl","minWidth","minHeight","maxWidth","maxHeight","map","key","val","parseFloat","isNaN","Infinity","offset","Array","isArray","split","length","push","observe","resizeObserver","ResizeObserver","updateCoordinate","_ref","_ref2","neoBaseEl","neoContentEl","oldBaseEl","oldContentEl","unobserve","immediate","disconnect","getIgnoreInsetRect","el","rect","x","style","left","y","top","$base","value","$content","requestAnimationFrame","viewportMargin","baseRect","getBoundingClientRect","contentRect","scrollParents","document","documentElement","viewport","reduce","box","scrollBox","width","clientWidth","height","clientHeight","Math","max","min","right","bottom","undefined","preferredAnchor","preferredOrigin","location","position","align","parsedAnchor","parsedOrigin","origin","side","placement","anchor","checkOverflow","_placement","targetPoint","contentPoint","overflows","available","flipped","resets","_x","_y","axis","hasOverflowX","before","after","hasOverflowY","reset","forEach","newPlacement","flip","newOverflows","Object","assign","transformOrigin","result"],"sources":["../../../src/composables/coordinate/levitation.ts"],"sourcesContent":["import type { CSSProperties, Ref } from 'vue';\nimport { computed, nextTick, onScopeDispose, ref, watch } from \"vue\";\n\nimport { MutableRect, Rect, getOverflow } from '../../util/Rect';\nimport { $computed } from '../../util/reactivity';\nimport { getScrollParents } from '../../util/scroll';\nimport { getBoundingPureRect, pixelCeil, pixelRound, toStyleSizeValue } from \"../../util/ui\";\nimport {\n anchorToPoint,\n getOffset,\n} from './utils/point';\n\nimport { CoordinateState } from './types';\nimport { Anchor, flipAlign, flipCorner, flipSide, getAxis, parseAnchor } from \"../../util/anchor\";\nimport { clamp } from \"../../util/common\";\n\nexport function applyLevitation(\n props: any,\n state: CoordinateState,\n coordinate: Ref<Rect | undefined>,\n coordinateStyles: Ref<CSSProperties>,\n) {\n const { contentEl, baseEl, active } = state;\n\n const isRtl = ref(false);\n\n /* Content Limitations */\n const [minWidth, minHeight, maxWidth, maxHeight] = (\n ['minWidth', 'minHeight', 'maxWidth', 'maxHeight'] as const\n ).map((key) => {\n return computed(() => {\n const val = parseFloat(props[key]!);\n return isNaN(val) ? Infinity : val;\n });\n });\n\n /* Offset */\n const offset = computed(() => {\n if (Array.isArray(props.offset)) {\n return props.offset;\n }\n if (typeof props.offset === 'string') {\n const offset = props.offset.split(' ').map(parseFloat);\n if (offset.length < 2) offset.push(0);\n return offset;\n }\n return typeof props.offset === 'number' ? [props.offset, 0] : [0, 0];\n });\n\n /* Observing Update */\n let observe = false;\n const resizeObserver = new ResizeObserver(() => {\n if (observe) updateCoordinate();\n });\n watch(\n [state.baseEl, state.contentEl],\n ([neoBaseEl, neoContentEl], [oldBaseEl, oldContentEl]) => {\n if (oldBaseEl) resizeObserver.unobserve(oldBaseEl);\n if (neoBaseEl) resizeObserver.observe(neoBaseEl);\n\n if (oldContentEl) resizeObserver.unobserve(oldContentEl);\n if (neoContentEl) resizeObserver.observe(neoContentEl);\n },\n { immediate: true },\n );\n onScopeDispose(() => {\n resizeObserver.disconnect();\n });\n\n function getIgnoreInsetRect(el: HTMLElement) {\n const rect = getBoundingPureRect(el);\n rect.x -= parseFloat(el.style.left || '0');\n rect.y -= parseFloat(el.style.top || '0');\n return rect;\n }\n\n function updateCoordinate(): any {\n observe = false;\n const $base = baseEl.value;\n const $content = contentEl.value;\n requestAnimationFrame(() => {\n requestAnimationFrame(() => (observe = true));\n });\n\n if (!$base || !$content) return;\n\n const { viewportMargin } = props;\n\n const baseRect = $base.getBoundingClientRect();\n const contentRect = getIgnoreInsetRect($content);\n const scrollParents = getScrollParents($content);\n\n if (scrollParents.length < 1) {\n scrollParents.push(document.documentElement);\n }\n\n /**\n * Viewport area\n */\n const viewport = scrollParents.reduce<MutableRect>(\n (box: MutableRect | undefined, el) => {\n const rect = el.getBoundingClientRect();\n const scrollBox = new MutableRect({\n x: el === document.documentElement ? 0 : rect.x,\n y: el === document.documentElement ? 0 : rect.y,\n width: el.clientWidth,\n height: el.clientHeight,\n });\n\n if (box) {\n return new MutableRect({\n x: Math.max(box.left, scrollBox.left),\n y: Math.max(box.top, scrollBox.top),\n width:\n Math.min(box.right, scrollBox.right) -\n Math.max(box.left, scrollBox.left),\n height:\n Math.min(box.bottom, scrollBox.bottom) -\n Math.max(box.top, scrollBox.top),\n });\n }\n return scrollBox;\n },\n undefined!,\n );\n viewport.x += viewportMargin;\n viewport.y += viewportMargin;\n viewport.width -= viewportMargin * 2;\n viewport.height -= viewportMargin * 2;\n\n const { preferredAnchor, preferredOrigin } = $computed(() => {\n const location = `${props.position} ${props.align}` as Anchor;\n const parsedAnchor = parseAnchor(location, false);\n const parsedOrigin =\n props.origin === 'overlap'\n ? parsedAnchor\n : props.origin === 'auto'\n ? flipSide(parsedAnchor)\n : parseAnchor(props.origin, false);\n\n // Some combinations of props may produce an invalid origin\n if (\n parsedAnchor.side === parsedOrigin.side &&\n parsedAnchor.align === flipAlign(parsedOrigin).align\n ) {\n return {\n preferredAnchor: flipCorner(parsedAnchor),\n preferredOrigin: flipCorner(parsedOrigin),\n };\n } else {\n return {\n preferredAnchor: parsedAnchor,\n preferredOrigin: parsedOrigin,\n };\n }\n });\n\n let placement = {\n anchor: preferredAnchor.value,\n origin: preferredOrigin.value,\n };\n\n function checkOverflow(_placement: typeof placement) {\n const box = new MutableRect(contentRect);\n const targetPoint = anchorToPoint(_placement.anchor, baseRect);\n const contentPoint = anchorToPoint(_placement.origin, box);\n\n let { x, y } = getOffset(targetPoint, contentPoint);\n\n switch (_placement.anchor.side) {\n case 'top':\n y -= offset.value[0];\n break;\n case 'bottom':\n y += offset.value[0];\n break;\n case 'left':\n x -= offset.value[0];\n break;\n case 'right':\n x += offset.value[0];\n break;\n }\n\n switch (_placement.anchor.align) {\n case 'top':\n y -= offset.value[1];\n break;\n case 'bottom':\n y += offset.value[1];\n break;\n case 'left':\n x -= offset.value[1];\n break;\n case 'right':\n x += offset.value[1];\n break;\n }\n\n box.x += x;\n box.y += y;\n\n box.width = Math.min(box.width, maxWidth.value);\n box.height = Math.min(box.height, maxHeight.value);\n\n const overflows = getOverflow(box, viewport);\n\n return { overflows, x, y };\n }\n\n let x = 0;\n let y = 0;\n const available = { x: 0, y: 0 };\n const flipped = { x: false, y: false };\n let resets = -1;\n while (true) {\n if (resets++ > 10) {\n break;\n }\n\n const { x: _x, y: _y, overflows } = checkOverflow(placement);\n\n x += _x;\n y += _y;\n\n contentRect.x += _x;\n contentRect.y += _y;\n\n // flip\n {\n const axis = getAxis(placement.anchor);\n const hasOverflowX = overflows.x.before || overflows.x.after;\n const hasOverflowY = overflows.y.before || overflows.y.after;\n\n let reset = false;\n ['x', 'y'].forEach((key) => {\n if (\n (key === 'x' && hasOverflowX && !flipped.x) ||\n (key === 'y' && hasOverflowY && !flipped.y)\n ) {\n const newPlacement = {\n anchor: { ...placement.anchor },\n origin: { ...placement.origin },\n };\n const flip =\n key === 'x'\n ? axis === 'y'\n ? flipAlign\n : flipSide\n : axis === 'y'\n ? flipSide\n : flipAlign;\n newPlacement.anchor = flip(newPlacement.anchor);\n newPlacement.origin = flip(newPlacement.origin);\n const { overflows: newOverflows } = checkOverflow(newPlacement);\n if (\n (newOverflows[key].before <= overflows[key].before &&\n newOverflows[key].after <= overflows[key].after) ||\n newOverflows[key].before + newOverflows[key].after <\n (overflows[key].before + overflows[key].after) / 2\n ) {\n placement = newPlacement;\n reset = flipped[key] = true;\n }\n }\n });\n if (reset) continue;\n }\n\n // shift\n if (overflows.x.before) {\n x += overflows.x.before;\n contentRect.x += overflows.x.before;\n }\n if (overflows.x.after) {\n x -= overflows.x.after;\n contentRect.x -= overflows.x.after;\n }\n if (overflows.y.before) {\n y += overflows.y.before;\n contentRect.y += overflows.y.before;\n }\n if (overflows.y.after) {\n y -= overflows.y.after;\n contentRect.y -= overflows.y.after;\n }\n\n // size\n {\n const overflows = getOverflow(contentRect, viewport);\n available.x = viewport.width - overflows.x.before - overflows.x.after;\n available.y = viewport.height - overflows.y.before - overflows.y.after;\n\n x += overflows.x.before;\n contentRect.x += overflows.x.before;\n y += overflows.y.before;\n contentRect.y += overflows.y.before;\n }\n\n break;\n }\n\n const axis = getAxis(placement.anchor);\n\n Object.assign(coordinateStyles.value, {\n '--y-levitation-anchor-origin': `${placement.anchor.side} ${placement.anchor.align}`,\n transformOrigin: `${placement.origin.side} ${placement.origin.align}`,\n top: toStyleSizeValue(pixelRound(y)),\n left: isRtl.value ? undefined : toStyleSizeValue(pixelRound(x)),\n right: isRtl.value ? toStyleSizeValue(pixelRound(-x)) : undefined,\n minWidth: toStyleSizeValue(\n axis === 'y'\n ? Math.min(minWidth.value, baseRect.width)\n : minWidth.value,\n ),\n maxWidth: toStyleSizeValue(\n pixelCeil(\n clamp(\n available.x,\n minWidth.value === Infinity ? 0 : minWidth.value,\n maxWidth.value,\n ),\n ),\n ),\n maxHeight: toStyleSizeValue(\n pixelCeil(\n clamp(\n available.y,\n minHeight.value === Infinity ? 0 : minHeight.value,\n maxHeight.value,\n ),\n ),\n ),\n });\n\n return {\n available,\n contentRect,\n };\n }\n\n watch(\n () => [\n props.offset,\n props.minWidth,\n props.minHeight,\n props.maxWidth,\n props.maxHeight,\n ],\n () => updateCoordinate(),\n );\n\n nextTick(() => {\n const result = updateCoordinate();\n if (!result) return;\n const { available, contentRect } = result;\n if (contentRect.height > available.y) {\n requestAnimationFrame(() => {\n updateCoordinate();\n requestAnimationFrame(() => {\n updateCoordinate();\n });\n });\n }\n });\n\n return {\n updateCoordinate,\n };\n}\n"],"mappings":"AACA,SAASA,QAAQ,EAAEC,QAAQ,EAAEC,cAAc,EAAEC,GAAG,EAAEC,KAAK,QAAQ,KAAK;AAAC,SAE5DC,WAAW,EAAQC,WAAW;AAAA,SAC9BC,SAAS;AAAA,SACTC,gBAAgB;AAAA,SAChBC,mBAAmB,EAAEC,SAAS,EAAEC,UAAU,EAAEC,gBAAgB;AAAA,SAEnEC,aAAa,EACbC,SAAS;AAAA,SAIMC,SAAS,EAAEC,UAAU,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,WAAW;AAAA,SAC7DC,KAAK;AAEd,OAAO,SAASC,eAAeA,CAC7BC,KAAU,EACVC,KAAsB,EACtBC,UAAiC,EACjCC,gBAAoC,EACpC;EACA,MAAM;IAAEC,SAAS;IAAEC,MAAM;IAAEC;EAAO,CAAC,GAAGL,KAAK;EAE3C,MAAMM,KAAK,GAAG1B,GAAG,CAAC,KAAK,CAAC;;EAExB;EACA,MAAM,CAAC2B,QAAQ,EAAEC,SAAS,EAAEC,QAAQ,EAAEC,SAAS,CAAC,GAC9C,CAAC,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,CAAC,CAClDC,GAAG,CAAEC,GAAG,IAAK;IACb,OAAOnC,QAAQ,CAAC,MAAM;MACpB,MAAMoC,GAAG,GAAGC,UAAU,CAACf,KAAK,CAACa,GAAG,CAAE,CAAC;MACnC,OAAOG,KAAK,CAACF,GAAG,CAAC,GAAGG,QAAQ,GAAGH,GAAG;IACpC,CAAC,CAAC;EACJ,CAAC,CAAC;;EAEF;EACA,MAAMI,MAAM,GAAGxC,QAAQ,CAAC,MAAM;IAC5B,IAAIyC,KAAK,CAACC,OAAO,CAACpB,KAAK,CAACkB,MAAM,CAAC,EAAE;MAC/B,OAAOlB,KAAK,CAACkB,MAAM;IACrB;IACA,IAAI,OAAOlB,KAAK,CAACkB,MAAM,KAAK,QAAQ,EAAE;MACpC,MAAMA,MAAM,GAAGlB,KAAK,CAACkB,MAAM,CAACG,KAAK,CAAC,GAAG,CAAC,CAACT,GAAG,CAACG,UAAU,CAAC;MACtD,IAAIG,MAAM,CAACI,MAAM,GAAG,CAAC,EAAEJ,MAAM,CAACK,IAAI,CAAC,CAAC,CAAC;MACrC,OAAOL,MAAM;IACf;IACA,OAAO,OAAOlB,KAAK,CAACkB,MAAM,KAAK,QAAQ,GAAG,CAAClB,KAAK,CAACkB,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;EACtE,CAAC,CAAC;;EAEF;EACA,IAAIM,OAAO,GAAG,KAAK;EACnB,MAAMC,cAAc,GAAG,IAAIC,cAAc,CAAC,MAAM;IAC9C,IAAIF,OAAO,EAAEG,gBAAgB,CAAC,CAAC;EACjC,CAAC,CAAC;EACF7C,KAAK,CACH,CAACmB,KAAK,CAACI,MAAM,EAAEJ,KAAK,CAACG,SAAS,CAAC,EAC/B,CAAAwB,IAAA,EAAAC,KAAA,KAA0D;IAAA,IAAzD,CAACC,SAAS,EAAEC,YAAY,CAAC,GAAAH,IAAA;IAAA,IAAE,CAACI,SAAS,EAAEC,YAAY,CAAC,GAAAJ,KAAA;IACnD,IAAIG,SAAS,EAAEP,cAAc,CAACS,SAAS,CAACF,SAAS,CAAC;IAClD,IAAIF,SAAS,EAAEL,cAAc,CAACD,OAAO,CAACM,SAAS,CAAC;IAEhD,IAAIG,YAAY,EAAER,cAAc,CAACS,SAAS,CAACD,YAAY,CAAC;IACxD,IAAIF,YAAY,EAAEN,cAAc,CAACD,OAAO,CAACO,YAAY,CAAC;EACxD,CAAC,EACD;IAAEI,SAAS,EAAE;EAAK,CACpB,CAAC;EACDvD,cAAc,CAAC,MAAM;IACnB6C,cAAc,CAACW,UAAU,CAAC,CAAC;EAC7B,CAAC,CAAC;EAEF,SAASC,kBAAkBA,CAACC,EAAe,EAAE;IAC3C,MAAMC,IAAI,GAAGpD,mBAAmB,CAACmD,EAAE,CAAC;IACpCC,IAAI,CAACC,CAAC,IAAIzB,UAAU,CAACuB,EAAE,CAACG,KAAK,CAACC,IAAI,IAAI,GAAG,CAAC;IAC1CH,IAAI,CAACI,CAAC,IAAI5B,UAAU,CAACuB,EAAE,CAACG,KAAK,CAACG,GAAG,IAAI,GAAG,CAAC;IACzC,OAAOL,IAAI;EACb;EAEA,SAASZ,gBAAgBA,CAAA,EAAQ;IAC/BH,OAAO,GAAG,KAAK;IACf,MAAMqB,KAAK,GAAGxC,MAAM,CAACyC,KAAK;IAC1B,MAAMC,QAAQ,GAAG3C,SAAS,CAAC0C,KAAK;IAChCE,qBAAqB,CAAC,MAAM;MAC1BA,qBAAqB,CAAC,MAAOxB,OAAO,GAAG,IAAK,CAAC;IAC/C,CAAC,CAAC;IAEF,IAAI,CAACqB,KAAK,IAAI,CAACE,QAAQ,EAAE;IAEzB,MAAM;MAAEE;IAAe,CAAC,GAAGjD,KAAK;IAEhC,MAAMkD,QAAQ,GAAGL,KAAK,CAACM,qBAAqB,CAAC,CAAC;IAC9C,MAAMC,WAAW,GAAGf,kBAAkB,CAACU,QAAQ,CAAC;IAChD,MAAMM,aAAa,GAAGnE,gBAAgB,CAAC6D,QAAQ,CAAC;IAEhD,IAAIM,aAAa,CAAC/B,MAAM,GAAG,CAAC,EAAE;MAC5B+B,aAAa,CAAC9B,IAAI,CAAC+B,QAAQ,CAACC,eAAe,CAAC;IAC9C;;IAEA;AACJ;AACA;IACI,MAAMC,QAAQ,GAAGH,aAAa,CAACI,MAAM,CACnC,CAACC,GAA4B,EAAEpB,EAAE,KAAK;MACpC,MAAMC,IAAI,GAAGD,EAAE,CAACa,qBAAqB,CAAC,CAAC;MACvC,MAAMQ,SAAS,GAAG,IAAI5E,WAAW,CAAC;QAChCyD,CAAC,EAAEF,EAAE,KAAKgB,QAAQ,CAACC,eAAe,GAAG,CAAC,GAAGhB,IAAI,CAACC,CAAC;QAC/CG,CAAC,EAAEL,EAAE,KAAKgB,QAAQ,CAACC,eAAe,GAAG,CAAC,GAAGhB,IAAI,CAACI,CAAC;QAC/CiB,KAAK,EAAEtB,EAAE,CAACuB,WAAW;QACrBC,MAAM,EAAExB,EAAE,CAACyB;MACb,CAAC,CAAC;MAEF,IAAIL,GAAG,EAAE;QACP,OAAO,IAAI3E,WAAW,CAAC;UACrByD,CAAC,EAAEwB,IAAI,CAACC,GAAG,CAACP,GAAG,CAAChB,IAAI,EAAEiB,SAAS,CAACjB,IAAI,CAAC;UACrCC,CAAC,EAAEqB,IAAI,CAACC,GAAG,CAACP,GAAG,CAACd,GAAG,EAAEe,SAAS,CAACf,GAAG,CAAC;UACnCgB,KAAK,EACHI,IAAI,CAACE,GAAG,CAACR,GAAG,CAACS,KAAK,EAAER,SAAS,CAACQ,KAAK,CAAC,GACpCH,IAAI,CAACC,GAAG,CAACP,GAAG,CAAChB,IAAI,EAAEiB,SAAS,CAACjB,IAAI,CAAC;UACpCoB,MAAM,EACJE,IAAI,CAACE,GAAG,CAACR,GAAG,CAACU,MAAM,EAAET,SAAS,CAACS,MAAM,CAAC,GACtCJ,IAAI,CAACC,GAAG,CAACP,GAAG,CAACd,GAAG,EAAEe,SAAS,CAACf,GAAG;QACnC,CAAC,CAAC;MACJ;MACA,OAAOe,SAAS;IAClB,CAAC,EACDU,SACF,CAAC;IACDb,QAAQ,CAAChB,CAAC,IAAIS,cAAc;IAC5BO,QAAQ,CAACb,CAAC,IAAIM,cAAc;IAC5BO,QAAQ,CAACI,KAAK,IAAIX,cAAc,GAAG,CAAC;IACpCO,QAAQ,CAACM,MAAM,IAAIb,cAAc,GAAG,CAAC;IAErC,MAAM;MAAEqB,eAAe;MAAEC;IAAgB,CAAC,GAAGtF,SAAS,CAAC,MAAM;MAC3D,MAAMuF,QAAQ,GAAI,GAAExE,KAAK,CAACyE,QAAS,IAAGzE,KAAK,CAAC0E,KAAM,EAAW;MAC7D,MAAMC,YAAY,GAAG9E,WAAW,CAAC2E,QAAQ,EAAE,KAAK,CAAC;MACjD,MAAMI,YAAY,GAChB5E,KAAK,CAAC6E,MAAM,KAAK,SAAS,GACtBF,YAAY,GACZ3E,KAAK,CAAC6E,MAAM,KAAK,MAAM,GACvBlF,QAAQ,CAACgF,YAAY,CAAC,GACtB9E,WAAW,CAACG,KAAK,CAAC6E,MAAM,EAAE,KAAK,CAAC;;MAEtC;MACA,IACEF,YAAY,CAACG,IAAI,KAAKF,YAAY,CAACE,IAAI,IACvCH,YAAY,CAACD,KAAK,KAAKjF,SAAS,CAACmF,YAAY,CAAC,CAACF,KAAK,EACpD;QACA,OAAO;UACLJ,eAAe,EAAE5E,UAAU,CAACiF,YAAY,CAAC;UACzCJ,eAAe,EAAE7E,UAAU,CAACkF,YAAY;QAC1C,CAAC;MACH,CAAC,MAAM;QACL,OAAO;UACLN,eAAe,EAAEK,YAAY;UAC7BJ,eAAe,EAAEK;QACnB,CAAC;MACH;IACF,CAAC,CAAC;IAEF,IAAIG,SAAS,GAAG;MACdC,MAAM,EAAEV,eAAe,CAACxB,KAAK;MAC7B+B,MAAM,EAAEN,eAAe,CAACzB;IAC1B,CAAC;IAED,SAASmC,aAAaA,CAACC,UAA4B,EAAE;MACnD,MAAMxB,GAAG,GAAG,IAAI3E,WAAW,CAACqE,WAAW,CAAC;MACxC,MAAM+B,WAAW,GAAG5F,aAAa,CAAC2F,UAAU,CAACF,MAAM,EAAE9B,QAAQ,CAAC;MAC9D,MAAMkC,YAAY,GAAG7F,aAAa,CAAC2F,UAAU,CAACL,MAAM,EAAEnB,GAAG,CAAC;MAE1D,IAAI;QAAElB,CAAC;QAAEG;MAAE,CAAC,GAAGnD,SAAS,CAAC2F,WAAW,EAAEC,YAAY,CAAC;MAEnD,QAAQF,UAAU,CAACF,MAAM,CAACF,IAAI;QAC5B,KAAK,KAAK;UACRnC,CAAC,IAAIzB,MAAM,CAAC4B,KAAK,CAAC,CAAC,CAAC;UACpB;QACF,KAAK,QAAQ;UACXH,CAAC,IAAIzB,MAAM,CAAC4B,KAAK,CAAC,CAAC,CAAC;UACpB;QACF,KAAK,MAAM;UACTN,CAAC,IAAItB,MAAM,CAAC4B,KAAK,CAAC,CAAC,CAAC;UACpB;QACF,KAAK,OAAO;UACVN,CAAC,IAAItB,MAAM,CAAC4B,KAAK,CAAC,CAAC,CAAC;UACpB;MACJ;MAEA,QAAQoC,UAAU,CAACF,MAAM,CAACN,KAAK;QAC7B,KAAK,KAAK;UACR/B,CAAC,IAAIzB,MAAM,CAAC4B,KAAK,CAAC,CAAC,CAAC;UACpB;QACF,KAAK,QAAQ;UACXH,CAAC,IAAIzB,MAAM,CAAC4B,KAAK,CAAC,CAAC,CAAC;UACpB;QACF,KAAK,MAAM;UACTN,CAAC,IAAItB,MAAM,CAAC4B,KAAK,CAAC,CAAC,CAAC;UACpB;QACF,KAAK,OAAO;UACVN,CAAC,IAAItB,MAAM,CAAC4B,KAAK,CAAC,CAAC,CAAC;UACpB;MACJ;MAEAY,GAAG,CAAClB,CAAC,IAAIA,CAAC;MACVkB,GAAG,CAACf,CAAC,IAAIA,CAAC;MAEVe,GAAG,CAACE,KAAK,GAAGI,IAAI,CAACE,GAAG,CAACR,GAAG,CAACE,KAAK,EAAElD,QAAQ,CAACoC,KAAK,CAAC;MAC/CY,GAAG,CAACI,MAAM,GAAGE,IAAI,CAACE,GAAG,CAACR,GAAG,CAACI,MAAM,EAAEnD,SAAS,CAACmC,KAAK,CAAC;MAElD,MAAMuC,SAAS,GAAGrG,WAAW,CAAC0E,GAAG,EAAEF,QAAQ,CAAC;MAE5C,OAAO;QAAE6B,SAAS;QAAE7C,CAAC;QAAEG;MAAE,CAAC;IAC5B;IAEA,IAAIH,CAAC,GAAG,CAAC;IACT,IAAIG,CAAC,GAAG,CAAC;IACT,MAAM2C,SAAS,GAAG;MAAE9C,CAAC,EAAE,CAAC;MAAEG,CAAC,EAAE;IAAE,CAAC;IAChC,MAAM4C,OAAO,GAAG;MAAE/C,CAAC,EAAE,KAAK;MAAEG,CAAC,EAAE;IAAM,CAAC;IACtC,IAAI6C,MAAM,GAAG,CAAC,CAAC;IACf,OAAO,IAAI,EAAE;MACX,IAAIA,MAAM,EAAE,GAAG,EAAE,EAAE;QACjB;MACF;MAEA,MAAM;QAAEhD,CAAC,EAAEiD,EAAE;QAAE9C,CAAC,EAAE+C,EAAE;QAAEL;MAAU,CAAC,GAAGJ,aAAa,CAACF,SAAS,CAAC;MAE5DvC,CAAC,IAAIiD,EAAE;MACP9C,CAAC,IAAI+C,EAAE;MAEPtC,WAAW,CAACZ,CAAC,IAAIiD,EAAE;MACnBrC,WAAW,CAACT,CAAC,IAAI+C,EAAE;;MAEnB;MACA;QACE,MAAMC,IAAI,GAAG/F,OAAO,CAACmF,SAAS,CAACC,MAAM,CAAC;QACtC,MAAMY,YAAY,GAAGP,SAAS,CAAC7C,CAAC,CAACqD,MAAM,IAAIR,SAAS,CAAC7C,CAAC,CAACsD,KAAK;QAC5D,MAAMC,YAAY,GAAGV,SAAS,CAAC1C,CAAC,CAACkD,MAAM,IAAIR,SAAS,CAAC1C,CAAC,CAACmD,KAAK;QAE5D,IAAIE,KAAK,GAAG,KAAK;QACjB,CAAC,GAAG,EAAE,GAAG,CAAC,CAACC,OAAO,CAAEpF,GAAG,IAAK;UAC1B,IACGA,GAAG,KAAK,GAAG,IAAI+E,YAAY,IAAI,CAACL,OAAO,CAAC/C,CAAC,IACzC3B,GAAG,KAAK,GAAG,IAAIkF,YAAY,IAAI,CAACR,OAAO,CAAC5C,CAAE,EAC3C;YACA,MAAMuD,YAAY,GAAG;cACnBlB,MAAM,EAAE;gBAAE,GAAGD,SAAS,CAACC;cAAO,CAAC;cAC/BH,MAAM,EAAE;gBAAE,GAAGE,SAAS,CAACF;cAAO;YAChC,CAAC;YACD,MAAMsB,IAAI,GACRtF,GAAG,KAAK,GAAG,GACP8E,IAAI,KAAK,GAAG,GACVlG,SAAS,GACTE,QAAQ,GACVgG,IAAI,KAAK,GAAG,GACZhG,QAAQ,GACRF,SAAS;YACfyG,YAAY,CAAClB,MAAM,GAAGmB,IAAI,CAACD,YAAY,CAAClB,MAAM,CAAC;YAC/CkB,YAAY,CAACrB,MAAM,GAAGsB,IAAI,CAACD,YAAY,CAACrB,MAAM,CAAC;YAC/C,MAAM;cAAEQ,SAAS,EAAEe;YAAa,CAAC,GAAGnB,aAAa,CAACiB,YAAY,CAAC;YAC/D,IACGE,YAAY,CAACvF,GAAG,CAAC,CAACgF,MAAM,IAAIR,SAAS,CAACxE,GAAG,CAAC,CAACgF,MAAM,IAChDO,YAAY,CAACvF,GAAG,CAAC,CAACiF,KAAK,IAAIT,SAAS,CAACxE,GAAG,CAAC,CAACiF,KAAK,IACjDM,YAAY,CAACvF,GAAG,CAAC,CAACgF,MAAM,GAAGO,YAAY,CAACvF,GAAG,CAAC,CAACiF,KAAK,GAChD,CAACT,SAAS,CAACxE,GAAG,CAAC,CAACgF,MAAM,GAAGR,SAAS,CAACxE,GAAG,CAAC,CAACiF,KAAK,IAAI,CAAC,EACpD;cACAf,SAAS,GAAGmB,YAAY;cACxBF,KAAK,GAAGT,OAAO,CAAC1E,GAAG,CAAC,GAAG,IAAI;YAC7B;UACF;QACF,CAAC,CAAC;QACF,IAAImF,KAAK,EAAE;MACb;;MAEA;MACA,IAAIX,SAAS,CAAC7C,CAAC,CAACqD,MAAM,EAAE;QACtBrD,CAAC,IAAI6C,SAAS,CAAC7C,CAAC,CAACqD,MAAM;QACvBzC,WAAW,CAACZ,CAAC,IAAI6C,SAAS,CAAC7C,CAAC,CAACqD,MAAM;MACrC;MACA,IAAIR,SAAS,CAAC7C,CAAC,CAACsD,KAAK,EAAE;QACrBtD,CAAC,IAAI6C,SAAS,CAAC7C,CAAC,CAACsD,KAAK;QACtB1C,WAAW,CAACZ,CAAC,IAAI6C,SAAS,CAAC7C,CAAC,CAACsD,KAAK;MACpC;MACA,IAAIT,SAAS,CAAC1C,CAAC,CAACkD,MAAM,EAAE;QACtBlD,CAAC,IAAI0C,SAAS,CAAC1C,CAAC,CAACkD,MAAM;QACvBzC,WAAW,CAACT,CAAC,IAAI0C,SAAS,CAAC1C,CAAC,CAACkD,MAAM;MACrC;MACA,IAAIR,SAAS,CAAC1C,CAAC,CAACmD,KAAK,EAAE;QACrBnD,CAAC,IAAI0C,SAAS,CAAC1C,CAAC,CAACmD,KAAK;QACtB1C,WAAW,CAACT,CAAC,IAAI0C,SAAS,CAAC1C,CAAC,CAACmD,KAAK;MACpC;;MAEA;MACA;QACE,MAAMT,SAAS,GAAGrG,WAAW,CAACoE,WAAW,EAAEI,QAAQ,CAAC;QACpD8B,SAAS,CAAC9C,CAAC,GAAGgB,QAAQ,CAACI,KAAK,GAAGyB,SAAS,CAAC7C,CAAC,CAACqD,MAAM,GAAGR,SAAS,CAAC7C,CAAC,CAACsD,KAAK;QACrER,SAAS,CAAC3C,CAAC,GAAGa,QAAQ,CAACM,MAAM,GAAGuB,SAAS,CAAC1C,CAAC,CAACkD,MAAM,GAAGR,SAAS,CAAC1C,CAAC,CAACmD,KAAK;QAEtEtD,CAAC,IAAI6C,SAAS,CAAC7C,CAAC,CAACqD,MAAM;QACvBzC,WAAW,CAACZ,CAAC,IAAI6C,SAAS,CAAC7C,CAAC,CAACqD,MAAM;QACnClD,CAAC,IAAI0C,SAAS,CAAC1C,CAAC,CAACkD,MAAM;QACvBzC,WAAW,CAACT,CAAC,IAAI0C,SAAS,CAAC1C,CAAC,CAACkD,MAAM;MACrC;MAEA;IACF;IAEA,MAAMF,IAAI,GAAG/F,OAAO,CAACmF,SAAS,CAACC,MAAM,CAAC;IAEtCqB,MAAM,CAACC,MAAM,CAACnG,gBAAgB,CAAC2C,KAAK,EAAE;MACpC,8BAA8B,EAAG,GAAEiC,SAAS,CAACC,MAAM,CAACF,IAAK,IAAGC,SAAS,CAACC,MAAM,CAACN,KAAM,EAAC;MACpF6B,eAAe,EAAG,GAAExB,SAAS,CAACF,MAAM,CAACC,IAAK,IAAGC,SAAS,CAACF,MAAM,CAACH,KAAM,EAAC;MACrE9B,GAAG,EAAEtD,gBAAgB,CAACD,UAAU,CAACsD,CAAC,CAAC,CAAC;MACpCD,IAAI,EAAEnC,KAAK,CAACuC,KAAK,GAAGuB,SAAS,GAAG/E,gBAAgB,CAACD,UAAU,CAACmD,CAAC,CAAC,CAAC;MAC/D2B,KAAK,EAAE5D,KAAK,CAACuC,KAAK,GAAGxD,gBAAgB,CAACD,UAAU,CAAC,CAACmD,CAAC,CAAC,CAAC,GAAG6B,SAAS;MACjE7D,QAAQ,EAAElB,gBAAgB,CACxBqG,IAAI,KAAK,GAAG,GACR3B,IAAI,CAACE,GAAG,CAAC1D,QAAQ,CAACsC,KAAK,EAAEI,QAAQ,CAACU,KAAK,CAAC,GACxCpD,QAAQ,CAACsC,KACf,CAAC;MACDpC,QAAQ,EAAEpB,gBAAgB,CACxBF,SAAS,CACPU,KAAK,CACHwF,SAAS,CAAC9C,CAAC,EACXhC,QAAQ,CAACsC,KAAK,KAAK7B,QAAQ,GAAG,CAAC,GAAGT,QAAQ,CAACsC,KAAK,EAChDpC,QAAQ,CAACoC,KACX,CACF,CACF,CAAC;MACDnC,SAAS,EAAErB,gBAAgB,CACzBF,SAAS,CACPU,KAAK,CACHwF,SAAS,CAAC3C,CAAC,EACXlC,SAAS,CAACqC,KAAK,KAAK7B,QAAQ,GAAG,CAAC,GAAGR,SAAS,CAACqC,KAAK,EAClDnC,SAAS,CAACmC,KACZ,CACF,CACF;IACF,CAAC,CAAC;IAEF,OAAO;MACLwC,SAAS;MACTlC;IACF,CAAC;EACH;EAEAtE,KAAK,CACH,MAAM,CACJkB,KAAK,CAACkB,MAAM,EACZlB,KAAK,CAACQ,QAAQ,EACdR,KAAK,CAACS,SAAS,EACfT,KAAK,CAACU,QAAQ,EACdV,KAAK,CAACW,SAAS,CAChB,EACD,MAAMgB,gBAAgB,CAAC,CACzB,CAAC;EAEDhD,QAAQ,CAAC,MAAM;IACb,MAAM6H,MAAM,GAAG7E,gBAAgB,CAAC,CAAC;IACjC,IAAI,CAAC6E,MAAM,EAAE;IACb,MAAM;MAAElB,SAAS;MAAElC;IAAY,CAAC,GAAGoD,MAAM;IACzC,IAAIpD,WAAW,CAACU,MAAM,GAAGwB,SAAS,CAAC3C,CAAC,EAAE;MACpCK,qBAAqB,CAAC,MAAM;QAC1BrB,gBAAgB,CAAC,CAAC;QAClBqB,qBAAqB,CAAC,MAAM;UAC1BrB,gBAAgB,CAAC,CAAC;QACpB,CAAC,CAAC;MACJ,CAAC,CAAC;IACJ;EACF,CAAC,CAAC;EAEF,OAAO;IACLA;EACF,CAAC;AACH"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.mjs","names":[],"sources":["../../../src/composables/coordinate/types.ts"],"sourcesContent":["import type { Ref } from \"vue\";\r\n\r\nexport interface CoordinateState {\r\n contentEl: Ref<HTMLElement | undefined>;\r\n baseEl: Ref<HTMLElement | undefined>;\r\n active: Ref<boolean>;\r\n}\r\n"],"mappings":""}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/** Convert a point in local space to viewport space */
|
|
2
|
+
export function elementToViewport(point, offset) {
|
|
3
|
+
return {
|
|
4
|
+
x: point.x + offset.x,
|
|
5
|
+
y: point.y + offset.y
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
/** Convert a point in viewport space to local space */
|
|
10
|
+
export function viewportToElement(point, offset) {
|
|
11
|
+
return {
|
|
12
|
+
x: point.x - offset.x,
|
|
13
|
+
y: point.y - offset.y
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/** Get the difference between two points */
|
|
18
|
+
export function getOffset(a, b) {
|
|
19
|
+
return {
|
|
20
|
+
x: a.x - b.x,
|
|
21
|
+
y: a.y - b.y
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/** Convert an anchor object to a point in local space */
|
|
26
|
+
export function anchorToPoint(anchor, box) {
|
|
27
|
+
if (anchor.side === 'top' || anchor.side === 'bottom') {
|
|
28
|
+
const {
|
|
29
|
+
side,
|
|
30
|
+
align
|
|
31
|
+
} = anchor;
|
|
32
|
+
const x = align === 'left' ? 0 : align === 'center' ? box.width / 2 : align === 'right' ? box.width : align;
|
|
33
|
+
const y = side === 'top' ? 0 : side === 'bottom' ? box.height : side;
|
|
34
|
+
return elementToViewport({
|
|
35
|
+
x,
|
|
36
|
+
y
|
|
37
|
+
}, box);
|
|
38
|
+
} else if (anchor.side === 'left' || anchor.side === 'right') {
|
|
39
|
+
const {
|
|
40
|
+
side,
|
|
41
|
+
align
|
|
42
|
+
} = anchor;
|
|
43
|
+
const x = side === 'left' ? 0 : side === 'right' ? box.width : side;
|
|
44
|
+
const y = align === 'top' ? 0 : align === 'center' ? box.height / 2 : align === 'bottom' ? box.height : align;
|
|
45
|
+
return elementToViewport({
|
|
46
|
+
x,
|
|
47
|
+
y
|
|
48
|
+
}, box);
|
|
49
|
+
}
|
|
50
|
+
return elementToViewport({
|
|
51
|
+
x: box.width / 2,
|
|
52
|
+
y: box.height / 2
|
|
53
|
+
}, box);
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=point.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"point.mjs","names":["elementToViewport","point","offset","x","y","viewportToElement","getOffset","a","b","anchorToPoint","anchor","box","side","align","width","height"],"sources":["../../../../src/composables/coordinate/utils/point.ts"],"sourcesContent":["import { MutableRect } from '../../../util/Rect';\nimport { ParsedAnchor } from '../../../util/anchor';\n\ntype Point = { x: number; y: number };\ndeclare class As<T extends string> {\n private as: T;\n}\ntype ElementPoint = Point & As<'element'>;\ntype ViewportPoint = Point & As<'viewport'>;\ntype Offset = Point & As<'offset'>;\n\n/** Convert a point in local space to viewport space */\nexport function elementToViewport(\n point: ElementPoint,\n offset: Offset | MutableRect,\n) {\n return {\n x: point.x + offset.x,\n y: point.y + offset.y,\n } as ViewportPoint;\n}\n\n/** Convert a point in viewport space to local space */\nexport function viewportToElement(\n point: ViewportPoint,\n offset: Offset | MutableRect,\n) {\n return {\n x: point.x - offset.x,\n y: point.y - offset.y,\n } as ElementPoint;\n}\n\n/** Get the difference between two points */\nexport function getOffset<T extends Point>(a: T, b: T) {\n return {\n x: a.x - b.x,\n y: a.y - b.y,\n } as Offset;\n}\n\n/** Convert an anchor object to a point in local space */\nexport function anchorToPoint(\n anchor: ParsedAnchor,\n box: MutableRect,\n): ViewportPoint {\n if (anchor.side === 'top' || anchor.side === 'bottom') {\n const { side, align } = anchor;\n\n const x: number =\n align === 'left'\n ? 0\n : align === 'center'\n ? box.width / 2\n : align === 'right'\n ? box.width\n : align;\n const y: number =\n side === 'top' ? 0 : side === 'bottom' ? box.height : side;\n\n return elementToViewport({ x, y } as ElementPoint, box);\n } else if (anchor.side === 'left' || anchor.side === 'right') {\n const { side, align } = anchor;\n\n const x: number = side === 'left' ? 0 : side === 'right' ? box.width : side;\n const y: number =\n align === 'top'\n ? 0\n : align === 'center'\n ? box.height / 2\n : align === 'bottom'\n ? box.height\n : align;\n\n return elementToViewport({ x, y } as ElementPoint, box);\n }\n\n return elementToViewport(\n {\n x: box.width / 2,\n y: box.height / 2,\n } as ElementPoint,\n box,\n );\n}\n"],"mappings":"AAWA;AACA,OAAO,SAASA,iBAAiBA,CAC/BC,KAAmB,EACnBC,MAA4B,EAC5B;EACA,OAAO;IACLC,CAAC,EAAEF,KAAK,CAACE,CAAC,GAAGD,MAAM,CAACC,CAAC;IACrBC,CAAC,EAAEH,KAAK,CAACG,CAAC,GAAGF,MAAM,CAACE;EACtB,CAAC;AACH;;AAEA;AACA,OAAO,SAASC,iBAAiBA,CAC/BJ,KAAoB,EACpBC,MAA4B,EAC5B;EACA,OAAO;IACLC,CAAC,EAAEF,KAAK,CAACE,CAAC,GAAGD,MAAM,CAACC,CAAC;IACrBC,CAAC,EAAEH,KAAK,CAACG,CAAC,GAAGF,MAAM,CAACE;EACtB,CAAC;AACH;;AAEA;AACA,OAAO,SAASE,SAASA,CAAkBC,CAAI,EAAEC,CAAI,EAAE;EACrD,OAAO;IACLL,CAAC,EAAEI,CAAC,CAACJ,CAAC,GAAGK,CAAC,CAACL,CAAC;IACZC,CAAC,EAAEG,CAAC,CAACH,CAAC,GAAGI,CAAC,CAACJ;EACb,CAAC;AACH;;AAEA;AACA,OAAO,SAASK,aAAaA,CAC3BC,MAAoB,EACpBC,GAAgB,EACD;EACf,IAAID,MAAM,CAACE,IAAI,KAAK,KAAK,IAAIF,MAAM,CAACE,IAAI,KAAK,QAAQ,EAAE;IACrD,MAAM;MAAEA,IAAI;MAAEC;IAAM,CAAC,GAAGH,MAAM;IAE9B,MAAMP,CAAS,GACbU,KAAK,KAAK,MAAM,GACZ,CAAC,GACDA,KAAK,KAAK,QAAQ,GAClBF,GAAG,CAACG,KAAK,GAAG,CAAC,GACbD,KAAK,KAAK,OAAO,GACjBF,GAAG,CAACG,KAAK,GACTD,KAAK;IACX,MAAMT,CAAS,GACbQ,IAAI,KAAK,KAAK,GAAG,CAAC,GAAGA,IAAI,KAAK,QAAQ,GAAGD,GAAG,CAACI,MAAM,GAAGH,IAAI;IAE5D,OAAOZ,iBAAiB,CAAC;MAAEG,CAAC;MAAEC;IAAE,CAAC,EAAkBO,GAAG,CAAC;EACzD,CAAC,MAAM,IAAID,MAAM,CAACE,IAAI,KAAK,MAAM,IAAIF,MAAM,CAACE,IAAI,KAAK,OAAO,EAAE;IAC5D,MAAM;MAAEA,IAAI;MAAEC;IAAM,CAAC,GAAGH,MAAM;IAE9B,MAAMP,CAAS,GAAGS,IAAI,KAAK,MAAM,GAAG,CAAC,GAAGA,IAAI,KAAK,OAAO,GAAGD,GAAG,CAACG,KAAK,GAAGF,IAAI;IAC3E,MAAMR,CAAS,GACbS,KAAK,KAAK,KAAK,GACX,CAAC,GACDA,KAAK,KAAK,QAAQ,GAClBF,GAAG,CAACI,MAAM,GAAG,CAAC,GACdF,KAAK,KAAK,QAAQ,GAClBF,GAAG,CAACI,MAAM,GACVF,KAAK;IAEX,OAAOb,iBAAiB,CAAC;MAAEG,CAAC;MAAEC;IAAE,CAAC,EAAkBO,GAAG,CAAC;EACzD;EAEA,OAAOX,iBAAiB,CACtB;IACEG,CAAC,EAAEQ,GAAG,CAACG,KAAK,GAAG,CAAC;IAChBV,CAAC,EAAEO,GAAG,CAACI,MAAM,GAAG;EAClB,CAAC,EACDJ,GACF,CAAC;AACH"}
|
package/lib/styles/base.scss
CHANGED
|
@@ -1,35 +1,33 @@
|
|
|
1
|
-
$box-side-direction: ('top', 'right', 'bottom', 'left');
|
|
2
|
-
$box-side-combinations: (
|
|
3
|
-
'a': (),
|
|
4
|
-
'v': (
|
|
5
|
-
'top',
|
|
6
|
-
'bottom',
|
|
7
|
-
),
|
|
8
|
-
'h': (
|
|
9
|
-
'right',
|
|
10
|
-
'left',
|
|
11
|
-
),
|
|
12
|
-
't': (
|
|
13
|
-
'top',
|
|
14
|
-
),
|
|
15
|
-
'r': (
|
|
16
|
-
'right',
|
|
17
|
-
),
|
|
18
|
-
'b': (
|
|
19
|
-
'bottom',
|
|
20
|
-
),
|
|
21
|
-
'l': (
|
|
22
|
-
'left',
|
|
23
|
-
),
|
|
24
|
-
);
|
|
25
|
-
|
|
26
|
-
$space-types: (
|
|
27
|
-
'm': 'margin',
|
|
28
|
-
'p': 'padding',
|
|
29
|
-
);
|
|
30
|
-
|
|
31
|
-
$text-aligns: (
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
'right',
|
|
35
|
-
)
|
|
1
|
+
$box-side-direction: ('top', 'right', 'bottom', 'left');
|
|
2
|
+
$box-side-combinations: (
|
|
3
|
+
'a': (),
|
|
4
|
+
'v': (
|
|
5
|
+
'top',
|
|
6
|
+
'bottom',
|
|
7
|
+
),
|
|
8
|
+
'h': (
|
|
9
|
+
'right',
|
|
10
|
+
'left',
|
|
11
|
+
),
|
|
12
|
+
't': (
|
|
13
|
+
'top',
|
|
14
|
+
),
|
|
15
|
+
'r': (
|
|
16
|
+
'right',
|
|
17
|
+
),
|
|
18
|
+
'b': (
|
|
19
|
+
'bottom',
|
|
20
|
+
),
|
|
21
|
+
'l': (
|
|
22
|
+
'left',
|
|
23
|
+
),
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
$space-types: (
|
|
27
|
+
'm': 'margin',
|
|
28
|
+
'p': 'padding',
|
|
29
|
+
);
|
|
30
|
+
|
|
31
|
+
$text-aligns: ('center', 'left', 'right');
|
|
32
|
+
|
|
33
|
+
$font-weights: (100, 200, 300, 400, 500, 600, 700, 800, 900);
|
package/lib/util/Rect.mjs
CHANGED
|
@@ -24,4 +24,16 @@ export class MutableRect {
|
|
|
24
24
|
return this.x + this.width;
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
|
+
export function getOverflow(a, b) {
|
|
28
|
+
return {
|
|
29
|
+
x: {
|
|
30
|
+
before: Math.max(0, b.left - a.left),
|
|
31
|
+
after: Math.max(0, a.right - b.right)
|
|
32
|
+
},
|
|
33
|
+
y: {
|
|
34
|
+
before: Math.max(0, b.top - a.top),
|
|
35
|
+
after: Math.max(0, a.bottom - b.bottom)
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
}
|
|
27
39
|
//# sourceMappingURL=Rect.mjs.map
|
package/lib/util/Rect.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Rect.mjs","names":["MutableRect","constructor","_ref","x","y","width","height","top","bottom","left","right"],"sources":["../../src/util/Rect.ts"],"sourcesContent":["export interface Rect {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n\r\n get top(): number;\r\n get bottom(): number;\r\n get left(): number;\r\n get right(): number;\r\n}\r\n\r\nexport class MutableRect implements Rect {\r\n public x: number;\r\n\r\n public y: number;\r\n\r\n public width: number;\r\n\r\n public height: number\r\n\r\n constructor({ x, y, width, height }: { x: number, y: number, width: number, height: number }) {\r\n this.x = x ?? 0;\r\n this.y = y ?? 0;\r\n this.width = width ?? 0;\r\n this.height = height ?? 0;\r\n }\r\n\r\n public get top(): number {\r\n return this.y;\r\n }\r\n\r\n public get bottom(): number {\r\n return this.y + this.height;\r\n }\r\n\r\n public get left(): number {\r\n return this.x;\r\n }\r\n\r\n public get right(): number {\r\n return this.x + this.width;\r\n }\r\n}\r\n"],"mappings":"AAYA,OAAO,MAAMA,WAAW,CAAiB;EASvCC,WAAWA,CAAAC,IAAA,EAAmF;IAAA,IAAlF;MAAEC,CAAC;MAAEC,CAAC;MAAEC,KAAK;MAAEC;IAAgE,CAAC,GAAAJ,IAAA;IAC1F,IAAI,CAACC,CAAC,GAAGA,CAAC,IAAI,CAAC;IACf,IAAI,CAACC,CAAC,GAAGA,CAAC,IAAI,CAAC;IACf,IAAI,CAACC,KAAK,GAAGA,KAAK,IAAI,CAAC;IACvB,IAAI,CAACC,MAAM,GAAGA,MAAM,IAAI,CAAC;EAC3B;EAEA,IAAWC,GAAGA,CAAA,EAAW;IACvB,OAAO,IAAI,CAACH,CAAC;EACf;EAEA,IAAWI,MAAMA,CAAA,EAAW;IAC1B,OAAO,IAAI,CAACJ,CAAC,GAAG,IAAI,CAACE,MAAM;EAC7B;EAEA,IAAWG,IAAIA,CAAA,EAAW;IACxB,OAAO,IAAI,CAACN,CAAC;EACf;EAEA,IAAWO,KAAKA,CAAA,EAAW;IACzB,OAAO,IAAI,CAACP,CAAC,GAAG,IAAI,CAACE,KAAK;EAC5B;AACF"}
|
|
1
|
+
{"version":3,"file":"Rect.mjs","names":["MutableRect","constructor","_ref","x","y","width","height","top","bottom","left","right","getOverflow","a","b","before","Math","max","after"],"sources":["../../src/util/Rect.ts"],"sourcesContent":["export interface Rect {\r\n x: number;\r\n y: number;\r\n width: number;\r\n height: number;\r\n\r\n get top(): number;\r\n get bottom(): number;\r\n get left(): number;\r\n get right(): number;\r\n}\r\n\r\nexport class MutableRect implements Rect {\r\n public x: number;\r\n\r\n public y: number;\r\n\r\n public width: number;\r\n\r\n public height: number\r\n\r\n constructor({ x, y, width, height }: { x: number, y: number, width: number, height: number }) {\r\n this.x = x ?? 0;\r\n this.y = y ?? 0;\r\n this.width = width ?? 0;\r\n this.height = height ?? 0;\r\n }\r\n\r\n public get top(): number {\r\n return this.y;\r\n }\r\n\r\n public get bottom(): number {\r\n return this.y + this.height;\r\n }\r\n\r\n public get left(): number {\r\n return this.x;\r\n }\r\n\r\n public get right(): number {\r\n return this.x + this.width;\r\n }\r\n}\r\n\r\nexport function getOverflow (a: MutableRect, b: MutableRect) {\r\n return {\r\n x: {\r\n before: Math.max(0, b.left - a.left),\r\n after: Math.max(0, a.right - b.right),\r\n },\r\n y: {\r\n before: Math.max(0, b.top - a.top),\r\n after: Math.max(0, a.bottom - b.bottom),\r\n },\r\n }\r\n}\r\n"],"mappings":"AAYA,OAAO,MAAMA,WAAW,CAAiB;EASvCC,WAAWA,CAAAC,IAAA,EAAmF;IAAA,IAAlF;MAAEC,CAAC;MAAEC,CAAC;MAAEC,KAAK;MAAEC;IAAgE,CAAC,GAAAJ,IAAA;IAC1F,IAAI,CAACC,CAAC,GAAGA,CAAC,IAAI,CAAC;IACf,IAAI,CAACC,CAAC,GAAGA,CAAC,IAAI,CAAC;IACf,IAAI,CAACC,KAAK,GAAGA,KAAK,IAAI,CAAC;IACvB,IAAI,CAACC,MAAM,GAAGA,MAAM,IAAI,CAAC;EAC3B;EAEA,IAAWC,GAAGA,CAAA,EAAW;IACvB,OAAO,IAAI,CAACH,CAAC;EACf;EAEA,IAAWI,MAAMA,CAAA,EAAW;IAC1B,OAAO,IAAI,CAACJ,CAAC,GAAG,IAAI,CAACE,MAAM;EAC7B;EAEA,IAAWG,IAAIA,CAAA,EAAW;IACxB,OAAO,IAAI,CAACN,CAAC;EACf;EAEA,IAAWO,KAAKA,CAAA,EAAW;IACzB,OAAO,IAAI,CAACP,CAAC,GAAG,IAAI,CAACE,KAAK;EAC5B;AACF;AAEA,OAAO,SAASM,WAAWA,CAAEC,CAAc,EAAEC,CAAc,EAAE;EAC3D,OAAO;IACLV,CAAC,EAAE;MACDW,MAAM,EAAEC,IAAI,CAACC,GAAG,CAAC,CAAC,EAAEH,CAAC,CAACJ,IAAI,GAAGG,CAAC,CAACH,IAAI,CAAC;MACpCQ,KAAK,EAAEF,IAAI,CAACC,GAAG,CAAC,CAAC,EAAEJ,CAAC,CAACF,KAAK,GAAGG,CAAC,CAACH,KAAK;IACtC,CAAC;IACDN,CAAC,EAAE;MACDU,MAAM,EAAEC,IAAI,CAACC,GAAG,CAAC,CAAC,EAAEH,CAAC,CAACN,GAAG,GAAGK,CAAC,CAACL,GAAG,CAAC;MAClCU,KAAK,EAAEF,IAAI,CAACC,GAAG,CAAC,CAAC,EAAEJ,CAAC,CAACJ,MAAM,GAAGK,CAAC,CAACL,MAAM;IACxC;EACF,CAAC;AACH"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
const includes = (array, item) => array.includes(item);
|
|
2
|
+
const block = ['top', 'bottom'];
|
|
3
|
+
const inline = ['start', 'end', 'left', 'right'];
|
|
4
|
+
/** Parse a raw anchor string into an object */
|
|
5
|
+
export function parseAnchor(anchor, isRtl) {
|
|
6
|
+
let [side, align] = anchor.split(' ');
|
|
7
|
+
if (!align) {
|
|
8
|
+
align = includes(block, side) ? 'start' : includes(inline, side) ? 'top' : 'center';
|
|
9
|
+
}
|
|
10
|
+
return {
|
|
11
|
+
side: toPhysical(side, isRtl),
|
|
12
|
+
align: toPhysical(align, isRtl)
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export function toPhysical(str, isRtl) {
|
|
16
|
+
if (str === 'start') return isRtl ? 'right' : 'left';
|
|
17
|
+
if (str === 'end') return isRtl ? 'left' : 'right';
|
|
18
|
+
return str;
|
|
19
|
+
}
|
|
20
|
+
export function flipSide(anchor) {
|
|
21
|
+
return {
|
|
22
|
+
side: {
|
|
23
|
+
center: 'center',
|
|
24
|
+
top: 'bottom',
|
|
25
|
+
bottom: 'top',
|
|
26
|
+
left: 'right',
|
|
27
|
+
right: 'left'
|
|
28
|
+
}[anchor.side],
|
|
29
|
+
align: anchor.align
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export function flipAlign(anchor) {
|
|
33
|
+
return {
|
|
34
|
+
side: anchor.side,
|
|
35
|
+
align: {
|
|
36
|
+
center: 'center',
|
|
37
|
+
top: 'bottom',
|
|
38
|
+
bottom: 'top',
|
|
39
|
+
left: 'right',
|
|
40
|
+
right: 'left'
|
|
41
|
+
}[anchor.align]
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
export function flipCorner(anchor) {
|
|
45
|
+
return {
|
|
46
|
+
side: anchor.align,
|
|
47
|
+
align: anchor.side
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
export function getAxis(anchor) {
|
|
51
|
+
return includes(block, anchor.side) ? 'y' : 'x';
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=anchor.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anchor.mjs","names":["includes","array","item","block","inline","parseAnchor","anchor","isRtl","side","align","split","toPhysical","str","flipSide","center","top","bottom","left","right","flipAlign","flipCorner","getAxis"],"sources":["../../src/util/anchor.ts"],"sourcesContent":["\r\nconst includes = <T, A extends T>(\r\n array: ReadonlyArray<A>,\r\n item: T,\r\n): item is A => array.includes(item as A);\r\n\r\nconst block = ['top', 'bottom'] as const;\r\nconst inline = ['start', 'end', 'left', 'right'] as const;\r\ntype Tblock = (typeof block)[number];\r\ntype Tinline = (typeof inline)[number];\r\nexport type Anchor =\r\n | Tblock\r\n | Tinline\r\n | 'center'\r\n | 'center center'\r\n | `${Tblock} ${Tinline | 'center'}`\r\n | `${Tinline} ${Tblock | 'center'}`;\r\nexport type ParsedAnchor =\r\n | { side: 'center'; align: 'center' }\r\n | { side: Tblock; align: 'left' | 'right' | 'center' }\r\n | { side: 'left' | 'right'; align: Tblock | 'center' };\r\n\r\n/** Parse a raw anchor string into an object */\r\nexport function parseAnchor(anchor: Anchor, isRtl: boolean) {\r\n let [side, align] = anchor.split(' ') as [\r\n Tblock | Tinline | 'center',\r\n Tblock | Tinline | 'center' | undefined,\r\n ];\r\n if (!align) {\r\n align = includes(block, side)\r\n ? 'start'\r\n : includes(inline, side)\r\n ? 'top'\r\n : 'center';\r\n }\r\n\r\n return {\r\n side: toPhysical(side, isRtl),\r\n align: toPhysical(align, isRtl),\r\n } as ParsedAnchor;\r\n}\r\n\r\nexport function toPhysical(str: 'center' | Tblock | Tinline, isRtl: boolean) {\r\n if (str === 'start') return isRtl ? 'right' : 'left';\r\n if (str === 'end') return isRtl ? 'left' : 'right';\r\n return str;\r\n}\r\n\r\nexport function flipSide(anchor: ParsedAnchor) {\r\n return {\r\n side: {\r\n center: 'center',\r\n top: 'bottom',\r\n bottom: 'top',\r\n left: 'right',\r\n right: 'left',\r\n }[anchor.side],\r\n align: anchor.align,\r\n } as ParsedAnchor;\r\n}\r\n\r\nexport function flipAlign(anchor: ParsedAnchor) {\r\n return {\r\n side: anchor.side,\r\n align: {\r\n center: 'center',\r\n top: 'bottom',\r\n bottom: 'top',\r\n left: 'right',\r\n right: 'left',\r\n }[anchor.align],\r\n } as ParsedAnchor;\r\n}\r\n\r\nexport function flipCorner(anchor: ParsedAnchor) {\r\n return {\r\n side: anchor.align,\r\n align: anchor.side,\r\n } as ParsedAnchor;\r\n}\r\n\r\nexport function getAxis(anchor: ParsedAnchor) {\r\n return includes(block, anchor.side) ? 'y' : 'x';\r\n}\r\n"],"mappings":"AACA,MAAMA,QAAQ,GAAGA,CACfC,KAAuB,EACvBC,IAAO,KACOD,KAAK,CAACD,QAAQ,CAACE,IAAS,CAAC;AAEzC,MAAMC,KAAK,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAU;AACxC,MAAMC,MAAM,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAU;AAezD;AACA,OAAO,SAASC,WAAWA,CAACC,MAAc,EAAEC,KAAc,EAAE;EAC1D,IAAI,CAACC,IAAI,EAAEC,KAAK,CAAC,GAAGH,MAAM,CAACI,KAAK,CAAC,GAAG,CAGnC;EACD,IAAI,CAACD,KAAK,EAAE;IACVA,KAAK,GAAGT,QAAQ,CAACG,KAAK,EAAEK,IAAI,CAAC,GACzB,OAAO,GACPR,QAAQ,CAACI,MAAM,EAAEI,IAAI,CAAC,GACpB,KAAK,GACL,QAAQ;EAChB;EAEA,OAAO;IACLA,IAAI,EAAEG,UAAU,CAACH,IAAI,EAAED,KAAK,CAAC;IAC7BE,KAAK,EAAEE,UAAU,CAACF,KAAK,EAAEF,KAAK;EAChC,CAAC;AACH;AAEA,OAAO,SAASI,UAAUA,CAACC,GAAgC,EAAEL,KAAc,EAAE;EAC3E,IAAIK,GAAG,KAAK,OAAO,EAAE,OAAOL,KAAK,GAAG,OAAO,GAAG,MAAM;EACpD,IAAIK,GAAG,KAAK,KAAK,EAAE,OAAOL,KAAK,GAAG,MAAM,GAAG,OAAO;EAClD,OAAOK,GAAG;AACZ;AAEA,OAAO,SAASC,QAAQA,CAACP,MAAoB,EAAE;EAC7C,OAAO;IACLE,IAAI,EAAE;MACJM,MAAM,EAAE,QAAQ;MAChBC,GAAG,EAAE,QAAQ;MACbC,MAAM,EAAE,KAAK;MACbC,IAAI,EAAE,OAAO;MACbC,KAAK,EAAE;IACT,CAAC,CAACZ,MAAM,CAACE,IAAI,CAAC;IACdC,KAAK,EAAEH,MAAM,CAACG;EAChB,CAAC;AACH;AAEA,OAAO,SAASU,SAASA,CAACb,MAAoB,EAAE;EAC9C,OAAO;IACLE,IAAI,EAAEF,MAAM,CAACE,IAAI;IACjBC,KAAK,EAAE;MACLK,MAAM,EAAE,QAAQ;MAChBC,GAAG,EAAE,QAAQ;MACbC,MAAM,EAAE,KAAK;MACbC,IAAI,EAAE,OAAO;MACbC,KAAK,EAAE;IACT,CAAC,CAACZ,MAAM,CAACG,KAAK;EAChB,CAAC;AACH;AAEA,OAAO,SAASW,UAAUA,CAACd,MAAoB,EAAE;EAC/C,OAAO;IACLE,IAAI,EAAEF,MAAM,CAACG,KAAK;IAClBA,KAAK,EAAEH,MAAM,CAACE;EAChB,CAAC;AACH;AAEA,OAAO,SAASa,OAAOA,CAACf,MAAoB,EAAE;EAC5C,OAAON,QAAQ,CAACG,KAAK,EAAEG,MAAM,CAACE,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG;AACjD"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { computed, reactive, toRefs, watchEffect } from 'vue';
|
|
2
|
+
export function $computed(getter) {
|
|
3
|
+
const refs = reactive({});
|
|
4
|
+
const base = computed(getter);
|
|
5
|
+
watchEffect(() => {
|
|
6
|
+
for (const key in base.value) {
|
|
7
|
+
refs[key] = base.value[key];
|
|
8
|
+
}
|
|
9
|
+
}, {
|
|
10
|
+
flush: 'sync'
|
|
11
|
+
});
|
|
12
|
+
return toRefs(refs);
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=reactivity.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reactivity.mjs","names":["computed","reactive","toRefs","watchEffect","$computed","getter","refs","base","key","value","flush"],"sources":["../../src/util/reactivity.ts"],"sourcesContent":["import type { ComputedGetter } from 'vue';\nimport { computed, reactive, toRefs, watchEffect } from 'vue';\n\nexport function $computed<T extends object>(getter: ComputedGetter<T>) {\n const refs = reactive({}) as T;\n const base = computed(getter);\n watchEffect(\n () => {\n for (const key in base.value) {\n refs[key] = base.value[key];\n }\n },\n { flush: 'sync' },\n );\n return toRefs(refs);\n}\n"],"mappings":"AACA,SAASA,QAAQ,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,WAAW,QAAQ,KAAK;AAE7D,OAAO,SAASC,SAASA,CAAmBC,MAAyB,EAAE;EACrE,MAAMC,IAAI,GAAGL,QAAQ,CAAC,CAAC,CAAC,CAAM;EAC9B,MAAMM,IAAI,GAAGP,QAAQ,CAACK,MAAM,CAAC;EAC7BF,WAAW,CACT,MAAM;IACJ,KAAK,MAAMK,GAAG,IAAID,IAAI,CAACE,KAAK,EAAE;MAC5BH,IAAI,CAACE,GAAG,CAAC,GAAGD,IAAI,CAACE,KAAK,CAACD,GAAG,CAAC;IAC7B;EACF,CAAC,EACD;IAAEE,KAAK,EAAE;EAAO,CAClB,CAAC;EACD,OAAOR,MAAM,CAACI,IAAI,CAAC;AACrB"}
|
package/package.json
CHANGED