xref: /plugin/combo/ComboStrap/Breakpoint.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1*04fd306cSNickeau<?php
2*04fd306cSNickeau
3*04fd306cSNickeaunamespace ComboStrap;
4*04fd306cSNickeau
5*04fd306cSNickeau
6*04fd306cSNickeau
7*04fd306cSNickeauclass Breakpoint
8*04fd306cSNickeau{
9*04fd306cSNickeau
10*04fd306cSNickeau
11*04fd306cSNickeau    /**
12*04fd306cSNickeau     *
13*04fd306cSNickeau     * When the container query are a thing, we may change the breakpoint
14*04fd306cSNickeau     * https://twitter.com/addyosmani/status/1524039090655481857
15*04fd306cSNickeau     * https://groups.google.com/a/chromium.org/g/blink-dev/c/gwzxnTJDLJ8
16*04fd306cSNickeau     *
17*04fd306cSNickeau     */
18*04fd306cSNickeau    private const BREAKPOINTS_TO_PIXELS = array(
19*04fd306cSNickeau        self::XS => 375,
20*04fd306cSNickeau        self::SM => 576,
21*04fd306cSNickeau        self::MD => 768,
22*04fd306cSNickeau        self::LG => 992,
23*04fd306cSNickeau        self::XL => 1200,
24*04fd306cSNickeau        self::XXL => 1400
25*04fd306cSNickeau    );
26*04fd306cSNickeau
27*04fd306cSNickeau    public const BREAKPOINTS_LONG_TO_SHORT_NAMES = array(
28*04fd306cSNickeau        self::EXTRA_SMALL_NAME => self::XS,
29*04fd306cSNickeau        self::BREAKPOINT_SMALL_NAME => self::SM,
30*04fd306cSNickeau        self::BREAKPOINT_MEDIUM_NAME => self::MD,
31*04fd306cSNickeau        self::BREAKPOINT_LARGE_NAME => self::LG,
32*04fd306cSNickeau        self::BREAKPOINT_EXTRA_LARGE_NAME => self::XL,
33*04fd306cSNickeau        self::EXTRA_EXTRA_LARGE_NAME => self::XXL,
34*04fd306cSNickeau        self::NEVER_NAME => self::FLUID
35*04fd306cSNickeau    );
36*04fd306cSNickeau    public const BREAKPOINT_EXTRA_LARGE_NAME = "extra-large";
37*04fd306cSNickeau    public const BREAKPOINT_LARGE_NAME = "large";
38*04fd306cSNickeau    public const BREAKPOINT_SMALL_NAME = "small";
39*04fd306cSNickeau    public const BREAKPOINT_MEDIUM_NAME = "medium";
40*04fd306cSNickeau    /**
41*04fd306cSNickeau     * Breakpoint naming
42*04fd306cSNickeau     */
43*04fd306cSNickeau    public const EXTRA_SMALL_NAME = "extra-small";
44*04fd306cSNickeau    public const NEVER_NAME = "never";
45*04fd306cSNickeau    public const EXTRA_EXTRA_LARGE_NAME = "extra-extra-large";
46*04fd306cSNickeau    public const MD = "md";
47*04fd306cSNickeau    const LG = "lg";
48*04fd306cSNickeau    const XL = "xl";
49*04fd306cSNickeau    const XXL = "xxl";
50*04fd306cSNickeau    const FLUID = "fluid";
51*04fd306cSNickeau    const SM = "sm";
52*04fd306cSNickeau    const XS = "xs";
53*04fd306cSNickeau
54*04fd306cSNickeau    private string $shortBreakpointName;
55*04fd306cSNickeau
56*04fd306cSNickeau    public function __construct(string $shortBreakpointName)
57*04fd306cSNickeau    {
58*04fd306cSNickeau        $this->shortBreakpointName = $shortBreakpointName;
59*04fd306cSNickeau    }
60*04fd306cSNickeau
61*04fd306cSNickeau
62*04fd306cSNickeau    /**
63*04fd306cSNickeau     * @param $name - the short name, the name used by bootstrap
64*04fd306cSNickeau     * @return Breakpoint
65*04fd306cSNickeau     */
66*04fd306cSNickeau    public static function createFromShortName($name): Breakpoint
67*04fd306cSNickeau    {
68*04fd306cSNickeau        return new Breakpoint($name);
69*04fd306cSNickeau    }
70*04fd306cSNickeau
71*04fd306cSNickeau    public static function createFromLongName($longName): Breakpoint
72*04fd306cSNickeau    {
73*04fd306cSNickeau        $breakpointShortName = self::BREAKPOINTS_LONG_TO_SHORT_NAMES[$longName];
74*04fd306cSNickeau        if ($breakpointShortName === null) {
75*04fd306cSNickeau            LogUtility::internalError("The breakpoint name ($longName) is unknown, defaulting to md");
76*04fd306cSNickeau            $breakpointShortName = "md";
77*04fd306cSNickeau        }
78*04fd306cSNickeau        return new Breakpoint($breakpointShortName);
79*04fd306cSNickeau    }
80*04fd306cSNickeau
81*04fd306cSNickeau    /**
82*04fd306cSNickeau     * @return Breakpoint[];
83*04fd306cSNickeau     */
84*04fd306cSNickeau    public static function getBreakpoints(): array
85*04fd306cSNickeau    {
86*04fd306cSNickeau        $breakpoints = [];
87*04fd306cSNickeau        foreach (array_keys(self::BREAKPOINTS_TO_PIXELS) as $shortName) {
88*04fd306cSNickeau            $breakpoints[] = Breakpoint::createFromShortName($shortName);
89*04fd306cSNickeau        }
90*04fd306cSNickeau        $breakpoints[] = Breakpoint::createFromShortName(self::FLUID);
91*04fd306cSNickeau        return $breakpoints;
92*04fd306cSNickeau    }
93*04fd306cSNickeau
94*04fd306cSNickeau    /**
95*04fd306cSNickeau     * @throws ExceptionInfinite
96*04fd306cSNickeau     */
97*04fd306cSNickeau    public function getWidth(): int
98*04fd306cSNickeau    {
99*04fd306cSNickeau        if (in_array($this->shortBreakpointName, [Breakpoint::NEVER_NAME, Breakpoint::FLUID])) {
100*04fd306cSNickeau            // 100% on all viewport
101*04fd306cSNickeau            // infinite with
102*04fd306cSNickeau            throw new ExceptionInfinite();
103*04fd306cSNickeau        }
104*04fd306cSNickeau        $value = self::BREAKPOINTS_TO_PIXELS[$this->shortBreakpointName];
105*04fd306cSNickeau        if ($value !== null) {
106*04fd306cSNickeau            return $value;
107*04fd306cSNickeau        }
108*04fd306cSNickeau        LogUtility::internalError("The breakpoint short name ($this->shortBreakpointName) is unknown, defaulting to md");
109*04fd306cSNickeau        return 768;
110*04fd306cSNickeau    }
111*04fd306cSNickeau
112*04fd306cSNickeau    public function getShortName(): string
113*04fd306cSNickeau    {
114*04fd306cSNickeau        return $this->shortBreakpointName;
115*04fd306cSNickeau    }
116*04fd306cSNickeau
117*04fd306cSNickeau    public function __toString()
118*04fd306cSNickeau    {
119*04fd306cSNickeau        return $this->shortBreakpointName;
120*04fd306cSNickeau    }
121*04fd306cSNickeau
122*04fd306cSNickeau
123*04fd306cSNickeau}
124