137748cd8SNickeau<?php 237748cd8SNickeau/** 337748cd8SNickeau * Copyright (c) 2021. ComboStrap, Inc. and its affiliates. All Rights Reserved. 437748cd8SNickeau * 537748cd8SNickeau * This source code is licensed under the GPL license found in the 637748cd8SNickeau * COPYING file in the root directory of this source tree. 737748cd8SNickeau * 837748cd8SNickeau * @license GPL 3 (https://www.gnu.org/licenses/gpl-3.0.en.html) 937748cd8SNickeau * @author ComboStrap <support@combostrap.com> 1037748cd8SNickeau * 1137748cd8SNickeau */ 1237748cd8SNickeau 1337748cd8SNickeaunamespace ComboStrap; 1437748cd8SNickeau 1537748cd8SNickeau/** 1637748cd8SNickeau * Class Sticky 1737748cd8SNickeau * Manage the stickiness of component 1837748cd8SNickeau * with https://sticksy.js.org/ 1937748cd8SNickeau * @package ComboStrap 2037748cd8SNickeau */ 2137748cd8SNickeauclass Position 2237748cd8SNickeau{ 2337748cd8SNickeau const STICKY_ATTRIBUTE = "sticky"; 2437748cd8SNickeau const STICKY = "sticky"; 2537748cd8SNickeau const STICKY_CLASS = "combo-sticky"; 2637748cd8SNickeau 2737748cd8SNickeau const POSITION_ATTRIBUTE = "position"; 2837748cd8SNickeau const POSITION_SNIPPET_ID = "position"; 2937748cd8SNickeau const POSITION_QUARTILE_SNIPPET_ID = "position-quartile"; 3037748cd8SNickeau 3137748cd8SNickeau /** 3237748cd8SNickeau * Process stickiness 3337748cd8SNickeau * @param TagAttributes $attributes 3437748cd8SNickeau */ 3537748cd8SNickeau public static function processStickiness(&$attributes) 3637748cd8SNickeau { 3737748cd8SNickeau if ($attributes->hasComponentAttribute(self::STICKY_ATTRIBUTE)) { 3837748cd8SNickeau $sticky = strtolower($attributes->getValueAndRemove(self::STICKY_ATTRIBUTE)); 3937748cd8SNickeau if ($sticky == "true") { 4037748cd8SNickeau $stickyClass = self::STICKY_CLASS; 4137748cd8SNickeau $attributes->addClassName($stickyClass); 4237748cd8SNickeau $snippetManager = PluginUtility::getSnippetManager(); 43*04fd306cSNickeau $snippetManager->attachRemoteJavascriptLibrary( 444cadd4f8SNickeau self::STICKY, 454cadd4f8SNickeau "https://cdn.jsdelivr.net/npm/sticksy@0.2.0/dist/sticksy.min.js", 464cadd4f8SNickeau "sha256-H6uQ878/jyt6w1oBNhL6s01iAfWxACrWvVXCBjZsrGM=" 474cadd4f8SNickeau ); 4837748cd8SNickeau /** 4937748cd8SNickeau * If top bar 5037748cd8SNickeau */ 5137748cd8SNickeau $jsSnippet = <<<EOF 5237748cd8SNickeaulet fixedNavbar = document.querySelector(".navbar.fixed-top"); 5337748cd8SNickeaulet topSpacing = fixedNavbar.offsetHeight; 5437748cd8SNickeauvar stickyElements = Sticksy.initializeAll('.$stickyClass',{topSpacing: topSpacing}) 5537748cd8SNickeauEOF; 5637748cd8SNickeau $snippetManager 57*04fd306cSNickeau ->attachJavascriptFromComponentId(self::STICKY) 584cadd4f8SNickeau ->setInlineContent($jsSnippet); 5937748cd8SNickeau } 6037748cd8SNickeau 6137748cd8SNickeau } 6237748cd8SNickeau 6337748cd8SNickeau } 6437748cd8SNickeau 6537748cd8SNickeau /** 6637748cd8SNickeau * @param TagAttributes $attributes 6737748cd8SNickeau */ 684cadd4f8SNickeau public static function processPosition(TagAttributes &$attributes) 6937748cd8SNickeau { 7037748cd8SNickeau if ($attributes->hasComponentAttribute(self::POSITION_ATTRIBUTE)) { 7137748cd8SNickeau $position = strtolower($attributes->getValueAndRemove(self::POSITION_ATTRIBUTE)); 7237748cd8SNickeau if (Bootstrap::getBootStrapMajorVersion() < Bootstrap::BootStrapFiveMajorVersion) { 7337748cd8SNickeau $snippetManager = PluginUtility::getSnippetManager(); 74*04fd306cSNickeau $snippetManager->attachCssInternalStyleSheet(self::POSITION_SNIPPET_ID); 7537748cd8SNickeau } 7637748cd8SNickeau 7737748cd8SNickeau // Class value comes from 7837748cd8SNickeau // https://getbootstrap.com/docs/5.0/utilities/position/#center-elements 7937748cd8SNickeau switch ($position) { 8037748cd8SNickeau case "top-left": 8137748cd8SNickeau case "left-top": 8237748cd8SNickeau $attributes->addClassName("position-absolute top-0 start-0 translate-middle"); 8337748cd8SNickeau break; 8437748cd8SNickeau case "top-quartile-1": 8537748cd8SNickeau case "quartile-1-top": 8637748cd8SNickeau self::addQuartileCss(); 8737748cd8SNickeau $attributes->addClassName("position-absolute top-0 start-25 translate-middle"); 8837748cd8SNickeau break; 8937748cd8SNickeau case "top-center": 9037748cd8SNickeau case "center-top": 9137748cd8SNickeau $attributes->addClassName("position-absolute top-0 start-50 translate-middle"); 9237748cd8SNickeau break; 9337748cd8SNickeau case "top-quartile-3": 9437748cd8SNickeau case "quartile-3-top": 9537748cd8SNickeau self::addQuartileCss(); 9637748cd8SNickeau $attributes->addClassName("position-absolute top-0 start-75 translate-middle"); 9737748cd8SNickeau break; 9837748cd8SNickeau case "top-right": 9937748cd8SNickeau case "right-top": 10037748cd8SNickeau $attributes->addClassName("position-absolute top-0 start-100 translate-middle"); 10137748cd8SNickeau break; 10237748cd8SNickeau case "left-quartile-1": 10337748cd8SNickeau case "quartile-1-left": 10437748cd8SNickeau self::addQuartileCss(); 10537748cd8SNickeau $attributes->addClassName("position-absolute top-25 start-0 translate-middle"); 10637748cd8SNickeau break; 10737748cd8SNickeau case "left-center": 10837748cd8SNickeau case "center-left": 10937748cd8SNickeau $attributes->addClassName("position-absolute top-50 start-0 translate-middle"); 11037748cd8SNickeau break; 11137748cd8SNickeau case "center-center": 11237748cd8SNickeau case "center": 11337748cd8SNickeau $attributes->addClassName("position-absolute top-50 start-50 translate-middle"); 11437748cd8SNickeau break; 11537748cd8SNickeau case "right-center": 11637748cd8SNickeau case "center-right": 11737748cd8SNickeau $attributes->addClassName("position-absolute top-50 start-100 translate-middle"); 11837748cd8SNickeau break; 11937748cd8SNickeau case "bottom-left": 12037748cd8SNickeau case "left-bottom": 12137748cd8SNickeau $attributes->addClassName("position-absolute top-100 start-0 translate-middle"); 12237748cd8SNickeau break; 12337748cd8SNickeau case "bottom-center": 12437748cd8SNickeau case "center-bottom": 12537748cd8SNickeau $attributes->addClassName("position-absolute top-100 start-50 translate-middle"); 12637748cd8SNickeau break; 12737748cd8SNickeau case "bottom-right": 12837748cd8SNickeau case "right-bottom": 12937748cd8SNickeau $attributes->addClassName("position-absolute top-100 start-100 translate-middle"); 13037748cd8SNickeau break; 13137748cd8SNickeau case "relative": 13237748cd8SNickeau case "absolute": 13337748cd8SNickeau case "fixed": 13437748cd8SNickeau case "static": 13537748cd8SNickeau /** 13637748cd8SNickeau * The css value are also supported 13737748cd8SNickeau * (to define that for instance the parent of a background should be at minimum relative) 13837748cd8SNickeau */ 13982a60d03SNickeau $attributes->addStyleDeclarationIfNotSet("position", $position); 14037748cd8SNickeau break; 14137748cd8SNickeau 14237748cd8SNickeau } 14337748cd8SNickeau } 14437748cd8SNickeau 14537748cd8SNickeau } 14637748cd8SNickeau 14737748cd8SNickeau private static function addQuartileCss() 14837748cd8SNickeau { 14937748cd8SNickeau $snippetManager = PluginUtility::getSnippetManager(); 150*04fd306cSNickeau $snippetManager->attachCssInternalStyleSheet(self::POSITION_QUARTILE_SNIPPET_ID); 15137748cd8SNickeau } 15237748cd8SNickeau} 153