@sohanemon/utils 7.3.1 → 7.3.3
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/README.md +11 -2
- package/dist/components/index.cjs +1 -1
- package/dist/components/index.d.cts +50 -2
- package/dist/components/index.d.ts +55 -7
- package/dist/components/index.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
- **Cookie Management**: Functions to set, get, delete, and check for cookies.
|
|
18
18
|
- **Class Name Merging**: A utility to merge class names with Tailwind CSS and custom logic.
|
|
19
19
|
- **React Hooks**: Hooks for media queries, effects, state management (local/session storage, URL params), DOM calculations, async operations, scheduling, and more.
|
|
20
|
-
- **UI Components**: React components for HTML injection, media wrapping, responsive indicators, scrollable markers, and Iconify icons.
|
|
20
|
+
- **UI Components**: React components for HTML injection, media wrapping, responsive indicators, scrollable markers, mount-after delays, and Iconify icons.
|
|
21
21
|
- **TypeScript Types**: Advanced utility types for deep partials, requireds, readonly, guards, and type-level logic gates.
|
|
22
22
|
- **Browser Utilities**: Clipboard operations, scroll management, SSR detection, and more.
|
|
23
23
|
|
|
@@ -186,9 +186,12 @@ const { scrolledPast, direction } = useScrollTracker({ threshold: 300 });
|
|
|
186
186
|
|
|
187
187
|
#### UI Components
|
|
188
188
|
```tsx
|
|
189
|
-
import { HtmlInjector, ResponsiveIndicator, Portal, Iconify } from '@sohanemon/utils';
|
|
189
|
+
import { HtmlInjector, MountAfter, ResponsiveIndicator, Portal, Iconify } from '@sohanemon/utils';
|
|
190
190
|
|
|
191
191
|
<HtmlInjector html="<p>Injected HTML</p>" />
|
|
192
|
+
<MountAfter delay={300} fallback={<Spinner />}>
|
|
193
|
+
<ExpensiveComponent />
|
|
194
|
+
</MountAfter>
|
|
192
195
|
<ResponsiveIndicator />
|
|
193
196
|
<Portal container="#modal-root">
|
|
194
197
|
<Modal />
|
|
@@ -485,6 +488,12 @@ ResponsiveIndicator: React.Component<{
|
|
|
485
488
|
showText?: boolean;
|
|
486
489
|
}>
|
|
487
490
|
|
|
491
|
+
MountAfter: React.Component<{
|
|
492
|
+
delay?: number;
|
|
493
|
+
fallback?: React.ReactNode;
|
|
494
|
+
children: React.ReactNode;
|
|
495
|
+
}>
|
|
496
|
+
|
|
488
497
|
ScrollableMarker: React.Component<{
|
|
489
498
|
className?: string;
|
|
490
499
|
children?: React.ReactNode;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";const e=require(`../hooks-B_cSW9vB.cjs`),t=require(`../functions-Dp2CwvmB.cjs`);let n=require(`react`);n=e.A(n);let r=require(`@radix-ui/react-slot`),i=require(`react/jsx-runtime`),a=require(`@iconify/react`),o=require(`react-dom`);function s({selector:e,children:t}){let a=(0,n.useRef)(null),[o,s]=(0,n.useState)(!1),[c,l]=(0,n.useState)({hasClosest:!1,closestElement:null});return(0,n.useLayoutEffect)(()=>{if(a.current){let t=a.current.closest(e);l({hasClosest:t!==null,closestElement:t})}s(!0)},[e]),o?(0,i.jsx)(r.Slot,{ref:a,children:t(c)}):(0,i.jsx)(`span`,{ref:a})}function c({className:r,html:a,sanitize:o=!1,executeScripts:s=!0,...c}){let l=n.useRef([]),u=n.useRef(null);e.k(()=>{if(l.current.forEach(e=>{e.parentNode&&e.parentNode.removeChild(e)}),l.current=[],!(!s||!a))try{let e=document.createElement(`div`);e.innerHTML=a,e.querySelectorAll(`script`).forEach(e=>{let t=document.createElement(`script`);e.textContent&&(t.textContent=e.textContent),Array.from(e.attributes).forEach(e=>{t.setAttribute(e.name,e.value)}),t.onerror=e=>{console.error(`Script injection error:`,e)},document.body.appendChild(t),l.current.push(t)})}catch(e){console.error(`HTML injection error:`,e)}},[a,s]),n.useEffect(()=>()=>{l.current.forEach(e=>{e.parentNode&&e.parentNode.removeChild(e)})},[]);let d=n.useMemo(()=>{if(!a)return``;if(o){let e=document.createElement(`div`);e.innerHTML=a,e.querySelectorAll(`script`).forEach(e=>e.remove());let t=[`onclick`,`onload`,`onerror`,`onmouseover`];return e.querySelectorAll(`*`).forEach(e=>{t.forEach(t=>{e.hasAttribute(t)&&e.removeAttribute(t)})}),e.innerHTML}return a},[a,o]);return a?(0,i.jsx)(`div`,{ref:u,className:t.r(r),dangerouslySetInnerHTML:{__html:d},...c}):null}function l({breakpoint:t,as:r=`div`,fallback:a=n.Fragment,className:o,classNameFallback:s,...c}){let l=e.T(t.split(`-`).pop())===t.startsWith(`max`),u=l?a:r,d=l?s:o;return u===n.Fragment?(0,i.jsx)(u,{ref:c.ref,children:c.children},c.key):(0,i.jsx)(u,{className:d,...c})}function u({children:e,container:t}){let r=(0,n.useRef)(null),[i,a]=(0,n.useState)(!1);return(0,n.useLayoutEffect)(()=>{r.current=typeof t==`string`?document.querySelector(t):t.current,a(!0)},[]),!i||!r.current?null:(0,o.createPortal)(e,r.current)}const d=[`bottom-left`,`bottom-right`,`top-right`,`top-left`],f=({side:t,offset:r=2,unit:a=`rem`})=>{let[o,s]=n.useState(t??`bottom-left`),c=e.T({DEFAULT:`xs`,sm:`sm`,md:`md`,lg:`lg`,xl:`xl`,"2xl":`2xl`}),[l,u]=n.useState(typeof window<`u`?window.innerWidth:0);n.useEffect(()=>{if(typeof window>`u`)return;let e=()=>u(window.innerWidth);return window.addEventListener(`resize`,e),()=>window.removeEventListener(`resize`,e)},[]);let f=c===`2xl`&&l>=1792?a===`rem`?`${(l/16).toFixed(1)}rem`:`${l}${a}`:c,p={"bottom-left":{bottom:`${r}${a}`,left:`${r}${a}`},"bottom-right":{bottom:`${r}${a}`,right:`${r}${a}`},"top-right":{top:`${r}${a}`,right:`${r}${a}`},"top-left":{top:`${r}${a}`,left:`${r}${a}`}};return(0,i.jsx)(`button`,{type:`button`,onClick:()=>{s(d[(d.indexOf(o)+1)%d.length])},style:{position:`fixed`,zIndex:50,display:`grid`,height:`2.5rem`,minWidth:`2.5rem`,borderRadius:`30px`,placeContent:`center`,backgroundColor:`#2d3748`,fontFamily:`Courier New, Courier, monospace`,fontSize:`1rem`,color:`#ffffff`,border:`2px solid #4a5568`,boxShadow:`0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)`,padding:`0.5rem`,transition:`all 0.2s ease-in-out`,...p[o]},children:f})};function p(){return e.k(()=>{let e=document.body;if(!e)return;let t=e=>{let t=getComputedStyle(e);if(t.overflow===`hidden`&&t.overflowY===`hidden`&&t.overflowX===`hidden`)return!1;let n=(t.overflowY===`auto`||t.overflowY===`scroll`)&&e.scrollHeight>e.clientHeight,r=(t.overflowX===`auto`||t.overflowX===`scroll`)&&e.scrollWidth>e.clientWidth;return n||r},n=e=>{t(e)?e.dataset.scrollable=`true`:delete e.dataset.scrollable},r=e=>{n(e);for(let t=0;t<e.children.length;t++){let n=e.children[t];r(n)}};`requestIdleCallback`in window?window.requestIdleCallback(()=>r(e)):setTimeout(()=>r(e),0);let i=new MutationObserver(e=>{for(let t of e)t.type===`childList`?t.addedNodes.forEach(e=>{e instanceof HTMLElement&&r(e)}):t.type===`attributes`&&t.target instanceof HTMLElement&&n(t.target)});return i.observe(e,{subtree:!0,childList:!0,attributes:!0,attributeFilter:[`style`,`class`]}),()=>i.disconnect()},[]),null}exports.HtmlInjector=c,Object.defineProperty(exports,`Iconify`,{enumerable:!0,get:function(){return a.Icon}}),exports.MediaWrapper=l,exports.Portal=u,exports.ResponsiveIndicator=f,exports.TailwindIndicator=f,exports.ScrollTracker=e.C,exports.ScrollableMarker=p,exports.WithClosest=s;
|
|
1
|
+
"use client";const e=require(`../hooks-B_cSW9vB.cjs`),t=require(`../functions-Dp2CwvmB.cjs`);let n=require(`react`);n=e.A(n);let r=require(`@radix-ui/react-slot`),i=require(`react/jsx-runtime`),a=require(`@iconify/react`),o=require(`react-dom`);function s({selector:e,children:t}){let a=(0,n.useRef)(null),[o,s]=(0,n.useState)(!1),[c,l]=(0,n.useState)({hasClosest:!1,closestElement:null});return(0,n.useLayoutEffect)(()=>{if(a.current){let t=a.current.closest(e);l({hasClosest:t!==null,closestElement:t})}s(!0)},[e]),o?(0,i.jsx)(r.Slot,{ref:a,children:t(c)}):(0,i.jsx)(`span`,{ref:a})}function c({className:r,html:a,sanitize:o=!1,executeScripts:s=!0,...c}){let l=n.useRef([]),u=n.useRef(null);e.k(()=>{if(l.current.forEach(e=>{e.parentNode&&e.parentNode.removeChild(e)}),l.current=[],!(!s||!a))try{let e=document.createElement(`div`);e.innerHTML=a,e.querySelectorAll(`script`).forEach(e=>{let t=document.createElement(`script`);e.textContent&&(t.textContent=e.textContent),Array.from(e.attributes).forEach(e=>{t.setAttribute(e.name,e.value)}),t.onerror=e=>{console.error(`Script injection error:`,e)},document.body.appendChild(t),l.current.push(t)})}catch(e){console.error(`HTML injection error:`,e)}},[a,s]),n.useEffect(()=>()=>{l.current.forEach(e=>{e.parentNode&&e.parentNode.removeChild(e)})},[]);let d=n.useMemo(()=>{if(!a)return``;if(o){let e=document.createElement(`div`);e.innerHTML=a,e.querySelectorAll(`script`).forEach(e=>e.remove());let t=[`onclick`,`onload`,`onerror`,`onmouseover`];return e.querySelectorAll(`*`).forEach(e=>{t.forEach(t=>{e.hasAttribute(t)&&e.removeAttribute(t)})}),e.innerHTML}return a},[a,o]);return a?(0,i.jsx)(`div`,{ref:u,className:t.r(r),dangerouslySetInnerHTML:{__html:d},...c}):null}function l({breakpoint:t,as:r=`div`,fallback:a=n.Fragment,className:o,classNameFallback:s,...c}){let l=e.T(t.split(`-`).pop())===t.startsWith(`max`),u=l?a:r,d=l?s:o;return u===n.Fragment?(0,i.jsx)(u,{ref:c.ref,children:c.children},c.key):(0,i.jsx)(u,{className:d,...c})}function u({children:e,container:t}){let r=(0,n.useRef)(null),[i,a]=(0,n.useState)(!1);return(0,n.useLayoutEffect)(()=>{t?r.current=typeof t==`string`?document.querySelector(t):t.current:r.current=document.body,a(!0)},[]),!i||!r.current?null:(0,o.createPortal)(e,r.current)}const d=[`bottom-left`,`bottom-right`,`top-right`,`top-left`],f=({side:t,offset:r=2,unit:a=`rem`})=>{let[o,s]=n.useState(t??`bottom-left`),c=e.T({DEFAULT:`xs`,sm:`sm`,md:`md`,lg:`lg`,xl:`xl`,"2xl":`2xl`}),[l,u]=n.useState(typeof window<`u`?window.innerWidth:0);n.useEffect(()=>{if(typeof window>`u`)return;let e=()=>u(window.innerWidth);return window.addEventListener(`resize`,e),()=>window.removeEventListener(`resize`,e)},[]);let f=c===`2xl`&&l>=1792?a===`rem`?`${(l/16).toFixed(1)}rem`:`${l}${a}`:c,p={"bottom-left":{bottom:`${r}${a}`,left:`${r}${a}`},"bottom-right":{bottom:`${r}${a}`,right:`${r}${a}`},"top-right":{top:`${r}${a}`,right:`${r}${a}`},"top-left":{top:`${r}${a}`,left:`${r}${a}`}};return(0,i.jsx)(`button`,{type:`button`,onClick:()=>{s(d[(d.indexOf(o)+1)%d.length])},style:{position:`fixed`,zIndex:50,display:`grid`,height:`2.5rem`,minWidth:`2.5rem`,borderRadius:`30px`,placeContent:`center`,backgroundColor:`#2d3748`,fontFamily:`Courier New, Courier, monospace`,fontSize:`1rem`,color:`#ffffff`,border:`2px solid #4a5568`,boxShadow:`0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)`,padding:`0.5rem`,transition:`all 0.2s ease-in-out`,...p[o]},children:f})};function p(){return e.k(()=>{let e=document.body;if(!e)return;let t=e=>{let t=getComputedStyle(e);if(t.overflow===`hidden`&&t.overflowY===`hidden`&&t.overflowX===`hidden`)return!1;let n=(t.overflowY===`auto`||t.overflowY===`scroll`)&&e.scrollHeight>e.clientHeight,r=(t.overflowX===`auto`||t.overflowX===`scroll`)&&e.scrollWidth>e.clientWidth;return n||r},n=e=>{t(e)?e.dataset.scrollable=`true`:delete e.dataset.scrollable},r=e=>{n(e);for(let t=0;t<e.children.length;t++){let n=e.children[t];r(n)}};`requestIdleCallback`in window?window.requestIdleCallback(()=>r(e)):setTimeout(()=>r(e),0);let i=new MutationObserver(e=>{for(let t of e)t.type===`childList`?t.addedNodes.forEach(e=>{e instanceof HTMLElement&&r(e)}):t.type===`attributes`&&t.target instanceof HTMLElement&&n(t.target)});return i.observe(e,{subtree:!0,childList:!0,attributes:!0,attributeFilter:[`style`,`class`]}),()=>i.disconnect()},[]),null}function m({delay:e=0,fallback:t=null,children:r}){let[a,o]=(0,n.useState)(e===0?`mounted`:`pending`),s=(0,n.useRef)(null);return(0,n.useEffect)(()=>{if(e!==0)return s.current=setTimeout(()=>o(`mounted`),e),()=>{s.current&&clearTimeout(s.current)}},[e]),a===`pending`?(0,i.jsx)(i.Fragment,{children:t}):(0,i.jsx)(i.Fragment,{children:r})}exports.HtmlInjector=c,Object.defineProperty(exports,`Iconify`,{enumerable:!0,get:function(){return a.Icon}}),exports.MediaWrapper=l,exports.MountAfter=m,exports.Portal=u,exports.ResponsiveIndicator=f,exports.TailwindIndicator=f,exports.ScrollTracker=e.C,exports.ScrollableMarker=p,exports.WithClosest=s;
|
|
@@ -186,7 +186,7 @@ declare function MediaWrapper({
|
|
|
186
186
|
*/
|
|
187
187
|
interface PortalProps {
|
|
188
188
|
children: React.ReactNode;
|
|
189
|
-
container
|
|
189
|
+
container?: `#${string}` | `.${string}` | `[${string}]` | React.RefObject<HTMLElement>;
|
|
190
190
|
}
|
|
191
191
|
declare function Portal({
|
|
192
192
|
children,
|
|
@@ -277,4 +277,52 @@ declare const ScrollTracker: ({
|
|
|
277
277
|
*/
|
|
278
278
|
declare function ScrollableMarker(): null;
|
|
279
279
|
//#endregion
|
|
280
|
-
|
|
280
|
+
//#region src/components/mount-after.d.ts
|
|
281
|
+
/**
|
|
282
|
+
* Props for the <MountAfter> component.
|
|
283
|
+
*/
|
|
284
|
+
interface MountAfterProps {
|
|
285
|
+
/**
|
|
286
|
+
* Delay in milliseconds before mounting children.
|
|
287
|
+
* @default 0
|
|
288
|
+
*/
|
|
289
|
+
delay?: number;
|
|
290
|
+
/**
|
|
291
|
+
* Content shown while in pending (pre-mount) state.
|
|
292
|
+
* @default null
|
|
293
|
+
*/
|
|
294
|
+
fallback?: React.ReactNode;
|
|
295
|
+
/** Content rendered after delay elapses. */
|
|
296
|
+
children: React.ReactNode;
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Delays rendering of children by a configurable timeout.
|
|
300
|
+
*
|
|
301
|
+
* Useful for preventing content flash, coordinating staggered
|
|
302
|
+
* animations, or deferring render-heavy trees until after
|
|
303
|
+
* the initial paint. When `delay` is 0 (default), children
|
|
304
|
+
* mount immediately with no pending state.
|
|
305
|
+
*
|
|
306
|
+
* @param props - The component props
|
|
307
|
+
* @returns The fallback during the pending state, then children once mounted
|
|
308
|
+
*
|
|
309
|
+
* @example
|
|
310
|
+
* ```tsx
|
|
311
|
+
* // Mount immediately (no delay)
|
|
312
|
+
* <MountAfter>
|
|
313
|
+
* <ExpensiveComponent />
|
|
314
|
+
* </MountAfter>
|
|
315
|
+
*
|
|
316
|
+
* // Mount after 500ms with a loading indicator
|
|
317
|
+
* <MountAfter delay={500} fallback={<Spinner />}>
|
|
318
|
+
* <ExpensiveComponent />
|
|
319
|
+
* </MountAfter>
|
|
320
|
+
* ```
|
|
321
|
+
*/
|
|
322
|
+
declare function MountAfter({
|
|
323
|
+
delay,
|
|
324
|
+
fallback,
|
|
325
|
+
children
|
|
326
|
+
}: MountAfterProps): react_jsx_runtime0.JSX.Element;
|
|
327
|
+
//#endregion
|
|
328
|
+
export { HtmlInjector, Iconify, MediaWrapper, MountAfter, Portal, ResponsiveIndicator, ResponsiveIndicator as TailwindIndicator, ScrollTracker, ScrollableMarker, WithClosest };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as React$1 from "react";
|
|
2
|
-
import * as
|
|
2
|
+
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
3
3
|
import { Icon as Iconify } from "@iconify/react";
|
|
4
4
|
|
|
5
5
|
//#region src/components/closest.d.ts
|
|
@@ -47,7 +47,7 @@ type WithClosestProps = {
|
|
|
47
47
|
declare function WithClosest({
|
|
48
48
|
selector,
|
|
49
49
|
children
|
|
50
|
-
}: WithClosestProps):
|
|
50
|
+
}: WithClosestProps): react_jsx_runtime0.JSX.Element;
|
|
51
51
|
//#endregion
|
|
52
52
|
//#region src/components/html-injector.d.ts
|
|
53
53
|
/**
|
|
@@ -103,7 +103,7 @@ declare function HtmlInjector({
|
|
|
103
103
|
sanitize,
|
|
104
104
|
executeScripts,
|
|
105
105
|
...props
|
|
106
|
-
}: HtmlInjectorProps):
|
|
106
|
+
}: HtmlInjectorProps): react_jsx_runtime0.JSX.Element | null;
|
|
107
107
|
//#endregion
|
|
108
108
|
//#region src/components/media-wrapper.d.ts
|
|
109
109
|
/**
|
|
@@ -152,7 +152,7 @@ declare function MediaWrapper({
|
|
|
152
152
|
className: classNameOriginal,
|
|
153
153
|
classNameFallback,
|
|
154
154
|
...props
|
|
155
|
-
}: MediaWrapperProps):
|
|
155
|
+
}: MediaWrapperProps): react_jsx_runtime0.JSX.Element;
|
|
156
156
|
//#endregion
|
|
157
157
|
//#region src/components/portal.d.ts
|
|
158
158
|
/**
|
|
@@ -186,7 +186,7 @@ declare function MediaWrapper({
|
|
|
186
186
|
*/
|
|
187
187
|
interface PortalProps {
|
|
188
188
|
children: React.ReactNode;
|
|
189
|
-
container
|
|
189
|
+
container?: `#${string}` | `.${string}` | `[${string}]` | React.RefObject<HTMLElement>;
|
|
190
190
|
}
|
|
191
191
|
declare function Portal({
|
|
192
192
|
children,
|
|
@@ -252,7 +252,7 @@ interface ScrollTrackerProps {
|
|
|
252
252
|
*/
|
|
253
253
|
declare const ScrollTracker: ({
|
|
254
254
|
children
|
|
255
|
-
}: ScrollTrackerProps) =>
|
|
255
|
+
}: ScrollTrackerProps) => react_jsx_runtime0.JSX.Element;
|
|
256
256
|
//#endregion
|
|
257
257
|
//#region src/components/scrollable-marker.d.ts
|
|
258
258
|
/**
|
|
@@ -277,4 +277,52 @@ declare const ScrollTracker: ({
|
|
|
277
277
|
*/
|
|
278
278
|
declare function ScrollableMarker(): null;
|
|
279
279
|
//#endregion
|
|
280
|
-
|
|
280
|
+
//#region src/components/mount-after.d.ts
|
|
281
|
+
/**
|
|
282
|
+
* Props for the <MountAfter> component.
|
|
283
|
+
*/
|
|
284
|
+
interface MountAfterProps {
|
|
285
|
+
/**
|
|
286
|
+
* Delay in milliseconds before mounting children.
|
|
287
|
+
* @default 0
|
|
288
|
+
*/
|
|
289
|
+
delay?: number;
|
|
290
|
+
/**
|
|
291
|
+
* Content shown while in pending (pre-mount) state.
|
|
292
|
+
* @default null
|
|
293
|
+
*/
|
|
294
|
+
fallback?: React.ReactNode;
|
|
295
|
+
/** Content rendered after delay elapses. */
|
|
296
|
+
children: React.ReactNode;
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Delays rendering of children by a configurable timeout.
|
|
300
|
+
*
|
|
301
|
+
* Useful for preventing content flash, coordinating staggered
|
|
302
|
+
* animations, or deferring render-heavy trees until after
|
|
303
|
+
* the initial paint. When `delay` is 0 (default), children
|
|
304
|
+
* mount immediately with no pending state.
|
|
305
|
+
*
|
|
306
|
+
* @param props - The component props
|
|
307
|
+
* @returns The fallback during the pending state, then children once mounted
|
|
308
|
+
*
|
|
309
|
+
* @example
|
|
310
|
+
* ```tsx
|
|
311
|
+
* // Mount immediately (no delay)
|
|
312
|
+
* <MountAfter>
|
|
313
|
+
* <ExpensiveComponent />
|
|
314
|
+
* </MountAfter>
|
|
315
|
+
*
|
|
316
|
+
* // Mount after 500ms with a loading indicator
|
|
317
|
+
* <MountAfter delay={500} fallback={<Spinner />}>
|
|
318
|
+
* <ExpensiveComponent />
|
|
319
|
+
* </MountAfter>
|
|
320
|
+
* ```
|
|
321
|
+
*/
|
|
322
|
+
declare function MountAfter({
|
|
323
|
+
delay,
|
|
324
|
+
fallback,
|
|
325
|
+
children
|
|
326
|
+
}: MountAfterProps): react_jsx_runtime0.JSX.Element;
|
|
327
|
+
//#endregion
|
|
328
|
+
export { HtmlInjector, Iconify, MediaWrapper, MountAfter, Portal, ResponsiveIndicator, ResponsiveIndicator as TailwindIndicator, ScrollTracker, ScrollableMarker, WithClosest };
|
package/dist/components/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use client";import{r as e}from"../functions-CTMT4m8K.js";import{C as t,T as n,k as r}from"../hooks-CCFEDyEO.js";import*as i from"react";import{
|
|
1
|
+
"use client";import{r as e}from"../functions-CTMT4m8K.js";import{C as t,T as n,k as r}from"../hooks-CCFEDyEO.js";import*as i from"react";import{useEffect as a,useLayoutEffect as o,useRef as s,useState as c}from"react";import{Slot as l}from"@radix-ui/react-slot";import{Fragment as u,jsx as d}from"react/jsx-runtime";import{Icon as f}from"@iconify/react";import{createPortal as p}from"react-dom";function m({selector:e,children:t}){let n=s(null),[r,i]=c(!1),[a,u]=c({hasClosest:!1,closestElement:null});return o(()=>{if(n.current){let t=n.current.closest(e);u({hasClosest:t!==null,closestElement:t})}i(!0)},[e]),r?d(l,{ref:n,children:t(a)}):d(`span`,{ref:n})}function h({className:t,html:n,sanitize:a=!1,executeScripts:o=!0,...s}){let c=i.useRef([]),l=i.useRef(null);r(()=>{if(c.current.forEach(e=>{e.parentNode&&e.parentNode.removeChild(e)}),c.current=[],!(!o||!n))try{let e=document.createElement(`div`);e.innerHTML=n,e.querySelectorAll(`script`).forEach(e=>{let t=document.createElement(`script`);e.textContent&&(t.textContent=e.textContent),Array.from(e.attributes).forEach(e=>{t.setAttribute(e.name,e.value)}),t.onerror=e=>{console.error(`Script injection error:`,e)},document.body.appendChild(t),c.current.push(t)})}catch(e){console.error(`HTML injection error:`,e)}},[n,o]),i.useEffect(()=>()=>{c.current.forEach(e=>{e.parentNode&&e.parentNode.removeChild(e)})},[]);let u=i.useMemo(()=>{if(!n)return``;if(a){let e=document.createElement(`div`);e.innerHTML=n,e.querySelectorAll(`script`).forEach(e=>e.remove());let t=[`onclick`,`onload`,`onerror`,`onmouseover`];return e.querySelectorAll(`*`).forEach(e=>{t.forEach(t=>{e.hasAttribute(t)&&e.removeAttribute(t)})}),e.innerHTML}return n},[n,a]);return n?d(`div`,{ref:l,className:e(t),dangerouslySetInnerHTML:{__html:u},...s}):null}function g({breakpoint:e,as:t=`div`,fallback:r=i.Fragment,className:a,classNameFallback:o,...s}){let c=n(e.split(`-`).pop())===e.startsWith(`max`),l=c?r:t,u=c?o:a;return l===i.Fragment?d(l,{ref:s.ref,children:s.children},s.key):d(l,{className:u,...s})}function _({children:e,container:t}){let n=s(null),[r,i]=c(!1);return o(()=>{t?n.current=typeof t==`string`?document.querySelector(t):t.current:n.current=document.body,i(!0)},[]),!r||!n.current?null:p(e,n.current)}const v=[`bottom-left`,`bottom-right`,`top-right`,`top-left`],y=({side:e,offset:t=2,unit:r=`rem`})=>{let[a,o]=i.useState(e??`bottom-left`),s=n({DEFAULT:`xs`,sm:`sm`,md:`md`,lg:`lg`,xl:`xl`,"2xl":`2xl`}),[c,l]=i.useState(typeof window<`u`?window.innerWidth:0);i.useEffect(()=>{if(typeof window>`u`)return;let e=()=>l(window.innerWidth);return window.addEventListener(`resize`,e),()=>window.removeEventListener(`resize`,e)},[]);let u=s===`2xl`&&c>=1792?r===`rem`?`${(c/16).toFixed(1)}rem`:`${c}${r}`:s;return d(`button`,{type:`button`,onClick:()=>{o(v[(v.indexOf(a)+1)%v.length])},style:{position:`fixed`,zIndex:50,display:`grid`,height:`2.5rem`,minWidth:`2.5rem`,borderRadius:`30px`,placeContent:`center`,backgroundColor:`#2d3748`,fontFamily:`Courier New, Courier, monospace`,fontSize:`1rem`,color:`#ffffff`,border:`2px solid #4a5568`,boxShadow:`0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)`,padding:`0.5rem`,transition:`all 0.2s ease-in-out`,...{"bottom-left":{bottom:`${t}${r}`,left:`${t}${r}`},"bottom-right":{bottom:`${t}${r}`,right:`${t}${r}`},"top-right":{top:`${t}${r}`,right:`${t}${r}`},"top-left":{top:`${t}${r}`,left:`${t}${r}`}}[a]},children:u})};function b(){return r(()=>{let e=document.body;if(!e)return;let t=e=>{let t=getComputedStyle(e);if(t.overflow===`hidden`&&t.overflowY===`hidden`&&t.overflowX===`hidden`)return!1;let n=(t.overflowY===`auto`||t.overflowY===`scroll`)&&e.scrollHeight>e.clientHeight,r=(t.overflowX===`auto`||t.overflowX===`scroll`)&&e.scrollWidth>e.clientWidth;return n||r},n=e=>{t(e)?e.dataset.scrollable=`true`:delete e.dataset.scrollable},r=e=>{n(e);for(let t=0;t<e.children.length;t++){let n=e.children[t];r(n)}};`requestIdleCallback`in window?window.requestIdleCallback(()=>r(e)):setTimeout(()=>r(e),0);let i=new MutationObserver(e=>{for(let t of e)t.type===`childList`?t.addedNodes.forEach(e=>{e instanceof HTMLElement&&r(e)}):t.type===`attributes`&&t.target instanceof HTMLElement&&n(t.target)});return i.observe(e,{subtree:!0,childList:!0,attributes:!0,attributeFilter:[`style`,`class`]}),()=>i.disconnect()},[]),null}function x({delay:e=0,fallback:t=null,children:n}){let[r,i]=c(e===0?`mounted`:`pending`),o=s(null);return a(()=>{if(e!==0)return o.current=setTimeout(()=>i(`mounted`),e),()=>{o.current&&clearTimeout(o.current)}},[e]),r===`pending`?d(u,{children:t}):d(u,{children:n})}export{h as HtmlInjector,f as Iconify,g as MediaWrapper,x as MountAfter,_ as Portal,y as ResponsiveIndicator,y as TailwindIndicator,t as ScrollTracker,b as ScrollableMarker,m as WithClosest};
|