{"version":3,"file":"application.js","mappings":"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","sources":["webpack://evolve/./app/javascript/views/algoliasearch/filter_search_button_action.js","webpack://evolve/./app/javascript/views/components/post_empathy.js","webpack://evolve/./app/javascript/views/layouts/_filter_search.js","webpack://evolve/./app/javascript/views/layouts/_gtag_event.js","webpack://evolve/./app/javascript/views/layouts/_lazy_twitter.js","webpack://evolve/./app/javascript/views/layouts/_profiles.js","webpack://evolve/./app/javascript/views/layouts/boards.js","webpack://evolve/./app/javascript/views/layouts/topics.js","webpack://evolve/./app/javascript/views/manba_magazines.js","webpack://evolve/./app/javascript/views/modules/board/sp_main_board.js","webpack://evolve/./app/javascript/views/modules/board_metadata/summary.js","webpack://evolve/./app/javascript/views/modules/footer_function_menu/communicate_dialog.js","webpack://evolve/./app/javascript/views/modules/footer_function_menu/discover_dialog.js","webpack://evolve/./app/javascript/views/modules/footer_function_menu/read_dialog.js","webpack://evolve/./app/javascript/views/modules/free_spaces/pager_select.js","webpack://evolve/./app/javascript/views/modules/manba_magazine_authors/description.js","webpack://evolve/./app/javascript/views/modules/menu/smartphone_header.js","webpack://evolve/./app/javascript/views/modules/page_scroll_to.js","webpack://evolve/./app/javascript/views/modules/pr/boards.js","webpack://evolve/./app/javascript/views/modules/pr/small_boards.js","webpack://evolve/./app/javascript/views/modules/profiles/description.js","webpack://evolve/./app/javascript/views/modules/search/result_tabs.js","webpack://evolve/./app/javascript/views/modules/sticky_caption.js","webpack://evolve/./app/javascript/views/modules/topic/comment_form_position.js","webpack://evolve/./app/javascript/views/modules/user_board_lists/share.js","webpack://evolve/./app/javascript/views/modules/user_board_lists/share_button.js","webpack://evolve/./app/javascript/views/modules/users/notification_select_box.js","webpack://evolve/./app/javascript/views/modules/users/resign.js","webpack://evolve/./app/javascript/views/modules/users/setting.js","webpack://evolve/./app/javascript/views/modules/year_month_select_box.js","webpack://evolve/./app/javascript/views/redirects.js","webpack://evolve/./app/javascript/views/share.js","webpack://evolve/./app/javascript/views/sub_navigation.js","webpack://evolve/./app/javascript/views/valuecommerce/link_switch.js","webpack://evolve/./app/javascript/views/valuecommerce/mylink.js","webpack://evolve/./app/javascript/views/valuecommerce/top.js","webpack://evolve/./app/javascript/views/want_to_recalls/resolved_comments.js","webpack://evolve/./node_modules/@textcomplete/core/dist/Completer.js","webpack://evolve/./node_modules/@textcomplete/core/dist/Dropdown.js","webpack://evolve/./node_modules/@textcomplete/core/dist/Editor.js","webpack://evolve/./node_modules/@textcomplete/core/dist/SearchResult.js","webpack://evolve/./node_modules/@textcomplete/core/dist/Strategy.js","webpack://evolve/./node_modules/@textcomplete/core/dist/Textcomplete.js","webpack://evolve/./node_modules/@textcomplete/core/dist/index.js","webpack://evolve/./node_modules/@textcomplete/core/dist/utils.js","webpack://evolve/./node_modules/@textcomplete/textarea/dist/TextareaEditor.js","webpack://evolve/./node_modules/@textcomplete/textarea/dist/index.js","webpack://evolve/./node_modules/@textcomplete/utils/dist/calculateElementOffset.js","webpack://evolve/./node_modules/@textcomplete/utils/dist/getLineHeightPx.js","webpack://evolve/./node_modules/@textcomplete/utils/dist/index.js","webpack://evolve/./node_modules/@textcomplete/utils/dist/isSafari.js","webpack://evolve/./node_modules/eventemitter3/index.js","webpack://evolve/./node_modules/textarea-caret/index.js","webpack://evolve/./node_modules/undate/dist/index.mjs","webpack://evolve/webpack/bootstrap","webpack://evolve/webpack/runtime/define property getters","webpack://evolve/webpack/runtime/hasOwnProperty shorthand","webpack://evolve/webpack/runtime/make namespace object","webpack://evolve/./node_modules/@rails/ujs/app/assets/javascripts/rails-ujs.esm.js","webpack://evolve/./node_modules/whatwg-fetch/fetch.js","webpack://evolve/./app/javascript/views/Api.js","webpack://evolve/./app/javascript/views/login_state_store.js","webpack://evolve/./app/javascript/views/pubsub_store.js","webpack://evolve/./app/javascript/views/csrf_token_store.js","webpack://evolve/./app/javascript/views/quicklink_helper.js","webpack://evolve/./app/javascript/views/layouts/_application.js","webpack://evolve/./app/javascript/views/modules/reading_note.js","webpack://evolve/./app/javascript/views/modules/menu/smartphone_admin.js","webpack://evolve/./app/javascript/views/modules/menu/smartphone_login_icon.js","webpack://evolve/./app/javascript/views/modules/menu/desktop_login_icon.js","webpack://evolve/./app/javascript/views/modules/footer_function_menu.js","webpack://evolve/./app/javascript/views/modules/profiles/user.js","webpack://evolve/./app/javascript/views/modules/tutorials/form.js","webpack://evolve/./app/javascript/views/modules/forums/topic.js","webpack://evolve/./app/javascript/views/modules/manba_magazines/clap.js","webpack://evolve/./app/javascript/views/modules/users/floating_menu.js","webpack://evolve/./app/javascript/views/modules/pickup_user.js","webpack://evolve/./app/javascript/views/modules/reread_boards.js","webpack://evolve/./app/javascript/views/modules/follow_authors.js","webpack://evolve/./app/javascript/views/modules/follow_boards.js","webpack://evolve/./app/javascript/views/modules/follow_topics.js","webpack://evolve/./app/javascript/views/modules/favorite_ratings.js","webpack://evolve/./app/javascript/views/modules/favorite_ratings_action.js","webpack://evolve/./app/javascript/views/modules/board_read_statuses.js","webpack://evolve/./app/javascript/views/modules/follow_board_action_icon.js","webpack://evolve/./app/javascript/views/modules/follow_topic_action_icon.js","webpack://evolve/./app/javascript/views/modules/follow_user_action_icon.js","webpack://evolve/./app/javascript/views/modules/follow_user_button.js","webpack://evolve/./app/javascript/views/modules/floating_menu.js","webpack://evolve/./app/javascript/views/modules/reread_board_action_icon.js","webpack://evolve/./app/javascript/views/modules/read_status_plan_to_read_action.js","webpack://evolve/./app/javascript/views/modules/store_action.js","webpack://evolve/./app/javascript/views/modules/empathy_action.js","webpack://evolve/./app/javascript/views/modules/light_review_board_action_icon.js","webpack://evolve/./app/javascript/views/modules/light_review/dialog.js","webpack://evolve/./app/javascript/views/modules/scroll_fade.js","webpack://evolve/./app/javascript/views/algoliasearch/api.js","webpack://evolve/./app/javascript/views/modules/search_box/select_box_with_autocomplete.js","webpack://evolve/./app/javascript/views/modules/author/view_counter.js","webpack://evolve/./app/javascript/views/modules/author/follow_button.js","webpack://evolve/./app/javascript/views/modules/author/floating_menu.js","webpack://evolve/./app/javascript/views/modules/want_to_recalls/floating_menu.js","webpack://evolve/./app/javascript/views/modules/want_to_recalls/topic.js","webpack://evolve/./app/javascript/views/modules/want_to_recalls/follow_button.js","webpack://evolve/./app/javascript/views/modules/reviews/first_comment.js","webpack://evolve/./app/javascript/views/modules/board/view_counter.js","webpack://evolve/./app/javascript/views/modules/board/follow_button.js","webpack://evolve/./app/javascript/views/modules/board/reread_button.js","webpack://evolve/./app/javascript/views/modules/board/favorite_ratings_action.js","webpack://evolve/./app/javascript/views/modules/board/favorite_ratings.js","webpack://evolve/./app/javascript/views/modules/board/floating_menu.js","webpack://evolve/./app/javascript/views/modules/board/action_announce.js","webpack://evolve/./app/javascript/views/modules/topic/view_counter.js","webpack://evolve/./app/javascript/views/modules/topic/follow_button.js","webpack://evolve/./app/javascript/views/modules/topic/plan_to_read_button.js","webpack://evolve/./app/javascript/views/modules/topic/owned.js","webpack://evolve/./app/javascript/views/modules/topic/form.js","webpack://evolve/./app/javascript/views/modules/topic/select_box.js","webpack://evolve/./app/javascript/views/modules/topic/floating_menu.js","webpack://evolve/./app/javascript/views/modules/comment/owned.js","webpack://evolve/./app/javascript/views/modules/comment/form.js","webpack://evolve/./app/javascript/views/modules/pr/small_author_boards.js","webpack://evolve/./app/javascript/views/modules/pr/ebookjapan_yahoo/banner.js","webpack://evolve/./app/javascript/views/modules/pr/ebookjapan_yahoo/rectangle_board.js","webpack://evolve/./app/javascript/views/modules/filter_search.js","webpack://evolve/./app/javascript/views/modules/user_board_lists/form.js","webpack://evolve/./app/javascript/views/modules/user_board_lists/list_actions.js","webpack://evolve/./app/javascript/views/modules/user_board_lists/view_counter.js","webpack://evolve/./app/javascript/views/modules/themes/view_counter.js","webpack://evolve/./app/javascript/views/modules/add_visited_topic_log.js","webpack://evolve/./app/javascript/views/modules/add_visited_board_log.js","webpack://evolve/./app/javascript/views/modules/add_visited_author_log.js","webpack://evolve/./app/javascript/views/modules/introduction_item/free_spaces/main.js","webpack://evolve/./app/javascript/views/modules/image_with_expansion.js","webpack://evolve/./app/javascript/views/modules/import_video_link.js","webpack://evolve/./app/javascript/views/algoliasearch/autocomplete.js","webpack://evolve/./app/javascript/views/algoliasearch/textarea_autocomplete.js","webpack://evolve/./app/javascript/views/algoliasearch/free_space_autocomplete.js","webpack://evolve/./app/javascript/views/algoliasearch/user_board_list_autocomplete.js","webpack://evolve/./app/javascript/views/algoliasearch/manba_magazine_autocomplete.js","webpack://evolve/./app/javascript/views/modules/free_spaces/form.js","webpack://evolve/./app/javascript/views/modules/free_spaces/floating_menu.js","webpack://evolve/./app/javascript/views/modules/free_spaces/topic_main.js","webpack://evolve/./app/javascript/views/modules/free_spaces/filter_search.js","webpack://evolve/./app/javascript/views/modules/recommend_spaces/topic_main.js","webpack://evolve/./app/javascript/views/modules/recommend_spaces/floating_menu.js","webpack://evolve/./app/javascript/views/want_to_recalls/form.js","webpack://evolve/./app/javascript/views/components/infinite_scroll.js","webpack://evolve/./app/javascript/views/google_one_tap.js","webpack://evolve/./app/javascript/views/modules/login_display.js","webpack://evolve/./app/javascript/application.js"],"sourcesContent":["document.addEventListener(\"DOMContentLoaded\", function (event) {\n\n let searchAction = (editElement, actiomElement) => {\n actiomElement.addEventListener(\"click\", function () {\n let value = editElement.value;\n\n const baseSearchPath = \"/filter_search?q=\";\n let redirectPath;\n\n if (value !== \"\") {\n redirectPath = baseSearchPath + value;\n } else {\n redirectPath = baseSearchPath;\n }\n\n location.href = redirectPath;\n });\n }\n\n let desktopSearchAction = () => {\n const desktopFilterSearchEditElement = document.querySelector(\"#desktop-header-search-autocomplete-input\");\n const desktopFilterSearchActionElement = document.querySelector(\".desktop-header-advanced-search\");\n\n searchAction(desktopFilterSearchEditElement, desktopFilterSearchActionElement)\n }\n\n let smartphoneSearchAction = () => {\n const smartphoneFilterSearchEditElement = document.querySelector(\"#smartphone-header-search-autocomplete-input\");\n const smartphoneFilterSearchActionElement = document.querySelector(\".smartphone-header-search .button\");\n\n searchAction(smartphoneFilterSearchEditElement, smartphoneFilterSearchActionElement)\n }\n\n desktopSearchAction();\n smartphoneSearchAction();\n\n});\n","document.addEventListener(\"DOMContentLoaded\", function (event) {\n \"use strict\";\n\n let commentMetadataElement = document.querySelector(\".comment-metadata\");\n\n if (commentMetadataElement === null) {\n return;\n }\n\n let comments = document.querySelectorAll(\".comment-metadata\");\n\n comments.forEach(element => {\n let commentEmpathyElement = element.querySelector(\".comment-empathy\");\n let postEmpathyElement = element.querySelector(\".post-empathy\");\n\n if (postEmpathyElement === null) {\n return;\n }\n\n postEmpathyElement.addEventListener(\"click\", function () {\n let commentId = postEmpathyElement.dataset.commentId;\n\n // 画像の拡大\n let imageElement = postEmpathyElement.querySelector(\n \".material-icons-outlined\"\n );\n imageElement.classList.add(\"animate\");\n\n setTimeout(() => {\n imageElement.classList.remove(\"animate\");\n }, 1000);\n\n if (window.navigator.vibrate !== undefined) {\n window.navigator.vibrate(50);\n }\n\n commentEmpathyElement.classList.remove(\"not-empathy\");\n\n let empathyCountElement = commentEmpathyElement.querySelector(\".count\");\n empathyCountElement.innerHTML =\n parseInt(empathyCountElement.innerHTML) + 1;\n\n let url = \"/api/comments/\" + commentId + \"/empathies\";\n\n return fetch(url, {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: {\n \"Content-Type\": \"application/json\"\n }\n }).then(response => { });\n });\n });\n});\n","document.addEventListener(\"DOMContentLoaded\", function(event) {\n let isExist = document.getElementById(\"js-layout-filter-search\");\n\n if (isExist == null) {\n return;\n }\n\n let isNowSmarthone = undefined;\n\n function updateResize() {\n let smartphonePosition = document.getElementById(\"smartphone-position\");\n let desktopPosition = document.getElementById(\"desktop-position\");\n let targetElement = document.querySelector(\".target-element\");\n\n if (\n smartphonePosition == null ||\n desktopPosition == null ||\n targetElement == null\n ) {\n return;\n }\n\n let isSmartPhone = app.isSmartPhone();\n\n if (isNowSmarthone == isSmartPhone) {\n return;\n }\n\n if (isSmartPhone) {\n smartphonePosition.appendChild(targetElement);\n } else {\n desktopPosition.appendChild(targetElement);\n }\n isNowSmarthone = isSmartPhone;\n }\n\n window.addEventListener(\n \"resize\",\n function() {\n updateResize();\n },\n { passive: true }\n );\n\n updateResize();\n});\n","document.addEventListener(\"DOMContentLoaded\", function (event) {\n // data-tracking-on-clickが設定されている要素がクリックされたときに実行する\n document.querySelectorAll('[data-tracking-on-click]').forEach(function (element) {\n element.addEventListener('click', function (event) {\n const attributeText = element.getAttribute(\"data-tracking-on-click\") || \"\";\n const category = element.getAttribute(\"data-category\") || \"undefined\";\n const label = element.getAttribute(\"data-label\") || attributeText;\n const value = element.getAttribute(\"data-value\") || 1;\n\n gtag('event', 'click', { 'event_category': category, 'event_label': label, 'value': value })\n // console.log('event', 'click', { 'event_category': category, 'event_label': label, 'value': value })\n });\n\n });\n\n // data-tracking-on-viewが設定されている要素が表示されたときに実行する\n const observer = new IntersectionObserver(function (entries, observer) {\n entries.forEach(function (entry) {\n if (entry.isIntersecting) {\n var attributeText = entry.target.getAttribute('data-tracking-on-view') || \"\";\n const category = entry.target.getAttribute(\"data-category\") || \"undefined\";\n const label = entry.target.getAttribute(\"data-label\") || attributeText;\n\n if (attributeText !== \"\") {\n gtag('event', 'impression', { 'event_category': category, 'event_label': label })\n // console.log('event', 'impression', { 'event_category': category, 'event_label': label })\n }\n\n observer.unobserve(entry.target);\n }\n });\n }, { rootMargin: \"0px\", threshold: 1 });\n\n document.querySelectorAll('[data-tracking-on-view]').forEach(function (element) {\n observer.observe(element);\n });\n});\n","document.addEventListener(\"DOMContentLoaded\", function (event) {\n\n const twitterTweetElemnets = document.querySelectorAll('.twitter-tweet');\n\n if (twitterTweetElemnets.length === 0) {\n return;\n }\n\n // Twitter Tweet\n twitterTweetElemnets.forEach(function (node) {\n let parentNode = document.createElement('div');\n parentNode.className = 'embed-twitter';\n node.parentNode.insertBefore(parentNode, node);\n parentNode.appendChild(node);\n node.classList.replace('twitter-tweet', 'lazy-tweet');\n });\n\n const lazyTwitterTweetElemnets = document.getElementsByClassName('lazy-tweet');\n\n if (lazyTwitterTweetElemnets.length !== 0) {\n Defer.js('https://platform.twitter.com/widgets.js', 'twitter-js', 700, function () {\n Defer.dom('.lazy-tweet', 0, null, function (node) {\n node.className = 'twitter-tweet';\n twttr.widgets.load(node.parentNode);\n }, { rootMargin: \"150% 0%\" });\n });\n }\n});\n\n","document.addEventListener(\"DOMContentLoaded\", function(event) {\n let isExist = document.getElementById(\"js-layout-profiles\");\n\n if (isExist == null) {\n return;\n }\n\n let isNowSmarthone = undefined;\n\n function updateResize() {\n let smartphoneProfileInfo = document.getElementById(\n \"smartphone-profile-info\"\n );\n let desktopProfileInfo = document.getElementById(\"desktop-profile-info\");\n let profileModule = document.querySelector(\".profiles-user-module\");\n\n if (\n smartphoneProfileInfo == null ||\n desktopProfileInfo == null ||\n profileModule == null\n ) {\n return;\n }\n\n let isSmartPhone = app.isSmartPhone();\n\n if (isNowSmarthone == isSmartPhone) {\n return;\n }\n\n if (isSmartPhone) {\n smartphoneProfileInfo.appendChild(profileModule);\n } else {\n desktopProfileInfo.appendChild(profileModule);\n }\n isNowSmarthone = isSmartPhone;\n }\n\n window.addEventListener(\n \"resize\",\n function() {\n updateResize();\n },\n { passive: true }\n );\n\n updateResize();\n});\n","document.addEventListener(\"DOMContentLoaded\", function (event) {\n let isExist = document.getElementById(\"js-layout-boards\");\n\n if (isExist == null) {\n return;\n }\n\n let isNowSmarthone = undefined;\n\n\n function updateResize() {\n let isSmartPhone = app.isSmartPhone();\n if (isNowSmarthone == isSmartPhone) {\n return;\n }\n\n updateBoardInfoPosition();\n updateActionsPosition();\n updateStoresPosition();\n\n isNowSmarthone = isSmartPhone;\n\n }\n\n function updateBoardInfoPosition() {\n let desktopBoardInfoElement = document.querySelector(\"#desktop-board-info\");\n let smartphoneBoardInfoElement = document.querySelector(\"#smartphone-board-info\")\n let boardInfoElement = document.querySelector(\".board-info-components\");\n\n if (\n desktopBoardInfoElement == null ||\n smartphoneBoardInfoElement == null ||\n boardInfoElement == null\n ) {\n return;\n }\n\n if (app.isSmartPhone()) {\n smartphoneBoardInfoElement.appendChild(boardInfoElement);\n } else {\n desktopBoardInfoElement.appendChild(boardInfoElement);\n }\n }\n\n function updateActionsPosition() {\n let desktopPostionElement = document.querySelector(\".board-actions-desktop-partial\")\n let smartphonePostionElement = document.querySelector(\".board-actions-smartphone-partial\")\n let actionsElement = document.querySelector(\".board-actions-components\");\n\n if (\n desktopPostionElement == null ||\n smartphonePostionElement == null ||\n actionsElement == null\n ) {\n return;\n }\n\n if (app.isSmartPhone()) {\n smartphonePostionElement.appendChild(actionsElement);\n } else {\n desktopPostionElement.appendChild(actionsElement);\n }\n\n }\n\n function updateStoresPosition() {\n let desktopPostionElement = document.querySelector(\".board-stores-desktop-partial\")\n let smartphonePostionElement = document.querySelector(\".board-stores-smartphone-partial\")\n let storesElement = document.querySelector(\".board-stores-module\");\n\n if (\n desktopPostionElement == null ||\n smartphonePostionElement == null ||\n storesElement == null\n ) {\n return;\n }\n\n if (app.isSmartPhone()) {\n smartphonePostionElement.appendChild(storesElement);\n } else {\n desktopPostionElement.appendChild(storesElement);\n }\n\n }\n\n window.addEventListener(\n \"resize\",\n function () {\n updateResize();\n },\n { passive: true }\n );\n\n updateResize();\n});\n","document.addEventListener(\"DOMContentLoaded\", function (event) {\n let isExist = document.getElementById(\"js-layout-topics\");\n\n if (isExist == null) {\n return;\n }\n\n let isNowSmarthone = undefined;\n\n function updateResize() {\n let smartphoneBoardInfo = document.getElementById(\"smartphone-board-info\");\n let desktopBoardInfo = document.getElementById(\"desktop-board-info\");\n let boardInfo = document.querySelector(\".board-info-topic-components\");\n\n if (\n smartphoneBoardInfo == null ||\n desktopBoardInfo == null ||\n boardInfo == null\n ) {\n return;\n }\n\n let isSmartPhone = app.isSmartPhone();\n\n if (isNowSmarthone == isSmartPhone) {\n return;\n }\n\n if (isSmartPhone) {\n smartphoneBoardInfo.appendChild(boardInfo);\n } else {\n desktopBoardInfo.appendChild(boardInfo);\n }\n isNowSmarthone = isSmartPhone;\n }\n\n window.addEventListener(\n \"resize\",\n function () {\n updateResize();\n },\n { passive: true }\n );\n\n updateResize();\n});\n","document.addEventListener(\"DOMContentLoaded\", function(event) {\n const swiperClass = document.querySelectorAll(\n \".manba-magazines-pickup-partial.swiper\"\n );\n if (swiperClass.length == 0) {\n return;\n }\n\n const swiper = new Swiper(\".manba-magazines-pickup-partial.swiper\", {\n // Optional parameters\n loop: true,\n mousewheel: true,\n slidesPerView: 1.5,\n spaceBetween: 8,\n breakpoints: {\n 1200: {\n slidesPerView: 2.5,\n spaceBetween: 50\n }\n },\n centeredSlides: true,\n initialSlide: 0,\n\n // If we need pagination\n pagination: {\n el: \".swiper-pagination\",\n clickable: true\n },\n\n autoplay: {\n delay: 5000\n }\n });\n});\n","document.addEventListener(\"DOMContentLoaded\", function (event) {\n \"use strict\";\n const elements = document.querySelectorAll(\".board-sp-main-module\");\n\n if (elements == null) {\n return;\n }\n\n elements.forEach(element => {\n const boardElement = element.querySelector(\".board-sp-main\");\n const backgroundImageUrl = boardElement.getAttribute(\"data-background-image-url\");\n boardElement.style.setProperty('--custom-bg-image', `url(${backgroundImageUrl})`);\n });\n});\n","document.addEventListener(\"DOMContentLoaded\", function(event) {\n \"use strict\";\n\n const boardMetadataSummaryModules = document.querySelectorAll(\n \".board-metadata-summary-module\"\n );\n if (boardMetadataSummaryModules.length == 0) {\n return;\n }\n\n const summaryReadmoreModules = document.querySelectorAll(\".summary-readmore\");\n if (summaryReadmoreModules.length == 0) {\n return;\n }\n\n boardMetadataSummaryModules.forEach(element => {\n let summary = element.getElementsByClassName(\"summary\")[0];\n let readMore = element.getElementsByClassName(\"summary-readmore\")[0];\n\n readMore.addEventListener(\"click\", function() {\n summary.style.maxHeight = \"none\";\n summary.style.overflow = \"none\";\n readMore.style.display = \"none\";\n });\n });\n});\n","document.addEventListener(\"DOMContentLoaded\", function (event) {\n \"use strict\";\n let module = document.querySelector(\".footer-function-menu-communicate-dialog-module\");\n\n if (module == null) {\n return;\n }\n\n let floatingMenuButtonElement = document.querySelector(\".communicate-function-menu-item\");\n let floatingMenuDialogElement = module.querySelector(\".footer-function-menu-communicate\");\n\n floatingMenuDialogElement.addEventListener('click', (event) => {\n if (event.target.closest('.footer-function-menu-communicate-contents') === null) {\n event.stopPropagation();\n floatingMenuDialogElement.close();\n }\n });\n\n floatingMenuButtonElement.addEventListener('click', (event) => {\n floatingMenuDialogElement.showModal();\n\n const focusedElement = document.activeElement;\n\n if (focusedElement !== null) {\n focusedElement.blur();\n }\n });\n\n});\n","document.addEventListener(\"DOMContentLoaded\", function (event) {\n \"use strict\";\n let module = document.querySelector(\".footer-function-menu-discover-dialog-module\");\n\n if (module == null) {\n return;\n }\n\n let floatingMenuButtonElement = document.querySelector(\".discover-function-menu-item\");\n let floatingMenuDialogElement = module.querySelector(\".footer-function-menu-discover\");\n\n floatingMenuDialogElement.addEventListener('click', (event) => {\n if (event.target.closest('.footer-function-menu-discover-contents') === null) {\n event.stopPropagation();\n floatingMenuDialogElement.close();\n }\n });\n\n floatingMenuButtonElement.addEventListener('click', (event) => {\n floatingMenuDialogElement.showModal();\n\n const focusedElement = document.activeElement;\n\n if (focusedElement !== null) {\n focusedElement.blur();\n }\n });\n\n});\n","document.addEventListener(\"DOMContentLoaded\", function (event) {\n \"use strict\";\n let module = document.querySelector(\".footer-function-menu-read-dialog-module\");\n\n if (module == null) {\n return;\n }\n\n let floatingMenuButtonElement = document.querySelector(\".read-function-menu-item\");\n let floatingMenuDialogElement = module.querySelector(\".footer-function-menu-read\");\n\n floatingMenuDialogElement.addEventListener('click', (event) => {\n if (event.target.closest('.footer-function-menu-read-contents') === null) {\n event.stopPropagation();\n floatingMenuDialogElement.close();\n }\n });\n\n floatingMenuButtonElement.addEventListener('click', (event) => {\n floatingMenuDialogElement.showModal();\n\n const focusedElement = document.activeElement;\n\n if (focusedElement !== null) {\n focusedElement.blur();\n }\n });\n\n});\n","\ndocument.addEventListener(\"DOMContentLoaded\", function(event) {\n \"use strict\";\n let modules = document.querySelectorAll(\".free-spaces-pager-select-module\");\n if (modules.length === 0) {\n return;\n }\n\n let initPagerSelect = element => {\n let selectTagElement = element.querySelector(\".free-spaces-pager-select select\");\n\n selectTagElement.addEventListener(\"change\", function(event) {\n let redirectUrl = event.target.value\n location.href = redirectUrl;\n });\n };\n\n let initState = () => {\n modules.forEach(element => {\n initPagerSelect(element);\n });\n };\n\n initState();\n\n});\n","document.addEventListener(\"DOMContentLoaded\", function(event) {\n \"use strict\";\n\n let isExist = document.getElementsByClassName(\"manba-magazines-pickup-author\")\n .length;\n\n if (isExist == false) {\n return;\n }\n\n let modules = document.querySelectorAll(\".manba-magazines-pickup-author\");\n modules.forEach(element => {\n let description = element.getElementsByClassName(\"description\")[0];\n let readMore = element.getElementsByClassName(\"description-readmore\")[0];\n\n readMore.addEventListener(\"click\", function() {\n description.style.height = \"auto\";\n description.style.overflow = \"none\";\n readMore.style.display = \"none\";\n });\n });\n});\n","document.addEventListener(\"DOMContentLoaded\", function (event) {\n \"use strict\";\n\n let menuButton = document.querySelector(\n \".smartphone-header .smartphone-header-item-left .smartphone-header-item-menu\"\n );\n let headerMenu = document.querySelector(\".smartphone-header-menu\");\n let menuCloseButton = document.querySelector(\n \".smartphone-header-menu #js-smartphone-header-close\"\n );\n let header = document.querySelector(\"header\");\n\n if (!menuButton || !headerMenu || !menuCloseButton || !header) {\n return;\n }\n\n menuButton.addEventListener(\"click\", function (event) {\n event.preventDefault();\n window.scrollTo(0, 0);\n\n headerMenu.classList.add(\"open\");\n menuButton.classList.add(\"close\");\n header.classList.add(\"open\");\n });\n\n menuCloseButton.addEventListener(\"click\", function (event) {\n event.preventDefault();\n headerMenu.classList.remove(\"open\");\n menuButton.classList.remove(\"close\");\n header.classList.remove(\"open\");\n });\n\n let lastScrollTop = 0;\n let ticking = false;\n let isScrolling = false;\n let scrollTimeout;\n\n function handleScroll() {\n const scrollTop = Math.ceil(document.documentElement.scrollTop);\n if (!ticking) {\n window.requestAnimationFrame(function () {\n if (scrollTop > lastScrollTop) {\n header.classList.add('hidden');\n } else {\n header.classList.remove('hidden');\n }\n lastScrollTop = scrollTop <= 0 ? 0 : scrollTop;\n ticking = false;\n });\n ticking = true;\n }\n isScrolling = true;\n\n clearTimeout(scrollTimeout);\n\n scrollTimeout = setTimeout(function () {\n isScrolling = false;\n header.classList.remove('hidden');\n }, 200);\n }\n\n window.addEventListener('scroll', handleScroll);\n\n});\n","document.addEventListener(\"DOMContentLoaded\", function (event) {\n const anchorLinks = document.querySelectorAll('a[href^=\"#\"]');\n const anchorLinksArr = Array.prototype.slice.call(anchorLinks);\n let calcHeaderHeight = () => {\n return app.isSmartPhone() ? 55 : 70;\n };\n\n let scrollToHash = targetId => {\n const targetElement = document.querySelector(targetId);\n const targetOffsetTop =\n window.scrollY +\n targetElement.getBoundingClientRect().top\n window.scrollTo({\n top: targetOffsetTop,\n behavior: \"smooth\"\n });\n };\n\n var urlHash = location.hash; //URLのハッシュタグを取得\n if (urlHash) {\n //ハッシュタグが有る\n setTimeout(function () {\n //無くてもいいが有ると動作が安定する\n scrollToHash(urlHash);\n }, 0);\n }\n\n anchorLinksArr.forEach(link => {\n link.addEventListener(\"click\", e => {\n e.preventDefault();\n const targetId = link.hash;\n scrollToHash(targetId);\n });\n });\n});\n","document.addEventListener(\"DOMContentLoaded\", function (event) {\n \"use strict\";\n const elements = document.querySelectorAll(\".pr-board-module\");\n if (elements == null) {\n return;\n }\n\n elements.forEach(element => {\n const boardElement = element.querySelector(\".pr-board\");\n const backgroundImageUrl = boardElement.getAttribute(\"data-background-image-url\");\n boardElement.style.setProperty('--custom-bg-image', `url(${backgroundImageUrl})`);\n });\n});\n","document.addEventListener(\"DOMContentLoaded\", function (event) {\n \"use strict\";\n const elements = document.querySelectorAll(\".pr-small-board-module\");\n if (elements == null) {\n return;\n }\n\n elements.forEach(element => {\n const boardElement = element.querySelector(\".pr-board\");\n const backgroundImageUrl = boardElement.getAttribute(\"data-background-image-url\");\n boardElement.style.setProperty('--custom-bg-image', `url(${backgroundImageUrl})`);\n });\n});\n","document.addEventListener(\"DOMContentLoaded\", function (event) {\n \"use strict\";\n\n let topModuleElement = document.querySelector(\".profiles-user-module\");\n if (topModuleElement == null) {\n return;\n }\n\n let desciptionElement = document.querySelector(\".user-profile-desciption\");\n if (desciptionElement == null) {\n return;\n }\n\n let desciptionReadmoreElements = document.querySelectorAll(\".profile-desciption-readmore\");\n if (desciptionReadmoreElements == null) {\n return;\n }\n\n desciptionReadmoreElements.forEach(element => {\n element.addEventListener(\"click\", function () {\n desciptionElement.style.maxHeight = \"none\";\n desciptionElement.style.overflow = \"none\";\n element.style.display = \"none\";\n });\n });\n});\n","document.addEventListener(\"DOMContentLoaded\", function (event) {\n const targetElement = document.querySelector(\".search-result-tabs-module\");\n if (targetElement == null) {\n return;\n }\n\n const selectedTabName = document.getElementsByName(\"manba-meta-search-result-tab-name\").item(0).content;\n const tabElements = targetElement.querySelectorAll(\".result-tab\")\n const target = targetElement.querySelector(\".result-tabs\");\n let scrollLeft = 0;\n\n for (const tabElement of tabElements) {\n const tabName = tabElement.dataset.tabName;\n\n if (tabName === selectedTabName) {\n break; // 一致したらループを抜ける\n }\n\n scrollLeft += tabElement.clientWidth;\n }\n\n target.scrollLeft = scrollLeft;\n\n});\n\n\n\n","document.addEventListener(\"DOMContentLoaded\", () => {\n\n const stickyHeaders = (() => {\n let stickies;\n const fixedSmartphoneHeaderHeight = 40;\n\n const load = (stickiesSelector) => {\n stickies = document.querySelectorAll(stickiesSelector);\n if (stickies.length > 0) {\n [...stickies].forEach((sticky) => {\n const wrap = document.createElement('div');\n wrap.className = 'followWrap';\n sticky.parentNode.insertBefore(wrap, sticky);\n wrap.appendChild(sticky);\n\n const stickyRect = sticky.getBoundingClientRect();\n\n sticky.dataset.originalPosition = parseInt(stickyRect.top + window.scrollY - fixedSmartphoneHeaderHeight, 10);\n\n sticky.dataset.originalHeight = sticky.offsetHeight;\n wrap.style.height = `${sticky.offsetHeight}px`;\n });\n\n window.removeEventListener(\"scroll\", whenScrolling);\n window.addEventListener(\"scroll\", whenScrolling);\n }\n };\n\n const whenScrolling = () => {\n [...stickies].forEach((sticky, i) => {\n const stickyPosition = parseInt(sticky.dataset.originalPosition, 10);\n if (stickyPosition <= window.scrollY) {\n const nextSticky = stickies[i + 1];\n\n const stickyHeight = parseInt(sticky.dataset.originalHeight, 10);\n const nextStickyPosition = nextSticky ? parseInt(nextSticky.dataset.originalPosition, 10) - stickyHeight : 0;\n\n sticky.classList.add(\"fixed\");\n if (nextSticky && sticky.getBoundingClientRect().top >= nextStickyPosition) {\n sticky.classList.add(\"absolute\");\n sticky.style.top = `${nextStickyPosition}px`;\n }\n\n const pageMainElement = document.querySelector(\".manba-main-page-container\");\n var clientHeight = pageMainElement.clientHeight;\n\n if (window.scrollY >= clientHeight) {\n sticky.classList.remove(\"fixed\");\n }\n\n } else {\n const prevSticky = stickies[i - 1];\n sticky.classList.remove(\"fixed\");\n\n if (prevSticky && window.scrollY <= stickyPosition - parseInt(sticky.dataset.originalHeight, 10)) {\n prevSticky.classList.remove(\"absolute\");\n prevSticky.style.removeProperty(\"top\");\n }\n }\n });\n };\n\n return {\n load\n };\n })();\n\n if (app.isSmartPhone()) {\n stickyHeaders.load(\".sticky-caption\");\n }\n\n});\n","\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n \"use strict\";\n\n let smaprtphonePositonElement = document.querySelector(\".smartphone-comment-form-position\");\n if (smaprtphonePositonElement == null) {\n return;\n }\n\n let desktopePositonElement = document.querySelector(\".desktop-comment-form-position\");\n if (desktopePositonElement == null) {\n return;\n }\n\n let commentFormElement = document.querySelector(\"#post-comment-form\");\n if (commentFormElement == null) {\n return;\n }\n\n let isNowSmarthone = undefined;\n\n function changePosition() {\n let isSmartPhone = app.isSmartPhone();\n\n if (isNowSmarthone == isSmartPhone) {\n return;\n }\n\n if (isSmartPhone) {\n smaprtphonePositonElement.appendChild(commentFormElement);\n } else {\n desktopePositonElement.appendChild(commentFormElement);\n }\n isNowSmarthone = isSmartPhone;\n }\n\n window.addEventListener(\n \"resize\",\n function () {\n changePosition();\n },\n { passive: true }\n );\n\n changePosition();\n});\n","document.addEventListener(\"DOMContentLoaded\", function (event) {\n \"use strict\";\n\n return;\n\n let module = document.querySelector(\".user-board-lists-thanks-share\");\n if (module === null) {\n return;\n }\n\n let loadingImageElement = module.querySelector(\".share-image .loading-image\");\n let popImageElement = module.querySelector(\".share-image .pop-image\");\n\n let popImage = popImageElement.querySelector(\"img\");\n popImage.addEventListener(\"load\", e => {\n loadingImageElement.style.display = \"none\";\n popImageElement.style.display = \"block\";\n });\n});\n","document.addEventListener(\"DOMContentLoaded\", function(event) {\n \"use strict\";\n\n let module = document.querySelector(\".user-board-list-share-icon\");\n if (module === null) {\n return;\n }\n\n if (!navigator.canShare) {\n return;\n }\n\n module.style.display = \"flex\";\n\n let iconModule = document.querySelector(\n \".user-board-list-share-icon .icon-with-bottom-text-module\"\n );\n if (iconModule === null) {\n return;\n }\n\n let titleText = document.querySelector(\"title\").innerText;\n let descriptionText = document.querySelector(\"[name=description][content]\")\n .content;\n let urlText = location.href;\n\n const shareData = {\n title: titleText,\n text: descriptionText,\n url: urlText\n };\n\n iconModule.addEventListener(\"click\", async () => {\n try {\n await navigator.share(shareData);\n } catch (err) {\n console.log(err);\n }\n });\n});\n","document.addEventListener(\"DOMContentLoaded\", function (event) {\n\t\"use strict\";\n\n\tlet module = document.getElementById('users-notification-select-box')\n\n\tif (module === null) {\n\t\treturn;\n\t}\n\n\tdocument.getElementById('users-notification-select-box').addEventListener('change', function () {\n\t\t// 現在のページのパスを取得\n\t\tconst currentPagePath = window.location.pathname;\n\n\t\t// 追加したいURLパラメータ\n\t\tconst params = {\n\t\t\tselected_type: this.value\n\t\t};\n\n\t\t// URLパラメータを文字列に変換\n\t\tconst queryString = Object.keys(params).map(key =>\n\t\t\t`${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`\n\t\t).join('&');\n\n\t\t// パスとクエリ文字列を組み合わせる\n\t\tconst newUrl = `${currentPagePath}?${queryString}`;\n\n\t\twindow.location.href = newUrl;\n\n\t});\n});\n","document.addEventListener(\"DOMContentLoaded\", function(event) {\n \"use strict\";\n\n const element = document.querySelectorAll(\".user-settings-resign\");\n if (element.length == 0) {\n return;\n }\n\n let modules = document.querySelectorAll(\".user-settings-resign\");\n\n modules.forEach(element => {\n let resignButton = element.getElementsByClassName(\n \"user-settings-resign-button\"\n )[0];\n resignButton.addEventListener(\"click\", function() {\n let api_resign = \"/api/me/resign\";\n const result = confirm(\"退会してよろしいですか?\");\n if (result === true) {\n return fetch(api_resign, {\n method: \"DELETE\",\n credentials: \"same-origin\"\n })\n .then(response => {})\n .then(result => {\n location.href = \"/\";\n });\n }\n });\n });\n});\n","document.addEventListener(\"DOMContentLoaded\", function(event) {\n \"use strict\";\n\n const element = document.querySelectorAll(\".users-settings-profile-module\");\n if (element.length == 0) {\n return;\n }\n\n const openFileDialog = () => {\n let fileSelector = document.querySelector(\"input.file-field\");\n let iconProfileImage = document.querySelector(\n \".user-settings-profile-icon-image img\"\n );\n\n fileSelector.addEventListener(\"change\", function(e) {\n let files = e.target.files;\n\n for (var i = 0, file; (file = files[i]); i++) {\n if (!file.type.match(\"image.*\")) {\n continue;\n }\n\n var reader = new FileReader();\n\n reader.onload = (function(f) {\n return function(e) {\n try {\n iconProfileImage.src = e.target.result;\n } catch (e) {}\n };\n })(file);\n\n reader.readAsDataURL(file);\n\n return;\n }\n });\n\n fileSelector.click();\n };\n\n let imageSelector = document.querySelector(\n \".user-settings-profile-icon-file\"\n );\n let imageSelectorImage = document.querySelector(\n \".user-settings-profile-icon-image\"\n );\n\n imageSelector.addEventListener(\"click\", function(event) {\n openFileDialog();\n });\n\n imageSelectorImage.addEventListener(\"click\", function(event) {\n openFileDialog();\n });\n\n let userSettingPublicCheckBox = document.querySelector(\n \"input[type='checkbox'][name='user_setting[public]']#user_setting_public \"\n );\n\n const updateUserSettingPublic = () => {\n let userSettingPublicContent = document.querySelector(\n \".user-settings-public\"\n );\n let userSettingPublicPageView = document.querySelector(\n \".user-settings-public-page-preview\"\n );\n\n if (userSettingPublicCheckBox.checked == true) {\n userSettingPublicContent.classList.remove(\"private\");\n userSettingPublicPageView.style.display = \"block\";\n } else {\n userSettingPublicContent.classList.add(\"private\");\n userSettingPublicPageView.style.display = \"none\";\n }\n };\n\n userSettingPublicCheckBox.addEventListener(\"change\", () => {\n updateUserSettingPublic();\n });\n updateUserSettingPublic();\n});\n","document.addEventListener(\"DOMContentLoaded\", function (event) {\n\t\"use strict\";\n\n\tlet modules = document.querySelectorAll(\".year-month-select-box-module\");\n\n\tif (modules.length === 0) {\n\t\treturn;\n\t}\n\n\tdocument.getElementById('year-month-select-box-links').addEventListener('change', function () {\n\t\twindow.location.href = this.value || '';\n\t});\n});\n","document.addEventListener(\"DOMContentLoaded\", function (event) {\n if (!app.inLayout(\"application-redirects\")) {\n return;\n }\n\n const redirectElement = document.querySelector(\"#redirect_url a\");\n\n if (redirectElement) {\n const redirectUrl = redirectElement.href;\n //setTimeout(() => {\n window.location.href = redirectUrl;\n //}, 5000);\n }\n\n});\n","document.addEventListener(\"DOMContentLoaded\", function(event) {\n const element = document.querySelectorAll(\".sns-share-module\");\n if (element.length == 0) {\n return;\n }\n\n let modules = document.querySelectorAll(\".sns-share-module\");\n\n async function copyToClipboard(text, button) {\n try {\n await navigator.clipboard.writeText(text);\n button.classList.add(\"copied\");\n const copyText = button.getElementsByClassName(\"text\")[0];\n copyText.innerText = \"コピーしました\";\n } catch (error) {\n button.innerText = \"失敗しました\";\n }\n }\n\n modules.forEach(element => {\n let urlCopyButton = element.getElementsByClassName(\"url-copy-button\")[0];\n let url = urlCopyButton.dataset.url;\n urlCopyButton.addEventListener(\"click\", function() {\n copyToClipboard(url, urlCopyButton);\n });\n });\n});\n","document.addEventListener(\"DOMContentLoaded\", function(event) {\n const swiperClass = document.querySelectorAll(\".sub-navigation-module\");\n if (swiperClass.length == 0) {\n return;\n }\n\n const subNavigationIndex = document\n .getElementsByName(\"manba-meta-sub-navigation-index\")\n .item(0).content;\n const target = document.getElementById(\"sub-navigation\");\n target.scrollLeft += 75 * parseInt(subNavigationIndex, 10);\n});\n","document.addEventListener(\"DOMContentLoaded\", function(event) {\n if (!app.inLayout(\"application-affiliates\")) {\n return;\n }\n let isExist = document.getElementById(\"js-vc-link-switch\");\n\n if (isExist == null) {\n return;\n }\n\n let count = 0;\n\n const intervalId = setInterval(() => {\n let affiliateUrl = document\n .getElementById(\"affiliate_url\")\n .children[0].getAttribute(\"href\");\n // http://dalr.valuecommerce.com/dck/5cf5181e8a?pid=885844570&sid=3444601&aid=2698580&mid=3157520\n\n if (affiliateUrl.includes(\"valuecommerce.com\")) {\n clearInterval(intervalId);\n location.href = affiliateUrl;\n }\n\n if (count > 5) {\n clearInterval(intervalId);\n }\n count++;\n }, 500);\n});\n","document.addEventListener(\"DOMContentLoaded\", function (event) {\n if (!app.inLayout(\"application-affiliates\")) {\n return;\n }\n\n const affiliateElement = document.querySelector(\"#affiliate_url a\");\n\n if (affiliateElement) {\n const redirectUrl = affiliateElement.href;\n //setTimeout(() => {\n window.location.href = redirectUrl;\n //}, 5000);\n }\n});\n","document.addEventListener(\"DOMContentLoaded\", function(event) {\n if (!app.inLayout(\"application-affiliates\")) {\n return;\n }\n\n let topElement = document.querySelector(\".valuecommerce-logo-partial\");\n\n let href = topElement.querySelector(\"a\").href;\n location.href = href\n\n});\n","document.addEventListener(\"DOMContentLoaded\", function(event) {\n \"use strict\";\n\n let modules = document.querySelectorAll(\".want-to-recalls-comment-module\");\n\n if (modules.length == 0) {\n return;\n }\n\n modules.forEach(element => {\n let resolvedCommentButton = element.getElementsByClassName(\n \"resolved-comment-button\"\n )[0];\n const resolvedCommentId = resolvedCommentButton.dataset.resolvedCommentId;\n let url = \"/api/want_to_recall/resolved_comments/\" + resolvedCommentId;\n\n return fetch(url, {\n method: \"GET\",\n credentials: \"same-origin\"\n })\n .then(function(response) {\n return response.json();\n })\n .then(function(json) {\n if (json.owned == true) {\n resolvedCommentButton.style.display = \"block\";\n }\n });\n });\n\n function checkResolved(modules) {\n for (let i = 0; i < modules.length; i++) {\n let element = modules[i];\n let resolvedCommentButton = element.getElementsByClassName(\n \"resolved-comment-button\"\n )[0];\n\n if (resolvedCommentButton.classList.contains(\"resolved\")) {\n return true;\n }\n }\n return false;\n }\n\n const toggleResolvedComment = targetResolvedComment => {\n let execute = true;\n let hasResolved = checkResolved(modules);\n for (let i = 0; i < modules.length; i++) {\n let element = modules[i];\n let resolvedCommentButton = element.getElementsByClassName(\n \"resolved-comment-button\"\n )[0];\n const resolvedCommentId = resolvedCommentButton.dataset.resolvedCommentId;\n\n if (targetResolvedComment.dataset.resolvedCommentId === resolvedCommentId) {\n if (targetResolvedComment.classList.contains(\"resolved\")) {\n const result = confirm(\"「未解決」に戻しますか?\");\n if (result === false) {\n execute = false;\n return execute;\n }\n resolvedCommentButton.classList.remove(\"resolved\");\n } else {\n if (hasResolved) {\n alert(\"先に解決済みコメントを「未解決」にしてください\")\n execute = false;\n return execute;\n }\n const result = confirm(\"このコメントで解決済みにしますか?\");\n if (result === false) {\n execute = false;\n return execute;\n }\n resolvedCommentButton.classList.add(\"resolved\");\n }\n }\n }\n\n return execute;\n };\n\n modules.forEach(element => {\n let resolvedCommentButton = element.getElementsByClassName(\n \"resolved-comment-button\"\n )[0];\n const resolvedCommentId = resolvedCommentButton.dataset.resolvedCommentId;\n let url = \"/api/want_to_recall/resolved_comments/\" + resolvedCommentId;\n\n resolvedCommentButton.addEventListener(\"click\", function() {\n let res = toggleResolvedComment(resolvedCommentButton);\n if (res == false) {\n return;\n }\n\n return fetch(url, {\n method: \"PATCH\",\n credentials: \"same-origin\",\n body: JSON.stringify({\n id: resolvedCommentId\n })\n })\n .then(response => {\n return response.json();\n })\n .then(function(json) {\n if (json.resolved == true) {\n const resolvedTopic = document.getElementById(\n \"js-want-to-recalls-resolved-topic\"\n );\n const resolvedTopicId = resolvedTopic.dataset.topicId;\n const redirectUrl =\n \"/want_to_recall/\" + resolvedTopicId + \"/resolved_thanks\";\n location.href = redirectUrl;\n } else {\n location.reload();\n }\n });\n });\n });\n});\n\nwindow.addEventListener(\"pageshow\", function(event) {\n const perfEntries = performance.getEntriesByType(\"navigation\");\n perfEntries.forEach(function(pe) {\n switch (pe.type) {\n case \"navigate\":\n //console.log('通常のアクセス');\n break;\n case \"reload\":\n //console.log('更新によるアクセス');\n break;\n case \"back_forward\":\n location.reload();\n //console.log('戻るによるアクセス');\n break;\n case \"prerender\":\n //console.log('レンダリング前');\n break;\n }\n });\n});\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Completer = void 0;\nconst eventemitter3_1 = require(\"eventemitter3\");\nconst Strategy_1 = require(\"./Strategy\");\nclass Completer extends eventemitter3_1.EventEmitter {\n constructor(strategyPropsList) {\n super();\n this.handleQueryResult = (searchResults) => {\n this.emit(\"hit\", { searchResults });\n };\n this.strategies = strategyPropsList.map((p) => new Strategy_1.Strategy(p));\n }\n destroy() {\n this.strategies.forEach((s) => s.destroy());\n return this;\n }\n run(beforeCursor) {\n for (const strategy of this.strategies) {\n const executed = strategy.execute(beforeCursor, this.handleQueryResult);\n if (executed)\n return;\n }\n this.handleQueryResult([]);\n }\n}\nexports.Completer = Completer;\n//# sourceMappingURL=Completer.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Dropdown = exports.DEFAULT_DROPDOWN_ITEM_ACTIVE_CLASS_NAME = exports.DEFAULT_DROPDOWN_ITEM_CLASS_NAME = exports.DEFAULT_DROPDOWN_CLASS_NAME = exports.DEFAULT_DROPDOWN_PLACEMENT = exports.DEFAULT_DROPDOWN_MAX_COUNT = void 0;\nconst eventemitter3_1 = require(\"eventemitter3\");\nconst utils_1 = require(\"./utils\");\n// Default constants for Dropdown\nexports.DEFAULT_DROPDOWN_MAX_COUNT = 10;\nexports.DEFAULT_DROPDOWN_PLACEMENT = \"auto\";\nexports.DEFAULT_DROPDOWN_CLASS_NAME = \"dropdown-menu textcomplete-dropdown\";\n// Default constants for DropdownItem\nexports.DEFAULT_DROPDOWN_ITEM_CLASS_NAME = \"textcomplete-item\";\nexports.DEFAULT_DROPDOWN_ITEM_ACTIVE_CLASS_NAME = `${exports.DEFAULT_DROPDOWN_ITEM_CLASS_NAME} active`;\nclass Dropdown extends eventemitter3_1.EventEmitter {\n static create(option) {\n const ul = document.createElement(\"ul\");\n ul.className = option.className || exports.DEFAULT_DROPDOWN_CLASS_NAME;\n Object.assign(ul.style, {\n display: \"none\",\n position: \"absolute\",\n zIndex: \"1000\",\n }, option.style);\n const parent = option.parent || document.body;\n parent === null || parent === void 0 ? void 0 : parent.appendChild(ul);\n return new Dropdown(ul, option);\n }\n constructor(el, option) {\n super();\n this.el = el;\n this.option = option;\n this.shown = false;\n this.items = [];\n this.activeIndex = null;\n }\n /**\n * Render the given search results. Previous results are cleared.\n *\n * @emits render\n * @emits rendered\n */\n render(searchResults, cursorOffset) {\n const event = (0, utils_1.createCustomEvent)(\"render\", { cancelable: true });\n this.emit(\"render\", event);\n if (event.defaultPrevented)\n return this;\n this.clear();\n if (searchResults.length === 0)\n return this.hide();\n this.items = searchResults\n .slice(0, this.option.maxCount || exports.DEFAULT_DROPDOWN_MAX_COUNT)\n .map((r, index) => { var _a; return new DropdownItem(this, index, r, ((_a = this.option) === null || _a === void 0 ? void 0 : _a.item) || {}); });\n this.setStrategyId(searchResults[0])\n .renderEdge(searchResults, \"header\")\n .renderItems()\n .renderEdge(searchResults, \"footer\")\n .show()\n .setOffset(cursorOffset)\n .activate(0);\n this.emit(\"rendered\", (0, utils_1.createCustomEvent)(\"rendered\"));\n return this;\n }\n destroy() {\n var _a;\n this.clear();\n (_a = this.el.parentNode) === null || _a === void 0 ? void 0 : _a.removeChild(this.el);\n return this;\n }\n /**\n * Select the given item\n *\n * @emits select\n * @emits selected\n */\n select(item) {\n const detail = { searchResult: item.searchResult };\n const event = (0, utils_1.createCustomEvent)(\"select\", { cancelable: true, detail });\n this.emit(\"select\", event);\n if (event.defaultPrevented)\n return this;\n this.hide();\n this.emit(\"selected\", (0, utils_1.createCustomEvent)(\"selected\", { detail }));\n return this;\n }\n /**\n * Show the dropdown element\n *\n * @emits show\n * @emits shown\n */\n show() {\n if (!this.shown) {\n const event = (0, utils_1.createCustomEvent)(\"show\", { cancelable: true });\n this.emit(\"show\", event);\n if (event.defaultPrevented)\n return this;\n this.el.style.display = \"block\";\n this.shown = true;\n this.emit(\"shown\", (0, utils_1.createCustomEvent)(\"shown\"));\n }\n return this;\n }\n /**\n * Hide the dropdown element\n *\n * @emits hide\n * @emits hidden\n */\n hide() {\n if (this.shown) {\n const event = (0, utils_1.createCustomEvent)(\"hide\", { cancelable: true });\n this.emit(\"hide\", event);\n if (event.defaultPrevented)\n return this;\n this.el.style.display = \"none\";\n this.shown = false;\n this.clear();\n this.emit(\"hidden\", (0, utils_1.createCustomEvent)(\"hidden\"));\n }\n return this;\n }\n /** Clear search results */\n clear() {\n this.items.forEach((i) => i.destroy());\n this.items = [];\n this.el.innerHTML = \"\";\n this.activeIndex = null;\n return this;\n }\n up(e) {\n return this.shown ? this.moveActiveItem(\"prev\", e) : this;\n }\n down(e) {\n return this.shown ? this.moveActiveItem(\"next\", e) : this;\n }\n moveActiveItem(direction, e) {\n if (this.activeIndex != null) {\n const activeIndex = direction === \"next\"\n ? this.getNextActiveIndex()\n : this.getPrevActiveIndex();\n if (activeIndex != null) {\n this.activate(activeIndex);\n e.preventDefault();\n }\n }\n return this;\n }\n activate(index) {\n if (this.activeIndex !== index) {\n if (this.activeIndex != null) {\n this.items[this.activeIndex].deactivate();\n }\n this.activeIndex = index;\n this.items[index].activate();\n }\n return this;\n }\n isShown() {\n return this.shown;\n }\n getActiveItem() {\n return this.activeIndex != null ? this.items[this.activeIndex] : null;\n }\n setOffset(cursorOffset) {\n const doc = document.documentElement;\n if (doc) {\n const elementWidth = this.el.offsetWidth;\n if (cursorOffset.left) {\n const browserWidth = this.option.dynamicWidth\n ? doc.scrollWidth\n : doc.clientWidth;\n if (cursorOffset.left + elementWidth > browserWidth) {\n cursorOffset.left = browserWidth - elementWidth;\n }\n this.el.style.left = `${cursorOffset.left}px`;\n }\n else if (cursorOffset.right) {\n if (cursorOffset.right - elementWidth < 0) {\n cursorOffset.right = 0;\n }\n this.el.style.right = `${cursorOffset.right}px`;\n }\n let forceTop = false;\n const placement = this.option.placement || exports.DEFAULT_DROPDOWN_PLACEMENT;\n if (placement === \"auto\") {\n const dropdownHeight = this.items.length * cursorOffset.lineHeight;\n forceTop =\n cursorOffset.clientTop != null &&\n cursorOffset.clientTop + dropdownHeight > doc.clientHeight;\n }\n if (placement === \"top\" || forceTop) {\n this.el.style.bottom = `${doc.clientHeight - cursorOffset.top + cursorOffset.lineHeight}px`;\n this.el.style.top = \"auto\";\n }\n else {\n this.el.style.top = `${cursorOffset.top}px`;\n this.el.style.bottom = \"auto\";\n }\n }\n return this;\n }\n getNextActiveIndex() {\n if (this.activeIndex == null)\n throw new Error();\n return this.activeIndex < this.items.length - 1\n ? this.activeIndex + 1\n : this.option.rotate\n ? 0\n : null;\n }\n getPrevActiveIndex() {\n if (this.activeIndex == null)\n throw new Error();\n return this.activeIndex !== 0\n ? this.activeIndex - 1\n : this.option.rotate\n ? this.items.length - 1\n : null;\n }\n renderItems() {\n const fragment = document.createDocumentFragment();\n for (const item of this.items) {\n fragment.appendChild(item.el);\n }\n this.el.appendChild(fragment);\n return this;\n }\n setStrategyId(searchResult) {\n const id = searchResult.getStrategyId();\n if (id)\n this.el.dataset.strategy = id;\n return this;\n }\n renderEdge(searchResults, type) {\n const option = this.option[type];\n const li = document.createElement(\"li\");\n li.className = `textcomplete-${type}`;\n li.innerHTML =\n typeof option === \"function\"\n ? option(searchResults.map((s) => s.data))\n : option || \"\";\n this.el.appendChild(li);\n return this;\n }\n}\nexports.Dropdown = Dropdown;\nclass DropdownItem {\n constructor(dropdown, index, searchResult, props) {\n this.dropdown = dropdown;\n this.index = index;\n this.searchResult = searchResult;\n this.props = props;\n this.active = false;\n this.onClick = (e) => {\n e.preventDefault();\n this.dropdown.select(this);\n };\n this.className = this.props.className || exports.DEFAULT_DROPDOWN_ITEM_CLASS_NAME;\n this.activeClassName =\n this.props.activeClassName || exports.DEFAULT_DROPDOWN_ITEM_ACTIVE_CLASS_NAME;\n const li = document.createElement(\"li\");\n li.className = this.active ? this.activeClassName : this.className;\n const span = document.createElement(\"span\");\n span.tabIndex = -1;\n span.innerHTML = this.searchResult.render();\n li.appendChild(span);\n li.addEventListener(\"click\", this.onClick);\n this.el = li;\n }\n destroy() {\n var _a;\n const li = this.el;\n (_a = li.parentNode) === null || _a === void 0 ? void 0 : _a.removeChild(li);\n li.removeEventListener(\"click\", this.onClick, false);\n return this;\n }\n activate() {\n if (!this.active) {\n this.active = true;\n this.el.className = this.activeClassName;\n this.dropdown.el.scrollTop = this.el.offsetTop;\n }\n return this;\n }\n deactivate() {\n if (this.active) {\n this.active = false;\n this.el.className = this.className;\n }\n return this;\n }\n}\n//# sourceMappingURL=Dropdown.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Editor = void 0;\nconst eventemitter3_1 = require(\"eventemitter3\");\nconst utils_1 = require(\"./utils\");\nclass Editor extends eventemitter3_1.EventEmitter {\n /**\n * Finalize the editor object.\n *\n * It is called when associated textcomplete object is destroyed.\n */\n destroy() {\n return this;\n }\n /**\n * It is called when a search result is selected by a user.\n */\n applySearchResult(_searchResult) {\n throw new Error(\"Not implemented.\");\n }\n /**\n * The input cursor's absolute coordinates from the window's left\n * top corner.\n */\n getCursorOffset() {\n throw new Error(\"Not implemented.\");\n }\n /**\n * Editor string value from head to the cursor.\n * Returns null if selection type is range not cursor.\n */\n getBeforeCursor() {\n throw new Error(\"Not implemented.\");\n }\n /**\n * Emit a move event, which moves active dropdown element.\n * Child class must call this method at proper timing with proper parameter.\n *\n * @see {@link Textarea} for live example.\n */\n emitMoveEvent(code) {\n const moveEvent = (0, utils_1.createCustomEvent)(\"move\", {\n cancelable: true,\n detail: {\n code: code,\n },\n });\n this.emit(\"move\", moveEvent);\n return moveEvent;\n }\n /**\n * Emit a enter event, which selects current search result.\n * Child class must call this method at proper timing.\n *\n * @see {@link Textarea} for live example.\n */\n emitEnterEvent() {\n const enterEvent = (0, utils_1.createCustomEvent)(\"enter\", { cancelable: true });\n this.emit(\"enter\", enterEvent);\n return enterEvent;\n }\n /**\n * Emit a change event, which triggers auto completion.\n * Child class must call this method at proper timing.\n *\n * @see {@link Textarea} for live example.\n */\n emitChangeEvent() {\n const changeEvent = (0, utils_1.createCustomEvent)(\"change\", {\n detail: {\n beforeCursor: this.getBeforeCursor(),\n },\n });\n this.emit(\"change\", changeEvent);\n return changeEvent;\n }\n /**\n * Emit a esc event, which hides dropdown element.\n * Child class must call this method at proper timing.\n *\n * @see {@link Textarea} for live example.\n */\n emitEscEvent() {\n const escEvent = (0, utils_1.createCustomEvent)(\"esc\", { cancelable: true });\n this.emit(\"esc\", escEvent);\n return escEvent;\n }\n /**\n * Helper method for parsing KeyboardEvent.\n *\n * @see {@link Textarea} for live example.\n */\n getCode(e) {\n switch (e.keyCode) {\n case 9: // tab\n case 13: // enter\n return \"ENTER\";\n case 27: // esc\n return \"ESC\";\n case 38: // up\n return \"UP\";\n case 40: // down\n return \"DOWN\";\n case 78: // ctrl-n\n if (e.ctrlKey)\n return \"DOWN\";\n break;\n case 80: // ctrl-p\n if (e.ctrlKey)\n return \"UP\";\n break;\n }\n return \"OTHER\";\n }\n}\nexports.Editor = Editor;\n//# sourceMappingURL=Editor.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SearchResult = void 0;\nconst MAIN = /\\$&/g;\nconst PLACE = /\\$(\\d)/g;\nclass SearchResult {\n constructor(data, term, strategy) {\n this.data = data;\n this.term = term;\n this.strategy = strategy;\n }\n getReplacementData(beforeCursor) {\n let result = this.strategy.replace(this.data);\n if (result == null)\n return null;\n let afterCursor = \"\";\n if (Array.isArray(result)) {\n afterCursor = result[1];\n result = result[0];\n }\n const match = this.strategy.match(beforeCursor);\n if (match == null || match.index == null)\n return null;\n const replacement = result\n .replace(MAIN, match[0])\n .replace(PLACE, (_, p) => match[parseInt(p)]);\n return {\n start: match.index,\n end: match.index + match[0].length,\n beforeCursor: replacement,\n afterCursor: afterCursor,\n };\n }\n replace(beforeCursor, afterCursor) {\n const replacement = this.getReplacementData(beforeCursor);\n if (replacement === null)\n return;\n afterCursor = replacement.afterCursor + afterCursor;\n return [\n [\n beforeCursor.slice(0, replacement.start),\n replacement.beforeCursor,\n beforeCursor.slice(replacement.end),\n ].join(\"\"),\n afterCursor,\n ];\n }\n render() {\n return this.strategy.renderTemplate(this.data, this.term);\n }\n getStrategyId() {\n return this.strategy.getId();\n }\n}\nexports.SearchResult = SearchResult;\n//# sourceMappingURL=SearchResult.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Strategy = exports.DEFAULT_INDEX = void 0;\nconst SearchResult_1 = require(\"./SearchResult\");\nexports.DEFAULT_INDEX = 1;\nclass Strategy {\n constructor(props) {\n this.props = props;\n this.cache = {};\n }\n destroy() {\n this.cache = {};\n return this;\n }\n replace(data) {\n return this.props.replace(data);\n }\n execute(beforeCursor, callback) {\n var _a;\n const match = this.matchWithContext(beforeCursor);\n if (!match)\n return false;\n const term = match[(_a = this.props.index) !== null && _a !== void 0 ? _a : exports.DEFAULT_INDEX];\n this.search(term, (results) => {\n callback(results.map((result) => new SearchResult_1.SearchResult(result, term, this)));\n }, match);\n return true;\n }\n renderTemplate(data, term) {\n if (this.props.template) {\n return this.props.template(data, term);\n }\n if (typeof data === \"string\")\n return data;\n throw new Error(`Unexpected render data type: ${typeof data}. Please implement template parameter by yourself`);\n }\n getId() {\n return this.props.id || null;\n }\n match(text) {\n return typeof this.props.match === \"function\"\n ? this.props.match(text)\n : text.match(this.props.match);\n }\n search(term, callback, match) {\n if (this.props.cache) {\n this.searchWithCach(term, callback, match);\n }\n else {\n this.props.search(term, callback, match);\n }\n }\n matchWithContext(beforeCursor) {\n const context = this.context(beforeCursor);\n if (context === false)\n return null;\n return this.match(context === true ? beforeCursor : context);\n }\n context(beforeCursor) {\n return this.props.context ? this.props.context(beforeCursor) : true;\n }\n searchWithCach(term, callback, match) {\n if (this.cache[term] != null) {\n callback(this.cache[term]);\n }\n else {\n this.props.search(term, (results) => {\n this.cache[term] = results;\n callback(results);\n }, match);\n }\n }\n}\nexports.Strategy = Strategy;\n//# sourceMappingURL=Strategy.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Textcomplete = void 0;\nconst eventemitter3_1 = require(\"eventemitter3\");\nconst Dropdown_1 = require(\"./Dropdown\");\nconst Completer_1 = require(\"./Completer\");\nconst PASSTHOUGH_EVENT_NAMES = [\n \"show\",\n \"shown\",\n \"render\",\n \"rendered\",\n \"selected\",\n \"hidden\",\n \"hide\",\n];\nclass Textcomplete extends eventemitter3_1.EventEmitter {\n constructor(editor, strategies, option) {\n super();\n this.editor = editor;\n this.isQueryInFlight = false;\n this.nextPendingQuery = null;\n this.handleHit = ({ searchResults, }) => {\n if (searchResults.length) {\n this.dropdown.render(searchResults, this.editor.getCursorOffset());\n }\n else {\n this.dropdown.hide();\n }\n this.isQueryInFlight = false;\n if (this.nextPendingQuery !== null)\n this.trigger(this.nextPendingQuery);\n };\n this.handleMove = (e) => {\n e.detail.code === \"UP\" ? this.dropdown.up(e) : this.dropdown.down(e);\n };\n this.handleEnter = (e) => {\n const activeItem = this.dropdown.getActiveItem();\n if (activeItem) {\n this.dropdown.select(activeItem);\n e.preventDefault();\n }\n else {\n this.dropdown.hide();\n }\n };\n this.handleEsc = (e) => {\n if (this.dropdown.isShown()) {\n this.dropdown.hide();\n e.preventDefault();\n }\n };\n this.handleChange = (e) => {\n if (e.detail.beforeCursor != null) {\n this.trigger(e.detail.beforeCursor);\n }\n else {\n this.dropdown.hide();\n }\n };\n this.handleSelect = (selectEvent) => {\n this.emit(\"select\", selectEvent);\n if (!selectEvent.defaultPrevented) {\n this.editor.applySearchResult(selectEvent.detail.searchResult);\n }\n };\n this.handleResize = () => {\n if (this.dropdown.isShown()) {\n this.dropdown.setOffset(this.editor.getCursorOffset());\n }\n };\n this.completer = new Completer_1.Completer(strategies);\n this.dropdown = Dropdown_1.Dropdown.create((option === null || option === void 0 ? void 0 : option.dropdown) || {});\n this.startListening();\n }\n destroy(destroyEditor = true) {\n this.completer.destroy();\n this.dropdown.destroy();\n if (destroyEditor)\n this.editor.destroy();\n this.stopListening();\n return this;\n }\n isShown() {\n return this.dropdown.isShown();\n }\n hide() {\n this.dropdown.hide();\n return this;\n }\n trigger(beforeCursor) {\n if (this.isQueryInFlight) {\n this.nextPendingQuery = beforeCursor;\n }\n else {\n this.isQueryInFlight = true;\n this.nextPendingQuery = null;\n this.completer.run(beforeCursor);\n }\n return this;\n }\n startListening() {\n var _a;\n this.editor\n .on(\"move\", this.handleMove)\n .on(\"enter\", this.handleEnter)\n .on(\"esc\", this.handleEsc)\n .on(\"change\", this.handleChange);\n this.dropdown.on(\"select\", this.handleSelect);\n for (const eventName of PASSTHOUGH_EVENT_NAMES) {\n this.dropdown.on(eventName, (e) => this.emit(eventName, e));\n }\n this.completer.on(\"hit\", this.handleHit);\n (_a = this.dropdown.el.ownerDocument.defaultView) === null || _a === void 0 ? void 0 : _a.addEventListener(\"resize\", this.handleResize);\n }\n stopListening() {\n var _a;\n (_a = this.dropdown.el.ownerDocument.defaultView) === null || _a === void 0 ? void 0 : _a.removeEventListener(\"resize\", this.handleResize);\n this.completer.removeAllListeners();\n this.dropdown.removeAllListeners();\n this.editor\n .removeListener(\"move\", this.handleMove)\n .removeListener(\"enter\", this.handleEnter)\n .removeListener(\"esc\", this.handleEsc)\n .removeListener(\"change\", this.handleChange);\n }\n}\nexports.Textcomplete = Textcomplete;\n//# sourceMappingURL=Textcomplete.js.map","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__exportStar(require(\"./Completer\"), exports);\n__exportStar(require(\"./Dropdown\"), exports);\n__exportStar(require(\"./Editor\"), exports);\n__exportStar(require(\"./SearchResult\"), exports);\n__exportStar(require(\"./Strategy\"), exports);\n__exportStar(require(\"./Textcomplete\"), exports);\n__exportStar(require(\"./utils\"), exports);\n//# sourceMappingURL=index.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.createCustomEvent = void 0;\nconst isCustomEventSupported = typeof window !== \"undefined\" && !!window.CustomEvent;\nconst createCustomEvent = (type, options) => {\n if (isCustomEventSupported)\n return new CustomEvent(type, options);\n const event = document.createEvent(\"CustomEvent\");\n event.initCustomEvent(type, \n /* bubbles */ false, (options === null || options === void 0 ? void 0 : options.cancelable) || false, (options === null || options === void 0 ? void 0 : options.detail) || undefined);\n return event;\n};\nexports.createCustomEvent = createCustomEvent;\n//# sourceMappingURL=utils.js.map","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TextareaEditor = void 0;\nconst undate_1 = require(\"undate\");\nconst textarea_caret_1 = __importDefault(require(\"textarea-caret\"));\nconst core_1 = require(\"@textcomplete/core\");\nconst utils_1 = require(\"@textcomplete/utils\");\nclass TextareaEditor extends core_1.Editor {\n constructor(el) {\n super();\n this.el = el;\n this.onInput = () => {\n this.emitChangeEvent();\n };\n this.onKeydown = (e) => {\n const code = this.getCode(e);\n let event;\n if (code === \"UP\" || code === \"DOWN\") {\n event = this.emitMoveEvent(code);\n }\n else if (code === \"ENTER\") {\n event = this.emitEnterEvent();\n }\n else if (code === \"ESC\") {\n event = this.emitEscEvent();\n }\n if (event && event.defaultPrevented) {\n e.preventDefault();\n }\n };\n this.startListening();\n }\n destroy() {\n super.destroy();\n this.stopListening();\n return this;\n }\n /**\n * @implements {@link Editor#applySearchResult}\n */\n applySearchResult(searchResult) {\n const beforeCursor = this.getBeforeCursor();\n if (beforeCursor != null) {\n const replace = searchResult.replace(beforeCursor, this.getAfterCursor());\n this.el.focus(); // Clicking a dropdown item removes focus from the element.\n if (Array.isArray(replace)) {\n (0, undate_1.update)(this.el, replace[0], replace[1]);\n if (this.el) {\n this.el.dispatchEvent((0, core_1.createCustomEvent)(\"input\"));\n }\n }\n }\n }\n /**\n * @implements {@link Editor#getCursorOffset}\n */\n getCursorOffset() {\n const elOffset = (0, utils_1.calculateElementOffset)(this.el);\n const elScroll = this.getElScroll();\n const cursorPosition = this.getCursorPosition();\n const lineHeight = (0, utils_1.getLineHeightPx)(this.el);\n const top = elOffset.top - elScroll.top + cursorPosition.top + lineHeight;\n const left = elOffset.left - elScroll.left + cursorPosition.left;\n const clientTop = this.el.getBoundingClientRect().top;\n if (this.el.dir !== \"rtl\") {\n return { top, left, lineHeight, clientTop };\n }\n else {\n const right = document.documentElement\n ? document.documentElement.clientWidth - left\n : 0;\n return { top, right, lineHeight, clientTop };\n }\n }\n /**\n * @implements {@link Editor#getBeforeCursor}\n */\n getBeforeCursor() {\n return this.el.selectionStart !== this.el.selectionEnd\n ? null\n : this.el.value.substring(0, this.el.selectionEnd);\n }\n getAfterCursor() {\n return this.el.value.substring(this.el.selectionEnd);\n }\n getElScroll() {\n return { top: this.el.scrollTop, left: this.el.scrollLeft };\n }\n /**\n * The input cursor's relative coordinates from the textarea's left\n * top corner.\n */\n getCursorPosition() {\n return (0, textarea_caret_1.default)(this.el, this.el.selectionEnd);\n }\n startListening() {\n this.el.addEventListener(\"input\", this.onInput);\n this.el.addEventListener(\"keydown\", this.onKeydown);\n }\n stopListening() {\n this.el.removeEventListener(\"input\", this.onInput);\n this.el.removeEventListener(\"keydown\", this.onKeydown);\n }\n}\nexports.TextareaEditor = TextareaEditor;\n//# sourceMappingURL=TextareaEditor.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TextareaEditor = void 0;\nvar TextareaEditor_1 = require(\"./TextareaEditor\");\nObject.defineProperty(exports, \"TextareaEditor\", { enumerable: true, get: function () { return TextareaEditor_1.TextareaEditor; } });\n//# sourceMappingURL=index.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.calculateElementOffset = void 0;\n/**\n * Get the current coordinates of the `el` relative to the document.\n */\nconst calculateElementOffset = (el) => {\n const rect = el.getBoundingClientRect();\n const owner = el.ownerDocument;\n if (owner == null) {\n throw new Error(\"Given element does not belong to document\");\n }\n const { defaultView, documentElement } = owner;\n if (defaultView == null) {\n throw new Error(\"Given element does not belong to window\");\n }\n const offset = {\n top: rect.top + defaultView.pageYOffset,\n left: rect.left + defaultView.pageXOffset,\n };\n if (documentElement) {\n offset.top -= documentElement.clientTop;\n offset.left -= documentElement.clientLeft;\n }\n return offset;\n};\nexports.calculateElementOffset = calculateElementOffset;\n//# sourceMappingURL=calculateElementOffset.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getLineHeightPx = void 0;\nconst CHAR_CODE_ZERO = \"0\".charCodeAt(0);\nconst CHAR_CODE_NINE = \"9\".charCodeAt(0);\nconst isDigit = (charCode) => CHAR_CODE_ZERO <= charCode && charCode <= CHAR_CODE_NINE;\nconst getLineHeightPx = (el) => {\n const computedStyle = getComputedStyle(el);\n const lineHeight = computedStyle.lineHeight;\n // If the char code starts with a digit, it is either a value in pixels,\n // or unitless, as per:\n // https://drafts.csswg.org/css2/visudet.html#propdef-line-height\n // https://drafts.csswg.org/css2/cascade.html#computed-value\n if (isDigit(lineHeight.charCodeAt(0))) {\n const floatLineHeight = parseFloat(lineHeight);\n // In real browsers the value is *always* in pixels, even for unit-less\n // line-heights. However, we still check as per the spec.\n return isDigit(lineHeight.charCodeAt(lineHeight.length - 1))\n ? floatLineHeight * parseFloat(computedStyle.fontSize)\n : floatLineHeight;\n }\n // Otherwise, the value is \"normal\".\n // If the line-height is \"normal\", calculate by font-size\n return calculateLineHeightPx(el.nodeName, computedStyle);\n};\nexports.getLineHeightPx = getLineHeightPx;\n/**\n * Returns calculated line-height of the given node in pixels.\n */\nconst calculateLineHeightPx = (nodeName, computedStyle) => {\n const body = document.body;\n if (!body)\n return 0;\n const tempNode = document.createElement(nodeName);\n tempNode.innerHTML = \" \";\n Object.assign(tempNode.style, {\n fontSize: computedStyle.fontSize,\n fontFamily: computedStyle.fontFamily,\n padding: \"0\",\n });\n body.appendChild(tempNode);\n // Make sure textarea has only 1 row\n if (tempNode instanceof HTMLTextAreaElement) {\n tempNode.rows = 1;\n }\n // Assume the height of the element is the line-height\n const height = tempNode.offsetHeight;\n body.removeChild(tempNode);\n return height;\n};\n//# sourceMappingURL=getLineHeightPx.js.map","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__exportStar(require(\"./calculateElementOffset\"), exports);\n__exportStar(require(\"./getLineHeightPx\"), exports);\n__exportStar(require(\"./isSafari\"), exports);\n//# sourceMappingURL=index.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isSafari = void 0;\nconst isSafari = () => /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\nexports.isSafari = isSafari;\n//# sourceMappingURL=isSafari.js.map","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n","/* jshint browser: true */\n\n(function () {\n\n// We'll copy the properties below into the mirror div.\n// Note that some browsers, such as Firefox, do not concatenate properties\n// into their shorthand (e.g. padding-top, padding-bottom etc. -> padding),\n// so we have to list every single property explicitly.\nvar properties = [\n 'direction', // RTL support\n 'boxSizing',\n 'width', // on Chrome and IE, exclude the scrollbar, so the mirror div wraps exactly as the textarea does\n 'height',\n 'overflowX',\n 'overflowY', // copy the scrollbar for IE\n\n 'borderTopWidth',\n 'borderRightWidth',\n 'borderBottomWidth',\n 'borderLeftWidth',\n 'borderStyle',\n\n 'paddingTop',\n 'paddingRight',\n 'paddingBottom',\n 'paddingLeft',\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/font\n 'fontStyle',\n 'fontVariant',\n 'fontWeight',\n 'fontStretch',\n 'fontSize',\n 'fontSizeAdjust',\n 'lineHeight',\n 'fontFamily',\n\n 'textAlign',\n 'textTransform',\n 'textIndent',\n 'textDecoration', // might not make a difference, but better be safe\n\n 'letterSpacing',\n 'wordSpacing',\n\n 'tabSize',\n 'MozTabSize'\n\n];\n\nvar isBrowser = (typeof window !== 'undefined');\nvar isFirefox = (isBrowser && window.mozInnerScreenX != null);\n\nfunction getCaretCoordinates(element, position, options) {\n if (!isBrowser) {\n throw new Error('textarea-caret-position#getCaretCoordinates should only be called in a browser');\n }\n\n var debug = options && options.debug || false;\n if (debug) {\n var el = document.querySelector('#input-textarea-caret-position-mirror-div');\n if (el) el.parentNode.removeChild(el);\n }\n\n // The mirror div will replicate the textarea's style\n var div = document.createElement('div');\n div.id = 'input-textarea-caret-position-mirror-div';\n document.body.appendChild(div);\n\n var style = div.style;\n var computed = window.getComputedStyle ? window.getComputedStyle(element) : element.currentStyle; // currentStyle for IE < 9\n var isInput = element.nodeName === 'INPUT';\n\n // Default textarea styles\n style.whiteSpace = 'pre-wrap';\n if (!isInput)\n style.wordWrap = 'break-word'; // only for textarea-s\n\n // Position off-screen\n style.position = 'absolute'; // required to return coordinates properly\n if (!debug)\n style.visibility = 'hidden'; // not 'display: none' because we want rendering\n\n // Transfer the element's properties to the div\n properties.forEach(function (prop) {\n if (isInput && prop === 'lineHeight') {\n // Special case for s because text is rendered centered and line height may be != height\n style.lineHeight = computed.height;\n } else {\n style[prop] = computed[prop];\n }\n });\n\n if (isFirefox) {\n // Firefox lies about the overflow property for textareas: https://bugzilla.mozilla.org/show_bug.cgi?id=984275\n if (element.scrollHeight > parseInt(computed.height))\n style.overflowY = 'scroll';\n } else {\n style.overflow = 'hidden'; // for Chrome to not render a scrollbar; IE keeps overflowY = 'scroll'\n }\n\n div.textContent = element.value.substring(0, position);\n // The second special handling for input type=\"text\" vs textarea:\n // spaces need to be replaced with non-breaking spaces - http://stackoverflow.com/a/13402035/1269037\n if (isInput)\n div.textContent = div.textContent.replace(/\\s/g, '\\u00a0');\n\n var span = document.createElement('span');\n // Wrapping must be replicated *exactly*, including when a long word gets\n // onto the next line, with whitespace at the end of the line before (#7).\n // The *only* reliable way to do that is to copy the *entire* rest of the\n // textarea's content into the created at the caret position.\n // For inputs, just '.' would be enough, but no need to bother.\n span.textContent = element.value.substring(position) || '.'; // || because a completely empty faux span doesn't render at all\n div.appendChild(span);\n\n var coordinates = {\n top: span.offsetTop + parseInt(computed['borderTopWidth']),\n left: span.offsetLeft + parseInt(computed['borderLeftWidth']),\n height: parseInt(computed['lineHeight'])\n };\n\n if (debug) {\n span.style.backgroundColor = '#aaa';\n } else {\n document.body.removeChild(div);\n }\n\n return coordinates;\n}\n\nif (typeof module != 'undefined' && typeof module.exports != 'undefined') {\n module.exports = getCaretCoordinates;\n} else if(isBrowser) {\n window.getCaretCoordinates = getCaretCoordinates;\n}\n\n}());\n","function update(el, headToCursor, cursorToTail) {\r\n const curr = el.value; // strA + strB1 + strC\r\n const next = headToCursor + (cursorToTail || \"\"); // strA + strB2 + strC\r\n const activeElement = document.activeElement;\r\n // Calculate length of strA and strC\r\n let aLength = 0;\r\n let cLength = 0;\r\n while (aLength < curr.length && aLength < next.length && curr[aLength] === next[aLength]) {\r\n aLength++;\r\n }\r\n while (curr.length - cLength - 1 >= 0 &&\r\n next.length - cLength - 1 >= 0 &&\r\n curr[curr.length - cLength - 1] === next[next.length - cLength - 1]) {\r\n cLength++;\r\n }\r\n aLength = Math.min(aLength, Math.min(curr.length, next.length) - cLength);\r\n // Select strB1\r\n el.setSelectionRange(aLength, curr.length - cLength);\r\n // Get strB2\r\n const strB2 = next.substring(aLength, next.length - cLength);\r\n // Replace strB1 with strB2\r\n el.focus();\r\n if (!document.execCommand(\"insertText\", false, strB2)) {\r\n // Document.execCommand returns false if the command is not supported.\r\n // Firefox and IE returns false in this case.\r\n el.value = next;\r\n // Dispatch input event. Note that `new Event(\"input\")` throws an error on IE11\r\n const event = document.createEvent(\"Event\");\r\n event.initEvent(\"input\", true, true);\r\n el.dispatchEvent(event);\r\n }\r\n // Move cursor to the end of headToCursor\r\n el.setSelectionRange(headToCursor.length, headToCursor.length);\r\n activeElement.focus();\r\n return el;\r\n}\n\nfunction wrapCursor(el, before, after) {\r\n const initEnd = el.selectionEnd;\r\n const headToCursor = el.value.substr(0, el.selectionStart) + before;\r\n const cursorToTail = el.value.substring(el.selectionStart, initEnd) + (after || \"\") + el.value.substr(initEnd);\r\n update(el, headToCursor, cursorToTail);\r\n el.selectionEnd = initEnd + before.length;\r\n return el;\r\n}\n\nexport { update, wrapCursor };\n//# sourceMappingURL=index.mjs.map\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/*\nUnobtrusive JavaScript\nhttps://github.com/rails/rails/blob/main/actionview/app/javascript\nReleased under the MIT license\n */\nconst linkClickSelector = \"a[data-confirm], a[data-method], a[data-remote]:not([disabled]), a[data-disable-with], a[data-disable]\";\n\nconst buttonClickSelector = {\n selector: \"button[data-remote]:not([form]), button[data-confirm]:not([form])\",\n exclude: \"form button\"\n};\n\nconst inputChangeSelector = \"select[data-remote], input[data-remote], textarea[data-remote]\";\n\nconst formSubmitSelector = \"form:not([data-turbo=true])\";\n\nconst formInputClickSelector = \"form:not([data-turbo=true]) input[type=submit], form:not([data-turbo=true]) input[type=image], form:not([data-turbo=true]) button[type=submit], form:not([data-turbo=true]) button:not([type]), input[type=submit][form], input[type=image][form], button[type=submit][form], button[form]:not([type])\";\n\nconst formDisableSelector = \"input[data-disable-with]:enabled, button[data-disable-with]:enabled, textarea[data-disable-with]:enabled, input[data-disable]:enabled, button[data-disable]:enabled, textarea[data-disable]:enabled\";\n\nconst formEnableSelector = \"input[data-disable-with]:disabled, button[data-disable-with]:disabled, textarea[data-disable-with]:disabled, input[data-disable]:disabled, button[data-disable]:disabled, textarea[data-disable]:disabled\";\n\nconst fileInputSelector = \"input[name][type=file]:not([disabled])\";\n\nconst linkDisableSelector = \"a[data-disable-with], a[data-disable]\";\n\nconst buttonDisableSelector = \"button[data-remote][data-disable-with], button[data-remote][data-disable]\";\n\nlet nonce = null;\n\nconst loadCSPNonce = () => {\n const metaTag = document.querySelector(\"meta[name=csp-nonce]\");\n return nonce = metaTag && metaTag.content;\n};\n\nconst cspNonce = () => nonce || loadCSPNonce();\n\nconst m = Element.prototype.matches || Element.prototype.matchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.oMatchesSelector || Element.prototype.webkitMatchesSelector;\n\nconst matches = function(element, selector) {\n if (selector.exclude) {\n return m.call(element, selector.selector) && !m.call(element, selector.exclude);\n } else {\n return m.call(element, selector);\n }\n};\n\nconst EXPANDO = \"_ujsData\";\n\nconst getData = (element, key) => element[EXPANDO] ? element[EXPANDO][key] : undefined;\n\nconst setData = function(element, key, value) {\n if (!element[EXPANDO]) {\n element[EXPANDO] = {};\n }\n return element[EXPANDO][key] = value;\n};\n\nconst $ = selector => Array.prototype.slice.call(document.querySelectorAll(selector));\n\nconst isContentEditable = function(element) {\n var isEditable = false;\n do {\n if (element.isContentEditable) {\n isEditable = true;\n break;\n }\n element = element.parentElement;\n } while (element);\n return isEditable;\n};\n\nconst csrfToken = () => {\n const meta = document.querySelector(\"meta[name=csrf-token]\");\n return meta && meta.content;\n};\n\nconst csrfParam = () => {\n const meta = document.querySelector(\"meta[name=csrf-param]\");\n return meta && meta.content;\n};\n\nconst CSRFProtection = xhr => {\n const token = csrfToken();\n if (token) {\n return xhr.setRequestHeader(\"X-CSRF-Token\", token);\n }\n};\n\nconst refreshCSRFTokens = () => {\n const token = csrfToken();\n const param = csrfParam();\n if (token && param) {\n return $('form input[name=\"' + param + '\"]').forEach((input => input.value = token));\n }\n};\n\nconst AcceptHeaders = {\n \"*\": \"*/*\",\n text: \"text/plain\",\n html: \"text/html\",\n xml: \"application/xml, text/xml\",\n json: \"application/json, text/javascript\",\n script: \"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript\"\n};\n\nconst ajax = options => {\n options = prepareOptions(options);\n var xhr = createXHR(options, (function() {\n const response = processResponse(xhr.response != null ? xhr.response : xhr.responseText, xhr.getResponseHeader(\"Content-Type\"));\n if (Math.floor(xhr.status / 100) === 2) {\n if (typeof options.success === \"function\") {\n options.success(response, xhr.statusText, xhr);\n }\n } else {\n if (typeof options.error === \"function\") {\n options.error(response, xhr.statusText, xhr);\n }\n }\n return typeof options.complete === \"function\" ? options.complete(xhr, xhr.statusText) : undefined;\n }));\n if (options.beforeSend && !options.beforeSend(xhr, options)) {\n return false;\n }\n if (xhr.readyState === XMLHttpRequest.OPENED) {\n return xhr.send(options.data);\n }\n};\n\nvar prepareOptions = function(options) {\n options.url = options.url || location.href;\n options.type = options.type.toUpperCase();\n if (options.type === \"GET\" && options.data) {\n if (options.url.indexOf(\"?\") < 0) {\n options.url += \"?\" + options.data;\n } else {\n options.url += \"&\" + options.data;\n }\n }\n if (!(options.dataType in AcceptHeaders)) {\n options.dataType = \"*\";\n }\n options.accept = AcceptHeaders[options.dataType];\n if (options.dataType !== \"*\") {\n options.accept += \", */*; q=0.01\";\n }\n return options;\n};\n\nvar createXHR = function(options, done) {\n const xhr = new XMLHttpRequest;\n xhr.open(options.type, options.url, true);\n xhr.setRequestHeader(\"Accept\", options.accept);\n if (typeof options.data === \"string\") {\n xhr.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded; charset=UTF-8\");\n }\n if (!options.crossDomain) {\n xhr.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n CSRFProtection(xhr);\n }\n xhr.withCredentials = !!options.withCredentials;\n xhr.onreadystatechange = function() {\n if (xhr.readyState === XMLHttpRequest.DONE) {\n return done(xhr);\n }\n };\n return xhr;\n};\n\nvar processResponse = function(response, type) {\n if (typeof response === \"string\" && typeof type === \"string\") {\n if (type.match(/\\bjson\\b/)) {\n try {\n response = JSON.parse(response);\n } catch (error) {}\n } else if (type.match(/\\b(?:java|ecma)script\\b/)) {\n const script = document.createElement(\"script\");\n script.setAttribute(\"nonce\", cspNonce());\n script.text = response;\n document.head.appendChild(script).parentNode.removeChild(script);\n } else if (type.match(/\\b(xml|html|svg)\\b/)) {\n const parser = new DOMParser;\n type = type.replace(/;.+/, \"\");\n try {\n response = parser.parseFromString(response, type);\n } catch (error1) {}\n }\n }\n return response;\n};\n\nconst href = element => element.href;\n\nconst isCrossDomain = function(url) {\n const originAnchor = document.createElement(\"a\");\n originAnchor.href = location.href;\n const urlAnchor = document.createElement(\"a\");\n try {\n urlAnchor.href = url;\n return !((!urlAnchor.protocol || urlAnchor.protocol === \":\") && !urlAnchor.host || originAnchor.protocol + \"//\" + originAnchor.host === urlAnchor.protocol + \"//\" + urlAnchor.host);\n } catch (e) {\n return true;\n }\n};\n\nlet preventDefault;\n\nlet {CustomEvent: CustomEvent} = window;\n\nif (typeof CustomEvent !== \"function\") {\n CustomEvent = function(event, params) {\n const evt = document.createEvent(\"CustomEvent\");\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n return evt;\n };\n CustomEvent.prototype = window.Event.prototype;\n ({preventDefault: preventDefault} = CustomEvent.prototype);\n CustomEvent.prototype.preventDefault = function() {\n const result = preventDefault.call(this);\n if (this.cancelable && !this.defaultPrevented) {\n Object.defineProperty(this, \"defaultPrevented\", {\n get() {\n return true;\n }\n });\n }\n return result;\n };\n}\n\nconst fire = (obj, name, data) => {\n const event = new CustomEvent(name, {\n bubbles: true,\n cancelable: true,\n detail: data\n });\n obj.dispatchEvent(event);\n return !event.defaultPrevented;\n};\n\nconst stopEverything = e => {\n fire(e.target, \"ujs:everythingStopped\");\n e.preventDefault();\n e.stopPropagation();\n e.stopImmediatePropagation();\n};\n\nconst delegate = (element, selector, eventType, handler) => element.addEventListener(eventType, (function(e) {\n let {target: target} = e;\n while (!!(target instanceof Element) && !matches(target, selector)) {\n target = target.parentNode;\n }\n if (target instanceof Element && handler.call(target, e) === false) {\n e.preventDefault();\n e.stopPropagation();\n }\n}));\n\nconst toArray = e => Array.prototype.slice.call(e);\n\nconst serializeElement = (element, additionalParam) => {\n let inputs = [ element ];\n if (matches(element, \"form\")) {\n inputs = toArray(element.elements);\n }\n const params = [];\n inputs.forEach((function(input) {\n if (!input.name || input.disabled) {\n return;\n }\n if (matches(input, \"fieldset[disabled] *\")) {\n return;\n }\n if (matches(input, \"select\")) {\n toArray(input.options).forEach((function(option) {\n if (option.selected) {\n params.push({\n name: input.name,\n value: option.value\n });\n }\n }));\n } else if (input.checked || [ \"radio\", \"checkbox\", \"submit\" ].indexOf(input.type) === -1) {\n params.push({\n name: input.name,\n value: input.value\n });\n }\n }));\n if (additionalParam) {\n params.push(additionalParam);\n }\n return params.map((function(param) {\n if (param.name) {\n return `${encodeURIComponent(param.name)}=${encodeURIComponent(param.value)}`;\n } else {\n return param;\n }\n })).join(\"&\");\n};\n\nconst formElements = (form, selector) => {\n if (matches(form, \"form\")) {\n return toArray(form.elements).filter((el => matches(el, selector)));\n } else {\n return toArray(form.querySelectorAll(selector));\n }\n};\n\nconst handleConfirmWithRails = rails => function(e) {\n if (!allowAction(this, rails)) {\n stopEverything(e);\n }\n};\n\nconst confirm = (message, element) => window.confirm(message);\n\nvar allowAction = function(element, rails) {\n let callback;\n const message = element.getAttribute(\"data-confirm\");\n if (!message) {\n return true;\n }\n let answer = false;\n if (fire(element, \"confirm\")) {\n try {\n answer = rails.confirm(message, element);\n } catch (error) {}\n callback = fire(element, \"confirm:complete\", [ answer ]);\n }\n return answer && callback;\n};\n\nconst handleDisabledElement = function(e) {\n const element = this;\n if (element.disabled) {\n stopEverything(e);\n }\n};\n\nconst enableElement = e => {\n let element;\n if (e instanceof Event) {\n if (isXhrRedirect(e)) {\n return;\n }\n element = e.target;\n } else {\n element = e;\n }\n if (isContentEditable(element)) {\n return;\n }\n if (matches(element, linkDisableSelector)) {\n return enableLinkElement(element);\n } else if (matches(element, buttonDisableSelector) || matches(element, formEnableSelector)) {\n return enableFormElement(element);\n } else if (matches(element, formSubmitSelector)) {\n return enableFormElements(element);\n }\n};\n\nconst disableElement = e => {\n const element = e instanceof Event ? e.target : e;\n if (isContentEditable(element)) {\n return;\n }\n if (matches(element, linkDisableSelector)) {\n return disableLinkElement(element);\n } else if (matches(element, buttonDisableSelector) || matches(element, formDisableSelector)) {\n return disableFormElement(element);\n } else if (matches(element, formSubmitSelector)) {\n return disableFormElements(element);\n }\n};\n\nvar disableLinkElement = function(element) {\n if (getData(element, \"ujs:disabled\")) {\n return;\n }\n const replacement = element.getAttribute(\"data-disable-with\");\n if (replacement != null) {\n setData(element, \"ujs:enable-with\", element.innerHTML);\n element.innerHTML = replacement;\n }\n element.addEventListener(\"click\", stopEverything);\n return setData(element, \"ujs:disabled\", true);\n};\n\nvar enableLinkElement = function(element) {\n const originalText = getData(element, \"ujs:enable-with\");\n if (originalText != null) {\n element.innerHTML = originalText;\n setData(element, \"ujs:enable-with\", null);\n }\n element.removeEventListener(\"click\", stopEverything);\n return setData(element, \"ujs:disabled\", null);\n};\n\nvar disableFormElements = form => formElements(form, formDisableSelector).forEach(disableFormElement);\n\nvar disableFormElement = function(element) {\n if (getData(element, \"ujs:disabled\")) {\n return;\n }\n const replacement = element.getAttribute(\"data-disable-with\");\n if (replacement != null) {\n if (matches(element, \"button\")) {\n setData(element, \"ujs:enable-with\", element.innerHTML);\n element.innerHTML = replacement;\n } else {\n setData(element, \"ujs:enable-with\", element.value);\n element.value = replacement;\n }\n }\n element.disabled = true;\n return setData(element, \"ujs:disabled\", true);\n};\n\nvar enableFormElements = form => formElements(form, formEnableSelector).forEach((element => enableFormElement(element)));\n\nvar enableFormElement = function(element) {\n const originalText = getData(element, \"ujs:enable-with\");\n if (originalText != null) {\n if (matches(element, \"button\")) {\n element.innerHTML = originalText;\n } else {\n element.value = originalText;\n }\n setData(element, \"ujs:enable-with\", null);\n }\n element.disabled = false;\n return setData(element, \"ujs:disabled\", null);\n};\n\nvar isXhrRedirect = function(event) {\n const xhr = event.detail ? event.detail[0] : undefined;\n return xhr && xhr.getResponseHeader(\"X-Xhr-Redirect\");\n};\n\nconst handleMethodWithRails = rails => function(e) {\n const link = this;\n const method = link.getAttribute(\"data-method\");\n if (!method) {\n return;\n }\n if (isContentEditable(this)) {\n return;\n }\n const href = rails.href(link);\n const csrfToken$1 = csrfToken();\n const csrfParam$1 = csrfParam();\n const form = document.createElement(\"form\");\n let formContent = ``;\n if (csrfParam$1 && csrfToken$1 && !isCrossDomain(href)) {\n formContent += ``;\n }\n formContent += '';\n form.method = \"post\";\n form.action = href;\n form.target = link.target;\n form.innerHTML = formContent;\n form.style.display = \"none\";\n document.body.appendChild(form);\n form.querySelector('[type=\"submit\"]').click();\n stopEverything(e);\n};\n\nconst isRemote = function(element) {\n const value = element.getAttribute(\"data-remote\");\n return value != null && value !== \"false\";\n};\n\nconst handleRemoteWithRails = rails => function(e) {\n let data, method, url;\n const element = this;\n if (!isRemote(element)) {\n return true;\n }\n if (!fire(element, \"ajax:before\")) {\n fire(element, \"ajax:stopped\");\n return false;\n }\n if (isContentEditable(element)) {\n fire(element, \"ajax:stopped\");\n return false;\n }\n const withCredentials = element.getAttribute(\"data-with-credentials\");\n const dataType = element.getAttribute(\"data-type\") || \"script\";\n if (matches(element, formSubmitSelector)) {\n const button = getData(element, \"ujs:submit-button\");\n method = getData(element, \"ujs:submit-button-formmethod\") || element.getAttribute(\"method\") || \"get\";\n url = getData(element, \"ujs:submit-button-formaction\") || element.getAttribute(\"action\") || location.href;\n if (method.toUpperCase() === \"GET\") {\n url = url.replace(/\\?.*$/, \"\");\n }\n if (element.enctype === \"multipart/form-data\") {\n data = new FormData(element);\n if (button != null) {\n data.append(button.name, button.value);\n }\n } else {\n data = serializeElement(element, button);\n }\n setData(element, \"ujs:submit-button\", null);\n setData(element, \"ujs:submit-button-formmethod\", null);\n setData(element, \"ujs:submit-button-formaction\", null);\n } else if (matches(element, buttonClickSelector) || matches(element, inputChangeSelector)) {\n method = element.getAttribute(\"data-method\");\n url = element.getAttribute(\"data-url\");\n data = serializeElement(element, element.getAttribute(\"data-params\"));\n } else {\n method = element.getAttribute(\"data-method\");\n url = rails.href(element);\n data = element.getAttribute(\"data-params\");\n }\n ajax({\n type: method || \"GET\",\n url: url,\n data: data,\n dataType: dataType,\n beforeSend(xhr, options) {\n if (fire(element, \"ajax:beforeSend\", [ xhr, options ])) {\n return fire(element, \"ajax:send\", [ xhr ]);\n } else {\n fire(element, \"ajax:stopped\");\n return false;\n }\n },\n success(...args) {\n return fire(element, \"ajax:success\", args);\n },\n error(...args) {\n return fire(element, \"ajax:error\", args);\n },\n complete(...args) {\n return fire(element, \"ajax:complete\", args);\n },\n crossDomain: isCrossDomain(url),\n withCredentials: withCredentials != null && withCredentials !== \"false\"\n });\n stopEverything(e);\n};\n\nconst formSubmitButtonClick = function(e) {\n const button = this;\n const {form: form} = button;\n if (!form) {\n return;\n }\n if (button.name) {\n setData(form, \"ujs:submit-button\", {\n name: button.name,\n value: button.value\n });\n }\n setData(form, \"ujs:formnovalidate-button\", button.formNoValidate);\n setData(form, \"ujs:submit-button-formaction\", button.getAttribute(\"formaction\"));\n return setData(form, \"ujs:submit-button-formmethod\", button.getAttribute(\"formmethod\"));\n};\n\nconst preventInsignificantClick = function(e) {\n const link = this;\n const method = (link.getAttribute(\"data-method\") || \"GET\").toUpperCase();\n const data = link.getAttribute(\"data-params\");\n const metaClick = e.metaKey || e.ctrlKey;\n const insignificantMetaClick = metaClick && method === \"GET\" && !data;\n const nonPrimaryMouseClick = e.button != null && e.button !== 0;\n if (nonPrimaryMouseClick || insignificantMetaClick) {\n e.stopImmediatePropagation();\n }\n};\n\nconst Rails = {\n $: $,\n ajax: ajax,\n buttonClickSelector: buttonClickSelector,\n buttonDisableSelector: buttonDisableSelector,\n confirm: confirm,\n cspNonce: cspNonce,\n csrfToken: csrfToken,\n csrfParam: csrfParam,\n CSRFProtection: CSRFProtection,\n delegate: delegate,\n disableElement: disableElement,\n enableElement: enableElement,\n fileInputSelector: fileInputSelector,\n fire: fire,\n formElements: formElements,\n formEnableSelector: formEnableSelector,\n formDisableSelector: formDisableSelector,\n formInputClickSelector: formInputClickSelector,\n formSubmitButtonClick: formSubmitButtonClick,\n formSubmitSelector: formSubmitSelector,\n getData: getData,\n handleDisabledElement: handleDisabledElement,\n href: href,\n inputChangeSelector: inputChangeSelector,\n isCrossDomain: isCrossDomain,\n linkClickSelector: linkClickSelector,\n linkDisableSelector: linkDisableSelector,\n loadCSPNonce: loadCSPNonce,\n matches: matches,\n preventInsignificantClick: preventInsignificantClick,\n refreshCSRFTokens: refreshCSRFTokens,\n serializeElement: serializeElement,\n setData: setData,\n stopEverything: stopEverything\n};\n\nconst handleConfirm = handleConfirmWithRails(Rails);\n\nRails.handleConfirm = handleConfirm;\n\nconst handleMethod = handleMethodWithRails(Rails);\n\nRails.handleMethod = handleMethod;\n\nconst handleRemote = handleRemoteWithRails(Rails);\n\nRails.handleRemote = handleRemote;\n\nconst start = function() {\n if (window._rails_loaded) {\n throw new Error(\"rails-ujs has already been loaded!\");\n }\n window.addEventListener(\"pageshow\", (function() {\n $(formEnableSelector).forEach((function(el) {\n if (getData(el, \"ujs:disabled\")) {\n enableElement(el);\n }\n }));\n $(linkDisableSelector).forEach((function(el) {\n if (getData(el, \"ujs:disabled\")) {\n enableElement(el);\n }\n }));\n }));\n delegate(document, linkDisableSelector, \"ajax:complete\", enableElement);\n delegate(document, linkDisableSelector, \"ajax:stopped\", enableElement);\n delegate(document, buttonDisableSelector, \"ajax:complete\", enableElement);\n delegate(document, buttonDisableSelector, \"ajax:stopped\", enableElement);\n delegate(document, linkClickSelector, \"click\", preventInsignificantClick);\n delegate(document, linkClickSelector, \"click\", handleDisabledElement);\n delegate(document, linkClickSelector, \"click\", handleConfirm);\n delegate(document, linkClickSelector, \"click\", disableElement);\n delegate(document, linkClickSelector, \"click\", handleRemote);\n delegate(document, linkClickSelector, \"click\", handleMethod);\n delegate(document, buttonClickSelector, \"click\", preventInsignificantClick);\n delegate(document, buttonClickSelector, \"click\", handleDisabledElement);\n delegate(document, buttonClickSelector, \"click\", handleConfirm);\n delegate(document, buttonClickSelector, \"click\", disableElement);\n delegate(document, buttonClickSelector, \"click\", handleRemote);\n delegate(document, inputChangeSelector, \"change\", handleDisabledElement);\n delegate(document, inputChangeSelector, \"change\", handleConfirm);\n delegate(document, inputChangeSelector, \"change\", handleRemote);\n delegate(document, formSubmitSelector, \"submit\", handleDisabledElement);\n delegate(document, formSubmitSelector, \"submit\", handleConfirm);\n delegate(document, formSubmitSelector, \"submit\", handleRemote);\n delegate(document, formSubmitSelector, \"submit\", (e => setTimeout((() => disableElement(e)), 13)));\n delegate(document, formSubmitSelector, \"ajax:send\", disableElement);\n delegate(document, formSubmitSelector, \"ajax:complete\", enableElement);\n delegate(document, formInputClickSelector, \"click\", preventInsignificantClick);\n delegate(document, formInputClickSelector, \"click\", handleDisabledElement);\n delegate(document, formInputClickSelector, \"click\", handleConfirm);\n delegate(document, formInputClickSelector, \"click\", formSubmitButtonClick);\n document.addEventListener(\"DOMContentLoaded\", refreshCSRFTokens);\n document.addEventListener(\"DOMContentLoaded\", loadCSPNonce);\n return window._rails_loaded = true;\n};\n\nRails.start = start;\n\nif (typeof jQuery !== \"undefined\" && jQuery && jQuery.ajax) {\n if (jQuery.rails) {\n throw new Error(\"If you load both jquery_ujs and rails-ujs, use rails-ujs only.\");\n }\n jQuery.rails = Rails;\n jQuery.ajaxPrefilter((function(options, originalOptions, xhr) {\n if (!options.crossDomain) {\n return CSRFProtection(xhr);\n }\n }));\n}\n\nexport { Rails as default };\n","var global =\n (typeof globalThis !== 'undefined' && globalThis) ||\n (typeof self !== 'undefined' && self) ||\n (typeof global !== 'undefined' && global)\n\nvar support = {\n searchParams: 'URLSearchParams' in global,\n iterable: 'Symbol' in global && 'iterator' in Symbol,\n blob:\n 'FileReader' in global &&\n 'Blob' in global &&\n (function() {\n try {\n new Blob()\n return true\n } catch (e) {\n return false\n }\n })(),\n formData: 'FormData' in global,\n arrayBuffer: 'ArrayBuffer' in global\n}\n\nfunction isDataView(obj) {\n return obj && DataView.prototype.isPrototypeOf(obj)\n}\n\nif (support.arrayBuffer) {\n var viewClasses = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]'\n ]\n\n var isArrayBufferView =\n ArrayBuffer.isView ||\n function(obj) {\n return obj && viewClasses.indexOf(Object.prototype.toString.call(obj)) > -1\n }\n}\n\nfunction normalizeName(name) {\n if (typeof name !== 'string') {\n name = String(name)\n }\n if (/[^a-z0-9\\-#$%&'*+.^_`|~!]/i.test(name) || name === '') {\n throw new TypeError('Invalid character in header field name: \"' + name + '\"')\n }\n return name.toLowerCase()\n}\n\nfunction normalizeValue(value) {\n if (typeof value !== 'string') {\n value = String(value)\n }\n return value\n}\n\n// Build a destructive iterator for the value list\nfunction iteratorFor(items) {\n var iterator = {\n next: function() {\n var value = items.shift()\n return {done: value === undefined, value: value}\n }\n }\n\n if (support.iterable) {\n iterator[Symbol.iterator] = function() {\n return iterator\n }\n }\n\n return iterator\n}\n\nexport function Headers(headers) {\n this.map = {}\n\n if (headers instanceof Headers) {\n headers.forEach(function(value, name) {\n this.append(name, value)\n }, this)\n } else if (Array.isArray(headers)) {\n headers.forEach(function(header) {\n this.append(header[0], header[1])\n }, this)\n } else if (headers) {\n Object.getOwnPropertyNames(headers).forEach(function(name) {\n this.append(name, headers[name])\n }, this)\n }\n}\n\nHeaders.prototype.append = function(name, value) {\n name = normalizeName(name)\n value = normalizeValue(value)\n var oldValue = this.map[name]\n this.map[name] = oldValue ? oldValue + ', ' + value : value\n}\n\nHeaders.prototype['delete'] = function(name) {\n delete this.map[normalizeName(name)]\n}\n\nHeaders.prototype.get = function(name) {\n name = normalizeName(name)\n return this.has(name) ? this.map[name] : null\n}\n\nHeaders.prototype.has = function(name) {\n return this.map.hasOwnProperty(normalizeName(name))\n}\n\nHeaders.prototype.set = function(name, value) {\n this.map[normalizeName(name)] = normalizeValue(value)\n}\n\nHeaders.prototype.forEach = function(callback, thisArg) {\n for (var name in this.map) {\n if (this.map.hasOwnProperty(name)) {\n callback.call(thisArg, this.map[name], name, this)\n }\n }\n}\n\nHeaders.prototype.keys = function() {\n var items = []\n this.forEach(function(value, name) {\n items.push(name)\n })\n return iteratorFor(items)\n}\n\nHeaders.prototype.values = function() {\n var items = []\n this.forEach(function(value) {\n items.push(value)\n })\n return iteratorFor(items)\n}\n\nHeaders.prototype.entries = function() {\n var items = []\n this.forEach(function(value, name) {\n items.push([name, value])\n })\n return iteratorFor(items)\n}\n\nif (support.iterable) {\n Headers.prototype[Symbol.iterator] = Headers.prototype.entries\n}\n\nfunction consumed(body) {\n if (body.bodyUsed) {\n return Promise.reject(new TypeError('Already read'))\n }\n body.bodyUsed = true\n}\n\nfunction fileReaderReady(reader) {\n return new Promise(function(resolve, reject) {\n reader.onload = function() {\n resolve(reader.result)\n }\n reader.onerror = function() {\n reject(reader.error)\n }\n })\n}\n\nfunction readBlobAsArrayBuffer(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsArrayBuffer(blob)\n return promise\n}\n\nfunction readBlobAsText(blob) {\n var reader = new FileReader()\n var promise = fileReaderReady(reader)\n reader.readAsText(blob)\n return promise\n}\n\nfunction readArrayBufferAsText(buf) {\n var view = new Uint8Array(buf)\n var chars = new Array(view.length)\n\n for (var i = 0; i < view.length; i++) {\n chars[i] = String.fromCharCode(view[i])\n }\n return chars.join('')\n}\n\nfunction bufferClone(buf) {\n if (buf.slice) {\n return buf.slice(0)\n } else {\n var view = new Uint8Array(buf.byteLength)\n view.set(new Uint8Array(buf))\n return view.buffer\n }\n}\n\nfunction Body() {\n this.bodyUsed = false\n\n this._initBody = function(body) {\n /*\n fetch-mock wraps the Response object in an ES6 Proxy to\n provide useful test harness features such as flush. However, on\n ES5 browsers without fetch or Proxy support pollyfills must be used;\n the proxy-pollyfill is unable to proxy an attribute unless it exists\n on the object before the Proxy is created. This change ensures\n Response.bodyUsed exists on the instance, while maintaining the\n semantic of setting Request.bodyUsed in the constructor before\n _initBody is called.\n */\n this.bodyUsed = this.bodyUsed\n this._bodyInit = body\n if (!body) {\n this._bodyText = ''\n } else if (typeof body === 'string') {\n this._bodyText = body\n } else if (support.blob && Blob.prototype.isPrototypeOf(body)) {\n this._bodyBlob = body\n } else if (support.formData && FormData.prototype.isPrototypeOf(body)) {\n this._bodyFormData = body\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this._bodyText = body.toString()\n } else if (support.arrayBuffer && support.blob && isDataView(body)) {\n this._bodyArrayBuffer = bufferClone(body.buffer)\n // IE 10-11 can't handle a DataView body.\n this._bodyInit = new Blob([this._bodyArrayBuffer])\n } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) {\n this._bodyArrayBuffer = bufferClone(body)\n } else {\n this._bodyText = body = Object.prototype.toString.call(body)\n }\n\n if (!this.headers.get('content-type')) {\n if (typeof body === 'string') {\n this.headers.set('content-type', 'text/plain;charset=UTF-8')\n } else if (this._bodyBlob && this._bodyBlob.type) {\n this.headers.set('content-type', this._bodyBlob.type)\n } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8')\n }\n }\n }\n\n if (support.blob) {\n this.blob = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return Promise.resolve(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(new Blob([this._bodyArrayBuffer]))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as blob')\n } else {\n return Promise.resolve(new Blob([this._bodyText]))\n }\n }\n\n this.arrayBuffer = function() {\n if (this._bodyArrayBuffer) {\n var isConsumed = consumed(this)\n if (isConsumed) {\n return isConsumed\n }\n if (ArrayBuffer.isView(this._bodyArrayBuffer)) {\n return Promise.resolve(\n this._bodyArrayBuffer.buffer.slice(\n this._bodyArrayBuffer.byteOffset,\n this._bodyArrayBuffer.byteOffset + this._bodyArrayBuffer.byteLength\n )\n )\n } else {\n return Promise.resolve(this._bodyArrayBuffer)\n }\n } else {\n return this.blob().then(readBlobAsArrayBuffer)\n }\n }\n }\n\n this.text = function() {\n var rejected = consumed(this)\n if (rejected) {\n return rejected\n }\n\n if (this._bodyBlob) {\n return readBlobAsText(this._bodyBlob)\n } else if (this._bodyArrayBuffer) {\n return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer))\n } else if (this._bodyFormData) {\n throw new Error('could not read FormData body as text')\n } else {\n return Promise.resolve(this._bodyText)\n }\n }\n\n if (support.formData) {\n this.formData = function() {\n return this.text().then(decode)\n }\n }\n\n this.json = function() {\n return this.text().then(JSON.parse)\n }\n\n return this\n}\n\n// HTTP methods whose capitalization should be normalized\nvar methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']\n\nfunction normalizeMethod(method) {\n var upcased = method.toUpperCase()\n return methods.indexOf(upcased) > -1 ? upcased : method\n}\n\nexport function Request(input, options) {\n if (!(this instanceof Request)) {\n throw new TypeError('Please use the \"new\" operator, this DOM object constructor cannot be called as a function.')\n }\n\n options = options || {}\n var body = options.body\n\n if (input instanceof Request) {\n if (input.bodyUsed) {\n throw new TypeError('Already read')\n }\n this.url = input.url\n this.credentials = input.credentials\n if (!options.headers) {\n this.headers = new Headers(input.headers)\n }\n this.method = input.method\n this.mode = input.mode\n this.signal = input.signal\n if (!body && input._bodyInit != null) {\n body = input._bodyInit\n input.bodyUsed = true\n }\n } else {\n this.url = String(input)\n }\n\n this.credentials = options.credentials || this.credentials || 'same-origin'\n if (options.headers || !this.headers) {\n this.headers = new Headers(options.headers)\n }\n this.method = normalizeMethod(options.method || this.method || 'GET')\n this.mode = options.mode || this.mode || null\n this.signal = options.signal || this.signal\n this.referrer = null\n\n if ((this.method === 'GET' || this.method === 'HEAD') && body) {\n throw new TypeError('Body not allowed for GET or HEAD requests')\n }\n this._initBody(body)\n\n if (this.method === 'GET' || this.method === 'HEAD') {\n if (options.cache === 'no-store' || options.cache === 'no-cache') {\n // Search for a '_' parameter in the query string\n var reParamSearch = /([?&])_=[^&]*/\n if (reParamSearch.test(this.url)) {\n // If it already exists then set the value with the current time\n this.url = this.url.replace(reParamSearch, '$1_=' + new Date().getTime())\n } else {\n // Otherwise add a new '_' parameter to the end with the current time\n var reQueryString = /\\?/\n this.url += (reQueryString.test(this.url) ? '&' : '?') + '_=' + new Date().getTime()\n }\n }\n }\n}\n\nRequest.prototype.clone = function() {\n return new Request(this, {body: this._bodyInit})\n}\n\nfunction decode(body) {\n var form = new FormData()\n body\n .trim()\n .split('&')\n .forEach(function(bytes) {\n if (bytes) {\n var split = bytes.split('=')\n var name = split.shift().replace(/\\+/g, ' ')\n var value = split.join('=').replace(/\\+/g, ' ')\n form.append(decodeURIComponent(name), decodeURIComponent(value))\n }\n })\n return form\n}\n\nfunction parseHeaders(rawHeaders) {\n var headers = new Headers()\n // Replace instances of \\r\\n and \\n followed by at least one space or horizontal tab with a space\n // https://tools.ietf.org/html/rfc7230#section-3.2\n var preProcessedHeaders = rawHeaders.replace(/\\r?\\n[\\t ]+/g, ' ')\n // Avoiding split via regex to work around a common IE11 bug with the core-js 3.6.0 regex polyfill\n // https://github.com/github/fetch/issues/748\n // https://github.com/zloirock/core-js/issues/751\n preProcessedHeaders\n .split('\\r')\n .map(function(header) {\n return header.indexOf('\\n') === 0 ? header.substr(1, header.length) : header\n })\n .forEach(function(line) {\n var parts = line.split(':')\n var key = parts.shift().trim()\n if (key) {\n var value = parts.join(':').trim()\n headers.append(key, value)\n }\n })\n return headers\n}\n\nBody.call(Request.prototype)\n\nexport function Response(bodyInit, options) {\n if (!(this instanceof Response)) {\n throw new TypeError('Please use the \"new\" operator, this DOM object constructor cannot be called as a function.')\n }\n if (!options) {\n options = {}\n }\n\n this.type = 'default'\n this.status = options.status === undefined ? 200 : options.status\n this.ok = this.status >= 200 && this.status < 300\n this.statusText = options.statusText === undefined ? '' : '' + options.statusText\n this.headers = new Headers(options.headers)\n this.url = options.url || ''\n this._initBody(bodyInit)\n}\n\nBody.call(Response.prototype)\n\nResponse.prototype.clone = function() {\n return new Response(this._bodyInit, {\n status: this.status,\n statusText: this.statusText,\n headers: new Headers(this.headers),\n url: this.url\n })\n}\n\nResponse.error = function() {\n var response = new Response(null, {status: 0, statusText: ''})\n response.type = 'error'\n return response\n}\n\nvar redirectStatuses = [301, 302, 303, 307, 308]\n\nResponse.redirect = function(url, status) {\n if (redirectStatuses.indexOf(status) === -1) {\n throw new RangeError('Invalid status code')\n }\n\n return new Response(null, {status: status, headers: {location: url}})\n}\n\nexport var DOMException = global.DOMException\ntry {\n new DOMException()\n} catch (err) {\n DOMException = function(message, name) {\n this.message = message\n this.name = name\n var error = Error(message)\n this.stack = error.stack\n }\n DOMException.prototype = Object.create(Error.prototype)\n DOMException.prototype.constructor = DOMException\n}\n\nexport function fetch(input, init) {\n return new Promise(function(resolve, reject) {\n var request = new Request(input, init)\n\n if (request.signal && request.signal.aborted) {\n return reject(new DOMException('Aborted', 'AbortError'))\n }\n\n var xhr = new XMLHttpRequest()\n\n function abortXhr() {\n xhr.abort()\n }\n\n xhr.onload = function() {\n var options = {\n status: xhr.status,\n statusText: xhr.statusText,\n headers: parseHeaders(xhr.getAllResponseHeaders() || '')\n }\n options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL')\n var body = 'response' in xhr ? xhr.response : xhr.responseText\n setTimeout(function() {\n resolve(new Response(body, options))\n }, 0)\n }\n\n xhr.onerror = function() {\n setTimeout(function() {\n reject(new TypeError('Network request failed'))\n }, 0)\n }\n\n xhr.ontimeout = function() {\n setTimeout(function() {\n reject(new TypeError('Network request failed'))\n }, 0)\n }\n\n xhr.onabort = function() {\n setTimeout(function() {\n reject(new DOMException('Aborted', 'AbortError'))\n }, 0)\n }\n\n function fixUrl(url) {\n try {\n return url === '' && global.location.href ? global.location.href : url\n } catch (e) {\n return url\n }\n }\n\n xhr.open(request.method, fixUrl(request.url), true)\n\n if (request.credentials === 'include') {\n xhr.withCredentials = true\n } else if (request.credentials === 'omit') {\n xhr.withCredentials = false\n }\n\n if ('responseType' in xhr) {\n if (support.blob) {\n xhr.responseType = 'blob'\n } else if (\n support.arrayBuffer &&\n request.headers.get('Content-Type') &&\n request.headers.get('Content-Type').indexOf('application/octet-stream') !== -1\n ) {\n xhr.responseType = 'arraybuffer'\n }\n }\n\n if (init && typeof init.headers === 'object' && !(init.headers instanceof Headers)) {\n Object.getOwnPropertyNames(init.headers).forEach(function(name) {\n xhr.setRequestHeader(name, normalizeValue(init.headers[name]))\n })\n } else {\n request.headers.forEach(function(value, name) {\n xhr.setRequestHeader(name, value)\n })\n }\n\n if (request.signal) {\n request.signal.addEventListener('abort', abortXhr)\n\n xhr.onreadystatechange = function() {\n // DONE (success or failure)\n if (xhr.readyState === 4) {\n request.signal.removeEventListener('abort', abortXhr)\n }\n }\n }\n\n xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit)\n })\n}\n\nfetch.polyfill = true\n\nif (!global.fetch) {\n global.fetch = fetch\n global.Headers = Headers\n global.Request = Request\n global.Response = Response\n}\n","import \"whatwg-fetch\";\n\nexport default class API {\n static csrfToken() {\n return fetch(\"/api/users/csrf_token\", {\n method: \"GET\",\n credentials: \"same-origin\"\n }).then(response => {\n return response.json();\n });\n }\n\n static currentUserInfo() {\n return fetch(\"/api/users/current_user_info\", {\n method: \"GET\",\n credentials: \"same-origin\"\n }).then(response => {\n return response.json();\n });\n }\n\n static addUserRecentVisitedTopicLogs(topic_id) {\n let body = JSON.stringify({ topic_id: topic_id });\n\n return fetch(\"/api/users/recent_visited_topics\", {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: {\n 'Content-Type': 'application/json'\n },\n body: body\n }).then(response => {\n return response.json();\n });\n }\n\n static addUserRecentVisitedBoardLogs(board_id) {\n let body = JSON.stringify({ board_id: board_id });\n\n return fetch(\"/api/users/visited_boards\", {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: {\n 'Content-Type': 'application/json'\n },\n body: body\n }).then(response => {\n return response.json();\n });\n }\n\n static addUserRecentVisitedAuthorLogs(author_id) {\n let body = JSON.stringify({ author_id: author_id });\n\n return fetch(\"/api/users/visited_authors\", {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: {\n 'Content-Type': 'application/json'\n },\n body: body\n }).then(response => {\n return response.json();\n });\n }\n\n\n static userLatestUsedNameInTopic(topic_id) {\n let url = \"/api/users/topics/latest_used_name?topic_id=\" + topic_id;\n\n return fetch(url, {\n method: \"GET\",\n credentials: \"same-origin\"\n }).then(response => {\n return response.json();\n });\n }\n\n static boardReadStatus(board_id) {\n let url = \"/api/users/boards/\" + board_id + \"/read_status\";\n return fetch(url, {\n method: \"GET\",\n credentials: \"same-origin\"\n }).then(response => {\n return response.json();\n });\n }\n\n static updateReadStatus(board_id, readStatus) {\n let url = \"/api/users/boards/\" + board_id + \"/read_status\";\n let body = JSON.stringify({ read_status: readStatus });\n\n return fetch(url, {\n method: \"PATCH\",\n credentials: \"same-origin\",\n headers: {\n 'Content-Type': 'application/json'\n },\n body: body\n }).then(response => {\n return response.json();\n });\n }\n\n static updateReadStatusPlanToReadFromTopic(board_id, topic_id) {\n let url = \"/api/users/boards/\" + board_id + \"/read_status/plan_to_read_from_topic\";\n let body = JSON.stringify({\n topic_id: topic_id,\n });\n\n return fetch(url, {\n method: \"PATCH\",\n credentials: \"same-origin\",\n headers: {\n 'Content-Type': 'application/json'\n },\n body: body\n }).then(response => {\n return response.json();\n });\n }\n\n static updateReadStatusPlanToReadFromListItem(board_id, list_item_id) {\n let url = \"/api/users/boards/\" + board_id + \"/read_status/plan_to_read_from_list_item\";\n let body = JSON.stringify({\n list_item_id: list_item_id,\n });\n\n return fetch(url, {\n method: \"PATCH\",\n credentials: \"same-origin\",\n headers: {\n 'Content-Type': 'application/json'\n },\n body: body\n }).then(response => {\n return response.json();\n });\n }\n\n static boardFavoriteRating(board_id) {\n let url = \"/api/users/boards/\" + board_id + \"/favorite_rating\";\n return fetch(url, {\n method: \"GET\",\n credentials: \"same-origin\"\n }).then(response => {\n return response.json();\n });\n }\n\n static userBoardFavoriteRating(userKey, board_id) {\n let url = \"/api/users/\" + userKey + \"/boards/\" + board_id + \"/favorite_rating\";\n return fetch(url, {\n method: \"GET\",\n credentials: \"same-origin\"\n }).then(response => {\n return response.json();\n });\n }\n\n static userBoardReviewed(userKey, board_id) {\n let url = \"/api/users/\" + userKey + \"/boards/\" + board_id + \"/reviewed\";\n return fetch(url, {\n method: \"GET\",\n credentials: \"same-origin\"\n }).then(response => {\n return response.json();\n });\n }\n\n static updateFavoriteRating(board_id, favoriteRating, publicStatus) {\n let url = \"/api/users/boards/\" + board_id + \"/favorite_rating\";\n let body = JSON.stringify({\n favorite_rating: favoriteRating,\n public_status: publicStatus\n });\n\n return fetch(url, {\n method: \"PATCH\",\n credentials: \"same-origin\",\n headers: {\n 'Content-Type': 'application/json'\n },\n body: body\n }).then(response => {\n return response.json();\n });\n }\n\n static boardReadingNote(board_id) {\n let url = \"/api/users/boards/\" + board_id + \"/reading_note\";\n return fetch(url, {\n method: \"GET\",\n credentials: \"same-origin\"\n }).then(response => {\n return response.json();\n });\n }\n\n static updateReadingNote(board_id, readingNoteMemo) {\n let url = \"/api/users/boards/\" + board_id + \"/reading_note\";\n let body = JSON.stringify({ memo: readingNoteMemo });\n\n return fetch(url, {\n method: \"PATCH\",\n credentials: \"same-origin\",\n headers: {\n 'Content-Type': 'application/json'\n },\n body: body\n }).then(response => {\n return response.json();\n });\n }\n\n\n static boardRereading(board_id) {\n let url = \"/api/users/boards/\" + board_id + \"/reread\";\n return fetch(url, {\n method: \"GET\",\n credentials: \"same-origin\"\n }).then(response => {\n return response.json();\n });\n }\n\n static addBoardReread(board_id) {\n let url = \"/api/users/boards/\" + board_id + \"/reread\";\n return fetch(url, {\n method: \"POST\",\n credentials: \"same-origin\"\n }).then(response => {\n return response.json();\n });\n }\n\n static removeBoardReread(board_id) {\n let url = \"/api/users/boards/\" + board_id + \"/reread\";\n return fetch(url, {\n method: \"DELETE\",\n credentials: \"same-origin\"\n });\n }\n\n static topicViewCounter(topic_id) {\n let url = \"/api/topics/\" + topic_id + \"/view_counter\";\n return fetch(url, {\n method: \"PATCH\",\n credentials: \"same-origin\"\n }).then(response => {\n return response.json();\n });\n }\n\n static userBoardListViewCounter(user_board_list_id) {\n let url = \"/api/user_board_lists/\" + user_board_list_id + \"/view_counter\";\n return fetch(url, {\n method: \"PATCH\",\n credentials: \"same-origin\"\n }).then(response => {\n return response.json();\n });\n }\n\n static async themeViewCounter(theme_id) {\n let url = \"/api/themes/\" + theme_id + \"/view_counter\";\n const response = await fetch(url, {\n method: \"PATCH\",\n credentials: \"same-origin\"\n });\n return await response.json();\n }\n\n\n static authorViewCounter(author_id) {\n let url = \"/api/authors/\" + author_id + \"/view_counter\";\n return fetch(url, {\n method: \"PATCH\",\n credentials: \"same-origin\"\n }).then(response => {\n return response.json();\n });\n }\n\n static boardViewCounter(board_id) {\n let url = \"/api/boards/\" + board_id + \"/view_counter\";\n return fetch(url, {\n method: \"PATCH\",\n credentials: \"same-origin\"\n }).then(response => {\n return response.json();\n });\n }\n\n static userFollowing(key) {\n let url = \"/api/users/\" + key + \"/follow\";\n return fetch(url, {\n method: \"GET\",\n credentials: \"same-origin\"\n }).then(response => {\n return response.json();\n });\n }\n\n static addUserFollow(key) {\n let url = \"/api/users/\" + key + \"/follow\";\n return fetch(url, {\n method: \"POST\",\n credentials: \"same-origin\"\n }).then(response => {\n return response.json();\n });\n }\n\n static removeUserFollow(key) {\n let url = \"/api/users/\" + key + \"/follow\";\n return fetch(url, {\n method: \"DELETE\",\n credentials: \"same-origin\"\n });\n }\n\n static boardFollowing(board_id) {\n let url = \"/api/users/boards/\" + board_id + \"/follow\";\n return fetch(url, {\n method: \"GET\",\n credentials: \"same-origin\"\n }).then(response => {\n return response.json();\n });\n }\n\n static addBoardFollow(board_id) {\n let url = \"/api/users/boards/\" + board_id + \"/follow\";\n return fetch(url, {\n method: \"POST\",\n credentials: \"same-origin\"\n }).then(response => {\n return response.json();\n });\n }\n\n static removeBoardFollow(board_id) {\n let url = \"/api/users/boards/\" + board_id + \"/follow\";\n return fetch(url, {\n method: \"DELETE\",\n credentials: \"same-origin\"\n });\n }\n\n static authorFollowing(author_id) {\n let url = \"/api/users/authors/\" + author_id + \"/follow\";\n return fetch(url, {\n method: \"GET\",\n credentials: \"same-origin\"\n }).then(response => {\n return response.json();\n });\n }\n\n static addAuthorFollow(author_id) {\n let url = \"/api/users/authors/\" + author_id + \"/follow\";\n return fetch(url, {\n method: \"POST\",\n credentials: \"same-origin\"\n }).then(response => {\n return response.json();\n });\n }\n\n static removeAuthorFollow(author_id) {\n let url = \"/api/users/authors/\" + author_id + \"/follow\";\n return fetch(url, {\n method: \"DELETE\",\n credentials: \"same-origin\"\n });\n }\n\n static topicStatus(topic_id) {\n let url = \"/api/users/topics/\" + topic_id + \"/status\";\n return fetch(url, {\n method: \"GET\",\n credentials: \"same-origin\"\n }).then(response => {\n return response.json();\n });\n }\n\n static topicFollowing(topic_id) {\n let url = \"/api/users/topics/\" + topic_id + \"/follow\";\n return fetch(url, {\n method: \"GET\",\n credentials: \"same-origin\"\n }).then(response => {\n return response.json();\n });\n }\n\n static addTopicFollow(topic_id) {\n let url = \"/api/users/topics/\" + topic_id + \"/follow\";\n return fetch(url, {\n method: \"POST\",\n credentials: \"same-origin\"\n }).then(response => {\n return response.json();\n });\n }\n\n static removeTopicFollow(topic_id) {\n let url = \"/api/users/topics/\" + topic_id + \"/follow\";\n return fetch(url, {\n method: \"DELETE\",\n credentials: \"same-origin\"\n });\n }\n\n static userTopicOwned(topic_id) {\n let url = \"/api/users/topics/\" + topic_id + \"/owned\";\n return fetch(url, {\n method: \"GET\",\n credentials: \"same-origin\"\n }).then(response => {\n return response.json();\n });\n }\n\n static async commentSelfReply(comment_id) {\n let url = \"/api/comments/\" + comment_id + \"/self_replies\";\n const response = await fetch(url, {\n method: \"GET\",\n credentials: \"same-origin\"\n });\n return await response.json();\n }\n\n\n static async commentRateLimit() {\n let url = \"/api/comments/rate_limits\";\n const response = await fetch(url, {\n method: \"GET\",\n credentials: \"same-origin\"\n });\n return await response.json();\n }\n\n static userTopicCommentsEditable(topic_id, comment_ids) {\n let url = \"/api/users/topics/\" + topic_id + \"/comments/editable\";\n let i = 0;\n let query = \"?\";\n let key = \"comment_ids\";\n\n for (i = 0; i < comment_ids.length; i++) {\n query += key + \"[]\";\n query += \"=\";\n query += comment_ids[i];\n query += \"&\";\n }\n query = query.substr(0, query.length - 1);\n\n return fetch(url + query, {\n method: \"GET\",\n credentials: \"same-origin\"\n }).then(response => {\n return response.json();\n });\n }\n}\n","class loginStateStore {\n constructor() {\n this._data = {\n userId: null,\n key: null,\n adminPagePath: null,\n iconPath: null,\n notificationCount: null,\n loginProviderName: null,\n loginProvideriCon: null,\n hasProfile: null,\n userPrivateIconPath: null\n };\n }\n\n setState(json) {\n this._data.userId = json.user_id;\n this._data.iconPath = json.icon;\n this._data.key = json.key;\n this._data.notificationCount = json.notification_count;\n this._data.adminPagePath = json.admin_page_path;\n this._data.loginProviderName = json.login_provider_name;\n this._data.loginProviderIcon = json.login_provider_icon;\n this._data.hasProfile = json.has_profile;\n this._data.userPrivateIconPath = json.user_private_icon_path;\n }\n\n isLoggedIn() {\n return this._data.key !== undefined && this._data.key !== null;\n }\n\n isAdmin() {\n return (\n this._data.adminPagePath !== undefined &&\n this._data.adminPagePath !== null\n );\n }\n\n isUser() {\n return this.isLoggedIn();\n }\n\n getUserIconPath() {\n return this._data.iconPath;\n }\n\n getUserPrivateIconPath() {\n return this._data.userPrivateIconPath;\n }\n\n getAdminPagePath() {\n return this._data.adminPagePath;\n }\n\n getNotificationCount() {\n return this._data.notificationCount;\n }\n\n get() {\n return this._data;\n }\n\n getKey() {\n return this._data.key;\n }\n\n getLoginProviderName() {\n return this._data.loginProviderName;\n }\n\n getLoginProviderIconPath() {\n return this._data.loginProviderIcon;\n }\n\n hasProfile() {\n return this._data.hasProfile;\n }\n\n getnotificationCount() {\n return this._data.notificationCount;\n }\n}\n\nconst loginStateStoreInstance = new loginStateStore();\nObject.freeze(loginStateStoreInstance);\nexport default loginStateStoreInstance;\n","class PubsubStore {\n constructor() {\n this.topics = {};\n this.subCount = 0;\n }\n\n publish(topic, args) {\n if (!this.topics[topic]) {\n return;\n }\n const subscribers = this.topics[topic];\n subscribers.forEach(sub => {\n sub.callback(args);\n });\n }\n\n subscribe(topic, cb) {\n if (!this.topics[topic]) {\n this.topics[topic] = [];\n }\n const subid = `subscriber_${this.subCount++}`;\n this.topics[topic].push({\n subscriberId: subid,\n callback: cb\n });\n return subid;\n }\n\n unsubscribe(subid) {\n const targets = [];\n Object.keys(this.topics).forEach(k => {\n this.topics[key].forEach((t, idx) => {\n if (t.subscriberId === subid) {\n targets.push({\n key: k,\n index: idx\n });\n }\n });\n });\n targets.forEach(target => {\n this.topics[target.key].slice(target.index, 1);\n });\n }\n}\n\nconst pubsubStoreInstance = new PubsubStore();\nexport default pubsubStoreInstance;\n","class csrfTokenStore {\n constructor() {\n this._data = {\n csrfParam: null,\n csrfToken: null\n };\n }\n\n setState(csrfParam, csrfToken) {\n this._data.csrfParam = csrfParam;\n this._data.csrfToken = csrfToken;\n }\n\n getCsrfParam() {\n return this._data.csrfParam;\n }\n\n getCsrfToken() {\n return this._data.csrfToken;\n }\n\n get() {\n return this._data;\n }\n}\n\nconst csrfTokenStoreInstance = new csrfTokenStore();\nObject.freeze(csrfTokenStoreInstance);\nexport default csrfTokenStoreInstance;\n","class QuicklinkHelper {\n constructor() {\n this.options = null;\n this.quicklink_reset_func = null;\n }\n\n setOptions(options) {\n this.options = options;\n }\n \n listen() {\n this.reset()\n this.quicklink_reset_func = quicklink.listen(this.options);\n }\n\n prefetch(url) {\n quicklink.prefetch(url);\n }\n\n reset() {\n if (this.quicklink_reset_func !== null) {\n this.quicklink_reset_func();\n }\n }\n}\n\nconst quicklinkHelperInstance = new QuicklinkHelper();\nexport default quicklinkHelperInstance;\n","import Api from \"../Api\";\nimport loginStateStore from \"../login_state_store\";\nimport pubsubStore from \"../pubsub_store\";\nimport csrfTokenStore from \"../csrf_token_store\";\nimport quicklinkHelperInstance from \"../quicklink_helper\";\n\nlet app = {\n inController: function (name) {\n let target_name = \"html.\" + name.replace(/\\//g, \"-\") + \"-controller\";\n return document.querySelectorAll(target_name).length > 0;\n },\n inActon: function (name) {\n let target_name = \"html.\" + name + \"-action\";\n return document.querySelectorAll(target_name).length > 0;\n },\n inLayout: function (name) {\n let target_name = \"html.\" + name + \"-layout\";\n return document.querySelectorAll(target_name).length > 0;\n },\n isSmartPhone: function () {\n let w = parseFloat(\n window.getComputedStyle(document.body, null).width.replace(\"px\", \"\")\n );\n if (w < 1200) {\n return true;\n }\n return false;\n },\n headerHeight: function () {\n return this.isSmartPhone() ? 55 : 70;\n },\n scrollToHash: function (targetId) {\n const targetElement = document.querySelector(targetId);\n const targetOffsetTop =\n window.pageYOffset +\n targetElement.getBoundingClientRect().top -\n this.headerHeight();\n window.scrollTo({\n top: targetOffsetTop,\n behavior: \"auto\"\n });\n }\n};\n\nwindow.app = app;\n\nApi.currentUserInfo().then(json => {\n loginStateStore.setState(json);\n pubsubStore.publish(\"userLoginCompleted\", loginStateStore.get());\n});\n\nApi.csrfToken().then(json => {\n csrfTokenStore.setState(json.csrf_param, json.csrf_token);\n pubsubStore.publish(\"csrfTokenCompleted\", csrfTokenStore.get());\n});\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n let elements = document.querySelectorAll(\"form\");\n if (elements.length === 0) {\n return;\n }\n elements.forEach(element => {\n element.addEventListener(\"submit\", function (event) {\n let submitButton = element.querySelector('button[type=\"submit\"]');\n submitButton.disabled = true;\n });\n });\n});\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n let elements = document.getElementsByClassName(\"glightbox\");\n if (elements.length === 0) {\n return;\n }\n\n const lightbox = GLightbox({\n touchNavigation: true,\n loop: true,\n autoplayVideos: true\n });\n});\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n let elements = document.getElementsByClassName(\"application-layout\");\n if (elements.length === 0) {\n return;\n }\n\n const quicklinkEnabledElement = document.querySelector('meta[name=\"quicklink_enabled\"]')\n let quicklinkEnabled = false\n\n if (quicklinkEnabledElement !== null) {\n quicklinkEnabled = quicklinkEnabledElement.content === 'true' ? true : false\n }\n\n const quicklinkThrottleElement = document.querySelector('meta[name=\"quicklink_throttle\"]')\n let quicklinkThrottle = 1\n\n if (quicklinkThrottleElement !== null) {\n quicklinkThrottle = quicklinkThrottleElement.content !== '' ? parseInt(quicklinkThrottleElement.content) : 1\n }\n\n const quicklinkListenEnabledElement = document.querySelector('meta[name=\"quicklink_listen_enabled\"]')\n let quicklinkListenEnabled = false\n\n if (quicklinkListenEnabledElement !== null) {\n quicklinkListenEnabled = quicklinkListenEnabledElement.content === 'true' ? true : false\n }\n\n if (quicklinkEnabled == true) {\n const options = {\n throttle: quicklinkThrottle,\n ignores: [\n /\\/me\\/?/,\n /\\/admin\\/?/,\n /\\/login\\/?/,\n /\\/logout\\/?/,\n /\\/auth\\/twitter/,\n /\\/auth\\/facebook/,\n /\\/auth\\/line/,\n /\\/auth\\/google_oauth2/,\n /\\/auth\\/yahoojp/,\n /\\/stores\\/?/,\n /\\/previews\\/?/,\n /\\/import_links\\/?/,\n /\\/search\\/?/,\n /\\/advanced_search\\/?/,\n /\\/replies\\/?/,\n /\\/notifications\\/?/,\n /\\/filter_search\\/?/,\n /\\/free_campaigns\\/?/,\n /\\/web_manga\\/redirect\\/?/,\n (uri, elem) => {\n let res = false\n if (uri.includes('#')) {\n res = true\n }\n if (elem.rel.includes('noprefetch')) {\n res = true\n }\n if (elem.classList.contains(\"manba-quicklink-prefetch\")) {\n res = true\n }\n return res\n }\n ]\n };\n\n if (quicklinkListenEnabled == true) {\n quicklinkHelperInstance.setOptions(options);\n quicklinkHelperInstance.listen();\n }\n\n const nextPageElement = document.head.querySelector('link[rel=\"next\"]')\n if (nextPageElement != null) {\n quicklinkHelperInstance.prefetch(nextPageElement.href);\n }\n const prevPageElement = document.head.querySelector('link[rel=\"prev\"]')\n if (prevPageElement != null) {\n quicklinkHelperInstance.prefetch(prevPageElement.href);\n }\n\n const prefetchElements = document.querySelectorAll('a.manba-quicklink-prefetch')\n prefetchElements.forEach(element => {\n quicklinkHelperInstance.prefetch(element.href);\n });\n }\n});\n\npubsubStore.subscribe(\"userLoginCompleted\", args => {\n\n return;\n if (loginStateStore.isLoggedIn() == true) {\n console.log(\"ログイン済みなので広告を出さない\");\n return;\n }\n function loadGoogleAdSense() {\n // GoogleAdSense読込み\n const ad = document.createElement(\"script\");\n ad.type = \"text/javascript\";\n ad.async = true;\n ad.crossorigin = 'anonymous';\n ad.src = \"https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-3438061032850215\";\n const sc = document.getElementsByTagName(\"script\")[0];\n sc.parentNode.insertBefore(ad, sc);\n }\n\n // 遅延読込み\n let lazyLoad = false;\n function onLazyLoad() {\n if (lazyLoad === false) {\n // 複数呼び出し回避 + イベント解除\n lazyLoad = true;\n window.removeEventListener('scroll', onLazyLoad);\n window.removeEventListener('mousemove', onLazyLoad);\n window.removeEventListener('mousedown', onLazyLoad);\n window.removeEventListener('touchstart', onLazyLoad);\n window.removeEventListener('keydown', onLazyLoad);\n\n loadGoogleAdSense();\n }\n }\n window.addEventListener(\"scroll\", onLazyLoad, { passive: true });\n window.addEventListener('mousemove', onLazyLoad, { passive: true });\n window.addEventListener('mousedown', onLazyLoad, { passive: true });\n window.addEventListener('touchstart', onLazyLoad, { passive: true });\n window.addEventListener('keydown', onLazyLoad, { passive: true });\n window.addEventListener(\"load\", function () {\n // ドキュメント途中(更新時 or ページ内リンク)\n if (window.scrollY > 0) {\n onLazyLoad();\n }\n });\n\n let applicationElement = document.querySelector(\".application-layout\");\n window.setTimeout(onLazyLoad, applicationElement ? 3000 : 0);\n\n});\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n let setCsrfMetaTag = () => {\n let csrfParamElement = document.querySelector(\"[name=csrf-param]\");\n let csrfTokenElement = document.querySelector(\"[name=csrf-token]\");\n csrfParamElement.content = csrfTokenStore.getCsrfParam();\n csrfTokenElement.content = csrfTokenStore.getCsrfToken();\n };\n\n pubsubStore.subscribe(\"csrfTokenCompleted\", args => {\n setCsrfMetaTag();\n });\n\n});\n\ndocument.addEventListener('render_async_load', function (event) {\n pubsubStore.publish(\"renderAsyncLoad\", event.container);\n});\n","import Api from \"../Api\";\nimport loginStateStore from \"../login_state_store\";\nimport pubsubStore from \"../pubsub_store\";\n\nclass ReadingNoteModule {\n constructor() {\n this.baseHeight = 125;\n this.modules = document.querySelectorAll(\".board-new-reading-note-module\");\n }\n\n initializeModules() {\n this.modules.forEach(element => {\n if (loginStateStore.isLoggedIn()) {\n this.initDialog(element);\n this.initReadingNote(element);\n } else {\n this.attachLoginRedirect(element);\n }\n });\n }\n\n initReadingNote(element) {\n const readingNoteTextInputElement = element.querySelector(\".reading-notes-text-input\");\n let clientHeight = readingNoteTextInputElement.clientHeight;\n\n readingNoteTextInputElement.addEventListener(\"input\", (event) => {\n event.stopPropagation();\n readingNoteTextInputElement.style.height = `${clientHeight}px`;\n let scrollHeight = readingNoteTextInputElement.scrollHeight > this.baseHeight ? readingNoteTextInputElement.scrollHeight : this.baseHeight;\n readingNoteTextInputElement.style.height = `${scrollHeight}px`;\n });\n\n const boardId = element.dataset.boardId;\n Api.boardReadingNote(boardId).then(json => {\n readingNoteTextInputElement.textContent = json.memo;\n });\n }\n\n attachLoginRedirect(element) {\n const newReadingNoteLink = element.querySelector(\".new-reading-note-link\");\n newReadingNoteLink.addEventListener('click', () => {\n const uri = encodeURI(location.pathname + location.search + location.hash);\n location.href = '/login?rt=' + uri;\n });\n }\n\n initDialog(element) {\n const boardId = element.dataset.boardId;\n const newReadingNoteLink = element.querySelector(\".new-reading-note-link\");\n const dialogElement = element.querySelector(\".board-new-reading-note-dialog\");\n const closeButton = dialogElement.querySelector(\".close-button\");\n const saveButton = dialogElement.querySelector(\".save-button\");\n\n newReadingNoteLink.addEventListener('click', () => {\n dialogElement.showModal();\n });\n\n closeButton.addEventListener('click', () => {\n dialogElement.close();\n });\n\n dialogElement.addEventListener('click', (event) => {\n if (event.target.closest('.board-new-reading-note-dialog-contents') === null) {\n dialogElement.close();\n }\n });\n\n saveButton.addEventListener('click', () => {\n const memo = this.getReadingNoteMemo(element);\n Api.updateReadingNote(boardId, memo);\n pubsubStore.publish(\"boardStatusChange\", null);\n dialogElement.close();\n });\n }\n\n getReadingNoteMemo(element) {\n const readingNoteTextInputElement = element.querySelector(\".reading-notes-text-input\");\n return readingNoteTextInputElement.value;\n }\n\n setReadingNoteMemo(element, text) {\n const readingNoteTextInputElement = element.querySelector(\".reading-notes-text-input\");\n readingNoteTextInputElement.textContent = text;\n }\n}\n\nconst readingNoteModuleInstance = new ReadingNoteModule();\nexport default readingNoteModuleInstance;\n\ndocument.addEventListener(\"DOMContentLoaded\", function () {\n pubsubStore.subscribe(\"userLoginCompleted\", () => readingNoteModuleInstance.initializeModules());\n pubsubStore.subscribe(\"boardStatusChange\", () => { });\n});\n","import pubsubStore from \"../../pubsub_store\";\nimport loginStateStore from \"../../login_state_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function(event) {\n \"use strict\";\n\n let element = document.getElementById(\"js-menu-smartphone-admin-link\");\n\n if (element == null) {\n return;\n }\n\n let initLoginState = () => {\n let targetElement = document.getElementById(\n \"js-menu-smartphone-admin-link\"\n );\n\n if (loginStateStore.isAdmin()) {\n let adminLinkElement = document.querySelector(\n \".smartphone-header-admin-link a\"\n );\n adminLinkElement.href = loginStateStore.getAdminPagePath();\n adminLinkElement.setAttribute(\"rel\", 'noprefetch' );\n\n targetElement.style.display = \"block\";\n } else {\n targetElement.remove();\n }\n };\n\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n initLoginState();\n });\n});\n","import pubsubStore from \"../../pubsub_store\";\nimport loginStateStore from \"../../login_state_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function(event) {\n \"use strict\";\n\n let element = document.getElementById(\"js-menu-smartphone-login-icon\");\n\n if (element == null) {\n return;\n }\n\n let initLoginState = () => {\n let targetElement = document.getElementById(\n \"js-menu-smartphone-login-icon\"\n );\n let loginElement = targetElement.querySelector(\".menu-login-icon .logined\");\n let notLoginElement = targetElement.querySelector(\n \".menu-login-icon .not-login\"\n );\n\n if (loginStateStore.isUser()) {\n notLoginElement.style.display = \"none\";\n loginElement.style.display = \"block\";\n\n let loginLinkElement = loginElement.querySelector(\"a\");\n loginLinkElement.href = \"/me\";\n\n let loginImgElement = loginElement.querySelector(\"img\");\n loginImgElement.src = loginStateStore.getUserIconPath();\n\n if (loginStateStore.getNotificationCount() >= 1) {\n let notificationElement = loginElement.querySelector(\n \".notifications-count\"\n );\n notificationElement.style.display = \"block\";\n notificationElement.innerText = loginStateStore.getNotificationCount();\n }\n } else {\n notLoginElement.style.display = \"block\";\n }\n };\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n initLoginState();\n });\n});\n","import pubsubStore from \"../../pubsub_store\";\nimport loginStateStore from \"../../login_state_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function(event) {\n \"use strict\";\n\n let element = document.getElementById(\"js-menu-desktop-login-icon\");\n\n if (element == null) {\n return;\n }\n\n let initLoginState = () => {\n let targetElement = document.getElementById(\"js-menu-desktop-login-icon\");\n let loginElement = targetElement.querySelector(\".menu-login-icon .logined\");\n let notLoginElement = targetElement.querySelector(\n \".menu-login-icon .not-login\"\n );\n\n if (loginStateStore.isUser()) {\n loginElement.style.display = \"flex\";\n let loginLinkElement = loginElement.querySelector(\"a\");\n loginLinkElement.href = \"/me\";\n\n let loginImgElement = loginElement.querySelector(\"img\");\n loginImgElement.src = loginStateStore.getUserIconPath();\n\n if (loginStateStore.getNotificationCount() >= 1) {\n let notificationElement = loginElement.querySelector(\n \".notifications-count\"\n );\n notificationElement.style.display = \"block\";\n notificationElement.innerText = loginStateStore.getNotificationCount();\n }\n\n if (loginStateStore.isAdmin()) {\n let adminTextElement = loginElement.querySelector(\".admin-text\");\n let adminLinkElement = loginElement.querySelector(\".admin-text a\");\n adminLinkElement.href = loginStateStore.getAdminPagePath();\n adminLinkElement.setAttribute(\"rel\", 'noprefetch' );\n\n adminTextElement.style.display = \"block\";\n }\n notLoginElement.remove();\n } else {\n loginElement.remove();\n notLoginElement.style.display = \"block\";\n }\n };\n\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n initLoginState();\n });\n});\n","import pubsubStore from \"../pubsub_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n \"use strict\";\n\n const module = document.querySelector(\".footer-function-menu-module\");\n\n if (!module) {\n return;\n }\n\n let initState = () => {\n const overlayElement = document.querySelector(\".pr-footer-overlay-module\");\n\n if (overlayElement === null) {\n return;\n }\n\n module.classList.add(\"overlay\");\n\n };\n\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n initState();\n });\n\n});\n","import pubsubStore from \"../../pubsub_store\";\nimport loginStateStore from \"../../login_state_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n \"use strict\";\n\n let modules = document.querySelectorAll(\".profiles-user-module\");\n if (modules.length == 0) {\n return;\n }\n\n let initSettingState = element => {\n let key = loginStateStore.getKey();\n let loginProviderName = loginStateStore.getLoginProviderName();\n let loginProviderIcon = loginStateStore.getLoginProviderIconPath();\n let hasProfile = loginStateStore.hasProfile();\n\n let targetKey = element.dataset.userKey;\n let userProfileSettingLinkElement = element.querySelector(\n \".user-profile-setting-link\"\n );\n let userProfileLinksElement = element.querySelector(\".user-profile-links\");\n let loginProvider = element.querySelector(\".login-provider\");\n let userHasProfileElement = element.querySelector(\".user-has-profile\");\n\n if (key === targetKey) {\n if (hasProfile === false) {\n userHasProfileElement.style.display = \"block\";\n } else {\n userHasProfileElement.remove();\n }\n\n userProfileLinksElement.style.display = \"block\";\n loginProvider.style.display = \"flex\";\n\n let loginProviderNameElement = loginProvider.querySelector(\n \".login-provider-name\"\n );\n loginProviderNameElement.classList.add(loginProviderName.toLowerCase());\n\n let imgElement = document.createElement(\"img\");\n imgElement.src = loginProviderIcon;\n imgElement.alt = loginProviderName;\n imgElement.width = 24;\n imgElement.height = 24;\n\n let loginProviderNameLogoElement = loginProviderNameElement.querySelector(\n \".logo\"\n );\n loginProviderNameLogoElement.appendChild(imgElement);\n\n let loginProviderNameTextElement = loginProviderNameElement.querySelector(\n \".text\"\n );\n loginProviderNameTextElement.innerText = loginProviderName;\n } else {\n userProfileSettingLinkElement.remove();\n userProfileLinksElement.remove();\n loginProvider.remove();\n userHasProfileElement.remove();\n }\n };\n\n let initPublicProfileState = element => {\n let key = loginStateStore.getKey();\n let targetKey = element.dataset.userKey;\n let myPageElements = element.querySelectorAll(\".my-page\");\n\n myPageElements.forEach(myPageElement => {\n if (key === targetKey) {\n myPageElement.style.display = \"block\";\n } else {\n myPageElement.remove();\n }\n });\n };\n let initState = () => {\n modules.forEach(element => {\n initSettingState(element);\n initPublicProfileState(element);\n });\n };\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n if (loginStateStore.isLoggedIn()) {\n initState();\n }\n });\n});\n","import csrfTokenStoreInstance from \"../../csrf_token_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function(event) {\n let isExist = document.querySelector(\"#profile-tutorials-form\");\n\n if (isExist == null) {\n return;\n }\n\n let rootElement = () => {\n return document.querySelector(\".profile-tutorials-main\");\n };\n\n let initForm = () => {\n var profileImage = document.querySelector('.profile-tutorial-icon-image img');\n let fileInput = rootElement().querySelector(\".file-field\");\n let upload = rootElement().querySelector(\".profile-tutorials-step-button.image-upload\");\n\n profileImage.addEventListener(\"click\", function (event) {\n fileInput.click();\n });\n\n fileInput.addEventListener('change', function(event) {\n var selectedFile = event.target.files[0];\n var reader = new FileReader();\n reader.onload = function(e) {\n profileImage.src = e.target.result;\n };\n reader.readAsDataURL(selectedFile);\n });\n\n upload.addEventListener(\"click\", function (event) {\n if (fileInput.files.length === 0) {\n alert('ファイルを選択してください');\n event.preventDefault();\n }\n });\n };\n initForm();\n});\n","import Api from \"../../Api\";\nimport loginStateStore from \"../../login_state_store\";\nimport pubsubStore from \"../../pubsub_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n let modules = document.querySelectorAll(\".forums-topic-module\");\n if (modules.length === 0) {\n return;\n }\n\n window.addEventListener('pageshow', function (event) {\n if (event.persisted) {\n window.location.reload();\n return\n }\n\n const [perfEntry] = performance.getEntriesByType(\"navigation\");\n if (perfEntry?.type === \"back_forward\") {\n window.location.reload();\n return\n }\n\n });\n\n let initState = () => {\n modules.forEach(async element => {\n const topicId = element.dataset.topicId;\n if (topicId !== undefined) {\n try {\n const json = await Api.topicStatus(topicId);\n let lastUpdateAtChangedElement = element.querySelector(\".last-updated-at-changed\");\n if (json.unread === false && json.last_updated_changed === true) {\n lastUpdateAtChangedElement.style.display = \"block\";\n } else {\n lastUpdateAtChangedElement.remove();\n }\n } catch (error) {\n console.error(error);\n }\n }\n });\n };\n\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n if (loginStateStore.isLoggedIn()) {\n initState();\n }\n });\n\n});\n","import Api from \"../../Api\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function(event) {\n const element = document.querySelectorAll(\".manba-magazines-clap-module\");\n if (element.length == 0) {\n return;\n }\n\n let updateClapButtonState = element => {\n let clapButton = element.getElementsByClassName(\"clap-button\")[0];\n let aritcleID = element.dataset.articleId;\n\n clapButton.classList.add(\"claped\");\n const clapText = clapButton.getElementsByClassName(\"text\")[0];\n clapText.innerText = \"✔︎ 拍手しました\";\n\n /*\n Api.authorFollowing(authorId).then(json => {\n followButton.style.display = 'block';\n if (json.following) {\n followButton.innerText = \"フォローやめる\";\n followButton.classList.add('selected')\n } else {\n followButton.innerText = \"フォローする\";\n followButton.classList.remove('selected')\n }\n })\n */\n };\n\n let modules = document.querySelectorAll(\".manba-magazines-clap-module\");\n\n modules.forEach(element => {\n let clapButton = element.getElementsByClassName(\"clap-button\")[0];\n\n clapButton.addEventListener(\"click\", function() {\n updateClapButtonState(element);\n });\n });\n});\n","import pubsubStore from \"../../pubsub_store\";\nimport loginStateStore from \"../../login_state_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n \"use strict\";\n let module = document.querySelector(\".users-floating-menu-module\");\n\n if (module == null) {\n return;\n }\n\n let floatingMenuButtonElement = module.querySelector(\".floating-menu-button\");\n let floatingMenuDialogElement = module.querySelector(\".floating-menu-dialog\");\n\n floatingMenuDialogElement.addEventListener('click', (event) => {\n if (event.target.closest('.floating-menu-dialog-contents') === null) {\n floatingMenuDialogElement.close();\n }\n });\n\n floatingMenuButtonElement.addEventListener('click', (event) => {\n floatingMenuDialogElement.showModal();\n\n const focusedElement = document.activeElement;\n\n if (focusedElement !== null) {\n focusedElement.blur();\n }\n\n });\n\n let calcFloatingPositon = element => {\n let overlayModuleElement = document.querySelector(\".pr-footer-overlay-module\");\n if (overlayModuleElement == null) {\n return;\n }\n\n element.classList.add(\"overlay\");\n\n }\n\n let initLoginState = () => {\n const userElement = module.querySelector(\".floating-menu-item-user\");\n const linkElement = userElement.querySelector(\"a.menu-link\");\n const iconElement = userElement.querySelector(\".icon\");\n const imageElement = userElement.querySelector(\".image\");\n const imgElement = userElement.querySelector(\".image img\");\n const textElement = userElement.querySelector(\".text\");\n const notificationElement = userElement.querySelector(\".notifications-count\");\n\n if (loginStateStore.isUser()) {\n textElement.innerText = \"通知\";\n linkElement.href = \"/me/notifications\";\n imgElement.src = loginStateStore.getUserIconPath();\n let notificationCount = loginStateStore.getNotificationCount()\n\n if (notificationCount >= 1) {\n notificationElement.style.display = \"block\";\n notificationElement.innerText = notificationCount;\n }\n imageElement.style.display = \"block\";\n iconElement.remove();\n } else {\n imgElement.remove();\n }\n }\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n initLoginState();\n calcFloatingPositon(module)\n module.style.display = \"block\";\n });\n});\n","import pubsubStore from \"../pubsub_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function(event) {\n \"use strict\";\n let modules = document.querySelectorAll(\".pickup-user-module\");\n\n if (modules.length == 0) {\n return;\n }\n\n let initReadMoreState = element => {\n let description = element.querySelector(\".description\");\n let readMore = element.querySelector(\".description-readmore\");\n\n if (readMore === null ){\n return\n }\n\n // readMore.addEventListener(\"click\", function() {\n // description.style.maxHeight = \"none\";\n // description.style.overflow = \"none\";\n // readMore.style.display = \"none\";\n // });\n }\n\n let initState = () => {\n modules.forEach(element => {\n initReadMoreState(element)\n });\n };\n\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n initState();\n });\n\n pubsubStore.subscribe(\"infiniteScrollPageAppend\", appendRootElement => {\n appendRootElement.querySelectorAll(\".pickup-user-module\").forEach(element => {\n initReadMoreState(element)\n });\n });\n});\n","import Api from \"../Api\";\nimport loginStateStore from \"../login_state_store\";\nimport pubsubStore from \"../pubsub_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function(event) {\n \"use strict\";\n\n let modules = document.querySelectorAll(\".reread-board-module\");\n if (modules.length == 0) {\n return;\n }\n\n let updateRereadButtonState = element => {\n let rereadButton = element.querySelector(\".reread-button\");\n let loggedInRereadButton = element.querySelector(\".action-button.logged-in\");\n let notLoggedInRereadButton = element.querySelector(\".action-button.not-logged-in\");\n\n if (loginStateStore.isLoggedIn() == false) {\n rereadButton.style.visibility = \"visible\";\n loggedInRereadButton.remove()\n return;\n }\n\n notLoggedInRereadButton.remove();\n Api.boardRereading(element.dataset.boardId).then(json => {\n loggedInRereadButton.style.visibility = \"visible\";\n if (json.rereading) {\n loggedInRereadButton.classList.add(\"selected\");\n }\n });\n };\n\n let initState = () => {\n modules.forEach(element => {\n let rootElement = element.querySelector(\".reread-board\");\n let rereadButton = rootElement.querySelector(\".reread-button\");\n let loggedInRereadButton = rootElement.querySelector(\".action-button.logged-in\");\n\n updateRereadButtonState(rootElement);\n\n if (loginStateStore.isLoggedIn() == false) {\n return;\n }\n\n rereadButton.addEventListener(\"click\", function() {\n if (loggedInRereadButton.classList.contains(\"selected\") == true) {\n loggedInRereadButton.classList.remove(\"selected\");\n Api.removeBoardReread(rootElement.dataset.boardId);\n } else {\n Api.addBoardReread(rootElement.dataset.boardId);\n loggedInRereadButton.classList.add(\"selected\");\n }\n });\n });\n };\n\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n initState();\n });\n});\n","import Api from \"../Api\";\nimport loginStateStore from \"../login_state_store\";\nimport pubsubStore from \"../pubsub_store\";\n\nclass FollowAuthorModule {\n constructor(modules) {\n this.modules = modules;\n\n if (!this.modules.length) return;\n\n this.initState();\n }\n\n async initFollowButtonState(element) {\n const authorId = element.dataset.authorId;\n const followButton = element.querySelector(\".follow-button .follow-action\");\n const textElement = element.querySelector(\".follow-button .follow-action .text\");\n\n if (!followButton || !textElement) return;\n\n if (loginStateStore.isLoggedIn()) {\n try {\n const json = await Api.authorFollowing(authorId);\n if (json.following) {\n textElement.innerText = \"フォロー中\";\n followButton.classList.add(\"selected\");\n } else {\n textElement.innerText = \"フォロー\";\n followButton.classList.remove(\"selected\");\n }\n } catch (error) {\n console.error(\"Error fetching follow status:\", error);\n }\n }\n\n followButton.addEventListener(\"click\", () => this.handleFollowButtonClick(followButton, textElement, authorId));\n }\n\n handleFollowButtonClick(followButton, textElement, authorId) {\n if (!loginStateStore.isLoggedIn()) {\n const uri = encodeURI(location.pathname + location.search + location.hash);\n location.href = '/login?rt=' + uri;\n return;\n }\n\n if (followButton.classList.contains(\"selected\")) {\n textElement.innerText = \"フォロー\";\n followButton.classList.remove(\"selected\");\n Api.removeAuthorFollow(authorId);\n } else {\n textElement.innerText = \"フォロー中\";\n followButton.classList.add(\"selected\");\n Api.addAuthorFollow(authorId);\n }\n }\n\n initState() {\n this.modules.forEach(element => this.initFollowButtonState(element));\n }\n}\n\nconst initFollowAuthorModule = (modules) => {\n if (loginStateStore.isLoggedIn()) {\n new FollowAuthorModule(modules);\n }\n};\n\ndocument.addEventListener(\"DOMContentLoaded\", function () {\n pubsubStore.subscribe(\"userLoginCompleted\", () => {\n const modules = document.querySelectorAll(\".follow-author-module\");\n if (modules.length) {\n initFollowAuthorModule(modules);\n }\n });\n\n pubsubStore.subscribe(\"infiniteScrollPageAppend\", appendRootElement => {\n const modules = appendRootElement.querySelectorAll(\".follow-author-module\");\n if (modules.length) {\n initFollowAuthorModule(modules);\n }\n });\n\n pubsubStore.subscribe(\"renderAsyncLoad\", eventContainer => {\n const modules = eventContainer.querySelectorAll(\".follow-author-module\");\n if (modules.length) {\n initFollowAuthorModule(modules);\n }\n });\n});\n\n","import Api from \"../Api\";\nimport loginStateStore from \"../login_state_store\";\nimport pubsubStore from \"../pubsub_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n \"use strict\";\n\n let modules = document.querySelectorAll(\".follow-board-module\");\n\n if (modules.length == 0) {\n return;\n }\n\n let initFollowButtonState = element => {\n let boardId = element.dataset.boardId;\n let followButton = element.querySelector(\".follow-button .action-button\");\n let actionButtonText = followButton.querySelector(\".text\");\n\n if (loginStateStore.isLoggedIn() == true) {\n Api.boardFollowing(boardId).then(json => {\n followButton.style.visibility = \"visible\";\n\n if (json.following) {\n followButton.classList.add(\"selected\");\n actionButtonText.innerText = \"フォロー中\";\n } else {\n followButton.classList.remove(\"selected\");\n actionButtonText.innerHTML = \"フォローする\";\n }\n });\n }\n followButton.addEventListener(\"click\", function () {\n if (loginStateStore.isLoggedIn() == false) {\n const uri = encodeURI(location.pathname + location.search + location.hash);\n location.href = '/login?rt=' + uri;\n return;\n }\n\n if (followButton.classList.contains(\"selected\") == true) {\n followButton.classList.remove(\"selected\");\n actionButtonText.innerHTML = \"フォローする\";\n\n Api.removeBoardFollow(boardId);\n } else {\n followButton.classList.add(\"selected\");\n actionButtonText.innerText = \"フォロー中\";\n\n Api.addBoardFollow(boardId);\n }\n });\n }\n\n let initState = () => {\n modules.forEach(element => {\n initFollowButtonState(element);\n });\n };\n\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n initState();\n });\n\n pubsubStore.subscribe(\"infiniteScrollPageAppend\", appendRootElement => {\n appendRootElement.querySelectorAll(\".follow-board-module\").forEach(element => {\n initFollowButtonState(element)\n });\n });\n\n});\n","import Api from \"../Api\";\nimport loginStateStore from \"../login_state_store\";\nimport pubsubStore from \"../pubsub_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n \"use strict\";\n let modules = document.querySelectorAll(\".follow-topic-module\");\n\n if (modules.length == 0) {\n return;\n }\n\n let updateFollowButtonState = element => {\n let followButton = element.querySelector(\".follow-button\");\n let loggedInFollowButton = element.querySelector(\".follow-button.logged-in\");\n let notLoggedInFollowButton = element.querySelector(\".follow-button.not-logged-in\");\n let topicId = element.dataset.topicId;\n\n if (loginStateStore.isLoggedIn() == false) {\n notLoggedInFollowButton.style.visibility = \"visible\";\n loggedInFollowButton.remove();\n return;\n }\n\n notLoggedInFollowButton.remove();\n Api.topicFollowing(topicId).then(json => {\n loggedInFollowButton.style.visibility = \"visible\";\n\n if (json.following) {\n loggedInFollowButton.innerText = \"フォロー中\";\n loggedInFollowButton.classList.add(\"selected\");\n } else {\n loggedInFollowButton.innerText = \"クチコミをフォローする\";\n loggedInFollowButton.classList.remove(\"selected\");\n }\n });\n };\n\n let initFollowButtonState = element => {\n let topicId = element.dataset.topicId;\n let followButton = element.querySelector(\".follow-button\");\n\n if (loginStateStore.isLoggedIn() == true) {\n Api.topicFollowing(topicId).then(json => {\n followButton.style.visibility = \"visible\";\n\n if (json.following) {\n followButton.innerText = \"フォロー中\";\n followButton.classList.add(\"selected\");\n } else {\n followButton.innerText = \"クチコミをフォローする\";\n followButton.classList.remove(\"selected\");\n }\n });\n } else {\n followButton.style.visibility = \"visible\";\n\n }\n\n followButton.addEventListener(\"click\", function () {\n if (loginStateStore.isLoggedIn() == false) {\n const uri = encodeURI(location.pathname + location.search + location.hash);\n location.href = '/login?rt=' + uri;\n return;\n }\n\n if (followButton.classList.contains(\"selected\") == true) {\n followButton.classList.remove(\"selected\");\n followButton.innerText = \"フォローする\";\n\n Api.removeTopicFollow(topicId);\n } else {\n followButton.innerText = \"フォロー中\";\n followButton.classList.add(\"selected\");\n\n Api.addTopicFollow(topicId);\n }\n });\n }\n\n let initState = () => {\n modules.forEach(element => {\n initFollowButtonState(element)\n });\n };\n\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n initState();\n });\n\n pubsubStore.subscribe(\"infiniteScrollPageAppend\", appendRootElement => {\n appendRootElement.querySelectorAll(\".follow-topic-module\").forEach(element => {\n initFollowButtonState(element)\n });\n });\n});\n","import Api from \"../Api\";\nimport loginStateStore from \"../login_state_store\";\nimport pubsubStore from \"../pubsub_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function(event) {\n \"use strict\";\n\n let modules = document.querySelectorAll(\".favorite-ratings-module\");\n\n if (modules.length == 0) {\n return;\n }\n\n let updateFavoriteRatingState = (element,favoriteRating) => {\n const favoriteRatingElements = element.querySelectorAll(\".favorite-rating\");\n\n favoriteRatingElements.forEach(favoriteRatingElement => {\n const favoriteRatingValue = favoriteRatingElement.dataset.favoriteRating\n\n if (favoriteRatingValue <= favoriteRating) {\n favoriteRatingElement.classList.add(\"selected\");\n } else {\n favoriteRatingElement.classList.remove(\"selected\");\n }\n });\n }\n\n let initFavoriteRatingAction = element => {\n const boardId = element.dataset.boardId\n\n if (loginStateStore.isLoggedIn() == false) {\n element.style.display = \"none\";\n return;\n }\n\n Api.boardFavoriteRating(boardId).then(json => {\n const favoriteRating = json.favorite_rating;\n\n if (favoriteRating == 0) {\n element.style.display = \"none\";\n return;\n }\n element.style.display = \"block\";\n updateFavoriteRatingState(element,favoriteRating)\n });\n };\n\n let initState = () => {\n modules.forEach(element => {\n initFavoriteRatingAction(element);\n });\n };\n\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n initState();\n });\n\n pubsubStore.subscribe(\"infiniteScrollPageAppend\", appentRootElement => {\n appentRootElement.querySelectorAll(\".favorite-ratings-module\").forEach(element => {\n initFavoriteRatingAction(element);\n });\n });\n});\n","import Api from \"../Api\";\nimport loginStateStore from \"../login_state_store\";\nimport pubsubStore from \"../pubsub_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n \"use strict\";\n\n let modules = document.querySelectorAll(\".favorite-ratings-action-module\");\n\n if (modules.length == 0) {\n return;\n }\n\n let updateFavoriteRatings = (element, nowFavoriteRating, newFavoriteRating) => {\n const favoriteRatingElements = element.querySelectorAll(\".favorite-rating\");\n\n if (nowFavoriteRating == newFavoriteRating) {\n favoriteRatingElements.forEach(favoriteRatingElement => {\n const favoriteRatingElementIcon = favoriteRatingElement.querySelector(\".icon-module .material-icons-outlined\");\n favoriteRatingElement.classList.remove(\"selected\");\n favoriteRatingElementIcon.textContent = \"star_border\";\n\n });\n setFavoriteRatingData(element, 0)\n return;\n }\n\n favoriteRatingElements.forEach(favoriteRatingElement => {\n const favoriteRatingValue = favoriteRatingElement.dataset.favoriteRating\n const favoriteRatingElementIcon = favoriteRatingElement.querySelector(\".icon-module .material-icons-outlined\");\n\n if (favoriteRatingValue <= newFavoriteRating) {\n favoriteRatingElement.classList.add(\"selected\");\n favoriteRatingElementIcon.textContent = \"star\";\n } else {\n favoriteRatingElement.classList.remove(\"selected\");\n favoriteRatingElementIcon.textContent = \"star_border\";\n }\n });\n setFavoriteRatingData(element, newFavoriteRating)\n\n }\n\n let getPublicStatus = (element) => {\n const publicStatusText = element.dataset.publicStatus;\n\n if (publicStatusText == \"public\") {\n return true;\n } else {\n return false;\n }\n }\n\n let getFavoriteRating = (element) => {\n const favoriteRating = element.dataset.favoriteRating;\n return favoriteRating;\n }\n\n let setFavoriteRatingValue = (element, favoriteRatingValue, publicStatus) => {\n const boardId = element.dataset.boardId;\n\n Api.updateFavoriteRating(boardId, favoriteRatingValue, publicStatus)\n }\n\n let setFavoriteRatingData = (element, favoriteRatingValue) => {\n element.dataset.favoriteRating = favoriteRatingValue\n }\n\n let getFavoriteRatingData = (element) => {\n return element.dataset.favoriteRating\n }\n\n let getPublicStatusData = (element) => {\n return element.dataset.publicStatus;\n }\n\n let setPublicStatusData = (element, publicStatusText) => {\n element.dataset.publicStatus = publicStatusText\n }\n\n let togglePublicStatusData = (element) => {\n let publicStatusText = getPublicStatusData(element);\n if (publicStatusText == \"public\") {\n setPublicStatusData(element, \"private\")\n } else {\n setPublicStatusData(element, \"public\")\n }\n }\n\n let updatePublicStatus = (element, publicStatusText) => {\n\n const publicStatusElement = element.querySelector(\".public-status\");\n const publicStatusElementIcon = publicStatusElement.querySelector(\".icon-module .material-icons-outlined\");\n\n if (publicStatusText == \"public\") {\n publicStatusElementIcon.textContent = \"public\";\n }\n\n if (publicStatusText == \"private\") {\n publicStatusElementIcon.textContent = \"lock\";\n }\n setPublicStatusData(element, publicStatusText);\n\n }\n\n let initFavoriteRatingAction = element => {\n const userKey = element.dataset.userKey;\n const boardId = element.dataset.boardId;\n\n Api.userBoardFavoriteRating(userKey, boardId).then(json => {\n const isOwner = json.is_owner;\n const publicStatus = json.public_status;\n const favoriteRating = json.favorite_rating;\n const favoriteRatingElements = element.querySelectorAll(\".favorite-rating\");\n const publicStatusElement = element.querySelector(\".public-status\");\n\n element.style.display = \"block\";\n\n if (isOwner == true) {\n publicStatusElement.style.display = \"block\";\n\n setPublicStatusData(element, publicStatus)\n updatePublicStatus(element, publicStatus);\n\n setFavoriteRatingData(element, favoriteRating)\n updateFavoriteRatings(element, 0, favoriteRating);\n\n publicStatusElement.addEventListener(\"click\", function (event) {\n event.stopPropagation();\n togglePublicStatusData(element);\n updatePublicStatus(element, getPublicStatusData(element));\n setFavoriteRatingValue(element, getFavoriteRatingData(element), getPublicStatus(element));\n });\n\n favoriteRatingElements.forEach(favoriteRatingElement => {\n favoriteRatingElement.style.cursor = 'pointer'\n favoriteRatingElement.addEventListener(\"click\", function (event) {\n event.stopPropagation();\n\n const favoriteRating = favoriteRatingElement.dataset.favoriteRating;\n\n updateFavoriteRatings(element, getFavoriteRatingData(element), favoriteRating);\n setFavoriteRatingValue(element, getFavoriteRatingData(element), getPublicStatus(element));\n });\n });\n }\n\n if (isOwner == false && publicStatus == \"public\") {\n publicStatusElement.remove()\n setFavoriteRatingData(element, favoriteRating)\n updateFavoriteRatings(element, 0, favoriteRating);\n }\n\n if (isOwner == false && publicStatus == \"private\") {\n publicStatusElement.remove()\n setFavoriteRatingData(element, 0)\n updateFavoriteRatings(element, 0, 0);\n }\n\n });\n };\n\n let initReviewdAction = element => {\n const userKey = element.dataset.userKey;\n const boardId = element.dataset.boardId;\n\n Api.userBoardReviewed(userKey, boardId).then(json => {\n const isOwner = json.is_owner;\n const reviewed = json.reviewed;\n const reviewedElement = element.querySelector(\".reviewed\");\n const reviewedElementIcon = reviewedElement.querySelector(\".icon-module .material-icons-outlined\");\n\n if (isOwner == true) {\n reviewedElement.style.display = \"block\";\n\n if (reviewed == true) {\n reviewedElementIcon.textContent = \"mark_chat_read\";\n } else {\n reviewedElementIcon.textContent = \"edit\";\n }\n\n reviewedElement.addEventListener(\"click\", function (event) {\n event.stopPropagation();\n location.href = json.redirect_url;\n });\n }\n });\n };\n\n let initModule = element => {\n initFavoriteRatingAction(element);\n initReviewdAction(element);\n };\n\n let initState = () => {\n modules.forEach(element => {\n initModule(element);\n });\n };\n\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n initState();\n });\n\n pubsubStore.subscribe(\"infiniteScrollPageAppend\", appendRootElement => {\n appendRootElement.querySelectorAll(\".favorite-ratings-action-module\").forEach(element => {\n initModule(element);\n });\n });\n});\n","import Api from \"../Api\";\nimport loginStateStore from \"../login_state_store\";\nimport pubsubStore from \"../pubsub_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n \"use strict\";\n const moduleClassName = \".board-read-status-button-module\";\n\n let getReadStateText = (readState) => {\n if (readState == \"plan_to_read\") {\n return \"読みたい\";\n }\n if (readState == \"on_hold\") {\n return \"積読\";\n }\n if (readState == \"reading\") {\n return \"読んでる\";\n }\n if (readState == \"completed\") {\n return \"読んだ\";\n }\n\n return '本棚に追加';\n }\n\n let isIconShow = (readState) => {\n if (readState == 'nothing') {\n return true;\n }\n return false\n\n }\n\n let setReadStatusActionButtonStatus = (element, readState) => {\n let readStateText = getReadStateText(readState);\n let actionButtonElement = element.querySelector(\".action-button\");\n let actionButtonElementText = actionButtonElement.querySelector(\".text\");\n let actionButtonElementIcon = actionButtonElement.querySelector(\".icon\");\n\n actionButtonElementText.innerText = readStateText\n if (isIconShow(readState)) {\n actionButtonElement.classList.remove(\"selected\");\n actionButtonElementIcon.style.display = 'display'\n } else {\n actionButtonElement.classList.add(\"selected\");\n actionButtonElementIcon.style.display = 'none'\n }\n }\n\n let initReadStatusState = (element) => {\n let readStatusButtonElement = element.querySelector(\".board-read-status-button\");\n let boardId = readStatusButtonElement.dataset.boardId;\n let readStatusActionsElement = element.querySelector(\".read-status-actions\");\n let readStatusActionButtonElement = element.querySelector(\".read-status-action-button\");\n\n readStatusButtonElement.addEventListener(\"click\", function () {\n if (loginStateStore.isLoggedIn() == false) {\n const uri = encodeURI(location.pathname + location.search + location.hash);\n location.href = '/login?rt=' + uri;\n return;\n } else {\n if (readStatusActionsElement.classList.contains(\"open\") == true) {\n readStatusActionsElement.classList.remove(\"open\");\n } else {\n readStatusActionsElement.classList.add(\"open\");\n }\n }\n });\n\n readStatusActionsElement.querySelectorAll('.action-button').forEach(readStatusActionElement => {\n readStatusActionElement.addEventListener(\"click\", function () {\n event.stopPropagation();\n\n let readStatusName = readStatusActionElement.dataset.readStatusName;\n setReadStatusActionButtonStatus(readStatusActionButtonElement, readStatusName)\n Api.updateReadStatus(boardId, readStatusName);\n\n if (readStatusName == \"completed\" || readStatusName == \"reading\") {\n let lightReviewModules = document.querySelectorAll(\".light-review-dialog-module\");\n\n if (lightReviewModules.length == 0) {\n return;\n }\n\n lightReviewModules.forEach(lightReviewModule => {\n const lightReviewBoardId = lightReviewModule.dataset.boardId;\n if (boardId == lightReviewBoardId) {\n const dialogElement = lightReviewModule.querySelector(\".light-review-dialog\");\n dialogElement.showModal();\n }\n });\n }\n });\n });\n\n };\n\n let updateReadStatusState = element => {\n let readStatusButtonElement = element.querySelector(\".board-read-status-button\");\n let readStatusActionButtonElement = element.querySelector(\".read-status-action-button\");\n let boardId = readStatusButtonElement.dataset.boardId;\n\n if (loginStateStore.isLoggedIn() == false) {\n return;\n }\n\n Api.boardReadStatus(boardId).then(json => {\n let readStatus = json.read_status;\n setReadStatusActionButtonStatus(readStatusActionButtonElement, readStatus)\n });\n };\n\n let initState = modules => {\n modules.forEach(element => {\n initReadStatusState(element)\n updateReadStatusState(element)\n });\n };\n\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n initState(document.querySelectorAll(moduleClassName));\n });\n\n pubsubStore.subscribe(\"infiniteScrollPageAppend\", appendRootElement => {\n initState(appendRootElement.querySelectorAll(moduleClassName));\n });\n\n pubsubStore.subscribe(\"renderAsyncLoad\", eventContainer => {\n initState(eventContainer.querySelectorAll(moduleClassName));\n });\n\n});\n","import Api from \"../Api\";\nimport loginStateStore from \"../login_state_store\";\nimport pubsubStore from \"../pubsub_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n \"use strict\";\n\n let modules = document.querySelectorAll(\".follow-board-action-icon-module\");\n\n if (modules.length == 0) {\n return;\n }\n\n let updateFollowActionState = element => {\n let boardId = element.dataset.boardId\n let followAction = element.querySelector(\".follow-action\");\n\n if (loginStateStore.isLoggedIn() == false) {\n return;\n }\n\n Api.boardFollowing(boardId).then(json => {\n if (json.following) {\n followAction.classList.add(\"selected\");\n }\n });\n };\n\n let initFollowAction = element => {\n let boardId = element.dataset.boardId\n let followAction = element.querySelector(\".follow-action\");\n\n followAction.addEventListener(\"click\", function () {\n if (loginStateStore.isLoggedIn() == false) {\n const uri = encodeURI(location.pathname + location.search + location.hash);\n location.href = '/login?rt=' + uri;\n return;\n }\n\n if (followAction.classList.contains(\"selected\") == true) {\n followAction.classList.remove(\"selected\");\n Api.removeBoardFollow(boardId);\n } else {\n followAction.classList.add(\"selected\");\n Api.addBoardFollow(boardId);\n }\n });\n };\n\n let initState = () => {\n modules.forEach(element => {\n initFollowAction(element);\n updateFollowActionState(element);\n });\n };\n\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n initState();\n });\n\n pubsubStore.subscribe(\"infiniteScrollPageAppend\", appentRootElement => {\n appentRootElement.querySelectorAll(\".follow-board-action-icon-module\").forEach(element => {\n initFollowAction(element);\n updateFollowActionState(element);\n });\n });\n\n});\n","import Api from \"../Api\";\nimport loginStateStore from \"../login_state_store\";\nimport pubsubStore from \"../pubsub_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n \"use strict\";\n\n let modules = document.querySelectorAll(\".follow-topic-action-icon-module\");\n\n if (modules.length === 0) {\n return;\n }\n\n let initFollowAction = element => {\n let topicId = element.dataset.topicId\n let followAction = element.querySelector(\".follow-action\");\n let followActionText = element.querySelector(\".follow-action .text\");\n let followActionIconElement = element.querySelector(\".follow-action .icon .material-icons-outlined\");\n\n Api.topicFollowing(topicId).then(json => {\n if (json.following) {\n followAction.classList.add(\"selected\");\n followActionText.innerText = \"\";\n followActionIconElement.textContent = \"notifications\";\n }\n });\n\n followAction.addEventListener(\"click\", function () {\n if (loginStateStore.isLoggedIn() == false) {\n const uri = encodeURI(location.pathname + location.search + location.hash);\n location.href = '/login?rt=' + uri;\n return;\n }\n\n if (followAction.classList.contains(\"selected\") == true) {\n followAction.classList.remove(\"selected\");\n Api.removeTopicFollow(topicId);\n followActionText.innerText = \"フォロー\";\n\n } else {\n followAction.classList.add(\"selected\");\n Api.addTopicFollow(topicId);\n followActionText.innerText = \"\";\n followActionIconElement.textContent = \"notifications\";\n }\n });\n };\n\n let initState = () => {\n modules.forEach(element => {\n initFollowAction(element);\n });\n };\n\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n initState();\n });\n\n pubsubStore.subscribe(\"infiniteScrollPageAppend\", appentRootElement => {\n appentRootElement.querySelectorAll(\".follow-topic-action-icon-module\").forEach(element => {\n initFollowAction(element);\n });\n });\n\n});\n","import Api from \"../Api\";\nimport loginStateStore from \"../login_state_store\";\nimport pubsubStore from \"../pubsub_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n \"use strict\";\n\n let modules = document.querySelectorAll(\".follow-user-action-icon-module\");\n\n if (modules.length == 0) {\n return;\n }\n\n let initFollowAction = element => {\n let key = loginStateStore.getKey();\n let userKey = element.dataset.userKey;\n let followActionElement = element.querySelector(\".follow-action\");\n let followActionText = element.querySelector(\".follow-action .text\");\n let followActionIconElement = element.querySelector(\".follow-action .icon .material-icons-outlined\");\n\n if (followActionElement == null) {\n return;\n }\n\n if (key === userKey) {\n followActionElement.remove();\n return;\n }\n\n if (loginStateStore.isLoggedIn() == true) {\n Api.userFollowing(userKey).then(json => {\n if (json.following) {\n followActionElement.classList.add(\"selected\");\n followActionText.innerText = \"\";\n followActionIconElement.textContent = \"notifications\";\n\n }\n });\n }\n\n followActionElement.addEventListener(\"click\", function () {\n if (loginStateStore.isLoggedIn() == false) {\n const uri = encodeURI(location.pathname + location.search + location.hash);\n location.href = '/login?rt=' + uri;\n return;\n }\n\n if (followActionElement.classList.contains(\"selected\") == true) {\n followActionElement.classList.remove(\"selected\");\n Api.removeUserFollow(userKey)\n followActionText.innerText = \"フォロー\";\n followActionIconElement.textContent = \"notifications\";\n\n\n } else {\n followActionElement.classList.add(\"selected\");\n Api.addUserFollow(userKey)\n followActionText.innerText = \"\";\n followActionIconElement.textContent = \"notifications\";\n\n }\n });\n };\n\n let initState = () => {\n modules.forEach(element => {\n initFollowAction(element);\n });\n };\n\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n initState();\n });\n\n pubsubStore.subscribe(\"infiniteScrollPageAppend\", appentRootElement => {\n appentRootElement.querySelectorAll(\".follow-user-action-icon-module\").forEach(element => {\n initFollowAction(element);\n });\n });\n\n});\n","import Api from \"../Api\";\nimport loginStateStore from \"../login_state_store\";\nimport pubsubStore from \"../pubsub_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n \"use strict\";\n\n let modules = document.querySelectorAll(\".follow-user-button-module\");\n\n if (modules.length == 0) {\n return;\n }\n\n let initFollowAction = element => {\n let key = loginStateStore.getKey();\n let userKey = element.dataset.userKey;\n let followActionElement = element.querySelector(\".follow-action\");\n let textElement = element.querySelector(\".follow-action .text\");\n\n if (followActionElement == null) {\n return;\n }\n\n if (key === userKey) {\n followActionElement.remove();\n return;\n }\n\n if (loginStateStore.isLoggedIn() == true) {\n Api.userFollowing(userKey).then(json => {\n if (json.following) {\n followActionElement.classList.add(\"selected\");\n textElement.innerText = \"フォロー中\";\n }\n followActionElement.style.display = 'block';\n });\n } else {\n followActionElement.style.display = 'block';\n }\n\n followActionElement.addEventListener(\"click\", function () {\n if (loginStateStore.isLoggedIn() == false) {\n const uri = encodeURI(location.pathname + location.search + location.hash);\n location.href = '/login?rt=' + uri;\n return;\n }\n\n if (followActionElement.classList.contains(\"selected\") == true) {\n followActionElement.classList.remove(\"selected\");\n Api.removeUserFollow(userKey)\n textElement.innerText = \"フォローする\";\n } else {\n followActionElement.classList.add(\"selected\");\n Api.addUserFollow(userKey)\n textElement.innerText = \"フォロー中\";\n }\n });\n };\n\n let initState = () => {\n modules.forEach(element => {\n initFollowAction(element);\n });\n };\n\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n initState();\n });\n\n pubsubStore.subscribe(\"infiniteScrollPageAppend\", appentRootElement => {\n appentRootElement.querySelectorAll(\".follow-user-button-module\").forEach(element => {\n initFollowAction(element);\n });\n });\n\n});\n","import pubsubStore from \"../pubsub_store\";\nimport loginStateStore from \"../login_state_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n \"use strict\";\n let module = document.querySelector(\".floating-menu-module\");\n\n if (module == null) {\n return;\n }\n\n let floatingMenuButtonElement = module.querySelector(\".floating-menu-button\");\n let floatingMenuDialogElement = module.querySelector(\".floating-menu-dialog\");\n\n floatingMenuDialogElement.addEventListener('click', (event) => {\n if (event.target.closest('.floating-menu-dialog-contents') === null) {\n floatingMenuDialogElement.close();\n }\n });\n\n floatingMenuButtonElement.addEventListener('click', (event) => {\n floatingMenuDialogElement.showModal();\n\n const focusedElement = document.activeElement;\n\n if (focusedElement !== null) {\n focusedElement.blur();\n }\n\n });\n\n const scrollToTopButtonElement = module.querySelector(\".floating-menu-item-scroll-to-top\");\n scrollToTopButtonElement.addEventListener('click', (event) => {\n app.scrollToHash(\"#js-scroll-to-top\")\n floatingMenuDialogElement.close();\n });\n\n let calcFloatingPositon = element => {\n let overlayModuleElement = document.querySelector(\".pr-footer-overlay-module\");\n if (overlayModuleElement == null) {\n return;\n }\n\n element.classList.add(\"overlay\");\n\n }\n\n let initLoginState = () => {\n const userElement = module.querySelector(\".floating-menu-item-user\");\n const linkElement = userElement.querySelector(\"a.menu-link\");\n const iconElement = userElement.querySelector(\".icon\");\n const imageElement = userElement.querySelector(\".image\");\n const imgElement = userElement.querySelector(\".image img\");\n const textElement = userElement.querySelector(\".text\");\n const notificationElement = userElement.querySelector(\".notifications-count\");\n\n if (loginStateStore.isUser()) {\n textElement.innerText = \"通知\";\n linkElement.href = \"/me/notifications\";\n imgElement.src = loginStateStore.getUserIconPath();\n let notificationCount = loginStateStore.getNotificationCount()\n\n if (notificationCount >= 1) {\n notificationElement.style.display = \"block\";\n notificationElement.innerText = notificationCount;\n }\n imageElement.style.display = \"block\";\n iconElement.remove();\n } else {\n imgElement.remove();\n }\n }\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n initLoginState();\n calcFloatingPositon(module)\n module.style.display = \"block\";\n\n });\n});\n","import Api from \"../Api\";\nimport loginStateStore from \"../login_state_store\";\nimport pubsubStore from \"../pubsub_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n \"use strict\";\n\n let modules = document.querySelectorAll(\".reread-board-action-icon-module\");\n\n if (modules.length == 0) {\n return;\n }\n\n let updateRereadActionState = element => {\n let boardId = element.dataset.boardId\n let rereadAction = element.querySelector(\".reread-action\");\n\n if (loginStateStore.isLoggedIn() == false) {\n return;\n }\n\n Api.boardRereading(boardId).then(json => {\n if (json.rereading) {\n rereadAction.classList.add(\"selected\");\n }\n });\n };\n\n let initRereadAction = element => {\n let boardId = element.dataset.boardId\n let rereadAction = element.querySelector(\".reread-action\");\n\n rereadAction.addEventListener(\"click\", function () {\n if (loginStateStore.isLoggedIn() == false) {\n const uri = encodeURI(location.pathname + location.search + location.hash);\n location.href = '/login?rt=' + uri;\n return;\n }\n\n if (rereadAction.classList.contains(\"selected\") == true) {\n rereadAction.classList.remove(\"selected\");\n Api.removeBoardReread(boardId);\n } else {\n rereadAction.classList.add(\"selected\");\n Api.addBoardReread(boardId);\n }\n });\n };\n\n let initState = () => {\n modules.forEach(element => {\n initRereadAction(element);\n updateRereadActionState(element);\n });\n };\n\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n initState();\n });\n\n pubsubStore.subscribe(\"infiniteScrollPageAppend\", appentRootElement => {\n appentRootElement.querySelectorAll(\".reread-board-action-icon-module\").forEach(element => {\n initRereadAction(element);\n updateRereadActionState(element);\n });\n });\n});\n","import Api from \"../Api\";\nimport loginStateStore from \"../login_state_store\";\nimport pubsubStore from \"../pubsub_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n \"use strict\";\n let modules = document.querySelectorAll(\".read-status-plan-to-read-action-button-module\");\n\n let updateActionState = element => {\n let boardId = element.dataset.boardId\n let topicId = element.dataset.topicId\n\n let planToReadAction = element.querySelector(\".read-status-plan-to-read-action-button\");\n\n if (loginStateStore.isLoggedIn() == false) {\n element.style.display = \"block\";\n return;\n }\n\n Api.boardReadStatus(boardId).then(json => {\n let readStatus = json.read_status;\n if (readStatus != \"plan_to_read\" && readStatus != \"nothing\") {\n element.remove()\n return\n }\n\n Api.userTopicOwned(topicId).then(json => {\n if (json.owned == true) {\n element.remove()\n return\n }\n });\n\n element.style.display = \"block\";\n\n if (readStatus == \"plan_to_read\") {\n planToReadAction.classList.add(\"selected\");\n }\n });\n };\n\n let initAction = element => {\n let boardId = element.dataset.boardId\n let topicId = element.dataset.topicId\n\n let planToReadAction = element.querySelector(\".read-status-plan-to-read-action-button\");\n\n planToReadAction.addEventListener(\"click\", function () {\n if (loginStateStore.isLoggedIn() == false) {\n const uri = encodeURI(location.pathname + location.search + location.hash);\n location.href = '/login?rt=' + uri;\n return;\n }\n\n if (planToReadAction.classList.contains(\"selected\") == true) {\n planToReadAction.classList.remove(\"selected\");\n Api.updateReadStatusPlanToReadFromTopic(boardId, topicId);\n } else {\n planToReadAction.classList.add(\"selected\");\n Api.updateReadStatusPlanToReadFromTopic(boardId, topicId);\n }\n });\n };\n\n let initState = () => {\n modules.forEach(element => {\n initAction(element);\n updateActionState(element);\n });\n };\n\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n initState();\n });\n});\n","import Api from \"../Api\";\nimport loginStateStore from \"../login_state_store\";\nimport pubsubStore from \"../pubsub_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function(event) {\n \"use strict\";\n\n let modules = document.querySelectorAll(\".store-action-module\");\n\n if (modules.length == 0) {\n return;\n }\n\n let initStoreAction = element => {\n let storeActionItemsElement = element.querySelector(\".store-action-items\");\n\n element.addEventListener(\"click\", function() {\n storeActionItemsElement.classList.toggle(\"show\");\n });\n };\n\n let initState = () => {\n modules.forEach(element => {\n initStoreAction(element);\n });\n };\n\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n initState();\n });\n\n pubsubStore.subscribe(\"infiniteScrollPageAppend\", appentRootElement => {\n appentRootElement.querySelectorAll(\".store-action-module\").forEach(element => {\n initStoreAction(element);\n });\n });\n\n});\n","import Api from \"../Api\";\nimport loginStateStore from \"../login_state_store\";\nimport pubsubStore from \"../pubsub_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function(event) {\n \"use strict\";\n\n let modules = document.querySelectorAll(\".empathy-action-module\");\n\n if (modules.length == 0) {\n return;\n }\n\n let initFollowAction = element => {\n let commentId = element.dataset.commentId\n let empathyIconElement = element.querySelector(\".empathy-icon\");\n let empathyCountElement = element.querySelector(\".empathy-count\");\n\n empathyIconElement.addEventListener(\"click\", function() {\n // 画像の拡大\n let imageElement = empathyIconElement.querySelector(\n \".material-icons-outlined\"\n );\n imageElement.classList.add(\"animate\");\n\n setTimeout(() => {\n imageElement.classList.remove(\"animate\");\n }, 1000);\n\n if (window.navigator.vibrate !== undefined) {\n window.navigator.vibrate(50);\n }\n\n empathyCountElement.classList.remove(\"empty\");\n\n let countElement = empathyCountElement.querySelector(\".count\");\n countElement.innerHTML = parseInt(countElement.innerHTML) + 1;\n\n let url = \"/api/comments/\" + commentId + \"/empathies\";\n\n return fetch(url, {\n method: \"POST\",\n credentials: \"same-origin\",\n headers: {\n \"Content-Type\": \"application/json\"\n }\n }).then(response => {});\n });\n };\n\n let initState = () => {\n modules.forEach(element => {\n initFollowAction(element);\n });\n };\n\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n initState();\n });\n\n pubsubStore.subscribe(\"infiniteScrollPageAppend\", appentRootElement => {\n appentRootElement.querySelectorAll(\".empathy-action-module\").forEach(element => {\n initFollowAction(element);\n });\n });\n\n});\n","import Api from \"../Api\";\nimport loginStateStore from \"../login_state_store\";\nimport pubsubStore from \"../pubsub_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n \"use strict\";\n\n let modules = document.querySelectorAll(\".light-review-board-action-icon-module\");\n\n if (modules.length == 0) {\n return;\n }\n\n let overlayOpen = element => {\n const overlayElement = element.querySelector(\".light-review-overlay\");\n overlayElement.classList.add(\"on\");\n\n const windowHeight = window.innerHeight;\n const top = (windowHeight / 2) - (overlayElement.getBoundingClientRect().height / 2)\n overlayElement.style.top = top + \"px\";\n }\n\n let initLightReviewAction = element => {\n const boardId = element.dataset.boardId\n const lightReviewAction = element.querySelector(\".light-review-action\");\n\n lightReviewAction.addEventListener(\"click\", function (event) {\n event.stopPropagation();\n\n if (loginStateStore.isLoggedIn() == false) {\n const uri = encodeURI(location.pathname + location.search + location.hash);\n location.href = '/login?rt=' + uri;\n return;\n }\n\n let lightReviewModules = document.querySelectorAll(\".light-review-overlay-module\");\n\n if (lightReviewModules.length == 0) {\n return;\n }\n\n lightReviewModules.forEach(lightReviewModule => {\n const lightReviewBoardId = lightReviewModule.dataset.boardId;\n if (boardId == lightReviewBoardId) {\n overlayOpen(lightReviewModule);\n }\n });\n });\n };\n\n let initState = () => {\n modules.forEach(element => {\n initLightReviewAction(element);\n });\n };\n\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n initState();\n });\n\n pubsubStore.subscribe(\"infiniteScrollPageAppend\", appentRootElement => {\n appentRootElement.querySelectorAll(\".light-review-board-action-icon-module\").forEach(element => {\n initLightReviewAction(element);\n });\n });\n\n});\n","import loginStateStore from \"../../login_state_store\";\nimport Api from \"../../Api\";\nimport pubsubStore from \"../../pubsub_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n \"use strict\";\n\n let modules = document.querySelectorAll(\".light-review-dialog-module\");\n\n if (modules.length == 0) {\n return;\n }\n\n let updatePublicStatus = (element, publicStatus) => {\n const lightReviewFormElement = element.querySelector(\".light-review-form-module\");\n const publicStatusInput = lightReviewFormElement.querySelector(\".public-status-input\");\n const checkedPublicStatus = publicStatus == \"private\" ? true : false;\n publicStatusInput.checked = checkedPublicStatus;\n }\n\n let updateFavoriteRatingState = (element, favoriteRating) => {\n const lightReviewFormElement = element.querySelector(\".light-review-form-module\");\n const favoriteRatingElements = lightReviewFormElement.querySelectorAll(\".favorite-rating\");\n\n // 同じだったら0にする\n if (getFavoriteRating(element) == favoriteRating) {\n favoriteRatingElements.forEach(favoriteRatingElement => {\n favoriteRatingElement.classList.remove(\"selected\");\n });\n return;\n }\n\n favoriteRatingElements.forEach(favoriteRatingElement => {\n const favoriteRatingValue = favoriteRatingElement.dataset.favoriteRating\n\n if (favoriteRatingValue <= favoriteRating) {\n favoriteRatingElement.classList.add(\"selected\");\n } else {\n favoriteRatingElement.classList.remove(\"selected\");\n }\n });\n }\n\n let updateFavoriteRating = (element, favoriteRating) => {\n const lightReviewFormElement = element.querySelector(\".light-review-form-module\");\n const favoriteRatingElements = lightReviewFormElement.querySelectorAll(\".favorite-rating\");\n\n favoriteRatingElements.forEach(favoriteRatingElement => {\n const favoriteRatingValue = favoriteRatingElement.dataset.favoriteRating\n\n if (favoriteRatingValue <= favoriteRating) {\n favoriteRatingElement.classList.add(\"selected\");\n } else {\n favoriteRatingElement.classList.remove(\"selected\");\n }\n });\n }\n\n\n let updateReadingNote = (element, memo) => {\n const lightReviewFormElement = element.querySelector(\".light-review-form-module\");\n let readingNoteTextInputElement = lightReviewFormElement.querySelector(\".reading-notes-text-input\");\n readingNoteTextInputElement.textContent = memo;\n }\n\n let initFavoriteRatingAction = element => {\n const boardId = element.dataset.boardId\n const lightReviewFormElement = element.querySelector(\".light-review-form-module\");\n const favoriteRatingElements = lightReviewFormElement.querySelectorAll(\".favorite-rating\");\n\n if (loginStateStore.isLoggedIn() == false) {\n return;\n }\n\n Api.boardFavoriteRating(boardId).then(json => {\n const favoriteRating = json.favorite_rating;\n const publicStatus = json.public_status;\n\n updateFavoriteRatingState(element, favoriteRating)\n updatePublicStatus(element, publicStatus)\n });\n\n favoriteRatingElements.forEach(favoriteRatingElement => {\n favoriteRatingElement.addEventListener(\"click\", function (event) {\n event.stopPropagation();\n\n const favoriteRating = favoriteRatingElement.dataset.favoriteRating\n updateFavoriteRatingState(element, favoriteRating)\n\n const favoriteRatingValue = getFavoriteRating(element)\n const publicState = isPublicState(element)\n\n Api.updateFavoriteRating(boardId, favoriteRatingValue, publicState)\n\n });\n });\n };\n\n let updateParams = element => {\n const boardId = element.dataset.boardId;\n\n Api.boardReadingNote(boardId).then(json => {\n updateReadingNote(element, json.memo)\n });\n\n Api.boardFavoriteRating(boardId).then(json => {\n const favoriteRating = json.favorite_rating;\n const publicStatus = json.public_status;\n\n updateFavoriteRating(element, favoriteRating)\n updatePublicStatus(element, publicStatus)\n });\n };\n\n let initReadingNoteAction = element => {\n const boardId = element.dataset.boardId\n const lightReviewFormElement = element.querySelector(\".light-review-form-module\");\n let readingNoteTextInputElement = lightReviewFormElement.querySelector(\".reading-notes-text-input\");\n\n if (loginStateStore.isLoggedIn() == false) {\n return;\n }\n\n const baseHeight = 54\n\n let clientHeight = readingNoteTextInputElement.clientHeight\n\n Api.boardReadingNote(boardId).then(json => {\n updateReadingNote(element, json.memo)\n readingNoteTextInputElement.style.height = clientHeight + \"px\";\n let scrollHeight = readingNoteTextInputElement.scrollHeight > baseHeight ? readingNoteTextInputElement.scrollHeight : baseHeight;\n readingNoteTextInputElement.style.height = scrollHeight + \"px\";\n });\n\n readingNoteTextInputElement.addEventListener(\"input\", () => {\n event.stopPropagation();\n readingNoteTextInputElement.style.height = clientHeight + \"px\";\n let scrollHeight = readingNoteTextInputElement.scrollHeight > baseHeight ? readingNoteTextInputElement.scrollHeight : baseHeight;\n readingNoteTextInputElement.style.height = scrollHeight + \"px\";\n });\n };\n\n let getFavoriteRating = (element) => {\n const lightReviewFormElement = element.querySelector(\".light-review-form-module\");\n const favoriteRatingElements = lightReviewFormElement.querySelectorAll(\".favorite-rating\");\n let favoriteRating = 0\n\n favoriteRatingElements.forEach(favoriteRatingElement => {\n if (favoriteRatingElement.classList.contains(\"selected\")) {\n favoriteRating++;\n }\n });\n return favoriteRating\n }\n\n let isPublicState = (element) => {\n const lightReviewFormElement = element.querySelector(\".light-review-form-module\");\n const publicStateElement = lightReviewFormElement.querySelector(\".public-status-input\");\n return !publicStateElement.checked;\n }\n\n let getReadingNoteMemo = (element) => {\n const lightReviewFormElement = element.querySelector(\".light-review-form-module\");\n const readingNoteMemoElement = lightReviewFormElement.querySelector(\".reading-notes-text-input\");\n return readingNoteMemoElement.value;\n }\n\n let postAction = (element) => {\n let boardId = element.dataset.boardId\n\n const favoriteRating = getFavoriteRating(element)\n const publicState = isPublicState(element)\n const readingNoteMemo = getReadingNoteMemo(element)\n\n Api.updateFavoriteRating(boardId, favoriteRating, publicState)\n Api.updateReadingNote(boardId, readingNoteMemo)\n\n pubsubStore.publish(\"boardStatusChange\", null);\n\n }\n\n let initPostButton = element => {\n const dialogElement = element.querySelector(\".light-review-dialog\");\n const completedButtonActionElement = element.querySelector(\".completed-button\");\n\n completedButtonActionElement.addEventListener(\"click\", function (event) {\n event.stopPropagation();\n postAction(element);\n dialogElement.close();\n })\n };\n\n let initCloseButton = element => {\n const dialogElement = element.querySelector(\".light-review-dialog\");\n const closeButtonActionElement = element.querySelector(\".close-button\");\n closeButtonActionElement.addEventListener(\"click\", function (event) {\n event.stopPropagation();\n dialogElement.close();\n })\n };\n\n let initPublicStateButton = element => {\n let boardId = element.dataset.boardId;\n const lightReviewFormElement = element.querySelector(\".light-review-form-module\");\n const publicStateElement = lightReviewFormElement.querySelector(\".public-status-input\");\n publicStateElement.addEventListener(\"click\", function (event) {\n event.stopPropagation();\n\n const publicState = !publicStateElement.checked;\n\n const favoriteRating = getFavoriteRating(element)\n Api.updateFavoriteRating(boardId, favoriteRating, publicState)\n\n })\n };\n\n let initDialog = element => {\n let dialogElement = element.querySelector(\".light-review-dialog\");\n\n dialogElement.addEventListener('click', (event) => {\n if (event.target.closest('.light-review-dialog-contents') === null) {\n dialogElement.close();\n }\n });\n };\n\n let initState = () => {\n modules.forEach(element => {\n initDialog(element);\n initFavoriteRatingAction(element);\n initPublicStateButton(element);\n initReadingNoteAction(element);\n initPostButton(element)\n initCloseButton(element)\n });\n };\n\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n initState();\n });\n\n pubsubStore.subscribe(\"infiniteScrollPageAppend\", appentRootElement => {\n appentRootElement.querySelectorAll(\".light-review-dialog-module\").forEach(element => {\n initDialog(element);\n initFavoriteRatingAction(element);\n initPublicStateButton(element);\n initReadingNoteAction(element);\n initPostButton(element)\n initCloseButton(element)\n });\n });\n\n pubsubStore.subscribe(\"boardStatusChange\", args => {\n });\n});\n","import pubsubStore from \"../pubsub_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n \"use strict\";\n\n const modules = document.querySelectorAll(\".scroll-fade\");\n\n if (!modules) {\n return;\n }\n\n let lastScroll = window.scrollY;\n let ticking = false;\n let isScrolling = false;\n let scrollTimeout;\n\n function handleScroll() {\n const currentScroll = Math.ceil(window.scrollY);\n if (!ticking) {\n window.requestAnimationFrame(function () {\n modules.forEach(module => {\n if (currentScroll > lastScroll) {\n module.classList.add('fade-out');\n module.classList.remove('fade-in');\n } else {\n module.classList.add('fade-in');\n module.classList.remove('fade-out');\n }\n });\n lastScroll = currentScroll <= 0 ? 0 : currentScroll;\n ticking = false;\n });\n\n ticking = true;\n }\n isScrolling = true;\n\n clearTimeout(scrollTimeout);\n\n scrollTimeout = setTimeout(function () {\n isScrolling = false;\n modules.forEach(module => {\n module.classList.add('fade-in');\n module.classList.remove('fade-out');\n });\n }, 200);\n }\n\n let initState = () => {\n window.addEventListener('scroll', handleScroll);\n };\n\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n initState();\n });\n\n});\n","class AlgoliasearchApi {\n constructor() {\n this.client = algoliasearch(\n \"XWOUH9BP3K\",\n \"a65dee8fea669724fa0a44a985c78296\"\n );\n this.boardIndex = undefined;\n this.authorIndex = undefined;\n this.topicIndex = undefined;\n this.manbaMagazineArticleIndex = undefined;\n }\n\n getClient() {\n if (this.client === undefined) {\n this.client = algoliasearch(\n \"XWOUH9BP3K\",\n \"a65dee8fea669724fa0a44a985c78296\"\n );\n }\n\n return this.client;\n }\n\n getBoardIndexName() {\n return \"Board_production\";\n }\n\n getAuthorIndexName() {\n return \"Author_production\";\n }\n\n getTopicIndexName() {\n return \"Topic_production\";\n }\n\n getUserBoardListIndexName() {\n return \"UserBoardlist_production\";\n }\n\n\n getManbaMagazineArticleIndexName() {\n return \"ManbaMagazineArticle_production\";\n }\n\n getBoardIndex() {\n if (this.boardIndex === undefined) {\n this.boardIndex = this.getClient().initIndex(\"Board_production\");\n }\n return this.boardIndex;\n }\n\n getAuthorIndex() {\n if (this.authorIndex === undefined) {\n this.authorIndex = this.getClient().initIndex(\"Author_production\");\n }\n return this.authorIndex;\n }\n\n getTopicIndex() {\n if (this.topicIndex === undefined) {\n this.topicIndex = this.getClient().initIndex(\"Topic_production\");\n }\n return this.topicIndex;\n }\n\n getManbaMagazineArticleIndex() {\n if (this.manbaMagazineArticleIndex === undefined) {\n this.manbaMagazineArticleIndex = this.getClient().initIndex(\n \"ManbaMagazineArticle_production\"\n );\n }\n return this.manbaMagazineArticleIndex;\n }\n}\n\nconst algoliasearchApiInstance = new AlgoliasearchApi();\nexport default algoliasearchApiInstance;\n","import algoliasearchApiInstance from \"../../algoliasearch/api\";\n\nlet enableAutoComplete = (searchInputId, searchInputName) => {\n const { autocomplete, getAlgoliaResults } = window[\n \"@algolia/autocomplete-js\"\n ];\n const searchClient = algoliasearchApiInstance.getClient();\n const boardIndexName = algoliasearchApiInstance.getBoardIndexName();\n\n const autocompleteSearch = autocomplete({\n container: searchInputId,\n detachedMediaQuery: \"none\",\n placeholder: '作品・著者・キーワードで探す',\n id: searchInputName + \"-autocomplete\",\n getSources() {\n return [\n {\n sourceId: \"boards\",\n getItems({ query }) {\n return getAlgoliaResults({\n searchClient,\n queries: [\n {\n indexName: boardIndexName,\n query,\n params: {\n filters: \"is_suggestable: true\",\n hitsPerPage: 5\n }\n }\n ]\n });\n },\n templates: {\n item({ item, components, html }) {\n return html`\n
\n ${item.title}\n
\n ${components.Highlight({\n hit: item,\n attribute: \"title\",\n tagName: \"mark\"\n })}\n
\n
\n `;\n }\n },\n onSelect({ insights, insightsEvents, item }) {\n if (item.redirect_url !== undefined) {\n window.location.href = item.redirect_url\n }\n }\n },\n ];\n }\n });\n}\n\nlet keypressSearch = (searchInput) => {\n let targetName = \"#\" + searchInput + \"-autocomplete-input\";\n let element = document.querySelector(targetName);\n\n if (element === null) {\n return;\n }\n\n element.addEventListener(\"keypress\", function (event) {\n let value = element.value;\n if (value !== \"\" && event.key === \"Enter\") {\n event.preventDefault();\n let redirectUrl = `/search?q=${element.value}`;\n location.href = redirectUrl;\n }\n });\n}\n\nlet buttonSearch = (searchNameId, searchNameButtonId) => {\n\n let targetName = searchNameId + \"-autocomplete-input\";\n let elementInput = document.querySelector(targetName);\n let elementButton = document.querySelector(searchNameButtonId);\n\n elementButton.addEventListener(\"click\", function (event) {\n event.preventDefault();\n\n let value = elementInput.value;\n\n if (value !== \"\") {\n let redirectUrl = `/search?q=${elementInput.value}`;\n location.href = redirectUrl;\n }\n });\n}\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n const searchName = \"search-box-with-autocomplete-search\";\n const searchNameId = \"#\" + searchName;\n if (document.querySelector(searchNameId) === null) {\n return\n }\n\n const searchNameButton = \"search-box-with-autocomplete-search-button\";\n const searchNameButtonId = \"#\" + searchNameButton;\n\n enableAutoComplete(searchNameId, searchName);\n keypressSearch(searchName);\n buttonSearch(searchNameId, searchNameButtonId);\n\n});\n","import Api from \"../../Api\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function(event) {\n let element = document.getElementById(\"author-view-counter\");\n\n if (element == null) {\n return;\n }\n let authorId = element.dataset.authorId;\n Api.authorViewCounter(authorId).then(json => {});\n});\n","import Api from \"../../Api\";\nimport loginStateStore from \"../../login_state_store\";\nimport pubsubStore from \"../../pubsub_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n const modules = document.querySelectorAll(\".authors-follow-button-module\");\n\n if (modules.length == 0) {\n return;\n }\n\n let updateFollowButtonState = element => {\n let authorId = element.dataset.authorId;\n\n if (loginStateStore.isLoggedIn() == false) {\n return;\n }\n\n Api.authorFollowing(authorId).then(json => {\n\n let actionButton = element.querySelector(\".action-button\");\n let actionIconElement = element.querySelector(\".icon .material-icons-outlined\");\n let actionButtonText = element.querySelector(\".text\");\n\n if (json.following) {\n actionButtonText.innerText = \"フォロー中\";\n actionIconElement.textContent = \"notifications\";\n actionButton.classList.add(\"selected\");\n }\n });\n };\n\n let initFollowButtonState = () => {\n modules.forEach(element => {\n updateFollowButtonState(element);\n let authorId = element.dataset.authorId;\n\n let actionButton = element.querySelector(\".action-button\");\n let actionIconElement = element.querySelector(\".icon .material-icons-outlined\");\n let actionButtonText = element.querySelector(\".text\");\n let message = element.querySelector(\".message\");\n\n actionButton.addEventListener(\"click\", function () {\n if (loginStateStore.isLoggedIn() == false) {\n const uri = encodeURI(location.pathname + location.search + location.hash);\n location.href = '/login?rt=' + uri;\n return;\n }\n\n if (actionButton.classList.contains(\"selected\") == true) {\n Api.removeAuthorFollow(authorId).then(json => { });\n\n actionButton.classList.remove(\"selected\");\n actionButtonText.innerText = \"著者をフォローする\";\n actionIconElement.textContent = \"notifications\";\n\n message.style.display = \"none\";\n } else {\n Api.addAuthorFollow(authorId).then(json => { });\n actionButton.classList.add(\"selected\");\n actionButtonText.innerText = \"フォロー中\";\n actionIconElement.textContent = \"notifications\";\n\n message.style.display = \"block\";\n }\n });\n });\n };\n\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n initFollowButtonState();\n });\n});\n","import pubsubStore from \"../../pubsub_store\";\nimport loginStateStore from \"../../login_state_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n \"use strict\";\n let module = document.querySelector(\".authors-floating-menu-module\");\n\n if (module == null) {\n return;\n }\n\n let floatingMenuButtonElement = module.querySelector(\".floating-menu-button\");\n let floatingMenuDialogElement = module.querySelector(\".floating-menu-dialog\");\n\n floatingMenuDialogElement.addEventListener('click', (event) => {\n if (event.target.closest('.floating-menu-dialog-contents') === null) {\n floatingMenuDialogElement.close();\n }\n });\n\n floatingMenuButtonElement.addEventListener('click', (event) => {\n floatingMenuDialogElement.showModal();\n\n const focusedElement = document.activeElement;\n\n if (focusedElement !== null) {\n focusedElement.blur();\n }\n });\n\n const scrollToTopButtonElement = module.querySelector(\".floating-menu-item-scroll-to-top\");\n scrollToTopButtonElement.addEventListener('click', (event) => {\n app.scrollToHash(\"#js-scroll-to-top\")\n floatingMenuDialogElement.close();\n });\n\n let calcFloatingPositon = element => {\n let overlayModuleElement = document.querySelector(\".pr-footer-overlay-module\");\n if (overlayModuleElement == null) {\n return;\n }\n\n element.classList.add(\"overlay\");\n\n }\n\n let initLoginState = () => {\n const userElement = module.querySelector(\".floating-menu-item-user\");\n const linkElement = userElement.querySelector(\"a.menu-link\");\n const iconElement = userElement.querySelector(\".icon\");\n const imageElement = userElement.querySelector(\".image\");\n const imgElement = userElement.querySelector(\".image img\");\n const textElement = userElement.querySelector(\".text\");\n const notificationElement = userElement.querySelector(\".notifications-count\");\n\n if (loginStateStore.isUser()) {\n textElement.innerText = \"通知\";\n linkElement.href = \"/me/notifications\";\n imgElement.src = loginStateStore.getUserIconPath();\n let notificationCount = loginStateStore.getNotificationCount()\n\n if (notificationCount >= 1) {\n notificationElement.style.display = \"block\";\n notificationElement.innerText = notificationCount;\n }\n\n imageElement.style.display = \"block\";\n iconElement.remove();\n } else {\n imgElement.remove();\n }\n }\n\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n initLoginState();\n calcFloatingPositon(module)\n module.style.display = \"block\";\n });\n});\n","import pubsubStore from \"../../pubsub_store\";\nimport loginStateStore from \"../../login_state_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n \"use strict\";\n let module = document.querySelector(\".want-to-recalls-floating-menu-module\");\n\n if (module == null) {\n return;\n }\n\n let floatingMenuButtonElement = module.querySelector(\".floating-menu-button\");\n let floatingMenuDialogElement = module.querySelector(\".floating-menu-dialog\");\n\n floatingMenuDialogElement.addEventListener('click', (event) => {\n if (event.target.closest('.floating-menu-dialog-contents') === null) {\n floatingMenuDialogElement.close();\n }\n });\n\n floatingMenuButtonElement.addEventListener('click', (event) => {\n floatingMenuDialogElement.showModal();\n\n const focusedElement = document.activeElement;\n\n if (focusedElement !== null) {\n focusedElement.blur();\n }\n });\n\n const scrollToTopButtonElement = module.querySelector(\".floating-menu-item-scroll-to-top\");\n scrollToTopButtonElement.addEventListener('click', (event) => {\n app.scrollToHash(\"#js-scroll-to-top\")\n floatingMenuDialogElement.close();\n });\n\n let initLoginState = () => {\n const userElement = module.querySelector(\".floating-menu-item-user\");\n const linkElement = userElement.querySelector(\"a.menu-link\");\n const iconElement = userElement.querySelector(\".icon\");\n const imageElement = userElement.querySelector(\".image\");\n const imgElement = userElement.querySelector(\".image img\");\n const textElement = userElement.querySelector(\".text\");\n const notificationElement = userElement.querySelector(\".notifications-count\");\n\n\n if (loginStateStore.isUser()) {\n textElement.innerText = \"通知\";\n linkElement.href = \"/me/notifications\";\n imgElement.src = loginStateStore.getUserIconPath();\n let notificationCount = loginStateStore.getNotificationCount()\n\n if (notificationCount >= 1) {\n notificationElement.style.display = \"block\";\n notificationElement.innerText = notificationCount;\n }\n\n imageElement.style.display = \"block\";\n iconElement.remove();\n } else {\n imgElement.remove();\n }\n }\n\n let initPostTopicsState = () => {\n const postTopicsElement = module.querySelector(\".floating-menu-item-want-to-recalls-post-topics\");\n const linkElement = postTopicsElement.querySelector(\"a.menu-link\");\n\n if (loginStateStore.isUser()) {\n const key = loginStateStore.getKey();\n const redirectUrl = `/profiles/${key}/want_to_recall`\n linkElement.href = redirectUrl\n\n }\n }\n\n let calcFloatingPositon = element => {\n let overlayModuleElement = document.querySelector(\".pr-footer-overlay-module\");\n if (overlayModuleElement == null) {\n return;\n }\n\n element.classList.add(\"overlay\");\n\n }\n\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n initLoginState();\n initPostTopicsState();\n calcFloatingPositon(module)\n module.style.display = \"block\";\n });\n\n});\n","import Api from \"../../Api\";\nimport loginStateStore from \"../../login_state_store\";\nimport pubsubStore from \"../../pubsub_store\";\n\nclass WantToRecallsTopicModule {\n constructor(modules) {\n this.modules = modules;\n\n if (!this.modules.length) return;\n\n this.setupPageShowListener();\n this.initState();\n }\n\n setupPageShowListener() {\n const reloadIfNeeded = (event) => {\n if (event.persisted || this.isBackForwardNavigation()) {\n window.location.reload();\n }\n };\n window.addEventListener('pageshow', reloadIfNeeded, { once: true });\n }\n\n isBackForwardNavigation() {\n const [navigationEntry] = performance.getEntriesByType(\"navigation\");\n return navigationEntry?.type === \"back_forward\";\n }\n\n async initState() {\n for (const element of this.modules) {\n const topicId = element.dataset.topicId;\n if (topicId) {\n await this.updateTopicStatus(element, topicId);\n }\n }\n }\n\n async updateTopicStatus(element, topicId) {\n try {\n const { unread, last_updated_changed } = await Api.topicStatus(topicId);\n const lastUpdateAtChangedElement = element.querySelector(\".last-updated-at-changed\");\n\n if (!unread && last_updated_changed) {\n lastUpdateAtChangedElement.style.display = \"block\";\n } else {\n lastUpdateAtChangedElement?.remove();\n }\n } catch (error) {\n console.error(\"Error updating topic status:\", error);\n }\n }\n}\n\nconst initWantToRecallsModule = (modules) => {\n if (loginStateStore.isLoggedIn()) {\n new WantToRecallsTopicModule(modules);\n }\n};\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n let modules = document.querySelectorAll(\".want-to-recalls-topic-module\");\n if (!modules.length) return;\n initWantToRecallsModule(modules);\n });\n\n pubsubStore.subscribe(\"renderAsyncLoad\", eventContainer => {\n let modules = eventContainer.querySelectorAll(\".want-to-recalls-topic-module\");\n if (!modules.length) return;\n initWantToRecallsModule(modules);\n });\n});\n","import Api from \"../../Api\";\nimport loginStateStore from \"../../login_state_store\";\nimport pubsubStore from \"../../pubsub_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n const modules = document.querySelectorAll(\".want-to-recalls-follow-button-module\");\n if (modules.length == 0) {\n return;\n\n }\n\n let updateFollowButtonState = element => {\n let topicId = element.dataset.want - to - recallsId;\n\n Api.want - to - recallsFollowing(topicId).then(json => {\n let followActionButton = element.querySelector(\n \".login-action-button.follow-action-button\"\n );\n let actionButton = followActionButton.querySelector(\".action-button\");\n let notLoginActionButton = element.querySelector(\n \".not-login-action-button.follow-action-button\"\n );\n let actionButtonText = actionButton.querySelector(\".text\");\n\n notLoginActionButton.style.display = \"none\";\n followActionButton.style.display = \"block\";\n\n if (json.following) {\n actionButtonText.innerText = \"フォロー中\";\n actionButton.classList.add(\"selected\");\n }\n });\n };\n\n let initFollowButtonState = () => {\n modules.forEach(element => {\n let topicId = element.dataset.topicId;\n const actionFollowButtonElement = element.querySelector(\".follow-action-button\");\n const actionButtonElement = element.querySelector(\".action-button\");\n const actionTextElement = element.querySelector(\".text\");\n\n Api.topicFollowing(topicId).then(json => {\n if (json.following) {\n actionButtonElement.classList.add(\"selected\");\n actionTextElement.innerText = \"フォロー中\";\n }\n });\n\n actionFollowButtonElement.addEventListener(\"click\", function () {\n if (loginStateStore.isLoggedIn() == false) {\n const uri = encodeURI(location.pathname + location.search + location.hash);\n location.href = '/login?rt=' + uri;\n return;\n } else {\n if (actionButtonElement.classList.contains(\"selected\") == true) {\n Api.removeTopicFollow(topicId).then(json => { });\n actionButtonElement.classList.remove(\"selected\");\n actionTextElement.innerText = \"フォローする\";\n } else {\n Api.addTopicFollow(topicId).then(json => { });\n actionButtonElement.classList.add(\"selected\");\n actionTextElement.innerText = \"フォロー中\";\n }\n }\n });\n });\n };\n\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n initFollowButtonState();\n });\n});\n","import Api from \"../../Api\";\nimport pubsubStore from \"../../pubsub_store\";\nimport loginStateStore from \"../../login_state_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n let modules = document.querySelectorAll(\".reviews-first-comment-module\");\n\n if (modules.length == 0) {\n return;\n }\n\n let initState = () => {\n modules.forEach(element => {\n const topicId = element.dataset.topicId;\n\n Api.userTopicOwned(topicId).then(json => {\n let editButtonElement = element.querySelector(\".edit-button\");\n\n if (json.owned == true) {\n editButtonElement.style.display = \"block\";\n } else {\n editButtonElement.remove();\n }\n });\n });\n };\n\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n initState();\n });\n});\n","import Api from \"../../Api\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function(event) {\n let element = document.getElementById(\"board-view-counter\");\n\n if (element == null) {\n return;\n }\n let boardId = element.dataset.boardId;\n Api.boardViewCounter(boardId).then(json => {});\n});\n","import Api from \"../../Api\";\nimport loginStateStore from \"../../login_state_store\";\nimport pubsubStore from \"../../pubsub_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n const modules = document.querySelectorAll(\".board-follow-button-module\");\n if (modules.length == 0) {\n return;\n }\n\n let updateFollowButtonState = element => {\n let boardId = element.dataset.boardId;\n let actionButtonElement = element.querySelector(\".action-button\");\n let actionButtonElementText = element.querySelector(\".text\");\n\n if (loginStateStore.isLoggedIn() === false) {\n actionButtonElement.addEventListener(\"click\", function () {\n const uri = encodeURI(location.pathname + location.search + location.hash);\n location.href = '/login?rt=' + uri;\n });\n return;\n\n }\n\n Api.boardFollowing(boardId).then(json => {\n if (json.following) {\n actionButtonElementText.innerText = \"フォロー中\";\n actionButtonElement.classList.add(\"selected\");\n }\n });\n };\n\n let initFollowButtonState = () => {\n modules.forEach(element => {\n updateFollowButtonState(element);\n\n let boardId = element.dataset.boardId;\n let actionButtonElement = element.querySelector(\".action-button\");\n let actionButtonElementText = element.querySelector(\".text\");\n\n if (loginStateStore.isLoggedIn() === true) {\n actionButtonElement.addEventListener(\"click\", function () {\n if (actionButtonElement.classList.contains(\"selected\") == true) {\n Api.removeBoardFollow(boardId).then(json => { });\n actionButtonElement.classList.remove(\"selected\");\n actionButtonElementText.innerText = \"フォローする\";\n } else {\n Api.addBoardFollow(boardId).then(json => { });\n actionButtonElement.classList.add(\"selected\");\n actionButtonElementText.innerText = \"フォロー中\";\n }\n });\n }\n });\n };\n\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n initFollowButtonState();\n });\n});\n","import Api from \"../../Api\";\nimport loginStateStore from \"../../login_state_store\";\nimport pubsubStore from \"../../pubsub_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n const modules = document.querySelectorAll(\".board-reread-button-module\");\n if (modules.length == 0) {\n return;\n }\n\n let updateRereadButtonState = element => {\n let boardId = element.dataset.boardId;\n let actionButtonElement = element.querySelector(\".action-button\");\n let actionButtonElementText = element.querySelector(\".text\");\n\n Api.boardRereading(boardId).then(json => {\n if (json.rereading) {\n actionButtonElementText.innerText = \"また読みたい\";\n actionButtonElement.classList.add(\"selected\");\n }\n });\n };\n\n let initRereadButtonState = () => {\n modules.forEach(element => {\n updateRereadButtonState(element);\n\n let boardId = element.dataset.boardId;\n let actionButtonElement = element.querySelector(\".action-button\");\n let actionButtonElementText = element.querySelector(\".text\");\n\n if (loginStateStore.isLoggedIn() === false) {\n actionButtonElement.addEventListener(\"click\", function () {\n const uri = encodeURI(location.pathname + location.search + location.hash);\n location.href = '/login?rt=' + uri;\n });\n return;\n }\n\n actionButtonElement.addEventListener(\"click\", function () {\n if (actionButtonElement.classList.contains(\"selected\") == true) {\n Api.removeBoardReread(boardId).then(json => { });\n actionButtonElement.classList.remove(\"selected\");\n actionButtonElementText.innerText = \"また読みたい\";\n } else {\n Api.addBoardReread(boardId).then(json => { });\n actionButtonElement.classList.add(\"selected\");\n actionButtonElementText.innerText = \"また読みたい\";\n }\n });\n });\n };\n\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n initRereadButtonState();\n });\n});\n","import Api from \"../../Api\";\nimport loginStateStore from \"../../login_state_store\";\nimport pubsubStore from \"../../pubsub_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n \"use strict\";\n\n let modules = document.querySelectorAll(\".boards-favorite-ratings-action-module\");\n if (modules.length == 0) {\n return;\n }\n\n let updateFavoriteRatings = (element, nowFavoriteRating, newFavoriteRating) => {\n const favoriteRatingElements = element.querySelectorAll(\".favorite-rating\");\n if (nowFavoriteRating == newFavoriteRating) {\n favoriteRatingElements.forEach(favoriteRatingElement => {\n const favoriteRatingElementIcon = favoriteRatingElement.querySelector(\".icon-module .material-icons-outlined\");\n favoriteRatingElement.classList.remove(\"selected\");\n favoriteRatingElementIcon.textContent = \"star_border\";\n });\n setFavoriteRatingData(element, 0)\n return;\n }\n\n favoriteRatingElements.forEach(favoriteRatingElement => {\n const favoriteRatingValue = favoriteRatingElement.dataset.favoriteRating\n const favoriteRatingElementIcon = favoriteRatingElement.querySelector(\".icon-module .material-icons-outlined\");\n\n if (favoriteRatingValue <= newFavoriteRating) {\n favoriteRatingElement.classList.add(\"selected\");\n favoriteRatingElementIcon.textContent = \"star\";\n\n\n } else {\n favoriteRatingElement.classList.remove(\"selected\");\n favoriteRatingElementIcon.textContent = \"star_border\";\n }\n });\n setFavoriteRatingData(element, newFavoriteRating)\n\n }\n\n let getPublicStatus = (element) => {\n const publicStatusText = element.dataset.publicStatus;\n\n if (publicStatusText == \"public\") {\n return true;\n } else {\n return false;\n }\n }\n\n let getFavoriteRating = (element) => {\n const favoriteRating = element.dataset.favoriteRating;\n return favoriteRating;\n }\n\n let setFavoriteRatingValue = (element, favoriteRatingValue, publicStatus) => {\n const boardId = element.dataset.boardId;\n\n Api.updateFavoriteRating(boardId, favoriteRatingValue, publicStatus)\n }\n\n let setFavoriteRatingData = (element, favoriteRatingValue) => {\n element.dataset.favoriteRating = favoriteRatingValue\n }\n\n let getFavoriteRatingData = (element) => {\n return element.dataset.favoriteRating\n }\n\n let getPublicStatusData = (element) => {\n return element.dataset.publicStatus;\n }\n\n let setPublicStatusData = (element, publicStatusText) => {\n element.dataset.publicStatus = publicStatusText\n }\n\n let togglePublicStatusData = (element) => {\n let publicStatusText = getPublicStatusData(element);\n if (publicStatusText == \"public\") {\n setPublicStatusData(element, \"private\")\n } else {\n setPublicStatusData(element, \"public\")\n }\n }\n\n let updatePublicStatus = (element, publicStatusText) => {\n\n const publicStatusElement = element.querySelector(\".public-status\");\n const publicStatusElementIcon = publicStatusElement.querySelector(\".icon-module .material-icons-outlined\");\n\n if (publicStatusText == \"public\") {\n publicStatusElementIcon.textContent = \"public\";\n }\n\n if (publicStatusText == \"private\") {\n publicStatusElementIcon.textContent = \"lock\";\n }\n setPublicStatusData(element, publicStatusText);\n\n }\n\n let initFavoriteRatingAction = element => {\n element.style.display = \"block\";\n\n const boardId = element.dataset.boardId;\n\n const favoriteRatingsElement = element.querySelector(\".favorite-ratings\");\n const publicStatusElement = element.querySelector(\".public-status\");\n\n if (loginStateStore.isLoggedIn() == false) {\n const uri = encodeURI(location.pathname + location.search + location.hash);\n publicStatusElement.addEventListener(\"click\", function (event) {\n location.href = '/login?rt=' + uri;\n return\n });\n\n favoriteRatingsElement.addEventListener(\"click\", function (event) {\n location.href = '/login?rt=' + uri;\n return\n });\n return\n\n }\n\n Api.boardFavoriteRating(boardId).then(json => {\n const publicStatus = json.public_status;\n const favoriteRating = json.favorite_rating;\n const favoriteRatingElements = element.querySelectorAll(\".favorite-rating\");\n\n element.style.display = \"block\";\n\n publicStatusElement.style.display = \"block\";\n\n setPublicStatusData(element, publicStatus)\n updatePublicStatus(element, publicStatus);\n\n setFavoriteRatingData(element, favoriteRating)\n updateFavoriteRatings(element, 0, favoriteRating);\n\n publicStatusElement.addEventListener(\"click\", function (event) {\n event.stopPropagation();\n togglePublicStatusData(element);\n updatePublicStatus(element, getPublicStatusData(element));\n setFavoriteRatingValue(element, getFavoriteRatingData(element), getPublicStatus(element));\n });\n\n favoriteRatingElements.forEach(favoriteRatingElement => {\n favoriteRatingElement.style.cursor = 'pointer'\n\n favoriteRatingElement.addEventListener(\"click\", function (event) {\n event.stopPropagation();\n\n const favoriteRating = favoriteRatingElement.dataset.favoriteRating;\n\n updateFavoriteRatings(element, getFavoriteRatingData(element), favoriteRating);\n setFavoriteRatingValue(element, getFavoriteRatingData(element), getPublicStatus(element));\n });\n });\n });\n };\n\n let initState = () => {\n modules.forEach(element => {\n initFavoriteRatingAction(element);\n });\n };\n\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n initState();\n });\n\n});\n","import loginStateStore from \"../../login_state_store\";\nimport pubsubStore from \"../../pubsub_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n \"use strict\";\n\n let modules = document.querySelectorAll(\".boards-favorite-ratings-module\");\n if (modules.length == 0) {\n return;\n }\n\n let initState = () => {\n modules.forEach(element => {\n element.style.display = \"block\";\n });\n };\n\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n if (loginStateStore.isLoggedIn() == true) {\n initState();\n }\n });\n\n});\n","import pubsubStore from \"../../pubsub_store\";\nimport loginStateStore from \"../../login_state_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n \"use strict\";\n let module = document.querySelector(\".boards-floating-menu-module\");\n\n if (module == null) {\n return;\n }\n\n let floatingMenuButtonElement = module.querySelector(\".floating-menu-button\");\n let floatingMenuDialogElement = module.querySelector(\".floating-menu-dialog\");\n\n floatingMenuDialogElement.addEventListener('click', (event) => {\n if (event.target.closest('.floating-menu-dialog-contents') === null) {\n floatingMenuDialogElement.close();\n }\n });\n\n floatingMenuButtonElement.addEventListener('click', (event) => {\n floatingMenuDialogElement.showModal();\n\n const focusedElement = document.activeElement;\n\n if (focusedElement !== null) {\n focusedElement.blur();\n }\n });\n\n const scrollToTopButtonElement = module.querySelector(\".floating-menu-item-scroll-to-top\");\n scrollToTopButtonElement.addEventListener('click', (event) => {\n app.scrollToHash(\"#js-scroll-to-top\")\n floatingMenuDialogElement.close();\n });\n\n const scrollToMemoElement = module.querySelector(\".floating-menu-item-scroll-to-memo\");\n scrollToMemoElement.addEventListener('click', (event) => {\n floatingMenuDialogElement.close();\n\n if (loginStateStore.isLoggedIn()) {\n const dialogElement = document.querySelector(\".board-new-reading-note-dialog\");\n dialogElement.showModal();\n } else {\n const uri = encodeURI(location.pathname + location.search + location.hash);\n location.href = '/login?rt=' + uri;\n }\n\n });\n\n const scrollToFavoriteRatingElement = module.querySelector(\".floating-menu-item-scroll-to-favorite-rating\");\n scrollToFavoriteRatingElement.addEventListener('click', (event) => {\n app.scrollToHash(\"#js-scroll-to-favorite-rating\")\n floatingMenuDialogElement.close();\n\n });\n\n const scrollToReadStatusElement = module.querySelector(\".floating-menu-item-scroll-to-read-status\");\n scrollToReadStatusElement.addEventListener('click', (event) => {\n app.scrollToHash(\"#js-scroll-to-read-status\")\n floatingMenuDialogElement.close();\n });\n\n let calcFloatingPositon = element => {\n let overlayModuleElement = document.querySelector(\".pr-footer-overlay-module\");\n if (overlayModuleElement == null) {\n return;\n }\n\n element.classList.add(\"overlay\");\n\n }\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n calcFloatingPositon(module)\n module.style.display = \"block\";\n });\n\n\n});\n","import loginStateStore from \"../../login_state_store\";\nimport pubsubStore from \"../../pubsub_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n \"use strict\";\n\n let module = document.querySelector(\".boards-action-announce-module\");\n if (module == null) {\n return;\n }\n\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n\n if (loginStateStore.isLoggedIn() === true) {\n module.style.display = \"block\";\n let openButtonElement = module.querySelector(\".floting-menu-open-action\");\n\n openButtonElement.addEventListener(\"click\", function () {\n let floatingMenuButtonElement = document.querySelector(\".floating-menu-button\");\n floatingMenuButtonElement.click();\n });\n }\n });\n\n});\n","import Api from \"../../Api\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function(event) {\n let element = document.getElementById(\"topic-view-counter\");\n\n if (element == null) {\n return;\n }\n\n let topicId = element.dataset.topicId;\n Api.topicViewCounter(topicId).then(json => {});\n});\n","import Api from \"../../Api\";\nimport loginStateStore from \"../../login_state_store\";\nimport pubsubStore from \"../../pubsub_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function(event) {\n const modules = document.querySelectorAll(\".topic-follow-button\");\n if (modules.length == 0) {\n return;\n }\n let updateFollowButtonState = element => {\n let topicId = element.dataset.topicId;\n\n Api.topicFollowing(topicId).then(json => {\n let followActionButton = element.querySelector(\n \".login-action-button.follow-action-button\"\n );\n let actionButton = followActionButton.querySelector(\".action-button\");\n let notLoginActionButton = element.querySelector(\n \".not-login-action-button.follow-action-button\"\n );\n let actionButtonText = actionButton.querySelector(\".text\");\n\n notLoginActionButton.style.display = \"none\";\n followActionButton.style.display = \"block\";\n\n if (json.following) {\n actionButtonText.innerText = \"フォロー中\";\n actionButton.classList.add(\"selected\");\n }\n });\n };\n\n let initFollowButtonState = () => {\n modules.forEach(element => {\n updateFollowButtonState(element);\n\n let topicId = element.dataset.topicId;\n let followActionButton = element.querySelector(\n \".login-action-button.follow-action-button\"\n );\n let actionButton = followActionButton.querySelector(\".action-button\");\n let actionButtonText = actionButton.querySelector(\".text\");\n //let message = element.querySelector('.message')\n\n followActionButton.addEventListener(\"click\", function() {\n if (actionButton.classList.contains(\"selected\") == true) {\n Api.removeTopicFollow(topicId).then(json => {});\n actionButton.classList.remove(\"selected\");\n actionButtonText.innerText = \"フォローする\";\n //message.style.display = 'none';\n } else {\n Api.addTopicFollow(topicId).then(json => {});\n actionButton.classList.add(\"selected\");\n actionButtonText.innerText = \"フォロー中\";\n //message.style.display = 'block';\n }\n });\n });\n };\n\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n if (loginStateStore.isLoggedIn()) {\n initFollowButtonState();\n }\n });\n});\n","\nimport Api from \"../../Api\";\nimport loginStateStore from \"../../login_state_store\";\nimport pubsubStore from \"../../pubsub_store\";\n\nclass TopicPlanToReadButtonModule {\n constructor(modules) {\n this.modules = modules;\n\n if (!this.modules.length) return;\n\n this.initModules();\n }\n\n initModules() {\n this.modules.forEach(module => {\n const ui = new TopicPlanToReadButtonUI(module);\n const topicId = ui.getTopicId();\n const boardId = ui.getBoardId();\n const listItemId = ui.getlistItemId();\n\n if (!loginStateStore.isLoggedIn()) {\n ui.redirectToLoginOnClick();\n return;\n }\n\n Api.boardReadStatus(boardId).then(({ read_status: readStatus }) => {\n ui.updateUI(readStatus);\n\n if (ui.isActionAllowed(readStatus)) {\n ui.addClickListener(() => {\n const isSelected = ui.toggleSelectedState();\n const newStatus = isSelected ? \"plan_to_read\" : \"nothing\";\n this.updateReadState(boardId, topicId, listItemId, newStatus, ui);\n });\n }\n });\n });\n }\n\n updateReadState(boardId, topicId, listItemId, newStatus, ui) {\n if (listItemId) {\n Api.updateReadStatusPlanToReadFromListItem(boardId, listItemId);\n ui.broadcastStateChange(newStatus, boardId);\n\n return;\n }\n\n if (topicId) {\n Api.updateReadStatusPlanToReadFromTopic(boardId, topicId);\n ui.broadcastStateChange(newStatus, boardId);\n\n return;\n }\n\n Api.updateReadStatus(boardId, newStatus);\n\n ui.broadcastStateChange(newStatus, boardId);\n }\n}\n\nclass TopicPlanToReadButtonUI {\n constructor(moduleElement) {\n this.module = moduleElement;\n this.actionButton = this.module.querySelector(\".action-button\");\n this.iconElement = this.module.querySelector(\".icon .material-icons-outlined\");\n this.textElement = this.module.querySelector(\".text\");\n this.planToReadButton = this.module.querySelector(\".topic-plan-to-read-button\");\n }\n\n getTopicId() {\n return this.planToReadButton.dataset.topicId;\n }\n\n getBoardId() {\n return this.planToReadButton.dataset.boardId;\n }\n\n getlistItemId() {\n return this.planToReadButton.dataset.userBoardListItemId;\n }\n\n isActionAllowed(readStatus) {\n return [\"nothing\", \"plan_to_read\"].includes(readStatus);\n }\n\n updateUI(readStatus) {\n this.textElement.innerText = this.getReadStateText(readStatus);\n\n if (!this.isActionAllowed(readStatus)) {\n this.actionButton.classList.add(\"disabled\");\n return;\n }\n\n this.actionButton.classList.toggle(\"selected\", readStatus === \"plan_to_read\");\n this.iconElement.textContent = readStatus === \"plan_to_read\" ? \"bookmark_added\" : \"bookmark_add\";\n }\n\n toggleSelectedState() {\n const isSelected = this.actionButton.classList.toggle(\"selected\");\n this.iconElement.textContent = isSelected ? \"bookmark_added\" : \"bookmark_add\";\n return isSelected;\n }\n\n\n redirectToLoginOnClick() {\n this.planToReadButton.addEventListener(\"click\", () => {\n const uri = encodeURI(location.pathname + location.search + location.hash);\n location.href = `/login?rt=${uri}`;\n });\n }\n\n addClickListener(callback) {\n this.planToReadButton.addEventListener(\"click\", callback);\n }\n\n broadcastStateChange(newStatus, boardId) {\n const allModules = document.querySelectorAll(\".topic-plan-to-read-button-module\");\n allModules.forEach(module => {\n const boardIdMatch = module.querySelector(\".topic-plan-to-read-button\").dataset.boardId === boardId;\n if (boardIdMatch) {\n new TopicPlanToReadButtonUI(module).updateUI(newStatus);\n }\n });\n }\n\n getReadStateText(readStatus) {\n const statusMap = {\n \"plan_to_read\": \"読みたい\",\n \"on_hold\": \"積読\",\n \"reading\": \"読んでる\",\n \"completed\": \"読んだ\",\n };\n return statusMap[readStatus] || \"読みたい\";\n }\n}\n\n// 初期化関数\nconst initTopicPlanToReadModule = (modules) => {\n new TopicPlanToReadButtonModule(modules);\n};\n\n// イベントリスナー\ndocument.addEventListener(\"DOMContentLoaded\", () => {\n const moduleClassName = \".topic-plan-to-read-button-module\";\n\n pubsubStore.subscribe(\"userLoginCompleted\", () => {\n const modules = document.querySelectorAll(moduleClassName);\n if (modules.length) initTopicPlanToReadModule(modules);\n });\n\n pubsubStore.subscribe(\"renderAsyncLoad\", (eventContainer) => {\n const modules = eventContainer.querySelectorAll(moduleClassName);\n if (modules.length) initTopicPlanToReadModule(modules);\n });\n});\n","import Api from \"../../Api\";\nimport pubsubStore from \"../../pubsub_store\";\nimport loginStateStore from \"../../login_state_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n let topicElement = document.querySelector(\"#owned-topic\");\n if (topicElement === null) {\n return;\n }\n let initState = () => {\n Api.userTopicOwned(topicElement.dataset.ownedTopicId).then(json => {\n let targetElement = document.querySelector(\"#owned-topic\");\n if (json.owned == true) {\n targetElement.style.display = \"block\";\n } else {\n targetElement.remove();\n }\n });\n };\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n if (loginStateStore.isLoggedIn()) {\n initState();\n }\n });\n});\n","import csrfTokenStoreInstance from \"../../csrf_token_store\";\nimport pubsubStore from \"../../pubsub_store\";\nimport loginStateStore from \"../../login_state_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n \"use strict\";\n\n let module = document.querySelector(\".topic-input-form\");\n\n if (module == null) {\n return;\n }\n\n let boardTitle = document.querySelector(\"h1.board-books-main-title a\")\n .textContent;\n\n const questionMessages = () => {\n return [\n {\n value: \"質問1\",\n text: \"作品の疑問点について質問する\",\n title: \"作品の疑問点について質問があります\",\n body: \"わからなかった部分について質問してみましょう。\\n\" +\n \"\\n\" +\n \"「話のわからないところがあって…」\\n\" +\n \"「あのオチってどういうこと?」\\n\" +\n \"「ラストシーンのみんなの解釈を聞きたい」\"\n },\n {\n value: \"質問2\",\n text: \"書籍に関して質問する\",\n title: \"書籍について教えてください\",\n body: \"書籍情報について質問してみましょう。\\n\" +\n \"\\n\" +\n \"「紙書籍と電子書籍どちらを買うべきでしょうか」\\n\" +\n \"「◯◯の話が収録されているか教えて下さい」\\n\" +\n \"「新装版と完全版は何が違うのでしょうか」\\n\" +\n \"「特典はついてきますか」\"\n }\n ]\n }\n\n const chatMessages = () => {\n return [\n {\n value: \"雑談1\",\n text: \"連載/新連載作品の雑談\",\n title: \"作品のキャッチコピー\",\n body: \"・あらすじ概要\\n\" +\n \"・公式リンク\\n\" +\n \"\\n\" +\n \"最新話をネタバレありで語りましょう!\"\n },\n {\n value: \"雑談2\",\n text: \"好きな◯◯について語ろう!\",\n title: \"好きな◯◯について語ろう\",\n body: \"「どこで一番泣いた/笑った?」\\n\" +\n \"「最も好きなシーン/巻/章といえば?」\\n\" +\n \"「好きなセリフ/名言/キャラ/小ネタは?」\"\n }\n ]\n }\n\n const reviewMessages = () => {\n return [\n {\n value: \"感想1\",\n text: \"◯巻の感想\",\n title: \"◯巻の感想・レビュー\",\n body: \"特定の巻数の感想を書くことができます。\\n\" +\n \"\\n\" +\n \"また、「◯巻〜◯巻まで」「◯◯編の感想」のようにまとめた感想を書くこともできます。\"\n },\n {\n value: \"感想2\",\n text: \"#推しを3行で推す\",\n title: `${boardTitle} #推しを3行で推す`,\n body: \"・読んだ直後に思ったこと ※一番大事!※\\n\" +\n \"\\n\\n\" +\n \"・特に好きなところは?\\n\" +\n \"\\n\\n\" +\n \"・作品の応援や未読の方へオススメする一言!\\n\"\n },\n {\n value: \"感想3\",\n text: \"#1巻応援\",\n title: `${boardTitle} #1巻応援`,\n body: \"1巻まで発売されている作品(全1巻で完結を含む)を応援したいときに使います。\\n\" +\n \"\\n\" +\n \"「1巻発売されたばかりの作品をもっと世に広めたい…!」\"\n },\n {\n value: \"感想4\",\n text: \"#読切応援\",\n title: `${boardTitle} #読切応援`,\n body: \"雑誌に掲載された読切で連載化してほしいものや、漫画賞に入選した読切を世の中に知ってほしいときに使います。\\n\" +\n \"\\n\" +\n \"「この読切はぜひ連載化してほしい!!」\"\n },\n {\n value: \"感想5\",\n text: \"#完結応援\",\n title: `${boardTitle} #完結応援`,\n body: \"完結巻が発売されている作品にあらためてスポットライトを当てたい使います。(※完結した時期は問いません。)\\n\" +\n \"\\n\" +\n \"「完結を機にたくさんの人に読んでほしい」\"\n }\n ]\n }\n\n let isPost = element => {\n return element.classList.contains(\"post\");\n };\n\n let isPut = element => {\n return element.classList.contains(\"put\");\n };\n\n let isAnonymousEnabled = element => {\n return element.querySelector(\"#topic_anonymous_enabled\").checked;\n };\n\n let anonymousEnabledElement = element => {\n return element.querySelector(\"#topic_anonymous_enabled\");\n };\n\n let getMessages = type => {\n let messages = [];\n\n const defaultMessage = {\n value: \"guide\",\n text: \"💡 クチコミのヒントを表示する\"\n }\n\n messages.push(defaultMessage);\n\n if (type === \"question\") {\n messages.push(...questionMessages());\n }\n\n if (type === \"review\") {\n messages.push(...reviewMessages());\n }\n\n if (type === \"chat\") {\n messages.push(...chatMessages());\n }\n\n return messages;\n }\n\n let getType = element => {\n let checkValue = '';\n\n document.getElementsByName('topic[type]').forEach(radioElement => {\n if (radioElement.checked) {\n checkValue = radioElement.value;\n }\n });\n return checkValue;\n }\n\n let updateGuideMessages = (element, guideType) => {\n const messages = getMessages(guideType);\n let guideTypeComboBoxElement = element.querySelector(\"#guide_type\");\n\n while (guideTypeComboBoxElement.firstChild) {\n guideTypeComboBoxElement.removeChild(guideTypeComboBoxElement.firstChild);\n }\n\n messages.forEach(optionData => {\n const option = document.createElement('option');\n option.value = optionData.value;\n option.text = optionData.text;\n guideTypeComboBoxElement.appendChild(option);\n });\n }\n\n let initType = element => {\n const typeRadioButtonsElement = element.querySelector(\".type-radio-buttons\");\n updateGuideMessages(element, getType(element));\n\n typeRadioButtonsElement.addEventListener('change', function (event) {\n const selectedValue = event.target.value;\n updateGuideMessages(element, selectedValue);\n })\n }\n\n let initGuide = element => {\n const guideTypeComboBoxElement = element.querySelector(\"#guide_type\");\n\n guideTypeComboBoxElement.addEventListener('change', function (event) {\n event.preventDefault();\n\n let topicTitleForm = document.querySelector(\"#topic_title\");\n let commentBodyForm = document.querySelector(\"#comment_body\");\n\n if (topicTitleForm.value !== \"\" || commentBodyForm.value !== \"\") {\n const result = confirm(\n \"入力内容を消去して「クチコミのヒント」を表示しますか?\"\n );\n if (result === false) {\n return;\n }\n }\n\n const selectedValue = event.target.value;\n const messages = getMessages(getType(element));\n\n const titleElement = element.querySelector(\"#topic_title\");\n const bodyElement = element.querySelector(\"#comment_body\");\n\n messages.forEach(message => {\n if (message.value === selectedValue) {\n titleElement.value = message.title;\n bodyElement.value = message.body;\n }\n })\n });\n }\n\n let initKeywordState = element => {\n let keywordsPartialElement = element.querySelector(\".keywords-partial\");\n let keywordsElement = keywordsPartialElement.querySelector(\".keywords\");\n let keywordElements = keywordsElement.querySelectorAll(\".keyword\");\n\n async function copyToClipboard(displayNameText, nameText, text) {\n let titleText = displayNameText == 'あらすじ' ? displayNameText : nameText\n\n try {\n await navigator.clipboard.writeText(nameText);\n window.alert(titleText + \"をコピーしました\")\n } catch (error) {\n window.alert(\"コピーを失敗しました\")\n }\n }\n\n keywordElements.forEach(keywordElement => {\n keywordElement.addEventListener(\"click\", function (e) {\n let displayNameElement = keywordElement.querySelector(\".display-name\");\n let displayNameText = displayNameElement.textContent\n let nameElement = keywordElement.querySelector(\".name\");\n let nameText = nameElement.textContent\n\n copyToClipboard(displayNameText, nameText,);\n });\n });\n }\n\n let initImageSelect = element => {\n const imageSelectorElement = element.querySelector(\"a#image-selector-button\");\n const fileSelector = element.querySelector(\"input.image-field\");\n const pasteImage = element.querySelector(\".paste-image\");\n\n imageSelectorElement.addEventListener(\"click\", function (event) {\n event.preventDefault();\n\n fileSelector.addEventListener(\"change\", function (e) {\n\n let files = e.target.files;\n\n if (files.length == 0) {\n let imageElement = pasteImage.querySelector(\"img\");\n\n if (imageElement != null) {\n imageElement.remove();\n return;\n }\n\n return;\n }\n\n for (var i = 0, file; (file = files[i]); i++) {\n if (!file.type.match(\"image.*\")) {\n continue;\n }\n\n var reader = new FileReader();\n\n reader.onload = (function (f) {\n return function (e) {\n try {\n let imageElement = pasteImage.querySelector(\"img\");\n\n if (imageElement != null) {\n imageElement.remove();\n return;\n }\n\n var uploagImageElement = document.createElement(\"img\");\n uploagImageElement.className = \"upload-image\";\n pasteImage.appendChild(uploagImageElement);\n\n var img = pasteImage.querySelector(\"img.upload-image\");\n img.src = e.target.result;\n } catch (e) { }\n };\n })(file);\n\n reader.readAsDataURL(file);\n\n return;\n }\n });\n\n fileSelector.click();\n });\n }\n\n let initAnonymousEnabled = element => {\n const anonymousEnabledElement = element.querySelector(\"#topic_anonymous_enabled\");\n const inputCommentElement = element.querySelector(\".input-comment-name\");\n const userIconImageElement = element.querySelector(\".user-icon img\");\n\n anonymousEnabledElement.addEventListener(\"click\", function (e) {\n if (isAnonymousEnabled(element)) {\n inputCommentElement.style.display = \"block\";\n userIconImageElement.src = loginStateStore.getUserPrivateIconPath();\n } else {\n inputCommentElement.style.display = \"none\";\n userIconImageElement.src = loginStateStore.getUserIconPath();\n }\n });\n }\n\n let initPostButton = element => {\n let postButtonElement = element.querySelector(\"#post-button\");\n postButtonElement.addEventListener(\"click\", function (e) {\n let authenticityTokenElements = element.querySelectorAll(\n \"input[name='authenticity_token'][type='hidden']\"\n );\n authenticityTokenElements.forEach(element => {\n element.value = csrfTokenStoreInstance.get().csrfToken;\n });\n window.removeEventListener('beforeunload', beforeUnLoadEvent)\n });\n }\n\n let initForm = element => {\n const userIconImageElement = element.querySelector(\".user-icon img\");\n const inputCommentElement = element.querySelector(\".input-comment-name\");\n const inputElement = element.querySelector(\"#comment_name\");\n const anonymousEnabledElement = element.querySelector(\"#topic_anonymous_enabled\");\n\n if (loginStateStore.isLoggedIn()) {\n userIconImageElement.src = loginStateStore.getUserIconPath();\n\n if (isPost(element)) {\n inputCommentElement.style.display = \"none\";\n anonymousEnabledElement.checked = false;\n }\n\n if (isPut(element)) {\n if (isAnonymousEnabled(element)) {\n inputCommentElement.style.display = \"block\";\n userIconImageElement.src = loginStateStore.getUserPrivateIconPath();\n } else {\n inputElement.value = \"名無し\";\n inputCommentElement.style.display = \"none\";\n }\n }\n\n initAnonymousEnabled(element);\n } else {\n anonymousEnabledElement.checked = true;\n anonymousEnabledElement.style.pointerEvents = 'none';\n const label = element.querySelector('label[for=\"topic_anonymous_enabled\"]');\n label.style.pointerEvents = 'none';\n anonymousEnabledElement.style.display = 'none';\n\n }\n\n initImageSelect(element);\n initPostButton(element);\n }\n\n let setResizeForm = element => {\n let commentBodyForm = element.querySelector(\"#comment_body\");\n let clientHeight = commentBodyForm.clientHeight;\n\n commentBodyForm.addEventListener(\"input\", () => {\n commentBodyForm.style.height = clientHeight + \"px\";\n let scrollHeight = commentBodyForm.scrollHeight;\n commentBodyForm.style.height = scrollHeight + \"px\";\n });\n };\n\n let beforeUnLoadEvent = (event) => {\n let topicTitleForm = document.querySelector(\"#topic_title\");\n let topicTitle = topicTitleForm.value;\n\n let commentBodyForm = document.querySelector(\"#comment_body\");\n let commentBody = commentBodyForm.value;\n\n if (commentBody.length > 0 || topicTitle.length > 0) {\n event.preventDefault();\n event.returnValue = \"このページを離れますか?\";\n return \"このページを離れますか?\";\n }\n };\n\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n initType(module);\n initGuide(module);\n initKeywordState(module);\n initForm(module);\n setResizeForm(module);\n window.addEventListener('beforeunload', beforeUnLoadEvent)\n });\n});\n","import algoliasearchApiInstance from \"../../algoliasearch/api\";\n\nfunction enableAutoComplete(searchInputId, searchInputName) {\n const { autocomplete, getAlgoliaResults } = window[\n \"@algolia/autocomplete-js\"\n ];\n const searchClient = algoliasearchApiInstance.getClient();\n const boardIndexName = algoliasearchApiInstance.getBoardIndexName();\n\n const autocompleteSearch = autocomplete({\n container: searchInputId,\n detachedMediaQuery: \"none\",\n placeholder: '作品タイトルを入力してください',\n autoFocus: true,\n id: searchInputName + \"-autocomplete\",\n getSources() {\n return [\n {\n sourceId: \"boards\",\n getItems({ query }) {\n return getAlgoliaResults({\n searchClient,\n queries: [\n {\n indexName: boardIndexName,\n query,\n params: {\n filters: \"is_suggestable: true\",\n hitsPerPage: 5\n }\n }\n ]\n });\n },\n templates: {\n item({ item, components, html }) {\n return html`\n
\n ${item.title}\n
\n ${components.Highlight({\n hit: item,\n attribute: \"title\",\n tagName: \"mark\"\n })}\n
\n
\n `;\n }\n },\n onSelect({ insights, insightsEvents, item }) {\n if (item.redirect_url !== undefined) {\n const rootElement = document.querySelector(\".topics-select-box-module\");\n let type = rootElement.dataset.type;\n const redirectUrl = '/topics/new?board_id=' + item.objectID + '&type=' + type;\n window.location.href = redirectUrl\n }\n }\n },\n ];\n }\n });\n}\n\nfunction keypressSearch(searchInput) {\n let targetName = \"#\" + searchInput + \"-autocomplete-input\";\n let element = document.querySelector(targetName);\n\n if (element === null) {\n return;\n }\n\n element.addEventListener(\"keypress\", function (event) {\n let value = element.value;\n if (value !== \"\" && event.key === \"Enter\") {\n event.preventDefault();\n let redirectUrl = `/search?q=${element.value}`;\n location.href = redirectUrl;\n }\n });\n}\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n const topicsSearchName = \"topics-select-search\";\n const topicsSearchNameId = \"#\" + topicsSearchName;\n\n if (document.getElementById(topicsSearchName) === null) {\n return\n }\n\n enableAutoComplete(topicsSearchNameId, topicsSearchName);\n keypressSearch(topicsSearchName);\n\n});\n","import pubsubStore from \"../../pubsub_store\";\nimport loginStateStore from \"../../login_state_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n \"use strict\";\n let module = document.querySelector(\".topics-floating-menu-module\");\n\n if (module == null) {\n return;\n }\n\n let floatingMenuButtonElement = module.querySelector(\".floating-menu-button\");\n let floatingMenuDialogElement = module.querySelector(\".floating-menu-dialog\");\n\n floatingMenuDialogElement.addEventListener('click', (event) => {\n if (event.target.closest('.floating-menu-dialog-contents') === null) {\n floatingMenuDialogElement.close();\n }\n });\n\n floatingMenuButtonElement.addEventListener('click', (event) => {\n floatingMenuDialogElement.showModal();\n\n const focusedElement = document.activeElement;\n\n if (focusedElement !== null) {\n focusedElement.blur();\n }\n });\n\n const scrollToTopButtonElement = module.querySelector(\".floating-menu-item-scroll-to-top\");\n scrollToTopButtonElement.addEventListener('click', (event) => {\n app.scrollToHash(\"#js-scroll-to-top\")\n floatingMenuDialogElement.close();\n });\n\n const scrollToFormButtonElement = module.querySelector(\".floating-menu-item-scroll-to-comment-form .menu-link\");\n const scrollToFormElement = document.querySelector(\"#post-comment-form\");\n\n if (scrollToFormButtonElement !== null && scrollToFormElement !== null) {\n scrollToFormButtonElement.addEventListener('click', (event) => {\n app.scrollToHash(\"#post-comment-form\")\n floatingMenuDialogElement.close();\n });\n } else {\n scrollToFormButtonElement.classList.add(\"disable\");\n }\n\n const scrollToLastCommentButtonElement = module.querySelector(\".floating-menu-item-scroll-to-last-comment .menu-link\");\n const lastCommentElement = document.querySelector(\"#last-comment\");\n\n if (scrollToLastCommentButtonElement !== null && lastCommentElement !== null) {\n scrollToLastCommentButtonElement.addEventListener('click', (event) => {\n app.scrollToHash(\"#last-comment\")\n floatingMenuDialogElement.close();\n });\n } else {\n scrollToLastCommentButtonElement.classList.add(\"disable\");\n }\n\n let calcFloatingPositon = element => {\n let overlayModuleElement = document.querySelector(\".pr-footer-overlay-module\");\n if (overlayModuleElement == null) {\n return;\n }\n\n element.classList.add(\"overlay\");\n\n }\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n calcFloatingPositon(module)\n module.style.display = \"block\";\n });\n\n});\n","import Api from \"../../Api\";\nimport loginStateStore from \"../../login_state_store\";\nimport pubsubStore from \"../../pubsub_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function(event) {\n let commentElems = document.querySelectorAll(\".owned-comment\");\n\n if (commentElems.length === 0) {\n return;\n }\n\n let initState = () => {\n let ownedTopicId = commentElems[0].dataset.ownedTopicId;\n let ownedCommentIds = Array.prototype.map.call(commentElems, function(\n elem\n ) {\n return elem.dataset.ownedCommentId;\n });\n\n Api.userTopicCommentsEditable(ownedTopicId, ownedCommentIds).then(json => {\n let commentIds = json.comment_ids;\n commentElems.forEach(function(targetComment) {\n let targetCommentId = parseInt(targetComment.dataset.ownedCommentId);\n\n if (commentIds.includes(targetCommentId)) {\n targetComment.style.display = \"block\";\n } else {\n targetComment.remove();\n }\n });\n });\n };\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n if (loginStateStore.isLoggedIn()) {\n initState();\n }\n });\n});\n","import Api from \"../../Api\";\nimport csrfTokenStoreInstance from \"../../csrf_token_store\";\nimport loginStateStore from \"../../login_state_store\";\nimport pubsubStore from \"../../pubsub_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n \"use strict\";\n\n let isExist = document.querySelector(\".comment-input-form-module\");\n\n if (isExist == null) {\n return;\n }\n\n let rootElement = () => {\n return document.querySelector(\".comment-input-form-module\");\n };\n\n let isPost = () => {\n return rootElement().classList.contains(\"post\");\n };\n\n let isPut = () => {\n return rootElement().classList.contains(\"put\");\n };\n\n let isAnonymousEnabled = () => {\n return rootElement().querySelector(\"#comment_anonymous_enabled\").checked;\n };\n\n let anonymousEnabledElement = () => {\n return rootElement().querySelector(\"#comment_anonymous_enabled\");\n };\n\n let displaySelfReplyMessage = () => {\n const replyMessageCommentId = rootElement().dataset.replyToCommentId || null;\n\n if (replyMessageCommentId == null) {\n return;\n }\n\n if (isPut()) {\n return;\n }\n\n Api.commentSelfReply(replyMessageCommentId).then(response => {\n\n const selfReplyMesseageElement = rootElement().querySelector(\".self-reply-message\") || null;\n\n if (selfReplyMesseageElement == null) {\n return;\n }\n\n if (response.is_self_reply == true) {\n selfReplyMesseageElement.style.display = \"block\";\n } else {\n selfReplyMesseageElement.remove();\n }\n });\n };\n\n let uddateRateLimitState = () => {\n Api.commentRateLimit().then(response => {\n\n const rateLimitMesseageElement = rootElement().querySelector(\".rate-limit-message\") || null;\n\n if (rateLimitMesseageElement == null) {\n return;\n }\n\n if (response.is_over_rate_limit == true) {\n rateLimitMesseageElement.style.display = \"block\";\n let postButtonElement = rootElement().querySelector(\"#post-button\");\n postButtonElement.disabled = true;\n } else {\n rateLimitMesseageElement.remove();\n }\n });\n\n };\n\n\n let initFormState = () => {\n let nameElement = rootElement().querySelector(\".name-partial\");\n let inputCommentElement = nameElement.querySelector(\".input-comment-name\");\n let inputElement = inputCommentElement.querySelector(\"#comment_name\");\n let notLoginMessageElement = nameElement.querySelector(\n \".not-login-message\"\n );\n let userIconImageElement = rootElement().querySelector(\".user-icon img\");\n\n if (loginStateStore.isLoggedIn()) {\n notLoginMessageElement.remove();\n userIconImageElement.src = loginStateStore.getUserIconPath();\n if (isPost()) {\n inputCommentElement.style.display = \"none\";\n anonymousEnabledElement().checked = false;\n }\n\n if (isPut()) {\n if (isAnonymousEnabled()) {\n inputCommentElement.style.display = \"block\";\n userIconImageElement.src = loginStateStore.getUserPrivateIconPath();\n } else {\n inputElement.value = \"名無し\";\n inputCommentElement.style.display = \"none\";\n }\n }\n } else {\n anonymousEnabledElement().checked = true;\n }\n\n displaySelfReplyMessage();\n uddateRateLimitState();\n };\n\n anonymousEnabledElement().addEventListener(\"click\", function (e) {\n let nameElement = rootElement().querySelector(\".name-partial\");\n let inputCommentElement = nameElement.querySelector(\".input-comment-name\");\n let notLoginMessageElement = nameElement.querySelector(\n \".not-login-message\"\n );\n let postButtonElement = rootElement().querySelector(\"#post-button\");\n let userIconImageElement = rootElement().querySelector(\".user-icon img\");\n\n if (loginStateStore.isLoggedIn()) {\n if (isAnonymousEnabled()) {\n inputCommentElement.style.display = \"block\";\n userIconImageElement.src = loginStateStore.getUserPrivateIconPath();\n } else {\n inputCommentElement.style.display = \"none\";\n userIconImageElement.src = loginStateStore.getUserIconPath();\n }\n } else {\n if (isAnonymousEnabled()) {\n inputCommentElement.style.display = \"block\";\n notLoginMessageElement.style.display = \"none\";\n postButtonElement.disabled = false;\n } else {\n inputCommentElement.style.display = \"none\";\n notLoginMessageElement.style.display = \"block\";\n postButtonElement.disabled = true;\n }\n }\n });\n\n let imageSelectorDialog = rootElement().querySelector(\n \"a#image-selector-button\"\n );\n\n imageSelectorDialog.addEventListener(\"click\", function (event) {\n event.preventDefault();\n\n let fileSelector = rootElement().querySelector(\"input.image-field\");\n\n fileSelector.addEventListener(\"change\", function (e) {\n let pasteImage = rootElement().querySelector(\".paste-image\");\n let files = e.target.files;\n\n if (files.length == 0) {\n let imageElement = pasteImage.querySelector(\"img\");\n\n if (imageElement != null) {\n imageElement.remove();\n return;\n }\n\n return;\n }\n\n for (var i = 0, file; (file = files[i]); i++) {\n if (!file.type.match(\"image.*\")) {\n continue;\n }\n\n var reader = new FileReader();\n\n reader.onload = (function (f) {\n return function (e) {\n try {\n let imageElement = pasteImage.querySelector(\"img\");\n\n if (imageElement != null) {\n imageElement.remove();\n return;\n }\n\n var uploagImageElement = document.createElement(\"img\");\n uploagImageElement.className = \"upload-image\";\n pasteImage.appendChild(uploagImageElement);\n\n var img = pasteImage.querySelector(\"img.upload-image\");\n img.src = e.target.result;\n } catch (e) { }\n };\n })(file);\n\n reader.readAsDataURL(file);\n\n return;\n }\n });\n\n fileSelector.click();\n });\n\n let postButtonElement = rootElement().querySelector(\"#post-button\");\n postButtonElement.addEventListener(\"click\", function (e) {\n let authenticityTokenElements = rootElement().querySelectorAll(\n \"input[name='authenticity_token'][type='hidden']\"\n );\n authenticityTokenElements.forEach(element => {\n element.value = csrfTokenStoreInstance.get().csrfToken;\n });\n\n window.removeEventListener('beforeunload', beforeUnLoadEvent)\n });\n\n let setResizeForm = () => {\n let commentBodyForm = document.querySelector(\"#comment_body\");\n let clientHeight = commentBodyForm.clientHeight;\n commentBodyForm.addEventListener(\"input\", () => {\n commentBodyForm.style.height = clientHeight + \"px\";\n let scrollHeight = commentBodyForm.scrollHeight;\n commentBodyForm.style.height = scrollHeight + \"px\";\n });\n };\n\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n initFormState();\n\n });\n setResizeForm();\n\n let beforeUnLoadEvent = (event) => {\n let commentBodyForm = document.querySelector(\"#comment_body\");\n let commentBody = commentBodyForm.value;\n if (commentBody.length > 0) {\n event.preventDefault();\n event.returnValue = \"このページを離れますか?\";\n return \"このページを離れますか?\";\n }\n return;\n };\n\n window.addEventListener('beforeunload', beforeUnLoadEvent)\n});\n","import pubsubStore from \"../../pubsub_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n \"use strict\";\n\n const observer = new IntersectionObserver(function (entries, observer) {\n entries.forEach(function (entry) {\n if (entry.isIntersecting) {\n var attributeText = entry.target.getAttribute('data-tracking-on-view') || \"\";\n const category = entry.target.getAttribute(\"data-category\") || \"undefined\";\n const label = entry.target.getAttribute(\"data-label\") || attributeText;\n\n if (attributeText !== \"\") {\n gtag('event', 'impression', { 'event_category': category, 'event_label': label })\n }\n\n observer.unobserve(entry.target);\n }\n });\n }, { rootMargin: \"0px\", threshold: 1 });\n\n\n pubsubStore.subscribe(\"renderAsyncLoad\", eventContainer => {\n const elements = eventContainer.querySelectorAll(\".pr-small-author-board-module\");\n\n if (elements == null) {\n return;\n }\n\n elements.forEach(function (element) {\n observer.observe(element);\n\n const boardElement = element.querySelector(\".pr-board\");\n const backgroundImageUrl = boardElement.getAttribute(\"data-background-image-url\");\n boardElement.style.setProperty('--custom-bg-image', `url(${backgroundImageUrl})`);\n\n element.addEventListener('click', function (event) {\n const attributeText = element.getAttribute(\"data-tracking-on-click\") || \"\";\n const category = element.getAttribute(\"data-category\") || \"undefined\";\n const label = element.getAttribute(\"data-label\") || attributeText;\n const value = element.getAttribute(\"data-value\") || 1;\n\n gtag('event', 'click', { 'event_category': category, 'event_label': label, 'value': value })\n });\n });\n });\n\n});\n","import pubsubStore from \"../../../pubsub_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n\t\"use strict\";\n\n\tconst observer = new IntersectionObserver(function (entries, observer) {\n\t\tentries.forEach(function (entry) {\n\t\t\tif (entry.isIntersecting) {\n\t\t\t\tvar attributeText = entry.target.getAttribute('data-tracking-on-view') || \"\";\n\t\t\t\tconst category = entry.target.getAttribute(\"data-category\") || \"undefined\";\n\t\t\t\tconst label = entry.target.getAttribute(\"data-label\") || attributeText;\n\n\t\t\t\tif (attributeText !== \"\") {\n\t\t\t\t\tgtag('event', 'impression', { 'event_category': category, 'event_label': label })\n\t\t\t\t}\n\n\t\t\t\tobserver.unobserve(entry.target);\n\t\t\t}\n\t\t});\n\t}, { rootMargin: \"0px\", threshold: 1 });\n\n\tpubsubStore.subscribe(\"renderAsyncLoad\", eventContainer => {\n\t\tconst elements = eventContainer.querySelectorAll(\".pr-ebookjapan-yahoo-banner-module\");\n\n\t\tif (elements == null) {\n\t\t\treturn;\n\t\t}\n\n\t\telements.forEach(function (element) {\n\t\t\tobserver.observe(element);\n\t\t});\n\n\t\telements.forEach(element => {\n\t\t\telement.addEventListener('click', function (event) {\n\t\t\t\tconst attributeText = element.getAttribute(\"data-tracking-on-click\") || \"\";\n\t\t\t\tconst category = element.getAttribute(\"data-category\") || \"undefined\";\n\t\t\t\tconst label = element.getAttribute(\"data-label\") || attributeText;\n\t\t\t\tconst value = element.getAttribute(\"data-value\") || 1;\n\n\t\t\t\tgtag('event', 'click', { 'event_category': category, 'event_label': label, 'value': value })\n\t\t\t});\n\t\t});\n\t})\n});\n","import pubsubStore from \"../../../pubsub_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n\t\"use strict\";\n\n\tconst observer = new IntersectionObserver(function (entries, observer) {\n\t\tentries.forEach(function (entry) {\n\t\t\tif (entry.isIntersecting) {\n\t\t\t\tvar attributeText = entry.target.getAttribute('data-tracking-on-view') || \"\";\n\t\t\t\tconst category = entry.target.getAttribute(\"data-category\") || \"undefined\";\n\t\t\t\tconst label = entry.target.getAttribute(\"data-label\") || attributeText;\n\n\t\t\t\tif (attributeText !== \"\") {\n\t\t\t\t\tgtag('event', 'impression', { 'event_category': category, 'event_label': label })\n\t\t\t\t}\n\n\t\t\t\tobserver.unobserve(entry.target);\n\t\t\t}\n\t\t});\n\t}, { rootMargin: \"0px\", threshold: 1 });\n\n\tpubsubStore.subscribe(\"renderAsyncLoad\", eventContainer => {\n\t\tconst elements = eventContainer.querySelectorAll(\".pr-ebookjapan-yahoo-rectangle-board-module\");\n\n\t\tif (elements == null) {\n\t\t\treturn;\n\t\t}\n\n\t\telements.forEach(function (element) {\n\t\t\tobserver.observe(element);\n\t\t});\n\n\t\telements.forEach(element => {\n\t\t\telement.addEventListener('click', function (event) {\n\t\t\t\tconst attributeText = element.getAttribute(\"data-tracking-on-click\") || \"\";\n\t\t\t\tconst category = element.getAttribute(\"data-category\") || \"undefined\";\n\t\t\t\tconst label = element.getAttribute(\"data-label\") || attributeText;\n\t\t\t\tconst value = element.getAttribute(\"data-value\") || 1;\n\n\t\t\t\tgtag('event', 'click', { 'event_category': category, 'event_label': label, 'value': value })\n\t\t\t});\n\t\t});\n\t})\n});\n","// 参考ページ\n// https://github.com/algolia/instantsearch.js/blob/61ad247c252a42743efa35d0e32d1802119e53a2/stories/panel.stories.ts#L58\n\nimport algoliasearchApiInstance from \"../algoliasearch/api\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n \"use strict\";\n\n let isExist = document.querySelector(\"#js-filter-search\");\n\n if (isExist == null) {\n return;\n }\n\n const search = instantsearch({\n indexName: algoliasearchApiInstance.getBoardIndexName(),\n searchClient: algoliasearchApiInstance.getClient(),\n insights: true,\n });\n\n search.addWidget(\n instantsearch.widgets.analytics({\n pushFunction(formattedParameters, state, results) {\n gtag('config', 'G-ZVDPNNBLJT', {\n 'page_location': location.href,\n 'page_referrer': document.referrer,\n });\n\n },\n triggerOnUIInteraction: true,\n pushInitialSearch: true,\n pushPagination: true\n })\n );\n\n search.addWidget(\n instantsearch.widgets.configure({\n hitsPerPage: 50,\n clickAnalytics: true\n })\n );\n\n search.addWidget(\n instantsearch.widgets.clearRefinements({\n container: document.querySelector(\".filters-clear-refinements\"),\n templates: {\n resetLabel: \"リセット\"\n }\n })\n );\n\n search.addWidget(\n instantsearch.widgets.searchBox({\n container: document.querySelector(\".filters-search-box\"),\n placeholder: \"作品・著者・キャラで探す\",\n showLoadingIndicator: false,\n showReset: false,\n showSubmit: false\n })\n );\n\n const sortByCategories = (a, b) => {\n const fixedOrder = [\n {\n order_id: 1,\n name: \"少年マンガ\"\n },\n {\n order_id: 2,\n name: \"少女マンガ\"\n },\n {\n order_id: 3,\n name: \"青年マンガ\"\n },\n {\n order_id: 4,\n name: \"女性マンガ\"\n },\n {\n order_id: 5,\n name: \"ボーイズラブコミック\"\n },\n {\n order_id: 6,\n name: \"ティーンズラブコミック\"\n },\n {\n order_id: 7,\n name: \"レディースコミック\"\n },\n {\n order_id: 8,\n name: \"ハーレクインコミック\"\n },\n {\n order_id: 9,\n name: \"男性マンガ雑誌\"\n },\n {\n order_id: 10,\n name: \"女性マンガ雑誌\"\n }\n ];\n const target_a = fixedOrder.find(function (element) {\n return element.name === a.name;\n });\n\n const target_b = fixedOrder.find(function (element) {\n return element.name === b.name;\n });\n\n if (target_a === undefined || target_b === undefined) {\n return 0;\n }\n\n return target_a.order_id - target_b.order_id;\n };\n\n const categoryNamesListWithPanel = instantsearch.widgets.panel({\n collapsed: options => {\n return options && options.state;\n },\n templates: {\n header({ state }) {\n const item = state.facetsRefinements.category_name;\n let length = item?.length ?? 0;\n\n return `
🚻 カテゴリ
${length == 0\n ? \"\"\n : `
${length}件選択中
`\n }
`;\n },\n collapseButtonText: ({ collapsed }) => getCollapseIcon(collapsed)\n }\n })(instantsearch.widgets.refinementList);\n\n search.addWidget(\n categoryNamesListWithPanel({\n container: document.querySelector(\".filters-category-names\"),\n attribute: \"category_name\",\n operator: \"and\",\n sortBy: sortByCategories\n })\n );\n\n const awardNamesListWithPanel = instantsearch.widgets.panel({\n collapsed: options => {\n return options && options.state;\n },\n templates: {\n header({ state }) {\n const item = state.facetsRefinements.award_names;\n let length = item?.length ?? 0;\n\n return `
🎖️ マンガ賞
${length == 0\n ? \"\"\n : `
${length}件選択中
`\n }
`;\n },\n collapseButtonText: ({ collapsed }) => getCollapseIcon(collapsed)\n }\n })(instantsearch.widgets.refinementList);\n\n search.addWidget(\n awardNamesListWithPanel({\n container: document.querySelector(\".filters-award-names\"),\n attribute: \"award_names\",\n limit: 20,\n operator: \"and\",\n sortBy: [\"isRefined\", \"count:desc\", \"id:asc\"]\n })\n );\n\n const tagNamesListWithPanel = instantsearch.widgets.panel({\n collapsed: options => {\n return options && options.state;\n },\n templates: {\n header({ state }) {\n const item = state.facetsRefinements._tags;\n let length = item?.length ?? 0;\n\n return `
🔠 ジャンル
${length == 0\n ? \"\"\n : `
${length}件選択中
`\n }
`;\n },\n collapseButtonText: ({ collapsed }) => getCollapseIcon(collapsed)\n }\n })(instantsearch.widgets.refinementList);\n\n search.addWidget(\n tagNamesListWithPanel({\n container: document.querySelector(\".filters-tag-names\"),\n attribute: \"_tags\",\n limit: 15,\n operator: \"and\",\n sortBy: [\"count:desc\", \"name:asc\"]\n })\n );\n\n const releaseYearRangeListWithPanel = instantsearch.widgets.panel({\n collapsed: options => {\n return options && options.state;\n },\n templates: {\n header({ state }) {\n const item = state.facetsRefinements.release_year_range;\n let length = item?.length ?? 0;\n\n return `
🕰️ 年代
${length == 0\n ? \"\"\n : `
${length}件選択中
`\n }
`;\n },\n collapseButtonText: ({ collapsed }) => getCollapseIcon(collapsed)\n }\n })(instantsearch.widgets.refinementList);\n\n search.addWidget(\n releaseYearRangeListWithPanel({\n container: document.querySelector(\".filters-release-year-range\"),\n attribute: \"release_year_range\",\n showMoreLimit: 20,\n operator: \"and\",\n sortBy: [\"name:desc\", \"isRefined\", \"count:desc\"]\n })\n );\n\n search.addWidget(\n instantsearch.widgets.stats({\n container: document.querySelector(\".filters-stats\"),\n templates: {\n text: `\n
{{nbHits}}
\n `\n }\n })\n );\n\n search.addWidget(\n instantsearch.widgets.stats({\n container: document.querySelector(\".filter-search-apply\"),\n templates: {\n text: `\n
絞り込み({{nbHits}})
\n `\n }\n })\n );\n\n const mediaTypesListWithPanel = instantsearch.widgets.panel({\n collapsed: options => {\n return options && options.state;\n },\n templates: {\n header({ state }) {\n const item = state.facetsRefinements.media_type_names;\n let length = item?.length ?? 0;\n\n return `
🎬 メディア化
${length == 0\n ? \"\"\n : `
${length}件選択中
`\n }
`;\n },\n collapseButtonText: ({ collapsed }) => getCollapseIcon(collapsed)\n }\n })(instantsearch.widgets.refinementList);\n\n search.addWidget(\n mediaTypesListWithPanel({\n container: document.querySelector(\".filters-media-type-names\"),\n attribute: \"media_type_names\",\n sortBy: [\"count:desc\", \"name:asc\"]\n })\n );\n\n search.addWidget(\n instantsearch.widgets.toggleRefinement({\n container: document.querySelector(\".filters-completed\"),\n attribute: \"is_completed_book\",\n templates: {\n labelText({ onFacetValue }) {\n return `完結 ${onFacetValue.count == null\n ? \"\"\n : `${onFacetValue.count}`\n }`;\n }\n }\n })\n );\n search.addWidget(\n instantsearch.widgets.toggleRefinement({\n container: document.querySelector(\".filters-yomikiri\"),\n attribute: \"is_yomikiri\",\n templates: {\n labelText({ onFacetValue }) {\n return `読切 ${onFacetValue.count == null\n ? \"\"\n : `${onFacetValue.count}`\n }`;\n }\n }\n })\n );\n\n search.addWidget(\n instantsearch.widgets.toggleRefinement({\n container: document.querySelector(\".filters-new-series\"),\n attribute: \"is_new_book\",\n templates: {\n labelText({ onFacetValue }) {\n return `新連載 ${onFacetValue.count == null\n ? \"\"\n : `${onFacetValue.count}`\n }`;\n }\n }\n })\n );\n\n search.addWidget(\n instantsearch.widgets.toggleRefinement({\n container: document.querySelector(\".filters-free-campaigns\"),\n attribute: \"has_free_campaigns\",\n templates: {\n labelText({ onFacetValue }) {\n return `無料で読める ${onFacetValue.count == null\n ? \"\"\n : `${onFacetValue.count}`\n }`;\n }\n }\n })\n );\n\n search.addWidget(\n instantsearch.widgets.toggleRefinement({\n container: document.querySelector(\".filters-sale-campaigns\"),\n attribute: \"has_sale_campaigns\",\n templates: {\n labelText({ onFacetValue }) {\n return `セール中 ${onFacetValue.count == null\n ? \"\"\n : `${onFacetValue.count}`\n }`;\n }\n }\n })\n );\n\n search.addWidget(\n instantsearch.widgets.toggleRefinement({\n container: document.querySelector(\".filters-kindle-unlimited\"),\n attribute: \"has_kindle_unlimited\",\n templates: {\n labelText({ onFacetValue }) {\n return `Kindle Unlimited ${onFacetValue.count == null\n ? \"\"\n : `${onFacetValue.count}`\n }`;\n }\n }\n })\n );\n\n\n search.addWidget(\n instantsearch.widgets.toggleRefinement({\n container: document.querySelector(\".filters-web-manga\"),\n attribute: \"has_web_manga\",\n templates: {\n labelText({ onFacetValue }) {\n return `Webマンガ ${onFacetValue.count == null\n ? \"\"\n : `${onFacetValue.count}`\n }`;\n }\n }\n })\n );\n\n search.addWidget(\n instantsearch.widgets.toggleRefinement({\n container: document.querySelector(\".filters-kindle\"),\n attribute: \"has_kindle\",\n templates: {\n labelText({ onFacetValue }) {\n return `Kindle ${onFacetValue.count == null\n ? \"\"\n : `${onFacetValue.count}`\n }`;\n }\n }\n })\n );\n\n const keywordTagNamesListWithPanel = instantsearch.widgets.panel({\n collapsed: options => {\n return options && options.state;\n },\n templates: {\n header({ state }) {\n const item = state.disjunctiveFacetsRefinements.keyword_tag_names;\n let length = item?.length ?? 0;\n\n return `
🏷 タグ
${length == 0\n ? \"\"\n : `
${length}件選択中
`\n }
`;\n },\n collapseButtonText: ({ collapsed }) => getCollapseIcon(collapsed)\n }\n })(instantsearch.widgets.refinementList);\n\n search.addWidget(\n keywordTagNamesListWithPanel({\n container: document.querySelector(\".filters-keyword-tag-names\"),\n searchable: true,\n showMoreLimit: 20,\n searchablePlaceholder: \"タグを検索\",\n searchableIsAlwaysActive: false,\n templates: {\n searchableNoResults: \"\"\n },\n limit: 5,\n attribute: \"keyword_tag_names\"\n })\n );\n\n const emotionalTagNamesListWithPanel = instantsearch.widgets.panel({\n collapsed: options => {\n return options && options.state;\n },\n templates: {\n header({ state }) {\n const item = state.disjunctiveFacetsRefinements.emotional_tag_names;\n let length = item?.length ?? 0;\n\n return `
😊 感情タグ
${length == 0\n ? \"\"\n : `
${length}件選択中
`\n }
`;\n },\n collapseButtonText: ({ collapsed }) => getCollapseIcon(collapsed)\n }\n })(instantsearch.widgets.refinementList);\n\n search.addWidget(\n emotionalTagNamesListWithPanel({\n container: document.querySelector(\".filters-emotional-tag-names\"),\n operator: \"and\",\n limit: 5,\n attribute: \"emotional_tag_names\"\n })\n );\n\n const publisherNamesListWithPanel = instantsearch.widgets.panel({\n collapsed: options => {\n return options && options.state;\n },\n templates: {\n header({ state }) {\n const item = state.disjunctiveFacetsRefinements.publisher_name;\n let length = item?.length ?? 0;\n\n return `
🏢 出版社
${length == 0\n ? \"\"\n : `
${length}件選択中
`\n }
`;\n },\n collapseButtonText: ({ collapsed }) => getCollapseIcon(collapsed)\n }\n })(instantsearch.widgets.refinementList);\n\n search.addWidget(\n publisherNamesListWithPanel({\n container: document.querySelector(\".filters-publisher-names\"),\n searchable: true,\n showMoreLimit: 20,\n searchablePlaceholder: \"出版社を検索\",\n searchableIsAlwaysActive: false,\n templates: {\n searchableNoResults: \"\"\n },\n limit: 5,\n attribute: \"publisher_name\"\n })\n );\n\n const releaseYearListWithPanel = instantsearch.widgets.panel({\n collapsed: options => {\n return options && options.state;\n },\n templates: {\n header({ state }) {\n const item = state.disjunctiveFacetsRefinements.release_year;\n let length = item?.length ?? 0;\n\n return `
🗓️ 出版年
${length == 0\n ? \"\"\n : `
${length}件選択中
`\n }
`;\n },\n collapseButtonText: ({ collapsed }) => getCollapseIcon(collapsed)\n }\n })(instantsearch.widgets.refinementList);\n\n search.addWidget(\n releaseYearListWithPanel({\n container: document.querySelector(\".filters-release-year\"),\n searchable: true,\n showMoreLimit: 20,\n searchablePlaceholder: \"出版年を検索\",\n searchableIsAlwaysActive: false,\n templates: {\n searchableNoResults: \"\"\n },\n limit: 10,\n attribute: \"release_year_text\",\n sortBy: [\"isRefined\", \"name:desc\"]\n })\n );\n\n // Create the render function\n const renderRatingMenu = (renderOptions, isFirstRender) => {\n const { items, refine, createURL, widgetParams } = renderOptions;\n\n if (isFirstRender) {\n const ulElement = document.createElement(\"ul\");\n ulElement.classList.add(\"ais-RatingMenu-list\");\n widgetParams.container.appendChild(ulElement);\n\n return;\n }\n\n widgetParams.container.querySelector(\"ul\").innerHTML = items\n .map(\n item =>\n `
  • \n \n ${item.stars.map(isFilled => (isFilled ? \"⭐\" : \"☆\")).join(\"\")}\n ${item.value}以上\n ${item.count}\n \n
  • `\n )\n .join(\"\");\n\n [...widgetParams.container.querySelectorAll(\"a\")].forEach(element => {\n element.addEventListener(\"click\", event => {\n event.preventDefault();\n refine(event.currentTarget.dataset.value);\n });\n });\n };\n\n // Create the custom widget\n const customRatingMenu = instantsearch.connectors.connectRatingMenu(\n renderRatingMenu\n );\n\n const ratingsWithPanel = instantsearch.widgets.panel({\n collapsed: options => {\n return options && options.state;\n },\n templates: {\n header({ state }) {\n const length = Object.keys(state.numericRefinements.favorite_rating_average).length\n\n return `
    ⭐️ お気に入り度
    ${length == 0\n ? \"\"\n : `
    ${length}件選択中
    `\n }
    `;\n },\n collapseButtonText: ({ collapsed }) => getCollapseIcon(collapsed)\n }\n })(customRatingMenu);\n\n search.addWidget(\n ratingsWithPanel({\n container: document.querySelector(\".filters-ratings\"),\n attribute: \"favorite_rating_average\"\n })\n );\n\n const labelNamesListWithPanel = instantsearch.widgets.panel({\n collapsed: options => {\n return options && options.state;\n },\n templates: {\n header({ state }) {\n const item = state.disjunctiveFacetsRefinements.label_name;\n let length = item?.length ?? 0;\n\n return `
    📚 レーベル
    ${length == 0\n ? \"\"\n : `
    ${length}件選択中
    `\n }
    `;\n },\n collapseButtonText: ({ collapsed }) => getCollapseIcon(collapsed)\n }\n })(instantsearch.widgets.refinementList);\n\n search.addWidget(\n labelNamesListWithPanel({\n container: document.querySelector(\".filters-label-names\"),\n searchable: true,\n showMoreLimit: 20,\n searchablePlaceholder: \"レーベルを検索\",\n searchableIsAlwaysActive: false,\n templates: {\n searchableNoResults: \"\"\n },\n limit: 5,\n attribute: \"label_name\"\n })\n );\n\n const booksCountListWithPanel = instantsearch.widgets.panel({\n collapsed: options => {\n return options && options.state;\n },\n templates: {\n header({ state }) {\n const item = state.disjunctiveFacetsRefinements.books_count;\n let length = item?.length ?? 0;\n\n return `
    1️⃣ 巻数
    ${length == 0\n ? \"\"\n : `
    ${length}件選択中
    `\n }
    `;\n },\n collapseButtonText: ({ collapsed }) => getCollapseIcon(collapsed)\n }\n })(instantsearch.widgets.refinementList);\n\n search.addWidget(\n booksCountListWithPanel({\n container: document.querySelector(\".filters-books-count\"),\n searchable: true,\n showMoreLimit: 20,\n searchablePlaceholder: \"巻数を検索\",\n searchableIsAlwaysActive: false,\n templates: {\n searchableNoResults: \"\"\n },\n limit: 5,\n attribute: \"books_count_text\"\n })\n );\n\n\n const labelMap = {\n is_completed_book: \"完結作品のみ\",\n is_yomikiri: \"読切のみ\",\n is_new_book: \"新連載のみ\",\n has_free_campaigns: \"無料\",\n has_sale_campaigns: \"セール\",\n has_kindle_unlimited: \"Kindle Unlimited\",\n has_web_manga: \"Webマンガ\",\n has_kindle: \"Kindle\",\n favorite_rating_average: {\n '≤ 5': \"⭐5以下\",\n '≥ 4': \"⭐4以上\",\n '≥ 3': \"⭐3以上\",\n '≥ 2': \"⭐2以上\",\n '≥ 1': \"⭐1以上\"\n }\n };\n\n const getLabel = (refinement) => {\n const attributeLabels = labelMap[refinement.attribute];\n if (typeof attributeLabels === 'object') {\n return attributeLabels[refinement.label] || refinement.label;\n }\n return attributeLabels || refinement.label;\n };\n\n const createDataAttribtues = refinement =>\n Object.keys(refinement)\n .map(key => `data-${key}=\"${refinement[key]}\"`)\n .join(\" \");\n\n const renderListItem = item => `\n
  • \n
    \n
      \n ${item.refinements\n .map(\n refinement =>\n `\n
    • \n \n \n ${getLabel(refinement)}\n \n \n \n
    • \n `\n )\n .join(\"\")}\n
    \n
    \n
  • \n `;\n\n const renderCurrentRefinements = (renderOptions, isFirstRender) => {\n const { items, refine, widgetParams } = renderOptions;\n\n widgetParams.container.innerHTML = `\n
    \n \n
    \n `;\n [...widgetParams.container.querySelectorAll(\"button\")].forEach(element => {\n element.addEventListener(\"click\", event => {\n const item = Object.keys(event.currentTarget.dataset).reduce(\n (acc, key) => ({\n ...acc,\n [key]: event.currentTarget.dataset[key]\n }),\n {}\n );\n\n refine(item);\n });\n });\n };\n\n // Create the custom widget\n const customCurrentRefinements = instantsearch.connectors.connectCurrentRefinements(\n renderCurrentRefinements\n );\n\n // Instantiate the custom widget\n search.addWidgets([\n customCurrentRefinements({\n container: document.querySelector(\".filters-current-refinements\")\n })\n ]);\n\n // Instantiate the custom widget\n search.addWidgets([\n customCurrentRefinements({\n container: document.querySelector(\".filter-search-dialog-current-refinements\")\n })\n ]);\n\n const renderSearchHits = (hits, results) => {\n console.log(hits);\n return hits\n .map(\n item => `\n
    \n \n
    \n \"${item.title}\"\n
    \n
    \n
    \n \n
    \n ${item.author_urls\n .map(\n author_url => `\n \n
    \n ${author_url.name}\n
    \n
    `\n )\n .join(\"\")}\n
    \n
    \n ${item.is_new_book == false && item.is_yomikiri == false\n ? `\n
    \n ${![\"女性マンガ誌\", \"男性マンガ誌\"].includes(\n item.category_name\n )\n ? item.books_count !== 0\n ? `\n \n ${item.books_count}巻まで刊行\n \n `\n : \"\"\n : \"\"\n }\n
    \n `\n : \"\"\n }\n ${item.is_new_book\n ? `\n \n `\n : item.is_yomikiri\n ? `\n \n `\n : item.is_completed_book\n ? `\n \n `\n : \"\"\n }\n\n
    \n
    ${item.first_book_summary}
    \n ${item.has_free_campaigns\n ? `\n \n `\n : item.has_preview && item.is_new_book\n ? `\n \n `\n : item.has_preview && item.is_yomikiri\n ? `\n \n `\n : item.has_preview\n ? `\n \n `\n : `\n
    \n
    \n
    \n \"book\"\n
    \n
    試し読み
    \n
    \n
    \n `\n }\n\n \n
    \n
    \n `\n )\n .join(\"\");\n };\n\n const renderFreeCampaignsHits = (hits, results) => {\n return hits\n .map(\n item => `\n
    \n
    \n \n
    \n \"${item.title}\"\n
    \n
    \n
    \n \n
    ${item.title}
    \n
    \n
    \n ${item.author_urls\n .map(\n author_url => `\n \n
    \n ${author_url.name}\n
    \n
    `\n )\n .join(\"\")}\n
    \n \n
    \n
    \n \n
    \n `\n )\n .join(\"\");\n };\n\n const renderKindleUnlimitedHits = (hits, results) => {\n return hits\n .map(\n item => `\n
    \n
    \n \n
    \n \"${item.title}\"\n
    \n
    \n
    \n \n
    ${item.title}
    \n
    \n
    \n ${item.author_urls\n .map(\n author_url => `\n \n
    \n ${author_url.name}\n
    \n
    `\n )\n .join(\"\")}\n
    \n \n
    \n
    \n \n
    \n `\n )\n .join(\"\");\n };\n\n const renderItemHits = (hits, results) => {\n if (\n results._state.disjunctiveFacetsRefinements.has_free_campaigns.length ===\n 1\n ) {\n return renderFreeCampaignsHits(hits, results);\n } else if (\n results._state.disjunctiveFacetsRefinements.has_kindle_unlimited\n .length === 1\n ) {\n return renderKindleUnlimitedHits(hits, results);\n } else {\n return renderSearchHits(hits, results);\n }\n };\n\n const renderHits = (renderOptions, isFirstRender) => {\n const { hits, results, showMore, widgetParams } = renderOptions;\n const readMoreElement = document.querySelector('.infinite-scroll-readmore-module');\n\n if (isFirstRender) {\n readMoreElement.style.display = 'none';\n readMoreElement.addEventListener('click', () => {\n showMore();\n });\n }\n\n if (results === undefined) {\n return;\n }\n\n if (results.nbHits <= 50) {\n readMoreElement.style.display = 'none';\n } else {\n readMoreElement.style.display = 'block';\n }\n\n widgetParams.container.querySelector(\n \".filter-search-hit-items\"\n ).innerHTML = renderItemHits(hits, results);\n };\n\n // Create the custom widget\n const customHits = instantsearch.connectors.connectInfiniteHits(renderHits);\n\n search.addWidgets([\n customHits({\n container: document.querySelector(\".filter-search-hits\"),\n })\n ]);\n\n const renderSearchDialogHits = (hits, results) => {\n return hits\n .map(\n item => `\n
    \n \n
    \n \"${item.title}\"\n
    \n
    \n
    \n ${item.has_free_campaigns\n ? `\n \n `\n : item.has_preview && item.is_new_book\n ? `\n \n `\n : item.has_preview && item.is_yomikiri\n ? `\n \n `\n : item.has_preview\n ? `\n \n `\n : `\n
    \n
    \n
    \n \"book\"\n
    \n
    試し読み
    \n
    \n
    \n `\n }\n
    \n
    \n `\n )\n .join(\"\");\n };\n\n\n const renderDialogItemHits = (hits, results) => {\n return renderSearchDialogHits(hits, results);\n };\n\n const renderDialogHits = (renderOptions, isFirstRender) => {\n const { hits, results, showMore, widgetParams } = renderOptions;\n\n widgetParams.container.querySelector(\n \".filter-search-dialog-hit-items\"\n ).innerHTML = renderDialogItemHits(hits, results);\n }\n\n // Create the custom widget\n const customDialogHits = instantsearch.connectors.connectInfiniteHits(renderDialogHits);\n\n search.addWidgets([\n customDialogHits({\n container: document.querySelector(\".filter-search-dialog-hits-partial\"),\n })\n ]);\n\n /*\n const renderPagination = (renderOptions, isFirstRender) => {`\n const {\n pages,\n currentRefinement,\n nbPages,\n isFirstPage,\n isLastPage,\n refine,\n createURL,\n widgetParams\n } = renderOptions;\n\n if (isFirstRender) {\n let div = document.createElement(\"div\");\n div.setAttribute(\"class\", \"filter-search-pagination-module\");\n\n let div_0 = document.createElement(\"div\");\n div_0.setAttribute(\"class\", \"popular-pagination\");\n div.appendChild(div_0);\n\n let div_1 = document.createElement(\"div\");\n div_1.setAttribute(\"class\", \"page-items\");\n div_1.setAttribute(\"id\", \"page-items\");\n div_0.appendChild(div_1);\n\n widgetParams.container.appendChild(div);\n }\n\n const container = widgetParams.container.querySelector(\"#page-items\");\n\n container.innerHTML = `\n ${\n !isFirstPage\n ? `\n \n \n \n `\n : `\n
    <<
    \n `\n }\n ${pages\n .map(\n page => `\n \n
    ${page + 1}
    \n
    \n `\n )\n .join(\"\")}\n ${\n !isLastPage\n ? `\n \n \n \n `\n : `\n
    >>
    \n `\n }\n `;\n [...container.querySelectorAll(\"a\")].forEach(element => {\n element.addEventListener(\"click\", event => {\n event.preventDefault();\n refine(event.currentTarget.dataset.value);\n\n if (app.isSmartPhone()) {\n const headerHeight = 55;\n let rect = document\n .querySelector(\"#filters-search-box\")\n .getBoundingClientRect();\n let position = rect.top + document.body.scrollTop;\n window.scrollTo({\n top: position - headerHeight\n });\n }\n });\n });\n };\n\n // Create the custom widget\n const customPagination = instantsearch.connectors.connectPagination(\n renderPagination\n );\n\n // Instantiate the custom widget\n search.addWidget(\n customPagination({\n container: document.querySelector(\".filter-pagination\"),\n padding: 2\n })\n );\n */\n search.start();\n\n function getCollapseIcon(collapsed) {\n return collapsed ? \"expand_more\" : \"expand_less\";\n }\n\n function toString(data) {\n if (data === null || data === undefined) {\n return \"\";\n }\n return data;\n }\n\n function toBoolean(data) {\n if (data === null || data === undefined) {\n return false;\n }\n return data.toLowerCase() === \"true\";\n }\n\n function toStringArray(data) {\n if (data === null || data === undefined) {\n return null;\n }\n return data.split(\",\");\n }\n\n const url = new URL(window.location.href);\n const searchParams = new URLSearchParams(url.search);\n const params = Object.fromEntries(searchParams.entries());\n\n if (params !== {}) {\n // https://www.algolia.com/doc/api-reference/widgets/ui-state/js/\n\n const query = toString(params[\"q\"]);\n const hasFreeCampaigns = toBoolean(params[\"free_campaigns\"]);\n const hasSaleCampaigns = toBoolean(params[\"sale_campaigns\"]);\n const hasKindleUnlimited = toBoolean(params[\"kindle_unlimited\"]);\n const hasKindle = toBoolean(params[\"kindle\"]);\n const hasWebManga = toBoolean(params[\"web_manga\"]);\n const isNewSeries = toBoolean(params[\"new_series\"]);\n const isYomikiri = toBoolean(params[\"yomikiri\"]);\n const isCompleted = toBoolean(params[\"completed\"]);\n const mediaTypeNames = toStringArray(params[\"media_type_names\"]);\n const keywordTagNames = toStringArray(params[\"keyword_tag_names\"]);\n const emotionalTagNames = toStringArray(params[\"emotional_tag_names\"]);\n const awardNames = toStringArray(params[\"award_names\"]);\n const categoryNames = toStringArray(params[\"category_names\"]);\n const tagNames = toStringArray(params[\"tag_names\"]);\n const releaseYearRange = toStringArray(params[\"release_year_range\"]);\n const releaseYear = toStringArray(params[\"release_year\"]);\n const publisherNames = toStringArray(params[\"publisher_names\"]);\n const labelNames = toStringArray(params[\"label_names\"]);\n const title = toString(params[\"title\"]);\n const author = toString(params[\"author\"]);\n let searchQuery = [query, title, author].filter(Boolean).join(' ');\n\n search.setUiState({\n Board_production: {\n query: searchQuery,\n toggle: {\n has_free_campaigns: hasFreeCampaigns,\n has_sale_campaigns: hasSaleCampaigns,\n has_kindle_unlimited: hasKindleUnlimited,\n has_kindle: hasKindle,\n has_web_manga: hasWebManga,\n is_new_book: isNewSeries,\n is_completed_book: isCompleted,\n is_yomikiri: isYomikiri,\n },\n refinementList: {\n media_type_names: mediaTypeNames,\n keyword_tag_names: keywordTagNames,\n emotional_tag_names: emotionalTagNames,\n award_names: awardNames,\n category_name: categoryNames,\n _tags: tagNames,\n release_year_range: releaseYearRange,\n release_year_text: releaseYear,\n publisher_name: publisherNames,\n label_name: labelNames\n },\n }\n });\n }\n\n const dialogButtonElement = document.querySelector(\".filter-search-dialog-event\");\n const dialogElement = document.querySelector(\".filter-search-dialog\");\n const filterSearchSearchPartialElement = document.querySelector(\".filter-search-search-box-partial\");\n const dialogFilterSearchSearchPartiallement = document.querySelector(\".filter-search-dialog-search-box-partial\");\n const filterSearchBoxModuleElement = document.querySelector(\".filter-search-search-box-module\");\n\n const dialogFilterSearchApplyElement = document.querySelector(\".filter-search-apply\");\n const dialogFfilterSearchCloseButtonElement = document.querySelector(\".filter-search-dialog-close-button\");\n\n\n dialogButtonElement.addEventListener('click', (event) => {\n dialogFilterSearchSearchPartiallement.appendChild(filterSearchBoxModuleElement)\n\n dialogElement.showModal();\n\n const focusedElement = document.activeElement;\n\n if (focusedElement !== null) {\n focusedElement.blur();\n }\n });\n\n dialogElement.addEventListener('click', (event) => {\n if (event.target.closest('.filter-search-dialog-contents') === null) {\n //filterSearchSearchPartialElement.appendChild(filterSearchBoxModuleElement)\n // dialogElement.close();\n }\n });\n\n let dialogFilterStatsButtonElement = document.querySelector(\".filters-stats-button\");\n dialogFilterStatsButtonElement.addEventListener('click', (event) => {\n\n filterSearchSearchPartialElement.appendChild(filterSearchBoxModuleElement)\n\n dialogElement.close();\n });\n\n\n dialogFilterSearchApplyElement.addEventListener('click', (event) => {\n closeDialog();\n });\n\n dialogFfilterSearchCloseButtonElement.addEventListener('click', (event) => {\n closeDialog();\n });\n\n function closeDialog() {\n filterSearchSearchPartialElement.appendChild(filterSearchBoxModuleElement)\n\n dialogElement.close();\n\n }\n});\n","import pubsubStore from \"../../pubsub_store\";\nimport algoliasearchApiInstance from \"../../algoliasearch/api\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n \"use strict\";\n\n let isExist = document.querySelector(\".user-board-lists-form\");\n\n if (isExist == null) {\n return;\n }\n\n let rootElement = () => {\n return document.querySelector(\".user-board-lists-form\");\n };\n\n let sortableElement = rootElement().querySelector(\".user-board-list-items\");\n let sortable = Sortable.create(sortableElement, {\n handle: \".thumbnail\" // Element is dropped into the list from another list\n });\n\n const { autocomplete, getAlgoliaResults } = window[\n \"@algolia/autocomplete-js\"\n ];\n const searchClient = algoliasearchApiInstance.getClient();\n const indexName = algoliasearchApiInstance.getBoardIndexName();\n\n const autocompleteSearch = autocomplete({\n container: \"#user-board-list-search\",\n detachedMediaQuery: \"none\",\n placeholder: \"マンガのタイトルで検索\",\n id: \"user-board-list-search\",\n getSources() {\n return [\n {\n getItems({ query }) {\n return getAlgoliaResults({\n searchClient,\n queries: [\n {\n indexName: indexName,\n query,\n params: {\n hitsPerPage: 5\n }\n }\n ]\n });\n },\n templates: {\n item({ item, components, html }) {\n return html`\n
    \n ${item.title}\n
    \n ${components.Highlight({\n hit: item,\n attribute: \"title\",\n tagName: \"mark\"\n })}\n
    \n
    \n `;\n }\n },\n onSelect({\n state,\n event,\n item,\n setIsOpen,\n setQuery,\n query,\n category\n }) {\n let targetElement = initElement(item);\n sortableElement.appendChild(targetElement);\n\n enabledPostButton();\n if (app.isSmartPhone()) {\n pageToScroll(\"#user-board-list-search-partial\");\n }\n setQuery(\"\");\n setIsOpen(false);\n }\n }\n ];\n }\n });\n\n let enabledPostButton = () => {\n let itemElements = rootElement().querySelectorAll(\n \".user-board-list-items .user-board-lists-item-module\"\n );\n let postButton = rootElement().querySelector(\n \".post-button-partial #post-button\"\n );\n\n if (itemElements.length == 0 || itemElements.length >= 1000) {\n postButton.disabled = true;\n } else {\n postButton.disabled = false;\n }\n };\n\n let pageToScroll = targetId => {\n const targetElement = document.querySelector(targetId);\n const targetOffsetTop =\n window.pageYOffset + targetElement.getBoundingClientRect().top - 230;\n\n window.scrollTo({\n top: targetOffsetTop,\n behavior: \"smooth\"\n });\n };\n\n let initElement = suggestion => {\n let baseListItem = rootElement().querySelector(\n \".user-board-lists-base-item .user-board-lists-item-module\"\n );\n let newListItem = baseListItem.cloneNode(true);\n\n let imageElement = newListItem.querySelector(\".thumbnail img\");\n imageElement.src = suggestion.large_thumbnail_url;\n\n let titleElement = newListItem.querySelector(\".title\");\n titleElement.innerText = suggestion.title;\n\n let authorsElement = newListItem.querySelector(\".authors\");\n authorsElement.innerText = suggestion.author_names_text;\n\n let boardIdElement = newListItem.querySelector(\n \"#user_board_list_items_board_id\"\n );\n boardIdElement.value = suggestion.objectID;\n\n let deleteActionElement = newListItem.querySelector(\".delete-action\");\n deleteActionElement.addEventListener(\"click\", function (event) {\n newListItem.remove();\n enabledPostButton();\n });\n\n return newListItem;\n };\n\n let initForm = () => {\n let itemElements = rootElement().querySelectorAll(\n \".user-board-lists-item-module\"\n );\n itemElements.forEach(itemElement => {\n let deleteActionElement = itemElement.querySelector(\".delete-action\");\n deleteActionElement.addEventListener(\"click\", function (event) {\n itemElement.remove();\n enabledPostButton();\n });\n });\n enabledPostButton();\n };\n pubsubStore.subscribe(\"userLoginCompleted\", args => { });\n initForm();\n});\n","import pubsubStore from \"../../pubsub_store\";\nimport loginStateStore from \"../../login_state_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function(event) {\n \"use strict\";\n\n let modules = document.querySelectorAll(\".user-board-list-actions\");\n if (modules.length == 0) {\n return;\n }\n\n let initState = () => {\n let key = loginStateStore.getKey();\n\n modules.forEach(element => {\n let targetKey = element.dataset.userKey;\n if (key === targetKey) {\n element.style.display = \"block\";\n } else {\n element.remove();\n }\n });\n };\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n initState();\n });\n});\n","import Api from \"../../Api\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function(event) {\n let element = document.querySelector(\"#user-board-list-view-counter\");\n\n if (element == null) {\n return;\n }\n let userBoardListId = element.dataset.userBoardListId;\n Api.userBoardListViewCounter(userBoardListId).then(json => {});\n});\n","import Api from \"../../Api\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n let element = document.querySelector(\"#theme-view-counter\");\n\n if (element == null) {\n return;\n }\n\n let themeId = element.dataset.themeId;\n Api.themeViewCounter(themeId).then(json => { });\n});\n","import Api from \"../Api\";\n\nclass TopicVisitLogger {\n constructor(element) {\n this.element = element;\n this.init(); // 初期化処理\n }\n\n async init() {\n try {\n const topicId = this.element.dataset.topicId;\n await this.addUserRecentVisitedTopicLogs(topicId);\n } catch (error) {\n console.error(\"Error adding topic visit log:\", error);\n }\n }\n\n async addUserRecentVisitedTopicLogs(topicId) {\n await Api.addUserRecentVisitedTopicLogs(topicId);\n }\n}\n\ndocument.addEventListener(\"DOMContentLoaded\", () => {\n const element = document.querySelector(\"#topic-visited\");\n if (element) {\n new TopicVisitLogger(element);\n }\n});\n","import Api from \"../Api\";\n\nclass BoardVisitLogger {\n constructor(element) {\n this.element = element;\n this.init(); // 初期化処理\n }\n\n async init() {\n try {\n const boardId = this.element.dataset.boardId;\n await this.addUserRecentVisitedBoardLogs(boardId);\n } catch (error) {\n console.error(\"Error adding board visit log:\", error);\n }\n }\n\n async addUserRecentVisitedBoardLogs(boardId) {\n await Api.addUserRecentVisitedBoardLogs(boardId);\n }\n}\n\ndocument.addEventListener(\"DOMContentLoaded\", () => {\n const element = document.querySelector(\"#board-visited\");\n if (element) {\n new BoardVisitLogger(element);\n }\n});\n","import Api from \"../Api\";\n\nclass AuthorVisitLogger {\n constructor(element) {\n this.element = element;\n this.init(); // 初期化処理\n }\n\n async init() {\n try {\n const authorId = this.element.dataset.authorId;\n await this.addUserRecentVisitedAuthorLogs(authorId);\n } catch (error) {\n console.error(\"Error adding author visit log:\", error);\n }\n }\n\n async addUserRecentVisitedAuthorLogs(authorId) {\n await Api.addUserRecentVisitedAuthorLogs(authorId);\n }\n}\n\ndocument.addEventListener(\"DOMContentLoaded\", () => {\n const element = document.querySelector(\"#author-visited\");\n if (element) {\n new AuthorVisitLogger(element);\n }\n});\n","import loginStateStore from \"../../../login_state_store\";\nimport pubsubStore from \"../../../pubsub_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function(event) {\n \"use strict\";\n\n let modules = document.querySelectorAll(\".free-space-introduction-item-main-module\");\n\n if (modules.length == 0) {\n return;\n }\n\n let initState = () => {\n modules.forEach(element => {\n if (loginStateStore.isLoggedIn() == true) {\n element.remove()\n }\n });\n };\n\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n initState();\n });\n\n\n});\n","import pubsubStore from \"../pubsub_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function(event) {\n \"use strict\";\n let modules = document.querySelectorAll(\".image-with-expansion-module\");\n\n if (modules.length == 0) {\n return;\n }\n\n let initImageBanner = element => {\n let imageBannerElement = element.querySelector(\".image-banner\");\n let clipArtElement = element.querySelector(\".clip-art\");\n\n if (imageBannerElement === null ){\n return\n }\n\n imageBannerElement.addEventListener(\"click\", function() {\n imageBannerElement.remove();\n clipArtElement.classList.remove(\"hide\");\n });\n }\n\n let initState = () => {\n modules.forEach(element => {\n initImageBanner(element)\n });\n };\n\n initState();\n\n pubsubStore.subscribe(\"infiniteScrollPageAppend\", appendRootElement => {\n appendRootElement.querySelectorAll(\".image-with-expansion-module\").forEach(element => {\n initImageBanner(element)\n });\n });\n});\n","import Api from \"../Api\";\nimport loginStateStore from \"../login_state_store\";\nimport pubsubStore from \"../pubsub_store\";\n\nclass ImportLinkVideoModule {\n constructor() {\n this.player = null;\n this.modules = document.querySelectorAll(\".import-video-link-module\");\n }\n\n initializeModules() {\n this.loadYouTubeAPI();\n\n this.modules.forEach(element => {\n this.initDialog(element);\n });\n }\n\n loadYouTubeAPI() {\n const script = document.createElement('script');\n script.src = \"//www.youtube.com/iframe_api\";\n const firstScript = document.getElementsByTagName('script')[0];\n firstScript.parentNode.insertBefore(script, firstScript);\n }\n\n initDialog(element) {\n const newImportLinkVideoLink = element.querySelector(\".import-video-link-contents\");\n const dialogElement = element.querySelector(\".import-video-link-dialog\");\n const closeButton = dialogElement.querySelector(\".close-button\");\n\n let player = null;\n\n const createYouTubePlayer = (embedPlayer, videoId) => {\n if (player) {\n return player;\n }\n\n const { width, height } = this.getPlayerDimensions();\n\n player = new YT.Player(embedPlayer, {\n height: height,\n width: width,\n videoId: videoId,\n events: {\n 'onReady': this.onPlayerReady\n }\n });\n\n return player;\n };\n\n newImportLinkVideoLink.addEventListener('click', () => {\n const dialogFormContentsElement = element.querySelector(\".dialog-form-contents\");\n const videoUrl = dialogFormContentsElement.dataset.videoUrl;\n const videoId = new URL(videoUrl).searchParams.get(\"v\");\n\n const embedPlayer = dialogFormContentsElement.querySelector('.embed-player');\n createYouTubePlayer(embedPlayer, videoId);\n\n dialogElement.showModal();\n });\n\n closeButton.addEventListener('click', () => {\n dialogElement.close();\n this.pauseVideo(player);\n });\n\n dialogElement.addEventListener('click', (event) => {\n if (!event.target.closest('.import-video-link-dialog-contents')) {\n dialogElement.close();\n this.pauseVideo(player);\n }\n });\n }\n\n getPlayerDimensions() {\n if (app.isSmartPhone()) {\n return { width: 320, height: 180 };\n }\n return { width: 640, height: 360 };\n }\n\n onPlayerReady(event) {\n console.log(event);\n }\n\n pauseVideo(player) {\n if (player && player.pauseVideo) {\n player.pauseVideo();\n }\n }\n}\n\nconst importLinkVideoModuleInstance = new ImportLinkVideoModule();\nexport default importLinkVideoModuleInstance;\n\ndocument.addEventListener(\"DOMContentLoaded\", () => {\n importLinkVideoModuleInstance.initializeModules();\n});\n","import algoliasearchApiInstance from \"./api\";\n\nfunction enableAutoComplete(searchInputId, searchInputName) {\n const { autocomplete, getAlgoliaResults } = window[\n \"@algolia/autocomplete-js\"\n ];\n const searchClient = algoliasearchApiInstance.getClient();\n const boardIndexName = algoliasearchApiInstance.getBoardIndexName();\n const authorIndexName = algoliasearchApiInstance.getAuthorIndexName();\n const placeholders = [\n \"全体検索\",\n \"サイト内検索\",\n \"コンテンツ検索\",\n \"キーワード検索\",\n \"タイトル・著者\",\n ];\n\n const autocompleteSearch = autocomplete({\n container: searchInputId,\n detachedMediaQuery: \"none\",\n placeholder: placeholders[Math.floor(Math.random() * placeholders.length)],\n id: searchInputName + \"-autocomplete\",\n getSources() {\n return [\n {\n sourceId: \"boards\",\n getItems({ query }) {\n return getAlgoliaResults({\n searchClient,\n queries: [\n {\n indexName: boardIndexName,\n query,\n params: {\n filters: \"is_suggestable: true\",\n hitsPerPage: 5\n }\n }\n ]\n });\n },\n templates: {\n header({ html }) {\n return html`\n
    作品
    \n `;\n },\n\n item({ item, components, html }) {\n return html`\n
    \n ${item.title}\n
    \n ${components.Highlight({\n hit: item,\n attribute: \"title\",\n tagName: \"mark\"\n })}\n
    \n
    \n `;\n }\n },\n onSelect({ insights, insightsEvents, item }) {\n if (item.redirect_url !== undefined) {\n window.location.href = item.redirect_url;\n }\n }\n },\n {\n sourceId: \"authors\",\n getItems({ query }) {\n return getAlgoliaResults({\n searchClient,\n queries: [\n {\n indexName: authorIndexName,\n query,\n params: {\n filters: \"is_suggestable: true\",\n hitsPerPage: 5\n }\n }\n ]\n });\n },\n templates: {\n header({ html }) {\n return html`\n
    著者
    \n `;\n },\n item({ item, components, html }) {\n return html`\n
    \n ${item.author_names_text}\n
    \n ${components.Highlight({\n hit: item,\n attribute: \"name\",\n tagName: \"mark\"\n })}\n
    \n
    \n `;\n }\n },\n onSelect({ insights, insightsEvents, item }) {\n if (item.redirect_url !== undefined) {\n window.location.href = item.redirect_url;\n }\n }\n }\n ];\n }\n });\n}\n\nfunction placeholderSearch(searchInput) {\n let targetName = searchInput + \"-autocomplete-input\";\n let element = document.querySelector(targetName);\n if (element === null) {\n return;\n }\n\n element.addEventListener(\"keypress\", function (event) {\n let value = element.value;\n if (value === \"\" && event.key === \"Enter\") {\n event.preventDefault();\n let placeholderMessage = element.placeholder;\n let redirectUrl = `/search`;\n location.href = redirectUrl;\n }\n\n if (value !== \"\" && event.key === \"Enter\") {\n event.preventDefault();\n let redirectUrl = `/search?q=${element.value}`;\n location.href = redirectUrl;\n }\n });\n}\n\nfunction placeholderSearchFromButton(searchInput, searchButtonId) {\n let targetName = searchInput + \"-autocomplete-input\";\n let elementInput = document.querySelector(targetName);\n let elementButton = document.getElementById(searchButtonId);\n\n elementButton.addEventListener(\"click\", function (event) {\n let value = elementInput.value;\n if (value === \"\") {\n event.preventDefault();\n let placeholderMessage = elementInput.placeholder;\n let redirectUrl = `/search`;\n location.href = redirectUrl;\n } else {\n let redirectUrl = `/search?q=${elementInput.value}`;\n location.href = redirectUrl;\n }\n });\n}\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n const desktopSearchInputName = \"desktop-header-search\";\n const desktopSearchInputNameId = \"#\" + desktopSearchInputName;\n const desktopSearchElement = document.getElementById(desktopSearchInputName);\n\n if (desktopSearchElement === null) {\n return;\n }\n\n if (document.getElementById(desktopSearchInputName) !== null) {\n enableAutoComplete(desktopSearchInputNameId, desktopSearchInputName);\n }\n\n placeholderSearch(desktopSearchInputNameId);\n\n const desktopSearchButtonId = \"desktop-header-search-button\";\n placeholderSearchFromButton(desktopSearchInputNameId, desktopSearchButtonId);\n\n const smartphoneSearchInputName = \"smartphone-header-search\";\n const smartphoneSearchInputNameId = \"#\" + smartphoneSearchInputName;\n\n if (document.getElementById(smartphoneSearchInputName) !== null) {\n enableAutoComplete(smartphoneSearchInputNameId, smartphoneSearchInputName);\n }\n placeholderSearch(smartphoneSearchInputNameId);\n});\n","// https://yuku.takahashi.coffee/textcomplete/\n// https://github.com/yuku/textcomplete\n\nimport algoliasearchApiInstance from \"./api\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n let myTextareaElements = document.querySelectorAll(\n \".textarea-autocomplete-enabled\"\n );\n if (myTextareaElements.length == 0) {\n return;\n }\n\n const { Textcomplete } = require(\"@textcomplete/core\");\n const { TextareaEditor } = require(\"@textcomplete/textarea\");\n\n let boardIndex = algoliasearchApiInstance.getBoardIndex();\n let authorIndex = algoliasearchApiInstance.getAuthorIndex();\n\n let searchBoardHits = term => {\n return new Promise(resolve => {\n let filters = {\n filters: \"is_suggestable: true\",\n };\n boardIndex.search(term, filters).then(({ hits }) =>\n resolve(\n hits.map(function (item) {\n return [item.title, item.suggest_thumbnail_url];\n })\n )\n );\n });\n };\n\n let searchAuthorHits = term => {\n return new Promise(resolve => {\n let filters = {\n filters: \"is_suggestable: true\",\n };\n authorIndex.search(term, filters).then(({ hits }) =>\n resolve(\n hits.map(function (item) {\n return [item.name, item.thumbnail_url];\n })\n )\n );\n });\n };\n\n let strategyBoard = {\n //match: /\\/([\\-+\\w].*)$/,\n match: /\\/(.+)$/,\n search: async (term, callback) => {\n callback(await searchBoardHits(term));\n },\n template: ([key, url]) => `
    ${key}
    `,\n replace: result => `${result[0]}`,\n cache: true\n };\n\n let strategyAuthor = {\n //match: /\\@([\\-+\\.]*)$/,\n match: /\\@(.+)$/,\n search: async (term, callback) => {\n callback(await searchAuthorHits(term));\n },\n template: ([key, url]) => `
    ${key}
    `,\n replace: result => `${result[0]}`,\n cache: true\n };\n\n // Default option. All properties are optional recursively.\n let option = {\n // Configure a dropdown UI.\n dropdown: {\n // Class attribute of the dropdown element.\n className: \"dropdown-menu textcomplete-dropdown\",\n\n // The maximum number of items to be rendered.\n maxCount: 5,\n\n // Placement of the dropdown. \"auto\", \"top\" or \"bottom\".\n placement: \"auto\",\n\n // Return header and footer elements' content\n\n // Whether activate the opposite side item on pressing up or\n // down key when an edge item is active.\n rotate: false,\n\n // Configure CSS style of the dropdown element.\n style: { display: \"none\", position: \"absolute\", zIndex: \"1000\" },\n\n // The parent node of the dropdown element.\n parent: document.body,\n\n item: {\n // Class attribute of the each dropdown item element.\n className: \"textcomplete-item\",\n\n // Active item's class attribute.\n activeClassName: \"textcomplete-item active\"\n }\n }\n };\n myTextareaElements.forEach(element => {\n const editor = new TextareaEditor(element);\n const textcomplete = new Textcomplete(\n editor,\n [strategyBoard, strategyAuthor],\n option\n );\n });\n});\n","import algoliasearchApiInstance from \"./api\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n function enableAutoComplete(searchInput) {\n const { autocomplete, getAlgoliaResults } = window[\n \"@algolia/autocomplete-js\"\n ];\n const searchClient = algoliasearchApiInstance.getClient();\n let indexName = algoliasearchApiInstance.getTopicIndexName();\n\n const autocompleteSearch = autocomplete({\n container: searchInput,\n detachedMediaQuery: \"none\",\n placeholder: \"キーワードで絞り込み\",\n autoFocus: true,\n id: \"free-space-autocomplete\",\n getSources() {\n return [\n {\n getItems({ query }) {\n return getAlgoliaResults({\n searchClient,\n queries: [\n {\n indexName: indexName,\n query,\n params: {\n filters: \"is_free_space_suggestable: true\",\n hitsPerPage: 5\n }\n }\n ]\n });\n },\n templates: {\n item({ item, components, html }) {\n return html`\n
    \n ${components.Highlight({\n hit: item,\n attribute: \"title\",\n tagName: \"mark\"\n })}\n
    \n `;\n }\n },\n onSelect({ insights, insightsEvents, item }) {\n location.href = item.redirect_url;\n }\n }\n ];\n }\n });\n\n let buttonElement = document.querySelector(\"#free-space-search-button\");\n let inputElement = document.querySelector(\"#free-space-autocomplete-input\");\n buttonElement.addEventListener(\"click\", function (event) {\n let value = inputElement.value;\n if (value !== \"\") {\n event.preventDefault();\n let redirectUrl = `/search/free_spaces?q=${value}`;\n location.href = redirectUrl;\n }\n });\n }\n\n function enableEnterSearch() {\n let targetNameId = \"#free-space-autocomplete-input\";\n let element = document.querySelector(targetNameId);\n if (element === null) {\n return;\n }\n\n element.addEventListener(\"keypress\", function (event) {\n let value = element.value;\n if (value !== \"\" && event.key === \"Enter\") {\n event.preventDefault();\n let redirectUrl = `/search/free_spaces?q=${element.value}`;\n location.href = redirectUrl;\n }\n });\n }\n\n const freeSpaceSearchNameId = \"#free-space-search\";\n let element = document.querySelector(freeSpaceSearchNameId);\n if (element === null) {\n return;\n }\n\n enableAutoComplete(freeSpaceSearchNameId);\n enableEnterSearch();\n});\n","import algoliasearchApiInstance from \"./api\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n\n function enableAutoComplete(searchInput) {\n const { autocomplete, getAlgoliaResults } = window[\n \"@algolia/autocomplete-js\"\n ];\n const searchClient = algoliasearchApiInstance.getClient();\n let indexName = algoliasearchApiInstance.getUserBoardListIndexName();\n\n const autocompleteSearch = autocomplete({\n container: searchInput,\n detachedMediaQuery: \"none\",\n placeholder: \"キーワードで絞り込み\",\n id: \"user-board-list-autocomplete\",\n getSources() {\n return [\n {\n getItems({ query }) {\n return getAlgoliaResults({\n searchClient,\n queries: [\n {\n indexName: indexName,\n query,\n params: {\n hitsPerPage: 5\n }\n }\n ]\n });\n },\n templates: {\n item({ item, components, html }) {\n return html`\n
    \n ${components.Highlight({\n hit: item,\n attribute: \"title\",\n tagName: \"mark\"\n })}\n
    \n `;\n }\n },\n onSelect({ insights, insightsEvents, item }) {\n location.href = item.redirect_url;\n }\n }\n ];\n }\n });\n\n let buttonElement = document.querySelector(\"#user-board-list-search-button\");\n let inputElement = document.querySelector(\"#user-board-list-autocomplete-input\");\n buttonElement.addEventListener(\"click\", function (event) {\n let value = inputElement.value;\n if (value !== \"\") {\n event.preventDefault();\n let redirectUrl = `/search/user_board_lists?q=${value}`;\n location.href = redirectUrl;\n }\n });\n }\n\n function enableEnterSearch(rootElement) {\n let targetNameId = \"#user-board-list-autocomplete-input\";\n let element = rootElement.querySelector(targetNameId);\n if (element === null) {\n return;\n }\n\n element.addEventListener(\"keypress\", function (event) {\n let value = element.value;\n if (value !== \"\" && event.key === \"Enter\") {\n event.preventDefault();\n let redirectUrl = `/search/user_board_lists?q=${element.value}`;\n location.href = redirectUrl;\n }\n });\n }\n\n const rootElement = document.querySelector(\".user-board-lists-search-box-module\");\n\n if (rootElement === null) {\n return;\n }\n\n const userBoardListSearchNameId = \"#user-board-list-search\";\n let element = rootElement.querySelector(userBoardListSearchNameId);\n\n if (element === null) {\n return;\n }\n\n enableAutoComplete(userBoardListSearchNameId);\n enableEnterSearch(rootElement);\n});\n","import algoliasearchApiInstance from \"./api\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function(event) {\n function enableAutoComplete(searchInput) {\n const { autocomplete, getAlgoliaResults } = window[\n \"@algolia/autocomplete-js\"\n ];\n const searchClient = algoliasearchApiInstance.getClient();\n const indexName = algoliasearchApiInstance.getManbaMagazineArticleIndexName();\n\n const autocompleteSearch = autocomplete({\n container: searchInput,\n detachedMediaQuery: \"none\",\n placeholder: \"キーワードで絞り込み\",\n id: \"manba-magazine-article-autocomplete\",\n getSources() {\n return [\n {\n getItems({ query }) {\n return getAlgoliaResults({\n searchClient,\n queries: [\n {\n indexName: indexName,\n query,\n params: {\n hitsPerPage: 5\n }\n }\n ]\n });\n },\n templates: {\n item({ item, components, html }) {\n return html`\n
    \n ${components.Highlight({\n hit: item,\n attribute: \"title\",\n tagName: \"mark\"\n })}\n
    \n `;\n }\n },\n onSelect({ insights, insightsEvents, item }) {\n location.href = item.redirect_url;\n }\n }\n ];\n }\n });\n\n let buttonElement = document.querySelector(\"#manba-magazine-search-button\");\n let inputElement = document.querySelector(\n \"#manba-magazine-article-autocomplete-input\"\n );\n buttonElement.addEventListener(\"click\", function(event) {\n let value = inputElement.value;\n if (value !== \"\") {\n event.preventDefault();\n let redirectUrl = `/search/manba_magazines?q=${value}`;\n location.href = redirectUrl;\n }\n });\n }\n\n function enableEnterSearch() {\n let targetNameId = \"#manba-magazine-article-autocomplete-input\";\n let element = document.querySelector(targetNameId);\n if (element === null) {\n return;\n }\n\n element.addEventListener(\"keypress\", function(event) {\n let value = element.value;\n if (value !== \"\" && event.key === \"Enter\") {\n event.preventDefault();\n let redirectUrl = `/search/manba_magazines?q=${element.value}`;\n location.href = redirectUrl;\n }\n });\n }\n\n const manbaMagazineSearchNameId = \"#manba-magzine-search\";\n let element = document.querySelector(manbaMagazineSearchNameId);\n if (element === null) {\n return;\n }\n\n enableAutoComplete(manbaMagazineSearchNameId);\n enableEnterSearch();\n});\n","import csrfTokenStoreInstance from \"../../csrf_token_store\";\nimport pubsubStore from \"../../pubsub_store\";\nimport loginStateStore from \"../../login_state_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function(event) {\n let isExist = document.querySelector(\".free-spaces-form\");\n\n if (isExist == null) {\n return;\n }\n\n let rootElement = () => {\n return document.querySelector(\".free-spaces-form\");\n };\n\n let isPost = () => {\n return rootElement().classList.contains(\"post\");\n };\n\n let isPut = () => {\n return rootElement().classList.contains(\"put\");\n };\n\n let isAnonymousEnabled = () => {\n return rootElement().querySelector(\"#topic_anonymous_enabled\").checked;\n };\n\n let anonymousEnabledElement = () => {\n return rootElement().querySelector(\"#topic_anonymous_enabled\");\n };\n\n let initFormState = () => {\n let nameElement = rootElement().querySelector(\".name-partial\");\n let inputCommentElement = nameElement.querySelector(\".input-comment-name\");\n let inputElement = inputCommentElement.querySelector(\"#comment_name\");\n let notLoginMessageElement = nameElement.querySelector(\n \".not-login-message\"\n );\n let userIconImageElement = rootElement().querySelector(\".user-icon img\");\n\n if (loginStateStore.isLoggedIn()) {\n notLoginMessageElement.remove();\n userIconImageElement.src = loginStateStore.getUserIconPath();\n\n if (isPost()) {\n inputCommentElement.style.display = \"none\";\n anonymousEnabledElement().checked = false;\n }\n if (isPut()) {\n if (isAnonymousEnabled()) {\n inputCommentElement.style.display = \"block\";\n userIconImageElement.src = loginStateStore.getUserPrivateIconPath();\n } else {\n inputElement.value = \"名無し\";\n inputCommentElement.style.display = \"none\";\n }\n }\n } else {\n anonymousEnabledElement().checked = true;\n }\n };\n\n anonymousEnabledElement().addEventListener(\"click\", function(e) {\n let nameElement = rootElement().querySelector(\".name-partial\");\n let inputCommentElement = nameElement.querySelector(\".input-comment-name\");\n let notLoginMessageElement = nameElement.querySelector(\n \".not-login-message\"\n );\n let postButtonElement = rootElement().querySelector(\"#post-button\");\n let userIconImageElement = rootElement().querySelector(\".user-icon img\");\n\n if (loginStateStore.isLoggedIn()) {\n if (isAnonymousEnabled()) {\n inputCommentElement.style.display = \"block\";\n userIconImageElement.src = loginStateStore.getUserPrivateIconPath();\n } else {\n inputCommentElement.style.display = \"none\";\n userIconImageElement.src = loginStateStore.getUserIconPath();\n }\n } else {\n if (isAnonymousEnabled()) {\n inputCommentElement.style.display = \"block\";\n notLoginMessageElement.style.display = \"none\";\n postButtonElement.disabled = false;\n } else {\n inputCommentElement.style.display = \"none\";\n notLoginMessageElement.style.display = \"block\";\n postButtonElement.disabled = true;\n }\n }\n });\n\n let imageSelectorDialog = document.querySelector(\"a#image-selector-button\");\n\n imageSelectorDialog.addEventListener(\"click\", function(event) {\n event.preventDefault();\n\n let fileSelector = document.querySelector(\"input.image-field\");\n\n fileSelector.addEventListener(\"change\", function(e) {\n let imagePartial = document.getElementsByClassName(\"image-partial\")[0];\n let pasteImage = document.getElementsByClassName(\"paste-image\")[0];\n\n let files = e.target.files;\n\n if (files.length == 0) {\n let imageElement = pasteImage.querySelector(\"img\");\n\n if (imageElement != null) {\n imageElement.remove();\n return;\n }\n\n return;\n }\n\n for (var i = 0, file; (file = files[i]); i++) {\n if (!file.type.match(\"image.*\")) {\n continue;\n }\n\n var reader = new FileReader();\n\n reader.onload = (function(f) {\n return function(e) {\n try {\n let imageElement = pasteImage.querySelector(\"img\");\n\n if (imageElement != null) {\n imageElement.remove();\n return;\n }\n\n var uploagImageElement = document.createElement(\"img\");\n uploagImageElement.className = \"upload-image\";\n pasteImage.appendChild(uploagImageElement);\n\n var img = pasteImage.querySelector(\"img.upload-image\");\n img.src = e.target.result;\n } catch (e) {}\n };\n })(file);\n\n reader.readAsDataURL(file);\n\n return;\n }\n });\n\n fileSelector.click();\n });\n\n let postButtonElement = rootElement().querySelector(\"#post-button\");\n postButtonElement.addEventListener(\"click\", function(e) {\n let authenticityTokenElements = rootElement().querySelectorAll(\n \"input[name='authenticity_token'][type='hidden']\"\n );\n authenticityTokenElements.forEach(element => {\n element.value = csrfTokenStoreInstance.get().csrfToken;\n });\n window.removeEventListener('beforeunload', beforeUnLoadEvent)\n\n });\n\n let setResizeForm = () => {\n let commentBodyForm = document.querySelector(\"#comment_body\");\n let clientHeight = commentBodyForm.clientHeight;\n commentBodyForm.addEventListener(\"input\", () => {\n commentBodyForm.style.height = clientHeight + \"px\";\n let scrollHeight = commentBodyForm.scrollHeight;\n commentBodyForm.style.height = scrollHeight + \"px\";\n });\n };\n\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n initFormState();\n });\n\n setResizeForm();\n\n let beforeUnLoadEvent = (event) => {\n let topicTitleForm = document.querySelector(\"#topic_title\");\n let topicTitle = topicTitleForm.value;\n\n let commentBodyForm = document.querySelector(\"#comment_body\");\n let commentBody = commentBodyForm.value;\n\n if (commentBody.length > 0 || topicTitle.length > 0) {\n event.preventDefault();\n event.returnValue = \"このページを離れますか?\";\n return \"このページを離れますか?\";\n }\n return;\n };\n\n window.addEventListener('beforeunload', beforeUnLoadEvent)\n\n});\n","import pubsubStore from \"../../pubsub_store\";\nimport loginStateStore from \"../../login_state_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n \"use strict\";\n let module = document.querySelector(\".free-spaces-floating-menu-module\");\n\n if (module == null) {\n return;\n }\n\n let floatingMenuButtonElement = module.querySelector(\".floating-menu-button\");\n let floatingMenuDialogElement = module.querySelector(\".floating-menu-dialog\");\n\n floatingMenuDialogElement.addEventListener('click', (event) => {\n if (event.target.closest('.floating-menu-dialog-contents') === null) {\n floatingMenuDialogElement.close();\n }\n });\n\n floatingMenuButtonElement.addEventListener('click', (event) => {\n floatingMenuDialogElement.showModal();\n\n const focusedElement = document.activeElement;\n\n if (focusedElement !== null) {\n focusedElement.blur();\n }\n });\n\n const scrollToTopButtonElement = module.querySelector(\".floating-menu-item-scroll-to-top\");\n scrollToTopButtonElement.addEventListener('click', (event) => {\n app.scrollToHash(\"#js-scroll-to-top\")\n floatingMenuDialogElement.close();\n });\n\n const scrollToFormButtonElement = module.querySelector(\".floating-menu-item-scroll-to-comment-form .menu-link\");\n const scrollToFormElement = document.querySelector(\"#post-comment-form\");\n\n if (scrollToFormButtonElement !== null && scrollToFormElement !== null) {\n scrollToFormButtonElement.addEventListener('click', (event) => {\n app.scrollToHash(\"#post-comment-form\")\n floatingMenuDialogElement.close();\n });\n } else {\n scrollToFormButtonElement.classList.add(\"disable\");\n }\n\n const scrollToLastCommentButtonElement = module.querySelector(\".floating-menu-item-scroll-to-last-comment .menu-link\");\n const lastCommentElement = document.querySelector(\"#last-comment\");\n\n if (scrollToLastCommentButtonElement !== null && lastCommentElement !== null) {\n scrollToLastCommentButtonElement.addEventListener('click', (event) => {\n app.scrollToHash(\"#last-comment\")\n floatingMenuDialogElement.close();\n });\n } else {\n scrollToLastCommentButtonElement.classList.add(\"disable\");\n }\n\n let calcFloatingPositon = element => {\n let overlayModuleElement = document.querySelector(\".pr-footer-overlay-module\");\n if (overlayModuleElement == null) {\n return;\n }\n\n element.classList.add(\"overlay\");\n\n }\n\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n calcFloatingPositon(module)\n module.style.display = \"block\";\n });\n\n});\n","import Api from \"../../Api\";\nimport loginStateStore from \"../../login_state_store\";\nimport pubsubStore from \"../../pubsub_store\";\n\nclass FreeSpacesTopicModule {\n constructor(modules) {\n this.modules = modules\n\n if (!this.modules.length) return;\n\n this.setupPageShowListener();\n this.initState();\n }\n\n setupPageShowListener() {\n const reloadIfNeeded = (event) => {\n if (event.persisted || this.isBackForwardNavigation()) {\n window.location.reload();\n }\n };\n window.addEventListener('pageshow', reloadIfNeeded, { once: true });\n }\n\n isBackForwardNavigation() {\n const [navigationEntry] = performance.getEntriesByType(\"navigation\");\n return navigationEntry?.type === \"back_forward\";\n }\n\n async initState() {\n for (const element of this.modules) {\n const topicId = element.dataset.topicId;\n if (topicId) {\n await this.updateTopicStatus(element, topicId);\n }\n }\n }\n\n async updateTopicStatus(element, topicId) {\n try {\n const { unread, last_updated_changed } = await Api.topicStatus(topicId);\n const lastUpdateAtChangedElement = element.querySelector(\".last-updated-at-changed\");\n\n if (!unread && last_updated_changed) {\n lastUpdateAtChangedElement.style.display = \"block\";\n } else {\n lastUpdateAtChangedElement?.remove();\n }\n } catch (error) {\n console.error(\"Error updating topic status:\", error);\n }\n }\n}\n\nconst initFreeSpacesModule = (modules) => {\n if (loginStateStore.isLoggedIn()) {\n new FreeSpacesTopicModule(modules);\n }\n};\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n let modules = document.querySelectorAll(\".free-spaces-topic-main-module\");\n if (!modules.length) return;\n initFreeSpacesModule(modules)\n });\n\n pubsubStore.subscribe(\"renderAsyncLoad\", eventContainer => {\n let modules = eventContainer.querySelectorAll(\".free-spaces-topic-main-module\")\n if (!modules.length) return;\n initFreeSpacesModule(modules)\n });\n});\n","// 参考ページ\n// https://github.com/algolia/instantsearch.js/blob/61ad247c252a42743efa35d0e32d1802119e53a2/stories/panel.stories.ts#L58\n\nimport algoliasearchApiInstance from \"../../algoliasearch/api\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n \"use strict\";\n\n let isExist = document.querySelector(\".free-spaces-filter-search-module\");\n\n if (isExist == null) {\n return;\n }\n\n const search = instantsearch({\n indexName: algoliasearchApiInstance.getTopicIndexName(),\n searchClient: algoliasearchApiInstance.getClient(),\n insights: true,\n routing: {\n router: instantsearch.routers.history(),\n stateMapping: {\n stateToRoute(uiState) {\n return {\n page: uiState.Topic_production.page,\n };\n },\n routeToState(routeState) {\n return {\n Topic_production: {\n page: routeState.page || 1,\n },\n };\n },\n },\n }\n });\n\n search.addWidget(\n instantsearch.widgets.analytics({\n pushFunction(formattedParameters, state, results) {\n gtag('config', 'G-ZVDPNNBLJT', {\n 'page_location': location.href,\n 'page_referrer': document.referrer,\n });\n\n },\n triggerOnUIInteraction: true,\n pushInitialSearch: true,\n pushPagination: true\n })\n );\n\n search.addWidget(\n instantsearch.widgets.configure({\n hitsPerPage: 60,\n clickAnalytics: true,\n filters: \"is_general_audience:true\",\n })\n );\n\n search.addWidget(\n instantsearch.widgets.searchBox({\n container: document.querySelector(\".free-spaces-filter-search-input\"),\n placeholder: \"絞り込み\",\n autofocus: true,\n showReset: false,\n showSubmit: false,\n showLoadingIndicator: false,\n })\n );\n\n\n const renderGridHits = (renderOptions, isFirstRender) => {\n const { hits, widgetParams } = renderOptions;\n\n widgetParams.container.innerHTML = `\n
    \n
    `;\n };\n\n // Create the custom widget\n const customHits = instantsearch.connectors.connectHits(renderGridHits);\n\n // Instantiate the custom widget\n search.addWidgets([\n customHits({\n container: document.querySelector('.free-spaces-filter-search-hits'),\n })\n ]);\n\n const renderPagination = (renderOptions, isFirstRender) => {\n const {\n pages,\n currentRefinement,\n nbPages,\n nbHits,\n isFirstPage,\n isLastPage,\n refine,\n createURL,\n widgetParams\n } = renderOptions;\n\n if (isFirstRender) {\n let div = document.createElement(\"div\");\n div.setAttribute(\"class\", \"filter-search-pagination-module\");\n\n let div_0 = document.createElement(\"div\");\n div_0.setAttribute(\"class\", \"popular-pagination\");\n div.appendChild(div_0);\n\n let div_1 = document.createElement(\"div\");\n div_1.setAttribute(\"class\", \"page-items\");\n div_1.setAttribute(\"id\", \"page-items\");\n div_0.appendChild(div_1);\n\n widgetParams.container.appendChild(div);\n }\n\n const container = widgetParams.container.querySelector(\"#page-items\");\n\n if (widgetParams.container.classList.contains(\"top\") === true) {\n if (nbHits === 0) {\n widgetParams.container.classList.add(\"hide\");\n widgetParams.container.classList.remove(\"show\");\n widgetParams.container.style.display = \"none\";\n }\n\n if (isFirstPage === true) {\n widgetParams.container.classList.add(\"hide\");\n widgetParams.container.classList.remove(\"show\");\n widgetParams.container.style.display = \"none\";\n } else {\n widgetParams.container.classList.remove(\"hide\");\n widgetParams.container.classList.add(\"show\");\n widgetParams.container.style.display = \"block\";\n }\n }\n\n if (widgetParams.container.classList.contains(\"bottom\") === true) {\n if (nbHits === 0) {\n widgetParams.container.classList.add(\"hide\");\n widgetParams.container.classList.remove(\"show\");\n widgetParams.container.style.display = \"none\";\n } else {\n widgetParams.container.classList.remove(\"hide\");\n widgetParams.container.classList.add(\"show\");\n widgetParams.container.style.display = \"block\";\n }\n }\n\n container.innerHTML = `\n ${!isFirstPage\n ? `\n \n \n \n `\n : `\n
    <<
    \n `\n }\n ${pages\n .map(\n page => `\n \n
    ${page + 1}
    \n
    \n `\n )\n .join(\"\")\n }\n ${!isLastPage\n ? `\n \n \n \n `\n : `\n
    >>
    \n `\n }\n `;\n [...container.querySelectorAll(\"a\")].forEach(element => {\n element.addEventListener(\"click\", event => {\n event.preventDefault();\n refine(event.currentTarget.dataset.value);\n\n window.scrollTo({\n top: 0\n });\n });\n });\n };\n\n // Create the custom widget\n const customPagination = instantsearch.connectors.connectPagination(\n renderPagination\n );\n\n // Instantiate the custom widget\n search.addWidget(\n customPagination({\n container: document.querySelector(\".free-spaces-filter-search-pagination.bottom\"),\n padding: 2\n })\n );\n\n // Instantiate the custom widget\n search.addWidget(\n customPagination({\n container: document.querySelector(\".free-spaces-filter-search-pagination.top\"),\n padding: 2\n })\n );\n\n search.start();\n\n const searchButton = document.querySelector(\".free-spaces-filter-search-button\");\n\n searchButton.addEventListener(\"click\", function (event) {\n let searchInput = document.querySelector(\".free-spaces-filter-search-input input\");\n let value = searchInput.value;\n let redirectUrl = `/search/free_spaces?q=${value}`;\n location.href = redirectUrl;\n });\n\n});\n","import Api from \"../../Api\";\nimport loginStateStore from \"../../login_state_store\";\nimport pubsubStore from \"../../pubsub_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n let modules = document.querySelectorAll(\".recommend-spaces-topic-main-module\");\n if (modules.length === 0) {\n return;\n }\n\n window.addEventListener('pageshow', function (event) {\n if (event.persisted) {\n window.location.reload();\n return\n }\n\n const [perfEntry] = performance.getEntriesByType(\"navigation\");\n if (perfEntry?.type === \"back_forward\") {\n window.location.reload();\n return\n }\n\n });\n\n let initState = () => {\n modules.forEach(async element => {\n const topicId = element.dataset.topicId;\n if (topicId !== undefined) {\n try {\n const json = await Api.topicStatus(topicId);\n let lastUpdateAtChangedElement = element.querySelector(\".last-updated-at-changed\");\n if (json.unread === false && json.last_updated_changed === true) {\n lastUpdateAtChangedElement.style.display = \"block\";\n } else {\n lastUpdateAtChangedElement.remove();\n }\n } catch (error) {\n console.error(error);\n }\n }\n });\n };\n\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n if (loginStateStore.isLoggedIn()) {\n initState();\n }\n });\n\n});\n","import pubsubStore from \"../../pubsub_store\";\nimport loginStateStore from \"../../login_state_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n \"use strict\";\n let module = document.querySelector(\".recommend-spaces-floating-menu-module\");\n\n if (module == null) {\n return;\n }\n\n let floatingMenuButtonElement = module.querySelector(\".floating-menu-button\");\n let floatingMenuDialogElement = module.querySelector(\".floating-menu-dialog\");\n\n floatingMenuDialogElement.addEventListener('click', (event) => {\n if (event.target.closest('.floating-menu-dialog-contents') === null) {\n floatingMenuDialogElement.close();\n }\n });\n\n floatingMenuButtonElement.addEventListener('click', (event) => {\n floatingMenuDialogElement.showModal();\n\n const focusedElement = document.activeElement;\n\n if (focusedElement !== null) {\n focusedElement.blur();\n }\n });\n\n const scrollToTopButtonElement = module.querySelector(\".floating-menu-item-scroll-to-top\");\n scrollToTopButtonElement.addEventListener('click', (event) => {\n app.scrollToHash(\"#js-scroll-to-top\")\n floatingMenuDialogElement.close();\n });\n\n let calcFloatingPositon = element => {\n let overlayModuleElement = document.querySelector(\".pr-footer-overlay-module\");\n if (overlayModuleElement == null) {\n return;\n }\n\n element.classList.add(\"overlay\");\n\n }\n\n let initLoginState = () => {\n const userElement = module.querySelector(\".floating-menu-item-user\");\n const linkElement = userElement.querySelector(\"a.menu-link\");\n const iconElement = userElement.querySelector(\".icon\");\n const imageElement = userElement.querySelector(\".image\");\n const imgElement = userElement.querySelector(\".image img\");\n const textElement = userElement.querySelector(\".text\");\n const notificationElement = userElement.querySelector(\".notifications-count\");\n\n if (loginStateStore.isUser()) {\n textElement.innerText = \"通知\";\n linkElement.href = \"/me/notifications\";\n imgElement.src = loginStateStore.getUserIconPath();\n let notificationCount = loginStateStore.getNotificationCount()\n\n if (notificationCount >= 1) {\n notificationElement.style.display = \"block\";\n notificationElement.innerText = notificationCount;\n }\n imageElement.style.display = \"block\";\n iconElement.remove();\n } else {\n imgElement.remove();\n }\n }\n\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n initLoginState();\n calcFloatingPositon(module)\n module.style.display = \"block\";\n });\n\n\n});\n","import loginStateStore from \"../login_state_store\";\nimport pubsubStore from \"../pubsub_store\";\nimport csrfTokenStoreInstance from \"../csrf_token_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n let isExist = document.querySelector(\".new-want-to-recall-form\");\n\n if (isExist == null) {\n return;\n }\n\n let rootElement = () => {\n return document.querySelector(\".new-want-to-recall-form\");\n };\n\n let isPost = () => {\n return rootElement().classList.contains(\"post\");\n };\n\n let isPut = () => {\n return rootElement().classList.contains(\"put\");\n };\n\n let isAnonymousEnabled = () => {\n return rootElement().querySelector(\"#topic_anonymous_enabled\").checked;\n };\n\n let anonymousEnabledElement = () => {\n return rootElement().querySelector(\"#topic_anonymous_enabled\");\n };\n\n let initFormState = () => {\n let postNameElement = rootElement().querySelector(\".post-name-input-text\");\n let inputElement = rootElement().querySelector(\"#comment_name\");\n let userIconImageElement = rootElement().querySelector(\".user-icon img\");\n\n if (loginStateStore.isLoggedIn()) {\n userIconImageElement.src = loginStateStore.getUserIconPath();\n\n if (isPost()) {\n postNameElement.style.display = \"none\";\n anonymousEnabledElement().checked = false;\n }\n\n if (isPut()) {\n if (isAnonymousEnabled()) {\n postNameElement.style.display = \"block\";\n userIconImageElement.src = loginStateStore.getUserPrivateIconPath();\n } else {\n inputElement.value = \"名無し\";\n postNameElement.style.display = \"none\";\n }\n }\n }\n };\n\n let imageSelectorDialog = document.querySelector(\"a#image-selector-button\");\n\n imageSelectorDialog.addEventListener(\"click\", function (event) {\n event.preventDefault();\n\n let fileSelector = document.querySelector(\"input.image-field\");\n\n fileSelector.addEventListener(\"change\", function (e) {\n let imagePartial = document.getElementsByClassName(\"image-partial\")[0];\n let pasteImage = document.getElementsByClassName(\"paste-image\")[0];\n\n let files = e.target.files;\n\n if (files.length == 0) {\n let imageElement = pasteImage.querySelector(\"img\");\n\n if (imageElement != null) {\n imageElement.remove();\n return;\n }\n\n return;\n }\n\n for (var i = 0, file; (file = files[i]); i++) {\n if (!file.type.match(\"image.*\")) {\n continue;\n }\n\n var reader = new FileReader();\n\n reader.onload = (function (f) {\n return function (e) {\n try {\n let imageElement = pasteImage.querySelector(\"img\");\n\n if (imageElement != null) {\n imageElement.remove();\n return;\n }\n\n var uploagImageElement = document.createElement(\"img\");\n uploagImageElement.className = \"upload-image\";\n pasteImage.appendChild(uploagImageElement);\n\n var img = pasteImage.querySelector(\"img.upload-image\");\n img.src = e.target.result;\n } catch (e) { }\n };\n })(file);\n\n reader.readAsDataURL(file);\n\n return;\n }\n });\n\n fileSelector.click();\n });\n\n anonymousEnabledElement().addEventListener(\"click\", function (event) {\n event.stopPropagation();\n\n let postNameElement = rootElement().querySelector(\n \".post-name-partial .post-name-input-text\"\n );\n let userIconImageElement = rootElement().querySelector(\".user-icon img\");\n\n if (isAnonymousEnabled()) {\n postNameElement.style.display = \"block\";\n userIconImageElement.src = loginStateStore.getUserPrivateIconPath();\n } else {\n postNameElement.style.display = \"none\";\n userIconImageElement.src = loginStateStore.getUserIconPath();\n }\n });\n\n let templateMessage =\n \"▼いつごろ読みましたか\\nYYYY〜YYYY年頃\\n\\n\" +\n \"▼なにで読みましたか?(マンガの形式)\\n雑誌 / 単行本(紙) / 単行本(電子) / 縦スクロール(フルカラー)\\n\\n\" +\n \"▼(電子書籍の場合)どこで読みましたか\\nジャンプ+ / LINEマンガ / comico / ピッコマ / Twitter / その他【  】\\n\\n\" +\n \"▼本屋さんにあるとしたらどこの棚ですか\\n少年・少女・青年・女性・BL・その他【  】\\n\\n\" +\n \"▼作品の長さは\\nだいたい全【  】巻くらい / 読切作品(1話完結)\\n\\n\" +\n \"▼絵柄を他のマンガ(著者)で例えると\\n(例: 「『〇〇の✕✕』に似てる」「〇〇先生っぽい」)\\n\\n\" +\n \"▼作品タイトルの印象\\n(例: 「「漢字が多い」「『〇〇の✕✕』のようなタイトル」)\\n\\n\" +\n \"▼著者の名前の印象\\n(例: 「カタカナで外国人のような名前」「原作と作画で分かれていた」)\\n\\n\" +\n \"▼作品について覚えていること【必須】\\n\\n\" +\n \"💡ヒント\\nどんな情報でも手がかりになるので書いてみましょう(例: 兄が持っていた/表紙には青い肌の男の子の顔が大きく描かれていた)\\n\\n\"\n\n let templateCopySrcElement = document.getElementById(\"js-templete-copy-src\");\n let templateCopyDestElement = document.getElementById(\"comment_body\");\n\n templateCopySrcElement.addEventListener(\"click\", function (event) {\n event.stopPropagation();\n\n if (templateCopyDestElement.value !== \"\") {\n const result = confirm(\n \"入力内容を消去して「質問用テンプレート」を表示しますか?\"\n );\n if (result === false) {\n return;\n }\n }\n\n templateCopyDestElement.value = templateMessage;\n\n let scrollHeight = templateCopyDestElement.scrollHeight;\n templateCopyDestElement.style.height = scrollHeight + \"px\";\n });\n\n let postButtonElement = rootElement().querySelector(\"#post-button\");\n postButtonElement.addEventListener(\"click\", function (e) {\n let authenticityTokenElements = rootElement().querySelectorAll(\n \"input[name='authenticity_token'][type='hidden']\"\n );\n authenticityTokenElements.forEach(element => {\n element.value = csrfTokenStoreInstance.get().csrfToken;\n });\n window.removeEventListener('beforeunload', beforeUnLoadEvent)\n\n });\n\n\n let setResizeForm = () => {\n let commentBodyForm = document.querySelector(\"#comment_body\");\n let clientHeight = commentBodyForm.clientHeight;\n\n commentBodyForm.addEventListener(\"input\", () => {\n commentBodyForm.style.height = clientHeight + \"px\";\n let scrollHeight = commentBodyForm.scrollHeight;\n commentBodyForm.style.height = scrollHeight + \"px\";\n });\n };\n\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n initFormState();\n });\n\n setResizeForm();\n\n let beforeUnLoadEvent = (event) => {\n let topicTitleForm = document.querySelector(\"#topic_title\");\n let topicTitle = topicTitleForm.value;\n\n let commentBodyForm = document.querySelector(\"#comment_body\");\n let commentBody = commentBodyForm.value;\n\n if (commentBody.length > 0 || topicTitle.length > 0) {\n event.preventDefault();\n event.returnValue = \"このページを離れますか?\";\n return \"このページを離れますか?\";\n }\n return;\n };\n\n window.addEventListener('beforeunload', beforeUnLoadEvent)\n\n\n});\n","import pubsubStore from \"../pubsub_store\";\nimport quicklinkHelperInstance from \"../quicklink_helper\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n let rootElement = document.querySelector('.infinite-scroll-mode-component');\n if (rootElement == null) {\n return;\n }\n\n const loadOnScrollValue = rootElement.dataset.loadOnScrollValue.toLowerCase() === 'true';\n const loadCountValue = parseInt(rootElement.dataset.loadCountValue, 10)\n\n let viewMoreButton = rootElement.querySelector('.infinite-scroll-readmore-module');\n const element = rootElement.querySelector('.infinite-scroll-mode-main-contents');\n\n let infScroll = new InfiniteScroll(element, {\n path: 'nav.pagination a[rel=next]',\n append: '.infinite-scroll-mode-main-contents',\n history: 'replace',\n status: '.page-load-status',\n scrollThreshold: 1200,\n button: viewMoreButton,\n });\n\n infScroll.on('append', function (body, path, items, response) {\n let targetElement = document.querySelector('.infinite-scroll-mode-component');\n\n const quicklinkEnabledElement = document.querySelector('meta[name=\"quicklink_enabled\"]')\n let quicklinkEnabled = false\n\n if (quicklinkEnabledElement !== null) {\n quicklinkEnabled = quicklinkEnabledElement.content === 'true' ? true : false\n }\n\n if (quicklinkEnabled == true) {\n // let links = targetElement.querySelectorAll('a');\n // links.forEach(link => {\n // quicklinkHelperInstance.prefetch(link.href);\n // });\n\n const nextPageElement = body.head.querySelector('link[rel=\"next\"]')\n if (nextPageElement != null) {\n quicklinkHelperInstance.prefetch(nextPageElement.href);\n }\n const prevPageElement = body.head.querySelector('link[rel=\"prev\"]')\n if (prevPageElement != null) {\n quicklinkHelperInstance.prefetch(prevPageElement.href);\n }\n }\n\n gtag('config', 'G-ZVDPNNBLJT', {\n 'page_location': path,\n 'page_referrer': document.referrer,\n });\n\n pubsubStore.publish(\"infiniteScrollPageAppend\", items[0]);\n });\n\n infScroll.on('load', onPageLoad);\n infScroll.on('last', onLastPageLoad);\n let isLastPage = false;\n function onPageLoad() {\n if (loadOnScrollValue == true) {\n infScroll.options.loadOnScroll = true;\n return;\n }\n\n if (infScroll.loadCount > 1 && infScroll.loadCount % loadCountValue == 0 && isLastPage == false) {\n infScroll.options.loadOnScroll = false;\n viewMoreButton.style.display = 'flex';\n } else {\n infScroll.options.loadOnScroll = true;\n viewMoreButton.style.display = 'none';\n }\n }\n\n function onLastPageLoad(body, path) {\n isLastPage = true;\n }\n});\n","\nimport pubsubStore from \"./pubsub_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n const loadScript = (scriptUrl, scriptId) => {\n if (!document.querySelector(`#${scriptId}`)) {\n const script = document.createElement('script');\n script.src = scriptUrl;\n script.id = scriptId;\n document.body.appendChild(script);\n }\n };\n\n pubsubStore.subscribe(\"renderAsyncLoad\", eventContainer => {\n loadScript(\"https://accounts.google.com/gsi/client\", \"google-one-tap\");\n });\n});\n\n","import Api from \"../Api\";\nimport loginStateStore from \"../login_state_store\";\nimport pubsubStore from \"../pubsub_store\";\n\ndocument.addEventListener(\"DOMContentLoaded\", function (event) {\n \"use strict\";\n\n pubsubStore.subscribe(\"userLoginCompleted\", args => {\n if (loginStateStore.isLoggedIn() == true) {\n document.querySelectorAll(\".manba-logged-in-display\").forEach(element => {\n element.style.display = \"block\";\n });\n document.querySelectorAll(\".manba-logged-out-display\").forEach(element => {\n element.remove();\n });\n } else {\n document.querySelectorAll(\".manba-logged-in-display\").forEach(element => {\n element.remove();\n });\n document.querySelectorAll(\".manba-logged-out-display\").forEach(element => {\n element.style.display = \"block\";\n });\n }\n });\n});\n","// This is a manifest file that'll be compiled into application.js, which will include all the files\n// listed below.\n//\n// Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,\n// or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.\n//\n// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the\n// compiled file.\n//\n// Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details\n// about supported directives.\n//\nimport Rails from \"@rails/ujs\";\nRails.start();\nimport \"./views\";\n"],"names":["document","addEventListener","event","searchAction","editElement","actiomElement","value","baseSearchPath","redirectPath","location","href","desktopFilterSearchEditElement","querySelector","desktopFilterSearchActionElement","desktopSearchAction","smartphoneFilterSearchEditElement","smartphoneFilterSearchActionElement","smartphoneSearchAction","querySelectorAll","forEach","element","commentEmpathyElement","postEmpathyElement","commentId","dataset","imageElement","classList","add","setTimeout","remove","undefined","window","navigator","vibrate","empathyCountElement","innerHTML","parseInt","fetch","method","credentials","headers","then","response","isNowSmarthone","updateResize","smartphonePosition","getElementById","desktopPosition","targetElement","isSmartPhone","app","appendChild","passive","attributeText","getAttribute","category","label","gtag","observer","IntersectionObserver","entries","entry","isIntersecting","target","unobserve","rootMargin","threshold","observe","twitterTweetElemnets","length","node","parentNode","createElement","className","insertBefore","replace","getElementsByClassName","Defer","js","dom","twttr","widgets","load","smartphoneProfileInfo","desktopProfileInfo","profileModule","desktopBoardInfoElement","smartphoneBoardInfoElement","boardInfoElement","updateBoardInfoPosition","desktopPostionElement","smartphonePostionElement","actionsElement","updateActionsPosition","storesElement","updateStoresPosition","smartphoneBoardInfo","desktopBoardInfo","boardInfo","Swiper","loop","mousewheel","slidesPerView","spaceBetween","breakpoints","centeredSlides","initialSlide","pagination","el","clickable","autoplay","delay","elements","boardElement","backgroundImageUrl","style","setProperty","boardMetadataSummaryModules","summary","readMore","maxHeight","overflow","display","module","floatingMenuButtonElement","floatingMenuDialogElement","closest","stopPropagation","close","showModal","focusedElement","activeElement","blur","modules","redirectUrl","initPagerSelect","description","height","menuButton","headerMenu","menuCloseButton","header","preventDefault","scrollTo","scrollTimeout","lastScrollTop","ticking","isScrolling","scrollTop","Math","ceil","documentElement","requestAnimationFrame","clearTimeout","anchorLinks","anchorLinksArr","Array","prototype","slice","call","scrollToHash","targetId","targetOffsetTop","scrollY","getBoundingClientRect","top","behavior","urlHash","hash","link","e","desciptionElement","desciptionReadmoreElements","selectedTabName","getElementsByName","item","content","tabElements","scrollLeft","tabElement","tabName","clientWidth","stickyHeaders","stickies","whenScrolling","sticky","i","stickyPosition","originalPosition","nextSticky","stickyHeight","originalHeight","nextStickyPosition","clientHeight","prevSticky","removeProperty","stickiesSelector","wrap","stickyRect","offsetHeight","removeEventListener","smaprtphonePositonElement","desktopePositonElement","commentFormElement","changePosition","canShare","iconModule","shareData","title","innerText","text","url","async","share","err","console","log","currentPagePath","pathname","params","selected_type","this","newUrl","Object","keys","map","key","encodeURIComponent","join","confirm","result","openFileDialog","fileSelector","iconProfileImage","files","file","type","match","reader","FileReader","onload","src","readAsDataURL","click","imageSelector","imageSelectorImage","userSettingPublicCheckBox","updateUserSettingPublic","userSettingPublicContent","userSettingPublicPageView","checked","inLayout","redirectElement","urlCopyButton","button","clipboard","writeText","error","copyToClipboard","subNavigationIndex","count","intervalId","setInterval","affiliateUrl","children","includes","clearInterval","affiliateElement","resolvedCommentButton","resolvedCommentId","json","owned","res","targetResolvedComment","execute","hasResolved","contains","checkResolved","alert","toggleResolvedComment","body","JSON","stringify","id","resolved","topicId","reload","performance","getEntriesByType","pe","defineProperty","exports","Completer","eventemitter3_1","Strategy_1","EventEmitter","constructor","strategyPropsList","super","handleQueryResult","searchResults","emit","strategies","p","Strategy","destroy","s","run","beforeCursor","strategy","Dropdown","DEFAULT_DROPDOWN_ITEM_ACTIVE_CLASS_NAME","DEFAULT_DROPDOWN_ITEM_CLASS_NAME","DEFAULT_DROPDOWN_CLASS_NAME","DEFAULT_DROPDOWN_PLACEMENT","DEFAULT_DROPDOWN_MAX_COUNT","utils_1","create","option","ul","assign","position","zIndex","parent","shown","items","activeIndex","render","cursorOffset","createCustomEvent","cancelable","defaultPrevented","clear","hide","maxCount","r","index","_a","DropdownItem","setStrategyId","renderEdge","renderItems","show","setOffset","activate","removeChild","select","detail","searchResult","up","moveActiveItem","down","direction","getNextActiveIndex","getPrevActiveIndex","deactivate","isShown","getActiveItem","doc","elementWidth","offsetWidth","left","browserWidth","dynamicWidth","scrollWidth","right","forceTop","placement","dropdownHeight","lineHeight","clientTop","bottom","Error","rotate","fragment","createDocumentFragment","getStrategyId","li","data","dropdown","props","active","onClick","activeClassName","span","tabIndex","offsetTop","Editor","applySearchResult","_searchResult","getCursorOffset","getBeforeCursor","emitMoveEvent","code","moveEvent","emitEnterEvent","enterEvent","emitChangeEvent","changeEvent","emitEscEvent","escEvent","getCode","keyCode","ctrlKey","SearchResult","MAIN","PLACE","term","getReplacementData","afterCursor","isArray","replacement","_","start","end","renderTemplate","getId","DEFAULT_INDEX","SearchResult_1","cache","callback","matchWithContext","search","results","template","searchWithCach","context","Textcomplete","Dropdown_1","Completer_1","PASSTHOUGH_EVENT_NAMES","editor","isQueryInFlight","nextPendingQuery","handleHit","trigger","handleMove","handleEnter","activeItem","handleEsc","handleChange","handleSelect","selectEvent","handleResize","completer","startListening","destroyEditor","stopListening","on","eventName","ownerDocument","defaultView","removeAllListeners","removeListener","__createBinding","o","m","k","k2","desc","getOwnPropertyDescriptor","__esModule","writable","configurable","enumerable","get","__exportStar","hasOwnProperty","isCustomEventSupported","CustomEvent","options","createEvent","initCustomEvent","__importDefault","mod","TextareaEditor","undate_1","textarea_caret_1","core_1","onInput","onKeydown","getAfterCursor","focus","update","dispatchEvent","elOffset","calculateElementOffset","elScroll","getElScroll","cursorPosition","getCursorPosition","getLineHeightPx","dir","selectionStart","selectionEnd","substring","default","TextareaEditor_1","rect","owner","offset","pageYOffset","pageXOffset","clientLeft","CHAR_CODE_ZERO","charCodeAt","CHAR_CODE_NINE","isDigit","charCode","computedStyle","getComputedStyle","floatLineHeight","parseFloat","fontSize","calculateLineHeightPx","nodeName","tempNode","fontFamily","padding","HTMLTextAreaElement","rows","isSafari","test","userAgent","has","prefix","Events","EE","fn","once","addListener","emitter","TypeError","listener","evt","_events","push","_eventsCount","clearEvent","__proto__","eventNames","events","name","names","getOwnPropertySymbols","concat","listeners","handlers","l","ee","listenerCount","a1","a2","a3","a4","a5","args","len","arguments","apply","j","off","prefixed","properties","isBrowser","isFirefox","mozInnerScreenX","getCaretCoordinates","debug","div","computed","currentStyle","isInput","whiteSpace","wordWrap","visibility","prop","scrollHeight","overflowY","textContent","coordinates","offsetLeft","backgroundColor","headToCursor","cursorToTail","curr","next","aLength","cLength","min","setSelectionRange","strB2","execCommand","initEvent","wrapCursor","before","after","initEnd","substr","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","d","definition","obj","Symbol","toStringTag","selector","exclude","metaTag","Element","matches","matchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","webkitMatchesSelector","isEditable","isContentEditable","parentElement","meta","xhr","token","setRequestHeader","param","input","html","xml","script","responseText","getResponseHeader","floor","status","success","statusText","complete","beforeSend","readyState","XMLHttpRequest","OPENED","send","toUpperCase","indexOf","dataType","accept","done","open","crossDomain","withCredentials","onreadystatechange","DONE","parse","setAttribute","head","parser","DOMParser","parseFromString","error1","originAnchor","urlAnchor","protocol","host","bubbles","Event","stopImmediatePropagation","eventType","handler","additionalParam","inputs","disabled","selected","form","filter","originalText","formNoValidate","insignificantMetaClick","metaKey","$","ajax","buttonClickSelector","buttonDisableSelector","message","cspNonce","csrfToken","csrfParam","CSRFProtection","delegate","disableElement","enableElement","fileInputSelector","fire","formElements","formEnableSelector","formDisableSelector","formInputClickSelector","formSubmitButtonClick","formSubmitSelector","getData","handleDisabledElement","inputChangeSelector","isCrossDomain","linkClickSelector","linkDisableSelector","loadCSPNonce","preventInsignificantClick","refreshCSRFTokens","serializeElement","setData","stopEverything","rails","answer","handleConfirm","csrfToken$1","csrfParam$1","formContent","action","handleMethod","enctype","FormData","append","handleRemote","_rails_loaded","jQuery","ajaxPrefilter","originalOptions","globalThis","self","Blob","ArrayBuffer","isView","toString","String","toLowerCase","iterator","shift","getOwnPropertyNames","bodyUsed","Promise","reject","resolve","onerror","blob","promise","readAsArrayBuffer","buf","view","Uint8Array","byteLength","set","buffer","_initBody","_bodyInit","_bodyText","isPrototypeOf","_bodyBlob","_bodyFormData","URLSearchParams","DataView","_bodyArrayBuffer","rejected","arrayBuffer","byteOffset","readAsText","chars","fromCharCode","formData","oldValue","thisArg","values","upcased","mode","signal","referrer","reParamSearch","Date","getTime","trim","split","bytes","decodeURIComponent","bodyInit","ok","clone","redirect","RangeError","DOMException","stack","init","request","aborted","abortXhr","abort","rawHeaders","getAllResponseHeaders","line","parts","responseURL","ontimeout","onabort","fixUrl","responseType","polyfill","Headers","Request","Response","currentUserInfo","addUserRecentVisitedTopicLogs","topic_id","addUserRecentVisitedBoardLogs","board_id","addUserRecentVisitedAuthorLogs","author_id","userLatestUsedNameInTopic","boardReadStatus","updateReadStatus","readStatus","read_status","updateReadStatusPlanToReadFromTopic","updateReadStatusPlanToReadFromListItem","list_item_id","boardFavoriteRating","userBoardFavoriteRating","userKey","userBoardReviewed","updateFavoriteRating","favoriteRating","publicStatus","favorite_rating","public_status","boardReadingNote","updateReadingNote","readingNoteMemo","memo","boardRereading","addBoardReread","removeBoardReread","topicViewCounter","userBoardListViewCounter","user_board_list_id","themeViewCounter","theme_id","authorViewCounter","boardViewCounter","userFollowing","addUserFollow","removeUserFollow","boardFollowing","addBoardFollow","removeBoardFollow","authorFollowing","addAuthorFollow","removeAuthorFollow","topicStatus","topicFollowing","addTopicFollow","removeTopicFollow","userTopicOwned","commentSelfReply","comment_id","commentRateLimit","userTopicCommentsEditable","comment_ids","query","_data","userId","adminPagePath","iconPath","notificationCount","loginProviderName","loginProvideriCon","hasProfile","userPrivateIconPath","setState","user_id","icon","notification_count","admin_page_path","login_provider_name","loginProviderIcon","login_provider_icon","has_profile","user_private_icon_path","isLoggedIn","isAdmin","isUser","getUserIconPath","getUserPrivateIconPath","getAdminPagePath","getNotificationCount","getKey","getLoginProviderName","getLoginProviderIconPath","getnotificationCount","freeze","topics","subCount","publish","topic","sub","subscribe","cb","subid","subscriberId","unsubscribe","targets","t","idx","getCsrfParam","getCsrfToken","quicklink_reset_func","setOptions","listen","reset","quicklink","prefetch","inController","target_name","inActon","width","headerHeight","csrf_param","csrf_token","GLightbox","touchNavigation","autoplayVideos","quicklinkEnabledElement","quicklinkEnabled","quicklinkThrottleElement","quicklinkThrottle","quicklinkListenEnabledElement","quicklinkListenEnabled","throttle","ignores","uri","elem","rel","nextPageElement","prevPageElement","csrfParamElement","csrfTokenElement","setCsrfMetaTag","container","baseHeight","initializeModules","initDialog","initReadingNote","attachLoginRedirect","readingNoteTextInputElement","boardId","encodeURI","newReadingNoteLink","dialogElement","closeButton","saveButton","getReadingNoteMemo","setReadingNoteMemo","adminLinkElement","initLoginState","loginElement","notLoginElement","notificationElement","adminTextElement","targetKey","userProfileSettingLinkElement","userProfileLinksElement","loginProvider","userHasProfileElement","loginProviderNameElement","imgElement","alt","initSettingState","myPageElement","initPublicProfileState","rootElement","profileImage","fileInput","upload","selectedFile","initForm","persisted","perfEntry","lastUpdateAtChangedElement","unread","last_updated_changed","clapButton","articleId","updateClapButtonState","userElement","linkElement","iconElement","textElement","initReadMoreState","appendRootElement","rereadButton","loggedInRereadButton","notLoggedInRereadButton","rereading","updateRereadButtonState","initState","initFollowButtonState","authorId","followButton","following","handleFollowButtonClick","eventContainer","actionButtonText","initFavoriteRatingAction","favoriteRatingElement","updateFavoriteRatingState","appentRootElement","updateFavoriteRatings","nowFavoriteRating","newFavoriteRating","favoriteRatingElements","favoriteRatingElementIcon","setFavoriteRatingData","favoriteRatingValue","getPublicStatus","setFavoriteRatingValue","getFavoriteRatingData","getPublicStatusData","setPublicStatusData","publicStatusText","updatePublicStatus","publicStatusElementIcon","initModule","isOwner","is_owner","publicStatusElement","togglePublicStatusData","cursor","reviewed","reviewedElement","reviewedElementIcon","redirect_url","initReviewdAction","moduleClassName","setReadStatusActionButtonStatus","readState","readStateText","getReadStateText","actionButtonElement","actionButtonElementText","actionButtonElementIcon","isIconShow","readStatusButtonElement","readStatusActionsElement","readStatusActionButtonElement","readStatusActionElement","readStatusName","lightReviewModules","lightReviewModule","lightReviewBoardId","initReadStatusState","updateReadStatusState","updateFollowActionState","followAction","initFollowAction","followActionText","followActionIconElement","followActionElement","updateRereadActionState","rereadAction","initRereadAction","planToReadAction","initAction","updateActionState","initStoreAction","storeActionItemsElement","toggle","empathyIconElement","countElement","initLightReviewAction","overlayElement","innerHeight","overlayOpen","getFavoriteRating","checkedPublicStatus","publicState","isPublicState","initReadingNoteAction","initPostButton","postAction","initCloseButton","initPublicStateButton","publicStateElement","lastScroll","handleScroll","currentScroll","client","algoliasearch","boardIndex","authorIndex","topicIndex","manbaMagazineArticleIndex","getClient","getBoardIndexName","getAuthorIndexName","getTopicIndexName","getUserBoardListIndexName","getManbaMagazineArticleIndexName","getBoardIndex","initIndex","getAuthorIndex","getTopicIndex","getManbaMagazineArticleIndex","searchName","searchNameId","searchInputId","searchInputName","autocomplete","getAlgoliaResults","searchClient","boardIndexName","detachedMediaQuery","placeholder","getSources","sourceId","getItems","queries","indexName","filters","hitsPerPage","templates","components","suggest_thumbnail_url","Highlight","hit","attribute","tagName","onSelect","insights","insightsEvents","searchInput","targetName","elementInput","actionButton","actionIconElement","updateFollowButtonState","initPostTopicsState","setupPageShowListener","isBackForwardNavigation","navigationEntry","updateTopicStatus","actionFollowButtonElement","actionTextElement","editButtonElement","favoriteRatingsElement","followActionButton","notLoginActionButton","initModules","ui","getTopicId","getBoardId","listItemId","getlistItemId","updateUI","isActionAllowed","addClickListener","newStatus","toggleSelectedState","updateReadState","redirectToLoginOnClick","broadcastStateChange","moduleElement","planToReadButton","userBoardListItemId","isSelected","topicElement","ownedTopicId","boardTitle","isAnonymousEnabled","getMessages","messages","getType","checkValue","radioElement","updateGuideMessages","guideType","guideTypeComboBoxElement","firstChild","optionData","beforeUnLoadEvent","topicTitle","returnValue","typeRadioButtonsElement","selectedValue","initType","topicTitleForm","commentBodyForm","titleElement","bodyElement","keywordElement","displayNameText","nameText","titleText","initKeywordState","userIconImageElement","inputCommentElement","inputElement","anonymousEnabledElement","isPost","isPut","initAnonymousEnabled","pointerEvents","imageSelectorElement","pasteImage","uploagImageElement","initImageSelect","setResizeForm","topicsSearchName","topicsSearchNameId","autoFocus","objectID","scrollToFormButtonElement","scrollToFormElement","scrollToLastCommentButtonElement","lastCommentElement","commentElems","ownedCommentIds","ownedCommentId","commentIds","targetComment","targetCommentId","nameElement","notLoginMessageElement","postButtonElement","replyMessageCommentId","replyToCommentId","selfReplyMesseageElement","is_self_reply","displaySelfReplyMessage","rateLimitMesseageElement","is_over_rate_limit","initFormState","instantsearch","addWidget","analytics","pushFunction","formattedParameters","state","triggerOnUIInteraction","pushInitialSearch","pushPagination","configure","clickAnalytics","clearRefinements","resetLabel","searchBox","showLoadingIndicator","showReset","showSubmit","categoryNamesListWithPanel","panel","collapsed","facetsRefinements","category_name","collapseButtonText","getCollapseIcon","refinementList","operator","sortBy","a","b","fixedOrder","order_id","target_a","find","target_b","awardNamesListWithPanel","award_names","limit","tagNamesListWithPanel","_tags","releaseYearRangeListWithPanel","release_year_range","showMoreLimit","stats","mediaTypesListWithPanel","media_type_names","toggleRefinement","labelText","onFacetValue","keywordTagNamesListWithPanel","disjunctiveFacetsRefinements","keyword_tag_names","searchable","searchablePlaceholder","searchableIsAlwaysActive","searchableNoResults","emotionalTagNamesListWithPanel","emotional_tag_names","publisherNamesListWithPanel","publisher_name","releaseYearListWithPanel","release_year","customRatingMenu","connectors","connectRatingMenu","renderOptions","isFirstRender","refine","createURL","widgetParams","ulElement","isRefined","stars","isFilled","currentTarget","ratingsWithPanel","numericRefinements","favorite_rating_average","labelNamesListWithPanel","label_name","booksCountListWithPanel","books_count","labelMap","is_completed_book","is_yomikiri","is_new_book","has_free_campaigns","has_sale_campaigns","has_kindle_unlimited","has_web_manga","has_kindle","renderListItem","refinements","refinement","attributeLabels","getLabel","createDataAttribtues","customCurrentRefinements","connectCurrentRefinements","reduce","acc","addWidgets","customHits","connectInfiniteHits","hits","showMore","readMoreElement","nbHits","_state","board_url","large_thumbnail_url","author_urls","author_url","free_campaign_books_count","free_campaign_end_at_text","free_campaign_redirect_url","renderFreeCampaignsHits","kindle_unlimited_books_count","kindle_redirect_url","renderKindleUnlimitedHits","first_book_summary","has_preview","preview_redirect_url","renderSearchHits","renderItemHits","customDialogHits","renderSearchDialogHits","renderDialogItemHits","toBoolean","toStringArray","URL","searchParams","fromEntries","hasFreeCampaigns","hasSaleCampaigns","hasKindleUnlimited","hasKindle","hasWebManga","isNewSeries","isYomikiri","isCompleted","mediaTypeNames","keywordTagNames","emotionalTagNames","awardNames","categoryNames","tagNames","releaseYearRange","releaseYear","publisherNames","labelNames","searchQuery","Boolean","setUiState","Board_production","release_year_text","dialogButtonElement","filterSearchSearchPartialElement","dialogFilterSearchSearchPartiallement","filterSearchBoxModuleElement","dialogFilterSearchApplyElement","dialogFfilterSearchCloseButtonElement","closeDialog","sortableElement","Sortable","handle","setIsOpen","setQuery","initElement","enabledPostButton","pageToScroll","itemElements","postButton","suggestion","newListItem","cloneNode","author_names_text","itemElement","userBoardListId","themeId","initImageBanner","imageBannerElement","clipArtElement","player","loadYouTubeAPI","firstScript","getElementsByTagName","newImportLinkVideoLink","createYouTubePlayer","embedPlayer","videoId","getPlayerDimensions","YT","Player","onPlayerReady","dialogFormContentsElement","videoUrl","pauseVideo","authorIndexName","placeholders","random","thumbnail_url","desktopSearchInputName","desktopSearchInputNameId","smartphoneSearchInputName","smartphoneSearchInputNameId","myTextareaElements","strategyBoard","searchBoardHits","strategyAuthor","searchAuthorHits","freeSpaceSearchNameId","buttonElement","enableAutoComplete","enableEnterSearch","userBoardListSearchNameId","manbaMagazineSearchNameId","routing","router","routers","history","stateMapping","stateToRoute","uiState","page","Topic_production","routeToState","routeState","autofocus","connectHits","free_space_thumbnail_url","comments_count","customPagination","connectPagination","pages","currentRefinement","nbPages","isFirstPage","isLastPage","div_0","div_1","postNameElement","templateCopySrcElement","templateCopyDestElement","loadOnScrollValue","loadCountValue","viewMoreButton","infScroll","InfiniteScroll","path","scrollThreshold","loadCount","loadOnScroll","scriptUrl","scriptId","loadScript"],"sourceRoot":""}