validation-report-template.html 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <title>GDD Validation: $prd_name</title>
  6. <style>
  7. :root {
  8. --bg: #fafaf9;
  9. --surface: #ffffff;
  10. --border: #e7e5e4;
  11. --text: #1c1917;
  12. --muted: #78716c;
  13. --pass: #22c55e;
  14. --warn: #eab308;
  15. --fail: #ef4444;
  16. --na: #94a3b8;
  17. --sev-low: #64748b;
  18. --sev-medium: #ca8a04;
  19. --sev-high: #ea580c;
  20. --sev-critical: #dc2626;
  21. --grade-exc: #16a34a;
  22. --grade-good: #65a30d;
  23. --grade-fair: #d97706;
  24. --grade-poor: #dc2626;
  25. }
  26. * { box-sizing: border-box; }
  27. html, body { margin: 0; padding: 0; }
  28. body {
  29. font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Inter, system-ui, sans-serif;
  30. background: var(--bg);
  31. color: var(--text);
  32. line-height: 1.55;
  33. font-size: 15px;
  34. }
  35. .container { max-width: 960px; margin: 0 auto; padding: 32px 24px 64px; }
  36. header.report-header {
  37. display: flex;
  38. align-items: center;
  39. justify-content: space-between;
  40. gap: 24px;
  41. padding-bottom: 16px;
  42. border-bottom: 1px solid var(--border);
  43. margin-bottom: 24px;
  44. }
  45. .title h1 { margin: 0; font-size: 22px; font-weight: 600; letter-spacing: -0.01em; }
  46. .title .subtitle { color: var(--muted); font-size: 13px; margin-top: 4px; font-family: ui-monospace, "SF Mono", Menlo, monospace; }
  47. .grade {
  48. padding: 10px 18px;
  49. border-radius: 8px;
  50. font-weight: 600;
  51. color: white;
  52. font-size: 15px;
  53. white-space: nowrap;
  54. }
  55. .grade-excellent { background: var(--grade-exc); }
  56. .grade-good { background: var(--grade-good); }
  57. .grade-fair { background: var(--grade-fair); }
  58. .grade-poor { background: var(--grade-poor); }
  59. .synthesis {
  60. background: var(--surface);
  61. border: 1px solid var(--border);
  62. border-left: 3px solid var(--muted);
  63. border-radius: 8px;
  64. padding: 16px 20px;
  65. margin-bottom: 24px;
  66. color: var(--text);
  67. font-size: 15px;
  68. }
  69. .synthesis:empty { display: none; }
  70. .scoreboard {
  71. background: var(--surface);
  72. border: 1px solid var(--border);
  73. border-radius: 8px;
  74. padding: 18px 20px;
  75. margin-bottom: 24px;
  76. }
  77. .score-bar { margin: 0 0 14px; line-height: 0; }
  78. .score-stats { display: flex; gap: 22px; font-size: 14px; flex-wrap: wrap; }
  79. .score-stats span { display: inline-flex; align-items: center; gap: 6px; }
  80. .score-stats .dot { width: 10px; height: 10px; border-radius: 50%; display: inline-block; }
  81. .dot-pass { background: var(--pass); }
  82. .dot-warn { background: var(--warn); }
  83. .dot-fail { background: var(--fail); }
  84. .dot-na { background: var(--na); }
  85. .total-count { margin-left: auto; color: var(--muted); }
  86. section.category { margin-bottom: 16px; }
  87. section.category details {
  88. background: var(--surface);
  89. border: 1px solid var(--border);
  90. border-radius: 8px;
  91. overflow: hidden;
  92. }
  93. section.category summary {
  94. padding: 14px 20px;
  95. cursor: pointer;
  96. user-select: none;
  97. list-style: none;
  98. }
  99. section.category summary::-webkit-details-marker { display: none; }
  100. section.category summary::before {
  101. content: "▸";
  102. display: inline-block;
  103. margin-right: 10px;
  104. color: var(--muted);
  105. transition: transform 0.15s ease;
  106. }
  107. section.category details[open] summary::before { transform: rotate(90deg); }
  108. section.category summary h2 { display: inline; margin: 0; font-size: 16px; font-weight: 600; letter-spacing: -0.005em; }
  109. section.category .count { color: var(--muted); font-weight: 400; margin-left: 6px; font-size: 14px; }
  110. article.finding { padding: 16px 20px; border-top: 1px solid var(--border); }
  111. article.finding-fail { background: rgba(239, 68, 68, 0.025); }
  112. article.finding header {
  113. display: flex;
  114. align-items: center;
  115. gap: 10px;
  116. flex-wrap: wrap;
  117. margin-bottom: 8px;
  118. }
  119. .badge {
  120. font-size: 10.5px;
  121. padding: 3px 8px;
  122. border-radius: 4px;
  123. font-weight: 600;
  124. text-transform: uppercase;
  125. letter-spacing: 0.04em;
  126. line-height: 1.4;
  127. }
  128. .badge-pass { background: rgba(34, 197, 94, 0.12); color: #15803d; }
  129. .badge-warn { background: rgba(234, 179, 8, 0.14); color: #854d0e; }
  130. .badge-fail { background: rgba(239, 68, 68, 0.12); color: #b91c1c; }
  131. .badge-na { background: rgba(148, 163, 184, 0.16); color: #475569; }
  132. .badge-sev-low { background: rgba(100, 116, 139, 0.12); color: var(--sev-low); }
  133. .badge-sev-medium { background: rgba(202, 138, 4, 0.14); color: var(--sev-medium); }
  134. .badge-sev-high { background: rgba(234, 88, 12, 0.14); color: var(--sev-high); }
  135. .badge-sev-critical { background: rgba(220, 38, 38, 0.14); color: var(--sev-critical); }
  136. .finding-id { font-family: ui-monospace, "SF Mono", Menlo, monospace; font-size: 12px; color: var(--muted); }
  137. .finding-title { margin: 0; font-size: 15px; font-weight: 500; flex: 1; min-width: 200px; }
  138. .finding-location, .finding-note, .finding-fix { margin-top: 6px; font-size: 14px; color: var(--text); }
  139. .finding-location strong, .finding-fix strong { color: var(--muted); font-weight: 500; }
  140. footer.report-footer {
  141. margin-top: 40px;
  142. padding-top: 16px;
  143. border-top: 1px solid var(--border);
  144. font-size: 12px;
  145. color: var(--muted);
  146. font-family: ui-monospace, "SF Mono", Menlo, monospace;
  147. }
  148. footer .meta { display: flex; gap: 24px; flex-wrap: wrap; }
  149. </style>
  150. </head>
  151. <body>
  152. <div class="container">
  153. <header class="report-header">
  154. <div class="title">
  155. <h1>$prd_name — GDD Validation Report</h1>
  156. <div class="subtitle">$prd_path</div>
  157. </div>
  158. <div class="grade $grade_class">$grade</div>
  159. </header>
  160. <div class="synthesis">$overall_synthesis</div>
  161. <div class="scoreboard">
  162. <div class="score-bar">$score_svg</div>
  163. <div class="score-stats">
  164. <span><span class="dot dot-pass"></span>$passed pass</span>
  165. <span><span class="dot dot-warn"></span>$warned warn</span>
  166. <span><span class="dot dot-fail"></span>$failed fail</span>
  167. <span><span class="dot dot-na"></span>$na n/a</span>
  168. <span class="total-count">$total items checked</span>
  169. </div>
  170. </div>
  171. $categories_html
  172. <footer class="report-footer">
  173. <div class="meta">
  174. <span>Checklist: $checklist_path</span>
  175. <span>Generated: $timestamp</span>
  176. </div>
  177. </footer>
  178. </div>
  179. </body>
  180. </html>