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