1*37748cd8SNickeau<?php 2*37748cd8SNickeau/** 3*37748cd8SNickeau * Copyright (c) 2021. ComboStrap, Inc. and its affiliates. All Rights Reserved. 4*37748cd8SNickeau * 5*37748cd8SNickeau * This source code is licensed under the GPL license found in the 6*37748cd8SNickeau * COPYING file in the root directory of this source tree. 7*37748cd8SNickeau * 8*37748cd8SNickeau * @license GPL 3 (https://www.gnu.org/licenses/gpl-3.0.en.html) 9*37748cd8SNickeau * @author ComboStrap <support@combostrap.com> 10*37748cd8SNickeau * 11*37748cd8SNickeau */ 12*37748cd8SNickeau 13*37748cd8SNickeaunamespace ComboStrap; 14*37748cd8SNickeau 15*37748cd8SNickeau/** 16*37748cd8SNickeau * Class Sticky 17*37748cd8SNickeau * Manage the stickiness of component 18*37748cd8SNickeau * with https://sticksy.js.org/ 19*37748cd8SNickeau * @package ComboStrap 20*37748cd8SNickeau */ 21*37748cd8SNickeauclass Position 22*37748cd8SNickeau{ 23*37748cd8SNickeau const STICKY_ATTRIBUTE = "sticky"; 24*37748cd8SNickeau const STICKY = "sticky"; 25*37748cd8SNickeau const STICKY_CLASS = "combo-sticky"; 26*37748cd8SNickeau 27*37748cd8SNickeau const POSITION_ATTRIBUTE = "position"; 28*37748cd8SNickeau const POSITION_SNIPPET_ID = "position"; 29*37748cd8SNickeau const POSITION_QUARTILE_SNIPPET_ID = "position-quartile"; 30*37748cd8SNickeau 31*37748cd8SNickeau /** 32*37748cd8SNickeau * Process stickiness 33*37748cd8SNickeau * @param TagAttributes $attributes 34*37748cd8SNickeau */ 35*37748cd8SNickeau public static function processStickiness(&$attributes) 36*37748cd8SNickeau { 37*37748cd8SNickeau if ($attributes->hasComponentAttribute(self::STICKY_ATTRIBUTE)) { 38*37748cd8SNickeau $sticky = strtolower($attributes->getValueAndRemove(self::STICKY_ATTRIBUTE)); 39*37748cd8SNickeau if ($sticky == "true") { 40*37748cd8SNickeau $stickyClass = self::STICKY_CLASS; 41*37748cd8SNickeau $attributes->addClassName($stickyClass); 42*37748cd8SNickeau $snippetManager = PluginUtility::getSnippetManager(); 43*37748cd8SNickeau $snippetManager->upsertTagsForBar(self::STICKY, 44*37748cd8SNickeau array( 45*37748cd8SNickeau "script" => [ 46*37748cd8SNickeau array( 47*37748cd8SNickeau "src" => "https://cdn.jsdelivr.net/npm/sticksy@0.2.0/dist/sticksy.min.js", 48*37748cd8SNickeau "integrity" => "sha256-H6uQ878/jyt6w1oBNhL6s01iAfWxACrWvVXCBjZsrGM=", 49*37748cd8SNickeau "crossorigin" => "anonymous" 50*37748cd8SNickeau )] 51*37748cd8SNickeau )); 52*37748cd8SNickeau /** 53*37748cd8SNickeau * If top bar 54*37748cd8SNickeau */ 55*37748cd8SNickeau $jsSnippet = <<<EOF 56*37748cd8SNickeaulet fixedNavbar = document.querySelector(".navbar.fixed-top"); 57*37748cd8SNickeaulet topSpacing = fixedNavbar.offsetHeight; 58*37748cd8SNickeauvar stickyElements = Sticksy.initializeAll('.$stickyClass',{topSpacing: topSpacing}) 59*37748cd8SNickeauEOF; 60*37748cd8SNickeau $snippetManager 61*37748cd8SNickeau ->attachJavascriptSnippetForBar(self::STICKY) 62*37748cd8SNickeau ->setContent($jsSnippet); 63*37748cd8SNickeau } 64*37748cd8SNickeau 65*37748cd8SNickeau } 66*37748cd8SNickeau 67*37748cd8SNickeau } 68*37748cd8SNickeau 69*37748cd8SNickeau /** 70*37748cd8SNickeau * @param TagAttributes $attributes 71*37748cd8SNickeau */ 72*37748cd8SNickeau public static function processPosition(&$attributes) 73*37748cd8SNickeau { 74*37748cd8SNickeau if ($attributes->hasComponentAttribute(self::POSITION_ATTRIBUTE)) { 75*37748cd8SNickeau $position = strtolower($attributes->getValueAndRemove(self::POSITION_ATTRIBUTE)); 76*37748cd8SNickeau if (Bootstrap::getBootStrapMajorVersion() < Bootstrap::BootStrapFiveMajorVersion) { 77*37748cd8SNickeau $snippetManager = PluginUtility::getSnippetManager(); 78*37748cd8SNickeau $snippetManager->attachCssSnippetForBar(self::POSITION_SNIPPET_ID); 79*37748cd8SNickeau } 80*37748cd8SNickeau 81*37748cd8SNickeau // Class value comes from 82*37748cd8SNickeau // https://getbootstrap.com/docs/5.0/utilities/position/#center-elements 83*37748cd8SNickeau switch ($position) { 84*37748cd8SNickeau case "top-left": 85*37748cd8SNickeau case "left-top": 86*37748cd8SNickeau $attributes->addClassName("position-absolute top-0 start-0 translate-middle"); 87*37748cd8SNickeau break; 88*37748cd8SNickeau case "top-quartile-1": 89*37748cd8SNickeau case "quartile-1-top": 90*37748cd8SNickeau self::addQuartileCss(); 91*37748cd8SNickeau $attributes->addClassName("position-absolute top-0 start-25 translate-middle"); 92*37748cd8SNickeau break; 93*37748cd8SNickeau case "top-center": 94*37748cd8SNickeau case "center-top": 95*37748cd8SNickeau $attributes->addClassName("position-absolute top-0 start-50 translate-middle"); 96*37748cd8SNickeau break; 97*37748cd8SNickeau case "top-quartile-3": 98*37748cd8SNickeau case "quartile-3-top": 99*37748cd8SNickeau self::addQuartileCss(); 100*37748cd8SNickeau $attributes->addClassName("position-absolute top-0 start-75 translate-middle"); 101*37748cd8SNickeau break; 102*37748cd8SNickeau case "top-right": 103*37748cd8SNickeau case "right-top": 104*37748cd8SNickeau $attributes->addClassName("position-absolute top-0 start-100 translate-middle"); 105*37748cd8SNickeau break; 106*37748cd8SNickeau case "left-quartile-1": 107*37748cd8SNickeau case "quartile-1-left": 108*37748cd8SNickeau self::addQuartileCss(); 109*37748cd8SNickeau $attributes->addClassName("position-absolute top-25 start-0 translate-middle"); 110*37748cd8SNickeau break; 111*37748cd8SNickeau case "left-center": 112*37748cd8SNickeau case "center-left": 113*37748cd8SNickeau $attributes->addClassName("position-absolute top-50 start-0 translate-middle"); 114*37748cd8SNickeau break; 115*37748cd8SNickeau case "center-center": 116*37748cd8SNickeau case "center": 117*37748cd8SNickeau $attributes->addClassName("position-absolute top-50 start-50 translate-middle"); 118*37748cd8SNickeau break; 119*37748cd8SNickeau case "right-center": 120*37748cd8SNickeau case "center-right": 121*37748cd8SNickeau $attributes->addClassName("position-absolute top-50 start-100 translate-middle"); 122*37748cd8SNickeau break; 123*37748cd8SNickeau case "bottom-left": 124*37748cd8SNickeau case "left-bottom": 125*37748cd8SNickeau $attributes->addClassName("position-absolute top-100 start-0 translate-middle"); 126*37748cd8SNickeau break; 127*37748cd8SNickeau case "bottom-center": 128*37748cd8SNickeau case "center-bottom": 129*37748cd8SNickeau $attributes->addClassName("position-absolute top-100 start-50 translate-middle"); 130*37748cd8SNickeau break; 131*37748cd8SNickeau case "bottom-right": 132*37748cd8SNickeau case "right-bottom": 133*37748cd8SNickeau $attributes->addClassName("position-absolute top-100 start-100 translate-middle"); 134*37748cd8SNickeau break; 135*37748cd8SNickeau case "relative": 136*37748cd8SNickeau case "absolute": 137*37748cd8SNickeau case "fixed": 138*37748cd8SNickeau case "static": 139*37748cd8SNickeau /** 140*37748cd8SNickeau * The css value are also supported 141*37748cd8SNickeau * (to define that for instance the parent of a background should be at minimum relative) 142*37748cd8SNickeau */ 143*37748cd8SNickeau $attributes->addStyleDeclaration("position", $position); 144*37748cd8SNickeau break; 145*37748cd8SNickeau 146*37748cd8SNickeau } 147*37748cd8SNickeau } 148*37748cd8SNickeau 149*37748cd8SNickeau } 150*37748cd8SNickeau 151*37748cd8SNickeau private static function addQuartileCss() 152*37748cd8SNickeau { 153*37748cd8SNickeau $snippetManager = PluginUtility::getSnippetManager(); 154*37748cd8SNickeau $snippetManager->attachCssSnippetForBar(self::POSITION_QUARTILE_SNIPPET_ID); 155*37748cd8SNickeau } 156*37748cd8SNickeau} 157