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