@cyber-harbour/ui 2.2.43 → 3.0.0-fix-button-focus-visible.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/README.md +115 -205
- package/bin/switch-ui-lib.js +218 -106
- package/dist/Icons/index.d.mts +468 -0
- package/dist/Icons/index.d.ts +468 -0
- package/dist/Icons/index.js +2 -0
- package/dist/Icons/index.js.map +1 -0
- package/dist/Icons/index.mjs +2 -0
- package/dist/Icons/index.mjs.map +1 -0
- package/dist/PdfDriver-IRXY5HVF.js +2 -0
- package/dist/PdfDriver-IRXY5HVF.js.map +1 -0
- package/dist/PdfDriver-XCFXTEEH.mjs +2 -0
- package/dist/PdfDriver-XCFXTEEH.mjs.map +1 -0
- package/dist/chunk-47BJH42B.mjs +2 -0
- package/dist/chunk-47BJH42B.mjs.map +1 -0
- package/dist/chunk-47O3IYW3.js +3 -0
- package/dist/chunk-47O3IYW3.js.map +1 -0
- package/dist/chunk-4O4WHXDT.mjs +3 -0
- package/dist/chunk-4O4WHXDT.mjs.map +1 -0
- package/dist/chunk-7F6XMY63.mjs +3 -0
- package/dist/chunk-7F6XMY63.mjs.map +1 -0
- package/dist/chunk-7LHQWEWV.mjs +2 -0
- package/dist/chunk-7LHQWEWV.mjs.map +1 -0
- package/dist/chunk-AYDF3IFZ.js +2 -0
- package/dist/chunk-AYDF3IFZ.js.map +1 -0
- package/dist/chunk-HFG4KP6L.js +2 -0
- package/dist/chunk-HFG4KP6L.js.map +1 -0
- package/dist/chunk-JVDLOXO7.js +2 -0
- package/dist/chunk-JVDLOXO7.js.map +1 -0
- package/dist/chunk-NQZUCXJV.js +2 -0
- package/dist/chunk-NQZUCXJV.js.map +1 -0
- package/dist/chunk-QWPVIX2T.mjs +2 -0
- package/dist/chunk-QWPVIX2T.mjs.map +1 -0
- package/dist/chunk-S3RLHUDJ.js +3 -0
- package/dist/chunk-S3RLHUDJ.js.map +1 -0
- package/dist/chunk-XP4PPF7V.mjs +2 -0
- package/dist/chunk-XP4PPF7V.mjs.map +1 -0
- package/dist/index.d.mts +1646 -1871
- package/dist/index.d.ts +1646 -1871
- package/dist/index.js +8 -1690
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +8 -1690
- package/dist/index.mjs.map +1 -1
- package/dist/styles/design-tokens.css +839 -0
- package/dist/styles/legacy-token-aliases.css +26 -0
- package/dist/styles/tailwind.css +477 -3
- package/dist/utils/index.d.mts +7 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/index.js +2 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/index.mjs +2 -0
- package/dist/utils/index.mjs.map +1 -0
- package/dist/utils-jfCLo6l4.d.mts +26 -0
- package/dist/utils-jfCLo6l4.d.ts +26 -0
- package/package.json +65 -53
- package/dist/PdfDriver-54FN6DBI.js +0 -2
- package/dist/PdfDriver-54FN6DBI.js.map +0 -1
- package/dist/PdfDriver-AVC3OSKE.mjs +0 -2
- package/dist/PdfDriver-AVC3OSKE.mjs.map +0 -1
- package/dist/chunk-EGCG27KL.mjs +0 -3
- package/dist/chunk-EGCG27KL.mjs.map +0 -1
- package/dist/chunk-WRBRJBUL.js +0 -3
- package/dist/chunk-WRBRJBUL.js.map +0 -1
- package/dist/index.css +0 -3
- package/dist/index.css.map +0 -1
- package/dist/styles/tailwind.css.map +0 -1
- package/dist/styles/tailwind.d.mts +0 -2
- package/dist/styles/tailwind.d.ts +0 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/cn.ts"],"names":["cn","inputs","twMerge","clsx","__name"],"mappings":"yGAGO,SAASA,CAAAA,CAAAA,GAAMC,EAAsB,CAC1C,OAAOC,QAAQC,IAAAA,CAAKF,CAAM,CAAC,CAC7B,CAFgBG,IAAAJ,CAAAA,CAAA,IAAA,CAAA","file":"chunk-7LHQWEWV.mjs","sourcesContent":["import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-AYDF3IFZ.js"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';var chunkAYDF3IFZ_js=require('./chunk-AYDF3IFZ.js'),react=require('react');var C=chunkAYDF3IFZ_js.a(async e=>{let t=[],r=chunkAYDF3IFZ_js.a(async o=>{if(o.isFile){let c=await new Promise((i,h)=>{o.file(i,h);});c.folder_path=o.fullPath.split("/").slice(0,-1).join("/"),t.push(c);}else if(o.isDirectory){let c=o.createReader(),i=chunkAYDF3IFZ_js.a(async()=>{let h=await new Promise((w,b)=>{c.readEntries(w,b);});h.length!==0&&(await Promise.all(h.map(w=>r(w))),await i());},"readEntries");await i();}},"readEntry");return await Promise.all(Array.from(e).map(async o=>{let c=o.webkitGetAsEntry();c&&await r(c);})),t},"getFilesFromDataTransfer"),u=0,d=null,p=new Set,y=new Map,L=chunkAYDF3IFZ_js.a(e=>{if(y.has(e))return;let t=e.offsetWidth-e.clientWidth,r=window.getComputedStyle(e);y.set(e,{overflow:e.style.overflow,paddingRight:e.style.paddingRight}),e.style.overflow="hidden",t>0&&(e.style.paddingRight=`${parseInt(r.paddingRight)+t}px`);},"lockTarget"),k=chunkAYDF3IFZ_js.a(e=>{let t=y.get(e);t&&(e.style.overflow=t.overflow,e.style.paddingRight=t.paddingRight,y.delete(e));},"unlockTarget"),I=chunkAYDF3IFZ_js.a(e=>{react.useEffect(()=>{if(!(!e||typeof window>"u")){if(u===0){let t=window.getComputedStyle(document.body),r=window.innerWidth-document.documentElement.clientWidth;d={overflow:t.overflow,paddingRight:t.paddingRight},document.body.style.overflow="hidden",document.body.style.paddingRight=`${parseInt(d.paddingRight)+r}px`,p.forEach(L);}return u++,()=>{u--,u===0&&d&&(document.body.style.overflow=d.overflow,document.body.style.paddingRight=d.paddingRight,d=null,p.forEach(k));}}},[e]);},"useBodyScrollLock"),B=chunkAYDF3IFZ_js.a(e=>{react.useEffect(()=>{let t=e.current;if(t)return p.add(t),u>0&&L(t),()=>{p.delete(t),k(t);}},[e]);},"useScrollLockTarget"),l=[],m=chunkAYDF3IFZ_js.a(e=>{let r=l[l.length-1]?.current??null,o=e.target;r&&o&&r.contains(o)||o&&o.closest?.("[data-scroll-allow]")||e.preventDefault();},"onGuardedScroll"),O=chunkAYDF3IFZ_js.a(()=>{document.addEventListener("wheel",m,{passive:false,capture:true}),document.addEventListener("touchmove",m,{passive:false,capture:true});},"attachScrollGuard"),F=chunkAYDF3IFZ_js.a(()=>{document.removeEventListener("wheel",m,true),document.removeEventListener("touchmove",m,true);},"detachScrollGuard"),_=chunkAYDF3IFZ_js.a(e=>{react.useEffect(()=>{if(!(typeof window>"u"))return l.push(e),l.length===1&&O(),()=>{let t=l.lastIndexOf(e);t>=0&&l.splice(t,1),l.length===0&&F();}},[e]);},"useScrollGuard"),s=[],g=false;function R(e){if(e.key==="Escape"&&s.length>0){let t=s[s.length-1];try{t.handler();}catch(r){console.error("useEscapeLayer handler error:",r);}}}chunkAYDF3IFZ_js.a(R,"handleGlobalEscape");function T(){g||(document.addEventListener("keydown",R),g=true);}chunkAYDF3IFZ_js.a(T,"attachEscapeListener");function x(){g&&s.length===0&&(document.removeEventListener("keydown",R),g=false);}chunkAYDF3IFZ_js.a(x,"detachEscapeListener");function P(){for(;s.length>0&&s[s.length-1].autoDismiss;){let e=s.pop();try{e.handler();}catch(t){console.error("useEscapeLayer autoDismiss error:",t);}}}chunkAYDF3IFZ_js.a(P,"dismissAutoDismissLayers");var A=chunkAYDF3IFZ_js.a((e,t=true,r=false)=>{let o=react.useRef(e);o.current=e,react.useEffect(()=>{if(!t)return;r||P();let c={handler:chunkAYDF3IFZ_js.a(()=>o.current(),"handler"),autoDismiss:r};return s.push(c),T(),()=>{let i=s.indexOf(c);i!==-1&&s.splice(i,1),x();}},[t,r]);},"useEscapeLayer"),a=[],E=false,W=[".cb-ui-context-menu",".cb-ui-backdrop"];function S(e){if(a.length===0)return;let t=e.target;if(!t)return;for(let o of W)if(t.closest(o))return;let r=a[a.length-1];if(r.ref.current&&!r.ref.current.contains(t))try{r.handler();}catch(o){console.error("useOutclickLayer handler error:",o);}}chunkAYDF3IFZ_js.a(S,"handleGlobalOutclick");function G(){E||(document.addEventListener("mousedown",S),E=true);}chunkAYDF3IFZ_js.a(G,"attachOutclickListener");function M(){E&&a.length===0&&(document.removeEventListener("mousedown",S),E=false);}chunkAYDF3IFZ_js.a(M,"detachOutclickListener");var K=chunkAYDF3IFZ_js.a((e,t,r=true)=>{let o=react.useRef(t);o.current=t,react.useEffect(()=>{if(!r)return;let c={ref:e,handler:chunkAYDF3IFZ_js.a(()=>o.current(),"handler")};return a.push(c),G(),()=>{let i=a.indexOf(c);i!==-1&&a.splice(i,1),M();}},[r,e]);},"useOutclickLayer");exports.a=C;exports.b=I;exports.c=B;exports.d=_;exports.e=A;exports.f=K;//# sourceMappingURL=chunk-HFG4KP6L.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-HFG4KP6L.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils.ts"],"names":["getFilesFromDataTransfer","__name","dataTransferItems","files","readEntry","entry","file","resolve","reject","reader","readEntries","entries","e","item","scrollLockCount","savedBodyStyles","scrollLockTargets","savedTargetStyles","lockTarget","el","scrollBarWidth","computed","unlockTarget","saved","useBodyScrollLock","isLocked","useEffect","originalStyle","useScrollLockTarget","ref","scrollGuardStack","onGuardedScroll","panel","target","attachScrollGuard","detachScrollGuard","useScrollGuard","panelRef","i","escapeStack","isEscapeListenerAttached","handleGlobalEscape","top","error","attachEscapeListener","detachEscapeListener","dismissAutoDismissLayers","useEscapeLayer","onEscape","isActive","autoDismiss","callbackRef","useRef","idx","outclickStack","isOutclickListenerAttached","OUTCLICK_IGNORE_SELECTORS","handleGlobalOutclick","selector","attachOutclickListener","detachOutclickListener","useOutclickLayer","onOutclick"],"mappings":"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","file":"chunk-HFG4KP6L.js","sourcesContent":["import React, { useEffect, useRef } from 'react';\n\nexport type FileWithFolderPath = File & { folder_path?: string };\n\nexport const getFilesFromDataTransfer = async (\n dataTransferItems: DataTransferItemList\n): Promise<FileWithFolderPath[]> => {\n const files: FileWithFolderPath[] = [];\n\n const readEntry = async (entry: FileSystemEntry): Promise<void> => {\n if (entry.isFile) {\n const file = await new Promise<FileWithFolderPath>((resolve, reject) => {\n (entry as FileSystemFileEntry).file(resolve, reject);\n });\n file.folder_path = entry.fullPath.split('/').slice(0, -1).join('/');\n files.push(file);\n } else if (entry.isDirectory) {\n const reader = (entry as FileSystemDirectoryEntry).createReader();\n const readEntries = async (): Promise<void> => {\n const entries = await new Promise<FileSystemEntry[]>((resolve, reject) => {\n reader.readEntries(resolve, reject);\n });\n if (entries.length === 0) return;\n await Promise.all(entries.map((e) => readEntry(e)));\n await readEntries();\n };\n await readEntries();\n }\n };\n\n await Promise.all(\n Array.from(dataTransferItems).map(async (item) => {\n const entry = item.webkitGetAsEntry();\n if (entry) await readEntry(entry);\n })\n );\n return files;\n};\n\n/**\n * Hook для блокування скролу body та збереження позиції контенту.\n * Використовує лічильник — скрол блокується при першому виклику\n * і розблоковується лише коли всі блокування зняті.\n *\n * Сторінки можуть мати власний внутрішній скрол-контейнер (наприклад,\n * колонка SplitterLayout з overflow-y-auto, коли body має h-dvh\n * overflow-hidden). У такому разі блокування body неефективне — реальний\n * скрол відбувається всередині. Зареєструвати такий контейнер можна через\n * useScrollLockTarget(ref): його overflow тимчасово стане 'hidden' на час\n * активного блокування і відновиться після зняття.\n */\nlet scrollLockCount = 0;\nlet savedBodyStyles: { overflow: string; paddingRight: string } | null = null;\n\nconst scrollLockTargets = new Set<HTMLElement>();\nconst savedTargetStyles = new Map<HTMLElement, { overflow: string; paddingRight: string }>();\n\nconst lockTarget = (el: HTMLElement) => {\n if (savedTargetStyles.has(el)) return;\n // Компенсуємо ширину вертикального скролбара контейнера, щоб контент\n // не стрибав горизонтально при overflow: hidden.\n const scrollBarWidth = el.offsetWidth - el.clientWidth;\n const computed = window.getComputedStyle(el);\n savedTargetStyles.set(el, {\n overflow: el.style.overflow,\n paddingRight: el.style.paddingRight,\n });\n el.style.overflow = 'hidden';\n if (scrollBarWidth > 0) {\n el.style.paddingRight = `${parseInt(computed.paddingRight) + scrollBarWidth}px`;\n }\n};\n\nconst unlockTarget = (el: HTMLElement) => {\n const saved = savedTargetStyles.get(el);\n if (!saved) return;\n el.style.overflow = saved.overflow;\n el.style.paddingRight = saved.paddingRight;\n savedTargetStyles.delete(el);\n};\n\nexport const useBodyScrollLock = (isLocked: boolean) => {\n useEffect(() => {\n if (!isLocked || typeof window === 'undefined') return;\n\n if (scrollLockCount === 0) {\n const originalStyle = window.getComputedStyle(document.body);\n const scrollBarWidth = window.innerWidth - document.documentElement.clientWidth;\n savedBodyStyles = {\n overflow: originalStyle.overflow,\n paddingRight: originalStyle.paddingRight,\n };\n document.body.style.overflow = 'hidden';\n document.body.style.paddingRight = `${parseInt(savedBodyStyles.paddingRight) + scrollBarWidth}px`;\n scrollLockTargets.forEach(lockTarget);\n }\n scrollLockCount++;\n\n return () => {\n scrollLockCount--;\n if (scrollLockCount === 0 && savedBodyStyles) {\n document.body.style.overflow = savedBodyStyles.overflow;\n document.body.style.paddingRight = savedBodyStyles.paddingRight;\n savedBodyStyles = null;\n scrollLockTargets.forEach(unlockTarget);\n }\n };\n }, [isLocked]);\n};\n\n/**\n * Реєструє додатковий scroll-контейнер, який треба блокувати разом із body\n * на час дії useBodyScrollLock. Якщо лок уже активний на момент монтування —\n * контейнер блокується одразу.\n */\nexport const useScrollLockTarget = (ref: React.RefObject<HTMLElement | null>) => {\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n scrollLockTargets.add(el);\n if (scrollLockCount > 0) lockTarget(el);\n return () => {\n scrollLockTargets.delete(el);\n unlockTarget(el);\n };\n }, [ref]);\n};\n\n/**\n * Подієвий («scoped») guard скролу для модальних оверлеїв.\n *\n * useBodyScrollLock виставляє overflow:hidden лише на body. Якщо реальний\n * скрол-контейнер сторінки — не body, а вкладений div (наприклад\n * `.datagrid-body-scroll` у DataGrid), фон під оверлеєм лишається\n * прокручуваним, а чи «протікає» wheel у нього — залежить від scroll-chaining,\n * який різниться між браузерами/платформами (звідси «не блокує в Chrome на\n * Ubuntu»).\n *\n * Guard перехоплює wheel/touchmove у capture-фазі та скасовує default для\n * будь-якої події ПОЗА активною панеллю — незалежно від того, який саме\n * контейнер під нею. Скрол УСЕРЕДИНІ панелі (включно з вкладеними скролерами\n * та гридами в самому дровері/модалці) працює природно.\n *\n * Стек панелей дає коректну семантику для вкладених оверлеїв: активна лише\n * верхня панель, тож скрол у модалці поверх дровера дозволено, а у дровері\n * під нею — заблоковано.\n *\n * Escape-hatch: елемент із атрибутом `data-scroll-allow` (та його нащадки)\n * скролиться навіть поза панеллю — для рідкісних випадків портованих\n * скрол-контейнерів, що рендеряться в body повз піддерево панелі.\n */\nconst scrollGuardStack: React.RefObject<HTMLElement | null>[] = [];\n\nconst onGuardedScroll = (e: Event) => {\n const top = scrollGuardStack[scrollGuardStack.length - 1];\n const panel = top?.current ?? null;\n const target = e.target as Element | null;\n if (panel && target && panel.contains(target)) return;\n if (target && target.closest?.('[data-scroll-allow]')) return;\n e.preventDefault();\n};\n\nconst attachScrollGuard = () => {\n document.addEventListener('wheel', onGuardedScroll, { passive: false, capture: true });\n document.addEventListener('touchmove', onGuardedScroll, { passive: false, capture: true });\n};\n\nconst detachScrollGuard = () => {\n document.removeEventListener('wheel', onGuardedScroll, true);\n document.removeEventListener('touchmove', onGuardedScroll, true);\n};\n\nexport const useScrollGuard = (panelRef: React.RefObject<HTMLElement | null>) => {\n useEffect(() => {\n if (typeof window === 'undefined') return;\n scrollGuardStack.push(panelRef);\n if (scrollGuardStack.length === 1) attachScrollGuard();\n return () => {\n const i = scrollGuardStack.lastIndexOf(panelRef);\n if (i >= 0) scrollGuardStack.splice(i, 1);\n if (scrollGuardStack.length === 0) detachScrollGuard();\n };\n }, [panelRef]);\n};\n\n/**\n * Глобальний стек для управління Escape шарами.\n * При натисканні Escape викликається тільки останній (найвищий) callback.\n *\n * autoDismiss шари (Select) автоматично закриваються\n * коли над ними реєструється новий шар.\n */\ntype EscapeStackEntry = {\n handler: () => void;\n autoDismiss: boolean;\n};\n\nconst escapeStack: EscapeStackEntry[] = [];\nlet isEscapeListenerAttached = false;\n\nfunction handleGlobalEscape(e: KeyboardEvent) {\n if (e.key === 'Escape' && escapeStack.length > 0) {\n const top = escapeStack[escapeStack.length - 1];\n try {\n top.handler();\n } catch (error) {\n console.error('useEscapeLayer handler error:', error);\n }\n }\n}\n\nfunction attachEscapeListener() {\n if (!isEscapeListenerAttached) {\n document.addEventListener('keydown', handleGlobalEscape);\n isEscapeListenerAttached = true;\n }\n}\n\nfunction detachEscapeListener() {\n if (isEscapeListenerAttached && escapeStack.length === 0) {\n document.removeEventListener('keydown', handleGlobalEscape);\n isEscapeListenerAttached = false;\n }\n}\n\nfunction dismissAutoDismissLayers() {\n while (escapeStack.length > 0 && escapeStack[escapeStack.length - 1].autoDismiss) {\n const entry = escapeStack.pop()!;\n try {\n entry.handler();\n } catch (error) {\n console.error('useEscapeLayer autoDismiss error:', error);\n }\n }\n}\n\n/**\n * Хук для реєстрації компонента у глобальному стеку Escape.\n * При натисканні Escape закривається тільки найвищий шар (LIFO).\n */\nexport const useEscapeLayer = (onEscape: () => void, isActive: boolean = true, autoDismiss: boolean = false) => {\n const callbackRef = useRef(onEscape);\n callbackRef.current = onEscape;\n\n useEffect(() => {\n if (!isActive) return;\n\n if (!autoDismiss) {\n dismissAutoDismissLayers();\n }\n\n const entry: EscapeStackEntry = {\n handler: () => callbackRef.current(),\n autoDismiss,\n };\n escapeStack.push(entry);\n attachEscapeListener();\n\n return () => {\n const idx = escapeStack.indexOf(entry);\n if (idx !== -1) escapeStack.splice(idx, 1);\n detachEscapeListener();\n };\n }, [isActive, autoDismiss]);\n};\n\n/**\n * Глобальний стек для управління outclick шарами.\n * При кліку поза компонентом закривається тільки найвищий (останній) шар.\n */\ntype OutclickStackEntry = {\n ref: React.RefObject<Element | null>;\n handler: () => void;\n};\n\nconst outclickStack: OutclickStackEntry[] = [];\nlet isOutclickListenerAttached = false;\n\nconst OUTCLICK_IGNORE_SELECTORS = ['.cb-ui-context-menu', '.cb-ui-backdrop'];\n\nfunction handleGlobalOutclick(e: MouseEvent) {\n if (outclickStack.length === 0) return;\n\n const target = e.target as Element;\n if (!target) return;\n\n for (const selector of OUTCLICK_IGNORE_SELECTORS) {\n if (target.closest(selector)) return;\n }\n\n const top = outclickStack[outclickStack.length - 1];\n if (top.ref.current && !top.ref.current.contains(target)) {\n try {\n top.handler();\n } catch (error) {\n console.error('useOutclickLayer handler error:', error);\n }\n }\n}\n\nfunction attachOutclickListener() {\n if (!isOutclickListenerAttached) {\n document.addEventListener('mousedown', handleGlobalOutclick);\n isOutclickListenerAttached = true;\n }\n}\n\nfunction detachOutclickListener() {\n if (isOutclickListenerAttached && outclickStack.length === 0) {\n document.removeEventListener('mousedown', handleGlobalOutclick);\n isOutclickListenerAttached = false;\n }\n}\n\n/**\n * Хук для реєстрації компонента у глобальному стеку outclick.\n * При кліку поза компонентом закривається тільки найвищий шар (LIFO).\n */\nexport const useOutclickLayer = (\n ref: React.RefObject<Element | null>,\n onOutclick: () => void,\n isActive: boolean = true\n) => {\n const callbackRef = useRef(onOutclick);\n callbackRef.current = onOutclick;\n\n useEffect(() => {\n if (!isActive) return;\n\n const entry: OutclickStackEntry = {\n ref,\n handler: () => callbackRef.current(),\n };\n outclickStack.push(entry);\n attachOutclickListener();\n\n return () => {\n const idx = outclickStack.indexOf(entry);\n if (idx !== -1) outclickStack.splice(idx, 1);\n detachOutclickListener();\n };\n }, [isActive, ref]);\n};\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';var chunkS3RLHUDJ_js=require('./chunk-S3RLHUDJ.js'),chunkNQZUCXJV_js=require('./chunk-NQZUCXJV.js'),chunkAYDF3IFZ_js=require('./chunk-AYDF3IFZ.js'),react=require('react'),jsxRuntime=require('react/jsx-runtime');var pe=react.forwardRef(chunkAYDF3IFZ_js.a(function({className:o,children:n,...s},a){return jsxRuntime.jsx("div",{ref:a,role:"toolbar",className:chunkNQZUCXJV_js.a("absolute left-1/2 -translate-x-1/2 bottom-4 z-10","flex items-center justify-center gap-2 p-2","bg-background-surface border border-border-subtle shadow-radar-overlay",o),...s,children:n})},"FloatingControls")),I=react.forwardRef(chunkAYDF3IFZ_js.a(function({className:o,children:n,...s},a){return jsxRuntime.jsx("div",{ref:a,className:chunkNQZUCXJV_js.a("flex items-center gap-1",o),...s,children:n})},"FloatingControlsGroup")),z=react.forwardRef(chunkAYDF3IFZ_js.a(function({className:o,children:n,...s},a){return jsxRuntime.jsx("div",{ref:a,className:chunkNQZUCXJV_js.a("flex items-center border border-border-subtle",o),...s,children:n})},"FloatingControlsBoxedGroup")),N=chunkAYDF3IFZ_js.a(()=>jsxRuntime.jsx("span",{"aria-hidden":true,className:"self-stretch w-px bg-border-subtle"}),"FloatingControlsDivider"),m=react.forwardRef(chunkAYDF3IFZ_js.a(function({active:o,className:n,children:s,type:a,...v},d){return jsxRuntime.jsx("button",{ref:d,type:a??"button",className:chunkNQZUCXJV_js.a("inline-flex items-center justify-center px-2 py-[7px]","font-plex text-sm leading-4 tracking-[0.16px] text-text-body","hover:bg-background-surface-secondary","disabled:opacity-40 disabled:pointer-events-none",o&&"bg-background-surface-secondary",n),...v,children:s})},"FloatingControlsButton"));var O=chunkAYDF3IFZ_js.a(({onPrev:t,onNext:o,hasPrev:n,hasNext:s,positionLabel:a})=>!t&&!o?null:jsxRuntime.jsxs(z,{"aria-label":"File navigation",children:[jsxRuntime.jsx(m,{"aria-label":"Previous file",onClick:t,disabled:!t||n===false,className:"px-3!",children:jsxRuntime.jsx(chunkS3RLHUDJ_js.c,{width:12,height:12})}),a?jsxRuntime.jsx("span",{className:"flex shrink-0 items-center whitespace-nowrap px-1 font-plex text-sm leading-4 tracking-[0.16px] text-text-body tabular-nums",children:a}):null,jsxRuntime.jsx(m,{"aria-label":"Next file",onClick:o,disabled:!o||s===false,className:"px-3!",children:jsxRuntime.jsx(chunkS3RLHUDJ_js.d,{width:12,height:12})})]}),"MediaNavGroup");var $=chunkAYDF3IFZ_js.a(({value:t,max:o,buffered:n,step:s,disabled:a,ariaLabel:v,ariaValueText:d,className:x,onChange:u,onChangeStart:E,onChangeEnd:P})=>{let g=react.useRef(null),p=react.useRef(false),b=chunkAYDF3IFZ_js.a(i=>Math.min(o,Math.max(0,i)),"clamp"),F=o>0?b(t)/o:0,D=n!=null&&o>0?b(n)/o:0,L=s??(o>0?o/20:.05),G=chunkAYDF3IFZ_js.a(i=>{let R=g.current;if(!R)return 0;let w=R.getBoundingClientRect(),X=w.width>0?(i-w.left)/w.width:0;return b(X*o)},"valueFromClientX"),H=chunkAYDF3IFZ_js.a(i=>{a||(i.preventDefault(),p.current=true,g.current?.setPointerCapture(i.pointerId),E?.(),u(G(i.clientX)));},"handlePointerDown"),C=chunkAYDF3IFZ_js.a(i=>{p.current&&u(G(i.clientX));},"handlePointerMove"),S=chunkAYDF3IFZ_js.a(i=>{p.current&&(p.current=false,g.current?.releasePointerCapture(i.pointerId),P?.());},"handlePointerUp"),U=chunkAYDF3IFZ_js.a(i=>{a||(i.key==="ArrowLeft"||i.key==="ArrowDown"?(i.preventDefault(),i.stopPropagation(),u(b(t-L))):i.key==="ArrowRight"||i.key==="ArrowUp"?(i.preventDefault(),i.stopPropagation(),u(b(t+L))):i.key==="Home"?(i.preventDefault(),u(0)):i.key==="End"&&(i.preventDefault(),u(o)));},"handleKeyDown");return jsxRuntime.jsx("div",{ref:g,role:"slider","aria-label":v,"aria-valuemin":0,"aria-valuemax":Number.isFinite(o)?Math.round(o):void 0,"aria-valuenow":Math.round(b(t)),"aria-valuetext":d,"aria-disabled":a||void 0,tabIndex:a?-1:0,onPointerDown:H,onPointerMove:C,onPointerUp:S,onKeyDown:U,className:chunkNQZUCXJV_js.a("group/slider relative flex h-4 shrink-0 select-none items-center",a?"pointer-events-none opacity-40":"cursor-pointer",x),children:jsxRuntime.jsxs("div",{className:"relative h-1 w-full bg-background-surface-secondary",children:[D>0&&jsxRuntime.jsx("div",{className:"absolute inset-y-0 left-0 bg-border-disabled",style:{width:`${D*100}%`}}),jsxRuntime.jsx("div",{className:"absolute inset-y-0 left-0 bg-interactive-link",style:{width:`${F*100}%`}}),jsxRuntime.jsx("div",{"aria-hidden":true,className:"absolute top-1/2 size-3 -translate-x-1/2 -translate-y-1/2 rounded-full bg-interactive-link opacity-0 transition-opacity group-hover/slider:opacity-100 group-focus-visible/slider:opacity-100",style:{left:`${F*100}%`}})]})})},"MediaSlider");var K=chunkAYDF3IFZ_js.a(t=>{if(!Number.isFinite(t)||t<0)return "0:00";let o=Math.floor(t),n=Math.floor(o/3600),s=Math.floor(o%3600/60),a=String(o%60).padStart(2,"0");return n>0?`${n}:${String(s).padStart(2,"0")}:${a}`:`${s}:${a}`},"formatTime"),ge=chunkAYDF3IFZ_js.a(({player:t,filename:o,onDownload:n,isFullscreen:s,onToggleFullscreen:a,onPrev:v,onNext:d,hasPrev:x,hasNext:u,positionLabel:E,className:P})=>{let g=!!(v||d),p=!Number.isFinite(t.duration)||t.duration<=0;return jsxRuntime.jsxs("div",{role:"toolbar","aria-label":"Media controls",className:chunkNQZUCXJV_js.a("flex flex-col gap-2 border border-border-subtle bg-background-surface p-2 shadow-radar-overlay",P),children:[jsxRuntime.jsx($,{ariaLabel:"Seek",ariaValueText:`${K(t.currentTime)} / ${K(t.duration)}`,value:t.currentTime,max:t.duration,buffered:t.buffered,step:5,disabled:p,onChange:t.seek,onChangeStart:t.seekStart,onChangeEnd:t.seekEnd}),jsxRuntime.jsxs("div",{className:"flex items-center gap-2",children:[jsxRuntime.jsxs(I,{children:[jsxRuntime.jsx(m,{"aria-label":t.isPlaying?"Pause":"Play",onClick:t.togglePlay,children:t.isPlaying?jsxRuntime.jsx(chunkS3RLHUDJ_js.f,{width:16,height:16}):jsxRuntime.jsx(chunkS3RLHUDJ_js.g,{width:16,height:16})}),jsxRuntime.jsxs(m,{"aria-label":"Playback position",className:"pointer-events-none tabular-nums",children:[K(t.currentTime)," / ",K(t.duration)]})]}),jsxRuntime.jsx("div",{className:"flex-1"}),jsxRuntime.jsxs(I,{children:[jsxRuntime.jsx(m,{"aria-label":t.isMuted||t.volume===0?"Unmute":"Mute",onClick:t.toggleMute,children:t.isMuted||t.volume===0?jsxRuntime.jsx(chunkS3RLHUDJ_js.h,{width:16,height:16}):jsxRuntime.jsx(chunkS3RLHUDJ_js.i,{width:16,height:16})}),jsxRuntime.jsx($,{ariaLabel:"Volume",value:t.isMuted?0:t.volume,max:1,step:.05,className:"w-20",onChange:t.changeVolume})]}),a&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(N,{}),jsxRuntime.jsx(m,{"aria-label":s?"Exit fullscreen":"Enter fullscreen",onClick:a,children:s?jsxRuntime.jsx(chunkS3RLHUDJ_js.a,{width:16,height:16}):jsxRuntime.jsx(chunkS3RLHUDJ_js.e,{width:16,height:16})})]}),g&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(N,{}),jsxRuntime.jsx(O,{onPrev:v,onNext:d,hasPrev:x,hasNext:u,positionLabel:E})]}),n&&jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(N,{}),jsxRuntime.jsx(m,{"aria-label":o?`Download ${o}`:"Download",onClick:n,children:jsxRuntime.jsx(chunkS3RLHUDJ_js.b,{width:16,height:16})})]})]})]})},"MediaControlBar");var he=chunkAYDF3IFZ_js.a((t,o)=>{let n=react.useRef(t);n.current=t;let[s,a]=react.useState(false),[v,d]=react.useState(0),[x,u]=react.useState(0),[E,P]=react.useState(0),[g,p]=react.useState(1),[b,F]=react.useState(false),[D,L]=react.useState(false),[G,H]=react.useState(false),C=react.useRef(false),S=react.useRef(false);react.useEffect(()=>{let e=n.current();if(!e)return;a(false),d(0),u(0),P(0),L(false),H(false),C.current=false;let c=chunkAYDF3IFZ_js.a(()=>{u(e.duration),p(e.volume),F(e.muted),L(true);},"onLoadedMetadata"),Q=chunkAYDF3IFZ_js.a(()=>u(e.duration),"onDurationChange"),W=chunkAYDF3IFZ_js.a(()=>{C.current||d(e.currentTime);},"onTimeUpdate"),Y=chunkAYDF3IFZ_js.a(()=>{e.buffered.length>0&&P(e.buffered.end(e.buffered.length-1));},"onProgress"),Z=chunkAYDF3IFZ_js.a(()=>a(true),"onPlay"),_=chunkAYDF3IFZ_js.a(()=>a(false),"onPause"),j=chunkAYDF3IFZ_js.a(()=>a(false),"onEnded"),ee=chunkAYDF3IFZ_js.a(()=>{p(e.volume),F(e.muted);},"onVolumeChange"),te=chunkAYDF3IFZ_js.a(()=>H(true),"onError");return e.addEventListener("loadedmetadata",c),e.addEventListener("durationchange",Q),e.addEventListener("timeupdate",W),e.addEventListener("progress",Y),e.addEventListener("play",Z),e.addEventListener("pause",_),e.addEventListener("ended",j),e.addEventListener("volumechange",ee),e.addEventListener("error",te),e.readyState>=1&&c(),()=>{e.removeEventListener("loadedmetadata",c),e.removeEventListener("durationchange",Q),e.removeEventListener("timeupdate",W),e.removeEventListener("progress",Y),e.removeEventListener("play",Z),e.removeEventListener("pause",_),e.removeEventListener("ended",j),e.removeEventListener("volumechange",ee),e.removeEventListener("error",te);}},[o]);let U=react.useCallback(()=>{let e=n.current();e&&(e.paused||e.ended?(e.ended&&(e.currentTime=0),e.play().catch(()=>{})):e.pause());},[]),i=react.useCallback(()=>{let e=n.current();e&&(e.muted||e.volume===0?(e.muted=false,e.volume===0&&(e.volume=.5)):e.muted=true);},[]),R=react.useCallback(e=>{let c=n.current();c&&(c.volume=e,c.muted=e===0);},[]),w=react.useCallback(e=>{let c=n.current();c&&(c.currentTime=e,d(e));},[]),X=react.useCallback(()=>{let e=n.current();C.current=true,S.current=!!e&&!e.paused,e?.pause();},[]),me=react.useCallback(()=>{C.current=false,S.current&&n.current()?.play().catch(()=>{});},[]);return {isPlaying:s,currentTime:v,duration:x,buffered:E,volume:g,isMuted:b,metadataLoaded:D,hasError:G,togglePlay:U,toggleMute:i,changeVolume:R,seek:w,seekStart:X,seekEnd:me}},"useMediaPlayer");exports.a=pe;exports.b=I;exports.c=z;exports.d=N;exports.e=m;exports.f=O;exports.g=ge;exports.h=he;//# sourceMappingURL=chunk-JVDLOXO7.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-JVDLOXO7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/FileViewer/drivers/_shared/FloatingControls.tsx","../src/FileViewer/drivers/_shared/MediaNavGroup.tsx","../src/FileViewer/drivers/_shared/MediaSlider.tsx","../src/FileViewer/drivers/_shared/MediaControlBar.tsx","../src/FileViewer/drivers/_shared/useMediaPlayer.ts"],"names":["FloatingControls","forwardRef","__name","className","children","rest","ref","jsx","cn","FloatingControlsGroup","FloatingControlsBoxedGroup","FloatingControlsDivider","FloatingControlsButton","active","type","MediaNavGroup","onPrev","onNext","hasPrev","hasNext","positionLabel","jsxs","KeyboardArrowLeftIcon","KeyboardArrowRightIcon","MediaSlider","value","max","buffered","step","disabled","ariaLabel","ariaValueText","onChange","onChangeStart","onChangeEnd","trackRef","useRef","draggingRef","clamp","v","fraction","bufferedFraction","keyStep","valueFromClientX","clientX","el","rect","ratio","handlePointerDown","e","handlePointerMove","handlePointerUp","handleKeyDown","formatTime","seconds","total","h","m","s","MediaControlBar","player","filename","onDownload","isFullscreen","onToggleFullscreen","hasNav","seekDisabled","PauseIcon","PlayArrowIcon","VolumeOffIcon","VolumeUpIcon","Fragment","CloseFullscreenIcon","OpenInFullIcon","DownloadIcon","useMediaPlayer","getMedia","url","getMediaRef","isPlaying","setIsPlaying","useState","currentTime","setCurrentTime","duration","setDuration","setBuffered","volume","setVolume","isMuted","setIsMuted","metadataLoaded","setMetadataLoaded","hasError","setHasError","scrubbingRef","wasPlayingBeforeScrubRef","useEffect","media","onLoadedMetadata","onDurationChange","onTimeUpdate","onProgress","onPlay","onPause","onEnded","onVolumeChange","onError","togglePlay","useCallback","toggleMute","changeVolume","seek","seekStart","seekEnd"],"mappings":"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","file":"chunk-JVDLOXO7.js","sourcesContent":["import {\n forwardRef,\n type ButtonHTMLAttributes,\n type HTMLAttributes,\n type ReactNode,\n} from 'react';\nimport { cn } from '../../../lib/cn';\n\n// Tokens follow Figma \"Document toolbar/Variants\" (Radar-Components 458:22503):\n// - container/buttons/groups have NO rounded corners,\n// - text uses IBM Plex Sans (font-plex) 14px / leading-4 / tracking-[0.16px],\n// - icon-only buttons are 30px tall (px-[8px] py-[7px] + 16px icon),\n// - text-only buttons (e.g. \"100%\") use px-[8px] py-[7px] without an icon spacer.\n\nexport type FloatingControlsProps = HTMLAttributes<HTMLDivElement> & {\n children: ReactNode;\n};\n\nexport const FloatingControls = forwardRef<HTMLDivElement, FloatingControlsProps>(\n function FloatingControls({ className, children, ...rest }, ref) {\n return (\n <div\n ref={ref}\n role=\"toolbar\"\n className={cn(\n 'absolute left-1/2 -translate-x-1/2 bottom-4 z-10',\n 'flex items-center justify-center gap-2 p-2',\n 'bg-background-surface border border-border-subtle shadow-radar-overlay',\n className\n )}\n {...rest}\n >\n {children}\n </div>\n );\n }\n);\n\nexport type FloatingControlsGroupProps = HTMLAttributes<HTMLDivElement>;\n\nexport const FloatingControlsGroup = forwardRef<HTMLDivElement, FloatingControlsGroupProps>(\n function FloatingControlsGroup({ className, children, ...rest }, ref) {\n return (\n <div ref={ref} className={cn('flex items-center gap-1', className)} {...rest}>\n {children}\n </div>\n );\n }\n);\n\nexport type FloatingControlsBoxedGroupProps = HTMLAttributes<HTMLDivElement>;\n\nexport const FloatingControlsBoxedGroup = forwardRef<HTMLDivElement, FloatingControlsBoxedGroupProps>(\n function FloatingControlsBoxedGroup({ className, children, ...rest }, ref) {\n return (\n <div\n ref={ref}\n className={cn('flex items-center border border-border-subtle', className)}\n {...rest}\n >\n {children}\n </div>\n );\n }\n);\n\nexport const FloatingControlsDivider = () => (\n <span aria-hidden className=\"self-stretch w-px bg-border-subtle\" />\n);\n\nexport type FloatingControlsButtonProps = ButtonHTMLAttributes<HTMLButtonElement> & {\n active?: boolean;\n};\n\nexport const FloatingControlsButton = forwardRef<HTMLButtonElement, FloatingControlsButtonProps>(\n function FloatingControlsButton({ active, className, children, type, ...rest }, ref) {\n return (\n <button\n ref={ref}\n type={type ?? 'button'}\n className={cn(\n 'inline-flex items-center justify-center px-2 py-[7px]',\n 'font-plex text-sm leading-4 tracking-[0.16px] text-text-body',\n 'hover:bg-background-surface-secondary',\n 'disabled:opacity-40 disabled:pointer-events-none',\n active && 'bg-background-surface-secondary',\n className\n )}\n {...rest}\n >\n {children}\n </button>\n );\n }\n);\n","import { KeyboardArrowLeftIcon } from '../../../Icons/KeyboardArrowLeftIcon';\nimport { KeyboardArrowRightIcon } from '../../../Icons/KeyboardArrowRightIcon';\nimport type { FileViewerNavProps } from '../../types';\nimport { FloatingControlsBoxedGroup, FloatingControlsButton } from './FloatingControls';\n\nexport type MediaNavGroupProps = FileViewerNavProps;\n\n/**\n * Shared prev/next navigation group. Mirrors the PdfDriver page switcher: a\n * bordered group with prev/next buttons around a non-interactive position\n * label. Renders nothing when neither `onPrev` nor `onNext` is provided.\n */\nexport const MediaNavGroup = ({\n onPrev,\n onNext,\n hasPrev,\n hasNext,\n positionLabel,\n}: MediaNavGroupProps) => {\n if (!onPrev && !onNext) return null;\n\n return (\n <FloatingControlsBoxedGroup aria-label=\"File navigation\">\n <FloatingControlsButton\n aria-label=\"Previous file\"\n onClick={onPrev}\n disabled={!onPrev || hasPrev === false}\n className=\"px-3!\"\n >\n <KeyboardArrowLeftIcon width={12} height={12} />\n </FloatingControlsButton>\n {positionLabel ? (\n <span className=\"flex shrink-0 items-center whitespace-nowrap px-1 font-plex text-sm leading-4 tracking-[0.16px] text-text-body tabular-nums\">\n {positionLabel}\n </span>\n ) : null}\n <FloatingControlsButton\n aria-label=\"Next file\"\n onClick={onNext}\n disabled={!onNext || hasNext === false}\n className=\"px-3!\"\n >\n <KeyboardArrowRightIcon width={12} height={12} />\n </FloatingControlsButton>\n </FloatingControlsBoxedGroup>\n );\n};\n","import {\n useRef,\n type KeyboardEvent as ReactKeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n} from 'react';\nimport { cn } from '../../../lib/cn';\n\nexport interface MediaSliderProps {\n value: number;\n max: number;\n /** Optional secondary fill (e.g. buffered range), in the same unit as `value`. */\n buffered?: number;\n step?: number;\n disabled?: boolean;\n ariaLabel: string;\n ariaValueText?: string;\n className?: string;\n onChange: (value: number) => void;\n onChangeStart?: () => void;\n onChangeEnd?: () => void;\n}\n\n/** Pointer/keyboard slider track shared by the seek bar and the volume control. */\nexport const MediaSlider = ({\n value,\n max,\n buffered,\n step,\n disabled,\n ariaLabel,\n ariaValueText,\n className,\n onChange,\n onChangeStart,\n onChangeEnd,\n}: MediaSliderProps) => {\n const trackRef = useRef<HTMLDivElement>(null);\n const draggingRef = useRef(false);\n\n const clamp = (v: number) => Math.min(max, Math.max(0, v));\n const fraction = max > 0 ? clamp(value) / max : 0;\n const bufferedFraction = buffered != null && max > 0 ? clamp(buffered) / max : 0;\n const keyStep = step ?? (max > 0 ? max / 20 : 0.05);\n\n const valueFromClientX = (clientX: number) => {\n const el = trackRef.current;\n if (!el) return 0;\n const rect = el.getBoundingClientRect();\n const ratio = rect.width > 0 ? (clientX - rect.left) / rect.width : 0;\n return clamp(ratio * max);\n };\n\n const handlePointerDown = (e: ReactPointerEvent<HTMLDivElement>) => {\n if (disabled) return;\n e.preventDefault();\n draggingRef.current = true;\n trackRef.current?.setPointerCapture(e.pointerId);\n onChangeStart?.();\n onChange(valueFromClientX(e.clientX));\n };\n\n const handlePointerMove = (e: ReactPointerEvent<HTMLDivElement>) => {\n if (!draggingRef.current) return;\n onChange(valueFromClientX(e.clientX));\n };\n\n const handlePointerUp = (e: ReactPointerEvent<HTMLDivElement>) => {\n if (!draggingRef.current) return;\n draggingRef.current = false;\n trackRef.current?.releasePointerCapture(e.pointerId);\n onChangeEnd?.();\n };\n\n const handleKeyDown = (e: ReactKeyboardEvent<HTMLDivElement>) => {\n if (disabled) return;\n if (e.key === 'ArrowLeft' || e.key === 'ArrowDown') {\n e.preventDefault();\n e.stopPropagation();\n onChange(clamp(value - keyStep));\n } else if (e.key === 'ArrowRight' || e.key === 'ArrowUp') {\n e.preventDefault();\n e.stopPropagation();\n onChange(clamp(value + keyStep));\n } else if (e.key === 'Home') {\n e.preventDefault();\n onChange(0);\n } else if (e.key === 'End') {\n e.preventDefault();\n onChange(max);\n }\n };\n\n return (\n <div\n ref={trackRef}\n role=\"slider\"\n aria-label={ariaLabel}\n aria-valuemin={0}\n aria-valuemax={Number.isFinite(max) ? Math.round(max) : undefined}\n aria-valuenow={Math.round(clamp(value))}\n aria-valuetext={ariaValueText}\n aria-disabled={disabled || undefined}\n tabIndex={disabled ? -1 : 0}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onKeyDown={handleKeyDown}\n className={cn(\n 'group/slider relative flex h-4 shrink-0 select-none items-center',\n disabled ? 'pointer-events-none opacity-40' : 'cursor-pointer',\n className\n )}\n >\n <div className=\"relative h-1 w-full bg-background-surface-secondary\">\n {bufferedFraction > 0 && (\n <div\n className=\"absolute inset-y-0 left-0 bg-border-disabled\"\n style={{ width: `${bufferedFraction * 100}%` }}\n />\n )}\n <div\n className=\"absolute inset-y-0 left-0 bg-interactive-link\"\n style={{ width: `${fraction * 100}%` }}\n />\n <div\n aria-hidden\n className=\"absolute top-1/2 size-3 -translate-x-1/2 -translate-y-1/2 rounded-full bg-interactive-link opacity-0 transition-opacity group-hover/slider:opacity-100 group-focus-visible/slider:opacity-100\"\n style={{ left: `${fraction * 100}%` }}\n />\n </div>\n </div>\n );\n};\n","import { cn } from '../../../lib/cn';\nimport { CloseFullscreenIcon } from '../../../Icons/CloseFullscreenIcon';\nimport { DownloadIcon } from '../../../Icons/DownloadIcon';\nimport { OpenInFullIcon } from '../../../Icons/OpenInFullIcon';\nimport { PauseIcon } from '../../../Icons/PauseIcon';\nimport { PlayArrowIcon } from '../../../Icons/PlayArrowIcon';\nimport { VolumeOffIcon } from '../../../Icons/VolumeOffIcon';\nimport { VolumeUpIcon } from '../../../Icons/VolumeUpIcon';\nimport type { FileViewerNavProps } from '../../types';\nimport { FloatingControlsButton, FloatingControlsDivider, FloatingControlsGroup } from './FloatingControls';\nimport { MediaNavGroup } from './MediaNavGroup';\nimport { MediaSlider } from './MediaSlider';\nimport type { MediaPlayerApi } from './useMediaPlayer';\n\nconst formatTime = (seconds: number): string => {\n if (!Number.isFinite(seconds) || seconds < 0) return '0:00';\n const total = Math.floor(seconds);\n const h = Math.floor(total / 3600);\n const m = Math.floor((total % 3600) / 60);\n const s = String(total % 60).padStart(2, '0');\n return h > 0 ? `${h}:${String(m).padStart(2, '0')}:${s}` : `${m}:${s}`;\n};\n\ninterface MediaControlBarProps extends FileViewerNavProps {\n player: MediaPlayerApi;\n filename?: string;\n onDownload?: () => void;\n /** When `onToggleFullscreen` is provided, a fullscreen button is rendered. */\n isFullscreen?: boolean;\n onToggleFullscreen?: () => void;\n className?: string;\n}\n\n/**\n * Branded control bar for the audio/video drivers — seek bar + play, time,\n * volume, optional fullscreen, prev/next navigation and download. Uses the\n * FloatingControls toolbar tokens for visual consistency with the other drivers.\n */\nexport const MediaControlBar = ({\n player,\n filename,\n onDownload,\n isFullscreen,\n onToggleFullscreen,\n onPrev,\n onNext,\n hasPrev,\n hasNext,\n positionLabel,\n className,\n}: MediaControlBarProps) => {\n const hasNav = !!(onPrev || onNext);\n const seekDisabled = !Number.isFinite(player.duration) || player.duration <= 0;\n\n return (\n <div\n role=\"toolbar\"\n aria-label=\"Media controls\"\n className={cn(\n 'flex flex-col gap-2 border border-border-subtle bg-background-surface p-2 shadow-radar-overlay',\n className\n )}\n >\n <MediaSlider\n ariaLabel=\"Seek\"\n ariaValueText={`${formatTime(player.currentTime)} / ${formatTime(player.duration)}`}\n value={player.currentTime}\n max={player.duration}\n buffered={player.buffered}\n step={5}\n disabled={seekDisabled}\n onChange={player.seek}\n onChangeStart={player.seekStart}\n onChangeEnd={player.seekEnd}\n />\n\n <div className=\"flex items-center gap-2\">\n <FloatingControlsGroup>\n <FloatingControlsButton\n aria-label={player.isPlaying ? 'Pause' : 'Play'}\n onClick={player.togglePlay}\n >\n {player.isPlaying ? (\n <PauseIcon width={16} height={16} />\n ) : (\n <PlayArrowIcon width={16} height={16} />\n )}\n </FloatingControlsButton>\n <FloatingControlsButton\n aria-label=\"Playback position\"\n className=\"pointer-events-none tabular-nums\"\n >\n {formatTime(player.currentTime)} / {formatTime(player.duration)}\n </FloatingControlsButton>\n </FloatingControlsGroup>\n\n <div className=\"flex-1\" />\n\n <FloatingControlsGroup>\n <FloatingControlsButton\n aria-label={player.isMuted || player.volume === 0 ? 'Unmute' : 'Mute'}\n onClick={player.toggleMute}\n >\n {player.isMuted || player.volume === 0 ? (\n <VolumeOffIcon width={16} height={16} />\n ) : (\n <VolumeUpIcon width={16} height={16} />\n )}\n </FloatingControlsButton>\n <MediaSlider\n ariaLabel=\"Volume\"\n value={player.isMuted ? 0 : player.volume}\n max={1}\n step={0.05}\n className=\"w-20\"\n onChange={player.changeVolume}\n />\n </FloatingControlsGroup>\n\n {onToggleFullscreen && (\n <>\n <FloatingControlsDivider />\n <FloatingControlsButton\n aria-label={isFullscreen ? 'Exit fullscreen' : 'Enter fullscreen'}\n onClick={onToggleFullscreen}\n >\n {isFullscreen ? (\n <CloseFullscreenIcon width={16} height={16} />\n ) : (\n <OpenInFullIcon width={16} height={16} />\n )}\n </FloatingControlsButton>\n </>\n )}\n\n {hasNav && (\n <>\n <FloatingControlsDivider />\n <MediaNavGroup\n onPrev={onPrev}\n onNext={onNext}\n hasPrev={hasPrev}\n hasNext={hasNext}\n positionLabel={positionLabel}\n />\n </>\n )}\n\n {onDownload && (\n <>\n <FloatingControlsDivider />\n <FloatingControlsButton\n aria-label={filename ? `Download ${filename}` : 'Download'}\n onClick={onDownload}\n >\n <DownloadIcon width={16} height={16} />\n </FloatingControlsButton>\n </>\n )}\n </div>\n </div>\n );\n};\n","import { useCallback, useEffect, useRef, useState } from 'react';\n\nexport interface MediaPlayerApi {\n isPlaying: boolean;\n currentTime: number;\n duration: number;\n buffered: number;\n volume: number;\n isMuted: boolean;\n metadataLoaded: boolean;\n hasError: boolean;\n togglePlay: () => void;\n toggleMute: () => void;\n changeVolume: (value: number) => void;\n seek: (value: number) => void;\n seekStart: () => void;\n seekEnd: () => void;\n}\n\n/**\n * Shared playback state + controls for the `<video>`/`<audio>` drivers. Binds\n * listeners imperatively to the media element (returned by `getMedia`) and\n * resets when `url` changes — both elements are `HTMLMediaElement`, so the\n * logic is identical. Pass a `() => ref.current` getter to avoid ref-type\n * coupling between the two element kinds.\n */\nexport const useMediaPlayer = (\n getMedia: () => HTMLMediaElement | null,\n url: string\n): MediaPlayerApi => {\n const getMediaRef = useRef(getMedia);\n getMediaRef.current = getMedia;\n\n const [isPlaying, setIsPlaying] = useState(false);\n const [currentTime, setCurrentTime] = useState(0);\n const [duration, setDuration] = useState(0);\n const [buffered, setBuffered] = useState(0);\n const [volume, setVolume] = useState(1);\n const [isMuted, setIsMuted] = useState(false);\n const [metadataLoaded, setMetadataLoaded] = useState(false);\n const [hasError, setHasError] = useState(false);\n\n const scrubbingRef = useRef(false);\n const wasPlayingBeforeScrubRef = useRef(false);\n\n useEffect(() => {\n const media = getMediaRef.current();\n if (!media) return;\n\n // Reset for the new source — the driver is reused across navigation.\n setIsPlaying(false);\n setCurrentTime(0);\n setDuration(0);\n setBuffered(0);\n setMetadataLoaded(false);\n setHasError(false);\n scrubbingRef.current = false;\n\n const onLoadedMetadata = () => {\n setDuration(media.duration);\n setVolume(media.volume);\n setIsMuted(media.muted);\n setMetadataLoaded(true);\n };\n const onDurationChange = () => setDuration(media.duration);\n const onTimeUpdate = () => {\n if (!scrubbingRef.current) setCurrentTime(media.currentTime);\n };\n const onProgress = () => {\n if (media.buffered.length > 0) setBuffered(media.buffered.end(media.buffered.length - 1));\n };\n const onPlay = () => setIsPlaying(true);\n const onPause = () => setIsPlaying(false);\n const onEnded = () => setIsPlaying(false);\n const onVolumeChange = () => {\n setVolume(media.volume);\n setIsMuted(media.muted);\n };\n const onError = () => setHasError(true);\n\n media.addEventListener('loadedmetadata', onLoadedMetadata);\n media.addEventListener('durationchange', onDurationChange);\n media.addEventListener('timeupdate', onTimeUpdate);\n media.addEventListener('progress', onProgress);\n media.addEventListener('play', onPlay);\n media.addEventListener('pause', onPause);\n media.addEventListener('ended', onEnded);\n media.addEventListener('volumechange', onVolumeChange);\n media.addEventListener('error', onError);\n\n // Metadata may already be available (cached / fast blob URL).\n if (media.readyState >= 1 /* HAVE_METADATA */) onLoadedMetadata();\n\n return () => {\n media.removeEventListener('loadedmetadata', onLoadedMetadata);\n media.removeEventListener('durationchange', onDurationChange);\n media.removeEventListener('timeupdate', onTimeUpdate);\n media.removeEventListener('progress', onProgress);\n media.removeEventListener('play', onPlay);\n media.removeEventListener('pause', onPause);\n media.removeEventListener('ended', onEnded);\n media.removeEventListener('volumechange', onVolumeChange);\n media.removeEventListener('error', onError);\n };\n }, [url]);\n\n const togglePlay = useCallback(() => {\n const media = getMediaRef.current();\n if (!media) return;\n if (media.paused || media.ended) {\n if (media.ended) media.currentTime = 0;\n void media.play().catch(() => {});\n } else {\n media.pause();\n }\n }, []);\n\n const toggleMute = useCallback(() => {\n const media = getMediaRef.current();\n if (!media) return;\n if (media.muted || media.volume === 0) {\n media.muted = false;\n if (media.volume === 0) media.volume = 0.5;\n } else {\n media.muted = true;\n }\n }, []);\n\n const changeVolume = useCallback((value: number) => {\n const media = getMediaRef.current();\n if (!media) return;\n media.volume = value;\n media.muted = value === 0;\n }, []);\n\n const seek = useCallback((value: number) => {\n const media = getMediaRef.current();\n if (!media) return;\n media.currentTime = value;\n setCurrentTime(value);\n }, []);\n\n const seekStart = useCallback(() => {\n const media = getMediaRef.current();\n scrubbingRef.current = true;\n wasPlayingBeforeScrubRef.current = !!media && !media.paused;\n media?.pause();\n }, []);\n\n const seekEnd = useCallback(() => {\n scrubbingRef.current = false;\n if (wasPlayingBeforeScrubRef.current) void getMediaRef.current()?.play().catch(() => {});\n }, []);\n\n return {\n isPlaying,\n currentTime,\n duration,\n buffered,\n volume,\n isMuted,\n metadataLoaded,\n hasError,\n togglePlay,\n toggleMute,\n changeVolume,\n seek,\n seekStart,\n seekEnd,\n };\n};\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
'use strict';var chunkAYDF3IFZ_js=require('./chunk-AYDF3IFZ.js'),clsx=require('clsx'),tailwindMerge=require('tailwind-merge');function m(...e){return tailwindMerge.twMerge(clsx.clsx(e))}chunkAYDF3IFZ_js.a(m,"cn");exports.a=m;//# sourceMappingURL=chunk-NQZUCXJV.js.map
|
|
2
|
+
//# sourceMappingURL=chunk-NQZUCXJV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/lib/cn.ts"],"names":["cn","inputs","twMerge","clsx","__name"],"mappings":"8HAGO,SAASA,CAAAA,CAAAA,GAAMC,EAAsB,CAC1C,OAAOC,sBAAQC,SAAAA,CAAKF,CAAM,CAAC,CAC7B,CAFgBG,mBAAAJ,CAAAA,CAAA,IAAA,CAAA","file":"chunk-NQZUCXJV.js","sourcesContent":["import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-QWPVIX2T.mjs"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
'use strict';var chunkAYDF3IFZ_js=require('./chunk-AYDF3IFZ.js'),jsxRuntime=require('react/jsx-runtime');var S=chunkAYDF3IFZ_js.a(l=>jsxRuntime.jsx("svg",{viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...l,children:jsxRuntime.jsx("path",{d:"M3.4 22L2 20.6L8.6 14H4V12H12V20H10V15.4L3.4 22ZM12 12V4H14V8.6L20.6 2L22 3.4L15.4 10H20V12H12Z",fill:"currentColor"})}),"CloseFullscreenIcon");var i=chunkAYDF3IFZ_js.a(l=>jsxRuntime.jsx("svg",{viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...l,children:jsxRuntime.jsx("path",{d:"M12 16L7 11L8.4 9.55L11 12.15V4H13V12.15L15.6 9.55L17 11L12 16ZM6 20C5.45 20 4.97917 19.8042 4.5875 19.4125C4.19583 19.0208 4 18.55 4 18V15H6V18H18V15H20V18C20 18.55 19.8042 19.0208 19.4125 19.4125C19.0208 19.8042 18.55 20 18 20H6Z",fill:"currentColor"})}),"DownloadIcon");var M=chunkAYDF3IFZ_js.a(l=>jsxRuntime.jsx("svg",{viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...l,children:jsxRuntime.jsx("path",{d:"M14 18L8 12L14 6L15.4 7.4L10.8 12L15.4 16.6L14 18Z",fill:"currentColor"})}),"KeyboardArrowLeftIcon");var B=chunkAYDF3IFZ_js.a(l=>jsxRuntime.jsx("svg",{viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...l,children:jsxRuntime.jsx("path",{d:"M12.6 12L8 7.4L9.4 6L15.4 12L9.4 18L8 16.6L12.6 12Z",fill:"currentColor"})}),"KeyboardArrowRightIcon");var A=chunkAYDF3IFZ_js.a(l=>jsxRuntime.jsx("svg",{viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...l,children:jsxRuntime.jsx("path",{d:"M3 21V13H5V17.6L17.6 5H13V3H21V11H19V6.4L6.4 19H11V21H3Z",fill:"currentColor"})}),"OpenInFullIcon");var D=chunkAYDF3IFZ_js.a(l=>jsxRuntime.jsx("svg",{viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...l,children:jsxRuntime.jsx("path",{d:"M6 19h4V5H6v14zm8-14v14h4V5h-4z",fill:"currentColor"})}),"PauseIcon");var J=chunkAYDF3IFZ_js.a(l=>jsxRuntime.jsx("svg",{viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...l,children:jsxRuntime.jsx("path",{d:"M8 5v14l11-7z",fill:"currentColor"})}),"PlayArrowIcon");var X=chunkAYDF3IFZ_js.a(l=>jsxRuntime.jsx("svg",{viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...l,children:jsxRuntime.jsx("path",{d:"M16.5 12c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51C20.63 14.91 21 13.5 21 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71zM4.27 3L3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06c1.38-.31 2.63-.95 3.69-1.81L19.73 21 21 19.73l-9-9L4.27 3zM12 4L9.91 6.09 12 8.18V4z",fill:"currentColor"})}),"VolumeOffIcon");var o1=chunkAYDF3IFZ_js.a(l=>jsxRuntime.jsx("svg",{viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...l,children:jsxRuntime.jsx("path",{d:"M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z",fill:"currentColor"})}),"VolumeUpIcon");var s1=chunkAYDF3IFZ_js.a(l=>jsxRuntime.jsx("svg",{viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...l,children:jsxRuntime.jsx("path",{transform:"translate(3 3)",d:"M16.6 18L10.3 11.7C9.8 12.1 9.225 12.4167 8.575 12.65C7.925 12.8833 7.23333 13 6.5 13C4.68333 13 3.14583 12.3708 1.8875 11.1125C0.629167 9.85417 0 8.31667 0 6.5C0 4.68333 0.629167 3.14583 1.8875 1.8875C3.14583 0.629167 4.68333 0 6.5 0C8.31667 0 9.85417 0.629167 11.1125 1.8875C12.3708 3.14583 13 4.68333 13 6.5C13 7.23333 12.8833 7.925 12.65 8.575C12.4167 9.225 12.1 9.8 11.7 10.3L18 16.6L16.6 18ZM6.5 11C7.75 11 8.8125 10.5625 9.6875 9.6875C10.5625 8.8125 11 7.75 11 6.5C11 5.25 10.5625 4.1875 9.6875 3.3125C8.8125 2.4375 7.75 2 6.5 2C5.25 2 4.1875 2.4375 3.3125 3.3125C2.4375 4.1875 2 5.25 2 6.5C2 7.75 2.4375 8.8125 3.3125 9.6875C4.1875 10.5625 5.25 11 6.5 11ZM5.5 9.5V7.5H3.5V5.5H5.5V3.5H7.5V5.5H9.5V7.5H7.5V9.5H5.5Z",fill:"currentColor"})}),"ZoomInIcon");var v1=chunkAYDF3IFZ_js.a(l=>jsxRuntime.jsx("svg",{viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg",...l,children:jsxRuntime.jsx("path",{transform:"translate(3 3)",d:"M16.6 18L10.3 11.7C9.8 12.1 9.225 12.4167 8.575 12.65C7.925 12.8833 7.23333 13 6.5 13C4.68333 13 3.14583 12.3708 1.8875 11.1125C0.629167 9.85417 0 8.31667 0 6.5C0 4.68333 0.629167 3.14583 1.8875 1.8875C3.14583 0.629167 4.68333 0 6.5 0C8.31667 0 9.85417 0.629167 11.1125 1.8875C12.3708 3.14583 13 4.68333 13 6.5C13 7.23333 12.8833 7.925 12.65 8.575C12.4167 9.225 12.1 9.8 11.7 10.3L18 16.6L16.6 18ZM6.5 11C7.75 11 8.8125 10.5625 9.6875 9.6875C10.5625 8.8125 11 7.75 11 6.5C11 5.25 10.5625 4.1875 9.6875 3.3125C8.8125 2.4375 7.75 2 6.5 2C5.25 2 4.1875 2.4375 3.3125 3.3125C2.4375 4.1875 2 5.25 2 6.5C2 7.75 2.4375 8.8125 3.3125 9.6875C4.1875 10.5625 5.25 11 6.5 11ZM4 7.5V5.5H9V7.5H4Z",fill:"currentColor"})}),"ZoomOutIcon");
|
|
2
|
+
exports.a=S;exports.b=i;exports.c=M;exports.d=B;exports.e=A;exports.f=D;exports.g=J;exports.h=X;exports.i=o1;exports.j=s1;exports.k=v1;//# sourceMappingURL=chunk-S3RLHUDJ.js.map
|
|
3
|
+
//# sourceMappingURL=chunk-S3RLHUDJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/Icons/CloseFullscreenIcon.tsx","../src/Icons/DownloadIcon.tsx","../src/Icons/KeyboardArrowLeftIcon.tsx","../src/Icons/KeyboardArrowRightIcon.tsx","../src/Icons/OpenInFullIcon.tsx","../src/Icons/PauseIcon.tsx","../src/Icons/PlayArrowIcon.tsx","../src/Icons/VolumeOffIcon.tsx","../src/Icons/VolumeUpIcon.tsx","../src/Icons/ZoomInIcon.tsx","../src/Icons/ZoomOutIcon.tsx"],"names":["CloseFullscreenIcon","__name","props","jsx","DownloadIcon","KeyboardArrowLeftIcon","KeyboardArrowRightIcon","OpenInFullIcon","PauseIcon","PlayArrowIcon","VolumeOffIcon","VolumeUpIcon","ZoomInIcon","ZoomOutIcon"],"mappings":"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","file":"chunk-S3RLHUDJ.js","sourcesContent":["import { SVGProps } from 'react';\n\nexport const CloseFullscreenIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <path\n d=\"M3.4 22L2 20.6L8.6 14H4V12H12V20H10V15.4L3.4 22ZM12 12V4H14V8.6L20.6 2L22 3.4L15.4 10H20V12H12Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n","import { SVGProps } from 'react';\n\nexport const DownloadIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <path d=\"M12 16L7 11L8.4 9.55L11 12.15V4H13V12.15L15.6 9.55L17 11L12 16ZM6 20C5.45 20 4.97917 19.8042 4.5875 19.4125C4.19583 19.0208 4 18.55 4 18V15H6V18H18V15H20V18C20 18.55 19.8042 19.0208 19.4125 19.4125C19.0208 19.8042 18.55 20 18 20H6Z\" fill=\"currentColor\" />\n </svg>\n);\n","import { SVGProps } from 'react';\n\nexport const KeyboardArrowLeftIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <path d=\"M14 18L8 12L14 6L15.4 7.4L10.8 12L15.4 16.6L14 18Z\" fill=\"currentColor\" />\n </svg>\n);\n","import { SVGProps } from 'react';\n\nexport const KeyboardArrowRightIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <path d=\"M12.6 12L8 7.4L9.4 6L15.4 12L9.4 18L8 16.6L12.6 12Z\" fill=\"currentColor\" />\n </svg>\n);\n","import { SVGProps } from 'react';\n\nexport const OpenInFullIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <path\n d=\"M3 21V13H5V17.6L17.6 5H13V3H21V11H19V6.4L6.4 19H11V21H3Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n","import { SVGProps } from 'react';\n\n// Path data: official Material Icons `pause` (google/material-design-icons, src/av/pause/materialicons/24px).\nexport const PauseIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <path d=\"M6 19h4V5H6v14zm8-14v14h4V5h-4z\" fill=\"currentColor\" />\n </svg>\n);\n","import { SVGProps } from 'react';\n\n// Path data: official Material Icons `play_arrow` (google/material-design-icons, src/av/play_arrow/materialicons/24px).\nexport const PlayArrowIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <path d=\"M8 5v14l11-7z\" fill=\"currentColor\" />\n </svg>\n);\n","import { SVGProps } from 'react';\n\n// Path data: official Material Icons `volume_off` (google/material-design-icons, src/av/volume_off/materialicons/24px).\nexport const VolumeOffIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <path\n d=\"M16.5 12c0-1.77-1.02-3.29-2.5-4.03v2.21l2.45 2.45c.03-.2.05-.41.05-.63zm2.5 0c0 .94-.2 1.82-.54 2.64l1.51 1.51C20.63 14.91 21 13.5 21 12c0-4.28-2.99-7.86-7-8.77v2.06c2.89.86 5 3.54 5 6.71zM4.27 3L3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06c1.38-.31 2.63-.95 3.69-1.81L19.73 21 21 19.73l-9-9L4.27 3zM12 4L9.91 6.09 12 8.18V4z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n","import { SVGProps } from 'react';\n\n// Path data: official Material Icons `volume_up` (google/material-design-icons, src/av/volume_up/materialicons/24px).\nexport const VolumeUpIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <path\n d=\"M3 9v6h4l5 5V4L7 9H3zm13.5 3c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n","import { SVGProps } from 'react';\n\nexport const ZoomInIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <path\n transform=\"translate(3 3)\"\n d=\"M16.6 18L10.3 11.7C9.8 12.1 9.225 12.4167 8.575 12.65C7.925 12.8833 7.23333 13 6.5 13C4.68333 13 3.14583 12.3708 1.8875 11.1125C0.629167 9.85417 0 8.31667 0 6.5C0 4.68333 0.629167 3.14583 1.8875 1.8875C3.14583 0.629167 4.68333 0 6.5 0C8.31667 0 9.85417 0.629167 11.1125 1.8875C12.3708 3.14583 13 4.68333 13 6.5C13 7.23333 12.8833 7.925 12.65 8.575C12.4167 9.225 12.1 9.8 11.7 10.3L18 16.6L16.6 18ZM6.5 11C7.75 11 8.8125 10.5625 9.6875 9.6875C10.5625 8.8125 11 7.75 11 6.5C11 5.25 10.5625 4.1875 9.6875 3.3125C8.8125 2.4375 7.75 2 6.5 2C5.25 2 4.1875 2.4375 3.3125 3.3125C2.4375 4.1875 2 5.25 2 6.5C2 7.75 2.4375 8.8125 3.3125 9.6875C4.1875 10.5625 5.25 11 6.5 11ZM5.5 9.5V7.5H3.5V5.5H5.5V3.5H7.5V5.5H9.5V7.5H7.5V9.5H5.5Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n","import { SVGProps } from 'react';\n\nexport const ZoomOutIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\" {...props}>\n <path\n transform=\"translate(3 3)\"\n d=\"M16.6 18L10.3 11.7C9.8 12.1 9.225 12.4167 8.575 12.65C7.925 12.8833 7.23333 13 6.5 13C4.68333 13 3.14583 12.3708 1.8875 11.1125C0.629167 9.85417 0 8.31667 0 6.5C0 4.68333 0.629167 3.14583 1.8875 1.8875C3.14583 0.629167 4.68333 0 6.5 0C8.31667 0 9.85417 0.629167 11.1125 1.8875C12.3708 3.14583 13 4.68333 13 6.5C13 7.23333 12.8833 7.925 12.65 8.575C12.4167 9.225 12.1 9.8 11.7 10.3L18 16.6L16.6 18ZM6.5 11C7.75 11 8.8125 10.5625 9.6875 9.6875C10.5625 8.8125 11 7.75 11 6.5C11 5.25 10.5625 4.1875 9.6875 3.3125C8.8125 2.4375 7.75 2 6.5 2C5.25 2 4.1875 2.4375 3.3125 3.3125C2.4375 4.1875 2 5.25 2 6.5C2 7.75 2.4375 8.8125 3.3125 9.6875C4.1875 10.5625 5.25 11 6.5 11ZM4 7.5V5.5H9V7.5H4Z\"\n fill=\"currentColor\"\n />\n </svg>\n);\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import {a as a$1}from'./chunk-QWPVIX2T.mjs';import {useEffect,useRef}from'react';var j=a$1(async e=>{let t=[],r=a$1(async o=>{if(o.isFile){let c=await new Promise((i,h)=>{o.file(i,h);});c.folder_path=o.fullPath.split("/").slice(0,-1).join("/"),t.push(c);}else if(o.isDirectory){let c=o.createReader(),i=a$1(async()=>{let h=await new Promise((w,b)=>{c.readEntries(w,b);});h.length!==0&&(await Promise.all(h.map(w=>r(w))),await i());},"readEntries");await i();}},"readEntry");return await Promise.all(Array.from(e).map(async o=>{let c=o.webkitGetAsEntry();c&&await r(c);})),t},"getFilesFromDataTransfer"),u=0,d=null,p=new Set,y=new Map,L=a$1(e=>{if(y.has(e))return;let t=e.offsetWidth-e.clientWidth,r=window.getComputedStyle(e);y.set(e,{overflow:e.style.overflow,paddingRight:e.style.paddingRight}),e.style.overflow="hidden",t>0&&(e.style.paddingRight=`${parseInt(r.paddingRight)+t}px`);},"lockTarget"),k=a$1(e=>{let t=y.get(e);t&&(e.style.overflow=t.overflow,e.style.paddingRight=t.paddingRight,y.delete(e));},"unlockTarget"),C=a$1(e=>{useEffect(()=>{if(!(!e||typeof window>"u")){if(u===0){let t=window.getComputedStyle(document.body),r=window.innerWidth-document.documentElement.clientWidth;d={overflow:t.overflow,paddingRight:t.paddingRight},document.body.style.overflow="hidden",document.body.style.paddingRight=`${parseInt(d.paddingRight)+r}px`,p.forEach(L);}return u++,()=>{u--,u===0&&d&&(document.body.style.overflow=d.overflow,document.body.style.paddingRight=d.paddingRight,d=null,p.forEach(k));}}},[e]);},"useBodyScrollLock"),I=a$1(e=>{useEffect(()=>{let t=e.current;if(t)return p.add(t),u>0&&L(t),()=>{p.delete(t),k(t);}},[e]);},"useScrollLockTarget"),l=[],m=a$1(e=>{let r=l[l.length-1]?.current??null,o=e.target;r&&o&&r.contains(o)||o&&o.closest?.("[data-scroll-allow]")||e.preventDefault();},"onGuardedScroll"),O=a$1(()=>{document.addEventListener("wheel",m,{passive:false,capture:true}),document.addEventListener("touchmove",m,{passive:false,capture:true});},"attachScrollGuard"),F=a$1(()=>{document.removeEventListener("wheel",m,true),document.removeEventListener("touchmove",m,true);},"detachScrollGuard"),B=a$1(e=>{useEffect(()=>{if(!(typeof window>"u"))return l.push(e),l.length===1&&O(),()=>{let t=l.lastIndexOf(e);t>=0&&l.splice(t,1),l.length===0&&F();}},[e]);},"useScrollGuard"),s=[],g=false;function R(e){if(e.key==="Escape"&&s.length>0){let t=s[s.length-1];try{t.handler();}catch(r){console.error("useEscapeLayer handler error:",r);}}}a$1(R,"handleGlobalEscape");function T(){g||(document.addEventListener("keydown",R),g=true);}a$1(T,"attachEscapeListener");function x(){g&&s.length===0&&(document.removeEventListener("keydown",R),g=false);}a$1(x,"detachEscapeListener");function P(){for(;s.length>0&&s[s.length-1].autoDismiss;){let e=s.pop();try{e.handler();}catch(t){console.error("useEscapeLayer autoDismiss error:",t);}}}a$1(P,"dismissAutoDismissLayers");var _=a$1((e,t=true,r=false)=>{let o=useRef(e);o.current=e,useEffect(()=>{if(!t)return;r||P();let c={handler:a$1(()=>o.current(),"handler"),autoDismiss:r};return s.push(c),T(),()=>{let i=s.indexOf(c);i!==-1&&s.splice(i,1),x();}},[t,r]);},"useEscapeLayer"),a=[],E=false,W=[".cb-ui-context-menu",".cb-ui-backdrop"];function S(e){if(a.length===0)return;let t=e.target;if(!t)return;for(let o of W)if(t.closest(o))return;let r=a[a.length-1];if(r.ref.current&&!r.ref.current.contains(t))try{r.handler();}catch(o){console.error("useOutclickLayer handler error:",o);}}a$1(S,"handleGlobalOutclick");function G(){E||(document.addEventListener("mousedown",S),E=true);}a$1(G,"attachOutclickListener");function M(){E&&a.length===0&&(document.removeEventListener("mousedown",S),E=false);}a$1(M,"detachOutclickListener");var A=a$1((e,t,r=true)=>{let o=useRef(t);o.current=t,useEffect(()=>{if(!r)return;let c={ref:e,handler:a$1(()=>o.current(),"handler")};return a.push(c),G(),()=>{let i=a.indexOf(c);i!==-1&&a.splice(i,1),M();}},[r,e]);},"useOutclickLayer");export{j as a,C as b,I as c,B as d,_ as e,A as f};//# sourceMappingURL=chunk-XP4PPF7V.mjs.map
|
|
2
|
+
//# sourceMappingURL=chunk-XP4PPF7V.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils.ts"],"names":["getFilesFromDataTransfer","__name","dataTransferItems","files","readEntry","entry","file","resolve","reject","reader","readEntries","entries","e","item","scrollLockCount","savedBodyStyles","scrollLockTargets","savedTargetStyles","lockTarget","el","scrollBarWidth","computed","unlockTarget","saved","useBodyScrollLock","isLocked","useEffect","originalStyle","useScrollLockTarget","ref","scrollGuardStack","onGuardedScroll","panel","target","attachScrollGuard","detachScrollGuard","useScrollGuard","panelRef","i","escapeStack","isEscapeListenerAttached","handleGlobalEscape","top","error","attachEscapeListener","detachEscapeListener","dismissAutoDismissLayers","useEscapeLayer","onEscape","isActive","autoDismiss","callbackRef","useRef","idx","outclickStack","isOutclickListenerAttached","OUTCLICK_IGNORE_SELECTORS","handleGlobalOutclick","selector","attachOutclickListener","detachOutclickListener","useOutclickLayer","onOutclick"],"mappings":"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","file":"chunk-XP4PPF7V.mjs","sourcesContent":["import React, { useEffect, useRef } from 'react';\n\nexport type FileWithFolderPath = File & { folder_path?: string };\n\nexport const getFilesFromDataTransfer = async (\n dataTransferItems: DataTransferItemList\n): Promise<FileWithFolderPath[]> => {\n const files: FileWithFolderPath[] = [];\n\n const readEntry = async (entry: FileSystemEntry): Promise<void> => {\n if (entry.isFile) {\n const file = await new Promise<FileWithFolderPath>((resolve, reject) => {\n (entry as FileSystemFileEntry).file(resolve, reject);\n });\n file.folder_path = entry.fullPath.split('/').slice(0, -1).join('/');\n files.push(file);\n } else if (entry.isDirectory) {\n const reader = (entry as FileSystemDirectoryEntry).createReader();\n const readEntries = async (): Promise<void> => {\n const entries = await new Promise<FileSystemEntry[]>((resolve, reject) => {\n reader.readEntries(resolve, reject);\n });\n if (entries.length === 0) return;\n await Promise.all(entries.map((e) => readEntry(e)));\n await readEntries();\n };\n await readEntries();\n }\n };\n\n await Promise.all(\n Array.from(dataTransferItems).map(async (item) => {\n const entry = item.webkitGetAsEntry();\n if (entry) await readEntry(entry);\n })\n );\n return files;\n};\n\n/**\n * Hook для блокування скролу body та збереження позиції контенту.\n * Використовує лічильник — скрол блокується при першому виклику\n * і розблоковується лише коли всі блокування зняті.\n *\n * Сторінки можуть мати власний внутрішній скрол-контейнер (наприклад,\n * колонка SplitterLayout з overflow-y-auto, коли body має h-dvh\n * overflow-hidden). У такому разі блокування body неефективне — реальний\n * скрол відбувається всередині. Зареєструвати такий контейнер можна через\n * useScrollLockTarget(ref): його overflow тимчасово стане 'hidden' на час\n * активного блокування і відновиться після зняття.\n */\nlet scrollLockCount = 0;\nlet savedBodyStyles: { overflow: string; paddingRight: string } | null = null;\n\nconst scrollLockTargets = new Set<HTMLElement>();\nconst savedTargetStyles = new Map<HTMLElement, { overflow: string; paddingRight: string }>();\n\nconst lockTarget = (el: HTMLElement) => {\n if (savedTargetStyles.has(el)) return;\n // Компенсуємо ширину вертикального скролбара контейнера, щоб контент\n // не стрибав горизонтально при overflow: hidden.\n const scrollBarWidth = el.offsetWidth - el.clientWidth;\n const computed = window.getComputedStyle(el);\n savedTargetStyles.set(el, {\n overflow: el.style.overflow,\n paddingRight: el.style.paddingRight,\n });\n el.style.overflow = 'hidden';\n if (scrollBarWidth > 0) {\n el.style.paddingRight = `${parseInt(computed.paddingRight) + scrollBarWidth}px`;\n }\n};\n\nconst unlockTarget = (el: HTMLElement) => {\n const saved = savedTargetStyles.get(el);\n if (!saved) return;\n el.style.overflow = saved.overflow;\n el.style.paddingRight = saved.paddingRight;\n savedTargetStyles.delete(el);\n};\n\nexport const useBodyScrollLock = (isLocked: boolean) => {\n useEffect(() => {\n if (!isLocked || typeof window === 'undefined') return;\n\n if (scrollLockCount === 0) {\n const originalStyle = window.getComputedStyle(document.body);\n const scrollBarWidth = window.innerWidth - document.documentElement.clientWidth;\n savedBodyStyles = {\n overflow: originalStyle.overflow,\n paddingRight: originalStyle.paddingRight,\n };\n document.body.style.overflow = 'hidden';\n document.body.style.paddingRight = `${parseInt(savedBodyStyles.paddingRight) + scrollBarWidth}px`;\n scrollLockTargets.forEach(lockTarget);\n }\n scrollLockCount++;\n\n return () => {\n scrollLockCount--;\n if (scrollLockCount === 0 && savedBodyStyles) {\n document.body.style.overflow = savedBodyStyles.overflow;\n document.body.style.paddingRight = savedBodyStyles.paddingRight;\n savedBodyStyles = null;\n scrollLockTargets.forEach(unlockTarget);\n }\n };\n }, [isLocked]);\n};\n\n/**\n * Реєструє додатковий scroll-контейнер, який треба блокувати разом із body\n * на час дії useBodyScrollLock. Якщо лок уже активний на момент монтування —\n * контейнер блокується одразу.\n */\nexport const useScrollLockTarget = (ref: React.RefObject<HTMLElement | null>) => {\n useEffect(() => {\n const el = ref.current;\n if (!el) return;\n scrollLockTargets.add(el);\n if (scrollLockCount > 0) lockTarget(el);\n return () => {\n scrollLockTargets.delete(el);\n unlockTarget(el);\n };\n }, [ref]);\n};\n\n/**\n * Подієвий («scoped») guard скролу для модальних оверлеїв.\n *\n * useBodyScrollLock виставляє overflow:hidden лише на body. Якщо реальний\n * скрол-контейнер сторінки — не body, а вкладений div (наприклад\n * `.datagrid-body-scroll` у DataGrid), фон під оверлеєм лишається\n * прокручуваним, а чи «протікає» wheel у нього — залежить від scroll-chaining,\n * який різниться між браузерами/платформами (звідси «не блокує в Chrome на\n * Ubuntu»).\n *\n * Guard перехоплює wheel/touchmove у capture-фазі та скасовує default для\n * будь-якої події ПОЗА активною панеллю — незалежно від того, який саме\n * контейнер під нею. Скрол УСЕРЕДИНІ панелі (включно з вкладеними скролерами\n * та гридами в самому дровері/модалці) працює природно.\n *\n * Стек панелей дає коректну семантику для вкладених оверлеїв: активна лише\n * верхня панель, тож скрол у модалці поверх дровера дозволено, а у дровері\n * під нею — заблоковано.\n *\n * Escape-hatch: елемент із атрибутом `data-scroll-allow` (та його нащадки)\n * скролиться навіть поза панеллю — для рідкісних випадків портованих\n * скрол-контейнерів, що рендеряться в body повз піддерево панелі.\n */\nconst scrollGuardStack: React.RefObject<HTMLElement | null>[] = [];\n\nconst onGuardedScroll = (e: Event) => {\n const top = scrollGuardStack[scrollGuardStack.length - 1];\n const panel = top?.current ?? null;\n const target = e.target as Element | null;\n if (panel && target && panel.contains(target)) return;\n if (target && target.closest?.('[data-scroll-allow]')) return;\n e.preventDefault();\n};\n\nconst attachScrollGuard = () => {\n document.addEventListener('wheel', onGuardedScroll, { passive: false, capture: true });\n document.addEventListener('touchmove', onGuardedScroll, { passive: false, capture: true });\n};\n\nconst detachScrollGuard = () => {\n document.removeEventListener('wheel', onGuardedScroll, true);\n document.removeEventListener('touchmove', onGuardedScroll, true);\n};\n\nexport const useScrollGuard = (panelRef: React.RefObject<HTMLElement | null>) => {\n useEffect(() => {\n if (typeof window === 'undefined') return;\n scrollGuardStack.push(panelRef);\n if (scrollGuardStack.length === 1) attachScrollGuard();\n return () => {\n const i = scrollGuardStack.lastIndexOf(panelRef);\n if (i >= 0) scrollGuardStack.splice(i, 1);\n if (scrollGuardStack.length === 0) detachScrollGuard();\n };\n }, [panelRef]);\n};\n\n/**\n * Глобальний стек для управління Escape шарами.\n * При натисканні Escape викликається тільки останній (найвищий) callback.\n *\n * autoDismiss шари (Select) автоматично закриваються\n * коли над ними реєструється новий шар.\n */\ntype EscapeStackEntry = {\n handler: () => void;\n autoDismiss: boolean;\n};\n\nconst escapeStack: EscapeStackEntry[] = [];\nlet isEscapeListenerAttached = false;\n\nfunction handleGlobalEscape(e: KeyboardEvent) {\n if (e.key === 'Escape' && escapeStack.length > 0) {\n const top = escapeStack[escapeStack.length - 1];\n try {\n top.handler();\n } catch (error) {\n console.error('useEscapeLayer handler error:', error);\n }\n }\n}\n\nfunction attachEscapeListener() {\n if (!isEscapeListenerAttached) {\n document.addEventListener('keydown', handleGlobalEscape);\n isEscapeListenerAttached = true;\n }\n}\n\nfunction detachEscapeListener() {\n if (isEscapeListenerAttached && escapeStack.length === 0) {\n document.removeEventListener('keydown', handleGlobalEscape);\n isEscapeListenerAttached = false;\n }\n}\n\nfunction dismissAutoDismissLayers() {\n while (escapeStack.length > 0 && escapeStack[escapeStack.length - 1].autoDismiss) {\n const entry = escapeStack.pop()!;\n try {\n entry.handler();\n } catch (error) {\n console.error('useEscapeLayer autoDismiss error:', error);\n }\n }\n}\n\n/**\n * Хук для реєстрації компонента у глобальному стеку Escape.\n * При натисканні Escape закривається тільки найвищий шар (LIFO).\n */\nexport const useEscapeLayer = (onEscape: () => void, isActive: boolean = true, autoDismiss: boolean = false) => {\n const callbackRef = useRef(onEscape);\n callbackRef.current = onEscape;\n\n useEffect(() => {\n if (!isActive) return;\n\n if (!autoDismiss) {\n dismissAutoDismissLayers();\n }\n\n const entry: EscapeStackEntry = {\n handler: () => callbackRef.current(),\n autoDismiss,\n };\n escapeStack.push(entry);\n attachEscapeListener();\n\n return () => {\n const idx = escapeStack.indexOf(entry);\n if (idx !== -1) escapeStack.splice(idx, 1);\n detachEscapeListener();\n };\n }, [isActive, autoDismiss]);\n};\n\n/**\n * Глобальний стек для управління outclick шарами.\n * При кліку поза компонентом закривається тільки найвищий (останній) шар.\n */\ntype OutclickStackEntry = {\n ref: React.RefObject<Element | null>;\n handler: () => void;\n};\n\nconst outclickStack: OutclickStackEntry[] = [];\nlet isOutclickListenerAttached = false;\n\nconst OUTCLICK_IGNORE_SELECTORS = ['.cb-ui-context-menu', '.cb-ui-backdrop'];\n\nfunction handleGlobalOutclick(e: MouseEvent) {\n if (outclickStack.length === 0) return;\n\n const target = e.target as Element;\n if (!target) return;\n\n for (const selector of OUTCLICK_IGNORE_SELECTORS) {\n if (target.closest(selector)) return;\n }\n\n const top = outclickStack[outclickStack.length - 1];\n if (top.ref.current && !top.ref.current.contains(target)) {\n try {\n top.handler();\n } catch (error) {\n console.error('useOutclickLayer handler error:', error);\n }\n }\n}\n\nfunction attachOutclickListener() {\n if (!isOutclickListenerAttached) {\n document.addEventListener('mousedown', handleGlobalOutclick);\n isOutclickListenerAttached = true;\n }\n}\n\nfunction detachOutclickListener() {\n if (isOutclickListenerAttached && outclickStack.length === 0) {\n document.removeEventListener('mousedown', handleGlobalOutclick);\n isOutclickListenerAttached = false;\n }\n}\n\n/**\n * Хук для реєстрації компонента у глобальному стеку outclick.\n * При кліку поза компонентом закривається тільки найвищий шар (LIFO).\n */\nexport const useOutclickLayer = (\n ref: React.RefObject<Element | null>,\n onOutclick: () => void,\n isActive: boolean = true\n) => {\n const callbackRef = useRef(onOutclick);\n callbackRef.current = onOutclick;\n\n useEffect(() => {\n if (!isActive) return;\n\n const entry: OutclickStackEntry = {\n ref,\n handler: () => callbackRef.current(),\n };\n outclickStack.push(entry);\n attachOutclickListener();\n\n return () => {\n const idx = outclickStack.indexOf(entry);\n if (idx !== -1) outclickStack.splice(idx, 1);\n detachOutclickListener();\n };\n }, [isActive, ref]);\n};\n"]}
|