v1.php 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. <?php
  2. namespace zin;
  3. class icon extends wg
  4. {
  5. /**
  6. * @var mixed[]
  7. */
  8. protected static $defineProps = array(
  9. 'name: string',
  10. 'size?: string|int'
  11. );
  12. public function onAddChild($child)
  13. {
  14. if(is_string($child) && !$this->props->has('name'))
  15. {
  16. $this->props->set('name', $child);
  17. return false;
  18. }
  19. }
  20. protected function build()
  21. {
  22. list($name, $size) = $this->prop(array('name', 'size'));
  23. if(!empty($name) && !str_starts_with($name, 'icon-')) $name = "icon-$name";
  24. return h::i
  25. (
  26. empty($name) ? null : setClass('icon', $name),
  27. is_numeric($size)
  28. ? setStyle('font-size', "{$size}px")
  29. : (is_string($size)
  30. ? setClass("icon-$size")
  31. : null),
  32. set($this->props->skip(array_keys(icon::definedPropsList()))),
  33. $this->children()
  34. );
  35. }
  36. /**
  37. * @param string|mixed[] $nameOrProps
  38. * @param mixed ...$children
  39. * @return $this
  40. * @param mixed[]|null $props
  41. */
  42. public static function create($nameOrProps, $props = null, ...$children)
  43. {
  44. $props = $props ? $props : array();
  45. if(is_string($nameOrProps))
  46. {
  47. $props['name'] = $nameOrProps;
  48. }
  49. else
  50. {
  51. $props = array_merge($nameOrProps, $props);
  52. }
  53. return new static(set($props), ...$children);
  54. }
  55. }