xref: /template/strap/ComboStrap/Position.php (revision 82a60d039cd81033dc8147c27f0a50716b7a5301)
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