@ozdao/martyrs 0.2.492 → 0.2.494

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 (341) hide show
  1. package/dist/_virtual/index.cjs +4 -4
  2. package/dist/_virtual/index.js +4 -4
  3. package/dist/_virtual/index2.cjs +4 -4
  4. package/dist/_virtual/index2.js +4 -4
  5. package/dist/builder.cjs +53 -90
  6. package/dist/builder.js +54 -91
  7. package/dist/{crud-B-kQw3Z5.cjs → crud-JN_LFj01.cjs} +3 -0
  8. package/dist/{crud-Cwx5VlSm.js → crud-sE7GLPbj.js} +3 -0
  9. package/dist/globals.server.cjs +322 -3
  10. package/dist/globals.server.js +303 -1
  11. package/dist/{globals.verifier-D68mHEBl.cjs → globals.verifier-C0zj_LLo.cjs} +8 -1
  12. package/dist/{globals.verifier-CWFz5Gh2.js → globals.verifier-DFqKQ7hK.js} +8 -1
  13. package/dist/inventory.server.cjs +2 -2
  14. package/dist/inventory.server.js +2 -2
  15. package/dist/{main-SZQ1QjeP.js → main-CJm5myDI.js} +631 -607
  16. package/dist/{main-MzmGbSxs.cjs → main-DTaE01lg.cjs} +6 -6
  17. package/dist/martyrs/src/components/Calendar/Calendar.vue2.cjs +1 -1
  18. package/dist/martyrs/src/components/Calendar/Calendar.vue2.cjs.map +1 -1
  19. package/dist/martyrs/src/components/Calendar/Calendar.vue2.js +1 -1
  20. package/dist/martyrs/src/components/Calendar/Calendar.vue2.js.map +1 -1
  21. package/dist/martyrs/src/components/Feed/Feed.vue.cjs +33 -7
  22. package/dist/martyrs/src/components/Feed/Feed.vue.cjs.map +1 -1
  23. package/dist/martyrs/src/components/Feed/Feed.vue.js +33 -7
  24. package/dist/martyrs/src/components/Feed/Feed.vue.js.map +1 -1
  25. package/dist/martyrs/src/components/Field/{Field.vue2.cjs → Field.vue.cjs} +2 -2
  26. package/dist/martyrs/src/components/Field/{Field.vue2.js.map → Field.vue.cjs.map} +1 -1
  27. package/dist/martyrs/src/components/Field/{Field.vue2.js → Field.vue.js} +2 -2
  28. package/dist/martyrs/src/components/Field/Field.vue.js.map +1 -0
  29. package/dist/martyrs/src/components/FieldBig/FieldBig.vue.cjs +1 -1
  30. package/dist/martyrs/src/components/FieldBig/FieldBig.vue.js +1 -1
  31. package/dist/martyrs/src/components/FieldTags/FieldTags.vue.cjs +1 -1
  32. package/dist/martyrs/src/components/FieldTags/FieldTags.vue.js +1 -1
  33. package/dist/martyrs/src/components/Menu/{Menu.vue.cjs → Menu.vue2.cjs} +2 -2
  34. package/dist/martyrs/src/components/Menu/Menu.vue2.cjs.map +1 -0
  35. package/dist/martyrs/src/components/Menu/{Menu.vue.js → Menu.vue2.js} +2 -2
  36. package/dist/martyrs/src/components/Menu/Menu.vue2.js.map +1 -0
  37. package/dist/martyrs/src/components/Menu/MenuItem.vue.js +2 -2
  38. package/dist/martyrs/src/components/Menu/MenuItem.vue.js.map +1 -1
  39. package/dist/martyrs/src/components/PhotoViewer/PhotoViewer.vue.js +4 -4
  40. package/dist/martyrs/src/modules/auth/views/components/pages/EnterCode.vue.cjs +1 -1
  41. package/dist/martyrs/src/modules/auth/views/components/pages/EnterCode.vue.js +1 -1
  42. package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.cjs +1 -1
  43. package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.js +1 -1
  44. package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.cjs +1 -1
  45. package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.js +1 -1
  46. package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.cjs +2 -2
  47. package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js +2 -2
  48. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditProfile.vue.cjs +1 -1
  49. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditProfile.vue.js +1 -1
  50. package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.cjs +1 -1
  51. package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.js +1 -1
  52. package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.cjs +1 -1
  53. package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.js +1 -1
  54. package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.cjs +1 -1
  55. package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.js +1 -1
  56. package/dist/martyrs/src/modules/auth/views/components/sections/ProfileEditCredentials.vue.cjs +1 -1
  57. package/dist/martyrs/src/modules/auth/views/components/sections/ProfileEditCredentials.vue.js +1 -1
  58. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.cjs +2 -2
  59. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.js +2 -2
  60. package/dist/martyrs/src/modules/constructor/components/elements/Card.vue.cjs +1 -1
  61. package/dist/martyrs/src/modules/constructor/components/elements/Card.vue.js +1 -1
  62. package/dist/martyrs/src/modules/constructor/components/elements/Embed.vue.cjs +1 -1
  63. package/dist/martyrs/src/modules/constructor/components/elements/Embed.vue.js +1 -1
  64. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.cjs +1 -1
  65. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.js +1 -1
  66. package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.cjs +1 -1
  67. package/dist/martyrs/src/modules/events/components/pages/EditEventTickets.vue.js +1 -1
  68. package/dist/martyrs/src/modules/events/components/pages/Event.vue.cjs +1 -1
  69. package/dist/martyrs/src/modules/events/components/pages/Event.vue.js +1 -1
  70. package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.cjs +1 -1
  71. package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.js +1 -1
  72. package/dist/martyrs/src/modules/globals/views/classes/globals.i18n.cjs +1 -1
  73. package/dist/martyrs/src/modules/globals/views/classes/globals.i18n.js +1 -1
  74. package/dist/martyrs/src/modules/globals/views/components/blocks/BlockSearch.vue.cjs +1 -1
  75. package/dist/martyrs/src/modules/globals/views/components/blocks/BlockSearch.vue.js +1 -1
  76. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.cjs +5 -1
  77. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.cjs.map +1 -1
  78. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.js +5 -1
  79. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.js.map +1 -1
  80. package/dist/martyrs/src/modules/icons/entities/IconTime.vue.cjs +2 -2
  81. package/dist/martyrs/src/modules/icons/entities/IconTime.vue.js +2 -2
  82. package/dist/martyrs/src/modules/icons/navigation/IconChevronLeft.vue.cjs +2 -2
  83. package/dist/martyrs/src/modules/icons/navigation/IconChevronLeft.vue.js +2 -2
  84. package/dist/martyrs/src/modules/icons/navigation/IconChevronRight.vue.cjs +2 -2
  85. package/dist/martyrs/src/modules/icons/navigation/IconChevronRight.vue.js +2 -2
  86. package/dist/martyrs/src/modules/icons/pages/IconsPage.vue.js +6 -6
  87. package/dist/martyrs/src/modules/icons/pages/IconsPage.vue.js.map +1 -1
  88. package/dist/martyrs/src/modules/inventory/components/forms/AdjustmentForm.vue.cjs +1 -1
  89. package/dist/martyrs/src/modules/inventory/components/forms/AdjustmentForm.vue.js +1 -1
  90. package/dist/martyrs/src/modules/inventory/components/forms/StockAlertsForm.vue.cjs +1 -1
  91. package/dist/martyrs/src/modules/inventory/components/forms/StockAlertsForm.vue.js +1 -1
  92. package/dist/martyrs/src/modules/inventory/components/pages/Inventory.vue.cjs +1 -1
  93. package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.cjs +1 -1
  94. package/dist/martyrs/src/modules/inventory/components/pages/InventoryEdit.vue.js +1 -1
  95. package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.cjs +22 -15
  96. package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.cjs.map +1 -1
  97. package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.js +23 -16
  98. package/dist/martyrs/src/modules/music/components/cards/AlbumCard.vue.js.map +1 -1
  99. package/dist/martyrs/src/modules/music/components/cards/ArtistCard.vue.cjs +2 -2
  100. package/dist/martyrs/src/modules/music/components/cards/ArtistCard.vue.cjs.map +1 -1
  101. package/dist/martyrs/src/modules/music/components/cards/ArtistCard.vue.js +2 -2
  102. package/dist/martyrs/src/modules/music/components/cards/ArtistCard.vue.js.map +1 -1
  103. package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.cjs +31 -13
  104. package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.cjs.map +1 -1
  105. package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.js +33 -15
  106. package/dist/martyrs/src/modules/music/components/cards/PlaylistCard.vue.js.map +1 -1
  107. package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.cjs +39 -22
  108. package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.cjs.map +1 -1
  109. package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.js +39 -22
  110. package/dist/martyrs/src/modules/music/components/cards/TrackListCard.vue.js.map +1 -1
  111. package/dist/martyrs/src/modules/music/components/forms/AlbumForm.vue.cjs +1 -1
  112. package/dist/martyrs/src/modules/music/components/forms/AlbumForm.vue.js +1 -1
  113. package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.cjs +1 -1
  114. package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.js +1 -1
  115. package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.cjs +385 -125
  116. package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.cjs.map +1 -1
  117. package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.js +391 -131
  118. package/dist/martyrs/src/modules/music/components/forms/PlaylistForm.vue.js.map +1 -1
  119. package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.cjs +24 -7
  120. package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.cjs.map +1 -1
  121. package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.js +25 -8
  122. package/dist/martyrs/src/modules/music/components/forms/SearchForm.vue.js.map +1 -1
  123. package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.cjs +99 -87
  124. package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.cjs.map +1 -1
  125. package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.js +111 -99
  126. package/dist/martyrs/src/modules/music/components/forms/TrackForm.vue.js.map +1 -1
  127. package/dist/martyrs/src/modules/music/components/layouts/MusicBottomPlayer.vue.cjs +21 -0
  128. package/dist/martyrs/src/modules/music/components/layouts/MusicBottomPlayer.vue.cjs.map +1 -0
  129. package/dist/martyrs/src/modules/music/components/layouts/MusicBottomPlayer.vue.js +21 -0
  130. package/dist/martyrs/src/modules/music/components/layouts/MusicBottomPlayer.vue.js.map +1 -0
  131. package/dist/martyrs/src/modules/music/components/pages/Album.vue.cjs +442 -210
  132. package/dist/martyrs/src/modules/music/components/pages/Album.vue.cjs.map +1 -1
  133. package/dist/martyrs/src/modules/music/components/pages/Album.vue.js +445 -213
  134. package/dist/martyrs/src/modules/music/components/pages/Album.vue.js.map +1 -1
  135. package/dist/martyrs/src/modules/music/components/pages/Artist.vue.cjs +92 -117
  136. package/dist/martyrs/src/modules/music/components/pages/Artist.vue.cjs.map +1 -1
  137. package/dist/martyrs/src/modules/music/components/pages/Artist.vue.js +93 -118
  138. package/dist/martyrs/src/modules/music/components/pages/Artist.vue.js.map +1 -1
  139. package/dist/martyrs/src/modules/music/components/pages/MusicHome.vue.cjs +72 -113
  140. package/dist/martyrs/src/modules/music/components/pages/MusicHome.vue.cjs.map +1 -1
  141. package/dist/martyrs/src/modules/music/components/pages/MusicHome.vue.js +78 -119
  142. package/dist/martyrs/src/modules/music/components/pages/MusicHome.vue.js.map +1 -1
  143. package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.cjs +15 -12
  144. package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.cjs.map +1 -1
  145. package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.js +15 -12
  146. package/dist/martyrs/src/modules/music/components/pages/MusicLibrary.vue.js.map +1 -1
  147. package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.cjs +558 -429
  148. package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.cjs.map +1 -1
  149. package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js +560 -431
  150. package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js.map +1 -1
  151. package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.cjs +146 -284
  152. package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.cjs.map +1 -1
  153. package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.js +149 -287
  154. package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.js.map +1 -1
  155. package/dist/martyrs/src/modules/music/components/pages/Track.vue.cjs +460 -63
  156. package/dist/martyrs/src/modules/music/components/pages/Track.vue.cjs.map +1 -1
  157. package/dist/martyrs/src/modules/music/components/pages/Track.vue.js +462 -65
  158. package/dist/martyrs/src/modules/music/components/pages/Track.vue.js.map +1 -1
  159. package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.cjs +126 -136
  160. package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.cjs.map +1 -1
  161. package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.js +129 -139
  162. package/dist/martyrs/src/modules/music/components/player/MusicPlayer.vue.js.map +1 -1
  163. package/dist/martyrs/src/modules/music/components/player/TrackProgress.vue.cjs +18 -15
  164. package/dist/martyrs/src/modules/music/components/player/TrackProgress.vue.cjs.map +1 -1
  165. package/dist/martyrs/src/modules/music/components/player/TrackProgress.vue.js +18 -15
  166. package/dist/martyrs/src/modules/music/components/player/TrackProgress.vue.js.map +1 -1
  167. package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.cjs +28 -23
  168. package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.cjs.map +1 -1
  169. package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.js +29 -24
  170. package/dist/martyrs/src/modules/music/components/player/VolumeControl.vue.js.map +1 -1
  171. package/dist/martyrs/src/modules/music/music.client.cjs +3 -6
  172. package/dist/martyrs/src/modules/music/music.client.cjs.map +1 -1
  173. package/dist/martyrs/src/modules/music/music.client.js +9 -12
  174. package/dist/martyrs/src/modules/music/music.client.js.map +1 -1
  175. package/dist/martyrs/src/modules/music/router/music.cjs +27 -1
  176. package/dist/martyrs/src/modules/music/router/music.cjs.map +1 -1
  177. package/dist/martyrs/src/modules/music/router/music.js +27 -1
  178. package/dist/martyrs/src/modules/music/router/music.js.map +1 -1
  179. package/dist/martyrs/src/modules/music/store/artists.cjs +6 -4
  180. package/dist/martyrs/src/modules/music/store/artists.cjs.map +1 -1
  181. package/dist/martyrs/src/modules/music/store/artists.js +6 -4
  182. package/dist/martyrs/src/modules/music/store/artists.js.map +1 -1
  183. package/dist/martyrs/src/modules/music/store/player.cjs +5 -0
  184. package/dist/martyrs/src/modules/music/store/player.cjs.map +1 -1
  185. package/dist/martyrs/src/modules/music/store/player.js +5 -0
  186. package/dist/martyrs/src/modules/music/store/player.js.map +1 -1
  187. package/dist/martyrs/src/modules/music/store/tracks.cjs +22 -0
  188. package/dist/martyrs/src/modules/music/store/tracks.cjs.map +1 -1
  189. package/dist/martyrs/src/modules/music/store/tracks.js +22 -0
  190. package/dist/martyrs/src/modules/music/store/tracks.js.map +1 -1
  191. package/dist/martyrs/src/modules/orders/components/blocks/CardOrderBackoffice.vue.js +2 -2
  192. package/dist/martyrs/src/modules/orders/components/pages/OrderBackoffice.vue.js +2 -2
  193. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.cjs +1 -1
  194. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.js +1 -1
  195. package/dist/martyrs/src/modules/orders/components/sections/FormAddCustomer.vue.cjs +1 -1
  196. package/dist/martyrs/src/modules/orders/components/sections/FormAddCustomer.vue.js +1 -1
  197. package/dist/martyrs/src/modules/orders/components/sections/FormCustomerDetails.vue.cjs +1 -1
  198. package/dist/martyrs/src/modules/orders/components/sections/FormCustomerDetails.vue.js +1 -1
  199. package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.cjs +1 -1
  200. package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.js +1 -1
  201. package/dist/martyrs/src/modules/organizations/components/blocks/CardOrganization.vue.js +2 -2
  202. package/dist/martyrs/src/modules/organizations/components/pages/DepartmentEdit.vue.cjs +1 -1
  203. package/dist/martyrs/src/modules/organizations/components/pages/DepartmentEdit.vue.js +1 -1
  204. package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.cjs +1 -1
  205. package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.js +1 -1
  206. package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.cjs +1 -1
  207. package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.js +1 -1
  208. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationBackoffice.vue.cjs +1 -1
  209. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationBackoffice.vue.js +1 -1
  210. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.cjs +1 -1
  211. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js +1 -1
  212. package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.cjs +1 -1
  213. package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.js +1 -1
  214. package/dist/martyrs/src/modules/organizations/components/sections/MembersAdd.vue.cjs +1 -1
  215. package/dist/martyrs/src/modules/organizations/components/sections/MembersAdd.vue.js +1 -1
  216. package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.cjs +1 -1
  217. package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.js +1 -1
  218. package/dist/martyrs/src/modules/organizations/router/organizations.cjs +1 -1
  219. package/dist/martyrs/src/modules/organizations/router/organizations.js +1 -1
  220. package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.cjs +1 -1
  221. package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.js +1 -1
  222. package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.cjs +1 -1
  223. package/dist/martyrs/src/modules/pages/views/components/pages/PageEdit.vue.js +1 -1
  224. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.cjs +1 -1
  225. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js +1 -1
  226. package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.cjs +1 -1
  227. package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.js +1 -1
  228. package/dist/martyrs/src/modules/products/components/sections/EditAttributes.vue.cjs +1 -1
  229. package/dist/martyrs/src/modules/products/components/sections/EditAttributes.vue.js +1 -1
  230. package/dist/martyrs/src/modules/products/components/sections/EditDiscounts.vue.cjs +1 -1
  231. package/dist/martyrs/src/modules/products/components/sections/EditDiscounts.vue.js +1 -1
  232. package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.cjs +1 -1
  233. package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.js +1 -1
  234. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttBar.vue.cjs +4 -3
  235. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttBar.vue.cjs.map +1 -1
  236. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttBar.vue.js +4 -3
  237. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttBar.vue.js.map +1 -1
  238. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttChart.vue.cjs +37 -70
  239. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttChart.vue.cjs.map +1 -1
  240. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttChart.vue.js +38 -71
  241. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttChart.vue.js.map +1 -1
  242. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.cjs +2 -1
  243. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.cjs.map +1 -1
  244. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.js +6 -5
  245. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.js.map +1 -1
  246. package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.cjs +45 -52
  247. package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.cjs.map +1 -1
  248. package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.js +46 -53
  249. package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.js.map +1 -1
  250. package/dist/martyrs/src/modules/rents/views/components/pages/RentsEdit.vue.cjs +1 -1
  251. package/dist/martyrs/src/modules/rents/views/components/pages/RentsEdit.vue.js +1 -1
  252. package/dist/martyrs/src/modules/spots/components/blocks/SpotMemberModify.vue.cjs +1 -1
  253. package/dist/martyrs/src/modules/spots/components/blocks/SpotMemberModify.vue.js +1 -1
  254. package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.cjs +1 -1
  255. package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.js +1 -1
  256. package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.cjs +1 -1
  257. package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.js +1 -1
  258. package/dist/martyrs/src/modules/spots/components/sections/WorktimeEdit.vue.cjs +1 -1
  259. package/dist/martyrs/src/modules/spots/components/sections/WorktimeEdit.vue.js +1 -1
  260. package/dist/martyrs/src/modules/wallet/views/components/blocks/CardDeposit.vue.cjs +1 -1
  261. package/dist/martyrs/src/modules/wallet/views/components/blocks/CardDeposit.vue.js +1 -1
  262. package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDeposit.vue.cjs +1 -1
  263. package/dist/martyrs/src/modules/wallet/views/components/blocks/CryptoDeposit.vue.js +1 -1
  264. package/dist/martyrs.cjs.js +1 -1
  265. package/dist/martyrs.css +1 -1
  266. package/dist/martyrs.es.js +1 -1
  267. package/dist/music.server.cjs +124 -31
  268. package/dist/music.server.js +124 -31
  269. package/dist/organizations.server.cjs +1 -1
  270. package/dist/organizations.server.js +1 -1
  271. package/dist/products.server.cjs +2 -2
  272. package/dist/products.server.js +2 -2
  273. package/dist/rents.server.cjs +3 -3
  274. package/dist/rents.server.js +3 -3
  275. package/dist/style.css +373 -80
  276. package/dist/{web-D7lZjuC0.js → web-Dkk0_7TA.js} +1 -1
  277. package/dist/{web-D-YZ9KHz.cjs → web-stVkXd0l.cjs} +1 -1
  278. package/package.json +1 -1
  279. package/src/builder/modes/ssr.prod.js +21 -5
  280. package/src/builder/rspack/rspack.config.spa.client.js +0 -44
  281. package/src/builder/rspack/rspack.config.ssr.client.js +40 -40
  282. package/src/components/Calendar/Calendar.vue +378 -377
  283. package/src/components/Feed/Feed.vue +28 -2
  284. package/src/modules/globals/controllers/classes/crud/crud.policies.js +5 -0
  285. package/src/modules/globals/controllers/classes/globals.validator.js +8 -1
  286. package/src/modules/globals/views/components/layouts/Client.vue +7 -0
  287. package/src/modules/music/README.md +8 -0
  288. package/src/modules/music/components/SidebarMusic.vue +6 -9
  289. package/src/modules/music/components/cards/AlbumCard.vue +20 -14
  290. package/src/modules/music/components/cards/ArtistCard.vue +1 -1
  291. package/src/modules/music/components/cards/PlaylistCard.vue +31 -11
  292. package/src/modules/music/components/cards/TrackListCard.vue +24 -13
  293. package/src/modules/music/components/forms/PlaylistForm.vue +417 -107
  294. package/src/modules/music/components/forms/SearchForm.vue +31 -8
  295. package/src/modules/music/components/forms/TrackForm.vue +50 -32
  296. package/src/modules/music/components/layouts/MusicBottomPlayer.vue +17 -0
  297. package/src/modules/music/components/pages/Album.vue +373 -186
  298. package/src/modules/music/components/pages/Artist.vue +54 -94
  299. package/src/modules/music/components/pages/MusicHome.vue +59 -56
  300. package/src/modules/music/components/pages/MusicLibrary.vue +13 -11
  301. package/src/modules/music/components/pages/Playlist.vue +495 -379
  302. package/src/modules/music/components/pages/SearchResults.vue +185 -313
  303. package/src/modules/music/components/pages/Track.vue +363 -69
  304. package/src/modules/music/components/player/MusicPlayer.vue +368 -97
  305. package/src/modules/music/components/player/TrackProgress.vue +76 -22
  306. package/src/modules/music/components/player/VolumeControl.vue +61 -28
  307. package/src/modules/music/controllers/search.controller.js +3 -0
  308. package/src/modules/music/controllers/stream.controller.js +11 -3
  309. package/src/modules/music/middlewares/playlists.verifier.js +1 -1
  310. package/src/modules/music/music.client.js +3 -6
  311. package/src/modules/music/music.server.js +8 -4
  312. package/src/modules/music/router/music.js +8 -1
  313. package/src/modules/music/routes/albums.routes.js +37 -5
  314. package/src/modules/music/routes/artists.routes.js +14 -4
  315. package/src/modules/music/routes/genres.routes.js +5 -1
  316. package/src/modules/music/routes/playlists.routes.js +42 -9
  317. package/src/modules/music/routes/tracks.routes.js +27 -2
  318. package/src/modules/music/store/artists.js +6 -2
  319. package/src/modules/music/store/player.js +6 -0
  320. package/src/modules/music/store/tracks.js +31 -0
  321. package/src/modules/music/websocket/streaming.handler.js +7 -1
  322. package/src/modules/rents/controllers/services/rents.services.js +2 -2
  323. package/src/modules/rents/views/components/pages/Gant/GanttBar.vue +4 -3
  324. package/src/modules/rents/views/components/pages/Gant/GanttChart.vue +42 -40
  325. package/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue +3 -1
  326. package/src/modules/rents/views/components/pages/Rents.vue +60 -56
  327. package/dist/globals.websocket-DzvdIBf6.js +0 -306
  328. package/dist/globals.websocket-k6_B1T7k.cjs +0 -322
  329. package/dist/martyrs/src/components/Field/Field.vue2.cjs.map +0 -1
  330. package/dist/martyrs/src/components/Menu/Menu.vue.cjs.map +0 -1
  331. package/dist/martyrs/src/components/Menu/Menu.vue.js.map +0 -1
  332. package/dist/martyrs/src/modules/music/components/cards/TrackCard.vue.cjs +0 -69
  333. package/dist/martyrs/src/modules/music/components/cards/TrackCard.vue.cjs.map +0 -1
  334. package/dist/martyrs/src/modules/music/components/cards/TrackCard.vue.js +0 -69
  335. package/dist/martyrs/src/modules/music/components/cards/TrackCard.vue.js.map +0 -1
  336. package/dist/martyrs/src/modules/music/components/layouts/MusicLayout.vue.cjs +0 -104
  337. package/dist/martyrs/src/modules/music/components/layouts/MusicLayout.vue.cjs.map +0 -1
  338. package/dist/martyrs/src/modules/music/components/layouts/MusicLayout.vue.js +0 -104
  339. package/dist/martyrs/src/modules/music/components/layouts/MusicLayout.vue.js.map +0 -1
  340. package/src/modules/music/components/cards/TrackCard.vue +0 -86
  341. package/src/modules/music/components/layouts/MusicLayout.vue +0 -83
@@ -1,72 +1,306 @@
1
1
  <!-- components/pages/Track.vue -->
2
2
  <template>
3
- <div class="track-page">
3
+ <div class="track-page pd-small">
4
4
  <!-- Loading -->
5
5
  <div v-if="isLoading" class="w-100 h-25r flex-center flex">
6
6
  <Loader />
7
7
  </div>
8
8
 
9
9
  <!-- Not Found -->
10
- <div v-else-if="!track" class="t-center pd-big">
10
+ <div v-if="hasLoaded && !track" class="t-center pd-big">
11
11
  <h2 class="">Track not found</h2>
12
- <p class="t-grey t-medium">The track you're looking for doesn't exist or has been removed.</p>
12
+ <p class="t-transp t-medium">The track you're looking for doesn't exist or has been removed.</p>
13
13
  </div>
14
14
 
15
15
  <!-- Track Content -->
16
- <div v-else>
17
- <!-- ... [HEADER + ACTIONS as you posted] -->
16
+ <div v-if="track" class="track-content cols-2-fit-content mobile:cols-1 gap-big">
17
+ <!-- Left Column - Cover & Stats -->
18
+ <div class="pos-sticky pos-t-0 mobile:pos-relative track-cover-section">
19
+ <!-- Cover with Play Overlay -->
20
+ <div class="cover-container relative mn-b-medium radius-big overflow-hidden shadow-big">
21
+ <Media
22
+ :url="track.coverUrl || (track.album && track.album.coverUrl) || '/logo/logo-placeholder.jpg'"
23
+ :alt="track.title"
24
+ class="aspect-1x1 w-100 radius-medium o-hidden"
25
+ />
26
+ <!-- <div class="cover-overlay absolute inset-0 bg-black-transp-40 flex-center opacity-0 hover-opacity-100 transition">
27
+ <Button
28
+ @click="playTrack"
29
+ color="white"
30
+ size="big"
31
+ class="w-5r h-5r radius-full shadow-big hover-scale-110"
32
+ >
33
+ <IconPlay class="w-2r h-2r" />
34
+ </Button>
35
+ </div> -->
36
+ </div>
18
37
 
19
- <!-- Track Lyrics -->
20
- <div v-if="track.lyrics" class="track-lyrics mn-b-medium pd-medium bg-dark-transp-10 radius-medium">
21
- <h2 class=" mn-b-small">Lyrics</h2>
22
- <pre class="t-grey">{{ track.lyrics }}</pre>
38
+
39
+
40
+ <!-- Quick Stats -->
41
+ <div class="stats-grid grid cols-2 gap-small">
42
+ <div class="stat-card bg-light pd-medium radius-medium t-center">
43
+ <div class=" mn-b-thin">{{ formatNumber(track.playCount) }}</div>
44
+ <div class="t-small t-transp t-uppercase">Plays</div>
45
+ </div>
46
+ <div class="stat-card bg-light pd-medium radius-medium t-center">
47
+ <div class=" mn-b-thin">{{ formatNumber(track.views) }}</div>
48
+ <div class="t-small t-transp t-uppercase">Views</div>
49
+ </div>
50
+ </div>
23
51
  </div>
24
52
 
25
- <!-- Related Tracks -->
26
- <section v-if="relatedTracks.length" class="related-tracks mn-b-medium">
27
- <h2 class=" mn-b-small">Related Tracks</h2>
28
- <Feed
29
- :store="{
30
- read: () => Promise.resolve(relatedTracks.value),
31
- state: { isLoading: false }
32
- }"
33
- :external="true"
34
- :items="relatedTracks"
35
- :states="{
36
- empty: {
37
- title: 'No related tracks',
38
- description: 'Check back later for recommendations',
39
- class: 'pd-medium bg-dark-transp-10 radius-medium'
40
- }
41
- }"
42
- class="gap-thin"
43
- >
44
- <template #default="{ items }">
45
- <TrackCard
46
- v-for="relatedTrack in items"
53
+ <!-- Right Column - Track Details -->
54
+ <div class="track-details-section">
55
+ <!-- Track Type Badge -->
56
+ <div class="flex items-center gap-small mn-b-small">
57
+ <span class="badge bg-primary-transp-20 t-primary pd-thin-big radius-small t-small t-uppercase">Single</span>
58
+ <span v-if="track.isExplicit" class="badge bg-danger-transp-20 t-danger pd-thin-big radius-small t-small">Explicit</span>
59
+ </div>
60
+
61
+ <!-- Track Title -->
62
+ <h1 class="h1 mn-b-medium">{{ track.title }}</h1>
63
+ <!-- Action Buttons -->
64
+ <div class="flex gap-small mn-b-medium">
65
+ <Button
66
+ @click="playTrack"
67
+ color="primary"
68
+ size="medium"
69
+ class="flex-1 flex-center gap-thin"
70
+ >
71
+ <IconPlay class="w-1r h-1r" />
72
+ Play
73
+ </Button>
74
+
75
+ <Button
76
+ @click="toggleFavorite"
77
+ :color="isFavorite ? 'danger' : 'transp'"
78
+ size="medium"
79
+ class="w-3r h-3r radius-full"
80
+ >
81
+ <IconLike class="w-1-25r h-1-25r" :fill="isFavorite" />
82
+ </Button>
83
+
84
+ <Button
85
+ @click="addToQueue"
86
+ color="transp"
87
+ size="medium"
88
+ class="w-3r h-3r radius-full"
89
+ >
90
+ <IconAdd class="w-1-25r h-1-25r" />
91
+ </Button>
92
+
93
+ <Dropdown v-model="showDropdown" class="relative">
94
+ <template #trigger>
95
+ <Button color="transp" size="medium" class="w-3r h-3r radius-full">
96
+ <IconEllipsis class="w-1-25r h-1-25r" />
97
+ </Button>
98
+ </template>
99
+ <template #default>
100
+ <div class="dropdown-menu bg-dark pd-small radius-medium shadow-big mn-t-thin">
101
+ <Button @click="showAddToPlaylistModal = true" color="transp" size="small" class="w-100 justify-start">
102
+ Add to Playlist
103
+ </Button>
104
+ <Button @click="copyLink" color="transp" size="small" class="w-100 justify-start">
105
+ Copy Link
106
+ </Button>
107
+ <template v-if="isOwner">
108
+ <hr class="mn-v-thin border-dark-transp-10" />
109
+ <Button @click="editTrack" color="transp" size="small" class="w-100 justify-start">
110
+ Edit Track
111
+ </Button>
112
+ <Button @click="deleteTrack" color="danger" size="small" class="w-100 justify-start">
113
+ Delete Track
114
+ </Button>
115
+ </template>
116
+ </div>
117
+ </template>
118
+ </Dropdown>
119
+ </div>
120
+
121
+ <!-- Artist Card -->
122
+ <div class="artist-card bg-light pd-medium radius-medium flex items-center gap-medium mn-b-big">
123
+ <router-link
124
+ :to="`/artist/${track.artist.url}`"
125
+ class="flex items-center gap-medium flex-1 hover-opacity"
126
+ >
127
+ <div class="artist-avatar">
128
+ <Media
129
+ v-if="track.artist.photoUrl"
130
+ :src="track.artist.photoUrl"
131
+ :alt="track.artist.name"
132
+ class="w-4r h-4r radius-full object-cover"
133
+ />
134
+ <div v-else class="w-4r h-4r radius-full bg-primary flex-center ">
135
+ {{ track.artist.name.charAt(0) }}
136
+ </div>
137
+ </div>
138
+ <div>
139
+ <div class="flex items-center gap-thin">
140
+ <span class="t-large ">{{ track.artist.name }}</span>
141
+ <IconVerified v-if="track.artist.isVerified" class="w-1r h-1r t-primary" />
142
+ </div>
143
+ <span class="t-small t-transp">Artist</span>
144
+ </div>
145
+ </router-link>
146
+ <Button
147
+ v-if="!isOwner"
148
+ @click="toggleFollowArtist"
149
+ :color="isFollowingArtist ? 'primary' : 'transp'"
150
+ size="small"
151
+ >
152
+ {{ isFollowingArtist ? 'Following' : 'Follow' }}
153
+ </Button>
154
+ </div>
155
+
156
+
157
+
158
+ <!-- Metadata Cards -->
159
+ <div class="metadata-grid grid cols-2 gap-small mn-b-big">
160
+ <!-- Duration -->
161
+ <div class="metadata-card bg-light pd-medium radius-medium flex items-center gap-medium">
162
+ <div class="icon-wrapper bg-primary-transp-20 w-3r h-3r radius-small flex-center">
163
+ <IconClock class="w-1-5r h-1-5r t-primary" />
164
+ </div>
165
+ <div>
166
+ <div class="t-small t-transp t-uppercase">Duration</div>
167
+ <div class="t-medium ">{{ formatDuration(track.duration) }}</div>
168
+ </div>
169
+ </div>
170
+
171
+ <!-- Release Date -->
172
+ <div class="metadata-card bg-light pd-medium radius-medium flex items-center gap-medium">
173
+ <div class="icon-wrapper bg-primary-transp-20 w-3r h-3r radius-small flex-center">
174
+ <IconCalendar class="w-1-5r h-1-5r t-primary" />
175
+ </div>
176
+ <div>
177
+ <div class="t-small t-transp t-uppercase">Released</div>
178
+ <div class="t-medium ">{{ formatDate(track.releaseDate) }}</div>
179
+ </div>
180
+ </div>
181
+
182
+ <!-- Status -->
183
+ <div class="metadata-card bg-light pd-medium radius-medium flex items-center gap-medium">
184
+ <div class="icon-wrapper bg-success-transp-20 w-3r h-3r radius-small flex-center">
185
+ <IconCheck class="w-1-5r h-1-5r t-success" />
186
+ </div>
187
+ <div>
188
+ <div class="t-small t-transp t-uppercase">Status</div>
189
+ <div class="t-medium t-success">{{ track.status }}</div>
190
+ </div>
191
+ </div>
192
+
193
+ <!-- Visibility -->
194
+ <div class="metadata-card bg-light pd-medium radius-medium flex items-center gap-medium">
195
+ <div class="icon-wrapper bg-primary-transp-20 w-3r h-3r radius-small flex-center">
196
+ <IconEye class="w-1-5r h-1-5r t-primary" />
197
+ </div>
198
+ <div>
199
+ <div class="t-small t-transp t-uppercase">Visibility</div>
200
+ <div class="t-medium ">{{ track.isPublic ? 'Public' : 'Private' }}</div>
201
+ </div>
202
+ </div>
203
+ </div>
204
+
205
+ <!-- Album Info -->
206
+ <div v-if="track.album" class="album-card bg-light pd-medium radius-medium mn-b-medium">
207
+ <div class="t-small t-transp t-uppercase mn-b-thin">From Album</div>
208
+ <router-link
209
+ :to="`/album/${track.album.url}`"
210
+ class="flex items-center gap-medium hover-opacity"
211
+ >
212
+ <Media
213
+ v-if="track.album.coverUrl"
214
+ :src="track.album.coverUrl"
215
+ :alt="track.album.title"
216
+ class="w-3r h-3r radius-small object-cover"
217
+ />
218
+ <span class="t-medium ">{{ track.album.title }}</span>
219
+ </router-link>
220
+ </div>
221
+
222
+ <!-- Genres & Tags -->
223
+ <div v-if="(track.genre && track.genre.length) || (track.tags && track.tags.length)" class="tags-section mn-b-medium">
224
+ <h3 class="t-medium mn-b-small">Genres & Tags</h3>
225
+ <div class="flex gap-thin flex-wrap">
226
+ <span
227
+ v-for="genre in track.genre"
228
+ :key="genre"
229
+ class="tag bg-primary-transp-20 t-primary pd-thin-big radius-small t-small hover-bg-primary-transp-30 cursor-pointer"
230
+ >
231
+ {{ genre }}
232
+ </span>
233
+ <span
234
+ v-for="tag in track.tags"
235
+ :key="tag"
236
+ class="tag bg-light t-transp pd-thin-big radius-small t-small hover-bg-light cursor-pointer"
237
+ >
238
+ #{{ tag }}
239
+ </span>
240
+ </div>
241
+ </div>
242
+
243
+ <!-- Description -->
244
+ <div v-if="track.description" class="description-section bg-light pd-medium radius-medium mn-b-medium">
245
+ <h3 class="t-medium mn-b-small">About</h3>
246
+ <p class="t-transp">{{ track.description }}</p>
247
+ </div>
248
+
249
+ <!-- Lyrics -->
250
+ <div v-if="track.lyrics" class="lyrics-section bg-light pd-medium radius-medium">
251
+ <h3 class="t-medium mn-b-small">Lyrics</h3>
252
+ <pre class="t-transp t-small">{{ track.lyrics }}</pre>
253
+ </div>
254
+ </div>
255
+ </div>
256
+
257
+ <!-- Related Tracks -->
258
+ <section v-if="track && relatedTracks && relatedTracks.length" class="related-section mn-t-big">
259
+ <h2 class="h2 mn-b-medium">Related Tracks</h2>
260
+ <Feed
261
+ :store="{
262
+ read: () => new Promise(resolve => resolve(relatedTracks || [])),
263
+ state: { isLoading: false }
264
+ }"
265
+ :external="true"
266
+ :items="relatedTracks"
267
+ :states="{
268
+ empty: {
269
+ title: 'No related tracks',
270
+ description: 'Check back later for recommendations',
271
+ class: 'pd-medium bg-light radius-medium'
272
+ }
273
+ }"
274
+ class="grid cols-2 cols-m-3 cols-l-4 gap-medium"
275
+ >
276
+ <template #default="{ items }">
277
+ <div class="bg-light radius-medium o-hidden">
278
+ <TrackListCard
279
+ v-for="(relatedTrack, index) in items"
47
280
  :key="relatedTrack._id"
48
281
  :track="relatedTrack"
282
+ :index="index"
49
283
  :showAlbum="true"
50
284
  :showCover="true"
51
- class="w-100 bg-dark-transp-10 radius-medium"
52
285
  />
53
- </template>
54
- </Feed>
55
- </section>
56
-
57
- <!-- Add to Playlist Modal -->
58
- <!-- <Popup
59
- v-if="showAddToPlaylistModal"
60
- @close-popup="showAddToPlaylistModal = false"
61
- class="bg-dark pd-small w-m-25r radius-medium "
62
- >
63
- <h3 class="mn-b-medium">Add to Playlist</h3>
64
- <PlaylistSelector
65
- :trackId="track._id"
66
- @added="showAddToPlaylistModal = false"
67
- />
68
- </Popup> -->
69
- </div>
286
+ </div>
287
+ </template>
288
+ </Feed>
289
+ </section>
290
+
291
+ <!-- Add to Playlist Modal -->
292
+ <Popup
293
+ v-if="showAddToPlaylistModal"
294
+ @close-popup="showAddToPlaylistModal = false"
295
+ class="bg-dark pd-medium w-m-25r radius-medium"
296
+ >
297
+ <h3 class="h3 mn-b-medium">Add to Playlist</h3>
298
+ <!-- <PlaylistSelector
299
+ :trackId="track._id"
300
+ @added="showAddToPlaylistModal = false"
301
+ /> -->
302
+ <p class="t-transp">Playlist selector coming soon...</p>
303
+ </Popup>
70
304
  </div>
71
305
  </template>
72
306
 
@@ -78,13 +312,24 @@ import Loader from '@martyrs/src/components/Loader/Loader.vue';
78
312
  import Media from '@martyrs/src/components/Media/Media.vue';
79
313
  import Dropdown from '@martyrs/src/components/Dropdown/Dropdown.vue';
80
314
  import Popup from '@martyrs/src/components/Popup/Popup.vue';
315
+ import Feed from '@martyrs/src/components/Feed/Feed.vue';
316
+
317
+ // Icons
81
318
  import IconPlay from '@martyrs/src/modules/icons/navigation/IconPlay.vue';
82
319
  import IconLike from '@martyrs/src/modules/icons/navigation/IconLike.vue';
83
320
  import IconEllipsis from '@martyrs/src/modules/icons/navigation/IconEllipsis.vue';
84
- import Feed from '@martyrs/src/components/Feed/Feed.vue';
85
- import TrackCard from '../cards/TrackCard.vue';
321
+ import IconAdd from '@martyrs/src/modules/icons/navigation/IconAdd.vue';
322
+ import IconClock from '@martyrs/src/modules/icons/entities/IconTime.vue';
323
+ import IconCalendar from '@martyrs/src/modules/icons/entities/IconCalendar.vue';
324
+ import IconCheck from '@martyrs/src/modules/icons/navigation/IconCheckmark.vue';
325
+ import IconEye from '@martyrs/src/modules/icons/actions/IconShow.vue';
326
+ import IconVerified from '@martyrs/src/modules/icons/navigation/IconCheckmark.vue';
327
+
328
+ // Components
329
+ import TrackListCard from '../cards/TrackListCard.vue';
86
330
  // import PlaylistSelector from '../forms/PlaylistSelector.vue';
87
331
 
332
+ // Store
88
333
  import { state as tracksState, actions as tracksActions } from '../../store/tracks.js';
89
334
  import { actions as playerActions } from '../../store/player.js';
90
335
  import { state as authState } from '@martyrs/src/modules/auth/views/store/auth.js';
@@ -92,27 +337,61 @@ import { state as authState } from '@martyrs/src/modules/auth/views/store/auth.j
92
337
  const route = useRoute();
93
338
  const router = useRouter();
94
339
 
95
- const isLoading = ref(true);
340
+ // Emits
341
+ const emits = defineEmits(['page-loading', 'page-loaded']);
342
+
343
+ // State
344
+ const hasLoaded = ref(false);
96
345
  const showDropdown = ref(false);
97
346
  const showAddToPlaylistModal = ref(false);
98
347
  const isFavorite = ref(false);
348
+ const isFollowingArtist = ref(false);
99
349
 
350
+ // Clear state
351
+ tracksState.currentTrack = null;
352
+ tracksState.relatedTracks = [];
353
+
354
+ // Computed
100
355
  const track = computed(() => tracksState.currentTrack);
101
- const relatedTracks = computed(() => tracksState.relatedTracks);
356
+ const relatedTracks = computed(() => tracksState.relatedTracks || []);
102
357
 
103
358
  const isOwner = computed(() => {
104
359
  return track.value?.owner?.target === authState.user?._id;
105
360
  });
106
361
 
107
- const getArtistName = (track) => {
108
- if (!track || !track.artist) return 'Unknown';
109
- return typeof track.artist === 'object' ? track.artist.name : 'Unknown';
362
+ // Format helpers
363
+ const formatDuration = (seconds) => {
364
+ if (!seconds) return '0:00';
365
+ const h = Math.floor(seconds / 3600);
366
+ const m = Math.floor((seconds % 3600) / 60);
367
+ const s = Math.floor(seconds % 60);
368
+
369
+ if (h > 0) {
370
+ return `${h}:${m.toString().padStart(2, '0')}:${s.toString().padStart(2, '0')}`;
371
+ }
372
+ return `${m}:${s.toString().padStart(2, '0')}`;
373
+ };
374
+
375
+ const formatDate = (dateString) => {
376
+ if (!dateString) return 'Unknown';
377
+ return new Date(dateString).toLocaleDateString('en-US', {
378
+ year: 'numeric',
379
+ month: 'long',
380
+ day: 'numeric'
381
+ });
110
382
  };
111
383
 
112
- const formatReleaseYear = (date) => {
113
- return date ? new Date(date).getFullYear() : 'Unknown';
384
+ const formatNumber = (num) => {
385
+ if (!num) return '0';
386
+ if (num >= 1000000) {
387
+ return (num / 1000000).toFixed(1) + 'M';
388
+ } else if (num >= 1000) {
389
+ return (num / 1000).toFixed(1) + 'K';
390
+ }
391
+ return num.toString();
114
392
  };
115
393
 
394
+ // Actions
116
395
  const playTrack = () => {
117
396
  if (track.value) {
118
397
  playerActions.setQueue([track.value]);
@@ -121,7 +400,12 @@ const playTrack = () => {
121
400
 
122
401
  const toggleFavorite = () => {
123
402
  isFavorite.value = !isFavorite.value;
124
- // You can implement actual saving here
403
+ // TODO: Implement actual saving
404
+ };
405
+
406
+ const toggleFollowArtist = () => {
407
+ isFollowingArtist.value = !isFollowingArtist.value;
408
+ // TODO: Implement actual following
125
409
  };
126
410
 
127
411
  const addToQueue = () => {
@@ -135,11 +419,13 @@ const editTrack = () => {
135
419
  };
136
420
 
137
421
  const deleteTrack = async () => {
138
- try {
139
- await tracksActions.deleteTrack(track.value._id);
140
- router.push({ name: 'music-library' });
141
- } catch (error) {
142
- console.error('Failed to delete track:', error);
422
+ if (confirm('Are you sure you want to delete this track?')) {
423
+ try {
424
+ await tracksActions.deleteTrack(track.value._id);
425
+ router.push({ name: 'music-library' });
426
+ } catch (error) {
427
+ console.error('Failed to delete track:', error);
428
+ }
143
429
  }
144
430
  };
145
431
 
@@ -148,18 +434,26 @@ const copyLink = () => {
148
434
  showDropdown.value = false;
149
435
  };
150
436
 
437
+ // Data fetching
151
438
  const fetchTrackData = async () => {
152
- isLoading.value = true;
153
439
  try {
154
440
  await tracksActions.fetchTrackByUrl(route.params.url);
155
441
  await tracksActions.fetchRelatedTracks(route.params.url);
156
442
  } catch (error) {
157
443
  console.error('Error loading track:', error);
158
- } finally {
159
- isLoading.value = false;
160
444
  }
161
445
  };
162
446
 
163
- onMounted(fetchTrackData);
164
- watch(() => route.params.url, fetchTrackData);
447
+ // Lifecycle
448
+ onMounted(async () => {
449
+ emits('page-loading');
450
+
451
+ await fetchTrackData();
452
+
453
+ hasLoaded.value = true;
454
+ emits('page-loaded');
455
+ });
165
456
  </script>
457
+
458
+ <style scoped>
459
+ </style>