A project management app derived from Mind-Vision-Code
No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

136 líneas
6.5KB

  1. <section class="hero">
  2. <div class="hero-copy">
  3. <span class="eyebrow">Command center</span>
  4. <h1>See every project, task, and risk in one view.</h1>
  5. <p class="hero-text">Project Compass is a focused delivery system for keeping portfolios organized. Track budgets, deadlines, blocked work, and team momentum without losing the narrative of what is happening next.</p>
  6. <div class="hero-actions">
  7. <a class="button button-primary" href="/projects">Open projects</a>
  8. <a class="button button-secondary" href="/projects/create">Create a project</a>
  9. <a class="button button-ghost" href="/activity">View activity</a>
  10. </div>
  11. <div class="metrics-grid">
  12. <div class="metric-card"><span class="meta-label">Projects</span><strong><?= e((string) $summary['project_count']) ?></strong></div>
  13. <div class="metric-card"><span class="meta-label">Active</span><strong><?= e((string) $summary['active_projects']) ?></strong></div>
  14. <div class="metric-card"><span class="meta-label">Open tasks</span><strong><?= e((string) $summary['open_tasks']) ?></strong></div>
  15. <div class="metric-card"><span class="meta-label">Blocked</span><strong><?= e((string) $summary['blocked_tasks']) ?></strong></div>
  16. </div>
  17. </div>
  18. <aside class="hero-panel">
  19. <div>
  20. <p class="panel-label">Delivery snapshot</p>
  21. <h2><?= e((string) $summary['due_soon_tasks']) ?> tasks due soon</h2>
  22. <p><?= e((string) $summary['overdue_tasks']) ?> tasks are already overdue, so the board is watching deadline risk closely.</p>
  23. </div>
  24. <div class="summary-chips">
  25. <span class="tag is-amber">Due in 7 days: <?= e((string) $summary['due_soon_tasks']) ?></span>
  26. <span class="tag is-red">Overdue: <?= e((string) $summary['overdue_tasks']) ?></span>
  27. <span class="tag is-blue">In motion: <?= e((string) $summary['active_projects']) ?></span>
  28. </div>
  29. <div class="notice">
  30. <p class="kicker">How the app works</p>
  31. <p>Projects carry budgets, team members, status, and a live Kanban board. Every status change creates activity so the project story stays visible.</p>
  32. </div>
  33. </aside>
  34. </section>
  35. <section class="layout-two" style="margin-top: 1.2rem;">
  36. <div class="stack">
  37. <div class="block-title">
  38. <div>
  39. <span class="eyebrow">Featured projects</span>
  40. <h2>Most active workstreams</h2>
  41. </div>
  42. <a class="button button-secondary" href="/projects">Browse all</a>
  43. </div>
  44. <div class="card-grid">
  45. <?php foreach ($featuredProjects as $project): ?>
  46. <article class="project-card card" data-filter-item>
  47. <div class="project-top">
  48. <div>
  49. <span class="kicker"><?= e($project['code']) ?></span>
  50. <h3><a href="/projects/<?= e((string) $project['id']) ?>"><?= e($project['name']) ?></a></h3>
  51. </div>
  52. <span class="status-pill <?= e($project['health_class']) ?>"><?= e($project['status_label']) ?></span>
  53. </div>
  54. <p><?= e($project['description']) ?></p>
  55. <div class="progress" aria-label="Project completion progress"><span style="width: <?= e((string) $project['progress_percent']) ?>%"></span></div>
  56. <div class="project-bottom">
  57. <span class="mini-pill is-neutral"><?= e((string) $project['task_count']) ?> tasks</span>
  58. <span class="mini-pill is-blue"><?= e($project['task_traffic']) ?></span>
  59. <span class="mini-pill is-amber">Budget <?= e($project['budget_label']) ?></span>
  60. </div>
  61. </article>
  62. <?php endforeach; ?>
  63. </div>
  64. </div>
  65. <div class="side-stack">
  66. <section class="panel">
  67. <div class="block-title">
  68. <div>
  69. <span class="eyebrow">Due soon</span>
  70. <h2>Tasks needing attention</h2>
  71. </div>
  72. </div>
  73. <div class="list">
  74. <?php foreach ($dueSoon as $task): ?>
  75. <div class="feed-item">
  76. <header>
  77. <strong><?= e($task['title']) ?></strong>
  78. <span class="status-pill is-amber"><?= e(format_date($task['due_date'])) ?></span>
  79. </header>
  80. <p><?= e($task['project_name']) ?> · <?= e($task['assignee']) ?></p>
  81. </div>
  82. <?php endforeach; ?>
  83. </div>
  84. </section>
  85. <section class="panel">
  86. <div class="block-title">
  87. <div>
  88. <span class="eyebrow">Overdue</span>
  89. <h2>Risk items</h2>
  90. </div>
  91. </div>
  92. <div class="list">
  93. <?php foreach ($overdue as $task): ?>
  94. <div class="feed-item">
  95. <header>
  96. <strong><?= e($task['title']) ?></strong>
  97. <span class="status-pill is-red"><?= e(format_date($task['due_date'])) ?></span>
  98. </header>
  99. <p><?= e($task['project_name']) ?> · <?= e($task['assignee']) ?></p>
  100. </div>
  101. <?php endforeach; ?>
  102. </div>
  103. </section>
  104. <section class="panel">
  105. <div class="block-title">
  106. <div>
  107. <span class="eyebrow">Activity feed</span>
  108. <h2>Recent changes</h2>
  109. </div>
  110. <a class="button button-ghost" href="/activity">Open full feed</a>
  111. </div>
  112. <div class="list">
  113. <?php foreach ($activity as $item): ?>
  114. <div class="feed-item">
  115. <header>
  116. <strong><?= e($item['headline']) ?></strong>
  117. <span class="kicker"><?= e(format_date($item['created_at'], 'M j · H:i')) ?></span>
  118. </header>
  119. <p><?= e($item['detail'] !== '' ? $item['detail'] : ($item['project_name'] ?? '')) ?></p>
  120. </div>
  121. <?php endforeach; ?>
  122. </div>
  123. </section>
  124. </div>
  125. </section>

Powered by TurnKey Linux.