@ozdao/martyrs 0.2.506 → 0.2.508

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 (555) 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/auth.server.cjs +1 -1
  6. package/dist/auth.server.js +1 -1
  7. package/dist/builder.cjs +52 -60
  8. package/dist/builder.js +52 -60
  9. package/dist/chats.server.cjs +1 -1
  10. package/dist/chats.server.js +1 -1
  11. package/dist/events.server.cjs +1 -1
  12. package/dist/events.server.js +1 -1
  13. package/dist/{mailing-q7sR8gCV.cjs → mailing-Bs9ThyVZ.cjs} +1 -24
  14. package/dist/{mailing-C11EYWm-.js → mailing-DzlhsxCC.js} +1 -24
  15. package/dist/main-AWSb_d2P.cjs +11 -0
  16. package/dist/{main-DC__VS5b.js → main-Dq-UfO4G.js} +2562 -2477
  17. package/dist/martyrs/src/components/Button/Button.vue.cjs +1 -1
  18. package/dist/martyrs/src/components/Button/Button.vue.js +1 -1
  19. package/dist/martyrs/src/components/Checkbox/Checkbox.vue.cjs +3 -3
  20. package/dist/martyrs/src/components/Checkbox/Checkbox.vue.cjs.map +1 -1
  21. package/dist/martyrs/src/components/Checkbox/Checkbox.vue.js +3 -3
  22. package/dist/martyrs/src/components/Checkbox/Checkbox.vue.js.map +1 -1
  23. package/dist/martyrs/src/components/EditImages/EditImages.vue.cjs +0 -93
  24. package/dist/martyrs/src/components/EditImages/EditImages.vue.cjs.map +1 -1
  25. package/dist/martyrs/src/components/EditImages/EditImages.vue.js +1 -94
  26. package/dist/martyrs/src/components/EditImages/EditImages.vue.js.map +1 -1
  27. package/dist/martyrs/src/components/EditImages/EditImages.vue2.cjs +93 -0
  28. package/dist/martyrs/src/components/EditImages/EditImages.vue2.cjs.map +1 -1
  29. package/dist/martyrs/src/components/EditImages/EditImages.vue2.js +94 -1
  30. package/dist/martyrs/src/components/EditImages/EditImages.vue2.js.map +1 -1
  31. package/dist/martyrs/src/components/Feed/Carousel.vue.cjs +1 -1
  32. package/dist/martyrs/src/components/Feed/Carousel.vue.js +1 -1
  33. package/dist/martyrs/src/components/Feed/Feed.vue.cjs +15 -46
  34. package/dist/martyrs/src/components/Feed/Feed.vue.cjs.map +1 -1
  35. package/dist/martyrs/src/components/Feed/Feed.vue.js +22 -53
  36. package/dist/martyrs/src/components/Feed/Feed.vue.js.map +1 -1
  37. package/dist/martyrs/src/components/Field/Field.vue.cjs +14 -6
  38. package/dist/martyrs/src/components/Field/Field.vue.cjs.map +1 -1
  39. package/dist/martyrs/src/components/Field/Field.vue.js +14 -6
  40. package/dist/martyrs/src/components/Field/Field.vue.js.map +1 -1
  41. package/dist/martyrs/src/components/FieldBig/FieldBig.vue.cjs +58 -11
  42. package/dist/martyrs/src/components/FieldBig/FieldBig.vue.cjs.map +1 -1
  43. package/dist/martyrs/src/components/FieldBig/FieldBig.vue.js +60 -13
  44. package/dist/martyrs/src/components/FieldBig/FieldBig.vue.js.map +1 -1
  45. package/dist/martyrs/src/components/FieldTags/FieldTags.vue.cjs +1 -1
  46. package/dist/martyrs/src/components/FieldTags/FieldTags.vue.js +1 -1
  47. package/dist/martyrs/src/components/Loader/{Loader.vue.cjs → Loader.vue2.cjs} +2 -2
  48. package/dist/martyrs/src/components/Loader/Loader.vue2.cjs.map +1 -0
  49. package/dist/martyrs/src/components/Loader/{Loader.vue.js → Loader.vue2.js} +2 -2
  50. package/dist/martyrs/src/components/Loader/{Loader.vue.cjs.map → Loader.vue2.js.map} +1 -1
  51. package/dist/martyrs/src/components/LocationMarker/LocationMarker.vue2.cjs +1 -1
  52. package/dist/martyrs/src/components/LocationMarker/LocationMarker.vue2.js +1 -1
  53. package/dist/martyrs/src/components/PhotoViewer/PhotoViewer.vue.cjs +2 -2
  54. package/dist/martyrs/src/components/PhotoViewer/PhotoViewer.vue.cjs.map +1 -1
  55. package/dist/martyrs/src/components/PhotoViewer/PhotoViewer.vue.js +2 -2
  56. package/dist/martyrs/src/components/PhotoViewer/PhotoViewer.vue.js.map +1 -1
  57. package/dist/martyrs/src/components/Spoiler/{Spoiler.vue.cjs → Spoiler.vue2.cjs} +2 -2
  58. package/dist/martyrs/src/components/Spoiler/Spoiler.vue2.cjs.map +1 -0
  59. package/dist/martyrs/src/components/Spoiler/{Spoiler.vue.js → Spoiler.vue2.js} +2 -2
  60. package/dist/martyrs/src/components/Spoiler/{Spoiler.vue.cjs.map → Spoiler.vue2.js.map} +1 -1
  61. package/dist/martyrs/src/components/Tab/{Tab.vue.cjs → Tab.vue2.cjs} +2 -2
  62. package/dist/martyrs/src/components/Tab/Tab.vue2.cjs.map +1 -0
  63. package/dist/martyrs/src/components/Tab/{Tab.vue.js → Tab.vue2.js} +2 -2
  64. package/dist/martyrs/src/components/Tab/{Tab.vue.cjs.map → Tab.vue2.js.map} +1 -1
  65. package/dist/martyrs/src/components/UploadImageMultiple/UploadImageMultiple.vue.cjs +1 -1
  66. package/dist/martyrs/src/components/UploadImageMultiple/UploadImageMultiple.vue.js +1 -1
  67. package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.cjs +1 -1
  68. package/dist/martyrs/src/modules/auth/views/components/pages/EnterPassword.vue.js +1 -1
  69. package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.cjs +1 -1
  70. package/dist/martyrs/src/modules/auth/views/components/pages/Invite.vue.js +1 -1
  71. package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.cjs +2 -2
  72. package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.cjs.map +1 -1
  73. package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js +2 -2
  74. package/dist/martyrs/src/modules/auth/views/components/pages/Profile.vue.js.map +1 -1
  75. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileBlogposts.vue.cjs +1 -1
  76. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileBlogposts.vue.js +1 -1
  77. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEdit.vue.cjs +42 -10
  78. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEdit.vue.cjs.map +1 -1
  79. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEdit.vue.js +44 -12
  80. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEdit.vue.js.map +1 -1
  81. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditAccount.vue.cjs +11 -15
  82. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditAccount.vue.cjs.map +1 -1
  83. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditAccount.vue.js +21 -25
  84. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditAccount.vue.js.map +1 -1
  85. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditProfile.vue.cjs +12 -16
  86. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditProfile.vue.cjs.map +1 -1
  87. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditProfile.vue.js +33 -37
  88. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditProfile.vue.js.map +1 -1
  89. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditSidebar.vue.cjs +13 -9
  90. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditSidebar.vue.cjs.map +1 -1
  91. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditSidebar.vue.js +13 -9
  92. package/dist/martyrs/src/modules/auth/views/components/pages/ProfileEditSidebar.vue.js.map +1 -1
  93. package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.cjs +1 -1
  94. package/dist/martyrs/src/modules/auth/views/components/pages/ResetPassword.vue.js +1 -1
  95. package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.cjs +1 -1
  96. package/dist/martyrs/src/modules/auth/views/components/pages/SignIn.vue.js +1 -1
  97. package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.cjs +1 -1
  98. package/dist/martyrs/src/modules/auth/views/components/pages/SignUp.vue.js +1 -1
  99. package/dist/martyrs/src/modules/auth/views/router/users.cjs +0 -4
  100. package/dist/martyrs/src/modules/auth/views/router/users.cjs.map +1 -1
  101. package/dist/martyrs/src/modules/auth/views/router/users.js +0 -4
  102. package/dist/martyrs/src/modules/auth/views/router/users.js.map +1 -1
  103. package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.cjs +1 -1
  104. package/dist/martyrs/src/modules/community/components/pages/BlogPost.vue.js +1 -1
  105. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.cjs +1 -1
  106. package/dist/martyrs/src/modules/community/components/pages/CreateBlogPost.vue.js +1 -1
  107. package/dist/martyrs/src/modules/community/components/pages/Posts.vue.cjs +431 -0
  108. package/dist/martyrs/src/modules/community/components/pages/Posts.vue.cjs.map +1 -0
  109. package/dist/martyrs/src/modules/community/components/pages/Posts.vue.js +431 -0
  110. package/dist/martyrs/src/modules/community/components/pages/Posts.vue.js.map +1 -0
  111. package/dist/martyrs/src/modules/community/router/blogposts.cjs +17 -0
  112. package/dist/martyrs/src/modules/community/router/blogposts.cjs.map +1 -1
  113. package/dist/martyrs/src/modules/community/router/blogposts.js +17 -0
  114. package/dist/martyrs/src/modules/community/router/blogposts.js.map +1 -1
  115. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.cjs +2 -2
  116. package/dist/martyrs/src/modules/events/components/pages/EditEvent.vue.js +2 -2
  117. package/dist/martyrs/src/modules/events/components/pages/Event.vue.cjs +2 -4
  118. package/dist/martyrs/src/modules/events/components/pages/Event.vue.cjs.map +1 -1
  119. package/dist/martyrs/src/modules/events/components/pages/Event.vue.js +2 -4
  120. package/dist/martyrs/src/modules/events/components/pages/Event.vue.js.map +1 -1
  121. package/dist/martyrs/src/modules/events/components/pages/EventsBackoffice.vue.cjs +1 -1
  122. package/dist/martyrs/src/modules/events/components/pages/EventsBackoffice.vue.js +1 -1
  123. package/dist/martyrs/src/modules/events/components/sections/Feed.vue.cjs +1 -1
  124. package/dist/martyrs/src/modules/events/components/sections/Feed.vue.js +1 -1
  125. package/dist/martyrs/src/modules/events/components/sections/List.vue.cjs +1 -1
  126. package/dist/martyrs/src/modules/events/components/sections/List.vue.js +1 -1
  127. package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.cjs +1 -1
  128. package/dist/martyrs/src/modules/gallery/components/sections/BackofficeGallery.vue.js +1 -1
  129. package/dist/martyrs/src/modules/globals/globals.client.cjs +3 -0
  130. package/dist/martyrs/src/modules/globals/globals.client.cjs.map +1 -1
  131. package/dist/martyrs/src/modules/globals/globals.client.js +3 -0
  132. package/dist/martyrs/src/modules/globals/globals.client.js.map +1 -1
  133. package/dist/martyrs/src/modules/globals/views/classes/globals.i18n.cjs +1 -1
  134. package/dist/martyrs/src/modules/globals/views/classes/globals.i18n.js +1 -1
  135. package/dist/martyrs/src/modules/globals/views/classes/globals.websocket.cjs +4 -6
  136. package/dist/martyrs/src/modules/globals/views/classes/globals.websocket.cjs.map +1 -1
  137. package/dist/martyrs/src/modules/globals/views/classes/globals.websocket.js +4 -6
  138. package/dist/martyrs/src/modules/globals/views/classes/globals.websocket.js.map +1 -1
  139. package/dist/martyrs/src/modules/globals/views/components/blocks/BlockFilter.vue.cjs +1 -1
  140. package/dist/martyrs/src/modules/globals/views/components/blocks/BlockFilter.vue.js +1 -1
  141. package/dist/martyrs/src/modules/globals/views/components/blocks/Card.vue.cjs +5 -2
  142. package/dist/martyrs/src/modules/globals/views/components/blocks/Card.vue.cjs.map +1 -1
  143. package/dist/martyrs/src/modules/globals/views/components/blocks/Card.vue.js +6 -3
  144. package/dist/martyrs/src/modules/globals/views/components/blocks/Card.vue.js.map +1 -1
  145. package/dist/martyrs/src/modules/globals/views/components/blocks/CardHeader.vue.cjs +1 -1
  146. package/dist/martyrs/src/modules/globals/views/components/blocks/CardHeader.vue.js +1 -1
  147. package/dist/martyrs/src/modules/globals/views/components/blocks/PopupDateSelector.vue.cjs +1 -1
  148. package/dist/martyrs/src/modules/globals/views/components/blocks/PopupDateSelector.vue.js +1 -1
  149. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.cjs +2 -3
  150. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.cjs.map +1 -1
  151. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.js +2 -3
  152. package/dist/martyrs/src/modules/globals/views/components/layouts/Client.vue.js.map +1 -1
  153. package/dist/martyrs/src/modules/globals/views/components/partials/Footer.vue.cjs +321 -0
  154. package/dist/martyrs/src/modules/globals/views/components/partials/Footer.vue.cjs.map +1 -0
  155. package/dist/martyrs/src/modules/globals/views/components/partials/Footer.vue.js +321 -0
  156. package/dist/martyrs/src/modules/globals/views/components/partials/Footer.vue.js.map +1 -0
  157. package/dist/martyrs/src/modules/globals/views/components/partials/Navigation.vue.cjs +1 -1
  158. package/dist/martyrs/src/modules/globals/views/components/partials/Navigation.vue.js +1 -1
  159. package/dist/martyrs/src/modules/globals/views/components/sections/Filters.vue2.cjs +324 -0
  160. package/dist/martyrs/src/modules/globals/views/components/sections/Filters.vue2.cjs.map +1 -0
  161. package/dist/martyrs/src/modules/globals/views/components/sections/Filters.vue2.js +324 -0
  162. package/dist/martyrs/src/modules/globals/views/components/sections/Filters.vue2.js.map +1 -0
  163. package/dist/martyrs/src/modules/globals/views/components/sections/SectionPageTitle.vue.cjs +1 -1
  164. package/dist/martyrs/src/modules/globals/views/components/sections/SectionPageTitle.vue.js +1 -1
  165. package/dist/martyrs/src/modules/icons/entities/IconLock.vue.cjs +32 -0
  166. package/dist/martyrs/src/modules/icons/entities/IconLock.vue.cjs.map +1 -0
  167. package/dist/martyrs/src/modules/icons/entities/IconLock.vue.js +32 -0
  168. package/dist/martyrs/src/modules/icons/entities/IconLock.vue.js.map +1 -0
  169. package/dist/martyrs/src/modules/icons/icons.client.cjs +2 -0
  170. package/dist/martyrs/src/modules/icons/icons.client.cjs.map +1 -1
  171. package/dist/martyrs/src/modules/icons/icons.client.js +116 -114
  172. package/dist/martyrs/src/modules/icons/icons.client.js.map +1 -1
  173. package/dist/martyrs/src/modules/icons/pages/IconsPage.vue.cjs +5 -3
  174. package/dist/martyrs/src/modules/icons/pages/IconsPage.vue.cjs.map +1 -1
  175. package/dist/martyrs/src/modules/icons/pages/IconsPage.vue.js +117 -115
  176. package/dist/martyrs/src/modules/icons/pages/IconsPage.vue.js.map +1 -1
  177. package/dist/martyrs/src/modules/landing/components/sections/SectionGuide.vue.cjs +1 -1
  178. package/dist/martyrs/src/modules/landing/components/sections/SectionGuide.vue.js +1 -1
  179. package/dist/martyrs/src/modules/landing/components/sections/SubscribeNewsletter.vue.cjs +11 -36
  180. package/dist/martyrs/src/modules/landing/components/sections/SubscribeNewsletter.vue.cjs.map +1 -1
  181. package/dist/martyrs/src/modules/landing/components/sections/SubscribeNewsletter.vue.js +11 -36
  182. package/dist/martyrs/src/modules/landing/components/sections/SubscribeNewsletter.vue.js.map +1 -1
  183. package/dist/martyrs/src/modules/landing/landing.client.cjs +3 -0
  184. package/dist/martyrs/src/modules/landing/landing.client.cjs.map +1 -1
  185. package/dist/martyrs/src/modules/landing/landing.client.js +3 -0
  186. package/dist/martyrs/src/modules/landing/landing.client.js.map +1 -1
  187. package/dist/martyrs/src/modules/landing/locales/en.cjs +12 -0
  188. package/dist/martyrs/src/modules/landing/locales/en.cjs.map +1 -0
  189. package/dist/martyrs/src/modules/landing/locales/en.js +12 -0
  190. package/dist/martyrs/src/modules/landing/locales/en.js.map +1 -0
  191. package/dist/martyrs/src/modules/landing/locales/index.cjs +10 -0
  192. package/dist/martyrs/src/modules/landing/locales/index.cjs.map +1 -0
  193. package/dist/martyrs/src/modules/landing/locales/index.js +10 -0
  194. package/dist/martyrs/src/modules/landing/locales/index.js.map +1 -0
  195. package/dist/martyrs/src/modules/landing/locales/ru.cjs +12 -0
  196. package/dist/martyrs/src/modules/landing/locales/ru.cjs.map +1 -0
  197. package/dist/martyrs/src/modules/landing/locales/ru.js +12 -0
  198. package/dist/martyrs/src/modules/landing/locales/ru.js.map +1 -0
  199. package/dist/martyrs/src/modules/marketplace/views/components/sections/SectionMenu.vue.cjs +1 -1
  200. package/dist/martyrs/src/modules/marketplace/views/components/sections/SectionMenu.vue.js +1 -1
  201. package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.cjs +1 -1
  202. package/dist/martyrs/src/modules/music/components/forms/ArtistForm.vue.js +1 -1
  203. package/dist/martyrs/src/modules/music/components/pages/Album.vue.cjs +2 -2
  204. package/dist/martyrs/src/modules/music/components/pages/Album.vue.cjs.map +1 -1
  205. package/dist/martyrs/src/modules/music/components/pages/Album.vue.js +2 -2
  206. package/dist/martyrs/src/modules/music/components/pages/Album.vue.js.map +1 -1
  207. package/dist/martyrs/src/modules/music/components/pages/Artist.vue.cjs +1 -1
  208. package/dist/martyrs/src/modules/music/components/pages/Artist.vue.js +1 -1
  209. package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.cjs +2 -2
  210. package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.cjs.map +1 -1
  211. package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js +2 -2
  212. package/dist/martyrs/src/modules/music/components/pages/Playlist.vue.js.map +1 -1
  213. package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.cjs +1 -1
  214. package/dist/martyrs/src/modules/music/components/pages/SearchResults.vue.js +1 -1
  215. package/dist/martyrs/src/modules/music/components/pages/Track.vue.cjs +2 -2
  216. package/dist/martyrs/src/modules/music/components/pages/Track.vue.cjs.map +1 -1
  217. package/dist/martyrs/src/modules/music/components/pages/Track.vue.js +2 -2
  218. package/dist/martyrs/src/modules/music/components/pages/Track.vue.js.map +1 -1
  219. package/dist/martyrs/src/modules/music/components/pages/TrackCreate.vue.cjs +1 -1
  220. package/dist/martyrs/src/modules/music/components/pages/TrackCreate.vue.js +1 -1
  221. package/dist/martyrs/src/modules/music/router/music.cjs +2 -4
  222. package/dist/martyrs/src/modules/music/router/music.cjs.map +1 -1
  223. package/dist/martyrs/src/modules/music/router/music.js +2 -4
  224. package/dist/martyrs/src/modules/music/router/music.js.map +1 -1
  225. package/dist/martyrs/src/modules/notifications/components/pages/Notifications.vue.cjs +1 -1
  226. package/dist/martyrs/src/modules/notifications/components/pages/Notifications.vue.js +1 -1
  227. package/dist/martyrs/src/modules/orders/components/blocks/CardApplication.vue.cjs +86 -0
  228. package/dist/martyrs/src/modules/orders/components/blocks/CardApplication.vue.cjs.map +1 -0
  229. package/dist/martyrs/src/modules/orders/components/blocks/CardApplication.vue.js +86 -0
  230. package/dist/martyrs/src/modules/orders/components/blocks/CardApplication.vue.js.map +1 -0
  231. package/dist/martyrs/src/modules/orders/components/blocks/CardCustomer.vue.cjs +103 -0
  232. package/dist/martyrs/src/modules/orders/components/blocks/CardCustomer.vue.cjs.map +1 -0
  233. package/dist/martyrs/src/modules/orders/components/blocks/CardCustomer.vue.js +103 -0
  234. package/dist/martyrs/src/modules/orders/components/blocks/CardCustomer.vue.js.map +1 -0
  235. package/dist/martyrs/src/modules/orders/components/elements/FieldSubscribeNewsletter.vue.cjs +194 -0
  236. package/dist/martyrs/src/modules/orders/components/elements/FieldSubscribeNewsletter.vue.cjs.map +1 -0
  237. package/dist/martyrs/src/modules/orders/components/elements/FieldSubscribeNewsletter.vue.js +194 -0
  238. package/dist/martyrs/src/modules/orders/components/elements/FieldSubscribeNewsletter.vue.js.map +1 -0
  239. package/dist/martyrs/src/modules/orders/components/forms/FormApplicationDetails.vue.cjs +138 -0
  240. package/dist/martyrs/src/modules/orders/components/forms/FormApplicationDetails.vue.cjs.map +1 -0
  241. package/dist/martyrs/src/modules/orders/components/forms/FormApplicationDetails.vue.js +138 -0
  242. package/dist/martyrs/src/modules/orders/components/forms/FormApplicationDetails.vue.js.map +1 -0
  243. package/dist/martyrs/src/modules/orders/components/forms/FormCustomerDetails.vue.cjs +189 -0
  244. package/dist/martyrs/src/modules/orders/components/forms/FormCustomerDetails.vue.cjs.map +1 -0
  245. package/dist/martyrs/src/modules/orders/components/forms/FormCustomerDetails.vue.js +189 -0
  246. package/dist/martyrs/src/modules/orders/components/forms/FormCustomerDetails.vue.js.map +1 -0
  247. package/dist/martyrs/src/modules/orders/components/forms/FormSelectCustomer.vue.cjs +173 -0
  248. package/dist/martyrs/src/modules/orders/components/forms/FormSelectCustomer.vue.cjs.map +1 -0
  249. package/dist/martyrs/src/modules/orders/components/forms/FormSelectCustomer.vue.js +173 -0
  250. package/dist/martyrs/src/modules/orders/components/forms/FormSelectCustomer.vue.js.map +1 -0
  251. package/dist/martyrs/src/modules/orders/components/pages/Applications.vue.cjs +233 -0
  252. package/dist/martyrs/src/modules/orders/components/pages/Applications.vue.cjs.map +1 -0
  253. package/dist/martyrs/src/modules/orders/components/pages/Applications.vue.js +233 -0
  254. package/dist/martyrs/src/modules/orders/components/pages/Applications.vue.js.map +1 -0
  255. package/dist/martyrs/src/modules/orders/components/pages/Customers.vue.cjs +234 -0
  256. package/dist/martyrs/src/modules/orders/components/pages/Customers.vue.cjs.map +1 -0
  257. package/dist/martyrs/src/modules/orders/components/pages/Customers.vue.js +234 -0
  258. package/dist/martyrs/src/modules/orders/components/pages/Customers.vue.js.map +1 -0
  259. package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.cjs +9 -8
  260. package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.cjs.map +1 -1
  261. package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.js +9 -8
  262. package/dist/martyrs/src/modules/orders/components/pages/OrderCreate.vue.js.map +1 -1
  263. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.cjs +8 -82
  264. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.cjs.map +1 -1
  265. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.js +9 -83
  266. package/dist/martyrs/src/modules/orders/components/pages/OrderCreateBackoffice.vue.js.map +1 -1
  267. package/dist/martyrs/src/modules/orders/components/pages/Orders.vue.cjs +1 -1
  268. package/dist/martyrs/src/modules/orders/components/pages/Orders.vue.js +1 -1
  269. package/dist/martyrs/src/modules/orders/components/sections/ApplicationDetails.vue.cjs +119 -0
  270. package/dist/martyrs/src/modules/orders/components/sections/ApplicationDetails.vue.cjs.map +1 -0
  271. package/dist/martyrs/src/modules/orders/components/sections/ApplicationDetails.vue.js +119 -0
  272. package/dist/martyrs/src/modules/orders/components/sections/ApplicationDetails.vue.js.map +1 -0
  273. package/dist/martyrs/src/modules/orders/components/sections/CustomerDetails.vue.cjs +139 -0
  274. package/dist/martyrs/src/modules/orders/components/sections/CustomerDetails.vue.cjs.map +1 -0
  275. package/dist/martyrs/src/modules/orders/components/sections/CustomerDetails.vue.js +139 -0
  276. package/dist/martyrs/src/modules/orders/components/sections/CustomerDetails.vue.js.map +1 -0
  277. package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.cjs +2 -4
  278. package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.cjs.map +1 -1
  279. package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.js +2 -4
  280. package/dist/martyrs/src/modules/orders/components/sections/FormDelivery.vue.js.map +1 -1
  281. package/dist/martyrs/src/modules/orders/locales/en.cjs +38 -0
  282. package/dist/martyrs/src/modules/orders/locales/en.cjs.map +1 -0
  283. package/dist/martyrs/src/modules/orders/locales/en.js +38 -0
  284. package/dist/martyrs/src/modules/orders/locales/en.js.map +1 -0
  285. package/dist/martyrs/src/modules/orders/locales/index.cjs +10 -0
  286. package/dist/martyrs/src/modules/orders/locales/index.cjs.map +1 -0
  287. package/dist/martyrs/src/modules/orders/locales/index.js +10 -0
  288. package/dist/martyrs/src/modules/orders/locales/index.js.map +1 -0
  289. package/dist/martyrs/src/modules/orders/locales/ru.cjs +38 -0
  290. package/dist/martyrs/src/modules/orders/locales/ru.cjs.map +1 -0
  291. package/dist/martyrs/src/modules/orders/locales/ru.js +38 -0
  292. package/dist/martyrs/src/modules/orders/locales/ru.js.map +1 -0
  293. package/dist/martyrs/src/modules/orders/orders.client.cjs +78 -3
  294. package/dist/martyrs/src/modules/orders/orders.client.cjs.map +1 -1
  295. package/dist/martyrs/src/modules/orders/orders.client.js +80 -5
  296. package/dist/martyrs/src/modules/orders/orders.client.js.map +1 -1
  297. package/dist/martyrs/src/modules/orders/router/applications.router.cjs +17 -0
  298. package/dist/martyrs/src/modules/orders/router/applications.router.cjs.map +1 -0
  299. package/dist/martyrs/src/modules/orders/router/applications.router.js +17 -0
  300. package/dist/martyrs/src/modules/orders/router/applications.router.js.map +1 -0
  301. package/dist/martyrs/src/modules/orders/router/customers.router.cjs +18 -0
  302. package/dist/martyrs/src/modules/orders/router/customers.router.cjs.map +1 -0
  303. package/dist/martyrs/src/modules/orders/router/customers.router.js +18 -0
  304. package/dist/martyrs/src/modules/orders/router/customers.router.js.map +1 -0
  305. package/dist/martyrs/src/modules/orders/store/applications.cjs +4 -42
  306. package/dist/martyrs/src/modules/orders/store/applications.cjs.map +1 -1
  307. package/dist/martyrs/src/modules/orders/store/applications.js +3 -41
  308. package/dist/martyrs/src/modules/orders/store/applications.js.map +1 -1
  309. package/dist/martyrs/src/modules/orders/store/models/application.cjs +20 -0
  310. package/dist/martyrs/src/modules/orders/store/models/application.cjs.map +1 -0
  311. package/dist/martyrs/src/modules/orders/store/models/application.js +20 -0
  312. package/dist/martyrs/src/modules/orders/store/models/application.js.map +1 -0
  313. package/dist/martyrs/src/modules/orders/store/models/customer.cjs +13 -1
  314. package/dist/martyrs/src/modules/orders/store/models/customer.cjs.map +1 -1
  315. package/dist/martyrs/src/modules/orders/store/models/customer.js +13 -1
  316. package/dist/martyrs/src/modules/orders/store/models/customer.js.map +1 -1
  317. package/dist/martyrs/src/modules/organizations/components/blocks/CardDepartment.vue.cjs +1 -1
  318. package/dist/martyrs/src/modules/organizations/components/blocks/CardDepartment.vue.js +1 -1
  319. package/dist/martyrs/src/modules/organizations/components/pages/Department.vue.cjs +1 -1
  320. package/dist/martyrs/src/modules/organizations/components/pages/Department.vue.js +1 -1
  321. package/dist/martyrs/src/modules/organizations/components/pages/DepartmentEdit.vue.cjs +2 -2
  322. package/dist/martyrs/src/modules/organizations/components/pages/DepartmentEdit.vue.js +2 -2
  323. package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.cjs +1 -1
  324. package/dist/martyrs/src/modules/organizations/components/pages/Members.vue.js +1 -1
  325. package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.cjs +126 -192
  326. package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.cjs.map +1 -1
  327. package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.js +128 -194
  328. package/dist/martyrs/src/modules/organizations/components/pages/Organization.vue.js.map +1 -1
  329. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.cjs +1 -1
  330. package/dist/martyrs/src/modules/organizations/components/pages/OrganizationEdit.vue.js +1 -1
  331. package/dist/martyrs/src/modules/organizations/components/pages/Organizations.vue.cjs +1 -1
  332. package/dist/martyrs/src/modules/organizations/components/pages/Organizations.vue.js +1 -1
  333. package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.cjs +1 -1
  334. package/dist/martyrs/src/modules/organizations/components/sections/Documents.vue.js +1 -1
  335. package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.cjs +2 -2
  336. package/dist/martyrs/src/modules/organizations/components/sections/Organizations.vue.js +2 -2
  337. package/dist/martyrs/src/modules/organizations/configs/navigation.organization.config.cjs +85 -89
  338. package/dist/martyrs/src/modules/organizations/configs/navigation.organization.config.cjs.map +1 -1
  339. package/dist/martyrs/src/modules/organizations/configs/navigation.organization.config.js +92 -96
  340. package/dist/martyrs/src/modules/organizations/configs/navigation.organization.config.js.map +1 -1
  341. package/dist/martyrs/src/modules/organizations/organizations.client.cjs +0 -3
  342. package/dist/martyrs/src/modules/organizations/organizations.client.cjs.map +1 -1
  343. package/dist/martyrs/src/modules/organizations/organizations.client.js +36 -39
  344. package/dist/martyrs/src/modules/organizations/organizations.client.js.map +1 -1
  345. package/dist/martyrs/src/modules/organizations/router/organizations.cjs +4 -0
  346. package/dist/martyrs/src/modules/organizations/router/organizations.cjs.map +1 -1
  347. package/dist/martyrs/src/modules/organizations/router/organizations.js +4 -0
  348. package/dist/martyrs/src/modules/organizations/router/organizations.js.map +1 -1
  349. package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.cjs +1 -1
  350. package/dist/martyrs/src/modules/pages/views/components/blocks/CardPage.vue.js +1 -1
  351. package/dist/martyrs/src/modules/pages/views/components/pages/Page.vue.cjs +3 -6
  352. package/dist/martyrs/src/modules/pages/views/components/pages/Page.vue.cjs.map +1 -1
  353. package/dist/martyrs/src/modules/pages/views/components/pages/Page.vue.js +3 -6
  354. package/dist/martyrs/src/modules/pages/views/components/pages/Page.vue.js.map +1 -1
  355. package/dist/martyrs/src/modules/products/components/blocks/CardCategory.vue.cjs +1 -1
  356. package/dist/martyrs/src/modules/products/components/blocks/CardCategory.vue.cjs.map +1 -1
  357. package/dist/martyrs/src/modules/products/components/blocks/CardCategory.vue.js +1 -1
  358. package/dist/martyrs/src/modules/products/components/blocks/CardCategory.vue.js.map +1 -1
  359. package/dist/martyrs/src/modules/products/components/blocks/ProductImages.vue.cjs +2 -2
  360. package/dist/martyrs/src/modules/products/components/blocks/ProductImages.vue.cjs.map +1 -1
  361. package/dist/martyrs/src/modules/products/components/blocks/ProductImages.vue.js +2 -2
  362. package/dist/martyrs/src/modules/products/components/blocks/ProductImages.vue.js.map +1 -1
  363. package/dist/martyrs/src/modules/products/components/elements/Image360.vue.cjs +1 -1
  364. package/dist/martyrs/src/modules/products/components/elements/Image360.vue.js +1 -1
  365. package/dist/martyrs/src/modules/products/components/pages/Categories.vue.cjs +22 -19
  366. package/dist/martyrs/src/modules/products/components/pages/Categories.vue.cjs.map +1 -1
  367. package/dist/martyrs/src/modules/products/components/pages/Categories.vue.js +22 -19
  368. package/dist/martyrs/src/modules/products/components/pages/Categories.vue.js.map +1 -1
  369. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.cjs +28 -19
  370. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.cjs.map +1 -1
  371. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js +28 -19
  372. package/dist/martyrs/src/modules/products/components/pages/CategoryEdit.vue.js.map +1 -1
  373. package/dist/martyrs/src/modules/products/components/pages/Product.vue.cjs +2 -2
  374. package/dist/martyrs/src/modules/products/components/pages/Product.vue.js +2 -2
  375. package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.cjs +2 -2
  376. package/dist/martyrs/src/modules/products/components/pages/ProductEdit.vue.js +2 -2
  377. package/dist/martyrs/src/modules/products/components/pages/ProductRecommmendation.vue.cjs +1 -1
  378. package/dist/martyrs/src/modules/products/components/pages/ProductRecommmendation.vue.js +1 -1
  379. package/dist/martyrs/src/modules/products/components/pages/Products.vue.cjs +361 -105
  380. package/dist/martyrs/src/modules/products/components/pages/Products.vue.cjs.map +1 -1
  381. package/dist/martyrs/src/modules/products/components/pages/Products.vue.js +379 -123
  382. package/dist/martyrs/src/modules/products/components/pages/Products.vue.js.map +1 -1
  383. package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.cjs +1 -1
  384. package/dist/martyrs/src/modules/products/components/sections/EditVariants.vue.js +1 -1
  385. package/dist/martyrs/src/modules/products/components/sections/FilterProducts.vue.cjs +1 -1
  386. package/dist/martyrs/src/modules/products/components/sections/FilterProducts.vue.js +1 -1
  387. package/dist/martyrs/src/modules/products/components/sections/ProductsRecommended.vue.cjs +32 -2
  388. package/dist/martyrs/src/modules/products/components/sections/ProductsRecommended.vue.cjs.map +1 -1
  389. package/dist/martyrs/src/modules/products/components/sections/ProductsRecommended.vue.js +33 -3
  390. package/dist/martyrs/src/modules/products/components/sections/ProductsRecommended.vue.js.map +1 -1
  391. package/dist/martyrs/src/modules/products/components/sections/SectionProduct.vue.cjs +1 -1
  392. package/dist/martyrs/src/modules/products/components/sections/SectionProduct.vue.js +1 -1
  393. package/dist/martyrs/src/modules/products/router/products.router.cjs +15 -0
  394. package/dist/martyrs/src/modules/products/router/products.router.cjs.map +1 -1
  395. package/dist/martyrs/src/modules/products/router/products.router.js +15 -0
  396. package/dist/martyrs/src/modules/products/router/products.router.js.map +1 -1
  397. package/dist/martyrs/src/modules/products/store/categories.cjs +25 -7
  398. package/dist/martyrs/src/modules/products/store/categories.cjs.map +1 -1
  399. package/dist/martyrs/src/modules/products/store/categories.js +25 -7
  400. package/dist/martyrs/src/modules/products/store/categories.js.map +1 -1
  401. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.cjs +1 -1
  402. package/dist/martyrs/src/modules/rents/views/components/pages/Gant/GanttToolbar.vue.js +1 -1
  403. package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.cjs +1 -1
  404. package/dist/martyrs/src/modules/rents/views/components/pages/Rents.vue.js +1 -1
  405. package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.cjs +1 -1
  406. package/dist/martyrs/src/modules/spots/components/layouts/Spots.vue.js +1 -1
  407. package/dist/martyrs/src/modules/spots/components/pages/Spot.vue.cjs +1 -1
  408. package/dist/martyrs/src/modules/spots/components/pages/Spot.vue.js +1 -1
  409. package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.cjs +1 -1
  410. package/dist/martyrs/src/modules/spots/components/pages/SpotEdit.vue.js +1 -1
  411. package/dist/martyrs/src/modules/spots/components/pages/Spots.vue.cjs +345 -0
  412. package/dist/martyrs/src/modules/spots/components/pages/Spots.vue.cjs.map +1 -0
  413. package/dist/martyrs/src/modules/spots/components/pages/Spots.vue.js +345 -0
  414. package/dist/martyrs/src/modules/spots/components/pages/Spots.vue.js.map +1 -0
  415. package/dist/martyrs/src/modules/spots/router/spots.cjs +17 -0
  416. package/dist/martyrs/src/modules/spots/router/spots.cjs.map +1 -1
  417. package/dist/martyrs/src/modules/spots/router/spots.js +17 -0
  418. package/dist/martyrs/src/modules/spots/router/spots.js.map +1 -1
  419. package/dist/martyrs.cjs.js +1 -1
  420. package/dist/martyrs.css +1 -1
  421. package/dist/martyrs.es.js +1 -1
  422. package/dist/notifications.server.cjs +1 -1
  423. package/dist/notifications.server.js +1 -1
  424. package/dist/orders.server.cjs +459 -201
  425. package/dist/orders.server.js +459 -201
  426. package/dist/organizations.server.cjs +1 -1
  427. package/dist/organizations.server.js +1 -1
  428. package/dist/products.server.cjs +428 -255
  429. package/dist/products.server.js +428 -255
  430. package/dist/style.css +129 -140
  431. package/dist/{tickets.controller-DQQcjyui.js → tickets.controller-C56OvH6v.js} +1 -1
  432. package/dist/{tickets.controller-D0V0gJCA.cjs → tickets.controller-DdnndM6c.cjs} +1 -1
  433. package/dist/wallet.server.cjs +1 -1
  434. package/dist/wallet.server.js +1 -1
  435. package/dist/{web-B1bEJ1W9.js → web-BXajFCU2.js} +1 -1
  436. package/dist/{web-D5i9k2Vv.cjs → web-DaBwwCQ5.cjs} +1 -1
  437. package/package.json +1 -1
  438. package/src/builder/modes/ssr.dev.js +10 -10
  439. package/src/builder/rspack/rspack.config.ssr.client.js +50 -50
  440. package/src/components/Checkbox/Checkbox.vue +3 -4
  441. package/src/components/Feed/Feed.old.vue +522 -0
  442. package/src/components/Feed/Feed.vue +4 -4
  443. package/src/components/Field/Field.vue +7 -1
  444. package/src/components/FieldBig/FieldBig.vue +62 -8
  445. package/src/components/PhotoViewer/PhotoViewer.vue +1 -1
  446. package/src/modules/STYLES.MD +198 -0
  447. package/src/modules/auth/views/components/pages/Profile.vue +1 -1
  448. package/src/modules/auth/views/components/pages/ProfileEdit.vue +42 -8
  449. package/src/modules/auth/views/components/pages/ProfileEditAccount.vue +9 -11
  450. package/src/modules/auth/views/components/pages/ProfileEditProfile.vue +9 -11
  451. package/src/modules/auth/views/components/pages/ProfileEditSidebar.vue +7 -4
  452. package/src/modules/auth/views/router/users.js +0 -4
  453. package/src/modules/community/components/pages/Posts.vue +444 -0
  454. package/src/modules/community/router/blogposts.js +15 -0
  455. package/src/modules/globals/globals.client.js +3 -0
  456. package/src/modules/globals/views/classes/globals.websocket.js +7 -8
  457. package/src/modules/globals/views/components/blocks/Card.vue +2 -1
  458. package/src/modules/globals/views/components/layouts/Client.vue +1 -2
  459. package/src/modules/globals/views/components/partials/Footer.vue +318 -164
  460. package/src/modules/globals/views/components/sections/Filters.vue +261 -121
  461. package/src/modules/globals/views/components/sections/filters/FilterCheckbox.vue +78 -0
  462. package/src/modules/globals/views/components/sections/filters/FilterDateRange.vue +177 -0
  463. package/src/modules/globals/views/components/sections/filters/FilterRange.vue +51 -50
  464. package/src/modules/icons/entities/IconLock.vue +14 -0
  465. package/src/modules/icons/icons.client.js +2 -1
  466. package/src/modules/icons/pages/IconsPage.vue +4 -2
  467. package/src/modules/landing/components/sections/SubscribeNewsletter.vue +11 -61
  468. package/src/modules/landing/landing.client.js +6 -0
  469. package/src/modules/landing/locales/en.js +9 -0
  470. package/src/modules/landing/locales/index.js +7 -0
  471. package/src/modules/landing/locales/ru.js +9 -0
  472. package/src/modules/music/components/pages/Album.vue +1 -1
  473. package/src/modules/music/components/pages/Playlist.vue +1 -1
  474. package/src/modules/music/components/pages/Track.vue +1 -1
  475. package/src/modules/orders/components/blocks/CardApplication.vue +74 -0
  476. package/src/modules/orders/components/blocks/CardCustomer.vue +90 -0
  477. package/src/modules/orders/components/elements/FieldSubscribeNewsletter.vue +199 -0
  478. package/src/modules/orders/components/forms/FormApplicationDetails.vue +117 -0
  479. package/src/modules/orders/components/forms/FormCustomerDetails.vue +165 -0
  480. package/src/modules/orders/components/forms/FormSelectCustomer.vue +172 -0
  481. package/src/modules/orders/components/pages/Applications.vue +240 -0
  482. package/src/modules/orders/components/pages/Customers.vue +239 -0
  483. package/src/modules/orders/components/pages/OrderCreate.vue +2 -2
  484. package/src/modules/orders/components/pages/OrderCreateBackoffice.vue +4 -75
  485. package/src/modules/orders/components/sections/ApplicationDetails.vue +91 -0
  486. package/src/modules/orders/components/sections/CustomerDetails.vue +107 -0
  487. package/src/modules/orders/locales/en.js +35 -0
  488. package/src/modules/orders/locales/index.js +7 -0
  489. package/src/modules/orders/locales/ru.js +35 -0
  490. package/src/modules/orders/middlewares/applications.verifier.js +189 -0
  491. package/src/modules/orders/middlewares/customers.verifier.js +251 -0
  492. package/src/modules/orders/models/application.model.js +21 -0
  493. package/src/modules/orders/models/customer.model.js +26 -0
  494. package/src/modules/orders/orders.client.js +86 -1
  495. package/src/modules/orders/orders.server.js +3 -1
  496. package/src/modules/orders/router/applications.router.js +15 -0
  497. package/src/modules/orders/router/customers.router.js +17 -0
  498. package/src/modules/orders/routes/applications.routes.js +124 -12
  499. package/src/modules/orders/routes/customers.routes.js +43 -0
  500. package/src/modules/orders/store/applications.js +3 -159
  501. package/src/modules/orders/store/models/application.js +18 -0
  502. package/src/modules/orders/store/models/customer.js +12 -0
  503. package/src/modules/organizations/components/pages/Organization.new.vue +593 -0
  504. package/src/modules/organizations/components/pages/Organization.vue +155 -206
  505. package/src/modules/organizations/configs/navigation.organization.config.js +69 -85
  506. package/src/modules/organizations/organizations.client.js +0 -3
  507. package/src/modules/organizations/router/organizations.js +5 -0
  508. package/src/modules/pages/views/components/pages/Page.vue +1 -1
  509. package/src/modules/products/TASKS.MD +157 -0
  510. package/src/modules/products/components/blocks/CardCategory.vue +1 -1
  511. package/src/modules/products/components/blocks/ProductImages.vue +1 -1
  512. package/src/modules/products/components/pages/Categories.vue +27 -22
  513. package/src/modules/products/components/pages/CategoryEdit.vue +24 -13
  514. package/src/modules/products/components/pages/Products.vue +418 -173
  515. package/src/modules/products/components/sections/ProductsRecommended.vue +46 -2
  516. package/src/modules/products/controllers/categories.controller.js +321 -282
  517. package/src/modules/products/controllers/configs/products.lookup.config.js +9 -0
  518. package/src/modules/products/controllers/products.controller.js +2 -1
  519. package/src/modules/products/controllers/queries/products.queries.js +183 -11
  520. package/src/modules/products/middlewares/categories.verifier.js +58 -15
  521. package/src/modules/products/migrations/categories-to-materialized-path.js +433 -0
  522. package/src/modules/products/migrations/path-to-url.js +27 -0
  523. package/src/modules/products/models/category.model.js +8 -23
  524. package/src/modules/products/router/products.router.js +12 -0
  525. package/src/modules/products/store/categories.js +26 -7
  526. package/src/modules/rents/TASK.MD +161 -0
  527. package/src/modules/spots/components/pages/Spots.vue +342 -0
  528. package/src/modules/spots/router/spots.js +15 -0
  529. package/src/styles/base/all.scss +2 -3
  530. package/src/styles/layout.scss +16 -0
  531. package/dist/main-w3rPUBVh.cjs +0 -11
  532. package/dist/martyrs/src/components/BottomSheet/BottomSheet.vue.cjs +0 -96
  533. package/dist/martyrs/src/components/BottomSheet/BottomSheet.vue.cjs.map +0 -1
  534. package/dist/martyrs/src/components/BottomSheet/BottomSheet.vue.js +0 -96
  535. package/dist/martyrs/src/components/BottomSheet/BottomSheet.vue.js.map +0 -1
  536. package/dist/martyrs/src/components/Loader/Loader.vue.js.map +0 -1
  537. package/dist/martyrs/src/components/Spoiler/Spoiler.vue.js.map +0 -1
  538. package/dist/martyrs/src/components/Tab/Tab.vue.js.map +0 -1
  539. package/dist/martyrs/src/modules/orders/components/sections/FormAddCustomer.vue.cjs +0 -155
  540. package/dist/martyrs/src/modules/orders/components/sections/FormAddCustomer.vue.cjs.map +0 -1
  541. package/dist/martyrs/src/modules/orders/components/sections/FormAddCustomer.vue.js +0 -155
  542. package/dist/martyrs/src/modules/orders/components/sections/FormAddCustomer.vue.js.map +0 -1
  543. package/dist/martyrs/src/modules/orders/components/sections/FormCustomerDetails.vue.cjs +0 -81
  544. package/dist/martyrs/src/modules/orders/components/sections/FormCustomerDetails.vue.cjs.map +0 -1
  545. package/dist/martyrs/src/modules/orders/components/sections/FormCustomerDetails.vue.js +0 -81
  546. package/dist/martyrs/src/modules/orders/components/sections/FormCustomerDetails.vue.js.map +0 -1
  547. package/dist/martyrs/src/modules/organizations/components/sections/DetailsTabSection.vue.cjs +0 -146
  548. package/dist/martyrs/src/modules/organizations/components/sections/DetailsTabSection.vue.cjs.map +0 -1
  549. package/dist/martyrs/src/modules/organizations/components/sections/DetailsTabSection.vue.js +0 -146
  550. package/dist/martyrs/src/modules/organizations/components/sections/DetailsTabSection.vue.js.map +0 -1
  551. package/src/modules/globals/views/components/partials/FooterAlt.vue +0 -363
  552. package/src/modules/orders/components/sections/FormAddCustomer.vue +0 -152
  553. package/src/modules/orders/components/sections/FormCustomerDetails.vue +0 -67
  554. package/src/modules/orders/controllers/applications.controller.js +0 -122
  555. package/src/modules/organizations/components/sections/DetailsTabSection.vue +0 -190
@@ -1 +1 @@
1
- {"version":3,"file":"landing.client.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;"}
1
+ {"version":3,"file":"landing.client.js","sources":["../../../../../src/modules/landing/landing.client.js"],"sourcesContent":["// Importing Vue components\nimport SectionEarn from './components/sections/SectionEarn.vue';\nimport SectionFeatures from './components/sections/SectionFeatures.vue';\nimport SectionGuide from './components/sections/SectionGuide.vue';\nimport SectionJoinUs from './components/sections/SectionJoinUs.vue';\nimport SectionMobileApp from './components/sections/SectionMobileApp.vue';\nimport SectionOverview from './components/sections/SectionOverview.vue';\nimport SubscribeNewsletter from './components/sections/SubscribeNewsletter.vue';\n\nimport AnimatedGrid from './components/elements/AnimatedGrid.vue';\nimport FloatingImages from './components/elements/FloatingImages.vue';\n\nimport SectionFeaturesImages from './components/sections/SectionFeaturesImages.vue';\nimport SectionHeroToken from './components/sections/SectionHeroToken.vue';\nimport SectionRoadmap from './components/sections/SectionRoadmap.vue';\n\nimport { i18nManager } from '@martyrs/src/modules/globals/views/classes/globals.i18n.js';\nimport locales from './locales/index.js';\n\n// Регистрируем локализацию для модуля landing\ni18nManager.register('landing', locales);\n\nexport {\n AnimatedGrid,\n FloatingImages,\n SectionEarn,\n SectionFeatures,\n SectionFeaturesImages,\n SectionGuide,\n SectionHeroToken,\n SectionJoinUs,\n SectionMobileApp,\n SectionOverview,\n SectionRoadmap,\n SubscribeNewsletter,\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;AAoBA,YAAY,SAAS,WAAW,OAAO;"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
+ const en = {
4
+ landing: {
5
+ newsletter: {
6
+ title: "Stay Updated with Latest in Digital",
7
+ subtitle: "Subscribe to our newsletter for news, insights, and more from the OZ DAO."
8
+ }
9
+ }
10
+ };
11
+ exports.default = en;
12
+ //# sourceMappingURL=en.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"en.cjs","sources":["../../../../../../src/modules/landing/locales/en.js"],"sourcesContent":["// @martyrs/src/modules/landing/locales/en.js\nexport default {\n landing: {\n newsletter: {\n title: 'Stay Updated with Latest in Digital',\n subtitle: 'Subscribe to our newsletter for news, insights, and more from the OZ DAO.'\n }\n }\n};"],"names":[],"mappings":";;AACA,MAAA,KAAe;AAAA,EACb,SAAS;AAAA,IACP,YAAY;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,IAChB;AAAA,EACA;AACA;;"}
@@ -0,0 +1,12 @@
1
+ const en = {
2
+ landing: {
3
+ newsletter: {
4
+ title: "Stay Updated with Latest in Digital",
5
+ subtitle: "Subscribe to our newsletter for news, insights, and more from the OZ DAO."
6
+ }
7
+ }
8
+ };
9
+ export {
10
+ en as default
11
+ };
12
+ //# sourceMappingURL=en.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"en.js","sources":["../../../../../../src/modules/landing/locales/en.js"],"sourcesContent":["// @martyrs/src/modules/landing/locales/en.js\nexport default {\n landing: {\n newsletter: {\n title: 'Stay Updated with Latest in Digital',\n subtitle: 'Subscribe to our newsletter for news, insights, and more from the OZ DAO.'\n }\n }\n};"],"names":[],"mappings":"AACA,MAAA,KAAe;AAAA,EACb,SAAS;AAAA,IACP,YAAY;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,IAChB;AAAA,EACA;AACA;"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
+ const en = require("./en.cjs");
4
+ const ru = require("./ru.cjs");
5
+ const locales = {
6
+ en: en.default,
7
+ ru: ru.default
8
+ };
9
+ exports.default = locales;
10
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../../../../../../src/modules/landing/locales/index.js"],"sourcesContent":["import en from './en.js';\nimport ru from './ru.js';\n\nexport default {\n en,\n ru\n};"],"names":["en","ru"],"mappings":";;;;AAGA,MAAA,UAAe;AAAA,EACf,IAAEA,GAAAA;AAAAA,EACF,IAAEC,GAAAA;AACF;;"}
@@ -0,0 +1,10 @@
1
+ import en from "./en.js";
2
+ import ru from "./ru.js";
3
+ const locales = {
4
+ en,
5
+ ru
6
+ };
7
+ export {
8
+ locales as default
9
+ };
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../../../../../src/modules/landing/locales/index.js"],"sourcesContent":["import en from './en.js';\nimport ru from './ru.js';\n\nexport default {\n en,\n ru\n};"],"names":[],"mappings":";;AAGA,MAAA,UAAe;AAAA,EACb;AAAA,EACA;AACF;"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
+ const ru = {
4
+ landing: {
5
+ newsletter: {
6
+ title: "Будьте в курсе последних новостей",
7
+ subtitle: "Подпишитесь на нашу рассылку, чтобы получать новости, инсайты и многое другое от OZ DAO."
8
+ }
9
+ }
10
+ };
11
+ exports.default = ru;
12
+ //# sourceMappingURL=ru.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ru.cjs","sources":["../../../../../../src/modules/landing/locales/ru.js"],"sourcesContent":["// @martyrs/src/modules/landing/locales/ru.js\nexport default {\n landing: {\n newsletter: {\n title: 'Будьте в курсе последних новостей',\n subtitle: 'Подпишитесь на нашу рассылку, чтобы получать новости, инсайты и многое другое от OZ DAO.'\n }\n }\n};"],"names":[],"mappings":";;AACA,MAAA,KAAe;AAAA,EACb,SAAS;AAAA,IACP,YAAY;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,IAChB;AAAA,EACA;AACA;;"}
@@ -0,0 +1,12 @@
1
+ const ru = {
2
+ landing: {
3
+ newsletter: {
4
+ title: "Будьте в курсе последних новостей",
5
+ subtitle: "Подпишитесь на нашу рассылку, чтобы получать новости, инсайты и многое другое от OZ DAO."
6
+ }
7
+ }
8
+ };
9
+ export {
10
+ ru as default
11
+ };
12
+ //# sourceMappingURL=ru.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ru.js","sources":["../../../../../../src/modules/landing/locales/ru.js"],"sourcesContent":["// @martyrs/src/modules/landing/locales/ru.js\nexport default {\n landing: {\n newsletter: {\n title: 'Будьте в курсе последних новостей',\n subtitle: 'Подпишитесь на нашу рассылку, чтобы получать новости, инсайты и многое другое от OZ DAO.'\n }\n }\n};"],"names":[],"mappings":"AACA,MAAA,KAAe;AAAA,EACb,SAAS;AAAA,IACP,YAAY;AAAA,MACV,OAAO;AAAA,MACP,UAAU;AAAA,IAChB;AAAA,EACA;AACA;"}
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
3
  const vue = require("vue");
4
- const Loader = require("../../../../../components/Loader/Loader.vue.cjs");
4
+ const Loader = require("../../../../../components/Loader/Loader.vue2.cjs");
5
5
  const vueRouter = require("vue-router");
6
6
  const vueI18n = require("vue-i18n");
7
7
  const categories = require("../../../../products/store/categories.cjs");
@@ -1,5 +1,5 @@
1
1
  import { ref, onMounted, resolveComponent, createElementBlock, openBlock, createElementVNode, createVNode, createTextVNode, Transition, withCtx, Fragment, renderList, createBlock, createCommentVNode, normalizeClass, toDisplayString } from "vue";
2
- import Loader from "../../../../../components/Loader/Loader.vue.js";
2
+ import Loader from "../../../../../components/Loader/Loader.vue2.js";
3
3
  import { useRouter } from "vue-router";
4
4
  import { useI18n } from "vue-i18n";
5
5
  import { actions as actions$1 } from "../../../../products/store/categories.js";
@@ -8,7 +8,7 @@ const Button = require("../../../../components/Button/Button.vue.cjs");
8
8
  const Checkbox = require("../../../../components/Checkbox/Checkbox.vue.cjs");
9
9
  const Select = require("../../../../components/Select/Select.vue.cjs");
10
10
  const UploadImage = require("../../../../components/UploadImage/UploadImage.vue.cjs");
11
- ;/* empty css */
11
+ ;/* empty css */
12
12
  const BlockMultiselect = require("../../../globals/views/components/blocks/BlockMultiselect.vue.cjs");
13
13
  const IconCross = require("../../../icons/navigation/IconCross.vue.cjs");
14
14
  const artists = require("../../store/artists.cjs");
@@ -6,7 +6,7 @@ import _sfc_main$5 from "../../../../components/Button/Button.vue.js";
6
6
  import _sfc_main$4 from "../../../../components/Checkbox/Checkbox.vue.js";
7
7
  import Select from "../../../../components/Select/Select.vue.js";
8
8
  import _sfc_main$1 from "../../../../components/UploadImage/UploadImage.vue.js";
9
- /* empty css */
9
+ /* empty css */
10
10
  import BlockMultiselect from "../../../globals/views/components/blocks/BlockMultiselect.vue.js";
11
11
  import _sfc_main$3 from "../../../icons/navigation/IconCross.vue.js";
12
12
  import { actions as actions$1 } from "../../store/artists.js";
@@ -3,7 +3,7 @@ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toString
3
3
  const vue = require("vue");
4
4
  const vueRouter = require("vue-router");
5
5
  const Button = require("../../../../components/Button/Button.vue.cjs");
6
- const Loader = require("../../../../components/Loader/Loader.vue.cjs");
6
+ const Loader = require("../../../../components/Loader/Loader.vue2.cjs");
7
7
  const Media = require("../../../../components/Media/Media.vue.cjs");
8
8
  const Dropdown = require("../../../../components/Dropdown/Dropdown.vue2.cjs");
9
9
  const Feed = require("../../../../components/Feed/Feed.vue.cjs");
@@ -55,7 +55,7 @@ const _hoisted_19 = {
55
55
  key: 0,
56
56
  class: "t-medium mn-b-small"
57
57
  };
58
- const _hoisted_20 = { class: "flex flex-col gap-small" };
58
+ const _hoisted_20 = { class: "flex flex-column gap-small" };
59
59
  const _hoisted_21 = { class: "metadata-grid grid cols-2 gap-small mn-b-medium" };
60
60
  const _hoisted_22 = { class: "metadata-card bg-light pd-medium radius-medium flex items-center gap-medium" };
61
61
  const _hoisted_23 = { class: "t-medium" };
@@ -1 +1 @@
1
- {"version":3,"file":"Album.vue.cjs","sources":["../../../../../../../src/modules/music/components/pages/Album.vue"],"sourcesContent":["<!-- components/pages/Album.vue -->\n<template>\n <div class=\"album-page pd-small\">\n <!-- Loading -->\n <div v-if=\"isLoading\" class=\"w-100 h-25r flex-center flex\">\n <Loader />\n </div>\n \n <!-- Not Found -->\n <div v-if=\"hasLoaded && !album\" class=\"t-center pd-big\">\n <h2 class=\"\">Album not found</h2>\n <p class=\"t-transp t-medium\">The album you're looking for doesn't exist or has been removed.</p>\n </div>\n \n <!-- Album Content -->\n <div v-if=\"album\" class=\"album-content cols-2-fit-content mobile:cols-1 gap-big\">\n <!-- Left Column - Cover & Stats -->\n <div class=\"pos-sticky pos-t-0 mobile:pos-relative album-cover-section\">\n <!-- Cover -->\n <Media \n :url=\"album.coverArt || '/logo/logo-placeholder.jpg'\"\n :alt=\"album.title\"\n class=\"aspect-1x1 w-100 w-max-30r mn-b-small radius-medium o-hidden\"\n />\n <!-- Quick Stats -->\n <div class=\"stats-grid grid cols-2 gap-small\">\n <div class=\"stat-card bg-light pd-medium radius-medium t-center\">\n <div class=\" mn-b-thin\">{{ album.totalTracks || 0 }}</div>\n <div class=\"t-small t-transp t-uppercase\">Tracks</div>\n </div>\n <div class=\"stat-card bg-light pd-medium radius-medium t-center\">\n <div class=\" mn-b-thin\">{{ formatNumber(album.views) }}</div>\n <div class=\"t-small t-transp t-uppercase\">Views</div>\n </div>\n </div>\n </div>\n\n <!-- Right Column - Album Details -->\n <div class=\"album-details-section\">\n <!-- Album Type Badge -->\n <div class=\"flex items-center gap-small mn-b-small\">\n <span class=\"bg-light t-medium pd-thin radius-thin uppercase t-small t-uppercase\">\n {{ album.type }}\n </span>\n <span v-if=\"album.status === 'published'\" class=\"bg-light t-medium pd-thin radius-thin uppercase t-small t-uppercase\">\n Published\n </span>\n </div>\n\n <!-- Album Title -->\n <h1 class=\"h1 mn-b-medium\">{{ album.title }}</h1>\n\n <!-- Action Buttons -->\n <div class=\"flex gap-small mn-b-medium\">\n <Button\n @click=\"playAlbum\"\n color=\"primary\"\n size=\"medium\"\n class=\"flex-1 t-white bg-black radius-thin flex-center gap-thin\"\n >\n <IconPlay fill=\"rgb(var(--white))\" class=\"i-medium\" />\n Play All\n </Button>\n\n <Button\n @click=\"shufflePlay\"\n color=\"primary\"\n size=\"medium\"\n class=\"flex-1 bg-light radius-thin flex-center gap-thin\"\n >\n <IconShuffle class=\"i-medium\" />\n Shuffle\n </Button>\n\n <Button\n @click=\"toggleFavorite\"\n color=\"primary\"\n size=\"medium\"\n class=\"flex-1 bg-light radius-thin flex-center gap-thin\"\n >\n <IconLike class=\"i-medium\" :fill=\"isFavorite ? 'rgb(var(--main)':'rgb(var(--black)'\" />\n {{isFavorite ? 'Liked' : 'Like'}}\n </Button>\n\n <Dropdown :label=\"{component: IconEllipsis, class: 'bg-light radius-thin pd-thin i-big' }\" v-model=\"showDropdown\" class=\"relative\">\n <template #trigger>\n <Button color=\"transp\" size=\"medium\" class=\"w-3r h-3r radius-full\">\n <IconEllipsis class=\"w-1-25r h-1-25r\" />\n </Button>\n </template>\n <template #default>\n <div class=\"dropdown-menu bg-white pd-small radius-medium shadow-big mn-t-thin\">\n <Button @click=\"addToQueue\" color=\"transp\" size=\"small\" class=\"w-100 justify-start\">\n Add to Queue\n </Button>\n <Button @click=\"copyLink\" color=\"transp\" size=\"small\" class=\"w-100 justify-start\">\n Copy Link\n </Button>\n <Button @click=\"addToPlaylist\" color=\"transp\" size=\"small\" class=\"w-100 justify-start\">\n Add to Playlist\n </Button>\n <template v-if=\"isOwner\">\n <hr class=\"mn-v-thin border-dark-transp-10\" />\n <Button @click=\"editAlbum\" color=\"transp\" size=\"small\" class=\"w-100 justify-start\">\n Edit Album\n </Button>\n <Button @click=\"deleteAlbum\" color=\"danger\" size=\"small\" class=\"w-100 justify-start\">\n Delete Album\n </Button>\n </template>\n </div>\n </template>\n </Dropdown>\n </div>\n\n <!-- Artists Cards -->\n <div class=\"artists-section mn-b-medium\">\n <h3 class=\"t-medium mn-b-small\" v-if=\"album.artists\">Artists</h3>\n <div class=\"flex flex-col gap-small\">\n <ArtistCardSmall \n v-for=\"artist in album.artists\" \n :key=\"artist._id\"\n :artist=\"artist\"\n :is-following=\"followedArtists.includes(artist._id)\"\n :show-follow-button=\"!isOwner\"\n @toggle-follow=\"toggleFollowArtist\"\n />\n </div>\n </div>\n\n <!-- Metadata Cards -->\n <h3 class=\"t-medium mn-b-small\">Metadata</h3>\n <div class=\"metadata-grid grid cols-2 gap-small mn-b-medium\">\n <!-- Release Date -->\n <div class=\"metadata-card bg-light pd-medium radius-medium flex items-center gap-medium\">\n <IconCalendar class=\"i-regular t-primary\" />\n <div>\n <div class=\"t-small t-transp t-uppercase\">Released</div>\n <div class=\"t-medium \">{{ formatDate(album.releaseDate) }}</div>\n </div>\n </div>\n\n <!-- Total Duration -->\n <div class=\"metadata-card bg-light pd-medium radius-medium flex items-center gap-medium\">\n <IconClock class=\"i-regular t-primary\" />\n <div>\n <div class=\"t-small t-transp t-uppercase\">Duration</div>\n <div class=\"t-medium \">{{ totalDuration }}</div>\n </div>\n </div>\n\n <!-- Label -->\n <div v-if=\"album.label\" class=\"metadata-card bg-light pd-medium radius-medium flex items-center gap-medium\">\n <IconDisc class=\"i-regular t-primary\" />\n <div>\n <div class=\"t-small t-transp t-uppercase\">Label</div>\n <div class=\"t-medium \">{{ album.label }}</div>\n </div>\n </div>\n\n <!-- Visibility -->\n <div class=\"metadata-card bg-light pd-medium radius-medium flex items-center gap-medium\">\n <IconEye class=\"i-regular t-primary\" />\n <div>\n <div class=\"t-small t-transp t-uppercase\">Visibility</div>\n <div class=\"t-medium \">{{ album.isPublic ? 'Public' : 'Private' }}</div>\n </div>\n </div>\n </div>\n\n <!-- Genres & Tags -->\n <div v-if=\"(album.genres && album.genres.length) || (album.tags && album.tags.length)\" class=\"tags-section mn-b-medium\">\n <h3 class=\"t-medium mn-b-small\">Genres & Tags</h3>\n <div class=\"flex gap-thin flex-wrap\">\n <span \n v-for=\"genre in album.genres\" \n :key=\"genre\"\n class=\"tag bg-main t-medium pd-thin radius-thin t-small cursor-pointer\"\n >\n {{ genre }}\n </span>\n <span \n v-for=\"tag in album.tags\" \n :key=\"tag\"\n class=\"tag bg-light t-transp pd-thin-big radius-small t-small hover-bg-light cursor-pointer\"\n >\n #{{ tag }}\n </span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Album Tracks -->\n <section v-if=\"!isLoading && album && albumTracks.length\" class=\"tracks-section mn-t-big\">\n <h2 class=\"h2 mn-b-medium\">Tracklist</h2>\n <Feed\n :store=\"{\n read: () => Promise.resolve(albumTracks),\n state: { isLoading: false }\n }\"\n :external=\"true\"\n :items=\"albumTracks\"\n :states=\"{\n empty: {\n title: 'No tracks in album',\n description: 'This album appears to be empty',\n class: 'pd-medium t-center'\n }\n }\"\n >\n <template #default=\"{ items }\">\n <div class=\"bg-light radius-medium o-hidden\">\n <TrackListCard\n v-for=\"(track, index) in items\"\n :key=\"track._id\"\n :track=\"track\"\n :index=\"index + 1\"\n :showAlbum=\"false\"\n :showCover=\"false\"\n />\n </div>\n </template>\n </Feed>\n </section>\n\n <!-- More from Artists -->\n <section v-if=\"!isLoading && album && moreAlbums.length\" class=\"more-albums-section mn-t-big\">\n <div class=\"flex justify-between items-center mn-b-medium\">\n <h2 class=\"h2\">More Albums</h2>\n <router-link \n v-if=\"album.artists && album.artists[0]\"\n :to=\"{ name: 'artist', params: { url: album.artists[0].url } }\" \n class=\"t-primary hover-opacity\"\n >\n See all\n </router-link>\n </div>\n <div class=\"flex flex-nowrap gap-small o-x-scroll overscroll-behavior-x-contain scroll-behavior-smooth scroll-snap-type-x-mandatory scroll-hide\"\n >\n <li v-for=\"relatedAlbum in moreAlbums\" :key=\"album._id\" class=\"flex-none scroll-snap-align-start\">\n <AlbumCard :album=\"relatedAlbum\" class=\"w-min-15r transition-cubic-in-out\" />\n </li>\n </div>\n </section>\n </div>\n</template>\n\n<script setup>\nimport { ref, computed, onMounted, watch } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport Button from '@martyrs/src/components/Button/Button.vue';\nimport Loader from '@martyrs/src/components/Loader/Loader.vue';\nimport Media from '@martyrs/src/components/Media/Media.vue';\nimport Dropdown from '@martyrs/src/components/Dropdown/Dropdown.vue';\nimport Feed from '@martyrs/src/components/Feed/Feed.vue';\n\n// Icons\nimport IconPlay from '@martyrs/src/modules/icons/navigation/IconPlay.vue';\nimport IconLike from '@martyrs/src/modules/icons/navigation/IconLike.vue';\nimport IconEllipsis from '@martyrs/src/modules/icons/navigation/IconEllipsis.vue';\nimport IconShuffle from '@martyrs/src/modules/icons/navigation/IconShuffle.vue';\nimport IconCalendar from '@martyrs/src/modules/icons/entities/IconCalendar.vue';\nimport IconClock from '@martyrs/src/modules/icons/entities/IconTime.vue';\nimport IconEye from '@martyrs/src/modules/icons/actions/IconShow.vue';\nimport IconDisc from '@martyrs/src/modules/icons/entities/IconMusic.vue';\nimport IconVerified from '@martyrs/src/modules/icons/navigation/IconCheckmark.vue';\n\n// Components\nimport TrackListCard from '../cards/TrackListCard.vue';\nimport AlbumCard from '../cards/AlbumCard.vue';\nimport ArtistCardSmall from '../cards/ArtistCardSmall.vue';\n\n// Store\nimport { state as albumsState, actions as albumsActions } from '../../store/albums.js';\nimport { actions as playerActions } from '../../store/player.js';\nimport { state as authState } from '@martyrs/src/modules/auth/views/store/auth.js';\n\nconst route = useRoute();\nconst router = useRouter();\n\n// Emits\nconst emits = defineEmits(['page-loading', 'page-loaded']);\n\n// State\nconst hasLoaded = ref(false);\nconst isFavorite = ref(false);\nconst showDropdown = ref(false);\nconst followedArtists = ref([]);\nconst moreAlbums = ref([]);\n\n// Clear state\nalbumsState.currentAlbum = null;\nalbumsState.currentAlbumTracks = [];\n\n// Computed\nconst album = computed(() => albumsState.currentAlbum);\nconst albumTracks = computed(() => albumsState.currentAlbumTracks || []);\n\nconst isOwner = computed(() => {\n return album.value?.owner?.target === authState.user?._id;\n});\n\nconst totalDuration = computed(() => {\n if (!albumTracks.value.length) return '0:00';\n const totalSeconds = albumTracks.value.reduce((sum, track) => sum + (track.duration || 0), 0);\n return formatDuration(totalSeconds);\n});\n\n// Format helpers\nconst formatDate = (dateString) => {\n if (!dateString) return 'Unknown';\n return new Date(dateString).toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric'\n });\n};\n\nconst formatDuration = (seconds) => {\n if (!seconds) return '0:00';\n const h = Math.floor(seconds / 3600);\n const m = Math.floor((seconds % 3600) / 60);\n const s = Math.floor(seconds % 60);\n \n if (h > 0) {\n return `${h}:${m.toString().padStart(2, '0')}:${s.toString().padStart(2, '0')}`;\n }\n return `${m}:${s.toString().padStart(2, '0')}`;\n};\n\nconst formatNumber = (num) => {\n if (!num) return '0';\n if (num >= 1000000) {\n return (num / 1000000).toFixed(1) + 'M';\n } else if (num >= 1000) {\n return (num / 1000).toFixed(1) + 'K';\n }\n return num.toString();\n};\n\n// Actions\nconst playAlbum = () => {\n if (albumTracks.value && albumTracks.value.length > 0) {\n playerActions.setQueue(albumTracks.value);\n }\n};\n\nconst shufflePlay = () => {\n if (albumTracks.value && albumTracks.value.length > 0) {\n const shuffled = [...albumTracks.value].sort(() => Math.random() - 0.5);\n playerActions.setQueue(shuffled);\n }\n};\n\nconst toggleFavorite = () => {\n isFavorite.value = !isFavorite.value;\n // TODO: Implement actual saving\n};\n\nconst toggleFollowArtist = (artistId) => {\n const index = followedArtists.value.indexOf(artistId);\n if (index > -1) {\n followedArtists.value.splice(index, 1);\n } else {\n followedArtists.value.push(artistId);\n }\n // TODO: Implement actual following\n};\n\nconst addToQueue = () => {\n if (albumTracks.value.length > 0) {\n albumTracks.value.forEach(track => {\n playerActions.addToQueue(track);\n });\n showDropdown.value = false;\n }\n};\n\nconst editAlbum = () => {\n router.push({ name: 'album-edit', params: { url: album.value.url } });\n};\n\nconst deleteAlbum = async () => {\n if (confirm('Are you sure you want to delete this album?')) {\n try {\n await albumsActions.deleteAlbum(album.value._id);\n router.push({ name: 'music-library' });\n } catch (error) {\n console.error('Failed to delete album:', error);\n }\n }\n};\n\nconst copyLink = () => {\n navigator.clipboard.writeText(window.location.href);\n showDropdown.value = false;\n};\n\n// Data fetching\nconst fetchAlbumData = async () => {\n try {\n await albumsActions.fetchAlbumByUrl(route.params.url);\n \n // Fetch more albums from the same artists\n if (album.value?.artists?.length) {\n const artistIds = album.value.artists.map(a => a._id);\n const albums = await albumsActions.fetchAlbums({\n artist: { $in: artistIds },\n status: 'published',\n isPublic: true,\n limit: 6\n });\n \n // Filter out current album\n moreAlbums.value = albums.filter(a => a._id !== album.value._id).slice(0, 5);\n }\n } catch (error) {\n console.error('Error fetching album data:', error);\n }\n};\n\n// Lifecycle\nonMounted(async () => {\n emits('page-loading');\n \n await fetchAlbumData();\n \n hasLoaded.value = true;\n emits('page-loaded');\n});\n</script>\n\n<style scoped>\n</style>"],"names":["useRoute","useRouter","ref","albumsState","computed","authState","playerActions","albumsActions","albums","onMounted"],"mappings":"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"}
1
+ {"version":3,"file":"Album.vue.cjs","sources":["../../../../../../../src/modules/music/components/pages/Album.vue"],"sourcesContent":["<!-- components/pages/Album.vue -->\n<template>\n <div class=\"album-page pd-small\">\n <!-- Loading -->\n <div v-if=\"isLoading\" class=\"w-100 h-25r flex-center flex\">\n <Loader />\n </div>\n \n <!-- Not Found -->\n <div v-if=\"hasLoaded && !album\" class=\"t-center pd-big\">\n <h2 class=\"\">Album not found</h2>\n <p class=\"t-transp t-medium\">The album you're looking for doesn't exist or has been removed.</p>\n </div>\n \n <!-- Album Content -->\n <div v-if=\"album\" class=\"album-content cols-2-fit-content mobile:cols-1 gap-big\">\n <!-- Left Column - Cover & Stats -->\n <div class=\"pos-sticky pos-t-0 mobile:pos-relative album-cover-section\">\n <!-- Cover -->\n <Media \n :url=\"album.coverArt || '/logo/logo-placeholder.jpg'\"\n :alt=\"album.title\"\n class=\"aspect-1x1 w-100 w-max-30r mn-b-small radius-medium o-hidden\"\n />\n <!-- Quick Stats -->\n <div class=\"stats-grid grid cols-2 gap-small\">\n <div class=\"stat-card bg-light pd-medium radius-medium t-center\">\n <div class=\" mn-b-thin\">{{ album.totalTracks || 0 }}</div>\n <div class=\"t-small t-transp t-uppercase\">Tracks</div>\n </div>\n <div class=\"stat-card bg-light pd-medium radius-medium t-center\">\n <div class=\" mn-b-thin\">{{ formatNumber(album.views) }}</div>\n <div class=\"t-small t-transp t-uppercase\">Views</div>\n </div>\n </div>\n </div>\n\n <!-- Right Column - Album Details -->\n <div class=\"album-details-section\">\n <!-- Album Type Badge -->\n <div class=\"flex items-center gap-small mn-b-small\">\n <span class=\"bg-light t-medium pd-thin radius-thin uppercase t-small t-uppercase\">\n {{ album.type }}\n </span>\n <span v-if=\"album.status === 'published'\" class=\"bg-light t-medium pd-thin radius-thin uppercase t-small t-uppercase\">\n Published\n </span>\n </div>\n\n <!-- Album Title -->\n <h1 class=\"h1 mn-b-medium\">{{ album.title }}</h1>\n\n <!-- Action Buttons -->\n <div class=\"flex gap-small mn-b-medium\">\n <Button\n @click=\"playAlbum\"\n color=\"primary\"\n size=\"medium\"\n class=\"flex-1 t-white bg-black radius-thin flex-center gap-thin\"\n >\n <IconPlay fill=\"rgb(var(--white))\" class=\"i-medium\" />\n Play All\n </Button>\n\n <Button\n @click=\"shufflePlay\"\n color=\"primary\"\n size=\"medium\"\n class=\"flex-1 bg-light radius-thin flex-center gap-thin\"\n >\n <IconShuffle class=\"i-medium\" />\n Shuffle\n </Button>\n\n <Button\n @click=\"toggleFavorite\"\n color=\"primary\"\n size=\"medium\"\n class=\"flex-1 bg-light radius-thin flex-center gap-thin\"\n >\n <IconLike class=\"i-medium\" :fill=\"isFavorite ? 'rgb(var(--main)':'rgb(var(--black)'\" />\n {{isFavorite ? 'Liked' : 'Like'}}\n </Button>\n\n <Dropdown :label=\"{component: IconEllipsis, class: 'bg-light radius-thin pd-thin i-big' }\" v-model=\"showDropdown\" class=\"relative\">\n <template #trigger>\n <Button color=\"transp\" size=\"medium\" class=\"w-3r h-3r radius-full\">\n <IconEllipsis class=\"w-1-25r h-1-25r\" />\n </Button>\n </template>\n <template #default>\n <div class=\"dropdown-menu bg-white pd-small radius-medium shadow-big mn-t-thin\">\n <Button @click=\"addToQueue\" color=\"transp\" size=\"small\" class=\"w-100 justify-start\">\n Add to Queue\n </Button>\n <Button @click=\"copyLink\" color=\"transp\" size=\"small\" class=\"w-100 justify-start\">\n Copy Link\n </Button>\n <Button @click=\"addToPlaylist\" color=\"transp\" size=\"small\" class=\"w-100 justify-start\">\n Add to Playlist\n </Button>\n <template v-if=\"isOwner\">\n <hr class=\"mn-v-thin border-dark-transp-10\" />\n <Button @click=\"editAlbum\" color=\"transp\" size=\"small\" class=\"w-100 justify-start\">\n Edit Album\n </Button>\n <Button @click=\"deleteAlbum\" color=\"danger\" size=\"small\" class=\"w-100 justify-start\">\n Delete Album\n </Button>\n </template>\n </div>\n </template>\n </Dropdown>\n </div>\n\n <!-- Artists Cards -->\n <div class=\"artists-section mn-b-medium\">\n <h3 class=\"t-medium mn-b-small\" v-if=\"album.artists\">Artists</h3>\n <div class=\"flex flex-column gap-small\">\n <ArtistCardSmall \n v-for=\"artist in album.artists\" \n :key=\"artist._id\"\n :artist=\"artist\"\n :is-following=\"followedArtists.includes(artist._id)\"\n :show-follow-button=\"!isOwner\"\n @toggle-follow=\"toggleFollowArtist\"\n />\n </div>\n </div>\n\n <!-- Metadata Cards -->\n <h3 class=\"t-medium mn-b-small\">Metadata</h3>\n <div class=\"metadata-grid grid cols-2 gap-small mn-b-medium\">\n <!-- Release Date -->\n <div class=\"metadata-card bg-light pd-medium radius-medium flex items-center gap-medium\">\n <IconCalendar class=\"i-regular t-primary\" />\n <div>\n <div class=\"t-small t-transp t-uppercase\">Released</div>\n <div class=\"t-medium \">{{ formatDate(album.releaseDate) }}</div>\n </div>\n </div>\n\n <!-- Total Duration -->\n <div class=\"metadata-card bg-light pd-medium radius-medium flex items-center gap-medium\">\n <IconClock class=\"i-regular t-primary\" />\n <div>\n <div class=\"t-small t-transp t-uppercase\">Duration</div>\n <div class=\"t-medium \">{{ totalDuration }}</div>\n </div>\n </div>\n\n <!-- Label -->\n <div v-if=\"album.label\" class=\"metadata-card bg-light pd-medium radius-medium flex items-center gap-medium\">\n <IconDisc class=\"i-regular t-primary\" />\n <div>\n <div class=\"t-small t-transp t-uppercase\">Label</div>\n <div class=\"t-medium \">{{ album.label }}</div>\n </div>\n </div>\n\n <!-- Visibility -->\n <div class=\"metadata-card bg-light pd-medium radius-medium flex items-center gap-medium\">\n <IconEye class=\"i-regular t-primary\" />\n <div>\n <div class=\"t-small t-transp t-uppercase\">Visibility</div>\n <div class=\"t-medium \">{{ album.isPublic ? 'Public' : 'Private' }}</div>\n </div>\n </div>\n </div>\n\n <!-- Genres & Tags -->\n <div v-if=\"(album.genres && album.genres.length) || (album.tags && album.tags.length)\" class=\"tags-section mn-b-medium\">\n <h3 class=\"t-medium mn-b-small\">Genres & Tags</h3>\n <div class=\"flex gap-thin flex-wrap\">\n <span \n v-for=\"genre in album.genres\" \n :key=\"genre\"\n class=\"tag bg-main t-medium pd-thin radius-thin t-small cursor-pointer\"\n >\n {{ genre }}\n </span>\n <span \n v-for=\"tag in album.tags\" \n :key=\"tag\"\n class=\"tag bg-light t-transp pd-thin-big radius-small t-small hover-bg-light cursor-pointer\"\n >\n #{{ tag }}\n </span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Album Tracks -->\n <section v-if=\"!isLoading && album && albumTracks.length\" class=\"tracks-section mn-t-big\">\n <h2 class=\"h2 mn-b-medium\">Tracklist</h2>\n <Feed\n :store=\"{\n read: () => Promise.resolve(albumTracks),\n state: { isLoading: false }\n }\"\n :external=\"true\"\n :items=\"albumTracks\"\n :states=\"{\n empty: {\n title: 'No tracks in album',\n description: 'This album appears to be empty',\n class: 'pd-medium t-center'\n }\n }\"\n >\n <template #default=\"{ items }\">\n <div class=\"bg-light radius-medium o-hidden\">\n <TrackListCard\n v-for=\"(track, index) in items\"\n :key=\"track._id\"\n :track=\"track\"\n :index=\"index + 1\"\n :showAlbum=\"false\"\n :showCover=\"false\"\n />\n </div>\n </template>\n </Feed>\n </section>\n\n <!-- More from Artists -->\n <section v-if=\"!isLoading && album && moreAlbums.length\" class=\"more-albums-section mn-t-big\">\n <div class=\"flex justify-between items-center mn-b-medium\">\n <h2 class=\"h2\">More Albums</h2>\n <router-link \n v-if=\"album.artists && album.artists[0]\"\n :to=\"{ name: 'artist', params: { url: album.artists[0].url } }\" \n class=\"t-primary hover-opacity\"\n >\n See all\n </router-link>\n </div>\n <div class=\"flex flex-nowrap gap-small o-x-scroll overscroll-behavior-x-contain scroll-behavior-smooth scroll-snap-type-x-mandatory scroll-hide\"\n >\n <li v-for=\"relatedAlbum in moreAlbums\" :key=\"album._id\" class=\"flex-none scroll-snap-align-start\">\n <AlbumCard :album=\"relatedAlbum\" class=\"w-min-15r transition-cubic-in-out\" />\n </li>\n </div>\n </section>\n </div>\n</template>\n\n<script setup>\nimport { ref, computed, onMounted, watch } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport Button from '@martyrs/src/components/Button/Button.vue';\nimport Loader from '@martyrs/src/components/Loader/Loader.vue';\nimport Media from '@martyrs/src/components/Media/Media.vue';\nimport Dropdown from '@martyrs/src/components/Dropdown/Dropdown.vue';\nimport Feed from '@martyrs/src/components/Feed/Feed.vue';\n\n// Icons\nimport IconPlay from '@martyrs/src/modules/icons/navigation/IconPlay.vue';\nimport IconLike from '@martyrs/src/modules/icons/navigation/IconLike.vue';\nimport IconEllipsis from '@martyrs/src/modules/icons/navigation/IconEllipsis.vue';\nimport IconShuffle from '@martyrs/src/modules/icons/navigation/IconShuffle.vue';\nimport IconCalendar from '@martyrs/src/modules/icons/entities/IconCalendar.vue';\nimport IconClock from '@martyrs/src/modules/icons/entities/IconTime.vue';\nimport IconEye from '@martyrs/src/modules/icons/actions/IconShow.vue';\nimport IconDisc from '@martyrs/src/modules/icons/entities/IconMusic.vue';\nimport IconVerified from '@martyrs/src/modules/icons/navigation/IconCheckmark.vue';\n\n// Components\nimport TrackListCard from '../cards/TrackListCard.vue';\nimport AlbumCard from '../cards/AlbumCard.vue';\nimport ArtistCardSmall from '../cards/ArtistCardSmall.vue';\n\n// Store\nimport { state as albumsState, actions as albumsActions } from '../../store/albums.js';\nimport { actions as playerActions } from '../../store/player.js';\nimport { state as authState } from '@martyrs/src/modules/auth/views/store/auth.js';\n\nconst route = useRoute();\nconst router = useRouter();\n\n// Emits\nconst emits = defineEmits(['page-loading', 'page-loaded']);\n\n// State\nconst hasLoaded = ref(false);\nconst isFavorite = ref(false);\nconst showDropdown = ref(false);\nconst followedArtists = ref([]);\nconst moreAlbums = ref([]);\n\n// Clear state\nalbumsState.currentAlbum = null;\nalbumsState.currentAlbumTracks = [];\n\n// Computed\nconst album = computed(() => albumsState.currentAlbum);\nconst albumTracks = computed(() => albumsState.currentAlbumTracks || []);\n\nconst isOwner = computed(() => {\n return album.value?.owner?.target === authState.user?._id;\n});\n\nconst totalDuration = computed(() => {\n if (!albumTracks.value.length) return '0:00';\n const totalSeconds = albumTracks.value.reduce((sum, track) => sum + (track.duration || 0), 0);\n return formatDuration(totalSeconds);\n});\n\n// Format helpers\nconst formatDate = (dateString) => {\n if (!dateString) return 'Unknown';\n return new Date(dateString).toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric'\n });\n};\n\nconst formatDuration = (seconds) => {\n if (!seconds) return '0:00';\n const h = Math.floor(seconds / 3600);\n const m = Math.floor((seconds % 3600) / 60);\n const s = Math.floor(seconds % 60);\n \n if (h > 0) {\n return `${h}:${m.toString().padStart(2, '0')}:${s.toString().padStart(2, '0')}`;\n }\n return `${m}:${s.toString().padStart(2, '0')}`;\n};\n\nconst formatNumber = (num) => {\n if (!num) return '0';\n if (num >= 1000000) {\n return (num / 1000000).toFixed(1) + 'M';\n } else if (num >= 1000) {\n return (num / 1000).toFixed(1) + 'K';\n }\n return num.toString();\n};\n\n// Actions\nconst playAlbum = () => {\n if (albumTracks.value && albumTracks.value.length > 0) {\n playerActions.setQueue(albumTracks.value);\n }\n};\n\nconst shufflePlay = () => {\n if (albumTracks.value && albumTracks.value.length > 0) {\n const shuffled = [...albumTracks.value].sort(() => Math.random() - 0.5);\n playerActions.setQueue(shuffled);\n }\n};\n\nconst toggleFavorite = () => {\n isFavorite.value = !isFavorite.value;\n // TODO: Implement actual saving\n};\n\nconst toggleFollowArtist = (artistId) => {\n const index = followedArtists.value.indexOf(artistId);\n if (index > -1) {\n followedArtists.value.splice(index, 1);\n } else {\n followedArtists.value.push(artistId);\n }\n // TODO: Implement actual following\n};\n\nconst addToQueue = () => {\n if (albumTracks.value.length > 0) {\n albumTracks.value.forEach(track => {\n playerActions.addToQueue(track);\n });\n showDropdown.value = false;\n }\n};\n\nconst editAlbum = () => {\n router.push({ name: 'album-edit', params: { url: album.value.url } });\n};\n\nconst deleteAlbum = async () => {\n if (confirm('Are you sure you want to delete this album?')) {\n try {\n await albumsActions.deleteAlbum(album.value._id);\n router.push({ name: 'music-library' });\n } catch (error) {\n console.error('Failed to delete album:', error);\n }\n }\n};\n\nconst copyLink = () => {\n navigator.clipboard.writeText(window.location.href);\n showDropdown.value = false;\n};\n\n// Data fetching\nconst fetchAlbumData = async () => {\n try {\n await albumsActions.fetchAlbumByUrl(route.params.url);\n \n // Fetch more albums from the same artists\n if (album.value?.artists?.length) {\n const artistIds = album.value.artists.map(a => a._id);\n const albums = await albumsActions.fetchAlbums({\n artist: { $in: artistIds },\n status: 'published',\n isPublic: true,\n limit: 6\n });\n \n // Filter out current album\n moreAlbums.value = albums.filter(a => a._id !== album.value._id).slice(0, 5);\n }\n } catch (error) {\n console.error('Error fetching album data:', error);\n }\n};\n\n// Lifecycle\nonMounted(async () => {\n emits('page-loading');\n \n await fetchAlbumData();\n \n hasLoaded.value = true;\n emits('page-loaded');\n});\n</script>\n\n<style scoped>\n</style>"],"names":["useRoute","useRouter","ref","albumsState","computed","authState","playerActions","albumsActions","albums","onMounted"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { ref, computed, onMounted, resolveComponent, createElementBlock, openBlock, createCommentVNode, createVNode, createElementVNode, toDisplayString, withCtx, createTextVNode, Fragment, renderList, createBlock } from "vue";
2
2
  import { useRoute, useRouter } from "vue-router";
3
3
  import _sfc_main$1 from "../../../../components/Button/Button.vue.js";
4
- import Loader from "../../../../components/Loader/Loader.vue.js";
4
+ import Loader from "../../../../components/Loader/Loader.vue2.js";
5
5
  import Media from "../../../../components/Media/Media.vue.js";
6
6
  import _sfc_main$5 from "../../../../components/Dropdown/Dropdown.vue2.js";
7
7
  import _sfc_main$a from "../../../../components/Feed/Feed.vue.js";
@@ -53,7 +53,7 @@ const _hoisted_19 = {
53
53
  key: 0,
54
54
  class: "t-medium mn-b-small"
55
55
  };
56
- const _hoisted_20 = { class: "flex flex-col gap-small" };
56
+ const _hoisted_20 = { class: "flex flex-column gap-small" };
57
57
  const _hoisted_21 = { class: "metadata-grid grid cols-2 gap-small mn-b-medium" };
58
58
  const _hoisted_22 = { class: "metadata-card bg-light pd-medium radius-medium flex items-center gap-medium" };
59
59
  const _hoisted_23 = { class: "t-medium" };
@@ -1 +1 @@
1
- {"version":3,"file":"Album.vue.js","sources":["../../../../../../../src/modules/music/components/pages/Album.vue"],"sourcesContent":["<!-- components/pages/Album.vue -->\n<template>\n <div class=\"album-page pd-small\">\n <!-- Loading -->\n <div v-if=\"isLoading\" class=\"w-100 h-25r flex-center flex\">\n <Loader />\n </div>\n \n <!-- Not Found -->\n <div v-if=\"hasLoaded && !album\" class=\"t-center pd-big\">\n <h2 class=\"\">Album not found</h2>\n <p class=\"t-transp t-medium\">The album you're looking for doesn't exist or has been removed.</p>\n </div>\n \n <!-- Album Content -->\n <div v-if=\"album\" class=\"album-content cols-2-fit-content mobile:cols-1 gap-big\">\n <!-- Left Column - Cover & Stats -->\n <div class=\"pos-sticky pos-t-0 mobile:pos-relative album-cover-section\">\n <!-- Cover -->\n <Media \n :url=\"album.coverArt || '/logo/logo-placeholder.jpg'\"\n :alt=\"album.title\"\n class=\"aspect-1x1 w-100 w-max-30r mn-b-small radius-medium o-hidden\"\n />\n <!-- Quick Stats -->\n <div class=\"stats-grid grid cols-2 gap-small\">\n <div class=\"stat-card bg-light pd-medium radius-medium t-center\">\n <div class=\" mn-b-thin\">{{ album.totalTracks || 0 }}</div>\n <div class=\"t-small t-transp t-uppercase\">Tracks</div>\n </div>\n <div class=\"stat-card bg-light pd-medium radius-medium t-center\">\n <div class=\" mn-b-thin\">{{ formatNumber(album.views) }}</div>\n <div class=\"t-small t-transp t-uppercase\">Views</div>\n </div>\n </div>\n </div>\n\n <!-- Right Column - Album Details -->\n <div class=\"album-details-section\">\n <!-- Album Type Badge -->\n <div class=\"flex items-center gap-small mn-b-small\">\n <span class=\"bg-light t-medium pd-thin radius-thin uppercase t-small t-uppercase\">\n {{ album.type }}\n </span>\n <span v-if=\"album.status === 'published'\" class=\"bg-light t-medium pd-thin radius-thin uppercase t-small t-uppercase\">\n Published\n </span>\n </div>\n\n <!-- Album Title -->\n <h1 class=\"h1 mn-b-medium\">{{ album.title }}</h1>\n\n <!-- Action Buttons -->\n <div class=\"flex gap-small mn-b-medium\">\n <Button\n @click=\"playAlbum\"\n color=\"primary\"\n size=\"medium\"\n class=\"flex-1 t-white bg-black radius-thin flex-center gap-thin\"\n >\n <IconPlay fill=\"rgb(var(--white))\" class=\"i-medium\" />\n Play All\n </Button>\n\n <Button\n @click=\"shufflePlay\"\n color=\"primary\"\n size=\"medium\"\n class=\"flex-1 bg-light radius-thin flex-center gap-thin\"\n >\n <IconShuffle class=\"i-medium\" />\n Shuffle\n </Button>\n\n <Button\n @click=\"toggleFavorite\"\n color=\"primary\"\n size=\"medium\"\n class=\"flex-1 bg-light radius-thin flex-center gap-thin\"\n >\n <IconLike class=\"i-medium\" :fill=\"isFavorite ? 'rgb(var(--main)':'rgb(var(--black)'\" />\n {{isFavorite ? 'Liked' : 'Like'}}\n </Button>\n\n <Dropdown :label=\"{component: IconEllipsis, class: 'bg-light radius-thin pd-thin i-big' }\" v-model=\"showDropdown\" class=\"relative\">\n <template #trigger>\n <Button color=\"transp\" size=\"medium\" class=\"w-3r h-3r radius-full\">\n <IconEllipsis class=\"w-1-25r h-1-25r\" />\n </Button>\n </template>\n <template #default>\n <div class=\"dropdown-menu bg-white pd-small radius-medium shadow-big mn-t-thin\">\n <Button @click=\"addToQueue\" color=\"transp\" size=\"small\" class=\"w-100 justify-start\">\n Add to Queue\n </Button>\n <Button @click=\"copyLink\" color=\"transp\" size=\"small\" class=\"w-100 justify-start\">\n Copy Link\n </Button>\n <Button @click=\"addToPlaylist\" color=\"transp\" size=\"small\" class=\"w-100 justify-start\">\n Add to Playlist\n </Button>\n <template v-if=\"isOwner\">\n <hr class=\"mn-v-thin border-dark-transp-10\" />\n <Button @click=\"editAlbum\" color=\"transp\" size=\"small\" class=\"w-100 justify-start\">\n Edit Album\n </Button>\n <Button @click=\"deleteAlbum\" color=\"danger\" size=\"small\" class=\"w-100 justify-start\">\n Delete Album\n </Button>\n </template>\n </div>\n </template>\n </Dropdown>\n </div>\n\n <!-- Artists Cards -->\n <div class=\"artists-section mn-b-medium\">\n <h3 class=\"t-medium mn-b-small\" v-if=\"album.artists\">Artists</h3>\n <div class=\"flex flex-col gap-small\">\n <ArtistCardSmall \n v-for=\"artist in album.artists\" \n :key=\"artist._id\"\n :artist=\"artist\"\n :is-following=\"followedArtists.includes(artist._id)\"\n :show-follow-button=\"!isOwner\"\n @toggle-follow=\"toggleFollowArtist\"\n />\n </div>\n </div>\n\n <!-- Metadata Cards -->\n <h3 class=\"t-medium mn-b-small\">Metadata</h3>\n <div class=\"metadata-grid grid cols-2 gap-small mn-b-medium\">\n <!-- Release Date -->\n <div class=\"metadata-card bg-light pd-medium radius-medium flex items-center gap-medium\">\n <IconCalendar class=\"i-regular t-primary\" />\n <div>\n <div class=\"t-small t-transp t-uppercase\">Released</div>\n <div class=\"t-medium \">{{ formatDate(album.releaseDate) }}</div>\n </div>\n </div>\n\n <!-- Total Duration -->\n <div class=\"metadata-card bg-light pd-medium radius-medium flex items-center gap-medium\">\n <IconClock class=\"i-regular t-primary\" />\n <div>\n <div class=\"t-small t-transp t-uppercase\">Duration</div>\n <div class=\"t-medium \">{{ totalDuration }}</div>\n </div>\n </div>\n\n <!-- Label -->\n <div v-if=\"album.label\" class=\"metadata-card bg-light pd-medium radius-medium flex items-center gap-medium\">\n <IconDisc class=\"i-regular t-primary\" />\n <div>\n <div class=\"t-small t-transp t-uppercase\">Label</div>\n <div class=\"t-medium \">{{ album.label }}</div>\n </div>\n </div>\n\n <!-- Visibility -->\n <div class=\"metadata-card bg-light pd-medium radius-medium flex items-center gap-medium\">\n <IconEye class=\"i-regular t-primary\" />\n <div>\n <div class=\"t-small t-transp t-uppercase\">Visibility</div>\n <div class=\"t-medium \">{{ album.isPublic ? 'Public' : 'Private' }}</div>\n </div>\n </div>\n </div>\n\n <!-- Genres & Tags -->\n <div v-if=\"(album.genres && album.genres.length) || (album.tags && album.tags.length)\" class=\"tags-section mn-b-medium\">\n <h3 class=\"t-medium mn-b-small\">Genres & Tags</h3>\n <div class=\"flex gap-thin flex-wrap\">\n <span \n v-for=\"genre in album.genres\" \n :key=\"genre\"\n class=\"tag bg-main t-medium pd-thin radius-thin t-small cursor-pointer\"\n >\n {{ genre }}\n </span>\n <span \n v-for=\"tag in album.tags\" \n :key=\"tag\"\n class=\"tag bg-light t-transp pd-thin-big radius-small t-small hover-bg-light cursor-pointer\"\n >\n #{{ tag }}\n </span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Album Tracks -->\n <section v-if=\"!isLoading && album && albumTracks.length\" class=\"tracks-section mn-t-big\">\n <h2 class=\"h2 mn-b-medium\">Tracklist</h2>\n <Feed\n :store=\"{\n read: () => Promise.resolve(albumTracks),\n state: { isLoading: false }\n }\"\n :external=\"true\"\n :items=\"albumTracks\"\n :states=\"{\n empty: {\n title: 'No tracks in album',\n description: 'This album appears to be empty',\n class: 'pd-medium t-center'\n }\n }\"\n >\n <template #default=\"{ items }\">\n <div class=\"bg-light radius-medium o-hidden\">\n <TrackListCard\n v-for=\"(track, index) in items\"\n :key=\"track._id\"\n :track=\"track\"\n :index=\"index + 1\"\n :showAlbum=\"false\"\n :showCover=\"false\"\n />\n </div>\n </template>\n </Feed>\n </section>\n\n <!-- More from Artists -->\n <section v-if=\"!isLoading && album && moreAlbums.length\" class=\"more-albums-section mn-t-big\">\n <div class=\"flex justify-between items-center mn-b-medium\">\n <h2 class=\"h2\">More Albums</h2>\n <router-link \n v-if=\"album.artists && album.artists[0]\"\n :to=\"{ name: 'artist', params: { url: album.artists[0].url } }\" \n class=\"t-primary hover-opacity\"\n >\n See all\n </router-link>\n </div>\n <div class=\"flex flex-nowrap gap-small o-x-scroll overscroll-behavior-x-contain scroll-behavior-smooth scroll-snap-type-x-mandatory scroll-hide\"\n >\n <li v-for=\"relatedAlbum in moreAlbums\" :key=\"album._id\" class=\"flex-none scroll-snap-align-start\">\n <AlbumCard :album=\"relatedAlbum\" class=\"w-min-15r transition-cubic-in-out\" />\n </li>\n </div>\n </section>\n </div>\n</template>\n\n<script setup>\nimport { ref, computed, onMounted, watch } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport Button from '@martyrs/src/components/Button/Button.vue';\nimport Loader from '@martyrs/src/components/Loader/Loader.vue';\nimport Media from '@martyrs/src/components/Media/Media.vue';\nimport Dropdown from '@martyrs/src/components/Dropdown/Dropdown.vue';\nimport Feed from '@martyrs/src/components/Feed/Feed.vue';\n\n// Icons\nimport IconPlay from '@martyrs/src/modules/icons/navigation/IconPlay.vue';\nimport IconLike from '@martyrs/src/modules/icons/navigation/IconLike.vue';\nimport IconEllipsis from '@martyrs/src/modules/icons/navigation/IconEllipsis.vue';\nimport IconShuffle from '@martyrs/src/modules/icons/navigation/IconShuffle.vue';\nimport IconCalendar from '@martyrs/src/modules/icons/entities/IconCalendar.vue';\nimport IconClock from '@martyrs/src/modules/icons/entities/IconTime.vue';\nimport IconEye from '@martyrs/src/modules/icons/actions/IconShow.vue';\nimport IconDisc from '@martyrs/src/modules/icons/entities/IconMusic.vue';\nimport IconVerified from '@martyrs/src/modules/icons/navigation/IconCheckmark.vue';\n\n// Components\nimport TrackListCard from '../cards/TrackListCard.vue';\nimport AlbumCard from '../cards/AlbumCard.vue';\nimport ArtistCardSmall from '../cards/ArtistCardSmall.vue';\n\n// Store\nimport { state as albumsState, actions as albumsActions } from '../../store/albums.js';\nimport { actions as playerActions } from '../../store/player.js';\nimport { state as authState } from '@martyrs/src/modules/auth/views/store/auth.js';\n\nconst route = useRoute();\nconst router = useRouter();\n\n// Emits\nconst emits = defineEmits(['page-loading', 'page-loaded']);\n\n// State\nconst hasLoaded = ref(false);\nconst isFavorite = ref(false);\nconst showDropdown = ref(false);\nconst followedArtists = ref([]);\nconst moreAlbums = ref([]);\n\n// Clear state\nalbumsState.currentAlbum = null;\nalbumsState.currentAlbumTracks = [];\n\n// Computed\nconst album = computed(() => albumsState.currentAlbum);\nconst albumTracks = computed(() => albumsState.currentAlbumTracks || []);\n\nconst isOwner = computed(() => {\n return album.value?.owner?.target === authState.user?._id;\n});\n\nconst totalDuration = computed(() => {\n if (!albumTracks.value.length) return '0:00';\n const totalSeconds = albumTracks.value.reduce((sum, track) => sum + (track.duration || 0), 0);\n return formatDuration(totalSeconds);\n});\n\n// Format helpers\nconst formatDate = (dateString) => {\n if (!dateString) return 'Unknown';\n return new Date(dateString).toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric'\n });\n};\n\nconst formatDuration = (seconds) => {\n if (!seconds) return '0:00';\n const h = Math.floor(seconds / 3600);\n const m = Math.floor((seconds % 3600) / 60);\n const s = Math.floor(seconds % 60);\n \n if (h > 0) {\n return `${h}:${m.toString().padStart(2, '0')}:${s.toString().padStart(2, '0')}`;\n }\n return `${m}:${s.toString().padStart(2, '0')}`;\n};\n\nconst formatNumber = (num) => {\n if (!num) return '0';\n if (num >= 1000000) {\n return (num / 1000000).toFixed(1) + 'M';\n } else if (num >= 1000) {\n return (num / 1000).toFixed(1) + 'K';\n }\n return num.toString();\n};\n\n// Actions\nconst playAlbum = () => {\n if (albumTracks.value && albumTracks.value.length > 0) {\n playerActions.setQueue(albumTracks.value);\n }\n};\n\nconst shufflePlay = () => {\n if (albumTracks.value && albumTracks.value.length > 0) {\n const shuffled = [...albumTracks.value].sort(() => Math.random() - 0.5);\n playerActions.setQueue(shuffled);\n }\n};\n\nconst toggleFavorite = () => {\n isFavorite.value = !isFavorite.value;\n // TODO: Implement actual saving\n};\n\nconst toggleFollowArtist = (artistId) => {\n const index = followedArtists.value.indexOf(artistId);\n if (index > -1) {\n followedArtists.value.splice(index, 1);\n } else {\n followedArtists.value.push(artistId);\n }\n // TODO: Implement actual following\n};\n\nconst addToQueue = () => {\n if (albumTracks.value.length > 0) {\n albumTracks.value.forEach(track => {\n playerActions.addToQueue(track);\n });\n showDropdown.value = false;\n }\n};\n\nconst editAlbum = () => {\n router.push({ name: 'album-edit', params: { url: album.value.url } });\n};\n\nconst deleteAlbum = async () => {\n if (confirm('Are you sure you want to delete this album?')) {\n try {\n await albumsActions.deleteAlbum(album.value._id);\n router.push({ name: 'music-library' });\n } catch (error) {\n console.error('Failed to delete album:', error);\n }\n }\n};\n\nconst copyLink = () => {\n navigator.clipboard.writeText(window.location.href);\n showDropdown.value = false;\n};\n\n// Data fetching\nconst fetchAlbumData = async () => {\n try {\n await albumsActions.fetchAlbumByUrl(route.params.url);\n \n // Fetch more albums from the same artists\n if (album.value?.artists?.length) {\n const artistIds = album.value.artists.map(a => a._id);\n const albums = await albumsActions.fetchAlbums({\n artist: { $in: artistIds },\n status: 'published',\n isPublic: true,\n limit: 6\n });\n \n // Filter out current album\n moreAlbums.value = albums.filter(a => a._id !== album.value._id).slice(0, 5);\n }\n } catch (error) {\n console.error('Error fetching album data:', error);\n }\n};\n\n// Lifecycle\nonMounted(async () => {\n emits('page-loading');\n \n await fetchAlbumData();\n \n hasLoaded.value = true;\n emits('page-loaded');\n});\n</script>\n\n<style scoped>\n</style>"],"names":["albumsState","authState","playerActions","albumsActions"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsRA,UAAM,QAAQ,SAAQ;AACtB,UAAM,SAAS,UAAS;AAGxB,UAAM,QAAQ;AAGd,UAAM,YAAY,IAAI,KAAK;AAC3B,UAAM,aAAa,IAAI,KAAK;AAC5B,UAAM,eAAe,IAAI,KAAK;AAC9B,UAAM,kBAAkB,IAAI,EAAE;AAC9B,UAAM,aAAa,IAAI,EAAE;AAGzBA,UAAY,eAAe;AAC3BA,UAAY,qBAAqB,CAAA;AAGjC,UAAM,QAAQ,SAAS,MAAMA,MAAY,YAAY;AACrD,UAAM,cAAc,SAAS,MAAMA,MAAY,sBAAsB,CAAA,CAAE;AAEvE,UAAM,UAAU,SAAS,MAAM;AAC7B,aAAO,MAAM,OAAO,OAAO,WAAWC,QAAU,MAAM;AAAA,IACxD,CAAC;AAED,UAAM,gBAAgB,SAAS,MAAM;AACnC,UAAI,CAAC,YAAY,MAAM,OAAQ,QAAO;AACtC,YAAM,eAAe,YAAY,MAAM,OAAO,CAAC,KAAK,UAAU,OAAO,MAAM,YAAY,IAAI,CAAC;AAC5F,aAAO,eAAe,YAAY;AAAA,IACpC,CAAC;AAGD,UAAM,aAAa,CAAC,eAAe;AACjC,UAAI,CAAC,WAAY,QAAO;AACxB,aAAO,IAAI,KAAK,UAAU,EAAE,mBAAmB,SAAS;AAAA,QACtD,MAAM;AAAA,QACN,OAAO;AAAA,QACP,KAAK;AAAA,MACT,CAAG;AAAA,IACH;AAEA,UAAM,iBAAiB,CAAC,YAAY;AAClC,UAAI,CAAC,QAAS,QAAO;AACrB,YAAM,IAAI,KAAK,MAAM,UAAU,IAAI;AACnC,YAAM,IAAI,KAAK,MAAO,UAAU,OAAQ,EAAE;AAC1C,YAAM,IAAI,KAAK,MAAM,UAAU,EAAE;AAEjC,UAAI,IAAI,GAAG;AACT,eAAO,GAAG,CAAC,IAAI,EAAE,SAAQ,EAAG,SAAS,GAAG,GAAG,CAAC,IAAI,EAAE,SAAQ,EAAG,SAAS,GAAG,GAAG,CAAC;AAAA,MAC/E;AACA,aAAO,GAAG,CAAC,IAAI,EAAE,SAAQ,EAAG,SAAS,GAAG,GAAG,CAAC;AAAA,IAC9C;AAEA,UAAM,eAAe,CAAC,QAAQ;AAC5B,UAAI,CAAC,IAAK,QAAO;AACjB,UAAI,OAAO,KAAS;AAClB,gBAAQ,MAAM,KAAS,QAAQ,CAAC,IAAI;AAAA,MACtC,WAAW,OAAO,KAAM;AACtB,gBAAQ,MAAM,KAAM,QAAQ,CAAC,IAAI;AAAA,MACnC;AACA,aAAO,IAAI,SAAQ;AAAA,IACrB;AAGA,UAAM,YAAY,MAAM;AACtB,UAAI,YAAY,SAAS,YAAY,MAAM,SAAS,GAAG;AACrDC,kBAAc,SAAS,YAAY,KAAK;AAAA,MAC1C;AAAA,IACF;AAEA,UAAM,cAAc,MAAM;AACxB,UAAI,YAAY,SAAS,YAAY,MAAM,SAAS,GAAG;AACrD,cAAM,WAAW,CAAC,GAAG,YAAY,KAAK,EAAE,KAAK,MAAM,KAAK,OAAM,IAAK,GAAG;AACtEA,kBAAc,SAAS,QAAQ;AAAA,MACjC;AAAA,IACF;AAEA,UAAM,iBAAiB,MAAM;AAC3B,iBAAW,QAAQ,CAAC,WAAW;AAAA,IAEjC;AAEA,UAAM,qBAAqB,CAAC,aAAa;AACvC,YAAM,QAAQ,gBAAgB,MAAM,QAAQ,QAAQ;AACpD,UAAI,QAAQ,IAAI;AACd,wBAAgB,MAAM,OAAO,OAAO,CAAC;AAAA,MACvC,OAAO;AACL,wBAAgB,MAAM,KAAK,QAAQ;AAAA,MACrC;AAAA,IAEF;AAEA,UAAM,aAAa,MAAM;AACvB,UAAI,YAAY,MAAM,SAAS,GAAG;AAChC,oBAAY,MAAM,QAAQ,WAAS;AACjCA,oBAAc,WAAW,KAAK;AAAA,QAChC,CAAC;AACD,qBAAa,QAAQ;AAAA,MACvB;AAAA,IACF;AAEA,UAAM,YAAY,MAAM;AACtB,aAAO,KAAK,EAAE,MAAM,cAAc,QAAQ,EAAE,KAAK,MAAM,MAAM,IAAG,EAAE,CAAE;AAAA,IACtE;AAEA,UAAM,cAAc,YAAY;AAC9B,UAAI,QAAQ,6CAA6C,GAAG;AAC1D,YAAI;AACF,gBAAMC,QAAc,YAAY,MAAM,MAAM,GAAG;AAC/C,iBAAO,KAAK,EAAE,MAAM,gBAAe,CAAE;AAAA,QACvC,SAAS,OAAO;AACd,kBAAQ,MAAM,2BAA2B,KAAK;AAAA,QAChD;AAAA,MACF;AAAA,IACF;AAEA,UAAM,WAAW,MAAM;AACrB,gBAAU,UAAU,UAAU,OAAO,SAAS,IAAI;AAClD,mBAAa,QAAQ;AAAA,IACvB;AAGA,UAAM,iBAAiB,YAAY;AACjC,UAAI;AACF,cAAMA,QAAc,gBAAgB,MAAM,OAAO,GAAG;AAGpD,YAAI,MAAM,OAAO,SAAS,QAAQ;AAChC,gBAAM,YAAY,MAAM,MAAM,QAAQ,IAAI,OAAK,EAAE,GAAG;AACpD,gBAAM,SAAS,MAAMA,QAAc,YAAY;AAAA,YAC7C,QAAQ,EAAE,KAAK,UAAS;AAAA,YACxB,QAAQ;AAAA,YACR,UAAU;AAAA,YACV,OAAO;AAAA,UACf,CAAO;AAGD,qBAAW,QAAQ,OAAO,OAAO,OAAK,EAAE,QAAQ,MAAM,MAAM,GAAG,EAAE,MAAM,GAAG,CAAC;AAAA,QAC7E;AAAA,MACF,SAAS,OAAO;AACd,gBAAQ,MAAM,8BAA8B,KAAK;AAAA,MACnD;AAAA,IACF;AAGA,cAAU,YAAY;AACpB,YAAM,cAAc;AAEpB,YAAM,eAAc;AAEpB,gBAAU,QAAQ;AAClB,YAAM,aAAa;AAAA,IACrB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"Album.vue.js","sources":["../../../../../../../src/modules/music/components/pages/Album.vue"],"sourcesContent":["<!-- components/pages/Album.vue -->\n<template>\n <div class=\"album-page pd-small\">\n <!-- Loading -->\n <div v-if=\"isLoading\" class=\"w-100 h-25r flex-center flex\">\n <Loader />\n </div>\n \n <!-- Not Found -->\n <div v-if=\"hasLoaded && !album\" class=\"t-center pd-big\">\n <h2 class=\"\">Album not found</h2>\n <p class=\"t-transp t-medium\">The album you're looking for doesn't exist or has been removed.</p>\n </div>\n \n <!-- Album Content -->\n <div v-if=\"album\" class=\"album-content cols-2-fit-content mobile:cols-1 gap-big\">\n <!-- Left Column - Cover & Stats -->\n <div class=\"pos-sticky pos-t-0 mobile:pos-relative album-cover-section\">\n <!-- Cover -->\n <Media \n :url=\"album.coverArt || '/logo/logo-placeholder.jpg'\"\n :alt=\"album.title\"\n class=\"aspect-1x1 w-100 w-max-30r mn-b-small radius-medium o-hidden\"\n />\n <!-- Quick Stats -->\n <div class=\"stats-grid grid cols-2 gap-small\">\n <div class=\"stat-card bg-light pd-medium radius-medium t-center\">\n <div class=\" mn-b-thin\">{{ album.totalTracks || 0 }}</div>\n <div class=\"t-small t-transp t-uppercase\">Tracks</div>\n </div>\n <div class=\"stat-card bg-light pd-medium radius-medium t-center\">\n <div class=\" mn-b-thin\">{{ formatNumber(album.views) }}</div>\n <div class=\"t-small t-transp t-uppercase\">Views</div>\n </div>\n </div>\n </div>\n\n <!-- Right Column - Album Details -->\n <div class=\"album-details-section\">\n <!-- Album Type Badge -->\n <div class=\"flex items-center gap-small mn-b-small\">\n <span class=\"bg-light t-medium pd-thin radius-thin uppercase t-small t-uppercase\">\n {{ album.type }}\n </span>\n <span v-if=\"album.status === 'published'\" class=\"bg-light t-medium pd-thin radius-thin uppercase t-small t-uppercase\">\n Published\n </span>\n </div>\n\n <!-- Album Title -->\n <h1 class=\"h1 mn-b-medium\">{{ album.title }}</h1>\n\n <!-- Action Buttons -->\n <div class=\"flex gap-small mn-b-medium\">\n <Button\n @click=\"playAlbum\"\n color=\"primary\"\n size=\"medium\"\n class=\"flex-1 t-white bg-black radius-thin flex-center gap-thin\"\n >\n <IconPlay fill=\"rgb(var(--white))\" class=\"i-medium\" />\n Play All\n </Button>\n\n <Button\n @click=\"shufflePlay\"\n color=\"primary\"\n size=\"medium\"\n class=\"flex-1 bg-light radius-thin flex-center gap-thin\"\n >\n <IconShuffle class=\"i-medium\" />\n Shuffle\n </Button>\n\n <Button\n @click=\"toggleFavorite\"\n color=\"primary\"\n size=\"medium\"\n class=\"flex-1 bg-light radius-thin flex-center gap-thin\"\n >\n <IconLike class=\"i-medium\" :fill=\"isFavorite ? 'rgb(var(--main)':'rgb(var(--black)'\" />\n {{isFavorite ? 'Liked' : 'Like'}}\n </Button>\n\n <Dropdown :label=\"{component: IconEllipsis, class: 'bg-light radius-thin pd-thin i-big' }\" v-model=\"showDropdown\" class=\"relative\">\n <template #trigger>\n <Button color=\"transp\" size=\"medium\" class=\"w-3r h-3r radius-full\">\n <IconEllipsis class=\"w-1-25r h-1-25r\" />\n </Button>\n </template>\n <template #default>\n <div class=\"dropdown-menu bg-white pd-small radius-medium shadow-big mn-t-thin\">\n <Button @click=\"addToQueue\" color=\"transp\" size=\"small\" class=\"w-100 justify-start\">\n Add to Queue\n </Button>\n <Button @click=\"copyLink\" color=\"transp\" size=\"small\" class=\"w-100 justify-start\">\n Copy Link\n </Button>\n <Button @click=\"addToPlaylist\" color=\"transp\" size=\"small\" class=\"w-100 justify-start\">\n Add to Playlist\n </Button>\n <template v-if=\"isOwner\">\n <hr class=\"mn-v-thin border-dark-transp-10\" />\n <Button @click=\"editAlbum\" color=\"transp\" size=\"small\" class=\"w-100 justify-start\">\n Edit Album\n </Button>\n <Button @click=\"deleteAlbum\" color=\"danger\" size=\"small\" class=\"w-100 justify-start\">\n Delete Album\n </Button>\n </template>\n </div>\n </template>\n </Dropdown>\n </div>\n\n <!-- Artists Cards -->\n <div class=\"artists-section mn-b-medium\">\n <h3 class=\"t-medium mn-b-small\" v-if=\"album.artists\">Artists</h3>\n <div class=\"flex flex-column gap-small\">\n <ArtistCardSmall \n v-for=\"artist in album.artists\" \n :key=\"artist._id\"\n :artist=\"artist\"\n :is-following=\"followedArtists.includes(artist._id)\"\n :show-follow-button=\"!isOwner\"\n @toggle-follow=\"toggleFollowArtist\"\n />\n </div>\n </div>\n\n <!-- Metadata Cards -->\n <h3 class=\"t-medium mn-b-small\">Metadata</h3>\n <div class=\"metadata-grid grid cols-2 gap-small mn-b-medium\">\n <!-- Release Date -->\n <div class=\"metadata-card bg-light pd-medium radius-medium flex items-center gap-medium\">\n <IconCalendar class=\"i-regular t-primary\" />\n <div>\n <div class=\"t-small t-transp t-uppercase\">Released</div>\n <div class=\"t-medium \">{{ formatDate(album.releaseDate) }}</div>\n </div>\n </div>\n\n <!-- Total Duration -->\n <div class=\"metadata-card bg-light pd-medium radius-medium flex items-center gap-medium\">\n <IconClock class=\"i-regular t-primary\" />\n <div>\n <div class=\"t-small t-transp t-uppercase\">Duration</div>\n <div class=\"t-medium \">{{ totalDuration }}</div>\n </div>\n </div>\n\n <!-- Label -->\n <div v-if=\"album.label\" class=\"metadata-card bg-light pd-medium radius-medium flex items-center gap-medium\">\n <IconDisc class=\"i-regular t-primary\" />\n <div>\n <div class=\"t-small t-transp t-uppercase\">Label</div>\n <div class=\"t-medium \">{{ album.label }}</div>\n </div>\n </div>\n\n <!-- Visibility -->\n <div class=\"metadata-card bg-light pd-medium radius-medium flex items-center gap-medium\">\n <IconEye class=\"i-regular t-primary\" />\n <div>\n <div class=\"t-small t-transp t-uppercase\">Visibility</div>\n <div class=\"t-medium \">{{ album.isPublic ? 'Public' : 'Private' }}</div>\n </div>\n </div>\n </div>\n\n <!-- Genres & Tags -->\n <div v-if=\"(album.genres && album.genres.length) || (album.tags && album.tags.length)\" class=\"tags-section mn-b-medium\">\n <h3 class=\"t-medium mn-b-small\">Genres & Tags</h3>\n <div class=\"flex gap-thin flex-wrap\">\n <span \n v-for=\"genre in album.genres\" \n :key=\"genre\"\n class=\"tag bg-main t-medium pd-thin radius-thin t-small cursor-pointer\"\n >\n {{ genre }}\n </span>\n <span \n v-for=\"tag in album.tags\" \n :key=\"tag\"\n class=\"tag bg-light t-transp pd-thin-big radius-small t-small hover-bg-light cursor-pointer\"\n >\n #{{ tag }}\n </span>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Album Tracks -->\n <section v-if=\"!isLoading && album && albumTracks.length\" class=\"tracks-section mn-t-big\">\n <h2 class=\"h2 mn-b-medium\">Tracklist</h2>\n <Feed\n :store=\"{\n read: () => Promise.resolve(albumTracks),\n state: { isLoading: false }\n }\"\n :external=\"true\"\n :items=\"albumTracks\"\n :states=\"{\n empty: {\n title: 'No tracks in album',\n description: 'This album appears to be empty',\n class: 'pd-medium t-center'\n }\n }\"\n >\n <template #default=\"{ items }\">\n <div class=\"bg-light radius-medium o-hidden\">\n <TrackListCard\n v-for=\"(track, index) in items\"\n :key=\"track._id\"\n :track=\"track\"\n :index=\"index + 1\"\n :showAlbum=\"false\"\n :showCover=\"false\"\n />\n </div>\n </template>\n </Feed>\n </section>\n\n <!-- More from Artists -->\n <section v-if=\"!isLoading && album && moreAlbums.length\" class=\"more-albums-section mn-t-big\">\n <div class=\"flex justify-between items-center mn-b-medium\">\n <h2 class=\"h2\">More Albums</h2>\n <router-link \n v-if=\"album.artists && album.artists[0]\"\n :to=\"{ name: 'artist', params: { url: album.artists[0].url } }\" \n class=\"t-primary hover-opacity\"\n >\n See all\n </router-link>\n </div>\n <div class=\"flex flex-nowrap gap-small o-x-scroll overscroll-behavior-x-contain scroll-behavior-smooth scroll-snap-type-x-mandatory scroll-hide\"\n >\n <li v-for=\"relatedAlbum in moreAlbums\" :key=\"album._id\" class=\"flex-none scroll-snap-align-start\">\n <AlbumCard :album=\"relatedAlbum\" class=\"w-min-15r transition-cubic-in-out\" />\n </li>\n </div>\n </section>\n </div>\n</template>\n\n<script setup>\nimport { ref, computed, onMounted, watch } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport Button from '@martyrs/src/components/Button/Button.vue';\nimport Loader from '@martyrs/src/components/Loader/Loader.vue';\nimport Media from '@martyrs/src/components/Media/Media.vue';\nimport Dropdown from '@martyrs/src/components/Dropdown/Dropdown.vue';\nimport Feed from '@martyrs/src/components/Feed/Feed.vue';\n\n// Icons\nimport IconPlay from '@martyrs/src/modules/icons/navigation/IconPlay.vue';\nimport IconLike from '@martyrs/src/modules/icons/navigation/IconLike.vue';\nimport IconEllipsis from '@martyrs/src/modules/icons/navigation/IconEllipsis.vue';\nimport IconShuffle from '@martyrs/src/modules/icons/navigation/IconShuffle.vue';\nimport IconCalendar from '@martyrs/src/modules/icons/entities/IconCalendar.vue';\nimport IconClock from '@martyrs/src/modules/icons/entities/IconTime.vue';\nimport IconEye from '@martyrs/src/modules/icons/actions/IconShow.vue';\nimport IconDisc from '@martyrs/src/modules/icons/entities/IconMusic.vue';\nimport IconVerified from '@martyrs/src/modules/icons/navigation/IconCheckmark.vue';\n\n// Components\nimport TrackListCard from '../cards/TrackListCard.vue';\nimport AlbumCard from '../cards/AlbumCard.vue';\nimport ArtistCardSmall from '../cards/ArtistCardSmall.vue';\n\n// Store\nimport { state as albumsState, actions as albumsActions } from '../../store/albums.js';\nimport { actions as playerActions } from '../../store/player.js';\nimport { state as authState } from '@martyrs/src/modules/auth/views/store/auth.js';\n\nconst route = useRoute();\nconst router = useRouter();\n\n// Emits\nconst emits = defineEmits(['page-loading', 'page-loaded']);\n\n// State\nconst hasLoaded = ref(false);\nconst isFavorite = ref(false);\nconst showDropdown = ref(false);\nconst followedArtists = ref([]);\nconst moreAlbums = ref([]);\n\n// Clear state\nalbumsState.currentAlbum = null;\nalbumsState.currentAlbumTracks = [];\n\n// Computed\nconst album = computed(() => albumsState.currentAlbum);\nconst albumTracks = computed(() => albumsState.currentAlbumTracks || []);\n\nconst isOwner = computed(() => {\n return album.value?.owner?.target === authState.user?._id;\n});\n\nconst totalDuration = computed(() => {\n if (!albumTracks.value.length) return '0:00';\n const totalSeconds = albumTracks.value.reduce((sum, track) => sum + (track.duration || 0), 0);\n return formatDuration(totalSeconds);\n});\n\n// Format helpers\nconst formatDate = (dateString) => {\n if (!dateString) return 'Unknown';\n return new Date(dateString).toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'long',\n day: 'numeric'\n });\n};\n\nconst formatDuration = (seconds) => {\n if (!seconds) return '0:00';\n const h = Math.floor(seconds / 3600);\n const m = Math.floor((seconds % 3600) / 60);\n const s = Math.floor(seconds % 60);\n \n if (h > 0) {\n return `${h}:${m.toString().padStart(2, '0')}:${s.toString().padStart(2, '0')}`;\n }\n return `${m}:${s.toString().padStart(2, '0')}`;\n};\n\nconst formatNumber = (num) => {\n if (!num) return '0';\n if (num >= 1000000) {\n return (num / 1000000).toFixed(1) + 'M';\n } else if (num >= 1000) {\n return (num / 1000).toFixed(1) + 'K';\n }\n return num.toString();\n};\n\n// Actions\nconst playAlbum = () => {\n if (albumTracks.value && albumTracks.value.length > 0) {\n playerActions.setQueue(albumTracks.value);\n }\n};\n\nconst shufflePlay = () => {\n if (albumTracks.value && albumTracks.value.length > 0) {\n const shuffled = [...albumTracks.value].sort(() => Math.random() - 0.5);\n playerActions.setQueue(shuffled);\n }\n};\n\nconst toggleFavorite = () => {\n isFavorite.value = !isFavorite.value;\n // TODO: Implement actual saving\n};\n\nconst toggleFollowArtist = (artistId) => {\n const index = followedArtists.value.indexOf(artistId);\n if (index > -1) {\n followedArtists.value.splice(index, 1);\n } else {\n followedArtists.value.push(artistId);\n }\n // TODO: Implement actual following\n};\n\nconst addToQueue = () => {\n if (albumTracks.value.length > 0) {\n albumTracks.value.forEach(track => {\n playerActions.addToQueue(track);\n });\n showDropdown.value = false;\n }\n};\n\nconst editAlbum = () => {\n router.push({ name: 'album-edit', params: { url: album.value.url } });\n};\n\nconst deleteAlbum = async () => {\n if (confirm('Are you sure you want to delete this album?')) {\n try {\n await albumsActions.deleteAlbum(album.value._id);\n router.push({ name: 'music-library' });\n } catch (error) {\n console.error('Failed to delete album:', error);\n }\n }\n};\n\nconst copyLink = () => {\n navigator.clipboard.writeText(window.location.href);\n showDropdown.value = false;\n};\n\n// Data fetching\nconst fetchAlbumData = async () => {\n try {\n await albumsActions.fetchAlbumByUrl(route.params.url);\n \n // Fetch more albums from the same artists\n if (album.value?.artists?.length) {\n const artistIds = album.value.artists.map(a => a._id);\n const albums = await albumsActions.fetchAlbums({\n artist: { $in: artistIds },\n status: 'published',\n isPublic: true,\n limit: 6\n });\n \n // Filter out current album\n moreAlbums.value = albums.filter(a => a._id !== album.value._id).slice(0, 5);\n }\n } catch (error) {\n console.error('Error fetching album data:', error);\n }\n};\n\n// Lifecycle\nonMounted(async () => {\n emits('page-loading');\n \n await fetchAlbumData();\n \n hasLoaded.value = true;\n emits('page-loaded');\n});\n</script>\n\n<style scoped>\n</style>"],"names":["albumsState","authState","playerActions","albumsActions"],"mappings":"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"}
@@ -3,7 +3,7 @@ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toString
3
3
  const vue = require("vue");
4
4
  const vueRouter = require("vue-router");
5
5
  const Button = require("../../../../components/Button/Button.vue.cjs");
6
- ;/* empty css */
6
+ ;/* empty css */
7
7
  const TrackListCard = require("../cards/TrackListCard.vue.cjs");
8
8
  const artists = require("../../store/artists.cjs");
9
9
  const auth = require("../../../auth/views/store/auth.cjs");
@@ -1,7 +1,7 @@
1
1
  import { ref, computed, onMounted, createElementBlock, openBlock, createCommentVNode, createElementVNode, createVNode, unref, withCtx, createTextVNode, normalizeStyle, normalizeClass, toDisplayString, Fragment, renderList, createBlock } from "vue";
2
2
  import { useRouter, useRoute } from "vue-router";
3
3
  import _sfc_main$1 from "../../../../components/Button/Button.vue.js";
4
- /* empty css */
4
+ /* empty css */
5
5
  import _sfc_main$2 from "../cards/TrackListCard.vue.js";
6
6
  import { state, actions } from "../../store/artists.js";
7
7
  import { state as state$1 } from "../../../auth/views/store/auth.js";
@@ -3,7 +3,7 @@ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toString
3
3
  const vue = require("vue");
4
4
  const vueRouter = require("vue-router");
5
5
  const Button = require("../../../../components/Button/Button.vue.cjs");
6
- ;/* empty css */
6
+ ;/* empty css */
7
7
  const Media = require("../../../../components/Media/Media.vue.cjs");
8
8
  const Dropdown = require("../../../../components/Dropdown/Dropdown.vue2.cjs");
9
9
  const Feed = require("../../../../components/Feed/Feed.vue.cjs");
@@ -54,7 +54,7 @@ const _hoisted_15 = { class: "h1 mn-b-medium" };
54
54
  const _hoisted_16 = { class: "flex gap-small mn-b-medium" };
55
55
  const _hoisted_17 = { class: "dropdown-menu bg-white pd-small radius-medium shadow-big mn-t-thin" };
56
56
  const _hoisted_18 = { class: "artists-section mn-b-medium" };
57
- const _hoisted_19 = { class: "flex flex-col gap-small" };
57
+ const _hoisted_19 = { class: "flex flex-column gap-small" };
58
58
  const _hoisted_20 = {
59
59
  key: 0,
60
60
  class: "collaborators-section mn-b-big"