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(); 4337748cd8SNickeau $snippetManager->upsertTagsForBar(self::STICKY, 4437748cd8SNickeau array( 4537748cd8SNickeau "script" => [ 4637748cd8SNickeau array( 4737748cd8SNickeau "src" => "https://cdn.jsdelivr.net/npm/sticksy@0.2.0/dist/sticksy.min.js", 4837748cd8SNickeau "integrity" => "sha256-H6uQ878/jyt6w1oBNhL6s01iAfWxACrWvVXCBjZsrGM=", 4937748cd8SNickeau "crossorigin" => "anonymous" 5037748cd8SNickeau )] 5137748cd8SNickeau )); 5237748cd8SNickeau /** 5337748cd8SNickeau * If top bar 5437748cd8SNickeau */ 5537748cd8SNickeau $jsSnippet = <<<EOF 5637748cd8SNickeaulet fixedNavbar = document.querySelector(".navbar.fixed-top"); 5737748cd8SNickeaulet topSpacing = fixedNavbar.offsetHeight; 5837748cd8SNickeauvar stickyElements = Sticksy.initializeAll('.$stickyClass',{topSpacing: topSpacing}) 5937748cd8SNickeauEOF; 6037748cd8SNickeau $snippetManager 6137748cd8SNickeau ->attachJavascriptSnippetForBar(self::STICKY) 6237748cd8SNickeau ->setContent($jsSnippet); 6337748cd8SNickeau } 6437748cd8SNickeau 6537748cd8SNickeau } 6637748cd8SNickeau 6737748cd8SNickeau } 6837748cd8SNickeau 6937748cd8SNickeau /** 7037748cd8SNickeau * @param TagAttributes $attributes 7137748cd8SNickeau */ 7237748cd8SNickeau public static function processPosition(&$attributes) 7337748cd8SNickeau { 7437748cd8SNickeau if ($attributes->hasComponentAttribute(self::POSITION_ATTRIBUTE)) { 7537748cd8SNickeau $position = strtolower($attributes->getValueAndRemove(self::POSITION_ATTRIBUTE)); 7637748cd8SNickeau if (Bootstrap::getBootStrapMajorVersion() < Bootstrap::BootStrapFiveMajorVersion) { 7737748cd8SNickeau $snippetManager = PluginUtility::getSnippetManager(); 7837748cd8SNickeau $snippetManager->attachCssSnippetForBar(self::POSITION_SNIPPET_ID); 7937748cd8SNickeau } 8037748cd8SNickeau 8137748cd8SNickeau // Class value comes from 8237748cd8SNickeau // https://getbootstrap.com/docs/5.0/utilities/position/#center-elements 8337748cd8SNickeau switch ($position) { 8437748cd8SNickeau case "top-left": 8537748cd8SNickeau case "left-top": 8637748cd8SNickeau $attributes->addClassName("position-absolute top-0 start-0 translate-middle"); 8737748cd8SNickeau break; 8837748cd8SNickeau case "top-quartile-1": 8937748cd8SNickeau case "quartile-1-top": 9037748cd8SNickeau self::addQuartileCss(); 9137748cd8SNickeau $attributes->addClassName("position-absolute top-0 start-25 translate-middle"); 9237748cd8SNickeau break; 9337748cd8SNickeau case "top-center": 9437748cd8SNickeau case "center-top": 9537748cd8SNickeau $attributes->addClassName("position-absolute top-0 start-50 translate-middle"); 9637748cd8SNickeau break; 9737748cd8SNickeau case "top-quartile-3": 9837748cd8SNickeau case "quartile-3-top": 9937748cd8SNickeau self::addQuartileCss(); 10037748cd8SNickeau $attributes->addClassName("position-absolute top-0 start-75 translate-middle"); 10137748cd8SNickeau break; 10237748cd8SNickeau case "top-right": 10337748cd8SNickeau case "right-top": 10437748cd8SNickeau $attributes->addClassName("position-absolute top-0 start-100 translate-middle"); 10537748cd8SNickeau break; 10637748cd8SNickeau case "left-quartile-1": 10737748cd8SNickeau case "quartile-1-left": 10837748cd8SNickeau self::addQuartileCss(); 10937748cd8SNickeau $attributes->addClassName("position-absolute top-25 start-0 translate-middle"); 11037748cd8SNickeau break; 11137748cd8SNickeau case "left-center": 11237748cd8SNickeau case "center-left": 11337748cd8SNickeau $attributes->addClassName("position-absolute top-50 start-0 translate-middle"); 11437748cd8SNickeau break; 11537748cd8SNickeau case "center-center": 11637748cd8SNickeau case "center": 11737748cd8SNickeau $attributes->addClassName("position-absolute top-50 start-50 translate-middle"); 11837748cd8SNickeau break; 11937748cd8SNickeau case "right-center": 12037748cd8SNickeau case "center-right": 12137748cd8SNickeau $attributes->addClassName("position-absolute top-50 start-100 translate-middle"); 12237748cd8SNickeau break; 12337748cd8SNickeau case "bottom-left": 12437748cd8SNickeau case "left-bottom": 12537748cd8SNickeau $attributes->addClassName("position-absolute top-100 start-0 translate-middle"); 12637748cd8SNickeau break; 12737748cd8SNickeau case "bottom-center": 12837748cd8SNickeau case "center-bottom": 12937748cd8SNickeau $attributes->addClassName("position-absolute top-100 start-50 translate-middle"); 13037748cd8SNickeau break; 13137748cd8SNickeau case "bottom-right": 13237748cd8SNickeau case "right-bottom": 13337748cd8SNickeau $attributes->addClassName("position-absolute top-100 start-100 translate-middle"); 13437748cd8SNickeau break; 13537748cd8SNickeau case "relative": 13637748cd8SNickeau case "absolute": 13737748cd8SNickeau case "fixed": 13837748cd8SNickeau case "static": 13937748cd8SNickeau /** 14037748cd8SNickeau * The css value are also supported 14137748cd8SNickeau * (to define that for instance the parent of a background should be at minimum relative) 14237748cd8SNickeau */ 143*82a60d03SNickeau $attributes->addStyleDeclarationIfNotSet("position", $position); 14437748cd8SNickeau break; 14537748cd8SNickeau 14637748cd8SNickeau } 14737748cd8SNickeau } 14837748cd8SNickeau 14937748cd8SNickeau } 15037748cd8SNickeau 15137748cd8SNickeau private static function addQuartileCss() 15237748cd8SNickeau { 15337748cd8SNickeau $snippetManager = PluginUtility::getSnippetManager(); 15437748cd8SNickeau $snippetManager->attachCssSnippetForBar(self::POSITION_QUARTILE_SNIPPET_ID); 15537748cd8SNickeau } 15637748cd8SNickeau} 157