layout.php 6.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. <?php
  2. /** @var string $content */
  3. /** @var string $title */
  4. /** @var \App\Domain\User|null $currentUser */
  5. /** @var string $csrfToken */
  6. use function App\Http\e;
  7. $currentUser = $currentUser ?? null;
  8. $csrfToken = $csrfToken ?? '';
  9. ?>
  10. <!doctype html>
  11. <html lang="en">
  12. <head>
  13. <meta charset="utf-8">
  14. <meta name="viewport" content="width=device-width,initial-scale=1">
  15. <title><?= e($title ?? 'Sprint Planner') ?></title>
  16. <script src="/assets/js/theme-init.js"></script>
  17. <link rel="stylesheet" href="/assets/css/app.css">
  18. <link rel="stylesheet"
  19. href="https://code.jquery.com/ui/1.13.3/themes/base/jquery-ui.css">
  20. <script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
  21. <script src="https://code.jquery.com/ui/1.13.3/jquery-ui.min.js"></script>
  22. <script src="/assets/js/app.js" defer></script>
  23. </head>
  24. <body class="bg-slate-100 text-slate-900 antialiased dark:bg-slate-900 dark:text-slate-100">
  25. <header class="border-b bg-white dark:bg-slate-800 dark:border-slate-700">
  26. <div class="max-w-7xl mx-auto px-4 py-3 flex items-center gap-4">
  27. <a href="/" class="font-semibold tracking-tight">Sprint Planner</a>
  28. <nav class="ml-auto flex items-center gap-4 text-sm">
  29. <?php if ($currentUser !== null): ?>
  30. <a href="/" class="text-slate-600 hover:text-slate-900 hover:underline dark:text-slate-300 dark:hover:text-slate-100">Sprints</a>
  31. <?php if ($currentUser->isAdmin): ?>
  32. <a href="/sprints/new" class="text-slate-600 hover:text-slate-900 hover:underline dark:text-slate-300 dark:hover:text-slate-100">New sprint</a>
  33. <?php endif; ?>
  34. <span class="text-slate-400 dark:text-slate-600">·</span>
  35. <span class="text-slate-600 dark:text-slate-300">
  36. <?= e($currentUser->displayName) ?>
  37. <?php if ($currentUser->isAdmin): ?>
  38. <span class="ml-1 inline-block px-1.5 py-0.5 text-[10px] font-semibold uppercase tracking-wider bg-amber-100 text-amber-800 rounded dark:bg-amber-900 dark:text-amber-200">admin</span>
  39. <?php endif; ?>
  40. </span>
  41. <div class="relative">
  42. <button type="button"
  43. data-menu-trigger
  44. aria-expanded="false"
  45. aria-haspopup="true"
  46. aria-controls="app-menu"
  47. aria-label="Open menu"
  48. class="p-2 rounded-md hover:bg-slate-100 focus:outline-none focus:ring-2 focus:ring-slate-400 dark:text-slate-200 dark:hover:bg-slate-700">
  49. <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" width="20" height="20" aria-hidden="true" class="block stroke-current" fill="none" stroke-width="2" stroke-linecap="round">
  50. <line x1="3" y1="5" x2="17" y2="5"></line>
  51. <line x1="3" y1="10" x2="17" y2="10"></line>
  52. <line x1="3" y1="15" x2="17" y2="15"></line>
  53. </svg>
  54. </button>
  55. <div id="app-menu"
  56. data-menu
  57. role="menu"
  58. hidden
  59. class="absolute right-0 mt-2 min-w-[12rem] rounded-md border border-slate-200 bg-white shadow-lg py-1 z-10 dark:bg-slate-800 dark:border-slate-700">
  60. <?php if ($currentUser->isAdmin): ?>
  61. <a href="/workers" role="menuitem"
  62. class="block px-3 py-2 text-sm text-slate-700 hover:bg-slate-50 focus:outline-none focus:ring-2 focus:ring-slate-400 dark:text-slate-200 dark:hover:bg-slate-700">Workers</a>
  63. <a href="/users" role="menuitem"
  64. class="block px-3 py-2 text-sm text-slate-700 hover:bg-slate-50 focus:outline-none focus:ring-2 focus:ring-slate-400 dark:text-slate-200 dark:hover:bg-slate-700">Users</a>
  65. <a href="/audit" role="menuitem"
  66. class="block px-3 py-2 text-sm text-slate-700 hover:bg-slate-50 focus:outline-none focus:ring-2 focus:ring-slate-400 dark:text-slate-200 dark:hover:bg-slate-700">Audit log</a>
  67. <a href="/settings" role="menuitem"
  68. class="block px-3 py-2 text-sm text-slate-700 hover:bg-slate-50 focus:outline-none focus:ring-2 focus:ring-slate-400 dark:text-slate-200 dark:hover:bg-slate-700">Settings</a>
  69. <?php endif; ?>
  70. <button type="button" role="menuitem" data-theme-toggle
  71. class="w-full text-left px-3 py-2 text-sm text-slate-700 hover:bg-slate-50 flex items-center justify-between focus:outline-none focus:ring-2 focus:ring-slate-400 dark:text-slate-200 dark:hover:bg-slate-700">
  72. <span>Theme</span>
  73. <span data-theme-label class="text-slate-500 dark:text-slate-400">Light</span>
  74. </button>
  75. <hr class="my-1 border-slate-200 dark:border-slate-700">
  76. <form method="post" action="/auth/logout">
  77. <input type="hidden" name="_csrf" value="<?= e($csrfToken) ?>">
  78. <button type="submit" role="menuitem"
  79. class="block w-full text-left px-3 py-2 text-sm text-slate-700 hover:bg-slate-50 font-[inherit] focus:outline-none focus:ring-2 focus:ring-slate-400 dark:text-slate-200 dark:hover:bg-slate-700">
  80. Sign out
  81. </button>
  82. </form>
  83. </div>
  84. </div>
  85. <?php else: ?>
  86. <a href="/auth/login"
  87. class="text-blue-700 hover:underline dark:text-blue-400 dark:hover:text-blue-300">Sign in</a>
  88. <?php endif; ?>
  89. </nav>
  90. </div>
  91. </header>
  92. <main class="max-w-7xl mx-auto px-4 py-6">
  93. <?= $content ?>
  94. </main>
  95. </body>
  96. </html>