@nethesis/phone-island 0.10.0 → 0.10.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/AudioBars.js +1 -1
- package/dist/components/AudioBars.js.map +1 -1
- package/dist/components/SettingsView/AudioView.js +1 -1
- package/dist/components/SettingsView/AudioView.js.map +1 -1
- package/dist/components/SettingsView/MicrophoneView.js +1 -1
- package/dist/components/SettingsView/MicrophoneView.js.map +1 -1
- package/dist/components/SideView/SideView.js +1 -1
- package/dist/components/SideView/SideView.js.map +1 -1
- package/dist/index.css +1 -1
- package/dist/lib/i18n.js.map +1 -1
- package/dist/utils/deviceUtils.js +1 -1
- package/dist/utils/deviceUtils.js.map +1 -1
- package/package.json +3 -2
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../node_modules/react-redux/es/index.js");var r=require("../store/index.js"),t=require("../node_modules/react-redux/es/hooks/useDispatch.js");function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var u=n(e),
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../node_modules/react-redux/es/index.js");var r=require("../store/index.js"),t=require("../node_modules/react-redux/es/hooks/useDispatch.js");function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var u=n(e),i={large:{0:4,1:3,2:2,3:1,4:1,5:2,6:3,7:4},small:{0:2,1:1,2:1,3:2}};exports.AudioBars=function(n){var a=n.audioStream,c=void 0===a?null:a,o=n.audioElement,s=void 0===o?null:o,l=n.paused,d=void 0!==l&&l,m=n.size,f=void 0===m?"large":m,p=e.useRef(null),v=e.useRef(null),y=e.useRef(null),h=e.useRef(null),A=e.useRef(null),E=i[f],B=t.useDispatch(),x=e.useCallback((function(){var e;if(h.current&&(null===(e=p.current)||void 0===e?void 0:e.children))try{var r=new Uint8Array(h.current.frequencyBinCount);h.current.getByteFrequencyData(r);for(var t=p.current.children,n=Object.keys(E).length,u=0;u<n;++u){var i=r[E[u]]/255,a=t[u];a&&(a.style.height=i>0?"".concat(100*i,"%"):"0%")}d||(v.current=requestAnimationFrame(x))}catch(e){console.error("AudioBars animation error:",e)}}),[E,d]);return e.useEffect((function(){var e=function(){v.current&&(cancelAnimationFrame(v.current),v.current=null)},t=function(){if(A.current)try{A.current.disconnect()}catch(e){}};if(c&&!c.active)return console.warn("AudioBars: audio stream is not active"),e;try{var n=r.store.getState().audioBars,u=n.audioElementContext,i=n.audioElementAnalyser,a=n.audioElementSource,o=n.isReady;s&&o?(y.current=u,h.current=i,A.current=a):(y.current=new AudioContext,h.current=y.current.createAnalyser(),h.current.smoothingTimeConstant=.8,h.current.fftSize=32,c?A.current=y.current.createMediaStreamSource(c):s&&(A.current=y.current.createMediaElementSource(s),B.audioBars.setAudioElementContext(y.current),B.audioBars.setAudioElementAnalyser(h.current),B.audioBars.setAudioElementSource(A.current),B.audioBars.setIsReady(!0))),h.current&&A.current&&(t(),A.current.connect(h.current),s&&h.current.connect(y.current.destination),d||(e(),v.current=requestAnimationFrame(x)))}catch(r){console.error("AudioBars initialization error:",r),e()}return function(){e(),t()}}),[c,s,x,B.audioBars,d]),e.useEffect((function(){h.current&&(v.current&&(cancelAnimationFrame(v.current),v.current=null),d||(v.current=requestAnimationFrame(x)))}),[f,d,x]),u.default.createElement("div",{className:"".concat("small"===f?"pi-h-6 pi-w-6":"pi-h-12 pi-w-12"," pi-flex pi-justify-center pi-items-center")},u.default.createElement("div",{className:"".concat("small"===f?"pi-h-6":"pi-h-8"," pi-w-fit pi-flex pi-justify-center pi-items-center pi-gap-1 pi-overflow-hidden"),ref:p},(c||s)&&Object.keys(E).map((function(e){return u.default.createElement("span",{key:e,className:"pi-bg-emerald-700 dark:pi-bg-emerald-600 pi-w-0.5 pi-rounded-sm"})}))))};
|
|
2
2
|
//# sourceMappingURL=AudioBars.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AudioBars.js","sources":["../../src/components/AudioBars.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, useEffect, useRef } from 'react'\nimport { ContextSourceType } from '../models/audioBars'\nimport { useDispatch } from 'react-redux'\nimport { store } from '../store'\nimport { Dispatch } from '../store'\n\n// The map for the large versione of the audio bars\nconst LARGE = {\n 0: 4,\n 1: 3,\n 2: 2,\n 3: 1,\n 4: 1,\n 5: 2,\n 6: 3,\n 7: 4,\n}\n\n// The map for the small versione of the audio bars\nconst SMALL = {\n 0: 2,\n 1: 1,\n 2: 1,\n 3: 2,\n}\n\n/**\n * This component shows a dynamic audio spectrum given an audio stream\n *\n * @param audioStream An audio stream to analyse\n * @param audioElement An audio element to analyse\n */\nexport const AudioBars: FC<AudioBarsProps> = ({\n audioStream = null,\n audioElement = null,\n paused,\n size,\n}) => {\n // Initialize the main elements\n const containerElement = useRef<HTMLDivElement | null>(null)\n const animationRequest = useRef<number | null>(null)\n const barsMap: BarsMapType = size === 'large' ? LARGE : SMALL\n const context = useRef<AudioContext | null>(null)\n const analyser = useRef<AnalyserNode | null>(null)\n const source = useRef<ContextSourceType>(null)\n const dispatch = useDispatch<Dispatch>()\n\n function saveAnimationRequest(requestId: number) {\n if (requestId) {\n animationRequest.current = requestId\n }\n }\n\n // The function that renders the frames of animation\n function animation() {\n if (analyser && analyser.current) {\n const frequencyData = new Uint8Array(analyser.current.frequencyBinCount)\n analyser.current.getByteFrequencyData(frequencyData)\n const values = Object.values(frequencyData)\n\n const bars = containerElement.current?.children\n if (bars && bars?.length > 0) {\n // Change styles to every bar\n for (let i = 0; i < Object.keys(barsMap).length; ++i) {\n const value = values[barsMap[i]] / 255\n // @ts-ignore\n const barStyles = bars && bars[i] && bars[i].style\n if (barStyles && value > 0) {\n barStyles.height = `${100 * value}%`\n }\n }\n startAnimation()\n }\n }\n }\n\n function startAnimation() {\n const animationRequestId: number = requestAnimationFrame(animation)\n saveAnimationRequest(animationRequestId)\n }\n\n useEffect(() => {\n const { audioElementContext, audioElementAnalyser, audioElementSource, isReady } =\n store.getState().audioBars\n // Initialize audio context and analyser once\n if (audioElement && isReady) {\n // The source is an audio element\n context.current = audioElementContext\n analyser.current = audioElementAnalyser\n source.current = audioElementSource\n } else {\n // The source is an audio stream or isn't ready\n context.current = new AudioContext()\n analyser.current = context.current.createAnalyser()\n analyser.current.smoothingTimeConstant = 0.8\n analyser.current.fftSize = 32\n // Create the media source stream\n if (audioStream) {\n source.current = context.current.createMediaStreamSource(audioStream)\n } else if (audioElement) {\n source.current = context.current.createMediaElementSource(audioElement)\n // Save the audio elements to stores\n dispatch.audioBars.setAudioElementContext(context.current)\n dispatch.audioBars.setAudioElementAnalyser(analyser.current)\n dispatch.audioBars.setAudioElementSource(source.current)\n dispatch.audioBars.setIsReady(true)\n }\n }\n\n // Connect the audio source to the analyser\n analyser.current && source.current && source.current.connect(analyser.current)\n if (audioElement) {\n // Connect the analyser to the destination of the context\n context.current && analyser.current && analyser.current.connect(context.current.destination)\n }\n startAnimation()\n\n // Cleanup bars animation\n return () => {\n animationRequest.current && cancelAnimationFrame(animationRequest.current)\n source.current?.disconnect()\n }\n }, [])\n\n useEffect(() => {\n if (animationRequest.current) {\n if (!paused) {\n cancelAnimationFrame(animationRequest.current)\n startAnimation()\n } else {\n cancelAnimationFrame(animationRequest.current)\n }\n }\n }, [size, paused])\n\n return (\n <div\n className={`${\n size === 'small' ? 'pi-h-6 pi-w-6' : 'pi-h-12 pi-w-12'\n } pi-flex pi-justify-center pi-items-center`}\n >\n {/* The bars container */}\n <div\n className={`${\n size === 'small' ? 'pi-h-6' : 'pi-h-8'\n } pi-w-fit pi-flex pi-justify-center pi-items-center pi-gap-1 pi-overflow-hidden`}\n ref={containerElement}\n >\n {/* Every single bar */}\n {(audioStream || audioElement) &&\n Object.keys(barsMap).map((key) => (\n <span key={key} className='pi-bg-emerald-700 dark:pi-bg-emerald-600 pi-w-0.5 pi-rounded-sm'></span>\n ))}\n </div>\n </div>\n )\n}\n\ninterface AudioBarsProps {\n audioStream?: MediaStream | null\n audioElement?: HTMLAudioElement | null\n size?: 'large' | 'small'\n paused?: boolean\n}\n\ninterface BarsMapType {\n [key: number]: number\n}\n"],"names":["LARGE","SMALL","_a","_b","audioStream","_c","audioElement","paused","size","containerElement","useRef","animationRequest","barsMap","context","analyser","source","dispatch","useDispatch","animation","current","frequencyData","Uint8Array","frequencyBinCount","getByteFrequencyData","values","Object","bars","children","length","i","keys","value","barStyles","style","height","concat","startAnimation","requestId","animationRequestId","requestAnimationFrame","useEffect","store","getState","audioBars","audioElementContext","audioElementAnalyser","audioElementSource","isReady","AudioContext","createAnalyser","smoothingTimeConstant","fftSize","createMediaStreamSource","createMediaElementSource","setAudioElementContext","setAudioElementAnalyser","setAudioElementSource","setIsReady","connect","destination","cancelAnimationFrame","disconnect","React","createElement","className","ref","map","key"],"mappings":"qUAUMA,EAAQ,CACZ,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,GAICC,EAAQ,CACZ,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,qBASwC,SAACC,GAC5C,IAAAC,EAAAD,EAAAE,YAAAA,OAAW,IAAAD,EAAG,KAAIA,EAClBE,EAAmBH,EAAAI,aAAnBA,OAAY,IAAAD,EAAG,KAAIA,EACnBE,EAAML,EAAAK,OACNC,EAAIN,EAAAM,KAGEC,EAAmBC,SAA8B,MACjDC,EAAmBD,SAAsB,MACzCE,EAAgC,UAATJ,EAAmBR,EAAQC,EAClDY,EAAUH,SAA4B,MACtCI,EAAWJ,SAA4B,MACvCK,EAASL,SAA0B,MACnCM,EAAWC,EAAAA,cASjB,SAASC,UACP,GAAIJ,GAAYA,EAASK,QAAS,CAChC,IAAMC,EAAgB,IAAIC,WAAWP,EAASK,QAAQG,mBACtDR,EAASK,QAAQI,qBAAqBH,GACtC,IAAMI,EAASC,OAAOD,OAAOJ,GAEvBM,EAA+B,QAAxBxB,EAAAO,EAAiBU,eAAO,IAAAjB,OAAA,EAAAA,EAAEyB,SACvC,GAAID,IAAQA,aAAA,EAAAA,EAAME,QAAS,EAAG,CAE5B,IAAK,IAAIC,EAAI,EAAGA,EAAIJ,OAAOK,KAAKlB,GAASgB,SAAUC,EAAG,CACpD,IAAME,EAAQP,EAAOZ,EAAQiB,IAAM,IAE7BG,EAAYN,GAAQA,EAAKG,IAAMH,EAAKG,GAAGI,MACzCD,GAAaD,EAAQ,IACvBC,EAAUE,OAAS,GAAAC,OAAG,IAAMJ,OAE/B,CACDK,GACD,CACF,CACF,CAED,SAASA,IACP,IA9B4BC,EA8BtBC,EAA6BC,sBAAsBrB,IA9B7BmB,EA+BPC,KA7BnB3B,EAAiBQ,QAAUkB,EA8B9B,CAwDD,OAtDAG,EAAAA,WAAU,WACF,IAAAtC,EACJuC,EAAAA,MAAMC,WAAWC,UADXC,wBAAqBC,yBAAsBC,uBAAoBC,YAoCvE,OAjCIzC,GAAgByC,GAElBlC,EAAQM,QAAUyB,EAClB9B,EAASK,QAAU0B,EACnB9B,EAAOI,QAAU2B,IAGjBjC,EAAQM,QAAU,IAAI6B,aACtBlC,EAASK,QAAUN,EAAQM,QAAQ8B,iBACnCnC,EAASK,QAAQ+B,sBAAwB,GACzCpC,EAASK,QAAQgC,QAAU,GAEvB/C,EACFW,EAAOI,QAAUN,EAAQM,QAAQiC,wBAAwBhD,GAChDE,IACTS,EAAOI,QAAUN,EAAQM,QAAQkC,yBAAyB/C,GAE1DU,EAAS2B,UAAUW,uBAAuBzC,EAAQM,SAClDH,EAAS2B,UAAUY,wBAAwBzC,EAASK,SACpDH,EAAS2B,UAAUa,sBAAsBzC,EAAOI,SAChDH,EAAS2B,UAAUc,YAAW,KAKlC3C,EAASK,SAAWJ,EAAOI,SAAWJ,EAAOI,QAAQuC,QAAQ5C,EAASK,SAClEb,GAEFO,EAAQM,SAAWL,EAASK,SAAWL,EAASK,QAAQuC,QAAQ7C,EAAQM,QAAQwC,aAElFvB,IAGO,iBACLzB,EAAiBQ,SAAWyC,qBAAqBjD,EAAiBQ,SAClD,QAAhBjB,EAAAa,EAAOI,eAAS,IAAAjB,GAAAA,EAAA2D,YAClB,CACD,GAAE,IAEHrB,EAAAA,WAAU,WACJ7B,EAAiBQ,UACdZ,EAIHqD,qBAAqBjD,EAAiBQ,UAHtCyC,qBAAqBjD,EAAiBQ,SACtCiB,KAKN,GAAG,CAAC5B,EAAMD,IAGRuD,EACE,QAAAC,cAAA,MAAA,CAAAC,UAAW,GAAA7B,OACA,UAAT3B,EAAmB,gBAAkB,kBACK,+CAG5CsD,EACE,QAAAC,cAAA,MAAA,CAAAC,UAAW,GAAA7B,OACA,UAAT3B,EAAmB,SAAW,SAAQ,mFAExCyD,IAAKxD,IAGHL,GAAeE,IACfmB,OAAOK,KAAKlB,GAASsD,KAAI,SAACC,GAAQ,OAChCL,UAAAC,cAAA,OAAA,CAAMI,IAAKA,EAAKH,UAAU,mEAC3B,KAIX"}
|
|
1
|
+
{"version":3,"file":"AudioBars.js","sources":["../../src/components/AudioBars.tsx"],"sourcesContent":["// Copyright (C) 2025 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { type FC, useEffect, useRef, useCallback } from 'react'\nimport { ContextSourceType } from '../models/audioBars'\nimport { useDispatch } from 'react-redux'\nimport { store } from '../store'\nimport { Dispatch } from '../store'\n\n// The map for the large versione of the audio bars\nconst BARS_CONFIG = {\n large: {\n 0: 4,\n 1: 3,\n 2: 2,\n 3: 1,\n 4: 1,\n 5: 2,\n 6: 3,\n 7: 4,\n },\n // The map for the small versione of the audio bars\n\n small: {\n 0: 2,\n 1: 1,\n 2: 1,\n 3: 2,\n },\n}\n\ninterface AudioBarsProps {\n audioStream?: MediaStream | null\n audioElement?: HTMLAudioElement | null\n size?: 'large' | 'small'\n paused?: boolean\n}\n\ninterface BarsMapType {\n [key: number]: number\n}\n\n/**\n * This component shows a dynamic audio spectrum given an audio stream\n *\n * @param audioStream An audio stream to analyse\n * @param audioElement An audio element to analyse\n */\nexport const AudioBars: FC<AudioBarsProps> = ({\n audioStream = null,\n audioElement = null,\n paused = false,\n size = 'large',\n}) => {\n // Initialize the main elements\n const containerElement = useRef<HTMLDivElement | null>(null)\n const animationRequest = useRef<number | null>(null)\n const context = useRef<AudioContext | null>(null)\n const analyser = useRef<AnalyserNode | null>(null)\n const source = useRef<ContextSourceType>(null)\n\n const barsMap: BarsMapType = BARS_CONFIG[size]\n const dispatch = useDispatch<Dispatch>()\n\n // The function that renders the frames of animation\n const animate = useCallback(() => {\n if (!analyser.current || !containerElement.current?.children) {\n return\n }\n\n try {\n const frequencyData = new Uint8Array(analyser.current.frequencyBinCount)\n analyser.current.getByteFrequencyData(frequencyData)\n // Update the height of each bar based on frequency data\n const bars = containerElement.current.children\n const barCount = Object.keys(barsMap).length\n\n for (let i = 0; i < barCount; ++i) {\n const value = frequencyData[barsMap[i]] / 255\n const bar = bars[i] as HTMLElement\n\n if (bar) {\n bar.style.height = value > 0 ? `${100 * value}%` : '0%'\n }\n }\n\n // Continue animation if not paused\n if (!paused) {\n animationRequest.current = requestAnimationFrame(animate)\n }\n } catch (err) {\n console.error('AudioBars animation error:', err)\n }\n }, [barsMap, paused])\n\n // Handles audio configuration and animation\n useEffect(() => {\n // Clean up any previous animations\n const cleanupAnimation = () => {\n if (animationRequest.current) {\n cancelAnimationFrame(animationRequest.current)\n animationRequest.current = null\n }\n }\n\n // Disconnect audio source if it exists\n const disconnectSource = () => {\n if (source.current) {\n try {\n source.current.disconnect()\n } catch (e) {\n // Ignore disconnection errors\n }\n }\n }\n\n // Check if audio stream is active\n if (audioStream && !audioStream.active) {\n console.warn('AudioBars: audio stream is not active')\n return cleanupAnimation\n }\n\n try {\n const { audioElementContext, audioElementAnalyser, audioElementSource, isReady } =\n store.getState().audioBars\n\n // Initialize audio context and analyser once\n if (audioElement && isReady) {\n // The source is an audio element\n context.current = audioElementContext\n analyser.current = audioElementAnalyser\n source.current = audioElementSource\n } else {\n // The source is an audio stream or isn't ready\n context.current = new AudioContext()\n analyser.current = context.current.createAnalyser()\n analyser.current.smoothingTimeConstant = 0.8\n analyser.current.fftSize = 32\n\n // Create the media source stream\n if (audioStream) {\n source.current = context.current.createMediaStreamSource(audioStream)\n } else if (audioElement) {\n source.current = context.current.createMediaElementSource(audioElement)\n\n // Save audio elements to the store\n dispatch.audioBars.setAudioElementContext(context.current)\n dispatch.audioBars.setAudioElementAnalyser(analyser.current)\n dispatch.audioBars.setAudioElementSource(source.current)\n dispatch.audioBars.setIsReady(true)\n }\n }\n\n // Connect the audio source to the analyser\n if (analyser.current && source.current) {\n // Disconnect any existing connections\n disconnectSource()\n\n // Connect source -> analyser (-> destination if it's an audio element)\n source.current.connect(analyser.current)\n if (audioElement) {\n analyser.current.connect(context.current!.destination)\n }\n\n // Start animation if not paused\n if (!paused) {\n cleanupAnimation()\n animationRequest.current = requestAnimationFrame(animate)\n }\n }\n } catch (err) {\n console.error('AudioBars initialization error:', err)\n cleanupAnimation()\n }\n\n // Cleanup when component is unmounted\n return () => {\n cleanupAnimation()\n disconnectSource()\n }\n }, [audioStream, audioElement, animate, dispatch.audioBars, paused])\n\n // Handle paused state or size changes\n useEffect(() => {\n if (analyser.current) {\n // Stop current animation\n if (animationRequest.current) {\n cancelAnimationFrame(animationRequest.current)\n animationRequest.current = null\n }\n\n // Restart if not paused\n if (!paused) {\n animationRequest.current = requestAnimationFrame(animate)\n }\n }\n }, [size, paused, animate])\n\n return (\n <div\n className={`${\n size === 'small' ? 'pi-h-6 pi-w-6' : 'pi-h-12 pi-w-12'\n } pi-flex pi-justify-center pi-items-center`}\n >\n {/* The bars container */}\n <div\n className={`${\n size === 'small' ? 'pi-h-6' : 'pi-h-8'\n } pi-w-fit pi-flex pi-justify-center pi-items-center pi-gap-1 pi-overflow-hidden`}\n ref={containerElement}\n >\n {/* Every single bar */}\n {(audioStream || audioElement) &&\n Object.keys(barsMap).map((key) => (\n <span\n key={key}\n className='pi-bg-emerald-700 dark:pi-bg-emerald-600 pi-w-0.5 pi-rounded-sm'\n ></span>\n ))}\n </div>\n </div>\n )\n}\n"],"names":["BARS_CONFIG","large","small","_a","_b","audioStream","_c","audioElement","_d","paused","_e","size","containerElement","useRef","animationRequest","context","analyser","source","barsMap","dispatch","useDispatch","animate","useCallback","current","children","frequencyData","Uint8Array","frequencyBinCount","getByteFrequencyData","bars","barCount","Object","keys","length","i","value","bar","style","height","concat","requestAnimationFrame","err","console","error","useEffect","cleanupAnimation","cancelAnimationFrame","disconnectSource","disconnect","e","active","warn","store","getState","audioBars","audioElementContext","audioElementAnalyser","audioElementSource","isReady","AudioContext","createAnalyser","smoothingTimeConstant","fftSize","createMediaStreamSource","createMediaElementSource","setAudioElementContext","setAudioElementAnalyser","setAudioElementSource","setIsReady","connect","destination","React","createElement","className","ref","map","key"],"mappings":"qUAUMA,EAAc,CAClBC,MAAO,CACL,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,GAILC,MAAO,CACL,EAAG,EACH,EAAG,EACH,EAAG,EACH,EAAG,sBAqBsC,SAACC,OAC5CC,EAAkBD,EAAAE,YAAlBA,OAAW,IAAAD,EAAG,KAAIA,EAClBE,EAAmBH,EAAAI,aAAnBA,OAAY,IAAAD,EAAG,KAAIA,EACnBE,EAAcL,EAAAM,OAAdA,OAAM,IAAAD,GAAQA,EACdE,EAAAP,EAAAQ,KAAAA,OAAO,IAAAD,EAAA,QAAOA,EAGRE,EAAmBC,SAA8B,MACjDC,EAAmBD,SAAsB,MACzCE,EAAUF,SAA4B,MACtCG,EAAWH,SAA4B,MACvCI,EAASJ,SAA0B,MAEnCK,EAAuBlB,EAAYW,GACnCQ,EAAWC,EAAAA,cAGXC,EAAUC,EAAAA,aAAY,iBAC1B,GAAKN,EAASO,UAAsC,QAA1BpB,EAAAS,EAAiBW,eAAS,IAAApB,OAAA,EAAAA,EAAAqB,UAIpD,IACE,IAAMC,EAAgB,IAAIC,WAAWV,EAASO,QAAQI,mBACtDX,EAASO,QAAQK,qBAAqBH,GAKtC,IAHA,IAAMI,EAAOjB,EAAiBW,QAAQC,SAChCM,EAAWC,OAAOC,KAAKd,GAASe,OAE7BC,EAAI,EAAGA,EAAIJ,IAAYI,EAAG,CACjC,IAAMC,EAAQV,EAAcP,EAAQgB,IAAM,IACpCE,EAAMP,EAAKK,GAEbE,IACFA,EAAIC,MAAMC,OAASH,EAAQ,EAAI,GAAGI,OAAA,IAAMJ,EAAK,KAAM,KAEtD,CAGI1B,IACHK,EAAiBS,QAAUiB,sBAAsBnB,GAEpD,CAAC,MAAOoB,GACPC,QAAQC,MAAM,6BAA8BF,EAC7C,CACH,GAAG,CAACvB,EAAST,IAyGb,OAtGAmC,EAAAA,WAAU,WAER,IAAMC,EAAmB,WACnB/B,EAAiBS,UACnBuB,qBAAqBhC,EAAiBS,SACtCT,EAAiBS,QAAU,KAE/B,EAGMwB,EAAmB,WACvB,GAAI9B,EAAOM,QACT,IACEN,EAAOM,QAAQyB,YAChB,CAAC,MAAOC,GAER,CAEL,EAGA,GAAI5C,IAAgBA,EAAY6C,OAE9B,OADAR,QAAQS,KAAK,yCACNN,EAGT,IACQ,IAAA1C,EACJiD,EAAAA,MAAMC,WAAWC,UADXC,wBAAqBC,yBAAsBC,uBAAoBC,YAInEnD,GAAgBmD,GAElB3C,EAAQQ,QAAUgC,EAClBvC,EAASO,QAAUiC,EACnBvC,EAAOM,QAAUkC,IAGjB1C,EAAQQ,QAAU,IAAIoC,aACtB3C,EAASO,QAAUR,EAAQQ,QAAQqC,iBACnC5C,EAASO,QAAQsC,sBAAwB,GACzC7C,EAASO,QAAQuC,QAAU,GAGvBzD,EACFY,EAAOM,QAAUR,EAAQQ,QAAQwC,wBAAwB1D,GAChDE,IACTU,EAAOM,QAAUR,EAAQQ,QAAQyC,yBAAyBzD,GAG1DY,EAASmC,UAAUW,uBAAuBlD,EAAQQ,SAClDJ,EAASmC,UAAUY,wBAAwBlD,EAASO,SACpDJ,EAASmC,UAAUa,sBAAsBlD,EAAOM,SAChDJ,EAASmC,UAAUc,YAAW,KAK9BpD,EAASO,SAAWN,EAAOM,UAE7BwB,IAGA9B,EAAOM,QAAQ8C,QAAQrD,EAASO,SAC5BhB,GACFS,EAASO,QAAQ8C,QAAQtD,EAAQQ,QAAS+C,aAIvC7D,IACHoC,IACA/B,EAAiBS,QAAUiB,sBAAsBnB,IAGtD,CAAC,MAAOoB,GACPC,QAAQC,MAAM,kCAAmCF,GACjDI,GACD,CAGD,OAAO,WACLA,IACAE,GACF,CACF,GAAG,CAAC1C,EAAaE,EAAcc,EAASF,EAASmC,UAAW7C,IAG5DmC,EAAAA,WAAU,WACJ5B,EAASO,UAEPT,EAAiBS,UACnBuB,qBAAqBhC,EAAiBS,SACtCT,EAAiBS,QAAU,MAIxBd,IACHK,EAAiBS,QAAUiB,sBAAsBnB,IAGtD,GAAE,CAACV,EAAMF,EAAQY,IAGhBkD,EACE,QAAAC,cAAA,MAAA,CAAAC,UAAW,GAAAlC,OACA,UAAT5B,EAAmB,gBAAkB,kBACK,+CAG5C4D,EACE,QAAAC,cAAA,MAAA,CAAAC,UAAW,GAAAlC,OACA,UAAT5B,EAAmB,SAAW,SAAQ,mFAExC+D,IAAK9D,IAGHP,GAAeE,IACfwB,OAAOC,KAAKd,GAASyD,KAAI,SAACC,GAAQ,OAChCL,UAAAC,cAAA,OAAA,CACEI,IAAKA,EACLH,UAAU,mEAEb,KAIX"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../../node_modules/react-redux/es/index.js");var t=require("../../node_modules/@fortawesome/react-fontawesome/index.es.js"),
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../../node_modules/react-redux/es/index.js");var t=require("../../node_modules/@fortawesome/react-fontawesome/index.es.js"),r=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),i=require("../../utils/customHooks/useEventListener.js"),n=require("../../utils/genericFunctions/eventDispatch.js"),a=require("../../utils/genericFunctions/localStorage.js"),o=require("./SettingsHeader.js");require("../../node_modules/@babel/runtime/helpers/defineProperty.js"),require("../../node_modules/@babel/runtime/helpers/objectWithoutProperties.js"),require("../../node_modules/@babel/runtime/helpers/typeof.js"),require("../../node_modules/html-parse-stringify/dist/html-parse-stringify.js"),require("../../node_modules/react-i18next/dist/es/context.js");var u=require("../../node_modules/react-i18next/dist/es/useTranslation.js");require("../../node_modules/@babel/runtime/helpers/slicedToArray.js");var l=require("../../node_modules/react-redux/es/hooks/useSelector.js");function s(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var c=s(e);exports.default=function(){var s=l.useSelector((function(e){return e.player.remoteAudio})),d=u.useTranslation().t,p=e.useState(a.getJSONItem("phone-island-audio-output-device").deviceId||null),m=p[0],f=p[1],v=function(e){f(e),null==s||s.current.setSinkId(e).then((function(){console.info("Audio output device switch success!"),a.setJSONItem("phone-island-audio-output-device",{deviceId:e}),n.eventDispatch("phone-island-call-audio-output-switched",{})})).catch((function(e){console.error("Audio output device switch error:",e)}))};i.useEventListener("phone-island-call-audio-output-switch",(function(e){v(e.deviceId)}));var h=e.useState([]),g=h[0],b=h[1];e.useEffect((function(){var e=function(){navigator.mediaDevices.enumerateDevices().then((function(e){b(e)})).catch((function(e){console.error("error",e)}))};return e(),navigator.mediaDevices.addEventListener("devicechange",e),function(){navigator.mediaDevices.removeEventListener("devicechange",e)}}),[m]);var y=e.useState(null),x=y[0],k=y[1];return c.default.createElement("div",{className:"pi-flex pi-flex-col pi-w-full"},c.default.createElement(o.SettingsHeader,{title:d("Settings.Speakers"),tooltipPrefix:"audio"}),c.default.createElement("div",{className:"pi-flex pi-flex-col pi-mt-2 pi-space-y-1 pi-max-h-48 pi-overflow-y-auto pi-scrollbar-thin pi-scrollbar-thumb-gray-400 pi-dark:scrollbar-thumb-gray-400 pi-scrollbar-thumb-rounded-full pi-scrollbar-thumb-opacity-50 dark:pi-scrollbar-track-gray-900 pi-scrollbar-track-gray-200 pi-dark:scrollbar-track-gray-900 pi-scrollbar-track-rounded-full pi-scrollbar-track-opacity-25"},g.filter((function(e){return"audiooutput"===(null==e?void 0:e.kind)})).map((function(e,i){return c.default.createElement("div",{key:i,className:"pi-flex pi-items-center pi-justify-between pi-px-4 pi-py-3 pi-text-base pi-font-normal pi-leading-6 dark:pi-text-gray-200 pi-text-gray-700 hover:pi-bg-gray-200 dark:hover:pi-bg-gray-700 dark:pi-bg-gray-950 pi-bg-gray-50 pi-rounded-md",onClick:function(){return v(null==e?void 0:e.deviceId)},onMouseEnter:function(){return k(null==e?void 0:e.deviceId)},onMouseLeave:function(){return k(null)}},c.default.createElement("div",{className:"pi-flex pi-items-center"},c.default.createElement(t.FontAwesomeIcon,{icon:r.faVolumeHigh,className:"pi-mr-2 pi-w-5 pi-h-5"}),c.default.createElement("span",null,(null==e?void 0:e.label)||"Input device ".concat(i+1))),c.default.createElement("div",{className:"pi-flex pi-items-center"},m===(null==e?void 0:e.deviceId)&&c.default.createElement(t.FontAwesomeIcon,{icon:r.faCheck,className:"".concat(x===(null==e?void 0:e.deviceId)?"pi-text-gray-700 dark:pi-text-gray-200":"pi-text-emerald-700 dark:pi-text-emerald-500"," pi-w-5 pi-h-5")})))}))))};
|
|
2
2
|
//# sourceMappingURL=AudioView.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AudioView.js","sources":["../../../src/components/SettingsView/AudioView.tsx"],"sourcesContent":["// Copyright (C) 2025 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { useState, useEffect } from 'react'\nimport { useSelector } from 'react-redux'\nimport { RootState } from '../../store'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faCheck, faVolumeHigh } from '@fortawesome/free-solid-svg-icons'\nimport { eventDispatch, getJSONItem, setJSONItem, useEventListener } from '../../utils'\nimport { SettingsHeader } from './SettingsHeader'\nimport { useTranslation } from 'react-i18next'\n\nconst AudioView = () => {\n const remoteAudioElement: any = useSelector((state: RootState) => state.player.remoteAudio)\n\n const { t } = useTranslation()\n\n const [selectedAudioOutput, setSelectedAudioOutput] = useState<string | null>(\n getJSONItem('phone-island-audio-output-device').deviceId || null,\n )\n const handleClickAudioOutput = (audioOutputDevice: string) => {\n setSelectedAudioOutput(audioOutputDevice)\n\n remoteAudioElement?.current\n .setSinkId(audioOutputDevice)\n .then(function () {\n console.info('Audio output device switch success!')\n // set device to localstorage\n setJSONItem('phone-island-audio-output-device', { deviceId: audioOutputDevice })\n\n // dispatch event\n eventDispatch('phone-island-call-audio-output-switched', {})\n })\n .catch(function (err) {\n console.error('Audio output device switch error:', err)\n })\n }\n useEventListener('phone-island-call-audio-output-switch', (data: DeviceInputOutputTypes) => {\n handleClickAudioOutput(data.deviceId)\n })\n\n const [actualDevice, setActualDevice]: any = useState([])\n\n useEffect(() => {\n const checkInputOutputDevices = () => {\n navigator.mediaDevices\n .enumerateDevices()\n .then((deviceInfos) => {\n setActualDevice(deviceInfos)\n })\n .catch((error) => {\n console.error('error', error)\n })\n }\n\n checkInputOutputDevices()\n\n navigator.mediaDevices.addEventListener('devicechange', checkInputOutputDevices)\n\n return () => {\n navigator.mediaDevices.removeEventListener('devicechange', checkInputOutputDevices)\n }\n }, [selectedAudioOutput])\n\n const [hoveredDevice, setHoveredDevice] = useState<string | null>(null)\n\n return (\n <div className='pi-flex pi-flex-col pi-w-full'>\n {/* Title */}\n <SettingsHeader title={t('Settings.Speakers')} tooltipPrefix='audio' />\n {/* Audio List */}\n <div className='pi-flex pi-flex-col pi-mt-2 pi-space-y-1'>\n {actualDevice\n .filter((device) => device?.kind === '
|
|
1
|
+
{"version":3,"file":"AudioView.js","sources":["../../../src/components/SettingsView/AudioView.tsx"],"sourcesContent":["// Copyright (C) 2025 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { useState, useEffect } from 'react'\nimport { useSelector } from 'react-redux'\nimport { RootState } from '../../store'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faCheck, faVolumeHigh } from '@fortawesome/free-solid-svg-icons'\nimport { eventDispatch, getJSONItem, setJSONItem, useEventListener } from '../../utils'\nimport { SettingsHeader } from './SettingsHeader'\nimport { useTranslation } from 'react-i18next'\n\nconst AudioView = () => {\n const remoteAudioElement: any = useSelector((state: RootState) => state.player.remoteAudio)\n\n const { t } = useTranslation()\n\n const [selectedAudioOutput, setSelectedAudioOutput] = useState<string | null>(\n getJSONItem('phone-island-audio-output-device').deviceId || null,\n )\n const handleClickAudioOutput = (audioOutputDevice: string) => {\n setSelectedAudioOutput(audioOutputDevice)\n\n remoteAudioElement?.current\n .setSinkId(audioOutputDevice)\n .then(function () {\n console.info('Audio output device switch success!')\n // set device to localstorage\n setJSONItem('phone-island-audio-output-device', { deviceId: audioOutputDevice })\n\n // dispatch event\n eventDispatch('phone-island-call-audio-output-switched', {})\n })\n .catch(function (err) {\n console.error('Audio output device switch error:', err)\n })\n }\n useEventListener('phone-island-call-audio-output-switch', (data: DeviceInputOutputTypes) => {\n handleClickAudioOutput(data.deviceId)\n })\n\n const [actualDevice, setActualDevice]: any = useState([])\n\n useEffect(() => {\n const checkInputOutputDevices = () => {\n navigator.mediaDevices\n .enumerateDevices()\n .then((deviceInfos) => {\n setActualDevice(deviceInfos)\n })\n .catch((error) => {\n console.error('error', error)\n })\n }\n\n checkInputOutputDevices()\n\n navigator.mediaDevices.addEventListener('devicechange', checkInputOutputDevices)\n\n return () => {\n navigator.mediaDevices.removeEventListener('devicechange', checkInputOutputDevices)\n }\n }, [selectedAudioOutput])\n\n const [hoveredDevice, setHoveredDevice] = useState<string | null>(null)\n\n return (\n <div className='pi-flex pi-flex-col pi-w-full'>\n {/* Title */}\n <SettingsHeader title={t('Settings.Speakers')} tooltipPrefix='audio' />\n {/* Audio List */}\n <div className='pi-flex pi-flex-col pi-mt-2 pi-space-y-1 pi-max-h-48 pi-overflow-y-auto pi-scrollbar-thin pi-scrollbar-thumb-gray-400 pi-dark:scrollbar-thumb-gray-400 pi-scrollbar-thumb-rounded-full pi-scrollbar-thumb-opacity-50 dark:pi-scrollbar-track-gray-900 pi-scrollbar-track-gray-200 pi-dark:scrollbar-track-gray-900 pi-scrollbar-track-rounded-full pi-scrollbar-track-opacity-25'>\n {actualDevice\n .filter((device) => device?.kind === 'audiooutput')\n .map((audioDevice, index) => (\n <div\n key={index}\n className='pi-flex pi-items-center pi-justify-between pi-px-4 pi-py-3 pi-text-base pi-font-normal pi-leading-6 dark:pi-text-gray-200 pi-text-gray-700 hover:pi-bg-gray-200 dark:hover:pi-bg-gray-700 dark:pi-bg-gray-950 pi-bg-gray-50 pi-rounded-md'\n onClick={() => handleClickAudioOutput(audioDevice?.deviceId)}\n onMouseEnter={() => setHoveredDevice(audioDevice?.deviceId)}\n onMouseLeave={() => setHoveredDevice(null)}\n >\n <div className='pi-flex pi-items-center'>\n <FontAwesomeIcon icon={faVolumeHigh} className='pi-mr-2 pi-w-5 pi-h-5' />\n <span>{audioDevice?.label || `Input device ${index + 1}`}</span>\n </div>\n <div className='pi-flex pi-items-center'>\n {selectedAudioOutput === audioDevice?.deviceId && (\n <FontAwesomeIcon\n icon={faCheck}\n className={`${\n hoveredDevice === audioDevice?.deviceId\n ? 'pi-text-gray-700 dark:pi-text-gray-200'\n : 'pi-text-emerald-700 dark:pi-text-emerald-500'\n } pi-w-5 pi-h-5`}\n />\n )}\n </div>\n </div>\n ))}\n </div>\n </div>\n )\n}\n\ninterface DeviceInputOutputTypes {\n deviceId: string\n}\n\nexport default AudioView\n"],"names":["remoteAudioElement","useSelector","state","player","remoteAudio","t","useTranslation","_a","useState","getJSONItem","deviceId","selectedAudioOutput","setSelectedAudioOutput","handleClickAudioOutput","audioOutputDevice","current","setSinkId","then","console","info","setJSONItem","eventDispatch","catch","err","error","useEventListener","data","_b","actualDevice","setActualDevice","useEffect","checkInputOutputDevices","navigator","mediaDevices","enumerateDevices","deviceInfos","addEventListener","removeEventListener","_c","hoveredDevice","setHoveredDevice","React","createElement","className","SettingsHeader","title","tooltipPrefix","filter","device","kind","map","audioDevice","index","key","onClick","onMouseEnter","onMouseLeave","FontAwesomeIcon","icon","faVolumeHigh","label","faCheck","concat"],"mappings":"gqCAYkB,WAChB,IAAMA,EAA0BC,eAAY,SAACC,GAAqB,OAAAA,EAAMC,OAAOC,WAAb,IAE1DC,EAAMC,qBAERC,EAAgDC,EAAAA,SACpDC,EAAAA,YAAY,oCAAoCC,UAAY,MADvDC,OAAqBC,OAGtBC,EAAyB,SAACC,GAC9BF,EAAuBE,GAEvBd,SAAAA,EAAoBe,QACjBC,UAAUF,GACVG,MAAK,WACJC,QAAQC,KAAK,uCAEbC,EAAAA,YAAY,mCAAoC,CAAEV,SAAUI,IAG5DO,gBAAc,0CAA2C,CAAA,EAC3D,IACCC,OAAM,SAAUC,GACfL,QAAQM,MAAM,oCAAqCD,EACrD,GACJ,EACAE,mBAAiB,yCAAyC,SAACC,GACzDb,EAAuBa,EAAKhB,SAC9B,IAEM,IAAAiB,EAAuCnB,EAAAA,SAAS,IAA/CoB,EAAYD,EAAA,GAAEE,EAAeF,EAAA,GAEpCG,EAAAA,WAAU,WACR,IAAMC,EAA0B,WAC9BC,UAAUC,aACPC,mBACAjB,MAAK,SAACkB,GACLN,EAAgBM,EAClB,IACCb,OAAM,SAACE,GACNN,QAAQM,MAAM,QAASA,EACzB,GACJ,EAMA,OAJAO,IAEAC,UAAUC,aAAaG,iBAAiB,eAAgBL,GAEjD,WACLC,UAAUC,aAAaI,oBAAoB,eAAgBN,EAC7D,CACF,GAAG,CAACpB,IAEE,IAAA2B,EAAoC9B,EAAAA,SAAwB,MAA3D+B,EAAaD,EAAA,GAAEE,EAAgBF,EAAA,GAEtC,OACEG,EAAA,QAAAC,cAAA,MAAA,CAAKC,UAAU,iCAEbF,UAAAC,cAACE,EAAcA,eAAA,CAACC,MAAOxC,EAAE,qBAAsByC,cAAc,UAE7DL,EAAA,QAAAC,cAAA,MAAA,CAAKC,UAAU,oXACZf,EACEmB,QAAO,SAACC,GAAW,MAAiB,iBAAjBA,aAAM,EAANA,EAAQC,KAAsB,IACjDC,KAAI,SAACC,EAAaC,GAAU,OAC3BX,EACE,QAAAC,cAAA,MAAA,CAAAW,IAAKD,EACLT,UAAU,4OACVW,QAAS,WAAM,OAAAzC,EAAuBsC,aAAA,EAAAA,EAAazC,WACnD6C,aAAc,WAAM,OAAAf,EAAiBW,aAAW,EAAXA,EAAazC,WAClD8C,aAAc,WAAM,OAAAhB,EAAiB,QAErCC,EAAAA,QAAKC,cAAA,MAAA,CAAAC,UAAU,2BACbF,EAAC,QAAAC,cAAAe,mBAAgBC,KAAMC,eAAchB,UAAU,0BAC/CF,EAAA,QAAAC,cAAA,OAAA,MAAOS,eAAAA,EAAaS,QAAS,uBAAgBR,EAAQ,KAEvDX,EAAA,QAAAC,cAAA,MAAA,CAAKC,UAAU,2BACZhC,KAAwBwC,eAAAA,EAAazC,WACpC+B,EAAAA,QAAAC,cAACe,EAAAA,gBAAe,CACdC,KAAMG,EAAOA,QACblB,UAAW,GACTmB,OAAAvB,KAAkBY,aAAW,EAAXA,EAAazC,UAC3B,yCACA,+CACU,qBAKzB,KAIX"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../../node_modules/react-redux/es/index.js");var
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../../node_modules/react-redux/es/index.js");var i=require("../../node_modules/@fortawesome/react-fontawesome/index.es.js"),t=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),r=require("../../utils/customHooks/useEventListener.js"),n=require("../../utils/genericFunctions/eventDispatch.js"),a=require("../../utils/genericFunctions/localStorage.js"),o=require("./SettingsHeader.js");require("../../node_modules/@babel/runtime/helpers/defineProperty.js"),require("../../node_modules/@babel/runtime/helpers/objectWithoutProperties.js"),require("../../node_modules/@babel/runtime/helpers/typeof.js"),require("../../node_modules/html-parse-stringify/dist/html-parse-stringify.js"),require("../../node_modules/react-i18next/dist/es/context.js");var s=require("../../node_modules/react-i18next/dist/es/useTranslation.js");require("../../node_modules/@babel/runtime/helpers/slicedToArray.js");var l=require("../../node_modules/react-redux/es/hooks/useSelector.js");function c(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var u=c(e);exports.default=function(){var c=l.useSelector((function(e){return e.webrtc})).sipcall,d=s.useTranslation().t,p=e.useState(a.getJSONItem("phone-island-audio-input-device").deviceId||null),m=p[0],f=p[1],v=e.useState([]),h=v[0],b=v[1],g=function(e){f(e),c.webrtcStuff.myStream?null==c||c.replaceTracks({tracks:[{type:"audio",mid:"0",capture:{deviceId:{exact:e}}}],success:function(){console.info("Audio input device switch success!"),a.setJSONItem("phone-island-audio-input-device",{deviceId:e}),n.eventDispatch("phone-island-call-audio-input-switched",{})},error:function(e){console.error("Audio input device switch error:",e)}}):(a.setJSONItem("phone-island-audio-input-device",{deviceId:e}),n.eventDispatch("phone-island-call-audio-input-switched",{}))};r.useEventListener("phone-island-call-audio-input-switch",(function(e){g(e.deviceId)})),e.useEffect((function(){var e=function(){navigator.mediaDevices.enumerateDevices().then((function(e){b(e)})).catch((function(e){console.error("Error fetching devices:",e)}))};return e(),navigator.mediaDevices.addEventListener("devicechange",e),function(){navigator.mediaDevices.removeEventListener("devicechange",e)}}),[m]);var y=e.useState(null),x=y[0],k=y[1];return u.default.createElement("div",{className:"pi-flex pi-flex-col pi-w-full"},u.default.createElement(o.SettingsHeader,{title:d("Settings.Microphones"),tooltipPrefix:"microphone"}),u.default.createElement("div",{className:"pi-flex pi-flex-col pi-mt-2 pi-space-y-1 pi-max-h-48 pi-overflow-y-auto pi-scrollbar-thin pi-scrollbar-thumb-gray-400 pi-dark:scrollbar-thumb-gray-400 pi-scrollbar-thumb-rounded-full pi-scrollbar-thumb-opacity-50 dark:pi-scrollbar-track-gray-900 pi-scrollbar-track-gray-200 pi-dark:scrollbar-track-gray-900 pi-scrollbar-track-rounded-full pi-scrollbar-track-opacity-25"},h.filter((function(e){return"audioinput"===(null==e?void 0:e.kind)})).map((function(e,r){return u.default.createElement("div",{key:r,className:"pi-flex pi-items-center pi-justify-between pi-px-4 pi-py-3 pi-text-base pi-font-normal pi-leading-6 dark:pi-text-gray-200 pi-text-gray-700 hover:pi-bg-gray-200 dark:hover:pi-bg-gray-700 dark:pi-bg-gray-950 pi-bg-gray-50 pi-rounded-md",onClick:function(){return g(null==e?void 0:e.deviceId)},onMouseEnter:function(){return k(null==e?void 0:e.deviceId)},onMouseLeave:function(){return k(null)}},u.default.createElement("div",{className:"pi-flex pi-items-center"},u.default.createElement(i.FontAwesomeIcon,{icon:t.faMicrophone,className:"pi-mr-2 pi-w-5 pi-h-5"}),u.default.createElement("span",null,(null==e?void 0:e.label)||"Input device ".concat(r+1))),u.default.createElement("div",{className:"pi-flex pi-items-center"},m===(null==e?void 0:e.deviceId)&&u.default.createElement(i.FontAwesomeIcon,{icon:t.faCheck,className:"".concat(x===(null==e?void 0:e.deviceId)?"pi-text-gray-700 dark:pi-text-gray-200":"pi-text-emerald-700 dark:pi-text-emerald-500"," pi-w-5 pi-h-5")})))}))))};
|
|
2
2
|
//# sourceMappingURL=MicrophoneView.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MicrophoneView.js","sources":["../../../src/components/SettingsView/MicrophoneView.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { useState, useEffect } from 'react'\nimport { useSelector } from 'react-redux'\nimport { RootState } from '../../store'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faCheck, faMicrophone } from '@fortawesome/free-solid-svg-icons'\nimport { eventDispatch, getJSONItem, setJSONItem, useEventListener } from '../../utils'\nimport { SettingsHeader } from './SettingsHeader'\nimport { useTranslation } from 'react-i18next'\n\nconst MicrophoneView = () => {\n const { sipcall }: any = useSelector((state: RootState) => state.webrtc)\n const { t } = useTranslation()\n\n const [selectedAudioInput, setSelectedAudioInput] = useState<string | null>(\n getJSONItem('phone-island-audio-input-device').deviceId || null,\n )\n const [actualDevices, setActualDevices]: any = useState([])\n\n const handleClickAudioInput = (audioInputDevice: string) => {\n setSelectedAudioInput(audioInputDevice)\n\n if (sipcall.webrtcStuff.myStream) {\n sipcall?.replaceTracks({\n tracks: [\n {\n type: 'audio',\n mid: '0',\n capture: { deviceId: { exact: audioInputDevice } },\n },\n ],\n success: function () {\n console.info('Audio input device switch success!')\n setJSONItem('phone-island-audio-input-device', { deviceId: audioInputDevice })\n eventDispatch('phone-island-call-audio-input-switched', {})\n },\n error: function (err) {\n console.error('Audio input device switch error:', err)\n },\n })\n } else {\n setJSONItem('phone-island-audio-input-device', { deviceId: audioInputDevice })\n eventDispatch('phone-island-call-audio-input-switched', {})\n }\n }\n\n useEventListener('phone-island-call-audio-input-switch', (data: DeviceInputOutputTypes) => {\n handleClickAudioInput(data.deviceId)\n })\n\n useEffect(() => {\n const checkInputOutputDevices = () => {\n navigator.mediaDevices\n .enumerateDevices()\n .then((deviceInfos) => {\n setActualDevices(deviceInfos)\n })\n .catch((error) => {\n console.error('Error fetching devices:', error)\n })\n }\n\n checkInputOutputDevices()\n\n navigator.mediaDevices.addEventListener('devicechange', checkInputOutputDevices)\n\n return () => {\n navigator.mediaDevices.removeEventListener('devicechange', checkInputOutputDevices)\n }\n }, [selectedAudioInput])\n\n const [hoveredDevice, setHoveredDevice] = useState<string | null>(null)\n\n return (\n <div className='pi-flex pi-flex-col pi-w-full'>\n {/* Title */}\n <SettingsHeader title={t('Settings.Microphones')} tooltipPrefix='microphone' />\n\n {/* Microphone List */}\n <div className='pi-flex pi-flex-col pi-mt-2 pi-space-y-1'>\n {actualDevices\n .filter((device) => device?.kind === 'audioinput')\n .map((audioDevice, index) => (\n <div\n key={index}\n className='pi-flex pi-items-center pi-justify-between pi-px-4 pi-py-3 pi-text-base pi-font-normal pi-leading-6 dark:pi-text-gray-200 pi-text-gray-700 hover:pi-bg-gray-200 dark:hover:pi-bg-gray-700 dark:pi-bg-gray-950 pi-bg-gray-50 pi-rounded-md'\n onClick={() => handleClickAudioInput(audioDevice?.deviceId)}\n onMouseEnter={() => setHoveredDevice(audioDevice?.deviceId)}\n onMouseLeave={() => setHoveredDevice(null)}\n >\n <div className='pi-flex pi-items-center'>\n <FontAwesomeIcon icon={faMicrophone} className='pi-mr-2 pi-w-5 pi-h-5' />\n <span>{audioDevice?.label || `Input device ${index + 1}`}</span>\n </div>\n <div className='pi-flex pi-items-center'>\n {selectedAudioInput === audioDevice?.deviceId && (\n <FontAwesomeIcon\n icon={faCheck}\n className={`${\n hoveredDevice === audioDevice?.deviceId\n ? 'pi-text-gray-700 dark:pi-text-gray-200'\n : 'pi-text-emerald-700 dark:pi-text-emerald-500'\n } pi-w-5 pi-h-5`}\n />\n )}\n </div>\n </div>\n ))}\n </div>\n </div>\n )\n}\n\ninterface DeviceInputOutputTypes {\n deviceId: string\n}\n\nexport default MicrophoneView\n"],"names":["sipcall","useSelector","state","webrtc","t","useTranslation","_a","useState","getJSONItem","deviceId","selectedAudioInput","setSelectedAudioInput","_b","actualDevices","setActualDevices","handleClickAudioInput","audioInputDevice","webrtcStuff","myStream","replaceTracks","tracks","type","mid","capture","exact","success","console","info","setJSONItem","eventDispatch","error","err","useEventListener","data","useEffect","checkInputOutputDevices","navigator","mediaDevices","enumerateDevices","then","deviceInfos","catch","addEventListener","removeEventListener","_c","hoveredDevice","setHoveredDevice","React","createElement","className","SettingsHeader","title","tooltipPrefix","filter","device","kind","map","audioDevice","index","key","onClick","onMouseEnter","onMouseLeave","FontAwesomeIcon","icon","faMicrophone","label","faCheck","concat"],"mappings":"gqCAYuB,WACb,IAAAA,EAAiBC,eAAY,SAACC,GAAqB,OAAAA,EAAMC,kBACzDC,EAAMC,qBAERC,EAA8CC,EAAAA,SAClDC,EAAAA,YAAY,mCAAmCC,UAAY,MADtDC,OAAoBC,
|
|
1
|
+
{"version":3,"file":"MicrophoneView.js","sources":["../../../src/components/SettingsView/MicrophoneView.tsx"],"sourcesContent":["// Copyright (C) 2024 Nethesis S.r.l.\n// SPDX-License-Identifier: AGPL-3.0-or-later\n\nimport React, { useState, useEffect } from 'react'\nimport { useSelector } from 'react-redux'\nimport { RootState } from '../../store'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport { faCheck, faMicrophone } from '@fortawesome/free-solid-svg-icons'\nimport { eventDispatch, getJSONItem, setJSONItem, useEventListener } from '../../utils'\nimport { SettingsHeader } from './SettingsHeader'\nimport { useTranslation } from 'react-i18next'\n\nconst MicrophoneView = () => {\n const { sipcall }: any = useSelector((state: RootState) => state.webrtc)\n const { t } = useTranslation()\n\n const [selectedAudioInput, setSelectedAudioInput] = useState<string | null>(\n getJSONItem('phone-island-audio-input-device').deviceId || null,\n )\n\n const [actualDevices, setActualDevices]: any = useState([])\n\n const handleClickAudioInput = (audioInputDevice: string) => {\n setSelectedAudioInput(audioInputDevice)\n\n if (sipcall.webrtcStuff.myStream) {\n sipcall?.replaceTracks({\n tracks: [\n {\n type: 'audio',\n mid: '0',\n capture: { deviceId: { exact: audioInputDevice } },\n },\n ],\n success: function () {\n console.info('Audio input device switch success!')\n setJSONItem('phone-island-audio-input-device', { deviceId: audioInputDevice })\n eventDispatch('phone-island-call-audio-input-switched', {})\n },\n error: function (err) {\n console.error('Audio input device switch error:', err)\n },\n })\n } else {\n setJSONItem('phone-island-audio-input-device', { deviceId: audioInputDevice })\n eventDispatch('phone-island-call-audio-input-switched', {})\n }\n }\n\n useEventListener('phone-island-call-audio-input-switch', (data: DeviceInputOutputTypes) => {\n handleClickAudioInput(data.deviceId)\n })\n\n useEffect(() => {\n const checkInputOutputDevices = () => {\n navigator.mediaDevices\n .enumerateDevices()\n .then((deviceInfos) => {\n setActualDevices(deviceInfos)\n })\n .catch((error) => {\n console.error('Error fetching devices:', error)\n })\n }\n\n checkInputOutputDevices()\n\n navigator.mediaDevices.addEventListener('devicechange', checkInputOutputDevices)\n\n return () => {\n navigator.mediaDevices.removeEventListener('devicechange', checkInputOutputDevices)\n }\n }, [selectedAudioInput])\n\n const [hoveredDevice, setHoveredDevice] = useState<string | null>(null)\n\n return (\n <div className='pi-flex pi-flex-col pi-w-full'>\n {/* Title */}\n <SettingsHeader title={t('Settings.Microphones')} tooltipPrefix='microphone' />\n\n {/* Microphone List */}\n <div className='pi-flex pi-flex-col pi-mt-2 pi-space-y-1 pi-max-h-48 pi-overflow-y-auto pi-scrollbar-thin pi-scrollbar-thumb-gray-400 pi-dark:scrollbar-thumb-gray-400 pi-scrollbar-thumb-rounded-full pi-scrollbar-thumb-opacity-50 dark:pi-scrollbar-track-gray-900 pi-scrollbar-track-gray-200 pi-dark:scrollbar-track-gray-900 pi-scrollbar-track-rounded-full pi-scrollbar-track-opacity-25'>\n {actualDevices\n .filter((device) => device?.kind === 'audioinput')\n .map((audioDevice, index) => (\n <div\n key={index}\n className='pi-flex pi-items-center pi-justify-between pi-px-4 pi-py-3 pi-text-base pi-font-normal pi-leading-6 dark:pi-text-gray-200 pi-text-gray-700 hover:pi-bg-gray-200 dark:hover:pi-bg-gray-700 dark:pi-bg-gray-950 pi-bg-gray-50 pi-rounded-md'\n onClick={() => handleClickAudioInput(audioDevice?.deviceId)}\n onMouseEnter={() => setHoveredDevice(audioDevice?.deviceId)}\n onMouseLeave={() => setHoveredDevice(null)}\n >\n <div className='pi-flex pi-items-center'>\n <FontAwesomeIcon icon={faMicrophone} className='pi-mr-2 pi-w-5 pi-h-5' />\n <span>{audioDevice?.label || `Input device ${index + 1}`}</span>\n </div>\n <div className='pi-flex pi-items-center'>\n {selectedAudioInput === audioDevice?.deviceId && (\n <FontAwesomeIcon\n icon={faCheck}\n className={`${\n hoveredDevice === audioDevice?.deviceId\n ? 'pi-text-gray-700 dark:pi-text-gray-200'\n : 'pi-text-emerald-700 dark:pi-text-emerald-500'\n } pi-w-5 pi-h-5`}\n />\n )}\n </div>\n </div>\n ))}\n </div>\n </div>\n )\n}\n\ninterface DeviceInputOutputTypes {\n deviceId: string\n}\n\nexport default MicrophoneView\n"],"names":["sipcall","useSelector","state","webrtc","t","useTranslation","_a","useState","getJSONItem","deviceId","selectedAudioInput","setSelectedAudioInput","_b","actualDevices","setActualDevices","handleClickAudioInput","audioInputDevice","webrtcStuff","myStream","replaceTracks","tracks","type","mid","capture","exact","success","console","info","setJSONItem","eventDispatch","error","err","useEventListener","data","useEffect","checkInputOutputDevices","navigator","mediaDevices","enumerateDevices","then","deviceInfos","catch","addEventListener","removeEventListener","_c","hoveredDevice","setHoveredDevice","React","createElement","className","SettingsHeader","title","tooltipPrefix","filter","device","kind","map","audioDevice","index","key","onClick","onMouseEnter","onMouseLeave","FontAwesomeIcon","icon","faMicrophone","label","faCheck","concat"],"mappings":"gqCAYuB,WACb,IAAAA,EAAiBC,eAAY,SAACC,GAAqB,OAAAA,EAAMC,kBACzDC,EAAMC,qBAERC,EAA8CC,EAAAA,SAClDC,EAAAA,YAAY,mCAAmCC,UAAY,MADtDC,OAAoBC,OAIrBC,EAAyCL,EAAAA,SAAS,IAAjDM,EAAaD,EAAA,GAAEE,EAAgBF,EAAA,GAEhCG,EAAwB,SAACC,GAC7BL,EAAsBK,GAElBhB,EAAQiB,YAAYC,SACtBlB,SAAAA,EAASmB,cAAc,CACrBC,OAAQ,CACN,CACEC,KAAM,QACNC,IAAK,IACLC,QAAS,CAAEd,SAAU,CAAEe,MAAOR,MAGlCS,QAAS,WACPC,QAAQC,KAAK,sCACbC,EAAAA,YAAY,kCAAmC,CAAEnB,SAAUO,IAC3Da,gBAAc,yCAA0C,CAAA,EACzD,EACDC,MAAO,SAAUC,GACfL,QAAQI,MAAM,mCAAoCC,EACnD,KAGHH,EAAAA,YAAY,kCAAmC,CAAEnB,SAAUO,IAC3Da,gBAAc,yCAA0C,CAAA,GAE5D,EAEAG,mBAAiB,wCAAwC,SAACC,GACxDlB,EAAsBkB,EAAKxB,SAC7B,IAEAyB,EAAAA,WAAU,WACR,IAAMC,EAA0B,WAC9BC,UAAUC,aACPC,mBACAC,MAAK,SAACC,GACL1B,EAAiB0B,EACnB,IACCC,OAAM,SAACX,GACNJ,QAAQI,MAAM,0BAA2BA,EAC3C,GACJ,EAMA,OAJAK,IAEAC,UAAUC,aAAaK,iBAAiB,eAAgBP,GAEjD,WACLC,UAAUC,aAAaM,oBAAoB,eAAgBR,EAC7D,CACF,GAAG,CAACzB,IAEE,IAAAkC,EAAoCrC,EAAAA,SAAwB,MAA3DsC,EAAaD,EAAA,GAAEE,EAAgBF,EAAA,GAEtC,OACEG,EAAA,QAAAC,cAAA,MAAA,CAAKC,UAAU,iCAEbF,UAAAC,cAACE,EAAcA,eAAA,CAACC,MAAO/C,EAAE,wBAAyBgD,cAAc,eAGhEL,EAAA,QAAAC,cAAA,MAAA,CAAKC,UAAU,oXACZpC,EACEwC,QAAO,SAACC,GAAW,MAAiB,gBAAjBA,aAAM,EAANA,EAAQC,KAAqB,IAChDC,KAAI,SAACC,EAAaC,GAAU,OAC3BX,EACE,QAAAC,cAAA,MAAA,CAAAW,IAAKD,EACLT,UAAU,4OACVW,QAAS,WAAM,OAAA7C,EAAsB0C,aAAA,EAAAA,EAAahD,WAClDoD,aAAc,WAAM,OAAAf,EAAiBW,aAAW,EAAXA,EAAahD,WAClDqD,aAAc,WAAM,OAAAhB,EAAiB,QAErCC,EAAAA,QAAKC,cAAA,MAAA,CAAAC,UAAU,2BACbF,EAAC,QAAAC,cAAAe,mBAAgBC,KAAMC,eAAchB,UAAU,0BAC/CF,EAAA,QAAAC,cAAA,OAAA,MAAOS,eAAAA,EAAaS,QAAS,uBAAgBR,EAAQ,KAEvDX,EAAA,QAAAC,cAAA,MAAA,CAAKC,UAAU,2BACZvC,KAAuB+C,eAAAA,EAAahD,WACnCsC,EAAAA,QAAAC,cAACe,EAAAA,gBAAe,CACdC,KAAMG,EAAOA,QACblB,UAAW,GACTmB,OAAAvB,KAAkBY,aAAW,EAAXA,EAAahD,UAC3B,yCACA,+CACU,qBAKzB,KAIX"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../../node_modules/react-redux/es/index.js");var t=require("../Button.js"),i=require("../../node_modules/@fortawesome/react-fontawesome/index.es.js"),r=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),o=require("../../node_modules/@nethesis/nethesis-solid-svg-icons/index.mjs.js");require("../../node_modules/@babel/runtime/helpers/defineProperty.js"),require("../../node_modules/@babel/runtime/helpers/objectWithoutProperties.js"),require("../../node_modules/@babel/runtime/helpers/typeof.js"),require("../../node_modules/html-parse-stringify/dist/html-parse-stringify.js"),require("../../node_modules/react-i18next/dist/es/context.js");var s=require("../../node_modules/react-i18next/dist/es/useTranslation.js");require("../../node_modules/@babel/runtime/helpers/slicedToArray.js");var n=require("../../lib/phone/call.js"),l=require("../CustomThemedTooltip.js"),a=require("../../utils/deviceUtils.js"),d=require("../../node_modules/framer-motion/dist/es/components/AnimatePresence/index.mjs.js"),u=require("../../node_modules/framer-motion/dist/es/render/dom/motion.mjs.js"),c=require("../../node_modules/react-redux/es/hooks/useDispatch.js"),p=require("../../node_modules/react-redux/es/hooks/useSelector.js");function m(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var f=m(e);exports.default=function(e){var m=e.isVisible,h=c.useDispatch(),x=p.useSelector((function(e){return e.island})).isOpen,j=p.useSelector((function(e){return e.currentCall})).isRecording,v=p.useSelector((function(e){return e.currentUser})),g=p.useSelector((function(e){return e.users})),w=s.useTranslation().t,q=a.getAvailableDevices(v,g);return f.default.createElement(f.default.Fragment,null,f.default.createElement(d.AnimatePresence,null,m&&f.default.createElement(u.motion.div,{className:"pi-absolute pi-h-full pi-bg-gray-700 pi-flex pi-flex-col pi-items-center pi-text-gray-50 dark:pi-text-gray-50 -pi-mr-10 pi-right-0 -pi-z-10 pi-pointer-events-auto ".concat(x?"pi-py-6":"pi-py-4"),style:{borderTopRightRadius:"20px",borderBottomRightRadius:"20px",width:"80px",transformOrigin:"right"},initial:{x:-76},animate:{x:4,transition:{duration:.2,ease:"easeOut"}},exit:{x:-76,transition:{duration:.2,ease:"easeIn"}}},f.default.createElement("div",{className:"pi-flex pi-flex-col pi-items-center pi-gap-3.5 pi-flex-1 pi-ml-9"},f.default.createElement(t.Button,{active:j,"data-stop-propagation":!0,variant:"transparentSideView",onClick:function(){return n.recordCurrentCall(j)},"data-tooltip-id":"tooltip-record","data-tooltip-content":j?w("Tooltip.Stop recording")||"":w("Tooltip.Record")||""},j?f.default.createElement(i.FontAwesomeIcon,{icon:r.faStop,className:"pi-h-5 pi-w-5"}):f.default.createElement(i.FontAwesomeIcon,{className:"pi-h-5 pi-w-5 pi-text-white",icon:o.faRecord})),(null==q?void 0:q.length)>0&&f.default.createElement(t.Button,{variant:"transparentSideView","data-tooltip-id":"tooltip-switch-device","data-tooltip-content":w("Tooltip.Switch device")||"",onClick:function(){return e="switchDevice",h.island.toggleSideViewVisible(!1),void(null!==e&&h.island.setIslandView(e));var e}},f.default.createElement(i.FontAwesomeIcon,{className:"pi-h-5 pi-w-5 pi-text-white",icon:o.faArrowsRepeat}))))),f.default.createElement(l.CustomThemedTooltip,{id:"tooltip-record",place:"left"}),f.default.createElement(l.CustomThemedTooltip,{id:"tooltip-video",place:"left"}),f.default.createElement(l.CustomThemedTooltip,{id:"tooltip-switch-device",place:"left"}))};
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react");require("../../node_modules/react-redux/es/index.js");var t=require("../Button.js"),i=require("../../node_modules/@fortawesome/react-fontawesome/index.es.js"),r=require("../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs.js"),o=require("../../node_modules/@nethesis/nethesis-solid-svg-icons/index.mjs.js");require("../../node_modules/@babel/runtime/helpers/defineProperty.js"),require("../../node_modules/@babel/runtime/helpers/objectWithoutProperties.js"),require("../../node_modules/@babel/runtime/helpers/typeof.js"),require("../../node_modules/html-parse-stringify/dist/html-parse-stringify.js"),require("../../node_modules/react-i18next/dist/es/context.js");var s=require("../../node_modules/react-i18next/dist/es/useTranslation.js");require("../../node_modules/@babel/runtime/helpers/slicedToArray.js");var n=require("../../lib/phone/call.js"),l=require("../CustomThemedTooltip.js"),a=require("../../utils/deviceUtils.js"),d=require("../../node_modules/framer-motion/dist/es/components/AnimatePresence/index.mjs.js"),u=require("../../node_modules/framer-motion/dist/es/render/dom/motion.mjs.js"),c=require("../../node_modules/react-redux/es/hooks/useDispatch.js"),p=require("../../node_modules/react-redux/es/hooks/useSelector.js");function m(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var f=m(e);exports.default=function(e){var m=e.isVisible,h=c.useDispatch(),x=p.useSelector((function(e){return e.island})).isOpen,j=p.useSelector((function(e){return e.currentCall})).isRecording,v=p.useSelector((function(e){return e.currentUser})),g=p.useSelector((function(e){return e.users})),w=s.useTranslation().t,q=a.getAvailableDevices(v,g);return f.default.createElement(f.default.Fragment,null,f.default.createElement(d.AnimatePresence,null,m&&f.default.createElement(u.motion.div,{className:"pi-absolute pi-h-full pi-bg-gray-700 pi-flex pi-flex-col pi-items-center pi-text-gray-50 dark:pi-text-gray-50 -pi-mr-10 pi-right-0 -pi-z-10 pi-pointer-events-auto ".concat(x?"pi-py-6":"pi-py-4"),style:{borderTopRightRadius:"20px",borderBottomRightRadius:"20px",width:"80px",transformOrigin:"right"},initial:{x:-76},animate:{x:4,transition:{duration:.2,ease:"easeOut"}},exit:{x:-76,transition:{duration:.2,ease:"easeIn"}}},f.default.createElement("div",{className:"pi-flex pi-flex-col pi-items-center pi-gap-3.5 pi-flex-1 pi-ml-9"},f.default.createElement(t.Button,{active:j,"data-stop-propagation":!0,variant:"transparentSideView",onClick:function(){return n.recordCurrentCall(j)},"data-tooltip-id":"tooltip-record","data-tooltip-content":j?w("Tooltip.Stop recording")||"":w("Tooltip.Record")||""},j?f.default.createElement(i.FontAwesomeIcon,{icon:r.faStop,className:"pi-h-5 pi-w-5 pi-text-white"}):f.default.createElement(i.FontAwesomeIcon,{className:"pi-h-5 pi-w-5 pi-text-white",icon:o.faRecord})),(null==q?void 0:q.length)>0&&f.default.createElement(t.Button,{variant:"transparentSideView","data-tooltip-id":"tooltip-switch-device","data-tooltip-content":w("Tooltip.Switch device")||"",onClick:function(){return e="switchDevice",h.island.toggleSideViewVisible(!1),void(null!==e&&h.island.setIslandView(e));var e}},f.default.createElement(i.FontAwesomeIcon,{className:"pi-h-5 pi-w-5 pi-text-white",icon:o.faArrowsRepeat}))))),f.default.createElement(l.CustomThemedTooltip,{id:"tooltip-record",place:"left"}),f.default.createElement(l.CustomThemedTooltip,{id:"tooltip-video",place:"left"}),f.default.createElement(l.CustomThemedTooltip,{id:"tooltip-switch-device",place:"left"}))};
|
|
2
2
|
//# sourceMappingURL=SideView.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SideView.js","sources":["../../../src/components/SideView/SideView.tsx"],"sourcesContent":["import React, { FC } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { Dispatch, RootState } from '../../store'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport { Button } from '../Button'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport {\n faArrowUpRightFromSquare,\n faDisplay,\n faStop,\n faVideo,\n} from '@fortawesome/free-solid-svg-icons'\nimport { faArrowsRepeat, faRecord } from '@nethesis/nethesis-solid-svg-icons'\nimport { useTranslation } from 'react-i18next'\nimport { recordCurrentCall } from '../../lib/phone/call'\nimport { CustomThemedTooltip } from '../CustomThemedTooltip'\nimport { getAvailableDevices } from '../../utils/deviceUtils'\n\nconst SideView: FC<SideViewTypes> = ({ isVisible }) => {\n const dispatch = useDispatch<Dispatch>()\n const { isOpen } = useSelector((state: RootState) => state.island)\n const { isRecording } = useSelector((state: RootState) => state.currentCall)\n const userInformation = useSelector((state: RootState) => state.currentUser)\n const allUsersInformation = useSelector((state: RootState) => state.users)\n const { t } = useTranslation()\n\n const availableDevices = getAvailableDevices(userInformation, allUsersInformation)\n\n const closeSideViewAndLaunchEvent = (viewType: any) => {\n dispatch.island.toggleSideViewVisible(false)\n if (viewType !== null) {\n dispatch.island.setIslandView(viewType)\n }\n }\n\n return (\n <>\n <AnimatePresence>\n {isVisible && (\n <motion.div\n className={`pi-absolute pi-h-full pi-bg-gray-700 pi-flex pi-flex-col pi-items-center pi-text-gray-50 dark:pi-text-gray-50 -pi-mr-10 pi-right-0 -pi-z-10 pi-pointer-events-auto ${\n isOpen ? 'pi-py-6' : 'pi-py-4'\n }`}\n style={{\n borderTopRightRadius: '20px',\n borderBottomRightRadius: '20px',\n width: '80px',\n transformOrigin: 'right',\n }}\n initial={{ x: -76 }}\n animate={{
|
|
1
|
+
{"version":3,"file":"SideView.js","sources":["../../../src/components/SideView/SideView.tsx"],"sourcesContent":["import React, { FC } from 'react'\nimport { useDispatch, useSelector } from 'react-redux'\nimport { Dispatch, RootState } from '../../store'\nimport { motion, AnimatePresence } from 'framer-motion'\nimport { Button } from '../Button'\nimport { FontAwesomeIcon } from '@fortawesome/react-fontawesome'\nimport {\n faArrowUpRightFromSquare,\n faDisplay,\n faStop,\n faVideo,\n} from '@fortawesome/free-solid-svg-icons'\nimport { faArrowsRepeat, faRecord } from '@nethesis/nethesis-solid-svg-icons'\nimport { useTranslation } from 'react-i18next'\nimport { recordCurrentCall } from '../../lib/phone/call'\nimport { CustomThemedTooltip } from '../CustomThemedTooltip'\nimport { getAvailableDevices } from '../../utils/deviceUtils'\n\nconst SideView: FC<SideViewTypes> = ({ isVisible }) => {\n const dispatch = useDispatch<Dispatch>()\n const { isOpen } = useSelector((state: RootState) => state.island)\n const { isRecording } = useSelector((state: RootState) => state.currentCall)\n const userInformation = useSelector((state: RootState) => state.currentUser)\n const allUsersInformation = useSelector((state: RootState) => state.users)\n const { t } = useTranslation()\n\n const availableDevices = getAvailableDevices(userInformation, allUsersInformation)\n\n const closeSideViewAndLaunchEvent = (viewType: any) => {\n dispatch.island.toggleSideViewVisible(false)\n if (viewType !== null) {\n dispatch.island.setIslandView(viewType)\n }\n }\n\n return (\n <>\n <AnimatePresence>\n {isVisible && (\n <motion.div\n className={`pi-absolute pi-h-full pi-bg-gray-700 pi-flex pi-flex-col pi-items-center pi-text-gray-50 dark:pi-text-gray-50 -pi-mr-10 pi-right-0 -pi-z-10 pi-pointer-events-auto ${\n isOpen ? 'pi-py-6' : 'pi-py-4'\n }`}\n style={{\n borderTopRightRadius: '20px',\n borderBottomRightRadius: '20px',\n width: '80px',\n transformOrigin: 'right',\n }}\n initial={{ x: -76 }}\n animate={{\n x: 4,\n transition: {\n duration: 0.2,\n ease: 'easeOut',\n },\n }}\n exit={{\n x: -76,\n transition: {\n duration: 0.2,\n ease: 'easeIn',\n },\n }}\n >\n <div className='pi-flex pi-flex-col pi-items-center pi-gap-3.5 pi-flex-1 pi-ml-9'>\n {/* Recording button */}\n <Button\n active={isRecording}\n data-stop-propagation={true}\n variant='transparentSideView'\n onClick={() => recordCurrentCall(isRecording)}\n data-tooltip-id='tooltip-record'\n data-tooltip-content={\n isRecording ? t('Tooltip.Stop recording') || '' : t('Tooltip.Record') || ''\n }\n >\n {isRecording ? (\n <FontAwesomeIcon icon={faStop} className='pi-h-5 pi-w-5 pi-text-white' />\n ) : (\n <FontAwesomeIcon className='pi-h-5 pi-w-5 pi-text-white' icon={faRecord} />\n )}\n </Button>\n {/* Hidden at the moment waiting for implementation */}\n {/* Video button */}\n {/* <Button\n variant='transparentSideView'\n onClick={() => closeSideViewAndLaunchEvent('video')}\n data-tooltip-id='tooltip-video'\n data-tooltip-content={t('Tooltip.Enable camera') || ''}\n >\n <FontAwesomeIcon className='pi-h-5 pi-w-5 pi-text-white' icon={faVideo} />\n </Button> */}\n {/* Switch device button - show only if there are available devices */}\n {availableDevices?.length > 0 && (\n <Button\n variant='transparentSideView'\n data-tooltip-id='tooltip-switch-device'\n data-tooltip-content={t('Tooltip.Switch device') || ''}\n onClick={() => closeSideViewAndLaunchEvent('switchDevice')}\n >\n <FontAwesomeIcon className='pi-h-5 pi-w-5 pi-text-white' icon={faArrowsRepeat} />\n </Button>\n )}\n {/* Hidden at the moment waiting for implementation */}\n {/* Share button */}\n {/* <Button variant='transparentSideView' disabled>\n <FontAwesomeIcon\n className='pi-h-5 pi-w-5 pi-text-white'\n icon={faArrowUpRightFromSquare}\n />\n </Button>\n <Button variant='transparentSideView' disabled>\n <FontAwesomeIcon className='pi-h-5 pi-w-5 pi-text-white' icon={faDisplay} />\n </Button> */}\n </div>\n </motion.div>\n )}\n </AnimatePresence>\n <CustomThemedTooltip id='tooltip-record' place='left' />\n <CustomThemedTooltip id='tooltip-video' place='left' />\n <CustomThemedTooltip id='tooltip-switch-device' place='left' />\n </>\n )\n}\n\nexport default SideView\n\ninterface SideViewTypes {\n isVisible: boolean\n}\n"],"names":["_a","isVisible","dispatch","useDispatch","isOpen","useSelector","state","island","isRecording","currentCall","userInformation","currentUser","allUsersInformation","users","t","useTranslation","availableDevices","getAvailableDevices","React","createElement","Fragment","AnimatePresence","motion","div","className","style","borderTopRightRadius","borderBottomRightRadius","width","transformOrigin","initial","x","animate","transition","duration","ease","exit","Button","active","variant","onClick","recordCurrentCall","FontAwesomeIcon","icon","faStop","faRecord","length","viewType","toggleSideViewVisible","setIslandView","faArrowsRepeat","CustomThemedTooltip","id","place"],"mappings":"g6CAkBoC,SAACA,GAAE,IAAAC,EAASD,EAAAC,UACxCC,EAAWC,EAAAA,cACTC,EAAWC,eAAY,SAACC,GAAqB,OAAAA,EAAMC,iBACnDC,EAAgBH,eAAY,SAACC,GAAqB,OAAAA,EAAMG,2BAC1DC,EAAkBL,EAAWA,aAAC,SAACC,GAAqB,OAAAA,EAAMK,WAAN,IACpDC,EAAsBP,EAAWA,aAAC,SAACC,GAAqB,OAAAA,EAAMO,KAAN,IACtDC,EAAMC,qBAERC,EAAmBC,EAAAA,oBAAoBP,EAAiBE,GAS9D,OACEM,UAAAC,cAAAD,EAAA,QAAAE,SAAA,KACEF,EAAC,QAAAC,cAAAE,kBACE,KAAApB,GACCiB,EAAAA,sBAACI,EAAMA,OAACC,IAAG,CACTC,UAAW,6KACTpB,EAAS,UAAY,WAEvBqB,MAAO,CACLC,qBAAsB,OACtBC,wBAAyB,OACzBC,MAAO,OACPC,gBAAiB,SAEnBC,QAAS,CAAEC,GAAI,IACfC,QAAS,CACPD,EAAG,EACHE,WAAY,CACVC,SAAU,GACVC,KAAM,YAGVC,KAAM,CACJL,GAAI,GACJE,WAAY,CACVC,SAAU,GACVC,KAAM,YAIVjB,EAAAA,QAAKC,cAAA,MAAA,CAAAK,UAAU,oEAEbN,UAAAC,cAACkB,EAAMA,OACL,CAAAC,OAAQ9B,2BACe,EACvB+B,QAAQ,sBACRC,QAAS,WAAM,OAAAC,oBAAkBjC,IAAY,kBAC7B,iBAAgB,uBAE9BA,EAAcM,EAAE,2BAA6B,GAAKA,EAAE,mBAAqB,IAG1EN,EACCU,UAAAC,cAACuB,EAAeA,gBAAC,CAAAC,KAAMC,SAAQpB,UAAU,gCAEzCN,EAAAA,sBAACwB,kBAAe,CAAClB,UAAU,8BAA8BmB,KAAME,eAclE7B,aAAA,EAAAA,EAAkB8B,QAAS,GAC1B5B,EAAC,QAAAC,cAAAkB,EAAMA,OACL,CAAAE,QAAQ,sBAAqB,kBACb,wBAAuB,uBACjBzB,EAAE,0BAA4B,GACpD0B,QAAS,WAAM,OAvEMO,EAuEsB,eAtEzD7C,EAASK,OAAOyC,uBAAsB,QACrB,OAAbD,GACF7C,EAASK,OAAO0C,cAAcF,IAHE,IAACA,IAyErB7B,EAAAA,QAAAC,cAACuB,kBAAe,CAAClB,UAAU,8BAA8BmB,KAAMO,uBAkB3EhC,EAAC,QAAAC,cAAAgC,uBAAoBC,GAAG,iBAAiBC,MAAM,SAC/CnC,EAAC,QAAAC,cAAAgC,uBAAoBC,GAAG,gBAAgBC,MAAM,SAC9CnC,UAAAC,cAACgC,EAAAA,oBAAmB,CAACC,GAAG,wBAAwBC,MAAM,SAG5D"}
|
package/dist/index.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }@supports (-moz-appearance:none){*{scrollbar-color:auto;scrollbar-width:auto}}.pi-pointer-events-none{pointer-events:none}.pi-pointer-events-auto{pointer-events:auto}.pi-fixed{position:fixed}.pi-absolute{position:absolute}.pi-relative{position:relative}.pi-inset-0{inset:0}.pi--right-6{right:-1.5rem}.pi-bottom-6{bottom:1.5rem}.pi-left-0{left:0}.pi-right-0{right:0}.pi-right-6,.pi-right-\[1\.5rem\]{right:1.5rem}.pi-right-\[4\.5rem\]{right:4.5rem}.pi-top-0{top:0}.-pi-z-10{z-index:-10}.pi-z-1000{z-index:1000}.pi-z-20{z-index:20}.pi-z-30{z-index:30}.pi-z-50{z-index:50}.pi-col-span-2{grid-column:span 2/span 2}.pi-col-start-auto{grid-column-start:auto}.pi-mx-auto{margin-left:auto;margin-right:auto}.-pi-mr-10{margin-right:-2.5rem}.-pi-mt-10{margin-top:-2.5rem}.pi--ml-28{margin-left:-7rem}.pi--mt-1{margin-top:-.25rem}.pi-mb-3{margin-bottom:.75rem}.pi-mb-4{margin-bottom:1rem}.pi-mb-6{margin-bottom:1.5rem}.pi-ml-1{margin-left:.25rem}.pi-ml-11{margin-left:2.75rem}.pi-ml-16{margin-left:4rem}.pi-ml-20{margin-left:5rem}.pi-ml-4{margin-left:1rem}.pi-ml-5{margin-left:1.25rem}.pi-ml-6{margin-left:1.5rem}.pi-ml-9{margin-left:2.25rem}.pi-ml-\[1\.49rem\]{margin-left:1.49rem}.pi-ml-\[1\.4rem\]{margin-left:1.4rem}.pi-mr-1{margin-right:.25rem}.pi-mr-2{margin-right:.5rem}.pi-mr-4{margin-right:1rem}.pi-mr-\[0\.27rem\]{margin-right:.27rem}.pi-mr-\[0\.28rem\]{margin-right:.28rem}.pi-mr-\[0\.42rem\]{margin-right:.42rem}.pi-mr-\[0\.4rem\]{margin-right:.4rem}.pi-mr-\[0\.57rem\]{margin-right:.57rem}.pi-mt-1{margin-top:.25rem}.pi-mt-12{margin-top:3rem}.pi-mt-2{margin-top:.5rem}.pi-mt-4{margin-top:1rem}.pi-mt-7{margin-top:1.75rem}.pi-mt-8{margin-top:2rem}.pi-mt-\[-12\.5rem\]{margin-top:-12.5rem}.pi-mt-\[-8\.5rem\]{margin-top:-8.5rem}.pi-block{display:block}.pi-inline-block{display:inline-block}.pi-flex{display:flex}.pi-inline-flex{display:inline-flex}.pi-grid{display:grid}.pi-hidden{display:none}.pi-h-1{height:.25rem}.pi-h-10{height:2.5rem}.pi-h-12{height:3rem}.pi-h-3{height:.75rem}.pi-h-4{height:1rem}.pi-h-40{height:10rem}.pi-h-5{height:1.25rem}.pi-h-6{height:1.5rem}.pi-h-8{height:2rem}.pi-h-9{height:2.25rem}.pi-h-fit{height:fit-content}.pi-h-full{height:100%}.pi-max-h-\[13\.125rem\]{max-height:13.125rem}.pi-max-h-\[9\.125rem\]{max-height:9.125rem}.pi-min-h-full{min-height:100%}.pi-w-0\.5{width:.125rem}.pi-w-10{width:2.5rem}.pi-w-12{width:3rem}.pi-w-16{width:4rem}.pi-w-2{width:.5rem}.pi-w-3{width:.75rem}.pi-w-4{width:1rem}.pi-w-44{width:11rem}.pi-w-5{width:1.25rem}.pi-w-56{width:14rem}.pi-w-6{width:1.5rem}.pi-w-8{width:2rem}.pi-w-9{width:2.25rem}.pi-w-\[98rem\]{width:98rem}.pi-w-fit{width:fit-content}.pi-w-full{width:100%}.pi-min-w-12{min-width:3rem}.pi-min-w-\[120px\]{min-width:120px}.pi-min-w-full{min-width:100%}.pi-max-w-16{max-width:4rem}.pi-max-w-40{max-width:10rem}.pi-max-w-44{max-width:11rem}.pi-max-w-60{max-width:15rem}.pi-max-w-\[100rem\]{max-width:100rem}.pi-flex-1{flex:1 1 0%}.pi-flex-none{flex:none}.pi-flex-shrink-0,.pi-shrink-0{flex-shrink:0}.pi-flex-grow{flex-grow:1}.pi-flex-grow-0{flex-grow:0}.pi-origin-top-right{transform-origin:top right}.pi--translate-y-1\/2{--tw-translate-y:-50%}.pi--rotate-45,.pi--translate-y-1\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.pi--rotate-45{--tw-rotate:-45deg}.pi-rotate-135{--tw-rotate:135deg}.pi-rotate-135,.pi-rotate-45{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.pi-rotate-45{--tw-rotate:45deg}.pi-rotate-90{--tw-rotate:90deg}.pi-rotate-90,.pi-rotate-\[135deg\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.pi-rotate-\[135deg\]{--tw-rotate:135deg}.pi-transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pi-ping{75%,to{opacity:0;transform:scale(2)}}.pi-animate-ping{animation:pi-ping 1s cubic-bezier(0,0,.2,1) infinite}@keyframes pi-scroll{0%{transform:translateX(0)}to{transform:translateX(-100%)}}.pi-animate-scroll-text{animation:pi-scroll 10s linear infinite}.pi-cursor-auto{cursor:auto}.pi-cursor-pointer{cursor:pointer}.pi-auto-cols-max{grid-auto-columns:max-content}.pi-grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.pi-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.pi-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.pi-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.pi-flex-col{flex-direction:column}.pi-place-items-center{place-items:center}.pi-content-center{align-content:center}.pi-items-center{align-items:center}.pi-justify-start{justify-content:flex-start}.pi-justify-end{justify-content:flex-end}.pi-justify-center{justify-content:center}.pi-justify-between{justify-content:space-between}.pi-justify-items-end{justify-items:end}.pi-justify-items-center{justify-items:center}.pi-gap-1{gap:.25rem}.pi-gap-2{gap:.5rem}.pi-gap-3{gap:.75rem}.pi-gap-3\.5{gap:.875rem}.pi-gap-4{gap:1rem}.pi-gap-5{gap:1.25rem}.pi-gap-6{gap:1.5rem}.pi-gap-7{gap:1.75rem}.pi-gap-y-5{row-gap:1.25rem}.pi-gap-y-6{row-gap:1.5rem}.pi-space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.5rem*var(--tw-space-x-reverse))}.pi-space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.pi-space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.5rem*var(--tw-space-y-reverse));margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)))}.pi-overflow-hidden{overflow:hidden}.pi-overflow-y-auto{overflow-y:auto}.pi-overflow-x-hidden{overflow-x:hidden}.pi-truncate{overflow:hidden;white-space:nowrap}.pi-text-ellipsis,.pi-truncate{text-overflow:ellipsis}.pi-whitespace-nowrap{white-space:nowrap}.pi-rounded{border-radius:.25rem}.pi-rounded-2xl{border-radius:1rem}.pi-rounded-3xl{border-radius:1.5rem}.pi-rounded-full{border-radius:9999px}.pi-rounded-lg{border-radius:.5rem}.pi-rounded-md{border-radius:.375rem}.pi-rounded-sm{border-radius:.125rem}.pi-rounded-xl{border-radius:.75rem}.pi-border{border-width:1px}.pi-border-2{border-width:2px}.pi-border-4{border-width:4px}.pi-border-l-4{border-left-width:4px}.pi-border-t{border-top-width:1px}.pi-border-emerald-500{--tw-border-opacity:1;border-color:rgb(16 185 129/var(--tw-border-opacity,1))}.pi-border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.pi-border-gray-400{--tw-border-opacity:1;border-color:rgb(156 163 175/var(--tw-border-opacity,1))}.pi-border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity,1))}.pi-border-green-600{--tw-border-opacity:1;border-color:rgb(22 163 74/var(--tw-border-opacity,1))}.pi-border-orange-600{--tw-border-opacity:1;border-color:rgb(234 88 12/var(--tw-border-opacity,1))}.pi-border-red-600{--tw-border-opacity:1;border-color:rgb(220 38 38/var(--tw-border-opacity,1))}.pi-border-transparent{border-color:#0000}.pi-border-white{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity,1))}.pi-bg-emerald-100{--tw-bg-opacity:1;background-color:rgb(209 250 229/var(--tw-bg-opacity,1))}.pi-bg-emerald-700{--tw-bg-opacity:1;background-color:rgb(4 120 87/var(--tw-bg-opacity,1))}.pi-bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.pi-bg-gray-300{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity,1))}.pi-bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.pi-bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))}.pi-bg-gray-600{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.pi-bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.pi-bg-gray-950{--tw-bg-opacity:1;background-color:rgb(3 7 18/var(--tw-bg-opacity,1))}.pi-bg-green-200{--tw-bg-opacity:1;background-color:rgb(187 247 208/var(--tw-bg-opacity,1))}.pi-bg-green-400{--tw-bg-opacity:1;background-color:rgb(74 222 128/var(--tw-bg-opacity,1))}.pi-bg-green-500{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity,1))}.pi-bg-green-700{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.pi-bg-red-400{--tw-bg-opacity:1;background-color:rgb(248 113 113/var(--tw-bg-opacity,1))}.pi-bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.pi-bg-red-700{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity,1))}.pi-bg-rose-200{--tw-bg-opacity:1;background-color:rgb(254 205 211/var(--tw-bg-opacity,1))}.pi-bg-transparent{background-color:initial}.pi-bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.pi-bg-opacity-\[0\.99\]{--tw-bg-opacity:0.99}.pi-bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}.pi-bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.pi-from-gray-100{--tw-gradient-from:#f3f4f6 var(--tw-gradient-from-position);--tw-gradient-to:#f3f4f600 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.pi-from-transparent{--tw-gradient-from:#0000 var(--tw-gradient-from-position);--tw-gradient-to:#0000 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.pi-to-gray-50{--tw-gradient-to:#f9fafb var(--tw-gradient-to-position)}.pi-to-gray-700{--tw-gradient-to:#374151 var(--tw-gradient-to-position)}.pi-to-transparent{--tw-gradient-to:#0000 var(--tw-gradient-to-position)}.pi-bg-cover{background-size:cover}.pi-p-4{padding:1rem}.pi-p-6{padding:1.5rem}.pi-px-0\.5{padding-left:.125rem;padding-right:.125rem}.pi-px-2{padding-left:.5rem;padding-right:.5rem}.pi-px-3{padding-left:.75rem;padding-right:.75rem}.pi-px-4{padding-left:1rem;padding-right:1rem}.pi-px-6{padding-left:1.5rem;padding-right:1.5rem}.pi-py-1{padding-bottom:.25rem;padding-top:.25rem}.pi-py-2{padding-bottom:.5rem;padding-top:.5rem}.pi-py-3{padding-bottom:.75rem;padding-top:.75rem}.pi-py-4{padding-bottom:1rem;padding-top:1rem}.pi-py-6{padding-bottom:1.5rem;padding-top:1.5rem}.pi-pb-9{padding-bottom:2.25rem}.pi-pr-4{padding-right:1rem}.pi-pt-2{padding-top:.5rem}.pi-pt-3{padding-top:.75rem}.pi-pt-4{padding-top:1rem}.pi-pt-7{padding-top:1.75rem}.pi-pt-9{padding-top:2.25rem}.pi-text-center{text-align:center}.pi-text-2xl{font-size:1.5rem;line-height:2rem}.pi-text-4xl{font-size:2.25rem;line-height:2.5rem}.pi-text-base{font-size:1rem;line-height:1.5rem}.pi-text-lg{font-size:1.125rem;line-height:1.75rem}.pi-text-sm{font-size:.875rem;line-height:1.25rem}.pi-text-xl{font-size:1.25rem;line-height:1.75rem}.pi-text-xs{font-size:.75rem;line-height:1rem}.pi-font-bold{font-weight:700}.pi-font-light{font-weight:300}.pi-font-medium{font-weight:500}.pi-font-normal{font-weight:400}.pi-font-semibold{font-weight:600}.pi-leading-4{line-height:1rem}.pi-leading-5{line-height:1.25rem}.pi-leading-6{line-height:1.5rem}.pi-leading-7{line-height:1.75rem}.pi-tracking-wide{letter-spacing:.025em}.pi-text-emerald-600{--tw-text-opacity:1;color:rgb(5 150 105/var(--tw-text-opacity,1))}.pi-text-emerald-700{--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity,1))}.pi-text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.pi-text-gray-50{--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity,1))}.pi-text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.pi-text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.pi-text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.pi-text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.pi-text-gray-950{--tw-text-opacity:1;color:rgb(3 7 18/var(--tw-text-opacity,1))}.pi-text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity,1))}.pi-text-green-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity,1))}.pi-text-green-700{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity,1))}.pi-text-indigo-800{--tw-text-opacity:1;color:rgb(55 48 163/var(--tw-text-opacity,1))}.pi-text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.pi-text-rose-700{--tw-text-opacity:1;color:rgb(190 18 60/var(--tw-text-opacity,1))}.pi-text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.pi-placeholder-gray-800::placeholder{--tw-placeholder-opacity:1;color:rgb(31 41 55/var(--tw-placeholder-opacity,1))}.pi-opacity-60{opacity:.6}.pi-opacity-75{opacity:.75}.pi-shadow{--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.pi-shadow,.pi-shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.pi-shadow-lg{--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.pi-shadow-md{--tw-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.pi-shadow-md,.pi-shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.pi-shadow-sm{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.pi-outline-none{outline:2px solid #0000;outline-offset:2px}.pi-ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.pi-ring-black{--tw-ring-opacity:1;--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity,1))}.pi-ring-opacity-5{--tw-ring-opacity:0.05}.pi-transition{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.pi-transition-colors{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.pi-transition-shadow{transition-duration:.15s;transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1)}.pi-duration-200{transition-duration:.2s}.pi-scrollbar-thin::-webkit-scrollbar-track{background-color:var(--scrollbar-track);border-radius:var(--scrollbar-track-radius)}.pi-scrollbar-thin::-webkit-scrollbar-track:hover{background-color:var(--scrollbar-track-hover,var(--scrollbar-track))}.pi-scrollbar-thin::-webkit-scrollbar-track:active{background-color:var(--scrollbar-track-active,var(--scrollbar-track-hover,var(--scrollbar-track)))}.pi-scrollbar-thin::-webkit-scrollbar-thumb{background-color:var(--scrollbar-thumb);border-radius:var(--scrollbar-thumb-radius)}.pi-scrollbar-thin::-webkit-scrollbar-thumb:hover{background-color:var(--scrollbar-thumb-hover,var(--scrollbar-thumb))}.pi-scrollbar-thin::-webkit-scrollbar-thumb:active{background-color:var(--scrollbar-thumb-active,var(--scrollbar-thumb-hover,var(--scrollbar-thumb)))}.pi-scrollbar-thin::-webkit-scrollbar-corner{background-color:var(--scrollbar-corner);border-radius:var(--scrollbar-corner-radius)}.pi-scrollbar-thin::-webkit-scrollbar-corner:hover{background-color:var(--scrollbar-corner-hover,var(--scrollbar-corner))}.pi-scrollbar-thin::-webkit-scrollbar-corner:active{background-color:var(--scrollbar-corner-active,var(--scrollbar-corner-hover,var(--scrollbar-corner)))}@supports (-moz-appearance:none){.pi-scrollbar-thin{scrollbar-color:var(--scrollbar-thumb,initial) var(--scrollbar-track,initial);scrollbar-width:thin}}.pi-scrollbar-thin::-webkit-scrollbar{display:block;height:8px;width:8px}.pi-scrollbar-track-gray-200{--scrollbar-track:#e5e7eb!important}.pi-scrollbar-thumb-gray-400{--scrollbar-thumb:#9ca3af!important}.pi-scrollbar-track-rounded-full{--scrollbar-track-radius:9999px}.pi-scrollbar-thumb-rounded-full{--scrollbar-thumb-radius:9999px}.hover\:pi-scale-110:hover{--tw-scale-x:1.1;--tw-scale-y:1.1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:pi-bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.hover\:pi-bg-gray-300:hover{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity,1))}.hover\:pi-bg-gray-500:hover{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))}.hover\:pi-bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.hover\:pi-bg-green-600:hover{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity,1))}.hover\:pi-bg-red-700:hover{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity,1))}.hover\:pi-text-emerald-800:hover{--tw-text-opacity:1;color:rgb(6 95 70/var(--tw-text-opacity,1))}.hover\:pi-text-gray-50:hover{--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity,1))}.hover\:pi-text-gray-900:hover{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.hover\:pi-shadow-2xl:hover{--tw-shadow:0 25px 50px -12px #00000040;--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.focus\:pi-z-20:focus{z-index:20}.focus\:pi-border-emerald-500:focus{--tw-border-opacity:1;border-color:rgb(16 185 129/var(--tw-border-opacity,1))}.focus\:pi-outline-0:focus{outline-width:0}.focus\:pi-ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:pi-ring-0:focus,.focus\:pi-ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:pi-ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:pi-ring-emerald-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(16 185 129/var(--tw-ring-opacity,1))}.focus\:pi-ring-gray-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(156 163 175/var(--tw-ring-opacity,1))}.focus\:pi-ring-gray-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(107 114 128/var(--tw-ring-opacity,1))}.focus\:pi-ring-green-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(34 197 94/var(--tw-ring-opacity,1))}.focus\:pi-ring-offset-2:focus{--tw-ring-offset-width:2px}.focus\:pi-ring-offset-gray-200:focus{--tw-ring-offset-color:#e5e7eb}.focus\:pi-ring-offset-white:focus{--tw-ring-offset-color:#fff}.active\:pi-border-emerald-500:active{--tw-border-opacity:1;border-color:rgb(16 185 129/var(--tw-border-opacity,1))}.enabled\:hover\:pi-border-gray-500:hover:enabled{--tw-border-opacity:1;border-color:rgb(107 114 128/var(--tw-border-opacity,1))}.enabled\:hover\:pi-bg-gray-200\/70:hover:enabled{background-color:#e5e7ebb3}.enabled\:hover\:pi-bg-gray-500:hover:enabled{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))}.enabled\:hover\:pi-bg-gray-600:hover:enabled{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.disabled\:pi-opacity-75:disabled{opacity:.75}@media (min-width:768px){.md\:pi-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}.dark\:pi-border-emerald-200:where(.pi-dark,.pi-dark *){--tw-border-opacity:1;border-color:rgb(167 243 208/var(--tw-border-opacity,1))}.dark\:pi-border-gray-600:where(.pi-dark,.pi-dark *){--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}.dark\:pi-bg-emerald-500:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity,1))}.dark\:pi-bg-emerald-600:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity,1))}.dark\:pi-bg-gray-300:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity,1))}.dark\:pi-bg-gray-50:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.dark\:pi-bg-gray-700:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.dark\:pi-bg-gray-950:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(3 7 18/var(--tw-bg-opacity,1))}.dark\:pi-bg-green-500:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity,1))}.dark\:pi-bg-green-900:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(20 83 45/var(--tw-bg-opacity,1))}.dark\:pi-bg-red-500:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.dark\:pi-bg-rose-900:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(136 19 55/var(--tw-bg-opacity,1))}.dark\:pi-bg-opacity-\[0\.99\]:where(.pi-dark,.pi-dark *){--tw-bg-opacity:0.99}.dark\:pi-from-black:where(.pi-dark,.pi-dark *){--tw-gradient-from:#000 var(--tw-gradient-from-position);--tw-gradient-to:#0000 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.dark\:pi-to-gray-950:where(.pi-dark,.pi-dark *){--tw-gradient-to:#030712 var(--tw-gradient-to-position)}.dark\:pi-text-emerald-500:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(16 185 129/var(--tw-text-opacity,1))}.dark\:pi-text-gray-100:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.dark\:pi-text-gray-200:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.dark\:pi-text-gray-300:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.dark\:pi-text-gray-50:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity,1))}.dark\:pi-text-gray-900:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.dark\:pi-text-gray-950:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(3 7 18/var(--tw-text-opacity,1))}.dark\:pi-text-green-200:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(187 247 208/var(--tw-text-opacity,1))}.dark\:pi-text-green-400:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity,1))}.dark\:pi-text-indigo-300:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(165 180 252/var(--tw-text-opacity,1))}.dark\:pi-text-rose-200:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(254 205 211/var(--tw-text-opacity,1))}.dark\:pi-text-white:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.dark\:pi-placeholder-gray-200:where(.pi-dark,.pi-dark *)::placeholder{--tw-placeholder-opacity:1;color:rgb(229 231 235/var(--tw-placeholder-opacity,1))}.dark\:pi-scrollbar-track-gray-900:where(.pi-dark,.pi-dark *){--scrollbar-track:#111827!important}.dark\:hover\:pi-bg-gray-50:hover:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.dark\:hover\:pi-bg-gray-600:hover:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.dark\:hover\:pi-bg-gray-700:hover:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.dark\:hover\:pi-bg-green-300:hover:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(134 239 172/var(--tw-bg-opacity,1))}.dark\:hover\:pi-bg-red-300:hover:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(252 165 165/var(--tw-bg-opacity,1))}.dark\:hover\:pi-text-gray-50:hover:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity,1))}.dark\:focus\:pi-border-emerald-200:focus:where(.pi-dark,.pi-dark *){--tw-border-opacity:1;border-color:rgb(167 243 208/var(--tw-border-opacity,1))}.dark\:focus\:pi-ring-emerald-300:focus:where(.pi-dark,.pi-dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(110 231 183/var(--tw-ring-opacity,1))}.dark\:focus\:pi-ring-gray-500:focus:where(.pi-dark,.pi-dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(107 114 128/var(--tw-ring-opacity,1))}.dark\:focus\:pi-ring-offset-black:focus:where(.pi-dark,.pi-dark *){--tw-ring-offset-color:#000}.dark\:active\:pi-border-emerald-200:active:where(.pi-dark,.pi-dark *){--tw-border-opacity:1;border-color:rgb(167 243 208/var(--tw-border-opacity,1))}.dark\:active\:focus\:pi-border-emerald-200:focus:active:where(.pi-dark,.pi-dark *){--tw-border-opacity:1;border-color:rgb(167 243 208/var(--tw-border-opacity,1))}.dark\:enabled\:hover\:pi-bg-gray-600:hover:enabled:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.dark\:enabled\:hover\:pi-bg-gray-600\/30:hover:enabled:where(.pi-dark,.pi-dark *){background-color:#4b55634d}
|
|
1
|
+
*,::backdrop,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#3b82f680;--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }@supports (-moz-appearance:none){*{scrollbar-color:auto;scrollbar-width:auto}}.pi-pointer-events-none{pointer-events:none}.pi-pointer-events-auto{pointer-events:auto}.pi-fixed{position:fixed}.pi-absolute{position:absolute}.pi-relative{position:relative}.pi-inset-0{inset:0}.pi--right-6{right:-1.5rem}.pi-bottom-6{bottom:1.5rem}.pi-left-0{left:0}.pi-right-0{right:0}.pi-right-6,.pi-right-\[1\.5rem\]{right:1.5rem}.pi-right-\[4\.5rem\]{right:4.5rem}.pi-top-0{top:0}.-pi-z-10{z-index:-10}.pi-z-1000{z-index:1000}.pi-z-20{z-index:20}.pi-z-30{z-index:30}.pi-z-50{z-index:50}.pi-col-span-2{grid-column:span 2/span 2}.pi-col-start-auto{grid-column-start:auto}.pi-mx-auto{margin-left:auto;margin-right:auto}.-pi-mr-10{margin-right:-2.5rem}.-pi-mt-10{margin-top:-2.5rem}.pi--ml-28{margin-left:-7rem}.pi--mt-1{margin-top:-.25rem}.pi-mb-3{margin-bottom:.75rem}.pi-mb-4{margin-bottom:1rem}.pi-mb-6{margin-bottom:1.5rem}.pi-ml-1{margin-left:.25rem}.pi-ml-11{margin-left:2.75rem}.pi-ml-16{margin-left:4rem}.pi-ml-20{margin-left:5rem}.pi-ml-4{margin-left:1rem}.pi-ml-5{margin-left:1.25rem}.pi-ml-6{margin-left:1.5rem}.pi-ml-9{margin-left:2.25rem}.pi-ml-\[1\.49rem\]{margin-left:1.49rem}.pi-ml-\[1\.4rem\]{margin-left:1.4rem}.pi-mr-1{margin-right:.25rem}.pi-mr-2{margin-right:.5rem}.pi-mr-4{margin-right:1rem}.pi-mr-\[0\.27rem\]{margin-right:.27rem}.pi-mr-\[0\.28rem\]{margin-right:.28rem}.pi-mr-\[0\.42rem\]{margin-right:.42rem}.pi-mr-\[0\.4rem\]{margin-right:.4rem}.pi-mr-\[0\.57rem\]{margin-right:.57rem}.pi-mt-1{margin-top:.25rem}.pi-mt-12{margin-top:3rem}.pi-mt-2{margin-top:.5rem}.pi-mt-4{margin-top:1rem}.pi-mt-7{margin-top:1.75rem}.pi-mt-8{margin-top:2rem}.pi-mt-\[-12\.5rem\]{margin-top:-12.5rem}.pi-mt-\[-8\.5rem\]{margin-top:-8.5rem}.pi-block{display:block}.pi-inline-block{display:inline-block}.pi-flex{display:flex}.pi-inline-flex{display:inline-flex}.pi-grid{display:grid}.pi-hidden{display:none}.pi-h-1{height:.25rem}.pi-h-10{height:2.5rem}.pi-h-12{height:3rem}.pi-h-3{height:.75rem}.pi-h-4{height:1rem}.pi-h-40{height:10rem}.pi-h-5{height:1.25rem}.pi-h-6{height:1.5rem}.pi-h-8{height:2rem}.pi-h-9{height:2.25rem}.pi-h-fit{height:fit-content}.pi-h-full{height:100%}.pi-max-h-48{max-height:12rem}.pi-max-h-\[13\.125rem\]{max-height:13.125rem}.pi-max-h-\[9\.125rem\]{max-height:9.125rem}.pi-min-h-full{min-height:100%}.pi-w-0\.5{width:.125rem}.pi-w-10{width:2.5rem}.pi-w-12{width:3rem}.pi-w-16{width:4rem}.pi-w-2{width:.5rem}.pi-w-3{width:.75rem}.pi-w-4{width:1rem}.pi-w-44{width:11rem}.pi-w-5{width:1.25rem}.pi-w-56{width:14rem}.pi-w-6{width:1.5rem}.pi-w-8{width:2rem}.pi-w-9{width:2.25rem}.pi-w-\[98rem\]{width:98rem}.pi-w-fit{width:fit-content}.pi-w-full{width:100%}.pi-min-w-12{min-width:3rem}.pi-min-w-\[120px\]{min-width:120px}.pi-min-w-full{min-width:100%}.pi-max-w-16{max-width:4rem}.pi-max-w-40{max-width:10rem}.pi-max-w-44{max-width:11rem}.pi-max-w-60{max-width:15rem}.pi-max-w-\[100rem\]{max-width:100rem}.pi-flex-1{flex:1 1 0%}.pi-flex-none{flex:none}.pi-flex-shrink-0,.pi-shrink-0{flex-shrink:0}.pi-flex-grow{flex-grow:1}.pi-flex-grow-0{flex-grow:0}.pi-origin-top-right{transform-origin:top right}.pi--translate-y-1\/2{--tw-translate-y:-50%}.pi--rotate-45,.pi--translate-y-1\/2{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.pi--rotate-45{--tw-rotate:-45deg}.pi-rotate-135{--tw-rotate:135deg}.pi-rotate-135,.pi-rotate-45{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.pi-rotate-45{--tw-rotate:45deg}.pi-rotate-90{--tw-rotate:90deg}.pi-rotate-90,.pi-rotate-\[135deg\]{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.pi-rotate-\[135deg\]{--tw-rotate:135deg}.pi-transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pi-ping{75%,to{opacity:0;transform:scale(2)}}.pi-animate-ping{animation:pi-ping 1s cubic-bezier(0,0,.2,1) infinite}@keyframes pi-scroll{0%{transform:translateX(0)}to{transform:translateX(-100%)}}.pi-animate-scroll-text{animation:pi-scroll 10s linear infinite}.pi-cursor-auto{cursor:auto}.pi-cursor-pointer{cursor:pointer}.pi-auto-cols-max{grid-auto-columns:max-content}.pi-grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.pi-grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.pi-grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.pi-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.pi-flex-col{flex-direction:column}.pi-place-items-center{place-items:center}.pi-content-center{align-content:center}.pi-items-center{align-items:center}.pi-justify-start{justify-content:flex-start}.pi-justify-end{justify-content:flex-end}.pi-justify-center{justify-content:center}.pi-justify-between{justify-content:space-between}.pi-justify-items-end{justify-items:end}.pi-justify-items-center{justify-items:center}.pi-gap-1{gap:.25rem}.pi-gap-2{gap:.5rem}.pi-gap-3{gap:.75rem}.pi-gap-3\.5{gap:.875rem}.pi-gap-4{gap:1rem}.pi-gap-5{gap:1.25rem}.pi-gap-6{gap:1.5rem}.pi-gap-7{gap:1.75rem}.pi-gap-y-5{row-gap:1.25rem}.pi-gap-y-6{row-gap:1.5rem}.pi-space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.5rem*var(--tw-space-x-reverse))}.pi-space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.pi-space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.5rem*var(--tw-space-y-reverse));margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)))}.pi-overflow-hidden{overflow:hidden}.pi-overflow-y-auto{overflow-y:auto}.pi-overflow-x-hidden{overflow-x:hidden}.pi-truncate{overflow:hidden;white-space:nowrap}.pi-text-ellipsis,.pi-truncate{text-overflow:ellipsis}.pi-whitespace-nowrap{white-space:nowrap}.pi-rounded{border-radius:.25rem}.pi-rounded-2xl{border-radius:1rem}.pi-rounded-3xl{border-radius:1.5rem}.pi-rounded-full{border-radius:9999px}.pi-rounded-lg{border-radius:.5rem}.pi-rounded-md{border-radius:.375rem}.pi-rounded-sm{border-radius:.125rem}.pi-rounded-xl{border-radius:.75rem}.pi-border{border-width:1px}.pi-border-2{border-width:2px}.pi-border-4{border-width:4px}.pi-border-l-4{border-left-width:4px}.pi-border-t{border-top-width:1px}.pi-border-emerald-500{--tw-border-opacity:1;border-color:rgb(16 185 129/var(--tw-border-opacity,1))}.pi-border-gray-300{--tw-border-opacity:1;border-color:rgb(209 213 219/var(--tw-border-opacity,1))}.pi-border-gray-400{--tw-border-opacity:1;border-color:rgb(156 163 175/var(--tw-border-opacity,1))}.pi-border-gray-700{--tw-border-opacity:1;border-color:rgb(55 65 81/var(--tw-border-opacity,1))}.pi-border-green-600{--tw-border-opacity:1;border-color:rgb(22 163 74/var(--tw-border-opacity,1))}.pi-border-orange-600{--tw-border-opacity:1;border-color:rgb(234 88 12/var(--tw-border-opacity,1))}.pi-border-red-600{--tw-border-opacity:1;border-color:rgb(220 38 38/var(--tw-border-opacity,1))}.pi-border-transparent{border-color:#0000}.pi-border-white{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity,1))}.pi-bg-emerald-100{--tw-bg-opacity:1;background-color:rgb(209 250 229/var(--tw-bg-opacity,1))}.pi-bg-emerald-700{--tw-bg-opacity:1;background-color:rgb(4 120 87/var(--tw-bg-opacity,1))}.pi-bg-gray-200{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.pi-bg-gray-300{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity,1))}.pi-bg-gray-50{--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.pi-bg-gray-500{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))}.pi-bg-gray-600{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.pi-bg-gray-700{--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.pi-bg-gray-950{--tw-bg-opacity:1;background-color:rgb(3 7 18/var(--tw-bg-opacity,1))}.pi-bg-green-200{--tw-bg-opacity:1;background-color:rgb(187 247 208/var(--tw-bg-opacity,1))}.pi-bg-green-400{--tw-bg-opacity:1;background-color:rgb(74 222 128/var(--tw-bg-opacity,1))}.pi-bg-green-500{--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity,1))}.pi-bg-green-700{--tw-bg-opacity:1;background-color:rgb(21 128 61/var(--tw-bg-opacity,1))}.pi-bg-red-400{--tw-bg-opacity:1;background-color:rgb(248 113 113/var(--tw-bg-opacity,1))}.pi-bg-red-500{--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.pi-bg-red-700{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity,1))}.pi-bg-rose-200{--tw-bg-opacity:1;background-color:rgb(254 205 211/var(--tw-bg-opacity,1))}.pi-bg-transparent{background-color:initial}.pi-bg-white{--tw-bg-opacity:1;background-color:rgb(255 255 255/var(--tw-bg-opacity,1))}.pi-bg-opacity-\[0\.99\]{--tw-bg-opacity:0.99}.pi-bg-gradient-to-b{background-image:linear-gradient(to bottom,var(--tw-gradient-stops))}.pi-bg-gradient-to-r{background-image:linear-gradient(to right,var(--tw-gradient-stops))}.pi-from-gray-100{--tw-gradient-from:#f3f4f6 var(--tw-gradient-from-position);--tw-gradient-to:#f3f4f600 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.pi-from-transparent{--tw-gradient-from:#0000 var(--tw-gradient-from-position);--tw-gradient-to:#0000 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.pi-to-gray-50{--tw-gradient-to:#f9fafb var(--tw-gradient-to-position)}.pi-to-gray-700{--tw-gradient-to:#374151 var(--tw-gradient-to-position)}.pi-to-transparent{--tw-gradient-to:#0000 var(--tw-gradient-to-position)}.pi-bg-cover{background-size:cover}.pi-p-4{padding:1rem}.pi-p-6{padding:1.5rem}.pi-px-0\.5{padding-left:.125rem;padding-right:.125rem}.pi-px-2{padding-left:.5rem;padding-right:.5rem}.pi-px-3{padding-left:.75rem;padding-right:.75rem}.pi-px-4{padding-left:1rem;padding-right:1rem}.pi-px-6{padding-left:1.5rem;padding-right:1.5rem}.pi-py-1{padding-bottom:.25rem;padding-top:.25rem}.pi-py-2{padding-bottom:.5rem;padding-top:.5rem}.pi-py-3{padding-bottom:.75rem;padding-top:.75rem}.pi-py-4{padding-bottom:1rem;padding-top:1rem}.pi-py-6{padding-bottom:1.5rem;padding-top:1.5rem}.pi-pb-9{padding-bottom:2.25rem}.pi-pr-4{padding-right:1rem}.pi-pt-2{padding-top:.5rem}.pi-pt-3{padding-top:.75rem}.pi-pt-4{padding-top:1rem}.pi-pt-7{padding-top:1.75rem}.pi-pt-9{padding-top:2.25rem}.pi-text-center{text-align:center}.pi-text-2xl{font-size:1.5rem;line-height:2rem}.pi-text-4xl{font-size:2.25rem;line-height:2.5rem}.pi-text-base{font-size:1rem;line-height:1.5rem}.pi-text-lg{font-size:1.125rem;line-height:1.75rem}.pi-text-sm{font-size:.875rem;line-height:1.25rem}.pi-text-xl{font-size:1.25rem;line-height:1.75rem}.pi-text-xs{font-size:.75rem;line-height:1rem}.pi-font-bold{font-weight:700}.pi-font-light{font-weight:300}.pi-font-medium{font-weight:500}.pi-font-normal{font-weight:400}.pi-font-semibold{font-weight:600}.pi-leading-4{line-height:1rem}.pi-leading-5{line-height:1.25rem}.pi-leading-6{line-height:1.5rem}.pi-leading-7{line-height:1.75rem}.pi-tracking-wide{letter-spacing:.025em}.pi-text-emerald-600{--tw-text-opacity:1;color:rgb(5 150 105/var(--tw-text-opacity,1))}.pi-text-emerald-700{--tw-text-opacity:1;color:rgb(4 120 87/var(--tw-text-opacity,1))}.pi-text-gray-400{--tw-text-opacity:1;color:rgb(156 163 175/var(--tw-text-opacity,1))}.pi-text-gray-50{--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity,1))}.pi-text-gray-600{--tw-text-opacity:1;color:rgb(75 85 99/var(--tw-text-opacity,1))}.pi-text-gray-700{--tw-text-opacity:1;color:rgb(55 65 81/var(--tw-text-opacity,1))}.pi-text-gray-800{--tw-text-opacity:1;color:rgb(31 41 55/var(--tw-text-opacity,1))}.pi-text-gray-900{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.pi-text-gray-950{--tw-text-opacity:1;color:rgb(3 7 18/var(--tw-text-opacity,1))}.pi-text-green-500{--tw-text-opacity:1;color:rgb(34 197 94/var(--tw-text-opacity,1))}.pi-text-green-600{--tw-text-opacity:1;color:rgb(22 163 74/var(--tw-text-opacity,1))}.pi-text-green-700{--tw-text-opacity:1;color:rgb(21 128 61/var(--tw-text-opacity,1))}.pi-text-indigo-800{--tw-text-opacity:1;color:rgb(55 48 163/var(--tw-text-opacity,1))}.pi-text-red-500{--tw-text-opacity:1;color:rgb(239 68 68/var(--tw-text-opacity,1))}.pi-text-rose-700{--tw-text-opacity:1;color:rgb(190 18 60/var(--tw-text-opacity,1))}.pi-text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.pi-placeholder-gray-800::placeholder{--tw-placeholder-opacity:1;color:rgb(31 41 55/var(--tw-placeholder-opacity,1))}.pi-opacity-60{opacity:.6}.pi-opacity-75{opacity:.75}.pi-shadow{--tw-shadow:0 1px 3px 0 #0000001a,0 1px 2px -1px #0000001a;--tw-shadow-colored:0 1px 3px 0 var(--tw-shadow-color),0 1px 2px -1px var(--tw-shadow-color)}.pi-shadow,.pi-shadow-lg{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.pi-shadow-lg{--tw-shadow:0 10px 15px -3px #0000001a,0 4px 6px -4px #0000001a;--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color)}.pi-shadow-md{--tw-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a;--tw-shadow-colored:0 4px 6px -1px var(--tw-shadow-color),0 2px 4px -2px var(--tw-shadow-color)}.pi-shadow-md,.pi-shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.pi-shadow-sm{--tw-shadow:0 1px 2px 0 #0000000d;--tw-shadow-colored:0 1px 2px 0 var(--tw-shadow-color)}.pi-outline-none{outline:2px solid #0000;outline-offset:2px}.pi-ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.pi-ring-black{--tw-ring-opacity:1;--tw-ring-color:rgb(0 0 0/var(--tw-ring-opacity,1))}.pi-ring-opacity-5{--tw-ring-opacity:0.05}.pi-transition{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.pi-transition-colors{transition-duration:.15s;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.pi-transition-shadow{transition-duration:.15s;transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1)}.pi-duration-200{transition-duration:.2s}.pi-scrollbar-thin::-webkit-scrollbar-track{background-color:var(--scrollbar-track);border-radius:var(--scrollbar-track-radius)}.pi-scrollbar-thin::-webkit-scrollbar-track:hover{background-color:var(--scrollbar-track-hover,var(--scrollbar-track))}.pi-scrollbar-thin::-webkit-scrollbar-track:active{background-color:var(--scrollbar-track-active,var(--scrollbar-track-hover,var(--scrollbar-track)))}.pi-scrollbar-thin::-webkit-scrollbar-thumb{background-color:var(--scrollbar-thumb);border-radius:var(--scrollbar-thumb-radius)}.pi-scrollbar-thin::-webkit-scrollbar-thumb:hover{background-color:var(--scrollbar-thumb-hover,var(--scrollbar-thumb))}.pi-scrollbar-thin::-webkit-scrollbar-thumb:active{background-color:var(--scrollbar-thumb-active,var(--scrollbar-thumb-hover,var(--scrollbar-thumb)))}.pi-scrollbar-thin::-webkit-scrollbar-corner{background-color:var(--scrollbar-corner);border-radius:var(--scrollbar-corner-radius)}.pi-scrollbar-thin::-webkit-scrollbar-corner:hover{background-color:var(--scrollbar-corner-hover,var(--scrollbar-corner))}.pi-scrollbar-thin::-webkit-scrollbar-corner:active{background-color:var(--scrollbar-corner-active,var(--scrollbar-corner-hover,var(--scrollbar-corner)))}@supports (-moz-appearance:none){.pi-scrollbar-thin{scrollbar-color:var(--scrollbar-thumb,initial) var(--scrollbar-track,initial);scrollbar-width:thin}}.pi-scrollbar-thin::-webkit-scrollbar{display:block;height:8px;width:8px}.pi-scrollbar-track-gray-200{--scrollbar-track:#e5e7eb!important}.pi-scrollbar-thumb-gray-400{--scrollbar-thumb:#9ca3af!important}.pi-scrollbar-track-rounded-full{--scrollbar-track-radius:9999px}.pi-scrollbar-thumb-rounded-full{--scrollbar-thumb-radius:9999px}.hover\:pi-scale-110:hover{--tw-scale-x:1.1;--tw-scale-y:1.1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:pi-bg-gray-200:hover{--tw-bg-opacity:1;background-color:rgb(229 231 235/var(--tw-bg-opacity,1))}.hover\:pi-bg-gray-300:hover{--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity,1))}.hover\:pi-bg-gray-500:hover{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))}.hover\:pi-bg-gray-800:hover{--tw-bg-opacity:1;background-color:rgb(31 41 55/var(--tw-bg-opacity,1))}.hover\:pi-bg-green-600:hover{--tw-bg-opacity:1;background-color:rgb(22 163 74/var(--tw-bg-opacity,1))}.hover\:pi-bg-red-700:hover{--tw-bg-opacity:1;background-color:rgb(185 28 28/var(--tw-bg-opacity,1))}.hover\:pi-text-emerald-800:hover{--tw-text-opacity:1;color:rgb(6 95 70/var(--tw-text-opacity,1))}.hover\:pi-text-gray-50:hover{--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity,1))}.hover\:pi-text-gray-900:hover{--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.hover\:pi-shadow-2xl:hover{--tw-shadow:0 25px 50px -12px #00000040;--tw-shadow-colored:0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.focus\:pi-z-20:focus{z-index:20}.focus\:pi-border-emerald-500:focus{--tw-border-opacity:1;border-color:rgb(16 185 129/var(--tw-border-opacity,1))}.focus\:pi-outline-0:focus{outline-width:0}.focus\:pi-ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:pi-ring-0:focus,.focus\:pi-ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:pi-ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:pi-ring-emerald-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(16 185 129/var(--tw-ring-opacity,1))}.focus\:pi-ring-gray-400:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(156 163 175/var(--tw-ring-opacity,1))}.focus\:pi-ring-gray-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(107 114 128/var(--tw-ring-opacity,1))}.focus\:pi-ring-green-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(34 197 94/var(--tw-ring-opacity,1))}.focus\:pi-ring-offset-2:focus{--tw-ring-offset-width:2px}.focus\:pi-ring-offset-gray-200:focus{--tw-ring-offset-color:#e5e7eb}.focus\:pi-ring-offset-white:focus{--tw-ring-offset-color:#fff}.active\:pi-border-emerald-500:active{--tw-border-opacity:1;border-color:rgb(16 185 129/var(--tw-border-opacity,1))}.enabled\:hover\:pi-border-gray-500:hover:enabled{--tw-border-opacity:1;border-color:rgb(107 114 128/var(--tw-border-opacity,1))}.enabled\:hover\:pi-bg-gray-200\/70:hover:enabled{background-color:#e5e7ebb3}.enabled\:hover\:pi-bg-gray-500:hover:enabled{--tw-bg-opacity:1;background-color:rgb(107 114 128/var(--tw-bg-opacity,1))}.enabled\:hover\:pi-bg-gray-600:hover:enabled{--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.disabled\:pi-opacity-75:disabled{opacity:.75}@media (min-width:768px){.md\:pi-grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}.dark\:pi-border-emerald-200:where(.pi-dark,.pi-dark *){--tw-border-opacity:1;border-color:rgb(167 243 208/var(--tw-border-opacity,1))}.dark\:pi-border-gray-600:where(.pi-dark,.pi-dark *){--tw-border-opacity:1;border-color:rgb(75 85 99/var(--tw-border-opacity,1))}.dark\:pi-bg-emerald-500:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(16 185 129/var(--tw-bg-opacity,1))}.dark\:pi-bg-emerald-600:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(5 150 105/var(--tw-bg-opacity,1))}.dark\:pi-bg-gray-300:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(209 213 219/var(--tw-bg-opacity,1))}.dark\:pi-bg-gray-50:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.dark\:pi-bg-gray-700:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.dark\:pi-bg-gray-950:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(3 7 18/var(--tw-bg-opacity,1))}.dark\:pi-bg-green-500:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(34 197 94/var(--tw-bg-opacity,1))}.dark\:pi-bg-green-900:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(20 83 45/var(--tw-bg-opacity,1))}.dark\:pi-bg-red-500:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(239 68 68/var(--tw-bg-opacity,1))}.dark\:pi-bg-rose-900:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(136 19 55/var(--tw-bg-opacity,1))}.dark\:pi-bg-opacity-\[0\.99\]:where(.pi-dark,.pi-dark *){--tw-bg-opacity:0.99}.dark\:pi-from-black:where(.pi-dark,.pi-dark *){--tw-gradient-from:#000 var(--tw-gradient-from-position);--tw-gradient-to:#0000 var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.dark\:pi-to-gray-950:where(.pi-dark,.pi-dark *){--tw-gradient-to:#030712 var(--tw-gradient-to-position)}.dark\:pi-text-emerald-500:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(16 185 129/var(--tw-text-opacity,1))}.dark\:pi-text-gray-100:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(243 244 246/var(--tw-text-opacity,1))}.dark\:pi-text-gray-200:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(229 231 235/var(--tw-text-opacity,1))}.dark\:pi-text-gray-300:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(209 213 219/var(--tw-text-opacity,1))}.dark\:pi-text-gray-50:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity,1))}.dark\:pi-text-gray-900:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(17 24 39/var(--tw-text-opacity,1))}.dark\:pi-text-gray-950:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(3 7 18/var(--tw-text-opacity,1))}.dark\:pi-text-green-200:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(187 247 208/var(--tw-text-opacity,1))}.dark\:pi-text-green-400:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(74 222 128/var(--tw-text-opacity,1))}.dark\:pi-text-indigo-300:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(165 180 252/var(--tw-text-opacity,1))}.dark\:pi-text-rose-200:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(254 205 211/var(--tw-text-opacity,1))}.dark\:pi-text-white:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity,1))}.dark\:pi-placeholder-gray-200:where(.pi-dark,.pi-dark *)::placeholder{--tw-placeholder-opacity:1;color:rgb(229 231 235/var(--tw-placeholder-opacity,1))}.dark\:pi-scrollbar-track-gray-900:where(.pi-dark,.pi-dark *){--scrollbar-track:#111827!important}.dark\:hover\:pi-bg-gray-50:hover:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(249 250 251/var(--tw-bg-opacity,1))}.dark\:hover\:pi-bg-gray-600:hover:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.dark\:hover\:pi-bg-gray-700:hover:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(55 65 81/var(--tw-bg-opacity,1))}.dark\:hover\:pi-bg-green-300:hover:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(134 239 172/var(--tw-bg-opacity,1))}.dark\:hover\:pi-bg-red-300:hover:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(252 165 165/var(--tw-bg-opacity,1))}.dark\:hover\:pi-text-gray-50:hover:where(.pi-dark,.pi-dark *){--tw-text-opacity:1;color:rgb(249 250 251/var(--tw-text-opacity,1))}.dark\:focus\:pi-border-emerald-200:focus:where(.pi-dark,.pi-dark *){--tw-border-opacity:1;border-color:rgb(167 243 208/var(--tw-border-opacity,1))}.dark\:focus\:pi-ring-emerald-300:focus:where(.pi-dark,.pi-dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(110 231 183/var(--tw-ring-opacity,1))}.dark\:focus\:pi-ring-gray-500:focus:where(.pi-dark,.pi-dark *){--tw-ring-opacity:1;--tw-ring-color:rgb(107 114 128/var(--tw-ring-opacity,1))}.dark\:focus\:pi-ring-offset-black:focus:where(.pi-dark,.pi-dark *){--tw-ring-offset-color:#000}.dark\:active\:pi-border-emerald-200:active:where(.pi-dark,.pi-dark *){--tw-border-opacity:1;border-color:rgb(167 243 208/var(--tw-border-opacity,1))}.dark\:active\:focus\:pi-border-emerald-200:focus:active:where(.pi-dark,.pi-dark *){--tw-border-opacity:1;border-color:rgb(167 243 208/var(--tw-border-opacity,1))}.dark\:enabled\:hover\:pi-bg-gray-600:hover:enabled:where(.pi-dark,.pi-dark *){--tw-bg-opacity:1;background-color:rgb(75 85 99/var(--tw-bg-opacity,1))}.dark\:enabled\:hover\:pi-bg-gray-600\/30:hover:enabled:where(.pi-dark,.pi-dark *){background-color:#4b55634d}
|
package/dist/lib/i18n.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"i18n.js","sources":["../../src/lib/i18n.ts"],"sourcesContent":["import i18next from 'i18next'\nimport { initReactI18next } from 'react-i18next'\nimport LanguageDetector from 'i18next-browser-languagedetector'\nimport en from '../../public/locales/en/translation.json'\nimport it from '../../public/locales/it/translation.json'\n\nlet isInitialized = false\n\nexport const initI18n = () => {\n if (isInitialized) {\n return Promise.resolve()\n }\n\n const i18nConfig = {\n resources: {\n en: { translations: en },\n it: { translations: it }\n },\n fallbackLng: 'en',\n ns: ['translations'],\n defaultNS: 'translations',\n interpolation: {\n escapeValue: false\n },\n detection: {\n order: ['navigator']\n },\n react: {\n useSuspense: false\n },\n supportedLngs: ['en', 'it']\n }\n\n isInitialized = true\n return i18next\n .use(LanguageDetector)\n .use(initReactI18next)\n .init(i18nConfig)\n}\n\
|
|
1
|
+
{"version":3,"file":"i18n.js","sources":["../../src/lib/i18n.ts"],"sourcesContent":["import i18next from 'i18next'\nimport { initReactI18next } from 'react-i18next'\nimport LanguageDetector from 'i18next-browser-languagedetector'\nimport en from '../../public/locales/en/translation.json'\nimport it from '../../public/locales/it/translation.json'\n\nlet isInitialized = false\n\nexport const initI18n = () => {\n if (isInitialized) {\n return Promise.resolve()\n }\n\n const i18nConfig = {\n resources: {\n en: { translations: en },\n it: { translations: it }\n },\n fallbackLng: 'en',\n ns: ['translations'],\n defaultNS: 'translations',\n interpolation: {\n escapeValue: false\n },\n detection: {\n order: ['navigator']\n },\n react: {\n useSuspense: false\n },\n supportedLngs: ['en', 'it']\n }\n\n isInitialized = true\n return i18next\n .use(LanguageDetector)\n .use(initReactI18next)\n .init(i18nConfig)\n}\n\nexport default i18next.createInstance()\n"],"names":["isInitialized","i18next","createInstance","Promise","resolve","i18nConfig","resources","en","translations","it","fallbackLng","ns","defaultNS","interpolation","escapeValue","detection","order","react","useSuspense","supportedLngs","use","LanguageDetector","initReactI18next","init"],"mappings":"20BAMIA,GAAgB,EAkCLC,EAAO,QAACC,kCAhCC,WACtB,GAAIF,EACF,OAAOG,QAAQC,UAGjB,IAAMC,EAAa,CACjBC,UAAW,CACTC,GAAI,CAAEC,aAAcD,WACpBE,GAAI,CAAED,aAAcC,YAEtBC,YAAa,KACbC,GAAI,CAAC,gBACLC,UAAW,eACXC,cAAe,CACbC,aAAa,GAEfC,UAAW,CACTC,MAAO,CAAC,cAEVC,MAAO,CACLC,aAAa,GAEfC,cAAe,CAAC,KAAM,OAIxB,OADAnB,GAAgB,EACTC,EAAO,QACXmB,IAAIC,EAAAA,SACJD,IAAIE,EAAAA,kBACJC,KAAKlB,EACV"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("./genericFunctions/isEmpty.js");exports.getAvailableDevices=function(n,i){var t;if(!(null===(t=null==n?void 0:n.endpoints)||void 0===t?void 0:t.extension)||!(null==i?void 0:i.extensions))return[];var o=Object.keys((null==n?void 0:n.conversations)||{}).filter((function(i){return!e.isEmpty(null==n?void 0:n.conversations[i])}));return n.endpoints.extension.filter((function(e){var n,t=null==e?void 0:e.id,l=null===(n=null==i?void 0:i.extensions[t])||void 0===n?void 0:n.status;return t&&"online"===l&&!(null==o?void 0:o.includes(t))&&"webrtc"!==e.type&&"nethlink"!==e.type}))};
|
|
2
2
|
//# sourceMappingURL=deviceUtils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deviceUtils.js","sources":["../../src/utils/deviceUtils.ts"],"sourcesContent":["import { isEmpty } from './genericFunctions/isEmpty'\n\nexport const getAvailableDevices = (userInfo: any, allUsers: any) => {\n // Get IDs of devices with active conversations\n const activeConversationIds = Object.keys(userInfo?.conversations || {}).filter(\n (id) => !isEmpty(userInfo
|
|
1
|
+
{"version":3,"file":"deviceUtils.js","sources":["../../src/utils/deviceUtils.ts"],"sourcesContent":["import { isEmpty } from './genericFunctions/isEmpty'\n\nexport const getAvailableDevices = (userInfo: any, allUsers: any) => {\n // Return empty array if required data is missing\n if (!userInfo?.endpoints?.extension || !allUsers?.extensions) {\n return []\n }\n\n // Get IDs of devices with active conversations\n const activeConversationIds = Object.keys(userInfo?.conversations || {}).filter(\n (id) => !isEmpty(userInfo?.conversations[id]),\n )\n\n // Filter online devices that are not in conversations\n return userInfo.endpoints.extension.filter((device: any) => {\n const deviceId = device?.id\n const deviceStatus = allUsers?.extensions[deviceId]?.status\n\n return (\n deviceId &&\n deviceStatus === 'online' &&\n !activeConversationIds?.includes(deviceId) &&\n device.type !== 'webrtc' &&\n device.type !== 'nethlink'\n )\n })\n}\n"],"names":["userInfo","allUsers","_a","endpoints","extension","extensions","activeConversationIds","Object","keys","conversations","filter","id","isEmpty","device","deviceId","deviceStatus","status","includes","type"],"mappings":"+IAEmC,SAACA,EAAeC,SAEjD,KAA0B,QAArBC,EAAAF,aAAA,EAAAA,EAAUG,iBAAW,IAAAD,OAAA,EAAAA,EAAAE,cAAcH,eAAAA,EAAUI,YAChD,MAAO,GAIT,IAAMC,EAAwBC,OAAOC,MAAKR,aAAQ,EAARA,EAAUS,gBAAiB,CAAA,GAAIC,QACvE,SAACC,GAAO,OAACC,EAAOA,QAACZ,aAAQ,EAARA,EAAUS,cAAcE,GAAI,IAI/C,OAAOX,EAASG,UAAUC,UAAUM,QAAO,SAACG,SACpCC,EAAWD,aAAA,EAAAA,EAAQF,GACnBI,EAA6C,QAA9Bb,EAAAD,aAAQ,EAARA,EAAUI,WAAWS,UAAS,IAAAZ,OAAA,EAAAA,EAAEc,OAErD,OACEF,GACiB,WAAjBC,KACCT,aAAqB,EAArBA,EAAuBW,SAASH,KACjB,WAAhBD,EAAOK,MACS,aAAhBL,EAAOK,IAEX,GACF"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nethesis/phone-island",
|
|
3
3
|
"author": "Nethesis",
|
|
4
|
-
"version": "0.10.
|
|
4
|
+
"version": "0.10.2",
|
|
5
5
|
"description": "NethVoice CTI Phone Island",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"nethserver",
|
|
@@ -82,7 +82,8 @@
|
|
|
82
82
|
"publish:minor": "npm version minor --allow-same-version -m v%s --force",
|
|
83
83
|
"publish:major": "npm version major --allow-same-version -m v%s --force",
|
|
84
84
|
"publish:patch": "npm version patch --allow-same-version -m v%s --force",
|
|
85
|
-
"
|
|
85
|
+
"preversion": "npm run build:widget && git add dist-widget/index.widget.js dist-widget/index.widget.css && git commit -m 'chore(widget): release for jsDelivr'",
|
|
86
|
+
"postversion": "git push origin main --tags",
|
|
86
87
|
"revert-bump": "node revert-bump.js"
|
|
87
88
|
},
|
|
88
89
|
"browserslist": {
|