@fiscozen/composables 1.1.0 → 1.1.1
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/CHANGELOG.md +10 -0
- package/dist/composables.js +47 -43
- package/dist/composables.umd.cjs +1 -1
- package/package.json +2 -2
- package/src/__tests__/useFloating.spec.ts +169 -0
- package/src/composables/useFloating.ts +61 -21
- package/coverage/base.css +0 -224
- package/coverage/block-navigation.js +0 -87
- package/coverage/clover.xml +0 -313
- package/coverage/coverage-final.json +0 -10
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +0 -131
- package/coverage/prettify.css +0 -1
- package/coverage/prettify.js +0 -2
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +0 -210
- package/coverage/src/FzFloating.vue.html +0 -847
- package/coverage/src/composables/index.html +0 -206
- package/coverage/src/composables/useBreakpoints.ts.html +0 -223
- package/coverage/src/composables/useClickOutside.ts.html +0 -247
- package/coverage/src/composables/useCurrency.ts.html +0 -124
- package/coverage/src/composables/useFloating.ts.html +0 -1906
- package/coverage/src/composables/useKeyDown.ts.html +0 -172
- package/coverage/src/composables/useKeyUp.ts.html +0 -181
- package/coverage/src/composables/useMediaQuery.ts.html +0 -151
- package/coverage/src/index.html +0 -131
- package/coverage/src/types.ts.html +0 -271
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# @fiscozen/composables
|
|
2
2
|
|
|
3
|
+
## 1.1.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- ea5c15c: FzFloating: keep floating content inside the viewport horizontally and vertically
|
|
8
|
+
|
|
9
|
+
`useFloating`'s boundary correction previously clamped the floating element to the resolved container rect only. For openerless / container-less consumers (e.g. `FzDropdown`) the container resolves to `document.body`, whose rect can be wider than — or extend below — the visible viewport on narrow/mobile screens. A dropdown opened from a control near the right edge (such as a per-row kebab menu in a table) could therefore render overflowing off the right edge or overlapping adjacent menus.
|
|
10
|
+
|
|
11
|
+
Boundary correction now clamps against the intersection of the container and the viewport (`window.innerWidth`/`innerHeight`, mirroring the auto-positioning util) and keeps an 8px safety margin: if the element would overflow the right edge it is shifted left so its right edge stays on screen, the left edge is clamped to the margin, and the same is applied vertically. Behaviour is unchanged when there is enough room.
|
|
12
|
+
|
|
3
13
|
## 1.1.0
|
|
4
14
|
|
|
5
15
|
### Minor Changes
|
package/dist/composables.js
CHANGED
|
@@ -327,21 +327,25 @@ var C = (e, t) => {
|
|
|
327
327
|
y: 0
|
|
328
328
|
}
|
|
329
329
|
};
|
|
330
|
-
}, R =
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
330
|
+
}, R = 8, z = () => ({
|
|
331
|
+
left: 0,
|
|
332
|
+
top: 0,
|
|
333
|
+
right: window.innerWidth,
|
|
334
|
+
bottom: window.innerHeight
|
|
335
|
+
}), B = (e, t) => ({
|
|
336
|
+
left: Math.max(e.left, t.left),
|
|
337
|
+
right: Math.min(e.right, t.right),
|
|
338
|
+
top: Math.max(e.top, t.top),
|
|
339
|
+
bottom: Math.min(e.bottom, t.bottom)
|
|
340
|
+
}), V = (e, t, n, r, i = z(), a = R) => {
|
|
341
|
+
let o = { ...e }, s = { ...r }, c = B(n, i), l = c.left + a, u = Math.max(l, c.right - a - t.width);
|
|
342
|
+
o.x > u && (o.x = u, s.x = 0), o.x < l && (o.x = l, s.x = 0);
|
|
343
|
+
let d = c.top + a, f = Math.max(d, c.bottom - a - t.height);
|
|
344
|
+
return o.y > f && (o.y = f, s.y = 0), o.y < d && (o.y = d, s.y = 0), {
|
|
345
|
+
position: o,
|
|
346
|
+
transform: s
|
|
343
347
|
};
|
|
344
|
-
},
|
|
348
|
+
}, H = (e, t, n, r, i) => {
|
|
345
349
|
let a = i ? null : t;
|
|
346
350
|
switch (e) {
|
|
347
351
|
case "auto": return k(a, n, r);
|
|
@@ -352,7 +356,7 @@ var C = (e, t) => {
|
|
|
352
356
|
case "auto-vertical-end": return k(a, n, r, "end", !0);
|
|
353
357
|
default: return "bottom-start";
|
|
354
358
|
}
|
|
355
|
-
},
|
|
359
|
+
}, ee = (e) => e.startsWith("auto"), U = (e) => {
|
|
356
360
|
let t = m("auto"), n = m(), r = m(), i = m(), a = m(), o = p({ position: {
|
|
357
361
|
x: 0,
|
|
358
362
|
y: 0
|
|
@@ -392,8 +396,8 @@ var C = (e, t) => {
|
|
|
392
396
|
s.element.style.display = "none";
|
|
393
397
|
return;
|
|
394
398
|
}
|
|
395
|
-
l.value.observe(s.element), l.value.observe(s.container),
|
|
396
|
-
let p = M(window.getComputedStyle(s.element)), m = s.opener && d.opener ? F(n.value, d.opener, p) : L(n.value, d.container, d.element), h =
|
|
399
|
+
l.value.observe(s.element), l.value.observe(s.container), ee(n.value) && s.opener && (n.value = H(n.value, s.container, s.element, s.opener, e.useViewport?.value ?? !1));
|
|
400
|
+
let p = M(window.getComputedStyle(s.element)), m = s.opener && d.opener ? F(n.value, d.opener, p) : L(n.value, d.container, d.element), h = V(A(d.element, m.position, m.transform.x, m.transform.y), d.element, d.container, m.transform);
|
|
397
401
|
o.position.x = h.position.x, o.position.y = h.position.y, Object.assign(s.element.style, {
|
|
398
402
|
top: `${o.position.y}px`,
|
|
399
403
|
left: `${o.position.x}px`,
|
|
@@ -409,7 +413,7 @@ var C = (e, t) => {
|
|
|
409
413
|
};
|
|
410
414
|
//#endregion
|
|
411
415
|
//#region src/composables/useMediaQuery.ts
|
|
412
|
-
function
|
|
416
|
+
function W(e) {
|
|
413
417
|
let n = window.matchMedia(e), r = m(n.matches);
|
|
414
418
|
function i(e) {
|
|
415
419
|
r.value = e.matches;
|
|
@@ -422,16 +426,16 @@ function H(e) {
|
|
|
422
426
|
}
|
|
423
427
|
//#endregion
|
|
424
428
|
//#region src/composables/useBreakpoints.ts
|
|
425
|
-
function
|
|
429
|
+
function te(e) {
|
|
426
430
|
return {
|
|
427
431
|
isGreater(t) {
|
|
428
|
-
return
|
|
432
|
+
return W(`(min-width: ${e[t]})`);
|
|
429
433
|
},
|
|
430
434
|
isSmaller(t) {
|
|
431
|
-
return
|
|
435
|
+
return W(`(max-width: ${e[t]})`);
|
|
432
436
|
},
|
|
433
437
|
isInBetween(t, n) {
|
|
434
|
-
return
|
|
438
|
+
return W(`(min-width: ${e[t]}) and (max-width: ${e[n]})`);
|
|
435
439
|
},
|
|
436
440
|
current() {
|
|
437
441
|
let n = Object.entries(e).map(([e, t]) => ({
|
|
@@ -439,7 +443,7 @@ function U(e) {
|
|
|
439
443
|
value: parseInt(t, 10)
|
|
440
444
|
})).sort((e, t) => e.value - t.value), r = n.map(({ name: e, value: t }) => ({
|
|
441
445
|
name: e,
|
|
442
|
-
matches:
|
|
446
|
+
matches: W(`(min-width: ${t}px)`)
|
|
443
447
|
}));
|
|
444
448
|
return t(() => {
|
|
445
449
|
let e = n[0].name;
|
|
@@ -451,7 +455,7 @@ function U(e) {
|
|
|
451
455
|
}
|
|
452
456
|
//#endregion
|
|
453
457
|
//#region src/composables/useClickOutside.ts
|
|
454
|
-
function
|
|
458
|
+
function G(e, t, n) {
|
|
455
459
|
if (!e) throw Error("A target component has to be provided.");
|
|
456
460
|
if (!t) throw Error("A callback has to be provided.");
|
|
457
461
|
let r = (n) => {
|
|
@@ -471,7 +475,7 @@ function W(e, t, n) {
|
|
|
471
475
|
}
|
|
472
476
|
//#endregion
|
|
473
477
|
//#region src/composables/useKeyDown.ts
|
|
474
|
-
function
|
|
478
|
+
function K(e, t) {
|
|
475
479
|
if (!e) throw Error("A target component has to be provided.");
|
|
476
480
|
if (!t || typeof t != "function") throw Error("A callback has to be provided.");
|
|
477
481
|
let n = (e) => {
|
|
@@ -485,7 +489,7 @@ function G(e, t) {
|
|
|
485
489
|
}
|
|
486
490
|
//#endregion
|
|
487
491
|
//#region src/composables/useKeyUp.ts
|
|
488
|
-
function
|
|
492
|
+
function q(e, t) {
|
|
489
493
|
if (!e || typeof e != "function") throw Error("A callback has to be provided.");
|
|
490
494
|
let n = (t) => {
|
|
491
495
|
e(t);
|
|
@@ -506,10 +510,10 @@ function K(e, t) {
|
|
|
506
510
|
}
|
|
507
511
|
//#endregion
|
|
508
512
|
//#region src/composables/useCurrency.ts
|
|
509
|
-
var
|
|
513
|
+
var J = (e) => ({
|
|
510
514
|
format: w,
|
|
511
515
|
parse: T
|
|
512
|
-
}),
|
|
516
|
+
}), Y = {
|
|
513
517
|
global: {
|
|
514
518
|
blue: {
|
|
515
519
|
50: {
|
|
@@ -2032,7 +2036,7 @@ var q = (e) => ({
|
|
|
2032
2036
|
},
|
|
2033
2037
|
$themes: [],
|
|
2034
2038
|
$metadata: { tokenSetOrder: ["global", "alias"] }
|
|
2035
|
-
},
|
|
2039
|
+
}, X = {
|
|
2036
2040
|
$schema: "http://json-schema.org/draft-07/schema#",
|
|
2037
2041
|
description: "Lista dei colori da includere nella safelist di Tailwind. Per aggiungere un nuovo colore, aggiungi il suo nome qui e rigenera il build con 'pnpm run build'.",
|
|
2038
2042
|
safeColorNames: [
|
|
@@ -2044,7 +2048,7 @@ var q = (e) => ({
|
|
|
2044
2048
|
"grey",
|
|
2045
2049
|
"core"
|
|
2046
2050
|
]
|
|
2047
|
-
},
|
|
2051
|
+
}, Z = {
|
|
2048
2052
|
$schema: "http://json-schema.org/draft-07/schema#",
|
|
2049
2053
|
description: "Lista dei colori semantici da includere nella safelist di Tailwind. Per aggiungere un nuovo colore semantico, aggiungi il suo nome qui e rigenera il build con 'pnpm run build'.",
|
|
2050
2054
|
semanticColorNames: [
|
|
@@ -2053,16 +2057,16 @@ var q = (e) => ({
|
|
|
2053
2057
|
"success",
|
|
2054
2058
|
"info"
|
|
2055
2059
|
]
|
|
2056
|
-
},
|
|
2057
|
-
|
|
2058
|
-
let t =
|
|
2060
|
+
}, ne = X.safeColorNames, re = Z.semanticColorNames, Q = {};
|
|
2061
|
+
ne.forEach((e) => {
|
|
2062
|
+
let t = Y.global[e];
|
|
2059
2063
|
t && Object.keys(t).forEach((n) => {
|
|
2060
2064
|
let r = t[n]?.value;
|
|
2061
2065
|
r && (Q[e] || (Q[e] = {}), Q[e][n] = r);
|
|
2062
2066
|
});
|
|
2063
2067
|
});
|
|
2064
|
-
var $ =
|
|
2065
|
-
$ &&
|
|
2068
|
+
var $ = Y.global.semantic;
|
|
2069
|
+
$ && re.forEach((e) => {
|
|
2066
2070
|
let t = $[e];
|
|
2067
2071
|
t && typeof t == "object" && Object.keys(t).forEach((n) => {
|
|
2068
2072
|
let r = t[n]?.value;
|
|
@@ -2074,7 +2078,7 @@ $ && ee.forEach((e) => {
|
|
|
2074
2078
|
});
|
|
2075
2079
|
//#endregion
|
|
2076
2080
|
//#region ../style/src/constants.ts
|
|
2077
|
-
var
|
|
2081
|
+
var ie = Object.entries(Y.global.breakpoint).reduce((e, [t, n]) => (e[t] = n.value, e), {}), ae = /* @__PURE__ */ o({
|
|
2078
2082
|
__name: "FzFloating",
|
|
2079
2083
|
props: {
|
|
2080
2084
|
isOpen: {
|
|
@@ -2095,7 +2099,7 @@ var te = Object.entries(J.global.breakpoint).reduce((e, [t, n]) => (e[t] = n.val
|
|
|
2095
2099
|
},
|
|
2096
2100
|
emits: ["fzfloating:setPosition"],
|
|
2097
2101
|
setup(o, { expose: s, emit: d }) {
|
|
2098
|
-
let p = o, C = d, w = m(null), T = m(null), E = y(), D =
|
|
2102
|
+
let p = o, C = d, w = m(null), T = m(null), E = y(), D = W(`(max-width: ${ie.xs})`), O = !1, k = !1, A = null, j = null, M = {
|
|
2099
2103
|
position: p.position,
|
|
2100
2104
|
element: { domRef: w },
|
|
2101
2105
|
container: { domRef: g(p.container || document.body) },
|
|
@@ -2106,7 +2110,7 @@ var te = Object.entries(J.global.breakpoint).reduce((e, [t, n]) => (e[t] = n.val
|
|
|
2106
2110
|
}
|
|
2107
2111
|
}, N = _(M);
|
|
2108
2112
|
E.opener && (M.opener = { domRef: T });
|
|
2109
|
-
let P =
|
|
2113
|
+
let P = U(N), F = () => {
|
|
2110
2114
|
O || !k || (O = !0, requestAnimationFrame(() => {
|
|
2111
2115
|
k && p.isOpen && P.setPosition(), O = !1;
|
|
2112
2116
|
}));
|
|
@@ -2140,9 +2144,9 @@ var te = Object.entries(J.global.breakpoint).reduce((e, [t, n]) => (e[t] = n.val
|
|
|
2140
2144
|
}), l(() => {
|
|
2141
2145
|
k = !1, z();
|
|
2142
2146
|
});
|
|
2143
|
-
let B = (e) => e.startsWith("bottom") ? "mt-4" : e.startsWith("top") ? "mb-4" : e.startsWith("left") ? "mr-4" : e.startsWith("right") ? "ml-4" : "mt-4",
|
|
2147
|
+
let B = (e) => e.startsWith("bottom") ? "mt-4" : e.startsWith("top") ? "mb-4" : e.startsWith("left") ? "mr-4" : e.startsWith("right") ? "ml-4" : "mt-4", V = t(() => B(P.actualPosition?.value ?? p.position)), H = t(() => p.overrideContentClass ? p.contentClass : [
|
|
2144
2148
|
"bg-core-white fixed",
|
|
2145
|
-
|
|
2149
|
+
V.value,
|
|
2146
2150
|
p.contentClass
|
|
2147
2151
|
]);
|
|
2148
2152
|
return s({ setPosition: P.setPosition }), (t, s) => (f(), i("div", null, [
|
|
@@ -2160,7 +2164,7 @@ var te = Object.entries(J.global.breakpoint).reduce((e, [t, n]) => (e[t] = n.val
|
|
|
2160
2164
|
key: 0,
|
|
2161
2165
|
ref_key: "content",
|
|
2162
2166
|
ref: w,
|
|
2163
|
-
class: c(["fz__floating__content w-full sm:w-auto",
|
|
2167
|
+
class: c(["fz__floating__content w-full sm:w-auto", H.value])
|
|
2164
2168
|
}, [h(t.$slots, "default", {
|
|
2165
2169
|
isOpen: o.isOpen,
|
|
2166
2170
|
floating: v(P)
|
|
@@ -2171,7 +2175,7 @@ var te = Object.entries(J.global.breakpoint).reduce((e, [t, n]) => (e[t] = n.val
|
|
|
2171
2175
|
}, [S(a("div", {
|
|
2172
2176
|
ref_key: "content",
|
|
2173
2177
|
ref: w,
|
|
2174
|
-
class: c(["fz__floating__content",
|
|
2178
|
+
class: c(["fz__floating__content", H.value])
|
|
2175
2179
|
}, [h(t.$slots, "default", {
|
|
2176
2180
|
isOpen: o.isOpen,
|
|
2177
2181
|
floating: v(P)
|
|
@@ -2180,4 +2184,4 @@ var te = Object.entries(J.global.breakpoint).reduce((e, [t, n]) => (e[t] = n.val
|
|
|
2180
2184
|
}
|
|
2181
2185
|
});
|
|
2182
2186
|
//#endregion
|
|
2183
|
-
export {
|
|
2187
|
+
export { ae as FzFloating, A as calcRealPos, D as clamp, w as format, k as getHighestAvailableSpacePos, T as parse, E as roundTo, C as truncateDecimals, te as useBreakpoints, G as useClickOutside, J as useCurrency, U as useFloating, K as useKeyDown, q as useKeyUp, W as useMediaQuery };
|
package/dist/composables.umd.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require(`vue`)):typeof define==`function`&&define.amd?define([`exports`,`vue`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.FzComposables={},e.Vue))})(this,function(e,t){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var n=(e,t)=>{if(!isFinite(e)||t<0)return e;if(t===0)return Math.trunc(e);let n=String(e);if(n.includes(`e`)||n.includes(`E`)){let n=10**t;return Math.trunc(e*n)/n}let r=n.indexOf(`.`);return r===-1||n.length-r-1<=t?e:Number(n.slice(0,r+t+1))},r=(e,{minimumFractionDigits:t=0,maximumFractionDigits:r=2,roundDecimals:i=!0,useGrouping:a=!0}={})=>e==null||isNaN(e)||!isFinite(e)?``:(i?e:n(e,r)).toLocaleString(`it-IT`,{minimumFractionDigits:t,maximumFractionDigits:r,useGrouping:a}),i=e=>{if(!e||typeof e!=`string`)return NaN;let t=e.trim();return t.includes(`,`)&&(t=t.replace(/\./g,``),t=t.replace(`,`,`.`)),parseFloat(t)},a=(e,t)=>{let n=t,r=t%e,i=t>=0?e:-e;return r!==0&&(n=Math.abs(r)>=e/2?t+i-r:t-r),n},o=(e,t,n)=>Math.max(e,Math.min(t,n)),s=new DOMRect(0,0,window.innerWidth,window.innerHeight),c=(e,t,n,r,i)=>{let a=i?`bottom`:`right`,o=i?`bottom-start`:`right-start`;s.width=window.innerWidth,s.height=window.innerHeight,s.x=0,s.y=0;let c=e?e.getBoundingClientRect():s,l=t.getBoundingClientRect(),u=n.getBoundingClientRect(),d=(u.left-c.left-l.width)/c.width,f=(c.right-u.right-l.width)/c.width,p=(u.top-c.top-l.height)/c.height,m=(c.bottom-u.bottom-l.height)/c.height,h=[{key:`right`,space:f},{key:`top`,space:p},{key:`bottom`,space:m},{key:`left`,space:d}].sort((e,t)=>t.space-e.space);if(i&&(h=h.filter(e=>e.key===`top`||e.key===`bottom`)),a=h[0].key,!r){let e=(l.height-u.height)/2;switch(a){case`right`:case`left`:c.top>u.top-e&&(r=`end`),c.bottom<u.top-e&&(r=`start`);break;default:break}}return o=r?`${a}-${r}`:a,o},l=(e,t,n,r)=>({x:t.x+e.width*n/100,y:t.y+e.height*r/100}),u=e=>typeof e==`string`?document.querySelector(e):e,d=e=>({left:parseFloat(e.marginLeft),right:parseFloat(e.marginRight),top:parseFloat(e.marginTop),bottom:parseFloat(e.marginBottom)}),f=e=>e!==null&&(e.width>0||e.height>0),p={bottom:(e,t)=>({position:{x:e.left-t.left+e.width/2,y:e.bottom},transform:{x:-50,y:0}}),"bottom-start":(e,t)=>({position:{x:e.left-t.left,y:e.bottom},transform:{x:0,y:0}}),"bottom-end":(e,t)=>({position:{x:e.right+t.right,y:e.bottom},transform:{x:-100,y:0}}),top:(e,t)=>({position:{x:e.left-t.left+e.width/2,y:e.top-t.bottom},transform:{x:-50,y:-100}}),"top-start":(e,t)=>({position:{x:e.left-t.left,y:e.top-t.bottom},transform:{x:0,y:-100}}),"top-end":(e,t)=>({position:{x:e.right+t.right,y:e.top-t.bottom},transform:{x:-100,y:-100}}),left:(e,t)=>({position:{x:e.left-t.right,y:e.top-t.top+e.height/2},transform:{x:-100,y:-50}}),"left-start":(e,t)=>({position:{x:e.left-t.right,y:e.top-t.top},transform:{x:-100,y:0}}),"left-end":(e,t)=>({position:{x:e.left-t.right,y:e.bottom+t.bottom},transform:{x:-100,y:-100}}),right:(e,t)=>({position:{x:e.right+t.left,y:e.top-t.top+e.height/2},transform:{x:0,y:-50}}),"right-start":(e,t)=>({position:{x:e.right+t.left,y:e.top-t.top},transform:{x:0,y:0}}),"right-end":(e,t)=>({position:{x:e.right+t.left,y:e.bottom+t.bottom},transform:{x:0,y:-100}})},m=(e,t,n)=>{let r=p[e];return r?r(t,n):{position:{x:0,y:0},transform:{x:0,y:0}}},h={bottom:(e,t)=>({position:{x:e.left+e.width/2,y:e.bottom-t.height},transform:{x:-50,y:0}}),"bottom-start":(e,t)=>({position:{x:e.left,y:e.bottom-t.height},transform:{x:0,y:0}}),"bottom-end":(e,t)=>({position:{x:e.right-t.width,y:e.bottom-t.height},transform:{x:0,y:0}}),top:e=>({position:{x:e.left+e.width/2,y:e.top},transform:{x:-50,y:0}}),"top-start":e=>({position:{x:e.left,y:e.top},transform:{x:0,y:0}}),"top-end":(e,t)=>({position:{x:e.right-t.width,y:e.top},transform:{x:0,y:0}}),left:(e,t)=>({position:{x:e.left,y:e.top+(e.height-t.height)/2},transform:{x:0,y:0}}),"left-start":e=>({position:{x:e.left,y:e.top},transform:{x:0,y:0}}),"left-end":(e,t)=>({position:{x:e.left,y:e.bottom-t.height},transform:{x:0,y:0}}),right:(e,t)=>({position:{x:e.right-t.width,y:e.top+(e.height-t.height)/2},transform:{x:0,y:0}}),"right-start":(e,t)=>({position:{x:e.right-t.width,y:e.top},transform:{x:0,y:0}}),"right-end":(e,t)=>({position:{x:e.right-t.width,y:e.bottom-t.height},transform:{x:0,y:0}})},g=(e,t,n)=>{let r=h[e];return r?r(t,n):{position:{x:0,y:0},transform:{x:0,y:0}}},_=(e,t,n,r)=>{let i={...e},a={...r};if(e.x<n.left&&(i.x=n.left,a.x=0),e.x+t.width>n.right){let e=n.right-t.width;e>0&&(i.x=e),a.x=0}if(e.y<n.top&&(i.y=n.top,a.y=0),e.y+t.height>n.bottom){let e=n.bottom-t.height;e>0&&(i.y=e),a.y=0}return{position:i,transform:a}},v=(e,t,n,r,i)=>{let a=i?null:t;switch(e){case`auto`:return c(a,n,r);case`auto-vertical`:return c(a,n,r,void 0,!0);case`auto-start`:return c(a,n,r,`start`);case`auto-vertical-start`:return c(a,n,r,`start`,!0);case`auto-end`:return c(a,n,r,`end`);case`auto-vertical-end`:return c(a,n,r,`end`,!0);default:return`bottom-start`}},y=e=>e.startsWith(`auto`),b=e=>{let n=(0,t.ref)(`auto`),r=(0,t.ref)(),i=(0,t.ref)(),a=(0,t.ref)(),o=(0,t.ref)(),s=(0,t.reactive)({position:{x:0,y:0}}),c={root:null,rootMargin:`0px`,threshold:1,...e.element.value.intersectionOptions},p=(0,t.ref)(new IntersectionObserver(()=>{},c)),h=()=>{let t=u(e.element.value.domRef.value);return t?{element:t,container:e.container?.value?u(e.container.value.domRef.value)??document.body:document.body,opener:e.opener?.value?u(e.opener.value.domRef.value):null}:null},b=e=>({element:e.element.getBoundingClientRect(),container:e.container.getBoundingClientRect(),opener:e.opener?.getBoundingClientRect()??null});return(0,t.onUnmounted)(()=>{p.value.disconnect()}),{float:s,rect:i,setPosition:(c=!1)=>(0,t.nextTick)(()=>{r.value=e.position?.value??`auto`;let t=h();if(!t)return;Object.assign(t.element.style,{position:`fixed`,top:`0px`,left:`0px`});let u=b(t);if(i.value=u.element,a.value=u.opener??void 0,o.value=u.container,t.opener&&!f(u.opener)){t.element.style.display=`none`;return}p.value.observe(t.element),p.value.observe(t.container),y(r.value)&&t.opener&&(r.value=v(r.value,t.container,t.element,t.opener,e.useViewport?.value??!1));let x=d(window.getComputedStyle(t.element)),S=t.opener&&u.opener?m(r.value,u.opener,x):g(r.value,u.container,u.element),C=_(l(u.element,S.position,S.transform.x,S.transform.y),u.element,u.container,S.transform);s.position.x=C.position.x,s.position.y=C.position.y,Object.assign(t.element.style,{top:`${s.position.y}px`,left:`${s.position.x}px`,position:`fixed`,display:`flex`}),i.value=t.element.getBoundingClientRect(),e.callback?.value&&!c&&e.callback.value(i,a,o,n,r)}),position:n,actualPosition:r,openerRect:a,containerRect:o}};function x(e){let n=window.matchMedia(e),r=(0,t.ref)(n.matches);function i(e){r.value=e.matches}return(0,t.onMounted)(()=>{n.addEventListener(`change`,i)}),(0,t.onUnmounted)(()=>{n.removeEventListener(`change`,i)}),(0,t.computed)(()=>r.value)}function S(e){return{isGreater(t){return x(`(min-width: ${e[t]})`)},isSmaller(t){return x(`(max-width: ${e[t]})`)},isInBetween(t,n){return x(`(min-width: ${e[t]}) and (max-width: ${e[n]})`)},current(){let n=Object.entries(e).map(([e,t])=>({name:e,value:parseInt(t,10)})).sort((e,t)=>e.value-t.value),r=n.map(({name:e,value:t})=>({name:e,matches:x(`(min-width: ${t}px)`)}));return(0,t.computed)(()=>{let e=n[0].name;for(let{name:t,matches:n}of r)n.value&&(e=t);return e})}}}function C(e,n,r){if(!e)throw Error(`A target component has to be provided.`);if(!n)throw Error(`A callback has to be provided.`);let i=t=>{!e.value||t.target===e.value||t.composedPath().includes(e.value)||typeof n==`function`&&n()};r&&(0,t.watch)(r,(e,t)=>{t&&t.removeEventListener(`click`,i),e?.addEventListener(`click`,i)}),(0,t.onMounted)(()=>{r||document.addEventListener(`click`,i)}),(0,t.onBeforeUnmount)(()=>{if(r){r.value?.removeEventListener(`click`,i);return}document.removeEventListener(`click`,i)})}function w(e,n){if(!e)throw Error(`A target component has to be provided.`);if(!n||typeof n!=`function`)throw Error(`A callback has to be provided.`);let r=e=>{n(e)};(0,t.onMounted)(()=>{e.value.addEventListener(`keydown`,r)}),(0,t.onBeforeUnmount)(()=>{e.value.removeEventListener(`keydown`,r)})}function T(e,n){if(!e||typeof e!=`function`)throw Error(`A callback has to be provided.`);let r=t=>{e(t)};(0,t.onMounted)(()=>{if(!n){document.addEventListener(`keyup`,r);return}n.value.addEventListener(`keyup`,r)}),(0,t.onBeforeUnmount)(()=>{if(!n){document.removeEventListener(`keyup`,r);return}n.value.removeEventListener(`keyup`,r)})}var E=e=>({format:r,parse:i}),D={global:{blue:{50:{value:`#eff1ff`,type:`color`},100:{value:`#dee2ff`,type:`color`},200:{value:`#bdc5ff`,type:`color`},300:{value:`#9ca8ff`,type:`color`},400:{value:`#7b8bff`,type:`color`},500:{value:`#5a6eff`,type:`color`},600:{value:`#4858cc`,type:`color`},700:{value:`#364299`,type:`color`},800:{value:`#242c66`,type:`color`},900:{value:`#1b214c`,type:`color`}},purple:{50:{value:`#f8f4ff`,type:`color`},100:{value:`#f0e9ff`,type:`color`},200:{value:`#e1d3ff`,type:`color`},300:{value:`#d2bdff`,type:`color`},400:{value:`#c3a7ff`,type:`color`},500:{value:`#b491ff`,type:`color`},600:{value:`#9074cc`,type:`color`},700:{value:`#6c5799`,type:`color`},800:{value:`#483a66`,type:`color`},900:{value:`#241d33`,type:`color`}},orange:{50:{value:`#fff2ef`,type:`color`},100:{value:`#ffe4de`,type:`color`},200:{value:`#ffc9bd`,type:`color`},300:{value:`#ffae9c`,type:`color`},400:{value:`#ff937b`,type:`color`},500:{value:`#ff785a`,type:`color`},600:{value:`#cc6048`,type:`color`},700:{value:`#994836`,type:`color`},800:{value:`#663024`,type:`color`},900:{value:`#331812`,type:`color`}},pink:{50:{value:`#fff5f5`,type:`color`},100:{value:`#ffe0e0`,type:`color`},200:{value:`#ffcbcb`,type:`color`},300:{value:`#ffc0c0`,type:`color`},400:{value:`#ffabab`,type:`color`},500:{value:`#ff9696`,type:`color`},600:{value:`#cc7878`,type:`color`},700:{value:`#995a5a`,type:`color`},800:{value:`#663c3c`,type:`color`},900:{value:`#331e1e`,type:`color`}},yellow:{50:{value:`#fffbf4`,type:`color`},100:{value:`#fff3de`,type:`color`},200:{value:`#ffebc8`,type:`color`},300:{value:`#ffe7bd`,type:`color`},400:{value:`#ffdfa7`,type:`color`},500:{value:`#ffd791`,type:`color`},600:{value:`#ccac74`,type:`color`},700:{value:`#998157`,type:`color`},800:{value:`#806c49`,type:`color`},900:{value:`#4c402b`,type:`color`}},semantic:{error:{50:{value:`#fef3f3`,type:`color`},100:{value:`#f8baba`,type:`color`},200:{value:`#f04242`,type:`color`},300:{value:`#aa2f2f`,type:`color`}},warning:{50:{value:`#fff8f3`,type:`color`},100:{value:`#ffdabd`,type:`color`},200:{value:`#ffae4f`,type:`color`},300:{value:`#b47b38`,type:`color`}},success:{50:{value:`#f2f8f6`,type:`color`},100:{value:`#b5d8ce`,type:`color`},200:{value:`#0fa88c`,type:`color`},300:{value:`#0b7763`,type:`color`}},info:{50:{value:`#f3f7ff`,type:`color`},100:{value:`#b4c8e1`,type:`color`},200:{value:`#4e9fff`,type:`color`},300:{value:`#3770b4`,type:`color`}}},background:{"white-smoke":{value:`#f7f6f3`,type:`color`},seashell:{value:`#f8ece7`,type:`color`},"pale-purple":{value:`#f2e6ff`,type:`color`},"alice-blue":{value:`#ecf2fc`,type:`color`}},grey:{100:{value:`#e9edf0`,type:`color`},200:{value:`#d1dde6`,type:`color`},300:{value:`#9da9b2`,type:`color`},400:{value:`#6e777e`,type:`color`},500:{value:`#596167`,type:`color`}},core:{white:{value:`#ffffff`,type:`color`},black:{value:`#2c282f`,type:`color`}},"font-sans":{"sharp-grotesk":{value:`"Sharp Grotesk", sans-serif`,type:`fontFamilies`},inter:{value:`"Inter", sans-serif`,type:`fontFamilies`}},font:{light:{value:`300`,type:`fontWeights`},normal:{value:`400`,type:`fontWeights`},medium:{value:`500`,type:`fontWeights`}},spacing:{0:{value:`0px`,type:`spacing`},1:{value:`1px`,type:`spacing`},2:{value:`2px`,type:`spacing`},4:{value:`4px`,type:`spacing`},6:{value:`6px`,type:`spacing`},8:{value:`8px`,type:`spacing`},10:{value:`10px`,type:`spacing`},12:{value:`12px`,type:`spacing`},14:{value:`14px`,type:`spacing`},16:{value:`16px`,type:`spacing`},20:{value:`20px`,type:`spacing`},24:{value:`24px`,type:`spacing`},28:{value:`28px`,type:`spacing`},32:{value:`32px`,type:`spacing`},36:{value:`36px`,type:`spacing`},40:{value:`40px`,type:`spacing`},44:{value:`44px`,type:`spacing`},48:{value:`48px`,type:`spacing`},56:{value:`56px`,type:`spacing`},64:{value:`64px`,type:`spacing`},80:{value:`80px`,type:`spacing`},96:{value:`96px`,type:`spacing`},112:{value:`112px`,type:`spacing`},128:{value:`128px`,type:`spacing`},144:{value:`144px`,type:`spacing`},160:{value:`160px`,type:`spacing`},176:{value:`176px`,type:`spacing`},192:{value:`192px`,type:`spacing`},208:{value:`208px`,type:`spacing`},224:{value:`224px`,type:`spacing`},240:{value:`240px`,type:`spacing`},256:{value:`256px`,type:`spacing`},288:{value:`288px`,type:`spacing`},320:{value:`320px`,type:`spacing`},384:{value:`384px`,type:`spacing`}},border:{0:{value:`0px`,type:`borderWidth`},1:{value:`1px`,type:`borderWidth`},2:{value:`2px`,type:`borderWidth`},4:{value:`4px`,type:`borderWidth`},8:{value:`8px`,type:`borderWidth`}},rounded:{none:{value:`0px`,type:`borderRadius`},sm:{value:`2px`,type:`borderRadius`},base:{value:`4px`,type:`borderRadius`},md:{value:`6px`,type:`borderRadius`},lg:{value:`8px`,type:`borderRadius`},xl:{value:`12px`,type:`borderRadius`},"2xl":{value:`16px`,type:`borderRadius`},"3xl":{value:`24px`,type:`borderRadius`},full:{value:`9999px`,type:`borderRadius`}},breakpoint:{xs:{value:`376px`,type:`sizing`},sm:{value:`640px`,type:`sizing`},md:{value:`768px`,type:`sizing`},lg:{value:`1024px`,type:`sizing`},desktop:{value:`1200px`,type:`sizing`},xl:{value:`1280px`,type:`sizing`},"2xl":{value:`1440px`,type:`sizing`},"3xl":{value:`1536px`,type:`sizing`}},shadow:{none:{value:{color:`#000000`,type:`dropShadow`,x:`0`,y:`0`,blur:`0`,spread:`0`},type:`boxShadow`},sm:{value:{color:`#0000000d`,type:`dropShadow`,x:`0`,y:`1`,blur:`2`,spread:`0`},type:`boxShadow`},base:{value:[{color:`#0000000f`,type:`dropShadow`,x:`0`,y:`1`,blur:`2`,spread:`0`},{color:`#0000001a`,type:`dropShadow`,x:`0`,y:`1`,blur:`3`,spread:`0`}],type:`boxShadow`},md:{value:[{color:`#0000000f`,type:`dropShadow`,x:`0`,y:`2`,blur:`4`,spread:`-1`},{color:`#0000001a`,type:`dropShadow`,x:`0`,y:`4`,blur:`6`,spread:`-1`}],type:`boxShadow`},lg:{value:[{color:`#0000000d`,type:`dropShadow`,x:`0`,y:`4`,blur:`6`,spread:`-2`},{color:`#0000001a`,type:`dropShadow`,x:`0`,y:`10`,blur:`15`,spread:`-3`}],type:`boxShadow`},xl:{value:[{color:`#0000000a`,type:`dropShadow`,x:`0`,y:`10`,blur:`10`,spread:`-5`},{color:`#0000001a`,type:`dropShadow`,x:`0`,y:`20`,blur:`25`,spread:`-5`}],type:`boxShadow`},"2xl":{value:{color:`#00000040`,type:`dropShadow`,x:`0`,y:`25`,blur:`50`,spread:`-12`},type:`boxShadow`},inner:{value:{color:`#0000000f`,type:`innerShadow`,x:`0`,y:`2`,blur:`4`,spread:`0`},type:`boxShadow`}},underline:{value:`underline`,type:`textDecoration`},text:{xs:{value:`12px`,type:`fontSizes`},sm:{value:`14px`,type:`fontSizes`},base:{value:`16px`,type:`fontSizes`},lg:{value:`18px`,type:`fontSizes`},xl:{value:`20px`,type:`fontSizes`},"2xl":{value:`24px`,type:`fontSizes`},"3xl":{value:`30px`,type:`fontSizes`},"4xl":{value:`36px`,type:`fontSizes`},"5xl":{value:`48px`,type:`fontSizes`},"6xl":{value:`60px`,type:`fontSizes`},"7xl":{value:`72px`,type:`fontSizes`},"8xl":{value:`96px`,type:`fontSizes`},"9xl":{value:`128px`,type:`fontSizes`}},leading:{xs:{value:`16px`,type:`lineHeights`},sm:{value:`18px`,type:`lineHeights`},base:{value:`20px`,type:`lineHeights`},lg:{value:`24px`,type:`lineHeights`},xl:{value:`28px`,type:`lineHeights`},"2xl":{value:`32px`,type:`lineHeights`},"3xl":{value:`36px`,type:`lineHeights`},"4xl":{value:`40px`,type:`lineHeights`},"5xl":{value:`48px`,type:`lineHeights`},"6xl":{value:`60px`,type:`lineHeights`},"7xl":{value:`72px`,type:`lineHeights`},"8xl":{value:`96px`,type:`lineHeights`},"9xl":{value:`128px`,type:`lineHeights`}}},alias:{avatar:{initials:{"background-color":{value:`{core.black}`,type:`color`},color:{value:`{core.white}`,type:`color`},spacing:{value:`{spacing.32}`,type:`spacing`},"border-radius":{value:`{rounded.full}`,type:`borderRadius`},"font-family":{value:`{font-sans.inter}`,type:`fontFamilies`},"font-weight":{value:`{font.normal}`,type:`fontWeights`},"font-size":{value:`{text.sm}`,type:`fontSizes`},"line-height":{value:`{leading.sm}`,type:`lineHeights`}},image:{"border-radius":{value:`{rounded.full}`,type:`borderRadius`},sm:{value:`{spacing.16}`,type:`spacing`},md:{value:`{spacing.24}`,type:`spacing`},lg:{value:`{spacing.32}`,type:`spacing`},xl:{value:`{spacing.40}`,type:`spacing`}}},"nav-link":{spacing:{value:`{spacing.32}`,type:`spacing`},"border-radius":{value:`{rounded.base}`,type:`borderRadius`},"font-family":{value:`{font-sans.inter}`,type:`fontFamilies`},"font-weight":{value:`{font.medium}`,type:`fontWeights`},"line-height":{value:`{leading.sm}`,type:`lineHeights`},"font-size":{value:`{text.sm}`,type:`fontSizes`},"background-color":{default:{value:`none`,type:`color`},hover:{value:`{background.alice-blue}`,type:`color`},pressed:{value:`{background.alice-blue}`,type:`color`},focus:{value:`{background.alice-blue}`,type:`color`},disabled:{value:`none`,type:`color`}},color:{default:{value:`{grey.500}`,type:`color`},hover:{value:`{blue.500}`,type:`color`},pressed:{value:`{blue.500}`,type:`color`},focus:{value:`{blue.500}`,type:`color`},disabled:{value:`{grey.100}`,type:`color`}},border:{default:{value:`none`,type:`color`},hover:{value:`none`,type:`color`},pressed:{value:`none`,type:`color`},focus:{value:`{blue.500}`,type:`color`},disabled:{value:`none`,type:`color`}},"border-width":{default:{value:`none`,type:`borderWidth`},hover:{value:`none`,type:`borderWidth`},pressed:{value:`none`,type:`borderWidth`},focus:{value:`{border.1}`,type:`borderWidth`},disabled:{value:`none`,type:`borderWidth`}},"box-shadow":{default:{value:`{shadow.none}`,type:`boxShadow`},hover:{value:`{shadow.none}`,type:`boxShadow`},pressed:{value:`{shadow.inner}`,type:`boxShadow`},focus:{value:`none`,type:`boxShadow`},disabled:{value:`none`,type:`boxShadow`}}},"icon-button":{button:{sm:{value:`{spacing.28}`,type:`spacing`},md:{value:`{spacing.32}`,type:`spacing`},lg:{value:`{spacing.40}`,type:`spacing`}},icon:{sm:{value:`{spacing.16}`,type:`spacing`},md:{value:`{spacing.20}`,type:`spacing`}},primary:{"background-color":{default:{value:`{blue.500}`,type:`color`},hover:{value:`{blue.600}`,type:`color`},pressed:{value:`{blue.600}`,type:`color`},focus:{value:`{blue.500}`,type:`color`},disabled:{value:`{blue.200}`,type:`color`}},color:{default:{value:`{core.white}`,type:`color`},hover:{value:`{core.white}`,type:`color`},pressed:{value:`{core.white}`,type:`color`},focus:{value:`{core.white}`,type:`color`},disabled:{value:`{core.white}`,type:`color`}},border:{default:{value:`none`,type:`color`},hover:{value:`none`,type:`color`},pressed:{value:`none`,type:`color`},focus:{value:`{blue.600}`,type:`color`},disabled:{value:`none`,type:`color`}},"border-width":{default:{value:`none`,type:`borderWidth`},hover:{value:`none`,type:`borderWidth`},pressed:{value:`none`,type:`borderWidth`},focus:{value:`{border.1}`,type:`borderWidth`},disabled:{value:`none`,type:`borderWidth`}}},secondary:{"background-color":{default:{value:`none`,type:`color`},hover:{value:`{grey.100}`,type:`color`},pressed:{value:`{grey.100}`,type:`color`},focus:{value:`none`,type:`color`},disabled:{value:`none`,type:`color`}},color:{default:{value:`{grey.500}`,type:`color`},hover:{value:`{grey.500}`,type:`color`},pressed:{value:`{grey.500}`,type:`color`},focus:{value:`{grey.500}`,type:`color`},disabled:{value:`{grey.100}`,type:`color`}},border:{default:{value:`{grey.200}`,type:`color`},hover:{value:`{grey.200}`,type:`color`},pressed:{value:`{grey.200}`,type:`color`},focus:{value:`{blue.600}`,type:`color`},disabled:{value:`{grey.100}`,type:`color`}},"border-width":{value:`{border.1}`,type:`borderWidth`}},notification:{"background-color":{default:{value:`none`,type:`color`},hover:{value:`{grey.100}`,type:`color`},pressed:{value:`{grey.100}`,type:`color`}},color:{default:{value:`{grey.500}`,type:`color`},hover:{value:`{grey.500}`,type:`color`},pressed:{value:`{grey.500}`,type:`color`},focus:{value:`{grey.500}`,type:`color`},disabled:{value:`{grey.100}`,type:`color`}},border:{default:{value:`{grey.200}`,type:`color`},hover:{value:`{grey.200}`,type:`color`},pressed:{value:`{grey.200}`,type:`color`},focus:{value:`{grey.200}`,type:`color`},disabled:{value:`{grey.100}`,type:`color`}},"border-width":{value:`{border.1}`,type:`borderWidth`}},"notification-badge":{"background-color":{default:{value:`{blue.500}`,type:`color`},hover:{value:`{blue.500}`,type:`color`},pressed:{value:`{blue.500}`,type:`color`},focus:{value:`{blue.500}`,type:`color`},disabled:{value:`{grey.200}`,type:`color`}},border:{default:{value:`{core.white}`,type:`color`},hover:{value:`{core.white}`,type:`color`},pressed:{value:`{core.white}`,type:`color`},focus:{value:`{core.white}`,type:`color`},disabled:{value:`{core.white}`,type:`color`}},sm:{value:`{spacing.6}`,type:`spacing`},md:{value:`{spacing.8}`,type:`spacing`},lg:{value:`{spacing.10}`,type:`spacing`},"border-width":{value:`{border.1}`,type:`borderWidth`}},invisible:{"background-color":{default:{value:`none`,type:`color`},hover:{value:`{grey.100}`,type:`color`},pressed:{value:`{grey.100}`,type:`color`},focus:{value:`none`,type:`color`},disabled:{value:`none`,type:`color`}},color:{default:{value:`{grey.500}`,type:`color`},hover:{value:`{grey.500}`,type:`color`},pressed:{value:`{grey.500}`,type:`color`},focus:{value:`{grey.500}`,type:`color`},disabled:{value:`{grey.100}`,type:`color`}},border:{default:{value:`none`,type:`color`},hover:{value:`none`,type:`color`},pressed:{value:`none`,type:`color`},focus:{value:`{blue.600}`,type:`color`},disabled:{value:`{grey.100}`,type:`color`}},"border-width":{default:{value:`none`,type:`borderWidth`},hover:{value:`none`,type:`borderWidth`},pressed:{value:`none`,type:`borderWidth`},focus:{value:`{border.1}`,type:`borderWidth`},disabled:{value:`{border.1}`,type:`borderWidth`}}},"border-radius":{value:`{rounded.base}`,type:`borderRadius`},"box-shadow":{default:{value:`{shadow.none}`,type:`boxShadow`},hover:{value:`{shadow.none}`,type:`boxShadow`},pressed:{value:`{shadow.inner}`,type:`boxShadow`},focus:{value:`none`,type:`boxShadow`},disabled:{value:`none`,type:`boxShadow`}}},breadcrumbs:{color:{"previous-page":{value:`{blue.500}`,type:`color`},divider:{value:`{grey.300}`,type:`color`},"current-page":{value:`{grey.500}`,type:`color`}},"font-family":{value:`{font-sans.inter}`,type:`fontFamilies`},"font-weight":{value:`{font.normal}`,type:`fontWeights`},"line-height":{value:`{leading.sm}`,type:`lineHeights`},"font-size":{value:`{text.sm}`,type:`fontSizes`}},"main-content":{sm:{value:`{spacing.32}`,type:`spacing`},base:{value:`{spacing.48}`,type:`spacing`},lg:{value:`{spacing.64}`,type:`spacing`}},"section-content":{none:{value:`{spacing.0}`,type:`spacing`},xs:{value:`{spacing.8}`,type:`spacing`},sm:{value:`{spacing.16}`,type:`spacing`},base:{value:`{spacing.24}`,type:`spacing`},lg:{value:`{spacing.32}`,type:`spacing`}}},$themes:[],$metadata:{tokenSetOrder:[`global`,`alias`]}},O={$schema:`http://json-schema.org/draft-07/schema#`,description:`Lista dei colori da includere nella safelist di Tailwind. Per aggiungere un nuovo colore, aggiungi il suo nome qui e rigenera il build con 'pnpm run build'.`,safeColorNames:[`blue`,`purple`,`orange`,`pink`,`yellow`,`grey`,`core`]},k={$schema:`http://json-schema.org/draft-07/schema#`,description:`Lista dei colori semantici da includere nella safelist di Tailwind. Per aggiungere un nuovo colore semantico, aggiungi il suo nome qui e rigenera il build con 'pnpm run build'.`,semanticColorNames:[`error`,`warning`,`success`,`info`]},A=O.safeColorNames,j=k.semanticColorNames,M={};A.forEach(e=>{let t=D.global[e];t&&Object.keys(t).forEach(n=>{let r=t[n]?.value;r&&(M[e]||(M[e]={}),M[e][n]=r)})});var N=D.global.semantic;N&&j.forEach(e=>{let t=N[e];t&&typeof t==`object`&&Object.keys(t).forEach(n=>{let r=t[n]?.value;if(r){let t=`semantic-${e}`;M[t]||(M[t]={}),M[t][n]=r}})});var P=Object.entries(D.global.breakpoint).reduce((e,[t,n])=>(e[t]=n.value,e),{});e.FzFloating=(0,t.defineComponent)({__name:`FzFloating`,props:{isOpen:{type:Boolean,default:!1},position:{default:`auto`},container:{},contentClass:{},openerClass:{},overrideContentClass:{type:Boolean},overrideOpener:{},teleport:{type:Boolean,default:!1},useViewport:{type:Boolean}},emits:[`fzfloating:setPosition`],setup(e,{expose:n,emit:r}){let i=e,a=r,o=(0,t.ref)(null),s=(0,t.ref)(null),c=(0,t.useSlots)(),l=x(`(max-width: ${P.xs})`),u=!1,d=!1,f=null,p=null,m={position:i.position,element:{domRef:o},container:{domRef:(0,t.toRef)(i.container||document.body)},opener:{domRef:(0,t.toRef)(null)},useViewport:i.useViewport,callback(...e){a(`fzfloating:setPosition`,...e)}},h=(0,t.toRefs)(m);c.opener&&(m.opener={domRef:s});let g=b(h),_=()=>{u||!d||(u=!0,requestAnimationFrame(()=>{d&&i.isOpen&&g.setPosition(),u=!1}))};(0,t.onMounted)(()=>{d=!0});let v=()=>{_()},y=()=>{_()},S=()=>{window.addEventListener(`scroll`,v,!0),window.addEventListener(`resize`,y),o.value&&!f&&(f=new ResizeObserver(()=>{_()}),f.observe(o.value)),s.value&&!p&&(p=new ResizeObserver(()=>{_()}),p.observe(s.value))},C=()=>{window.removeEventListener(`scroll`,v,!0),window.removeEventListener(`resize`,y),f&&=(f.disconnect(),null),p&&=(p.disconnect(),null)};(0,t.watch)(()=>i.position,()=>_()),(0,t.watch)(()=>i.isOpen,e=>{if(!e||!o.value||!d){C();return}S();let t=s.value?.getBoundingClientRect();o.value.style.position=`fixed`,o.value.style.top=`0px`,o.value.style.left=`0px`,o.value.style.transform=`none`,o.value.style.width=l.value?t?.width+`px`:`auto`,g.setPosition()}),(0,t.watch)(()=>i.overrideOpener,e=>{e&&h.opener&&h.opener.value&&(h.opener.value={domRef:e})}),(0,t.onBeforeUnmount)(()=>{d=!1,C()});let w=e=>e.startsWith(`bottom`)?`mt-4`:e.startsWith(`top`)?`mb-4`:e.startsWith(`left`)?`mr-4`:e.startsWith(`right`)?`ml-4`:`mt-4`,T=(0,t.computed)(()=>w(g.actualPosition?.value??i.position)),E=(0,t.computed)(()=>i.overrideContentClass?i.contentClass:[`bg-core-white fixed`,T.value,i.contentClass]);return n({setPosition:g.setPosition}),(n,r)=>((0,t.openBlock)(),(0,t.createElementBlock)(`div`,null,[(0,t.renderSlot)(n.$slots,`opener-start`),(0,t.createElementVNode)(`div`,{ref_key:`opener`,ref:s,class:`inline-flex w-full sm:w-auto`},[(0,t.renderSlot)(n.$slots,`opener`,{isOpen:e.isOpen,floating:(0,t.unref)(g)})],512),(0,t.renderSlot)(n.$slots,`opener-end`),e.teleport?(0,t.createCommentVNode)(``,!0):(0,t.withDirectives)(((0,t.openBlock)(),(0,t.createElementBlock)(`div`,{key:0,ref_key:`content`,ref:o,class:(0,t.normalizeClass)([`fz__floating__content w-full sm:w-auto`,E.value])},[(0,t.renderSlot)(n.$slots,`default`,{isOpen:e.isOpen,floating:(0,t.unref)(g)})],2)),[[t.vShow,n.$slots.default&&(!n.$slots.opener||n.$slots.opener&&e.isOpen)]]),e.teleport?((0,t.openBlock)(),(0,t.createBlock)(t.Teleport,{key:1,to:`body`},[(0,t.withDirectives)((0,t.createElementVNode)(`div`,{ref_key:`content`,ref:o,class:(0,t.normalizeClass)([`fz__floating__content`,E.value])},[(0,t.renderSlot)(n.$slots,`default`,{isOpen:e.isOpen,floating:(0,t.unref)(g)})],2),[[t.vShow,n.$slots.default&&(!n.$slots.opener||n.$slots.opener&&e.isOpen)]])])):(0,t.createCommentVNode)(``,!0)]))}}),e.calcRealPos=l,e.clamp=o,e.format=r,e.getHighestAvailableSpacePos=c,e.parse=i,e.roundTo=a,e.truncateDecimals=n,e.useBreakpoints=S,e.useClickOutside=C,e.useCurrency=E,e.useFloating=b,e.useKeyDown=w,e.useKeyUp=T,e.useMediaQuery=x});
|
|
1
|
+
(function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require(`vue`)):typeof define==`function`&&define.amd?define([`exports`,`vue`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.FzComposables={},e.Vue))})(this,function(e,t){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var n=(e,t)=>{if(!isFinite(e)||t<0)return e;if(t===0)return Math.trunc(e);let n=String(e);if(n.includes(`e`)||n.includes(`E`)){let n=10**t;return Math.trunc(e*n)/n}let r=n.indexOf(`.`);return r===-1||n.length-r-1<=t?e:Number(n.slice(0,r+t+1))},r=(e,{minimumFractionDigits:t=0,maximumFractionDigits:r=2,roundDecimals:i=!0,useGrouping:a=!0}={})=>e==null||isNaN(e)||!isFinite(e)?``:(i?e:n(e,r)).toLocaleString(`it-IT`,{minimumFractionDigits:t,maximumFractionDigits:r,useGrouping:a}),i=e=>{if(!e||typeof e!=`string`)return NaN;let t=e.trim();return t.includes(`,`)&&(t=t.replace(/\./g,``),t=t.replace(`,`,`.`)),parseFloat(t)},a=(e,t)=>{let n=t,r=t%e,i=t>=0?e:-e;return r!==0&&(n=Math.abs(r)>=e/2?t+i-r:t-r),n},o=(e,t,n)=>Math.max(e,Math.min(t,n)),s=new DOMRect(0,0,window.innerWidth,window.innerHeight),c=(e,t,n,r,i)=>{let a=i?`bottom`:`right`,o=i?`bottom-start`:`right-start`;s.width=window.innerWidth,s.height=window.innerHeight,s.x=0,s.y=0;let c=e?e.getBoundingClientRect():s,l=t.getBoundingClientRect(),u=n.getBoundingClientRect(),d=(u.left-c.left-l.width)/c.width,f=(c.right-u.right-l.width)/c.width,p=(u.top-c.top-l.height)/c.height,m=(c.bottom-u.bottom-l.height)/c.height,h=[{key:`right`,space:f},{key:`top`,space:p},{key:`bottom`,space:m},{key:`left`,space:d}].sort((e,t)=>t.space-e.space);if(i&&(h=h.filter(e=>e.key===`top`||e.key===`bottom`)),a=h[0].key,!r){let e=(l.height-u.height)/2;switch(a){case`right`:case`left`:c.top>u.top-e&&(r=`end`),c.bottom<u.top-e&&(r=`start`);break;default:break}}return o=r?`${a}-${r}`:a,o},l=(e,t,n,r)=>({x:t.x+e.width*n/100,y:t.y+e.height*r/100}),u=e=>typeof e==`string`?document.querySelector(e):e,d=e=>({left:parseFloat(e.marginLeft),right:parseFloat(e.marginRight),top:parseFloat(e.marginTop),bottom:parseFloat(e.marginBottom)}),f=e=>e!==null&&(e.width>0||e.height>0),p={bottom:(e,t)=>({position:{x:e.left-t.left+e.width/2,y:e.bottom},transform:{x:-50,y:0}}),"bottom-start":(e,t)=>({position:{x:e.left-t.left,y:e.bottom},transform:{x:0,y:0}}),"bottom-end":(e,t)=>({position:{x:e.right+t.right,y:e.bottom},transform:{x:-100,y:0}}),top:(e,t)=>({position:{x:e.left-t.left+e.width/2,y:e.top-t.bottom},transform:{x:-50,y:-100}}),"top-start":(e,t)=>({position:{x:e.left-t.left,y:e.top-t.bottom},transform:{x:0,y:-100}}),"top-end":(e,t)=>({position:{x:e.right+t.right,y:e.top-t.bottom},transform:{x:-100,y:-100}}),left:(e,t)=>({position:{x:e.left-t.right,y:e.top-t.top+e.height/2},transform:{x:-100,y:-50}}),"left-start":(e,t)=>({position:{x:e.left-t.right,y:e.top-t.top},transform:{x:-100,y:0}}),"left-end":(e,t)=>({position:{x:e.left-t.right,y:e.bottom+t.bottom},transform:{x:-100,y:-100}}),right:(e,t)=>({position:{x:e.right+t.left,y:e.top-t.top+e.height/2},transform:{x:0,y:-50}}),"right-start":(e,t)=>({position:{x:e.right+t.left,y:e.top-t.top},transform:{x:0,y:0}}),"right-end":(e,t)=>({position:{x:e.right+t.left,y:e.bottom+t.bottom},transform:{x:0,y:-100}})},m=(e,t,n)=>{let r=p[e];return r?r(t,n):{position:{x:0,y:0},transform:{x:0,y:0}}},h={bottom:(e,t)=>({position:{x:e.left+e.width/2,y:e.bottom-t.height},transform:{x:-50,y:0}}),"bottom-start":(e,t)=>({position:{x:e.left,y:e.bottom-t.height},transform:{x:0,y:0}}),"bottom-end":(e,t)=>({position:{x:e.right-t.width,y:e.bottom-t.height},transform:{x:0,y:0}}),top:e=>({position:{x:e.left+e.width/2,y:e.top},transform:{x:-50,y:0}}),"top-start":e=>({position:{x:e.left,y:e.top},transform:{x:0,y:0}}),"top-end":(e,t)=>({position:{x:e.right-t.width,y:e.top},transform:{x:0,y:0}}),left:(e,t)=>({position:{x:e.left,y:e.top+(e.height-t.height)/2},transform:{x:0,y:0}}),"left-start":e=>({position:{x:e.left,y:e.top},transform:{x:0,y:0}}),"left-end":(e,t)=>({position:{x:e.left,y:e.bottom-t.height},transform:{x:0,y:0}}),right:(e,t)=>({position:{x:e.right-t.width,y:e.top+(e.height-t.height)/2},transform:{x:0,y:0}}),"right-start":(e,t)=>({position:{x:e.right-t.width,y:e.top},transform:{x:0,y:0}}),"right-end":(e,t)=>({position:{x:e.right-t.width,y:e.bottom-t.height},transform:{x:0,y:0}})},g=(e,t,n)=>{let r=h[e];return r?r(t,n):{position:{x:0,y:0},transform:{x:0,y:0}}},_=8,v=()=>({left:0,top:0,right:window.innerWidth,bottom:window.innerHeight}),y=(e,t)=>({left:Math.max(e.left,t.left),right:Math.min(e.right,t.right),top:Math.max(e.top,t.top),bottom:Math.min(e.bottom,t.bottom)}),b=(e,t,n,r,i=v(),a=_)=>{let o={...e},s={...r},c=y(n,i),l=c.left+a,u=Math.max(l,c.right-a-t.width);o.x>u&&(o.x=u,s.x=0),o.x<l&&(o.x=l,s.x=0);let d=c.top+a,f=Math.max(d,c.bottom-a-t.height);return o.y>f&&(o.y=f,s.y=0),o.y<d&&(o.y=d,s.y=0),{position:o,transform:s}},x=(e,t,n,r,i)=>{let a=i?null:t;switch(e){case`auto`:return c(a,n,r);case`auto-vertical`:return c(a,n,r,void 0,!0);case`auto-start`:return c(a,n,r,`start`);case`auto-vertical-start`:return c(a,n,r,`start`,!0);case`auto-end`:return c(a,n,r,`end`);case`auto-vertical-end`:return c(a,n,r,`end`,!0);default:return`bottom-start`}},S=e=>e.startsWith(`auto`),C=e=>{let n=(0,t.ref)(`auto`),r=(0,t.ref)(),i=(0,t.ref)(),a=(0,t.ref)(),o=(0,t.ref)(),s=(0,t.reactive)({position:{x:0,y:0}}),c={root:null,rootMargin:`0px`,threshold:1,...e.element.value.intersectionOptions},p=(0,t.ref)(new IntersectionObserver(()=>{},c)),h=()=>{let t=u(e.element.value.domRef.value);return t?{element:t,container:e.container?.value?u(e.container.value.domRef.value)??document.body:document.body,opener:e.opener?.value?u(e.opener.value.domRef.value):null}:null},_=e=>({element:e.element.getBoundingClientRect(),container:e.container.getBoundingClientRect(),opener:e.opener?.getBoundingClientRect()??null});return(0,t.onUnmounted)(()=>{p.value.disconnect()}),{float:s,rect:i,setPosition:(c=!1)=>(0,t.nextTick)(()=>{r.value=e.position?.value??`auto`;let t=h();if(!t)return;Object.assign(t.element.style,{position:`fixed`,top:`0px`,left:`0px`});let u=_(t);if(i.value=u.element,a.value=u.opener??void 0,o.value=u.container,t.opener&&!f(u.opener)){t.element.style.display=`none`;return}p.value.observe(t.element),p.value.observe(t.container),S(r.value)&&t.opener&&(r.value=x(r.value,t.container,t.element,t.opener,e.useViewport?.value??!1));let v=d(window.getComputedStyle(t.element)),y=t.opener&&u.opener?m(r.value,u.opener,v):g(r.value,u.container,u.element),C=b(l(u.element,y.position,y.transform.x,y.transform.y),u.element,u.container,y.transform);s.position.x=C.position.x,s.position.y=C.position.y,Object.assign(t.element.style,{top:`${s.position.y}px`,left:`${s.position.x}px`,position:`fixed`,display:`flex`}),i.value=t.element.getBoundingClientRect(),e.callback?.value&&!c&&e.callback.value(i,a,o,n,r)}),position:n,actualPosition:r,openerRect:a,containerRect:o}};function w(e){let n=window.matchMedia(e),r=(0,t.ref)(n.matches);function i(e){r.value=e.matches}return(0,t.onMounted)(()=>{n.addEventListener(`change`,i)}),(0,t.onUnmounted)(()=>{n.removeEventListener(`change`,i)}),(0,t.computed)(()=>r.value)}function T(e){return{isGreater(t){return w(`(min-width: ${e[t]})`)},isSmaller(t){return w(`(max-width: ${e[t]})`)},isInBetween(t,n){return w(`(min-width: ${e[t]}) and (max-width: ${e[n]})`)},current(){let n=Object.entries(e).map(([e,t])=>({name:e,value:parseInt(t,10)})).sort((e,t)=>e.value-t.value),r=n.map(({name:e,value:t})=>({name:e,matches:w(`(min-width: ${t}px)`)}));return(0,t.computed)(()=>{let e=n[0].name;for(let{name:t,matches:n}of r)n.value&&(e=t);return e})}}}function E(e,n,r){if(!e)throw Error(`A target component has to be provided.`);if(!n)throw Error(`A callback has to be provided.`);let i=t=>{!e.value||t.target===e.value||t.composedPath().includes(e.value)||typeof n==`function`&&n()};r&&(0,t.watch)(r,(e,t)=>{t&&t.removeEventListener(`click`,i),e?.addEventListener(`click`,i)}),(0,t.onMounted)(()=>{r||document.addEventListener(`click`,i)}),(0,t.onBeforeUnmount)(()=>{if(r){r.value?.removeEventListener(`click`,i);return}document.removeEventListener(`click`,i)})}function D(e,n){if(!e)throw Error(`A target component has to be provided.`);if(!n||typeof n!=`function`)throw Error(`A callback has to be provided.`);let r=e=>{n(e)};(0,t.onMounted)(()=>{e.value.addEventListener(`keydown`,r)}),(0,t.onBeforeUnmount)(()=>{e.value.removeEventListener(`keydown`,r)})}function O(e,n){if(!e||typeof e!=`function`)throw Error(`A callback has to be provided.`);let r=t=>{e(t)};(0,t.onMounted)(()=>{if(!n){document.addEventListener(`keyup`,r);return}n.value.addEventListener(`keyup`,r)}),(0,t.onBeforeUnmount)(()=>{if(!n){document.removeEventListener(`keyup`,r);return}n.value.removeEventListener(`keyup`,r)})}var k=e=>({format:r,parse:i}),A={global:{blue:{50:{value:`#eff1ff`,type:`color`},100:{value:`#dee2ff`,type:`color`},200:{value:`#bdc5ff`,type:`color`},300:{value:`#9ca8ff`,type:`color`},400:{value:`#7b8bff`,type:`color`},500:{value:`#5a6eff`,type:`color`},600:{value:`#4858cc`,type:`color`},700:{value:`#364299`,type:`color`},800:{value:`#242c66`,type:`color`},900:{value:`#1b214c`,type:`color`}},purple:{50:{value:`#f8f4ff`,type:`color`},100:{value:`#f0e9ff`,type:`color`},200:{value:`#e1d3ff`,type:`color`},300:{value:`#d2bdff`,type:`color`},400:{value:`#c3a7ff`,type:`color`},500:{value:`#b491ff`,type:`color`},600:{value:`#9074cc`,type:`color`},700:{value:`#6c5799`,type:`color`},800:{value:`#483a66`,type:`color`},900:{value:`#241d33`,type:`color`}},orange:{50:{value:`#fff2ef`,type:`color`},100:{value:`#ffe4de`,type:`color`},200:{value:`#ffc9bd`,type:`color`},300:{value:`#ffae9c`,type:`color`},400:{value:`#ff937b`,type:`color`},500:{value:`#ff785a`,type:`color`},600:{value:`#cc6048`,type:`color`},700:{value:`#994836`,type:`color`},800:{value:`#663024`,type:`color`},900:{value:`#331812`,type:`color`}},pink:{50:{value:`#fff5f5`,type:`color`},100:{value:`#ffe0e0`,type:`color`},200:{value:`#ffcbcb`,type:`color`},300:{value:`#ffc0c0`,type:`color`},400:{value:`#ffabab`,type:`color`},500:{value:`#ff9696`,type:`color`},600:{value:`#cc7878`,type:`color`},700:{value:`#995a5a`,type:`color`},800:{value:`#663c3c`,type:`color`},900:{value:`#331e1e`,type:`color`}},yellow:{50:{value:`#fffbf4`,type:`color`},100:{value:`#fff3de`,type:`color`},200:{value:`#ffebc8`,type:`color`},300:{value:`#ffe7bd`,type:`color`},400:{value:`#ffdfa7`,type:`color`},500:{value:`#ffd791`,type:`color`},600:{value:`#ccac74`,type:`color`},700:{value:`#998157`,type:`color`},800:{value:`#806c49`,type:`color`},900:{value:`#4c402b`,type:`color`}},semantic:{error:{50:{value:`#fef3f3`,type:`color`},100:{value:`#f8baba`,type:`color`},200:{value:`#f04242`,type:`color`},300:{value:`#aa2f2f`,type:`color`}},warning:{50:{value:`#fff8f3`,type:`color`},100:{value:`#ffdabd`,type:`color`},200:{value:`#ffae4f`,type:`color`},300:{value:`#b47b38`,type:`color`}},success:{50:{value:`#f2f8f6`,type:`color`},100:{value:`#b5d8ce`,type:`color`},200:{value:`#0fa88c`,type:`color`},300:{value:`#0b7763`,type:`color`}},info:{50:{value:`#f3f7ff`,type:`color`},100:{value:`#b4c8e1`,type:`color`},200:{value:`#4e9fff`,type:`color`},300:{value:`#3770b4`,type:`color`}}},background:{"white-smoke":{value:`#f7f6f3`,type:`color`},seashell:{value:`#f8ece7`,type:`color`},"pale-purple":{value:`#f2e6ff`,type:`color`},"alice-blue":{value:`#ecf2fc`,type:`color`}},grey:{100:{value:`#e9edf0`,type:`color`},200:{value:`#d1dde6`,type:`color`},300:{value:`#9da9b2`,type:`color`},400:{value:`#6e777e`,type:`color`},500:{value:`#596167`,type:`color`}},core:{white:{value:`#ffffff`,type:`color`},black:{value:`#2c282f`,type:`color`}},"font-sans":{"sharp-grotesk":{value:`"Sharp Grotesk", sans-serif`,type:`fontFamilies`},inter:{value:`"Inter", sans-serif`,type:`fontFamilies`}},font:{light:{value:`300`,type:`fontWeights`},normal:{value:`400`,type:`fontWeights`},medium:{value:`500`,type:`fontWeights`}},spacing:{0:{value:`0px`,type:`spacing`},1:{value:`1px`,type:`spacing`},2:{value:`2px`,type:`spacing`},4:{value:`4px`,type:`spacing`},6:{value:`6px`,type:`spacing`},8:{value:`8px`,type:`spacing`},10:{value:`10px`,type:`spacing`},12:{value:`12px`,type:`spacing`},14:{value:`14px`,type:`spacing`},16:{value:`16px`,type:`spacing`},20:{value:`20px`,type:`spacing`},24:{value:`24px`,type:`spacing`},28:{value:`28px`,type:`spacing`},32:{value:`32px`,type:`spacing`},36:{value:`36px`,type:`spacing`},40:{value:`40px`,type:`spacing`},44:{value:`44px`,type:`spacing`},48:{value:`48px`,type:`spacing`},56:{value:`56px`,type:`spacing`},64:{value:`64px`,type:`spacing`},80:{value:`80px`,type:`spacing`},96:{value:`96px`,type:`spacing`},112:{value:`112px`,type:`spacing`},128:{value:`128px`,type:`spacing`},144:{value:`144px`,type:`spacing`},160:{value:`160px`,type:`spacing`},176:{value:`176px`,type:`spacing`},192:{value:`192px`,type:`spacing`},208:{value:`208px`,type:`spacing`},224:{value:`224px`,type:`spacing`},240:{value:`240px`,type:`spacing`},256:{value:`256px`,type:`spacing`},288:{value:`288px`,type:`spacing`},320:{value:`320px`,type:`spacing`},384:{value:`384px`,type:`spacing`}},border:{0:{value:`0px`,type:`borderWidth`},1:{value:`1px`,type:`borderWidth`},2:{value:`2px`,type:`borderWidth`},4:{value:`4px`,type:`borderWidth`},8:{value:`8px`,type:`borderWidth`}},rounded:{none:{value:`0px`,type:`borderRadius`},sm:{value:`2px`,type:`borderRadius`},base:{value:`4px`,type:`borderRadius`},md:{value:`6px`,type:`borderRadius`},lg:{value:`8px`,type:`borderRadius`},xl:{value:`12px`,type:`borderRadius`},"2xl":{value:`16px`,type:`borderRadius`},"3xl":{value:`24px`,type:`borderRadius`},full:{value:`9999px`,type:`borderRadius`}},breakpoint:{xs:{value:`376px`,type:`sizing`},sm:{value:`640px`,type:`sizing`},md:{value:`768px`,type:`sizing`},lg:{value:`1024px`,type:`sizing`},desktop:{value:`1200px`,type:`sizing`},xl:{value:`1280px`,type:`sizing`},"2xl":{value:`1440px`,type:`sizing`},"3xl":{value:`1536px`,type:`sizing`}},shadow:{none:{value:{color:`#000000`,type:`dropShadow`,x:`0`,y:`0`,blur:`0`,spread:`0`},type:`boxShadow`},sm:{value:{color:`#0000000d`,type:`dropShadow`,x:`0`,y:`1`,blur:`2`,spread:`0`},type:`boxShadow`},base:{value:[{color:`#0000000f`,type:`dropShadow`,x:`0`,y:`1`,blur:`2`,spread:`0`},{color:`#0000001a`,type:`dropShadow`,x:`0`,y:`1`,blur:`3`,spread:`0`}],type:`boxShadow`},md:{value:[{color:`#0000000f`,type:`dropShadow`,x:`0`,y:`2`,blur:`4`,spread:`-1`},{color:`#0000001a`,type:`dropShadow`,x:`0`,y:`4`,blur:`6`,spread:`-1`}],type:`boxShadow`},lg:{value:[{color:`#0000000d`,type:`dropShadow`,x:`0`,y:`4`,blur:`6`,spread:`-2`},{color:`#0000001a`,type:`dropShadow`,x:`0`,y:`10`,blur:`15`,spread:`-3`}],type:`boxShadow`},xl:{value:[{color:`#0000000a`,type:`dropShadow`,x:`0`,y:`10`,blur:`10`,spread:`-5`},{color:`#0000001a`,type:`dropShadow`,x:`0`,y:`20`,blur:`25`,spread:`-5`}],type:`boxShadow`},"2xl":{value:{color:`#00000040`,type:`dropShadow`,x:`0`,y:`25`,blur:`50`,spread:`-12`},type:`boxShadow`},inner:{value:{color:`#0000000f`,type:`innerShadow`,x:`0`,y:`2`,blur:`4`,spread:`0`},type:`boxShadow`}},underline:{value:`underline`,type:`textDecoration`},text:{xs:{value:`12px`,type:`fontSizes`},sm:{value:`14px`,type:`fontSizes`},base:{value:`16px`,type:`fontSizes`},lg:{value:`18px`,type:`fontSizes`},xl:{value:`20px`,type:`fontSizes`},"2xl":{value:`24px`,type:`fontSizes`},"3xl":{value:`30px`,type:`fontSizes`},"4xl":{value:`36px`,type:`fontSizes`},"5xl":{value:`48px`,type:`fontSizes`},"6xl":{value:`60px`,type:`fontSizes`},"7xl":{value:`72px`,type:`fontSizes`},"8xl":{value:`96px`,type:`fontSizes`},"9xl":{value:`128px`,type:`fontSizes`}},leading:{xs:{value:`16px`,type:`lineHeights`},sm:{value:`18px`,type:`lineHeights`},base:{value:`20px`,type:`lineHeights`},lg:{value:`24px`,type:`lineHeights`},xl:{value:`28px`,type:`lineHeights`},"2xl":{value:`32px`,type:`lineHeights`},"3xl":{value:`36px`,type:`lineHeights`},"4xl":{value:`40px`,type:`lineHeights`},"5xl":{value:`48px`,type:`lineHeights`},"6xl":{value:`60px`,type:`lineHeights`},"7xl":{value:`72px`,type:`lineHeights`},"8xl":{value:`96px`,type:`lineHeights`},"9xl":{value:`128px`,type:`lineHeights`}}},alias:{avatar:{initials:{"background-color":{value:`{core.black}`,type:`color`},color:{value:`{core.white}`,type:`color`},spacing:{value:`{spacing.32}`,type:`spacing`},"border-radius":{value:`{rounded.full}`,type:`borderRadius`},"font-family":{value:`{font-sans.inter}`,type:`fontFamilies`},"font-weight":{value:`{font.normal}`,type:`fontWeights`},"font-size":{value:`{text.sm}`,type:`fontSizes`},"line-height":{value:`{leading.sm}`,type:`lineHeights`}},image:{"border-radius":{value:`{rounded.full}`,type:`borderRadius`},sm:{value:`{spacing.16}`,type:`spacing`},md:{value:`{spacing.24}`,type:`spacing`},lg:{value:`{spacing.32}`,type:`spacing`},xl:{value:`{spacing.40}`,type:`spacing`}}},"nav-link":{spacing:{value:`{spacing.32}`,type:`spacing`},"border-radius":{value:`{rounded.base}`,type:`borderRadius`},"font-family":{value:`{font-sans.inter}`,type:`fontFamilies`},"font-weight":{value:`{font.medium}`,type:`fontWeights`},"line-height":{value:`{leading.sm}`,type:`lineHeights`},"font-size":{value:`{text.sm}`,type:`fontSizes`},"background-color":{default:{value:`none`,type:`color`},hover:{value:`{background.alice-blue}`,type:`color`},pressed:{value:`{background.alice-blue}`,type:`color`},focus:{value:`{background.alice-blue}`,type:`color`},disabled:{value:`none`,type:`color`}},color:{default:{value:`{grey.500}`,type:`color`},hover:{value:`{blue.500}`,type:`color`},pressed:{value:`{blue.500}`,type:`color`},focus:{value:`{blue.500}`,type:`color`},disabled:{value:`{grey.100}`,type:`color`}},border:{default:{value:`none`,type:`color`},hover:{value:`none`,type:`color`},pressed:{value:`none`,type:`color`},focus:{value:`{blue.500}`,type:`color`},disabled:{value:`none`,type:`color`}},"border-width":{default:{value:`none`,type:`borderWidth`},hover:{value:`none`,type:`borderWidth`},pressed:{value:`none`,type:`borderWidth`},focus:{value:`{border.1}`,type:`borderWidth`},disabled:{value:`none`,type:`borderWidth`}},"box-shadow":{default:{value:`{shadow.none}`,type:`boxShadow`},hover:{value:`{shadow.none}`,type:`boxShadow`},pressed:{value:`{shadow.inner}`,type:`boxShadow`},focus:{value:`none`,type:`boxShadow`},disabled:{value:`none`,type:`boxShadow`}}},"icon-button":{button:{sm:{value:`{spacing.28}`,type:`spacing`},md:{value:`{spacing.32}`,type:`spacing`},lg:{value:`{spacing.40}`,type:`spacing`}},icon:{sm:{value:`{spacing.16}`,type:`spacing`},md:{value:`{spacing.20}`,type:`spacing`}},primary:{"background-color":{default:{value:`{blue.500}`,type:`color`},hover:{value:`{blue.600}`,type:`color`},pressed:{value:`{blue.600}`,type:`color`},focus:{value:`{blue.500}`,type:`color`},disabled:{value:`{blue.200}`,type:`color`}},color:{default:{value:`{core.white}`,type:`color`},hover:{value:`{core.white}`,type:`color`},pressed:{value:`{core.white}`,type:`color`},focus:{value:`{core.white}`,type:`color`},disabled:{value:`{core.white}`,type:`color`}},border:{default:{value:`none`,type:`color`},hover:{value:`none`,type:`color`},pressed:{value:`none`,type:`color`},focus:{value:`{blue.600}`,type:`color`},disabled:{value:`none`,type:`color`}},"border-width":{default:{value:`none`,type:`borderWidth`},hover:{value:`none`,type:`borderWidth`},pressed:{value:`none`,type:`borderWidth`},focus:{value:`{border.1}`,type:`borderWidth`},disabled:{value:`none`,type:`borderWidth`}}},secondary:{"background-color":{default:{value:`none`,type:`color`},hover:{value:`{grey.100}`,type:`color`},pressed:{value:`{grey.100}`,type:`color`},focus:{value:`none`,type:`color`},disabled:{value:`none`,type:`color`}},color:{default:{value:`{grey.500}`,type:`color`},hover:{value:`{grey.500}`,type:`color`},pressed:{value:`{grey.500}`,type:`color`},focus:{value:`{grey.500}`,type:`color`},disabled:{value:`{grey.100}`,type:`color`}},border:{default:{value:`{grey.200}`,type:`color`},hover:{value:`{grey.200}`,type:`color`},pressed:{value:`{grey.200}`,type:`color`},focus:{value:`{blue.600}`,type:`color`},disabled:{value:`{grey.100}`,type:`color`}},"border-width":{value:`{border.1}`,type:`borderWidth`}},notification:{"background-color":{default:{value:`none`,type:`color`},hover:{value:`{grey.100}`,type:`color`},pressed:{value:`{grey.100}`,type:`color`}},color:{default:{value:`{grey.500}`,type:`color`},hover:{value:`{grey.500}`,type:`color`},pressed:{value:`{grey.500}`,type:`color`},focus:{value:`{grey.500}`,type:`color`},disabled:{value:`{grey.100}`,type:`color`}},border:{default:{value:`{grey.200}`,type:`color`},hover:{value:`{grey.200}`,type:`color`},pressed:{value:`{grey.200}`,type:`color`},focus:{value:`{grey.200}`,type:`color`},disabled:{value:`{grey.100}`,type:`color`}},"border-width":{value:`{border.1}`,type:`borderWidth`}},"notification-badge":{"background-color":{default:{value:`{blue.500}`,type:`color`},hover:{value:`{blue.500}`,type:`color`},pressed:{value:`{blue.500}`,type:`color`},focus:{value:`{blue.500}`,type:`color`},disabled:{value:`{grey.200}`,type:`color`}},border:{default:{value:`{core.white}`,type:`color`},hover:{value:`{core.white}`,type:`color`},pressed:{value:`{core.white}`,type:`color`},focus:{value:`{core.white}`,type:`color`},disabled:{value:`{core.white}`,type:`color`}},sm:{value:`{spacing.6}`,type:`spacing`},md:{value:`{spacing.8}`,type:`spacing`},lg:{value:`{spacing.10}`,type:`spacing`},"border-width":{value:`{border.1}`,type:`borderWidth`}},invisible:{"background-color":{default:{value:`none`,type:`color`},hover:{value:`{grey.100}`,type:`color`},pressed:{value:`{grey.100}`,type:`color`},focus:{value:`none`,type:`color`},disabled:{value:`none`,type:`color`}},color:{default:{value:`{grey.500}`,type:`color`},hover:{value:`{grey.500}`,type:`color`},pressed:{value:`{grey.500}`,type:`color`},focus:{value:`{grey.500}`,type:`color`},disabled:{value:`{grey.100}`,type:`color`}},border:{default:{value:`none`,type:`color`},hover:{value:`none`,type:`color`},pressed:{value:`none`,type:`color`},focus:{value:`{blue.600}`,type:`color`},disabled:{value:`{grey.100}`,type:`color`}},"border-width":{default:{value:`none`,type:`borderWidth`},hover:{value:`none`,type:`borderWidth`},pressed:{value:`none`,type:`borderWidth`},focus:{value:`{border.1}`,type:`borderWidth`},disabled:{value:`{border.1}`,type:`borderWidth`}}},"border-radius":{value:`{rounded.base}`,type:`borderRadius`},"box-shadow":{default:{value:`{shadow.none}`,type:`boxShadow`},hover:{value:`{shadow.none}`,type:`boxShadow`},pressed:{value:`{shadow.inner}`,type:`boxShadow`},focus:{value:`none`,type:`boxShadow`},disabled:{value:`none`,type:`boxShadow`}}},breadcrumbs:{color:{"previous-page":{value:`{blue.500}`,type:`color`},divider:{value:`{grey.300}`,type:`color`},"current-page":{value:`{grey.500}`,type:`color`}},"font-family":{value:`{font-sans.inter}`,type:`fontFamilies`},"font-weight":{value:`{font.normal}`,type:`fontWeights`},"line-height":{value:`{leading.sm}`,type:`lineHeights`},"font-size":{value:`{text.sm}`,type:`fontSizes`}},"main-content":{sm:{value:`{spacing.32}`,type:`spacing`},base:{value:`{spacing.48}`,type:`spacing`},lg:{value:`{spacing.64}`,type:`spacing`}},"section-content":{none:{value:`{spacing.0}`,type:`spacing`},xs:{value:`{spacing.8}`,type:`spacing`},sm:{value:`{spacing.16}`,type:`spacing`},base:{value:`{spacing.24}`,type:`spacing`},lg:{value:`{spacing.32}`,type:`spacing`}}},$themes:[],$metadata:{tokenSetOrder:[`global`,`alias`]}},j={$schema:`http://json-schema.org/draft-07/schema#`,description:`Lista dei colori da includere nella safelist di Tailwind. Per aggiungere un nuovo colore, aggiungi il suo nome qui e rigenera il build con 'pnpm run build'.`,safeColorNames:[`blue`,`purple`,`orange`,`pink`,`yellow`,`grey`,`core`]},M={$schema:`http://json-schema.org/draft-07/schema#`,description:`Lista dei colori semantici da includere nella safelist di Tailwind. Per aggiungere un nuovo colore semantico, aggiungi il suo nome qui e rigenera il build con 'pnpm run build'.`,semanticColorNames:[`error`,`warning`,`success`,`info`]},N=j.safeColorNames,P=M.semanticColorNames,F={};N.forEach(e=>{let t=A.global[e];t&&Object.keys(t).forEach(n=>{let r=t[n]?.value;r&&(F[e]||(F[e]={}),F[e][n]=r)})});var I=A.global.semantic;I&&P.forEach(e=>{let t=I[e];t&&typeof t==`object`&&Object.keys(t).forEach(n=>{let r=t[n]?.value;if(r){let t=`semantic-${e}`;F[t]||(F[t]={}),F[t][n]=r}})});var L=Object.entries(A.global.breakpoint).reduce((e,[t,n])=>(e[t]=n.value,e),{});e.FzFloating=(0,t.defineComponent)({__name:`FzFloating`,props:{isOpen:{type:Boolean,default:!1},position:{default:`auto`},container:{},contentClass:{},openerClass:{},overrideContentClass:{type:Boolean},overrideOpener:{},teleport:{type:Boolean,default:!1},useViewport:{type:Boolean}},emits:[`fzfloating:setPosition`],setup(e,{expose:n,emit:r}){let i=e,a=r,o=(0,t.ref)(null),s=(0,t.ref)(null),c=(0,t.useSlots)(),l=w(`(max-width: ${L.xs})`),u=!1,d=!1,f=null,p=null,m={position:i.position,element:{domRef:o},container:{domRef:(0,t.toRef)(i.container||document.body)},opener:{domRef:(0,t.toRef)(null)},useViewport:i.useViewport,callback(...e){a(`fzfloating:setPosition`,...e)}},h=(0,t.toRefs)(m);c.opener&&(m.opener={domRef:s});let g=C(h),_=()=>{u||!d||(u=!0,requestAnimationFrame(()=>{d&&i.isOpen&&g.setPosition(),u=!1}))};(0,t.onMounted)(()=>{d=!0});let v=()=>{_()},y=()=>{_()},b=()=>{window.addEventListener(`scroll`,v,!0),window.addEventListener(`resize`,y),o.value&&!f&&(f=new ResizeObserver(()=>{_()}),f.observe(o.value)),s.value&&!p&&(p=new ResizeObserver(()=>{_()}),p.observe(s.value))},x=()=>{window.removeEventListener(`scroll`,v,!0),window.removeEventListener(`resize`,y),f&&=(f.disconnect(),null),p&&=(p.disconnect(),null)};(0,t.watch)(()=>i.position,()=>_()),(0,t.watch)(()=>i.isOpen,e=>{if(!e||!o.value||!d){x();return}b();let t=s.value?.getBoundingClientRect();o.value.style.position=`fixed`,o.value.style.top=`0px`,o.value.style.left=`0px`,o.value.style.transform=`none`,o.value.style.width=l.value?t?.width+`px`:`auto`,g.setPosition()}),(0,t.watch)(()=>i.overrideOpener,e=>{e&&h.opener&&h.opener.value&&(h.opener.value={domRef:e})}),(0,t.onBeforeUnmount)(()=>{d=!1,x()});let S=e=>e.startsWith(`bottom`)?`mt-4`:e.startsWith(`top`)?`mb-4`:e.startsWith(`left`)?`mr-4`:e.startsWith(`right`)?`ml-4`:`mt-4`,T=(0,t.computed)(()=>S(g.actualPosition?.value??i.position)),E=(0,t.computed)(()=>i.overrideContentClass?i.contentClass:[`bg-core-white fixed`,T.value,i.contentClass]);return n({setPosition:g.setPosition}),(n,r)=>((0,t.openBlock)(),(0,t.createElementBlock)(`div`,null,[(0,t.renderSlot)(n.$slots,`opener-start`),(0,t.createElementVNode)(`div`,{ref_key:`opener`,ref:s,class:`inline-flex w-full sm:w-auto`},[(0,t.renderSlot)(n.$slots,`opener`,{isOpen:e.isOpen,floating:(0,t.unref)(g)})],512),(0,t.renderSlot)(n.$slots,`opener-end`),e.teleport?(0,t.createCommentVNode)(``,!0):(0,t.withDirectives)(((0,t.openBlock)(),(0,t.createElementBlock)(`div`,{key:0,ref_key:`content`,ref:o,class:(0,t.normalizeClass)([`fz__floating__content w-full sm:w-auto`,E.value])},[(0,t.renderSlot)(n.$slots,`default`,{isOpen:e.isOpen,floating:(0,t.unref)(g)})],2)),[[t.vShow,n.$slots.default&&(!n.$slots.opener||n.$slots.opener&&e.isOpen)]]),e.teleport?((0,t.openBlock)(),(0,t.createBlock)(t.Teleport,{key:1,to:`body`},[(0,t.withDirectives)((0,t.createElementVNode)(`div`,{ref_key:`content`,ref:o,class:(0,t.normalizeClass)([`fz__floating__content`,E.value])},[(0,t.renderSlot)(n.$slots,`default`,{isOpen:e.isOpen,floating:(0,t.unref)(g)})],2),[[t.vShow,n.$slots.default&&(!n.$slots.opener||n.$slots.opener&&e.isOpen)]])])):(0,t.createCommentVNode)(``,!0)]))}}),e.calcRealPos=l,e.clamp=o,e.format=r,e.getHighestAvailableSpacePos=c,e.parse=i,e.roundTo=a,e.truncateDecimals=n,e.useBreakpoints=T,e.useClickOutside=E,e.useCurrency=k,e.useFloating=C,e.useKeyDown=D,e.useKeyUp=O,e.useMediaQuery=w});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fiscozen/composables",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.1",
|
|
4
4
|
"description": "Design System utility composables",
|
|
5
5
|
"main": "src/index.ts",
|
|
6
6
|
"type": "module",
|
|
@@ -28,8 +28,8 @@
|
|
|
28
28
|
"vite": "^8.0.0",
|
|
29
29
|
"vitest": "^4.1.1",
|
|
30
30
|
"vue-tsc": "^2.2.12",
|
|
31
|
-
"@fiscozen/prettier-config": "^0.1.0",
|
|
32
31
|
"@fiscozen/eslint-config": "^0.1.0",
|
|
32
|
+
"@fiscozen/prettier-config": "^0.1.0",
|
|
33
33
|
"@fiscozen/tsconfig": "^0.1.0"
|
|
34
34
|
},
|
|
35
35
|
"license": "ISC",
|
|
@@ -224,6 +224,175 @@ describe('useFloating', () => {
|
|
|
224
224
|
})
|
|
225
225
|
})
|
|
226
226
|
|
|
227
|
+
describe('viewport collision (mobile)', () => {
|
|
228
|
+
const VIEWPORT_MARGIN = 8
|
|
229
|
+
const ELEMENT_WIDTH = 200
|
|
230
|
+
const ELEMENT_HEIGHT = 100
|
|
231
|
+
|
|
232
|
+
let originalInnerWidth: number
|
|
233
|
+
let originalInnerHeight: number
|
|
234
|
+
|
|
235
|
+
const setViewport = (width: number, height: number) => {
|
|
236
|
+
Object.defineProperty(window, 'innerWidth', { value: width, configurable: true })
|
|
237
|
+
Object.defineProperty(window, 'innerHeight', { value: height, configurable: true })
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
beforeEach(() => {
|
|
241
|
+
originalInnerWidth = window.innerWidth
|
|
242
|
+
originalInnerHeight = window.innerHeight
|
|
243
|
+
})
|
|
244
|
+
|
|
245
|
+
afterEach(() => {
|
|
246
|
+
setViewport(originalInnerWidth, originalInnerHeight)
|
|
247
|
+
})
|
|
248
|
+
|
|
249
|
+
it('leaves the position untouched when there is enough room (wide viewport)', async () => {
|
|
250
|
+
setViewport(1440, 900)
|
|
251
|
+
|
|
252
|
+
// Opener comfortably inside the viewport, plenty of room to the right.
|
|
253
|
+
mockOpener.getBoundingClientRect = vi.fn(() => ({
|
|
254
|
+
width: 100,
|
|
255
|
+
height: 40,
|
|
256
|
+
top: 200,
|
|
257
|
+
left: 300,
|
|
258
|
+
right: 400,
|
|
259
|
+
bottom: 240,
|
|
260
|
+
x: 300,
|
|
261
|
+
y: 200,
|
|
262
|
+
toJSON: () => {}
|
|
263
|
+
})) as any
|
|
264
|
+
|
|
265
|
+
const args = toRefs({
|
|
266
|
+
position: ref<FzFloatingPosition>('bottom-start'),
|
|
267
|
+
element: { domRef: ref(mockElement) },
|
|
268
|
+
opener: { domRef: ref(mockOpener) }
|
|
269
|
+
})
|
|
270
|
+
|
|
271
|
+
const floating = useFloating(args)
|
|
272
|
+
await floating.setPosition()
|
|
273
|
+
await nextTick()
|
|
274
|
+
|
|
275
|
+
// bottom-start anchors the element's left edge at opener.left (300) and the
|
|
276
|
+
// top at opener.bottom (240). There's room, so nothing is shifted.
|
|
277
|
+
expect(floating.float.position.x).toBe(300)
|
|
278
|
+
expect(floating.float.position.y).toBe(240)
|
|
279
|
+
})
|
|
280
|
+
|
|
281
|
+
it('shifts a near-right-edge menu left so it stays on screen (narrow viewport)', async () => {
|
|
282
|
+
// Narrow mobile viewport. NOTE: the container (document.body by default here)
|
|
283
|
+
// reports a rect WIDER than the viewport, reproducing the real bug — clamping
|
|
284
|
+
// to the container alone would not keep the menu on screen.
|
|
285
|
+
setViewport(390, 844)
|
|
286
|
+
mockContainer.getBoundingClientRect = vi.fn(() => ({
|
|
287
|
+
width: 800,
|
|
288
|
+
height: 844,
|
|
289
|
+
top: 0,
|
|
290
|
+
left: 0,
|
|
291
|
+
right: 800,
|
|
292
|
+
bottom: 844,
|
|
293
|
+
x: 0,
|
|
294
|
+
y: 0,
|
|
295
|
+
toJSON: () => {}
|
|
296
|
+
})) as any
|
|
297
|
+
|
|
298
|
+
// Kebab opener pinned to the right edge of the narrow screen.
|
|
299
|
+
mockOpener.getBoundingClientRect = vi.fn(() => ({
|
|
300
|
+
width: 32,
|
|
301
|
+
height: 32,
|
|
302
|
+
top: 120,
|
|
303
|
+
left: 350,
|
|
304
|
+
right: 382,
|
|
305
|
+
bottom: 152,
|
|
306
|
+
x: 350,
|
|
307
|
+
y: 120,
|
|
308
|
+
toJSON: () => {}
|
|
309
|
+
})) as any
|
|
310
|
+
|
|
311
|
+
const args = toRefs({
|
|
312
|
+
position: ref<FzFloatingPosition>('bottom-start'),
|
|
313
|
+
element: { domRef: ref(mockElement) },
|
|
314
|
+
opener: { domRef: ref(mockOpener) },
|
|
315
|
+
container: { domRef: ref(mockContainer) }
|
|
316
|
+
})
|
|
317
|
+
|
|
318
|
+
const floating = useFloating(args)
|
|
319
|
+
await floating.setPosition()
|
|
320
|
+
await nextTick()
|
|
321
|
+
|
|
322
|
+
const left = floating.float.position.x
|
|
323
|
+
// Right edge must stay within the viewport (minus the safety margin)…
|
|
324
|
+
expect(left + ELEMENT_WIDTH).toBeLessThanOrEqual(390 - VIEWPORT_MARGIN)
|
|
325
|
+
// …and the left edge must not be pushed off the left side either.
|
|
326
|
+
expect(left).toBeGreaterThanOrEqual(VIEWPORT_MARGIN)
|
|
327
|
+
// Concretely: clamped to viewportWidth - margin - elementWidth = 390 - 8 - 200.
|
|
328
|
+
expect(left).toBe(390 - VIEWPORT_MARGIN - ELEMENT_WIDTH)
|
|
329
|
+
})
|
|
330
|
+
|
|
331
|
+
it('clamps the left edge to the margin when the element is wider than the viewport', async () => {
|
|
332
|
+
// Pathological narrow viewport where the menu cannot fully fit; it should
|
|
333
|
+
// still start on screen (left edge at the margin) rather than disappear.
|
|
334
|
+
setViewport(180, 844)
|
|
335
|
+
|
|
336
|
+
mockOpener.getBoundingClientRect = vi.fn(() => ({
|
|
337
|
+
width: 32,
|
|
338
|
+
height: 32,
|
|
339
|
+
top: 120,
|
|
340
|
+
left: 150,
|
|
341
|
+
right: 182,
|
|
342
|
+
bottom: 152,
|
|
343
|
+
x: 150,
|
|
344
|
+
y: 120,
|
|
345
|
+
toJSON: () => {}
|
|
346
|
+
})) as any
|
|
347
|
+
|
|
348
|
+
const args = toRefs({
|
|
349
|
+
position: ref<FzFloatingPosition>('bottom-end'),
|
|
350
|
+
element: { domRef: ref(mockElement) },
|
|
351
|
+
opener: { domRef: ref(mockOpener) }
|
|
352
|
+
})
|
|
353
|
+
|
|
354
|
+
const floating = useFloating(args)
|
|
355
|
+
await floating.setPosition()
|
|
356
|
+
await nextTick()
|
|
357
|
+
|
|
358
|
+
// element width (200) > viewport width (180): left edge clamps to the margin.
|
|
359
|
+
expect(floating.float.position.x).toBe(VIEWPORT_MARGIN)
|
|
360
|
+
expect(Number.isNaN(floating.float.position.y)).toBe(false)
|
|
361
|
+
})
|
|
362
|
+
|
|
363
|
+
it('shifts a menu up so its bottom edge stays on screen (vertical clamp)', async () => {
|
|
364
|
+
setViewport(390, 600)
|
|
365
|
+
|
|
366
|
+
// Opener near the bottom of the viewport; a bottom-anchored menu would
|
|
367
|
+
// overflow below the fold and must be lifted up.
|
|
368
|
+
mockOpener.getBoundingClientRect = vi.fn(() => ({
|
|
369
|
+
width: 100,
|
|
370
|
+
height: 40,
|
|
371
|
+
top: 540,
|
|
372
|
+
left: 100,
|
|
373
|
+
right: 200,
|
|
374
|
+
bottom: 580,
|
|
375
|
+
x: 100,
|
|
376
|
+
y: 540,
|
|
377
|
+
toJSON: () => {}
|
|
378
|
+
})) as any
|
|
379
|
+
|
|
380
|
+
const args = toRefs({
|
|
381
|
+
position: ref<FzFloatingPosition>('bottom-start'),
|
|
382
|
+
element: { domRef: ref(mockElement) },
|
|
383
|
+
opener: { domRef: ref(mockOpener) }
|
|
384
|
+
})
|
|
385
|
+
|
|
386
|
+
const floating = useFloating(args)
|
|
387
|
+
await floating.setPosition()
|
|
388
|
+
await nextTick()
|
|
389
|
+
|
|
390
|
+
expect(floating.float.position.y + ELEMENT_HEIGHT).toBeLessThanOrEqual(600 - VIEWPORT_MARGIN)
|
|
391
|
+
// Clamped to viewportHeight - margin - elementHeight = 600 - 8 - 100.
|
|
392
|
+
expect(floating.float.position.y).toBe(600 - VIEWPORT_MARGIN - ELEMENT_HEIGHT)
|
|
393
|
+
})
|
|
394
|
+
})
|
|
395
|
+
|
|
227
396
|
describe('element styling', () => {
|
|
228
397
|
it('should apply position fixed immediately', async () => {
|
|
229
398
|
const args = toRefs({
|