@sohanemon/utils 7.3.2 → 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 +49 -1
- package/dist/components/index.d.ts +49 -1
- 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)(()=>{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}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;
|
|
@@ -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 };
|
|
@@ -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};
|