zignal-stencil-library 1.1.122 → 1.1.124
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/cjs/autocomplete-address_43.cjs.entry.js +175 -223
- package/dist/cjs/quick-message-app.cjs.entry.js +2 -2
- package/dist/cjs/quick-message-app.entry.cjs.js.map +1 -1
- package/dist/collection/components/autocomplete-address/autocomplete-address.css +1 -1
- package/dist/collection/components/autocomplete-address/autocomplete-address.js +5 -6
- package/dist/collection/components/autocomplete-address/autocomplete-address.js.map +1 -1
- package/dist/collection/components/autocomplete-multiple-select/autocomplete-multiple-select.css +1 -1
- package/dist/collection/components/autocomplete-multiple-select/autocomplete-multiple-select.js +2 -4
- package/dist/collection/components/autocomplete-multiple-select/autocomplete-multiple-select.js.map +1 -1
- package/dist/collection/components/autocomplete-select/autocomplete-select.css +1 -1
- package/dist/collection/components/autocomplete-select/autocomplete-select.js +4 -4
- package/dist/collection/components/autocomplete-select/autocomplete-select.js.map +1 -1
- package/dist/collection/components/channel-box/channel-box.css +1 -1
- package/dist/collection/components/channel-box/channel-box.js +2 -3
- package/dist/collection/components/channel-box/channel-box.js.map +1 -1
- package/dist/collection/components/chat-app/chat-app.css +1 -1
- package/dist/collection/components/chat-app/chat-app.js +1 -1
- package/dist/collection/components/chat-app/chat-app.js.map +1 -1
- package/dist/collection/components/chat-header/chat-header.css +1 -1
- package/dist/collection/components/chat-header/chat-header.js +6 -7
- package/dist/collection/components/chat-header/chat-header.js.map +1 -1
- package/dist/collection/components/chat-input/chat-input.css +1 -1
- package/dist/collection/components/chat-input/chat-input.js +2 -3
- package/dist/collection/components/chat-input/chat-input.js.map +1 -1
- package/dist/collection/components/checkbox-list/checkbox-list.css +1 -1
- package/dist/collection/components/checkbox-list/checkbox-list.js +1 -3
- package/dist/collection/components/checkbox-list/checkbox-list.js.map +1 -1
- package/dist/collection/components/dialog-bill-editor/dialog-bill-editor.css +1 -1
- package/dist/collection/components/dialog-bill-editor/dialog-bill-editor.js +4 -5
- package/dist/collection/components/dialog-bill-editor/dialog-bill-editor.js.map +1 -1
- package/dist/collection/components/dialog-editor/dialog-editor.css +1 -1
- package/dist/collection/components/dialog-editor/dialog-editor.js +2 -3
- package/dist/collection/components/dialog-editor/dialog-editor.js.map +1 -1
- package/dist/collection/components/dialog-preview-media/dialog-preview-media.css +1 -1
- package/dist/collection/components/dialog-preview-media/dialog-preview-media.js +2 -3
- package/dist/collection/components/dialog-preview-media/dialog-preview-media.js.map +1 -1
- package/dist/collection/components/dialog-search/dialog-search.css +1 -1
- package/dist/collection/components/dialog-search/dialog-search.js +2 -3
- package/dist/collection/components/dialog-search/dialog-search.js.map +1 -1
- package/dist/collection/components/internal-component/about-section.js +2 -2
- package/dist/collection/components/internal-component/about-section.js.map +1 -1
- package/dist/collection/components/internal-component/associated-users-section.js +3 -5
- package/dist/collection/components/internal-component/associated-users-section.js.map +1 -1
- package/dist/collection/components/internal-component/chat-item.js +2 -4
- package/dist/collection/components/internal-component/chat-item.js.map +1 -1
- package/dist/collection/components/internal-component/context-section.js +2 -2
- package/dist/collection/components/internal-component/context-section.js.map +1 -1
- package/dist/collection/components/internal-component/merge-user-view.js +4 -4
- package/dist/collection/components/internal-component/merge-user-view.js.map +1 -1
- package/dist/collection/components/internal-component/tag-section.js +2 -2
- package/dist/collection/components/internal-component/tag-section.js.map +1 -1
- package/dist/collection/components/internal-component/z-button-group.js +1 -5
- package/dist/collection/components/internal-component/z-button-group.js.map +1 -1
- package/dist/collection/components/internal-component/z-button.js +1 -3
- package/dist/collection/components/internal-component/z-button.js.map +1 -1
- package/dist/collection/components/internal-component/z-context-input.js +2 -2
- package/dist/collection/components/internal-component/z-context-input.js.map +1 -1
- package/dist/collection/components/internal-component/z-icon-button.js +1 -3
- package/dist/collection/components/internal-component/z-icon-button.js.map +1 -1
- package/dist/collection/components/internal-component/z-input-area.js +1 -1
- package/dist/collection/components/internal-component/z-input-area.js.map +1 -1
- package/dist/collection/components/internal-component/z-input.js +1 -1
- package/dist/collection/components/internal-component/z-input.js.map +1 -1
- package/dist/collection/components/internal-component/z-select-input.js +1 -1
- package/dist/collection/components/internal-component/z-select-input.js.map +1 -1
- package/dist/collection/components/internal-component/z-tag-or-status-item.js +1 -1
- package/dist/collection/components/internal-component/z-tag-or-status-item.js.map +1 -1
- package/dist/collection/components/menu-chat-channel/menu-chat-channel.css +1 -1
- package/dist/collection/components/menu-chat-channel/menu-chat-channel.js +2 -3
- package/dist/collection/components/menu-chat-channel/menu-chat-channel.js.map +1 -1
- package/dist/collection/components/menu-chat-type/menu-chat-type.css +1 -1
- package/dist/collection/components/menu-chat-type/menu-chat-type.js +3 -4
- package/dist/collection/components/menu-chat-type/menu-chat-type.js.map +1 -1
- package/dist/collection/components/menu-list/menu-list.css +1 -1
- package/dist/collection/components/menu-list/menu-list.js +2 -4
- package/dist/collection/components/menu-list/menu-list.js.map +1 -1
- package/dist/collection/components/message-box/message-box.css +1 -1
- package/dist/collection/components/message-box/message-box.js +3 -4
- package/dist/collection/components/message-box/message-box.js.map +1 -1
- package/dist/collection/components/message-content/message-content.css +1 -1
- package/dist/collection/components/message-content/message-content.js +7 -9
- package/dist/collection/components/message-content/message-content.js.map +1 -1
- package/dist/collection/components/message-item/message-item.css +1 -1
- package/dist/collection/components/message-item/message-item.js +3 -4
- package/dist/collection/components/message-item/message-item.js.map +1 -1
- package/dist/collection/components/message-media/message-media.css +1 -1
- package/dist/collection/components/message-media/message-media.js +5 -6
- package/dist/collection/components/message-media/message-media.js.map +1 -1
- package/dist/collection/components/profile-history/profile-history.css +1 -1
- package/dist/collection/components/profile-history/profile-history.js +4 -7
- package/dist/collection/components/profile-history/profile-history.js.map +1 -1
- package/dist/collection/components/profile-info/profile-info.css +1 -1
- package/dist/collection/components/profile-info/profile-info.js +1 -1
- package/dist/collection/components/profile-info/profile-info.js.map +1 -1
- package/dist/collection/components/profile-info/summarize-message-section.js +2 -2
- package/dist/collection/components/profile-info/summarize-message-section.js.map +1 -1
- package/dist/collection/components/profile-info/user-info-section.js +2 -2
- package/dist/collection/components/profile-info/user-info-section.js.map +1 -1
- package/dist/collection/components/profile-media/profile-media.css +1 -1
- package/dist/collection/components/profile-tabs/profile-tabs.css +1 -1
- package/dist/collection/components/profile-tabs/profile-tabs.js +3 -4
- package/dist/collection/components/profile-tabs/profile-tabs.js.map +1 -1
- package/dist/collection/components/quick-message-add-template/quick-message-add-template.css +1 -1
- package/dist/collection/components/quick-message-add-template/quick-message-add-template.js +4 -6
- package/dist/collection/components/quick-message-add-template/quick-message-add-template.js.map +1 -1
- package/dist/collection/components/quick-message-add-template/quick-message-button-content.js +1 -1
- package/dist/collection/components/quick-message-add-template/quick-message-button-content.js.map +1 -1
- package/dist/collection/components/quick-message-add-template/quick-message-image-content.js +4 -4
- package/dist/collection/components/quick-message-add-template/quick-message-image-content.js.map +1 -1
- package/dist/collection/components/quick-message-add-template/quick-message-menu-list-content.js +2 -6
- package/dist/collection/components/quick-message-add-template/quick-message-menu-list-content.js.map +1 -1
- package/dist/collection/components/quick-message-add-template/quick-message-template-button-dialog.js +2 -2
- package/dist/collection/components/quick-message-add-template/quick-message-template-button-dialog.js.map +1 -1
- package/dist/collection/components/quick-message-add-template/quick-message-template-button-list.js +5 -5
- package/dist/collection/components/quick-message-add-template/quick-message-template-button-list.js.map +1 -1
- package/dist/collection/components/quick-message-add-template/quick-message-text-content.js +1 -1
- package/dist/collection/components/quick-message-add-template/quick-message-text-content.js.map +1 -1
- package/dist/collection/components/quick-message-add-template/quick-message-video-content.js +3 -5
- package/dist/collection/components/quick-message-add-template/quick-message-video-content.js.map +1 -1
- package/dist/collection/components/quick-message-app/quick-message-app.css +1 -1
- package/dist/collection/components/quick-message-app/quick-message-app.js +1 -1
- package/dist/collection/components/quick-message-app/quick-message-app.js.map +1 -1
- package/dist/collection/components/quick-message-file/quick-message-file.css +1 -1
- package/dist/collection/components/quick-message-file/quick-message-file.js +2 -2
- package/dist/collection/components/quick-message-file/quick-message-file.js.map +1 -1
- package/dist/collection/components/quick-message-image/quick-message-image.css +1 -1
- package/dist/collection/components/quick-message-image/quick-message-image.js +3 -3
- package/dist/collection/components/quick-message-image/quick-message-image.js.map +1 -1
- package/dist/collection/components/quick-message-modal/quick-message-modal.css +1 -1
- package/dist/collection/components/quick-message-modal/quick-message-modal.js +1 -3
- package/dist/collection/components/quick-message-modal/quick-message-modal.js.map +1 -1
- package/dist/collection/components/quick-message-template/quick-message-template.css +1 -1
- package/dist/collection/components/quick-message-template/quick-message-template.js +12 -13
- package/dist/collection/components/quick-message-template/quick-message-template.js.map +1 -1
- package/dist/collection/components/search-box/search-box.css +1 -1
- package/dist/collection/components/search-box/search-box.js +2 -3
- package/dist/collection/components/search-box/search-box.js.map +1 -1
- package/dist/collection/components/status-badge/status-badge.css +1 -1
- package/dist/collection/components/status-badge/status-badge.js +3 -5
- package/dist/collection/components/status-badge/status-badge.js.map +1 -1
- package/dist/collection/components/tag-list/tag-list.css +1 -1
- package/dist/collection/components/tag-or-status-item/tag-or-status-item.css +1 -1
- package/dist/collection/components/tag-or-status-item/tag-or-status-item.js +2 -4
- package/dist/collection/components/tag-or-status-item/tag-or-status-item.js.map +1 -1
- package/dist/collection/components/tag-popper/tag-popper.css +1 -1
- package/dist/collection/components/tag-popper/tag-popper.js +2 -4
- package/dist/collection/components/tag-popper/tag-popper.js.map +1 -1
- package/dist/collection/components/typography-clamp/typography-clamp.css +1 -1
- package/dist/collection/components/typography-clamp/typography-clamp.js +4 -6
- package/dist/collection/components/typography-clamp/typography-clamp.js.map +1 -1
- package/dist/collection/components/z-avatar/z-avatar.css +1 -1
- package/dist/collection/components/z-avatar/z-avatar.js +1 -3
- package/dist/collection/components/z-avatar/z-avatar.js.map +1 -1
- package/dist/collection/components/z-dialog/z-dialog.css +1 -1
- package/dist/collection/components/z-dialog/z-dialog.js +3 -4
- package/dist/collection/components/z-dialog/z-dialog.js.map +1 -1
- package/dist/components/autocomplete-address.js +1 -1
- package/dist/components/autocomplete-multiple-select.js +1 -1
- package/dist/components/autocomplete-select.js +1 -1
- package/dist/components/channel-box.js +1 -1
- package/dist/components/chat-app.js +44 -44
- package/dist/components/chat-app.js.map +1 -1
- package/dist/components/chat-header.js +1 -1
- package/dist/components/chat-input.js +1 -1
- package/dist/components/checkbox-list.js +1 -1
- package/dist/components/dialog-bill-editor.js +1 -1
- package/dist/components/dialog-editor.js +1 -1
- package/dist/components/dialog-preview-media.js +1 -1
- package/dist/components/dialog-search.js +1 -1
- package/dist/components/menu-chat-channel.js +1 -1
- package/dist/components/menu-chat-type.js +1 -1
- package/dist/components/menu-list.js +1 -1
- package/dist/components/message-box.js +1 -1
- package/dist/components/message-content.js +1 -1
- package/dist/components/message-item.js +1 -1
- package/dist/components/message-media.js +1 -1
- package/dist/components/p--6-gPFhh.js +517 -0
- package/dist/components/p--6-gPFhh.js.map +1 -0
- package/dist/components/p-58gnM05C.js +60 -0
- package/dist/components/p-58gnM05C.js.map +1 -0
- package/dist/components/p-9vQxFtwB.js +124 -0
- package/dist/components/p-9vQxFtwB.js.map +1 -0
- package/dist/components/p-B2hzHJmn.js +161 -0
- package/dist/components/p-B2hzHJmn.js.map +1 -0
- package/dist/components/p-B52CXl3S.js +566 -0
- package/dist/components/p-B52CXl3S.js.map +1 -0
- package/dist/components/p-B6K7wNBI.js +136 -0
- package/dist/components/p-B6K7wNBI.js.map +1 -0
- package/dist/components/p-BINMnTok.js +122 -0
- package/dist/components/p-BINMnTok.js.map +1 -0
- package/dist/components/{p-Dr67NIsD.js → p-BPVt9weM.js} +4 -4
- package/dist/components/p-BPVt9weM.js.map +1 -0
- package/dist/components/p-Bhl0cJtt.js +704 -0
- package/dist/components/p-Bhl0cJtt.js.map +1 -0
- package/dist/components/{p-Cln26Qch.js → p-BjytUY9X.js} +3 -5
- package/dist/components/p-BjytUY9X.js.map +1 -0
- package/dist/components/p-C-RfY4ml.js +183 -0
- package/dist/components/p-C-RfY4ml.js.map +1 -0
- package/dist/components/p-C0Ox-t8m.js +110 -0
- package/dist/components/p-C0Ox-t8m.js.map +1 -0
- package/dist/components/{p-HCd8IVUw.js → p-C0tV1VyH.js} +6 -6
- package/dist/components/p-C0tV1VyH.js.map +1 -0
- package/dist/components/p-C2wiyO0Z.js +187 -0
- package/dist/components/p-C2wiyO0Z.js.map +1 -0
- package/dist/components/p-C86RTgEO.js +99 -0
- package/dist/components/p-C86RTgEO.js.map +1 -0
- package/dist/components/p-CQukWN74.js +12 -0
- package/dist/components/p-CQukWN74.js.map +1 -0
- package/dist/components/p-CR0ul3pv.js +111 -0
- package/dist/components/p-CR0ul3pv.js.map +1 -0
- package/dist/components/p-CWouP-QX.js +103 -0
- package/dist/components/p-CWouP-QX.js.map +1 -0
- package/dist/components/p-CXSSgeU-.js +110 -0
- package/dist/components/p-CXSSgeU-.js.map +1 -0
- package/dist/components/p-C_4sxFCg.js +178 -0
- package/dist/components/p-C_4sxFCg.js.map +1 -0
- package/dist/components/p-Cb7Kl7m9.js +226 -0
- package/dist/components/p-Cb7Kl7m9.js.map +1 -0
- package/dist/components/{p-8qEzh9SS.js → p-CiVfPqKY.js} +3 -3
- package/dist/components/p-CiVfPqKY.js.map +1 -0
- package/dist/components/p-CmPioEUc.js +158 -0
- package/dist/components/p-CmPioEUc.js.map +1 -0
- package/dist/components/p-CokIqGkd.js +602 -0
- package/dist/components/p-CokIqGkd.js.map +1 -0
- package/dist/components/p-Cqxf38L8.js +557 -0
- package/dist/components/p-Cqxf38L8.js.map +1 -0
- package/dist/components/p-CyDVTDYz.js +143 -0
- package/dist/components/p-CyDVTDYz.js.map +1 -0
- package/dist/components/p-D3e5zXbz.js +518 -0
- package/dist/components/p-D3e5zXbz.js.map +1 -0
- package/dist/components/p-D7lsBPaE.js +54 -0
- package/dist/components/p-D7lsBPaE.js.map +1 -0
- package/dist/components/{p-fWn0RAxI.js → p-D7p1C-GV.js} +28 -29
- package/dist/components/p-D7p1C-GV.js.map +1 -0
- package/dist/components/p-DAZ1-wLt.js +125 -0
- package/dist/components/p-DAZ1-wLt.js.map +1 -0
- package/dist/components/p-DNlraJ-P.js +141 -0
- package/dist/components/p-DNlraJ-P.js.map +1 -0
- package/dist/components/p-DfG-ebYj.js +132 -0
- package/dist/components/{p-QWdJAi6S.js.map → p-DfG-ebYj.js.map} +1 -1
- package/dist/components/p-DhuDkLvY.js +58 -0
- package/dist/components/p-DhuDkLvY.js.map +1 -0
- package/dist/components/p-DoH02Q2B.js +234 -0
- package/dist/components/p-DoH02Q2B.js.map +1 -0
- package/dist/components/p-DoW6kVb9.js +311 -0
- package/dist/components/p-DoW6kVb9.js.map +1 -0
- package/dist/components/{p-CXREPMwB.js → p-DrKmW41y.js} +3 -5
- package/dist/components/p-DrKmW41y.js.map +1 -0
- package/dist/components/{p-BN5kaJQg.js → p-FhAWwRc3.js} +6 -8
- package/dist/components/p-FhAWwRc3.js.map +1 -0
- package/dist/components/p-L6_EMhji.js +35 -0
- package/dist/components/{p-B_hkj0ZB.js.map → p-L6_EMhji.js.map} +1 -1
- package/dist/components/{p-C_aWPgsl.js → p-WA5K_3rK.js} +5 -9
- package/dist/components/p-WA5K_3rK.js.map +1 -0
- package/dist/components/p-_EaCdLgo.js +105 -0
- package/dist/components/p-_EaCdLgo.js.map +1 -0
- package/dist/components/p-_OziKbNH.js +217 -0
- package/dist/components/p-_OziKbNH.js.map +1 -0
- package/dist/components/p-cH7iCq8E.js +158 -0
- package/dist/components/p-cH7iCq8E.js.map +1 -0
- package/dist/components/p-fZrBBdjT.js +20 -0
- package/dist/components/p-fZrBBdjT.js.map +1 -0
- package/dist/components/p-kiTovzcq.js +79 -0
- package/dist/components/p-kiTovzcq.js.map +1 -0
- package/dist/components/p-r45UkrnT.js +159 -0
- package/dist/components/p-r45UkrnT.js.map +1 -0
- package/dist/components/p-sNMkGZNs.js +77 -0
- package/dist/components/p-sNMkGZNs.js.map +1 -0
- package/dist/components/p-xhP2H16s.js +138 -0
- package/dist/components/p-xhP2H16s.js.map +1 -0
- package/dist/components/profile-history.js +1 -1
- package/dist/components/profile-info.js +1 -1
- package/dist/components/profile-media.js +1 -1
- package/dist/components/profile-tabs.js +1 -1
- package/dist/components/quick-message-add-template.js +1 -1
- package/dist/components/quick-message-app.js +12 -12
- package/dist/components/quick-message-app.js.map +1 -1
- package/dist/components/quick-message-button-content.js +1 -1
- package/dist/components/quick-message-file.js +1 -1
- package/dist/components/quick-message-image-content.js +1 -1
- package/dist/components/quick-message-image.js +1 -1
- package/dist/components/quick-message-menu-list-content.js +1 -1
- package/dist/components/quick-message-modal.js +1 -1
- package/dist/components/quick-message-template.js +1 -1
- package/dist/components/quick-message-text-content.js +1 -1
- package/dist/components/quick-message-video-content.js +1 -1
- package/dist/components/search-box.js +1 -1
- package/dist/components/status-badge.js +1 -1
- package/dist/components/summarize-message-section.js +1 -1
- package/dist/components/tag-list.js +1 -1
- package/dist/components/tag-or-status-item.js +1 -1
- package/dist/components/tag-popper.js +1 -1
- package/dist/components/typography-clamp.js +1 -1
- package/dist/components/user-info-section.js +1 -1
- package/dist/components/z-avatar.js +1 -1
- package/dist/components/z-dialog.js +1 -1
- package/dist/esm/autocomplete-address_43.entry.js +176 -224
- package/dist/esm/quick-message-app.entry.js +2 -2
- package/dist/esm/quick-message-app.entry.js.map +1 -1
- package/dist/types/components/quick-message-add-template/quick-message-template-button-dialog.d.ts +0 -1
- package/dist/types/components/quick-message-add-template/quick-message-template-button-list.d.ts +0 -1
- package/dist/types/components.d.ts +2 -2
- package/dist/zignal-stencil-library/p-962f628d.entry.js +2 -0
- package/dist/zignal-stencil-library/{p-b607bd95.entry.js.map → p-962f628d.entry.js.map} +1 -1
- package/dist/zignal-stencil-library/{p-42323f24.entry.js → p-b76b5b18.entry.js} +284 -284
- package/dist/zignal-stencil-library/p-b76b5b18.entry.js.map +1 -0
- package/dist/zignal-stencil-library/quick-message-app.entry.esm.js.map +1 -1
- package/dist/zignal-stencil-library/zignal-stencil-library.esm.js +1 -1
- package/package.json +1 -1
- package/dist/components/p--NVEHLHX.js +0 -519
- package/dist/components/p--NVEHLHX.js.map +0 -1
- package/dist/components/p-3TNBPyVm.js +0 -518
- package/dist/components/p-3TNBPyVm.js.map +0 -1
- package/dist/components/p-5RiW44CU.js +0 -79
- package/dist/components/p-5RiW44CU.js.map +0 -1
- package/dist/components/p-8qEzh9SS.js.map +0 -1
- package/dist/components/p-BIsOKyPf.js +0 -20
- package/dist/components/p-BIsOKyPf.js.map +0 -1
- package/dist/components/p-BN5kaJQg.js.map +0 -1
- package/dist/components/p-BPxd-Uh7.js +0 -144
- package/dist/components/p-BPxd-Uh7.js.map +0 -1
- package/dist/components/p-BTMD7B7C.js +0 -111
- package/dist/components/p-BTMD7B7C.js.map +0 -1
- package/dist/components/p-BTueWK7n.js +0 -566
- package/dist/components/p-BTueWK7n.js.map +0 -1
- package/dist/components/p-B_hkj0ZB.js +0 -35
- package/dist/components/p-BauNUNxj.js +0 -113
- package/dist/components/p-BauNUNxj.js.map +0 -1
- package/dist/components/p-BfUZxTlw.js +0 -160
- package/dist/components/p-BfUZxTlw.js.map +0 -1
- package/dist/components/p-BinfA3W8.js +0 -142
- package/dist/components/p-BinfA3W8.js.map +0 -1
- package/dist/components/p-CQFDMJ5f.js +0 -159
- package/dist/components/p-CQFDMJ5f.js.map +0 -1
- package/dist/components/p-CXREPMwB.js.map +0 -1
- package/dist/components/p-CZVKrQYg.js +0 -104
- package/dist/components/p-CZVKrQYg.js.map +0 -1
- package/dist/components/p-C_HH3fQ_.js +0 -101
- package/dist/components/p-C_HH3fQ_.js.map +0 -1
- package/dist/components/p-C_aWPgsl.js.map +0 -1
- package/dist/components/p-CcDDxBGE.js +0 -124
- package/dist/components/p-CcDDxBGE.js.map +0 -1
- package/dist/components/p-Cln26Qch.js.map +0 -1
- package/dist/components/p-D-k9Ht5O.js +0 -161
- package/dist/components/p-D-k9Ht5O.js.map +0 -1
- package/dist/components/p-D0Q31-og.js +0 -81
- package/dist/components/p-D0Q31-og.js.map +0 -1
- package/dist/components/p-D4V6ee1B.js +0 -219
- package/dist/components/p-D4V6ee1B.js.map +0 -1
- package/dist/components/p-DGgn1vds.js +0 -12
- package/dist/components/p-DGgn1vds.js.map +0 -1
- package/dist/components/p-DHoTm6uV.js +0 -706
- package/dist/components/p-DHoTm6uV.js.map +0 -1
- package/dist/components/p-DOKxmBLB.js +0 -126
- package/dist/components/p-DOKxmBLB.js.map +0 -1
- package/dist/components/p-DPLOHu2O.js +0 -235
- package/dist/components/p-DPLOHu2O.js.map +0 -1
- package/dist/components/p-DW2oCYil.js +0 -58
- package/dist/components/p-DW2oCYil.js.map +0 -1
- package/dist/components/p-DZCButrK.js +0 -140
- package/dist/components/p-DZCButrK.js.map +0 -1
- package/dist/components/p-DZf2MPsy.js +0 -137
- package/dist/components/p-DZf2MPsy.js.map +0 -1
- package/dist/components/p-D_G15kEN.js +0 -163
- package/dist/components/p-D_G15kEN.js.map +0 -1
- package/dist/components/p-DhF7zW13.js +0 -184
- package/dist/components/p-DhF7zW13.js.map +0 -1
- package/dist/components/p-Dhxy6d02.js +0 -603
- package/dist/components/p-Dhxy6d02.js.map +0 -1
- package/dist/components/p-DiFxA9C8.js +0 -61
- package/dist/components/p-DiFxA9C8.js.map +0 -1
- package/dist/components/p-Dm1oFnI9.js +0 -227
- package/dist/components/p-Dm1oFnI9.js.map +0 -1
- package/dist/components/p-DqgWPpNk.js +0 -190
- package/dist/components/p-DqgWPpNk.js.map +0 -1
- package/dist/components/p-Dr67NIsD.js.map +0 -1
- package/dist/components/p-HCd8IVUw.js.map +0 -1
- package/dist/components/p-KjRULqEj.js +0 -55
- package/dist/components/p-KjRULqEj.js.map +0 -1
- package/dist/components/p-LM6YhAdU.js +0 -107
- package/dist/components/p-LM6YhAdU.js.map +0 -1
- package/dist/components/p-LwSnAWDG.js +0 -315
- package/dist/components/p-LwSnAWDG.js.map +0 -1
- package/dist/components/p-N2esZK19.js +0 -124
- package/dist/components/p-N2esZK19.js.map +0 -1
- package/dist/components/p-QAZAlQ6_.js +0 -557
- package/dist/components/p-QAZAlQ6_.js.map +0 -1
- package/dist/components/p-QWdJAi6S.js +0 -132
- package/dist/components/p-W6QLnwgO.js +0 -112
- package/dist/components/p-W6QLnwgO.js.map +0 -1
- package/dist/components/p-fWn0RAxI.js.map +0 -1
- package/dist/components/p-sd8--sZk.js +0 -178
- package/dist/components/p-sd8--sZk.js.map +0 -1
- package/dist/zignal-stencil-library/p-42323f24.entry.js.map +0 -1
- package/dist/zignal-stencil-library/p-b607bd95.entry.js +0 -2
|
@@ -476,7 +476,7 @@ export class QuickMessageImageComponent {
|
|
|
476
476
|
void this.fetchImages({ search: '', reset: true });
|
|
477
477
|
}
|
|
478
478
|
}
|
|
479
|
-
renderRenameModal(
|
|
479
|
+
renderRenameModal(labels) {
|
|
480
480
|
const target = this.getRenameTarget();
|
|
481
481
|
if (!this.renameTargetId || !target) {
|
|
482
482
|
return null;
|
|
@@ -485,7 +485,7 @@ export class QuickMessageImageComponent {
|
|
|
485
485
|
const nextName = this.renameExtension ? `${trimmedBase}${this.renameExtension}` : trimmedBase;
|
|
486
486
|
const isSaveDisabled = this.isRenaming || trimmedBase.length === 0 || nextName === target.name;
|
|
487
487
|
const inputId = `quick-message-image-rename-${target.id}`;
|
|
488
|
-
return (h("div", { class: "quick-message-image__rename-overlay", role: "dialog", "aria-modal": "true", "aria-labelledby": "quick-message-image-rename-title", onClick: () => this.closeRenameModal() }, h("div", { class: `quick-message-image__rename-modal
|
|
488
|
+
return (h("div", { class: "quick-message-image__rename-overlay", role: "dialog", "aria-modal": "true", "aria-labelledby": "quick-message-image-rename-title", onClick: () => this.closeRenameModal() }, h("div", { class: `quick-message-image__rename-modal bg-background text-surface`, onClick: event => event.stopPropagation() }, h("div", { class: "quick-message-image__rename-header" }, h("h3", { id: "quick-message-image-rename-title", class: "text-base font-semibold" }, labels.renameLabel), h("button", { type: "button", class: "quick-message-image__rename-close", onClick: () => this.closeRenameModal(), "aria-label": labels.closeLabel, disabled: this.isRenaming }, h(Icon, { name: "X" }))), h("form", { class: "flex flex-col gap-4", onSubmit: event => this.handleRenameSubmit(event) }, h("label", { class: "flex flex-col gap-2 text-sm", htmlFor: inputId }, h("span", { class: "font-medium" }, labels.nameLabel), h("div", { class: `quick-message-image__rename-input-row border border-divider bg-background` }, h("input", { id: inputId, type: "text", class: "quick-message-image__rename-input text-surface", value: this.renameName, onInput: event => this.handleRenameInput(event) }), this.renameExtension && h("span", { class: "quick-message-image__rename-extension" }, this.renameExtension))), h("div", { class: "flex justify-end gap-2 text-sm" }, h("button", { type: "button", class: "quick-message-image__rename-cancel", onClick: () => this.closeRenameModal(), disabled: this.isRenaming }, labels.cancelLabel), h("button", { type: "submit", class: "quick-message-image__rename-save", disabled: isSaveDisabled }, this.isRenaming ? h(Icon, { name: "Loader2", addClass: "size-4 animate-spin" }) : labels.saveLabel))))));
|
|
489
489
|
}
|
|
490
490
|
render() {
|
|
491
491
|
const theme = configStore.get('theme');
|
|
@@ -499,7 +499,7 @@ export class QuickMessageImageComponent {
|
|
|
499
499
|
const saveLabel = t('save');
|
|
500
500
|
const cancelLabel = t('cancel');
|
|
501
501
|
const closeLabel = t('close');
|
|
502
|
-
return (h(Host, { key: '
|
|
502
|
+
return (h(Host, { key: '8635394867cdce5d801e725a3b6cf9e19d1c11d5', class: "flex min-h-0 flex-1 flex-col gap-4", "data-theme": theme }, h("form", { key: '851885c98c5fade63a2620cda635f1df9835eba3', class: "w-full", onSubmit: event => this.handleSearchSubmit(event) }, h("div", { key: '0e67d9fa3eb0795ea5121c0ade00d5070029a971', class: "relative" }, h("input", { key: 'a6316f25e7ccc95c4d6ac3b95ebf6b7a29ab320c', type: "text", class: `w-full border border-divider text-sm px-4 py-2 pr-9 rounded-lg ring-primary focus:outline-none focus:border-primary bg-background text-surface`, placeholder: t('quick_message.search_image'), value: this.searchImage, onInput: event => this.handleSearchInput(event) }), this.searchImage && (h("button", { key: 'e06c0e29f5bfeb4caa285ac51ea06a6ecf115b45', type: "button", class: "absolute right-2 top-1/2 -translate-y-1/2 text-xs text-gray-400 hover:text-gray-600", onClick: () => this.clearSearch(), "aria-label": t('clear') || 'Clear' }, h(Icon, { key: '7ab4daaa61836de0f5b358b657b38789719c6dfb', name: "X" }))))), h("div", { key: '421d9d606abd29b5691f33d44926b84c639c5ee7', class: "flex items-center justify-between" }, this.images.length > 0 ? (h("label", { class: "inline-flex items-center gap-2 text-sm" }, h("input", { type: "checkbox", checked: this.images.length > 0 && this.images.every(image => image.isSelected), onChange: () => this.toggleSelectAllImages() }), h("span", null, t('select_all')))) : (h("span", null)), h("div", { key: 'b83a815d49303b66f614b495df130e700b0ca720', class: "flex items-center gap-2" }, h("input", { key: '98f294cc2d6cafbba69baf82b2740d3f69820800', class: "hidden", type: "file", accept: "image/*", multiple: true, ref: el => (this.fileInput = el), onChange: event => this.handleImageSelection(event) }), h("button", { key: '783edb02393e833a0c27fb1c81e0d0747c5035b1', type: "button", class: "quick-message-image__action-button inline-flex h-9 w-9 items-center justify-center rounded-lg cursor-pointer", onClick: () => !this.isUploading && this.triggerImageUpload(), "aria-label": t('quick_message.add_image'), disabled: this.isUploading }, this.isUploading ? h(Icon, { name: "Loader2", addClass: "size-4 animate-spin" }) : h(Icon, { name: "Plus" })), this.images.length > 0 && (h("button", { key: 'b13bc7a1e81b450928ce78f1573a879e41104fc3', class: "quick-message-image__action-button quick-message-image__display-switch inline-flex h-9 w-9 items-center justify-center rounded-lg cursor-pointer", type: "button", onClick: () => (this.imageDisplayMode = this.imageDisplayMode === 'grid' ? 'list' : 'grid'), "aria-label": this.imageDisplayMode === 'grid' ? t('quick_message.display_list') : t('quick_message.display_grid') }, h(Icon, { key: 'b8b920176e86e8218f7ce2bff4893bb09d129f2a', name: this.imageDisplayMode === 'grid' ? 'List' : 'Grid' }))))), this.isUploading && (h("div", { key: 'bc2ca13a1c0b3283d76150e1526008c619eb29a0', class: `flex items-center gap-2 text-xs text-primary` }, h(Icon, { key: '9ca8a27b2b988cc68758ec08e78c8f91adeeccb9', name: "Loader2", addClass: "size-4 animate-spin" }), h("span", { key: 'c191d9ecadbf5c9479e97d40c5732a9db959f71c' }, t('quick_message.uploading') || 'Uploading...'))), isInitialLoading ? (h("div", { class: `flex flex-1 items-center justify-center text-sm text-theme-gray` }, "Loading...")) : filteredImages.length === 0 ? (h("div", { class: `flex flex-1 items-center justify-center text-sm text-theme-gray` }, t('quick_message.image_empty'))) : this.imageDisplayMode === 'grid' ? (h("div", { class: "grid flex-1 grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 auto-rows-auto items-start content-start gap-3 overflow-y-auto", onScroll: event => this.handleScroll(event) }, filteredImages.map(image => (h("div", { class: "quick-message-image__grid-item", key: image.id }, h("button", { type: "button", class: `flex w-full flex-col items-center gap-2 rounded-xl border border-transparent bg-background p-1.5 cursor-pointer ${image.isSelected ? 'border-primary' : ''}`, onClick: () => this.toggleImageSelection(image.id) }, h("div", { class: "quick-message-image__thumbnail" }, image.isSelected && (h("span", { class: `quick-message-image__selection-indicator bg-primary`, "aria-hidden": "true" }, h(Icon, { name: "Check", addClass: "size-3 text-white" }))), h("img", { src: image.url, alt: image.name, class: "quick-message-image__thumbnail-image", loading: "lazy" })), h("div", { class: `text-center text-xs line-clamp-2 text-theme-gray` }, image.name)), h("div", { class: "quick-message-image__menu-wrapper quick-message-image__menu-wrapper--grid", "data-quick-message-image-menu-root": "" }, h("button", { type: "button", class: "quick-message-image__more-button", onClick: event => this.toggleMenu(image.id, event), "aria-haspopup": "menu", "aria-expanded": this.openMenuId === image.id ? 'true' : 'false', "aria-label": renameLabel, "data-quick-message-image-menu-root": "" }, h(Icon, { name: "MoreVertical", addClass: "size-4" })), this.openMenuId === image.id && (h("div", { class: `quick-message-image__menu bg-background text-surface`, role: "menu", "data-quick-message-image-menu-root": "" }, h("button", { type: "button", class: "quick-message-image__menu-item", role: "menuitem", onClick: event => this.handleMenuRename(image, event) }, renameLabel), h("button", { type: "button", class: "quick-message-image__menu-item quick-message-image__menu-item--danger", role: "menuitem", onClick: event => this.requestDeleteImage(image, event) }, deleteLabel))))))), this.isLoadingMore && h("div", { class: `col-span-full py-3 text-center text-xs text-theme-gray` }, "Loading..."))) : (h("div", { class: "flex flex-1 flex-col gap-2.5 overflow-y-auto", onScroll: event => this.handleScroll(event) }, filteredImages.map(image => (h("label", { class: `flex items-center gap-3 rounded-xl bg-background px-3 py-2.5`, key: image.id }, h("input", { type: "checkbox", checked: !!image.isSelected, onChange: () => this.toggleImageSelection(image.id) }), h("img", { src: image.url, alt: image.name, class: "h-16 w-16 rounded-xl object-cover", loading: "lazy" }), h("div", { class: "flex flex-1 items-center gap-3 min-w-0" }, h("div", { class: `flex min-w-0 flex-col gap-1 text-theme-gray` }, h("div", { class: "text-sm font-medium line-clamp-2 wrap-break-words" }, image.name), h("div", { class: `text-xs text-theme-gray` }, this.renderFileMeta(image.size, image.created_at, t))), h("div", { class: "quick-message-image__menu-wrapper", "data-quick-message-image-menu-root": "" }, h("button", { type: "button", class: "quick-message-image__list-more-button", onClick: event => this.toggleMenu(image.id, event), "aria-haspopup": "menu", "aria-expanded": this.openMenuId === image.id ? 'true' : 'false', "aria-label": renameLabel, "data-quick-message-image-menu-root": "" }, h(Icon, { name: "MoreVertical", addClass: "size-4" })), this.openMenuId === image.id && (h("div", { class: `quick-message-image__menu quick-message-image__menu--list bg-background text-surface`, role: "menu", "data-quick-message-image-menu-root": "" }, h("button", { type: "button", class: "quick-message-image__menu-item", role: "menuitem", onClick: event => this.handleMenuRename(image, event) }, renameLabel), h("button", { type: "button", class: "quick-message-image__menu-item quick-message-image__menu-item--danger", role: "menuitem", onClick: event => this.requestDeleteImage(image, event) }, deleteLabel)))))))), this.isLoadingMore && h("div", { class: `py-3 text-center text-xs text-theme-gray` }, "Loading..."))), h("div", { key: 'ee744ce7f4a77bc9ad9bc2ad751446895af2e577', class: `mt-auto flex items-center gap-2 pt-2 text-theme-gray` }, hasSelection && (h("button", { key: '5eb7985e1c2682f535630950c10af7c06d2904d8', type: "button", class: `quick-message-image__action-button inline-flex h-9 w-9 items-center justify-center rounded-lg cursor-pointer disabled:cursor-not-allowed disabled:opacity-40`, onClick: () => this.requestDeleteSelectedImages(), "aria-label": t('remove'), disabled: this.isDeleting }, this.isDeleting ? h(Icon, { name: "Loader2", addClass: "size-4 animate-spin" }) : h(Icon, { name: "Trash2" }))), !this.isMaster && (h("button", { key: 'f9b379d7d2022e23f852b024bbeaebc56a9b7e74', type: "button", disabled: !hasSelection, class: `quick-message-image__send ml-auto inline-flex items-center justify-center rounded-full px-4 py-2 text-xs font-semibold bg-primary text-white disabled:cursor-not-allowed disabled:opacity-40 cursor-pointer`, onClick: () => this.handleSendImages() }, t('quick_message.send_images')))), this.renderRenameModal({ renameLabel, nameLabel, saveLabel, cancelLabel, closeLabel })));
|
|
503
503
|
}
|
|
504
504
|
static get is() { return "quick-message-image"; }
|
|
505
505
|
static get originalStyleUrls() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quick-message-image.js","sourceRoot":"","sources":["../../../src/components/quick-message-image/quick-message-image.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAgB,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AACpG,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,8BAA8B,EAAE,6BAA6B,EAAE,2BAA2B,EAAE,iCAAiC,EAAE,MAAM,yBAAyB,CAAC;AAGxK,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAe,WAAW,IAAI,eAAe,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAM7F,MAAM,OAAO,0BAA0B;IAC7B,WAAW,CAAc;IACzB,KAAK,CAAsC;IAC3C,QAAQ,GAAY,KAAK,CAAC;IAEjB,WAAW,GAAG,EAAE,CAAC;IACjB,MAAM,GAA8B,EAAE,CAAC;IACvC,gBAAgB,GAAoB,MAAM,CAAC;IAC3C,SAAS,GAAG,KAAK,CAAC;IAClB,aAAa,GAAG,KAAK,CAAC;IACtB,WAAW,GAAG,KAAK,CAAC;IACpB,UAAU,GAAG,KAAK,CAAC;IACnB,WAAW,GAAG,CAAC,CAAC;IAChB,UAAU,GAAG,CAAC,CAAC;IACf,cAAc,GAAkB,IAAI,CAAC;IACrC,UAAU,GAAG,EAAE,CAAC;IAChB,eAAe,GAAG,EAAE,CAAC;IACrB,UAAU,GAAG,KAAK,CAAC;IACnB,UAAU,GAAkB,IAAI,CAAC;IAEjC,QAAQ,GAAG,EAAE,CAAC;IACd,iBAAiB,GAAG,iBAAiB,CAAC;IAC/C,IAAI,GAAG,CAAC,CAAC;IACT,aAAa,GAAG,EAAE,CAAC;IAEnB,SAAS,CAAoB;IACK,YAAY,CAA2C;IACvD,UAAU,CAA2C;IAEvF,qBAAqB,GAAa,EAAE,CAAC;IAE7C,wCAAwC;IAChC,oBAAoB,GAAqC,IAAI,CAAC;IAC9D,gBAAgB,GAAW,EAAE,CAAC;IAC9B,kBAAkB,GAAW,CAAC,CAAC;IAG7B,mBAAmB,CAAC,KAAY;QACxC,MAAM,MAAM,GAAG,KAAK,CAAC,MAA4B,CAAC;QAElD,IAAI,MAAM,EAAE,OAAO,CAAC,sCAAsC,CAAC,EAAE,CAAC;YAC5D,OAAO;QACT,CAAC;QAED,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACzB,CAAC;IAED,iBAAiB;QACf,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;IAGS,iBAAiB,CAAC,QAA6C;QACvE,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAEO,kBAAkB,CAAC,KAA0C;QACnE,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YAC1C,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YAC1B,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAC5C,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAChC,CAAC;IAEO,gBAAgB,CAAC,KAAyC;QAChE,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC;gBACH,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAA8B,CAAC;gBACpE,OAAO,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;YACxC,CAAC;YAAC,OAAO,KAAc,EAAE,CAAC;gBACxB,OAAO,CAAC,IAAI,CAAC,oDAAoD,EAAE,KAAK,CAAC,CAAC;gBAC1E,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAEO,WAAW,CAAC,MAAiC;QACnD,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAClC,GAAG,KAAK;YACR,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,KAAK;SACtC,CAAC,CAAC,CAAC;IACN,CAAC;IAEO,SAAS,CAAC,IAA+B,EAAE,UAAU,GAAG,IAAI;QAClE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAEO,aAAa,CAAC,KAA8B;QAClD,OAAO,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACrD,CAAC;IAEO,mBAAmB;QACzB,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;IACxE,CAAC;IAEO,kBAAkB,CAAC,OAAkC,EAAE,KAAc;QAC3E,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5E,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;QAE9F,MAAM,iBAAiB,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC9C,GAAG,KAAK;YACR,UAAU,EAAE,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,UAAU,IAAI,KAAK;SACpE,CAAC,CAAC,CAAC;QAEJ,IAAI,KAAK,EAAE,CAAC;YACV,OAAO,CAAC,GAAG,YAAY,EAAE,GAAG,iBAAiB,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;QAC/E,MAAM,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAC;QACjD,cAAc,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YACtC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,CAAC,GAAG,cAAc,CAAC,CAAC;QACvC,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YAChC,MAAM,aAAa,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACnD,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;gBAChC,UAAU,CAAC,aAAa,CAAC,GAAG,KAAK,CAAC;YACpC,CAAC;iBAAM,CAAC;gBACN,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;gBAChD,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,YAAY,EAAE,GAAG,UAAU,CAAC,CAAC;IAC1C,CAAC;IAED;;;OAGG;IACK,YAAY;QAClB,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAErD,6BAA6B;QAC7B,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC;QAEhC,qCAAqC;QACrC,IAAI,IAAI,CAAC,oBAAoB,IAAI,MAAM,KAAK,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACpH,OAAO,IAAI,CAAC,oBAAoB,CAAC;QACnC,CAAC;QAED,+BAA+B;QAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QAExF,eAAe;QACf,IAAI,CAAC,oBAAoB,GAAG,QAAQ,CAAC;QACrC,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC;QAC/B,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;QAE7C,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,aAAa,CAAC,IAAY;QAChC,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,YAAY,IAAI,CAAC,IAAI,YAAY,KAAK,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1D,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;QACvC,CAAC;QAED,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC;YACjC,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;SACpC,CAAC;IACJ,CAAC;IAEO,eAAe;QACrB,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,cAAc,CAAC,CAAC;IACrE,CAAC;IAEO,eAAe,CAAC,KAA8B,EAAE,KAAa;QACnE,KAAK,EAAE,cAAc,EAAE,CAAC;QACxB,KAAK,EAAE,eAAe,EAAE,CAAC;QAEzB,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3D,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,EAAE,CAAC;QAC/B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;IACnC,CAAC;IAEO,gBAAgB,CAAC,KAAK,GAAG,KAAK;QACpC,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,OAAO;QACT,CAAC;QAED,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC;IAC5B,CAAC;IAEO,UAAU,CAAC,OAAe,EAAE,KAAY;QAC9C,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;QAExB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;IACjE,CAAC;IAEO,SAAS;QACf,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;IACzB,CAAC;IAEO,gBAAgB,CAAC,KAA8B,EAAE,KAAY;QACnE,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;QAExB,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;IAEO,kBAAkB,CAAC,KAA8B,EAAE,KAAY;QACrE,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,KAAK,CAAC,eAAe,EAAE,CAAC;QAExB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,qBAAqB,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACxC,IAAI,CAAC,SAAS,EAAE,CAAC;QAEjB,MAAM,CAAC,GAAG,cAAc,EAAE,CAAC;QAE3B,UAAU,CAAC;YACT,IAAI,EAAE,IAAI;YACV,IAAI,qCAAqB;YACzB,KAAK,EAAE,CAAC,CAAC,wCAAwC,CAAC;YAClD,UAAU,EAAE,CAAC,CAAC,SAAS,CAAC;YACxB,gBAAgB,EAAE,CAAC,CAAC,QAAQ,CAAC;YAC7B,cAAc,EAAE,GAAG,EAAE;gBACnB,KAAK,IAAI,CAAC,2BAA2B,EAAE,CAAC;YAC1C,CAAC;YACD,aAAa,EAAE,GAAG,EAAE;gBAClB,IAAI,CAAC,qBAAqB,GAAG,EAAE,CAAC;YAClC,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAEO,iBAAiB,CAAC,KAAY;QACpC,MAAM,KAAK,GAAI,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC;QAEvD,IAAI,IAAI,CAAC,eAAe,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YAC7F,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;YAC/D,OAAO;QACT,CAAC;QAED,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAAC,KAAY;QAC3C,KAAK,CAAC,cAAc,EAAE,CAAC;QAEvB,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAEtC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QAE3C,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,WAAW,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;QAE9F,IAAI,QAAQ,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC;YAC7B,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAC5B,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC,SAAS,CACZ,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CACtB,KAAK,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE;gBACpB,CAAC,CAAC;oBACA,GAAG,KAAK;oBACR,IAAI,EAAE,QAAQ;iBACf;gBACD,CAAC,CAAC,KAAK,CACV,CACF,CAAC;YAEF,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAC5B,OAAO;QACT,CAAC;QAED,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QAEvB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,iCAAiC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;YAC3F,IAAI,CAAC,SAAS,CACZ,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CACtB,KAAK,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE;gBACpB,CAAC,CAAC;oBACA,GAAG,KAAK;oBACR,IAAI,EAAE,OAAO,CAAC,IAAI;oBAClB,eAAe,EAAE,OAAO,CAAC,eAAe;oBACxC,eAAe,EAAE,OAAO,CAAC,eAAe;iBACzC;gBACD,CAAC,CAAC,KAAK,CACV,CACF,CAAC;YACF,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,eAAe,CAAC,KAAK,EAAE,8CAA8C,CAAC,CAAC;QACzE,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QAC1B,CAAC;IACH,CAAC;IAEO,oBAAoB,CAAC,EAAU;QACrC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACpH,CAAC;IAEO,qBAAqB;QAC3B,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC7F,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,CAAC;IACvF,CAAC;IAEO,kBAAkB;QACxB,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC;IAC1B,CAAC;IAEO,oBAAoB,CAAC,KAAY;QACvC,MAAM,KAAK,GAAG,KAAK,CAAC,MAA0B,CAAC;QAC/C,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAErD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACtC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC;QAEjB,KAAK,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IAEO,KAAK,CAAC,qBAAqB,CAAC,KAAa;QAC/C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAExB,IAAI,CAAC;YACH,MAAM,OAAO,GAAqC,EAAE,CAAC;YAErD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC;oBACjC,IAAI;oBACJ,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC;oBACxC,MAAM,EAAE,oCAAoC;iBAC7C,CAAC,CAAC;gBAEH,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,SAAS;gBACX,CAAC;gBAED,OAAO,CAAC,IAAI,CAAC;oBACX,SAAS,EAAE,OAAO;oBAClB,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,GAAG,EAAE,SAAS;oBACd,IAAI,EAAE,IAAI,CAAC,IAAI;iBAChB,CAAC,CAAC;YACL,CAAC;YAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,MAAM,8BAA8B,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;gBACzD,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,eAAe,CAAC,KAAK,EAAE,8CAA8C,CAAC,CAAC;QACzE,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QAC3B,CAAC;IACH,CAAC;IAEO,cAAc,CAAC,IAAY,EAAE,SAAiB,EAAE,CAA2D;QACjH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;QACvC,OAAO,GAAG,MAAM,SAAS,CAAC,CAAC,0BAA0B,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC;IAC/H,CAAC;IAEO,gBAAgB;QACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC/D,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9B,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;IACvB,CAAC;IAEO,2BAA2B;QACjC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAEzF,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO;QACT,CAAC;QAED,IAAI,CAAC,qBAAqB,GAAG,WAAW,CAAC;QAEzC,MAAM,CAAC,GAAG,cAAc,EAAE,CAAC;QAE3B,UAAU,CAAC;YACT,IAAI,EAAE,IAAI;YACV,IAAI,qCAAqB;YACzB,KAAK,EAAE,CAAC,CAAC,kDAAkD,CAAC;YAC5D,UAAU,EAAE,CAAC,CAAC,SAAS,CAAC;YACxB,gBAAgB,EAAE,CAAC,CAAC,QAAQ,CAAC;YAC7B,cAAc,EAAE,GAAG,EAAE;gBACnB,KAAK,IAAI,CAAC,2BAA2B,EAAE,CAAC;YAC1C,CAAC;YACD,aAAa,EAAE,GAAG,EAAE;gBAClB,IAAI,CAAC,qBAAqB,GAAG,EAAE,CAAC;YAClC,CAAC;SACF,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,2BAA2B;QACvC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,OAAO;QACT,CAAC;QAED,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACnD,IAAI,CAAC,qBAAqB,GAAG,EAAE,CAAC;QAEhC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO;QACT,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;QACvC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAE7H,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QAEvB,IAAI,CAAC;YACH,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,MAAM,6BAA6B,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;YAC1D,CAAC;YAED,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;YACzE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAE1B,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;gBACpE,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAC1C,CAAC;QACH,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,eAAe,CAAC,KAAK,EAAE,+CAA+C,CAAC,CAAC;QAC1E,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QAC1B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,KAAK,GAAG,IAAI,KAA2C,EAAE;QAC3F,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QACjD,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAEzC,IAAI,CAAC,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC;YAC3B,OAAO;QACT,CAAC;QAED,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YAChD,OAAO;QACT,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC;QACnG,MAAM,aAAa,GAAG,YAAY,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACjD,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;QAE3C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,IAAI,CAAC,WAAW,GAAG,YAAY,IAAI,EAAE,CAAC;QACxC,CAAC;QAED,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,2BAA2B,CAAC;gBACjD,QAAQ,EAAE,OAAO;gBACjB,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS;gBACjD,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,IAAI,CAAC,QAAQ;aACrB,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YACvD,MAAM,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAEvD,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC;YACzD,MAAM,kBAAkB,GAAG,QAAQ,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACxG,IAAI,CAAC,UAAU,GAAG,kBAAkB,CAAC;YACrC,IAAI,CAAC,WAAW,GAAG,OAAO,QAAQ,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;YACxF,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;YAEnC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACzB,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO,CAAC,KAAK,CAAC,8CAA8C,EAAE,KAAK,CAAC,CAAC;QACvE,CAAC;gBAAS,CAAC;YACT,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACzB,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;YAC7B,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,cAAc;QAC1B,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACzC,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAC1D,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,WAAW,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAC/C,IAAI,WAAW,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;gBACpC,OAAO;YACT,CAAC;QACH,CAAC;QAED,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3C,CAAC;IAEO,YAAY,CAAC,KAAY;QAC/B,MAAM,MAAM,GAAG,KAAK,CAAC,MAA4B,CAAC;QAClD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC;QAC/E,IAAI,SAAS,GAAG,GAAG,EAAE,CAAC;YACpB,KAAK,IAAI,CAAC,cAAc,EAAE,CAAC;QAC7B,CAAC;IACH,CAAC;IAEO,iBAAiB,CAAC,KAAY;QACpC,MAAM,KAAK,GAAI,KAAK,CAAC,MAA2B,CAAC,KAAK,CAAC;QACvD,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QAEzB,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YAClF,KAAK,IAAI,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAAC,KAAa;QAC5C,KAAK,EAAE,cAAc,EAAE,CAAC;QACxB,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACpE,CAAC;IAEO,WAAW;QACjB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,KAAK,IAAI,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAEO,iBAAiB,CAAC,KAAa,EAAE,MAA8G;QACrJ,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAEtC,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,MAAM,EAAE,CAAC;YACpC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,WAAW,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;QAC9F,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,KAAK,MAAM,CAAC,IAAI,CAAC;QAC/F,MAAM,OAAO,GAAG,8BAA8B,MAAM,CAAC,EAAE,EAAE,CAAC;QAE1D,OAAO,CACL,WAAK,KAAK,EAAC,qCAAqC,EAAC,IAAI,EAAC,QAAQ,gBAAY,MAAM,qBAAiB,kCAAkC,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE;YACxK,WAAK,KAAK,EAAE,kDAAkD,KAAK,eAAe,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,eAAe,EAAE;gBAC3H,WAAK,KAAK,EAAC,oCAAoC;oBAC7C,UAAI,EAAE,EAAC,kCAAkC,EAAC,KAAK,EAAC,yBAAyB,IACtE,MAAM,CAAC,WAAW,CAChB;oBACL,cAAQ,IAAI,EAAC,QAAQ,EAAC,KAAK,EAAC,mCAAmC,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,gBAAc,MAAM,CAAC,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,UAAU;wBAC9J,EAAC,IAAI,IAAC,IAAI,EAAC,GAAG,GAAG,CACV,CACL;gBACN,YAAM,KAAK,EAAC,qBAAqB,EAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;oBACjF,aAAO,KAAK,EAAC,6BAA6B,EAAC,OAAO,EAAE,OAAO;wBACzD,YAAM,KAAK,EAAC,aAAa,IAAE,MAAM,CAAC,SAAS,CAAQ;wBACnD,WAAK,KAAK,EAAE,iEAAiE,KAAK,iBAAiB,KAAK,EAAE;4BACxG,aACE,EAAE,EAAE,OAAO,EACX,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,gDAAgD,EACvD,KAAK,EAAE,IAAI,CAAC,UAAU,EACtB,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,GAC/C;4BACD,IAAI,CAAC,eAAe,IAAI,YAAM,KAAK,EAAC,uCAAuC,IAAE,IAAI,CAAC,eAAe,CAAQ,CACtG,CACA;oBACR,WAAK,KAAK,EAAC,gCAAgC;wBACzC,cAAQ,IAAI,EAAC,QAAQ,EAAC,KAAK,EAAC,oCAAoC,EAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,UAAU,IAC/H,MAAM,CAAC,WAAW,CACZ;wBACT,cAAQ,IAAI,EAAC,QAAQ,EAAC,KAAK,EAAC,kCAAkC,EAAC,QAAQ,EAAE,cAAc,IACpF,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAC,IAAI,IAAC,IAAI,EAAC,SAAS,EAAC,QAAQ,EAAC,qBAAqB,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CACrF,CACL,CACD,CACH,CACF,CACP,CAAC;IACJ,CAAC;IAED,MAAM;QACJ,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACvC,MAAM,CAAC,GAAG,cAAc,EAAE,CAAC;QAC3B,MAAM,cAAc,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAC3C,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACjE,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC;QACpE,MAAM,WAAW,GAAG,CAAC,CAAC,2BAA2B,CAAC,CAAC;QACnD,MAAM,WAAW,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QAChC,MAAM,SAAS,GAAG,CAAC,CAAC,oBAAoB,CAAC,CAAC;QAC1C,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;QAC5B,MAAM,WAAW,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;QAChC,MAAM,UAAU,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC;QAE9B,OAAO,CACL,EAAC,IAAI,qDAAC,KAAK,EAAC,oCAAoC,gBAAa,KAAK;YAChE,6DAAM,KAAK,EAAC,QAAQ,EAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;gBACpE,4DAAK,KAAK,EAAC,UAAU;oBACnB,8DACE,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,kCAAkC,KAAK,wGAAwG,KAAK,eAAe,EAC1K,WAAW,EAAE,CAAC,CAAC,4BAA4B,CAAC,EAC5C,KAAK,EAAE,IAAI,CAAC,WAAW,EACvB,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,GAC/C;oBACD,IAAI,CAAC,WAAW,IAAI,CACnB,+DACE,IAAI,EAAC,QAAQ,EACb,KAAK,EAAC,qFAAqF,EAC3F,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,gBACrB,CAAC,CAAC,OAAO,CAAC,IAAI,OAAO;wBAEjC,EAAC,IAAI,qDAAC,IAAI,EAAC,GAAG,GAAG,CACV,CACV,CACG,CACD;YAEP,4DAAK,KAAK,EAAC,mCAAmC;gBAC3C,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CACxB,aAAO,KAAK,EAAC,wCAAwC;oBACnD,aAAO,IAAI,EAAC,UAAU,EAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,qBAAqB,EAAE,GAAI;oBACxJ,gBAAO,CAAC,CAAC,YAAY,CAAC,CAAQ,CACxB,CACT,CAAC,CAAC,CAAC,CACF,eAAQ,CACT;gBACD,4DAAK,KAAK,EAAC,yBAAyB;oBAClC,8DACE,KAAK,EAAC,QAAQ,EACd,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,SAAS,EAChB,QAAQ,QACR,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,GAAG,EAAsB,CAAC,EACpD,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,GACnD;oBACF,+DACE,IAAI,EAAC,QAAQ,EACb,KAAK,EAAC,8GAA8G,EACpH,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,kBAAkB,EAAE,gBACjD,CAAC,CAAC,yBAAyB,CAAC,EACxC,QAAQ,EAAE,IAAI,CAAC,WAAW,IAEzB,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAC,IAAI,IAAC,IAAI,EAAC,SAAS,EAAC,QAAQ,EAAC,qBAAqB,GAAG,CAAC,CAAC,CAAC,EAAC,IAAI,IAAC,IAAI,EAAC,MAAM,GAAG,CAC1F;oBACR,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CACzB,+DACE,KAAK,EAAC,kJAAkJ,EACxJ,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,gBAC/E,IAAI,CAAC,gBAAgB,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,4BAA4B,CAAC;wBAEhH,EAAC,IAAI,qDAAC,IAAI,EAAE,IAAI,CAAC,gBAAgB,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,GAAI,CAC3D,CACV,CACG,CACF;YAEL,IAAI,CAAC,WAAW,IAAI,CACnB,4DAAK,KAAK,EAAE,6CAA6C;gBACvD,EAAC,IAAI,qDAAC,IAAI,EAAC,SAAS,EAAC,QAAQ,EAAC,qBAAqB,GAAG;gBACtD,+DAAO,CAAC,CAAC,yBAAyB,CAAC,IAAI,cAAc,CAAQ,CACzD,CACP;YAEA,gBAAgB,CAAC,CAAC,CAAC,CAClB,WAAK,KAAK,EAAE,2DAA2D,iBAAkB,CAC1F,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAChC,WAAK,KAAK,EAAE,2DAA2D,IAAG,CAAC,CAAC,2BAA2B,CAAC,CAAO,CAChH,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,KAAK,MAAM,CAAC,CAAC,CAAC,CACrC,WACE,KAAK,EAAC,qIAAqI,EAC3I,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;gBAE1C,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAC3B,WAAK,KAAK,EAAC,gCAAgC,EAAC,GAAG,EAAE,KAAK,CAAC,EAAE;oBACvD,cACE,IAAI,EAAC,QAAQ,EACb,KAAK,EAAE,6FAA6F,KAAK,yBAAyB,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,oBAAoB,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EACvL,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC;wBAElD,WAAK,KAAK,EAAC,gCAAgC;4BACxC,KAAK,CAAC,UAAU,IAAI,CACnB,YAAM,KAAK,EAAE,iEAAiE,KAAK,EAAE,iBAAc,MAAM;gCACvG,EAAC,IAAI,IAAC,IAAI,EAAC,OAAO,EAAC,QAAQ,EAAC,mBAAmB,GAAG,CAC7C,CACR;4BACD,WAAK,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAC,sCAAsC,EAAC,OAAO,EAAC,MAAM,GAAG,CAChG;wBACN,WAAK,KAAK,EAAE,4CAA4C,IAAG,KAAK,CAAC,IAAI,CAAO,CACrE;oBACT,WAAK,KAAK,EAAC,2EAA2E,wCAAoC,EAAE;wBAC1H,cACE,IAAI,EAAC,QAAQ,EACb,KAAK,EAAC,kCAAkC,EACxC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,mBACpC,MAAM,mBACL,IAAI,CAAC,UAAU,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,gBAClD,WAAW,wCACY,EAAE;4BAErC,EAAC,IAAI,IAAC,IAAI,EAAC,cAAc,EAAC,QAAQ,EAAC,QAAQ,GAAG,CACvC;wBACR,IAAI,CAAC,UAAU,KAAK,KAAK,CAAC,EAAE,IAAI,CAC/B,WAAK,KAAK,EAAE,0CAA0C,KAAK,eAAe,EAAE,IAAI,EAAC,MAAM,wCAAoC,EAAE;4BAC3H,cAAQ,IAAI,EAAC,QAAQ,EAAC,KAAK,EAAC,gCAAgC,EAAC,IAAI,EAAC,UAAU,EAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,IAC/H,WAAW,CACL;4BACT,cACE,IAAI,EAAC,QAAQ,EACb,KAAK,EAAC,uEAAuE,EAC7E,IAAI,EAAC,UAAU,EACf,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,IAEtD,WAAW,CACL,CACL,CACP,CACG,CACF,CACP,CAAC;gBACD,IAAI,CAAC,aAAa,IAAI,WAAK,KAAK,EAAE,kDAAkD,iBAAkB,CACnG,CACP,CAAC,CAAC,CAAC,CACF,WAAK,KAAK,EAAC,8CAA8C,EAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC;gBAClG,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAC3B,aAAO,KAAK,EAAE,mDAAmD,KAAK,cAAc,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE;oBACjG,aAAO,IAAI,EAAC,UAAU,EAAC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC,GAAI;oBAC3G,WAAK,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAC,mCAAmC,EAAC,OAAO,EAAC,MAAM,GAAG;oBACjG,WAAK,KAAK,EAAC,wCAAwC;wBACjD,WAAK,KAAK,EAAE,uCAAuC;4BACjD,WAAK,KAAK,EAAC,8CAA8C,IAAE,KAAK,CAAC,IAAI,CAAO;4BAC5E,WAAK,KAAK,EAAE,mBAAmB,IAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAO,CACzF;wBACN,WAAK,KAAK,EAAC,mCAAmC,wCAAoC,EAAE;4BAClF,cACE,IAAI,EAAC,QAAQ,EACb,KAAK,EAAC,uCAAuC,EAC7C,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,mBACpC,MAAM,mBACL,IAAI,CAAC,UAAU,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,gBAClD,WAAW,wCACY,EAAE;gCAErC,EAAC,IAAI,IAAC,IAAI,EAAC,cAAc,EAAC,QAAQ,EAAC,QAAQ,GAAG,CACvC;4BACR,IAAI,CAAC,UAAU,KAAK,KAAK,CAAC,EAAE,IAAI,CAC/B,WACE,KAAK,EAAE,0EAA0E,KAAK,eAAe,EACrG,IAAI,EAAC,MAAM,wCACwB,EAAE;gCAErC,cAAQ,IAAI,EAAC,QAAQ,EAAC,KAAK,EAAC,gCAAgC,EAAC,IAAI,EAAC,UAAU,EAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,KAAK,CAAC,IAC/H,WAAW,CACL;gCACT,cACE,IAAI,EAAC,QAAQ,EACb,KAAK,EAAC,uEAAuE,EAC7E,IAAI,EAAC,UAAU,EACf,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,IAEtD,WAAW,CACL,CACL,CACP,CACG,CACF,CACA,CACT,CAAC;gBACD,IAAI,CAAC,aAAa,IAAI,WAAK,KAAK,EAAE,oCAAoC,iBAAkB,CACrF,CACP;YAED,4DAAK,KAAK,EAAE,gDAAgD;gBACzD,YAAY,IAAI,CACf,+DACE,IAAI,EAAC,QAAQ,EACb,KAAK,EAAE,8JAA8J,EACrK,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,2BAA2B,EAAE,gBACrC,CAAC,CAAC,QAAQ,CAAC,EACvB,QAAQ,EAAE,IAAI,CAAC,UAAU,IAExB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAC,IAAI,IAAC,IAAI,EAAC,SAAS,EAAC,QAAQ,EAAC,qBAAqB,GAAG,CAAC,CAAC,CAAC,EAAC,IAAI,IAAC,IAAI,EAAC,QAAQ,GAAG,CAC3F,CACV;gBACA,CAAC,IAAI,CAAC,QAAQ,IAAI,CACjB,+DACE,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,CAAC,YAAY,EACvB,KAAK,EAAE,+IAA+I,KAAK,4EAA4E,EACvO,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAErC,CAAC,CAAC,2BAA2B,CAAC,CACxB,CACV,CACG;YACL,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC,CACzF,CACR,CAAC;IACJ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CACF","sourcesContent":["import { Component, Event, EventEmitter, Host, Listen, Prop, State, Watch, h } from '@stencil/core';\nimport dayjs from 'dayjs';\nimport { createQuickMessageLibraryFiles, deleteQuickMessageLibraryFile, getQuickMessageLibraryFiles, updateQuickMessageLibraryFileName } from '../../api/quick-message';\nimport type { QuickMessageLibraryFilePayload } from '../../api/type';\nimport { QuickMessageLibraryFile } from '../../store/type';\nimport { configStore } from '../../store/store';\nimport { useTranslation } from '../../utils/utils';\nimport { Icon } from '../internal-component/icon';\nimport { uploadFile } from '../../utils/upload';\nimport { DIALOG_TYPE, handleError as showErrorDialog, openDialog } from '../../store/dialog';\n\n@Component({\n tag: 'quick-message-image',\n styleUrl: 'quick-message-image.css',\n})\nexport class QuickMessageImageComponent {\n @Prop() handleClose?: () => void;\n @Prop() value?: string | QuickMessageLibraryFile[];\n @Prop() isMaster: boolean = false;\n\n @State() private searchImage = '';\n @State() private images: QuickMessageLibraryFile[] = [];\n @State() private imageDisplayMode: 'grid' | 'list' = 'grid';\n @State() private isLoading = false;\n @State() private isLoadingMore = false;\n @State() private isUploading = false;\n @State() private isDeleting = false;\n @State() private totalImages = 0;\n @State() private totalPages = 0;\n @State() private renameTargetId: string | null = null;\n @State() private renameName = '';\n @State() private renameExtension = '';\n @State() private isRenaming = false;\n @State() private openMenuId: string | null = null;\n\n private readonly pageSize = 15;\n private readonly localUploadPrefix = 'uploaded-image-';\n private page = 1;\n private currentSearch = '';\n\n private fileInput?: HTMLInputElement;\n @Event({ bubbles: true, composed: true }) imagesChange!: EventEmitter<QuickMessageLibraryFile[]>;\n @Event({ bubbles: true, composed: true }) sendImages!: EventEmitter<QuickMessageLibraryFile[]>;\n\n private pendingDeleteImageIds: string[] = [];\n\n // Memoization cache for filtered images\n private cachedFilteredImages: QuickMessageLibraryFile[] | null = null;\n private cachedSearchTerm: string = '';\n private cachedImagesLength: number = 0;\n\n @Listen('click', { target: 'document' })\n protected handleDocumentClick(event: Event) {\n const target = event.target as HTMLElement | null;\n\n if (target?.closest('[data-quick-message-image-menu-root]')) {\n return;\n }\n\n this.openMenuId = null;\n }\n\n componentWillLoad() {\n this.syncImagesFromProp(this.value);\n }\n\n async componentDidLoad() {\n await this.fetchImages({ reset: true });\n }\n\n @Watch('value')\n protected handleValueChange(newValue?: string | QuickMessageLibraryFile[]) {\n this.syncImagesFromProp(newValue);\n }\n\n private syncImagesFromProp(value?: string | QuickMessageLibraryFile[]) {\n if (value === undefined || value === null) {\n this.setImages([], false);\n return;\n }\n\n const parsed = this.parseImagesValue(value);\n this.setImages(parsed, false);\n }\n\n private parseImagesValue(value: string | QuickMessageLibraryFile[]): QuickMessageLibraryFile[] {\n if (typeof value === 'string') {\n try {\n const deserialized = JSON.parse(value) as QuickMessageLibraryFile[];\n return this.cloneImages(deserialized);\n } catch (error: unknown) {\n console.warn('[quick-message-image] Failed to parse images value', error);\n return [];\n }\n }\n\n return this.cloneImages(value);\n }\n\n private cloneImages(images: QuickMessageLibraryFile[]): QuickMessageLibraryFile[] {\n return (images || []).map(image => ({\n ...image,\n isSelected: image.isSelected ?? false,\n }));\n }\n\n private setImages(next: QuickMessageLibraryFile[], shouldEmit = true) {\n this.images = next;\n if (shouldEmit) {\n const payload = this.cloneImages(next);\n this.imagesChange.emit(payload);\n }\n }\n\n private isLocalUpload(image: QuickMessageLibraryFile): boolean {\n return image.id.startsWith(this.localUploadPrefix);\n }\n\n private getRemoteImageCount(): number {\n return this.images.filter(image => !this.isLocalUpload(image)).length;\n }\n\n private mergeFetchedImages(fetched: QuickMessageLibraryFile[], reset: boolean): QuickMessageLibraryFile[] {\n const localUploads = this.images.filter(image => this.isLocalUpload(image));\n const selectionMap = new Map(this.images.map(image => [image.id, image.isSelected ?? false]));\n\n const normalizedFetched = fetched.map(image => ({\n ...image,\n isSelected: selectionMap.get(image.id) ?? image.isSelected ?? false,\n }));\n\n if (reset) {\n return [...localUploads, ...normalizedFetched];\n }\n\n const existingRemote = this.images.filter(image => !this.isLocalUpload(image));\n const remoteIndexMap = new Map<string, number>();\n existingRemote.forEach((image, index) => {\n remoteIndexMap.set(image.id, index);\n });\n\n const nextRemote = [...existingRemote];\n normalizedFetched.forEach(image => {\n const existingIndex = remoteIndexMap.get(image.id);\n if (existingIndex !== undefined) {\n nextRemote[existingIndex] = image;\n } else {\n remoteIndexMap.set(image.id, nextRemote.length);\n nextRemote.push(image);\n }\n });\n\n return [...localUploads, ...nextRemote];\n }\n\n /**\n * Memoized image filtering - only recalculates when search term or images change\n * Performance: Reduces operations from 60fps to only when user types\n */\n private filterImages(): QuickMessageLibraryFile[] {\n const search = this.searchImage.trim().toLowerCase();\n\n // Quick return for no search\n if (!search) return this.images;\n\n // Check if we can use cached results\n if (this.cachedFilteredImages && search === this.cachedSearchTerm && this.images.length === this.cachedImagesLength) {\n return this.cachedFilteredImages;\n }\n\n // Recalculate filtered results\n const filtered = this.images.filter(image => image.name.toLowerCase().includes(search));\n\n // Update cache\n this.cachedFilteredImages = filtered;\n this.cachedSearchTerm = search;\n this.cachedImagesLength = this.images.length;\n\n return filtered;\n }\n\n private splitFileName(name: string): { base: string; extension: string } {\n const lastDotIndex = name.lastIndexOf('.');\n if (lastDotIndex <= 0 || lastDotIndex === name.length - 1) {\n return { base: name, extension: '' };\n }\n\n return {\n base: name.slice(0, lastDotIndex),\n extension: name.slice(lastDotIndex),\n };\n }\n\n private getRenameTarget(): QuickMessageLibraryFile | undefined {\n if (!this.renameTargetId) {\n return undefined;\n }\n\n return this.images.find(image => image.id === this.renameTargetId);\n }\n\n private openRenameModal(image: QuickMessageLibraryFile, event?: Event) {\n event?.preventDefault();\n event?.stopPropagation();\n\n const { base, extension } = this.splitFileName(image.name);\n this.renameTargetId = image.id;\n this.renameName = base;\n this.renameExtension = extension;\n }\n\n private closeRenameModal(force = false) {\n if (this.isRenaming && !force) {\n return;\n }\n\n this.renameTargetId = null;\n this.renameName = '';\n this.renameExtension = '';\n }\n\n private toggleMenu(imageId: string, event: Event) {\n event.preventDefault();\n event.stopPropagation();\n\n this.openMenuId = this.openMenuId === imageId ? null : imageId;\n }\n\n private closeMenu() {\n this.openMenuId = null;\n }\n\n private handleMenuRename(image: QuickMessageLibraryFile, event: Event) {\n event.preventDefault();\n event.stopPropagation();\n\n this.closeMenu();\n this.openRenameModal(image, event);\n }\n\n private requestDeleteImage(image: QuickMessageLibraryFile, event: Event) {\n event.preventDefault();\n event.stopPropagation();\n\n if (this.isDeleting) {\n return;\n }\n\n this.pendingDeleteImageIds = [image.id];\n this.closeMenu();\n\n const t = useTranslation();\n\n openDialog({\n open: true,\n type: DIALOG_TYPE.WARNING,\n title: t('quick_message.delete_item_confirmation'),\n buttonName: t('confirm'),\n cancelButtonName: t('cancel'),\n onSubmitDialog: () => {\n void this.confirmDeleteSelectedImages();\n },\n onCloseDialog: () => {\n this.pendingDeleteImageIds = [];\n },\n });\n }\n\n private handleRenameInput(event: Event) {\n const value = (event.target as HTMLInputElement).value;\n\n if (this.renameExtension && value.toLowerCase().endsWith(this.renameExtension.toLowerCase())) {\n this.renameName = value.slice(0, -this.renameExtension.length);\n return;\n }\n\n this.renameName = value;\n }\n\n private async handleRenameSubmit(event: Event) {\n event.preventDefault();\n\n const target = this.getRenameTarget();\n\n if (!target) {\n return;\n }\n\n const trimmedBase = this.renameName.trim();\n\n if (!trimmedBase) {\n return;\n }\n\n const nextName = this.renameExtension ? `${trimmedBase}${this.renameExtension}` : trimmedBase;\n\n if (nextName === target.name) {\n this.closeRenameModal(true);\n return;\n }\n\n if (this.isLocalUpload(target)) {\n this.setImages(\n this.images.map(image =>\n image.id === target.id\n ? {\n ...image,\n name: nextName,\n }\n : image,\n ),\n );\n\n this.closeRenameModal(true);\n return;\n }\n\n this.isRenaming = true;\n\n try {\n const updated = await updateQuickMessageLibraryFileName({ id: target.id, name: nextName });\n this.setImages(\n this.images.map(image =>\n image.id === target.id\n ? {\n ...image,\n name: updated.name,\n last_updated_at: updated.last_updated_at,\n last_updated_by: updated.last_updated_by,\n }\n : image,\n ),\n );\n this.closeRenameModal(true);\n } catch (error: unknown) {\n showErrorDialog(error, '[quick-message-image] Failed to rename image');\n } finally {\n this.isRenaming = false;\n }\n }\n\n private toggleImageSelection(id: string) {\n this.setImages(this.images.map(image => (image.id === id ? { ...image, isSelected: !image.isSelected } : image)));\n }\n\n private toggleSelectAllImages() {\n const isAllSelected = this.images.length > 0 && this.images.every(image => image.isSelected);\n this.setImages(this.images.map(image => ({ ...image, isSelected: !isAllSelected })));\n }\n\n private triggerImageUpload() {\n this.fileInput?.click();\n }\n\n private handleImageSelection(event: Event) {\n const input = event.target as HTMLInputElement;\n if (!input.files || input.files.length === 0) return;\n\n const files = Array.from(input.files);\n input.value = '';\n\n void this.uploadAndCreateImages(files);\n }\n\n private async uploadAndCreateImages(files: File[]) {\n if (files.length === 0) {\n return;\n }\n\n this.isUploading = true;\n\n try {\n const payload: QuickMessageLibraryFilePayload[] = [];\n\n for (const file of files) {\n const uploadUrl = await uploadFile({\n file,\n filename: file.name.replaceAll(' ', '-'),\n folder: 'zignal/quick-message-library/image',\n });\n\n if (!uploadUrl) {\n continue;\n }\n\n payload.push({\n file_type: 'image',\n name: file.name,\n url: uploadUrl,\n size: file.size,\n });\n }\n\n if (payload.length > 0) {\n await createQuickMessageLibraryFiles({ files: payload });\n await this.fetchImages({ reset: true });\n }\n } catch (error: unknown) {\n showErrorDialog(error, '[quick-message-image] Failed to upload image');\n } finally {\n this.isUploading = false;\n }\n }\n\n private renderFileMeta(size: number, createdAt: string, t: (key: string, values?: Record<string, string>) => string) {\n const sizeKb = Math.round(size / 1024);\n return `${sizeKb} KB · ${t('quick_message.created_at').replace('{date}', dayjs(createdAt).tz().format('DD/MM/YYYY HH:mm'))}`;\n }\n\n private handleSendImages() {\n const selected = this.images.filter(image => image.isSelected);\n if (selected.length === 0) return;\n const payload = this.cloneImages(selected);\n this.sendImages.emit(payload);\n this.handleClose?.();\n }\n\n private requestDeleteSelectedImages() {\n if (this.isDeleting) {\n return;\n }\n\n const selectedIds = this.images.filter(image => image.isSelected).map(image => image.id);\n\n if (selectedIds.length === 0) {\n return;\n }\n\n this.pendingDeleteImageIds = selectedIds;\n\n const t = useTranslation();\n\n openDialog({\n open: true,\n type: DIALOG_TYPE.WARNING,\n title: t('quick_message.delete_selected_items_confirmation'),\n buttonName: t('confirm'),\n cancelButtonName: t('cancel'),\n onSubmitDialog: () => {\n void this.confirmDeleteSelectedImages();\n },\n onCloseDialog: () => {\n this.pendingDeleteImageIds = [];\n },\n });\n }\n\n private async confirmDeleteSelectedImages() {\n if (this.isDeleting) {\n return;\n }\n\n const pendingIds = [...this.pendingDeleteImageIds];\n this.pendingDeleteImageIds = [];\n\n if (pendingIds.length === 0) {\n return;\n }\n\n const pendingSet = new Set(pendingIds);\n const remoteIds = this.images.filter(image => pendingSet.has(image.id) && !this.isLocalUpload(image)).map(image => image.id);\n\n this.isDeleting = true;\n\n try {\n if (remoteIds.length > 0) {\n await deleteQuickMessageLibraryFile({ ids: remoteIds });\n }\n\n const remaining = this.images.filter(image => !pendingSet.has(image.id));\n this.setImages(remaining);\n\n if (remoteIds.length > 0) {\n this.totalImages = Math.max(0, this.totalImages - remoteIds.length);\n await this.fetchImages({ reset: true });\n }\n } catch (error: unknown) {\n showErrorDialog(error, '[quick-message-image] Failed to delete images');\n } finally {\n this.isDeleting = false;\n }\n }\n\n private async fetchImages({ search, reset = true }: { search?: string; reset?: boolean } = {}) {\n const businessId = configStore.get('businessId');\n const shopId = configStore.get('shopId');\n\n if (!businessId || !shopId) {\n return;\n }\n\n if (reset ? this.isLoading : this.isLoadingMore) {\n return;\n }\n\n const searchSource = search !== undefined ? search : reset ? this.searchImage : this.currentSearch;\n const trimmedSearch = searchSource?.trim() ?? '';\n const nextPage = reset ? 1 : this.page + 1;\n\n if (search !== undefined) {\n this.searchImage = searchSource ?? '';\n }\n\n if (reset) {\n this.isLoading = true;\n } else {\n this.isLoadingMore = true;\n }\n\n try {\n const response = await getQuickMessageLibraryFiles({\n fileType: 'image',\n search: trimmedSearch ? trimmedSearch : undefined,\n page: nextPage,\n limit: this.pageSize,\n });\n\n const fetched = this.cloneImages(response.files || []);\n const merged = this.mergeFetchedImages(fetched, reset);\n\n this.page = response.page > 0 ? response.page : nextPage;\n const resolvedTotalPages = response.total_pages > 0 ? response.total_pages : fetched.length > 0 ? 1 : 0;\n this.totalPages = resolvedTotalPages;\n this.totalImages = typeof response.total === 'number' ? response.total : fetched.length;\n this.currentSearch = trimmedSearch;\n\n this.setImages(merged);\n } catch (error: unknown) {\n console.error('[quick-message-image] Failed to fetch images', error);\n } finally {\n if (reset) {\n this.isLoading = false;\n } else {\n this.isLoadingMore = false;\n }\n }\n }\n\n private async loadMoreImages() {\n if (this.isLoading || this.isLoadingMore) {\n return;\n }\n\n if (this.totalPages === 0 || this.page >= this.totalPages) {\n return;\n }\n\n if (this.totalImages > 0) {\n const remoteCount = this.getRemoteImageCount();\n if (remoteCount >= this.totalImages) {\n return;\n }\n }\n\n await this.fetchImages({ reset: false });\n }\n\n private handleScroll(event: Event) {\n const target = event.target as HTMLElement | null;\n if (!target) {\n return;\n }\n\n const remaining = target.scrollHeight - target.scrollTop - target.clientHeight;\n if (remaining < 160) {\n void this.loadMoreImages();\n }\n }\n\n private handleSearchInput(event: Event) {\n const value = (event.target as HTMLInputElement).value;\n this.searchImage = value;\n\n if (!value.trim() && this.currentSearch && !this.isLoading && !this.isLoadingMore) {\n void this.fetchImages({ search: '', reset: true });\n }\n }\n\n private async handleSearchSubmit(event?: Event) {\n event?.preventDefault();\n await this.fetchImages({ search: this.searchImage, reset: true });\n }\n\n private clearSearch() {\n if (!this.searchImage) {\n return;\n }\n\n this.searchImage = '';\n if (this.currentSearch) {\n void this.fetchImages({ search: '', reset: true });\n }\n }\n\n private renderRenameModal(theme: string, labels: { renameLabel: string; nameLabel: string; saveLabel: string; cancelLabel: string; closeLabel: string }) {\n const target = this.getRenameTarget();\n\n if (!this.renameTargetId || !target) {\n return null;\n }\n\n const trimmedBase = this.renameName.trim();\n const nextName = this.renameExtension ? `${trimmedBase}${this.renameExtension}` : trimmedBase;\n const isSaveDisabled = this.isRenaming || trimmedBase.length === 0 || nextName === target.name;\n const inputId = `quick-message-image-rename-${target.id}`;\n\n return (\n <div class=\"quick-message-image__rename-overlay\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"quick-message-image-rename-title\" onClick={() => this.closeRenameModal()}>\n <div class={`quick-message-image__rename-modal z-background-${theme} text-primary`} onClick={event => event.stopPropagation()}>\n <div class=\"quick-message-image__rename-header\">\n <h3 id=\"quick-message-image-rename-title\" class=\"text-base font-semibold\">\n {labels.renameLabel}\n </h3>\n <button type=\"button\" class=\"quick-message-image__rename-close\" onClick={() => this.closeRenameModal()} aria-label={labels.closeLabel} disabled={this.isRenaming}>\n <Icon name=\"X\" />\n </button>\n </div>\n <form class=\"flex flex-col gap-4\" onSubmit={event => this.handleRenameSubmit(event)}>\n <label class=\"flex flex-col gap-2 text-sm\" htmlFor={inputId}>\n <span class=\"font-medium\">{labels.nameLabel}</span>\n <div class={`quick-message-image__rename-input-row border z-border-divider-${theme} z-background-${theme}`}>\n <input\n id={inputId}\n type=\"text\"\n class={`quick-message-image__rename-input text-primary`}\n value={this.renameName}\n onInput={event => this.handleRenameInput(event)}\n />\n {this.renameExtension && <span class=\"quick-message-image__rename-extension\">{this.renameExtension}</span>}\n </div>\n </label>\n <div class=\"flex justify-end gap-2 text-sm\">\n <button type=\"button\" class=\"quick-message-image__rename-cancel\" onClick={() => this.closeRenameModal()} disabled={this.isRenaming}>\n {labels.cancelLabel}\n </button>\n <button type=\"submit\" class=\"quick-message-image__rename-save\" disabled={isSaveDisabled}>\n {this.isRenaming ? <Icon name=\"Loader2\" addClass=\"size-4 animate-spin\" /> : labels.saveLabel}\n </button>\n </div>\n </form>\n </div>\n </div>\n );\n }\n\n render() {\n const theme = configStore.get('theme');\n const t = useTranslation();\n const filteredImages = this.filterImages();\n const hasSelection = this.images.some(image => image.isSelected);\n const isInitialLoading = this.isLoading && this.images.length === 0;\n const renameLabel = t('quick_message.rename_item');\n const deleteLabel = t('remove');\n const nameLabel = t('quick_message.name');\n const saveLabel = t('save');\n const cancelLabel = t('cancel');\n const closeLabel = t('close');\n\n return (\n <Host class=\"flex min-h-0 flex-1 flex-col gap-4\" data-theme={theme}>\n <form class=\"w-full\" onSubmit={event => this.handleSearchSubmit(event)}>\n <div class=\"relative\">\n <input\n type=\"text\"\n class={`w-full border z-border-divider-${theme} text-sm px-4 py-2 pr-9 rounded-lg ring-primary focus:outline-none focus:border-primary z-background-${theme} text-primary`}\n placeholder={t('quick_message.search_image')}\n value={this.searchImage}\n onInput={event => this.handleSearchInput(event)}\n />\n {this.searchImage && (\n <button\n type=\"button\"\n class=\"absolute right-2 top-1/2 -translate-y-1/2 text-xs text-gray-400 hover:text-gray-600\"\n onClick={() => this.clearSearch()}\n aria-label={t('clear') || 'Clear'}\n >\n <Icon name=\"X\" />\n </button>\n )}\n </div>\n </form>\n\n <div class=\"flex items-center justify-between\">\n {this.images.length > 0 ? (\n <label class=\"inline-flex items-center gap-2 text-sm\">\n <input type=\"checkbox\" checked={this.images.length > 0 && this.images.every(image => image.isSelected)} onChange={() => this.toggleSelectAllImages()} />\n <span>{t('select_all')}</span>\n </label>\n ) : (\n <span />\n )}\n <div class=\"flex items-center gap-2\">\n <input\n class=\"hidden\"\n type=\"file\"\n accept=\"image/*\"\n multiple\n ref={el => (this.fileInput = el as HTMLInputElement)}\n onChange={event => this.handleImageSelection(event)}\n />\n <button\n type=\"button\"\n class=\"quick-message-image__action-button inline-flex h-9 w-9 items-center justify-center rounded-lg cursor-pointer\"\n onClick={() => !this.isUploading && this.triggerImageUpload()}\n aria-label={t('quick_message.add_image')}\n disabled={this.isUploading}\n >\n {this.isUploading ? <Icon name=\"Loader2\" addClass=\"size-4 animate-spin\" /> : <Icon name=\"Plus\" />}\n </button>\n {this.images.length > 0 && (\n <button\n class=\"quick-message-image__action-button quick-message-image__display-switch inline-flex h-9 w-9 items-center justify-center rounded-lg cursor-pointer\"\n type=\"button\"\n onClick={() => (this.imageDisplayMode = this.imageDisplayMode === 'grid' ? 'list' : 'grid')}\n aria-label={this.imageDisplayMode === 'grid' ? t('quick_message.display_list') : t('quick_message.display_grid')}\n >\n <Icon name={this.imageDisplayMode === 'grid' ? 'List' : 'Grid'} />\n </button>\n )}\n </div>\n </div>\n\n {this.isUploading && (\n <div class={`flex items-center gap-2 text-xs text-accent`}>\n <Icon name=\"Loader2\" addClass=\"size-4 animate-spin\" />\n <span>{t('quick_message.uploading') || 'Uploading...'}</span>\n </div>\n )}\n\n {isInitialLoading ? (\n <div class={`flex flex-1 items-center justify-center text-sm text-gray`}>Loading...</div>\n ) : filteredImages.length === 0 ? (\n <div class={`flex flex-1 items-center justify-center text-sm text-gray`}>{t('quick_message.image_empty')}</div>\n ) : this.imageDisplayMode === 'grid' ? (\n <div\n class=\"grid flex-1 grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 auto-rows-auto items-start content-start gap-3 overflow-y-auto\"\n onScroll={event => this.handleScroll(event)}\n >\n {filteredImages.map(image => (\n <div class=\"quick-message-image__grid-item\" key={image.id}>\n <button\n type=\"button\"\n class={`flex w-full flex-col items-center gap-2 rounded-xl border border-transparent z-background-${theme} p-1.5 cursor-pointer ${image.isSelected ? `z-border-primary-${theme}` : ''}`}\n onClick={() => this.toggleImageSelection(image.id)}\n >\n <div class=\"quick-message-image__thumbnail\">\n {image.isSelected && (\n <span class={`quick-message-image__selection-indicator z-background-primary-${theme}`} aria-hidden=\"true\">\n <Icon name=\"Check\" addClass=\"size-3 text-white\" />\n </span>\n )}\n <img src={image.url} alt={image.name} class=\"quick-message-image__thumbnail-image\" loading=\"lazy\" />\n </div>\n <div class={`text-center text-xs line-clamp-2 text-gray`}>{image.name}</div>\n </button>\n <div class=\"quick-message-image__menu-wrapper quick-message-image__menu-wrapper--grid\" data-quick-message-image-menu-root=\"\">\n <button\n type=\"button\"\n class=\"quick-message-image__more-button\"\n onClick={event => this.toggleMenu(image.id, event)}\n aria-haspopup=\"menu\"\n aria-expanded={this.openMenuId === image.id ? 'true' : 'false'}\n aria-label={renameLabel}\n data-quick-message-image-menu-root=\"\"\n >\n <Icon name=\"MoreVertical\" addClass=\"size-4\" />\n </button>\n {this.openMenuId === image.id && (\n <div class={`quick-message-image__menu z-background-${theme} text-primary`} role=\"menu\" data-quick-message-image-menu-root=\"\">\n <button type=\"button\" class=\"quick-message-image__menu-item\" role=\"menuitem\" onClick={event => this.handleMenuRename(image, event)}>\n {renameLabel}\n </button>\n <button\n type=\"button\"\n class=\"quick-message-image__menu-item quick-message-image__menu-item--danger\"\n role=\"menuitem\"\n onClick={event => this.requestDeleteImage(image, event)}\n >\n {deleteLabel}\n </button>\n </div>\n )}\n </div>\n </div>\n ))}\n {this.isLoadingMore && <div class={`col-span-full py-3 text-center text-xs text-gray`}>Loading...</div>}\n </div>\n ) : (\n <div class=\"flex flex-1 flex-col gap-2.5 overflow-y-auto\" onScroll={event => this.handleScroll(event)}>\n {filteredImages.map(image => (\n <label class={`flex items-center gap-3 rounded-xl z-background-${theme} px-3 py-2.5`} key={image.id}>\n <input type=\"checkbox\" checked={!!image.isSelected} onChange={() => this.toggleImageSelection(image.id)} />\n <img src={image.url} alt={image.name} class=\"h-16 w-16 rounded-xl object-cover\" loading=\"lazy\" />\n <div class=\"flex flex-1 items-center gap-3 min-w-0\">\n <div class={`flex min-w-0 flex-col gap-1 text-gray`}>\n <div class=\"text-sm font-medium line-clamp-2 break-words\">{image.name}</div>\n <div class={`text-xs text-gray`}>{this.renderFileMeta(image.size, image.created_at, t)}</div>\n </div>\n <div class=\"quick-message-image__menu-wrapper\" data-quick-message-image-menu-root=\"\">\n <button\n type=\"button\"\n class=\"quick-message-image__list-more-button\"\n onClick={event => this.toggleMenu(image.id, event)}\n aria-haspopup=\"menu\"\n aria-expanded={this.openMenuId === image.id ? 'true' : 'false'}\n aria-label={renameLabel}\n data-quick-message-image-menu-root=\"\"\n >\n <Icon name=\"MoreVertical\" addClass=\"size-4\" />\n </button>\n {this.openMenuId === image.id && (\n <div\n class={`quick-message-image__menu quick-message-image__menu--list z-background-${theme} text-primary`}\n role=\"menu\"\n data-quick-message-image-menu-root=\"\"\n >\n <button type=\"button\" class=\"quick-message-image__menu-item\" role=\"menuitem\" onClick={event => this.handleMenuRename(image, event)}>\n {renameLabel}\n </button>\n <button\n type=\"button\"\n class=\"quick-message-image__menu-item quick-message-image__menu-item--danger\"\n role=\"menuitem\"\n onClick={event => this.requestDeleteImage(image, event)}\n >\n {deleteLabel}\n </button>\n </div>\n )}\n </div>\n </div>\n </label>\n ))}\n {this.isLoadingMore && <div class={`py-3 text-center text-xs text-gray`}>Loading...</div>}\n </div>\n )}\n\n <div class={`mt-auto flex items-center gap-2 pt-2 text-gray`}>\n {hasSelection && (\n <button\n type=\"button\"\n class={`quick-message-image__action-button inline-flex h-9 w-9 items-center justify-center rounded-lg cursor-pointer disabled:cursor-not-allowed disabled:opacity-40`}\n onClick={() => this.requestDeleteSelectedImages()}\n aria-label={t('remove')}\n disabled={this.isDeleting}\n >\n {this.isDeleting ? <Icon name=\"Loader2\" addClass=\"size-4 animate-spin\" /> : <Icon name=\"Trash2\" />}\n </button>\n )}\n {!this.isMaster && (\n <button\n type=\"button\"\n disabled={!hasSelection}\n class={`quick-message-image__send ml-auto inline-flex items-center justify-center rounded-full px-4 py-2 text-xs font-semibold z-background-primary-${theme} text-white disabled:cursor-not-allowed disabled:opacity-40 cursor-pointer`}\n onClick={() => this.handleSendImages()}\n >\n {t('quick_message.send_images')}\n </button>\n )}\n </div>\n {this.renderRenameModal(theme, { renameLabel, nameLabel, saveLabel, cancelLabel, closeLabel })}\n </Host>\n );\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"quick-message-image.js","sourceRoot":"","sources":["../../../src/components/quick-message-image/quick-message-image.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Component, Event, EventEmitter, Host, Listen, Prop, State, Watch, h } from '@stencil/core';\nimport dayjs from 'dayjs';\nimport { createQuickMessageLibraryFiles, deleteQuickMessageLibraryFile, getQuickMessageLibraryFiles, updateQuickMessageLibraryFileName } from '../../api/quick-message';\nimport type { QuickMessageLibraryFilePayload } from '../../api/type';\nimport { QuickMessageLibraryFile } from '../../store/type';\nimport { configStore } from '../../store/store';\nimport { useTranslation } from '../../utils/utils';\nimport { Icon } from '../internal-component/icon';\nimport { uploadFile } from '../../utils/upload';\nimport { DIALOG_TYPE, handleError as showErrorDialog, openDialog } from '../../store/dialog';\n\n@Component({\n tag: 'quick-message-image',\n styleUrl: 'quick-message-image.css',\n})\nexport class QuickMessageImageComponent {\n @Prop() handleClose?: () => void;\n @Prop() value?: string | QuickMessageLibraryFile[];\n @Prop() isMaster: boolean = false;\n\n @State() private searchImage = '';\n @State() private images: QuickMessageLibraryFile[] = [];\n @State() private imageDisplayMode: 'grid' | 'list' = 'grid';\n @State() private isLoading = false;\n @State() private isLoadingMore = false;\n @State() private isUploading = false;\n @State() private isDeleting = false;\n @State() private totalImages = 0;\n @State() private totalPages = 0;\n @State() private renameTargetId: string | null = null;\n @State() private renameName = '';\n @State() private renameExtension = '';\n @State() private isRenaming = false;\n @State() private openMenuId: string | null = null;\n\n private readonly pageSize = 15;\n private readonly localUploadPrefix = 'uploaded-image-';\n private page = 1;\n private currentSearch = '';\n\n private fileInput?: HTMLInputElement;\n @Event({ bubbles: true, composed: true }) imagesChange!: EventEmitter<QuickMessageLibraryFile[]>;\n @Event({ bubbles: true, composed: true }) sendImages!: EventEmitter<QuickMessageLibraryFile[]>;\n\n private pendingDeleteImageIds: string[] = [];\n\n // Memoization cache for filtered images\n private cachedFilteredImages: QuickMessageLibraryFile[] | null = null;\n private cachedSearchTerm: string = '';\n private cachedImagesLength: number = 0;\n\n @Listen('click', { target: 'document' })\n protected handleDocumentClick(event: Event) {\n const target = event.target as HTMLElement | null;\n\n if (target?.closest('[data-quick-message-image-menu-root]')) {\n return;\n }\n\n this.openMenuId = null;\n }\n\n componentWillLoad() {\n this.syncImagesFromProp(this.value);\n }\n\n async componentDidLoad() {\n await this.fetchImages({ reset: true });\n }\n\n @Watch('value')\n protected handleValueChange(newValue?: string | QuickMessageLibraryFile[]) {\n this.syncImagesFromProp(newValue);\n }\n\n private syncImagesFromProp(value?: string | QuickMessageLibraryFile[]) {\n if (value === undefined || value === null) {\n this.setImages([], false);\n return;\n }\n\n const parsed = this.parseImagesValue(value);\n this.setImages(parsed, false);\n }\n\n private parseImagesValue(value: string | QuickMessageLibraryFile[]): QuickMessageLibraryFile[] {\n if (typeof value === 'string') {\n try {\n const deserialized = JSON.parse(value) as QuickMessageLibraryFile[];\n return this.cloneImages(deserialized);\n } catch (error: unknown) {\n console.warn('[quick-message-image] Failed to parse images value', error);\n return [];\n }\n }\n\n return this.cloneImages(value);\n }\n\n private cloneImages(images: QuickMessageLibraryFile[]): QuickMessageLibraryFile[] {\n return (images || []).map(image => ({\n ...image,\n isSelected: image.isSelected ?? false,\n }));\n }\n\n private setImages(next: QuickMessageLibraryFile[], shouldEmit = true) {\n this.images = next;\n if (shouldEmit) {\n const payload = this.cloneImages(next);\n this.imagesChange.emit(payload);\n }\n }\n\n private isLocalUpload(image: QuickMessageLibraryFile): boolean {\n return image.id.startsWith(this.localUploadPrefix);\n }\n\n private getRemoteImageCount(): number {\n return this.images.filter(image => !this.isLocalUpload(image)).length;\n }\n\n private mergeFetchedImages(fetched: QuickMessageLibraryFile[], reset: boolean): QuickMessageLibraryFile[] {\n const localUploads = this.images.filter(image => this.isLocalUpload(image));\n const selectionMap = new Map(this.images.map(image => [image.id, image.isSelected ?? false]));\n\n const normalizedFetched = fetched.map(image => ({\n ...image,\n isSelected: selectionMap.get(image.id) ?? image.isSelected ?? false,\n }));\n\n if (reset) {\n return [...localUploads, ...normalizedFetched];\n }\n\n const existingRemote = this.images.filter(image => !this.isLocalUpload(image));\n const remoteIndexMap = new Map<string, number>();\n existingRemote.forEach((image, index) => {\n remoteIndexMap.set(image.id, index);\n });\n\n const nextRemote = [...existingRemote];\n normalizedFetched.forEach(image => {\n const existingIndex = remoteIndexMap.get(image.id);\n if (existingIndex !== undefined) {\n nextRemote[existingIndex] = image;\n } else {\n remoteIndexMap.set(image.id, nextRemote.length);\n nextRemote.push(image);\n }\n });\n\n return [...localUploads, ...nextRemote];\n }\n\n /**\n * Memoized image filtering - only recalculates when search term or images change\n * Performance: Reduces operations from 60fps to only when user types\n */\n private filterImages(): QuickMessageLibraryFile[] {\n const search = this.searchImage.trim().toLowerCase();\n\n // Quick return for no search\n if (!search) return this.images;\n\n // Check if we can use cached results\n if (this.cachedFilteredImages && search === this.cachedSearchTerm && this.images.length === this.cachedImagesLength) {\n return this.cachedFilteredImages;\n }\n\n // Recalculate filtered results\n const filtered = this.images.filter(image => image.name.toLowerCase().includes(search));\n\n // Update cache\n this.cachedFilteredImages = filtered;\n this.cachedSearchTerm = search;\n this.cachedImagesLength = this.images.length;\n\n return filtered;\n }\n\n private splitFileName(name: string): { base: string; extension: string } {\n const lastDotIndex = name.lastIndexOf('.');\n if (lastDotIndex <= 0 || lastDotIndex === name.length - 1) {\n return { base: name, extension: '' };\n }\n\n return {\n base: name.slice(0, lastDotIndex),\n extension: name.slice(lastDotIndex),\n };\n }\n\n private getRenameTarget(): QuickMessageLibraryFile | undefined {\n if (!this.renameTargetId) {\n return undefined;\n }\n\n return this.images.find(image => image.id === this.renameTargetId);\n }\n\n private openRenameModal(image: QuickMessageLibraryFile, event?: Event) {\n event?.preventDefault();\n event?.stopPropagation();\n\n const { base, extension } = this.splitFileName(image.name);\n this.renameTargetId = image.id;\n this.renameName = base;\n this.renameExtension = extension;\n }\n\n private closeRenameModal(force = false) {\n if (this.isRenaming && !force) {\n return;\n }\n\n this.renameTargetId = null;\n this.renameName = '';\n this.renameExtension = '';\n }\n\n private toggleMenu(imageId: string, event: Event) {\n event.preventDefault();\n event.stopPropagation();\n\n this.openMenuId = this.openMenuId === imageId ? null : imageId;\n }\n\n private closeMenu() {\n this.openMenuId = null;\n }\n\n private handleMenuRename(image: QuickMessageLibraryFile, event: Event) {\n event.preventDefault();\n event.stopPropagation();\n\n this.closeMenu();\n this.openRenameModal(image, event);\n }\n\n private requestDeleteImage(image: QuickMessageLibraryFile, event: Event) {\n event.preventDefault();\n event.stopPropagation();\n\n if (this.isDeleting) {\n return;\n }\n\n this.pendingDeleteImageIds = [image.id];\n this.closeMenu();\n\n const t = useTranslation();\n\n openDialog({\n open: true,\n type: DIALOG_TYPE.WARNING,\n title: t('quick_message.delete_item_confirmation'),\n buttonName: t('confirm'),\n cancelButtonName: t('cancel'),\n onSubmitDialog: () => {\n void this.confirmDeleteSelectedImages();\n },\n onCloseDialog: () => {\n this.pendingDeleteImageIds = [];\n },\n });\n }\n\n private handleRenameInput(event: Event) {\n const value = (event.target as HTMLInputElement).value;\n\n if (this.renameExtension && value.toLowerCase().endsWith(this.renameExtension.toLowerCase())) {\n this.renameName = value.slice(0, -this.renameExtension.length);\n return;\n }\n\n this.renameName = value;\n }\n\n private async handleRenameSubmit(event: Event) {\n event.preventDefault();\n\n const target = this.getRenameTarget();\n\n if (!target) {\n return;\n }\n\n const trimmedBase = this.renameName.trim();\n\n if (!trimmedBase) {\n return;\n }\n\n const nextName = this.renameExtension ? `${trimmedBase}${this.renameExtension}` : trimmedBase;\n\n if (nextName === target.name) {\n this.closeRenameModal(true);\n return;\n }\n\n if (this.isLocalUpload(target)) {\n this.setImages(\n this.images.map(image =>\n image.id === target.id\n ? {\n ...image,\n name: nextName,\n }\n : image,\n ),\n );\n\n this.closeRenameModal(true);\n return;\n }\n\n this.isRenaming = true;\n\n try {\n const updated = await updateQuickMessageLibraryFileName({ id: target.id, name: nextName });\n this.setImages(\n this.images.map(image =>\n image.id === target.id\n ? {\n ...image,\n name: updated.name,\n last_updated_at: updated.last_updated_at,\n last_updated_by: updated.last_updated_by,\n }\n : image,\n ),\n );\n this.closeRenameModal(true);\n } catch (error: unknown) {\n showErrorDialog(error, '[quick-message-image] Failed to rename image');\n } finally {\n this.isRenaming = false;\n }\n }\n\n private toggleImageSelection(id: string) {\n this.setImages(this.images.map(image => (image.id === id ? { ...image, isSelected: !image.isSelected } : image)));\n }\n\n private toggleSelectAllImages() {\n const isAllSelected = this.images.length > 0 && this.images.every(image => image.isSelected);\n this.setImages(this.images.map(image => ({ ...image, isSelected: !isAllSelected })));\n }\n\n private triggerImageUpload() {\n this.fileInput?.click();\n }\n\n private handleImageSelection(event: Event) {\n const input = event.target as HTMLInputElement;\n if (!input.files || input.files.length === 0) return;\n\n const files = Array.from(input.files);\n input.value = '';\n\n void this.uploadAndCreateImages(files);\n }\n\n private async uploadAndCreateImages(files: File[]) {\n if (files.length === 0) {\n return;\n }\n\n this.isUploading = true;\n\n try {\n const payload: QuickMessageLibraryFilePayload[] = [];\n\n for (const file of files) {\n const uploadUrl = await uploadFile({\n file,\n filename: file.name.replaceAll(' ', '-'),\n folder: 'zignal/quick-message-library/image',\n });\n\n if (!uploadUrl) {\n continue;\n }\n\n payload.push({\n file_type: 'image',\n name: file.name,\n url: uploadUrl,\n size: file.size,\n });\n }\n\n if (payload.length > 0) {\n await createQuickMessageLibraryFiles({ files: payload });\n await this.fetchImages({ reset: true });\n }\n } catch (error: unknown) {\n showErrorDialog(error, '[quick-message-image] Failed to upload image');\n } finally {\n this.isUploading = false;\n }\n }\n\n private renderFileMeta(size: number, createdAt: string, t: (key: string, values?: Record<string, string>) => string) {\n const sizeKb = Math.round(size / 1024);\n return `${sizeKb} KB · ${t('quick_message.created_at').replace('{date}', dayjs(createdAt).tz().format('DD/MM/YYYY HH:mm'))}`;\n }\n\n private handleSendImages() {\n const selected = this.images.filter(image => image.isSelected);\n if (selected.length === 0) return;\n const payload = this.cloneImages(selected);\n this.sendImages.emit(payload);\n this.handleClose?.();\n }\n\n private requestDeleteSelectedImages() {\n if (this.isDeleting) {\n return;\n }\n\n const selectedIds = this.images.filter(image => image.isSelected).map(image => image.id);\n\n if (selectedIds.length === 0) {\n return;\n }\n\n this.pendingDeleteImageIds = selectedIds;\n\n const t = useTranslation();\n\n openDialog({\n open: true,\n type: DIALOG_TYPE.WARNING,\n title: t('quick_message.delete_selected_items_confirmation'),\n buttonName: t('confirm'),\n cancelButtonName: t('cancel'),\n onSubmitDialog: () => {\n void this.confirmDeleteSelectedImages();\n },\n onCloseDialog: () => {\n this.pendingDeleteImageIds = [];\n },\n });\n }\n\n private async confirmDeleteSelectedImages() {\n if (this.isDeleting) {\n return;\n }\n\n const pendingIds = [...this.pendingDeleteImageIds];\n this.pendingDeleteImageIds = [];\n\n if (pendingIds.length === 0) {\n return;\n }\n\n const pendingSet = new Set(pendingIds);\n const remoteIds = this.images.filter(image => pendingSet.has(image.id) && !this.isLocalUpload(image)).map(image => image.id);\n\n this.isDeleting = true;\n\n try {\n if (remoteIds.length > 0) {\n await deleteQuickMessageLibraryFile({ ids: remoteIds });\n }\n\n const remaining = this.images.filter(image => !pendingSet.has(image.id));\n this.setImages(remaining);\n\n if (remoteIds.length > 0) {\n this.totalImages = Math.max(0, this.totalImages - remoteIds.length);\n await this.fetchImages({ reset: true });\n }\n } catch (error: unknown) {\n showErrorDialog(error, '[quick-message-image] Failed to delete images');\n } finally {\n this.isDeleting = false;\n }\n }\n\n private async fetchImages({ search, reset = true }: { search?: string; reset?: boolean } = {}) {\n const businessId = configStore.get('businessId');\n const shopId = configStore.get('shopId');\n\n if (!businessId || !shopId) {\n return;\n }\n\n if (reset ? this.isLoading : this.isLoadingMore) {\n return;\n }\n\n const searchSource = search !== undefined ? search : reset ? this.searchImage : this.currentSearch;\n const trimmedSearch = searchSource?.trim() ?? '';\n const nextPage = reset ? 1 : this.page + 1;\n\n if (search !== undefined) {\n this.searchImage = searchSource ?? '';\n }\n\n if (reset) {\n this.isLoading = true;\n } else {\n this.isLoadingMore = true;\n }\n\n try {\n const response = await getQuickMessageLibraryFiles({\n fileType: 'image',\n search: trimmedSearch ? trimmedSearch : undefined,\n page: nextPage,\n limit: this.pageSize,\n });\n\n const fetched = this.cloneImages(response.files || []);\n const merged = this.mergeFetchedImages(fetched, reset);\n\n this.page = response.page > 0 ? response.page : nextPage;\n const resolvedTotalPages = response.total_pages > 0 ? response.total_pages : fetched.length > 0 ? 1 : 0;\n this.totalPages = resolvedTotalPages;\n this.totalImages = typeof response.total === 'number' ? response.total : fetched.length;\n this.currentSearch = trimmedSearch;\n\n this.setImages(merged);\n } catch (error: unknown) {\n console.error('[quick-message-image] Failed to fetch images', error);\n } finally {\n if (reset) {\n this.isLoading = false;\n } else {\n this.isLoadingMore = false;\n }\n }\n }\n\n private async loadMoreImages() {\n if (this.isLoading || this.isLoadingMore) {\n return;\n }\n\n if (this.totalPages === 0 || this.page >= this.totalPages) {\n return;\n }\n\n if (this.totalImages > 0) {\n const remoteCount = this.getRemoteImageCount();\n if (remoteCount >= this.totalImages) {\n return;\n }\n }\n\n await this.fetchImages({ reset: false });\n }\n\n private handleScroll(event: Event) {\n const target = event.target as HTMLElement | null;\n if (!target) {\n return;\n }\n\n const remaining = target.scrollHeight - target.scrollTop - target.clientHeight;\n if (remaining < 160) {\n void this.loadMoreImages();\n }\n }\n\n private handleSearchInput(event: Event) {\n const value = (event.target as HTMLInputElement).value;\n this.searchImage = value;\n\n if (!value.trim() && this.currentSearch && !this.isLoading && !this.isLoadingMore) {\n void this.fetchImages({ search: '', reset: true });\n }\n }\n\n private async handleSearchSubmit(event?: Event) {\n event?.preventDefault();\n await this.fetchImages({ search: this.searchImage, reset: true });\n }\n\n private clearSearch() {\n if (!this.searchImage) {\n return;\n }\n\n this.searchImage = '';\n if (this.currentSearch) {\n void this.fetchImages({ search: '', reset: true });\n }\n }\n\n private renderRenameModal(labels: { renameLabel: string; nameLabel: string; saveLabel: string; cancelLabel: string; closeLabel: string }) {\n const target = this.getRenameTarget();\n\n if (!this.renameTargetId || !target) {\n return null;\n }\n\n const trimmedBase = this.renameName.trim();\n const nextName = this.renameExtension ? `${trimmedBase}${this.renameExtension}` : trimmedBase;\n const isSaveDisabled = this.isRenaming || trimmedBase.length === 0 || nextName === target.name;\n const inputId = `quick-message-image-rename-${target.id}`;\n\n return (\n <div class=\"quick-message-image__rename-overlay\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"quick-message-image-rename-title\" onClick={() => this.closeRenameModal()}>\n <div class={`quick-message-image__rename-modal bg-background text-surface`} onClick={event => event.stopPropagation()}>\n <div class=\"quick-message-image__rename-header\">\n <h3 id=\"quick-message-image-rename-title\" class=\"text-base font-semibold\">\n {labels.renameLabel}\n </h3>\n <button type=\"button\" class=\"quick-message-image__rename-close\" onClick={() => this.closeRenameModal()} aria-label={labels.closeLabel} disabled={this.isRenaming}>\n <Icon name=\"X\" />\n </button>\n </div>\n <form class=\"flex flex-col gap-4\" onSubmit={event => this.handleRenameSubmit(event)}>\n <label class=\"flex flex-col gap-2 text-sm\" htmlFor={inputId}>\n <span class=\"font-medium\">{labels.nameLabel}</span>\n <div class={`quick-message-image__rename-input-row border border-divider bg-background`}>\n <input\n id={inputId}\n type=\"text\"\n class=\"quick-message-image__rename-input text-surface\"\n value={this.renameName}\n onInput={event => this.handleRenameInput(event)}\n />\n {this.renameExtension && <span class=\"quick-message-image__rename-extension\">{this.renameExtension}</span>}\n </div>\n </label>\n <div class=\"flex justify-end gap-2 text-sm\">\n <button type=\"button\" class=\"quick-message-image__rename-cancel\" onClick={() => this.closeRenameModal()} disabled={this.isRenaming}>\n {labels.cancelLabel}\n </button>\n <button type=\"submit\" class=\"quick-message-image__rename-save\" disabled={isSaveDisabled}>\n {this.isRenaming ? <Icon name=\"Loader2\" addClass=\"size-4 animate-spin\" /> : labels.saveLabel}\n </button>\n </div>\n </form>\n </div>\n </div>\n );\n }\n\n render() {\n const theme = configStore.get('theme');\n const t = useTranslation();\n const filteredImages = this.filterImages();\n const hasSelection = this.images.some(image => image.isSelected);\n const isInitialLoading = this.isLoading && this.images.length === 0;\n const renameLabel = t('quick_message.rename_item');\n const deleteLabel = t('remove');\n const nameLabel = t('quick_message.name');\n const saveLabel = t('save');\n const cancelLabel = t('cancel');\n const closeLabel = t('close');\n\n return (\n <Host class=\"flex min-h-0 flex-1 flex-col gap-4\" data-theme={theme}>\n <form class=\"w-full\" onSubmit={event => this.handleSearchSubmit(event)}>\n <div class=\"relative\">\n <input\n type=\"text\"\n class={`w-full border border-divider text-sm px-4 py-2 pr-9 rounded-lg ring-primary focus:outline-none focus:border-primary bg-background text-surface`}\n placeholder={t('quick_message.search_image')}\n value={this.searchImage}\n onInput={event => this.handleSearchInput(event)}\n />\n {this.searchImage && (\n <button\n type=\"button\"\n class=\"absolute right-2 top-1/2 -translate-y-1/2 text-xs text-gray-400 hover:text-gray-600\"\n onClick={() => this.clearSearch()}\n aria-label={t('clear') || 'Clear'}\n >\n <Icon name=\"X\" />\n </button>\n )}\n </div>\n </form>\n\n <div class=\"flex items-center justify-between\">\n {this.images.length > 0 ? (\n <label class=\"inline-flex items-center gap-2 text-sm\">\n <input type=\"checkbox\" checked={this.images.length > 0 && this.images.every(image => image.isSelected)} onChange={() => this.toggleSelectAllImages()} />\n <span>{t('select_all')}</span>\n </label>\n ) : (\n <span />\n )}\n <div class=\"flex items-center gap-2\">\n <input\n class=\"hidden\"\n type=\"file\"\n accept=\"image/*\"\n multiple\n ref={el => (this.fileInput = el as HTMLInputElement)}\n onChange={event => this.handleImageSelection(event)}\n />\n <button\n type=\"button\"\n class=\"quick-message-image__action-button inline-flex h-9 w-9 items-center justify-center rounded-lg cursor-pointer\"\n onClick={() => !this.isUploading && this.triggerImageUpload()}\n aria-label={t('quick_message.add_image')}\n disabled={this.isUploading}\n >\n {this.isUploading ? <Icon name=\"Loader2\" addClass=\"size-4 animate-spin\" /> : <Icon name=\"Plus\" />}\n </button>\n {this.images.length > 0 && (\n <button\n class=\"quick-message-image__action-button quick-message-image__display-switch inline-flex h-9 w-9 items-center justify-center rounded-lg cursor-pointer\"\n type=\"button\"\n onClick={() => (this.imageDisplayMode = this.imageDisplayMode === 'grid' ? 'list' : 'grid')}\n aria-label={this.imageDisplayMode === 'grid' ? t('quick_message.display_list') : t('quick_message.display_grid')}\n >\n <Icon name={this.imageDisplayMode === 'grid' ? 'List' : 'Grid'} />\n </button>\n )}\n </div>\n </div>\n\n {this.isUploading && (\n <div class={`flex items-center gap-2 text-xs text-primary`}>\n <Icon name=\"Loader2\" addClass=\"size-4 animate-spin\" />\n <span>{t('quick_message.uploading') || 'Uploading...'}</span>\n </div>\n )}\n\n {isInitialLoading ? (\n <div class={`flex flex-1 items-center justify-center text-sm text-theme-gray`}>Loading...</div>\n ) : filteredImages.length === 0 ? (\n <div class={`flex flex-1 items-center justify-center text-sm text-theme-gray`}>{t('quick_message.image_empty')}</div>\n ) : this.imageDisplayMode === 'grid' ? (\n <div\n class=\"grid flex-1 grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 auto-rows-auto items-start content-start gap-3 overflow-y-auto\"\n onScroll={event => this.handleScroll(event)}\n >\n {filteredImages.map(image => (\n <div class=\"quick-message-image__grid-item\" key={image.id}>\n <button\n type=\"button\"\n class={`flex w-full flex-col items-center gap-2 rounded-xl border border-transparent bg-background p-1.5 cursor-pointer ${image.isSelected ? 'border-primary' : ''}`}\n onClick={() => this.toggleImageSelection(image.id)}\n >\n <div class=\"quick-message-image__thumbnail\">\n {image.isSelected && (\n <span class={`quick-message-image__selection-indicator bg-primary`} aria-hidden=\"true\">\n <Icon name=\"Check\" addClass=\"size-3 text-white\" />\n </span>\n )}\n <img src={image.url} alt={image.name} class=\"quick-message-image__thumbnail-image\" loading=\"lazy\" />\n </div>\n <div class={`text-center text-xs line-clamp-2 text-theme-gray`}>{image.name}</div>\n </button>\n <div class=\"quick-message-image__menu-wrapper quick-message-image__menu-wrapper--grid\" data-quick-message-image-menu-root=\"\">\n <button\n type=\"button\"\n class=\"quick-message-image__more-button\"\n onClick={event => this.toggleMenu(image.id, event)}\n aria-haspopup=\"menu\"\n aria-expanded={this.openMenuId === image.id ? 'true' : 'false'}\n aria-label={renameLabel}\n data-quick-message-image-menu-root=\"\"\n >\n <Icon name=\"MoreVertical\" addClass=\"size-4\" />\n </button>\n {this.openMenuId === image.id && (\n <div class={`quick-message-image__menu bg-background text-surface`} role=\"menu\" data-quick-message-image-menu-root=\"\">\n <button type=\"button\" class=\"quick-message-image__menu-item\" role=\"menuitem\" onClick={event => this.handleMenuRename(image, event)}>\n {renameLabel}\n </button>\n <button\n type=\"button\"\n class=\"quick-message-image__menu-item quick-message-image__menu-item--danger\"\n role=\"menuitem\"\n onClick={event => this.requestDeleteImage(image, event)}\n >\n {deleteLabel}\n </button>\n </div>\n )}\n </div>\n </div>\n ))}\n {this.isLoadingMore && <div class={`col-span-full py-3 text-center text-xs text-theme-gray`}>Loading...</div>}\n </div>\n ) : (\n <div class=\"flex flex-1 flex-col gap-2.5 overflow-y-auto\" onScroll={event => this.handleScroll(event)}>\n {filteredImages.map(image => (\n <label class={`flex items-center gap-3 rounded-xl bg-background px-3 py-2.5`} key={image.id}>\n <input type=\"checkbox\" checked={!!image.isSelected} onChange={() => this.toggleImageSelection(image.id)} />\n <img src={image.url} alt={image.name} class=\"h-16 w-16 rounded-xl object-cover\" loading=\"lazy\" />\n <div class=\"flex flex-1 items-center gap-3 min-w-0\">\n <div class={`flex min-w-0 flex-col gap-1 text-theme-gray`}>\n <div class=\"text-sm font-medium line-clamp-2 wrap-break-words\">{image.name}</div>\n <div class={`text-xs text-theme-gray`}>{this.renderFileMeta(image.size, image.created_at, t)}</div>\n </div>\n <div class=\"quick-message-image__menu-wrapper\" data-quick-message-image-menu-root=\"\">\n <button\n type=\"button\"\n class=\"quick-message-image__list-more-button\"\n onClick={event => this.toggleMenu(image.id, event)}\n aria-haspopup=\"menu\"\n aria-expanded={this.openMenuId === image.id ? 'true' : 'false'}\n aria-label={renameLabel}\n data-quick-message-image-menu-root=\"\"\n >\n <Icon name=\"MoreVertical\" addClass=\"size-4\" />\n </button>\n {this.openMenuId === image.id && (\n <div\n class={`quick-message-image__menu quick-message-image__menu--list bg-background text-surface`}\n role=\"menu\"\n data-quick-message-image-menu-root=\"\"\n >\n <button type=\"button\" class=\"quick-message-image__menu-item\" role=\"menuitem\" onClick={event => this.handleMenuRename(image, event)}>\n {renameLabel}\n </button>\n <button\n type=\"button\"\n class=\"quick-message-image__menu-item quick-message-image__menu-item--danger\"\n role=\"menuitem\"\n onClick={event => this.requestDeleteImage(image, event)}\n >\n {deleteLabel}\n </button>\n </div>\n )}\n </div>\n </div>\n </label>\n ))}\n {this.isLoadingMore && <div class={`py-3 text-center text-xs text-theme-gray`}>Loading...</div>}\n </div>\n )}\n\n <div class={`mt-auto flex items-center gap-2 pt-2 text-theme-gray`}>\n {hasSelection && (\n <button\n type=\"button\"\n class={`quick-message-image__action-button inline-flex h-9 w-9 items-center justify-center rounded-lg cursor-pointer disabled:cursor-not-allowed disabled:opacity-40`}\n onClick={() => this.requestDeleteSelectedImages()}\n aria-label={t('remove')}\n disabled={this.isDeleting}\n >\n {this.isDeleting ? <Icon name=\"Loader2\" addClass=\"size-4 animate-spin\" /> : <Icon name=\"Trash2\" />}\n </button>\n )}\n {!this.isMaster && (\n <button\n type=\"button\"\n disabled={!hasSelection}\n class={`quick-message-image__send ml-auto inline-flex items-center justify-center rounded-full px-4 py-2 text-xs font-semibold bg-primary text-white disabled:cursor-not-allowed disabled:opacity-40 cursor-pointer`}\n onClick={() => this.handleSendImages()}\n >\n {t('quick_message.send_images')}\n </button>\n )}\n </div>\n {this.renderRenameModal({ renameLabel, nameLabel, saveLabel, cancelLabel, closeLabel })}\n </Host>\n );\n }\n}\n"]}
|