github-weekly-reporter 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. package/README.md +86 -115
  2. package/dist/cli/commands/deploy.d.ts.map +1 -1
  3. package/dist/cli/commands/deploy.js +9 -3
  4. package/dist/cli/commands/deploy.js.map +1 -1
  5. package/dist/cli/commands/fetch.d.ts +3 -0
  6. package/dist/cli/commands/fetch.d.ts.map +1 -0
  7. package/dist/cli/commands/fetch.js +148 -0
  8. package/dist/cli/commands/fetch.js.map +1 -0
  9. package/dist/cli/commands/generate.d.ts.map +1 -1
  10. package/dist/cli/commands/generate.js +59 -80
  11. package/dist/cli/commands/generate.js.map +1 -1
  12. package/dist/cli/commands/render.d.ts +3 -0
  13. package/dist/cli/commands/render.d.ts.map +1 -0
  14. package/dist/cli/commands/render.js +172 -0
  15. package/dist/cli/commands/render.js.map +1 -0
  16. package/dist/cli/commands/setup.d.ts +3 -0
  17. package/dist/cli/commands/setup.d.ts.map +1 -0
  18. package/dist/cli/commands/setup.js +709 -0
  19. package/dist/cli/commands/setup.js.map +1 -0
  20. package/dist/cli/index.js +6 -0
  21. package/dist/cli/index.js.map +1 -1
  22. package/dist/collector/clean-body.d.ts +2 -0
  23. package/dist/collector/clean-body.d.ts.map +1 -0
  24. package/dist/collector/clean-body.js +27 -0
  25. package/dist/collector/clean-body.js.map +1 -0
  26. package/dist/collector/date-range.d.ts +3 -2
  27. package/dist/collector/date-range.d.ts.map +1 -1
  28. package/dist/collector/date-range.js +125 -5
  29. package/dist/collector/date-range.js.map +1 -1
  30. package/dist/collector/fetch-contributions.d.ts +11 -1
  31. package/dist/collector/fetch-contributions.d.ts.map +1 -1
  32. package/dist/collector/fetch-contributions.js +15 -3
  33. package/dist/collector/fetch-contributions.js.map +1 -1
  34. package/dist/collector/fetch-events.d.ts +6 -0
  35. package/dist/collector/fetch-events.d.ts.map +1 -0
  36. package/dist/collector/fetch-events.js +106 -0
  37. package/dist/collector/fetch-events.js.map +1 -0
  38. package/dist/collector/fetch-repo-prs.d.ts +7 -0
  39. package/dist/collector/fetch-repo-prs.d.ts.map +1 -0
  40. package/dist/collector/fetch-repo-prs.js +62 -0
  41. package/dist/collector/fetch-repo-prs.js.map +1 -0
  42. package/dist/collector/queries.d.ts +1 -4
  43. package/dist/collector/queries.d.ts.map +1 -1
  44. package/dist/collector/queries.js +7 -59
  45. package/dist/collector/queries.js.map +1 -1
  46. package/dist/deployer/index-page.d.ts +22 -2
  47. package/dist/deployer/index-page.d.ts.map +1 -1
  48. package/dist/deployer/index-page.js +424 -33
  49. package/dist/deployer/index-page.js.map +1 -1
  50. package/dist/deployer/week.d.ts +1 -1
  51. package/dist/deployer/week.d.ts.map +1 -1
  52. package/dist/deployer/week.js +17 -6
  53. package/dist/deployer/week.js.map +1 -1
  54. package/dist/i18n/fonts.d.ts +8 -0
  55. package/dist/i18n/fonts.d.ts.map +1 -0
  56. package/dist/i18n/fonts.js +44 -0
  57. package/dist/i18n/fonts.js.map +1 -0
  58. package/dist/i18n/index.d.ts +28 -0
  59. package/dist/i18n/index.d.ts.map +1 -0
  60. package/dist/i18n/index.js +259 -0
  61. package/dist/i18n/index.js.map +1 -0
  62. package/dist/index.d.ts +2 -3
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +1 -2
  65. package/dist/index.js.map +1 -1
  66. package/dist/llm/index.d.ts +2 -1
  67. package/dist/llm/index.d.ts.map +1 -1
  68. package/dist/llm/index.js +77 -5
  69. package/dist/llm/index.js.map +1 -1
  70. package/dist/llm/preprocess.d.ts +3 -0
  71. package/dist/llm/preprocess.d.ts.map +1 -0
  72. package/dist/llm/preprocess.js +92 -0
  73. package/dist/llm/preprocess.js.map +1 -0
  74. package/dist/llm/prompt.d.ts.map +1 -1
  75. package/dist/llm/prompt.js +109 -29
  76. package/dist/llm/prompt.js.map +1 -1
  77. package/dist/llm/providers/anthropic.js +1 -1
  78. package/dist/llm/providers/anthropic.js.map +1 -1
  79. package/dist/llm/providers/grok.d.ts +3 -0
  80. package/dist/llm/providers/grok.d.ts.map +1 -0
  81. package/dist/llm/providers/grok.js +18 -0
  82. package/dist/llm/providers/grok.js.map +1 -0
  83. package/dist/llm/providers/groq.d.ts +3 -0
  84. package/dist/llm/providers/groq.d.ts.map +1 -0
  85. package/dist/llm/providers/groq.js +18 -0
  86. package/dist/llm/providers/groq.js.map +1 -0
  87. package/dist/llm/providers/openai.js +1 -1
  88. package/dist/llm/providers/openai.js.map +1 -1
  89. package/dist/llm/providers/openrouter.d.ts +3 -0
  90. package/dist/llm/providers/openrouter.d.ts.map +1 -0
  91. package/dist/llm/providers/openrouter.js +18 -0
  92. package/dist/llm/providers/openrouter.js.map +1 -0
  93. package/dist/llm/types.d.ts +5 -2
  94. package/dist/llm/types.d.ts.map +1 -1
  95. package/dist/renderer/helpers.d.ts +6 -1
  96. package/dist/renderer/helpers.d.ts.map +1 -1
  97. package/dist/renderer/helpers.js +54 -17
  98. package/dist/renderer/helpers.js.map +1 -1
  99. package/dist/renderer/index.d.ts +11 -2
  100. package/dist/renderer/index.d.ts.map +1 -1
  101. package/dist/renderer/index.js +41 -19
  102. package/dist/renderer/index.js.map +1 -1
  103. package/dist/renderer/og-image.d.ts +15 -0
  104. package/dist/renderer/og-image.d.ts.map +1 -0
  105. package/dist/renderer/og-image.js +152 -0
  106. package/dist/renderer/og-image.js.map +1 -0
  107. package/dist/renderer/themes.d.ts +2 -17
  108. package/dist/renderer/themes.d.ts.map +1 -1
  109. package/dist/renderer/themes.js +371 -147
  110. package/dist/renderer/themes.js.map +1 -1
  111. package/dist/types.d.ts +103 -11
  112. package/dist/types.d.ts.map +1 -1
  113. package/package.json +9 -2
  114. package/src/renderer/templates/partials/footer.hbs +3 -1
  115. package/src/renderer/templates/partials/header.hbs +10 -7
  116. package/src/renderer/templates/partials/highlights.hbs +24 -0
  117. package/src/renderer/templates/partials/overview.hbs +3 -0
  118. package/src/renderer/templates/partials/summaries.hbs +73 -0
  119. package/src/renderer/templates/report.hbs +100 -15
  120. package/dist/cli/config.d.ts +0 -11
  121. package/dist/cli/config.d.ts.map +0 -1
  122. package/dist/cli/config.js +0 -16
  123. package/dist/cli/config.js.map +0 -1
  124. package/dist/cli/config.test.d.ts +0 -2
  125. package/dist/cli/config.test.d.ts.map +0 -1
  126. package/dist/cli/config.test.js +0 -32
  127. package/dist/cli/config.test.js.map +0 -1
  128. package/dist/collector/aggregate.test.d.ts +0 -2
  129. package/dist/collector/aggregate.test.d.ts.map +0 -1
  130. package/dist/collector/aggregate.test.js +0 -88
  131. package/dist/collector/aggregate.test.js.map +0 -1
  132. package/dist/collector/date-range.test.d.ts +0 -2
  133. package/dist/collector/date-range.test.d.ts.map +0 -1
  134. package/dist/collector/date-range.test.js +0 -25
  135. package/dist/collector/date-range.test.js.map +0 -1
  136. package/dist/collector/fetch-issues.d.ts +0 -5
  137. package/dist/collector/fetch-issues.d.ts.map +0 -1
  138. package/dist/collector/fetch-issues.js +0 -31
  139. package/dist/collector/fetch-issues.js.map +0 -1
  140. package/dist/collector/fetch-languages.d.ts +0 -4
  141. package/dist/collector/fetch-languages.d.ts.map +0 -1
  142. package/dist/collector/fetch-languages.js +0 -42
  143. package/dist/collector/fetch-languages.js.map +0 -1
  144. package/dist/collector/fetch-pull-requests.d.ts +0 -5
  145. package/dist/collector/fetch-pull-requests.d.ts.map +0 -1
  146. package/dist/collector/fetch-pull-requests.js +0 -31
  147. package/dist/collector/fetch-pull-requests.js.map +0 -1
  148. package/dist/collector/index.d.ts +0 -3
  149. package/dist/collector/index.d.ts.map +0 -1
  150. package/dist/collector/index.js +0 -50
  151. package/dist/collector/index.js.map +0 -1
  152. package/dist/deployer/index-page.test.d.ts +0 -2
  153. package/dist/deployer/index-page.test.d.ts.map +0 -1
  154. package/dist/deployer/index-page.test.js +0 -29
  155. package/dist/deployer/index-page.test.js.map +0 -1
  156. package/dist/deployer/week.test.d.ts +0 -2
  157. package/dist/deployer/week.test.d.ts.map +0 -1
  158. package/dist/deployer/week.test.js +0 -21
  159. package/dist/deployer/week.test.js.map +0 -1
  160. package/dist/llm/llm.test.d.ts +0 -2
  161. package/dist/llm/llm.test.d.ts.map +0 -1
  162. package/dist/llm/llm.test.js +0 -24
  163. package/dist/llm/llm.test.js.map +0 -1
  164. package/dist/llm/prompt.test.d.ts +0 -2
  165. package/dist/llm/prompt.test.d.ts.map +0 -1
  166. package/dist/llm/prompt.test.js +0 -48
  167. package/dist/llm/prompt.test.js.map +0 -1
  168. package/dist/renderer/renderer.test.d.ts +0 -2
  169. package/dist/renderer/renderer.test.d.ts.map +0 -1
  170. package/dist/renderer/renderer.test.js +0 -111
  171. package/dist/renderer/renderer.test.js.map +0 -1
  172. package/src/renderer/templates/partials/heatmap.hbs +0 -11
  173. package/src/renderer/templates/partials/languages.hbs +0 -19
  174. package/src/renderer/templates/partials/narrative.hbs +0 -10
  175. package/src/renderer/templates/partials/repositories.hbs +0 -25
  176. package/src/renderer/templates/partials/stats.hbs +0 -8
@@ -1,179 +1,403 @@
1
- // Theme CSS definitions for report rendering
2
- const THEMES = {
3
- default: {
4
- bg: "#ffffff",
5
- bgCard: "#f6f8fa",
6
- text: "#1f2328",
7
- textSecondary: "#656d76",
8
- border: "#d0d7de",
9
- accent: "#0969da",
10
- heatmapEmpty: "#ebedf0",
11
- heatmapL1: "#9be9a8",
12
- heatmapL2: "#40c463",
13
- heatmapL3: "#30a14e",
14
- heatmapL4: "#216e39",
15
- },
16
- dark: {
17
- bg: "#0d1117",
18
- bgCard: "#161b22",
19
- text: "#e6edf3",
20
- textSecondary: "#8b949e",
21
- border: "#30363d",
22
- accent: "#58a6ff",
23
- heatmapEmpty: "#161b22",
24
- heatmapL1: "#0e4429",
25
- heatmapL2: "#006d32",
26
- heatmapL3: "#26a641",
27
- heatmapL4: "#39d353",
28
- },
1
+ // CSS definitions for report rendering (dark artistic theme)
2
+ import { getFontConfig } from "../i18n/index.js";
3
+ const c = {
4
+ bg: "#050505",
5
+ text: "#e0e0e0",
6
+ textSecondary: "rgba(255,255,255,0.65)",
7
+ textTertiary: "rgba(255,255,255,0.3)",
8
+ border: "rgba(255,255,255,0.08)",
9
+ borderSubtle: "rgba(255,255,255,0.04)",
10
+ accent: "#39d353",
11
+ cardBg: "rgba(255,255,255,0.02)",
12
+ chipBg: "rgba(255,255,255,0.04)",
13
+ chipBorder: "rgba(255,255,255,0.08)",
14
+ green: "#3fb950",
15
+ red: "#f85149",
16
+ badgePr: "#8957e5",
17
+ badgeRelease: "#238636",
18
+ badgeIssue: "#d29922",
19
+ badgeDiscussion: "#58a6ff",
20
+ heatmap0: "rgba(255,255,255,0.03)",
21
+ heatmap1: "#0e4429",
22
+ heatmap2: "#006d32",
23
+ heatmap3: "#26a641",
24
+ heatmap4: "#39d353",
25
+ heatmap4Text: "#000",
29
26
  };
30
- export const getThemeColors = (theme) => THEMES[theme] ?? THEMES.default;
31
- export const buildCSS = (theme) => {
32
- const c = getThemeColors(theme);
27
+ export const buildCSS = (language = "en") => {
28
+ const f = getFontConfig(language);
33
29
  return `
30
+ @import url('${f.importUrl}');
31
+
34
32
  * { margin: 0; padding: 0; box-sizing: border-box; }
33
+
34
+ /* GRAIN */
35
+ body::after {
36
+ content: '';
37
+ position: fixed;
38
+ inset: 0;
39
+ background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.03'/%3E%3C/svg%3E");
40
+ pointer-events: none;
41
+ z-index: 9999;
42
+ }
43
+
44
+ .skip-link {
45
+ position: absolute; top: -100%; left: 1rem;
46
+ padding: 0.5rem 1rem; background: ${c.accent}; color: ${c.bg};
47
+ border-radius: 0 0 6px 6px; z-index: 200; font-size: 0.875rem; text-decoration: none;
48
+ }
49
+ .skip-link:focus { top: 0; }
50
+ :focus-visible { outline: 2px solid ${c.accent}; outline-offset: 2px; }
51
+
35
52
  body {
36
- font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif;
53
+ font-family: ${f.bodyFamily};
37
54
  background: ${c.bg};
38
55
  color: ${c.text};
39
- line-height: 1.6;
40
- padding: 2rem 1rem;
56
+ line-height: 1.7;
57
+ -webkit-font-smoothing: antialiased;
58
+ text-rendering: optimizeLegibility;
59
+ overflow-x: hidden;
41
60
  }
42
- .container { max-width: 860px; margin: 0 auto; }
43
61
 
44
- /* Header */
45
- .header {
46
- display: flex;
47
- align-items: center;
48
- gap: 1rem;
49
- margin-bottom: 2rem;
50
- padding-bottom: 1.5rem;
62
+ code {
63
+ font-family: ${f.monoFamily};
64
+ font-size: 0.875em;
65
+ padding: 0.15em 0.4em;
66
+ border-radius: 4px;
67
+ background: ${c.chipBg};
68
+ border: 1px solid ${c.chipBorder};
69
+ }
70
+
71
+ /* ===== NAV (matches index 960px) ===== */
72
+ nav[aria-label="Site navigation"] {
73
+ position: fixed; top: 0; left: 0; right: 0; z-index: 100;
74
+ background: rgba(5,5,5,0.8);
75
+ backdrop-filter: blur(16px);
51
76
  border-bottom: 1px solid ${c.border};
52
77
  }
53
- .avatar {
54
- width: 64px;
55
- height: 64px;
56
- border-radius: 50%;
57
- border: 2px solid ${c.border};
78
+ .nav-inner {
79
+ max-width: 960px; margin: 0 auto;
80
+ padding: 0.75rem 3rem;
81
+ display: flex; justify-content: space-between; align-items: center;
82
+ min-height: 56px;
83
+ }
84
+ nav a { color: ${c.text}; text-decoration: none; }
85
+ .nav-site-title {
86
+ font-size: 0.75rem; font-weight: 600;
87
+ letter-spacing: 0.2em; text-transform: uppercase;
88
+ color: rgba(255,255,255,0.4);
89
+ white-space: nowrap;
90
+ }
91
+ .nav-back {
92
+ font-family: ${f.monoFamily}; font-size: 0.6875rem;
93
+ color: ${c.textTertiary};
94
+ padding: 0.375rem 0.75rem; border-radius: 6px;
95
+ border: 1px solid ${c.chipBorder}; transition: all 0.2s;
58
96
  }
59
- .header-text h1 { font-size: 1.5rem; font-weight: 600; }
60
- .header-text .date-range { color: ${c.textSecondary}; font-size: 0.875rem; }
97
+ .nav-back:hover { color: ${c.text}; border-color: ${c.accent}; }
61
98
 
62
- /* Stats cards */
63
- .stats {
64
- display: grid;
65
- grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
66
- gap: 0.75rem;
99
+ /* ===== REPORT HERO ===== */
100
+ .report-hero {
101
+ position: relative;
102
+ background: #0a0a0a;
103
+ padding: 8rem 3rem 4rem;
104
+ margin-bottom: 4rem;
105
+ overflow: hidden;
106
+ }
107
+ .report-hero::before {
108
+ content: '';
109
+ position: absolute;
110
+ bottom: 0; left: 50%;
111
+ width: 900px; height: 400px;
112
+ transform: translateX(-50%);
113
+ background: radial-gradient(ellipse, ${c.accent}10 0%, transparent 70%);
114
+ pointer-events: none;
115
+ }
116
+ .report-hero-inner {
117
+ max-width: 960px;
118
+ margin: 0 auto;
119
+ position: relative;
120
+ z-index: 1;
121
+ }
122
+ .report-hero .header-meta {
123
+ display: flex; align-items: center; gap: 0.75rem;
67
124
  margin-bottom: 2rem;
125
+ font-size: 0.8125rem; color: ${c.textTertiary};
68
126
  }
69
- .stat-card {
70
- background: ${c.bgCard};
71
- border: 1px solid ${c.border};
72
- border-radius: 8px;
73
- padding: 1rem;
74
- text-align: center;
75
- }
76
- .stat-card .value { font-size: 1.75rem; font-weight: 700; color: ${c.accent}; }
77
- .stat-card .label { font-size: 0.75rem; color: ${c.textSecondary}; text-transform: uppercase; letter-spacing: 0.05em; }
78
-
79
- /* Section */
80
- .section { margin-bottom: 2rem; }
81
- .section h2 {
82
- font-size: 1.125rem;
83
- font-weight: 600;
84
- margin-bottom: 0.75rem;
85
- padding-bottom: 0.5rem;
86
- border-bottom: 1px solid ${c.border};
127
+ .report-hero .header-sep { color: rgba(255,255,255,0.15); }
128
+ .report-hero .header-date {
129
+ font-family: ${f.monoFamily}; font-size: 0.6875rem;
130
+ letter-spacing: 0.1em; text-transform: uppercase;
131
+ }
132
+ .report-hero .header-author {
133
+ display: inline-flex; align-items: center; gap: 0.5rem;
134
+ text-decoration: none; color: ${c.textSecondary};
135
+ font-weight: 500; transition: color 0.3s;
136
+ }
137
+ .report-hero .header-author:hover { color: ${c.accent}; }
138
+ .report-hero .header-author img {
139
+ width: 32px; height: 32px; border-radius: 50%;
140
+ border: 2px solid ${c.accent}40;
141
+ }
142
+ .report-hero .header-title {
143
+ font-size: clamp(2.5rem, 6vw, 4rem);
144
+ font-weight: 900;
145
+ line-height: 1.05;
146
+ letter-spacing: -0.05em;
147
+ color: #ffffff;
148
+ margin-bottom: 1.25rem;
149
+ max-width: 80%;
150
+ }
151
+ .report-hero .header-sub {
152
+ font-size: 1.25rem;
153
+ color: rgba(255,255,255,0.5);
154
+ font-weight: 300;
155
+ line-height: 1.6;
156
+ max-width: 600px;
87
157
  }
88
158
 
89
- /* Heatmap */
90
- .heatmap {
91
- display: flex;
92
- gap: 4px;
93
- justify-content: center;
159
+ /* ===== CONTENT ===== */
160
+ .page {
161
+ max-width: 960px; margin: 0 auto;
162
+ padding: 0 3rem 4rem;
94
163
  }
95
- .heatmap-day {
96
- width: 36px;
97
- height: 36px;
98
- border-radius: 4px;
99
- display: flex;
100
- flex-direction: column;
101
- align-items: center;
102
- justify-content: center;
103
- font-size: 0.625rem;
104
- color: ${c.textSecondary};
164
+
165
+ /* OVERVIEW */
166
+ @keyframes fade-up {
167
+ from { opacity: 0; transform: translateY(10px); }
168
+ to { opacity: 1; transform: translateY(0); }
105
169
  }
106
- .heatmap-day .count { font-weight: 700; font-size: 0.75rem; color: ${c.text}; }
107
- .heatmap-level-0 { background: ${c.heatmapEmpty}; }
108
- .heatmap-level-1 { background: ${c.heatmapL1}; }
109
- .heatmap-level-2 { background: ${c.heatmapL2}; }
110
- .heatmap-level-3 { background: ${c.heatmapL3}; }
111
- .heatmap-level-4 { background: ${c.heatmapL4}; }
112
-
113
- /* Language bar */
114
- .lang-bar {
115
- display: flex;
116
- height: 10px;
117
- border-radius: 5px;
118
- overflow: hidden;
119
- margin-bottom: 0.75rem;
120
- }
121
- .lang-bar-segment { height: 100%; }
122
- .lang-list {
123
- display: flex;
124
- flex-wrap: wrap;
125
- gap: 0.75rem;
126
- list-style: none;
127
- font-size: 0.8125rem;
128
- }
129
- .lang-list li { display: flex; align-items: center; gap: 0.35rem; }
130
- .lang-dot { width: 10px; height: 10px; border-radius: 50%; display: inline-block; }
131
- .lang-pct { color: ${c.textSecondary}; }
132
-
133
- /* Repos table */
134
- .repo-table { width: 100%; border-collapse: collapse; font-size: 0.875rem; }
135
- .repo-table th, .repo-table td {
136
- padding: 0.5rem 0.75rem;
137
- text-align: left;
138
- border-bottom: 1px solid ${c.border};
170
+ .overview {
171
+ padding: 0 0 2rem;
172
+ margin-bottom: 4rem;
173
+ max-width: 640px;
174
+ margin-left: auto;
175
+ margin-right: auto;
176
+ animation: fade-up 0.5s ease both;
139
177
  }
140
- .repo-table th {
141
- font-weight: 600;
142
- color: ${c.textSecondary};
143
- font-size: 0.75rem;
178
+ .overview p {
179
+ font-size: 1.0625rem; color: ${c.textSecondary};
180
+ line-height: 1.9; margin-bottom: 1.25rem;
181
+ }
182
+ .overview p:last-child { margin-bottom: 0; }
183
+ .overview strong { color: ${c.text}; font-weight: 500; }
184
+
185
+ /* SECTION GROUP */
186
+ .section-group { margin-bottom: 5rem; }
187
+ .section-group-header {
188
+ display: flex; align-items: center; gap: 1rem;
189
+ margin-bottom: 2.5rem;
190
+ }
191
+ .section-group-title {
192
+ font-size: clamp(3rem, 8vw, 5rem); font-weight: 900;
193
+ letter-spacing: -0.06em;
194
+ }
195
+ .section-group-line { flex: 1; height: 1px; background: ${c.border}; }
196
+ .section-group-count {
197
+ font-family: ${f.monoFamily}; font-size: 0.75rem;
198
+ color: ${c.textTertiary}; letter-spacing: 0.15em;
144
199
  text-transform: uppercase;
145
- letter-spacing: 0.05em;
146
200
  }
147
- .repo-table a { color: ${c.accent}; text-decoration: none; }
148
- .repo-table a:hover { text-decoration: underline; }
149
201
 
150
- /* AI narrative */
151
- .narrative {
152
- background: ${c.bgCard};
153
- border: 1px solid ${c.border};
154
- border-radius: 8px;
155
- padding: 1.25rem;
156
- font-size: 0.9375rem;
157
- line-height: 1.75;
202
+ /* SUMMARY CARDS - alternating wide offset */
203
+ @keyframes card-enter {
204
+ from { opacity: 0; transform: translateY(16px); }
205
+ to { opacity: 1; transform: translateY(0); }
206
+ }
207
+ .section-summary:nth-child(2) { animation-delay: 0.05s; }
208
+ .section-summary:nth-child(3) { animation-delay: 0.1s; }
209
+ .section-summary:nth-child(4) { animation-delay: 0.15s; }
210
+ .section-summary:nth-child(5) { animation-delay: 0.2s; }
211
+ .section-summary:nth-child(6) { animation-delay: 0.25s; }
212
+ .section-summary {
213
+ margin-bottom: 2.5rem;
214
+ padding: 2rem 0 2rem 2.5rem;
215
+ border: none;
216
+ border-left: 2px solid ${c.chipBorder};
217
+ background: none;
218
+ max-width: 600px;
219
+ transition: all 0.4s cubic-bezier(0.16, 1, 0.3, 1);
220
+ animation: card-enter 0.4s ease both;
221
+ position: relative;
222
+ }
223
+ .section-summary:hover {
224
+ border-left-color: ${c.accent};
225
+ }
226
+ /* first card: featured, wider */
227
+ .section-summary:first-child {
228
+ max-width: 700px;
229
+ padding: 2.5rem 0 2.5rem 3rem;
230
+ border-left-width: 3px;
231
+ border-left-color: ${c.accent}40;
232
+ }
233
+ /* alternating offset */
234
+ .section-summary:nth-child(even):not(:first-child) {
235
+ margin-left: auto;
236
+ }
237
+ .section-summary:nth-child(odd):not(:first-child) {
238
+ margin-right: auto;
239
+ }
240
+ .section-summary:hover {
241
+ transform: translateX(4px);
242
+ }
243
+ /* heading breaks out left of card */
244
+ .section-summary .section-heading {
245
+ font-size: 2rem; font-weight: 900;
246
+ letter-spacing: -0.04em;
247
+ margin-left: -5rem;
248
+ margin-bottom: 1rem;
249
+ color: #ffffff;
250
+ }
251
+ .section-summary:first-child .section-heading {
252
+ margin-left: -6rem;
253
+ font-size: 2.75rem;
254
+ }
255
+ .section-summary .section-type {
256
+ font-family: ${f.monoFamily}; font-size: 0.6875rem;
257
+ text-transform: uppercase; letter-spacing: 0.2em;
258
+ color: ${c.accent}; margin-bottom: 0.75rem;
259
+ }
260
+ .section-summary .section-body {
261
+ font-size: 1rem; color: ${c.textSecondary}; line-height: 1.85;
262
+ }
263
+
264
+ /* DATA CHIPS */
265
+ .data-chips { display: flex; flex-wrap: wrap; gap: 0.5rem; margin-top: 1.25rem; }
266
+ .chip {
267
+ font-family: ${f.monoFamily}; font-size: 0.75rem;
268
+ padding: 0.3rem 0.65rem; border-radius: 6px;
269
+ background: ${c.chipBg}; border: 1px solid ${c.chipBorder};
270
+ color: ${c.textSecondary};
271
+ display: inline-flex; align-items: center; gap: 0.375rem;
272
+ transition: all 0.2s ease;
273
+ }
274
+ .chip:hover { border-color: ${c.accent}60; }
275
+ .chip-green { color: ${c.green}; font-weight: 600; }
276
+ .chip-red { color: ${c.red}; font-weight: 600; }
277
+ .chip-default { font-weight: 600; }
278
+
279
+ /* HIGHLIGHT GRID */
280
+ .highlight-grid {
281
+ display: grid;
282
+ grid-template-columns: 1fr 1fr;
283
+ gap: 1.25rem;
284
+ }
285
+
286
+ /* HIGHLIGHT CARD */
287
+ .highlight-card {
288
+ background: ${c.cardBg};
289
+ border: 1px solid ${c.chipBorder};
290
+ border-radius: 12px;
291
+ padding: 2rem;
292
+ animation: card-enter 0.4s ease both;
293
+ transition: all 0.4s cubic-bezier(0.16, 1, 0.3, 1);
294
+ }
295
+ .highlight-card:nth-child(2) { animation-delay: 0.05s; }
296
+ .highlight-card:nth-child(3) { animation-delay: 0.1s; }
297
+ .highlight-card:nth-child(4) { animation-delay: 0.15s; }
298
+ .highlight-card:nth-child(5) { animation-delay: 0.2s; }
299
+ .highlight-card:hover {
300
+ border-color: ${c.badgePr}50;
301
+ transform: translateY(-4px);
302
+ box-shadow: 0 12px 48px ${c.badgePr}15, 0 4px 16px rgba(0,0,0,0.5);
303
+ }
304
+ .highlight-badge {
305
+ font-family: ${f.monoFamily}; font-size: 0.6875rem;
306
+ text-transform: uppercase; letter-spacing: 0.15em;
307
+ display: inline-block; padding: 0.2rem 0.5rem;
308
+ border-radius: 4px; margin-bottom: 0.75rem; color: #fff;
309
+ }
310
+ .highlight-pr { background: ${c.badgePr}; }
311
+ .highlight-release { background: ${c.badgeRelease}; }
312
+ .highlight-issue { background: ${c.badgeIssue}; color: #000; }
313
+ .highlight-discussion { background: ${c.badgeDiscussion}; color: #000; }
314
+ .highlight-title { font-size: 1.125rem; font-weight: 600; margin-bottom: 0.375rem; letter-spacing: -0.01em; }
315
+ .highlight-meta {
316
+ font-family: ${f.monoFamily}; font-size: 0.75rem;
317
+ color: ${c.textTertiary}; margin-bottom: 0.75rem; letter-spacing: 0.02em;
318
+ }
319
+ .highlight-title a { color: ${c.text}; text-decoration: none; transition: color 0.2s; }
320
+ .highlight-title a:hover { color: ${c.accent}; }
321
+ .highlight-body { font-size: 0.9375rem; color: ${c.textSecondary}; line-height: 1.75; }
322
+
323
+ /* MINI HEATMAP */
324
+ .mini-heatmap { display: flex; gap: 4px; margin-top: 1.25rem; }
325
+ .mh-day { display: flex; flex-direction: column; align-items: center; gap: 4px; }
326
+ .mh-block {
327
+ width: 44px; height: 44px; border-radius: 8px;
328
+ display: flex; align-items: center; justify-content: center;
329
+ font-family: ${f.monoFamily}; font-size: 0.8125rem; font-weight: 600;
330
+ transition: all 0.3s cubic-bezier(0.16, 1, 0.3, 1);
158
331
  }
332
+ .mh-block:hover { transform: scale(1.15); box-shadow: 0 0 16px ${c.accent}44; }
333
+ .mh-label { font-size: 0.6875rem; text-transform: uppercase; letter-spacing: 0.15em; color: ${c.textTertiary}; }
334
+ .mh-level-0 { background: ${c.heatmap0}; color: ${c.textTertiary}; }
335
+ .mh-level-1 { background: ${c.heatmap1}; }
336
+ .mh-level-2 { background: ${c.heatmap2}; }
337
+ .mh-level-3 { background: ${c.heatmap3}; }
338
+ .mh-level-4 { background: ${c.heatmap4}; color: ${c.heatmap4Text}; }
159
339
 
160
- /* Footer */
340
+ /* DIFF BAR */
341
+ .diff-bar { display: flex; height: 6px; border-radius: 3px; overflow: hidden; margin-top: 1.25rem; margin-bottom: 0.5rem; }
342
+ .diff-add { background: ${c.green}; height: 100%; }
343
+ .diff-del { background: ${c.red}; height: 100%; }
344
+ .diff-labels { display: flex; justify-content: space-between; font-family: ${f.monoFamily}; font-size: 0.6875rem; }
345
+ .diff-label-add { color: ${c.green}; }
346
+ .diff-label-del { color: ${c.red}; }
347
+
348
+ /* REPO BARS */
349
+ .repo-bars { margin-top: 1.25rem; display: flex; flex-direction: column; gap: 0.75rem; }
350
+ .repo-bar-item { font-size: 0.75rem; }
351
+ .repo-bar-header { display: flex; justify-content: space-between; margin-bottom: 0.25rem; }
352
+ .repo-bar-label { font-family: ${f.monoFamily}; color: ${c.textSecondary}; font-size: 0.6875rem; }
353
+ .repo-bar-track { width: 100%; height: 4px; border-radius: 2px; background: ${c.chipBg}; overflow: hidden; }
354
+ .repo-bar-fill { height: 100%; border-radius: 2px; background: ${c.accent}; transition: width 0.5s ease; }
355
+ .repo-bar-value { font-family: ${f.monoFamily}; color: ${c.textTertiary}; font-size: 0.6875rem; }
356
+
357
+ /* SHARE BAR */
358
+ .share-bar { max-width: 960px; margin: 3rem auto 0; padding: 2rem 3rem; display: flex; align-items: center; justify-content: center; gap: 0.75rem; }
359
+ .share-label { font-family: ${f.monoFamily}; font-size: 0.75rem; color: ${c.textTertiary}; text-transform: uppercase; letter-spacing: 0.2em; }
360
+ .share-btn {
361
+ display: inline-flex; align-items: center; justify-content: center;
362
+ width: 32px; height: 32px; border-radius: 6px;
363
+ border: 1px solid ${c.chipBorder}; background: ${c.chipBg};
364
+ color: ${c.textSecondary}; text-decoration: none;
365
+ font-size: 0.75rem; font-weight: 600; transition: all 0.3s;
366
+ }
367
+ .share-btn:hover { border-color: ${c.accent}; color: ${c.text}; }
368
+
369
+ /* WEEK NAV */
370
+ .week-nav { max-width: 960px; margin: 0 auto; padding: 2rem 2rem 0; display: flex; justify-content: space-between; }
371
+ .week-nav-link {
372
+ font-family: ${f.monoFamily}; font-size: 0.6875rem; color: ${c.textTertiary};
373
+ text-decoration: none; padding: 0.375rem 0.75rem; border-radius: 6px;
374
+ border: 1px solid ${c.chipBorder}; transition: all 0.2s;
375
+ }
376
+ .week-nav-link:hover { color: ${c.text}; border-color: ${c.accent}; }
377
+
378
+ /* FOOTER */
161
379
  .footer {
162
- margin-top: 3rem;
163
- padding-top: 1.5rem;
380
+ max-width: 960px; margin: 0 auto; text-align: center;
381
+ padding: 4rem 3rem; font-size: 0.8125rem;
382
+ color: rgba(255,255,255,0.3);
164
383
  border-top: 1px solid ${c.border};
165
- text-align: center;
166
- font-size: 0.8125rem;
167
- color: ${c.textSecondary};
168
384
  }
169
- .footer a { color: ${c.accent}; text-decoration: none; }
170
- .footer a:hover { text-decoration: underline; }
385
+ .footer a { color: rgba(255,255,255,0.5); text-decoration: none; transition: color 0.2s; }
386
+ .footer a:hover { color: ${c.accent}; }
387
+
388
+ @view-transition { navigation: auto; }
171
389
 
172
- /* Responsive */
173
390
  @media (max-width: 600px) {
174
- .stats { grid-template-columns: repeat(2, 1fr); }
175
- .header { flex-direction: column; text-align: center; }
176
- .heatmap-day { width: 28px; height: 28px; }
391
+ .nav-inner { padding: 0.75rem 1.5rem; }
392
+ .report-hero { padding: 6rem 1.5rem 3rem; }
393
+ .report-hero .header-title { font-size: clamp(2rem, 10vw, 3rem); max-width: 100%; }
394
+ .page { padding: 0 1.5rem 3rem; }
395
+ .section-summary { max-width: 100%; }
396
+ .section-summary:first-child { max-width: 100%; padding: 2rem; }
397
+ .section-summary .section-heading { margin-left: -0.5rem; font-size: 1.25rem; }
398
+ .section-summary:first-child .section-heading { margin-left: -0.5rem; font-size: 1.5rem; }
399
+ .highlight-grid { grid-template-columns: 1fr; }
400
+ .highlight-grid { grid-template-columns: 1fr; }
177
401
  }
178
402
  `;
179
403
  };
@@ -1 +1 @@
1
- {"version":3,"file":"themes.js","sourceRoot":"","sources":["../../src/renderer/themes.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAkB7C,MAAM,MAAM,GAA+B;IACzC,OAAO,EAAE;QACP,EAAE,EAAE,SAAS;QACb,MAAM,EAAE,SAAS;QACjB,IAAI,EAAE,SAAS;QACf,aAAa,EAAE,SAAS;QACxB,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,SAAS;QACjB,YAAY,EAAE,SAAS;QACvB,SAAS,EAAE,SAAS;QACpB,SAAS,EAAE,SAAS;QACpB,SAAS,EAAE,SAAS;QACpB,SAAS,EAAE,SAAS;KACrB;IACD,IAAI,EAAE;QACJ,EAAE,EAAE,SAAS;QACb,MAAM,EAAE,SAAS;QACjB,IAAI,EAAE,SAAS;QACf,aAAa,EAAE,SAAS;QACxB,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,SAAS;QACjB,YAAY,EAAE,SAAS;QACvB,SAAS,EAAE,SAAS;QACpB,SAAS,EAAE,SAAS;QACpB,SAAS,EAAE,SAAS;QACpB,SAAS,EAAE,SAAS;KACrB;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,KAAY,EAAe,EAAE,CAC1D,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC;AAElC,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAY,EAAU,EAAE;IAC/C,MAAM,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IAEhC,OAAO;;;;oBAIW,CAAC,CAAC,EAAE;eACT,CAAC,CAAC,IAAI;;;;;;;;;;;;;iCAaY,CAAC,CAAC,MAAM;;;;;;0BAMf,CAAC,CAAC,MAAM;;;wCAGM,CAAC,CAAC,aAAa;;;;;;;;;;oBAUnC,CAAC,CAAC,MAAM;0BACF,CAAC,CAAC,MAAM;;;;;uEAKqC,CAAC,CAAC,MAAM;qDAC1B,CAAC,CAAC,aAAa;;;;;;;;;iCASnC,CAAC,CAAC,MAAM;;;;;;;;;;;;;;;;;;eAkB1B,CAAC,CAAC,aAAa;;yEAE2C,CAAC,CAAC,IAAI;qCAC1C,CAAC,CAAC,YAAY;qCACd,CAAC,CAAC,SAAS;qCACX,CAAC,CAAC,SAAS;qCACX,CAAC,CAAC,SAAS;qCACX,CAAC,CAAC,SAAS;;;;;;;;;;;;;;;;;;;;yBAoBvB,CAAC,CAAC,aAAa;;;;;;;iCAOP,CAAC,CAAC,MAAM;;;;eAI1B,CAAC,CAAC,aAAa;;;;;6BAKD,CAAC,CAAC,MAAM;;;;;oBAKjB,CAAC,CAAC,MAAM;0BACF,CAAC,CAAC,MAAM;;;;;;;;;;;8BAWJ,CAAC,CAAC,MAAM;;;eAGvB,CAAC,CAAC,aAAa;;yBAEL,CAAC,CAAC,MAAM;;;;;;;;;GAS9B,CAAC;AACJ,CAAC,CAAC"}
1
+ {"version":3,"file":"themes.js","sourceRoot":"","sources":["../../src/renderer/themes.ts"],"names":[],"mappings":"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"}