diff --git a/.gitignore b/.gitignore index 6db2c46..6e64863 100644 --- a/.gitignore +++ b/.gitignore @@ -2,10 +2,9 @@ .idea/ # Static resources -resources/Azias/imgs/*.exe -resources/Azias/imgs/*.url resources/FontAwesomePro/ -resources/GoogleFonts/ +*.exe +*.url # Other folders (Will be removed once the content system is finished !) # /files/*/ diff --git a/commons/content.php b/commons/content.php index db8a3ac..4942e12 100644 --- a/commons/content.php +++ b/commons/content.php @@ -11,12 +11,14 @@ include_once 'langs.php'; // This helper requires PHP 8 or newer ! $SHOW_CONTENT_DEBUG_CARD = false; +$PRINT_CONTENT_DEBUG_INFO_TEXT_ELEMENTS = true; +$PRINT_CONTENT_DEBUG_ERROR_TEXT_ELEMENTS = true; // Defining constants and enums. abstract class ContentDisplayType { const NONE = 0; const SEARCH = 1; - const CONTENT = 2; + const CONTENT = 2; } // Preparing default variables. @@ -130,4 +132,211 @@ function endMainCard() { echo(''); } +function getContentItemText(array $contentNode, bool $italicOnError = true, bool $returnMissingAsEmpty = false) : string { + global $user_language, $default_language; + if(array_key_exists("key", $contentNode)) { + return localize($contentNode["key"]); + } elseif(array_key_exists($user_language, $contentNode)) { + return $contentNode[$user_language]; + } elseif(array_key_exists($default_language, $contentNode)) { + return $contentNode[$default_language]; + } else { + if($returnMissingAsEmpty) { + return ""; + } + if($italicOnError) { + return ''.localize("error.content.data.no.title").''; + } else { + return localize("error.content.data.no.title"); + } + } +} + +function printInfoTextElement(string $text) : void { + global $PRINT_CONTENT_DEBUG_INFO_TEXT_ELEMENTS; + if($PRINT_CONTENT_DEBUG_INFO_TEXT_ELEMENTS) { + echo('

'.$text.'

'); + } +} + +function printErrorTextElement(string $text) : void { + global $PRINT_CONTENT_DEBUG_ERROR_TEXT_ELEMENTS; + if($PRINT_CONTENT_DEBUG_ERROR_TEXT_ELEMENTS) { + echo('

'.$text.'

'); + } +} + +function createElementNode(mixed $elementNode) : void { + // Checking if we actually have a JSON object. + if(!is_array($elementNode)) { + echo('

Not array node !

'); + return; + } + if(!array_key_exists("type", $elementNode)) { + echo('

No "type" member found in node !

'); + return; + } + + switch($elementNode["type"]) { + case "table": + //printInfoTextElement('table item type'); + + // Reading and processing the modifiers + $_modNoOuterPadding = false; + $_modStriped = false; + $_modHover = false; + $_modInnerBordered = false; + if(array_key_exists("modifiers", $elementNode)) { + for ($i = 0; $i < count($elementNode["modifiers"]); $i++) { + //printInfoTextElement('>> Modifier: '.$elementNode["modifiers"][$i]); + switch($elementNode["modifiers"][$i]) { + case "no-outer-padding": + // Removes the rounding on the external edges. + $_modNoOuterPadding = true; + break; + case "striped": + // Removes the internal padding and adds 0.01em to the top to prevent gaps from margins. + $_modStriped = true; + break; + case "hover": + // Removes the standard top margin. + $_modHover = true; + break; + case "inner-bordered": + // Removes the standard top margin. + $_modInnerBordered = true; + break; + } + } + } + + // Preparing table + echo(''); + + // Creating "thead" + if(array_key_exists("head", $elementNode)) { + echo(''); + for ($iTableHead = 0; $iTableHead < count($elementNode["head"]); $iTableHead++) { + echo(''); + } + echo(''); + } + + // Creating "tbody" + if(array_key_exists("body", $elementNode)) { + echo(''); + for ($iTableBodyRow = 0; $iTableBodyRow < count($elementNode["body"]); $iTableBodyRow++) { + echo(''); + for ($iTableBodyCell = 0; $iTableBodyCell < count($elementNode["body"][$iTableBodyRow]); $iTableBodyCell++) { + $_cellColSpan = 1; + $_cellRowSpan = 1; + if(array_key_exists("colspan", $elementNode["body"][$iTableBodyRow][$iTableBodyCell])) { + $_cellColSpan = $elementNode["body"][$iTableBodyRow][$iTableBodyCell]["colspan"]; + } + if(array_key_exists("rowspan", $elementNode["body"][$iTableBodyRow][$iTableBodyCell])) { + $_cellRowSpan = $elementNode["body"][$iTableBodyRow][$iTableBodyCell]["rowspan"]; + } + + echo('1?' colspan="'.$_cellColSpan.'"':'').($_cellRowSpan>1?' rowspan="'.$_cellRowSpan.'"':'').'>'); + if(array_key_exists("parts", $elementNode["body"][$iTableBodyRow][$iTableBodyCell])) { + for ($iPart = 0; $iPart < count($elementNode["body"][$iTableBodyRow][$iTableBodyCell]["parts"]); $iPart++) { + createElementNode($elementNode["body"][$iTableBodyRow][$iTableBodyCell]["parts"][$iPart]); + } + } else { + echo(getContentItemText($elementNode["body"][$iTableBodyRow][$iTableBodyCell], false, true)); + } + echo(''); + } + echo(''); + } + echo(''); + } + + // Ending table + echo('
'); + if(array_key_exists("parts", $elementNode["head"][$iTableHead])) { + for ($iPart = 0; $iPart < count($elementNode["head"][$iTableHead]["parts"]); $iPart++) { + createElementNode($elementNode["head"][$iTableHead]["parts"][$iPart]); + } + } else { + echo(getContentItemText($elementNode["head"][$iTableHead], false, true)); + } + echo('
'); + + break; + case "collapse": + //printInfoTextElement('collapse item type'); + + // Preparing some stuff + $_title = ''.localize("error.content.data.no.title").''; + $_subtitle = ''; + if(array_key_exists("title", $elementNode)) { + $_title = getContentItemText($elementNode["title"], true, true); + } + if(array_key_exists("subtitle", $elementNode)) { + $_subtitle = getContentItemText($elementNode["subtitle"], true, true); + } + //printInfoTextElement('> title: "'.$_title); + //printInfoTextElement('> subtitle: "'.$_subtitle); + + // Reading and processing the modifiers + $_modNoRounding = false; + $_modNoContentPadding = false; + $_modNoTopMargin = false; + $_modIsClosed = false; + if(array_key_exists("modifiers", $elementNode)) { + for ($i = 0; $i < count($elementNode["modifiers"]); $i++) { + //printInfoTextElement('>> Modifier: '.$elementNode["modifiers"][$i]); + switch($elementNode["modifiers"][$i]) { + case "no-rounding": + // Removes the rounding on the external edges. + $_modNoRounding = true; + break; + case "no-padding-content": + // Removes the internal padding and adds 0.01em to the top to prevent gaps from margins. + $_modNoContentPadding = true; + break; + case "no-top-margin": + // Removes the standard top margin. + $_modNoTopMargin = true; + break; + case "closed": + // Close the collapse by default. + $_modIsClosed = true; + break; + } + } + } + + // Starting the collapse + echo('
'); + echo(''); + echo('

'); + echo(''); + echo('  '.$_title.''.$_subtitle.''); + echo('

'); + + // Rendering sub-elements + if(array_key_exists("parts", $elementNode)) { + //printInfoTextElement('> Processing sub-parts'); + for ($i = 0; $i < count($elementNode["parts"]); $i++) { + createElementNode($elementNode["parts"][$i]); + } + //printInfoTextElement('> Done processing sub-parts'); + } else { + printErrorTextElement(localize("error.content.data.no.subpart")); + } + + // Ending the collapse + echo('
'); + //printInfoTextElement('end of collapse'); + + break; + default: + printErrorTextElement(sprintf(localize("error.content.data.part.unknown"), $elementNode["type"])); + break; + } +} + ?> diff --git a/commons/strings.json b/commons/strings.json index 430ba20..a8d5f15 100644 --- a/commons/strings.json +++ b/commons/strings.json @@ -106,8 +106,12 @@ "error.content.tags.alphanumeric": "One of the tags given in the \"tags\" URL parameter is not a valid alphanumeric string.", "error.content.detect.type": "The type of requested content couldn't be determined.", "error.content.id.alphanumeric": "The requested resource's ID isn't valid.", - "error.content.data.not.exist": "The requested resource's doesn't have an associated item file.", + "error.content.data.not.exist": "The requested content doesn't have an internal item file.", "error.content.data.no.title": "No title found !", + "error.content.data.no.tags": "No tags found !", + "error.content.data.no.parts": "No content parts were found for this content !", + "error.content.data.no.subpart": "No sub-element were found for this element !", + "error.content.data.part.unknown": "Unknown element: \"%s\" !", "content.title.error": "Error", "content.title.content": "Content", @@ -118,6 +122,18 @@ "content.search.count.single": "result", "content.search.count.multiple": "results", + "content.commons.version.current": "Current version", + "content.commons.version.previous.single": "Previous version", + "content.commons.version.previous.multiple": "Previous versions", + "content.commons.version.old.single": "Old version", + "content.commons.version.old.multiple": "Old versions", + "content.commons.cpu": "CPU Architecture", + "content.commons.cpu.x64": "x64", + "content.commons.cpu.x86": "x86", + "content.commons.lang": "Language", + "content.commons.download.single": "Download", + "content.commons.download.multiple": "Downloads", + "about.biography.title": "Who am I ?", "about.philosophy.title": "Projects philosophy", "about.skills.title": "Skills", @@ -235,8 +251,12 @@ "error.content.tags.alphanumeric": "Un des tags donné dans le paramètre d'URL \"tags\" n'est pas une chaîne de texte alphanumérique valide.", "error.content.detect.type": "Le type de contenu désiré n'as pas pu être détecté.", "error.content.id.alphanumeric": "L'ID de la ressource demandée n'est pas valide.", - "error.content.data.not.exist": "La ressource demandée n'a pas de fichier de données associé.", + "error.content.data.not.exist": "Le contenu demandée n'a pas de fichier de données interne associé.", "error.content.data.no.title": "Aucun titre trouvé !", + "error.content.data.no.tags": "Aucun tag trouvé !", + "error.content.data.no.parts": "Aucun élément à présenter n'a été trouvé !", + "error.content.data.no.subpart": "Aucun sous-élément n'a été trouvé pour cet élément !", + "error.content.data.part.unknown": "Élément inconnu: \"%s\" !", "content.title.error": "Erreur de contenu", "content.title.content": "Content", @@ -247,6 +267,18 @@ "content.search.count.single": "résultat", "content.search.count.multiple": "résultats", + "content.commons.version.current": "Version actuelle", + "content.commons.version.previous.single": "Version précédente", + "content.commons.version.previous.multiple": "Versions précédentes", + "content.commons.version.old.single": "Ancienne version", + "content.commons.version.old.multiple": "Anciennes versions", + "content.commons.cpu": "Architecture de CPU", + "content.commons.cpu.x64": "x64", + "content.commons.cpu.x86": "x86", + "content.commons.lang": "Langue", + "content.commons.download.single": "Téléchargement", + "content.commons.download.multiple": "Téléchargements", + "about.biography.title": "Qui suis-je ?", "about.philosophy.title": "Philosophie des projets", "about.skills.title": "Compétences", diff --git a/content/index.json b/content/index.json index c369813..5a0aaa4 100644 --- a/content/index.json +++ b/content/index.json @@ -1,47 +1,47 @@ [ - { - "id": "test01", - "title": { - "en": "Test article", - "fr": "Article de test" - }, - "preamble": { - "en": "This is a test article, please ignore it", - "fr": "Ceci est un article de test, veuillez l'ignorer." - }, - "image": "/resources/Azias/imgs/angry-alchool-pussy.png", - "tags": [ - "test", "programming", "purebasic" - ] - }, - { - "id": "test02", - "title": { - "en": "Test article #2", - "fr": "Article de test #2" - }, - "preamble": { - "en": "This is a test article, please ignore it", - "fr": "Ceci est un article de test, veuillez l'ignorer." - }, - "image": "test.jpg", - "tags": [ - "test", "programming", "docker" - ] - }, { "id": "lscom-cli", "title": { - "en": "PB-ListComPort - CLI COM port enumerator", - "fr": "PB-ListComPort - Enumérateur de port COM pour invité de commande" + "en": "PB-ListComPort", + "fr": "PB-ListComPort" }, "preamble": { - "en": "A simple tool that can list COM ports with their name, friendly name and device name easily and cleanly.
This tool is intended to replace the tedious task of having to use the mode command, and the Device Manager to find a newly plugged-in device that provides a COM port.", + "en": "A simple CLI tool that can list COM ports with their name, friendly name and device name easily and cleanly.
This tool is intended to replace the tedious task of having to use the mode command, and the Device Manager to find a newly plugged-in device that provides a COM port.", "fr": "..." }, "image": "/resources/Azias/imgs/lscom-v2-text-01-bkgd-cli.png", "tags": [ "application", "lscom", "purebasic", "windows" ] + }, + { + "id": "youtube-auto-archiver", + "title": { + "en": "Youtube-Auto-Archiver", + "fr": "Youtube-Auto-Archiver" + }, + "preamble": { + "en": "...", + "fr": "..." + }, + "image": "/resources/Azias/imgs/placeholder.jpg", + "tags": [ + "docker", "web", "python" + ] + }, + { + "id": "excel-worksheet-password-remover", + "title": { + "en": "Excel-Worksheet-Password-Remover", + "fr": "Excel-Worksheet-Password-Remover" + }, + "preamble": { + "en": "Small web page from which you can easily remove a password from an Excel worksheet without uploading any file, directly in your browser.
It works by leaving the task of editing the XML files on an Excel document to your browser instead to keep everything local.", + "fr": "Petite application web qui permet de facilement retirer le mot de passe d'une feuille de calcul Excel depuis votre navigateur web sans avoir à uploader le fichier sur internet.
Cette application laisse votre navigateur modifier les fichiers XML du fichier Excel afin de tout garder en local." + }, + "image": "/resources/Azias/imgs/excel-password-remover.png", + "tags": [ + "tool", "web" + ] } ] diff --git a/content/index.php b/content/index.php index a43ccc3..36fb829 100644 --- a/content/index.php +++ b/content/index.php @@ -8,11 +8,8 @@ include_once 'content.php'; // Checking if an error occurred while loading data and parsing the URL. $content_error_code = 200; if($content_has_error) { - if(is_null($requested_tags)) { - // Failed to parse URL and detect a default category. - header("HTTP/1.1 400 Bad Request"); - $content_error_code = 400; - } elseif(is_null($filtered_content_index_data)) { + // TODO: Add condition for the lack of data for an item. + if(is_null($filtered_content_index_data)) { // Failed to get a display type or to extract types. header("HTTP/1.1 400 Bad Request"); $content_error_code = 400; @@ -35,6 +32,7 @@ if($content_has_error) { + @@ -56,7 +54,15 @@ if($content_has_error) { } elseif($requested_content_display_type == ContentDisplayType::SEARCH) { echo(localize("content.title.content").''.localize("content.title.search")); } elseif($requested_content_display_type == ContentDisplayType::CONTENT) { - echo(localize("content.title.content").'$TODO'); + $_nav_title_text = '' . localize("error.content.data.no.title") . ''; + if (array_key_exists("page", $requested_item_data["title"])) { + if (array_key_exists($user_language, $requested_item_data["title"]["page"])) { + $_nav_title_text = $requested_item_data["title"]["page"][$user_language]; + } elseif (array_key_exists($default_language, $requested_item_data["title"]["page"])) { + $_nav_title_text = $requested_item_data["title"]["page"][$user_language]; + } + } + echo(localize("content.title.content").''.$_nav_title_text); } ?> @@ -74,6 +80,9 @@ if($content_has_error) { endMainCard(); if($SHOW_CONTENT_DEBUG_CARD) { + // ################ + // Debugging card + // ################ echo('
@@ -108,12 +117,15 @@ if($content_has_error) { // Checking if an error occurred. if($content_error_code != 200) { + // ############# + // Error card + // ############# startMainCard("fad fa-exclamation-triangle", localize('error.content.title.generic'), ""); echo('
'); echo('

'.$content_error_message.'

'); echo('
'); echo('
'. - '

'. + '

'. 'Card footer here.'. '

'); endMainCard(); @@ -122,6 +134,10 @@ if($content_has_error) { // Printing the containers if($requested_content_display_type == ContentDisplayType::SEARCH) { + // ############# + // Search page + // ############# + // Creating the start of the card, only a "
" should be required afterward. startMainCard( "fad fa-file-search", @@ -154,7 +170,8 @@ if($content_has_error) { echo(''); echo('
'); @@ -163,38 +180,88 @@ if($content_has_error) { } echo('
'); echo('
'. - '

'. + '

'. 'Card footer here.'. '

'); endMainCard(); } elseif($requested_content_display_type == ContentDisplayType::CONTENT) { + // ############## + // Content page + // ############## + + // Preparing soma variables for the icon, title and subtitle. $_title_icon = "fad fa-question"; - $_title_text = '' . localize("error.content.data.no.title") . ''; + $_title_text_main = ''.localize("error.content.data.no.title").''; + $_title_text_sub = NULL; + // Attempting to read the card's icon, title and subtitle. if (array_key_exists("title", $requested_item_data)) { if (array_key_exists("icon", $requested_item_data["title"])) { $_title_icon = $requested_item_data["title"]["icon"]; } - - if (array_key_exists($user_language, $requested_item_data["title"])) { - $_title_text = $requested_item_data["title"][$user_language]; - } elseif (array_key_exists($default_language, $requested_item_data["title"])) { - $_title_text = $requested_item_data["title"][$user_language]; + if (array_key_exists("card", $requested_item_data["title"])) { + if (array_key_exists("main", $requested_item_data["title"]["card"])) { + $_title_text_main = getContentItemText($requested_item_data["title"]["card"]["main"], true); + } + if (array_key_exists("sub", $requested_item_data["title"]["card"])) { + $_title_text_sub = getContentItemText($requested_item_data["title"]["card"]["sub"], true); + } } } - startMainCard($_title_icon, $_title_text, ""); + // Opening the card. + startMainCard($_title_icon, $_title_text_main, (is_null($_title_text_sub) ? "" : $_title_text_sub)); + // Opening the content container. echo('
'); - echo('
'); - echo('

Text will go here...

'); - echo('
'); + + // Adding elements defined in the JSON file. + if(array_key_exists("parts", $requested_item_data)) { + for ($i = 0; $i < count($requested_item_data["parts"]); $i++) { + createElementNode($requested_item_data["parts"][$i]); + } + } else { + echo('

'); + echo(localize("error.content.data.no.parts").'

'); + } + + // New elements test zone. - START + + /*echo('
'); + echo('

Text will go here...

'); echo('
'); - echo('
' . - '

' . - 'Card footer here.' . - '

'); + echo('');/**/ + //echo('
'); + + /* + +

lscom_fra_x86.exe

+ +
+ */ + + // New elements test zone. - END + + // Closing the content container. + echo('
'); + + // Printing the tags' section at the end of the card + echo('
'); + echo('
'); + if(array_key_exists("tags", $requested_item_data)) { + for($i = 0; $i < count($requested_item_data["tags"]); $i++) { + echo(''); + } + } else { + echo(''.localize("error.content.data.no.tags").''); + } + echo('
'); + + // Closing the card. endMainCard(); } @@ -205,7 +272,8 @@ if($content_has_error) { - + + diff --git a/content/items/lscom-cli.json b/content/items/lscom-cli.json index 18f1aba..a84b212 100644 --- a/content/items/lscom-cli.json +++ b/content/items/lscom-cli.json @@ -1,13 +1,100 @@ { "title": { "icon": "fad fa-terminal", - "en": "PB-ListComPort - CLI COM port enumerator", - "fr": "PB-ListComPort - Enumérateur de port COM pour invité de commande" + "page": { + "en": "PB-ListComPort", + "fr": "PB-ListComPort" + }, + "card": { + "main": { + "en": "PB-ListComPort", + "fr": "PB-ListComPort" + }, + "sub": { + "en": "CLI COM port enumerator", + "fr": "Enumérateur de port COM pour invité de commande" + } + } }, - "tags": [ - "programming", "lscom" + "parts": [ + { + "type": "collapse", + "title": { + "key": "content.commons.version.current" + }, + "subtitle": { + "en": "v2.1.0", + "fr": "v2.1.0" + }, + "modifiers": [ + "no-rounding", + "no-padding-content" + ], + "parts": [ + { + "type": "table", + "modifiers": [ + "striped", + "inner-bordered" + ], + "head": [ + { + "key": "content.commons.cpu" + }, + { + "key": "content.commons.lang" + }, + { + "key": "content.commons.download.single" + } + ], + "body": [ + [ + { + "key": "content.commons.cpu.x64", + "rowspan": 2 + }, + { + "key": "lang.english" + }, + { + "en": "URL here" + } + ], + [ + { + "key": "lang.french" + }, + { + "en": "URL here" + } + ], + [ + { + "key": "content.commons.cpu.x86", + "rowspan": 2 + }, + { + "key": "lang.english" + }, + { + "en": "URL here" + } + ], + [ + { + "key": "lang.french" + }, + { + "en": "URL here" + } + ] + ] + } + ] + } ], - "toggles": { - "downloads": true - } + "tags": [ + "application", "lscom", "purebasic", "windows" + ] } diff --git a/resources/Azias/css/nibblepoker.lu.css b/resources/Azias/css/nibblepoker.lu.css index 8b1d16b..9170282 100644 --- a/resources/Azias/css/nibblepoker.lu.css +++ b/resources/Azias/css/nibblepoker.lu.css @@ -4,11 +4,6 @@ src: url("/resources/Quantum/Quantum.otf") format('opentype'); } -/* Preventing images from being saved with the right-click */ -img.no-save { - pointer-events: none; -} - /* Background for the main container and its cards */ div#body-overlay { position: absolute; @@ -28,13 +23,11 @@ div#body-overlay { background-image: url("/resources/Azias/imgs/3px-tile-0.1.png"); } -/* Helpers */ +/* Utilities, helpers & misc */ +img.no-save { + pointer-events: none; +} .no-select { - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; user-select: none; } .quantum { @@ -59,7 +52,6 @@ div#body-overlay { font-size: 3.0rem!important; } .text-super-muted { - /*color: #6E6E6E;/**/ color: #89898A; } .square-corners { @@ -68,6 +60,10 @@ div#body-overlay { .stretch-align-items { align-items: stretch; } +.py-01 { + padding-top: 0.01rem!important; + padding-bottom: 0.01rem!important; +} /* Unique rules */ #copyright-text { @@ -101,7 +97,6 @@ div#body-overlay { filter: invert(100%); image-rendering: pixelated; } - hr, hr.dark-mde, hr.subtle { background-color: rgba(0, 0, 0, 0) !important; background: rgb(93,95,97); @@ -111,7 +106,8 @@ hr, hr.dark-mde, hr.subtle { margin-bottom: 5px; } -/* Content search */ +/* Content */ +/* Content > Search */ @media (max-width: 992px) { :root { --content-search-image-size: 96px; @@ -161,6 +157,7 @@ div.content-tag-container a:not(:first-child) { margin-left: 10px; } +/* Gradient used on home page's applications card */ @media (min-width: 993px) { .l-lab-web { background: linear-gradient(90deg, rgba(101,144,134,0.3) 0%, rgba(101,144,134,0.2) 1.5px, rgba(101,144,134,0.0) 7px); @@ -176,7 +173,7 @@ div.content-tag-container a:not(:first-child) { } } -/* Custom dynamic sizing */ +/* Custom dynamic sizing for main containers in primary ".content-wrapper" */ .w-lg-p90 { width: 95% !important; } @@ -192,26 +189,16 @@ div.content-tag-container a:not(:first-child) { } /* Fixes */ -/* TODO: Fix it when it is closed */ +/* No idea where this is used */ div.last-inner-collapse-border-fix { + /* TODO: Fix it when it is closed */ border: var(--collapse-content-border-width) solid var(--dm-collapse-content-border-color) !important; border-top: 0 !important; border-bottom-left-radius: var(--collapse-content-border-radius) !important; border-bottom-right-radius: var(--collapse-content-border-radius) !important; } - -/* Trash */ -/*.lang-icon { - height: var(--base-line-height); - max-height: var(--base-line-height); - height: var(--base-font-size); - max-height: var(--base-font-size); -}*/ -/*.page-wrapper.with-transitions.with-sidebar .content-wrapper { - transition: none; -}/**/ -/*div#body-overlay.error { - background-image: url("/resources/Azias/imgs/psychedelic.png"); - opacity: 0.075; -}/**/ +/* Fix for ".content-wrapper" on mobile which can be too large due to the main title */ +.content-wrapper { + max-width: 100vw; +} diff --git a/resources/Azias/imgs/excel-password-remover.png b/resources/Azias/imgs/excel-password-remover.png new file mode 100644 index 0000000..6634ecb Binary files /dev/null and b/resources/Azias/imgs/excel-password-remover.png differ diff --git a/resources/Azias/imgs/lscom/screen-cli-csv-2x-xBR.png b/resources/Azias/imgs/lscom/screen-cli-csv-2x-xBR.png new file mode 100644 index 0000000..112280a Binary files /dev/null and b/resources/Azias/imgs/lscom/screen-cli-csv-2x-xBR.png differ diff --git a/resources/Azias/imgs/lscom/screen-cli-csv-2x.png b/resources/Azias/imgs/lscom/screen-cli-csv-2x.png new file mode 100644 index 0000000..32c87c5 Binary files /dev/null and b/resources/Azias/imgs/lscom/screen-cli-csv-2x.png differ diff --git a/resources/Azias/imgs/lscom/screen-cli-csv.png b/resources/Azias/imgs/lscom/screen-cli-csv.png new file mode 100644 index 0000000..22c6c50 Binary files /dev/null and b/resources/Azias/imgs/lscom/screen-cli-csv.png differ diff --git a/resources/Azias/imgs/lscom/screen-cli-full-2x-xBR.png b/resources/Azias/imgs/lscom/screen-cli-full-2x-xBR.png new file mode 100644 index 0000000..a786487 Binary files /dev/null and b/resources/Azias/imgs/lscom/screen-cli-full-2x-xBR.png differ diff --git a/resources/Azias/imgs/lscom/screen-cli-full-2x.png b/resources/Azias/imgs/lscom/screen-cli-full-2x.png new file mode 100644 index 0000000..b839140 Binary files /dev/null and b/resources/Azias/imgs/lscom/screen-cli-full-2x.png differ diff --git a/resources/Azias/imgs/lscom/screen-cli-full.png b/resources/Azias/imgs/lscom/screen-cli-full.png new file mode 100644 index 0000000..02ec62b Binary files /dev/null and b/resources/Azias/imgs/lscom/screen-cli-full.png differ diff --git a/resources/Azias/imgs/lscom/screen-cli-stylish-2x-xBR.png b/resources/Azias/imgs/lscom/screen-cli-stylish-2x-xBR.png new file mode 100644 index 0000000..6871e01 Binary files /dev/null and b/resources/Azias/imgs/lscom/screen-cli-stylish-2x-xBR.png differ diff --git a/resources/Azias/imgs/lscom/screen-cli-stylish-2x.png b/resources/Azias/imgs/lscom/screen-cli-stylish-2x.png new file mode 100644 index 0000000..cda8b3e Binary files /dev/null and b/resources/Azias/imgs/lscom/screen-cli-stylish-2x.png differ diff --git a/resources/Azias/imgs/lscom/screen-cli-stylish.png b/resources/Azias/imgs/lscom/screen-cli-stylish.png new file mode 100644 index 0000000..da693ba Binary files /dev/null and b/resources/Azias/imgs/lscom/screen-cli-stylish.png differ diff --git a/resources/GliderJs/1.7.6/LICENSE.txt b/resources/GliderJs/1.7.6/LICENSE.txt new file mode 100644 index 0000000..1f95d26 --- /dev/null +++ b/resources/GliderJs/1.7.6/LICENSE.txt @@ -0,0 +1,5 @@ +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/resources/GliderJs/1.7.6/glider-compat.min.js b/resources/GliderJs/1.7.6/glider-compat.min.js new file mode 100644 index 0000000..6e001f9 --- /dev/null +++ b/resources/GliderJs/1.7.6/glider-compat.min.js @@ -0,0 +1,11 @@ +"document"in self&&("classList"in document.createElement("_")&&(!document.createElementNS||"classList"in document.createElementNS("http://www.w3.org/2000/svg","g"))||!function(b){if("Element"in b){b=b.Element.prototype;var d=Object,g=String.prototype.trim||function(){return this.replace(/^\s+|\s+$/g,"")},a=Array.prototype.indexOf||function(l){for(var f=0,a=this.length;a>f;f++)if(f in this&&this[f]===l)return f;return-1},c=function(a,f){this.name=a;this.code=DOMException[a];this.message=f},h=function(l, +f){if(""===f)throw new c("SYNTAX_ERR","The token must not be empty.");if(/\s/.test(f))throw new c("INVALID_CHARACTER_ERR","The token must not contain space characters.");return a.call(l,f)},k=function(a){var f=g.call(a.getAttribute("class")||"");f=f?f.split(/\s+/):[];for(var b=0,h=f.length;h>b;b++)this.push(f[b]);this._updateClassName=function(){a.setAttribute("class",this.toString())}},e=k.prototype=[],m=function(){return new k(this)};if(c.prototype=Error.prototype,e.item=function(a){return this[a]|| +null},e.contains=function(a){return~h(this,a+"")},e.add=function(){var a=arguments,f=0,b=a.length,c=!1;do{var e=a[f]+"";~h(this,e)||(this.push(e),c=!0)}while(++fc;c++)a=arguments[c],b.call(this,a)}};d("add");d("remove")}if(b.classList.toggle("c3",!1),b.classList.contains("c3")){var g=DOMTokenList.prototype.toggle;DOMTokenList.prototype.toggle=function(a,b){return 1 in arguments&&!this.contains(a)==!b?b:g.call(this,a)}}"replace"in document.createElement("_").classList||(DOMTokenList.prototype.replace=function(a,b){var c=this.toString().split(" "),d=c.indexOf(a+ +"");~d&&(c=c.slice(d),this.remove.apply(this,c),this.add(b),this.add.apply(this,c.slice(1)))});b=null}()); +(function(){if("undefined"!==typeof window)try{var b=new window.CustomEvent("test",{cancelable:!0});b.preventDefault();if(!0!==b.defaultPrevented)throw Error("Could not prevent default");}catch(d){b=function(b,a){a=a||{bubbles:!1,cancelable:!1,detail:void 0};var c=document.createEvent("CustomEvent");c.initCustomEvent(b,a.bubbles,a.cancelable,a.detail);var d=c.preventDefault;c.preventDefault=function(){d.call(this);try{Object.defineProperty(this,"defaultPrevented",{get:function(){return!0}})}catch(k){this.defaultPrevented= +!0}};return c},b.prototype=window.Event.prototype,window.CustomEvent=b}})(); +Object.assign||Object.defineProperty(Object,"assign",{enumerable:!1,configurable:!0,writable:!0,value:function(b){if(void 0===b||null===b)throw new TypeError("Cannot convert first argument to object");for(var d=Object(b),g=1;g= _.trackWidth + + if (!_.opt.rewind) { + if (_.arrows.prev) { + _.arrows.prev.classList.toggle( + 'disabled', + _.ele.scrollLeft <= 0 || disableArrows + ) + _.arrows.prev.classList.contains('disabled') + ? _.arrows.prev.setAttribute('aria-disabled', true) + : _.arrows.prev.setAttribute('aria-disabled', false) + } + if (_.arrows.next) { + _.arrows.next.classList.toggle( + 'disabled', + Math.ceil(_.scrollLeft + _.containerWidth) >= + Math.floor(_.trackWidth) || disableArrows + ) + _.arrows.next.classList.contains('disabled') + ? _.arrows.next.setAttribute('aria-disabled', true) + : _.arrows.next.setAttribute('aria-disabled', false) + } + } + + _.slide = Math.round(_.scrollLeft / _.itemWidth) + _.page = Math.round(_.scrollLeft / _.containerWidth) + + var middle = _.slide + Math.floor(Math.floor(_.opt.slidesToShow) / 2) + + var extraMiddle = Math.floor(_.opt.slidesToShow) % 2 ? 0 : middle + 1 + if (Math.floor(_.opt.slidesToShow) === 1) { + extraMiddle = 0 + } + + // the last page may be less than one half of a normal page width so + // the page is rounded down. when at the end, force the page to turn + if (_.scrollLeft + _.containerWidth >= Math.floor(_.trackWidth)) { + _.page = _.dots ? _.dots.children.length - 1 : 0 + } + + [].forEach.call(_.slides, function (slide, index) { + var slideClasses = slide.classList + + var wasVisible = slideClasses.contains('visible') + + var start = _.scrollLeft + + var end = _.scrollLeft + _.containerWidth + + var itemStart = _.itemWidth * index + + var itemEnd = itemStart + _.itemWidth; + + [].forEach.call(slideClasses, function (className) { + /^left|right/.test(className) && slideClasses.remove(className) + }) + slideClasses.toggle('active', _.slide === index) + if (middle === index || (extraMiddle && extraMiddle === index)) { + slideClasses.add('center') + } else { + slideClasses.remove('center') + slideClasses.add( + [ + index < middle ? 'left' : 'right', + Math.abs(index - (index < middle ? middle : extraMiddle || middle)) + ].join('-') + ) + } + + var isVisible = + Math.ceil(itemStart) >= Math.floor(start) && + Math.floor(itemEnd) <= Math.ceil(end) + slideClasses.toggle('visible', isVisible) + if (isVisible !== wasVisible) { + _.emit('slide-' + (isVisible ? 'visible' : 'hidden'), { + slide: index + }) + } + }) + if (_.dots) { + [].forEach.call(_.dots.children, function (dot, index) { + dot.classList.toggle('active', _.page === index) + }) + } + + if (event && _.opt.scrollLock) { + clearTimeout(_.scrollLock) + _.scrollLock = setTimeout(function () { + clearTimeout(_.scrollLock) + // dont attempt to scroll less than a pixel fraction - causes looping + if (Math.abs(_.ele.scrollLeft / _.itemWidth - _.slide) > 0.02) { + if (!_.mouseDown) { + // Only scroll if not at the end (#94) + if (_.trackWidth > _.containerWidth + _.ele.scrollLeft) { + _.scrollItem(_.getCurrentSlide()) + } + } + } + }, _.opt.scrollLockDelay || 250) + } + } + + gliderPrototype.getCurrentSlide = function () { + var _ = this + return _.round(_.ele.scrollLeft / _.itemWidth) + } + + gliderPrototype.scrollItem = function (slide, dot, e) { + if (e) e.preventDefault() + + var _ = this + + var originalSlide = slide + ++_.animate_id + + if (dot === true) { + slide = slide * _.containerWidth + slide = Math.round(slide / _.itemWidth) * _.itemWidth + } else { + if (typeof slide === 'string') { + var backwards = slide === 'prev' + + // use precise location if fractional slides are on + if (_.opt.slidesToScroll % 1 || _.opt.slidesToShow % 1) { + slide = _.getCurrentSlide() + } else { + slide = _.slide + } + + if (backwards) slide -= _.opt.slidesToScroll + else slide += _.opt.slidesToScroll + + if (_.opt.rewind) { + var scrollLeft = _.ele.scrollLeft + slide = + backwards && !scrollLeft + ? _.slides.length + : !backwards && + scrollLeft + _.containerWidth >= Math.floor(_.trackWidth) + ? 0 + : slide + } + } + + slide = Math.max(Math.min(slide, _.slides.length), 0) + + _.slide = slide + slide = _.itemWidth * slide + } + + _.scrollTo( + slide, + _.opt.duration * Math.abs(_.ele.scrollLeft - slide), + function () { + _.updateControls() + _.emit('animated', { + value: originalSlide, + type: + typeof originalSlide === 'string' ? 'arrow' : dot ? 'dot' : 'slide' + }) + } + ) + + return false + } + + gliderPrototype.settingsBreakpoint = function () { + var _ = this + + var resp = _._opt.responsive + + if (resp) { + // Sort the breakpoints in mobile first order + resp.sort(function (a, b) { + return b.breakpoint - a.breakpoint + }) + + for (var i = 0; i < resp.length; ++i) { + var size = resp[i] + if (_window.innerWidth >= size.breakpoint) { + if (_.breakpoint !== size.breakpoint) { + _.opt = Object.assign({}, _._opt, size.settings) + _.breakpoint = size.breakpoint + return true + } + return false + } + } + } + // set back to defaults in case they were overriden + var breakpointChanged = _.breakpoint !== 0 + _.opt = Object.assign({}, _._opt) + _.breakpoint = 0 + return breakpointChanged + } + + gliderPrototype.scrollTo = function (scrollTarget, scrollDuration, callback) { + var _ = this + + var start = new Date().getTime() + + var animateIndex = _.animate_id + + var animate = function () { + var now = new Date().getTime() - start + _.scrollLeft = + _.scrollLeft + + (scrollTarget - _.scrollLeft) * + _.opt.easing(0, now, 0, 1, scrollDuration) + _.ele.scrollLeft = _.scrollLeft + + if (now < scrollDuration && animateIndex === _.animate_id) { + _window.requestAnimationFrame(animate) + } else { + _.ele.scrollLeft = _.scrollLeft = scrollTarget + callback && callback.call(_) + } + } + + _window.requestAnimationFrame(animate) + } + + gliderPrototype.removeItem = function (index) { + var _ = this + + if (_.slides.length) { + _.track.removeChild(_.slides[index]) + _.refresh(true) + _.emit('remove') + } + } + + gliderPrototype.addItem = function (ele) { + var _ = this + + _.track.appendChild(ele) + _.refresh(true) + _.emit('add') + } + + gliderPrototype.handleMouse = function (e) { + var _ = this + if (_.mouseDown) { + _.isDrag = true + _.scrollLeft += (_.mouseDown - e.clientX) * (_.opt.dragVelocity || 3.3) + _.mouseDown = e.clientX + _.ele.scrollLeft = _.scrollLeft + } + } + + // used to round to the nearest 0.XX fraction + gliderPrototype.round = function (double) { + var _ = this + var step = _.opt.slidesToScroll % 1 || 1 + var inv = 1.0 / step + return Math.round(double * inv) / inv + } + + gliderPrototype.refresh = function (paging) { + var _ = this + _.init(true, paging) + } + + gliderPrototype.setOption = function (opt, global) { + var _ = this + + if (_.breakpoint && !global) { + _._opt.responsive.forEach(function (v) { + if (v.breakpoint === _.breakpoint) { + v.settings = Object.assign({}, v.settings, opt) + } + }) + } else { + _._opt = Object.assign({}, _._opt, opt) + } + + _.breakpoint = 0 + _.settingsBreakpoint() + } + + gliderPrototype.destroy = function () { + var _ = this + + var replace = _.ele.cloneNode(true) + + var clear = function (ele) { + ele.removeAttribute('style'); + [].forEach.call(ele.classList, function (className) { + /^glider/.test(className) && ele.classList.remove(className) + }) + } + // remove track + replace.children[0].outerHTML = replace.children[0].innerHTML + clear(replace); + [].forEach.call(replace.getElementsByTagName('*'), clear) + _.ele.parentNode.replaceChild(replace, _.ele) + _.event(_window, 'remove', { + resize: _.resize + }) + _.emit('destroy') + } + + gliderPrototype.emit = function (name, arg) { + var _ = this + + var e = new _window.CustomEvent('glider-' + name, { + bubbles: !_.opt.eventPropagate, + detail: arg + }) + _.ele.dispatchEvent(e) + } + + gliderPrototype.event = function (ele, type, args) { + var eventHandler = ele[type + 'EventListener'].bind(ele) + Object.keys(args).forEach(function (k) { + eventHandler(k, args[k]) + }) + } + + return Glider +}) diff --git a/resources/GliderJs/1.7.6/glider.min.css b/resources/GliderJs/1.7.6/glider.min.css new file mode 100644 index 0000000..949b5ae --- /dev/null +++ b/resources/GliderJs/1.7.6/glider.min.css @@ -0,0 +1 @@ +.glider,.glider-contain{margin:0 auto;position:relative}.glider,.glider-track{transform:translateZ(0)}.glider-dot,.glider-next,.glider-prev{border:0;padding:0;user-select:none;outline:0}.glider-contain{width:100%}.glider{overflow-y:hidden;-webkit-overflow-scrolling:touch;-ms-overflow-style:none}.glider-track{width:100%;margin:0;padding:0;display:flex;z-index:1}.glider.draggable{user-select:none;cursor:-webkit-grab;cursor:grab}.glider.draggable .glider-slide img{user-select:none;pointer-events:none}.glider.drag{cursor:-webkit-grabbing;cursor:grabbing}.glider-slide{user-select:none;justify-content:center;align-content:center;width:100%;min-width:150px}.glider-slide img{max-width:100%}.glider::-webkit-scrollbar{opacity:0;height:0}.glider-next,.glider-prev{position:absolute;background:0 0;z-index:2;font-size:40px;text-decoration:none;left:-23px;top:30%;cursor:pointer;color:#666;opacity:1;line-height:1;transition:opacity .5s cubic-bezier(.17,.67,.83,.67),color .5s cubic-bezier(.17,.67,.83,.67)}.glider-next:focus,.glider-next:hover,.glider-prev:focus,.glider-prev:hover{color:#ccc}.glider-next{right:-23px;left:auto}.glider-next.disabled,.glider-prev.disabled{opacity:.25;color:#666;cursor:default}.glider-hide{opacity:0}.glider-dots{user-select:none;display:flex;flex-wrap:wrap;justify-content:center;margin:0 auto;padding:0}.glider-dot{display:block;cursor:pointer;color:#ccc;border-radius:999px;background:#ccc;width:12px;height:12px;margin:7px}.glider-dot:focus,.glider-dot:hover{background:#ddd}.glider-dot.active{background:#a89cc8}@media(max-width:36em){.glider::-webkit-scrollbar{opacity:1;-webkit-appearance:none;width:7px;height:3px}.glider::-webkit-scrollbar-thumb{opacity:1;border-radius:99px;background-color:rgba(156,156,156,.25);-webkit-box-shadow:0 0 1px rgba(255,255,255,.25);box-shadow:0 0 1px rgba(255,255,255,.25)}} diff --git a/resources/GliderJs/1.7.6/glider.min.js b/resources/GliderJs/1.7.6/glider.min.js new file mode 100644 index 0000000..10d408b --- /dev/null +++ b/resources/GliderJs/1.7.6/glider.min.js @@ -0,0 +1,16 @@ +/* @preserve + _____ __ _ __ _ + / ___// /(_)___/ /___ ____ (_)___ + / (_ // // // _ // -_)/ __/_ / /(_-< + \___//_//_/ \_,_/ \__//_/ (_)__/ //___/ + |___/ + + Version: 1.7.4 + Author: Nick Piscitelli (pickykneee) + Website: https://nickpiscitelli.com + Documentation: http://nickpiscitelli.github.io/Glider.js + License: MIT License + Release Date: October 25th, 2018 + +*/ +!function(e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e():e()}(function(){var a="undefined"!=typeof window?window:this,e=a.Glider=function(e,t){var o=this;if(e._glider)return e._glider;if(o.ele=e,o.ele.classList.add("glider"),(o.ele._glider=o).opt=Object.assign({},{slidesToScroll:1,slidesToShow:1,resizeLock:!0,duration:.5,easing:function(e,t,o,i,r){return i*(t/=r)*t+o}},t),o.animate_id=o.page=o.slide=o.scrollLeft=0,o.arrows={},o._opt=o.opt,o.opt.skipTrack)o.track=o.ele.children[0];else for(o.track=document.createElement("div"),o.ele.appendChild(o.track);1!==o.ele.children.length;)o.track.appendChild(o.ele.children[0]);o.track.classList.add("glider-track"),o.init(),o.resize=o.init.bind(o,!0),o.event(o.ele,"add",{scroll:o.updateControls.bind(o)}),o.event(a,"add",{resize:o.resize})},t=e.prototype;return t.init=function(e,t){var o=this,i=0,r=0;o.slides=o.track.children,[].forEach.call(o.slides,function(e,t){e.classList.add("glider-slide"),e.setAttribute("data-gslide",t)}),o.containerWidth=o.ele.clientWidth;var s=o.settingsBreakpoint();if(t=t||s,"auto"===o.opt.slidesToShow||void 0!==o.opt._autoSlide){var l=o.containerWidth/o.opt.itemWidth;o.opt._autoSlide=o.opt.slidesToShow=o.opt.exactWidth?l:Math.floor(l)}"auto"===o.opt.slidesToScroll&&(o.opt.slidesToScroll=Math.floor(o.opt.slidesToShow)),o.itemWidth=o.opt.exactWidth?o.opt.itemWidth:o.containerWidth/o.opt.slidesToShow,[].forEach.call(o.slides,function(e){e.style.height="auto",e.style.width=o.itemWidth+"px",i+=o.itemWidth,r=Math.max(e.offsetHeight,r)}),o.track.style.width=i+"px",o.trackWidth=i,o.isDrag=!1,o.preventClick=!1,o.opt.resizeLock&&o.scrollTo(o.slide*o.itemWidth,0),(s||t)&&(o.bindArrows(),o.buildDots(),o.bindDrag()),o.updateControls(),o.emit(e?"refresh":"loaded")},t.bindDrag=function(){var t=this;t.mouse=t.mouse||t.handleMouse.bind(t);function e(){t.mouseDown=void 0,t.ele.classList.remove("drag"),t.isDrag&&(t.preventClick=!0),t.isDrag=!1}var o={mouseup:e,mouseleave:e,mousedown:function(e){e.preventDefault(),e.stopPropagation(),t.mouseDown=e.clientX,t.ele.classList.add("drag")},mousemove:t.mouse,click:function(e){t.preventClick&&(e.preventDefault(),e.stopPropagation()),t.preventClick=!1}};t.ele.classList.toggle("draggable",!0===t.opt.draggable),t.event(t.ele,"remove",o),t.opt.draggable&&t.event(t.ele,"add",o)},t.buildDots=function(){var e=this;if(e.opt.dots){if("string"==typeof e.opt.dots?e.dots=document.querySelector(e.opt.dots):e.dots=e.opt.dots,e.dots){e.dots.innerHTML="",e.dots.classList.add("glider-dots");for(var t=0;t=d.trackWidth;d.opt.rewind||(d.arrows.prev&&(d.arrows.prev.classList.toggle("disabled",d.ele.scrollLeft<=0||t),d.arrows.prev.classList.contains("disabled")?d.arrows.prev.setAttribute("aria-disabled",!0):d.arrows.prev.setAttribute("aria-disabled",!1)),d.arrows.next&&(d.arrows.next.classList.toggle("disabled",Math.ceil(d.scrollLeft+d.containerWidth)>=Math.floor(d.trackWidth)||t),d.arrows.next.classList.contains("disabled")?d.arrows.next.setAttribute("aria-disabled",!0):d.arrows.next.setAttribute("aria-disabled",!1))),d.slide=Math.round(d.scrollLeft/d.itemWidth),d.page=Math.round(d.scrollLeft/d.containerWidth);var c=d.slide+Math.floor(Math.floor(d.opt.slidesToShow)/2),h=Math.floor(d.opt.slidesToShow)%2?0:c+1;1===Math.floor(d.opt.slidesToShow)&&(h=0),d.scrollLeft+d.containerWidth>=Math.floor(d.trackWidth)&&(d.page=d.dots?d.dots.children.length-1:0),[].forEach.call(d.slides,function(e,t){var o=e.classList,i=o.contains("visible"),r=d.scrollLeft,s=d.scrollLeft+d.containerWidth,l=d.itemWidth*t,n=l+d.itemWidth;[].forEach.call(o,function(e){/^left|right/.test(e)&&o.remove(e)}),o.toggle("active",d.slide===t),c===t||h&&h===t?o.add("center"):(o.remove("center"),o.add([t=Math.floor(r)&&Math.floor(n)<=Math.ceil(s);o.toggle("visible",a),a!==i&&d.emit("slide-"+(a?"visible":"hidden"),{slide:t})}),d.dots&&[].forEach.call(d.dots.children,function(e,t){e.classList.toggle("active",d.page===t)}),e&&d.opt.scrollLock&&(clearTimeout(d.scrollLock),d.scrollLock=setTimeout(function(){clearTimeout(d.scrollLock),.02d.containerWidth+d.ele.scrollLeft&&d.scrollItem(d.getCurrentSlide()))},d.opt.scrollLockDelay||250))},t.getCurrentSlide=function(){var e=this;return e.round(e.ele.scrollLeft/e.itemWidth)},t.scrollItem=function(e,t,o){o&&o.preventDefault();var i=this,r=e;if(++i.animate_id,!0===t)e*=i.containerWidth,e=Math.round(e/i.itemWidth)*i.itemWidth;else{if("string"==typeof e){var s="prev"===e;if(e=i.opt.slidesToScroll%1||i.opt.slidesToShow%1?i.getCurrentSlide():i.slide,s?e-=i.opt.slidesToScroll:e+=i.opt.slidesToScroll,i.opt.rewind){var l=i.ele.scrollLeft;e=s&&!l?i.slides.length:!s&&l+i.containerWidth>=Math.floor(i.trackWidth)?0:e}}e=Math.max(Math.min(e,i.slides.length),0),i.slide=e,e=i.itemWidth*e}return i.scrollTo(e,i.opt.duration*Math.abs(i.ele.scrollLeft-e),function(){i.updateControls(),i.emit("animated",{value:r,type:"string"==typeof r?"arrow":t?"dot":"slide"})}),!1},t.settingsBreakpoint=function(){var e=this,t=e._opt.responsive;if(t){t.sort(function(e,t){return t.breakpoint-e.breakpoint});for(var o=0;o=i.breakpoint)return e.breakpoint!==i.breakpoint&&(e.opt=Object.assign({},e._opt,i.settings),e.breakpoint=i.breakpoint,!0)}}var r=0!==e.breakpoint;return e.opt=Object.assign({},e._opt),e.breakpoint=0,r},t.scrollTo=function(t,o,i){var r=this,s=(new Date).getTime(),l=r.animate_id,n=function(){var e=(new Date).getTime()-s;r.scrollLeft=r.scrollLeft+(t-r.scrollLeft)*r.opt.easing(0,e,0,1,o),r.ele.scrollLeft=r.scrollLeft,e