xref: /plugin/combo/ComboStrap/Position.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
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