WebOrbiton
v1.0.3

PriviMetrics 2

67 lines · 3.0 KB
  1. <?php
  2. ​
  3. declare(strict_types=1);
  4. ​
  5. function fontOptions(string $group = ''): array
  6. {
  7. return [
  8. 'space-grotesk' => ['label' => 'Space Grotesk', 'family' => "'Space Grotesk'", 'file' => 'SpaceGrotesk.ttf', 'fallback' => 'sans-serif'],
  9. 'space-grotesk-qwantium' => ['label' => 'Space Grotesk Qwantium', 'family' => "'Space Grotesk Qwantium'", 'file' => 'SpaceGroteskQu.ttf', 'fallback' => 'sans-serif'],
  10. 'museomoderno' => ['label' => 'MuseoModerno', 'family' => "'MuseoModerno'", 'file' => 'MuseoModerno.ttf', 'fallback' => 'sans-serif'],
  11. 'kumar-one-outline' => ['label' => 'Kumar One Outline', 'family' => "'Kumar One Outline'", 'file' => 'KumarOne.ttf', 'fallback' => 'sans-serif'],
  12. 'inter' => ['label' => 'Inter', 'family' => "'Inter'", 'file' => 'Inter.ttf', 'fallback' => 'sans-serif'],
  13. 'ibm-plex-sans' => ['label' => 'IBM Plex Sans', 'family' => "'IBM Plex Sans'", 'file' => 'IBMPlexSans.ttf', 'fallback' => 'sans-serif'],
  14. 'poppins' => ['label' => 'Poppins', 'family' => "'Poppins'", 'file' => 'Poppins.ttf', 'fallback' => 'sans-serif'],
  15. 'unbounded' => ['label' => 'Unbounded', 'family' => "'Unbounded'", 'file' => 'Unbounded.ttf', 'fallback' => 'sans-serif'],
  16. 'orbit' => ['label' => 'Orbit', 'family' => "'Orbit'", 'file' => 'Orbit.ttf', 'fallback' => 'sans-serif'],
  17. 'righteous' => ['label' => 'Righteous', 'family' => "'Righteous'", 'file' => 'Righteous.ttf', 'fallback' => 'sans-serif'],
  18. 'jetbrains-mono' => ['label' => 'JetBrains Mono', 'family' => "'JetBrains Mono'", 'file' => 'JetBrainsMono.ttf', 'fallback' => 'monospace'],
  19. 'system' => ['label' => 'System default', 'family' => '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto', 'file' => '', 'fallback' => 'sans-serif'],
  20. ];
  21. }
  22. ​
  23. function fontDefaultSlug(string $group): string
  24. {
  25. return match ($group) {
  26. 'body' => 'space-grotesk-qwantium',
  27. 'heading' => 'orbit',
  28. 'value' => 'kumar-one-outline',
  29. default => 'system',
  30. };
  31. }
  32. ​
  33. function fontSlug(string $group): string
  34. {
  35. $envKey = 'FONT_' . strtoupper($group);
  36. $slug = env($envKey, fontDefaultSlug($group));
  37. $options = fontOptions();
  38. return isset($options[$slug]) ? $slug : fontDefaultSlug($group);
  39. }
  40. ​
  41. function fontFamilyCss(string $group): string
  42. {
  43. $opt = fontOptions()[fontSlug($group)];
  44. return $opt['family'] . ', ' . $opt['fallback'];
  45. }
  46. ​
  47. function fontFaceStyleTag(): string
  48. {
  49. $options = fontOptions();
  50. $seen = [];
  51. $css = '';
  52. foreach (['body', 'heading', 'value'] as $group) {
  53. $opt = $options[fontSlug($group)];
  54. if ($opt['file'] === '' || isset($seen[$opt['file']])) {
  55. continue;
  56. }
  57. $seen[$opt['file']] = true;
  58. $family = str_replace(['"', '<', '>'], '', $opt['family']);
  59. $file = preg_replace('/[^A-Za-z0-9._-]/', '', $opt['file']);
  60. $css .= '@font-face{font-family:' . $family . ';src:url("assets/fonts/' . $file . '") format("truetype");font-display:swap;}';
  61. }
  62. if ($css === '') {
  63. return '';
  64. }
  65. return '<style>' . $css . '</style>';
  66. }
  67. ​