@radix-solid-js/rect 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +55 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +16 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.js +53 -0
- package/dist/index.js.map +1 -0
- package/package.json +43 -0
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// src/observe-element-rect.ts
|
|
4
|
+
function observeElementRect(elementToObserve, callback) {
|
|
5
|
+
const observedData = observedElements.get(elementToObserve);
|
|
6
|
+
if (observedData === void 0) {
|
|
7
|
+
observedElements.set(elementToObserve, {
|
|
8
|
+
rect: {},
|
|
9
|
+
callbacks: [callback]
|
|
10
|
+
});
|
|
11
|
+
if (observedElements.size === 1) {
|
|
12
|
+
rafId = requestAnimationFrame(runLoop);
|
|
13
|
+
}
|
|
14
|
+
} else {
|
|
15
|
+
observedData.callbacks.push(callback);
|
|
16
|
+
callback(elementToObserve.getBoundingClientRect());
|
|
17
|
+
}
|
|
18
|
+
return () => {
|
|
19
|
+
const observedData2 = observedElements.get(elementToObserve);
|
|
20
|
+
if (observedData2 === void 0) return;
|
|
21
|
+
const index = observedData2.callbacks.indexOf(callback);
|
|
22
|
+
if (index > -1) {
|
|
23
|
+
observedData2.callbacks.splice(index, 1);
|
|
24
|
+
}
|
|
25
|
+
if (observedData2.callbacks.length === 0) {
|
|
26
|
+
observedElements.delete(elementToObserve);
|
|
27
|
+
if (observedElements.size === 0) {
|
|
28
|
+
cancelAnimationFrame(rafId);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
var rafId;
|
|
34
|
+
var observedElements = /* @__PURE__ */ new Map();
|
|
35
|
+
function runLoop() {
|
|
36
|
+
const changedRectsData = [];
|
|
37
|
+
observedElements.forEach((data, element) => {
|
|
38
|
+
const newRect = element.getBoundingClientRect();
|
|
39
|
+
if (!rectEquals(data.rect, newRect)) {
|
|
40
|
+
data.rect = newRect;
|
|
41
|
+
changedRectsData.push(data);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
changedRectsData.forEach((data) => {
|
|
45
|
+
data.callbacks.forEach((callback) => callback(data.rect));
|
|
46
|
+
});
|
|
47
|
+
rafId = requestAnimationFrame(runLoop);
|
|
48
|
+
}
|
|
49
|
+
function rectEquals(rect1, rect2) {
|
|
50
|
+
return rect1.width === rect2.width && rect1.height === rect2.height && rect1.top === rect2.top && rect1.right === rect2.right && rect1.bottom === rect2.bottom && rect1.left === rect2.left;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
exports.observeElementRect = observeElementRect;
|
|
54
|
+
//# sourceMappingURL=index.cjs.map
|
|
55
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/observe-element-rect.ts"],"names":["observedData"],"mappings":";;;AAUA,SAAS,kBAAA,CAEP,kBAEA,QAAA,EACA;AACA,EAAA,MAAM,YAAA,GAAe,gBAAA,CAAiB,GAAA,CAAI,gBAAgB,CAAA;AAE1D,EAAA,IAAI,iBAAiB,MAAA,EAAW;AAC9B,IAAA,gBAAA,CAAiB,IAAI,gBAAA,EAAkB;AAAA,MACrC,MAAM,EAAC;AAAA,MACP,SAAA,EAAW,CAAC,QAAQ;AAAA,KACrB,CAAA;AAED,IAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,MAAA,KAAA,GAAQ,sBAAsB,OAAO,CAAA;AAAA,IACvC;AAAA,EACF,CAAA,MAAO;AACL,IAAA,YAAA,CAAa,SAAA,CAAU,KAAK,QAAQ,CAAA;AACpC,IAAA,QAAA,CAAS,gBAAA,CAAiB,uBAAuB,CAAA;AAAA,EACnD;AAEA,EAAA,OAAO,MAAM;AACX,IAAA,MAAMA,aAAAA,GAAe,gBAAA,CAAiB,GAAA,CAAI,gBAAgB,CAAA;AAC1D,IAAA,IAAIA,kBAAiB,MAAA,EAAW;AAEhC,IAAA,MAAM,KAAA,GAAQA,aAAAA,CAAa,SAAA,CAAU,OAAA,CAAQ,QAAQ,CAAA;AACrD,IAAA,IAAI,QAAQ,EAAA,EAAI;AACd,MAAAA,aAAAA,CAAa,SAAA,CAAU,MAAA,CAAO,KAAA,EAAO,CAAC,CAAA;AAAA,IACxC;AAEA,IAAA,IAAIA,aAAAA,CAAa,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG;AACvC,MAAA,gBAAA,CAAiB,OAAO,gBAAgB,CAAA;AAExC,MAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,QAAA,oBAAA,CAAqB,KAAK,CAAA;AAAA,MAC5B;AAAA,IACF;AAAA,EACF,CAAA;AACF;AAYA,IAAI,KAAA;AACJ,IAAM,gBAAA,uBAAsD,GAAA,EAAI;AAEhE,SAAS,OAAA,GAAU;AACjB,EAAA,MAAM,mBAAwC,EAAC;AAE/C,EAAA,gBAAA,CAAiB,OAAA,CAAQ,CAAC,IAAA,EAAM,OAAA,KAAY;AAC1C,IAAA,MAAM,OAAA,GAAU,QAAQ,qBAAA,EAAsB;AAE9C,IAAA,IAAI,CAAC,UAAA,CAAW,IAAA,CAAK,IAAA,EAAM,OAAO,CAAA,EAAG;AACnC,MAAA,IAAA,CAAK,IAAA,GAAO,OAAA;AACZ,MAAA,gBAAA,CAAiB,KAAK,IAAI,CAAA;AAAA,IAC5B;AAAA,EACF,CAAC,CAAA;AAED,EAAA,gBAAA,CAAiB,OAAA,CAAQ,CAAC,IAAA,KAAS;AACjC,IAAA,IAAA,CAAK,UAAU,OAAA,CAAQ,CAAC,aAAa,QAAA,CAAS,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EAC1D,CAAC,CAAA;AAED,EAAA,KAAA,GAAQ,sBAAsB,OAAO,CAAA;AACvC;AAEA,SAAS,UAAA,CAAW,OAAgB,KAAA,EAAgB;AAClD,EAAA,OACE,KAAA,CAAM,UAAU,KAAA,CAAM,KAAA,IACtB,MAAM,MAAA,KAAW,KAAA,CAAM,MAAA,IACvB,KAAA,CAAM,GAAA,KAAQ,KAAA,CAAM,OACpB,KAAA,CAAM,KAAA,KAAU,MAAM,KAAA,IACtB,KAAA,CAAM,WAAW,KAAA,CAAM,MAAA,IACvB,KAAA,CAAM,IAAA,KAAS,KAAA,CAAM,IAAA;AAEzB","file":"index.cjs","sourcesContent":["// Adapted from https://github.com/reach/observe-rect/tree\n// MIT license, React Training\n\ntype Measurable = { getBoundingClientRect(): DOMRect };\n\n/**\n * Observes an element's rectangle on screen (getBoundingClientRect)\n * This is useful to track elements on the screen and attach other elements\n * that might be in different layers, etc.\n */\nfunction observeElementRect(\n /** The element whose rect to observe */\n elementToObserve: Measurable,\n /** The callback which will be called when the rect changes */\n callback: CallbackFn\n) {\n const observedData = observedElements.get(elementToObserve);\n\n if (observedData === undefined) {\n observedElements.set(elementToObserve, {\n rect: {} as DOMRect,\n callbacks: [callback],\n });\n\n if (observedElements.size === 1) {\n rafId = requestAnimationFrame(runLoop);\n }\n } else {\n observedData.callbacks.push(callback);\n callback(elementToObserve.getBoundingClientRect());\n }\n\n return () => {\n const observedData = observedElements.get(elementToObserve);\n if (observedData === undefined) return;\n\n const index = observedData.callbacks.indexOf(callback);\n if (index > -1) {\n observedData.callbacks.splice(index, 1);\n }\n\n if (observedData.callbacks.length === 0) {\n observedElements.delete(elementToObserve);\n\n if (observedElements.size === 0) {\n cancelAnimationFrame(rafId);\n }\n }\n };\n}\n\n// ========================================================================\n// module internals\n\ntype CallbackFn = (rect: DOMRect) => void;\n\ntype ObservedData = {\n rect: DOMRect;\n callbacks: Array<CallbackFn>;\n};\n\nlet rafId: number;\nconst observedElements: Map<Measurable, ObservedData> = new Map();\n\nfunction runLoop() {\n const changedRectsData: Array<ObservedData> = [];\n\n observedElements.forEach((data, element) => {\n const newRect = element.getBoundingClientRect();\n\n if (!rectEquals(data.rect, newRect)) {\n data.rect = newRect;\n changedRectsData.push(data);\n }\n });\n\n changedRectsData.forEach((data) => {\n data.callbacks.forEach((callback) => callback(data.rect));\n });\n\n rafId = requestAnimationFrame(runLoop);\n}\n\nfunction rectEquals(rect1: DOMRect, rect2: DOMRect) {\n return (\n rect1.width === rect2.width &&\n rect1.height === rect2.height &&\n rect1.top === rect2.top &&\n rect1.right === rect2.right &&\n rect1.bottom === rect2.bottom &&\n rect1.left === rect2.left\n );\n}\n\nexport { observeElementRect };\nexport type { Measurable };\n"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
type Measurable = {
|
|
2
|
+
getBoundingClientRect(): DOMRect;
|
|
3
|
+
};
|
|
4
|
+
/**
|
|
5
|
+
* Observes an element's rectangle on screen (getBoundingClientRect)
|
|
6
|
+
* This is useful to track elements on the screen and attach other elements
|
|
7
|
+
* that might be in different layers, etc.
|
|
8
|
+
*/
|
|
9
|
+
declare function observeElementRect(
|
|
10
|
+
/** The element whose rect to observe */
|
|
11
|
+
elementToObserve: Measurable,
|
|
12
|
+
/** The callback which will be called when the rect changes */
|
|
13
|
+
callback: CallbackFn): () => void;
|
|
14
|
+
type CallbackFn = (rect: DOMRect) => void;
|
|
15
|
+
|
|
16
|
+
export { type Measurable, observeElementRect };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
type Measurable = {
|
|
2
|
+
getBoundingClientRect(): DOMRect;
|
|
3
|
+
};
|
|
4
|
+
/**
|
|
5
|
+
* Observes an element's rectangle on screen (getBoundingClientRect)
|
|
6
|
+
* This is useful to track elements on the screen and attach other elements
|
|
7
|
+
* that might be in different layers, etc.
|
|
8
|
+
*/
|
|
9
|
+
declare function observeElementRect(
|
|
10
|
+
/** The element whose rect to observe */
|
|
11
|
+
elementToObserve: Measurable,
|
|
12
|
+
/** The callback which will be called when the rect changes */
|
|
13
|
+
callback: CallbackFn): () => void;
|
|
14
|
+
type CallbackFn = (rect: DOMRect) => void;
|
|
15
|
+
|
|
16
|
+
export { type Measurable, observeElementRect };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// src/observe-element-rect.ts
|
|
2
|
+
function observeElementRect(elementToObserve, callback) {
|
|
3
|
+
const observedData = observedElements.get(elementToObserve);
|
|
4
|
+
if (observedData === void 0) {
|
|
5
|
+
observedElements.set(elementToObserve, {
|
|
6
|
+
rect: {},
|
|
7
|
+
callbacks: [callback]
|
|
8
|
+
});
|
|
9
|
+
if (observedElements.size === 1) {
|
|
10
|
+
rafId = requestAnimationFrame(runLoop);
|
|
11
|
+
}
|
|
12
|
+
} else {
|
|
13
|
+
observedData.callbacks.push(callback);
|
|
14
|
+
callback(elementToObserve.getBoundingClientRect());
|
|
15
|
+
}
|
|
16
|
+
return () => {
|
|
17
|
+
const observedData2 = observedElements.get(elementToObserve);
|
|
18
|
+
if (observedData2 === void 0) return;
|
|
19
|
+
const index = observedData2.callbacks.indexOf(callback);
|
|
20
|
+
if (index > -1) {
|
|
21
|
+
observedData2.callbacks.splice(index, 1);
|
|
22
|
+
}
|
|
23
|
+
if (observedData2.callbacks.length === 0) {
|
|
24
|
+
observedElements.delete(elementToObserve);
|
|
25
|
+
if (observedElements.size === 0) {
|
|
26
|
+
cancelAnimationFrame(rafId);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
var rafId;
|
|
32
|
+
var observedElements = /* @__PURE__ */ new Map();
|
|
33
|
+
function runLoop() {
|
|
34
|
+
const changedRectsData = [];
|
|
35
|
+
observedElements.forEach((data, element) => {
|
|
36
|
+
const newRect = element.getBoundingClientRect();
|
|
37
|
+
if (!rectEquals(data.rect, newRect)) {
|
|
38
|
+
data.rect = newRect;
|
|
39
|
+
changedRectsData.push(data);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
changedRectsData.forEach((data) => {
|
|
43
|
+
data.callbacks.forEach((callback) => callback(data.rect));
|
|
44
|
+
});
|
|
45
|
+
rafId = requestAnimationFrame(runLoop);
|
|
46
|
+
}
|
|
47
|
+
function rectEquals(rect1, rect2) {
|
|
48
|
+
return rect1.width === rect2.width && rect1.height === rect2.height && rect1.top === rect2.top && rect1.right === rect2.right && rect1.bottom === rect2.bottom && rect1.left === rect2.left;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export { observeElementRect };
|
|
52
|
+
//# sourceMappingURL=index.js.map
|
|
53
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/observe-element-rect.ts"],"names":["observedData"],"mappings":";AAUA,SAAS,kBAAA,CAEP,kBAEA,QAAA,EACA;AACA,EAAA,MAAM,YAAA,GAAe,gBAAA,CAAiB,GAAA,CAAI,gBAAgB,CAAA;AAE1D,EAAA,IAAI,iBAAiB,MAAA,EAAW;AAC9B,IAAA,gBAAA,CAAiB,IAAI,gBAAA,EAAkB;AAAA,MACrC,MAAM,EAAC;AAAA,MACP,SAAA,EAAW,CAAC,QAAQ;AAAA,KACrB,CAAA;AAED,IAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,MAAA,KAAA,GAAQ,sBAAsB,OAAO,CAAA;AAAA,IACvC;AAAA,EACF,CAAA,MAAO;AACL,IAAA,YAAA,CAAa,SAAA,CAAU,KAAK,QAAQ,CAAA;AACpC,IAAA,QAAA,CAAS,gBAAA,CAAiB,uBAAuB,CAAA;AAAA,EACnD;AAEA,EAAA,OAAO,MAAM;AACX,IAAA,MAAMA,aAAAA,GAAe,gBAAA,CAAiB,GAAA,CAAI,gBAAgB,CAAA;AAC1D,IAAA,IAAIA,kBAAiB,MAAA,EAAW;AAEhC,IAAA,MAAM,KAAA,GAAQA,aAAAA,CAAa,SAAA,CAAU,OAAA,CAAQ,QAAQ,CAAA;AACrD,IAAA,IAAI,QAAQ,EAAA,EAAI;AACd,MAAAA,aAAAA,CAAa,SAAA,CAAU,MAAA,CAAO,KAAA,EAAO,CAAC,CAAA;AAAA,IACxC;AAEA,IAAA,IAAIA,aAAAA,CAAa,SAAA,CAAU,MAAA,KAAW,CAAA,EAAG;AACvC,MAAA,gBAAA,CAAiB,OAAO,gBAAgB,CAAA;AAExC,MAAA,IAAI,gBAAA,CAAiB,SAAS,CAAA,EAAG;AAC/B,QAAA,oBAAA,CAAqB,KAAK,CAAA;AAAA,MAC5B;AAAA,IACF;AAAA,EACF,CAAA;AACF;AAYA,IAAI,KAAA;AACJ,IAAM,gBAAA,uBAAsD,GAAA,EAAI;AAEhE,SAAS,OAAA,GAAU;AACjB,EAAA,MAAM,mBAAwC,EAAC;AAE/C,EAAA,gBAAA,CAAiB,OAAA,CAAQ,CAAC,IAAA,EAAM,OAAA,KAAY;AAC1C,IAAA,MAAM,OAAA,GAAU,QAAQ,qBAAA,EAAsB;AAE9C,IAAA,IAAI,CAAC,UAAA,CAAW,IAAA,CAAK,IAAA,EAAM,OAAO,CAAA,EAAG;AACnC,MAAA,IAAA,CAAK,IAAA,GAAO,OAAA;AACZ,MAAA,gBAAA,CAAiB,KAAK,IAAI,CAAA;AAAA,IAC5B;AAAA,EACF,CAAC,CAAA;AAED,EAAA,gBAAA,CAAiB,OAAA,CAAQ,CAAC,IAAA,KAAS;AACjC,IAAA,IAAA,CAAK,UAAU,OAAA,CAAQ,CAAC,aAAa,QAAA,CAAS,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EAC1D,CAAC,CAAA;AAED,EAAA,KAAA,GAAQ,sBAAsB,OAAO,CAAA;AACvC;AAEA,SAAS,UAAA,CAAW,OAAgB,KAAA,EAAgB;AAClD,EAAA,OACE,KAAA,CAAM,UAAU,KAAA,CAAM,KAAA,IACtB,MAAM,MAAA,KAAW,KAAA,CAAM,MAAA,IACvB,KAAA,CAAM,GAAA,KAAQ,KAAA,CAAM,OACpB,KAAA,CAAM,KAAA,KAAU,MAAM,KAAA,IACtB,KAAA,CAAM,WAAW,KAAA,CAAM,MAAA,IACvB,KAAA,CAAM,IAAA,KAAS,KAAA,CAAM,IAAA;AAEzB","file":"index.js","sourcesContent":["// Adapted from https://github.com/reach/observe-rect/tree\n// MIT license, React Training\n\ntype Measurable = { getBoundingClientRect(): DOMRect };\n\n/**\n * Observes an element's rectangle on screen (getBoundingClientRect)\n * This is useful to track elements on the screen and attach other elements\n * that might be in different layers, etc.\n */\nfunction observeElementRect(\n /** The element whose rect to observe */\n elementToObserve: Measurable,\n /** The callback which will be called when the rect changes */\n callback: CallbackFn\n) {\n const observedData = observedElements.get(elementToObserve);\n\n if (observedData === undefined) {\n observedElements.set(elementToObserve, {\n rect: {} as DOMRect,\n callbacks: [callback],\n });\n\n if (observedElements.size === 1) {\n rafId = requestAnimationFrame(runLoop);\n }\n } else {\n observedData.callbacks.push(callback);\n callback(elementToObserve.getBoundingClientRect());\n }\n\n return () => {\n const observedData = observedElements.get(elementToObserve);\n if (observedData === undefined) return;\n\n const index = observedData.callbacks.indexOf(callback);\n if (index > -1) {\n observedData.callbacks.splice(index, 1);\n }\n\n if (observedData.callbacks.length === 0) {\n observedElements.delete(elementToObserve);\n\n if (observedElements.size === 0) {\n cancelAnimationFrame(rafId);\n }\n }\n };\n}\n\n// ========================================================================\n// module internals\n\ntype CallbackFn = (rect: DOMRect) => void;\n\ntype ObservedData = {\n rect: DOMRect;\n callbacks: Array<CallbackFn>;\n};\n\nlet rafId: number;\nconst observedElements: Map<Measurable, ObservedData> = new Map();\n\nfunction runLoop() {\n const changedRectsData: Array<ObservedData> = [];\n\n observedElements.forEach((data, element) => {\n const newRect = element.getBoundingClientRect();\n\n if (!rectEquals(data.rect, newRect)) {\n data.rect = newRect;\n changedRectsData.push(data);\n }\n });\n\n changedRectsData.forEach((data) => {\n data.callbacks.forEach((callback) => callback(data.rect));\n });\n\n rafId = requestAnimationFrame(runLoop);\n}\n\nfunction rectEquals(rect1: DOMRect, rect2: DOMRect) {\n return (\n rect1.width === rect2.width &&\n rect1.height === rect2.height &&\n rect1.top === rect2.top &&\n rect1.right === rect2.right &&\n rect1.bottom === rect2.bottom &&\n rect1.left === rect2.left\n );\n}\n\nexport { observeElementRect };\nexport type { Measurable };\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@radix-solid-js/rect",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"license": "MIT",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.cjs",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"default": "./dist/index.js"
|
|
14
|
+
},
|
|
15
|
+
"require": {
|
|
16
|
+
"types": "./dist/index.d.cts",
|
|
17
|
+
"default": "./dist/index.cjs"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"dist"
|
|
23
|
+
],
|
|
24
|
+
"sideEffects": false,
|
|
25
|
+
"scripts": {
|
|
26
|
+
"build": "tsup",
|
|
27
|
+
"clean": "rm -rf dist",
|
|
28
|
+
"typecheck": "tsc --noEmit"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@repo/tsconfig": "workspace:*",
|
|
32
|
+
"tsup": "^8.3.6",
|
|
33
|
+
"typescript": "^5.7.3"
|
|
34
|
+
},
|
|
35
|
+
"publishConfig": {
|
|
36
|
+
"access": "public"
|
|
37
|
+
},
|
|
38
|
+
"repository": {
|
|
39
|
+
"type": "git",
|
|
40
|
+
"url": "https://github.com/ljho01/shadcn-solid-js.git",
|
|
41
|
+
"directory": "packages/core/rect"
|
|
42
|
+
}
|
|
43
|
+
}
|