Files
idpan.poznan.pl/plugins/system/nrframework/NRFramework/Helpers/Controls/Responsive.php
2026-02-08 21:16:11 +01:00

128 lines
2.7 KiB
PHP

<?php
/**
* @author Tassos Marinos <info@tassos.gr>
* @link http://www.tassos.gr
* @copyright Copyright © 2022 Tassos Marinos All Rights Reserved
* @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later
*/
namespace NRFramework\Helpers\Controls;
defined('_JEXEC') or die;
class Responsive
{
/**
* Responsive breakpoints
*
* @var array
*/
public static $breakpoints = [
'desktop',
'tablet',
'mobile'
];
/**
* Given a responsive value, we prepare its CSS for each breakpoint.
*
* @param array $value
* @param string $prefix
* @param string $unit
*
* @return mixed
*/
public static function getResponsiveControlValue($value, $prefix = '', $unit = '')
{
if (!is_string($unit))
{
return;
}
if (!is_string($prefix) || empty($prefix))
{
return;
}
if (is_string($value) && $value === '')
{
return;
}
if (!$value)
{
return;
}
if (!is_array($value))
{
$value = self::prepareResponsiveControlValue($value);
}
$css = [];
foreach ($value as $breakpoint => $_value)
{
if ($_value === '' || is_null($_value))
{
continue;
}
$css[$breakpoint] = $_value;
}
if (empty($css))
{
return;
}
/**
* All values are duplicates, return the current breakpoint value.
*
* if given [5, 5, 5, 5] to print the margin in pixels, do not return `margin: 5px 5px 5px 5px`.
* Rather return `margin: 5px`
*/
if (count(array_unique($css)) === 1)
{
$first_element = reset($css);
if (is_array($first_element) || is_object($first_element))
{
return;
}
return [key($css) => $prefix . ': ' . $first_element . $unit . ';'];
}
// add unit suffix
$css = preg_filter('/^/', $prefix . ': ', $css);
$css = preg_filter('/$/', $unit . ';', $css);
return $css;
}
/**
* Prepares the value
*
* @param mixed $value
*
* @return array
*/
public static function prepareResponsiveControlValue($value)
{
if (!$value)
{
return;
}
if (!is_array($value))
{
return [
'desktop' => $value
];
}
return $value;
}
}