@saooti/octopus-sdk 42.0.4 → 42.0.5

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 (1062) hide show
  1. package/dist/AccessibilityModal-Bk-lyxlI.mjs +119 -0
  2. package/dist/AccessibilityModal-Bk-lyxlI.mjs.map +1 -0
  3. package/dist/AccessibilityModal-DqRtmHwG.mjs.map +1 -0
  4. package/dist/AdsProgressBar-B6Mi09W8.mjs +28 -0
  5. package/dist/AdsProgressBar-B6Mi09W8.mjs.map +1 -0
  6. package/dist/AdsProgressBar-CAP7Zj--.mjs.map +1 -0
  7. package/dist/AdvancedSearch-CVglkFkt.mjs.map +1 -0
  8. package/dist/AdvancedSearch-D6vwfxo5.mjs +317 -0
  9. package/dist/AdvancedSearch-D6vwfxo5.mjs.map +1 -0
  10. package/dist/AdvancedSearch-DINUCkA8.mjs.map +1 -0
  11. package/dist/AdvancedSearch-XvvmHfah.mjs.map +1 -0
  12. package/dist/AmazonMusicIcon-BbyyRbP4.mjs +49 -0
  13. package/dist/AmazonMusicIcon-BbyyRbP4.mjs.map +1 -0
  14. package/dist/AmazonMusicIcon-D5vNh4HG.mjs.map +1 -0
  15. package/dist/ApplePodcastIcon-Cq5SSyRm.mjs +51 -0
  16. package/dist/ApplePodcastIcon-Cq5SSyRm.mjs.map +1 -0
  17. package/dist/ApplePodcastIcon-DtC4TS8H.mjs.map +1 -0
  18. package/dist/CategoryChooser-DWEL9V5p.mjs.map +1 -0
  19. package/dist/CategoryChooser-DklLXzrz.mjs +216 -0
  20. package/dist/CategoryChooser-DklLXzrz.mjs.map +1 -0
  21. package/dist/CategoryFilter-BYG8Fnzn.mjs.map +1 -0
  22. package/dist/CategoryFilter-Bg279Zhp.mjs.map +1 -0
  23. package/dist/CategoryFilter-CmS3Ny_9.mjs +205 -0
  24. package/dist/CategoryFilter-CmS3Ny_9.mjs.map +1 -0
  25. package/dist/CategoryList-CfMKagU8.mjs +153 -0
  26. package/dist/CategoryList-CfMKagU8.mjs.map +1 -0
  27. package/dist/CategoryList-CtYJ1Otd.mjs.map +1 -0
  28. package/dist/CategoryList-fb__vBIZ.mjs.map +1 -0
  29. package/dist/CategoryPage-BXpFZSoD.mjs.map +1 -0
  30. package/dist/CategoryPage-CjFCzM5T.mjs.map +1 -0
  31. package/dist/CategoryPage-D8ZeqW_O.mjs +41 -0
  32. package/dist/CategoryPage-D8ZeqW_O.mjs.map +1 -0
  33. package/dist/CategoryPage-DOpUFF1y.mjs.map +1 -0
  34. package/dist/CategorySearchFilter-1oMd2Mm5.mjs +54 -0
  35. package/dist/CategorySearchFilter-1oMd2Mm5.mjs.map +1 -0
  36. package/dist/CategorySearchFilter-CEGWqMSt.mjs.map +1 -0
  37. package/dist/ChapteringModal-Bj_VrtB1.mjs.map +1 -0
  38. package/dist/ChapteringModal-C35ILBs7.mjs +64 -0
  39. package/dist/ChapteringModal-C35ILBs7.mjs.map +1 -0
  40. package/dist/ChapteringModal-CN-qJH9j.mjs.map +1 -0
  41. package/dist/CheckIdentityModal-4XD5uK5v.mjs.map +1 -0
  42. package/dist/CheckIdentityModal-RQYssX9o.mjs.map +1 -0
  43. package/dist/CheckIdentityModal-ekQqQKIU.mjs +62 -0
  44. package/dist/CheckIdentityModal-ekQqQKIU.mjs.map +1 -0
  45. package/dist/ChooseEpisodesNumber-BbsEFK07.mjs +50 -0
  46. package/dist/ChooseEpisodesNumber-BbsEFK07.mjs.map +1 -0
  47. package/dist/ChooseEpisodesNumber-OlhXXsCa.mjs.map +1 -0
  48. package/dist/ClassicAccordion-H690GTb-.mjs +87 -0
  49. package/dist/ClassicAccordion-H690GTb-.mjs.map +1 -0
  50. package/dist/ClassicAccordion-S0e-IhFa.mjs.map +1 -0
  51. package/dist/ClassicAlert-D51F43qS.mjs +57 -0
  52. package/dist/ClassicAlert-D51F43qS.mjs.map +1 -0
  53. package/dist/ClassicAlert-DUQplMvs.mjs.map +1 -0
  54. package/dist/ClassicBigChip-BbWdjK3W.mjs.map +1 -0
  55. package/dist/ClassicBigChip-CMefjO08.mjs.map +1 -0
  56. package/dist/ClassicBigChip-CaUJ5EI5.mjs +33 -0
  57. package/dist/ClassicBigChip-CaUJ5EI5.mjs.map +1 -0
  58. package/dist/ClassicCheckbox-BHKCPtLR.mjs.map +1 -0
  59. package/dist/ClassicCheckbox-CqA5WUGc.mjs +113 -0
  60. package/dist/ClassicCheckbox-CqA5WUGc.mjs.map +1 -0
  61. package/dist/ClassicContentEditable-BSsnA6oo.mjs.map +1 -0
  62. package/dist/ClassicContentEditable-R2O8-zPZ.mjs +52 -0
  63. package/dist/ClassicContentEditable-R2O8-zPZ.mjs.map +1 -0
  64. package/dist/ClassicCopyButton-M9AP3MKD.mjs.map +1 -0
  65. package/dist/ClassicCopyButton-y5PyWjLR.mjs +69 -0
  66. package/dist/ClassicCopyButton-y5PyWjLR.mjs.map +1 -0
  67. package/dist/ClassicDatePicker-CS5ufjLj.mjs +226 -0
  68. package/dist/ClassicDatePicker-CS5ufjLj.mjs.map +1 -0
  69. package/dist/ClassicDatePicker-DWVn4oHu.mjs.map +1 -0
  70. package/dist/ClassicEmojiPicker-BJeHH_oM.mjs +74 -0
  71. package/dist/ClassicEmojiPicker-BJeHH_oM.mjs.map +1 -0
  72. package/dist/ClassicEmojiPicker-EQy5H_zL.mjs.map +1 -0
  73. package/dist/ClassicHelpButton-B6jXpEKT.mjs.map +1 -0
  74. package/dist/ClassicHelpButton-DkCQoPpA.mjs +57 -0
  75. package/dist/ClassicHelpButton-DkCQoPpA.mjs.map +1 -0
  76. package/dist/ClassicInputText-B7EAwP2N.mjs.map +1 -0
  77. package/dist/ClassicInputText-adAE0MPy.mjs +335 -0
  78. package/dist/ClassicInputText-adAE0MPy.mjs.map +1 -0
  79. package/dist/ClassicLazy-7mFHxG6O.mjs.map +1 -0
  80. package/dist/ClassicLazy-DKgiCdDI.mjs +92 -0
  81. package/dist/ClassicLazy-DKgiCdDI.mjs.map +1 -0
  82. package/dist/ClassicLoading-Crlw7cAx.mjs.map +1 -0
  83. package/dist/ClassicLoading-DZLIyuUd.mjs +52 -0
  84. package/dist/ClassicLoading-DZLIyuUd.mjs.map +1 -0
  85. package/dist/ClassicModal-CilwHp9p.mjs.map +1 -0
  86. package/dist/ClassicModal-DbRPVcJr.mjs +87 -0
  87. package/dist/ClassicModal-DbRPVcJr.mjs.map +1 -0
  88. package/dist/ClassicModalInBody-BkaRcZZx.mjs.map +1 -0
  89. package/dist/ClassicModalInBody-Dq9PBoaB.mjs +77 -0
  90. package/dist/ClassicModalInBody-Dq9PBoaB.mjs.map +1 -0
  91. package/dist/ClassicMultiselect-BEY-HpGk.mjs.map +1 -0
  92. package/dist/ClassicMultiselect-wJ9U_4b2.mjs +246 -0
  93. package/dist/ClassicMultiselect-wJ9U_4b2.mjs.map +1 -0
  94. package/dist/ClassicNav-Dvm8faD9.mjs.map +1 -0
  95. package/dist/ClassicNav-P2h4OFEY.mjs +65 -0
  96. package/dist/ClassicNav-P2h4OFEY.mjs.map +1 -0
  97. package/dist/ClassicPopover-BIyLKorz.mjs.map +1 -0
  98. package/dist/ClassicPopover-Bk5kf37e.mjs +261 -0
  99. package/dist/ClassicPopover-Bk5kf37e.mjs.map +1 -0
  100. package/dist/ClassicRadio-BwylgGYF.mjs.map +1 -0
  101. package/dist/ClassicRadio-Dr6od5uM.mjs +78 -0
  102. package/dist/ClassicRadio-Dr6od5uM.mjs.map +1 -0
  103. package/dist/ClassicRadioLabel-DIij8S-y.mjs +86 -0
  104. package/dist/ClassicRadioLabel-DIij8S-y.mjs.map +1 -0
  105. package/dist/ClassicRadioLabel-ynBzFxC2.mjs.map +1 -0
  106. package/dist/ClassicSearch-BPWOTzhw.mjs +76 -0
  107. package/dist/ClassicSearch-BPWOTzhw.mjs.map +1 -0
  108. package/dist/ClassicSearch-D5yT0JRA.mjs.map +1 -0
  109. package/dist/ClassicSelect-BaY2yvwP.mjs.map +1 -0
  110. package/dist/ClassicSelect-BeCuKMad.mjs +138 -0
  111. package/dist/ClassicSelect-BeCuKMad.mjs.map +1 -0
  112. package/dist/ClassicSpinner-CL99QR-h.mjs +39 -0
  113. package/dist/ClassicSpinner-CL99QR-h.mjs.map +1 -0
  114. package/dist/ClassicSpinner-lNq7TnmD.mjs.map +1 -0
  115. package/dist/ClassicTabs-Bcine4_p.mjs.map +1 -0
  116. package/dist/ClassicTabs-sNP268jp.mjs +52 -0
  117. package/dist/ClassicTabs-sNP268jp.mjs.map +1 -0
  118. package/dist/ClassicTagInput-DrIZVI0X.mjs +82 -0
  119. package/dist/ClassicTagInput-DrIZVI0X.mjs.map +1 -0
  120. package/dist/ClassicTagInput-HM3VUbHp.mjs.map +1 -0
  121. package/dist/ClassicWysiwyg-BKq8ExjM.mjs.map +1 -0
  122. package/dist/ClassicWysiwyg-CRx5L0lR.mjs +200 -0
  123. package/dist/ClassicWysiwyg-CRx5L0lR.mjs.map +1 -0
  124. package/dist/ClipboardModal-DcUIqJGT.mjs +64 -0
  125. package/dist/ClipboardModal-DcUIqJGT.mjs.map +1 -0
  126. package/dist/ClipboardModal-MJw-Q5H5.mjs.map +1 -0
  127. package/dist/ClipboardModal-VRWz6S2A.mjs.map +1 -0
  128. package/dist/CommentBasicView-BIiF59xV.mjs.map +1 -0
  129. package/dist/CommentBasicView-CmDziW-M.mjs +103 -0
  130. package/dist/CommentBasicView-CmDziW-M.mjs.map +1 -0
  131. package/dist/CommentInput-BH-j4xYE.mjs.map +1 -0
  132. package/dist/CommentInput-CCpv7RF8.mjs +150 -0
  133. package/dist/CommentInput-CCpv7RF8.mjs.map +1 -0
  134. package/dist/CommentInput-DOuugk5A.mjs.map +1 -0
  135. package/dist/CommentItem-B1wXPEZZ.mjs +194 -0
  136. package/dist/CommentItem-B1wXPEZZ.mjs.map +1 -0
  137. package/dist/CommentItem-DuJsZoIk.mjs.map +1 -0
  138. package/dist/CommentItem-XLeueLaZ.mjs.map +1 -0
  139. package/dist/CommentList-ByBLWHYE.mjs.map +1 -0
  140. package/dist/CommentList-CIoNgXiD.mjs.map +1 -0
  141. package/dist/CommentList-dSoD09Di.mjs +262 -0
  142. package/dist/CommentList-dSoD09Di.mjs.map +1 -0
  143. package/dist/CommentMoreActions-CnczLaid.mjs +248 -0
  144. package/dist/CommentMoreActions-CnczLaid.mjs.map +1 -0
  145. package/dist/CommentMoreActions-CyEIOrzQ.mjs.map +1 -0
  146. package/dist/CommentMoreActions-X9tC_I0A.mjs.map +1 -0
  147. package/dist/CommentName-CkGKXK3_.mjs +73 -0
  148. package/dist/CommentName-CkGKXK3_.mjs.map +1 -0
  149. package/dist/CommentName-rapSs0fp.mjs.map +1 -0
  150. package/dist/CommentName-sabBJAA8.mjs.map +1 -0
  151. package/dist/CommentParentInfo-CQXTtdBn.mjs.map +1 -0
  152. package/dist/CommentParentInfo-D3nI0C85.mjs.map +1 -0
  153. package/dist/CommentParentInfo-J1vHOCm3.mjs +47 -0
  154. package/dist/CommentParentInfo-J1vHOCm3.mjs.map +1 -0
  155. package/dist/CommentPlayer-70dIz2Rg.mjs +67 -0
  156. package/dist/CommentPlayer-70dIz2Rg.mjs.map +1 -0
  157. package/dist/CommentPlayer-BVhVIPgD.mjs.map +1 -0
  158. package/dist/CommentPlayer-Cfa-z5qQ.mjs.map +1 -0
  159. package/dist/CommentSection-2kJz9TRg.mjs.map +1 -0
  160. package/dist/CommentSection-Bz6q4N6d.mjs +113 -0
  161. package/dist/CommentSection-Bz6q4N6d.mjs.map +1 -0
  162. package/dist/CommentSection-DRpvhHqB.mjs.map +1 -0
  163. package/dist/CommentStore-BFkEAz_S.mjs.map +1 -0
  164. package/dist/CommentStore-BjQ0AGHa.mjs +355 -0
  165. package/dist/CommentStore-BjQ0AGHa.mjs.map +1 -0
  166. package/dist/ContractPreviewModal-DhoEBsqo.mjs +75 -0
  167. package/dist/ContractPreviewModal-DhoEBsqo.mjs.map +1 -0
  168. package/dist/ContractPreviewModal-DjCwrq7e.mjs.map +1 -0
  169. package/dist/ContractPreviewModal-Dqyo5xUg.mjs.map +1 -0
  170. package/dist/CountDown-CAUtA0Vp.mjs.map +1 -0
  171. package/dist/CountDown-Ce0nxiby.mjs +28 -0
  172. package/dist/CountDown-Ce0nxiby.mjs.map +1 -0
  173. package/dist/CountdownOctopus-CR9zvBmW.mjs +34 -0
  174. package/dist/CountdownOctopus-CR9zvBmW.mjs.map +1 -0
  175. package/dist/CountdownOctopus-i6-l0aLA.mjs.map +1 -0
  176. package/dist/DateFilter-DD9cY_la.mjs.map +1 -0
  177. package/dist/DateFilter-DkU1MSa-.mjs +101 -0
  178. package/dist/DateFilter-DkU1MSa-.mjs.map +1 -0
  179. package/dist/DeezerIcon-BUdIKeqN.mjs.map +1 -0
  180. package/dist/DeezerIcon-D4cq4iPQ.mjs +49 -0
  181. package/dist/DeezerIcon-D4cq4iPQ.mjs.map +1 -0
  182. package/dist/DownloadPodcastButton-C5jl5QoM.mjs.map +1 -0
  183. package/dist/DownloadPodcastButton-Cbtq6s60.mjs.map +1 -0
  184. package/dist/DownloadPodcastButton-DLMz5Siw.mjs +39 -0
  185. package/dist/DownloadPodcastButton-DLMz5Siw.mjs.map +1 -0
  186. package/dist/EditCommentModal-3jlBtPco.mjs.map +1 -0
  187. package/dist/EditCommentModal-B5xc_AC2.mjs.map +1 -0
  188. package/dist/EditCommentModal-_iEit4p4.mjs +134 -0
  189. package/dist/EditCommentModal-_iEit4p4.mjs.map +1 -0
  190. package/dist/EditFtpIcon-D5VaHXWl.mjs.map +1 -0
  191. package/dist/EditFtpIcon-Do2G7rmM.mjs +47 -0
  192. package/dist/EditFtpIcon-Do2G7rmM.mjs.map +1 -0
  193. package/dist/EmissionGroupChooser-CQ6wTihw.mjs.map +1 -0
  194. package/dist/EmissionGroupChooser-D3xCu4tW.mjs +55 -0
  195. package/dist/EmissionGroupChooser-D3xCu4tW.mjs.map +1 -0
  196. package/dist/EmissionGroupChooser-DheKnUrA.mjs.map +1 -0
  197. package/dist/EmissionInlineList-CPgw-_jC.mjs +129 -0
  198. package/dist/EmissionInlineList-CPgw-_jC.mjs.map +1 -0
  199. package/dist/EmissionInlineList-CeCcnsfP.mjs.map +1 -0
  200. package/dist/EmissionInlineList-DD5tKHdg.mjs.map +1 -0
  201. package/dist/EmissionItem-Cl53in7H.mjs +144 -0
  202. package/dist/EmissionItem-Cl53in7H.mjs.map +1 -0
  203. package/dist/EmissionItem-DO1G4P7I.mjs.map +1 -0
  204. package/dist/EmissionItem-Dyamdgqm.mjs.map +1 -0
  205. package/dist/EmissionItem-NQh_dIN1.mjs.map +1 -0
  206. package/dist/EmissionList-CNizEXC9.mjs.map +1 -0
  207. package/dist/EmissionList-D4DFhKPt.mjs +286 -0
  208. package/dist/EmissionList-D4DFhKPt.mjs.map +1 -0
  209. package/dist/EmissionList-DfhK6dgl.mjs.map +1 -0
  210. package/dist/EmissionList-JEE2Remj.mjs.map +1 -0
  211. package/dist/EmissionPage-B1OhP9b5.mjs.map +1 -0
  212. package/dist/EmissionPage-B3fju1Sc.mjs +247 -0
  213. package/dist/EmissionPage-B3fju1Sc.mjs.map +1 -0
  214. package/dist/EmissionPage-Cizyfg77.mjs.map +1 -0
  215. package/dist/EmissionPage-Dq4ECbbk.mjs.map +1 -0
  216. package/dist/EmissionPlayerItem-BzFck8k6.mjs +148 -0
  217. package/dist/EmissionPlayerItem-BzFck8k6.mjs.map +1 -0
  218. package/dist/EmissionPlayerItem-DhOuAEBr.mjs.map +1 -0
  219. package/dist/EmissionPlayerItem-DiM1VHun.mjs.map +1 -0
  220. package/dist/EmissionPresentationItem-CEjtj9mf.mjs +54 -0
  221. package/dist/EmissionPresentationItem-CEjtj9mf.mjs.map +1 -0
  222. package/dist/EmissionPresentationItem-DSCyFHjR.mjs.map +1 -0
  223. package/dist/EmissionPresentationItem-TpmURnni.mjs.map +1 -0
  224. package/dist/EmissionPresentationList-C80QlXif.mjs.map +1 -0
  225. package/dist/EmissionPresentationList-D1UcWrLn.mjs +104 -0
  226. package/dist/EmissionPresentationList-D1UcWrLn.mjs.map +1 -0
  227. package/dist/EmissionPresentationList-uApAVXPy.mjs.map +1 -0
  228. package/dist/EmissionsPage-B-Lgftdx.mjs.map +1 -0
  229. package/dist/EmissionsPage-CQm8C671.mjs +120 -0
  230. package/dist/EmissionsPage-CQm8C671.mjs.map +1 -0
  231. package/dist/EmissionsPage-CiV3jjrr.mjs.map +1 -0
  232. package/dist/EmissionsPage-Dop7rOfp.mjs.map +1 -0
  233. package/dist/Error403Page-8Z8InpBQ.mjs.map +1 -0
  234. package/dist/Error403Page-B4wfiYPh.mjs +56 -0
  235. package/dist/Error403Page-B4wfiYPh.mjs.map +1 -0
  236. package/dist/Error403Page-Du1eHk-4.mjs.map +1 -0
  237. package/dist/ErrorMessage-D2XAzxpC.mjs.map +1 -0
  238. package/dist/ErrorMessage-DcUdnqSU.mjs +33 -0
  239. package/dist/ErrorMessage-DcUdnqSU.mjs.map +1 -0
  240. package/dist/FooterGarSection-BlQXLOSL.mjs.map +1 -0
  241. package/dist/FooterGarSection-CFtIQW51.mjs.map +1 -0
  242. package/dist/FooterGarSection-DSu-iiPb.mjs +54 -0
  243. package/dist/FooterGarSection-DSu-iiPb.mjs.map +1 -0
  244. package/dist/FooterSection-CAGk8GmW.mjs +196 -0
  245. package/dist/FooterSection-CAGk8GmW.mjs.map +1 -0
  246. package/dist/FooterSection-CYVlRfnp.mjs.map +1 -0
  247. package/dist/FooterSection-LpLoB0-0.mjs.map +1 -0
  248. package/dist/GeneralStore-CUlq_NjO.mjs +45 -0
  249. package/dist/GeneralStore-CUlq_NjO.mjs.map +1 -0
  250. package/dist/HomeDropdown-DWCPphGw.mjs.map +1 -0
  251. package/dist/HomeDropdown-Dcyt9IM6.mjs +81 -0
  252. package/dist/HomeDropdown-Dcyt9IM6.mjs.map +1 -0
  253. package/dist/HomeDropdown-j5CLhQP9.mjs.map +1 -0
  254. package/dist/HomePage-D947-CtJ.mjs.map +1 -0
  255. package/dist/HomePage-DoZG25gj.mjs +142 -0
  256. package/dist/HomePage-DoZG25gj.mjs.map +1 -0
  257. package/dist/HomePage-DvbT5DWY.mjs.map +1 -0
  258. package/dist/HomePage-o7H3mupQ.mjs.map +1 -0
  259. package/dist/IHeartIcon-70F_rHQh.mjs.map +1 -0
  260. package/dist/IHeartIcon-D9X-Udgq.mjs +53 -0
  261. package/dist/IHeartIcon-D9X-Udgq.mjs.map +1 -0
  262. package/dist/LikeButton-DFkrvbgE.mjs.map +1 -0
  263. package/dist/LikeButton-gkh5hlOU.mjs +61 -0
  264. package/dist/LikeButton-gkh5hlOU.mjs.map +1 -0
  265. package/dist/LikeSection-BLrRZGlp.mjs +137 -0
  266. package/dist/LikeSection-BLrRZGlp.mjs.map +1 -0
  267. package/dist/LikeSection-DGKUdmkX.mjs.map +1 -0
  268. package/dist/LikeSection-no5OlBSF.mjs.map +1 -0
  269. package/dist/ListPaginate-BWWtCWZX.mjs +174 -0
  270. package/dist/ListPaginate-BWWtCWZX.mjs.map +1 -0
  271. package/dist/ListPaginate-DwmCOplg.mjs.map +1 -0
  272. package/dist/ListPaginate-QZ7t7y81.mjs.map +1 -0
  273. package/dist/LiveHorizontalList-BObeVsFj.mjs.map +1 -0
  274. package/dist/LiveHorizontalList-CDS6piq6.mjs +111 -0
  275. package/dist/LiveHorizontalList-CDS6piq6.mjs.map +1 -0
  276. package/dist/LiveHorizontalList-D_GkeFWa.mjs.map +1 -0
  277. package/dist/LiveHorizontalList-bMtchMkz.mjs.map +1 -0
  278. package/dist/LiveList-Bf2IwhCb.mjs +265 -0
  279. package/dist/LiveList-Bf2IwhCb.mjs.map +1 -0
  280. package/dist/LiveList-CLi1Bq0h.mjs.map +1 -0
  281. package/dist/LiveList-DZy0OfFl.mjs.map +1 -0
  282. package/dist/LiveList-uGUcdGMJ.mjs.map +1 -0
  283. package/dist/LivesPage-4xpcvJSQ.mjs.map +1 -0
  284. package/dist/LivesPage-BqEg0zT2.mjs.map +1 -0
  285. package/dist/LivesPage-CNPiAlnt.mjs.map +1 -0
  286. package/dist/LivesPage-CfYmRxnV.mjs +55 -0
  287. package/dist/LivesPage-CfYmRxnV.mjs.map +1 -0
  288. package/dist/MapPage-BDhnH1Kl.mjs.map +1 -0
  289. package/dist/MapPage-DjLcn4uk.mjs +276 -0
  290. package/dist/MapPage-DjLcn4uk.mjs.map +1 -0
  291. package/dist/MapPage-gETfgUu-.mjs.map +1 -0
  292. package/dist/MessageModal-B35dCbWB.mjs.map +1 -0
  293. package/dist/MessageModal-BWI3HTM0.mjs +116 -0
  294. package/dist/MessageModal-BWI3HTM0.mjs.map +1 -0
  295. package/dist/MobileMenu-B51ClvR4.mjs.map +1 -0
  296. package/dist/MobileMenu-BPtGG3Nt.mjs.map +1 -0
  297. package/dist/MobileMenu-CdvJhI_5.mjs +162 -0
  298. package/dist/MobileMenu-CdvJhI_5.mjs.map +1 -0
  299. package/dist/MonetizableFilter-BGQTUtwX.mjs.map +1 -0
  300. package/dist/MonetizableFilter-DOlNz4IP.mjs +66 -0
  301. package/dist/MonetizableFilter-DOlNz4IP.mjs.map +1 -0
  302. package/dist/NewsletterModal-3Hv1lNuN.mjs.map +1 -0
  303. package/dist/NewsletterModal-Cit-Ckrg.mjs.map +1 -0
  304. package/dist/NewsletterModal-Cq-ZW_Y_.mjs +64 -0
  305. package/dist/NewsletterModal-Cq-ZW_Y_.mjs.map +1 -0
  306. package/dist/OctopusMultiselect-CDijfV8W.mjs +325 -0
  307. package/dist/OctopusMultiselect-CDijfV8W.mjs.map +1 -0
  308. package/dist/OctopusMultiselect-tXNIWVpp.mjs.map +1 -0
  309. package/dist/OrganisationChooser-CH20oK8w.mjs +164 -0
  310. package/dist/OrganisationChooser-CH20oK8w.mjs.map +1 -0
  311. package/dist/OrganisationChooser-foPC-Rwo.mjs.map +1 -0
  312. package/dist/OrganisationChooser-m6bJKDBa.mjs.map +1 -0
  313. package/dist/OrganisationChooserLight-BGPuDaCx.mjs.map +1 -0
  314. package/dist/OrganisationChooserLight-DJHyYp6k.mjs.map +1 -0
  315. package/dist/OrganisationChooserLight-DqO0gfx7.mjs +63 -0
  316. package/dist/OrganisationChooserLight-DqO0gfx7.mjs.map +1 -0
  317. package/dist/PageLogout-Bc8zBpoo.mjs.map +1 -0
  318. package/dist/PageLogout-xQXWO2UF.mjs +21 -0
  319. package/dist/PageLogout-xQXWO2UF.mjs.map +1 -0
  320. package/dist/PageNotFound-BPFW-fzo.mjs.map +1 -0
  321. package/dist/PageNotFound-Dpv0tY-G.mjs +45 -0
  322. package/dist/PageNotFound-Dpv0tY-G.mjs.map +1 -0
  323. package/dist/PageNotFound-r_6Ei8S9.mjs.map +1 -0
  324. package/dist/PaginateParams-CbAaMAAM.mjs.map +1 -0
  325. package/dist/PaginateParams-CjJoKjUD.mjs +90 -0
  326. package/dist/PaginateParams-CjJoKjUD.mjs.map +1 -0
  327. package/dist/PaginateSection-BJ6iQai2.mjs.map +1 -0
  328. package/dist/PaginateSection-I875HiC5.mjs +184 -0
  329. package/dist/PaginateSection-I875HiC5.mjs.map +1 -0
  330. package/dist/ParticipantDescription-BsS6OEz9.mjs +57 -0
  331. package/dist/ParticipantDescription-BsS6OEz9.mjs.map +1 -0
  332. package/dist/ParticipantDescription-CwREwvZy.mjs.map +1 -0
  333. package/dist/ParticipantInlineList-BmE7OeIA.mjs.map +1 -0
  334. package/dist/ParticipantInlineList-C1BElB13.mjs +95 -0
  335. package/dist/ParticipantInlineList-C1BElB13.mjs.map +1 -0
  336. package/dist/ParticipantInlineList-DasTqo5z.mjs.map +1 -0
  337. package/dist/ParticipantItem-B3n9mXtJ.mjs +113 -0
  338. package/dist/ParticipantItem-B3n9mXtJ.mjs.map +1 -0
  339. package/dist/ParticipantItem-BOYW9dkV.mjs.map +1 -0
  340. package/dist/ParticipantItem-DiD5ANdf.mjs.map +1 -0
  341. package/dist/ParticipantPage-DI9J2hc9.mjs +161 -0
  342. package/dist/ParticipantPage-DI9J2hc9.mjs.map +1 -0
  343. package/dist/ParticipantPage-Dd0RQWvi.mjs.map +1 -0
  344. package/dist/ParticipantPage-DpEOyLsF.mjs.map +1 -0
  345. package/dist/ParticipantPage-KSNX-i8c.mjs.map +1 -0
  346. package/dist/ParticipantsPage-CC--r1ny.mjs.map +1 -0
  347. package/dist/ParticipantsPage-CVfRUkIM.mjs +215 -0
  348. package/dist/ParticipantsPage-CVfRUkIM.mjs.map +1 -0
  349. package/dist/ParticipantsPage-DF_C3M6I.mjs.map +1 -0
  350. package/dist/PlayVideoIcon-CQJTc1O7.mjs.map +1 -0
  351. package/dist/PlayVideoIcon-QfmloAS6.mjs +50 -0
  352. package/dist/PlayVideoIcon-QfmloAS6.mjs.map +1 -0
  353. package/dist/PlayerAnonymousModal-B_IyhbMR.mjs +67 -0
  354. package/dist/PlayerAnonymousModal-B_IyhbMR.mjs.map +1 -0
  355. package/dist/PlayerAnonymousModal-C_13dRO7.mjs.map +1 -0
  356. package/dist/PlayerAnonymousModal-DH3k1hXl.mjs.map +1 -0
  357. package/dist/PlayerCommonParameters-BF8-HN2S.mjs +32 -0
  358. package/dist/PlayerCommonParameters-BF8-HN2S.mjs.map +1 -0
  359. package/dist/PlayerCommonParameters-Dn-OIiO8.mjs.map +1 -0
  360. package/dist/PlayerCompact-BFLLRuDe.mjs.map +1 -0
  361. package/dist/PlayerCompact-DEeOaAfG.mjs.map +1 -0
  362. package/dist/PlayerCompact-DdCp2i_P.mjs +157 -0
  363. package/dist/PlayerCompact-DdCp2i_P.mjs.map +1 -0
  364. package/dist/PlayerComponent-BA2dlmRD.mjs.map +1 -0
  365. package/dist/PlayerComponent-CWtN6Je1.mjs +894 -0
  366. package/dist/PlayerComponent-CWtN6Je1.mjs.map +1 -0
  367. package/dist/PlayerComponent-im3MzRzo.mjs.map +1 -0
  368. package/dist/PlayerFmIcon-BGCKu8Y2.mjs +49 -0
  369. package/dist/PlayerFmIcon-BGCKu8Y2.mjs.map +1 -0
  370. package/dist/PlayerFmIcon-BxQ1g45P.mjs.map +1 -0
  371. package/dist/PlayerLarge-3OMY0_Tt.mjs.map +1 -0
  372. package/dist/PlayerLarge-BqjHyRf7.mjs.map +1 -0
  373. package/dist/PlayerLarge-I7FONG3B.mjs +153 -0
  374. package/dist/PlayerLarge-I7FONG3B.mjs.map +1 -0
  375. package/dist/PlayerParameters-fpNIoYO9.mjs.map +1 -0
  376. package/dist/PlayerParameters-y4IXdHiE.mjs +195 -0
  377. package/dist/PlayerParameters-y4IXdHiE.mjs.map +1 -0
  378. package/dist/PlayerPlayButton-Bm6Rp8bS.mjs +327 -0
  379. package/dist/PlayerPlayButton-Bm6Rp8bS.mjs.map +1 -0
  380. package/dist/PlayerPlayButton-DdIezDHQ.mjs.map +1 -0
  381. package/dist/PlayerPlayButton-T1Fr5nWh.mjs.map +1 -0
  382. package/dist/PlayerProgressBar-5jLv6Y7S.mjs.map +1 -0
  383. package/dist/PlayerProgressBar-8Q9iCyLs.mjs.map +1 -0
  384. package/dist/PlayerProgressBar-C38YCi9Z.mjs +75 -0
  385. package/dist/PlayerProgressBar-C38YCi9Z.mjs.map +1 -0
  386. package/dist/PlayerStore-BVK7ItEM.mjs.map +1 -0
  387. package/dist/PlayerStore-DB5dkc3c.mjs +230 -0
  388. package/dist/PlayerStore-DB5dkc3c.mjs.map +1 -0
  389. package/dist/PlayerVideo-Bud1rcxU.mjs +52 -0
  390. package/dist/PlayerVideo-Bud1rcxU.mjs.map +1 -0
  391. package/dist/PlayerVideo-CX3JS9bK.mjs.map +1 -0
  392. package/dist/PlayerVideo-D0mTmRCq.mjs.map +1 -0
  393. package/dist/PlayerVideoDigiteka-CiTtloWK.mjs +82 -0
  394. package/dist/PlayerVideoDigiteka-CiTtloWK.mjs.map +1 -0
  395. package/dist/PlayerVideoDigiteka-DjlfXgIZ.mjs.map +1 -0
  396. package/dist/PlayerVideoDigiteka-Dn3neAtr.mjs.map +1 -0
  397. package/dist/PlayerVideoHls-BJj1m924.mjs.map +1 -0
  398. package/dist/PlayerVideoHls-D909ECaY.mjs.map +1 -0
  399. package/dist/PlayerVideoHls-DjAlSV39.mjs +199 -0
  400. package/dist/PlayerVideoHls-DjAlSV39.mjs.map +1 -0
  401. package/dist/PlayerYoutubeEmbed-D0A4EWhU.mjs.map +1 -0
  402. package/dist/PlayerYoutubeEmbed-D5ZhaHbv.mjs +32 -0
  403. package/dist/PlayerYoutubeEmbed-D5ZhaHbv.mjs.map +1 -0
  404. package/dist/PlaylistPage-B-qoOMDN.mjs.map +1 -0
  405. package/dist/PlaylistPage-Botg5_jv.mjs.map +1 -0
  406. package/dist/PlaylistPage-C56-smtp.mjs.map +1 -0
  407. package/dist/PlaylistPage-aIWF8InW.mjs +180 -0
  408. package/dist/PlaylistPage-aIWF8InW.mjs.map +1 -0
  409. package/dist/PlaylistsPage-BSNE0BZ9.mjs.map +1 -0
  410. package/dist/PlaylistsPage-D2QbHMQu.mjs.map +1 -0
  411. package/dist/PlaylistsPage-Pnn895N-.mjs +322 -0
  412. package/dist/PlaylistsPage-Pnn895N-.mjs.map +1 -0
  413. package/dist/PocketCastIcon-Nm45VN7b.mjs.map +1 -0
  414. package/dist/PocketCastIcon-RfG93aY3.mjs +49 -0
  415. package/dist/PocketCastIcon-RfG93aY3.mjs.map +1 -0
  416. package/dist/PodcastAddictIcon-DRF7w4QM.mjs.map +1 -0
  417. package/dist/PodcastAddictIcon-v149CijV.mjs +52 -0
  418. package/dist/PodcastAddictIcon-v149CijV.mjs.map +1 -0
  419. package/dist/PodcastFilterList-CQ8vxYW7.mjs.map +1 -0
  420. package/dist/PodcastFilterList-CZzD028O.mjs.map +1 -0
  421. package/dist/PodcastFilterList-Khjz0Dny.mjs +179 -0
  422. package/dist/PodcastFilterList-Khjz0Dny.mjs.map +1 -0
  423. package/dist/PodcastFilterList-NSECjEDk.mjs.map +1 -0
  424. package/dist/PodcastImage-B-_N0gS4.mjs.map +1 -0
  425. package/dist/PodcastImage-BrfDAORW.mjs +148 -0
  426. package/dist/PodcastImage-BrfDAORW.mjs.map +1 -0
  427. package/dist/PodcastImage-DTrISr_U.mjs.map +1 -0
  428. package/dist/PodcastInlineList-BkHA9K7I.mjs +126 -0
  429. package/dist/PodcastInlineList-BkHA9K7I.mjs.map +1 -0
  430. package/dist/PodcastInlineList-Bq-uF-n4.mjs.map +1 -0
  431. package/dist/PodcastInlineList-DOkuKLLe.mjs.map +1 -0
  432. package/dist/PodcastInlineList-cWF3ymZw.mjs.map +1 -0
  433. package/dist/PodcastInlineListTemplate-BWUKzZU9.mjs.map +1 -0
  434. package/dist/PodcastInlineListTemplate-Bc479tGK.mjs.map +1 -0
  435. package/dist/PodcastInlineListTemplate-CiuRCR7t.mjs +206 -0
  436. package/dist/PodcastInlineListTemplate-CiuRCR7t.mjs.map +1 -0
  437. package/dist/PodcastIsPlaying-B2uIZI7V.mjs.map +1 -0
  438. package/dist/PodcastIsPlaying-DEviEW23.mjs +21 -0
  439. package/dist/PodcastIsPlaying-DEviEW23.mjs.map +1 -0
  440. package/dist/PodcastIsPlaying-DzzRwggt.mjs.map +1 -0
  441. package/dist/PodcastItem-6qkOg90q.mjs +213 -0
  442. package/dist/PodcastItem-6qkOg90q.mjs.map +1 -0
  443. package/dist/PodcastItem-DLD5hfk7.mjs.map +1 -0
  444. package/dist/PodcastItem-ltLOqm-_.mjs.map +1 -0
  445. package/dist/PodcastItem-naoxNwra.mjs.map +1 -0
  446. package/dist/PodcastList-5vFekv1m.mjs.map +1 -0
  447. package/dist/PodcastList-B60tYB2G.mjs.map +1 -0
  448. package/dist/PodcastList-B9xZlEH4.mjs +152 -0
  449. package/dist/PodcastList-B9xZlEH4.mjs.map +1 -0
  450. package/dist/PodcastList-BYBjpOL8.mjs.map +1 -0
  451. package/dist/PodcastList-BuDcObSr.mjs.map +1 -0
  452. package/dist/PodcastList-DQanN0Bb.mjs.map +1 -0
  453. package/dist/PodcastList-gdQbPtGY.mjs +234 -0
  454. package/dist/PodcastList-gdQbPtGY.mjs.map +1 -0
  455. package/dist/PodcastList-jCzCt_eR.mjs.map +1 -0
  456. package/dist/PodcastPage-B5WpXRPn.mjs.map +1 -0
  457. package/dist/PodcastPage-BFjlYZGL.mjs.map +1 -0
  458. package/dist/PodcastPage-BUlluWvM.mjs.map +1 -0
  459. package/dist/PodcastPage-D3aBkgdA.mjs +585 -0
  460. package/dist/PodcastPage-D3aBkgdA.mjs.map +1 -0
  461. package/dist/PodcastPlannedSpinner-BJDQ4VPx.mjs +20 -0
  462. package/dist/PodcastPlannedSpinner-BJDQ4VPx.mjs.map +1 -0
  463. package/dist/PodcastPlannedSpinner-BN7unEqf.mjs.map +1 -0
  464. package/dist/PodcastPlayBar-BotWFQoJ.mjs.map +1 -0
  465. package/dist/PodcastPlayBar-C7pDzmXr.mjs +65 -0
  466. package/dist/PodcastPlayBar-C7pDzmXr.mjs.map +1 -0
  467. package/dist/PodcastPlayBar-Dc71_DSn.mjs.map +1 -0
  468. package/dist/PodcastPlayBasicButton-9u92vEzq.mjs.map +1 -0
  469. package/dist/PodcastPlayBasicButton-BRbHFpVR.mjs +52 -0
  470. package/dist/PodcastPlayBasicButton-BRbHFpVR.mjs.map +1 -0
  471. package/dist/PodcastPlayBasicButton-Ds_kg-b1.mjs.map +1 -0
  472. package/dist/PodcastPlayButton-CMaudNx5.mjs +203 -0
  473. package/dist/PodcastPlayButton-CMaudNx5.mjs.map +1 -0
  474. package/dist/PodcastPlayButton-RjnyBBYO.mjs.map +1 -0
  475. package/dist/PodcastPlayButton-TpwW09jp.mjs.map +1 -0
  476. package/dist/PodcastPlaylistInlineList-BLAD7cMN.mjs.map +1 -0
  477. package/dist/PodcastPlaylistInlineList-BllOtctp.mjs +82 -0
  478. package/dist/PodcastPlaylistInlineList-BllOtctp.mjs.map +1 -0
  479. package/dist/PodcastPlaylistInlineList-CSITiCoX.mjs.map +1 -0
  480. package/dist/PodcastPlaylistInlineList-kO0naL9A.mjs.map +1 -0
  481. package/dist/PodcastPresentationList-BcKJ9XZ7.mjs +152 -0
  482. package/dist/PodcastPresentationList-BcKJ9XZ7.mjs.map +1 -0
  483. package/dist/PodcastPresentationList-CRCO4abw.mjs.map +1 -0
  484. package/dist/PodcastPresentationList-CSWhzlnX.mjs.map +1 -0
  485. package/dist/PodcastProgressBar-Ctp0I77F.mjs.map +1 -0
  486. package/dist/PodcastProgressBar-Dih-EtLn.mjs.map +1 -0
  487. package/dist/PodcastProgressBar-xAMieMIt.mjs +80 -0
  488. package/dist/PodcastProgressBar-xAMieMIt.mjs.map +1 -0
  489. package/dist/PodcastRawTranscript-BbCPFt3l.mjs.map +1 -0
  490. package/dist/PodcastRawTranscript-CdKhzP8l.mjs +146 -0
  491. package/dist/PodcastRawTranscript-CdKhzP8l.mjs.map +1 -0
  492. package/dist/PodcastRawTranscript-Cp0XSlnz.mjs.map +1 -0
  493. package/dist/PodcastRubriqueList-BGiDpOsb.mjs.map +1 -0
  494. package/dist/PodcastRubriqueList-BqhnhoEz.mjs +65 -0
  495. package/dist/PodcastRubriqueList-BqhnhoEz.mjs.map +1 -0
  496. package/dist/PodcastRubriqueList-CPaVKHY5.mjs.map +1 -0
  497. package/dist/PodcastSeasonInfo-BwD--f9z.mjs +37 -0
  498. package/dist/PodcastSeasonInfo-BwD--f9z.mjs.map +1 -0
  499. package/dist/PodcastSeasonInfo-DL_CsYTY.mjs.map +1 -0
  500. package/dist/PodcastSwiperList-C2H-uWk9.mjs.map +1 -0
  501. package/dist/PodcastSwiperList-CY2NOyCN.mjs.map +1 -0
  502. package/dist/PodcastSwiperList-Cj4G10ln.mjs.map +1 -0
  503. package/dist/PodcastSwiperList-DI-90c4F.mjs +191 -0
  504. package/dist/PodcastSwiperList-DI-90c4F.mjs.map +1 -0
  505. package/dist/PodcastmakerHeader-BubtZY7u.mjs.map +1 -0
  506. package/dist/PodcastmakerHeader-CURC8nyy.mjs.map +1 -0
  507. package/dist/PodcastmakerHeader-DLy0YSgm.mjs +46 -0
  508. package/dist/PodcastmakerHeader-DLy0YSgm.mjs.map +1 -0
  509. package/dist/PodcastsPage-CYG8bXaW.mjs.map +1 -0
  510. package/dist/PodcastsPage-DZlGTlaX.mjs +135 -0
  511. package/dist/PodcastsPage-DZlGTlaX.mjs.map +1 -0
  512. package/dist/PodcastsPage-PTwwATNT.mjs.map +1 -0
  513. package/dist/PodcastsPage-dOgLCDY5.mjs.map +1 -0
  514. package/dist/PresentationLayout-BWueEtST.mjs +70 -0
  515. package/dist/PresentationLayout-BWueEtST.mjs.map +1 -0
  516. package/dist/PresentationLayout-BmcVqEo8.mjs.map +1 -0
  517. package/dist/ProductorSearch-Bp7S8Sut.mjs.map +1 -0
  518. package/dist/ProductorSearch-ir5rkehT.mjs +132 -0
  519. package/dist/ProductorSearch-ir5rkehT.mjs.map +1 -0
  520. package/dist/ProductorSearch-yQPCj7Pa.mjs.map +1 -0
  521. package/dist/ProgressBar-B6z6oHHm.mjs.map +1 -0
  522. package/dist/ProgressBar-DLbzpY3L.mjs.map +1 -0
  523. package/dist/ProgressBar-ubd7c7H0.mjs +135 -0
  524. package/dist/ProgressBar-ubd7c7H0.mjs.map +1 -0
  525. package/dist/QrCode-BR3jPdJS.mjs +140 -0
  526. package/dist/QrCode-BR3jPdJS.mjs.map +1 -0
  527. package/dist/QrCode-C7IL9c3c.mjs.map +1 -0
  528. package/dist/QrCode-D86qgrdm.mjs.map +1 -0
  529. package/dist/QrCodeModal-9PCWJenP.mjs.map +1 -0
  530. package/dist/QrCodeModal-Cf1O9nwT.mjs.map +1 -0
  531. package/dist/QrCodeModal-DnREe0Jk.mjs +48 -0
  532. package/dist/QrCodeModal-DnREe0Jk.mjs.map +1 -0
  533. package/dist/RadioCurrently-BNzaJNoY.mjs +89 -0
  534. package/dist/RadioCurrently-BNzaJNoY.mjs.map +1 -0
  535. package/dist/RadioCurrently-Bz4kKaGc.mjs.map +1 -0
  536. package/dist/RadioCurrently-COaGoNF8.mjs.map +1 -0
  537. package/dist/RadioHistory-B_PBz6hY.mjs.map +1 -0
  538. package/dist/RadioHistory-DMGTXE4V.mjs +116 -0
  539. package/dist/RadioHistory-DMGTXE4V.mjs.map +1 -0
  540. package/dist/RadioHistory-Yhqmee1d.mjs.map +1 -0
  541. package/dist/RadioImage-B5jrzD8s.mjs.map +1 -0
  542. package/dist/RadioImage-BgrUZZIa.mjs +66 -0
  543. package/dist/RadioImage-BgrUZZIa.mjs.map +1 -0
  544. package/dist/RadioImage-D2MFmuqR.mjs.map +1 -0
  545. package/dist/RadioList-Bab4Pj9m.mjs.map +1 -0
  546. package/dist/RadioList-Bh8ub58m.mjs +95 -0
  547. package/dist/RadioList-Bh8ub58m.mjs.map +1 -0
  548. package/dist/RadioList-Ctbf98I9.mjs.map +1 -0
  549. package/dist/RadioPage-BY7YU_yL.mjs.map +1 -0
  550. package/dist/RadioPage-BtsGEI5i.mjs +105 -0
  551. package/dist/RadioPage-BtsGEI5i.mjs.map +1 -0
  552. package/dist/RadioPage-DtS3r-48.mjs.map +1 -0
  553. package/dist/RadioPlanning-B-sRUVGb.mjs.map +1 -0
  554. package/dist/RadioPlanning-D2RNEdEQ.mjs.map +1 -0
  555. package/dist/RadioPlanning-DMighzUU.mjs +257 -0
  556. package/dist/RadioPlanning-DMighzUU.mjs.map +1 -0
  557. package/dist/RadioProgressBar-4MT37o9a.mjs.map +1 -0
  558. package/dist/RadioProgressBar-CiapCPN-.mjs +47 -0
  559. package/dist/RadioProgressBar-CiapCPN-.mjs.map +1 -0
  560. package/dist/RadioProgressBar-DrxSXvmY.mjs.map +1 -0
  561. package/dist/RadiolineIcon-CIePjE9k.mjs.map +1 -0
  562. package/dist/RadiolineIcon-QP88nzG8.mjs +50 -0
  563. package/dist/RadiolineIcon-QP88nzG8.mjs.map +1 -0
  564. package/dist/RecaptchaModal-BThWkUuj.mjs.map +1 -0
  565. package/dist/RecaptchaModal-BkETInqb.mjs.map +1 -0
  566. package/dist/RecaptchaModal-DlThDzSF.mjs +119 -0
  567. package/dist/RecaptchaModal-DlThDzSF.mjs.map +1 -0
  568. package/dist/ReportAbuseModal-BfYBle6z.mjs.map +1 -0
  569. package/dist/ReportAbuseModal-Bnhfpowa.mjs.map +1 -0
  570. package/dist/ReportAbuseModal-Pd8P9tNB.mjs +107 -0
  571. package/dist/ReportAbuseModal-Pd8P9tNB.mjs.map +1 -0
  572. package/dist/RightsIndicator-COEtdoj_.mjs.map +1 -0
  573. package/dist/RightsIndicator-CZtSrb5K.mjs.map +1 -0
  574. package/dist/RightsIndicator-DNmA3L9O.mjs.map +1 -0
  575. package/dist/RightsIndicator-DYhqEbAB.mjs +69 -0
  576. package/dist/RightsIndicator-DYhqEbAB.mjs.map +1 -0
  577. package/dist/RightsWrapper-BHIinXXL.mjs.map +1 -0
  578. package/dist/RightsWrapper-CewAJoDY.mjs.map +1 -0
  579. package/dist/RightsWrapper-Cz5TnSUC.mjs +164 -0
  580. package/dist/RightsWrapper-Cz5TnSUC.mjs.map +1 -0
  581. package/dist/RubriqueChoice-BN4nirmx.mjs +120 -0
  582. package/dist/RubriqueChoice-BN4nirmx.mjs.map +1 -0
  583. package/dist/RubriqueChoice-BxmZoBZL.mjs.map +1 -0
  584. package/dist/RubriqueChoice-C4rglHV1.mjs.map +1 -0
  585. package/dist/RubriqueChooser-BceFw2x2.mjs.map +1 -0
  586. package/dist/RubriqueChooser-BgIvDDv7.mjs +213 -0
  587. package/dist/RubriqueChooser-BgIvDDv7.mjs.map +1 -0
  588. package/dist/RubriqueFilter-BwBU4kpV.mjs +168 -0
  589. package/dist/RubriqueFilter-BwBU4kpV.mjs.map +1 -0
  590. package/dist/RubriqueFilter-C7lAoJNq.mjs.map +1 -0
  591. package/dist/RubriqueFilter-CKF-seUZ.mjs.map +1 -0
  592. package/dist/RubriqueFilter-oDd4AytG.mjs.map +1 -0
  593. package/dist/RubriqueList-Cr0vXMew.mjs.map +1 -0
  594. package/dist/RubriqueList-D2PPns3m.mjs +169 -0
  595. package/dist/RubriqueList-D2PPns3m.mjs.map +1 -0
  596. package/dist/RubriqueList-zHKQE6OL.mjs.map +1 -0
  597. package/dist/RubriquePage-2ITwxYLr.mjs.map +1 -0
  598. package/dist/RubriquePage-Bpt2wwjK.mjs.map +1 -0
  599. package/dist/RubriquePage-CFrQ5Hw-.mjs +86 -0
  600. package/dist/RubriquePage-CFrQ5Hw-.mjs.map +1 -0
  601. package/dist/RubriquePage-Cf9QJQJB.mjs.map +1 -0
  602. package/dist/SearchOrder-CJ0Fj6Wd.mjs.map +1 -0
  603. package/dist/SearchOrder-CLl5slg5.mjs +70 -0
  604. package/dist/SearchOrder-CLl5slg5.mjs.map +1 -0
  605. package/dist/SearchPage-BopqRW_4.mjs.map +1 -0
  606. package/dist/SearchPage-BskiH0Hg.mjs +58 -0
  607. package/dist/SearchPage-BskiH0Hg.mjs.map +1 -0
  608. package/dist/SearchPage-D0Tz8ELe.mjs.map +1 -0
  609. package/dist/SearchPage-DLj9zYeL.mjs.map +1 -0
  610. package/dist/ShareAnonymous-B16PsWEJ.mjs +249 -0
  611. package/dist/ShareAnonymous-B16PsWEJ.mjs.map +1 -0
  612. package/dist/ShareAnonymous-CBVGRI6L.mjs.map +1 -0
  613. package/dist/ShareAnonymous-DmDaW3PH.mjs.map +1 -0
  614. package/dist/ShareModalPlayer-BV_1CKus.mjs.map +1 -0
  615. package/dist/ShareModalPlayer-SIkm_vpv.mjs.map +1 -0
  616. package/dist/ShareModalPlayer-lGW9vRFS.mjs +111 -0
  617. package/dist/ShareModalPlayer-lGW9vRFS.mjs.map +1 -0
  618. package/dist/ShareNewsletter-BigVU8EV.mjs.map +1 -0
  619. package/dist/ShareNewsletter-CRQBK_3P.mjs +181 -0
  620. package/dist/ShareNewsletter-CRQBK_3P.mjs.map +1 -0
  621. package/dist/ShareNewsletter-CleivWOu.mjs.map +1 -0
  622. package/dist/SharePlayer-CGlvYVn4.mjs.map +1 -0
  623. package/dist/SharePlayer-CSKYsE9H.mjs.map +1 -0
  624. package/dist/SharePlayer-Cdjz1NrC.mjs +319 -0
  625. package/dist/SharePlayer-Cdjz1NrC.mjs.map +1 -0
  626. package/dist/SharePlayerColors-D-9MoYm6.mjs.map +1 -0
  627. package/dist/SharePlayerColors-p_LreBcc.mjs +61 -0
  628. package/dist/SharePlayerColors-p_LreBcc.mjs.map +1 -0
  629. package/dist/SharePlayerRadio-BJBbDNn5.mjs.map +1 -0
  630. package/dist/SharePlayerRadio-DbHw7Vcn.mjs +99 -0
  631. package/dist/SharePlayerRadio-DbHw7Vcn.mjs.map +1 -0
  632. package/dist/SharePlayerRadio-OMXyRc4D.mjs.map +1 -0
  633. package/dist/SharePlayerTypes-BTWxUJWi.mjs +206 -0
  634. package/dist/SharePlayerTypes-BTWxUJWi.mjs.map +1 -0
  635. package/dist/SharePlayerTypes-C2_JNU6C.mjs.map +1 -0
  636. package/dist/SharePlayerTypes-DBERUe0_.mjs.map +1 -0
  637. package/dist/ShareSocialsButtons-Bwh9bMoR.mjs +132 -0
  638. package/dist/ShareSocialsButtons-Bwh9bMoR.mjs.map +1 -0
  639. package/dist/ShareSocialsButtons-CMOEQdYB.mjs.map +1 -0
  640. package/dist/ShareSocialsButtons-D0b8OawP.mjs.map +1 -0
  641. package/dist/SimpleLayout-BRjk598k.mjs.map +1 -0
  642. package/dist/SimpleLayout-D9uJF7mS.mjs +28 -0
  643. package/dist/SimpleLayout-D9uJF7mS.mjs.map +1 -0
  644. package/dist/SimpleLayout-b-QQv5aQ.mjs.map +1 -0
  645. package/dist/SmartLinkPage-CSTfusv3.mjs.map +1 -0
  646. package/dist/SmartLinkPage-CeGDzza8.mjs +187 -0
  647. package/dist/SmartLinkPage-CeGDzza8.mjs.map +1 -0
  648. package/dist/SmartLinkPage-DGRvD-vv.mjs.map +1 -0
  649. package/dist/SnackBar-DdE1dYhi.mjs.map +1 -0
  650. package/dist/SnackBar-jRnNt--Z.mjs +150 -0
  651. package/dist/SnackBar-jRnNt--Z.mjs.map +1 -0
  652. package/dist/SubscribeButtons-CHsq-Vk7.mjs +160 -0
  653. package/dist/SubscribeButtons-CHsq-Vk7.mjs.map +1 -0
  654. package/dist/SubscribeButtons-CJhlLSWX.mjs.map +1 -0
  655. package/dist/SubscribeButtons-ChrHIXBv.mjs.map +1 -0
  656. package/dist/SwiperList-BKiF8jIc.mjs +170 -0
  657. package/dist/SwiperList-BKiF8jIc.mjs.map +1 -0
  658. package/dist/SwiperList-BoALb00d.mjs.map +1 -0
  659. package/dist/SwiperList-DBmjvvCX.mjs.map +1 -0
  660. package/dist/TagList-BECg0vNz.mjs.map +1 -0
  661. package/dist/TagList-DRJvO9Gr.mjs.map +1 -0
  662. package/dist/TagList-DiGc-7Rj.mjs +110 -0
  663. package/dist/TagList-DiGc-7Rj.mjs.map +1 -0
  664. package/dist/TagPage-Bn2cVKpN.mjs.map +1 -0
  665. package/dist/TagPage-C9x5XWOd.mjs.map +1 -0
  666. package/dist/TagPage-DchdAQV2.mjs.map +1 -0
  667. package/dist/TagPage-Vd8JH7-r.mjs +99 -0
  668. package/dist/TagPage-Vd8JH7-r.mjs.map +1 -0
  669. package/dist/TopBar-B20_SqNY.mjs.map +1 -0
  670. package/dist/TopBar-DRclhhd6.mjs.map +1 -0
  671. package/dist/TopBar-FHuZ4j9H.mjs +358 -0
  672. package/dist/TopBar-FHuZ4j9H.mjs.map +1 -0
  673. package/dist/TuninIcon-BplDWgtD.mjs.map +1 -0
  674. package/dist/TuninIcon-SHr7Y1qJ.mjs +49 -0
  675. package/dist/TuninIcon-SHr7Y1qJ.mjs.map +1 -0
  676. package/dist/UserButtonContent-B-AMExwJ.mjs.map +1 -0
  677. package/dist/UserButtonContent-Btivzl2V.mjs.map +1 -0
  678. package/dist/UserButtonContent-I7ahjnuS.mjs +163 -0
  679. package/dist/UserButtonContent-I7ahjnuS.mjs.map +1 -0
  680. package/dist/VastStore-BPwOrXvb.mjs +80 -0
  681. package/dist/VastStore-BPwOrXvb.mjs.map +1 -0
  682. package/dist/VideoModuleBox-Bw0xu9_f.mjs.map +1 -0
  683. package/dist/VideoModuleBox-C8zDhbqA.mjs.map +1 -0
  684. package/dist/VideoModuleBox-Cl6YoznO.mjs +70 -0
  685. package/dist/VideoModuleBox-Cl6YoznO.mjs.map +1 -0
  686. package/dist/VideoPage-B-lgTFnX.mjs.map +1 -0
  687. package/dist/VideoPage-B5Tp2PMs.mjs +222 -0
  688. package/dist/VideoPage-B5Tp2PMs.mjs.map +1 -0
  689. package/dist/VideoPage-X3dZyaQH.mjs.map +1 -0
  690. package/dist/XIcon-DAVMitPh.mjs +49 -0
  691. package/dist/XIcon-DAVMitPh.mjs.map +1 -0
  692. package/dist/XIcon-Dz4rI_Hd.mjs.map +1 -0
  693. package/dist/_plugin-vue_export-helper-BOaGB7Aw.mjs +8 -0
  694. package/dist/aggregatorsApi-hyFtV8aL.mjs.map +1 -0
  695. package/dist/api-tznrp2lH.mjs.map +1 -0
  696. package/dist/apiUtils-D4ULJJbh.mjs.map +1 -0
  697. package/dist/buttons-cdGcewjB.mjs.map +1 -0
  698. package/dist/buttons-kyb_6P3e.mjs.map +1 -0
  699. package/dist/buttons-uGrbDDaA.mjs +113 -0
  700. package/dist/buttons-uGrbDDaA.mjs.map +1 -0
  701. package/dist/classicApi-BKNiWOG4.mjs +1790 -0
  702. package/dist/classicApi-BKNiWOG4.mjs.map +1 -0
  703. package/dist/classicApi-DC7iamat.mjs.map +1 -0
  704. package/dist/config-C73GMJpz.mjs +9 -0
  705. package/dist/config-C73GMJpz.mjs.map +1 -0
  706. package/dist/cookiesHelper-BQksSais.mjs +23 -0
  707. package/dist/cookiesHelper-BQksSais.mjs.map +1 -0
  708. package/dist/displayHelper-CpXshNzz.mjs +22 -0
  709. package/dist/displayHelper-CpXshNzz.mjs.map +1 -0
  710. package/dist/domHelper-DTMIrMbs.mjs +15 -0
  711. package/dist/domHelper-DTMIrMbs.mjs.map +1 -0
  712. package/dist/downloadHelper-CWLRMcjc.mjs +36 -0
  713. package/dist/downloadHelper-CWLRMcjc.mjs.map +1 -0
  714. package/dist/downloadHelper-DB969RNb.mjs.map +1 -0
  715. package/dist/educationen-B0PNsHqt.mjs +18 -0
  716. package/dist/educationen-B0PNsHqt.mjs.map +1 -0
  717. package/dist/educationfr-DnXyASTX.mjs +6 -0
  718. package/dist/educationfr-DnXyASTX.mjs.map +1 -0
  719. package/dist/emission-ByePXT9Y.mjs +33 -0
  720. package/dist/emission-ByePXT9Y.mjs.map +1 -0
  721. package/dist/emissionApi-WS6yl56a.mjs.map +1 -0
  722. package/dist/groupsApi-CecqFbyg.mjs.map +1 -0
  723. package/dist/i18n-l4HCrPF3.mjs.map +1 -0
  724. package/dist/icons-1GR2yFzw.mjs.map +1 -0
  725. package/dist/icons-B4eHXcRy.mjs +18 -0
  726. package/dist/icons-B4eHXcRy.mjs.map +1 -0
  727. package/dist/index.css +7208 -2
  728. package/dist/index.d.ts +1 -0
  729. package/dist/index.mjs +735 -408
  730. package/dist/index.mjs.map +1 -0
  731. package/dist/keys-TjlLYNQE.mjs +18 -0
  732. package/dist/keys-TjlLYNQE.mjs.map +1 -0
  733. package/dist/localisation-iXoGtJ3j.mjs +13 -0
  734. package/dist/localisation-iXoGtJ3j.mjs.map +1 -0
  735. package/dist/logo_saooti_play_black-BLx_RUuM.mjs +6 -0
  736. package/dist/logo_saooti_play_black-BLx_RUuM.mjs.map +1 -0
  737. package/dist/messages-Czjqh0tU.mjs +2679 -0
  738. package/dist/messages-Czjqh0tU.mjs.map +1 -0
  739. package/dist/organisation-CxyRYjC0.mjs +19 -0
  740. package/dist/organisation-CxyRYjC0.mjs.map +1 -0
  741. package/dist/ouest_france_logo-WOgdbVGH.mjs +6 -0
  742. package/dist/ouest_france_logo-WOgdbVGH.mjs.map +1 -0
  743. package/dist/playlistApi-LcxgQmJH.mjs.map +1 -0
  744. package/dist/podcast-Da9L7I5Q.mjs +76 -0
  745. package/dist/podcast-Da9L7I5Q.mjs.map +1 -0
  746. package/dist/podcastApi-5-MtD1l_.mjs.map +1 -0
  747. package/dist/rolldown-runtime-D7D4PA-g.mjs +13 -0
  748. package/dist/src/components/composable/usePresentationItem.d.ts +1 -1
  749. package/dist/src/i18n.d.ts +8 -1
  750. package/dist/src/locale/messages.d.ts +30 -0
  751. package/dist/src/stores/ParamSdkStore.d.ts +6 -1
  752. package/dist/src/stores/class/general/organisation.d.ts +2 -0
  753. package/dist/stringHelper-DFr4Khve.mjs +15 -0
  754. package/dist/stringHelper-DFr4Khve.mjs.map +1 -0
  755. package/dist/tests-mocks.mjs +16 -14
  756. package/dist/tests-mocks.mjs.map +1 -0
  757. package/dist/tests.mjs +86 -51
  758. package/dist/tests.mjs.map +1 -0
  759. package/dist/transcriptionApi-Drk3sv6J.mjs.map +1 -0
  760. package/dist/types-8roXR0of.mjs +11 -0
  761. package/dist/types-8roXR0of.mjs.map +1 -0
  762. package/dist/useAdvancedParamInit-Ci4c333p.mjs +162 -0
  763. package/dist/useAdvancedParamInit-Ci4c333p.mjs.map +1 -0
  764. package/dist/useAdvancedParamInit-CpNDHede.mjs.map +1 -0
  765. package/dist/useCountdown-DPweZzmz.mjs +51 -0
  766. package/dist/useCountdown-DPweZzmz.mjs.map +1 -0
  767. package/dist/useDayjs-BqojyoqU.mjs +32 -0
  768. package/dist/useDayjs-BqojyoqU.mjs.map +1 -0
  769. package/dist/useDayjs-zt5R5ZIe.mjs.map +1 -0
  770. package/dist/useErrorHandler-DNz9da5N.mjs +19 -0
  771. package/dist/useErrorHandler-DNz9da5N.mjs.map +1 -0
  772. package/dist/useErrorHandler-Nce0QKlB.mjs.map +1 -0
  773. package/dist/useImageProxy-B2vNJKgd.mjs +20 -0
  774. package/dist/useImageProxy-B2vNJKgd.mjs.map +1 -0
  775. package/dist/useImageProxy-C7wjiN0F.mjs.map +1 -0
  776. package/dist/useOrgaComputed-D8ikvtGw.mjs.map +1 -0
  777. package/dist/useOrgaComputed-T8Mhcne0.mjs +19 -0
  778. package/dist/useOrgaComputed-T8Mhcne0.mjs.map +1 -0
  779. package/dist/usePlayerLogicProgress-CSdUmqxN.mjs +108 -0
  780. package/dist/usePlayerLogicProgress-CSdUmqxN.mjs.map +1 -0
  781. package/dist/usePlayerLogicProgress-DnNbZCWg.mjs.map +1 -0
  782. package/dist/usePodcastView-BJw3J1sE.mjs.map +1 -0
  783. package/dist/usePodcastView-DR83HM0j.mjs +56 -0
  784. package/dist/usePodcastView-DR83HM0j.mjs.map +1 -0
  785. package/dist/usePresentationItem-BLUjp4Le.mjs.map +1 -0
  786. package/dist/usePresentationItem-C28KKH4P.mjs.map +1 -0
  787. package/dist/usePresentationItem-rJkFlZFu.mjs +144 -0
  788. package/dist/usePresentationItem-rJkFlZFu.mjs.map +1 -0
  789. package/dist/useResizePhone-CpfFUmfV.mjs +37 -0
  790. package/dist/useResizePhone-CpfFUmfV.mjs.map +1 -0
  791. package/dist/useRights-JVTbEOUh.mjs +276 -0
  792. package/dist/useRights-JVTbEOUh.mjs.map +1 -0
  793. package/dist/useRights-Z6_G-y4s.mjs.map +1 -0
  794. package/dist/useRouteUpdateParams-DurlddRA.mjs +59 -0
  795. package/dist/useRouteUpdateParams-DurlddRA.mjs.map +1 -0
  796. package/dist/useRubriquesFilterComputed-CQxqKOWL.mjs.map +1 -0
  797. package/dist/useRubriquesFilterComputed-CWUxRSYK.mjs +13 -0
  798. package/dist/useRubriquesFilterComputed-CWUxRSYK.mjs.map +1 -0
  799. package/dist/useRubriquesFilterParam-D7JQhKT5.mjs.map +1 -0
  800. package/dist/useRubriquesFilterParam-U-wcZUul.mjs +36 -0
  801. package/dist/useRubriquesFilterParam-U-wcZUul.mjs.map +1 -0
  802. package/dist/useSeasonsManagement-D-ngDipg.mjs +44 -0
  803. package/dist/useSeasonsManagement-D-ngDipg.mjs.map +1 -0
  804. package/dist/useSelenium-DwQtyBRt.mjs +11 -0
  805. package/dist/useSelenium-DwQtyBRt.mjs.map +1 -0
  806. package/dist/useSeoTitleUrl-CrM1YzAc.mjs +31 -0
  807. package/dist/useSeoTitleUrl-CrM1YzAc.mjs.map +1 -0
  808. package/dist/useSharePath-Vh29oc9Z.mjs +70 -0
  809. package/dist/useSharePath-Vh29oc9Z.mjs.map +1 -0
  810. package/dist/useSharePlatforms-B8R3fZy9.mjs.map +1 -0
  811. package/dist/useSharePlatforms-D0v8XOk3.mjs.map +1 -0
  812. package/dist/useSharePlatforms-aq487WBa.mjs +415 -0
  813. package/dist/useSharePlatforms-aq487WBa.mjs.map +1 -0
  814. package/dist/useSimplePageParam-CL9Tbu3B.mjs.map +1 -0
  815. package/dist/useSimplePageParam-CPjjYD88.mjs +54 -0
  816. package/dist/useSimplePageParam-CPjjYD88.mjs.map +1 -0
  817. package/dist/useTagOf-JxYdEyRm.mjs +20 -0
  818. package/dist/useTagOf-JxYdEyRm.mjs.map +1 -0
  819. package/dist/useTranslation-B-nJSPAk.mjs +205 -0
  820. package/dist/useTranslation-B-nJSPAk.mjs.map +1 -0
  821. package/dist/useTranslation-DjbHwIm7.mjs.map +1 -0
  822. package/dist/usefetchRadioData-CHglTIFu.mjs.map +1 -0
  823. package/dist/usefetchRadioData-gMdg1_Yh.mjs +55 -0
  824. package/dist/usefetchRadioData-gMdg1_Yh.mjs.map +1 -0
  825. package/dist/youtubeVideoHelper-DOeaXxVp.mjs +16 -0
  826. package/dist/youtubeVideoHelper-DOeaXxVp.mjs.map +1 -0
  827. package/package.json +8 -8
  828. package/src/components/display/live/RadioCurrently.vue +3 -4
  829. package/src/components/layouts/PresentationLayout.vue +9 -3
  830. package/src/components/misc/ProgressBar.vue +0 -1
  831. package/src/components/misc/player/ads/AdsProgressBar.vue +17 -1
  832. package/src/components/misc/player/radio/RadioProgressBar.vue +16 -0
  833. package/dist/AccessibilityModal-CBIb3UQS.mjs +0 -93
  834. package/dist/AdsProgressBar-BwRrrKOT.mjs +0 -19
  835. package/dist/AdvancedSearch-Bd9tK-4i.mjs +0 -249
  836. package/dist/AmazonMusicIcon-6zqZK6Q9.mjs +0 -39
  837. package/dist/ApplePodcastIcon-C3ogP5y5.mjs +0 -40
  838. package/dist/CategoryChooser-Ct0No4RM.mjs +0 -173
  839. package/dist/CategoryFilter-CNCjhnMP.mjs +0 -146
  840. package/dist/CategoryList-Buh73sPa.mjs +0 -107
  841. package/dist/CategoryPage-guP6_hCq.mjs +0 -28
  842. package/dist/CategorySearchFilter-BRfxF0yK.mjs +0 -39
  843. package/dist/ChapteringModal-B29-28dk.mjs +0 -46
  844. package/dist/CheckIdentityModal-Dh-7hC5M.mjs +0 -51
  845. package/dist/ChooseEpisodesNumber-CXJO5dfs.mjs +0 -33
  846. package/dist/ClassicAccordion-Czni43ek.mjs +0 -71
  847. package/dist/ClassicAlert-1IB6N33c.mjs +0 -35
  848. package/dist/ClassicBigChip-D6QO8W-G.mjs +0 -25
  849. package/dist/ClassicCheckbox-xPu56Drn.mjs +0 -89
  850. package/dist/ClassicContentEditable-CWmtRihd.mjs +0 -45
  851. package/dist/ClassicCopyButton-DJ9T09fS.mjs +0 -52
  852. package/dist/ClassicDatePicker-BrPx6CHY.mjs +0 -187
  853. package/dist/ClassicEmojiPicker-2c55qjy6.mjs +0 -63
  854. package/dist/ClassicHelpButton-DdEJu6tX.mjs +0 -34
  855. package/dist/ClassicInputText-ILQDQz8R.mjs +0 -270
  856. package/dist/ClassicLazy-DhdsXyI4.mjs +0 -56
  857. package/dist/ClassicLoading-CXfMjpyl.mjs +0 -40
  858. package/dist/ClassicModal-Dl2IdzXZ.mjs +0 -63
  859. package/dist/ClassicModalInBody-D5-RfQ8Z.mjs +0 -58
  860. package/dist/ClassicMultiselect-DKdQdAtp.mjs +0 -201
  861. package/dist/ClassicNav-DYez6p1J.mjs +0 -47
  862. package/dist/ClassicPopover-6uo-YUgO.mjs +0 -167
  863. package/dist/ClassicRadio-BbJEgMB7.mjs +0 -61
  864. package/dist/ClassicRadioLabel-DgimkkQe.mjs +0 -76
  865. package/dist/ClassicSearch-CtL1cpnF.mjs +0 -63
  866. package/dist/ClassicSelect-BpA0jKN6.mjs +0 -111
  867. package/dist/ClassicSpinner-DFRDD51g.mjs +0 -28
  868. package/dist/ClassicTabs-DYOZLNK2.mjs +0 -40
  869. package/dist/ClassicTagInput-DiRwA8CF.mjs +0 -62
  870. package/dist/ClassicWysiwyg-CbBzD-21.mjs +0 -164
  871. package/dist/ClipboardModal-DBIetCe6.mjs +0 -56
  872. package/dist/CommentBasicView-CJgGRZXW.mjs +0 -76
  873. package/dist/CommentInput-BuXFDUZI.mjs +0 -111
  874. package/dist/CommentItem-C1KdIG3j.mjs +0 -155
  875. package/dist/CommentList-DTKpZSb6.mjs +0 -204
  876. package/dist/CommentMoreActions-BiyzPozQ.mjs +0 -191
  877. package/dist/CommentName-BdoUJC9A.mjs +0 -56
  878. package/dist/CommentParentInfo-kXKfL3N4.mjs +0 -36
  879. package/dist/CommentPlayer-BIOwn4Ao.mjs +0 -47
  880. package/dist/CommentSection-CQGAn83J.mjs +0 -79
  881. package/dist/CommentStore-CVBkPvHJ.mjs +0 -279
  882. package/dist/ContractPreviewModal-BJEnYMoK.mjs +0 -53
  883. package/dist/CountDown-o6ye6yv1.mjs +0 -17
  884. package/dist/CountdownOctopus-D0X5hVBu.mjs +0 -23
  885. package/dist/DateFilter-67VvJ4ez.mjs +0 -79
  886. package/dist/DeezerIcon-CybxfijL.mjs +0 -39
  887. package/dist/DownloadPodcastButton-CcUJ8Wuh.mjs +0 -30
  888. package/dist/EditCommentModal-DoVppFIY.mjs +0 -114
  889. package/dist/EditFtpIcon-B1FO4hqc.mjs +0 -39
  890. package/dist/EmissionGroupChooser-B10wDKyp.mjs +0 -44
  891. package/dist/EmissionInlineList-Cn8j50o6.mjs +0 -113
  892. package/dist/EmissionItem-CQbtdUNM.mjs +0 -116
  893. package/dist/EmissionList-E0Hsq0mr.mjs +0 -230
  894. package/dist/EmissionPage-BY0IY-Ci.mjs +0 -188
  895. package/dist/EmissionPlayerItem-KHWB18Ru.mjs +0 -119
  896. package/dist/EmissionPresentationItem-2hfEZ9Wc.mjs +0 -41
  897. package/dist/EmissionPresentationList-Da6YRCuJ.mjs +0 -92
  898. package/dist/EmissionsPage-BpPlQ1vL.mjs +0 -112
  899. package/dist/Error403Page-D7zKplcn.mjs +0 -40
  900. package/dist/ErrorMessage-B4gtlriP.mjs +0 -22
  901. package/dist/FooterGarSection-CwAVj0X8.mjs +0 -39
  902. package/dist/FooterSection-CklRE0yr.mjs +0 -148
  903. package/dist/GeneralStore-Darfv4af.mjs +0 -39
  904. package/dist/HomeDropdown-D65QDBBQ.mjs +0 -66
  905. package/dist/HomePage-stJtq5XR.mjs +0 -106
  906. package/dist/IHeartIcon-DP1otYre.mjs +0 -42
  907. package/dist/LikeButton-Cu8jAJHx.mjs +0 -40
  908. package/dist/LikeSection-xB4hZ4kv.mjs +0 -96
  909. package/dist/ListPaginate-gdpJpyC6.mjs +0 -147
  910. package/dist/LiveHorizontalList-D1QZCKdq.mjs +0 -77
  911. package/dist/LiveList-CerWcFJv.mjs +0 -206
  912. package/dist/LivesPage-C-jtDd4n.mjs +0 -40
  913. package/dist/MapPage-Bef5gLQu.mjs +0 -240
  914. package/dist/MessageModal-BcqS77v6.mjs +0 -101
  915. package/dist/MobileMenu-CV5t_RXg.mjs +0 -136
  916. package/dist/MonetizableFilter-B7NHzXEY.mjs +0 -58
  917. package/dist/NewsletterModal-CEI0I08q.mjs +0 -53
  918. package/dist/OctopusMultiselect-CaLjXg_3.mjs +0 -234
  919. package/dist/OrganisationChooser-CvHoHxHL.mjs +0 -133
  920. package/dist/OrganisationChooserLight-CJ7IbvRM.mjs +0 -48
  921. package/dist/PageLogout-CVZHOw8c.mjs +0 -12
  922. package/dist/PageNotFound-Cgmgm9i1.mjs +0 -37
  923. package/dist/PaginateParams-Bjz3ZI-5.mjs +0 -75
  924. package/dist/PaginateSection-Oip_5JHt.mjs +0 -137
  925. package/dist/ParticipantDescription-DVSfKvtg.mjs +0 -46
  926. package/dist/ParticipantInlineList-CVsGpX6b.mjs +0 -84
  927. package/dist/ParticipantItem-BIWNtU2J.mjs +0 -91
  928. package/dist/ParticipantPage-BvSoNApw.mjs +0 -129
  929. package/dist/ParticipantsPage-ho_vMsWs.mjs +0 -168
  930. package/dist/PlayVideoIcon-BhTQpMyL.mjs +0 -40
  931. package/dist/PlayerAnonymousModal-DI-OzIJ0.mjs +0 -61
  932. package/dist/PlayerCommonParameters-x0zV7AoW.mjs +0 -27
  933. package/dist/PlayerCompact-BjS5HFvK.mjs +0 -128
  934. package/dist/PlayerComponent-CajQtPxX.mjs +0 -592
  935. package/dist/PlayerFmIcon-D7gURz4r.mjs +0 -39
  936. package/dist/PlayerLarge-H4sl7hoe.mjs +0 -128
  937. package/dist/PlayerParameters-kVBMXQIb.mjs +0 -173
  938. package/dist/PlayerPlayButton-DfzHBM_X.mjs +0 -231
  939. package/dist/PlayerProgressBar-CSY72hgw.mjs +0 -67
  940. package/dist/PlayerStore-C4T1vCHz.mjs +0 -166
  941. package/dist/PlayerVideo-BfR5fBo_.mjs +0 -35
  942. package/dist/PlayerVideoDigiteka-C6ZA6XkR.mjs +0 -59
  943. package/dist/PlayerVideoHls-B8dm2-2-.mjs +0 -125
  944. package/dist/PlayerYoutubeEmbed-D-UrFhXm.mjs +0 -25
  945. package/dist/PlaylistPage-DTy_55xp.mjs +0 -135
  946. package/dist/PlaylistsPage-m-ST2PUd.mjs +0 -254
  947. package/dist/PocketCastIcon-CM5NDsDa.mjs +0 -39
  948. package/dist/PodcastAddictIcon-CW3Uxj4I.mjs +0 -42
  949. package/dist/PodcastFilterList-Bz8c8rOJ.mjs +0 -139
  950. package/dist/PodcastImage-BGQti5JM.mjs +0 -115
  951. package/dist/PodcastInlineList-WvkPSh1V.mjs +0 -117
  952. package/dist/PodcastInlineListTemplate-D1bIqp9s.mjs +0 -180
  953. package/dist/PodcastIsPlaying-mWJppqAl.mjs +0 -17
  954. package/dist/PodcastItem-CYPwjD38.mjs +0 -158
  955. package/dist/PodcastList-BfqxVGag.mjs +0 -184
  956. package/dist/PodcastList-D3jE4KxK.mjs +0 -113
  957. package/dist/PodcastPage-GTzk5mUv.mjs +0 -409
  958. package/dist/PodcastPlannedSpinner-DcDDays8.mjs +0 -12
  959. package/dist/PodcastPlayBar-YJnOuGTK.mjs +0 -39
  960. package/dist/PodcastPlayBasicButton-BYpnGOO1.mjs +0 -44
  961. package/dist/PodcastPlayButton-CJ8BRg-T.mjs +0 -118
  962. package/dist/PodcastPlaylistInlineList-CmgnXWqI.mjs +0 -63
  963. package/dist/PodcastPresentationList-BBbhrj5M.mjs +0 -130
  964. package/dist/PodcastProgressBar-DDmGqHRZ.mjs +0 -66
  965. package/dist/PodcastRawTranscript-uMquvyIx.mjs +0 -100
  966. package/dist/PodcastRubriqueList-CMcls_jK.mjs +0 -46
  967. package/dist/PodcastSeasonInfo-DDGSqj8M.mjs +0 -28
  968. package/dist/PodcastSwiperList-CR4Daki7.mjs +0 -164
  969. package/dist/PodcastmakerHeader-Blma5tOE.mjs +0 -33
  970. package/dist/PodcastsPage-BZfbH613.mjs +0 -123
  971. package/dist/PresentationLayout-LcZqb8bn.mjs +0 -62
  972. package/dist/ProductorSearch-Cyo0OOte.mjs +0 -91
  973. package/dist/ProgressBar-h-6hD6C6.mjs +0 -112
  974. package/dist/QrCode-CB7uCURG.mjs +0 -105
  975. package/dist/QrCodeModal-uLXUjfFk.mjs +0 -43
  976. package/dist/RadioCurrently-CxTpzc3O.mjs +0 -57
  977. package/dist/RadioHistory-DaY_apJL.mjs +0 -89
  978. package/dist/RadioImage-CGdu0tqS.mjs +0 -46
  979. package/dist/RadioList-Dwjy8BJK.mjs +0 -70
  980. package/dist/RadioPage-B0cZlWcd.mjs +0 -72
  981. package/dist/RadioPlanning-yTAzd4fk.mjs +0 -183
  982. package/dist/RadioProgressBar-DLRlsyeG.mjs +0 -31
  983. package/dist/RadiolineIcon-CxHZGhfr.mjs +0 -40
  984. package/dist/RecaptchaModal-eBNvLZYg.mjs +0 -95
  985. package/dist/ReportAbuseModal-0i7fa_Kb.mjs +0 -92
  986. package/dist/RightsIndicator-BFKSa05U.mjs +0 -58
  987. package/dist/RightsWrapper-BRWuAx2F.mjs +0 -104
  988. package/dist/RubriqueChoice-DWvVVaMg.mjs +0 -101
  989. package/dist/RubriqueChooser-B7wvJeQc.mjs +0 -165
  990. package/dist/RubriqueFilter-BLW_L9Wm.mjs +0 -119
  991. package/dist/RubriqueList-DKBuYW37.mjs +0 -117
  992. package/dist/RubriquePage-D4b-tHSI.mjs +0 -71
  993. package/dist/SearchOrder-D_dAhj9M.mjs +0 -62
  994. package/dist/SearchPage-DiEabf9d.mjs +0 -38
  995. package/dist/ShareAnonymous-DnvGBSfx.mjs +0 -189
  996. package/dist/ShareModalPlayer-CXYjEN8k.mjs +0 -87
  997. package/dist/ShareNewsletter-C6U_Jjnm.mjs +0 -143
  998. package/dist/SharePlayer-B7YLKRAB.mjs +0 -210
  999. package/dist/SharePlayerColors-BpdifsHh.mjs +0 -49
  1000. package/dist/SharePlayerRadio-Dy6UuwWM.mjs +0 -66
  1001. package/dist/SharePlayerTypes-CeecVrvy.mjs +0 -148
  1002. package/dist/ShareSocialsButtons-ty0wa4Hj.mjs +0 -100
  1003. package/dist/SimpleLayout-BgflH0r5.mjs +0 -22
  1004. package/dist/SmartLinkPage-BmXB-5t-.mjs +0 -131
  1005. package/dist/SnackBar-BL-mLRun.mjs +0 -128
  1006. package/dist/SubscribeButtons-Bqc3UtOf.mjs +0 -120
  1007. package/dist/SwiperList-nkm8nHZC.mjs +0 -119
  1008. package/dist/TagList-BcJZfwL5.mjs +0 -80
  1009. package/dist/TagPage-DFUbxGht.mjs +0 -79
  1010. package/dist/TopBar-1YG7Pruy.mjs +0 -260
  1011. package/dist/TuninIcon-DENNxlP8.mjs +0 -39
  1012. package/dist/UserButtonContent-CKxL8aX3.mjs +0 -125
  1013. package/dist/VastStore-8IiEgtQW.mjs +0 -71
  1014. package/dist/VideoModuleBox-B54AebXt.mjs +0 -58
  1015. package/dist/VideoPage-BxYH2SFo.mjs +0 -148
  1016. package/dist/XIcon-DNBT2Zgf.mjs +0 -39
  1017. package/dist/_plugin-vue_export-helper-B3ysoDQm.mjs +0 -8
  1018. package/dist/buttons-CWMRsA_g.mjs +0 -79
  1019. package/dist/classicApi-DR5O2l0-.mjs +0 -1183
  1020. package/dist/config-DMjLBcZ2.mjs +0 -7
  1021. package/dist/cookiesHelper-BQ3M1-Xr.mjs +0 -20
  1022. package/dist/displayHelper-DQtoqc_6.mjs +0 -11
  1023. package/dist/domHelper-BPw2kGCL.mjs +0 -12
  1024. package/dist/downloadHelper-DqI60vwY.mjs +0 -23
  1025. package/dist/educationen-KT401RLo.mjs +0 -16
  1026. package/dist/educationfr-BIafOUp-.mjs +0 -4
  1027. package/dist/emission-CQ1VuxRc.mjs +0 -22
  1028. package/dist/icons-aOUoelo6.mjs +0 -11
  1029. package/dist/keys-CV5SBM1i.mjs +0 -4
  1030. package/dist/localisation-CBnt682X.mjs +0 -9
  1031. package/dist/logo_saooti_play_black-Doe3es2H.mjs +0 -4
  1032. package/dist/messages-DxUrH00s.mjs +0 -2677
  1033. package/dist/organisation-JgfYj1Jp.mjs +0 -17
  1034. package/dist/ouest_france_logo-9dPaEPNA.mjs +0 -4
  1035. package/dist/podcast-BoNHyuLe.mjs +0 -53
  1036. package/dist/rolldown-runtime-Dy4uBu1J.mjs +0 -11
  1037. package/dist/stringHelper-8Cu4x0-T.mjs +0 -13
  1038. package/dist/types-BMNwRfo9.mjs +0 -8
  1039. package/dist/useAdvancedParamInit-DIw4V0uk.mjs +0 -111
  1040. package/dist/useCountdown-vXzlLAgF.mjs +0 -32
  1041. package/dist/useDayjs-CCvXE-aF.mjs +0 -28
  1042. package/dist/useErrorHandler-CNqmf6tv.mjs +0 -12
  1043. package/dist/useImageProxy-C3duE5Uj.mjs +0 -16
  1044. package/dist/useOrgaComputed-ZwTfEXF-.mjs +0 -16
  1045. package/dist/usePlayerLogicProgress--FrjZ3zY.mjs +0 -68
  1046. package/dist/usePodcastView-EmNdC0A1.mjs +0 -31
  1047. package/dist/usePresentationItem-PCEJ9BHI.mjs +0 -100
  1048. package/dist/useResizePhone-4hSkK5pa.mjs +0 -28
  1049. package/dist/useRights-D4GJoff9.mjs +0 -221
  1050. package/dist/useRouteUpdateParams-DJLm3IAI.mjs +0 -55
  1051. package/dist/useRubriquesFilterComputed-BKI04l9G.mjs +0 -11
  1052. package/dist/useRubriquesFilterParam-C5AZlQOX.mjs +0 -32
  1053. package/dist/useSeasonsManagement-DwbmJywJ.mjs +0 -24
  1054. package/dist/useSelenium-DAM6EF3J.mjs +0 -9
  1055. package/dist/useSeoTitleUrl-UfPXDCPa.mjs +0 -25
  1056. package/dist/useSharePath-D9G8Jdlb.mjs +0 -40
  1057. package/dist/useSharePlatforms-DWJtsHHs.mjs +0 -322
  1058. package/dist/useSimplePageParam-DJBHk-Yr.mjs +0 -39
  1059. package/dist/useTagOf-Btweq3v2.mjs +0 -17
  1060. package/dist/useTranslation-xTuUuIiz.mjs +0 -139
  1061. package/dist/usefetchRadioData-SnCkZcGt.mjs +0 -48
  1062. package/dist/youtubeVideoHelper-Cdlokujb.mjs +0 -14
@@ -0,0 +1,325 @@
1
+ import { t as ClassicCheckbox_default } from "./ClassicCheckbox-CqA5WUGc.mjs";
2
+ import { t as _plugin_vue_export_helper_default } from "./_plugin-vue_export-helper-BOaGB7Aw.mjs";
3
+ import { Fragment, Teleport, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, getCurrentInstance, isRef, nextTick, normalizeClass, normalizeStyle, onMounted, onUnmounted, openBlock, ref, renderList, toDisplayString, unref, vModelText, vShow, watch, withDirectives, withKeys, withModifiers } from "vue";
4
+ import { useI18n } from "vue-i18n";
5
+ import ChevronDownIcon from "vue-material-design-icons/ChevronDown.vue";
6
+ import { onClickOutside } from "@vueuse/core";
7
+ //#region src/components/composable/form/useOctopusDropdown.ts
8
+ function useOctopusDropdown(props, emitSearch, idPrefix = "octopus-dropdown", ignore) {
9
+ const { t } = useI18n();
10
+ const instance = getCurrentInstance();
11
+ const searchQuery = ref("");
12
+ const isOpen = ref(false);
13
+ const isHovered = ref(false);
14
+ const containerRef = ref(null);
15
+ const inputRef = ref(null);
16
+ const teleportTarget = ref(".octopus-app");
17
+ const computedId = computed(() => `${idPrefix}-${instance?.uid}`);
18
+ const hasSearchListener = computed(() => !!instance?.vnode.props?.onSearch);
19
+ const displayedOptions = computed(() => {
20
+ if (hasSearchListener.value) return props.options;
21
+ const query = searchQuery.value.toLowerCase();
22
+ if (!query) return props.options;
23
+ return props.options.filter((option) => getLabel(option).toLowerCase().includes(query));
24
+ });
25
+ const inputPlaceholder = computed(() => props.placeholder ?? t("Search"));
26
+ function getLabel(option) {
27
+ if (props.optionLabel) return option[props.optionLabel];
28
+ return option;
29
+ }
30
+ function openDropdown() {
31
+ if (props.isDisabled) return;
32
+ teleportTarget.value = containerRef.value?.closest(".octopus-popover") ?? ".octopus-app";
33
+ isOpen.value = true;
34
+ nextTick(() => {
35
+ inputRef.value?.focus();
36
+ });
37
+ }
38
+ function closeDropdown() {
39
+ isOpen.value = false;
40
+ searchQuery.value = "";
41
+ }
42
+ function toggleDropdown() {
43
+ if (isOpen.value) closeDropdown();
44
+ else openDropdown();
45
+ }
46
+ function handleInput() {
47
+ if (hasSearchListener.value) emitSearch(searchQuery.value);
48
+ }
49
+ onClickOutside(containerRef, closeDropdown, ignore?.length ? { ignore } : void 0);
50
+ return {
51
+ searchQuery,
52
+ isOpen,
53
+ isHovered,
54
+ containerRef,
55
+ inputRef,
56
+ teleportTarget,
57
+ computedId,
58
+ hasSearchListener,
59
+ displayedOptions,
60
+ inputPlaceholder,
61
+ getLabel,
62
+ openDropdown,
63
+ closeDropdown,
64
+ toggleDropdown,
65
+ handleInput
66
+ };
67
+ }
68
+ //#endregion
69
+ //#region src/components/form/OctopusMultiselect.vue?vue&type=script&setup=true&lang.ts
70
+ var _hoisted_1 = ["for"];
71
+ var _hoisted_2 = { class: "octopus-multiselect-selection-text" };
72
+ var _hoisted_3 = {
73
+ key: 0,
74
+ class: "octopus-multiselect-selection-count"
75
+ };
76
+ var _hoisted_4 = [
77
+ "id",
78
+ "placeholder",
79
+ "disabled"
80
+ ];
81
+ var _hoisted_5 = ["disabled"];
82
+ var _hoisted_6 = { class: "octopus-multiselect-options" };
83
+ var _hoisted_7 = { key: 0 };
84
+ var _hoisted_8 = { class: "text-indic px-2" };
85
+ var _hoisted_9 = {
86
+ key: 1,
87
+ class: "text-indic px-2"
88
+ };
89
+ //#endregion
90
+ //#region src/components/form/OctopusMultiselect.vue
91
+ var OctopusMultiselect_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
92
+ __name: "OctopusMultiselect",
93
+ props: {
94
+ label: {},
95
+ selected: {},
96
+ options: {},
97
+ optionKey: {},
98
+ optionLabel: {},
99
+ allowCustomValue: { type: Boolean },
100
+ disabled: { type: Boolean },
101
+ placeholder: {},
102
+ selectAllText: {},
103
+ noBorder: { type: Boolean },
104
+ expandOnHover: { type: Boolean },
105
+ pullSelectedToTop: { type: Boolean }
106
+ },
107
+ emits: ["update:selected", "search"],
108
+ setup(__props, { emit: __emit }) {
109
+ const props = __props;
110
+ const emit = __emit;
111
+ const { t } = useI18n();
112
+ const dropdownRef = ref(null);
113
+ const { searchQuery, isOpen, isHovered, containerRef, inputRef, teleportTarget, computedId, displayedOptions, inputPlaceholder, getLabel, openDropdown, toggleDropdown, handleInput } = useOctopusDropdown(props, (query) => emit("search", query), "multiselect", [dropdownRef]);
114
+ const selectionRef = ref(null);
115
+ const dropdownStyle = ref({});
116
+ function updateDropdownPosition() {
117
+ if (!containerRef.value) return;
118
+ const rect = containerRef.value.getBoundingClientRect();
119
+ dropdownStyle.value = {
120
+ position: "fixed",
121
+ top: `${rect.bottom + 2}px`,
122
+ left: `${rect.left}px`,
123
+ width: `${rect.width}px`
124
+ };
125
+ }
126
+ function onFieldMouseEnter() {
127
+ isHovered.value = true;
128
+ if (props.expandOnHover) nextTick(updateDropdownPosition);
129
+ }
130
+ const visibleCount = ref(2);
131
+ const pinnedSnapshot = ref([]);
132
+ const customSelectedOptions = computed(() => {
133
+ if (!props.allowCustomValue) return [];
134
+ return (props.selected ?? []).filter((item) => !isInOptions(item));
135
+ });
136
+ const visibleOptions = computed(() => {
137
+ const query = searchQuery.value.toLowerCase();
138
+ const filteredCustom = query ? customSelectedOptions.value.filter((option) => getLabel(option).toLowerCase().includes(query)) : customSelectedOptions.value;
139
+ const combined = [...displayedOptions.value, ...filteredCustom];
140
+ if (!props.pullSelectedToTop) return combined;
141
+ return [...combined.filter(isPinned), ...combined.filter((option) => !isPinned(option))];
142
+ });
143
+ const allSelected = computed(() => {
144
+ if (visibleOptions.value.length === 0) return false;
145
+ return visibleOptions.value.every((option) => isSelected(option));
146
+ });
147
+ const hasSelected = computed(() => (props.selected?.length ?? 0) > 0);
148
+ const selectionLabels = computed(() => (props.selected ?? []).slice(0, visibleCount.value).map(getLabel).join(", "));
149
+ const overflowCount = computed(() => Math.max(0, (props.selected?.length ?? 0) - visibleCount.value));
150
+ const allLabelsText = computed(() => (props.selected ?? []).map(getLabel).join(", "));
151
+ function isSelected(option) {
152
+ if (props.optionKey) return props.selected?.find((s) => s[props.optionKey] === option[props.optionKey]) !== void 0;
153
+ else return props.selected?.includes(option) ?? false;
154
+ }
155
+ function isInOptions(option) {
156
+ if (props.optionKey) return props.options.some((opt) => opt[props.optionKey] === option[props.optionKey]);
157
+ else return props.options.includes(option);
158
+ }
159
+ function isPinned(option) {
160
+ if (props.optionKey) return pinnedSnapshot.value.some((s) => s[props.optionKey] === option[props.optionKey]);
161
+ else return pinnedSnapshot.value.includes(option);
162
+ }
163
+ function toggleOption(option) {
164
+ const current = props.selected ?? [];
165
+ if (isSelected(option)) {
166
+ const key = props.optionKey;
167
+ emit("update:selected", key ? current.filter((item) => item[key] !== option[key]) : current.filter((item) => item !== option));
168
+ } else emit("update:selected", [...current, option]);
169
+ }
170
+ function handleCustomValueEnter() {
171
+ if (!props.allowCustomValue) return;
172
+ const value = searchQuery.value.trim();
173
+ if (!value) return;
174
+ const customOption = value;
175
+ if (!isSelected(customOption)) emit("update:selected", [...props.selected ?? [], customOption]);
176
+ searchQuery.value = "";
177
+ }
178
+ function toggleAll(val) {
179
+ const current = props.selected ?? [];
180
+ if (val) {
181
+ const toAdd = visibleOptions.value.filter((option) => !isSelected(option));
182
+ emit("update:selected", [...current, ...toAdd]);
183
+ } else {
184
+ const key = props.optionKey;
185
+ emit("update:selected", current.filter((item) => key ? !visibleOptions.value.some((opt) => opt[key] === item[key]) : !visibleOptions.value.includes(item)));
186
+ }
187
+ }
188
+ function updateVisibleCount() {
189
+ const container = selectionRef.value;
190
+ const selected = props.selected ?? [];
191
+ if (!container || selected.length < 2) {
192
+ visibleCount.value = selected.length;
193
+ return;
194
+ }
195
+ const availableWidth = container.offsetWidth;
196
+ if (availableWidth === 0) return;
197
+ const labels = selected.map(getLabel);
198
+ const measurer = document.createElement("span");
199
+ measurer.style.cssText = "position:absolute;visibility:hidden;white-space:nowrap;pointer-events:none;";
200
+ container.appendChild(measurer);
201
+ measurer.textContent = labels.join(", ");
202
+ if (measurer.offsetWidth <= availableWidth) {
203
+ visibleCount.value = labels.length;
204
+ container.removeChild(measurer);
205
+ return;
206
+ }
207
+ measurer.textContent = `(+${labels.length})`;
208
+ const textAvailable = availableWidth - (measurer.offsetWidth + 4);
209
+ let count = 0;
210
+ for (let i = 0; i < labels.length; i++) {
211
+ measurer.textContent = labels.slice(0, i + 1).join(", ");
212
+ if (measurer.offsetWidth > textAvailable) break;
213
+ count = i + 1;
214
+ }
215
+ container.removeChild(measurer);
216
+ visibleCount.value = Math.max(1, count);
217
+ }
218
+ let resizeObserver = null;
219
+ onMounted(() => {
220
+ if (selectionRef.value) {
221
+ resizeObserver = new ResizeObserver(updateVisibleCount);
222
+ resizeObserver.observe(selectionRef.value);
223
+ }
224
+ updateVisibleCount();
225
+ window.addEventListener("scroll", updateDropdownPosition, true);
226
+ window.addEventListener("resize", updateDropdownPosition);
227
+ });
228
+ onUnmounted(() => {
229
+ resizeObserver?.disconnect();
230
+ window.removeEventListener("scroll", updateDropdownPosition, true);
231
+ window.removeEventListener("resize", updateDropdownPosition);
232
+ });
233
+ watch(() => props.selected, updateVisibleCount);
234
+ watch(isOpen, (val) => {
235
+ if (val) {
236
+ pinnedSnapshot.value = [...props.selected ?? []];
237
+ nextTick(updateDropdownPosition);
238
+ } else nextTick(updateVisibleCount);
239
+ });
240
+ return (_ctx, _cache) => {
241
+ return openBlock(), createElementBlock("div", {
242
+ ref_key: "containerRef",
243
+ ref: containerRef,
244
+ class: normalizeClass(["octopus-multiselect", { "form-margin": __props.label }])
245
+ }, [
246
+ __props.label ? (openBlock(), createElementBlock("label", {
247
+ key: 0,
248
+ for: unref(computedId),
249
+ class: "form-label"
250
+ }, toDisplayString(__props.label), 9, _hoisted_1)) : createCommentVNode("", true),
251
+ createElementVNode("div", {
252
+ class: normalizeClass(["octopus-multiselect-field", {
253
+ disabled: __props.disabled,
254
+ open: unref(isOpen),
255
+ noBorder: __props.noBorder
256
+ }]),
257
+ onClick: _cache[4] || (_cache[4] = (...args) => unref(openDropdown) && unref(openDropdown)(...args)),
258
+ onMouseenter: onFieldMouseEnter,
259
+ onMouseleave: _cache[5] || (_cache[5] = ($event) => isHovered.value = false)
260
+ }, [
261
+ withDirectives(createElementVNode("div", {
262
+ ref_key: "selectionRef",
263
+ ref: selectionRef,
264
+ class: "octopus-multiselect-selection"
265
+ }, [createElementVNode("span", _hoisted_2, toDisplayString(selectionLabels.value), 1), overflowCount.value > 0 ? (openBlock(), createElementBlock("span", _hoisted_3, "(+" + toDisplayString(overflowCount.value) + ")", 1)) : createCommentVNode("", true)], 512), [[vShow, hasSelected.value && !unref(isOpen)]]),
266
+ withDirectives(createElementVNode("input", {
267
+ id: unref(computedId),
268
+ ref_key: "inputRef",
269
+ ref: inputRef,
270
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => isRef(searchQuery) ? searchQuery.value = $event : null),
271
+ type: "text",
272
+ class: "octopus-multiselect-input",
273
+ placeholder: unref(inputPlaceholder),
274
+ disabled: __props.disabled,
275
+ onFocus: _cache[1] || (_cache[1] = (...args) => unref(openDropdown) && unref(openDropdown)(...args)),
276
+ onInput: _cache[2] || (_cache[2] = (...args) => unref(handleInput) && unref(handleInput)(...args)),
277
+ onKeydown: withKeys(handleCustomValueEnter, ["enter"])
278
+ }, null, 40, _hoisted_4), [[vShow, !hasSelected.value || unref(isOpen)], [vModelText, unref(searchQuery)]]),
279
+ createElementVNode("button", {
280
+ class: "btn-transparent octopus-multiselect-chevron",
281
+ disabled: __props.disabled,
282
+ onClick: _cache[3] || (_cache[3] = withModifiers((...args) => unref(toggleDropdown) && unref(toggleDropdown)(...args), ["stop"]))
283
+ }, [createVNode(ChevronDownIcon)], 8, _hoisted_5)
284
+ ], 34),
285
+ (openBlock(), createBlock(Teleport, { to: unref(teleportTarget) }, [__props.expandOnHover && unref(isHovered) && !unref(isOpen) && overflowCount.value > 0 ? (openBlock(), createElementBlock("div", {
286
+ key: 0,
287
+ class: "octopus-multiselect-hover-tooltip",
288
+ style: normalizeStyle(dropdownStyle.value)
289
+ }, toDisplayString(allLabelsText.value), 5)) : createCommentVNode("", true), unref(isOpen) ? (openBlock(), createElementBlock("div", {
290
+ key: 1,
291
+ ref_key: "dropdownRef",
292
+ ref: dropdownRef,
293
+ class: "octopus-multiselect-dropdown",
294
+ style: normalizeStyle(dropdownStyle.value)
295
+ }, [createVNode(ClassicCheckbox_default, {
296
+ "text-init": allSelected.value,
297
+ label: __props.selectAllText ?? unref(t)("All"),
298
+ "is-disabled": __props.disabled,
299
+ "onUpdate:textInit": toggleAll
300
+ }, null, 8, [
301
+ "text-init",
302
+ "label",
303
+ "is-disabled"
304
+ ]), createElementVNode("div", _hoisted_6, [(openBlock(true), createElementBlock(Fragment, null, renderList(visibleOptions.value, (option, index) => {
305
+ return openBlock(), createBlock(ClassicCheckbox_default, {
306
+ key: index,
307
+ "text-init": isSelected(option),
308
+ label: unref(getLabel)(option),
309
+ "is-disabled": __props.disabled,
310
+ "onUpdate:textInit": ($event) => toggleOption(option)
311
+ }, null, 8, [
312
+ "text-init",
313
+ "label",
314
+ "is-disabled",
315
+ "onUpdate:textInit"
316
+ ]);
317
+ }), 128)), __props.allowCustomValue && unref(searchQuery).trim() ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [visibleOptions.value.length > 0 ? (openBlock(), createElementBlock("hr", _hoisted_7)) : createCommentVNode("", true), createElementVNode("span", _hoisted_8, toDisplayString(unref(t)("Press Enter to add this value")), 1)], 64)) : visibleOptions.value.length === 0 ? (openBlock(), createElementBlock("span", _hoisted_9, toDisplayString(unref(t)("No elements found. Consider changing the search query.")), 1)) : createCommentVNode("", true)])], 4)) : createCommentVNode("", true)], 8, ["to"]))
318
+ ], 2);
319
+ };
320
+ }
321
+ }), [["__scopeId", "data-v-9fb1fd0d"]]);
322
+ //#endregion
323
+ export { useOctopusDropdown as n, OctopusMultiselect_default as t };
324
+
325
+ //# sourceMappingURL=OctopusMultiselect-CDijfV8W.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OctopusMultiselect-CDijfV8W.mjs","names":[],"sources":["../src/components/composable/form/useOctopusDropdown.ts","../src/components/form/OctopusMultiselect.vue","../src/components/form/OctopusMultiselect.vue"],"sourcesContent":["import { computed, getCurrentInstance, nextTick, ref } from 'vue';\nimport { type MaybeElementRef, onClickOutside } from '@vueuse/core';\nimport { useI18n } from 'vue-i18n';\n\nexport interface OctopusDropdownProps<T> {\n options: T[];\n optionLabel?: keyof T & string;\n optionKey?: keyof T;\n isDisabled?: boolean;\n placeholder?: string;\n}\n\nexport function useOctopusDropdown<T>(\n props: OctopusDropdownProps<T>,\n emitSearch: (query: string) => void,\n idPrefix: string = 'octopus-dropdown',\n // Extra elements to exclude from the click-outside check.\n // Needed when the dropdown is teleported outside containerRef (e.g. to body):\n // without this, clicking inside the teleported dropdown triggers closeDropdown\n // because it is no longer a DOM descendant of containerRef.\n ignore?: MaybeElementRef[]\n) {\n const { t } = useI18n();\n const instance = getCurrentInstance();\n\n const searchQuery = ref('');\n const isOpen = ref(false);\n const isHovered = ref(false);\n const containerRef = ref<HTMLElement | null>(null);\n const inputRef = ref<HTMLInputElement | null>(null);\n // Where the dropdown/options list (teleported out of normal flow) should land. Defaults\n // to the app root, but when this component is used inside a ClassicPopover, teleporting\n // there instead keeps the dropdown a real DOM descendant of it — otherwise both end up as\n // siblings under the same teleport target, and ClassicPopover's outside-click/blur checks\n // (which rely on DOM containment) see clicks inside the dropdown as \"outside\" and close it.\n const teleportTarget = ref<string | HTMLElement>('.octopus-app');\n\n const computedId = computed(() => `${idPrefix}-${instance?.uid}`);\n\n // vnode.props contains the raw parent-provided props before defineEmits strips them\n // from attrs, so onSearch is present whenever the parent writes @search=\"...\".\n const hasSearchListener = computed(() => !!instance?.vnode.props?.onSearch);\n\n const displayedOptions = computed((): T[] => {\n if (hasSearchListener.value) {\n return props.options;\n }\n const query = searchQuery.value.toLowerCase();\n if (!query) {\n return props.options;\n }\n return props.options.filter((option) =>\n getLabel(option).toLowerCase().includes(query)\n );\n });\n\n const inputPlaceholder = computed(() => props.placeholder ?? t('Search'));\n\n function getLabel(option: T): string {\n if (props.optionLabel) {\n return option[props.optionLabel] as string;\n }\n return option as unknown as string;\n }\n\n function openDropdown(): void {\n if (props.isDisabled) {\n return;\n }\n teleportTarget.value = containerRef.value?.closest<HTMLElement>('.octopus-popover') ?? '.octopus-app';\n isOpen.value = true;\n nextTick(() => {\n inputRef.value?.focus();\n });\n }\n\n function closeDropdown(): void {\n isOpen.value = false;\n searchQuery.value = '';\n }\n\n function toggleDropdown(): void {\n if (isOpen.value) {\n closeDropdown();\n } else {\n openDropdown();\n }\n }\n\n function handleInput(): void {\n if (hasSearchListener.value) {\n emitSearch(searchQuery.value);\n }\n }\n\n onClickOutside(containerRef, closeDropdown, ignore?.length ? { ignore } : undefined);\n\n return {\n searchQuery,\n isOpen,\n isHovered,\n containerRef,\n inputRef,\n teleportTarget,\n computedId,\n hasSearchListener,\n displayedOptions,\n inputPlaceholder,\n getLabel,\n openDropdown,\n closeDropdown,\n toggleDropdown,\n handleInput,\n };\n}\n","<template>\n <div\n ref=\"containerRef\"\n class=\"octopus-multiselect\"\n :class=\"{ 'form-margin': label }\"\n >\n <label\n v-if=\"label\"\n :for=\"computedId\"\n class=\"form-label\"\n >\n {{ label }}\n </label>\n\n <div\n class=\"octopus-multiselect-field\"\n :class=\"{ disabled, open: isOpen, noBorder }\"\n @click=\"openDropdown\"\n @mouseenter=\"onFieldMouseEnter\"\n @mouseleave=\"isHovered = false\"\n >\n <div\n v-show=\"hasSelected && !isOpen\"\n ref=\"selectionRef\"\n class=\"octopus-multiselect-selection\"\n >\n <span class=\"octopus-multiselect-selection-text\">{{ selectionLabels }}</span>\n <span\n v-if=\"overflowCount > 0\"\n class=\"octopus-multiselect-selection-count\"\n >(+{{ overflowCount }})</span>\n </div>\n <input\n v-show=\"!hasSelected || isOpen\"\n :id=\"computedId\"\n ref=\"inputRef\"\n v-model=\"searchQuery\"\n type=\"text\"\n class=\"octopus-multiselect-input\"\n :placeholder=\"inputPlaceholder\"\n :disabled=\"disabled\"\n @focus=\"openDropdown\"\n @input=\"handleInput\"\n @keydown.enter=\"handleCustomValueEnter\"\n >\n <button\n class=\"btn-transparent octopus-multiselect-chevron\"\n :disabled=\"disabled\"\n @click.stop=\"toggleDropdown\"\n >\n <ChevronDownIcon />\n </button>\n </div>\n\n <Teleport :to=\"teleportTarget\">\n <div\n v-if=\"expandOnHover && isHovered && !isOpen && overflowCount > 0\"\n class=\"octopus-multiselect-hover-tooltip\"\n :style=\"dropdownStyle\"\n >\n {{ allLabelsText }}\n </div>\n\n <div\n v-if=\"isOpen\"\n ref=\"dropdownRef\"\n class=\"octopus-multiselect-dropdown\"\n :style=\"dropdownStyle\"\n >\n <ClassicCheckbox\n :text-init=\"allSelected\"\n :label=\"selectAllText ?? t('All')\"\n :is-disabled=\"disabled\"\n @update:text-init=\"toggleAll\"\n />\n\n <div class=\"octopus-multiselect-options\">\n <ClassicCheckbox\n v-for=\"(option, index) in visibleOptions\"\n :key=\"index\"\n :text-init=\"isSelected(option)\"\n :label=\"getLabel(option)\"\n :is-disabled=\"disabled\"\n @update:text-init=\"toggleOption(option)\"\n />\n <template v-if=\"allowCustomValue && searchQuery.trim()\">\n <hr v-if=\"visibleOptions.length > 0\">\n <span class=\"text-indic px-2\">\n {{ t('Press Enter to add this value') }}\n </span>\n </template>\n <span v-else-if=\"visibleOptions.length === 0\" class=\"text-indic px-2\">\n {{ t('No elements found. Consider changing the search query.') }}\n </span>\n </div>\n </div>\n </Teleport>\n </div>\n</template>\n\n<script setup lang=\"ts\" generic=\"T\">\nimport { type CSSProperties, computed, nextTick, onMounted, onUnmounted, ref, watch } from 'vue';\nimport { useI18n } from 'vue-i18n';\nimport ChevronDownIcon from 'vue-material-design-icons/ChevronDown.vue';\nimport ClassicCheckbox from './ClassicCheckbox.vue';\nimport { useOctopusDropdown } from '../composable/form/useOctopusDropdown';\n\nconst props = defineProps<{\n /** Optional label displayed above the field. */\n label?: string;\n /** Currently selected items. Bind with `v-model:selected`. */\n selected?: T[];\n /** Full list of options to display or filter. */\n options: T[];\n /** Key of each option object to use as the ID */\n optionKey?: keyof T;\n /** Key of each option object to use as the display label. Omit when `options` is a\n * plain `string[]` — each string is used as its own label. Note: omitting this for\n * an object array is a runtime mistake (not caught at compile time) and will render\n * \"[object Object]\". */\n optionLabel?: keyof T & string;\n /** When true, pressing Enter in the search input adds the typed text as a new\n * selected value, even if it doesn't match any option. Intended for use when\n * options are plain strings (`optionLabel` omitted) — casting arbitrary typed\n * text into an object-shaped T would not produce a valid option. */\n allowCustomValue?: boolean;\n /** Disables the field and all checkboxes when true. */\n disabled?: boolean;\n /** Placeholder shown in the input when no items are selected. Defaults to the translated \"Search\" string. */\n placeholder?: string;\n /** Label for the \"select all\" checkbox. Defaults to the translated \"All\" string. */\n selectAllText?: string;\n /** Disable the border around the input */\n noBorder?: boolean;\n /** When true, hovering the closed field with overflow shows a tooltip listing all selected items. */\n expandOnHover?: boolean;\n /** When true, options selected at the moment the dropdown opens are moved to the\n * top of the list. This is a snapshot taken at open time — it does not live-reorder\n * while the dropdown stays open, only on the next closed→open transition. */\n pullSelectedToTop?: boolean;\n}>();\n\nconst emit = defineEmits<{\n /** Emitted when the selection changes. */\n (e: 'update:selected', value: T[]): void;\n /** Emitted on every input change. When listened to, the parent is responsible for\n * updating `options`; otherwise the component filters `options` client-side. */\n (e: 'search', query: string): void;\n}>();\n\nconst { t } = useI18n();\n\n// Ref on the teleported dropdown div — passed as ignored element to useOctopusDropdown\n// so clicks inside the dropdown don't trigger the click-outside handler.\nconst dropdownRef = ref<HTMLElement | null>(null);\n\nconst {\n searchQuery,\n isOpen,\n isHovered,\n containerRef,\n inputRef,\n teleportTarget,\n computedId,\n displayedOptions,\n inputPlaceholder,\n getLabel,\n openDropdown,\n toggleDropdown,\n handleInput,\n} = useOctopusDropdown(props, (query) => emit('search', query), 'multiselect', [dropdownRef]);\n\nconst selectionRef = ref<HTMLElement | null>(null);\n\n// Position of the teleported dropdown (position: fixed, anchored below the trigger field)\nconst dropdownStyle = ref<CSSProperties>({});\n\n// Also used to position the hover tooltip: both are teleported and anchored the same way\n// (fixed, directly below the field, same width), and are never shown at the same time.\nfunction updateDropdownPosition(): void {\n if (!containerRef.value) { return; }\n const rect = containerRef.value.getBoundingClientRect();\n dropdownStyle.value = {\n position: 'fixed',\n top: `${rect.bottom + 2}px`,\n left: `${rect.left}px`,\n width: `${rect.width}px`,\n };\n}\n\nfunction onFieldMouseEnter(): void {\n isHovered.value = true;\n if (props.expandOnHover) {\n nextTick(updateDropdownPosition);\n }\n}\n\nconst visibleCount = ref(2);\n\n// Selection snapshot captured the instant the dropdown opens, used only to freeze the\n// sort order when pullSelectedToTop is set — does not react to later `selected` changes\n// while the dropdown stays open.\nconst pinnedSnapshot = ref<T[]>([]);\n\n// Selected values not present in `options` — only populated when allowCustomValue is set,\n// so a custom value typed via handleCustomValueEnter still shows (checked) in the dropdown.\nconst customSelectedOptions = computed<T[]>(() => {\n if (!props.allowCustomValue) { return []; }\n return (props.selected ?? []).filter((item) => !isInOptions(item));\n});\n\nconst visibleOptions = computed<T[]>(() => {\n const query = searchQuery.value.toLowerCase();\n const filteredCustom = query\n ? customSelectedOptions.value.filter((option) => getLabel(option).toLowerCase().includes(query))\n : customSelectedOptions.value;\n const combined = [...displayedOptions.value, ...filteredCustom];\n if (!props.pullSelectedToTop) {\n return combined;\n }\n return [...combined.filter(isPinned), ...combined.filter((option) => !isPinned(option))];\n});\n\nconst allSelected = computed(() => {\n if (visibleOptions.value.length === 0) {\n return false;\n }\n return visibleOptions.value.every((option) => isSelected(option));\n});\n\nconst hasSelected = computed(() => (props.selected?.length ?? 0) > 0);\n\nconst selectionLabels = computed(() =>\n (props.selected ?? []).slice(0, visibleCount.value).map(getLabel).join(', ')\n);\n\nconst overflowCount = computed(() =>\n Math.max(0, (props.selected?.length ?? 0) - visibleCount.value)\n);\n\nconst allLabelsText = computed(() =>\n (props.selected ?? []).map(getLabel).join(', ')\n);\n\nfunction isSelected(option: T): boolean {\n if (props.optionKey) {\n return props.selected?.find(s => s[props.optionKey] === option[props.optionKey]) !== undefined;\n } else {\n return props.selected?.includes(option) ?? false;\n }\n}\n\nfunction isInOptions(option: T): boolean {\n if (props.optionKey) {\n return props.options.some((opt) => opt[props.optionKey] === option[props.optionKey]);\n } else {\n return props.options.includes(option);\n }\n}\n\nfunction isPinned(option: T): boolean {\n if (props.optionKey) {\n return pinnedSnapshot.value.some((s) => s[props.optionKey] === option[props.optionKey]);\n } else {\n return pinnedSnapshot.value.includes(option);\n }\n}\n\nfunction toggleOption(option: T): void {\n const current = props.selected ?? [];\n if (isSelected(option)) {\n const key = props.optionKey;\n emit('update:selected', key\n ? current.filter((item) => item[key] !== option[key])\n : current.filter((item) => item !== option)\n );\n } else {\n emit('update:selected', [...current, option]);\n }\n}\n\nfunction handleCustomValueEnter(): void {\n if (!props.allowCustomValue) { return; }\n const value = searchQuery.value.trim();\n if (!value) { return; }\n const customOption = value as unknown as T;\n if (!isSelected(customOption)) {\n emit('update:selected', [...(props.selected ?? []), customOption]);\n }\n searchQuery.value = '';\n}\n\nfunction toggleAll(val: boolean): void {\n const current = props.selected ?? [];\n if (val) {\n const toAdd = visibleOptions.value.filter((option: T) => !isSelected(option));\n emit('update:selected', [...current, ...toAdd]);\n } else {\n const key = props.optionKey;\n emit('update:selected', current.filter((item: T) => key\n ? !visibleOptions.value.some((opt) => opt[key] === item[key])\n : !visibleOptions.value.includes(item)\n ));\n }\n}\n\nfunction updateVisibleCount(): void {\n const container = selectionRef.value;\n const selected = props.selected ?? [];\n if (!container || selected.length < 2) {\n visibleCount.value = selected.length;\n return;\n }\n\n const availableWidth = container.offsetWidth;\n if (availableWidth === 0) {\n return;\n }\n\n const labels = selected.map(getLabel);\n const measurer = document.createElement('span');\n measurer.style.cssText = 'position:absolute;visibility:hidden;white-space:nowrap;pointer-events:none;';\n container.appendChild(measurer);\n\n measurer.textContent = labels.join(', ');\n if (measurer.offsetWidth <= availableWidth) {\n visibleCount.value = labels.length;\n container.removeChild(measurer);\n return;\n }\n\n measurer.textContent = `(+${labels.length})`;\n const badgeWidth = measurer.offsetWidth + 4;\n const textAvailable = availableWidth - badgeWidth;\n\n let count = 0;\n for (let i = 0; i < labels.length; i++) {\n measurer.textContent = labels.slice(0, i + 1).join(', ');\n if (measurer.offsetWidth > textAvailable) {\n break;\n }\n count = i + 1;\n }\n\n container.removeChild(measurer);\n visibleCount.value = Math.max(1, count);\n}\n\nlet resizeObserver: ResizeObserver | null = null;\n\nonMounted(() => {\n if (selectionRef.value) {\n resizeObserver = new ResizeObserver(updateVisibleCount);\n resizeObserver.observe(selectionRef.value);\n }\n updateVisibleCount();\n // Keep the teleported dropdown aligned when the page scrolls or the viewport resizes\n window.addEventListener('scroll', updateDropdownPosition, true);\n window.addEventListener('resize', updateDropdownPosition);\n});\n\nonUnmounted(() => {\n resizeObserver?.disconnect();\n window.removeEventListener('scroll', updateDropdownPosition, true);\n window.removeEventListener('resize', updateDropdownPosition);\n});\n\nwatch(() => props.selected, updateVisibleCount);\n\nwatch(isOpen, (val) => {\n if (val) {\n pinnedSnapshot.value = [...(props.selected ?? [])];\n nextTick(updateDropdownPosition);\n } else {\n nextTick(updateVisibleCount);\n }\n});\n</script>\n\n<style scoped lang=\"scss\">\n.octopus-multiselect {\n position: relative;\n\n .octopus-multiselect-field {\n display: flex;\n align-items: center;\n border: 1px solid var(--octopus-border-default);\n border-radius: var(--octopus-border-radius);\n background: white;\n cursor: pointer;\n\n &.open {\n border-color: var(--octopus-primary);\n }\n\n &.disabled {\n background: var(--octopus-secondary-lighter);\n cursor: default;\n }\n\n &.noBorder {\n border: none;\n }\n }\n\n .octopus-multiselect-selection {\n display: flex;\n align-items: center;\n flex: 1;\n min-width: 0;\n padding: 0.4rem 0.5rem;\n height: 2rem;\n gap: 0.25rem;\n }\n\n .octopus-multiselect-selection-text {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .octopus-multiselect-selection-count {\n flex-shrink: 0;\n white-space: nowrap;\n color: var(--octopus-primary);\n }\n\n .octopus-multiselect-input {\n flex: 1;\n border: none;\n background: transparent;\n padding: 0.4rem 0.5rem;\n padding-right: 0;\n height: 2rem;\n outline: none;\n cursor: inherit;\n min-width: 0;\n }\n\n .octopus-multiselect-chevron {\n padding: 0.25rem 0.5rem;\n display: flex;\n align-items: center;\n }\n\n}\n\n// Dropdown/tooltip are teleported to body — scoped rules must be top-level so that\n// [data-v-xxxx] is matched directly on the element rather than via a descendant-of-.octopus-multiselect selector.\n.octopus-multiselect-hover-tooltip {\n z-index: 101;\n background: white;\n border: 1px solid var(--octopus-border-default);\n border-radius: var(--octopus-border-radius);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n padding: 0.5rem;\n word-break: break-word;\n pointer-events: none;\n}\n\n.octopus-multiselect-dropdown {\n z-index: 100;\n background: white;\n border: 1px solid var(--octopus-border-default);\n border-radius: var(--octopus-border-radius);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n padding: 0.25rem 0;\n\n > .octopus-form-item {\n padding: 0.25rem 0.5rem;\n border-bottom: 1px solid var(--octopus-secondary);\n }\n}\n\n.octopus-multiselect-options {\n max-height: 14rem;\n overflow-y: auto;\n\n .octopus-form-item {\n padding: 0.25rem 0.5rem;\n }\n}\n\nhr {\n border-top: 1px solid var(--octopus-secondary);\n border-bottom: none;\n margin: 0;\n}\n</style>\n","<template>\n <div\n ref=\"containerRef\"\n class=\"octopus-multiselect\"\n :class=\"{ 'form-margin': label }\"\n >\n <label\n v-if=\"label\"\n :for=\"computedId\"\n class=\"form-label\"\n >\n {{ label }}\n </label>\n\n <div\n class=\"octopus-multiselect-field\"\n :class=\"{ disabled, open: isOpen, noBorder }\"\n @click=\"openDropdown\"\n @mouseenter=\"onFieldMouseEnter\"\n @mouseleave=\"isHovered = false\"\n >\n <div\n v-show=\"hasSelected && !isOpen\"\n ref=\"selectionRef\"\n class=\"octopus-multiselect-selection\"\n >\n <span class=\"octopus-multiselect-selection-text\">{{ selectionLabels }}</span>\n <span\n v-if=\"overflowCount > 0\"\n class=\"octopus-multiselect-selection-count\"\n >(+{{ overflowCount }})</span>\n </div>\n <input\n v-show=\"!hasSelected || isOpen\"\n :id=\"computedId\"\n ref=\"inputRef\"\n v-model=\"searchQuery\"\n type=\"text\"\n class=\"octopus-multiselect-input\"\n :placeholder=\"inputPlaceholder\"\n :disabled=\"disabled\"\n @focus=\"openDropdown\"\n @input=\"handleInput\"\n @keydown.enter=\"handleCustomValueEnter\"\n >\n <button\n class=\"btn-transparent octopus-multiselect-chevron\"\n :disabled=\"disabled\"\n @click.stop=\"toggleDropdown\"\n >\n <ChevronDownIcon />\n </button>\n </div>\n\n <Teleport :to=\"teleportTarget\">\n <div\n v-if=\"expandOnHover && isHovered && !isOpen && overflowCount > 0\"\n class=\"octopus-multiselect-hover-tooltip\"\n :style=\"dropdownStyle\"\n >\n {{ allLabelsText }}\n </div>\n\n <div\n v-if=\"isOpen\"\n ref=\"dropdownRef\"\n class=\"octopus-multiselect-dropdown\"\n :style=\"dropdownStyle\"\n >\n <ClassicCheckbox\n :text-init=\"allSelected\"\n :label=\"selectAllText ?? t('All')\"\n :is-disabled=\"disabled\"\n @update:text-init=\"toggleAll\"\n />\n\n <div class=\"octopus-multiselect-options\">\n <ClassicCheckbox\n v-for=\"(option, index) in visibleOptions\"\n :key=\"index\"\n :text-init=\"isSelected(option)\"\n :label=\"getLabel(option)\"\n :is-disabled=\"disabled\"\n @update:text-init=\"toggleOption(option)\"\n />\n <template v-if=\"allowCustomValue && searchQuery.trim()\">\n <hr v-if=\"visibleOptions.length > 0\">\n <span class=\"text-indic px-2\">\n {{ t('Press Enter to add this value') }}\n </span>\n </template>\n <span v-else-if=\"visibleOptions.length === 0\" class=\"text-indic px-2\">\n {{ t('No elements found. Consider changing the search query.') }}\n </span>\n </div>\n </div>\n </Teleport>\n </div>\n</template>\n\n<script setup lang=\"ts\" generic=\"T\">\nimport { type CSSProperties, computed, nextTick, onMounted, onUnmounted, ref, watch } from 'vue';\nimport { useI18n } from 'vue-i18n';\nimport ChevronDownIcon from 'vue-material-design-icons/ChevronDown.vue';\nimport ClassicCheckbox from './ClassicCheckbox.vue';\nimport { useOctopusDropdown } from '../composable/form/useOctopusDropdown';\n\nconst props = defineProps<{\n /** Optional label displayed above the field. */\n label?: string;\n /** Currently selected items. Bind with `v-model:selected`. */\n selected?: T[];\n /** Full list of options to display or filter. */\n options: T[];\n /** Key of each option object to use as the ID */\n optionKey?: keyof T;\n /** Key of each option object to use as the display label. Omit when `options` is a\n * plain `string[]` — each string is used as its own label. Note: omitting this for\n * an object array is a runtime mistake (not caught at compile time) and will render\n * \"[object Object]\". */\n optionLabel?: keyof T & string;\n /** When true, pressing Enter in the search input adds the typed text as a new\n * selected value, even if it doesn't match any option. Intended for use when\n * options are plain strings (`optionLabel` omitted) — casting arbitrary typed\n * text into an object-shaped T would not produce a valid option. */\n allowCustomValue?: boolean;\n /** Disables the field and all checkboxes when true. */\n disabled?: boolean;\n /** Placeholder shown in the input when no items are selected. Defaults to the translated \"Search\" string. */\n placeholder?: string;\n /** Label for the \"select all\" checkbox. Defaults to the translated \"All\" string. */\n selectAllText?: string;\n /** Disable the border around the input */\n noBorder?: boolean;\n /** When true, hovering the closed field with overflow shows a tooltip listing all selected items. */\n expandOnHover?: boolean;\n /** When true, options selected at the moment the dropdown opens are moved to the\n * top of the list. This is a snapshot taken at open time — it does not live-reorder\n * while the dropdown stays open, only on the next closed→open transition. */\n pullSelectedToTop?: boolean;\n}>();\n\nconst emit = defineEmits<{\n /** Emitted when the selection changes. */\n (e: 'update:selected', value: T[]): void;\n /** Emitted on every input change. When listened to, the parent is responsible for\n * updating `options`; otherwise the component filters `options` client-side. */\n (e: 'search', query: string): void;\n}>();\n\nconst { t } = useI18n();\n\n// Ref on the teleported dropdown div — passed as ignored element to useOctopusDropdown\n// so clicks inside the dropdown don't trigger the click-outside handler.\nconst dropdownRef = ref<HTMLElement | null>(null);\n\nconst {\n searchQuery,\n isOpen,\n isHovered,\n containerRef,\n inputRef,\n teleportTarget,\n computedId,\n displayedOptions,\n inputPlaceholder,\n getLabel,\n openDropdown,\n toggleDropdown,\n handleInput,\n} = useOctopusDropdown(props, (query) => emit('search', query), 'multiselect', [dropdownRef]);\n\nconst selectionRef = ref<HTMLElement | null>(null);\n\n// Position of the teleported dropdown (position: fixed, anchored below the trigger field)\nconst dropdownStyle = ref<CSSProperties>({});\n\n// Also used to position the hover tooltip: both are teleported and anchored the same way\n// (fixed, directly below the field, same width), and are never shown at the same time.\nfunction updateDropdownPosition(): void {\n if (!containerRef.value) { return; }\n const rect = containerRef.value.getBoundingClientRect();\n dropdownStyle.value = {\n position: 'fixed',\n top: `${rect.bottom + 2}px`,\n left: `${rect.left}px`,\n width: `${rect.width}px`,\n };\n}\n\nfunction onFieldMouseEnter(): void {\n isHovered.value = true;\n if (props.expandOnHover) {\n nextTick(updateDropdownPosition);\n }\n}\n\nconst visibleCount = ref(2);\n\n// Selection snapshot captured the instant the dropdown opens, used only to freeze the\n// sort order when pullSelectedToTop is set — does not react to later `selected` changes\n// while the dropdown stays open.\nconst pinnedSnapshot = ref<T[]>([]);\n\n// Selected values not present in `options` — only populated when allowCustomValue is set,\n// so a custom value typed via handleCustomValueEnter still shows (checked) in the dropdown.\nconst customSelectedOptions = computed<T[]>(() => {\n if (!props.allowCustomValue) { return []; }\n return (props.selected ?? []).filter((item) => !isInOptions(item));\n});\n\nconst visibleOptions = computed<T[]>(() => {\n const query = searchQuery.value.toLowerCase();\n const filteredCustom = query\n ? customSelectedOptions.value.filter((option) => getLabel(option).toLowerCase().includes(query))\n : customSelectedOptions.value;\n const combined = [...displayedOptions.value, ...filteredCustom];\n if (!props.pullSelectedToTop) {\n return combined;\n }\n return [...combined.filter(isPinned), ...combined.filter((option) => !isPinned(option))];\n});\n\nconst allSelected = computed(() => {\n if (visibleOptions.value.length === 0) {\n return false;\n }\n return visibleOptions.value.every((option) => isSelected(option));\n});\n\nconst hasSelected = computed(() => (props.selected?.length ?? 0) > 0);\n\nconst selectionLabels = computed(() =>\n (props.selected ?? []).slice(0, visibleCount.value).map(getLabel).join(', ')\n);\n\nconst overflowCount = computed(() =>\n Math.max(0, (props.selected?.length ?? 0) - visibleCount.value)\n);\n\nconst allLabelsText = computed(() =>\n (props.selected ?? []).map(getLabel).join(', ')\n);\n\nfunction isSelected(option: T): boolean {\n if (props.optionKey) {\n return props.selected?.find(s => s[props.optionKey] === option[props.optionKey]) !== undefined;\n } else {\n return props.selected?.includes(option) ?? false;\n }\n}\n\nfunction isInOptions(option: T): boolean {\n if (props.optionKey) {\n return props.options.some((opt) => opt[props.optionKey] === option[props.optionKey]);\n } else {\n return props.options.includes(option);\n }\n}\n\nfunction isPinned(option: T): boolean {\n if (props.optionKey) {\n return pinnedSnapshot.value.some((s) => s[props.optionKey] === option[props.optionKey]);\n } else {\n return pinnedSnapshot.value.includes(option);\n }\n}\n\nfunction toggleOption(option: T): void {\n const current = props.selected ?? [];\n if (isSelected(option)) {\n const key = props.optionKey;\n emit('update:selected', key\n ? current.filter((item) => item[key] !== option[key])\n : current.filter((item) => item !== option)\n );\n } else {\n emit('update:selected', [...current, option]);\n }\n}\n\nfunction handleCustomValueEnter(): void {\n if (!props.allowCustomValue) { return; }\n const value = searchQuery.value.trim();\n if (!value) { return; }\n const customOption = value as unknown as T;\n if (!isSelected(customOption)) {\n emit('update:selected', [...(props.selected ?? []), customOption]);\n }\n searchQuery.value = '';\n}\n\nfunction toggleAll(val: boolean): void {\n const current = props.selected ?? [];\n if (val) {\n const toAdd = visibleOptions.value.filter((option: T) => !isSelected(option));\n emit('update:selected', [...current, ...toAdd]);\n } else {\n const key = props.optionKey;\n emit('update:selected', current.filter((item: T) => key\n ? !visibleOptions.value.some((opt) => opt[key] === item[key])\n : !visibleOptions.value.includes(item)\n ));\n }\n}\n\nfunction updateVisibleCount(): void {\n const container = selectionRef.value;\n const selected = props.selected ?? [];\n if (!container || selected.length < 2) {\n visibleCount.value = selected.length;\n return;\n }\n\n const availableWidth = container.offsetWidth;\n if (availableWidth === 0) {\n return;\n }\n\n const labels = selected.map(getLabel);\n const measurer = document.createElement('span');\n measurer.style.cssText = 'position:absolute;visibility:hidden;white-space:nowrap;pointer-events:none;';\n container.appendChild(measurer);\n\n measurer.textContent = labels.join(', ');\n if (measurer.offsetWidth <= availableWidth) {\n visibleCount.value = labels.length;\n container.removeChild(measurer);\n return;\n }\n\n measurer.textContent = `(+${labels.length})`;\n const badgeWidth = measurer.offsetWidth + 4;\n const textAvailable = availableWidth - badgeWidth;\n\n let count = 0;\n for (let i = 0; i < labels.length; i++) {\n measurer.textContent = labels.slice(0, i + 1).join(', ');\n if (measurer.offsetWidth > textAvailable) {\n break;\n }\n count = i + 1;\n }\n\n container.removeChild(measurer);\n visibleCount.value = Math.max(1, count);\n}\n\nlet resizeObserver: ResizeObserver | null = null;\n\nonMounted(() => {\n if (selectionRef.value) {\n resizeObserver = new ResizeObserver(updateVisibleCount);\n resizeObserver.observe(selectionRef.value);\n }\n updateVisibleCount();\n // Keep the teleported dropdown aligned when the page scrolls or the viewport resizes\n window.addEventListener('scroll', updateDropdownPosition, true);\n window.addEventListener('resize', updateDropdownPosition);\n});\n\nonUnmounted(() => {\n resizeObserver?.disconnect();\n window.removeEventListener('scroll', updateDropdownPosition, true);\n window.removeEventListener('resize', updateDropdownPosition);\n});\n\nwatch(() => props.selected, updateVisibleCount);\n\nwatch(isOpen, (val) => {\n if (val) {\n pinnedSnapshot.value = [...(props.selected ?? [])];\n nextTick(updateDropdownPosition);\n } else {\n nextTick(updateVisibleCount);\n }\n});\n</script>\n\n<style scoped lang=\"scss\">\n.octopus-multiselect {\n position: relative;\n\n .octopus-multiselect-field {\n display: flex;\n align-items: center;\n border: 1px solid var(--octopus-border-default);\n border-radius: var(--octopus-border-radius);\n background: white;\n cursor: pointer;\n\n &.open {\n border-color: var(--octopus-primary);\n }\n\n &.disabled {\n background: var(--octopus-secondary-lighter);\n cursor: default;\n }\n\n &.noBorder {\n border: none;\n }\n }\n\n .octopus-multiselect-selection {\n display: flex;\n align-items: center;\n flex: 1;\n min-width: 0;\n padding: 0.4rem 0.5rem;\n height: 2rem;\n gap: 0.25rem;\n }\n\n .octopus-multiselect-selection-text {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .octopus-multiselect-selection-count {\n flex-shrink: 0;\n white-space: nowrap;\n color: var(--octopus-primary);\n }\n\n .octopus-multiselect-input {\n flex: 1;\n border: none;\n background: transparent;\n padding: 0.4rem 0.5rem;\n padding-right: 0;\n height: 2rem;\n outline: none;\n cursor: inherit;\n min-width: 0;\n }\n\n .octopus-multiselect-chevron {\n padding: 0.25rem 0.5rem;\n display: flex;\n align-items: center;\n }\n\n}\n\n// Dropdown/tooltip are teleported to body — scoped rules must be top-level so that\n// [data-v-xxxx] is matched directly on the element rather than via a descendant-of-.octopus-multiselect selector.\n.octopus-multiselect-hover-tooltip {\n z-index: 101;\n background: white;\n border: 1px solid var(--octopus-border-default);\n border-radius: var(--octopus-border-radius);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n padding: 0.5rem;\n word-break: break-word;\n pointer-events: none;\n}\n\n.octopus-multiselect-dropdown {\n z-index: 100;\n background: white;\n border: 1px solid var(--octopus-border-default);\n border-radius: var(--octopus-border-radius);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n padding: 0.25rem 0;\n\n > .octopus-form-item {\n padding: 0.25rem 0.5rem;\n border-bottom: 1px solid var(--octopus-secondary);\n }\n}\n\n.octopus-multiselect-options {\n max-height: 14rem;\n overflow-y: auto;\n\n .octopus-form-item {\n padding: 0.25rem 0.5rem;\n }\n}\n\nhr {\n border-top: 1px solid var(--octopus-secondary);\n border-bottom: none;\n margin: 0;\n}\n</style>\n"],"mappings":";;;;;;;AAYA,SAAgB,mBACZ,OACA,YACA,WAAmB,oBAKnB,QACF;CACE,MAAM,EAAE,MAAM,QAAQ;CACtB,MAAM,WAAW,mBAAmB;CAEpC,MAAM,cAAc,IAAI,EAAE;CAC1B,MAAM,SAAS,IAAI,KAAK;CACxB,MAAM,YAAY,IAAI,KAAK;CAC3B,MAAM,eAAe,IAAwB,IAAI;CACjD,MAAM,WAAW,IAA6B,IAAI;CAMlD,MAAM,iBAAiB,IAA0B,cAAc;CAE/D,MAAM,aAAa,eAAe,GAAG,SAAS,GAAG,UAAU,KAAK;CAIhE,MAAM,oBAAoB,eAAe,CAAC,CAAC,UAAU,MAAM,OAAO,QAAQ;CAE1E,MAAM,mBAAmB,eAAoB;EACzC,IAAI,kBAAkB,OAClB,OAAO,MAAM;EAEjB,MAAM,QAAQ,YAAY,MAAM,YAAY;EAC5C,IAAI,CAAC,OACD,OAAO,MAAM;EAEjB,OAAO,MAAM,QAAQ,QAAQ,WACzB,SAAS,MAAM,EAAE,YAAY,EAAE,SAAS,KAAK,CACjD;CACJ,CAAC;CAED,MAAM,mBAAmB,eAAe,MAAM,eAAe,EAAE,QAAQ,CAAC;CAExE,SAAS,SAAS,QAAmB;EACjC,IAAI,MAAM,aACN,OAAO,OAAO,MAAM;EAExB,OAAO;CACX;CAEA,SAAS,eAAqB;EAC1B,IAAI,MAAM,YACN;EAEJ,eAAe,QAAQ,aAAa,OAAO,QAAqB,kBAAkB,KAAK;EACvF,OAAO,QAAQ;EACf,eAAe;GACX,SAAS,OAAO,MAAM;EAC1B,CAAC;CACL;CAEA,SAAS,gBAAsB;EAC3B,OAAO,QAAQ;EACf,YAAY,QAAQ;CACxB;CAEA,SAAS,iBAAuB;EAC5B,IAAI,OAAO,OACP,cAAc;OAEd,aAAa;CAErB;CAEA,SAAS,cAAoB;EACzB,IAAI,kBAAkB,OAClB,WAAW,YAAY,KAAK;CAEpC;CAEA,eAAe,cAAc,eAAe,QAAQ,SAAS,EAAE,OAAO,IAAI,KAAA,CAAS;CAEnF,OAAO;EACH;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACJ;AACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ECPA,MAAM,QAAQ;EAmCd,MAAM,OAAO;EAQb,MAAM,EAAE,MAAM,QAAQ;EAItB,MAAM,cAAc,IAAwB,IAAI;EAEhD,MAAM,EACF,aACA,QACA,WACA,cACA,UACA,gBACA,YACA,kBACA,kBACA,UACA,cACA,gBACA,gBACA,mBAAmB,QAAQ,UAAU,KAAK,UAAU,KAAK,GAAG,eAAe,CAAC,WAAW,CAAC;EAE5F,MAAM,eAAe,IAAwB,IAAI;EAGjD,MAAM,gBAAgB,IAAmB,CAAC,CAAC;EAI3C,SAAS,yBAA+B;GACpC,IAAI,CAAC,aAAa,OAAS;GAC3B,MAAM,OAAO,aAAa,MAAM,sBAAsB;GACtD,cAAc,QAAQ;IAClB,UAAU;IACV,KAAK,GAAG,KAAK,SAAS,EAAE;IACxB,MAAM,GAAG,KAAK,KAAK;IACnB,OAAO,GAAG,KAAK,MAAM;GACzB;EACJ;EAEA,SAAS,oBAA0B;GAC/B,UAAU,QAAQ;GAClB,IAAI,MAAM,eACN,SAAS,sBAAsB;EAEvC;EAEA,MAAM,eAAe,IAAI,CAAC;EAK1B,MAAM,iBAAiB,IAAS,CAAC,CAAC;EAIlC,MAAM,wBAAwB,eAAoB;GAC9C,IAAI,CAAC,MAAM,kBAAoB,OAAO,CAAC;GACvC,QAAQ,MAAM,YAAY,CAAC,GAAG,QAAQ,SAAS,CAAC,YAAY,IAAI,CAAC;EACrE,CAAC;EAED,MAAM,iBAAiB,eAAoB;GACvC,MAAM,QAAQ,YAAY,MAAM,YAAY;GAC5C,MAAM,iBAAiB,QACjB,sBAAsB,MAAM,QAAQ,WAAW,SAAS,MAAM,EAAE,YAAY,EAAE,SAAS,KAAK,CAAC,IAC7F,sBAAsB;GAC5B,MAAM,WAAW,CAAC,GAAG,iBAAiB,OAAO,GAAG,cAAc;GAC9D,IAAI,CAAC,MAAM,mBACP,OAAO;GAEX,OAAO,CAAC,GAAG,SAAS,OAAO,QAAQ,GAAG,GAAG,SAAS,QAAQ,WAAW,CAAC,SAAS,MAAM,CAAC,CAAC;EAC3F,CAAC;EAED,MAAM,cAAc,eAAe;GAC/B,IAAI,eAAe,MAAM,WAAW,GAChC,OAAO;GAEX,OAAO,eAAe,MAAM,OAAO,WAAW,WAAW,MAAM,CAAC;EACpE,CAAC;EAED,MAAM,cAAc,gBAAgB,MAAM,UAAU,UAAU,KAAK,CAAC;EAEpE,MAAM,kBAAkB,gBACnB,MAAM,YAAY,CAAC,GAAG,MAAM,GAAG,aAAa,KAAK,EAAE,IAAI,QAAQ,EAAE,KAAK,IAAI,CAC/E;EAEA,MAAM,gBAAgB,eAClB,KAAK,IAAI,IAAI,MAAM,UAAU,UAAU,KAAK,aAAa,KAAK,CAClE;EAEA,MAAM,gBAAgB,gBACjB,MAAM,YAAY,CAAC,GAAG,IAAI,QAAQ,EAAE,KAAK,IAAI,CAClD;EAEA,SAAS,WAAW,QAAoB;GACpC,IAAI,MAAM,WACN,OAAO,MAAM,UAAU,MAAK,MAAK,EAAE,MAAM,eAAe,OAAO,MAAM,UAAU,MAAM,KAAA;QAErF,OAAO,MAAM,UAAU,SAAS,MAAM,KAAK;EAEnD;EAEA,SAAS,YAAY,QAAoB;GACrC,IAAI,MAAM,WACN,OAAO,MAAM,QAAQ,MAAM,QAAQ,IAAI,MAAM,eAAe,OAAO,MAAM,UAAU;QAEnF,OAAO,MAAM,QAAQ,SAAS,MAAM;EAE5C;EAEA,SAAS,SAAS,QAAoB;GAClC,IAAI,MAAM,WACN,OAAO,eAAe,MAAM,MAAM,MAAM,EAAE,MAAM,eAAe,OAAO,MAAM,UAAU;QAEtF,OAAO,eAAe,MAAM,SAAS,MAAM;EAEnD;EAEA,SAAS,aAAa,QAAiB;GACnC,MAAM,UAAU,MAAM,YAAY,CAAC;GACnC,IAAI,WAAW,MAAM,GAAG;IACpB,MAAM,MAAM,MAAM;IAClB,KAAK,mBAAmB,MAClB,QAAQ,QAAQ,SAAS,KAAK,SAAS,OAAO,IAAI,IAClD,QAAQ,QAAQ,SAAS,SAAS,MAAM,CAC9C;GACJ,OACI,KAAK,mBAAmB,CAAC,GAAG,SAAS,MAAM,CAAC;EAEpD;EAEA,SAAS,yBAA+B;GACpC,IAAI,CAAC,MAAM,kBAAoB;GAC/B,MAAM,QAAQ,YAAY,MAAM,KAAK;GACrC,IAAI,CAAC,OAAS;GACd,MAAM,eAAe;GACrB,IAAI,CAAC,WAAW,YAAY,GACxB,KAAK,mBAAmB,CAAC,GAAI,MAAM,YAAY,CAAC,GAAI,YAAY,CAAC;GAErE,YAAY,QAAQ;EACxB;EAEA,SAAS,UAAU,KAAoB;GACnC,MAAM,UAAU,MAAM,YAAY,CAAC;GACnC,IAAI,KAAK;IACL,MAAM,QAAQ,eAAe,MAAM,QAAQ,WAAc,CAAC,WAAW,MAAM,CAAC;IAC5E,KAAK,mBAAmB,CAAC,GAAG,SAAS,GAAG,KAAK,CAAC;GAClD,OAAO;IACH,MAAM,MAAM,MAAM;IAClB,KAAK,mBAAmB,QAAQ,QAAQ,SAAY,MAC9C,CAAC,eAAe,MAAM,MAAM,QAAQ,IAAI,SAAS,KAAK,IAAI,IAC1D,CAAC,eAAe,MAAM,SAAS,IAAI,CACzC,CAAC;GACL;EACJ;EAEA,SAAS,qBAA2B;GAChC,MAAM,YAAY,aAAa;GAC/B,MAAM,WAAW,MAAM,YAAY,CAAC;GACpC,IAAI,CAAC,aAAa,SAAS,SAAS,GAAG;IACnC,aAAa,QAAQ,SAAS;IAC9B;GACJ;GAEA,MAAM,iBAAiB,UAAU;GACjC,IAAI,mBAAmB,GACnB;GAGJ,MAAM,SAAS,SAAS,IAAI,QAAQ;GACpC,MAAM,WAAW,SAAS,cAAc,MAAM;GAC9C,SAAS,MAAM,UAAU;GACzB,UAAU,YAAY,QAAQ;GAE9B,SAAS,cAAc,OAAO,KAAK,IAAI;GACvC,IAAI,SAAS,eAAe,gBAAgB;IACxC,aAAa,QAAQ,OAAO;IAC5B,UAAU,YAAY,QAAQ;IAC9B;GACJ;GAEA,SAAS,cAAc,KAAK,OAAO,OAAO;GAE1C,MAAM,gBAAgB,kBADH,SAAS,cAAc;GAG1C,IAAI,QAAQ;GACZ,KAAK,IAAI,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;IACpC,SAAS,cAAc,OAAO,MAAM,GAAG,IAAI,CAAC,EAAE,KAAK,IAAI;IACvD,IAAI,SAAS,cAAc,eACvB;IAEJ,QAAQ,IAAI;GAChB;GAEA,UAAU,YAAY,QAAQ;GAC9B,aAAa,QAAQ,KAAK,IAAI,GAAG,KAAK;EAC1C;EAEA,IAAI,iBAAwC;EAE5C,gBAAgB;GACZ,IAAI,aAAa,OAAO;IACpB,iBAAiB,IAAI,eAAe,kBAAkB;IACtD,eAAe,QAAQ,aAAa,KAAK;GAC7C;GACA,mBAAmB;GAEnB,OAAO,iBAAiB,UAAU,wBAAwB,IAAI;GAC9D,OAAO,iBAAiB,UAAU,sBAAsB;EAC5D,CAAC;EAED,kBAAkB;GACd,gBAAgB,WAAW;GAC3B,OAAO,oBAAoB,UAAU,wBAAwB,IAAI;GACjE,OAAO,oBAAoB,UAAU,sBAAsB;EAC/D,CAAC;EAED,YAAY,MAAM,UAAU,kBAAkB;EAE9C,MAAM,SAAS,QAAQ;GACnB,IAAI,KAAK;IACL,eAAe,QAAQ,CAAC,GAAI,MAAM,YAAY,CAAC,CAAE;IACjD,SAAS,sBAAsB;GACnC,OACI,SAAS,kBAAkB;EAEnC,CAAC;;uBAvXG,mBAgGM,OAAA;aA/FE;IAAJ,KAAI;IACJ,OAAK,eAAA,CAAC,uBAAqB,EAAA,eACF,QAAA,MAAK,CAAA,CAAA;;IAGpB,QAAA,SAAA,UAAA,GADV,mBAMQ,SAAA;;KAJH,KAAK,MAAA,UAAA;KACN,OAAM;uBAEH,QAAA,KAAK,GAAA,GAAA,UAAA,KAAA,mBAAA,IAAA,IAAA;IAGZ,mBAsCM,OAAA;KArCF,OAAK,eAAA,CAAC,6BAA2B;MAAA,UACvB,QAAA;MAAQ,MAAQ,MAAA,MAAA;MAAM,UAAE,QAAA;KAAQ,CAAA,CAAA;KACzC,SAAK,OAAA,OAAA,OAAA,MAAA,GAAA,SAAE,MAAA,YAAA,KAAA,MAAA,YAAA,EAAA,GAAA,IAAA;KACP,cAAY;KACZ,cAAU,OAAA,OAAA,OAAA,MAAA,WAAE,UAAA,QAAS;;oBAEtB,mBAUM,OAAA;eARE;MAAJ,KAAI;MACJ,OAAM;SAEN,mBAA6E,QAA7E,YAA6E,gBAAzB,gBAAA,KAAe,GAAA,CAAA,GAEzD,cAAA,QAAa,KAAA,UAAA,GADvB,mBAG8B,QAH9B,YAGC,OAAE,gBAAG,cAAA,KAAa,IAAG,KAAC,CAAA,KAAA,mBAAA,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA,CAAA,CAAA,OARf,YAAA,SAAW,CAAK,MAAA,MAAA,CAAM,CAAA,CAAA;oBAUlC,mBAYC,SAAA;MAVI,IAAI,MAAA,UAAA;eACD;MAAJ,KAAI;oGACgB,QAAA,SAAA;MACpB,MAAK;MACL,OAAM;MACL,aAAa,MAAA,gBAAA;MACb,UAAU,QAAA;MACV,SAAK,OAAA,OAAA,OAAA,MAAA,GAAA,SAAE,MAAA,YAAA,KAAA,MAAA,YAAA,EAAA,GAAA,IAAA;MACP,SAAK,OAAA,OAAA,OAAA,MAAA,GAAA,SAAE,MAAA,WAAA,KAAA,MAAA,WAAA,EAAA,GAAA,IAAA;MACP,WAAO,SAAQ,wBAAsB,CAAA,OAAA,CAAA;yCAV7B,YAAA,SAAe,MAAA,MAAA,CAAM,GAAA,CAAA,YAGrB,MAAA,WAAA,CAAW,CAAA,CAAA;KASxB,mBAMS,UAAA;MALL,OAAM;MACL,UAAU,QAAA;MACV,SAAK,OAAA,OAAA,OAAA,KAAA,eAAA,GAAA,SAAO,MAAA,cAAA,KAAA,MAAA,cAAA,EAAA,GAAA,IAAA,GAAc,CAAA,MAAA,CAAA;SAE3B,YAAmB,eAAA,CAAA,GAAA,GAAA,UAAA;;kBAI3B,YA0CW,UAAA,EA1CA,IAAI,MAAA,cAAA,EAAc,GAAA,CAEf,QAAA,iBAAiB,MAAA,SAAA,KAAS,CAAK,MAAA,MAAA,KAAU,cAAA,QAAa,KAAA,UAAA,GADhE,mBAMM,OAAA;;KAJF,OAAM;KACL,OAAK,eAAE,cAAA,KAAa;uBAElB,cAAA,KAAa,GAAA,CAAA,KAAA,mBAAA,IAAA,IAAA,GAIV,MAAA,MAAA,KAAA,UAAA,GADV,mBAgCM,OAAA;;cA9BE;KAAJ,KAAI;KACJ,OAAM;KACL,OAAK,eAAE,cAAA,KAAa;QAErB,YAKE,yBAAA;KAJG,aAAW,YAAA;KACX,OAAO,QAAA,iBAAiB,MAAA,CAAA,EAAC,KAAA;KACzB,eAAa,QAAA;KACb,qBAAkB;;;;;QAGvB,mBAkBM,OAlBN,YAkBM,EAAA,UAAA,IAAA,GAjBF,mBAOE,UAAA,MAAA,WAN4B,eAAA,QAAlB,QAAQ,UAAK;yBADzB,YAOE,yBAAA;MALG,KAAK;MACL,aAAW,WAAW,MAAM;MAC5B,OAAO,MAAA,QAAA,EAAS,MAAM;MACtB,eAAa,QAAA;MACb,sBAAgB,WAAE,aAAa,MAAM;;;;;;;eAE1B,QAAA,oBAAoB,MAAA,WAAA,EAAY,KAAI,KAAA,UAAA,GAApD,mBAKW,UAAA,EAAA,KAAA,EAAA,GAAA,CAJG,eAAA,MAAe,SAAM,KAAA,UAAA,GAA/B,mBAAqC,MAAA,UAAA,KAAA,mBAAA,IAAA,IAAA,GACrC,mBAEO,QAFP,YAEO,gBADA,MAAA,CAAA,EAAC,+BAAA,CAAA,GAAA,CAAA,CAAA,GAAA,EAAA,KAGK,eAAA,MAAe,WAAM,KAAA,UAAA,GAAtC,mBAEO,QAFP,YAEO,gBADA,MAAA,CAAA,EAAC,wDAAA,CAAA,GAAA,CAAA,KAAA,mBAAA,IAAA,IAAA,CAAA,CAAA,CAAA,GAAA,CAAA,KAAA,mBAAA,IAAA,IAAA,CAAA,GAAA,GAAA,CAAA,IAAA,CAAA"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OctopusMultiselect-tXNIWVpp.mjs","names":[],"sources":["../src/components/composable/form/useOctopusDropdown.ts","../src/components/form/OctopusMultiselect.vue","../src/components/form/OctopusMultiselect.vue"],"sourcesContent":["import { computed, getCurrentInstance, nextTick, ref } from 'vue';\nimport { type MaybeElementRef, onClickOutside } from '@vueuse/core';\nimport { useI18n } from 'vue-i18n';\n\nexport interface OctopusDropdownProps<T> {\n options: T[];\n optionLabel?: keyof T & string;\n optionKey?: keyof T;\n isDisabled?: boolean;\n placeholder?: string;\n}\n\nexport function useOctopusDropdown<T>(\n props: OctopusDropdownProps<T>,\n emitSearch: (query: string) => void,\n idPrefix: string = 'octopus-dropdown',\n // Extra elements to exclude from the click-outside check.\n // Needed when the dropdown is teleported outside containerRef (e.g. to body):\n // without this, clicking inside the teleported dropdown triggers closeDropdown\n // because it is no longer a DOM descendant of containerRef.\n ignore?: MaybeElementRef[]\n) {\n const { t } = useI18n();\n const instance = getCurrentInstance();\n\n const searchQuery = ref('');\n const isOpen = ref(false);\n const isHovered = ref(false);\n const containerRef = ref<HTMLElement | null>(null);\n const inputRef = ref<HTMLInputElement | null>(null);\n // Where the dropdown/options list (teleported out of normal flow) should land. Defaults\n // to the app root, but when this component is used inside a ClassicPopover, teleporting\n // there instead keeps the dropdown a real DOM descendant of it — otherwise both end up as\n // siblings under the same teleport target, and ClassicPopover's outside-click/blur checks\n // (which rely on DOM containment) see clicks inside the dropdown as \"outside\" and close it.\n const teleportTarget = ref<string | HTMLElement>('.octopus-app');\n\n const computedId = computed(() => `${idPrefix}-${instance?.uid}`);\n\n // vnode.props contains the raw parent-provided props before defineEmits strips them\n // from attrs, so onSearch is present whenever the parent writes @search=\"...\".\n const hasSearchListener = computed(() => !!instance?.vnode.props?.onSearch);\n\n const displayedOptions = computed((): T[] => {\n if (hasSearchListener.value) {\n return props.options;\n }\n const query = searchQuery.value.toLowerCase();\n if (!query) {\n return props.options;\n }\n return props.options.filter((option) =>\n getLabel(option).toLowerCase().includes(query)\n );\n });\n\n const inputPlaceholder = computed(() => props.placeholder ?? t('Search'));\n\n function getLabel(option: T): string {\n if (props.optionLabel) {\n return option[props.optionLabel] as string;\n }\n return option as unknown as string;\n }\n\n function openDropdown(): void {\n if (props.isDisabled) {\n return;\n }\n teleportTarget.value = containerRef.value?.closest<HTMLElement>('.octopus-popover') ?? '.octopus-app';\n isOpen.value = true;\n nextTick(() => {\n inputRef.value?.focus();\n });\n }\n\n function closeDropdown(): void {\n isOpen.value = false;\n searchQuery.value = '';\n }\n\n function toggleDropdown(): void {\n if (isOpen.value) {\n closeDropdown();\n } else {\n openDropdown();\n }\n }\n\n function handleInput(): void {\n if (hasSearchListener.value) {\n emitSearch(searchQuery.value);\n }\n }\n\n onClickOutside(containerRef, closeDropdown, ignore?.length ? { ignore } : undefined);\n\n return {\n searchQuery,\n isOpen,\n isHovered,\n containerRef,\n inputRef,\n teleportTarget,\n computedId,\n hasSearchListener,\n displayedOptions,\n inputPlaceholder,\n getLabel,\n openDropdown,\n closeDropdown,\n toggleDropdown,\n handleInput,\n };\n}\n","<template>\n <div\n ref=\"containerRef\"\n class=\"octopus-multiselect\"\n :class=\"{ 'form-margin': label }\"\n >\n <label\n v-if=\"label\"\n :for=\"computedId\"\n class=\"form-label\"\n >\n {{ label }}\n </label>\n\n <div\n class=\"octopus-multiselect-field\"\n :class=\"{ disabled, open: isOpen, noBorder }\"\n @click=\"openDropdown\"\n @mouseenter=\"onFieldMouseEnter\"\n @mouseleave=\"isHovered = false\"\n >\n <div\n v-show=\"hasSelected && !isOpen\"\n ref=\"selectionRef\"\n class=\"octopus-multiselect-selection\"\n >\n <span class=\"octopus-multiselect-selection-text\">{{ selectionLabels }}</span>\n <span\n v-if=\"overflowCount > 0\"\n class=\"octopus-multiselect-selection-count\"\n >(+{{ overflowCount }})</span>\n </div>\n <input\n v-show=\"!hasSelected || isOpen\"\n :id=\"computedId\"\n ref=\"inputRef\"\n v-model=\"searchQuery\"\n type=\"text\"\n class=\"octopus-multiselect-input\"\n :placeholder=\"inputPlaceholder\"\n :disabled=\"disabled\"\n @focus=\"openDropdown\"\n @input=\"handleInput\"\n @keydown.enter=\"handleCustomValueEnter\"\n >\n <button\n class=\"btn-transparent octopus-multiselect-chevron\"\n :disabled=\"disabled\"\n @click.stop=\"toggleDropdown\"\n >\n <ChevronDownIcon />\n </button>\n </div>\n\n <Teleport :to=\"teleportTarget\">\n <div\n v-if=\"expandOnHover && isHovered && !isOpen && overflowCount > 0\"\n class=\"octopus-multiselect-hover-tooltip\"\n :style=\"dropdownStyle\"\n >\n {{ allLabelsText }}\n </div>\n\n <div\n v-if=\"isOpen\"\n ref=\"dropdownRef\"\n class=\"octopus-multiselect-dropdown\"\n :style=\"dropdownStyle\"\n >\n <ClassicCheckbox\n :text-init=\"allSelected\"\n :label=\"selectAllText ?? t('All')\"\n :is-disabled=\"disabled\"\n @update:text-init=\"toggleAll\"\n />\n\n <div class=\"octopus-multiselect-options\">\n <ClassicCheckbox\n v-for=\"(option, index) in visibleOptions\"\n :key=\"index\"\n :text-init=\"isSelected(option)\"\n :label=\"getLabel(option)\"\n :is-disabled=\"disabled\"\n @update:text-init=\"toggleOption(option)\"\n />\n <template v-if=\"allowCustomValue && searchQuery.trim()\">\n <hr v-if=\"visibleOptions.length > 0\">\n <span class=\"text-indic px-2\">\n {{ t('Press Enter to add this value') }}\n </span>\n </template>\n <span v-else-if=\"visibleOptions.length === 0\" class=\"text-indic px-2\">\n {{ t('No elements found. Consider changing the search query.') }}\n </span>\n </div>\n </div>\n </Teleport>\n </div>\n</template>\n\n<script setup lang=\"ts\" generic=\"T\">\nimport { type CSSProperties, computed, nextTick, onMounted, onUnmounted, ref, watch } from 'vue';\nimport { useI18n } from 'vue-i18n';\nimport ChevronDownIcon from 'vue-material-design-icons/ChevronDown.vue';\nimport ClassicCheckbox from './ClassicCheckbox.vue';\nimport { useOctopusDropdown } from '../composable/form/useOctopusDropdown';\n\nconst props = defineProps<{\n /** Optional label displayed above the field. */\n label?: string;\n /** Currently selected items. Bind with `v-model:selected`. */\n selected?: T[];\n /** Full list of options to display or filter. */\n options: T[];\n /** Key of each option object to use as the ID */\n optionKey?: keyof T;\n /** Key of each option object to use as the display label. Omit when `options` is a\n * plain `string[]` — each string is used as its own label. Note: omitting this for\n * an object array is a runtime mistake (not caught at compile time) and will render\n * \"[object Object]\". */\n optionLabel?: keyof T & string;\n /** When true, pressing Enter in the search input adds the typed text as a new\n * selected value, even if it doesn't match any option. Intended for use when\n * options are plain strings (`optionLabel` omitted) — casting arbitrary typed\n * text into an object-shaped T would not produce a valid option. */\n allowCustomValue?: boolean;\n /** Disables the field and all checkboxes when true. */\n disabled?: boolean;\n /** Placeholder shown in the input when no items are selected. Defaults to the translated \"Search\" string. */\n placeholder?: string;\n /** Label for the \"select all\" checkbox. Defaults to the translated \"All\" string. */\n selectAllText?: string;\n /** Disable the border around the input */\n noBorder?: boolean;\n /** When true, hovering the closed field with overflow shows a tooltip listing all selected items. */\n expandOnHover?: boolean;\n /** When true, options selected at the moment the dropdown opens are moved to the\n * top of the list. This is a snapshot taken at open time — it does not live-reorder\n * while the dropdown stays open, only on the next closed→open transition. */\n pullSelectedToTop?: boolean;\n}>();\n\nconst emit = defineEmits<{\n /** Emitted when the selection changes. */\n (e: 'update:selected', value: T[]): void;\n /** Emitted on every input change. When listened to, the parent is responsible for\n * updating `options`; otherwise the component filters `options` client-side. */\n (e: 'search', query: string): void;\n}>();\n\nconst { t } = useI18n();\n\n// Ref on the teleported dropdown div — passed as ignored element to useOctopusDropdown\n// so clicks inside the dropdown don't trigger the click-outside handler.\nconst dropdownRef = ref<HTMLElement | null>(null);\n\nconst {\n searchQuery,\n isOpen,\n isHovered,\n containerRef,\n inputRef,\n teleportTarget,\n computedId,\n displayedOptions,\n inputPlaceholder,\n getLabel,\n openDropdown,\n toggleDropdown,\n handleInput,\n} = useOctopusDropdown(props, (query) => emit('search', query), 'multiselect', [dropdownRef]);\n\nconst selectionRef = ref<HTMLElement | null>(null);\n\n// Position of the teleported dropdown (position: fixed, anchored below the trigger field)\nconst dropdownStyle = ref<CSSProperties>({});\n\n// Also used to position the hover tooltip: both are teleported and anchored the same way\n// (fixed, directly below the field, same width), and are never shown at the same time.\nfunction updateDropdownPosition(): void {\n if (!containerRef.value) { return; }\n const rect = containerRef.value.getBoundingClientRect();\n dropdownStyle.value = {\n position: 'fixed',\n top: `${rect.bottom + 2}px`,\n left: `${rect.left}px`,\n width: `${rect.width}px`,\n };\n}\n\nfunction onFieldMouseEnter(): void {\n isHovered.value = true;\n if (props.expandOnHover) {\n nextTick(updateDropdownPosition);\n }\n}\n\nconst visibleCount = ref(2);\n\n// Selection snapshot captured the instant the dropdown opens, used only to freeze the\n// sort order when pullSelectedToTop is set — does not react to later `selected` changes\n// while the dropdown stays open.\nconst pinnedSnapshot = ref<T[]>([]);\n\n// Selected values not present in `options` — only populated when allowCustomValue is set,\n// so a custom value typed via handleCustomValueEnter still shows (checked) in the dropdown.\nconst customSelectedOptions = computed<T[]>(() => {\n if (!props.allowCustomValue) { return []; }\n return (props.selected ?? []).filter((item) => !isInOptions(item));\n});\n\nconst visibleOptions = computed<T[]>(() => {\n const query = searchQuery.value.toLowerCase();\n const filteredCustom = query\n ? customSelectedOptions.value.filter((option) => getLabel(option).toLowerCase().includes(query))\n : customSelectedOptions.value;\n const combined = [...displayedOptions.value, ...filteredCustom];\n if (!props.pullSelectedToTop) {\n return combined;\n }\n return [...combined.filter(isPinned), ...combined.filter((option) => !isPinned(option))];\n});\n\nconst allSelected = computed(() => {\n if (visibleOptions.value.length === 0) {\n return false;\n }\n return visibleOptions.value.every((option) => isSelected(option));\n});\n\nconst hasSelected = computed(() => (props.selected?.length ?? 0) > 0);\n\nconst selectionLabels = computed(() =>\n (props.selected ?? []).slice(0, visibleCount.value).map(getLabel).join(', ')\n);\n\nconst overflowCount = computed(() =>\n Math.max(0, (props.selected?.length ?? 0) - visibleCount.value)\n);\n\nconst allLabelsText = computed(() =>\n (props.selected ?? []).map(getLabel).join(', ')\n);\n\nfunction isSelected(option: T): boolean {\n if (props.optionKey) {\n return props.selected?.find(s => s[props.optionKey] === option[props.optionKey]) !== undefined;\n } else {\n return props.selected?.includes(option) ?? false;\n }\n}\n\nfunction isInOptions(option: T): boolean {\n if (props.optionKey) {\n return props.options.some((opt) => opt[props.optionKey] === option[props.optionKey]);\n } else {\n return props.options.includes(option);\n }\n}\n\nfunction isPinned(option: T): boolean {\n if (props.optionKey) {\n return pinnedSnapshot.value.some((s) => s[props.optionKey] === option[props.optionKey]);\n } else {\n return pinnedSnapshot.value.includes(option);\n }\n}\n\nfunction toggleOption(option: T): void {\n const current = props.selected ?? [];\n if (isSelected(option)) {\n const key = props.optionKey;\n emit('update:selected', key\n ? current.filter((item) => item[key] !== option[key])\n : current.filter((item) => item !== option)\n );\n } else {\n emit('update:selected', [...current, option]);\n }\n}\n\nfunction handleCustomValueEnter(): void {\n if (!props.allowCustomValue) { return; }\n const value = searchQuery.value.trim();\n if (!value) { return; }\n const customOption = value as unknown as T;\n if (!isSelected(customOption)) {\n emit('update:selected', [...(props.selected ?? []), customOption]);\n }\n searchQuery.value = '';\n}\n\nfunction toggleAll(val: boolean): void {\n const current = props.selected ?? [];\n if (val) {\n const toAdd = visibleOptions.value.filter((option: T) => !isSelected(option));\n emit('update:selected', [...current, ...toAdd]);\n } else {\n const key = props.optionKey;\n emit('update:selected', current.filter((item: T) => key\n ? !visibleOptions.value.some((opt) => opt[key] === item[key])\n : !visibleOptions.value.includes(item)\n ));\n }\n}\n\nfunction updateVisibleCount(): void {\n const container = selectionRef.value;\n const selected = props.selected ?? [];\n if (!container || selected.length < 2) {\n visibleCount.value = selected.length;\n return;\n }\n\n const availableWidth = container.offsetWidth;\n if (availableWidth === 0) {\n return;\n }\n\n const labels = selected.map(getLabel);\n const measurer = document.createElement('span');\n measurer.style.cssText = 'position:absolute;visibility:hidden;white-space:nowrap;pointer-events:none;';\n container.appendChild(measurer);\n\n measurer.textContent = labels.join(', ');\n if (measurer.offsetWidth <= availableWidth) {\n visibleCount.value = labels.length;\n container.removeChild(measurer);\n return;\n }\n\n measurer.textContent = `(+${labels.length})`;\n const badgeWidth = measurer.offsetWidth + 4;\n const textAvailable = availableWidth - badgeWidth;\n\n let count = 0;\n for (let i = 0; i < labels.length; i++) {\n measurer.textContent = labels.slice(0, i + 1).join(', ');\n if (measurer.offsetWidth > textAvailable) {\n break;\n }\n count = i + 1;\n }\n\n container.removeChild(measurer);\n visibleCount.value = Math.max(1, count);\n}\n\nlet resizeObserver: ResizeObserver | null = null;\n\nonMounted(() => {\n if (selectionRef.value) {\n resizeObserver = new ResizeObserver(updateVisibleCount);\n resizeObserver.observe(selectionRef.value);\n }\n updateVisibleCount();\n // Keep the teleported dropdown aligned when the page scrolls or the viewport resizes\n window.addEventListener('scroll', updateDropdownPosition, true);\n window.addEventListener('resize', updateDropdownPosition);\n});\n\nonUnmounted(() => {\n resizeObserver?.disconnect();\n window.removeEventListener('scroll', updateDropdownPosition, true);\n window.removeEventListener('resize', updateDropdownPosition);\n});\n\nwatch(() => props.selected, updateVisibleCount);\n\nwatch(isOpen, (val) => {\n if (val) {\n pinnedSnapshot.value = [...(props.selected ?? [])];\n nextTick(updateDropdownPosition);\n } else {\n nextTick(updateVisibleCount);\n }\n});\n</script>\n\n<style scoped lang=\"scss\">\n.octopus-multiselect {\n position: relative;\n\n .octopus-multiselect-field {\n display: flex;\n align-items: center;\n border: 1px solid var(--octopus-border-default);\n border-radius: var(--octopus-border-radius);\n background: white;\n cursor: pointer;\n\n &.open {\n border-color: var(--octopus-primary);\n }\n\n &.disabled {\n background: var(--octopus-secondary-lighter);\n cursor: default;\n }\n\n &.noBorder {\n border: none;\n }\n }\n\n .octopus-multiselect-selection {\n display: flex;\n align-items: center;\n flex: 1;\n min-width: 0;\n padding: 0.4rem 0.5rem;\n height: 2rem;\n gap: 0.25rem;\n }\n\n .octopus-multiselect-selection-text {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .octopus-multiselect-selection-count {\n flex-shrink: 0;\n white-space: nowrap;\n color: var(--octopus-primary);\n }\n\n .octopus-multiselect-input {\n flex: 1;\n border: none;\n background: transparent;\n padding: 0.4rem 0.5rem;\n padding-right: 0;\n height: 2rem;\n outline: none;\n cursor: inherit;\n min-width: 0;\n }\n\n .octopus-multiselect-chevron {\n padding: 0.25rem 0.5rem;\n display: flex;\n align-items: center;\n }\n\n}\n\n// Dropdown/tooltip are teleported to body — scoped rules must be top-level so that\n// [data-v-xxxx] is matched directly on the element rather than via a descendant-of-.octopus-multiselect selector.\n.octopus-multiselect-hover-tooltip {\n z-index: 101;\n background: white;\n border: 1px solid var(--octopus-border-default);\n border-radius: var(--octopus-border-radius);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n padding: 0.5rem;\n word-break: break-word;\n pointer-events: none;\n}\n\n.octopus-multiselect-dropdown {\n z-index: 100;\n background: white;\n border: 1px solid var(--octopus-border-default);\n border-radius: var(--octopus-border-radius);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n padding: 0.25rem 0;\n\n > .octopus-form-item {\n padding: 0.25rem 0.5rem;\n border-bottom: 1px solid var(--octopus-secondary);\n }\n}\n\n.octopus-multiselect-options {\n max-height: 14rem;\n overflow-y: auto;\n\n .octopus-form-item {\n padding: 0.25rem 0.5rem;\n }\n}\n\nhr {\n border-top: 1px solid var(--octopus-secondary);\n border-bottom: none;\n margin: 0;\n}\n</style>\n","<template>\n <div\n ref=\"containerRef\"\n class=\"octopus-multiselect\"\n :class=\"{ 'form-margin': label }\"\n >\n <label\n v-if=\"label\"\n :for=\"computedId\"\n class=\"form-label\"\n >\n {{ label }}\n </label>\n\n <div\n class=\"octopus-multiselect-field\"\n :class=\"{ disabled, open: isOpen, noBorder }\"\n @click=\"openDropdown\"\n @mouseenter=\"onFieldMouseEnter\"\n @mouseleave=\"isHovered = false\"\n >\n <div\n v-show=\"hasSelected && !isOpen\"\n ref=\"selectionRef\"\n class=\"octopus-multiselect-selection\"\n >\n <span class=\"octopus-multiselect-selection-text\">{{ selectionLabels }}</span>\n <span\n v-if=\"overflowCount > 0\"\n class=\"octopus-multiselect-selection-count\"\n >(+{{ overflowCount }})</span>\n </div>\n <input\n v-show=\"!hasSelected || isOpen\"\n :id=\"computedId\"\n ref=\"inputRef\"\n v-model=\"searchQuery\"\n type=\"text\"\n class=\"octopus-multiselect-input\"\n :placeholder=\"inputPlaceholder\"\n :disabled=\"disabled\"\n @focus=\"openDropdown\"\n @input=\"handleInput\"\n @keydown.enter=\"handleCustomValueEnter\"\n >\n <button\n class=\"btn-transparent octopus-multiselect-chevron\"\n :disabled=\"disabled\"\n @click.stop=\"toggleDropdown\"\n >\n <ChevronDownIcon />\n </button>\n </div>\n\n <Teleport :to=\"teleportTarget\">\n <div\n v-if=\"expandOnHover && isHovered && !isOpen && overflowCount > 0\"\n class=\"octopus-multiselect-hover-tooltip\"\n :style=\"dropdownStyle\"\n >\n {{ allLabelsText }}\n </div>\n\n <div\n v-if=\"isOpen\"\n ref=\"dropdownRef\"\n class=\"octopus-multiselect-dropdown\"\n :style=\"dropdownStyle\"\n >\n <ClassicCheckbox\n :text-init=\"allSelected\"\n :label=\"selectAllText ?? t('All')\"\n :is-disabled=\"disabled\"\n @update:text-init=\"toggleAll\"\n />\n\n <div class=\"octopus-multiselect-options\">\n <ClassicCheckbox\n v-for=\"(option, index) in visibleOptions\"\n :key=\"index\"\n :text-init=\"isSelected(option)\"\n :label=\"getLabel(option)\"\n :is-disabled=\"disabled\"\n @update:text-init=\"toggleOption(option)\"\n />\n <template v-if=\"allowCustomValue && searchQuery.trim()\">\n <hr v-if=\"visibleOptions.length > 0\">\n <span class=\"text-indic px-2\">\n {{ t('Press Enter to add this value') }}\n </span>\n </template>\n <span v-else-if=\"visibleOptions.length === 0\" class=\"text-indic px-2\">\n {{ t('No elements found. Consider changing the search query.') }}\n </span>\n </div>\n </div>\n </Teleport>\n </div>\n</template>\n\n<script setup lang=\"ts\" generic=\"T\">\nimport { type CSSProperties, computed, nextTick, onMounted, onUnmounted, ref, watch } from 'vue';\nimport { useI18n } from 'vue-i18n';\nimport ChevronDownIcon from 'vue-material-design-icons/ChevronDown.vue';\nimport ClassicCheckbox from './ClassicCheckbox.vue';\nimport { useOctopusDropdown } from '../composable/form/useOctopusDropdown';\n\nconst props = defineProps<{\n /** Optional label displayed above the field. */\n label?: string;\n /** Currently selected items. Bind with `v-model:selected`. */\n selected?: T[];\n /** Full list of options to display or filter. */\n options: T[];\n /** Key of each option object to use as the ID */\n optionKey?: keyof T;\n /** Key of each option object to use as the display label. Omit when `options` is a\n * plain `string[]` — each string is used as its own label. Note: omitting this for\n * an object array is a runtime mistake (not caught at compile time) and will render\n * \"[object Object]\". */\n optionLabel?: keyof T & string;\n /** When true, pressing Enter in the search input adds the typed text as a new\n * selected value, even if it doesn't match any option. Intended for use when\n * options are plain strings (`optionLabel` omitted) — casting arbitrary typed\n * text into an object-shaped T would not produce a valid option. */\n allowCustomValue?: boolean;\n /** Disables the field and all checkboxes when true. */\n disabled?: boolean;\n /** Placeholder shown in the input when no items are selected. Defaults to the translated \"Search\" string. */\n placeholder?: string;\n /** Label for the \"select all\" checkbox. Defaults to the translated \"All\" string. */\n selectAllText?: string;\n /** Disable the border around the input */\n noBorder?: boolean;\n /** When true, hovering the closed field with overflow shows a tooltip listing all selected items. */\n expandOnHover?: boolean;\n /** When true, options selected at the moment the dropdown opens are moved to the\n * top of the list. This is a snapshot taken at open time — it does not live-reorder\n * while the dropdown stays open, only on the next closed→open transition. */\n pullSelectedToTop?: boolean;\n}>();\n\nconst emit = defineEmits<{\n /** Emitted when the selection changes. */\n (e: 'update:selected', value: T[]): void;\n /** Emitted on every input change. When listened to, the parent is responsible for\n * updating `options`; otherwise the component filters `options` client-side. */\n (e: 'search', query: string): void;\n}>();\n\nconst { t } = useI18n();\n\n// Ref on the teleported dropdown div — passed as ignored element to useOctopusDropdown\n// so clicks inside the dropdown don't trigger the click-outside handler.\nconst dropdownRef = ref<HTMLElement | null>(null);\n\nconst {\n searchQuery,\n isOpen,\n isHovered,\n containerRef,\n inputRef,\n teleportTarget,\n computedId,\n displayedOptions,\n inputPlaceholder,\n getLabel,\n openDropdown,\n toggleDropdown,\n handleInput,\n} = useOctopusDropdown(props, (query) => emit('search', query), 'multiselect', [dropdownRef]);\n\nconst selectionRef = ref<HTMLElement | null>(null);\n\n// Position of the teleported dropdown (position: fixed, anchored below the trigger field)\nconst dropdownStyle = ref<CSSProperties>({});\n\n// Also used to position the hover tooltip: both are teleported and anchored the same way\n// (fixed, directly below the field, same width), and are never shown at the same time.\nfunction updateDropdownPosition(): void {\n if (!containerRef.value) { return; }\n const rect = containerRef.value.getBoundingClientRect();\n dropdownStyle.value = {\n position: 'fixed',\n top: `${rect.bottom + 2}px`,\n left: `${rect.left}px`,\n width: `${rect.width}px`,\n };\n}\n\nfunction onFieldMouseEnter(): void {\n isHovered.value = true;\n if (props.expandOnHover) {\n nextTick(updateDropdownPosition);\n }\n}\n\nconst visibleCount = ref(2);\n\n// Selection snapshot captured the instant the dropdown opens, used only to freeze the\n// sort order when pullSelectedToTop is set — does not react to later `selected` changes\n// while the dropdown stays open.\nconst pinnedSnapshot = ref<T[]>([]);\n\n// Selected values not present in `options` — only populated when allowCustomValue is set,\n// so a custom value typed via handleCustomValueEnter still shows (checked) in the dropdown.\nconst customSelectedOptions = computed<T[]>(() => {\n if (!props.allowCustomValue) { return []; }\n return (props.selected ?? []).filter((item) => !isInOptions(item));\n});\n\nconst visibleOptions = computed<T[]>(() => {\n const query = searchQuery.value.toLowerCase();\n const filteredCustom = query\n ? customSelectedOptions.value.filter((option) => getLabel(option).toLowerCase().includes(query))\n : customSelectedOptions.value;\n const combined = [...displayedOptions.value, ...filteredCustom];\n if (!props.pullSelectedToTop) {\n return combined;\n }\n return [...combined.filter(isPinned), ...combined.filter((option) => !isPinned(option))];\n});\n\nconst allSelected = computed(() => {\n if (visibleOptions.value.length === 0) {\n return false;\n }\n return visibleOptions.value.every((option) => isSelected(option));\n});\n\nconst hasSelected = computed(() => (props.selected?.length ?? 0) > 0);\n\nconst selectionLabels = computed(() =>\n (props.selected ?? []).slice(0, visibleCount.value).map(getLabel).join(', ')\n);\n\nconst overflowCount = computed(() =>\n Math.max(0, (props.selected?.length ?? 0) - visibleCount.value)\n);\n\nconst allLabelsText = computed(() =>\n (props.selected ?? []).map(getLabel).join(', ')\n);\n\nfunction isSelected(option: T): boolean {\n if (props.optionKey) {\n return props.selected?.find(s => s[props.optionKey] === option[props.optionKey]) !== undefined;\n } else {\n return props.selected?.includes(option) ?? false;\n }\n}\n\nfunction isInOptions(option: T): boolean {\n if (props.optionKey) {\n return props.options.some((opt) => opt[props.optionKey] === option[props.optionKey]);\n } else {\n return props.options.includes(option);\n }\n}\n\nfunction isPinned(option: T): boolean {\n if (props.optionKey) {\n return pinnedSnapshot.value.some((s) => s[props.optionKey] === option[props.optionKey]);\n } else {\n return pinnedSnapshot.value.includes(option);\n }\n}\n\nfunction toggleOption(option: T): void {\n const current = props.selected ?? [];\n if (isSelected(option)) {\n const key = props.optionKey;\n emit('update:selected', key\n ? current.filter((item) => item[key] !== option[key])\n : current.filter((item) => item !== option)\n );\n } else {\n emit('update:selected', [...current, option]);\n }\n}\n\nfunction handleCustomValueEnter(): void {\n if (!props.allowCustomValue) { return; }\n const value = searchQuery.value.trim();\n if (!value) { return; }\n const customOption = value as unknown as T;\n if (!isSelected(customOption)) {\n emit('update:selected', [...(props.selected ?? []), customOption]);\n }\n searchQuery.value = '';\n}\n\nfunction toggleAll(val: boolean): void {\n const current = props.selected ?? [];\n if (val) {\n const toAdd = visibleOptions.value.filter((option: T) => !isSelected(option));\n emit('update:selected', [...current, ...toAdd]);\n } else {\n const key = props.optionKey;\n emit('update:selected', current.filter((item: T) => key\n ? !visibleOptions.value.some((opt) => opt[key] === item[key])\n : !visibleOptions.value.includes(item)\n ));\n }\n}\n\nfunction updateVisibleCount(): void {\n const container = selectionRef.value;\n const selected = props.selected ?? [];\n if (!container || selected.length < 2) {\n visibleCount.value = selected.length;\n return;\n }\n\n const availableWidth = container.offsetWidth;\n if (availableWidth === 0) {\n return;\n }\n\n const labels = selected.map(getLabel);\n const measurer = document.createElement('span');\n measurer.style.cssText = 'position:absolute;visibility:hidden;white-space:nowrap;pointer-events:none;';\n container.appendChild(measurer);\n\n measurer.textContent = labels.join(', ');\n if (measurer.offsetWidth <= availableWidth) {\n visibleCount.value = labels.length;\n container.removeChild(measurer);\n return;\n }\n\n measurer.textContent = `(+${labels.length})`;\n const badgeWidth = measurer.offsetWidth + 4;\n const textAvailable = availableWidth - badgeWidth;\n\n let count = 0;\n for (let i = 0; i < labels.length; i++) {\n measurer.textContent = labels.slice(0, i + 1).join(', ');\n if (measurer.offsetWidth > textAvailable) {\n break;\n }\n count = i + 1;\n }\n\n container.removeChild(measurer);\n visibleCount.value = Math.max(1, count);\n}\n\nlet resizeObserver: ResizeObserver | null = null;\n\nonMounted(() => {\n if (selectionRef.value) {\n resizeObserver = new ResizeObserver(updateVisibleCount);\n resizeObserver.observe(selectionRef.value);\n }\n updateVisibleCount();\n // Keep the teleported dropdown aligned when the page scrolls or the viewport resizes\n window.addEventListener('scroll', updateDropdownPosition, true);\n window.addEventListener('resize', updateDropdownPosition);\n});\n\nonUnmounted(() => {\n resizeObserver?.disconnect();\n window.removeEventListener('scroll', updateDropdownPosition, true);\n window.removeEventListener('resize', updateDropdownPosition);\n});\n\nwatch(() => props.selected, updateVisibleCount);\n\nwatch(isOpen, (val) => {\n if (val) {\n pinnedSnapshot.value = [...(props.selected ?? [])];\n nextTick(updateDropdownPosition);\n } else {\n nextTick(updateVisibleCount);\n }\n});\n</script>\n\n<style scoped lang=\"scss\">\n.octopus-multiselect {\n position: relative;\n\n .octopus-multiselect-field {\n display: flex;\n align-items: center;\n border: 1px solid var(--octopus-border-default);\n border-radius: var(--octopus-border-radius);\n background: white;\n cursor: pointer;\n\n &.open {\n border-color: var(--octopus-primary);\n }\n\n &.disabled {\n background: var(--octopus-secondary-lighter);\n cursor: default;\n }\n\n &.noBorder {\n border: none;\n }\n }\n\n .octopus-multiselect-selection {\n display: flex;\n align-items: center;\n flex: 1;\n min-width: 0;\n padding: 0.4rem 0.5rem;\n height: 2rem;\n gap: 0.25rem;\n }\n\n .octopus-multiselect-selection-text {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .octopus-multiselect-selection-count {\n flex-shrink: 0;\n white-space: nowrap;\n color: var(--octopus-primary);\n }\n\n .octopus-multiselect-input {\n flex: 1;\n border: none;\n background: transparent;\n padding: 0.4rem 0.5rem;\n padding-right: 0;\n height: 2rem;\n outline: none;\n cursor: inherit;\n min-width: 0;\n }\n\n .octopus-multiselect-chevron {\n padding: 0.25rem 0.5rem;\n display: flex;\n align-items: center;\n }\n\n}\n\n// Dropdown/tooltip are teleported to body — scoped rules must be top-level so that\n// [data-v-xxxx] is matched directly on the element rather than via a descendant-of-.octopus-multiselect selector.\n.octopus-multiselect-hover-tooltip {\n z-index: 101;\n background: white;\n border: 1px solid var(--octopus-border-default);\n border-radius: var(--octopus-border-radius);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n padding: 0.5rem;\n word-break: break-word;\n pointer-events: none;\n}\n\n.octopus-multiselect-dropdown {\n z-index: 100;\n background: white;\n border: 1px solid var(--octopus-border-default);\n border-radius: var(--octopus-border-radius);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n padding: 0.25rem 0;\n\n > .octopus-form-item {\n padding: 0.25rem 0.5rem;\n border-bottom: 1px solid var(--octopus-secondary);\n }\n}\n\n.octopus-multiselect-options {\n max-height: 14rem;\n overflow-y: auto;\n\n .octopus-form-item {\n padding: 0.25rem 0.5rem;\n }\n}\n\nhr {\n border-top: 1px solid var(--octopus-secondary);\n border-bottom: none;\n margin: 0;\n}\n</style>\n"],"mappings":"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"}