xertica-ui 2.5.1 → 2.5.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.
Files changed (535) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +14 -16
  3. package/assets/xertica-logo.svg +37 -37
  4. package/assets/xertica-x-logo.svg +20 -20
  5. package/bin/generate-tokens.ts +262 -262
  6. package/bin/language-config.ts +359 -358
  7. package/components/assistant/code-block/CodeBlock.tsx +268 -268
  8. package/components/assistant/formatted-document/FormattedDocument.tsx +147 -147
  9. package/components/assistant/modern-chat-input/ModernChatInput.tsx +564 -564
  10. package/components/assistant/xertica-assistant/parts/AssistantCollapsedView.tsx +99 -99
  11. package/components/assistant/xertica-assistant/parts/AssistantConversationList.tsx +104 -104
  12. package/components/assistant/xertica-assistant/parts/AssistantDocumentEditor.tsx +81 -81
  13. package/components/assistant/xertica-assistant/parts/AssistantFeedbackDialog.tsx +88 -88
  14. package/components/assistant/xertica-assistant/parts/AssistantHeader.tsx +75 -75
  15. package/components/assistant/xertica-assistant/parts/AssistantMessageBubble.tsx +564 -564
  16. package/components/assistant/xertica-assistant/parts/AssistantTabBar.tsx +67 -67
  17. package/components/assistant/xertica-assistant/parts/AssistantWelcomeScreen.tsx +103 -103
  18. package/components/assistant/xertica-assistant/use-assistant.ts +615 -615
  19. package/components/assistant/xertica-assistant/xertica-assistant.tsx +611 -611
  20. package/components/blocks/card-patterns/ActivityCard.tsx +100 -100
  21. package/components/blocks/card-patterns/ActivityCardSkeleton.tsx +56 -56
  22. package/components/blocks/card-patterns/FeatureCardSkeleton.tsx +58 -58
  23. package/components/blocks/card-patterns/NotificationCard.tsx +140 -140
  24. package/components/blocks/card-patterns/NotificationCardSkeleton.tsx +81 -81
  25. package/components/blocks/card-patterns/ProfileCard.tsx +112 -112
  26. package/components/blocks/card-patterns/ProfileCardSkeleton.tsx +69 -69
  27. package/components/blocks/card-patterns/ProjectCard.tsx +123 -123
  28. package/components/blocks/card-patterns/ProjectCardSkeleton.tsx +67 -67
  29. package/components/blocks/card-patterns/QuickActionCardSkeleton.tsx +44 -44
  30. package/components/blocks/card-patterns/card-patterns.stories.tsx +594 -594
  31. package/components/blocks/card-patterns/index.ts +29 -29
  32. package/components/brand/language-selector/LanguageSelector.tsx +102 -102
  33. package/components/brand/language-selector/language-selector.stories.tsx +111 -111
  34. package/components/brand/language-selector/language-selector.test.tsx +101 -101
  35. package/components/brand/theme-toggle/ThemeToggle.tsx +74 -74
  36. package/components/brand/xertica-provider/xertica-provider.mdx +61 -61
  37. package/components/index.ts +86 -86
  38. package/components/layout/sidebar/sidebar.mdx +1 -1
  39. package/components/layout/sidebar/sidebar.stories.tsx +1033 -787
  40. package/components/layout/sidebar/sidebar.tsx +338 -1
  41. package/components/media/FloatingMediaWrapper.tsx +371 -371
  42. package/components/media/audio-player/AudioPlayer.tsx +768 -768
  43. package/components/media/video-player/VideoPlayer.tsx +310 -310
  44. package/components/pages/home-content/HomeContent.tsx +120 -120
  45. package/components/pages/home-content/home-content.mdx +62 -62
  46. package/components/pages/home-page/HomePage.tsx +78 -78
  47. package/components/pages/home-page/home-page.mdx +53 -53
  48. package/components/pages/template-content/TemplateContent.tsx +1354 -1354
  49. package/components/pages/template-content/template-content.mdx +61 -61
  50. package/components/pages/template-page/TemplatePage.stories.tsx +32 -32
  51. package/components/pages/template-page/template-page.mdx +53 -53
  52. package/components/shared/error-boundary.stories.tsx +114 -114
  53. package/components/shared/error-boundary.tsx +150 -150
  54. package/components/shared/error-fallbacks.tsx +222 -222
  55. package/components/ui/accordion/accordion.mdx +8 -8
  56. package/components/ui/alert/alert.mdx +8 -8
  57. package/components/ui/alert-dialog/alert-dialog.mdx +8 -8
  58. package/components/ui/aspect-ratio/aspect-ratio.mdx +8 -8
  59. package/components/ui/assistant-chart/assistant-chart.mdx +8 -8
  60. package/components/ui/avatar/avatar.mdx +8 -8
  61. package/components/ui/badge/badge.mdx +8 -8
  62. package/components/ui/breadcrumb/breadcrumb.mdx +8 -8
  63. package/components/ui/button/button.mdx +8 -8
  64. package/components/ui/calendar/calendar.mdx +8 -8
  65. package/components/ui/card/card.mdx +8 -8
  66. package/components/ui/carousel/carousel.mdx +8 -8
  67. package/components/ui/chart/chart.mdx +8 -8
  68. package/components/ui/chart/chart.test.tsx +178 -178
  69. package/components/ui/chart/chart.tsx +2245 -2239
  70. package/components/ui/checkbox/checkbox.mdx +8 -8
  71. package/components/ui/collapsible/collapsible.mdx +8 -8
  72. package/components/ui/command/command.mdx +8 -8
  73. package/components/ui/context-menu/context-menu.mdx +8 -8
  74. package/components/ui/dialog/dialog.mdx +8 -8
  75. package/components/ui/drawer/drawer.mdx +8 -8
  76. package/components/ui/dropdown-menu/dropdown-menu.mdx +8 -8
  77. package/components/ui/empty/empty.mdx +8 -8
  78. package/components/ui/file-upload/file-upload.mdx +8 -8
  79. package/components/ui/hover-card/hover-card.mdx +8 -8
  80. package/components/ui/input/input.mdx +8 -8
  81. package/components/ui/input-otp/input-otp.mdx +8 -8
  82. package/components/ui/label/label.mdx +8 -8
  83. package/components/ui/map/map.mdx +8 -8
  84. package/components/ui/menubar/menubar.mdx +8 -8
  85. package/components/ui/navigation-menu/navigation-menu.mdx +8 -8
  86. package/components/ui/notification-badge/notification-badge.mdx +8 -8
  87. package/components/ui/pagination/pagination.mdx +8 -8
  88. package/components/ui/popover/popover.mdx +8 -8
  89. package/components/ui/progress/progress.mdx +8 -8
  90. package/components/ui/radio-group/radio-group.mdx +8 -8
  91. package/components/ui/rating/rating.mdx +8 -8
  92. package/components/ui/resizable/resizable.mdx +8 -8
  93. package/components/ui/route-map/route-map.mdx +8 -8
  94. package/components/ui/scroll-area/scroll-area.mdx +8 -8
  95. package/components/ui/search/search.mdx +8 -8
  96. package/components/ui/select/select.mdx +8 -8
  97. package/components/ui/separator/separator.mdx +8 -8
  98. package/components/ui/sheet/sheet.mdx +8 -8
  99. package/components/ui/simple-map/simple-map.mdx +8 -8
  100. package/components/ui/skeleton/skeleton.mdx +8 -8
  101. package/components/ui/slider/slider.mdx +8 -8
  102. package/components/ui/sonner/sonner.mdx +8 -8
  103. package/components/ui/stats-card/index.ts +2 -2
  104. package/components/ui/stats-card/stats-card-skeleton.tsx +60 -60
  105. package/components/ui/stats-card/stats-card.mdx +8 -8
  106. package/components/ui/stats-card/stats-card.tsx +109 -109
  107. package/components/ui/stepper/stepper.mdx +8 -8
  108. package/components/ui/switch/switch.mdx +8 -8
  109. package/components/ui/table/table.mdx +8 -8
  110. package/components/ui/tabs/tabs.mdx +8 -8
  111. package/components/ui/textarea/textarea.mdx +8 -8
  112. package/components/ui/timeline/timeline.mdx +8 -8
  113. package/components/ui/toggle/toggle.mdx +8 -8
  114. package/components/ui/toggle-group/toggle-group.mdx +8 -8
  115. package/components/ui/tooltip/tooltip.mdx +8 -8
  116. package/components/ui/tree-view/tree-view.mdx +8 -8
  117. package/components.json +511 -511
  118. package/contexts/AuthContext.tsx +121 -121
  119. package/contexts/BrandColorsContext.tsx +282 -282
  120. package/contexts/LanguageContext.test.tsx +121 -121
  121. package/contexts/LanguageContext.tsx +250 -250
  122. package/contexts/theme-data.ts +391 -391
  123. package/dist/{AssistantChart-DoZCyS5r.cjs → AssistantChart-9w31gdAb.cjs} +4 -4
  124. package/dist/{AssistantChart-CldVCVDe.cjs → AssistantChart-BAudAfne.cjs} +5 -5
  125. package/dist/{AssistantChart-Bdd44uBn.cjs → AssistantChart-BAx9VQvb.cjs} +127 -388
  126. package/dist/{AssistantChart-Cu3m7RBo.js → AssistantChart-BP8upjMk.js} +5 -5
  127. package/dist/{AssistantChart-CFhDdGyU.js → AssistantChart-CVko2A1W.js} +130 -391
  128. package/dist/{AssistantChart-C_hwFRRr.js → AssistantChart-CVzmmhx4.js} +4 -4
  129. package/dist/{AudioPlayer-IAU5q5T1.cjs → AudioPlayer-1ypwE2Wh.cjs} +1 -1
  130. package/dist/{AudioPlayer-CGRUtUdN.js → AudioPlayer-DuKXrCfy.js} +1 -1
  131. package/dist/{LanguageContext-CS14yCpi.js → LanguageContext-BwhwC3G2.js} +2 -2
  132. package/dist/{LanguageContext-B_KFTCzT.cjs → LanguageContext-DvUt5jBg.cjs} +2 -2
  133. package/dist/{ThemeContext-C2EwAPDt.js → ThemeContext-BbBNoFTG.js} +2 -2
  134. package/dist/{ThemeContext-Bmod0Cg2.cjs → ThemeContext-BblcjQup.cjs} +13 -8
  135. package/dist/{ThemeContext-BWq9ACPo.js → ThemeContext-Bo-W2WZH.js} +13 -8
  136. package/dist/{ThemeContext-j5aGtPky.cjs → ThemeContext-CP3a0jxy.cjs} +193 -262
  137. package/dist/{ThemeContext-vTjumZeM.cjs → ThemeContext-Cmr8Ex8H.cjs} +2 -2
  138. package/dist/ThemeContext-CpqYShLq.cjs +324 -0
  139. package/dist/{ThemeContext-CQSo4Iwc.js → ThemeContext-D3LzacmG.js} +8 -1
  140. package/dist/ThemeContext-Du2nE1PL.js +325 -0
  141. package/dist/ThemeContext-GeEBTJ3q.cjs +1621 -0
  142. package/dist/ThemeContext-JyLK9B1o.js +1622 -0
  143. package/dist/{ThemeContext-CGk3KK0k.cjs → ThemeContext-U4dEYc6C.cjs} +8 -1
  144. package/dist/{ThemeContext-BXjrgUjW.js → ThemeContext-ept8jhXI.js} +200 -261
  145. package/dist/{VerifyEmailPage-CGIwmWrm.js → VerifyEmailPage-B31mCrMc.js} +1 -1
  146. package/dist/{VerifyEmailPage-C0c2e5n0.js → VerifyEmailPage-BE-L9mB7.js} +7 -7
  147. package/dist/{VerifyEmailPage-DSBMRHtl.js → VerifyEmailPage-BIBOKV7Z.js} +41 -36
  148. package/dist/{VerifyEmailPage-DgIid028.js → VerifyEmailPage-BJjAMUTW.js} +4 -4
  149. package/dist/{VerifyEmailPage--1Vurewl.cjs → VerifyEmailPage-BRSP-Pwt.cjs} +3 -3
  150. package/dist/{VerifyEmailPage-Cwi3kbol.cjs → VerifyEmailPage-Bae2cBXT.cjs} +7 -7
  151. package/dist/{VerifyEmailPage-De6bQjrz.cjs → VerifyEmailPage-BiRm7Nh4.cjs} +41 -36
  152. package/dist/{VerifyEmailPage-ByerOcm4.cjs → VerifyEmailPage-Bv8Ah_TK.cjs} +23 -20
  153. package/dist/VerifyEmailPage-Bvfv8HVQ.js +3214 -0
  154. package/dist/{VerifyEmailPage-BComraR7.cjs → VerifyEmailPage-CR7kb5df.cjs} +22 -12
  155. package/dist/{VerifyEmailPage-CpqqpLpo.cjs → VerifyEmailPage-C_Zk6Gen.cjs} +1 -1
  156. package/dist/{VerifyEmailPage-MTD7AG1Z.js → VerifyEmailPage-C_ihbcth.js} +4 -4
  157. package/dist/{VerifyEmailPage-1WwWczAn.js → VerifyEmailPage-CbgjOF0v.js} +22 -12
  158. package/dist/{VerifyEmailPage-DvMLZgFt.js → VerifyEmailPage-CdYPSJoO.js} +1 -1
  159. package/dist/{VerifyEmailPage-By3Jf__L.cjs → VerifyEmailPage-CkBYfsNy.cjs} +4 -4
  160. package/dist/{VerifyEmailPage-CJLz3jrn.js → VerifyEmailPage-Cyl55sJb.js} +23 -20
  161. package/dist/VerifyEmailPage-D-FRj5TU.cjs +3213 -0
  162. package/dist/{VerifyEmailPage-B4peJjAT.cjs → VerifyEmailPage-DF2ilhum.cjs} +334 -356
  163. package/dist/{VerifyEmailPage-CYXtbKi3.cjs → VerifyEmailPage-DMBh4NM9.cjs} +1 -1
  164. package/dist/{VerifyEmailPage-CgMxRb4z.js → VerifyEmailPage-DTtFfC-J.js} +3 -3
  165. package/dist/{VerifyEmailPage-CFLMls1p.cjs → VerifyEmailPage-Dt7zgA4w.cjs} +4 -4
  166. package/dist/{VerifyEmailPage-C5TNQTBa.js → VerifyEmailPage-EhudUdqF.js} +343 -355
  167. package/dist/{VerifyEmailPage-DGhuIqkb.js → VerifyEmailPage-X14vhdyl.js} +4 -4
  168. package/dist/VerifyEmailPage-hdB8JQGv.cjs +3213 -0
  169. package/dist/{VerifyEmailPage-Bp1XXl3H.cjs → VerifyEmailPage-u_Dn7t1U.cjs} +4 -4
  170. package/dist/VerifyEmailPage-vYHbYK3q.js +3214 -0
  171. package/dist/{XerticaProvider-CBGc4EMA.cjs → XerticaProvider-AChwphCO.cjs} +4 -4
  172. package/dist/{XerticaProvider-BIrqfZ-i.cjs → XerticaProvider-AbWlr7Af.cjs} +8 -11
  173. package/dist/{XerticaProvider-D-yNhF94.cjs → XerticaProvider-B8CaV7xu.cjs} +1 -1
  174. package/dist/{XerticaProvider-CEoWMTxu.js → XerticaProvider-BITjgC5p.js} +2 -2
  175. package/dist/{XerticaProvider-CllrbMEJ.cjs → XerticaProvider-By8q3Roe.cjs} +2 -2
  176. package/dist/{XerticaProvider-C1DKnvLh.js → XerticaProvider-CUYJZc32.js} +4 -4
  177. package/dist/{XerticaProvider-ET0ihewn.cjs → XerticaProvider-CW9hpCdF.cjs} +2 -2
  178. package/dist/{XerticaProvider-Dt5HEzbQ.js → XerticaProvider-CWgby5mY.js} +10 -10
  179. package/dist/XerticaProvider-CWs6EwNa.js +49 -0
  180. package/dist/XerticaProvider-CjQAQPcn.cjs +48 -0
  181. package/dist/XerticaProvider-D5lLumH-.js +49 -0
  182. package/dist/{XerticaProvider-DYq4JWtg.js → XerticaProvider-DQtvJU7m.js} +1 -1
  183. package/dist/XerticaProvider-qQUDop71.cjs +48 -0
  184. package/dist/{XerticaProvider-B7EVH-NF.js → XerticaProvider-siSt9uG2.js} +2 -2
  185. package/dist/{XerticaXLogo-Zw2B276b.cjs → XerticaXLogo-8TTzBjHw.cjs} +1 -1
  186. package/dist/{XerticaXLogo-B7xQ5dhi.js → XerticaXLogo-BWaag64t.js} +1 -1
  187. package/dist/{XerticaXLogo-DZbo4vOE.js → XerticaXLogo-CFuIlYFH.js} +12 -12
  188. package/dist/{XerticaXLogo-bvZSgwGF.cjs → XerticaXLogo-CU-U-GP4.cjs} +7 -13
  189. package/dist/XerticaXLogo-ChryA6xj.js +252 -0
  190. package/dist/{XerticaXLogo-CQUUjXoH.cjs → XerticaXLogo-CziKMQil.cjs} +8 -8
  191. package/dist/XerticaXLogo-DHz5SugF.js +252 -0
  192. package/dist/XerticaXLogo-DTee_y8X.cjs +251 -0
  193. package/dist/{XerticaXLogo-Cmsp-Eey.js → XerticaXLogo-DfUvz-lD.js} +9 -9
  194. package/dist/XerticaXLogo-kslQ8Tk_.cjs +251 -0
  195. package/dist/{alert-dialog-s-vmNkJ_.js → alert-dialog-iDe5VE5o.js} +3 -3
  196. package/dist/{alert-dialog-DSKByiKZ.cjs → alert-dialog-yckpaOpy.cjs} +3 -3
  197. package/dist/cli.js +2 -1
  198. package/dist/components/ui/chart/chart.d.ts +7 -5
  199. package/dist/{google-maps-loader-Y-QkD-Li.cjs → google-maps-loader-BqsYL48U.cjs} +0 -5
  200. package/dist/{google-maps-loader-CTYySAun.js → google-maps-loader-t2IlYBzw.js} +0 -4
  201. package/dist/index-CkTUgOwX.js +8 -0
  202. package/dist/{index-COtD8bRW.cjs → index-D3RLKRAs.cjs} +1 -1
  203. package/dist/index.cjs.js +2 -2
  204. package/dist/index.es.js +2 -2
  205. package/dist/index.umd.js +454 -1027
  206. package/dist/layout.cjs.js +1 -1
  207. package/dist/layout.es.js +1 -1
  208. package/dist/pages.cjs.js +1 -1
  209. package/dist/pages.es.js +1 -1
  210. package/dist/{sidebar-DAaY8bRU.cjs → sidebar-B3EYhli0.cjs} +33 -24
  211. package/dist/{sidebar-nzPoVHBQ.cjs → sidebar-B9NR0lCe.cjs} +46 -41
  212. package/dist/{sidebar-CeTMuzOx.cjs → sidebar-BvF5I2Ue.cjs} +47 -128
  213. package/dist/{sidebar-q7P2Godd.cjs → sidebar-C5B_LHek.cjs} +1 -1
  214. package/dist/{sidebar-CrQDDdcz.js → sidebar-CA6_ek3f.js} +33 -24
  215. package/dist/sidebar-CLmIjgNd.cjs +1136 -0
  216. package/dist/{sidebar-BxGXsDAd.cjs → sidebar-CVUGHOS_.cjs} +8 -16
  217. package/dist/{sidebar-BViy8Eeu.js → sidebar-CmvwjnVb.js} +9 -17
  218. package/dist/{sidebar-B6SlKZYN.js → sidebar-CplprZpM.js} +49 -40
  219. package/dist/sidebar-Duermn32.js +1133 -0
  220. package/dist/{sidebar-BbVIQvlP.js → sidebar-Dz7bd3zP.js} +1 -1
  221. package/dist/{sidebar-0ocFLSks.js → sidebar-KIS0C2JH.js} +50 -127
  222. package/dist/sidebar-OTO_up7Z.js +801 -0
  223. package/dist/sidebar-zowjejT2.cjs +800 -0
  224. package/dist/{use-audio-player-nv8ZSGa1.js → use-audio-player-Bkh23vQ3.js} +3 -7
  225. package/dist/{use-audio-player-NKsWyjWu.cjs → use-audio-player-Dn1NR9xN.cjs} +3 -7
  226. package/dist/{xertica-assistant-dyP7KHM5.cjs → xertica-assistant-B1IaHXnB.cjs} +388 -529
  227. package/dist/{xertica-assistant-ciJaWqm1.js → xertica-assistant-BMqdyRVi.js} +10 -28
  228. package/dist/{xertica-assistant-V_IdW4WF.cjs → xertica-assistant-Bj3vBCq_.cjs} +9 -27
  229. package/dist/{xertica-assistant-yX1CFBBo.js → xertica-assistant-DPsESB6t.js} +390 -531
  230. package/dist/{CodeBlock-7TTgmdGG.cjs → xertica-assistant-Qp3ydksa.cjs} +51 -263
  231. package/dist/{CodeBlock-BeSt1h5P.js → xertica-assistant-gnCJdcZY.js} +7 -219
  232. package/dist/xertica-ui.css +2 -2
  233. package/docs/architecture-improvements.md +456 -456
  234. package/docs/architecture.md +312 -312
  235. package/docs/components/assistant.md +428 -428
  236. package/docs/components/branding.md +252 -252
  237. package/docs/components/card-patterns.md +447 -447
  238. package/docs/components/error-boundary.md +201 -201
  239. package/docs/components/hooks.md +432 -432
  240. package/docs/components/language-selector.md +176 -176
  241. package/docs/components/pages.md +323 -323
  242. package/docs/components/sidebar.md +331 -331
  243. package/docs/components/stats-card.md +138 -138
  244. package/docs/doc-audit.md +244 -244
  245. package/docs/getting-started.md +616 -616
  246. package/docs/guidelines.md +330 -330
  247. package/docs/i18n.md +480 -480
  248. package/docs/installation.md +268 -268
  249. package/docs/llms.md +295 -295
  250. package/docs/state-management.md +289 -289
  251. package/guidelines/Guidelines.md +409 -409
  252. package/llms-compact.txt +1 -1
  253. package/llms-full.txt +10688 -10688
  254. package/llms.txt +1 -1
  255. package/package.json +1 -1
  256. package/styles/xertica/base.css +90 -90
  257. package/styles/xertica/tokens.css +240 -240
  258. package/templates/.prettierignore +4 -4
  259. package/templates/.prettierrc +10 -10
  260. package/templates/CLAUDE.md +180 -180
  261. package/templates/package.json +2 -2
  262. package/templates/src/app/App.tsx +46 -46
  263. package/templates/src/app/components/AuthGuard.tsx +131 -131
  264. package/templates/src/features/assistant/data/mock.ts +75 -75
  265. package/templates/src/features/assistant/hooks/useAssistantConfig.ts +20 -20
  266. package/templates/src/features/assistant/index.ts +5 -5
  267. package/templates/src/features/auth/ui/ForgotPasswordContent.tsx +70 -70
  268. package/templates/src/features/auth/ui/LoginContent.tsx +92 -92
  269. package/templates/src/features/auth/ui/ResetPasswordContent.tsx +183 -183
  270. package/templates/src/features/auth/ui/SocialLoginButtons.tsx +78 -78
  271. package/templates/src/features/auth/ui/VerifyEmailContent.tsx +80 -80
  272. package/templates/src/features/home/data/mock.ts +41 -41
  273. package/templates/src/features/home/hooks/useFeatureCards.ts +20 -20
  274. package/templates/src/features/home/index.ts +11 -11
  275. package/templates/src/features/home/ui/HomeContent.tsx +117 -117
  276. package/templates/src/features/template/ui/CrudTemplate.tsx +112 -112
  277. package/templates/src/features/template/ui/DashboardTemplate.tsx +110 -110
  278. package/templates/src/features/template/ui/FormTemplate.tsx +117 -117
  279. package/templates/src/features/template/ui/LoginTemplate.tsx +59 -59
  280. package/templates/src/features/template/ui/TemplateContent.tsx +1322 -1322
  281. package/templates/src/i18n.ts +124 -124
  282. package/templates/src/locales/en/common.json +21 -21
  283. package/templates/src/locales/en/components/activityCard.json +10 -10
  284. package/templates/src/locales/en/components/assistant.json +119 -119
  285. package/templates/src/locales/en/components/media.json +29 -29
  286. package/templates/src/locales/en/components/notificationCard.json +5 -5
  287. package/templates/src/locales/en/components/profileCard.json +8 -8
  288. package/templates/src/locales/en/components/projectCard.json +10 -10
  289. package/templates/src/locales/en/components/sidebar.json +14 -14
  290. package/templates/src/locales/en/components/stats.json +8 -8
  291. package/templates/src/locales/en/components/team.json +14 -14
  292. package/templates/src/locales/en/errors.json +9 -9
  293. package/templates/src/locales/en/languageSelector.json +7 -7
  294. package/templates/src/locales/en/nav.json +6 -6
  295. package/templates/src/locales/en/pages/crudTemplate.json +25 -25
  296. package/templates/src/locales/en/pages/dashboardTemplate.json +20 -20
  297. package/templates/src/locales/en/pages/forgotPassword.json +10 -10
  298. package/templates/src/locales/en/pages/formTemplate.json +16 -16
  299. package/templates/src/locales/en/pages/home.json +7 -7
  300. package/templates/src/locales/en/pages/login.json +15 -15
  301. package/templates/src/locales/en/pages/loginTemplate.json +9 -9
  302. package/templates/src/locales/en/pages/resetPassword.json +18 -18
  303. package/templates/src/locales/en/pages/templates.json +317 -317
  304. package/templates/src/locales/en/pages/verifyEmail.json +12 -12
  305. package/templates/src/locales/en/themeToggle.json +6 -6
  306. package/templates/src/locales/es/common.json +21 -21
  307. package/templates/src/locales/es/components/activityCard.json +10 -10
  308. package/templates/src/locales/es/components/assistant.json +119 -119
  309. package/templates/src/locales/es/components/media.json +29 -29
  310. package/templates/src/locales/es/components/notificationCard.json +5 -5
  311. package/templates/src/locales/es/components/profileCard.json +8 -8
  312. package/templates/src/locales/es/components/projectCard.json +10 -10
  313. package/templates/src/locales/es/components/sidebar.json +14 -14
  314. package/templates/src/locales/es/components/stats.json +8 -8
  315. package/templates/src/locales/es/components/team.json +14 -14
  316. package/templates/src/locales/es/errors.json +9 -9
  317. package/templates/src/locales/es/languageSelector.json +7 -7
  318. package/templates/src/locales/es/nav.json +6 -6
  319. package/templates/src/locales/es/pages/crudTemplate.json +25 -25
  320. package/templates/src/locales/es/pages/dashboardTemplate.json +20 -20
  321. package/templates/src/locales/es/pages/forgotPassword.json +10 -10
  322. package/templates/src/locales/es/pages/formTemplate.json +16 -16
  323. package/templates/src/locales/es/pages/home.json +7 -7
  324. package/templates/src/locales/es/pages/login.json +15 -15
  325. package/templates/src/locales/es/pages/loginTemplate.json +9 -9
  326. package/templates/src/locales/es/pages/resetPassword.json +18 -18
  327. package/templates/src/locales/es/pages/templates.json +317 -317
  328. package/templates/src/locales/es/pages/verifyEmail.json +12 -12
  329. package/templates/src/locales/es/themeToggle.json +6 -6
  330. package/templates/src/locales/pt-BR/common.json +21 -21
  331. package/templates/src/locales/pt-BR/components/activityCard.json +10 -10
  332. package/templates/src/locales/pt-BR/components/assistant.json +119 -119
  333. package/templates/src/locales/pt-BR/components/media.json +29 -29
  334. package/templates/src/locales/pt-BR/components/notificationCard.json +5 -5
  335. package/templates/src/locales/pt-BR/components/profileCard.json +8 -8
  336. package/templates/src/locales/pt-BR/components/projectCard.json +10 -10
  337. package/templates/src/locales/pt-BR/components/sidebar.json +14 -14
  338. package/templates/src/locales/pt-BR/components/stats.json +8 -8
  339. package/templates/src/locales/pt-BR/components/team.json +14 -14
  340. package/templates/src/locales/pt-BR/errors.json +9 -9
  341. package/templates/src/locales/pt-BR/languageSelector.json +7 -7
  342. package/templates/src/locales/pt-BR/nav.json +6 -6
  343. package/templates/src/locales/pt-BR/pages/crudTemplate.json +25 -25
  344. package/templates/src/locales/pt-BR/pages/dashboardTemplate.json +20 -20
  345. package/templates/src/locales/pt-BR/pages/forgotPassword.json +10 -10
  346. package/templates/src/locales/pt-BR/pages/formTemplate.json +16 -16
  347. package/templates/src/locales/pt-BR/pages/home.json +7 -7
  348. package/templates/src/locales/pt-BR/pages/login.json +15 -15
  349. package/templates/src/locales/pt-BR/pages/loginTemplate.json +9 -9
  350. package/templates/src/locales/pt-BR/pages/resetPassword.json +18 -18
  351. package/templates/src/locales/pt-BR/pages/templates.json +317 -317
  352. package/templates/src/locales/pt-BR/pages/verifyEmail.json +12 -12
  353. package/templates/src/locales/pt-BR/themeToggle.json +6 -6
  354. package/templates/src/pages/AssistantPage.tsx +470 -470
  355. package/templates/src/pages/HomePage.tsx +53 -53
  356. package/templates/src/shared/error-boundary.tsx +150 -150
  357. package/templates/src/shared/error-fallbacks.tsx +222 -222
  358. package/templates/src/styles/xertica/tokens.css +240 -240
  359. package/templates/vite.config.js +20 -20
  360. package/templates/vite.config.ts +55 -55
  361. package/dist/AssistantChart-BKVtGUKF.js +0 -3383
  362. package/dist/AssistantChart-CxGjH7Qk.js +0 -3477
  363. package/dist/AssistantChart-DIpshm3i.js +0 -4784
  364. package/dist/AssistantChart-D_PTeu8P.cjs +0 -3503
  365. package/dist/AssistantChart-WeycT5Pd.cjs +0 -3551
  366. package/dist/AssistantChart-zjsy2GaZ.cjs +0 -4810
  367. package/dist/AudioPlayer-B1lt5cPl.cjs +0 -989
  368. package/dist/AudioPlayer-BZ7bibzU.cjs +0 -982
  369. package/dist/AudioPlayer-BpRPS4-1.cjs +0 -1277
  370. package/dist/AudioPlayer-C12BjQBV.cjs +0 -997
  371. package/dist/AudioPlayer-CFeV8t-5.cjs +0 -936
  372. package/dist/AudioPlayer-Coly3q5R.js +0 -1278
  373. package/dist/AudioPlayer-CySJIyvL.js +0 -937
  374. package/dist/AudioPlayer-DMcG_c7L.js +0 -990
  375. package/dist/AudioPlayer-DcFKRJE_.js +0 -998
  376. package/dist/AudioPlayer-e8LfNoqO.js +0 -983
  377. package/dist/BrandColorsContext-565dDHd5.js +0 -660
  378. package/dist/BrandColorsContext-BcJbtkqn.cjs +0 -659
  379. package/dist/CodeBlock-BgfYL_rD.cjs +0 -2094
  380. package/dist/CodeBlock-BlcqlA9M.cjs +0 -2094
  381. package/dist/CodeBlock-Bnmeu5ez.cjs +0 -2094
  382. package/dist/CodeBlock-BtfPlbAI.js +0 -2078
  383. package/dist/CodeBlock-CIySIuYr.js +0 -2078
  384. package/dist/CodeBlock-CuPtUM-7.cjs +0 -2094
  385. package/dist/CodeBlock-D6ffWXgc.js +0 -2078
  386. package/dist/CodeBlock-D8dcwbit.cjs +0 -2094
  387. package/dist/CodeBlock-DMZrFnlw.cjs +0 -2094
  388. package/dist/CodeBlock-DlBehYN8.js +0 -2078
  389. package/dist/CodeBlock-DnYNI8rQ.js +0 -2078
  390. package/dist/CodeBlock-DvKWbSnE.cjs +0 -2094
  391. package/dist/CodeBlock-DwMCfkFY.js +0 -2078
  392. package/dist/CodeBlock-Dy6CNYyj.js +0 -2078
  393. package/dist/CodeBlock-U1pPOQI7.cjs +0 -2094
  394. package/dist/CodeBlock-f_GpNhEB.js +0 -2078
  395. package/dist/CodeBlock-oB6u8nI1.js +0 -2078
  396. package/dist/CodeBlock-tZC31B73.cjs +0 -2094
  397. package/dist/FeatureCard-CxC-7C-C.cjs +0 -300
  398. package/dist/FeatureCard-DbHWCb4E.js +0 -301
  399. package/dist/ImageWithFallback-CGtidP6B.cjs +0 -4542
  400. package/dist/ImageWithFallback-lsg3pdFg.js +0 -4508
  401. package/dist/LanguageSelector-B5YfbHra.js +0 -231
  402. package/dist/LanguageSelector-D6uacAIM.cjs +0 -230
  403. package/dist/LayoutContext-B45-e9DI.cjs +0 -93
  404. package/dist/LayoutContext-BAql6ZRY.js +0 -97
  405. package/dist/LayoutContext-Bav3UMEA.js +0 -94
  406. package/dist/LayoutContext-BvK-ggDa.cjs +0 -96
  407. package/dist/ThemeContext-BoH4NLfN.js +0 -734
  408. package/dist/ThemeContext-r69W20Xg.cjs +0 -733
  409. package/dist/VerifyEmailPage-COiyNl1y.js +0 -2825
  410. package/dist/VerifyEmailPage-CqKsR2v8.js +0 -2827
  411. package/dist/VerifyEmailPage-DjQKRlUS.cjs +0 -2824
  412. package/dist/VerifyEmailPage-s-1X3LDJ.cjs +0 -2826
  413. package/dist/XerticaOrbe-KL1RBHzw.cjs +0 -1354
  414. package/dist/XerticaOrbe-zwS1p2a8.js +0 -1355
  415. package/dist/XerticaProvider-6btlAlzc.js +0 -17
  416. package/dist/XerticaProvider-BNoNOxQ5.cjs +0 -16
  417. package/dist/XerticaProvider-BlY2limY.cjs +0 -38
  418. package/dist/XerticaProvider-DDuiIcKo.js +0 -39
  419. package/dist/XerticaProvider-cI9hSs27.cjs +0 -38
  420. package/dist/XerticaProvider-hSwhNQex.js +0 -39
  421. package/dist/alert-dialog-BOje--vD.js +0 -847
  422. package/dist/alert-dialog-BtEuQqrg.cjs +0 -870
  423. package/dist/breadcrumb-CqJ7bHY5.js +0 -161
  424. package/dist/breadcrumb-m9Hb2_XN.cjs +0 -177
  425. package/dist/components/assistant/xertica-assistant/hooks/index.d.ts +0 -6
  426. package/dist/components/assistant/xertica-assistant/hooks/use-assistant-conversations.d.ts +0 -21
  427. package/dist/components/assistant/xertica-assistant/hooks/use-assistant-messages.d.ts +0 -49
  428. package/dist/components/assistant/xertica-assistant/hooks/use-assistant-suggestions.d.ts +0 -16
  429. package/dist/components/blocks/audio-player/AudioPlayer.d.ts +0 -35
  430. package/dist/components/blocks/audio-player/index.d.ts +0 -1
  431. package/dist/components/blocks/document-editor/DocumentEditor.d.ts +0 -26
  432. package/dist/components/blocks/document-editor/index.d.ts +0 -1
  433. package/dist/components/blocks/podcast-player/PodcastPlayer.d.ts +0 -41
  434. package/dist/components/blocks/podcast-player/index.d.ts +0 -1
  435. package/dist/components/ui/chart/parts/chart-dashboard.d.ts +0 -113
  436. package/dist/components/ui/chart/parts/chart-metric.d.ts +0 -118
  437. package/dist/components/ui/chart/parts/chart-primitives.d.ts +0 -101
  438. package/dist/components/ui/chart/parts/chart-shared.d.ts +0 -20
  439. package/dist/components/ui/chart/parts/chart-utils.d.ts +0 -12
  440. package/dist/components/ui/chart/parts/index.d.ts +0 -5
  441. package/dist/dropdown-menu-BDB5CmQs.cjs +0 -247
  442. package/dist/dropdown-menu-DQidbKBD.js +0 -231
  443. package/dist/google-maps-loader-BFWp6VPd.js +0 -287
  444. package/dist/google-maps-loader-BKcdgFbu.cjs +0 -312
  445. package/dist/google-maps-loader-CumCNXeG.js +0 -312
  446. package/dist/google-maps-loader-eS3uQ5TA.cjs +0 -287
  447. package/dist/header-Cgy6vYPk.cjs +0 -731
  448. package/dist/header-DRlT4jgI.js +0 -715
  449. package/dist/header-Dux00SI4.cjs +0 -731
  450. package/dist/header-EkGKXPsD.js +0 -715
  451. package/dist/header-WfEywpyc.cjs +0 -731
  452. package/dist/header-tifNQn2U.js +0 -715
  453. package/dist/index-BhapVLVj.js +0 -8
  454. package/dist/index-D6fxYEY8.cjs +0 -7
  455. package/dist/index-DAIp0_HK.js +0 -8
  456. package/dist/index-DW5tYe26.js +0 -8
  457. package/dist/index-GA__GvnG.cjs +0 -7
  458. package/dist/input-2R4loU86.js +0 -127
  459. package/dist/input-DWANSKGb.cjs +0 -145
  460. package/dist/progress-DPtzoVV8.js +0 -175
  461. package/dist/progress-EeaoqqUs.cjs +0 -191
  462. package/dist/rich-text-editor-0mraWT5y.cjs +0 -2376
  463. package/dist/rich-text-editor-B-IkcPD0.js +0 -2874
  464. package/dist/rich-text-editor-B6jMRLzk.cjs +0 -1939
  465. package/dist/rich-text-editor-B8_oYcIR.js +0 -1730
  466. package/dist/rich-text-editor-B9UbSXNb.js +0 -1203
  467. package/dist/rich-text-editor-BYuRBNBU.js +0 -2373
  468. package/dist/rich-text-editor-Bb9pySTs.cjs +0 -2374
  469. package/dist/rich-text-editor-BcL6L3cm.cjs +0 -2374
  470. package/dist/rich-text-editor-BoVZYtTs.cjs +0 -2391
  471. package/dist/rich-text-editor-Bp3zQqMC.js +0 -2954
  472. package/dist/rich-text-editor-CMgSN_w2.js +0 -1189
  473. package/dist/rich-text-editor-CPV1lEPH.cjs +0 -1748
  474. package/dist/rich-text-editor-CeucBdIv.cjs +0 -2971
  475. package/dist/rich-text-editor-CoKqbCtu.cjs +0 -1799
  476. package/dist/rich-text-editor-Cw56T_mB.js +0 -2356
  477. package/dist/rich-text-editor-Cyt8qs2b.js +0 -1921
  478. package/dist/rich-text-editor-D6H84OcX.cjs +0 -1220
  479. package/dist/rich-text-editor-D76gD-QI.js +0 -2328
  480. package/dist/rich-text-editor-DKkokOnA.js +0 -1781
  481. package/dist/rich-text-editor-DNsdpN64.cjs +0 -2359
  482. package/dist/rich-text-editor-DfG8bCyY.js +0 -2358
  483. package/dist/rich-text-editor-Dxjw31Z4.js +0 -2341
  484. package/dist/rich-text-editor-DzP0Epmb.js +0 -2356
  485. package/dist/rich-text-editor-bRkNoeZY.cjs +0 -2891
  486. package/dist/rich-text-editor-lyYE2ZG5.cjs +0 -1207
  487. package/dist/rich-text-editor-skplNlBM.cjs +0 -2345
  488. package/dist/select-Bkbr0f-Z.cjs +0 -162
  489. package/dist/select-CvIVdX2n.js +0 -145
  490. package/dist/sidebar-CK_0ZQHj.cjs +0 -803
  491. package/dist/sidebar-CUuOvYhK.js +0 -787
  492. package/dist/sidebar-DQj1z3jG.cjs +0 -758
  493. package/dist/sidebar-Djn5syhi.cjs +0 -786
  494. package/dist/sidebar-LluMXfam.js +0 -759
  495. package/dist/sidebar-_rT7rBMk.js +0 -787
  496. package/dist/slider-Bc5Hd0y1.js +0 -56
  497. package/dist/slider-N7hFFj6X.cjs +0 -73
  498. package/dist/tooltip-Ded96neP.cjs +0 -137
  499. package/dist/tooltip-HDOoD2-0.js +0 -120
  500. package/dist/use-audio-player-B31J-aqh.cjs +0 -187
  501. package/dist/use-audio-player-BkmEmj8Q.js +0 -185
  502. package/dist/use-audio-player-CLFTWFW1.cjs +0 -184
  503. package/dist/use-audio-player-CLLn00I6.js +0 -188
  504. package/dist/use-file-upload-BcjEo2S5.js +0 -404
  505. package/dist/use-file-upload-CRJR68Tj.cjs +0 -403
  506. package/dist/use-mobile-B0hNy_Y6.cjs +0 -4303
  507. package/dist/use-mobile-BXuYROXM.js +0 -4202
  508. package/dist/use-mobile-Bbd51ASU.cjs +0 -4392
  509. package/dist/use-mobile-Bk6CX-TC.js +0 -4359
  510. package/dist/use-mobile-BvYdisLP.js +0 -4202
  511. package/dist/use-mobile-BzuxjzNX.cjs +0 -4392
  512. package/dist/use-mobile-CG2-SdXV.cjs +0 -4235
  513. package/dist/use-mobile-CKb5pqTs.js +0 -4269
  514. package/dist/use-mobile-CYuAuGDl.js +0 -4202
  515. package/dist/use-mobile-CaENcqm-.js +0 -4508
  516. package/dist/use-mobile-CbrYgJGJ.js +0 -4203
  517. package/dist/use-mobile-Cd4xPrKq.cjs +0 -46
  518. package/dist/use-mobile-DMOvImGQ.cjs +0 -4542
  519. package/dist/use-mobile-DRB3BQgD.cjs +0 -4235
  520. package/dist/use-mobile-DZvv7QMR.js +0 -4359
  521. package/dist/use-mobile-DdI_TXam.cjs +0 -4235
  522. package/dist/use-mobile-DlceKf8a.js +0 -4359
  523. package/dist/use-mobile-DsOnow1o.cjs +0 -4236
  524. package/dist/use-mobile-Kcj6jSnK.cjs +0 -4392
  525. package/dist/use-mobile-bnKcua_i.js +0 -4202
  526. package/dist/use-mobile-j4w2Jrf1.js +0 -30
  527. package/dist/use-mobile-ncXBeE2z.cjs +0 -4235
  528. package/dist/use-rich-text-editor-DjiddBGv.js +0 -282
  529. package/dist/use-rich-text-editor-lpeswbCs.cjs +0 -281
  530. package/dist/xertica-assistant-BdiZag0h.js +0 -2187
  531. package/dist/xertica-assistant-CrgTb6Hs.cjs +0 -2155
  532. package/dist/xertica-assistant-DCsnQyi5.js +0 -2156
  533. package/dist/xertica-assistant-DUBpmEgo.cjs +0 -2186
  534. package/dist/{rich-text-editor-DgF8s7xW.js → rich-text-editor-BmsjY03B.js} +26 -26
  535. package/dist/{rich-text-editor-mWoaSCE4.cjs → rich-text-editor-GS2kpTAK.cjs} +26 -26
@@ -1,1277 +0,0 @@
1
- "use strict";
2
- const jsxRuntime = require("react/jsx-runtime");
3
- const React = require("react");
4
- const reactI18next = require("react-i18next");
5
- const lucideReact = require("lucide-react");
6
- const slider = require("./slider-DcJharR9.cjs");
7
- const button = require("./button-Bnv9SvYK.cjs");
8
- const reactDom = require("react-dom");
9
- const tooltip = require("./tooltip-CwgSdy3h.cjs");
10
- const dropdownMenu = require("./dropdown-menu-B_uEXNc4.cjs");
11
- const useAudioPlayer = require("./use-audio-player-B31J-aqh.cjs");
12
- function FloatingMediaWrapper({
13
- children,
14
- isFloating,
15
- setIsFloating,
16
- title,
17
- onClose,
18
- onCloseMedia,
19
- aspectRatio = 16 / 9,
20
- className,
21
- minWidth = 320,
22
- minHeight = 110,
23
- colorVariant = "default",
24
- playerId = "default",
25
- enablePadding = false
26
- }) {
27
- const { t } = reactI18next.useTranslation();
28
- const [isMounted, setIsMounted] = React.useState(false);
29
- React.useEffect(() => {
30
- setIsMounted(true);
31
- return () => setIsMounted(false);
32
- }, []);
33
- if (isFloating) {
34
- return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
35
- /* @__PURE__ */ jsxRuntime.jsxs(
36
- "div",
37
- {
38
- className: button.cn(
39
- "w-full rounded-[var(--radius-card)] bg-muted/20 border border-dashed border-muted-foreground/20 flex items-center justify-center flex-col gap-2 p-8 text-muted-foreground transition-all",
40
- className
41
- ),
42
- style: { aspectRatio },
43
- children: [
44
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Maximize2, { className: "w-8 h-8 opacity-50" }),
45
- /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm font-medium", children: t("media.playingFloating") }),
46
- /* @__PURE__ */ jsxRuntime.jsx(button.Button, { variant: "outline", size: "sm", onClick: () => setIsFloating(false), children: t("media.restoreToPage") })
47
- ]
48
- }
49
- ),
50
- isMounted && reactDom.createPortal(
51
- /* @__PURE__ */ jsxRuntime.jsx(
52
- FloatingContainer,
53
- {
54
- setIsFloating,
55
- onClose,
56
- onCloseMedia,
57
- title,
58
- aspectRatio,
59
- minWidth,
60
- minHeight,
61
- colorVariant,
62
- playerId,
63
- enablePadding,
64
- children
65
- }
66
- ),
67
- document.body
68
- )
69
- ] });
70
- }
71
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: button.cn("relative w-full overflow-hidden rounded-[var(--radius-card)]", className), children });
72
- }
73
- function FloatingContainer({
74
- children,
75
- setIsFloating,
76
- onClose,
77
- onCloseMedia,
78
- title,
79
- aspectRatio,
80
- minWidth,
81
- minHeight,
82
- colorVariant,
83
- playerId = "default",
84
- enablePadding = false
85
- }) {
86
- const { t } = reactI18next.useTranslation();
87
- const minPlayerHeight = minWidth / aspectRatio;
88
- const containerRef = React.useRef(null);
89
- const resizeHandleRef = React.useRef(null);
90
- const getInitialState = React.useCallback(() => {
91
- const storageKey = `xertica-media-player-${playerId}`;
92
- const stored = typeof window !== "undefined" ? window.localStorage?.getItem(storageKey) : null;
93
- if (stored) {
94
- try {
95
- return JSON.parse(stored);
96
- } catch {
97
- }
98
- }
99
- return {
100
- position: {
101
- x: typeof window !== "undefined" ? window.innerWidth - minWidth - 24 : 0,
102
- y: typeof window !== "undefined" ? window.innerHeight - minPlayerHeight - 24 : 0
103
- },
104
- size: {
105
- width: minWidth,
106
- height: minPlayerHeight
107
- }
108
- };
109
- }, [minWidth, minPlayerHeight, playerId]);
110
- const [state, setState] = React.useState(getInitialState);
111
- const { position, size } = state;
112
- const [isDragging, setIsDragging] = React.useState(false);
113
- const [isResizing, setIsResizing] = React.useState(false);
114
- const dragStartPos = React.useRef({ x: 0, y: 0 });
115
- const dragStartOffset = React.useRef({ x: 0, y: 0 });
116
- const resizeStartState = React.useRef({ position: { x: 0, y: 0 }, size: { width: 0, height: 0 } });
117
- const saveState = React.useCallback(
118
- (newPosition, newSize) => {
119
- if (typeof window === "undefined") return;
120
- const storageKey = `xertica-media-player-${playerId}`;
121
- window.localStorage?.setItem(
122
- storageKey,
123
- JSON.stringify({ position: newPosition, size: newSize })
124
- );
125
- },
126
- [playerId]
127
- );
128
- const handleMouseDown = (e) => {
129
- setIsDragging(true);
130
- dragStartPos.current = { x: e.clientX, y: e.clientY };
131
- dragStartOffset.current = { x: position.x, y: position.y };
132
- };
133
- const handleResizeStart = (e, direction) => {
134
- e.stopPropagation();
135
- setIsResizing(true);
136
- resizeHandleRef.current = direction;
137
- dragStartPos.current = { x: e.clientX, y: e.clientY };
138
- resizeStartState.current = { position: { ...position }, size: { ...size } };
139
- };
140
- const handleMouseMove = React.useCallback(
141
- (e) => {
142
- if (isDragging) {
143
- const deltaX = e.clientX - dragStartPos.current.x;
144
- const deltaY = e.clientY - dragStartPos.current.y;
145
- const newPos = {
146
- x: dragStartOffset.current.x + deltaX,
147
- y: dragStartOffset.current.y + deltaY
148
- };
149
- setState((prev) => ({ ...prev, position: newPos }));
150
- saveState(newPos, state.size);
151
- }
152
- if (isResizing && resizeHandleRef.current) {
153
- const deltaX = e.clientX - dragStartPos.current.x;
154
- const deltaY = e.clientY - dragStartPos.current.y;
155
- const direction = resizeHandleRef.current;
156
- let newPos = { ...resizeStartState.current.position };
157
- let newSize = { ...resizeStartState.current.size };
158
- if (direction.includes("right")) {
159
- newSize.width = Math.max(minWidth, resizeStartState.current.size.width + deltaX);
160
- }
161
- if (direction.includes("left")) {
162
- const newW = Math.max(minWidth, resizeStartState.current.size.width - deltaX);
163
- newPos.x = resizeStartState.current.position.x + (resizeStartState.current.size.width - newW);
164
- newSize.width = newW;
165
- }
166
- if (direction.includes("bottom")) {
167
- newSize.height = Math.max(minHeight, resizeStartState.current.size.height + deltaY);
168
- }
169
- if (direction.includes("top")) {
170
- const newH = Math.max(minHeight, resizeStartState.current.size.height - deltaY);
171
- newPos.y = resizeStartState.current.position.y + (resizeStartState.current.size.height - newH);
172
- newSize.height = newH;
173
- }
174
- setState({ position: newPos, size: newSize });
175
- saveState(newPos, newSize);
176
- }
177
- },
178
- [isDragging, isResizing, state.size, minWidth, minHeight, saveState]
179
- );
180
- const handleMouseUp = React.useCallback(() => {
181
- setIsDragging(false);
182
- setIsResizing(false);
183
- resizeHandleRef.current = null;
184
- }, []);
185
- React.useEffect(() => {
186
- if (!isDragging && !isResizing) return;
187
- document.addEventListener("mousemove", handleMouseMove);
188
- document.addEventListener("mouseup", handleMouseUp);
189
- return () => {
190
- document.removeEventListener("mousemove", handleMouseMove);
191
- document.removeEventListener("mouseup", handleMouseUp);
192
- };
193
- }, [isDragging, isResizing, handleMouseMove, handleMouseUp]);
194
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "fixed inset-0 pointer-events-none z-50 overflow-hidden", children: /* @__PURE__ */ jsxRuntime.jsx(
195
- "div",
196
- {
197
- ref: containerRef,
198
- className: "pointer-events-auto absolute",
199
- style: {
200
- transform: `translate(${position.x}px, ${position.y}px)`,
201
- width: size.width,
202
- height: size.height
203
- },
204
- role: "dialog",
205
- "aria-label": title || t("media.playingMedia"),
206
- children: /* @__PURE__ */ jsxRuntime.jsxs(
207
- "div",
208
- {
209
- className: button.cn(
210
- "shadow-2xl rounded-[var(--radius-card)] overflow-hidden border backdrop-blur-sm",
211
- colorVariant === "primary" ? "bg-primary border-primary-foreground/20 text-primary-foreground" : "border-border bg-card/95 text-card-foreground"
212
- ),
213
- children: [
214
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col h-full w-full", children: [
215
- /* @__PURE__ */ jsxRuntime.jsxs(
216
- "div",
217
- {
218
- className: button.cn(
219
- "h-9 backdrop-blur-sm border-b flex items-center justify-between px-2 cursor-move select-none",
220
- colorVariant === "primary" ? "bg-primary-foreground/10 border-primary-foreground/10" : "bg-muted/20 border-border/40"
221
- ),
222
- onMouseDown: handleMouseDown,
223
- style: { touchAction: "none", userSelect: "none" },
224
- children: [
225
- /* @__PURE__ */ jsxRuntime.jsxs(
226
- "div",
227
- {
228
- className: button.cn(
229
- "flex items-center gap-2 text-[10px] uppercase tracking-wider font-bold truncate flex-1",
230
- colorVariant === "primary" ? "text-primary-foreground" : "text-muted-foreground"
231
- ),
232
- children: [
233
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.GripHorizontal, { className: "w-3.5 h-3.5" }),
234
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate max-w-[150px]", children: title || t("media.playingMedia") })
235
- ]
236
- }
237
- ),
238
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1", children: /* @__PURE__ */ jsxRuntime.jsx(
239
- button.Button,
240
- {
241
- variant: "ghost",
242
- size: "icon",
243
- className: button.cn(
244
- "h-7 w-7 rounded-full transition-colors",
245
- colorVariant === "primary" ? "text-primary-foreground/70 hover:bg-destructive/20 hover:text-destructive-foreground" : "text-muted-foreground hover:bg-destructive/10 hover:text-destructive"
246
- ),
247
- onClick: onCloseMedia || onClose,
248
- title: t("common.close"),
249
- "aria-label": t("media.closePlayer"),
250
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "w-4 h-4" })
251
- }
252
- ) })
253
- ]
254
- }
255
- ),
256
- /* @__PURE__ */ jsxRuntime.jsx(
257
- "div",
258
- {
259
- className: button.cn(
260
- "flex-1 relative overflow-hidden group",
261
- enablePadding && "p-2",
262
- colorVariant === "primary" ? "bg-primary" : "bg-card"
263
- ),
264
- children
265
- }
266
- )
267
- ] }),
268
- /* @__PURE__ */ jsxRuntime.jsx(
269
- "div",
270
- {
271
- "aria-hidden": "true",
272
- className: "absolute top-0 left-0 w-2 h-full cursor-ew-resize hover:bg-primary/20 transition-colors",
273
- onMouseDown: (e) => handleResizeStart(e, "left")
274
- }
275
- ),
276
- /* @__PURE__ */ jsxRuntime.jsx(
277
- "div",
278
- {
279
- "aria-hidden": "true",
280
- className: "absolute top-0 right-0 w-2 h-full cursor-ew-resize hover:bg-primary/20 transition-colors",
281
- onMouseDown: (e) => handleResizeStart(e, "right")
282
- }
283
- ),
284
- /* @__PURE__ */ jsxRuntime.jsx(
285
- "div",
286
- {
287
- "aria-hidden": "true",
288
- className: "absolute top-0 left-0 w-full h-2 cursor-ns-resize hover:bg-primary/20 transition-colors",
289
- onMouseDown: (e) => handleResizeStart(e, "top")
290
- }
291
- ),
292
- /* @__PURE__ */ jsxRuntime.jsx(
293
- "div",
294
- {
295
- "aria-hidden": "true",
296
- className: "absolute bottom-0 left-0 w-full h-2 cursor-ns-resize hover:bg-primary/20 transition-colors",
297
- onMouseDown: (e) => handleResizeStart(e, "bottom")
298
- }
299
- ),
300
- /* @__PURE__ */ jsxRuntime.jsx(
301
- "div",
302
- {
303
- "aria-hidden": "true",
304
- className: "absolute top-0 left-0 w-4 h-4 cursor-nwse-resize hover:bg-primary/20 transition-colors",
305
- onMouseDown: (e) => handleResizeStart(e, "top-left")
306
- }
307
- ),
308
- /* @__PURE__ */ jsxRuntime.jsx(
309
- "div",
310
- {
311
- "aria-hidden": "true",
312
- className: "absolute top-0 right-0 w-4 h-4 cursor-nesw-resize hover:bg-primary/20 transition-colors",
313
- onMouseDown: (e) => handleResizeStart(e, "top-right")
314
- }
315
- ),
316
- /* @__PURE__ */ jsxRuntime.jsx(
317
- "div",
318
- {
319
- "aria-hidden": "true",
320
- className: "absolute bottom-0 left-0 w-4 h-4 cursor-nesw-resize hover:bg-primary/20 transition-colors",
321
- onMouseDown: (e) => handleResizeStart(e, "bottom-left")
322
- }
323
- ),
324
- /* @__PURE__ */ jsxRuntime.jsx(
325
- "div",
326
- {
327
- "aria-hidden": "true",
328
- className: "absolute bottom-0 right-0 w-4 h-4 cursor-nwse-resize hover:bg-primary/20 transition-colors",
329
- onMouseDown: (e) => handleResizeStart(e, "bottom-right")
330
- }
331
- )
332
- ]
333
- }
334
- )
335
- }
336
- ) });
337
- }
338
- function VideoPlayer({
339
- src,
340
- poster,
341
- title,
342
- autoPlay = false,
343
- enableAutoFloat = true,
344
- className
345
- }) {
346
- const { t } = reactI18next.useTranslation();
347
- const videoRef = React.useRef(null);
348
- const containerRef = React.useRef(null);
349
- const [isPlaying, setIsPlaying] = React.useState(false);
350
- const [progress, setProgress] = React.useState(0);
351
- const [volume, setVolume] = React.useState(1);
352
- const [isMuted, setIsMuted] = React.useState(false);
353
- const [currentTime, setCurrentTime] = React.useState(0);
354
- const [duration, setDuration] = React.useState(0);
355
- const [isFloating, setIsFloating] = React.useState(false);
356
- const [isManualFloating, setIsManualFloating] = React.useState(false);
357
- const [showControls, setShowControls] = React.useState(true);
358
- const [enableAutoFloatLocal, setEnableAutoFloatLocal] = React.useState(enableAutoFloat);
359
- let controlsTimeout;
360
- const handleSetFloating = (floating) => {
361
- if (videoRef.current) {
362
- setCurrentTime(videoRef.current.currentTime);
363
- }
364
- setIsFloating(floating);
365
- if (!floating) {
366
- setIsManualFloating(false);
367
- }
368
- };
369
- React.useEffect(() => {
370
- const video = videoRef.current;
371
- if (video) {
372
- if (Math.abs(video.currentTime - currentTime) > 0.5) {
373
- video.currentTime = currentTime;
374
- }
375
- if (isPlaying) {
376
- const playPromise = video.play();
377
- if (playPromise !== void 0) {
378
- playPromise.catch((error) => {
379
- console.log("Playback interrupted during switch:", error);
380
- });
381
- }
382
- }
383
- }
384
- }, [isFloating]);
385
- React.useEffect(() => {
386
- const container = containerRef.current;
387
- if (!container || !enableAutoFloatLocal) return;
388
- const observer = new IntersectionObserver(
389
- (entries) => {
390
- const entry = entries[0];
391
- if (!entry) return;
392
- if (isPlaying && !entry.isIntersecting && !isFloating) {
393
- if (videoRef.current) setCurrentTime(videoRef.current.currentTime);
394
- setIsFloating(true);
395
- } else if (entry.isIntersecting && isFloating && !isManualFloating) {
396
- if (videoRef.current) setCurrentTime(videoRef.current.currentTime);
397
- handleSetFloating(false);
398
- }
399
- },
400
- { threshold: 0.2 }
401
- );
402
- observer.observe(container);
403
- return () => observer.disconnect();
404
- }, [isPlaying, isFloating, isManualFloating, enableAutoFloatLocal]);
405
- React.useEffect(() => {
406
- const video = videoRef.current;
407
- if (!video) return;
408
- const updateTime = () => {
409
- setCurrentTime(video.currentTime);
410
- };
411
- const updateDuration = () => setDuration(video.duration);
412
- const onPlay = () => setIsPlaying(true);
413
- const onPause = () => setIsPlaying(false);
414
- video.addEventListener("timeupdate", updateTime);
415
- video.addEventListener("loadedmetadata", updateDuration);
416
- video.addEventListener("play", onPlay);
417
- video.addEventListener("pause", onPause);
418
- video.volume = volume;
419
- video.muted = isMuted;
420
- return () => {
421
- video.removeEventListener("timeupdate", updateTime);
422
- video.removeEventListener("loadedmetadata", updateDuration);
423
- video.removeEventListener("play", onPlay);
424
- video.removeEventListener("pause", onPause);
425
- };
426
- }, [isFloating]);
427
- const togglePlay = () => {
428
- if (videoRef.current) {
429
- if (isPlaying) {
430
- videoRef.current.pause();
431
- } else {
432
- videoRef.current.play();
433
- }
434
- }
435
- };
436
- const handleSeek = (value) => {
437
- if (videoRef.current) {
438
- videoRef.current.currentTime = value[0];
439
- setCurrentTime(value[0]);
440
- }
441
- };
442
- const handleVolumeChange = (value) => {
443
- const newVolume = value[0];
444
- if (videoRef.current) {
445
- videoRef.current.volume = newVolume;
446
- setVolume(newVolume);
447
- setIsMuted(newVolume === 0);
448
- }
449
- };
450
- const toggleMute = () => {
451
- if (videoRef.current) {
452
- const newMutedState = !isMuted;
453
- videoRef.current.muted = newMutedState;
454
- setIsMuted(newMutedState);
455
- if (newMutedState) {
456
- setVolume(0);
457
- } else {
458
- setVolume(1);
459
- videoRef.current.volume = 1;
460
- }
461
- }
462
- };
463
- const handleMouseMove = () => {
464
- setShowControls(true);
465
- clearTimeout(controlsTimeout);
466
- controlsTimeout = setTimeout(() => {
467
- if (isPlaying) setShowControls(false);
468
- }, 2500);
469
- };
470
- const formatTime = (time) => {
471
- const minutes = Math.floor(time / 60);
472
- const seconds = Math.floor(time % 60);
473
- return `${minutes}:${seconds < 10 ? "0" : ""}${seconds}`;
474
- };
475
- return /* @__PURE__ */ jsxRuntime.jsx("div", { ref: containerRef, className, children: /* @__PURE__ */ jsxRuntime.jsx(
476
- FloatingMediaWrapper,
477
- {
478
- isFloating,
479
- setIsFloating: handleSetFloating,
480
- onClose: () => handleSetFloating(false),
481
- onCloseMedia: () => {
482
- setIsFloating(false);
483
- setEnableAutoFloatLocal(false);
484
- },
485
- title: title || t("media.untitledVideo"),
486
- aspectRatio: 16 / 9,
487
- className: "w-full h-full",
488
- playerId: "video-player",
489
- children: /* @__PURE__ */ jsxRuntime.jsxs(
490
- "div",
491
- {
492
- className: "relative w-full h-full bg-black group overflow-hidden",
493
- onMouseMove: handleMouseMove,
494
- onMouseLeave: () => isPlaying && setShowControls(false),
495
- children: [
496
- /* @__PURE__ */ jsxRuntime.jsx(
497
- "video",
498
- {
499
- ref: videoRef,
500
- src,
501
- poster,
502
- className: "w-full h-full object-contain",
503
- onClick: togglePlay,
504
- autoPlay,
505
- title: title || t("media.video")
506
- }
507
- ),
508
- !isPlaying && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute inset-0 flex items-center justify-center pointer-events-none", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-16 h-16 rounded-full bg-black/40 backdrop-blur-sm flex items-center justify-center border border-white/20 shadow-2xl", children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Play, { className: "w-8 h-8 text-white ml-1", fill: "white" }) }) }),
509
- /* @__PURE__ */ jsxRuntime.jsxs(
510
- "div",
511
- {
512
- className: button.cn(
513
- "absolute inset-x-0 bottom-0 bg-gradient-to-t from-black/60 via-black/30 to-transparent pt-12 pb-4 px-4 transition-opacity duration-300",
514
- showControls ? "opacity-100" : "opacity-0"
515
- ),
516
- children: [
517
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mb-4 group/slider", children: /* @__PURE__ */ jsxRuntime.jsx(
518
- slider.Slider,
519
- {
520
- value: [currentTime],
521
- max: duration || 100,
522
- step: 1,
523
- onValueChange: handleSeek,
524
- className: "cursor-pointer [&_[data-slot=slider-track]]:bg-white/30 [&_[data-slot=slider-range]]:bg-white [&_[data-slot=slider-thumb]]:bg-white [&_[data-slot=slider-thumb]]:border-white",
525
- "aria-label": t("media.videoProgress")
526
- }
527
- ) }),
528
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between", children: [
529
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-4", children: [
530
- /* @__PURE__ */ jsxRuntime.jsx(
531
- button.Button,
532
- {
533
- variant: "ghost",
534
- size: "icon",
535
- className: "text-white hover:text-white hover:bg-black/50 h-8 w-8",
536
- onClick: togglePlay,
537
- "aria-label": isPlaying ? t("media.pause") : t("media.play"),
538
- children: isPlaying ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Pause, { className: "w-5 h-5", fill: "currentColor" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Play, { className: "w-5 h-5", fill: "currentColor" })
539
- }
540
- ),
541
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 group/vol", children: [
542
- /* @__PURE__ */ jsxRuntime.jsx(
543
- button.Button,
544
- {
545
- variant: "ghost",
546
- size: "icon",
547
- className: "text-white hover:text-white hover:bg-black/50 h-8 w-8",
548
- onClick: toggleMute,
549
- "aria-label": isMuted || volume === 0 ? t("media.unmute") : t("media.mute"),
550
- children: isMuted || volume === 0 ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.VolumeX, { className: "w-5 h-5" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Volume2, { className: "w-5 h-5" })
551
- }
552
- ),
553
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-0 overflow-hidden group-hover/vol:w-20 transition-all duration-300", children: /* @__PURE__ */ jsxRuntime.jsx(
554
- slider.Slider,
555
- {
556
- value: [isMuted ? 0 : volume],
557
- max: 1,
558
- step: 0.01,
559
- onValueChange: handleVolumeChange,
560
- className: "w-20 [&_[data-slot=slider-track]]:bg-white/30 [&_[data-slot=slider-range]]:bg-white [&_[data-slot=slider-thumb]]:bg-white [&_[data-slot=slider-thumb]]:border-white",
561
- "aria-label": t("media.volume")
562
- }
563
- ) })
564
- ] }),
565
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-white text-xs font-medium tabular-nums select-none drop-shadow-md", children: [
566
- formatTime(currentTime),
567
- " / ",
568
- formatTime(duration)
569
- ] })
570
- ] }),
571
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-2", children: /* @__PURE__ */ jsxRuntime.jsx(
572
- button.Button,
573
- {
574
- variant: "ghost",
575
- size: "icon",
576
- className: "text-white hover:text-white hover:bg-black/50 h-8 w-8",
577
- onClick: () => {
578
- setEnableAutoFloatLocal(true);
579
- if (!isFloating) setIsManualFloating(true);
580
- handleSetFloating(!isFloating);
581
- },
582
- title: isFloating ? t("media.restore") : t("media.popOut"),
583
- "aria-label": isFloating ? t("media.restore") : t("media.popOut"),
584
- children: isFloating ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Maximize, { className: "w-4 h-4" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.PictureInPicture, { className: "w-4 h-4" })
585
- }
586
- ) })
587
- ] })
588
- ]
589
- }
590
- )
591
- ]
592
- }
593
- )
594
- }
595
- ) });
596
- }
597
- function AudioPlayer({
598
- src,
599
- title,
600
- artist,
601
- subtitle,
602
- autoPlay = false,
603
- className,
604
- variant = "card",
605
- isOpen = true,
606
- onClose,
607
- duration: initialDuration,
608
- currentTime: initialTime = 0,
609
- colorVariant = "default",
610
- enableAutoFloat = true,
611
- onCloseFloating
612
- }) {
613
- const { t } = reactI18next.useTranslation();
614
- const {
615
- audioRef,
616
- containerRef,
617
- isPlaying,
618
- currentTime,
619
- duration,
620
- volume,
621
- isMuted,
622
- playbackSpeed,
623
- isFloating,
624
- isManualFloating,
625
- isVisible,
626
- isMobile,
627
- enableAutoFloatLocal,
628
- sidebarExpanded,
629
- sidebarWidth,
630
- assistenteExpanded,
631
- togglePlay,
632
- toggleMute,
633
- handleSeek,
634
- handleVolumeChange,
635
- handleSetFloating,
636
- handleEnableManualFloat,
637
- setPlaybackSpeed,
638
- resetAudio,
639
- formatTime,
640
- onPlay,
641
- onPause,
642
- onEnded,
643
- onTimeUpdate,
644
- onLoadedMetadata
645
- } = useAudioPlayer.useAudioPlayer({
646
- src,
647
- autoPlay,
648
- initialTime,
649
- initialDuration,
650
- variant,
651
- isOpen,
652
- enableAutoFloat,
653
- onCloseFloating
654
- });
655
- const audioElement = /* @__PURE__ */ jsxRuntime.jsx(
656
- "audio",
657
- {
658
- ref: audioRef,
659
- src,
660
- autoPlay,
661
- className: "hidden",
662
- onTimeUpdate,
663
- onLoadedMetadata,
664
- onPlay,
665
- onPause,
666
- onEnded
667
- }
668
- );
669
- const desktopLayout = /* @__PURE__ */ jsxRuntime.jsxs(
670
- "div",
671
- {
672
- className: button.cn(
673
- "px-6 flex items-center justify-between gap-4",
674
- colorVariant === "primary" ? "h-[80px] gap-6" : "h-[80px]"
675
- ),
676
- children: [
677
- /* @__PURE__ */ jsxRuntime.jsxs(
678
- "div",
679
- {
680
- className: button.cn(
681
- "flex flex-col min-w-0 shrink-0 relative z-10",
682
- colorVariant === "primary" ? "w-[280px]" : "w-[280px]"
683
- ),
684
- children: [
685
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 mb-0.5", children: [
686
- colorVariant === "primary" ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-2 h-2 rounded-full bg-[var(--chart-4)] animate-pulse shrink-0" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Radio, { className: "w-3 h-3 text-[var(--chart-4)] animate-pulse shrink-0" }),
687
- /* @__PURE__ */ jsxRuntime.jsx(
688
- "h4",
689
- {
690
- className: button.cn(
691
- "truncate",
692
- colorVariant === "primary" ? "font-semibold text-base tracking-tight" : "font-medium text-base"
693
- ),
694
- title: title || t("media.audioTitle"),
695
- children: title || t("media.audioTitle")
696
- }
697
- )
698
- ] }),
699
- /* @__PURE__ */ jsxRuntime.jsxs(
700
- "div",
701
- {
702
- className: button.cn(
703
- "flex items-center gap-1 text-xs text-muted-foreground",
704
- colorVariant === "primary" && "opacity-80"
705
- ),
706
- children: [
707
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: subtitle || artist }),
708
- /* @__PURE__ */ jsxRuntime.jsx(
709
- lucideReact.ExternalLink,
710
- {
711
- className: button.cn(
712
- "w-3 h-3 cursor-pointer hover:text-foreground ml-1 transition-opacity",
713
- colorVariant === "primary" ? "opacity-60 hover:opacity-100" : "opacity-70 hover:opacity-100"
714
- )
715
- }
716
- )
717
- ]
718
- }
719
- )
720
- ]
721
- }
722
- ),
723
- /* @__PURE__ */ jsxRuntime.jsxs(
724
- "div",
725
- {
726
- className: button.cn(
727
- "flex-1 flex items-center justify-center gap-4 min-w-0 max-w-xl relative z-10",
728
- colorVariant === "primary" && "gap-4"
729
- ),
730
- children: [
731
- /* @__PURE__ */ jsxRuntime.jsx(
732
- "button",
733
- {
734
- onClick: togglePlay,
735
- "aria-label": isPlaying ? t("media.pause") : t("media.play"),
736
- className: button.cn(
737
- "transition-all focus:outline-none shrink-0",
738
- colorVariant === "primary" ? "hover:scale-110" : "text-muted-foreground hover:text-foreground hover:scale-110 active:scale-95 transform duration-100"
739
- ),
740
- children: isPlaying ? /* @__PURE__ */ jsxRuntime.jsx(
741
- lucideReact.PauseCircle,
742
- {
743
- className: button.cn(colorVariant === "primary" ? "w-12 h-12" : "w-10 h-10"),
744
- strokeWidth: colorVariant === "primary" ? 1 : 1.5
745
- }
746
- ) : /* @__PURE__ */ jsxRuntime.jsx(
747
- lucideReact.PlayCircle,
748
- {
749
- className: button.cn(colorVariant === "primary" ? "w-12 h-12" : "w-10 h-10"),
750
- strokeWidth: colorVariant === "primary" ? 1 : 1.5
751
- }
752
- )
753
- }
754
- ),
755
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 flex items-center gap-3 max-w-lg", children: [
756
- /* @__PURE__ */ jsxRuntime.jsx(
757
- "span",
758
- {
759
- className: button.cn(
760
- "text-xs font-mono shrink-0 w-10 text-right",
761
- colorVariant === "primary" ? "text-[11px] w-12 opacity-80" : "text-muted-foreground"
762
- ),
763
- children: formatTime(currentTime)
764
- }
765
- ),
766
- /* @__PURE__ */ jsxRuntime.jsx(
767
- slider.Slider,
768
- {
769
- value: [currentTime],
770
- max: duration || 100,
771
- onValueChange: handleSeek,
772
- className: "cursor-pointer"
773
- }
774
- ),
775
- /* @__PURE__ */ jsxRuntime.jsx(
776
- "span",
777
- {
778
- className: button.cn(
779
- "text-xs font-mono shrink-0 w-10",
780
- colorVariant === "primary" ? "text-[11px] w-12 opacity-80" : "text-muted-foreground"
781
- ),
782
- children: formatTime(duration)
783
- }
784
- )
785
- ] })
786
- ]
787
- }
788
- ),
789
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 shrink-0 relative z-10", children: [
790
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "hidden lg:flex items-center gap-2 w-28 mr-2 group", children: [
791
- /* @__PURE__ */ jsxRuntime.jsx(
792
- "button",
793
- {
794
- onClick: toggleMute,
795
- className: "text-muted-foreground hover:text-foreground",
796
- "aria-label": isMuted || volume === 0 ? t("media.unmute") : t("media.mute"),
797
- children: isMuted || volume === 0 ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.VolumeX, { className: "w-5 h-5" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Volume2, { className: "w-5 h-5" })
798
- }
799
- ),
800
- /* @__PURE__ */ jsxRuntime.jsx(
801
- slider.Slider,
802
- {
803
- value: [isMuted ? 0 : volume * 100],
804
- max: 100,
805
- onValueChange: (val) => handleVolumeChange([val[0] / 100]),
806
- className: "w-full opacity-60 group-hover:opacity-100 transition-opacity"
807
- }
808
- )
809
- ] }),
810
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1", children: [
811
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "hidden md:flex", children: [
812
- /* @__PURE__ */ jsxRuntime.jsx(tooltip.TooltipProvider, { children: /* @__PURE__ */ jsxRuntime.jsxs(tooltip.Tooltip, { children: [
813
- /* @__PURE__ */ jsxRuntime.jsx(tooltip.TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
814
- button.Button,
815
- {
816
- variant: "ghost",
817
- size: "icon",
818
- className: "rounded-full h-9 w-9",
819
- onClick: resetAudio,
820
- "aria-label": t("media.restart"),
821
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.RotateCcw, { className: "w-4 h-4" })
822
- }
823
- ) }),
824
- /* @__PURE__ */ jsxRuntime.jsx(tooltip.TooltipContent, { className: "z-[1001]", children: t("media.restart") })
825
- ] }) }),
826
- /* @__PURE__ */ jsxRuntime.jsx(tooltip.TooltipProvider, { children: /* @__PURE__ */ jsxRuntime.jsxs(tooltip.Tooltip, { children: [
827
- /* @__PURE__ */ jsxRuntime.jsx(tooltip.TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
828
- button.Button,
829
- {
830
- variant: "ghost",
831
- size: "icon",
832
- className: "text-[var(--chart-3)] hover:bg-accent rounded-full h-9 w-9",
833
- "aria-label": t("media.audioInfo"),
834
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Info, { className: "w-4 h-4 fill-current" })
835
- }
836
- ) }),
837
- /* @__PURE__ */ jsxRuntime.jsx(tooltip.TooltipContent, { className: "z-[1001]", children: t("media.info") })
838
- ] }) })
839
- ] }),
840
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "hidden xl:flex items-center gap-1", children: [
841
- /* @__PURE__ */ jsxRuntime.jsxs(dropdownMenu.DropdownMenu, { children: [
842
- /* @__PURE__ */ jsxRuntime.jsx(dropdownMenu.DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
843
- button.Button,
844
- {
845
- variant: "ghost",
846
- size: "icon",
847
- className: "rounded-full h-9 w-9",
848
- "aria-label": t("media.selectSpeed"),
849
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Gauge, { className: "w-4 h-4" })
850
- }
851
- ) }),
852
- /* @__PURE__ */ jsxRuntime.jsx(dropdownMenu.DropdownMenuContent, { align: "center", className: "w-32 z-[1001]", children: [0.5, 1, 1.5, 2].map((speed) => /* @__PURE__ */ jsxRuntime.jsxs(
853
- dropdownMenu.DropdownMenuItem,
854
- {
855
- onClick: () => setPlaybackSpeed(speed),
856
- className: button.cn(
857
- "cursor-pointer",
858
- playbackSpeed === speed && "bg-accent font-bold"
859
- ),
860
- children: [
861
- speed,
862
- "x"
863
- ]
864
- },
865
- speed
866
- )) })
867
- ] }),
868
- /* @__PURE__ */ jsxRuntime.jsx(tooltip.TooltipProvider, { children: /* @__PURE__ */ jsxRuntime.jsxs(tooltip.Tooltip, { children: [
869
- /* @__PURE__ */ jsxRuntime.jsx(tooltip.TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
870
- button.Button,
871
- {
872
- variant: "ghost",
873
- size: "icon",
874
- className: "rounded-full h-9 w-9",
875
- "aria-label": t("media.downloadAudio"),
876
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Download, { className: "w-4 h-4" })
877
- }
878
- ) }),
879
- /* @__PURE__ */ jsxRuntime.jsx(tooltip.TooltipContent, { className: "z-[1001]", children: t("media.downloadAudio") })
880
- ] }) })
881
- ] }),
882
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "xl:hidden", children: /* @__PURE__ */ jsxRuntime.jsxs(dropdownMenu.DropdownMenu, { children: [
883
- /* @__PURE__ */ jsxRuntime.jsx(dropdownMenu.DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
884
- button.Button,
885
- {
886
- variant: "ghost",
887
- size: "icon",
888
- className: "rounded-full h-9 w-9",
889
- "aria-label": t("media.moreOptions"),
890
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MoreHorizontal, { className: "w-5 h-5" })
891
- }
892
- ) }),
893
- /* @__PURE__ */ jsxRuntime.jsxs(dropdownMenu.DropdownMenuContent, { align: "end", className: "w-56 p-2 z-[1001]", children: [
894
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "lg:hidden", children: [
895
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "px-2 py-3", children: [
896
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-between mb-3 px-1", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
897
- isMuted || volume === 0 ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.VolumeX, { className: "w-4 h-4 text-muted-foreground" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Volume2, { className: "w-4 h-4 text-muted-foreground" }),
898
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[11px] font-medium uppercase tracking-wider text-muted-foreground/70", children: "Volume" })
899
- ] }) }),
900
- /* @__PURE__ */ jsxRuntime.jsx(
901
- slider.Slider,
902
- {
903
- value: [isMuted ? 0 : volume * 100],
904
- max: 100,
905
- onValueChange: (val) => handleVolumeChange([val[0] / 100])
906
- }
907
- )
908
- ] }),
909
- /* @__PURE__ */ jsxRuntime.jsx(dropdownMenu.DropdownMenuSeparator, { className: "my-1" })
910
- ] }),
911
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "md:hidden", children: [
912
- /* @__PURE__ */ jsxRuntime.jsxs(dropdownMenu.DropdownMenuItem, { onClick: resetAudio, className: "cursor-pointer py-2.5", children: [
913
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.RotateCcw, { className: "w-4 h-4 mr-3 text-muted-foreground" }),
914
- " ",
915
- t("media.restart")
916
- ] }),
917
- /* @__PURE__ */ jsxRuntime.jsxs(dropdownMenu.DropdownMenuItem, { className: "cursor-pointer py-2.5", children: [
918
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Info, { className: "w-4 h-4 mr-3 text-muted-foreground" }),
919
- " ",
920
- t("media.info")
921
- ] }),
922
- /* @__PURE__ */ jsxRuntime.jsx(dropdownMenu.DropdownMenuSeparator, { className: "my-1" })
923
- ] }),
924
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "xl:hidden", children: [
925
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "px-3 py-2 flex flex-col gap-2", children: [
926
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
927
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Gauge, { className: "w-4 h-4 text-muted-foreground" }),
928
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-medium", children: t("media.speed") })
929
- ] }),
930
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1", children: [0.5, 1, 1.5, 2].map((speed) => /* @__PURE__ */ jsxRuntime.jsxs(
931
- "button",
932
- {
933
- onClick: () => setPlaybackSpeed(speed),
934
- className: button.cn(
935
- "px-2 py-0.5 text-[10px] rounded border transition-colors",
936
- playbackSpeed === speed ? "bg-primary text-primary-foreground border-primary" : "bg-transparent border-border hover:bg-accent"
937
- ),
938
- children: [
939
- speed,
940
- "x"
941
- ]
942
- },
943
- speed
944
- )) })
945
- ] }),
946
- /* @__PURE__ */ jsxRuntime.jsx(dropdownMenu.DropdownMenuSeparator, { className: "my-1" }),
947
- /* @__PURE__ */ jsxRuntime.jsxs(dropdownMenu.DropdownMenuItem, { className: "cursor-pointer py-2.5", children: [
948
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Download, { className: "w-4 h-4 mr-3 text-muted-foreground" }),
949
- " ",
950
- t("media.downloadAudio")
951
- ] })
952
- ] })
953
- ] })
954
- ] }) }),
955
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-px h-8 bg-border mx-1" }),
956
- /* @__PURE__ */ jsxRuntime.jsx(
957
- button.Button,
958
- {
959
- onClick: onClose,
960
- variant: "ghost",
961
- size: "icon",
962
- className: "rounded-full h-9 w-9",
963
- "aria-label": t("media.closePlayer"),
964
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "w-5 h-5" })
965
- }
966
- )
967
- ] })
968
- ] })
969
- ]
970
- }
971
- );
972
- const mobileLayout = /* @__PURE__ */ jsxRuntime.jsxs(
973
- "div",
974
- {
975
- className: button.cn(
976
- "flex flex-col py-3 px-4 gap-3",
977
- colorVariant === "primary" && "py-4 px-5 gap-4"
978
- ),
979
- children: [
980
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-start justify-between gap-3", children: [
981
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col min-w-0 flex-1", children: [
982
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 mb-1", children: [
983
- colorVariant === "primary" ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "w-2 h-2 rounded-full bg-[var(--chart-4)] animate-pulse shrink-0" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Radio, { className: "w-3 h-3 text-[var(--chart-4)] animate-pulse shrink-0" }),
984
- /* @__PURE__ */ jsxRuntime.jsx(
985
- "h4",
986
- {
987
- className: button.cn(
988
- "truncate",
989
- colorVariant === "primary" ? "font-semibold text-sm tracking-tight" : "font-medium text-sm"
990
- ),
991
- children: title
992
- }
993
- )
994
- ] }),
995
- /* @__PURE__ */ jsxRuntime.jsx(
996
- "div",
997
- {
998
- className: button.cn(
999
- "flex items-center gap-1.5 text-xs text-muted-foreground",
1000
- colorVariant === "primary" && "opacity-70"
1001
- ),
1002
- children: /* @__PURE__ */ jsxRuntime.jsx("span", { className: "truncate", children: subtitle || artist })
1003
- }
1004
- )
1005
- ] }),
1006
- /* @__PURE__ */ jsxRuntime.jsx(
1007
- button.Button,
1008
- {
1009
- onClick: onClose,
1010
- variant: "ghost",
1011
- size: "icon",
1012
- className: "rounded-full h-8 w-8 shrink-0",
1013
- "aria-label": t("media.closePlayer"),
1014
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.X, { className: "w-4 h-4" })
1015
- }
1016
- )
1017
- ] }),
1018
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-3", children: [
1019
- /* @__PURE__ */ jsxRuntime.jsx(
1020
- "button",
1021
- {
1022
- onClick: togglePlay,
1023
- "aria-label": isPlaying ? t("media.pause") : t("media.play"),
1024
- className: "shrink-0 transition-transform active:scale-95",
1025
- children: isPlaying ? /* @__PURE__ */ jsxRuntime.jsx(
1026
- lucideReact.PauseCircle,
1027
- {
1028
- className: button.cn(colorVariant === "primary" ? "w-12 h-12" : "w-10 h-10"),
1029
- strokeWidth: colorVariant === "primary" ? 1 : 1.5
1030
- }
1031
- ) : /* @__PURE__ */ jsxRuntime.jsx(
1032
- lucideReact.PlayCircle,
1033
- {
1034
- className: button.cn(colorVariant === "primary" ? "w-12 h-12" : "w-10 h-10"),
1035
- strokeWidth: colorVariant === "primary" ? 1 : 1.5
1036
- }
1037
- )
1038
- }
1039
- ),
1040
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex-1 flex items-center gap-2", children: /* @__PURE__ */ jsxRuntime.jsx(
1041
- slider.Slider,
1042
- {
1043
- value: [currentTime],
1044
- max: duration || 100,
1045
- onValueChange: handleSeek,
1046
- className: "cursor-pointer",
1047
- "aria-label": t("media.playbackProgress")
1048
- }
1049
- ) }),
1050
- /* @__PURE__ */ jsxRuntime.jsxs(dropdownMenu.DropdownMenu, { children: [
1051
- /* @__PURE__ */ jsxRuntime.jsx(dropdownMenu.DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
1052
- button.Button,
1053
- {
1054
- variant: "ghost",
1055
- size: "icon",
1056
- className: "h-9 w-9 rounded-full",
1057
- "aria-label": t("media.moreOptions"),
1058
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MoreVertical, { className: "w-5 h-5" })
1059
- }
1060
- ) }),
1061
- /* @__PURE__ */ jsxRuntime.jsxs(dropdownMenu.DropdownMenuContent, { align: "end", className: "w-56 p-2 z-[1001]", children: [
1062
- /* @__PURE__ */ jsxRuntime.jsx(dropdownMenu.DropdownMenuItem, { onClick: resetAudio, children: t("media.restart") }),
1063
- /* @__PURE__ */ jsxRuntime.jsx(dropdownMenu.DropdownMenuItem, { children: t("media.speedLabel", { speed: playbackSpeed }) })
1064
- ] })
1065
- ] })
1066
- ] })
1067
- ]
1068
- }
1069
- );
1070
- const desktopLayoutCompact = /* @__PURE__ */ jsxRuntime.jsxs(
1071
- "div",
1072
- {
1073
- className: button.cn(
1074
- "flex items-center gap-3 w-full",
1075
- isFloating ? "px-3 py-1 text-foreground" : "px-4 py-3"
1076
- ),
1077
- children: [
1078
- /* @__PURE__ */ jsxRuntime.jsx(
1079
- button.Button,
1080
- {
1081
- onClick: togglePlay,
1082
- size: "icon",
1083
- variant: "outline",
1084
- className: button.cn(
1085
- "shrink-0 rounded-full border-border text-foreground hover:bg-accent transition-colors",
1086
- colorVariant === "primary" && "border-primary-foreground/20 hover:bg-primary-foreground/10 text-primary-foreground",
1087
- isFloating ? "h-8 w-8" : "h-10 w-10"
1088
- ),
1089
- "aria-label": isPlaying ? t("media.pause") : t("media.play"),
1090
- children: isPlaying ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Pause, { className: button.cn(isFloating ? "w-3 h-3" : "w-4 h-4", "fill-current") }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Play, { className: button.cn(isFloating ? "w-3 h-3" : "w-4 h-4", "fill-current ml-0.5") })
1091
- }
1092
- ),
1093
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex-1 min-w-0 flex flex-col justify-center gap-1.5", children: [
1094
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center justify-between text-xs leading-none", children: [
1095
- /* @__PURE__ */ jsxRuntime.jsx(
1096
- "span",
1097
- {
1098
- className: button.cn(
1099
- "font-medium truncate",
1100
- colorVariant === "primary" ? "text-primary-foreground" : "text-foreground"
1101
- ),
1102
- children: title
1103
- }
1104
- ),
1105
- /* @__PURE__ */ jsxRuntime.jsxs(
1106
- "span",
1107
- {
1108
- className: button.cn(
1109
- "font-medium tabular-nums text-[10px] sm:text-xs",
1110
- colorVariant === "primary" ? "text-primary-foreground/70" : "text-muted-foreground"
1111
- ),
1112
- children: [
1113
- formatTime(currentTime),
1114
- " / ",
1115
- formatTime(duration)
1116
- ]
1117
- }
1118
- )
1119
- ] }),
1120
- /* @__PURE__ */ jsxRuntime.jsx(
1121
- slider.Slider,
1122
- {
1123
- value: [currentTime],
1124
- max: duration || 100,
1125
- step: 1,
1126
- onValueChange: handleSeek,
1127
- className: "w-full",
1128
- "aria-label": t("media.playbackProgress")
1129
- }
1130
- )
1131
- ] }),
1132
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1 shrink-0", children: [
1133
- /* @__PURE__ */ jsxRuntime.jsxs(dropdownMenu.DropdownMenu, { children: [
1134
- /* @__PURE__ */ jsxRuntime.jsx(dropdownMenu.DropdownMenuTrigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
1135
- button.Button,
1136
- {
1137
- variant: "ghost",
1138
- size: "icon",
1139
- className: button.cn(
1140
- "rounded-full",
1141
- colorVariant === "primary" ? "text-primary-foreground/80 hover:text-primary-foreground hover:bg-primary-foreground/10" : "text-muted-foreground hover:text-foreground",
1142
- isFloating ? "h-7 w-7" : "h-8 w-8"
1143
- ),
1144
- "aria-label": "Mais opções",
1145
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.MoreVertical, { className: isFloating ? "w-4 h-4" : "w-5 h-5" })
1146
- }
1147
- ) }),
1148
- /* @__PURE__ */ jsxRuntime.jsxs(dropdownMenu.DropdownMenuContent, { align: "end", className: "w-56 p-2 z-[1001]", children: [
1149
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "px-2 py-3", children: [
1150
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center justify-between mb-3 px-1", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
1151
- isMuted || volume === 0 ? /* @__PURE__ */ jsxRuntime.jsx(lucideReact.VolumeX, { className: "w-4 h-4 text-muted-foreground" }) : /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Volume2, { className: "w-4 h-4 text-muted-foreground" }),
1152
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[11px] font-medium uppercase tracking-wider text-muted-foreground/70", children: "Volume" })
1153
- ] }) }),
1154
- /* @__PURE__ */ jsxRuntime.jsx(
1155
- slider.Slider,
1156
- {
1157
- value: [isMuted ? 0 : volume * 100],
1158
- max: 100,
1159
- onValueChange: (val) => handleVolumeChange([val[0] / 100]),
1160
- "aria-label": "Volume"
1161
- }
1162
- )
1163
- ] }),
1164
- /* @__PURE__ */ jsxRuntime.jsx(dropdownMenu.DropdownMenuSeparator, { className: "my-2" }),
1165
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "px-2 py-1 flex flex-col gap-2", children: [
1166
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2", children: [
1167
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Gauge, { className: "w-4 h-4 text-muted-foreground" }),
1168
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm font-medium", children: t("media.speed") })
1169
- ] }),
1170
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-1", children: [0.5, 1, 1.5, 2].map((speed) => /* @__PURE__ */ jsxRuntime.jsxs(
1171
- "button",
1172
- {
1173
- onClick: () => setPlaybackSpeed(speed),
1174
- className: button.cn(
1175
- "px-2 py-1 text-[10px] rounded border transition-colors",
1176
- playbackSpeed === speed ? "bg-primary text-primary-foreground border-primary" : "bg-transparent border-border hover:bg-accent"
1177
- ),
1178
- children: [
1179
- speed,
1180
- "x"
1181
- ]
1182
- },
1183
- speed
1184
- )) })
1185
- ] }),
1186
- /* @__PURE__ */ jsxRuntime.jsx(dropdownMenu.DropdownMenuSeparator, { className: "my-2" }),
1187
- /* @__PURE__ */ jsxRuntime.jsxs(dropdownMenu.DropdownMenuItem, { onClick: resetAudio, className: "cursor-pointer py-2.5", children: [
1188
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.RotateCcw, { className: "w-4 h-4 mr-3 text-muted-foreground" }),
1189
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm", children: t("media.restart") })
1190
- ] }),
1191
- /* @__PURE__ */ jsxRuntime.jsxs(dropdownMenu.DropdownMenuItem, { className: "cursor-pointer py-2.5", children: [
1192
- /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Download, { className: "w-4 h-4 mr-3 text-muted-foreground" }),
1193
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-sm", children: t("media.downloadFile") })
1194
- ] })
1195
- ] })
1196
- ] }),
1197
- !isFloating && /* @__PURE__ */ jsxRuntime.jsx(
1198
- button.Button,
1199
- {
1200
- variant: "ghost",
1201
- size: "icon",
1202
- className: button.cn(
1203
- "h-8 w-8",
1204
- colorVariant === "primary" ? "text-primary-foreground/80 hover:text-primary-foreground hover:bg-primary-foreground/10" : "text-muted-foreground hover:text-foreground"
1205
- ),
1206
- onClick: handleEnableManualFloat,
1207
- title: t("media.floatingMode"),
1208
- "aria-label": t("media.openFloatingMode"),
1209
- children: /* @__PURE__ */ jsxRuntime.jsx(lucideReact.Maximize2, { className: "w-4 h-4" })
1210
- }
1211
- )
1212
- ] })
1213
- ]
1214
- }
1215
- );
1216
- if (!isVisible) return null;
1217
- if (variant === "bar" && isVisible && typeof document !== "undefined") {
1218
- return reactDom.createPortal(
1219
- /* @__PURE__ */ jsxRuntime.jsxs(
1220
- "div",
1221
- {
1222
- className: button.cn(
1223
- "fixed bottom-0 z-[100] border-t transition-all duration-300 ease-in-out",
1224
- colorVariant === "primary" ? "bg-primary/95 text-primary-foreground border-primary/20 backdrop-blur-sm [&_.text-muted-foreground]:text-primary-foreground/70 [&_.text-foreground]:text-primary-foreground [&_button]:text-primary-foreground [&_[data-slot=slider-track]]:bg-primary-foreground/30 [&_[data-slot=slider-range]]:bg-primary-foreground [&_[data-slot=slider-thumb]]:border-primary-foreground [&_[data-slot=slider-thumb]]:bg-primary-foreground" : "bg-card/95 text-card-foreground border-border backdrop-blur-md shadow-[var(--elevation-sm)]",
1225
- isOpen ? "translate-y-0 opacity-100" : "translate-y-full opacity-0",
1226
- className
1227
- ),
1228
- style: {
1229
- left: isMobile ? 0 : sidebarExpanded ? sidebarWidth : 80,
1230
- right: isMobile ? 0 : assistenteExpanded ? 420 : 80
1231
- },
1232
- children: [
1233
- audioElement,
1234
- !isMobile ? desktopLayout : mobileLayout
1235
- ]
1236
- }
1237
- ),
1238
- document.body
1239
- );
1240
- }
1241
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { ref: containerRef, className, children: [
1242
- audioElement,
1243
- /* @__PURE__ */ jsxRuntime.jsx(
1244
- FloatingMediaWrapper,
1245
- {
1246
- isFloating,
1247
- setIsFloating: handleSetFloating,
1248
- onClose: () => handleSetFloating(false),
1249
- onCloseMedia: () => {
1250
- handleSetFloating(false);
1251
- },
1252
- title: t("media.playingMedia"),
1253
- aspectRatio: 320 / 110,
1254
- minHeight: 110,
1255
- minWidth: 320,
1256
- colorVariant,
1257
- className: "w-full",
1258
- playerId: "audio-player",
1259
- enablePadding: true,
1260
- children: /* @__PURE__ */ jsxRuntime.jsx(
1261
- "div",
1262
- {
1263
- className: button.cn(
1264
- "w-full overflow-hidden flex flex-col justify-center",
1265
- colorVariant === "primary" ? "bg-primary text-primary-foreground [&_[data-slot=slider-track]]:bg-white/20 [&_[data-slot=slider-range]]:bg-white [&_[data-slot=slider-thumb]]:border-white [&_[data-slot=slider-thumb]]:bg-white" : "bg-card text-card-foreground",
1266
- isFloating ? "h-full bg-transparent" : "border rounded-md shadow-sm"
1267
- ),
1268
- children: desktopLayoutCompact
1269
- }
1270
- )
1271
- }
1272
- )
1273
- ] });
1274
- }
1275
- exports.AudioPlayer = AudioPlayer;
1276
- exports.FloatingMediaWrapper = FloatingMediaWrapper;
1277
- exports.VideoPlayer = VideoPlayer;