@spark-ui/hooks 17.2.3 → 17.2.4-beta.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.
@@ -1,50 +1,53 @@
1
- "use strict";
2
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const react = require("react");
2
+ require("../use-combined-state/index.js");
3
+ let react = require("react");
4
+ //#region src/use-scroll-overflow/useScrollOverflow.tsx
4
5
  function useScrollOverflow(scrollRef, { precisionTreshold = 0 } = {}) {
5
- const [overflow, setOverflow] = react.useState({
6
- top: 0,
7
- bottom: 0,
8
- left: 0,
9
- right: 0
10
- });
11
- const precisionTresholdRef = react.useRef(precisionTreshold);
12
- precisionTresholdRef.current = precisionTreshold;
13
- const checkScrollContent = react.useCallback(() => {
14
- const scrollElement = scrollRef.current;
15
- if (scrollElement) {
16
- const { scrollTop, scrollHeight, clientHeight, scrollLeft, scrollWidth, clientWidth } = scrollElement;
17
- const applyPrecision = (value) => {
18
- return value <= precisionTresholdRef.current ? 0 : value;
19
- };
20
- const rightOverflow = scrollWidth - (scrollLeft + clientWidth);
21
- const bottomOverflow = scrollHeight - (scrollTop + clientHeight);
22
- setOverflow({
23
- top: applyPrecision(scrollTop),
24
- bottom: applyPrecision(bottomOverflow),
25
- left: applyPrecision(scrollLeft),
26
- right: applyPrecision(rightOverflow)
27
- });
28
- }
29
- }, [scrollRef]);
30
- react.useEffect(() => {
31
- checkScrollContent();
32
- const scrollElement = scrollRef.current;
33
- if (scrollElement) {
34
- scrollElement.addEventListener("scroll", checkScrollContent);
35
- window.addEventListener("resize", checkScrollContent);
36
- }
37
- return () => {
38
- if (scrollElement) {
39
- scrollElement.removeEventListener("scroll", checkScrollContent);
40
- window.removeEventListener("resize", checkScrollContent);
41
- }
42
- };
43
- }, [scrollRef, checkScrollContent]);
44
- return {
45
- overflow,
46
- refresh: checkScrollContent
47
- };
6
+ const [overflow, setOverflow] = (0, react.useState)({
7
+ top: 0,
8
+ bottom: 0,
9
+ left: 0,
10
+ right: 0
11
+ });
12
+ const precisionTresholdRef = (0, react.useRef)(precisionTreshold);
13
+ precisionTresholdRef.current = precisionTreshold;
14
+ const checkScrollContent = (0, react.useCallback)(() => {
15
+ const scrollElement = scrollRef.current;
16
+ if (scrollElement) {
17
+ const { scrollTop, scrollHeight, clientHeight, scrollLeft, scrollWidth, clientWidth } = scrollElement;
18
+ const applyPrecision = (value) => {
19
+ return value <= precisionTresholdRef.current ? 0 : value;
20
+ };
21
+ const rightOverflow = scrollWidth - (scrollLeft + clientWidth);
22
+ const bottomOverflow = scrollHeight - (scrollTop + clientHeight);
23
+ setOverflow({
24
+ top: applyPrecision(scrollTop),
25
+ bottom: applyPrecision(bottomOverflow),
26
+ left: applyPrecision(scrollLeft),
27
+ right: applyPrecision(rightOverflow)
28
+ });
29
+ }
30
+ }, [scrollRef]);
31
+ (0, react.useEffect)(() => {
32
+ checkScrollContent();
33
+ const scrollElement = scrollRef.current;
34
+ if (scrollElement) {
35
+ scrollElement.addEventListener("scroll", checkScrollContent);
36
+ window.addEventListener("resize", checkScrollContent);
37
+ }
38
+ return () => {
39
+ if (scrollElement) {
40
+ scrollElement.removeEventListener("scroll", checkScrollContent);
41
+ window.removeEventListener("resize", checkScrollContent);
42
+ }
43
+ };
44
+ }, [scrollRef, checkScrollContent]);
45
+ return {
46
+ overflow,
47
+ refresh: checkScrollContent
48
+ };
48
49
  }
50
+ //#endregion
49
51
  exports.useScrollOverflow = useScrollOverflow;
50
- //# sourceMappingURL=index.js.map
52
+
53
+ //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/use-scroll-overflow/useScrollOverflow.tsx"],"sourcesContent":["import { RefObject, useCallback, useEffect, useRef, useState } from 'react'\n\nexport interface ScrollOverflow {\n top: number\n bottom: number\n left: number\n right: number\n}\n\nexport interface UseScrollOverflowReturn {\n overflow: ScrollOverflow\n refresh: () => void\n}\n\nexport function useScrollOverflow(\n scrollRef: RefObject<HTMLElement | null>,\n /**\n * Tolerance threshold for floating-point precision issues.\n * Values below this threshold are considered as \"no overflow\" to handle sub-pixel rendering artifacts.\n */\n { precisionTreshold = 0 }: { precisionTreshold?: number } = {}\n): UseScrollOverflowReturn {\n const [overflow, setOverflow] = useState<ScrollOverflow>({\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n })\n\n const precisionTresholdRef = useRef(precisionTreshold)\n precisionTresholdRef.current = precisionTreshold\n\n const checkScrollContent = useCallback(() => {\n const scrollElement = scrollRef.current\n\n if (scrollElement) {\n const { scrollTop, scrollHeight, clientHeight, scrollLeft, scrollWidth, clientWidth } =\n scrollElement\n\n const applyPrecision = (value: number): number => {\n return value <= precisionTresholdRef.current ? 0 : value\n }\n\n const rightOverflow = scrollWidth - (scrollLeft + clientWidth)\n const bottomOverflow = scrollHeight - (scrollTop + clientHeight)\n\n setOverflow({\n top: applyPrecision(scrollTop),\n bottom: applyPrecision(bottomOverflow),\n left: applyPrecision(scrollLeft),\n right: applyPrecision(rightOverflow),\n })\n }\n }, [scrollRef])\n\n useEffect(() => {\n checkScrollContent()\n\n const scrollElement = scrollRef.current\n if (scrollElement) {\n scrollElement.addEventListener('scroll', checkScrollContent)\n window.addEventListener('resize', checkScrollContent)\n }\n\n return () => {\n if (scrollElement) {\n scrollElement.removeEventListener('scroll', checkScrollContent)\n window.removeEventListener('resize', checkScrollContent)\n }\n }\n }, [scrollRef, checkScrollContent])\n\n return {\n overflow,\n refresh: checkScrollContent,\n }\n}\n"],"names":["useState","useRef","useCallback","useEffect"],"mappings":";;;AAcO,SAAS,kBACd,WAKA,EAAE,oBAAoB,EAAA,IAAsC,CAAA,GACnC;AACzB,QAAM,CAAC,UAAU,WAAW,IAAIA,eAAyB;AAAA,IACvD,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,OAAO;AAAA,EAAA,CACR;AAED,QAAM,uBAAuBC,MAAAA,OAAO,iBAAiB;AACrD,uBAAqB,UAAU;AAE/B,QAAM,qBAAqBC,MAAAA,YAAY,MAAM;AAC3C,UAAM,gBAAgB,UAAU;AAEhC,QAAI,eAAe;AACjB,YAAM,EAAE,WAAW,cAAc,cAAc,YAAY,aAAa,gBACtE;AAEF,YAAM,iBAAiB,CAAC,UAA0B;AAChD,eAAO,SAAS,qBAAqB,UAAU,IAAI;AAAA,MACrD;AAEA,YAAM,gBAAgB,eAAe,aAAa;AAClD,YAAM,iBAAiB,gBAAgB,YAAY;AAEnD,kBAAY;AAAA,QACV,KAAK,eAAe,SAAS;AAAA,QAC7B,QAAQ,eAAe,cAAc;AAAA,QACrC,MAAM,eAAe,UAAU;AAAA,QAC/B,OAAO,eAAe,aAAa;AAAA,MAAA,CACpC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,SAAS,CAAC;AAEdC,QAAAA,UAAU,MAAM;AACd,uBAAA;AAEA,UAAM,gBAAgB,UAAU;AAChC,QAAI,eAAe;AACjB,oBAAc,iBAAiB,UAAU,kBAAkB;AAC3D,aAAO,iBAAiB,UAAU,kBAAkB;AAAA,IACtD;AAEA,WAAO,MAAM;AACX,UAAI,eAAe;AACjB,sBAAc,oBAAoB,UAAU,kBAAkB;AAC9D,eAAO,oBAAoB,UAAU,kBAAkB;AAAA,MACzD;AAAA,IACF;AAAA,EACF,GAAG,CAAC,WAAW,kBAAkB,CAAC;AAElC,SAAO;AAAA,IACL;AAAA,IACA,SAAS;AAAA,EAAA;AAEb;;"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/use-scroll-overflow/useScrollOverflow.tsx"],"sourcesContent":["import { RefObject, useCallback, useEffect, useRef, useState } from 'react'\n\nexport interface ScrollOverflow {\n top: number\n bottom: number\n left: number\n right: number\n}\n\nexport interface UseScrollOverflowReturn {\n overflow: ScrollOverflow\n refresh: () => void\n}\n\nexport function useScrollOverflow(\n scrollRef: RefObject<HTMLElement | null>,\n /**\n * Tolerance threshold for floating-point precision issues.\n * Values below this threshold are considered as \"no overflow\" to handle sub-pixel rendering artifacts.\n */\n { precisionTreshold = 0 }: { precisionTreshold?: number } = {}\n): UseScrollOverflowReturn {\n const [overflow, setOverflow] = useState<ScrollOverflow>({\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n })\n\n const precisionTresholdRef = useRef(precisionTreshold)\n precisionTresholdRef.current = precisionTreshold\n\n const checkScrollContent = useCallback(() => {\n const scrollElement = scrollRef.current\n\n if (scrollElement) {\n const { scrollTop, scrollHeight, clientHeight, scrollLeft, scrollWidth, clientWidth } =\n scrollElement\n\n const applyPrecision = (value: number): number => {\n return value <= precisionTresholdRef.current ? 0 : value\n }\n\n const rightOverflow = scrollWidth - (scrollLeft + clientWidth)\n const bottomOverflow = scrollHeight - (scrollTop + clientHeight)\n\n setOverflow({\n top: applyPrecision(scrollTop),\n bottom: applyPrecision(bottomOverflow),\n left: applyPrecision(scrollLeft),\n right: applyPrecision(rightOverflow),\n })\n }\n }, [scrollRef])\n\n useEffect(() => {\n checkScrollContent()\n\n const scrollElement = scrollRef.current\n if (scrollElement) {\n scrollElement.addEventListener('scroll', checkScrollContent)\n window.addEventListener('resize', checkScrollContent)\n }\n\n return () => {\n if (scrollElement) {\n scrollElement.removeEventListener('scroll', checkScrollContent)\n window.removeEventListener('resize', checkScrollContent)\n }\n }\n }, [scrollRef, checkScrollContent])\n\n return {\n overflow,\n refresh: checkScrollContent,\n }\n}\n"],"mappings":";;;;AAcA,SAAgB,kBACd,WAKA,EAAE,oBAAoB,MAAsC,EAAE,EACrC;CACzB,MAAM,CAAC,UAAU,gBAAA,GAAA,MAAA,UAAwC;EACvD,KAAK;EACL,QAAQ;EACR,MAAM;EACN,OAAO;EACR,CAAC;CAEF,MAAM,wBAAA,GAAA,MAAA,QAA8B,kBAAkB;AACtD,sBAAqB,UAAU;CAE/B,MAAM,sBAAA,GAAA,MAAA,mBAAuC;EAC3C,MAAM,gBAAgB,UAAU;AAEhC,MAAI,eAAe;GACjB,MAAM,EAAE,WAAW,cAAc,cAAc,YAAY,aAAa,gBACtE;GAEF,MAAM,kBAAkB,UAA0B;AAChD,WAAO,SAAS,qBAAqB,UAAU,IAAI;;GAGrD,MAAM,gBAAgB,eAAe,aAAa;GAClD,MAAM,iBAAiB,gBAAgB,YAAY;AAEnD,eAAY;IACV,KAAK,eAAe,UAAU;IAC9B,QAAQ,eAAe,eAAe;IACtC,MAAM,eAAe,WAAW;IAChC,OAAO,eAAe,cAAc;IACrC,CAAC;;IAEH,CAAC,UAAU,CAAC;AAEf,EAAA,GAAA,MAAA,iBAAgB;AACd,sBAAoB;EAEpB,MAAM,gBAAgB,UAAU;AAChC,MAAI,eAAe;AACjB,iBAAc,iBAAiB,UAAU,mBAAmB;AAC5D,UAAO,iBAAiB,UAAU,mBAAmB;;AAGvD,eAAa;AACX,OAAI,eAAe;AACjB,kBAAc,oBAAoB,UAAU,mBAAmB;AAC/D,WAAO,oBAAoB,UAAU,mBAAmB;;;IAG3D,CAAC,WAAW,mBAAmB,CAAC;AAEnC,QAAO;EACL;EACA,SAAS;EACV"}
@@ -1,50 +1,51 @@
1
- import { useState, useRef, useCallback, useEffect } from "react";
1
+ import { useCallback, useEffect, useRef, useState } from "react";
2
+ //#region src/use-scroll-overflow/useScrollOverflow.tsx
2
3
  function useScrollOverflow(scrollRef, { precisionTreshold = 0 } = {}) {
3
- const [overflow, setOverflow] = useState({
4
- top: 0,
5
- bottom: 0,
6
- left: 0,
7
- right: 0
8
- });
9
- const precisionTresholdRef = useRef(precisionTreshold);
10
- precisionTresholdRef.current = precisionTreshold;
11
- const checkScrollContent = useCallback(() => {
12
- const scrollElement = scrollRef.current;
13
- if (scrollElement) {
14
- const { scrollTop, scrollHeight, clientHeight, scrollLeft, scrollWidth, clientWidth } = scrollElement;
15
- const applyPrecision = (value) => {
16
- return value <= precisionTresholdRef.current ? 0 : value;
17
- };
18
- const rightOverflow = scrollWidth - (scrollLeft + clientWidth);
19
- const bottomOverflow = scrollHeight - (scrollTop + clientHeight);
20
- setOverflow({
21
- top: applyPrecision(scrollTop),
22
- bottom: applyPrecision(bottomOverflow),
23
- left: applyPrecision(scrollLeft),
24
- right: applyPrecision(rightOverflow)
25
- });
26
- }
27
- }, [scrollRef]);
28
- useEffect(() => {
29
- checkScrollContent();
30
- const scrollElement = scrollRef.current;
31
- if (scrollElement) {
32
- scrollElement.addEventListener("scroll", checkScrollContent);
33
- window.addEventListener("resize", checkScrollContent);
34
- }
35
- return () => {
36
- if (scrollElement) {
37
- scrollElement.removeEventListener("scroll", checkScrollContent);
38
- window.removeEventListener("resize", checkScrollContent);
39
- }
40
- };
41
- }, [scrollRef, checkScrollContent]);
42
- return {
43
- overflow,
44
- refresh: checkScrollContent
45
- };
4
+ const [overflow, setOverflow] = useState({
5
+ top: 0,
6
+ bottom: 0,
7
+ left: 0,
8
+ right: 0
9
+ });
10
+ const precisionTresholdRef = useRef(precisionTreshold);
11
+ precisionTresholdRef.current = precisionTreshold;
12
+ const checkScrollContent = useCallback(() => {
13
+ const scrollElement = scrollRef.current;
14
+ if (scrollElement) {
15
+ const { scrollTop, scrollHeight, clientHeight, scrollLeft, scrollWidth, clientWidth } = scrollElement;
16
+ const applyPrecision = (value) => {
17
+ return value <= precisionTresholdRef.current ? 0 : value;
18
+ };
19
+ const rightOverflow = scrollWidth - (scrollLeft + clientWidth);
20
+ const bottomOverflow = scrollHeight - (scrollTop + clientHeight);
21
+ setOverflow({
22
+ top: applyPrecision(scrollTop),
23
+ bottom: applyPrecision(bottomOverflow),
24
+ left: applyPrecision(scrollLeft),
25
+ right: applyPrecision(rightOverflow)
26
+ });
27
+ }
28
+ }, [scrollRef]);
29
+ useEffect(() => {
30
+ checkScrollContent();
31
+ const scrollElement = scrollRef.current;
32
+ if (scrollElement) {
33
+ scrollElement.addEventListener("scroll", checkScrollContent);
34
+ window.addEventListener("resize", checkScrollContent);
35
+ }
36
+ return () => {
37
+ if (scrollElement) {
38
+ scrollElement.removeEventListener("scroll", checkScrollContent);
39
+ window.removeEventListener("resize", checkScrollContent);
40
+ }
41
+ };
42
+ }, [scrollRef, checkScrollContent]);
43
+ return {
44
+ overflow,
45
+ refresh: checkScrollContent
46
+ };
46
47
  }
47
- export {
48
- useScrollOverflow
49
- };
50
- //# sourceMappingURL=index.mjs.map
48
+ //#endregion
49
+ export { useScrollOverflow };
50
+
51
+ //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../src/use-scroll-overflow/useScrollOverflow.tsx"],"sourcesContent":["import { RefObject, useCallback, useEffect, useRef, useState } from 'react'\n\nexport interface ScrollOverflow {\n top: number\n bottom: number\n left: number\n right: number\n}\n\nexport interface UseScrollOverflowReturn {\n overflow: ScrollOverflow\n refresh: () => void\n}\n\nexport function useScrollOverflow(\n scrollRef: RefObject<HTMLElement | null>,\n /**\n * Tolerance threshold for floating-point precision issues.\n * Values below this threshold are considered as \"no overflow\" to handle sub-pixel rendering artifacts.\n */\n { precisionTreshold = 0 }: { precisionTreshold?: number } = {}\n): UseScrollOverflowReturn {\n const [overflow, setOverflow] = useState<ScrollOverflow>({\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n })\n\n const precisionTresholdRef = useRef(precisionTreshold)\n precisionTresholdRef.current = precisionTreshold\n\n const checkScrollContent = useCallback(() => {\n const scrollElement = scrollRef.current\n\n if (scrollElement) {\n const { scrollTop, scrollHeight, clientHeight, scrollLeft, scrollWidth, clientWidth } =\n scrollElement\n\n const applyPrecision = (value: number): number => {\n return value <= precisionTresholdRef.current ? 0 : value\n }\n\n const rightOverflow = scrollWidth - (scrollLeft + clientWidth)\n const bottomOverflow = scrollHeight - (scrollTop + clientHeight)\n\n setOverflow({\n top: applyPrecision(scrollTop),\n bottom: applyPrecision(bottomOverflow),\n left: applyPrecision(scrollLeft),\n right: applyPrecision(rightOverflow),\n })\n }\n }, [scrollRef])\n\n useEffect(() => {\n checkScrollContent()\n\n const scrollElement = scrollRef.current\n if (scrollElement) {\n scrollElement.addEventListener('scroll', checkScrollContent)\n window.addEventListener('resize', checkScrollContent)\n }\n\n return () => {\n if (scrollElement) {\n scrollElement.removeEventListener('scroll', checkScrollContent)\n window.removeEventListener('resize', checkScrollContent)\n }\n }\n }, [scrollRef, checkScrollContent])\n\n return {\n overflow,\n refresh: checkScrollContent,\n }\n}\n"],"names":[],"mappings":";AAcO,SAAS,kBACd,WAKA,EAAE,oBAAoB,EAAA,IAAsC,CAAA,GACnC;AACzB,QAAM,CAAC,UAAU,WAAW,IAAI,SAAyB;AAAA,IACvD,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,OAAO;AAAA,EAAA,CACR;AAED,QAAM,uBAAuB,OAAO,iBAAiB;AACrD,uBAAqB,UAAU;AAE/B,QAAM,qBAAqB,YAAY,MAAM;AAC3C,UAAM,gBAAgB,UAAU;AAEhC,QAAI,eAAe;AACjB,YAAM,EAAE,WAAW,cAAc,cAAc,YAAY,aAAa,gBACtE;AAEF,YAAM,iBAAiB,CAAC,UAA0B;AAChD,eAAO,SAAS,qBAAqB,UAAU,IAAI;AAAA,MACrD;AAEA,YAAM,gBAAgB,eAAe,aAAa;AAClD,YAAM,iBAAiB,gBAAgB,YAAY;AAEnD,kBAAY;AAAA,QACV,KAAK,eAAe,SAAS;AAAA,QAC7B,QAAQ,eAAe,cAAc;AAAA,QACrC,MAAM,eAAe,UAAU;AAAA,QAC/B,OAAO,eAAe,aAAa;AAAA,MAAA,CACpC;AAAA,IACH;AAAA,EACF,GAAG,CAAC,SAAS,CAAC;AAEd,YAAU,MAAM;AACd,uBAAA;AAEA,UAAM,gBAAgB,UAAU;AAChC,QAAI,eAAe;AACjB,oBAAc,iBAAiB,UAAU,kBAAkB;AAC3D,aAAO,iBAAiB,UAAU,kBAAkB;AAAA,IACtD;AAEA,WAAO,MAAM;AACX,UAAI,eAAe;AACjB,sBAAc,oBAAoB,UAAU,kBAAkB;AAC9D,eAAO,oBAAoB,UAAU,kBAAkB;AAAA,MACzD;AAAA,IACF;AAAA,EACF,GAAG,CAAC,WAAW,kBAAkB,CAAC;AAElC,SAAO;AAAA,IACL;AAAA,IACA,SAAS;AAAA,EAAA;AAEb;"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../src/use-scroll-overflow/useScrollOverflow.tsx"],"sourcesContent":["import { RefObject, useCallback, useEffect, useRef, useState } from 'react'\n\nexport interface ScrollOverflow {\n top: number\n bottom: number\n left: number\n right: number\n}\n\nexport interface UseScrollOverflowReturn {\n overflow: ScrollOverflow\n refresh: () => void\n}\n\nexport function useScrollOverflow(\n scrollRef: RefObject<HTMLElement | null>,\n /**\n * Tolerance threshold for floating-point precision issues.\n * Values below this threshold are considered as \"no overflow\" to handle sub-pixel rendering artifacts.\n */\n { precisionTreshold = 0 }: { precisionTreshold?: number } = {}\n): UseScrollOverflowReturn {\n const [overflow, setOverflow] = useState<ScrollOverflow>({\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n })\n\n const precisionTresholdRef = useRef(precisionTreshold)\n precisionTresholdRef.current = precisionTreshold\n\n const checkScrollContent = useCallback(() => {\n const scrollElement = scrollRef.current\n\n if (scrollElement) {\n const { scrollTop, scrollHeight, clientHeight, scrollLeft, scrollWidth, clientWidth } =\n scrollElement\n\n const applyPrecision = (value: number): number => {\n return value <= precisionTresholdRef.current ? 0 : value\n }\n\n const rightOverflow = scrollWidth - (scrollLeft + clientWidth)\n const bottomOverflow = scrollHeight - (scrollTop + clientHeight)\n\n setOverflow({\n top: applyPrecision(scrollTop),\n bottom: applyPrecision(bottomOverflow),\n left: applyPrecision(scrollLeft),\n right: applyPrecision(rightOverflow),\n })\n }\n }, [scrollRef])\n\n useEffect(() => {\n checkScrollContent()\n\n const scrollElement = scrollRef.current\n if (scrollElement) {\n scrollElement.addEventListener('scroll', checkScrollContent)\n window.addEventListener('resize', checkScrollContent)\n }\n\n return () => {\n if (scrollElement) {\n scrollElement.removeEventListener('scroll', checkScrollContent)\n window.removeEventListener('resize', checkScrollContent)\n }\n }\n }, [scrollRef, checkScrollContent])\n\n return {\n overflow,\n refresh: checkScrollContent,\n }\n}\n"],"mappings":";;AAcA,SAAgB,kBACd,WAKA,EAAE,oBAAoB,MAAsC,EAAE,EACrC;CACzB,MAAM,CAAC,UAAU,eAAe,SAAyB;EACvD,KAAK;EACL,QAAQ;EACR,MAAM;EACN,OAAO;EACR,CAAC;CAEF,MAAM,uBAAuB,OAAO,kBAAkB;AACtD,sBAAqB,UAAU;CAE/B,MAAM,qBAAqB,kBAAkB;EAC3C,MAAM,gBAAgB,UAAU;AAEhC,MAAI,eAAe;GACjB,MAAM,EAAE,WAAW,cAAc,cAAc,YAAY,aAAa,gBACtE;GAEF,MAAM,kBAAkB,UAA0B;AAChD,WAAO,SAAS,qBAAqB,UAAU,IAAI;;GAGrD,MAAM,gBAAgB,eAAe,aAAa;GAClD,MAAM,iBAAiB,gBAAgB,YAAY;AAEnD,eAAY;IACV,KAAK,eAAe,UAAU;IAC9B,QAAQ,eAAe,eAAe;IACtC,MAAM,eAAe,WAAW;IAChC,OAAO,eAAe,cAAc;IACrC,CAAC;;IAEH,CAAC,UAAU,CAAC;AAEf,iBAAgB;AACd,sBAAoB;EAEpB,MAAM,gBAAgB,UAAU;AAChC,MAAI,eAAe;AACjB,iBAAc,iBAAiB,UAAU,mBAAmB;AAC5D,UAAO,iBAAiB,UAAU,mBAAmB;;AAGvD,eAAa;AACX,OAAI,eAAe;AACjB,kBAAc,oBAAoB,UAAU,mBAAmB;AAC/D,WAAO,oBAAoB,UAAU,mBAAmB;;;IAG3D,CAAC,WAAW,mBAAmB,CAAC;AAEnC,QAAO;EACL;EACA,SAAS;EACV"}
@@ -1,98 +1,110 @@
1
- "use strict";
2
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const react = require("react");
4
- function useSortableList({
5
- items,
6
- onReorder,
7
- getItemKey
8
- }) {
9
- const itemRefs = react.useRef(/* @__PURE__ */ new Map());
10
- const handleDragStart = (e, index) => {
11
- e.dataTransfer.effectAllowed = "move";
12
- e.dataTransfer.setData("text/plain", index.toString());
13
- e.currentTarget.style.opacity = "var(--opacity-dim-3)";
14
- };
15
- const handleDragEnter = (e) => {
16
- e.preventDefault();
17
- e.currentTarget.setAttribute("data-drag-over", "true");
18
- };
19
- const handleDragOver = (e) => {
20
- e.preventDefault();
21
- e.dataTransfer.dropEffect = "move";
22
- };
23
- const handleDragLeave = (e) => {
24
- const relatedTarget = e.relatedTarget;
25
- const currentTarget = e.currentTarget;
26
- if (!relatedTarget || !currentTarget.contains(relatedTarget)) {
27
- e.currentTarget.removeAttribute("data-drag-over");
28
- }
29
- };
30
- const handleDragEnd = (e) => {
31
- e.currentTarget.style.opacity = "";
32
- e.currentTarget.removeAttribute("data-drag-over");
33
- };
34
- const handleDrop = (e, dropIndex) => {
35
- e.preventDefault();
36
- e.currentTarget.removeAttribute("data-drag-over");
37
- const dragIndex = parseInt(e.dataTransfer.getData("text/plain"), 10);
38
- if (!isNaN(dragIndex) && dragIndex !== dropIndex && dragIndex >= 0 && dragIndex < items.length) {
39
- const newItems = [...items];
40
- const [removed] = newItems.splice(dragIndex, 1);
41
- if (removed) {
42
- newItems.splice(dropIndex, 0, removed);
43
- onReorder(newItems);
44
- }
45
- }
46
- };
47
- const handleKeyDown = (e, _item, index) => {
48
- let direction = 0;
49
- if (e.key === "ArrowUp") {
50
- direction = -1;
51
- } else if (e.key === "ArrowDown") {
52
- direction = 1;
53
- } else {
54
- return;
55
- }
56
- const targetIndex = index + direction;
57
- if (targetIndex < 0 || targetIndex >= items.length) return;
58
- e.preventDefault();
59
- const newItems = [...items];
60
- const currentItem = newItems[index];
61
- const targetItem = newItems[targetIndex];
62
- if (currentItem && targetItem) {
63
- [newItems[index], newItems[targetIndex]] = [targetItem, currentItem];
64
- onReorder(newItems);
65
- requestAnimationFrame(() => {
66
- const itemKey = getItemKey(currentItem);
67
- const element = itemRefs.current.get(itemKey);
68
- element == null ? void 0 : element.focus();
69
- });
70
- }
71
- };
72
- const getItemProps = (item, index) => {
73
- const itemKey = getItemKey(item);
74
- return {
75
- draggable: true,
76
- onDragStart: (e) => handleDragStart(e, index),
77
- onDragEnter: handleDragEnter,
78
- onDragOver: handleDragOver,
79
- onDragLeave: handleDragLeave,
80
- onDragEnd: handleDragEnd,
81
- onDrop: (e) => handleDrop(e, index),
82
- onKeyDown: (e) => handleKeyDown(e, item, index),
83
- tabIndex: 0,
84
- ref: (node) => {
85
- if (node) {
86
- itemRefs.current.set(itemKey, node);
87
- } else {
88
- itemRefs.current.delete(itemKey);
89
- }
90
- }
91
- };
92
- };
93
- return {
94
- getItemProps
95
- };
2
+ require("../use-combined-state/index.js");
3
+ let react = require("react");
4
+ //#region src/use-sortable-list/useSortableList.tsx
5
+ /**
6
+ * Hook to make a list of items sortable via drag and drop and keyboard navigation
7
+ *
8
+ * @example
9
+ * ```tsx
10
+ * const { getItemProps } = useSortableList({
11
+ * items: myItems,
12
+ * onReorder: setMyItems,
13
+ * getItemKey: (item) => item.id
14
+ * })
15
+ *
16
+ * return (
17
+ * <ul>
18
+ * {myItems.map((item, index) => (
19
+ * <li
20
+ * key={getItemKey(item)}
21
+ * {...getItemProps(item, index)}
22
+ * >
23
+ * {item.name}
24
+ * </li>
25
+ * ))}
26
+ * </ul>
27
+ * )
28
+ * ```
29
+ */
30
+ function useSortableList({ items, onReorder, getItemKey }) {
31
+ const itemRefs = (0, react.useRef)(/* @__PURE__ */ new Map());
32
+ const handleDragStart = (e, index) => {
33
+ e.dataTransfer.effectAllowed = "move";
34
+ e.dataTransfer.setData("text/plain", index.toString());
35
+ e.currentTarget.style.opacity = "var(--opacity-dim-3)";
36
+ };
37
+ const handleDragEnter = (e) => {
38
+ e.preventDefault();
39
+ e.currentTarget.setAttribute("data-drag-over", "true");
40
+ };
41
+ const handleDragOver = (e) => {
42
+ e.preventDefault();
43
+ e.dataTransfer.dropEffect = "move";
44
+ };
45
+ const handleDragLeave = (e) => {
46
+ const relatedTarget = e.relatedTarget;
47
+ const currentTarget = e.currentTarget;
48
+ if (!relatedTarget || !currentTarget.contains(relatedTarget)) e.currentTarget.removeAttribute("data-drag-over");
49
+ };
50
+ const handleDragEnd = (e) => {
51
+ e.currentTarget.style.opacity = "";
52
+ e.currentTarget.removeAttribute("data-drag-over");
53
+ };
54
+ const handleDrop = (e, dropIndex) => {
55
+ e.preventDefault();
56
+ e.currentTarget.removeAttribute("data-drag-over");
57
+ const dragIndex = parseInt(e.dataTransfer.getData("text/plain"), 10);
58
+ if (!isNaN(dragIndex) && dragIndex !== dropIndex && dragIndex >= 0 && dragIndex < items.length) {
59
+ const newItems = [...items];
60
+ const [removed] = newItems.splice(dragIndex, 1);
61
+ if (removed) {
62
+ newItems.splice(dropIndex, 0, removed);
63
+ onReorder(newItems);
64
+ }
65
+ }
66
+ };
67
+ const handleKeyDown = (e, _item, index) => {
68
+ let direction = 0;
69
+ if (e.key === "ArrowUp") direction = -1;
70
+ else if (e.key === "ArrowDown") direction = 1;
71
+ else return;
72
+ const targetIndex = index + direction;
73
+ if (targetIndex < 0 || targetIndex >= items.length) return;
74
+ e.preventDefault();
75
+ const newItems = [...items];
76
+ const currentItem = newItems[index];
77
+ const targetItem = newItems[targetIndex];
78
+ if (currentItem && targetItem) {
79
+ [newItems[index], newItems[targetIndex]] = [targetItem, currentItem];
80
+ onReorder(newItems);
81
+ requestAnimationFrame(() => {
82
+ const itemKey = getItemKey(currentItem);
83
+ itemRefs.current.get(itemKey)?.focus();
84
+ });
85
+ }
86
+ };
87
+ const getItemProps = (item, index) => {
88
+ const itemKey = getItemKey(item);
89
+ return {
90
+ draggable: true,
91
+ onDragStart: (e) => handleDragStart(e, index),
92
+ onDragEnter: handleDragEnter,
93
+ onDragOver: handleDragOver,
94
+ onDragLeave: handleDragLeave,
95
+ onDragEnd: handleDragEnd,
96
+ onDrop: (e) => handleDrop(e, index),
97
+ onKeyDown: (e) => handleKeyDown(e, item, index),
98
+ tabIndex: 0,
99
+ ref: (node) => {
100
+ if (node) itemRefs.current.set(itemKey, node);
101
+ else itemRefs.current.delete(itemKey);
102
+ }
103
+ };
104
+ };
105
+ return { getItemProps };
96
106
  }
107
+ //#endregion
97
108
  exports.useSortableList = useSortableList;
98
- //# sourceMappingURL=index.js.map
109
+
110
+ //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/use-sortable-list/useSortableList.tsx"],"sourcesContent":["/* eslint-disable max-lines-per-function */\nimport { Ref, useRef } from 'react'\n\nexport interface UseSortableListOptions<T> {\n /**\n * The list of items to be sortable\n */\n items: T[]\n /**\n * Callback called when items are reordered\n * @param newItems - The reordered items array\n */\n onReorder: (newItems: T[]) => void\n /**\n * Function to generate a unique key for each item\n * @param item - The item to generate a key for\n * @returns A unique string key for the item\n */\n getItemKey: (item: T) => string\n}\n\nexport interface SortableItemProps<TElement extends HTMLElement = HTMLElement> {\n /**\n * Whether the item is draggable\n */\n draggable: boolean\n /**\n * Handler for drag start event\n */\n onDragStart: (e: React.DragEvent) => void\n /**\n * Handler for drag enter event\n */\n onDragEnter: (e: React.DragEvent) => void\n /**\n * Handler for drag over event\n */\n onDragOver: (e: React.DragEvent) => void\n /**\n * Handler for drag leave event\n */\n onDragLeave: (e: React.DragEvent) => void\n /**\n * Handler for drag end event\n */\n onDragEnd: (e: React.DragEvent) => void\n /**\n * Handler for drop event\n */\n onDrop: (e: React.DragEvent) => void\n /**\n * Handler for keyboard navigation\n */\n onKeyDown: (e: React.KeyboardEvent) => void\n /**\n * Tab index for keyboard navigation\n */\n tabIndex: number\n /**\n * Ref callback to attach to the item element\n */\n ref: Ref<TElement>\n}\n\nexport interface UseSortableListReturn<T> {\n /**\n * Get props to spread on a sortable item element (includes ref)\n * @param item - The item to get props for\n * @param index - The current index of the item in the list\n * @returns Props object to spread on the element\n */\n getItemProps: <TElement extends HTMLElement = HTMLElement>(\n item: T,\n index: number\n ) => SortableItemProps<TElement>\n}\n\n/**\n * Hook to make a list of items sortable via drag and drop and keyboard navigation\n *\n * @example\n * ```tsx\n * const { getItemProps } = useSortableList({\n * items: myItems,\n * onReorder: setMyItems,\n * getItemKey: (item) => item.id\n * })\n *\n * return (\n * <ul>\n * {myItems.map((item, index) => (\n * <li\n * key={getItemKey(item)}\n * {...getItemProps(item, index)}\n * >\n * {item.name}\n * </li>\n * ))}\n * </ul>\n * )\n * ```\n */\nexport function useSortableList<T>({\n items,\n onReorder,\n getItemKey,\n}: UseSortableListOptions<T>): UseSortableListReturn<T> {\n // Refs to maintain focus after keyboard reordering\n // Uses a key based on the item rather than index\n const itemRefs = useRef<Map<string, HTMLElement>>(new Map())\n\n const handleDragStart = (e: React.DragEvent, index: number) => {\n e.dataTransfer.effectAllowed = 'move'\n e.dataTransfer.setData('text/plain', index.toString())\n // Apply inline style for opacity during drag\n ;(e.currentTarget as HTMLElement).style.opacity = 'var(--opacity-dim-3)'\n }\n\n const handleDragEnter = (e: React.DragEvent) => {\n e.preventDefault()\n e.currentTarget.setAttribute('data-drag-over', 'true')\n }\n\n const handleDragOver = (e: React.DragEvent) => {\n e.preventDefault()\n e.dataTransfer.dropEffect = 'move'\n }\n\n const handleDragLeave = (e: React.DragEvent) => {\n // Only remove the attribute if we're actually leaving the element\n // (not just moving to a child element)\n const relatedTarget = e.relatedTarget as Node | null\n const currentTarget = e.currentTarget as Node\n\n if (!relatedTarget || !currentTarget.contains(relatedTarget)) {\n e.currentTarget.removeAttribute('data-drag-over')\n }\n }\n\n const handleDragEnd = (e: React.DragEvent) => {\n // Remove inline style for opacity\n ;(e.currentTarget as HTMLElement).style.opacity = ''\n e.currentTarget.removeAttribute('data-drag-over')\n }\n\n const handleDrop = (e: React.DragEvent, dropIndex: number) => {\n e.preventDefault()\n e.currentTarget.removeAttribute('data-drag-over')\n\n const dragIndex = parseInt(e.dataTransfer.getData('text/plain'), 10)\n\n if (\n !isNaN(dragIndex) &&\n dragIndex !== dropIndex &&\n dragIndex >= 0 &&\n dragIndex < items.length\n ) {\n const newItems = [...items]\n const [removed] = newItems.splice(dragIndex, 1)\n if (removed) {\n newItems.splice(dropIndex, 0, removed)\n onReorder(newItems)\n }\n }\n }\n\n const handleKeyDown = (e: React.KeyboardEvent, _item: T, index: number) => {\n // Determine direction\n let direction = 0\n if (e.key === 'ArrowUp') {\n direction = -1\n } else if (e.key === 'ArrowDown') {\n direction = 1\n } else {\n return\n }\n\n const targetIndex = index + direction\n\n // Validate move is within bounds\n if (targetIndex < 0 || targetIndex >= items.length) return\n\n e.preventDefault()\n\n // Create new array and swap items\n const newItems = [...items]\n const currentItem = newItems[index]\n const targetItem = newItems[targetIndex]\n\n if (currentItem && targetItem) {\n ;[newItems[index], newItems[targetIndex]] = [targetItem, currentItem]\n onReorder(newItems)\n\n // Maintain focus on the moved item\n requestAnimationFrame(() => {\n const itemKey = getItemKey(currentItem)\n const element = itemRefs.current.get(itemKey)\n element?.focus()\n })\n }\n }\n\n const getItemProps = <TElement extends HTMLElement = HTMLElement>(\n item: T,\n index: number\n ): SortableItemProps<TElement> => {\n const itemKey = getItemKey(item)\n\n return {\n draggable: true,\n onDragStart: e => handleDragStart(e, index),\n onDragEnter: handleDragEnter,\n onDragOver: handleDragOver,\n onDragLeave: handleDragLeave,\n onDragEnd: handleDragEnd,\n onDrop: e => handleDrop(e, index),\n onKeyDown: e => handleKeyDown(e, item, index),\n tabIndex: 0,\n ref: (node: TElement | null) => {\n if (node) {\n itemRefs.current.set(itemKey, node as HTMLElement)\n } else {\n itemRefs.current.delete(itemKey)\n }\n },\n }\n }\n\n return {\n getItemProps,\n }\n}\n"],"names":["useRef"],"mappings":";;;AAsGO,SAAS,gBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AACF,GAAwD;AAGtD,QAAM,WAAWA,MAAAA,OAAiC,oBAAI,KAAK;AAE3D,QAAM,kBAAkB,CAAC,GAAoB,UAAkB;AAC7D,MAAE,aAAa,gBAAgB;AAC/B,MAAE,aAAa,QAAQ,cAAc,MAAM,UAAU;AAEnD,MAAE,cAA8B,MAAM,UAAU;AAAA,EACpD;AAEA,QAAM,kBAAkB,CAAC,MAAuB;AAC9C,MAAE,eAAA;AACF,MAAE,cAAc,aAAa,kBAAkB,MAAM;AAAA,EACvD;AAEA,QAAM,iBAAiB,CAAC,MAAuB;AAC7C,MAAE,eAAA;AACF,MAAE,aAAa,aAAa;AAAA,EAC9B;AAEA,QAAM,kBAAkB,CAAC,MAAuB;AAG9C,UAAM,gBAAgB,EAAE;AACxB,UAAM,gBAAgB,EAAE;AAExB,QAAI,CAAC,iBAAiB,CAAC,cAAc,SAAS,aAAa,GAAG;AAC5D,QAAE,cAAc,gBAAgB,gBAAgB;AAAA,IAClD;AAAA,EACF;AAEA,QAAM,gBAAgB,CAAC,MAAuB;AAE1C,MAAE,cAA8B,MAAM,UAAU;AAClD,MAAE,cAAc,gBAAgB,gBAAgB;AAAA,EAClD;AAEA,QAAM,aAAa,CAAC,GAAoB,cAAsB;AAC5D,MAAE,eAAA;AACF,MAAE,cAAc,gBAAgB,gBAAgB;AAEhD,UAAM,YAAY,SAAS,EAAE,aAAa,QAAQ,YAAY,GAAG,EAAE;AAEnE,QACE,CAAC,MAAM,SAAS,KAChB,cAAc,aACd,aAAa,KACb,YAAY,MAAM,QAClB;AACA,YAAM,WAAW,CAAC,GAAG,KAAK;AAC1B,YAAM,CAAC,OAAO,IAAI,SAAS,OAAO,WAAW,CAAC;AAC9C,UAAI,SAAS;AACX,iBAAS,OAAO,WAAW,GAAG,OAAO;AACrC,kBAAU,QAAQ;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,gBAAgB,CAAC,GAAwB,OAAU,UAAkB;AAEzE,QAAI,YAAY;AAChB,QAAI,EAAE,QAAQ,WAAW;AACvB,kBAAY;AAAA,IACd,WAAW,EAAE,QAAQ,aAAa;AAChC,kBAAY;AAAA,IACd,OAAO;AACL;AAAA,IACF;AAEA,UAAM,cAAc,QAAQ;AAG5B,QAAI,cAAc,KAAK,eAAe,MAAM,OAAQ;AAEpD,MAAE,eAAA;AAGF,UAAM,WAAW,CAAC,GAAG,KAAK;AAC1B,UAAM,cAAc,SAAS,KAAK;AAClC,UAAM,aAAa,SAAS,WAAW;AAEvC,QAAI,eAAe,YAAY;AAC5B,OAAC,SAAS,KAAK,GAAG,SAAS,WAAW,CAAC,IAAI,CAAC,YAAY,WAAW;AACpE,gBAAU,QAAQ;AAGlB,4BAAsB,MAAM;AAC1B,cAAM,UAAU,WAAW,WAAW;AACtC,cAAM,UAAU,SAAS,QAAQ,IAAI,OAAO;AAC5C,2CAAS;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,eAAe,CACnB,MACA,UACgC;AAChC,UAAM,UAAU,WAAW,IAAI;AAE/B,WAAO;AAAA,MACL,WAAW;AAAA,MACX,aAAa,CAAA,MAAK,gBAAgB,GAAG,KAAK;AAAA,MAC1C,aAAa;AAAA,MACb,YAAY;AAAA,MACZ,aAAa;AAAA,MACb,WAAW;AAAA,MACX,QAAQ,CAAA,MAAK,WAAW,GAAG,KAAK;AAAA,MAChC,WAAW,CAAA,MAAK,cAAc,GAAG,MAAM,KAAK;AAAA,MAC5C,UAAU;AAAA,MACV,KAAK,CAAC,SAA0B;AAC9B,YAAI,MAAM;AACR,mBAAS,QAAQ,IAAI,SAAS,IAAmB;AAAA,QACnD,OAAO;AACL,mBAAS,QAAQ,OAAO,OAAO;AAAA,QACjC;AAAA,MACF;AAAA,IAAA;AAAA,EAEJ;AAEA,SAAO;AAAA,IACL;AAAA,EAAA;AAEJ;;"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/use-sortable-list/useSortableList.tsx"],"sourcesContent":["/* eslint-disable max-lines-per-function */\nimport { Ref, useRef } from 'react'\n\nexport interface UseSortableListOptions<T> {\n /**\n * The list of items to be sortable\n */\n items: T[]\n /**\n * Callback called when items are reordered\n * @param newItems - The reordered items array\n */\n onReorder: (newItems: T[]) => void\n /**\n * Function to generate a unique key for each item\n * @param item - The item to generate a key for\n * @returns A unique string key for the item\n */\n getItemKey: (item: T) => string\n}\n\nexport interface SortableItemProps<TElement extends HTMLElement = HTMLElement> {\n /**\n * Whether the item is draggable\n */\n draggable: boolean\n /**\n * Handler for drag start event\n */\n onDragStart: (e: React.DragEvent) => void\n /**\n * Handler for drag enter event\n */\n onDragEnter: (e: React.DragEvent) => void\n /**\n * Handler for drag over event\n */\n onDragOver: (e: React.DragEvent) => void\n /**\n * Handler for drag leave event\n */\n onDragLeave: (e: React.DragEvent) => void\n /**\n * Handler for drag end event\n */\n onDragEnd: (e: React.DragEvent) => void\n /**\n * Handler for drop event\n */\n onDrop: (e: React.DragEvent) => void\n /**\n * Handler for keyboard navigation\n */\n onKeyDown: (e: React.KeyboardEvent) => void\n /**\n * Tab index for keyboard navigation\n */\n tabIndex: number\n /**\n * Ref callback to attach to the item element\n */\n ref: Ref<TElement>\n}\n\nexport interface UseSortableListReturn<T> {\n /**\n * Get props to spread on a sortable item element (includes ref)\n * @param item - The item to get props for\n * @param index - The current index of the item in the list\n * @returns Props object to spread on the element\n */\n getItemProps: <TElement extends HTMLElement = HTMLElement>(\n item: T,\n index: number\n ) => SortableItemProps<TElement>\n}\n\n/**\n * Hook to make a list of items sortable via drag and drop and keyboard navigation\n *\n * @example\n * ```tsx\n * const { getItemProps } = useSortableList({\n * items: myItems,\n * onReorder: setMyItems,\n * getItemKey: (item) => item.id\n * })\n *\n * return (\n * <ul>\n * {myItems.map((item, index) => (\n * <li\n * key={getItemKey(item)}\n * {...getItemProps(item, index)}\n * >\n * {item.name}\n * </li>\n * ))}\n * </ul>\n * )\n * ```\n */\nexport function useSortableList<T>({\n items,\n onReorder,\n getItemKey,\n}: UseSortableListOptions<T>): UseSortableListReturn<T> {\n // Refs to maintain focus after keyboard reordering\n // Uses a key based on the item rather than index\n const itemRefs = useRef<Map<string, HTMLElement>>(new Map())\n\n const handleDragStart = (e: React.DragEvent, index: number) => {\n e.dataTransfer.effectAllowed = 'move'\n e.dataTransfer.setData('text/plain', index.toString())\n // Apply inline style for opacity during drag\n ;(e.currentTarget as HTMLElement).style.opacity = 'var(--opacity-dim-3)'\n }\n\n const handleDragEnter = (e: React.DragEvent) => {\n e.preventDefault()\n e.currentTarget.setAttribute('data-drag-over', 'true')\n }\n\n const handleDragOver = (e: React.DragEvent) => {\n e.preventDefault()\n e.dataTransfer.dropEffect = 'move'\n }\n\n const handleDragLeave = (e: React.DragEvent) => {\n // Only remove the attribute if we're actually leaving the element\n // (not just moving to a child element)\n const relatedTarget = e.relatedTarget as Node | null\n const currentTarget = e.currentTarget as Node\n\n if (!relatedTarget || !currentTarget.contains(relatedTarget)) {\n e.currentTarget.removeAttribute('data-drag-over')\n }\n }\n\n const handleDragEnd = (e: React.DragEvent) => {\n // Remove inline style for opacity\n ;(e.currentTarget as HTMLElement).style.opacity = ''\n e.currentTarget.removeAttribute('data-drag-over')\n }\n\n const handleDrop = (e: React.DragEvent, dropIndex: number) => {\n e.preventDefault()\n e.currentTarget.removeAttribute('data-drag-over')\n\n const dragIndex = parseInt(e.dataTransfer.getData('text/plain'), 10)\n\n if (\n !isNaN(dragIndex) &&\n dragIndex !== dropIndex &&\n dragIndex >= 0 &&\n dragIndex < items.length\n ) {\n const newItems = [...items]\n const [removed] = newItems.splice(dragIndex, 1)\n if (removed) {\n newItems.splice(dropIndex, 0, removed)\n onReorder(newItems)\n }\n }\n }\n\n const handleKeyDown = (e: React.KeyboardEvent, _item: T, index: number) => {\n // Determine direction\n let direction = 0\n if (e.key === 'ArrowUp') {\n direction = -1\n } else if (e.key === 'ArrowDown') {\n direction = 1\n } else {\n return\n }\n\n const targetIndex = index + direction\n\n // Validate move is within bounds\n if (targetIndex < 0 || targetIndex >= items.length) return\n\n e.preventDefault()\n\n // Create new array and swap items\n const newItems = [...items]\n const currentItem = newItems[index]\n const targetItem = newItems[targetIndex]\n\n if (currentItem && targetItem) {\n ;[newItems[index], newItems[targetIndex]] = [targetItem, currentItem]\n onReorder(newItems)\n\n // Maintain focus on the moved item\n requestAnimationFrame(() => {\n const itemKey = getItemKey(currentItem)\n const element = itemRefs.current.get(itemKey)\n element?.focus()\n })\n }\n }\n\n const getItemProps = <TElement extends HTMLElement = HTMLElement>(\n item: T,\n index: number\n ): SortableItemProps<TElement> => {\n const itemKey = getItemKey(item)\n\n return {\n draggable: true,\n onDragStart: e => handleDragStart(e, index),\n onDragEnter: handleDragEnter,\n onDragOver: handleDragOver,\n onDragLeave: handleDragLeave,\n onDragEnd: handleDragEnd,\n onDrop: e => handleDrop(e, index),\n onKeyDown: e => handleKeyDown(e, item, index),\n tabIndex: 0,\n ref: (node: TElement | null) => {\n if (node) {\n itemRefs.current.set(itemKey, node as HTMLElement)\n } else {\n itemRefs.current.delete(itemKey)\n }\n },\n }\n }\n\n return {\n getItemProps,\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsGA,SAAgB,gBAAmB,EACjC,OACA,WACA,cACsD;CAGtD,MAAM,YAAA,GAAA,MAAA,wBAA4C,IAAI,KAAK,CAAC;CAE5D,MAAM,mBAAmB,GAAoB,UAAkB;AAC7D,IAAE,aAAa,gBAAgB;AAC/B,IAAE,aAAa,QAAQ,cAAc,MAAM,UAAU,CAAC;AAEpD,IAAE,cAA8B,MAAM,UAAU;;CAGpD,MAAM,mBAAmB,MAAuB;AAC9C,IAAE,gBAAgB;AAClB,IAAE,cAAc,aAAa,kBAAkB,OAAO;;CAGxD,MAAM,kBAAkB,MAAuB;AAC7C,IAAE,gBAAgB;AAClB,IAAE,aAAa,aAAa;;CAG9B,MAAM,mBAAmB,MAAuB;EAG9C,MAAM,gBAAgB,EAAE;EACxB,MAAM,gBAAgB,EAAE;AAExB,MAAI,CAAC,iBAAiB,CAAC,cAAc,SAAS,cAAc,CAC1D,GAAE,cAAc,gBAAgB,iBAAiB;;CAIrD,MAAM,iBAAiB,MAAuB;AAE1C,IAAE,cAA8B,MAAM,UAAU;AAClD,IAAE,cAAc,gBAAgB,iBAAiB;;CAGnD,MAAM,cAAc,GAAoB,cAAsB;AAC5D,IAAE,gBAAgB;AAClB,IAAE,cAAc,gBAAgB,iBAAiB;EAEjD,MAAM,YAAY,SAAS,EAAE,aAAa,QAAQ,aAAa,EAAE,GAAG;AAEpE,MACE,CAAC,MAAM,UAAU,IACjB,cAAc,aACd,aAAa,KACb,YAAY,MAAM,QAClB;GACA,MAAM,WAAW,CAAC,GAAG,MAAM;GAC3B,MAAM,CAAC,WAAW,SAAS,OAAO,WAAW,EAAE;AAC/C,OAAI,SAAS;AACX,aAAS,OAAO,WAAW,GAAG,QAAQ;AACtC,cAAU,SAAS;;;;CAKzB,MAAM,iBAAiB,GAAwB,OAAU,UAAkB;EAEzE,IAAI,YAAY;AAChB,MAAI,EAAE,QAAQ,UACZ,aAAY;WACH,EAAE,QAAQ,YACnB,aAAY;MAEZ;EAGF,MAAM,cAAc,QAAQ;AAG5B,MAAI,cAAc,KAAK,eAAe,MAAM,OAAQ;AAEpD,IAAE,gBAAgB;EAGlB,MAAM,WAAW,CAAC,GAAG,MAAM;EAC3B,MAAM,cAAc,SAAS;EAC7B,MAAM,aAAa,SAAS;AAE5B,MAAI,eAAe,YAAY;AAC5B,IAAC,SAAS,QAAQ,SAAS,gBAAgB,CAAC,YAAY,YAAY;AACrE,aAAU,SAAS;AAGnB,+BAA4B;IAC1B,MAAM,UAAU,WAAW,YAAY;AACvB,aAAS,QAAQ,IAAI,QAAQ,EACpC,OAAO;KAChB;;;CAIN,MAAM,gBACJ,MACA,UACgC;EAChC,MAAM,UAAU,WAAW,KAAK;AAEhC,SAAO;GACL,WAAW;GACX,cAAa,MAAK,gBAAgB,GAAG,MAAM;GAC3C,aAAa;GACb,YAAY;GACZ,aAAa;GACb,WAAW;GACX,SAAQ,MAAK,WAAW,GAAG,MAAM;GACjC,YAAW,MAAK,cAAc,GAAG,MAAM,MAAM;GAC7C,UAAU;GACV,MAAM,SAA0B;AAC9B,QAAI,KACF,UAAS,QAAQ,IAAI,SAAS,KAAoB;QAElD,UAAS,QAAQ,OAAO,QAAQ;;GAGrC;;AAGH,QAAO,EACL,cACD"}