{"version":3,"file":"generic.min.js","sources":["../../../js/dom.js","../../../js/tag_input.js","../../../js/main.js"],"sourcesContent":["const $ = function(selector) {\n return document.querySelector(selector);\n};\n\nconst $$ = function(selector) {\n return document.querySelectorAll(selector) || [];\n};\n\nconst makeEl = function(html) {\n const template = document.createElement('template');\n\n template.innerHTML = html.trim();\n\n return template.content.firstChild;\n};\n\nconst clearEl = function(el) {\n while (el.firstChild) {\n el.removeChild(el.firstChild);\n }\n};\n\nconst toggleEl = function(el) {\n if (el.classList.contains('is-hidden')) {\n el.classList.remove('is-hidden');\n } else {\n el.classList.add('is-hidden');\n }\n};\n\nconst escape = function(unsafe) {\n return unsafe\n .replace(/&/g, \"&\")\n .replace(//g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\nconst whenReady = function(funcp) {\n if (document.readyState !== 'loading') {\n funcp();\n } else {\n document.addEventListener('DOMContentLoaded', funcp);\n }\n}\n\nexport { whenReady, $, $$, makeEl, clearEl, toggleEl, escape };","import { makeEl, escape } from \"./dom\";\n\nclass TagsInput {\n constructor(element, options = {}) {\n this.element = element;\n this.tags = [];\n this.options = options\n\n this.maxTags = options.maxTags || 10;\n this.inputNode = null;\n this.containerNode = null;\n }\n\n attach() {\n this.element.style.display = 'none';\n\n this.containerNode = makeEl('
');\n this.inputNode = makeEl('');\n this.containerNode.appendChild(this.inputNode);\n\n this.element.parentNode.insertBefore(this.containerNode, this.element.nextSibling);\n\n /* Load existing tags from input */\n if (this.element.value) {\n for (const tag of this.element.value.split(',')) {\n this.addTag(tag);\n }\n }\n\n /* Handle addition and removal of tags via key-presses */\n this.containerNode.addEventListener('keydown', this._handleInputKeyUp.bind(this));\n\n /* Handle deletions by clicking the delete button */\n this.containerNode.addEventListener('click', this._handleContainerClick.bind(this));\n }\n\n detach() {\n this.tags.clear();\n this.containerNode.remove();\n this.element.style.display = 'inline-block';\n }\n\n updateHiddenInputValue() {\n this.element.value = this.tags.join(',');\n }\n\n deleteTagNode(node) {\n this.tags.splice(this.tags.indexOf(node.dataset.value.toLowerCase()), 1);\n node.remove();\n\n /* Below the limit? Make sure the input is enabled. */\n if (this.tags.length < this.maxTags) {\n this.inputNode.disabled = false;\n }\n }\n\n addTag(tagValue) {\n tagValue = tagValue.trim();\n\n /* Tag value is probably not empty and we don't already have the same tag. */\n if (tagValue !== '' && this.tags.indexOf(tagValue.toLowerCase()) === -1) {\n this.tags.push(tagValue.toLowerCase());\n\n this.inputNode.parentNode.insertBefore(\n makeEl('' + escape(tagValue) + ''),\n this.inputNode\n );\n\n /* Too many tags, disable the input for now. */\n if (this.tags.length >= this.maxTags) {\n this.inputNode.disabled = true;\n }\n }\n }\n\n _handleInputKeyUp(evt) {\n let tagValue = this.inputNode.value;\n\n if (evt.key === 'Backspace' && tagValue === '') {\n // Remove the child\n if (this.inputNode.previousSibling) {\n this.deleteTagNode(this.inputNode.previousSibling);\n\n this.updateHiddenInputValue();\n }\n } else if (evt.key === ',') {\n this.addTag(tagValue);\n\n this.inputNode.value = ''\n this.updateHiddenInputValue();\n\n evt.preventDefault();\n }\n }\n\n _handleContainerClick(evt) {\n if (evt.target && evt.target.classList.contains('delete')) {\n this.deleteTagNode(evt.target.closest('.tag'));\n this.updateHiddenInputValue();\n }\n }\n}\n\nexport { TagsInput };\n","import { $, $$, toggleEl } from './dom';\nimport { TagsInput } from \"./tag_input\";\n\nconst setupSignupModal = () => {\n const signupButton = $('[data-target~=\"#signin\"],[data-target~=\"#signup\"]');\n\n if (signupButton) {\n signupButton.href = 'javascript:void(0)';\n\n signupButton.addEventListener('click', () => {\n $('.modal').classList.add('is-active');\n });\n\n $('.modal-button-close').addEventListener('click', () => {\n $('.modal').classList.remove('is-active');\n });\n }\n}\n\nconst globalSetup = () => {\n Array.prototype.forEach.call($$('.js-tag-input'), (el) => {\n new TagsInput(el).attach();\n });\n\n setupSignupModal();\n\n const embedButton = $('.panel-tools .embed-tool');\n\n if (embedButton){\n embedButton.addEventListener('click', (evt) => {\n if (evt.target && evt.target.closest('.panel-tools')) {\n toggleEl(evt.target.closest('.panel-tools').querySelector('.panel-embed'));\n }\n });\n }\n\n const expandButton = $('.expand-tool');\n\n if (expandButton) {\n expandButton.addEventListener('click', (evt) => {\n if (evt.target && evt.target.closest('.panel')) {\n const panel = evt.target.closest('.panel');\n\n if (panel.classList.contains('panel-fullsize')) {\n panel.classList.remove('panel-fullsize');\n } else {\n panel.classList.add('panel-fullsize');\n }\n }\n });\n }\n\n // Notifications\n (document.querySelectorAll('.notification .delete') || []).forEach(($delete) => {\n const $notification = $delete.parentNode;\n\n $delete.addEventListener('click', () => {\n $notification.parentNode.removeChild($notification);\n });\n });\n\n // Hamburger menu\n const $navbarBurgers = Array.prototype.slice.call(document.querySelectorAll('.navbar-burger'), 0);\n if ($navbarBurgers.length > 0) {\n $navbarBurgers.forEach(el => {\n el.addEventListener('click', () => {\n const target = el.dataset.target;\n const $target = document.getElementById(target);\n el.classList.toggle('is-active');\n $target.classList.toggle('is-active');\n });\n });\n }\n\n const preloader = $('.preloader');\n const main = $('main');\n\n if (preloader && main) {\n preloader.remove();\n main.id = '';\n }\n\n // CAPTCHA refresh\n const captchaContainer = $('.captcha_container');\n\n if (captchaContainer) {\n const refreshElement = captchaContainer.querySelector('a');\n const imageElement = captchaContainer.querySelector('img');\n\n if (refreshElement && imageElement) {\n refreshElement.addEventListener('click', () => {\n let src = imageElement.src;\n\n if (src.indexOf('&refresh') !== -1) {\n // yeah, it's kinda cancerous. fuck off.\n src = src.split('&rand=')[0];\n } else {\n src += '&refresh';\n }\n\n imageElement.src = src + '&rand=' + Math.random();\n });\n }\n }\n\n const hiddenElements = $$('.js-hidden');\n\n if (hiddenElements) {\n Array.prototype.forEach.call(hiddenElements, (elem) => {\n toggleEl(elem);\n });\n }\n}\n\nexport { globalSetup };"],"names":["funcp","$","selector","document","querySelector","$$","querySelectorAll","makeEl","html","template","createElement","innerHTML","trim","content","firstChild","toggleEl","el","classList","contains","remove","add","escape","unsafe","replace","TagsInput","element","options","tags","maxTags","inputNode","containerNode","style","display","appendChild","this","parentNode","insertBefore","nextSibling","value","split","tag","addTag","addEventListener","_handleInputKeyUp","bind","_handleContainerClick","clear","join","node","splice","indexOf","dataset","toLowerCase","length","disabled","tagValue","push","evt","key","previousSibling","deleteTagNode","updateHiddenInputValue","preventDefault","target","closest","signupButton","Array","prototype","forEach","call","attach","href","embedButton","expandButton","panel","$delete","$notification","removeChild","$navbarBurgers","slice","$target","getElementById","toggle","preloader","main","id","captchaContainer","refreshElement","imageElement","src","Math","random","hiddenElements","elem","readyState"],"mappings":"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"}