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

229 lines
5.5 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 Spacing
{
/**
* Default Spacing Control Positions.
*
* @var array
*/
protected static $spacing_positions = ['top', 'right', 'bottom', 'left'];
/**
* Returns the CSS of the spacing control.
*
* @param array $value
* @param string $prefix
* @param string $breakpoint
* @param string $unit
*
* @return string
*/
public static function getResponsiveSpacingControlValue($value, $prefix = '', $unit = '', $breakpoint = '')
{
$value = self::prepareSpacingControlValue($value, 'desktop');
if (is_null($value))
{
return;
}
// Return the value for a specific breakpoint
if (!empty($breakpoint) && is_string($breakpoint))
{
if (!isset($value[$breakpoint]))
{
return;
}
if (!is_array($value[$breakpoint]) && (string) $value[$breakpoint] !== '0')
{
return;
}
return $prefix . ': ' . self::getSpacingValue($value[$breakpoint], $unit) . ';';
}
// Return the value for all breakpoints
$css = [];
foreach ($value as $_breakpoint => $values)
{
// remove linked property
if (isset($values['linked']))
{
unset($values['linked']);
}
if (!$value = self::getSpacingValue($values, $unit))
{
continue;
}
$css[$_breakpoint] = $prefix . ': ' . $value . ';';
}
return $css;
}
/**
* Prepares the value
*
* @param mixed $value
* @param string $breakpoint
*
* @return array
*/
public static function prepareSpacingControlValue($value, $breakpoint = 'desktop')
{
if (is_null($value))
{
return;
}
if (!is_array($value))
{
$new_value = [];
foreach (static::$spacing_positions as $pos)
{
$new_value[$pos] = $value;
}
if (!empty($breakpoint) && is_string($breakpoint))
{
return [
$breakpoint => $new_value
];
}
else
{
return $new_value;
}
}
// If no breakpoint exists in the given value, set it to the given $breakpoint.
if ((!isset($value['desktop']) && !isset($value['tablet']) && !isset($value['mobile'])) && ($breakpoint && !isset($value[$breakpoint])))
{
return [$breakpoint => $value];
}
return $value;
}
/**
* Returns the value of a spacing control (margin, padding).
*
* @param array $value
* @param string $unit
*
* @return string
*/
public static function getSpacingValue($value, $unit = '')
{
if (!is_string($unit))
{
return;
}
if (is_string($value) && $value === '')
{
return;
}
if (!$value || !is_array($value))
{
$value = self::prepareSpacingControlValue($value, false);
}
// If its a multi-dimensional array, return
if (count($value) !== count($value, COUNT_RECURSIVE))
{
return;
}
try {
// If all values are empty, return
if (empty(array_filter($value, 'strlen')))
{
return;
}
}
catch (\Exception $ex)
{
return;
}
$return = [];
foreach (static::$spacing_positions as $pos)
{
$return[$pos] = isset($value[$pos]) && $value[$pos] !== '' ? $value[$pos] : 0;
}
if (empty($return))
{
return;
}
/**
* All values are duplicates, return only 1 number with their unit.
*
* Example: 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($return)) === 1)
{
$value = reset($return);
$suffix = \NRFramework\Functions::endsWith($value, $unit) ? '' : $unit;
return $value . $suffix;
}
// add unit suffix if needed
$data = [];
foreach ($return as $key => $value)
{
$suffix = \NRFramework\Functions::endsWith($value, $unit) ? '' : $unit;
$data[] = $value . $suffix;
}
return implode(' ', $data);
}
/**
* Checks whether the spacing value is empty.
*
* @param array $value
*
* @return boolean
*/
public static function isEmpty($value)
{
if (!is_array($value))
{
return false;
}
foreach (static::$spacing_positions as $pos)
{
if (!isset($value[$pos]) || (empty($value[$pos]) && (string) $value[$pos] !== '0'))
{
continue;
}
return false;
}
return true;
}
}