{"version":3,"file":"app.c8f88b91.js","sources":["../../../resources/js/utils.js","../../../resources/js/validation.js","../../../resources/js/tabs.js","../../../resources/js/app.js"],"sourcesContent":["export function setError(name, error) {\n var element = document.querySelector(`[name=\"${name}\"]`);\n if(element) {\n const label = element.nextElementSibling;\n element.classList.add('is-invalid');\n\n if(label) {\n label.textContent = error;\n }\n }\n}","export default class Validator {\n constructor(data, rules) {\n this.data = data;\n this.rules = rules;\n this.errors = {};\n }\n\n validate() {\n for (const [field, fieldRules] of Object.entries(this.rules)) {\n if (!Object.prototype.hasOwnProperty.call(this.data, field)) {\n continue;\n }\n\n const fieldValue = this.data[field];\n\n for (const rule of fieldRules.split(\"|\")) {\n const [ruleName, ...ruleArgs] = rule.split(\":\");\n\n if (!Validator.rules[ruleName]) {\n throw new Error(`Invalid validation rule: ${ruleName}`);\n }\n\n if (this.errors[field]) {\n break;\n }\n\n const validationError = Validator.rules[ruleName](\n fieldValue,\n ruleArgs,\n this.data\n );\n\n if (validationError) {\n this.addError(field, validationError);\n break;\n } else if (\n this.errors[field] &&\n this.errors[field].includes(\n Validator.rules[ruleName](fieldValue, ruleArgs, this.data)\n )\n ) {\n const index = this.errors[field].indexOf(\n Validator.rules[ruleName](fieldValue, ruleArgs, this.data)\n );\n if (index !== -1) {\n this.errors[field].splice(index, 1);\n }\n if (this.errors[field].length === 0) {\n delete this.errors[field];\n }\n }\n }\n }\n\n return Object.keys(this.errors).length === 0;\n }\n\n addError(field, message) {\n if (message.includes(\"_\")) {\n message = message.split(\"_\").join(\" \");\n }\n\n if (!this.errors[field]) {\n this.errors[field] = [];\n }\n\n if (message && !this.errors[field].includes(message)) {\n this.errors[field].push(message);\n }\n }\n}\n\nValidator.rules = {\n required(value) {\n return value === undefined || value === null || value.trim() === \"\"\n ? \"This field is required\"\n : null;\n },\n\n number(value) {\n if (isNaN(value) || value === \"\") {\n return \"Please enter a valid number\";\n }\n \n return null;\n },\n\n email(value) {\n return /^\\S+@\\S+\\.\\S+$/.test(value)\n ? null\n : \"Please enter a valid email address\";\n },\n\n min(value, minLength) {\n if (typeof value === 'string' || typeof value === 'number') {\n \n if (typeof value === 'string') {\n const strValue = value.trim();\n if (strValue.length >= parseInt(minLength, 10)) {\n return null;\n } else {\n return `Please enter at least ${minLength} characters`;\n }\n } else if (typeof value === 'number') { \n if (value >= parseInt(minLength, 10)) {\n return null;\n } else {\n return `Value must be at least ${minLength}`;\n }\n }\n }\n \n return `Invalid input`;\n },\n \n max(value, maxLength) {\n if (typeof value === 'string' || typeof value === 'number') {\n if (typeof value === 'string') {\n const strValue = value.trim();\n if (strValue.length <= parseInt(maxLength, 10)) {\n return null;\n } else {\n return `Please enter no more than ${maxLength} characters`;\n }\n } else if (typeof value === 'number') {\n if (value <= parseInt(maxLength, 10)) {\n return null;\n } else {\n return `Value must be no more than ${maxLength}`;\n }\n }\n }\n \n return `Invalid input`;\n }, \n \n\n match(value, [fieldName], data) {\n const otherValue = data[fieldName];\n return value === otherValue\n ? null\n : `This field should match the ${fieldName}`;\n },\n\n boolean(value) {\n return typeof value === 'boolean'\n ? null\n : 'This field must be a boolean';\n },\n};\n","export default class Tab {\n constructor(target) {\n this.isAttached = false;\n this.target = target;\n\n this.attach();\n }\n\n attach() {\n if (this.isAttached) return;\n\n this.element = document.querySelector(this.target);\n\n if (this.element) {\n this.attachUI();\n this.isAttached = true;\n }\n }\n\n attachUI() {\n const tabs = this.element.querySelectorAll(\".tab\");\n\n tabs.forEach(tab => {\n tab.addEventListener('click', (event) => {\n const targetTab = event.target;\n const activeTab = this.element.querySelector('.tab.active');\n const activeContent = this.element.querySelector('.tab-panel.active');\n const targetContent = this.element.querySelector(`#${targetTab.getAttribute('data-tab')}`);\n\n if (targetTab !== activeTab) {\n activeTab.classList.remove('active');\n activeContent.classList.remove('active');\n\n targetTab.classList.add('active');\n targetContent.classList.add('active');\n }\n });\n });\n }\n}\n","import \"../sass/main.scss\";\n\nimport.meta.glob([\n \"../fonts/**\",\n \"../images/**\",\n \"../images/*.*\",\n \"../videos/*.*\",\n]);\nimport Prism from \"prismjs\";\n\nimport \"prismjs/components/prism-http\";\nimport \"prismjs/components/prism-python\";\nimport \"prismjs/components/prism-css\";\nimport \"prismjs/components/prism-c\";\nimport \"prismjs/components/prism-c\";\nimport \"prismjs/components/prism-cpp\";\nimport \"prismjs/components/prism-csharp\";\nimport \"prismjs/components/prism-go\";\n\nimport \"prismjs/themes/prism-tomorrow.css\";\n\nimport \"prismjs/plugins/line-numbers/prism-line-numbers.css\";\nimport \"prismjs/plugins/line-numbers/prism-line-numbers\";\n\nimport { createAvatar } from \"@dicebear/core\";\nimport { initials } from \"@dicebear/collection\";\nimport { setError } from \"../js/utils\";\nimport Validator from \"../js/validation\";\nimport Tab from \"./tabs\";\n\nconst csrfToken = document\n .querySelector('meta[name=\"csrf-token\"]')\n .getAttribute(\"content\");\n\nnew Tab(\".tab-form\");\n\nconst menuToggle = document.querySelector(\".menu-toggle\");\nif (menuToggle) {\n const asideMenu = document.querySelector(\".management-menu\");\n menuToggle.addEventListener(\"click\", (e) => {\n e.preventDefault();\n\n if (asideMenu.classList.contains(\"toggle-menu\")) {\n asideMenu.classList.remove(\"toggle-menu\");\n } else {\n asideMenu.classList.add(\"toggle-menu\");\n }\n });\n}\n\nconst listItems = document.querySelectorAll(\".list-item\");\nlet activeItem = null;\nlistItems.forEach((element) => {\n element.addEventListener(\"click\", (e) => {\n // e.preventDefault();\n const item = e.currentTarget;\n\n const menuLink = item.querySelector(\"a\");\n if (menuLink.classList.contains(\"active\")) {\n return;\n } else {\n if (activeItem) {\n activeItem.classList.remove(\"active\");\n }\n\n activeItem = menuLink;\n activeItem.classList.add(\"active\");\n }\n });\n});\n\nconst collapseMenus = document.querySelectorAll(\".collapsible-item\");\nlet collapsedMenu = null;\ncollapseMenus.forEach((element) => {\n element.addEventListener(\"click\", (e) => {\n // e.preventDefault();\n const targetItem = e.currentTarget;\n const target = e.target;\n\n if (targetItem.classList.contains(\"collapsed\")) {\n if (!target.classList.contains(\"item\")) {\n collapsedMenu = null;\n targetItem.classList.remove(\"collapsed\");\n }\n return;\n } else {\n if (collapsedMenu) {\n collapsedMenu.classList.remove(\"collapsed\");\n }\n\n collapsedMenu = targetItem;\n collapsedMenu.classList.add(\"collapsed\");\n }\n });\n});\n\nconst openNav = document.getElementById(\"openNav\");\nconst closeNav = document.getElementById(\"closeNav\");\nconst nav_toggle = document.getElementById(\"nav-mobile-toggle\");\nconst navigation = document.getElementById(\"navigation\");\n\nif (nav_toggle) {\n nav_toggle.addEventListener(\"click\", () => {\n if (navigation.classList.contains(\"hide\")) {\n navigation.classList.remove(\"hide\");\n openNav.setAttribute(\"aria-hidden\", true);\n closeNav.setAttribute(\"aria-hidden\", false);\n } else {\n openNav.setAttribute(\"aria-hidden\", false);\n closeNav.setAttribute(\"aria-hidden\", true);\n navigation.classList.add(\"hide\");\n }\n });\n}\n\n// // event bounce on scroll\n// window.addEventListener(\"scroll\", bounce_content);\n// function bounce_content() {\n// var service = document.querySelectorAll(\".service\");\n\n// var windowheight = window.innerHeight;\n// var content_point = 150;\n// // for (var i = 0; i < service.length; i++) {\n\n// // var serviceTop = service[i].getBoundingClientRect().top;\n// // if (serviceTop < windowheight - content_point) {\n// // service[i].classList.add(\"bounceup\");\n// // } else {\n// // service[i].classList.remove(\"bounceup\");\n// // }\n// // }\n\n// var willanimate = document.querySelectorAll(\".willanimate\");\n\n// for (var i = 0; i < willanimate.length; i++) {\n// var willanimateTop = willanimate[i].getBoundingClientRect().top;\n// if (willanimateTop < windowheight - content_point) {\n// willanimate[i].classList.add(\"bounceup\");\n// } else {\n// willanimate[i].classList.remove(\"bounceup\");\n// }\n// }\n// }\n\nwindow.addEventListener(\"scroll\", debounce(bounce_content, 50)); // Reduced debounce time to 50ms\n\nfunction bounce_content() {\n const windowheight = window.innerHeight;\n const content_point = 150;\n\n const willanimate = document.querySelectorAll(\".willanimate\");\n\n willanimate.forEach((element) => {\n const willanimateTop = element.getBoundingClientRect().top;\n if (willanimateTop < windowheight - content_point) {\n element.classList.add(\"bounceup\");\n } else {\n element.classList.remove(\"bounceup\");\n }\n });\n}\n\nfunction debounce(func, wait) {\n let timeout;\n return function executedFunction(...args) {\n const later = () => {\n clearTimeout(timeout);\n func(...args);\n };\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n };\n}\n\n// video speed\n/* now play three times as fast just for the heck of it */\nvar video = document.querySelector(\"video\");\nif (video) {\n video.playbackRate = 0.25;\n}\n\n// dismiss alert\nvar alertCloseButton = document.querySelector(\".alert-dismiss\");\n\nif (alertCloseButton) {\n alertCloseButton.addEventListener(\"click\", (event) => {\n const alert = alertCloseButton.parentElement;\n alert.remove();\n event.preventDefault();\n });\n}\n\n// accordions\n\ndocument.addEventListener(\"DOMContentLoaded\", function () {\n var accordionList = document.querySelectorAll(\".accordion-list > li\");\n for (var i = 0; i < accordionList.length; i++) {\n var answer = accordionList[i].querySelector(\".answer\");\n answer.style.display = \"none\";\n\n accordionList[i].addEventListener(\"click\", function () {\n var isActive = this.classList.contains(\"active\");\n\n for (var j = 0; j < accordionList.length; j++) {\n accordionList[j].classList.remove(\"active\");\n accordionList[j].querySelector(\".answer\").style.display =\n \"none\";\n }\n\n if (!isActive) {\n this.classList.add(\"active\");\n this.querySelector(\".answer\").style.display = \"block\";\n }\n });\n }\n});\n\n// avatar\nconst avatars = document.querySelectorAll(\".avatar\");\n\navatars.forEach((avatar) => {\n const name = avatar.getAttribute(\"data-name\");\n const svg = createAvatar(initials, {\n // scale: 100,\n // size: 48,\n // radius: 50,\n seed: name,\n });\n\n avatar.innerHTML = svg;\n});\n\n// emails\nconst contactForm = document.getElementById(\"contact-form\");\nvar errors = {};\n\nif (contactForm) {\n contactForm.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n\n // clean the form\n const formElements = document.querySelectorAll(\n \"form input, form textarea\"\n );\n formElements.forEach((element) => {\n if (element.classList.contains(\"is-invalid\")) {\n element.classList.remove(\"is-invalid\");\n\n if (element.nextElementSibling.textContent.length > 0) {\n element.nextElementSibling.textContent = \"\";\n }\n }\n });\n\n const form = new FormData(contactForm);\n\n // fields\n const fullname = form.get(\"fullname\");\n const email = form.get(\"email\");\n const subject = form.get(\"subject\");\n const message = form.get(\"message\");\n\n const validator = new Validator(\n {\n fullname: fullname,\n email: email,\n subject: subject,\n message: message,\n },\n {\n fullname: \"required\",\n email: \"required|email\",\n subject: \"required\",\n message: \"required\",\n }\n );\n\n if (validator.validate()) {\n fetch(contactForm.action, {\n method: \"POST\",\n headers: {\n \"X-CSRF-TOKEN\": csrfToken,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n fullname: fullname,\n email: email,\n subject: subject,\n message: message,\n }),\n })\n .then((response) => {\n if (response.ok) {\n const alert = document.querySelector(\".alert\");\n if (alert) {\n alert.classList.add(\"alert-success\");\n const label = alert.querySelector(\"#message\");\n if (alert) {\n label.textContent =\n \"Your message has been successfully sent\";\n alert.style.display = \"block\";\n }\n }\n }\n })\n .catch((error) => {\n console.log(error);\n })\n .finally(() => {\n contactForm.reset();\n });\n } else {\n errors = validator.errors;\n for (var attr in errors) {\n setError(attr, errors[attr]);\n }\n }\n });\n}\n\ndocument.addEventListener(\"DOMContentLoaded\", function () {\n const preTags = document.querySelectorAll(\"pre\");\n preTags.forEach(function (preTag) {\n if (!preTag.classList.contains(\"language-xxx\")) {\n const language = preTag.className.replace(\"language-\", \"\");\n preTag.classList.add(\"language-\" + language);\n }\n });\n\n Prism.highlightAll();\n});\n\ndocument.querySelectorAll(\".open\").forEach(function (openElement) {\n openElement.addEventListener(\"click\", function () {\n var container = openElement.closest(\".topic\");\n var answer = container.querySelector(\".answer\");\n var trigger = container.querySelector(\".faq-t\");\n\n if (answer.style.display === \"none\" || !answer.style.display) {\n answer.style.display = \"block\";\n } else {\n answer.style.display = \"none\";\n }\n\n trigger.classList.toggle(\"faq-o\");\n container.classList.toggle(\"expanded\");\n });\n});\n\ndocument.addEventListener(\"DOMContentLoaded\", function () {\n let previousLang = null;\n\n // Load the selected language from local storage\n const storedLang = localStorage.getItem(\"selectedLang\");\n const storedFlag = localStorage.getItem(\"selectedFlag\");\n if (storedLang && storedFlag) {\n document.querySelector(\".current-lang .lang-flag\").src = storedFlag;\n document.querySelector(\".current-lang .lang-text\").innerText =\n storedLang;\n }\n\n document.querySelectorAll(\".selecting-lang\").forEach((item) => {\n item.addEventListener(\"click\", (event) => {\n const selectedLang = item.getAttribute(\"data-lang\");\n const selectedFlag = item.getAttribute(\"data-flag\");\n\n // Show the previously selected language in the dropdown\n if (previousLang) {\n previousLang.style.display = \"flex\";\n }\n\n // Update the current language and flag\n document.querySelector(\".current-lang .lang-flag\").src =\n selectedFlag;\n document.querySelector(\".current-lang .lang-text\").innerText =\n selectedLang;\n\n // Hide the selected language in the dropdown and store it as the previous language\n item.style.display = \"none\";\n previousLang = item;\n\n // Store the selected language in local storage\n localStorage.setItem(\"selectedLang\", selectedLang);\n localStorage.setItem(\"selectedFlag\", selectedFlag);\n });\n });\n});\n"],"names":["setError","name","error","element","label","Validator","data","rules","field","fieldRules","fieldValue","rule","ruleName","ruleArgs","validationError","index","message","value","minLength","maxLength","fieldName","otherValue","Tab","target","tab","event","targetTab","activeTab","activeContent","targetContent","csrfToken","menuToggle","asideMenu","listItems","activeItem","menuLink","collapseMenus","collapsedMenu","targetItem","openNav","closeNav","nav_toggle","navigation","debounce","bounce_content","windowheight","content_point","func","wait","timeout","args","later","video","alertCloseButton","accordionList","i","answer","isActive","j","avatars","avatar","svg","createAvatar","initials","contactForm","errors","e","form","fullname","email","subject","validator","response","alert","attr","preTag","language","Prism","openElement","container","trigger","previousLang","storedLang","storedFlag","item","selectedLang","selectedFlag"],"mappings":"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"}