@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.
- package/dist/AccessibilityModal-Bk-lyxlI.mjs +119 -0
- package/dist/AccessibilityModal-Bk-lyxlI.mjs.map +1 -0
- package/dist/AccessibilityModal-DqRtmHwG.mjs.map +1 -0
- package/dist/AdsProgressBar-B6Mi09W8.mjs +28 -0
- package/dist/AdsProgressBar-B6Mi09W8.mjs.map +1 -0
- package/dist/AdsProgressBar-CAP7Zj--.mjs.map +1 -0
- package/dist/AdvancedSearch-CVglkFkt.mjs.map +1 -0
- package/dist/AdvancedSearch-D6vwfxo5.mjs +317 -0
- package/dist/AdvancedSearch-D6vwfxo5.mjs.map +1 -0
- package/dist/AdvancedSearch-DINUCkA8.mjs.map +1 -0
- package/dist/AdvancedSearch-XvvmHfah.mjs.map +1 -0
- package/dist/AmazonMusicIcon-BbyyRbP4.mjs +49 -0
- package/dist/AmazonMusicIcon-BbyyRbP4.mjs.map +1 -0
- package/dist/AmazonMusicIcon-D5vNh4HG.mjs.map +1 -0
- package/dist/ApplePodcastIcon-Cq5SSyRm.mjs +51 -0
- package/dist/ApplePodcastIcon-Cq5SSyRm.mjs.map +1 -0
- package/dist/ApplePodcastIcon-DtC4TS8H.mjs.map +1 -0
- package/dist/CategoryChooser-DWEL9V5p.mjs.map +1 -0
- package/dist/CategoryChooser-DklLXzrz.mjs +216 -0
- package/dist/CategoryChooser-DklLXzrz.mjs.map +1 -0
- package/dist/CategoryFilter-BYG8Fnzn.mjs.map +1 -0
- package/dist/CategoryFilter-Bg279Zhp.mjs.map +1 -0
- package/dist/CategoryFilter-CmS3Ny_9.mjs +205 -0
- package/dist/CategoryFilter-CmS3Ny_9.mjs.map +1 -0
- package/dist/CategoryList-CfMKagU8.mjs +153 -0
- package/dist/CategoryList-CfMKagU8.mjs.map +1 -0
- package/dist/CategoryList-CtYJ1Otd.mjs.map +1 -0
- package/dist/CategoryList-fb__vBIZ.mjs.map +1 -0
- package/dist/CategoryPage-BXpFZSoD.mjs.map +1 -0
- package/dist/CategoryPage-CjFCzM5T.mjs.map +1 -0
- package/dist/CategoryPage-D8ZeqW_O.mjs +41 -0
- package/dist/CategoryPage-D8ZeqW_O.mjs.map +1 -0
- package/dist/CategoryPage-DOpUFF1y.mjs.map +1 -0
- package/dist/CategorySearchFilter-1oMd2Mm5.mjs +54 -0
- package/dist/CategorySearchFilter-1oMd2Mm5.mjs.map +1 -0
- package/dist/CategorySearchFilter-CEGWqMSt.mjs.map +1 -0
- package/dist/ChapteringModal-Bj_VrtB1.mjs.map +1 -0
- package/dist/ChapteringModal-C35ILBs7.mjs +64 -0
- package/dist/ChapteringModal-C35ILBs7.mjs.map +1 -0
- package/dist/ChapteringModal-CN-qJH9j.mjs.map +1 -0
- package/dist/CheckIdentityModal-4XD5uK5v.mjs.map +1 -0
- package/dist/CheckIdentityModal-RQYssX9o.mjs.map +1 -0
- package/dist/CheckIdentityModal-ekQqQKIU.mjs +62 -0
- package/dist/CheckIdentityModal-ekQqQKIU.mjs.map +1 -0
- package/dist/ChooseEpisodesNumber-BbsEFK07.mjs +50 -0
- package/dist/ChooseEpisodesNumber-BbsEFK07.mjs.map +1 -0
- package/dist/ChooseEpisodesNumber-OlhXXsCa.mjs.map +1 -0
- package/dist/ClassicAccordion-H690GTb-.mjs +87 -0
- package/dist/ClassicAccordion-H690GTb-.mjs.map +1 -0
- package/dist/ClassicAccordion-S0e-IhFa.mjs.map +1 -0
- package/dist/ClassicAlert-D51F43qS.mjs +57 -0
- package/dist/ClassicAlert-D51F43qS.mjs.map +1 -0
- package/dist/ClassicAlert-DUQplMvs.mjs.map +1 -0
- package/dist/ClassicBigChip-BbWdjK3W.mjs.map +1 -0
- package/dist/ClassicBigChip-CMefjO08.mjs.map +1 -0
- package/dist/ClassicBigChip-CaUJ5EI5.mjs +33 -0
- package/dist/ClassicBigChip-CaUJ5EI5.mjs.map +1 -0
- package/dist/ClassicCheckbox-BHKCPtLR.mjs.map +1 -0
- package/dist/ClassicCheckbox-CqA5WUGc.mjs +113 -0
- package/dist/ClassicCheckbox-CqA5WUGc.mjs.map +1 -0
- package/dist/ClassicContentEditable-BSsnA6oo.mjs.map +1 -0
- package/dist/ClassicContentEditable-R2O8-zPZ.mjs +52 -0
- package/dist/ClassicContentEditable-R2O8-zPZ.mjs.map +1 -0
- package/dist/ClassicCopyButton-M9AP3MKD.mjs.map +1 -0
- package/dist/ClassicCopyButton-y5PyWjLR.mjs +69 -0
- package/dist/ClassicCopyButton-y5PyWjLR.mjs.map +1 -0
- package/dist/ClassicDatePicker-CS5ufjLj.mjs +226 -0
- package/dist/ClassicDatePicker-CS5ufjLj.mjs.map +1 -0
- package/dist/ClassicDatePicker-DWVn4oHu.mjs.map +1 -0
- package/dist/ClassicEmojiPicker-BJeHH_oM.mjs +74 -0
- package/dist/ClassicEmojiPicker-BJeHH_oM.mjs.map +1 -0
- package/dist/ClassicEmojiPicker-EQy5H_zL.mjs.map +1 -0
- package/dist/ClassicHelpButton-B6jXpEKT.mjs.map +1 -0
- package/dist/ClassicHelpButton-DkCQoPpA.mjs +57 -0
- package/dist/ClassicHelpButton-DkCQoPpA.mjs.map +1 -0
- package/dist/ClassicInputText-B7EAwP2N.mjs.map +1 -0
- package/dist/ClassicInputText-adAE0MPy.mjs +335 -0
- package/dist/ClassicInputText-adAE0MPy.mjs.map +1 -0
- package/dist/ClassicLazy-7mFHxG6O.mjs.map +1 -0
- package/dist/ClassicLazy-DKgiCdDI.mjs +92 -0
- package/dist/ClassicLazy-DKgiCdDI.mjs.map +1 -0
- package/dist/ClassicLoading-Crlw7cAx.mjs.map +1 -0
- package/dist/ClassicLoading-DZLIyuUd.mjs +52 -0
- package/dist/ClassicLoading-DZLIyuUd.mjs.map +1 -0
- package/dist/ClassicModal-CilwHp9p.mjs.map +1 -0
- package/dist/ClassicModal-DbRPVcJr.mjs +87 -0
- package/dist/ClassicModal-DbRPVcJr.mjs.map +1 -0
- package/dist/ClassicModalInBody-BkaRcZZx.mjs.map +1 -0
- package/dist/ClassicModalInBody-Dq9PBoaB.mjs +77 -0
- package/dist/ClassicModalInBody-Dq9PBoaB.mjs.map +1 -0
- package/dist/ClassicMultiselect-BEY-HpGk.mjs.map +1 -0
- package/dist/ClassicMultiselect-wJ9U_4b2.mjs +246 -0
- package/dist/ClassicMultiselect-wJ9U_4b2.mjs.map +1 -0
- package/dist/ClassicNav-Dvm8faD9.mjs.map +1 -0
- package/dist/ClassicNav-P2h4OFEY.mjs +65 -0
- package/dist/ClassicNav-P2h4OFEY.mjs.map +1 -0
- package/dist/ClassicPopover-BIyLKorz.mjs.map +1 -0
- package/dist/ClassicPopover-Bk5kf37e.mjs +261 -0
- package/dist/ClassicPopover-Bk5kf37e.mjs.map +1 -0
- package/dist/ClassicRadio-BwylgGYF.mjs.map +1 -0
- package/dist/ClassicRadio-Dr6od5uM.mjs +78 -0
- package/dist/ClassicRadio-Dr6od5uM.mjs.map +1 -0
- package/dist/ClassicRadioLabel-DIij8S-y.mjs +86 -0
- package/dist/ClassicRadioLabel-DIij8S-y.mjs.map +1 -0
- package/dist/ClassicRadioLabel-ynBzFxC2.mjs.map +1 -0
- package/dist/ClassicSearch-BPWOTzhw.mjs +76 -0
- package/dist/ClassicSearch-BPWOTzhw.mjs.map +1 -0
- package/dist/ClassicSearch-D5yT0JRA.mjs.map +1 -0
- package/dist/ClassicSelect-BaY2yvwP.mjs.map +1 -0
- package/dist/ClassicSelect-BeCuKMad.mjs +138 -0
- package/dist/ClassicSelect-BeCuKMad.mjs.map +1 -0
- package/dist/ClassicSpinner-CL99QR-h.mjs +39 -0
- package/dist/ClassicSpinner-CL99QR-h.mjs.map +1 -0
- package/dist/ClassicSpinner-lNq7TnmD.mjs.map +1 -0
- package/dist/ClassicTabs-Bcine4_p.mjs.map +1 -0
- package/dist/ClassicTabs-sNP268jp.mjs +52 -0
- package/dist/ClassicTabs-sNP268jp.mjs.map +1 -0
- package/dist/ClassicTagInput-DrIZVI0X.mjs +82 -0
- package/dist/ClassicTagInput-DrIZVI0X.mjs.map +1 -0
- package/dist/ClassicTagInput-HM3VUbHp.mjs.map +1 -0
- package/dist/ClassicWysiwyg-BKq8ExjM.mjs.map +1 -0
- package/dist/ClassicWysiwyg-CRx5L0lR.mjs +200 -0
- package/dist/ClassicWysiwyg-CRx5L0lR.mjs.map +1 -0
- package/dist/ClipboardModal-DcUIqJGT.mjs +64 -0
- package/dist/ClipboardModal-DcUIqJGT.mjs.map +1 -0
- package/dist/ClipboardModal-MJw-Q5H5.mjs.map +1 -0
- package/dist/ClipboardModal-VRWz6S2A.mjs.map +1 -0
- package/dist/CommentBasicView-BIiF59xV.mjs.map +1 -0
- package/dist/CommentBasicView-CmDziW-M.mjs +103 -0
- package/dist/CommentBasicView-CmDziW-M.mjs.map +1 -0
- package/dist/CommentInput-BH-j4xYE.mjs.map +1 -0
- package/dist/CommentInput-CCpv7RF8.mjs +150 -0
- package/dist/CommentInput-CCpv7RF8.mjs.map +1 -0
- package/dist/CommentInput-DOuugk5A.mjs.map +1 -0
- package/dist/CommentItem-B1wXPEZZ.mjs +194 -0
- package/dist/CommentItem-B1wXPEZZ.mjs.map +1 -0
- package/dist/CommentItem-DuJsZoIk.mjs.map +1 -0
- package/dist/CommentItem-XLeueLaZ.mjs.map +1 -0
- package/dist/CommentList-ByBLWHYE.mjs.map +1 -0
- package/dist/CommentList-CIoNgXiD.mjs.map +1 -0
- package/dist/CommentList-dSoD09Di.mjs +262 -0
- package/dist/CommentList-dSoD09Di.mjs.map +1 -0
- package/dist/CommentMoreActions-CnczLaid.mjs +248 -0
- package/dist/CommentMoreActions-CnczLaid.mjs.map +1 -0
- package/dist/CommentMoreActions-CyEIOrzQ.mjs.map +1 -0
- package/dist/CommentMoreActions-X9tC_I0A.mjs.map +1 -0
- package/dist/CommentName-CkGKXK3_.mjs +73 -0
- package/dist/CommentName-CkGKXK3_.mjs.map +1 -0
- package/dist/CommentName-rapSs0fp.mjs.map +1 -0
- package/dist/CommentName-sabBJAA8.mjs.map +1 -0
- package/dist/CommentParentInfo-CQXTtdBn.mjs.map +1 -0
- package/dist/CommentParentInfo-D3nI0C85.mjs.map +1 -0
- package/dist/CommentParentInfo-J1vHOCm3.mjs +47 -0
- package/dist/CommentParentInfo-J1vHOCm3.mjs.map +1 -0
- package/dist/CommentPlayer-70dIz2Rg.mjs +67 -0
- package/dist/CommentPlayer-70dIz2Rg.mjs.map +1 -0
- package/dist/CommentPlayer-BVhVIPgD.mjs.map +1 -0
- package/dist/CommentPlayer-Cfa-z5qQ.mjs.map +1 -0
- package/dist/CommentSection-2kJz9TRg.mjs.map +1 -0
- package/dist/CommentSection-Bz6q4N6d.mjs +113 -0
- package/dist/CommentSection-Bz6q4N6d.mjs.map +1 -0
- package/dist/CommentSection-DRpvhHqB.mjs.map +1 -0
- package/dist/CommentStore-BFkEAz_S.mjs.map +1 -0
- package/dist/CommentStore-BjQ0AGHa.mjs +355 -0
- package/dist/CommentStore-BjQ0AGHa.mjs.map +1 -0
- package/dist/ContractPreviewModal-DhoEBsqo.mjs +75 -0
- package/dist/ContractPreviewModal-DhoEBsqo.mjs.map +1 -0
- package/dist/ContractPreviewModal-DjCwrq7e.mjs.map +1 -0
- package/dist/ContractPreviewModal-Dqyo5xUg.mjs.map +1 -0
- package/dist/CountDown-CAUtA0Vp.mjs.map +1 -0
- package/dist/CountDown-Ce0nxiby.mjs +28 -0
- package/dist/CountDown-Ce0nxiby.mjs.map +1 -0
- package/dist/CountdownOctopus-CR9zvBmW.mjs +34 -0
- package/dist/CountdownOctopus-CR9zvBmW.mjs.map +1 -0
- package/dist/CountdownOctopus-i6-l0aLA.mjs.map +1 -0
- package/dist/DateFilter-DD9cY_la.mjs.map +1 -0
- package/dist/DateFilter-DkU1MSa-.mjs +101 -0
- package/dist/DateFilter-DkU1MSa-.mjs.map +1 -0
- package/dist/DeezerIcon-BUdIKeqN.mjs.map +1 -0
- package/dist/DeezerIcon-D4cq4iPQ.mjs +49 -0
- package/dist/DeezerIcon-D4cq4iPQ.mjs.map +1 -0
- package/dist/DownloadPodcastButton-C5jl5QoM.mjs.map +1 -0
- package/dist/DownloadPodcastButton-Cbtq6s60.mjs.map +1 -0
- package/dist/DownloadPodcastButton-DLMz5Siw.mjs +39 -0
- package/dist/DownloadPodcastButton-DLMz5Siw.mjs.map +1 -0
- package/dist/EditCommentModal-3jlBtPco.mjs.map +1 -0
- package/dist/EditCommentModal-B5xc_AC2.mjs.map +1 -0
- package/dist/EditCommentModal-_iEit4p4.mjs +134 -0
- package/dist/EditCommentModal-_iEit4p4.mjs.map +1 -0
- package/dist/EditFtpIcon-D5VaHXWl.mjs.map +1 -0
- package/dist/EditFtpIcon-Do2G7rmM.mjs +47 -0
- package/dist/EditFtpIcon-Do2G7rmM.mjs.map +1 -0
- package/dist/EmissionGroupChooser-CQ6wTihw.mjs.map +1 -0
- package/dist/EmissionGroupChooser-D3xCu4tW.mjs +55 -0
- package/dist/EmissionGroupChooser-D3xCu4tW.mjs.map +1 -0
- package/dist/EmissionGroupChooser-DheKnUrA.mjs.map +1 -0
- package/dist/EmissionInlineList-CPgw-_jC.mjs +129 -0
- package/dist/EmissionInlineList-CPgw-_jC.mjs.map +1 -0
- package/dist/EmissionInlineList-CeCcnsfP.mjs.map +1 -0
- package/dist/EmissionInlineList-DD5tKHdg.mjs.map +1 -0
- package/dist/EmissionItem-Cl53in7H.mjs +144 -0
- package/dist/EmissionItem-Cl53in7H.mjs.map +1 -0
- package/dist/EmissionItem-DO1G4P7I.mjs.map +1 -0
- package/dist/EmissionItem-Dyamdgqm.mjs.map +1 -0
- package/dist/EmissionItem-NQh_dIN1.mjs.map +1 -0
- package/dist/EmissionList-CNizEXC9.mjs.map +1 -0
- package/dist/EmissionList-D4DFhKPt.mjs +286 -0
- package/dist/EmissionList-D4DFhKPt.mjs.map +1 -0
- package/dist/EmissionList-DfhK6dgl.mjs.map +1 -0
- package/dist/EmissionList-JEE2Remj.mjs.map +1 -0
- package/dist/EmissionPage-B1OhP9b5.mjs.map +1 -0
- package/dist/EmissionPage-B3fju1Sc.mjs +247 -0
- package/dist/EmissionPage-B3fju1Sc.mjs.map +1 -0
- package/dist/EmissionPage-Cizyfg77.mjs.map +1 -0
- package/dist/EmissionPage-Dq4ECbbk.mjs.map +1 -0
- package/dist/EmissionPlayerItem-BzFck8k6.mjs +148 -0
- package/dist/EmissionPlayerItem-BzFck8k6.mjs.map +1 -0
- package/dist/EmissionPlayerItem-DhOuAEBr.mjs.map +1 -0
- package/dist/EmissionPlayerItem-DiM1VHun.mjs.map +1 -0
- package/dist/EmissionPresentationItem-CEjtj9mf.mjs +54 -0
- package/dist/EmissionPresentationItem-CEjtj9mf.mjs.map +1 -0
- package/dist/EmissionPresentationItem-DSCyFHjR.mjs.map +1 -0
- package/dist/EmissionPresentationItem-TpmURnni.mjs.map +1 -0
- package/dist/EmissionPresentationList-C80QlXif.mjs.map +1 -0
- package/dist/EmissionPresentationList-D1UcWrLn.mjs +104 -0
- package/dist/EmissionPresentationList-D1UcWrLn.mjs.map +1 -0
- package/dist/EmissionPresentationList-uApAVXPy.mjs.map +1 -0
- package/dist/EmissionsPage-B-Lgftdx.mjs.map +1 -0
- package/dist/EmissionsPage-CQm8C671.mjs +120 -0
- package/dist/EmissionsPage-CQm8C671.mjs.map +1 -0
- package/dist/EmissionsPage-CiV3jjrr.mjs.map +1 -0
- package/dist/EmissionsPage-Dop7rOfp.mjs.map +1 -0
- package/dist/Error403Page-8Z8InpBQ.mjs.map +1 -0
- package/dist/Error403Page-B4wfiYPh.mjs +56 -0
- package/dist/Error403Page-B4wfiYPh.mjs.map +1 -0
- package/dist/Error403Page-Du1eHk-4.mjs.map +1 -0
- package/dist/ErrorMessage-D2XAzxpC.mjs.map +1 -0
- package/dist/ErrorMessage-DcUdnqSU.mjs +33 -0
- package/dist/ErrorMessage-DcUdnqSU.mjs.map +1 -0
- package/dist/FooterGarSection-BlQXLOSL.mjs.map +1 -0
- package/dist/FooterGarSection-CFtIQW51.mjs.map +1 -0
- package/dist/FooterGarSection-DSu-iiPb.mjs +54 -0
- package/dist/FooterGarSection-DSu-iiPb.mjs.map +1 -0
- package/dist/FooterSection-CAGk8GmW.mjs +196 -0
- package/dist/FooterSection-CAGk8GmW.mjs.map +1 -0
- package/dist/FooterSection-CYVlRfnp.mjs.map +1 -0
- package/dist/FooterSection-LpLoB0-0.mjs.map +1 -0
- package/dist/GeneralStore-CUlq_NjO.mjs +45 -0
- package/dist/GeneralStore-CUlq_NjO.mjs.map +1 -0
- package/dist/HomeDropdown-DWCPphGw.mjs.map +1 -0
- package/dist/HomeDropdown-Dcyt9IM6.mjs +81 -0
- package/dist/HomeDropdown-Dcyt9IM6.mjs.map +1 -0
- package/dist/HomeDropdown-j5CLhQP9.mjs.map +1 -0
- package/dist/HomePage-D947-CtJ.mjs.map +1 -0
- package/dist/HomePage-DoZG25gj.mjs +142 -0
- package/dist/HomePage-DoZG25gj.mjs.map +1 -0
- package/dist/HomePage-DvbT5DWY.mjs.map +1 -0
- package/dist/HomePage-o7H3mupQ.mjs.map +1 -0
- package/dist/IHeartIcon-70F_rHQh.mjs.map +1 -0
- package/dist/IHeartIcon-D9X-Udgq.mjs +53 -0
- package/dist/IHeartIcon-D9X-Udgq.mjs.map +1 -0
- package/dist/LikeButton-DFkrvbgE.mjs.map +1 -0
- package/dist/LikeButton-gkh5hlOU.mjs +61 -0
- package/dist/LikeButton-gkh5hlOU.mjs.map +1 -0
- package/dist/LikeSection-BLrRZGlp.mjs +137 -0
- package/dist/LikeSection-BLrRZGlp.mjs.map +1 -0
- package/dist/LikeSection-DGKUdmkX.mjs.map +1 -0
- package/dist/LikeSection-no5OlBSF.mjs.map +1 -0
- package/dist/ListPaginate-BWWtCWZX.mjs +174 -0
- package/dist/ListPaginate-BWWtCWZX.mjs.map +1 -0
- package/dist/ListPaginate-DwmCOplg.mjs.map +1 -0
- package/dist/ListPaginate-QZ7t7y81.mjs.map +1 -0
- package/dist/LiveHorizontalList-BObeVsFj.mjs.map +1 -0
- package/dist/LiveHorizontalList-CDS6piq6.mjs +111 -0
- package/dist/LiveHorizontalList-CDS6piq6.mjs.map +1 -0
- package/dist/LiveHorizontalList-D_GkeFWa.mjs.map +1 -0
- package/dist/LiveHorizontalList-bMtchMkz.mjs.map +1 -0
- package/dist/LiveList-Bf2IwhCb.mjs +265 -0
- package/dist/LiveList-Bf2IwhCb.mjs.map +1 -0
- package/dist/LiveList-CLi1Bq0h.mjs.map +1 -0
- package/dist/LiveList-DZy0OfFl.mjs.map +1 -0
- package/dist/LiveList-uGUcdGMJ.mjs.map +1 -0
- package/dist/LivesPage-4xpcvJSQ.mjs.map +1 -0
- package/dist/LivesPage-BqEg0zT2.mjs.map +1 -0
- package/dist/LivesPage-CNPiAlnt.mjs.map +1 -0
- package/dist/LivesPage-CfYmRxnV.mjs +55 -0
- package/dist/LivesPage-CfYmRxnV.mjs.map +1 -0
- package/dist/MapPage-BDhnH1Kl.mjs.map +1 -0
- package/dist/MapPage-DjLcn4uk.mjs +276 -0
- package/dist/MapPage-DjLcn4uk.mjs.map +1 -0
- package/dist/MapPage-gETfgUu-.mjs.map +1 -0
- package/dist/MessageModal-B35dCbWB.mjs.map +1 -0
- package/dist/MessageModal-BWI3HTM0.mjs +116 -0
- package/dist/MessageModal-BWI3HTM0.mjs.map +1 -0
- package/dist/MobileMenu-B51ClvR4.mjs.map +1 -0
- package/dist/MobileMenu-BPtGG3Nt.mjs.map +1 -0
- package/dist/MobileMenu-CdvJhI_5.mjs +162 -0
- package/dist/MobileMenu-CdvJhI_5.mjs.map +1 -0
- package/dist/MonetizableFilter-BGQTUtwX.mjs.map +1 -0
- package/dist/MonetizableFilter-DOlNz4IP.mjs +66 -0
- package/dist/MonetizableFilter-DOlNz4IP.mjs.map +1 -0
- package/dist/NewsletterModal-3Hv1lNuN.mjs.map +1 -0
- package/dist/NewsletterModal-Cit-Ckrg.mjs.map +1 -0
- package/dist/NewsletterModal-Cq-ZW_Y_.mjs +64 -0
- package/dist/NewsletterModal-Cq-ZW_Y_.mjs.map +1 -0
- package/dist/OctopusMultiselect-CDijfV8W.mjs +325 -0
- package/dist/OctopusMultiselect-CDijfV8W.mjs.map +1 -0
- package/dist/OctopusMultiselect-tXNIWVpp.mjs.map +1 -0
- package/dist/OrganisationChooser-CH20oK8w.mjs +164 -0
- package/dist/OrganisationChooser-CH20oK8w.mjs.map +1 -0
- package/dist/OrganisationChooser-foPC-Rwo.mjs.map +1 -0
- package/dist/OrganisationChooser-m6bJKDBa.mjs.map +1 -0
- package/dist/OrganisationChooserLight-BGPuDaCx.mjs.map +1 -0
- package/dist/OrganisationChooserLight-DJHyYp6k.mjs.map +1 -0
- package/dist/OrganisationChooserLight-DqO0gfx7.mjs +63 -0
- package/dist/OrganisationChooserLight-DqO0gfx7.mjs.map +1 -0
- package/dist/PageLogout-Bc8zBpoo.mjs.map +1 -0
- package/dist/PageLogout-xQXWO2UF.mjs +21 -0
- package/dist/PageLogout-xQXWO2UF.mjs.map +1 -0
- package/dist/PageNotFound-BPFW-fzo.mjs.map +1 -0
- package/dist/PageNotFound-Dpv0tY-G.mjs +45 -0
- package/dist/PageNotFound-Dpv0tY-G.mjs.map +1 -0
- package/dist/PageNotFound-r_6Ei8S9.mjs.map +1 -0
- package/dist/PaginateParams-CbAaMAAM.mjs.map +1 -0
- package/dist/PaginateParams-CjJoKjUD.mjs +90 -0
- package/dist/PaginateParams-CjJoKjUD.mjs.map +1 -0
- package/dist/PaginateSection-BJ6iQai2.mjs.map +1 -0
- package/dist/PaginateSection-I875HiC5.mjs +184 -0
- package/dist/PaginateSection-I875HiC5.mjs.map +1 -0
- package/dist/ParticipantDescription-BsS6OEz9.mjs +57 -0
- package/dist/ParticipantDescription-BsS6OEz9.mjs.map +1 -0
- package/dist/ParticipantDescription-CwREwvZy.mjs.map +1 -0
- package/dist/ParticipantInlineList-BmE7OeIA.mjs.map +1 -0
- package/dist/ParticipantInlineList-C1BElB13.mjs +95 -0
- package/dist/ParticipantInlineList-C1BElB13.mjs.map +1 -0
- package/dist/ParticipantInlineList-DasTqo5z.mjs.map +1 -0
- package/dist/ParticipantItem-B3n9mXtJ.mjs +113 -0
- package/dist/ParticipantItem-B3n9mXtJ.mjs.map +1 -0
- package/dist/ParticipantItem-BOYW9dkV.mjs.map +1 -0
- package/dist/ParticipantItem-DiD5ANdf.mjs.map +1 -0
- package/dist/ParticipantPage-DI9J2hc9.mjs +161 -0
- package/dist/ParticipantPage-DI9J2hc9.mjs.map +1 -0
- package/dist/ParticipantPage-Dd0RQWvi.mjs.map +1 -0
- package/dist/ParticipantPage-DpEOyLsF.mjs.map +1 -0
- package/dist/ParticipantPage-KSNX-i8c.mjs.map +1 -0
- package/dist/ParticipantsPage-CC--r1ny.mjs.map +1 -0
- package/dist/ParticipantsPage-CVfRUkIM.mjs +215 -0
- package/dist/ParticipantsPage-CVfRUkIM.mjs.map +1 -0
- package/dist/ParticipantsPage-DF_C3M6I.mjs.map +1 -0
- package/dist/PlayVideoIcon-CQJTc1O7.mjs.map +1 -0
- package/dist/PlayVideoIcon-QfmloAS6.mjs +50 -0
- package/dist/PlayVideoIcon-QfmloAS6.mjs.map +1 -0
- package/dist/PlayerAnonymousModal-B_IyhbMR.mjs +67 -0
- package/dist/PlayerAnonymousModal-B_IyhbMR.mjs.map +1 -0
- package/dist/PlayerAnonymousModal-C_13dRO7.mjs.map +1 -0
- package/dist/PlayerAnonymousModal-DH3k1hXl.mjs.map +1 -0
- package/dist/PlayerCommonParameters-BF8-HN2S.mjs +32 -0
- package/dist/PlayerCommonParameters-BF8-HN2S.mjs.map +1 -0
- package/dist/PlayerCommonParameters-Dn-OIiO8.mjs.map +1 -0
- package/dist/PlayerCompact-BFLLRuDe.mjs.map +1 -0
- package/dist/PlayerCompact-DEeOaAfG.mjs.map +1 -0
- package/dist/PlayerCompact-DdCp2i_P.mjs +157 -0
- package/dist/PlayerCompact-DdCp2i_P.mjs.map +1 -0
- package/dist/PlayerComponent-BA2dlmRD.mjs.map +1 -0
- package/dist/PlayerComponent-CWtN6Je1.mjs +894 -0
- package/dist/PlayerComponent-CWtN6Je1.mjs.map +1 -0
- package/dist/PlayerComponent-im3MzRzo.mjs.map +1 -0
- package/dist/PlayerFmIcon-BGCKu8Y2.mjs +49 -0
- package/dist/PlayerFmIcon-BGCKu8Y2.mjs.map +1 -0
- package/dist/PlayerFmIcon-BxQ1g45P.mjs.map +1 -0
- package/dist/PlayerLarge-3OMY0_Tt.mjs.map +1 -0
- package/dist/PlayerLarge-BqjHyRf7.mjs.map +1 -0
- package/dist/PlayerLarge-I7FONG3B.mjs +153 -0
- package/dist/PlayerLarge-I7FONG3B.mjs.map +1 -0
- package/dist/PlayerParameters-fpNIoYO9.mjs.map +1 -0
- package/dist/PlayerParameters-y4IXdHiE.mjs +195 -0
- package/dist/PlayerParameters-y4IXdHiE.mjs.map +1 -0
- package/dist/PlayerPlayButton-Bm6Rp8bS.mjs +327 -0
- package/dist/PlayerPlayButton-Bm6Rp8bS.mjs.map +1 -0
- package/dist/PlayerPlayButton-DdIezDHQ.mjs.map +1 -0
- package/dist/PlayerPlayButton-T1Fr5nWh.mjs.map +1 -0
- package/dist/PlayerProgressBar-5jLv6Y7S.mjs.map +1 -0
- package/dist/PlayerProgressBar-8Q9iCyLs.mjs.map +1 -0
- package/dist/PlayerProgressBar-C38YCi9Z.mjs +75 -0
- package/dist/PlayerProgressBar-C38YCi9Z.mjs.map +1 -0
- package/dist/PlayerStore-BVK7ItEM.mjs.map +1 -0
- package/dist/PlayerStore-DB5dkc3c.mjs +230 -0
- package/dist/PlayerStore-DB5dkc3c.mjs.map +1 -0
- package/dist/PlayerVideo-Bud1rcxU.mjs +52 -0
- package/dist/PlayerVideo-Bud1rcxU.mjs.map +1 -0
- package/dist/PlayerVideo-CX3JS9bK.mjs.map +1 -0
- package/dist/PlayerVideo-D0mTmRCq.mjs.map +1 -0
- package/dist/PlayerVideoDigiteka-CiTtloWK.mjs +82 -0
- package/dist/PlayerVideoDigiteka-CiTtloWK.mjs.map +1 -0
- package/dist/PlayerVideoDigiteka-DjlfXgIZ.mjs.map +1 -0
- package/dist/PlayerVideoDigiteka-Dn3neAtr.mjs.map +1 -0
- package/dist/PlayerVideoHls-BJj1m924.mjs.map +1 -0
- package/dist/PlayerVideoHls-D909ECaY.mjs.map +1 -0
- package/dist/PlayerVideoHls-DjAlSV39.mjs +199 -0
- package/dist/PlayerVideoHls-DjAlSV39.mjs.map +1 -0
- package/dist/PlayerYoutubeEmbed-D0A4EWhU.mjs.map +1 -0
- package/dist/PlayerYoutubeEmbed-D5ZhaHbv.mjs +32 -0
- package/dist/PlayerYoutubeEmbed-D5ZhaHbv.mjs.map +1 -0
- package/dist/PlaylistPage-B-qoOMDN.mjs.map +1 -0
- package/dist/PlaylistPage-Botg5_jv.mjs.map +1 -0
- package/dist/PlaylistPage-C56-smtp.mjs.map +1 -0
- package/dist/PlaylistPage-aIWF8InW.mjs +180 -0
- package/dist/PlaylistPage-aIWF8InW.mjs.map +1 -0
- package/dist/PlaylistsPage-BSNE0BZ9.mjs.map +1 -0
- package/dist/PlaylistsPage-D2QbHMQu.mjs.map +1 -0
- package/dist/PlaylistsPage-Pnn895N-.mjs +322 -0
- package/dist/PlaylistsPage-Pnn895N-.mjs.map +1 -0
- package/dist/PocketCastIcon-Nm45VN7b.mjs.map +1 -0
- package/dist/PocketCastIcon-RfG93aY3.mjs +49 -0
- package/dist/PocketCastIcon-RfG93aY3.mjs.map +1 -0
- package/dist/PodcastAddictIcon-DRF7w4QM.mjs.map +1 -0
- package/dist/PodcastAddictIcon-v149CijV.mjs +52 -0
- package/dist/PodcastAddictIcon-v149CijV.mjs.map +1 -0
- package/dist/PodcastFilterList-CQ8vxYW7.mjs.map +1 -0
- package/dist/PodcastFilterList-CZzD028O.mjs.map +1 -0
- package/dist/PodcastFilterList-Khjz0Dny.mjs +179 -0
- package/dist/PodcastFilterList-Khjz0Dny.mjs.map +1 -0
- package/dist/PodcastFilterList-NSECjEDk.mjs.map +1 -0
- package/dist/PodcastImage-B-_N0gS4.mjs.map +1 -0
- package/dist/PodcastImage-BrfDAORW.mjs +148 -0
- package/dist/PodcastImage-BrfDAORW.mjs.map +1 -0
- package/dist/PodcastImage-DTrISr_U.mjs.map +1 -0
- package/dist/PodcastInlineList-BkHA9K7I.mjs +126 -0
- package/dist/PodcastInlineList-BkHA9K7I.mjs.map +1 -0
- package/dist/PodcastInlineList-Bq-uF-n4.mjs.map +1 -0
- package/dist/PodcastInlineList-DOkuKLLe.mjs.map +1 -0
- package/dist/PodcastInlineList-cWF3ymZw.mjs.map +1 -0
- package/dist/PodcastInlineListTemplate-BWUKzZU9.mjs.map +1 -0
- package/dist/PodcastInlineListTemplate-Bc479tGK.mjs.map +1 -0
- package/dist/PodcastInlineListTemplate-CiuRCR7t.mjs +206 -0
- package/dist/PodcastInlineListTemplate-CiuRCR7t.mjs.map +1 -0
- package/dist/PodcastIsPlaying-B2uIZI7V.mjs.map +1 -0
- package/dist/PodcastIsPlaying-DEviEW23.mjs +21 -0
- package/dist/PodcastIsPlaying-DEviEW23.mjs.map +1 -0
- package/dist/PodcastIsPlaying-DzzRwggt.mjs.map +1 -0
- package/dist/PodcastItem-6qkOg90q.mjs +213 -0
- package/dist/PodcastItem-6qkOg90q.mjs.map +1 -0
- package/dist/PodcastItem-DLD5hfk7.mjs.map +1 -0
- package/dist/PodcastItem-ltLOqm-_.mjs.map +1 -0
- package/dist/PodcastItem-naoxNwra.mjs.map +1 -0
- package/dist/PodcastList-5vFekv1m.mjs.map +1 -0
- package/dist/PodcastList-B60tYB2G.mjs.map +1 -0
- package/dist/PodcastList-B9xZlEH4.mjs +152 -0
- package/dist/PodcastList-B9xZlEH4.mjs.map +1 -0
- package/dist/PodcastList-BYBjpOL8.mjs.map +1 -0
- package/dist/PodcastList-BuDcObSr.mjs.map +1 -0
- package/dist/PodcastList-DQanN0Bb.mjs.map +1 -0
- package/dist/PodcastList-gdQbPtGY.mjs +234 -0
- package/dist/PodcastList-gdQbPtGY.mjs.map +1 -0
- package/dist/PodcastList-jCzCt_eR.mjs.map +1 -0
- package/dist/PodcastPage-B5WpXRPn.mjs.map +1 -0
- package/dist/PodcastPage-BFjlYZGL.mjs.map +1 -0
- package/dist/PodcastPage-BUlluWvM.mjs.map +1 -0
- package/dist/PodcastPage-D3aBkgdA.mjs +585 -0
- package/dist/PodcastPage-D3aBkgdA.mjs.map +1 -0
- package/dist/PodcastPlannedSpinner-BJDQ4VPx.mjs +20 -0
- package/dist/PodcastPlannedSpinner-BJDQ4VPx.mjs.map +1 -0
- package/dist/PodcastPlannedSpinner-BN7unEqf.mjs.map +1 -0
- package/dist/PodcastPlayBar-BotWFQoJ.mjs.map +1 -0
- package/dist/PodcastPlayBar-C7pDzmXr.mjs +65 -0
- package/dist/PodcastPlayBar-C7pDzmXr.mjs.map +1 -0
- package/dist/PodcastPlayBar-Dc71_DSn.mjs.map +1 -0
- package/dist/PodcastPlayBasicButton-9u92vEzq.mjs.map +1 -0
- package/dist/PodcastPlayBasicButton-BRbHFpVR.mjs +52 -0
- package/dist/PodcastPlayBasicButton-BRbHFpVR.mjs.map +1 -0
- package/dist/PodcastPlayBasicButton-Ds_kg-b1.mjs.map +1 -0
- package/dist/PodcastPlayButton-CMaudNx5.mjs +203 -0
- package/dist/PodcastPlayButton-CMaudNx5.mjs.map +1 -0
- package/dist/PodcastPlayButton-RjnyBBYO.mjs.map +1 -0
- package/dist/PodcastPlayButton-TpwW09jp.mjs.map +1 -0
- package/dist/PodcastPlaylistInlineList-BLAD7cMN.mjs.map +1 -0
- package/dist/PodcastPlaylistInlineList-BllOtctp.mjs +82 -0
- package/dist/PodcastPlaylistInlineList-BllOtctp.mjs.map +1 -0
- package/dist/PodcastPlaylistInlineList-CSITiCoX.mjs.map +1 -0
- package/dist/PodcastPlaylistInlineList-kO0naL9A.mjs.map +1 -0
- package/dist/PodcastPresentationList-BcKJ9XZ7.mjs +152 -0
- package/dist/PodcastPresentationList-BcKJ9XZ7.mjs.map +1 -0
- package/dist/PodcastPresentationList-CRCO4abw.mjs.map +1 -0
- package/dist/PodcastPresentationList-CSWhzlnX.mjs.map +1 -0
- package/dist/PodcastProgressBar-Ctp0I77F.mjs.map +1 -0
- package/dist/PodcastProgressBar-Dih-EtLn.mjs.map +1 -0
- package/dist/PodcastProgressBar-xAMieMIt.mjs +80 -0
- package/dist/PodcastProgressBar-xAMieMIt.mjs.map +1 -0
- package/dist/PodcastRawTranscript-BbCPFt3l.mjs.map +1 -0
- package/dist/PodcastRawTranscript-CdKhzP8l.mjs +146 -0
- package/dist/PodcastRawTranscript-CdKhzP8l.mjs.map +1 -0
- package/dist/PodcastRawTranscript-Cp0XSlnz.mjs.map +1 -0
- package/dist/PodcastRubriqueList-BGiDpOsb.mjs.map +1 -0
- package/dist/PodcastRubriqueList-BqhnhoEz.mjs +65 -0
- package/dist/PodcastRubriqueList-BqhnhoEz.mjs.map +1 -0
- package/dist/PodcastRubriqueList-CPaVKHY5.mjs.map +1 -0
- package/dist/PodcastSeasonInfo-BwD--f9z.mjs +37 -0
- package/dist/PodcastSeasonInfo-BwD--f9z.mjs.map +1 -0
- package/dist/PodcastSeasonInfo-DL_CsYTY.mjs.map +1 -0
- package/dist/PodcastSwiperList-C2H-uWk9.mjs.map +1 -0
- package/dist/PodcastSwiperList-CY2NOyCN.mjs.map +1 -0
- package/dist/PodcastSwiperList-Cj4G10ln.mjs.map +1 -0
- package/dist/PodcastSwiperList-DI-90c4F.mjs +191 -0
- package/dist/PodcastSwiperList-DI-90c4F.mjs.map +1 -0
- package/dist/PodcastmakerHeader-BubtZY7u.mjs.map +1 -0
- package/dist/PodcastmakerHeader-CURC8nyy.mjs.map +1 -0
- package/dist/PodcastmakerHeader-DLy0YSgm.mjs +46 -0
- package/dist/PodcastmakerHeader-DLy0YSgm.mjs.map +1 -0
- package/dist/PodcastsPage-CYG8bXaW.mjs.map +1 -0
- package/dist/PodcastsPage-DZlGTlaX.mjs +135 -0
- package/dist/PodcastsPage-DZlGTlaX.mjs.map +1 -0
- package/dist/PodcastsPage-PTwwATNT.mjs.map +1 -0
- package/dist/PodcastsPage-dOgLCDY5.mjs.map +1 -0
- package/dist/PresentationLayout-BWueEtST.mjs +70 -0
- package/dist/PresentationLayout-BWueEtST.mjs.map +1 -0
- package/dist/PresentationLayout-BmcVqEo8.mjs.map +1 -0
- package/dist/ProductorSearch-Bp7S8Sut.mjs.map +1 -0
- package/dist/ProductorSearch-ir5rkehT.mjs +132 -0
- package/dist/ProductorSearch-ir5rkehT.mjs.map +1 -0
- package/dist/ProductorSearch-yQPCj7Pa.mjs.map +1 -0
- package/dist/ProgressBar-B6z6oHHm.mjs.map +1 -0
- package/dist/ProgressBar-DLbzpY3L.mjs.map +1 -0
- package/dist/ProgressBar-ubd7c7H0.mjs +135 -0
- package/dist/ProgressBar-ubd7c7H0.mjs.map +1 -0
- package/dist/QrCode-BR3jPdJS.mjs +140 -0
- package/dist/QrCode-BR3jPdJS.mjs.map +1 -0
- package/dist/QrCode-C7IL9c3c.mjs.map +1 -0
- package/dist/QrCode-D86qgrdm.mjs.map +1 -0
- package/dist/QrCodeModal-9PCWJenP.mjs.map +1 -0
- package/dist/QrCodeModal-Cf1O9nwT.mjs.map +1 -0
- package/dist/QrCodeModal-DnREe0Jk.mjs +48 -0
- package/dist/QrCodeModal-DnREe0Jk.mjs.map +1 -0
- package/dist/RadioCurrently-BNzaJNoY.mjs +89 -0
- package/dist/RadioCurrently-BNzaJNoY.mjs.map +1 -0
- package/dist/RadioCurrently-Bz4kKaGc.mjs.map +1 -0
- package/dist/RadioCurrently-COaGoNF8.mjs.map +1 -0
- package/dist/RadioHistory-B_PBz6hY.mjs.map +1 -0
- package/dist/RadioHistory-DMGTXE4V.mjs +116 -0
- package/dist/RadioHistory-DMGTXE4V.mjs.map +1 -0
- package/dist/RadioHistory-Yhqmee1d.mjs.map +1 -0
- package/dist/RadioImage-B5jrzD8s.mjs.map +1 -0
- package/dist/RadioImage-BgrUZZIa.mjs +66 -0
- package/dist/RadioImage-BgrUZZIa.mjs.map +1 -0
- package/dist/RadioImage-D2MFmuqR.mjs.map +1 -0
- package/dist/RadioList-Bab4Pj9m.mjs.map +1 -0
- package/dist/RadioList-Bh8ub58m.mjs +95 -0
- package/dist/RadioList-Bh8ub58m.mjs.map +1 -0
- package/dist/RadioList-Ctbf98I9.mjs.map +1 -0
- package/dist/RadioPage-BY7YU_yL.mjs.map +1 -0
- package/dist/RadioPage-BtsGEI5i.mjs +105 -0
- package/dist/RadioPage-BtsGEI5i.mjs.map +1 -0
- package/dist/RadioPage-DtS3r-48.mjs.map +1 -0
- package/dist/RadioPlanning-B-sRUVGb.mjs.map +1 -0
- package/dist/RadioPlanning-D2RNEdEQ.mjs.map +1 -0
- package/dist/RadioPlanning-DMighzUU.mjs +257 -0
- package/dist/RadioPlanning-DMighzUU.mjs.map +1 -0
- package/dist/RadioProgressBar-4MT37o9a.mjs.map +1 -0
- package/dist/RadioProgressBar-CiapCPN-.mjs +47 -0
- package/dist/RadioProgressBar-CiapCPN-.mjs.map +1 -0
- package/dist/RadioProgressBar-DrxSXvmY.mjs.map +1 -0
- package/dist/RadiolineIcon-CIePjE9k.mjs.map +1 -0
- package/dist/RadiolineIcon-QP88nzG8.mjs +50 -0
- package/dist/RadiolineIcon-QP88nzG8.mjs.map +1 -0
- package/dist/RecaptchaModal-BThWkUuj.mjs.map +1 -0
- package/dist/RecaptchaModal-BkETInqb.mjs.map +1 -0
- package/dist/RecaptchaModal-DlThDzSF.mjs +119 -0
- package/dist/RecaptchaModal-DlThDzSF.mjs.map +1 -0
- package/dist/ReportAbuseModal-BfYBle6z.mjs.map +1 -0
- package/dist/ReportAbuseModal-Bnhfpowa.mjs.map +1 -0
- package/dist/ReportAbuseModal-Pd8P9tNB.mjs +107 -0
- package/dist/ReportAbuseModal-Pd8P9tNB.mjs.map +1 -0
- package/dist/RightsIndicator-COEtdoj_.mjs.map +1 -0
- package/dist/RightsIndicator-CZtSrb5K.mjs.map +1 -0
- package/dist/RightsIndicator-DNmA3L9O.mjs.map +1 -0
- package/dist/RightsIndicator-DYhqEbAB.mjs +69 -0
- package/dist/RightsIndicator-DYhqEbAB.mjs.map +1 -0
- package/dist/RightsWrapper-BHIinXXL.mjs.map +1 -0
- package/dist/RightsWrapper-CewAJoDY.mjs.map +1 -0
- package/dist/RightsWrapper-Cz5TnSUC.mjs +164 -0
- package/dist/RightsWrapper-Cz5TnSUC.mjs.map +1 -0
- package/dist/RubriqueChoice-BN4nirmx.mjs +120 -0
- package/dist/RubriqueChoice-BN4nirmx.mjs.map +1 -0
- package/dist/RubriqueChoice-BxmZoBZL.mjs.map +1 -0
- package/dist/RubriqueChoice-C4rglHV1.mjs.map +1 -0
- package/dist/RubriqueChooser-BceFw2x2.mjs.map +1 -0
- package/dist/RubriqueChooser-BgIvDDv7.mjs +213 -0
- package/dist/RubriqueChooser-BgIvDDv7.mjs.map +1 -0
- package/dist/RubriqueFilter-BwBU4kpV.mjs +168 -0
- package/dist/RubriqueFilter-BwBU4kpV.mjs.map +1 -0
- package/dist/RubriqueFilter-C7lAoJNq.mjs.map +1 -0
- package/dist/RubriqueFilter-CKF-seUZ.mjs.map +1 -0
- package/dist/RubriqueFilter-oDd4AytG.mjs.map +1 -0
- package/dist/RubriqueList-Cr0vXMew.mjs.map +1 -0
- package/dist/RubriqueList-D2PPns3m.mjs +169 -0
- package/dist/RubriqueList-D2PPns3m.mjs.map +1 -0
- package/dist/RubriqueList-zHKQE6OL.mjs.map +1 -0
- package/dist/RubriquePage-2ITwxYLr.mjs.map +1 -0
- package/dist/RubriquePage-Bpt2wwjK.mjs.map +1 -0
- package/dist/RubriquePage-CFrQ5Hw-.mjs +86 -0
- package/dist/RubriquePage-CFrQ5Hw-.mjs.map +1 -0
- package/dist/RubriquePage-Cf9QJQJB.mjs.map +1 -0
- package/dist/SearchOrder-CJ0Fj6Wd.mjs.map +1 -0
- package/dist/SearchOrder-CLl5slg5.mjs +70 -0
- package/dist/SearchOrder-CLl5slg5.mjs.map +1 -0
- package/dist/SearchPage-BopqRW_4.mjs.map +1 -0
- package/dist/SearchPage-BskiH0Hg.mjs +58 -0
- package/dist/SearchPage-BskiH0Hg.mjs.map +1 -0
- package/dist/SearchPage-D0Tz8ELe.mjs.map +1 -0
- package/dist/SearchPage-DLj9zYeL.mjs.map +1 -0
- package/dist/ShareAnonymous-B16PsWEJ.mjs +249 -0
- package/dist/ShareAnonymous-B16PsWEJ.mjs.map +1 -0
- package/dist/ShareAnonymous-CBVGRI6L.mjs.map +1 -0
- package/dist/ShareAnonymous-DmDaW3PH.mjs.map +1 -0
- package/dist/ShareModalPlayer-BV_1CKus.mjs.map +1 -0
- package/dist/ShareModalPlayer-SIkm_vpv.mjs.map +1 -0
- package/dist/ShareModalPlayer-lGW9vRFS.mjs +111 -0
- package/dist/ShareModalPlayer-lGW9vRFS.mjs.map +1 -0
- package/dist/ShareNewsletter-BigVU8EV.mjs.map +1 -0
- package/dist/ShareNewsletter-CRQBK_3P.mjs +181 -0
- package/dist/ShareNewsletter-CRQBK_3P.mjs.map +1 -0
- package/dist/ShareNewsletter-CleivWOu.mjs.map +1 -0
- package/dist/SharePlayer-CGlvYVn4.mjs.map +1 -0
- package/dist/SharePlayer-CSKYsE9H.mjs.map +1 -0
- package/dist/SharePlayer-Cdjz1NrC.mjs +319 -0
- package/dist/SharePlayer-Cdjz1NrC.mjs.map +1 -0
- package/dist/SharePlayerColors-D-9MoYm6.mjs.map +1 -0
- package/dist/SharePlayerColors-p_LreBcc.mjs +61 -0
- package/dist/SharePlayerColors-p_LreBcc.mjs.map +1 -0
- package/dist/SharePlayerRadio-BJBbDNn5.mjs.map +1 -0
- package/dist/SharePlayerRadio-DbHw7Vcn.mjs +99 -0
- package/dist/SharePlayerRadio-DbHw7Vcn.mjs.map +1 -0
- package/dist/SharePlayerRadio-OMXyRc4D.mjs.map +1 -0
- package/dist/SharePlayerTypes-BTWxUJWi.mjs +206 -0
- package/dist/SharePlayerTypes-BTWxUJWi.mjs.map +1 -0
- package/dist/SharePlayerTypes-C2_JNU6C.mjs.map +1 -0
- package/dist/SharePlayerTypes-DBERUe0_.mjs.map +1 -0
- package/dist/ShareSocialsButtons-Bwh9bMoR.mjs +132 -0
- package/dist/ShareSocialsButtons-Bwh9bMoR.mjs.map +1 -0
- package/dist/ShareSocialsButtons-CMOEQdYB.mjs.map +1 -0
- package/dist/ShareSocialsButtons-D0b8OawP.mjs.map +1 -0
- package/dist/SimpleLayout-BRjk598k.mjs.map +1 -0
- package/dist/SimpleLayout-D9uJF7mS.mjs +28 -0
- package/dist/SimpleLayout-D9uJF7mS.mjs.map +1 -0
- package/dist/SimpleLayout-b-QQv5aQ.mjs.map +1 -0
- package/dist/SmartLinkPage-CSTfusv3.mjs.map +1 -0
- package/dist/SmartLinkPage-CeGDzza8.mjs +187 -0
- package/dist/SmartLinkPage-CeGDzza8.mjs.map +1 -0
- package/dist/SmartLinkPage-DGRvD-vv.mjs.map +1 -0
- package/dist/SnackBar-DdE1dYhi.mjs.map +1 -0
- package/dist/SnackBar-jRnNt--Z.mjs +150 -0
- package/dist/SnackBar-jRnNt--Z.mjs.map +1 -0
- package/dist/SubscribeButtons-CHsq-Vk7.mjs +160 -0
- package/dist/SubscribeButtons-CHsq-Vk7.mjs.map +1 -0
- package/dist/SubscribeButtons-CJhlLSWX.mjs.map +1 -0
- package/dist/SubscribeButtons-ChrHIXBv.mjs.map +1 -0
- package/dist/SwiperList-BKiF8jIc.mjs +170 -0
- package/dist/SwiperList-BKiF8jIc.mjs.map +1 -0
- package/dist/SwiperList-BoALb00d.mjs.map +1 -0
- package/dist/SwiperList-DBmjvvCX.mjs.map +1 -0
- package/dist/TagList-BECg0vNz.mjs.map +1 -0
- package/dist/TagList-DRJvO9Gr.mjs.map +1 -0
- package/dist/TagList-DiGc-7Rj.mjs +110 -0
- package/dist/TagList-DiGc-7Rj.mjs.map +1 -0
- package/dist/TagPage-Bn2cVKpN.mjs.map +1 -0
- package/dist/TagPage-C9x5XWOd.mjs.map +1 -0
- package/dist/TagPage-DchdAQV2.mjs.map +1 -0
- package/dist/TagPage-Vd8JH7-r.mjs +99 -0
- package/dist/TagPage-Vd8JH7-r.mjs.map +1 -0
- package/dist/TopBar-B20_SqNY.mjs.map +1 -0
- package/dist/TopBar-DRclhhd6.mjs.map +1 -0
- package/dist/TopBar-FHuZ4j9H.mjs +358 -0
- package/dist/TopBar-FHuZ4j9H.mjs.map +1 -0
- package/dist/TuninIcon-BplDWgtD.mjs.map +1 -0
- package/dist/TuninIcon-SHr7Y1qJ.mjs +49 -0
- package/dist/TuninIcon-SHr7Y1qJ.mjs.map +1 -0
- package/dist/UserButtonContent-B-AMExwJ.mjs.map +1 -0
- package/dist/UserButtonContent-Btivzl2V.mjs.map +1 -0
- package/dist/UserButtonContent-I7ahjnuS.mjs +163 -0
- package/dist/UserButtonContent-I7ahjnuS.mjs.map +1 -0
- package/dist/VastStore-BPwOrXvb.mjs +80 -0
- package/dist/VastStore-BPwOrXvb.mjs.map +1 -0
- package/dist/VideoModuleBox-Bw0xu9_f.mjs.map +1 -0
- package/dist/VideoModuleBox-C8zDhbqA.mjs.map +1 -0
- package/dist/VideoModuleBox-Cl6YoznO.mjs +70 -0
- package/dist/VideoModuleBox-Cl6YoznO.mjs.map +1 -0
- package/dist/VideoPage-B-lgTFnX.mjs.map +1 -0
- package/dist/VideoPage-B5Tp2PMs.mjs +222 -0
- package/dist/VideoPage-B5Tp2PMs.mjs.map +1 -0
- package/dist/VideoPage-X3dZyaQH.mjs.map +1 -0
- package/dist/XIcon-DAVMitPh.mjs +49 -0
- package/dist/XIcon-DAVMitPh.mjs.map +1 -0
- package/dist/XIcon-Dz4rI_Hd.mjs.map +1 -0
- package/dist/_plugin-vue_export-helper-BOaGB7Aw.mjs +8 -0
- package/dist/aggregatorsApi-hyFtV8aL.mjs.map +1 -0
- package/dist/api-tznrp2lH.mjs.map +1 -0
- package/dist/apiUtils-D4ULJJbh.mjs.map +1 -0
- package/dist/buttons-cdGcewjB.mjs.map +1 -0
- package/dist/buttons-kyb_6P3e.mjs.map +1 -0
- package/dist/buttons-uGrbDDaA.mjs +113 -0
- package/dist/buttons-uGrbDDaA.mjs.map +1 -0
- package/dist/classicApi-BKNiWOG4.mjs +1790 -0
- package/dist/classicApi-BKNiWOG4.mjs.map +1 -0
- package/dist/classicApi-DC7iamat.mjs.map +1 -0
- package/dist/config-C73GMJpz.mjs +9 -0
- package/dist/config-C73GMJpz.mjs.map +1 -0
- package/dist/cookiesHelper-BQksSais.mjs +23 -0
- package/dist/cookiesHelper-BQksSais.mjs.map +1 -0
- package/dist/displayHelper-CpXshNzz.mjs +22 -0
- package/dist/displayHelper-CpXshNzz.mjs.map +1 -0
- package/dist/domHelper-DTMIrMbs.mjs +15 -0
- package/dist/domHelper-DTMIrMbs.mjs.map +1 -0
- package/dist/downloadHelper-CWLRMcjc.mjs +36 -0
- package/dist/downloadHelper-CWLRMcjc.mjs.map +1 -0
- package/dist/downloadHelper-DB969RNb.mjs.map +1 -0
- package/dist/educationen-B0PNsHqt.mjs +18 -0
- package/dist/educationen-B0PNsHqt.mjs.map +1 -0
- package/dist/educationfr-DnXyASTX.mjs +6 -0
- package/dist/educationfr-DnXyASTX.mjs.map +1 -0
- package/dist/emission-ByePXT9Y.mjs +33 -0
- package/dist/emission-ByePXT9Y.mjs.map +1 -0
- package/dist/emissionApi-WS6yl56a.mjs.map +1 -0
- package/dist/groupsApi-CecqFbyg.mjs.map +1 -0
- package/dist/i18n-l4HCrPF3.mjs.map +1 -0
- package/dist/icons-1GR2yFzw.mjs.map +1 -0
- package/dist/icons-B4eHXcRy.mjs +18 -0
- package/dist/icons-B4eHXcRy.mjs.map +1 -0
- package/dist/index.css +7208 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.mjs +735 -408
- package/dist/index.mjs.map +1 -0
- package/dist/keys-TjlLYNQE.mjs +18 -0
- package/dist/keys-TjlLYNQE.mjs.map +1 -0
- package/dist/localisation-iXoGtJ3j.mjs +13 -0
- package/dist/localisation-iXoGtJ3j.mjs.map +1 -0
- package/dist/logo_saooti_play_black-BLx_RUuM.mjs +6 -0
- package/dist/logo_saooti_play_black-BLx_RUuM.mjs.map +1 -0
- package/dist/messages-Czjqh0tU.mjs +2679 -0
- package/dist/messages-Czjqh0tU.mjs.map +1 -0
- package/dist/organisation-CxyRYjC0.mjs +19 -0
- package/dist/organisation-CxyRYjC0.mjs.map +1 -0
- package/dist/ouest_france_logo-WOgdbVGH.mjs +6 -0
- package/dist/ouest_france_logo-WOgdbVGH.mjs.map +1 -0
- package/dist/playlistApi-LcxgQmJH.mjs.map +1 -0
- package/dist/podcast-Da9L7I5Q.mjs +76 -0
- package/dist/podcast-Da9L7I5Q.mjs.map +1 -0
- package/dist/podcastApi-5-MtD1l_.mjs.map +1 -0
- package/dist/rolldown-runtime-D7D4PA-g.mjs +13 -0
- package/dist/src/components/composable/usePresentationItem.d.ts +1 -1
- package/dist/src/i18n.d.ts +8 -1
- package/dist/src/locale/messages.d.ts +30 -0
- package/dist/src/stores/ParamSdkStore.d.ts +6 -1
- package/dist/src/stores/class/general/organisation.d.ts +2 -0
- package/dist/stringHelper-DFr4Khve.mjs +15 -0
- package/dist/stringHelper-DFr4Khve.mjs.map +1 -0
- package/dist/tests-mocks.mjs +16 -14
- package/dist/tests-mocks.mjs.map +1 -0
- package/dist/tests.mjs +86 -51
- package/dist/tests.mjs.map +1 -0
- package/dist/transcriptionApi-Drk3sv6J.mjs.map +1 -0
- package/dist/types-8roXR0of.mjs +11 -0
- package/dist/types-8roXR0of.mjs.map +1 -0
- package/dist/useAdvancedParamInit-Ci4c333p.mjs +162 -0
- package/dist/useAdvancedParamInit-Ci4c333p.mjs.map +1 -0
- package/dist/useAdvancedParamInit-CpNDHede.mjs.map +1 -0
- package/dist/useCountdown-DPweZzmz.mjs +51 -0
- package/dist/useCountdown-DPweZzmz.mjs.map +1 -0
- package/dist/useDayjs-BqojyoqU.mjs +32 -0
- package/dist/useDayjs-BqojyoqU.mjs.map +1 -0
- package/dist/useDayjs-zt5R5ZIe.mjs.map +1 -0
- package/dist/useErrorHandler-DNz9da5N.mjs +19 -0
- package/dist/useErrorHandler-DNz9da5N.mjs.map +1 -0
- package/dist/useErrorHandler-Nce0QKlB.mjs.map +1 -0
- package/dist/useImageProxy-B2vNJKgd.mjs +20 -0
- package/dist/useImageProxy-B2vNJKgd.mjs.map +1 -0
- package/dist/useImageProxy-C7wjiN0F.mjs.map +1 -0
- package/dist/useOrgaComputed-D8ikvtGw.mjs.map +1 -0
- package/dist/useOrgaComputed-T8Mhcne0.mjs +19 -0
- package/dist/useOrgaComputed-T8Mhcne0.mjs.map +1 -0
- package/dist/usePlayerLogicProgress-CSdUmqxN.mjs +108 -0
- package/dist/usePlayerLogicProgress-CSdUmqxN.mjs.map +1 -0
- package/dist/usePlayerLogicProgress-DnNbZCWg.mjs.map +1 -0
- package/dist/usePodcastView-BJw3J1sE.mjs.map +1 -0
- package/dist/usePodcastView-DR83HM0j.mjs +56 -0
- package/dist/usePodcastView-DR83HM0j.mjs.map +1 -0
- package/dist/usePresentationItem-BLUjp4Le.mjs.map +1 -0
- package/dist/usePresentationItem-C28KKH4P.mjs.map +1 -0
- package/dist/usePresentationItem-rJkFlZFu.mjs +144 -0
- package/dist/usePresentationItem-rJkFlZFu.mjs.map +1 -0
- package/dist/useResizePhone-CpfFUmfV.mjs +37 -0
- package/dist/useResizePhone-CpfFUmfV.mjs.map +1 -0
- package/dist/useRights-JVTbEOUh.mjs +276 -0
- package/dist/useRights-JVTbEOUh.mjs.map +1 -0
- package/dist/useRights-Z6_G-y4s.mjs.map +1 -0
- package/dist/useRouteUpdateParams-DurlddRA.mjs +59 -0
- package/dist/useRouteUpdateParams-DurlddRA.mjs.map +1 -0
- package/dist/useRubriquesFilterComputed-CQxqKOWL.mjs.map +1 -0
- package/dist/useRubriquesFilterComputed-CWUxRSYK.mjs +13 -0
- package/dist/useRubriquesFilterComputed-CWUxRSYK.mjs.map +1 -0
- package/dist/useRubriquesFilterParam-D7JQhKT5.mjs.map +1 -0
- package/dist/useRubriquesFilterParam-U-wcZUul.mjs +36 -0
- package/dist/useRubriquesFilterParam-U-wcZUul.mjs.map +1 -0
- package/dist/useSeasonsManagement-D-ngDipg.mjs +44 -0
- package/dist/useSeasonsManagement-D-ngDipg.mjs.map +1 -0
- package/dist/useSelenium-DwQtyBRt.mjs +11 -0
- package/dist/useSelenium-DwQtyBRt.mjs.map +1 -0
- package/dist/useSeoTitleUrl-CrM1YzAc.mjs +31 -0
- package/dist/useSeoTitleUrl-CrM1YzAc.mjs.map +1 -0
- package/dist/useSharePath-Vh29oc9Z.mjs +70 -0
- package/dist/useSharePath-Vh29oc9Z.mjs.map +1 -0
- package/dist/useSharePlatforms-B8R3fZy9.mjs.map +1 -0
- package/dist/useSharePlatforms-D0v8XOk3.mjs.map +1 -0
- package/dist/useSharePlatforms-aq487WBa.mjs +415 -0
- package/dist/useSharePlatforms-aq487WBa.mjs.map +1 -0
- package/dist/useSimplePageParam-CL9Tbu3B.mjs.map +1 -0
- package/dist/useSimplePageParam-CPjjYD88.mjs +54 -0
- package/dist/useSimplePageParam-CPjjYD88.mjs.map +1 -0
- package/dist/useTagOf-JxYdEyRm.mjs +20 -0
- package/dist/useTagOf-JxYdEyRm.mjs.map +1 -0
- package/dist/useTranslation-B-nJSPAk.mjs +205 -0
- package/dist/useTranslation-B-nJSPAk.mjs.map +1 -0
- package/dist/useTranslation-DjbHwIm7.mjs.map +1 -0
- package/dist/usefetchRadioData-CHglTIFu.mjs.map +1 -0
- package/dist/usefetchRadioData-gMdg1_Yh.mjs +55 -0
- package/dist/usefetchRadioData-gMdg1_Yh.mjs.map +1 -0
- package/dist/youtubeVideoHelper-DOeaXxVp.mjs +16 -0
- package/dist/youtubeVideoHelper-DOeaXxVp.mjs.map +1 -0
- package/package.json +8 -8
- package/src/components/display/live/RadioCurrently.vue +3 -4
- package/src/components/layouts/PresentationLayout.vue +9 -3
- package/src/components/misc/ProgressBar.vue +0 -1
- package/src/components/misc/player/ads/AdsProgressBar.vue +17 -1
- package/src/components/misc/player/radio/RadioProgressBar.vue +16 -0
- package/dist/AccessibilityModal-CBIb3UQS.mjs +0 -93
- package/dist/AdsProgressBar-BwRrrKOT.mjs +0 -19
- package/dist/AdvancedSearch-Bd9tK-4i.mjs +0 -249
- package/dist/AmazonMusicIcon-6zqZK6Q9.mjs +0 -39
- package/dist/ApplePodcastIcon-C3ogP5y5.mjs +0 -40
- package/dist/CategoryChooser-Ct0No4RM.mjs +0 -173
- package/dist/CategoryFilter-CNCjhnMP.mjs +0 -146
- package/dist/CategoryList-Buh73sPa.mjs +0 -107
- package/dist/CategoryPage-guP6_hCq.mjs +0 -28
- package/dist/CategorySearchFilter-BRfxF0yK.mjs +0 -39
- package/dist/ChapteringModal-B29-28dk.mjs +0 -46
- package/dist/CheckIdentityModal-Dh-7hC5M.mjs +0 -51
- package/dist/ChooseEpisodesNumber-CXJO5dfs.mjs +0 -33
- package/dist/ClassicAccordion-Czni43ek.mjs +0 -71
- package/dist/ClassicAlert-1IB6N33c.mjs +0 -35
- package/dist/ClassicBigChip-D6QO8W-G.mjs +0 -25
- package/dist/ClassicCheckbox-xPu56Drn.mjs +0 -89
- package/dist/ClassicContentEditable-CWmtRihd.mjs +0 -45
- package/dist/ClassicCopyButton-DJ9T09fS.mjs +0 -52
- package/dist/ClassicDatePicker-BrPx6CHY.mjs +0 -187
- package/dist/ClassicEmojiPicker-2c55qjy6.mjs +0 -63
- package/dist/ClassicHelpButton-DdEJu6tX.mjs +0 -34
- package/dist/ClassicInputText-ILQDQz8R.mjs +0 -270
- package/dist/ClassicLazy-DhdsXyI4.mjs +0 -56
- package/dist/ClassicLoading-CXfMjpyl.mjs +0 -40
- package/dist/ClassicModal-Dl2IdzXZ.mjs +0 -63
- package/dist/ClassicModalInBody-D5-RfQ8Z.mjs +0 -58
- package/dist/ClassicMultiselect-DKdQdAtp.mjs +0 -201
- package/dist/ClassicNav-DYez6p1J.mjs +0 -47
- package/dist/ClassicPopover-6uo-YUgO.mjs +0 -167
- package/dist/ClassicRadio-BbJEgMB7.mjs +0 -61
- package/dist/ClassicRadioLabel-DgimkkQe.mjs +0 -76
- package/dist/ClassicSearch-CtL1cpnF.mjs +0 -63
- package/dist/ClassicSelect-BpA0jKN6.mjs +0 -111
- package/dist/ClassicSpinner-DFRDD51g.mjs +0 -28
- package/dist/ClassicTabs-DYOZLNK2.mjs +0 -40
- package/dist/ClassicTagInput-DiRwA8CF.mjs +0 -62
- package/dist/ClassicWysiwyg-CbBzD-21.mjs +0 -164
- package/dist/ClipboardModal-DBIetCe6.mjs +0 -56
- package/dist/CommentBasicView-CJgGRZXW.mjs +0 -76
- package/dist/CommentInput-BuXFDUZI.mjs +0 -111
- package/dist/CommentItem-C1KdIG3j.mjs +0 -155
- package/dist/CommentList-DTKpZSb6.mjs +0 -204
- package/dist/CommentMoreActions-BiyzPozQ.mjs +0 -191
- package/dist/CommentName-BdoUJC9A.mjs +0 -56
- package/dist/CommentParentInfo-kXKfL3N4.mjs +0 -36
- package/dist/CommentPlayer-BIOwn4Ao.mjs +0 -47
- package/dist/CommentSection-CQGAn83J.mjs +0 -79
- package/dist/CommentStore-CVBkPvHJ.mjs +0 -279
- package/dist/ContractPreviewModal-BJEnYMoK.mjs +0 -53
- package/dist/CountDown-o6ye6yv1.mjs +0 -17
- package/dist/CountdownOctopus-D0X5hVBu.mjs +0 -23
- package/dist/DateFilter-67VvJ4ez.mjs +0 -79
- package/dist/DeezerIcon-CybxfijL.mjs +0 -39
- package/dist/DownloadPodcastButton-CcUJ8Wuh.mjs +0 -30
- package/dist/EditCommentModal-DoVppFIY.mjs +0 -114
- package/dist/EditFtpIcon-B1FO4hqc.mjs +0 -39
- package/dist/EmissionGroupChooser-B10wDKyp.mjs +0 -44
- package/dist/EmissionInlineList-Cn8j50o6.mjs +0 -113
- package/dist/EmissionItem-CQbtdUNM.mjs +0 -116
- package/dist/EmissionList-E0Hsq0mr.mjs +0 -230
- package/dist/EmissionPage-BY0IY-Ci.mjs +0 -188
- package/dist/EmissionPlayerItem-KHWB18Ru.mjs +0 -119
- package/dist/EmissionPresentationItem-2hfEZ9Wc.mjs +0 -41
- package/dist/EmissionPresentationList-Da6YRCuJ.mjs +0 -92
- package/dist/EmissionsPage-BpPlQ1vL.mjs +0 -112
- package/dist/Error403Page-D7zKplcn.mjs +0 -40
- package/dist/ErrorMessage-B4gtlriP.mjs +0 -22
- package/dist/FooterGarSection-CwAVj0X8.mjs +0 -39
- package/dist/FooterSection-CklRE0yr.mjs +0 -148
- package/dist/GeneralStore-Darfv4af.mjs +0 -39
- package/dist/HomeDropdown-D65QDBBQ.mjs +0 -66
- package/dist/HomePage-stJtq5XR.mjs +0 -106
- package/dist/IHeartIcon-DP1otYre.mjs +0 -42
- package/dist/LikeButton-Cu8jAJHx.mjs +0 -40
- package/dist/LikeSection-xB4hZ4kv.mjs +0 -96
- package/dist/ListPaginate-gdpJpyC6.mjs +0 -147
- package/dist/LiveHorizontalList-D1QZCKdq.mjs +0 -77
- package/dist/LiveList-CerWcFJv.mjs +0 -206
- package/dist/LivesPage-C-jtDd4n.mjs +0 -40
- package/dist/MapPage-Bef5gLQu.mjs +0 -240
- package/dist/MessageModal-BcqS77v6.mjs +0 -101
- package/dist/MobileMenu-CV5t_RXg.mjs +0 -136
- package/dist/MonetizableFilter-B7NHzXEY.mjs +0 -58
- package/dist/NewsletterModal-CEI0I08q.mjs +0 -53
- package/dist/OctopusMultiselect-CaLjXg_3.mjs +0 -234
- package/dist/OrganisationChooser-CvHoHxHL.mjs +0 -133
- package/dist/OrganisationChooserLight-CJ7IbvRM.mjs +0 -48
- package/dist/PageLogout-CVZHOw8c.mjs +0 -12
- package/dist/PageNotFound-Cgmgm9i1.mjs +0 -37
- package/dist/PaginateParams-Bjz3ZI-5.mjs +0 -75
- package/dist/PaginateSection-Oip_5JHt.mjs +0 -137
- package/dist/ParticipantDescription-DVSfKvtg.mjs +0 -46
- package/dist/ParticipantInlineList-CVsGpX6b.mjs +0 -84
- package/dist/ParticipantItem-BIWNtU2J.mjs +0 -91
- package/dist/ParticipantPage-BvSoNApw.mjs +0 -129
- package/dist/ParticipantsPage-ho_vMsWs.mjs +0 -168
- package/dist/PlayVideoIcon-BhTQpMyL.mjs +0 -40
- package/dist/PlayerAnonymousModal-DI-OzIJ0.mjs +0 -61
- package/dist/PlayerCommonParameters-x0zV7AoW.mjs +0 -27
- package/dist/PlayerCompact-BjS5HFvK.mjs +0 -128
- package/dist/PlayerComponent-CajQtPxX.mjs +0 -592
- package/dist/PlayerFmIcon-D7gURz4r.mjs +0 -39
- package/dist/PlayerLarge-H4sl7hoe.mjs +0 -128
- package/dist/PlayerParameters-kVBMXQIb.mjs +0 -173
- package/dist/PlayerPlayButton-DfzHBM_X.mjs +0 -231
- package/dist/PlayerProgressBar-CSY72hgw.mjs +0 -67
- package/dist/PlayerStore-C4T1vCHz.mjs +0 -166
- package/dist/PlayerVideo-BfR5fBo_.mjs +0 -35
- package/dist/PlayerVideoDigiteka-C6ZA6XkR.mjs +0 -59
- package/dist/PlayerVideoHls-B8dm2-2-.mjs +0 -125
- package/dist/PlayerYoutubeEmbed-D-UrFhXm.mjs +0 -25
- package/dist/PlaylistPage-DTy_55xp.mjs +0 -135
- package/dist/PlaylistsPage-m-ST2PUd.mjs +0 -254
- package/dist/PocketCastIcon-CM5NDsDa.mjs +0 -39
- package/dist/PodcastAddictIcon-CW3Uxj4I.mjs +0 -42
- package/dist/PodcastFilterList-Bz8c8rOJ.mjs +0 -139
- package/dist/PodcastImage-BGQti5JM.mjs +0 -115
- package/dist/PodcastInlineList-WvkPSh1V.mjs +0 -117
- package/dist/PodcastInlineListTemplate-D1bIqp9s.mjs +0 -180
- package/dist/PodcastIsPlaying-mWJppqAl.mjs +0 -17
- package/dist/PodcastItem-CYPwjD38.mjs +0 -158
- package/dist/PodcastList-BfqxVGag.mjs +0 -184
- package/dist/PodcastList-D3jE4KxK.mjs +0 -113
- package/dist/PodcastPage-GTzk5mUv.mjs +0 -409
- package/dist/PodcastPlannedSpinner-DcDDays8.mjs +0 -12
- package/dist/PodcastPlayBar-YJnOuGTK.mjs +0 -39
- package/dist/PodcastPlayBasicButton-BYpnGOO1.mjs +0 -44
- package/dist/PodcastPlayButton-CJ8BRg-T.mjs +0 -118
- package/dist/PodcastPlaylistInlineList-CmgnXWqI.mjs +0 -63
- package/dist/PodcastPresentationList-BBbhrj5M.mjs +0 -130
- package/dist/PodcastProgressBar-DDmGqHRZ.mjs +0 -66
- package/dist/PodcastRawTranscript-uMquvyIx.mjs +0 -100
- package/dist/PodcastRubriqueList-CMcls_jK.mjs +0 -46
- package/dist/PodcastSeasonInfo-DDGSqj8M.mjs +0 -28
- package/dist/PodcastSwiperList-CR4Daki7.mjs +0 -164
- package/dist/PodcastmakerHeader-Blma5tOE.mjs +0 -33
- package/dist/PodcastsPage-BZfbH613.mjs +0 -123
- package/dist/PresentationLayout-LcZqb8bn.mjs +0 -62
- package/dist/ProductorSearch-Cyo0OOte.mjs +0 -91
- package/dist/ProgressBar-h-6hD6C6.mjs +0 -112
- package/dist/QrCode-CB7uCURG.mjs +0 -105
- package/dist/QrCodeModal-uLXUjfFk.mjs +0 -43
- package/dist/RadioCurrently-CxTpzc3O.mjs +0 -57
- package/dist/RadioHistory-DaY_apJL.mjs +0 -89
- package/dist/RadioImage-CGdu0tqS.mjs +0 -46
- package/dist/RadioList-Dwjy8BJK.mjs +0 -70
- package/dist/RadioPage-B0cZlWcd.mjs +0 -72
- package/dist/RadioPlanning-yTAzd4fk.mjs +0 -183
- package/dist/RadioProgressBar-DLRlsyeG.mjs +0 -31
- package/dist/RadiolineIcon-CxHZGhfr.mjs +0 -40
- package/dist/RecaptchaModal-eBNvLZYg.mjs +0 -95
- package/dist/ReportAbuseModal-0i7fa_Kb.mjs +0 -92
- package/dist/RightsIndicator-BFKSa05U.mjs +0 -58
- package/dist/RightsWrapper-BRWuAx2F.mjs +0 -104
- package/dist/RubriqueChoice-DWvVVaMg.mjs +0 -101
- package/dist/RubriqueChooser-B7wvJeQc.mjs +0 -165
- package/dist/RubriqueFilter-BLW_L9Wm.mjs +0 -119
- package/dist/RubriqueList-DKBuYW37.mjs +0 -117
- package/dist/RubriquePage-D4b-tHSI.mjs +0 -71
- package/dist/SearchOrder-D_dAhj9M.mjs +0 -62
- package/dist/SearchPage-DiEabf9d.mjs +0 -38
- package/dist/ShareAnonymous-DnvGBSfx.mjs +0 -189
- package/dist/ShareModalPlayer-CXYjEN8k.mjs +0 -87
- package/dist/ShareNewsletter-C6U_Jjnm.mjs +0 -143
- package/dist/SharePlayer-B7YLKRAB.mjs +0 -210
- package/dist/SharePlayerColors-BpdifsHh.mjs +0 -49
- package/dist/SharePlayerRadio-Dy6UuwWM.mjs +0 -66
- package/dist/SharePlayerTypes-CeecVrvy.mjs +0 -148
- package/dist/ShareSocialsButtons-ty0wa4Hj.mjs +0 -100
- package/dist/SimpleLayout-BgflH0r5.mjs +0 -22
- package/dist/SmartLinkPage-BmXB-5t-.mjs +0 -131
- package/dist/SnackBar-BL-mLRun.mjs +0 -128
- package/dist/SubscribeButtons-Bqc3UtOf.mjs +0 -120
- package/dist/SwiperList-nkm8nHZC.mjs +0 -119
- package/dist/TagList-BcJZfwL5.mjs +0 -80
- package/dist/TagPage-DFUbxGht.mjs +0 -79
- package/dist/TopBar-1YG7Pruy.mjs +0 -260
- package/dist/TuninIcon-DENNxlP8.mjs +0 -39
- package/dist/UserButtonContent-CKxL8aX3.mjs +0 -125
- package/dist/VastStore-8IiEgtQW.mjs +0 -71
- package/dist/VideoModuleBox-B54AebXt.mjs +0 -58
- package/dist/VideoPage-BxYH2SFo.mjs +0 -148
- package/dist/XIcon-DNBT2Zgf.mjs +0 -39
- package/dist/_plugin-vue_export-helper-B3ysoDQm.mjs +0 -8
- package/dist/buttons-CWMRsA_g.mjs +0 -79
- package/dist/classicApi-DR5O2l0-.mjs +0 -1183
- package/dist/config-DMjLBcZ2.mjs +0 -7
- package/dist/cookiesHelper-BQ3M1-Xr.mjs +0 -20
- package/dist/displayHelper-DQtoqc_6.mjs +0 -11
- package/dist/domHelper-BPw2kGCL.mjs +0 -12
- package/dist/downloadHelper-DqI60vwY.mjs +0 -23
- package/dist/educationen-KT401RLo.mjs +0 -16
- package/dist/educationfr-BIafOUp-.mjs +0 -4
- package/dist/emission-CQ1VuxRc.mjs +0 -22
- package/dist/icons-aOUoelo6.mjs +0 -11
- package/dist/keys-CV5SBM1i.mjs +0 -4
- package/dist/localisation-CBnt682X.mjs +0 -9
- package/dist/logo_saooti_play_black-Doe3es2H.mjs +0 -4
- package/dist/messages-DxUrH00s.mjs +0 -2677
- package/dist/organisation-JgfYj1Jp.mjs +0 -17
- package/dist/ouest_france_logo-9dPaEPNA.mjs +0 -4
- package/dist/podcast-BoNHyuLe.mjs +0 -53
- package/dist/rolldown-runtime-Dy4uBu1J.mjs +0 -11
- package/dist/stringHelper-8Cu4x0-T.mjs +0 -13
- package/dist/types-BMNwRfo9.mjs +0 -8
- package/dist/useAdvancedParamInit-DIw4V0uk.mjs +0 -111
- package/dist/useCountdown-vXzlLAgF.mjs +0 -32
- package/dist/useDayjs-CCvXE-aF.mjs +0 -28
- package/dist/useErrorHandler-CNqmf6tv.mjs +0 -12
- package/dist/useImageProxy-C3duE5Uj.mjs +0 -16
- package/dist/useOrgaComputed-ZwTfEXF-.mjs +0 -16
- package/dist/usePlayerLogicProgress--FrjZ3zY.mjs +0 -68
- package/dist/usePodcastView-EmNdC0A1.mjs +0 -31
- package/dist/usePresentationItem-PCEJ9BHI.mjs +0 -100
- package/dist/useResizePhone-4hSkK5pa.mjs +0 -28
- package/dist/useRights-D4GJoff9.mjs +0 -221
- package/dist/useRouteUpdateParams-DJLm3IAI.mjs +0 -55
- package/dist/useRubriquesFilterComputed-BKI04l9G.mjs +0 -11
- package/dist/useRubriquesFilterParam-C5AZlQOX.mjs +0 -32
- package/dist/useSeasonsManagement-DwbmJywJ.mjs +0 -24
- package/dist/useSelenium-DAM6EF3J.mjs +0 -9
- package/dist/useSeoTitleUrl-UfPXDCPa.mjs +0 -25
- package/dist/useSharePath-D9G8Jdlb.mjs +0 -40
- package/dist/useSharePlatforms-DWJtsHHs.mjs +0 -322
- package/dist/useSimplePageParam-DJBHk-Yr.mjs +0 -39
- package/dist/useTagOf-Btweq3v2.mjs +0 -17
- package/dist/useTranslation-xTuUuIiz.mjs +0 -139
- package/dist/usefetchRadioData-SnCkZcGt.mjs +0 -48
- 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":"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"}
|
|
@@ -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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"}
|