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
@@ -3,7 +3,14 @@ export const USER_CONTRIBUTIONS_QUERY = `
3
3
  query($username: String!, $from: DateTime!, $to: DateTime!) {
4
4
  user(login: $username) {
5
5
  login
6
+ name
6
7
  avatarUrl
8
+ bio
9
+ company
10
+ location
11
+ followers { totalCount }
12
+ following { totalCount }
13
+ repositories(privacy: PUBLIC) { totalCount }
7
14
  contributionsCollection(from: $from, to: $to) {
8
15
  totalCommitContributions
9
16
  totalPullRequestReviewContributions
@@ -19,63 +26,4 @@ export const USER_CONTRIBUTIONS_QUERY = `
19
26
  }
20
27
  }
21
28
  `;
22
- export const SEARCH_PRS_QUERY = `
23
- query($query: String!, $cursor: String) {
24
- search(query: $query, type: ISSUE, first: 100, after: $cursor) {
25
- pageInfo {
26
- hasNextPage
27
- endCursor
28
- }
29
- nodes {
30
- ... on PullRequest {
31
- title
32
- url
33
- state
34
- createdAt
35
- mergedAt
36
- repository {
37
- nameWithOwner
38
- }
39
- }
40
- }
41
- }
42
- }
43
- `;
44
- export const SEARCH_ISSUES_QUERY = `
45
- query($query: String!, $cursor: String) {
46
- search(query: $query, type: ISSUE, first: 100, after: $cursor) {
47
- pageInfo {
48
- hasNextPage
49
- endCursor
50
- }
51
- nodes {
52
- ... on Issue {
53
- title
54
- url
55
- state
56
- createdAt
57
- closedAt
58
- repository {
59
- nameWithOwner
60
- }
61
- }
62
- }
63
- }
64
- }
65
- `;
66
- export const REPO_LANGUAGES_QUERY = `
67
- query($owner: String!, $name: String!) {
68
- repository(owner: $owner, name: $name) {
69
- languages(first: 20, orderBy: { field: SIZE, direction: DESC }) {
70
- edges {
71
- size
72
- node {
73
- name
74
- color
75
- }
76
- }
77
- }
78
- }
79
- }
80
- `;
81
29
  //# sourceMappingURL=queries.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"queries.js","sourceRoot":"","sources":["../../src/collector/queries.ts"],"names":[],"mappings":"AAAA,iDAAiD;AAEjD,MAAM,CAAC,MAAM,wBAAwB,GAAG;;;;;;;;;;;;;;;;;;;CAmBvC,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;CAqB/B,CAAC;AAEF,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;;;;;;;;;;;;;;;;;;CAqBlC,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;CAcnC,CAAC"}
1
+ {"version":3,"file":"queries.js","sourceRoot":"","sources":["../../src/collector/queries.ts"],"names":[],"mappings":"AAAA,iDAAiD;AAEjD,MAAM,CAAC,MAAM,wBAAwB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BvC,CAAC"}
@@ -1,3 +1,23 @@
1
- import type { Theme } from "../types.js";
2
- export declare const renderIndexPage: (reportPaths: string[], theme?: Theme) => string;
1
+ import type { Language, UserProfile } from "../types.js";
2
+ export type IndexPageData = {
3
+ username?: string;
4
+ avatarUrl?: string;
5
+ profile?: UserProfile;
6
+ };
7
+ export type ReportEntryStats = {
8
+ commits: number;
9
+ prs: number;
10
+ reviews: number;
11
+ };
12
+ export type ReportEntry = {
13
+ path: string;
14
+ week: string;
15
+ year: string;
16
+ title?: string;
17
+ subtitle?: string;
18
+ dateLabel: string;
19
+ stats?: ReportEntryStats;
20
+ };
21
+ export declare const renderIndexPage: (reports: ReportEntry[], pageData?: IndexPageData, language?: Language, siteTitle?: string) => string;
22
+ export declare const buildReportEntry: (path: string, title?: string, subtitle?: string, stats?: ReportEntryStats) => ReportEntry;
3
23
  //# sourceMappingURL=index-page.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-page.d.ts","sourceRoot":"","sources":["../../src/deployer/index-page.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAgDzC,eAAO,MAAM,eAAe,GAAI,aAAa,MAAM,EAAE,EAAE,QAAO,KAAiB,KAAG,MAQjF,CAAC"}
1
+ {"version":3,"file":"index-page.d.ts","sourceRoot":"","sources":["../../src/deployer/index-page.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAIzD,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,gBAAgB,CAAC;CAC1B,CAAC;AAmaF,eAAO,MAAM,eAAe,GAC1B,SAAS,WAAW,EAAE,EACtB,WAAW,aAAa,EACxB,WAAU,QAAe,EACzB,YAAY,MAAM,KACjB,MAoBF,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC3B,MAAM,MAAM,EACZ,QAAQ,MAAM,EACd,WAAW,MAAM,EACjB,QAAQ,gBAAgB,KACvB,WAQD,CAAC"}
@@ -1,51 +1,442 @@
1
1
  // Generate the index.html that lists all archived reports
2
2
  import Handlebars from "handlebars";
3
+ import { getLocale, getFontConfig } from "../i18n/index.js";
3
4
  import { buildCSS } from "../renderer/themes.js";
4
5
  const TEMPLATE = `<!DOCTYPE html>
5
- <html lang="en">
6
+ <html lang="{{lang}}">
6
7
  <head>
7
- <title>Weekly Reports</title>
8
+ <title>{{siteTitle}}</title>
8
9
  <meta charset="utf-8" />
9
10
  <meta name="viewport" content="width=device-width, initial-scale=1" />
10
- <meta name="description" content="Archive of weekly GitHub activity reports" />
11
+ <meta name="description" content="{{siteTitle}}" />
12
+ <meta name="view-transition" content="same-origin" />
11
13
  <style>{{{css}}}</style>
14
+ <style>
15
+ body { background: #050505; color: #e8e8e8; overflow-x: hidden; }
16
+
17
+ /* GRAIN OVERLAY */
18
+ body::after {
19
+ content: '';
20
+ position: fixed;
21
+ inset: 0;
22
+ 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");
23
+ pointer-events: none;
24
+ z-index: 9999;
25
+ }
26
+
27
+ /* NAV */
28
+ .index-nav {
29
+ position: fixed;
30
+ top: 0; left: 0; right: 0;
31
+ z-index: 100;
32
+ background: rgba(5,5,5,0.8);
33
+ backdrop-filter: blur(16px);
34
+ border-bottom: 1px solid rgba(255,255,255,0.06);
35
+ }
36
+ .index-nav-inner {
37
+ max-width: 960px;
38
+ margin: 0 auto;
39
+ padding: 0.75rem 3rem;
40
+ display: flex;
41
+ align-items: center;
42
+ min-height: 56px;
43
+ }
44
+ .nav-site-title {
45
+ font-size: 0.75rem;
46
+ font-weight: 600;
47
+ letter-spacing: 0.2em;
48
+ text-transform: uppercase;
49
+ color: rgba(255,255,255,0.4);
50
+ white-space: nowrap;
51
+ }
52
+
53
+ /* HERO */
54
+ .hero {
55
+ position: relative;
56
+ min-height: 100vh;
57
+ display: flex;
58
+ flex-direction: column;
59
+ justify-content: flex-end;
60
+ padding: 0 3rem 6rem;
61
+ overflow: hidden;
62
+ }
63
+
64
+ /* GEOMETRIC DECORATIONS */
65
+ .geo-circle {
66
+ position: absolute;
67
+ border-radius: 50%;
68
+ border: 1px solid rgba(255,255,255,0.04);
69
+ }
70
+ .geo-circle-1 { width: 600px; height: 600px; top: -200px; right: -100px; }
71
+ .geo-circle-2 { width: 400px; height: 400px; top: 10%; left: -150px; border-color: {{accentColor}}15; }
72
+ .geo-circle-3 { width: 200px; height: 200px; bottom: 20%; right: 10%; background: {{accentColor}}08; }
73
+ .geo-line {
74
+ position: absolute;
75
+ background: rgba(255,255,255,0.03);
76
+ }
77
+ .geo-line-1 { width: 1px; height: 100%; top: 0; left: 33.33%; }
78
+ .geo-line-2 { width: 1px; height: 100%; top: 0; left: 66.66%; }
79
+ .geo-dot {
80
+ position: absolute;
81
+ width: 4px; height: 4px;
82
+ border-radius: 50%;
83
+ background: {{accentColor}}40;
84
+ }
85
+ .geo-dot-1 { top: 30%; left: 33.33%; }
86
+ .geo-dot-2 { top: 60%; left: 66.66%; }
87
+ .geo-dot-3 { top: 45%; right: 15%; }
88
+
89
+ .hero-inner {
90
+ max-width: 960px;
91
+ margin: 0 auto;
92
+ width: 100%;
93
+ position: relative;
94
+ z-index: 1;
95
+ }
96
+
97
+ /* AVATAR - offset, large, with gradient ring */
98
+ .hero-avatar-wrap {
99
+ position: absolute;
100
+ top: 25vh;
101
+ right: 3rem;
102
+ z-index: 2;
103
+ }
104
+ .hero-avatar {
105
+ width: 180px; height: 180px;
106
+ border-radius: 50%;
107
+ border: 3px solid transparent;
108
+ background-image: linear-gradient(#050505, #050505), linear-gradient(135deg, {{accentColor}}, #8957e5, #f78166);
109
+ background-origin: border-box;
110
+ background-clip: padding-box, border-box;
111
+ transition: transform 0.6s cubic-bezier(0.16, 1, 0.3, 1);
112
+ }
113
+ .hero-avatar-wrap:hover .hero-avatar {
114
+ transform: scale(1.08) rotate(3deg);
115
+ }
116
+
117
+ /* MASSIVE TITLE */
118
+ .hero-title {
119
+ font-size: clamp(4rem, 12vw, 9rem);
120
+ font-weight: 900;
121
+ letter-spacing: -0.06em;
122
+ line-height: 0.85;
123
+ color: #ffffff;
124
+ margin-bottom: 3rem;
125
+ max-width: 70%;
126
+ white-space: pre-line;
127
+ }
128
+
129
+ /* PROFILE - asymmetric, stacked */
130
+ .hero-profile {
131
+ display: inline-flex;
132
+ align-items: flex-start;
133
+ gap: 4rem;
134
+ text-decoration: none;
135
+ color: inherit;
136
+ transition: all 0.4s cubic-bezier(0.16, 1, 0.3, 1);
137
+ }
138
+ .hero-profile:hover .hero-display-name {
139
+ color: {{accentColor}};
140
+ text-shadow: 0 0 30px {{accentColor}}80, 0 0 80px {{accentColor}}30;
141
+ }
142
+ .hero-profile:hover .hero-handle {
143
+ text-shadow: 0 0 12px {{accentColor}}60;
144
+ }
145
+ .hero-profile:hover .hero-avatar {
146
+ border-color: {{accentColor}};
147
+ box-shadow: 0 0 30px {{accentColor}}40;
148
+ }
149
+ .hero-profile:hover .hero-stat-value {
150
+ color: {{accentColor}};
151
+ text-shadow: 0 0 16px {{accentColor}}50;
152
+ }
153
+ .hero-name-block {}
154
+ .hero-display-name {
155
+ font-size: 1.5rem;
156
+ font-weight: 300;
157
+ letter-spacing: 0.05em;
158
+ color: rgba(255,255,255,0.9);
159
+ margin-bottom: 0.5rem;
160
+ transition: all 0.4s ease;
161
+ }
162
+ .hero-handle {
163
+ font-family: {{monoFamily}};
164
+ font-size: 0.6875rem;
165
+ color: {{accentColor}};
166
+ letter-spacing: 0.05em;
167
+ transition: all 0.4s ease;
168
+ }
169
+ .hero-bio {
170
+ font-size: 0.875rem;
171
+ color: rgba(255,255,255,0.35);
172
+ margin-top: 0.75rem;
173
+ max-width: 300px;
174
+ line-height: 1.6;
175
+ }
176
+ .hero-stats {
177
+ display: flex;
178
+ flex-direction: column;
179
+ gap: 0.75rem;
180
+ }
181
+ .hero-stat {
182
+ font-family: {{monoFamily}};
183
+ font-size: 0.6875rem;
184
+ color: rgba(255,255,255,0.25);
185
+ }
186
+ .hero-stat-value {
187
+ display: block;
188
+ font-size: 2rem;
189
+ font-weight: 800;
190
+ letter-spacing: -0.03em;
191
+ color: rgba(255,255,255,0.9);
192
+ line-height: 1;
193
+ margin-bottom: 0.125rem;
194
+ transition: all 0.4s ease;
195
+ }
196
+
197
+ /* CONTENT */
198
+ .index-content {
199
+ max-width: 960px;
200
+ margin: 0 auto;
201
+ padding: 0 3rem 6rem;
202
+ position: relative;
203
+ }
204
+
205
+ .year-group { margin-bottom: 5rem; }
206
+ .year-label {
207
+ font-family: {{monoFamily}};
208
+ font-size: 6rem;
209
+ font-weight: 900;
210
+ letter-spacing: -0.05em;
211
+ color: rgba(255,255,255,0.04);
212
+ line-height: 1;
213
+ margin-bottom: 2rem;
214
+ user-select: none;
215
+ }
216
+
217
+ /* WEEK ITEMS - editorial layout */
218
+ .week-list {
219
+ display: flex;
220
+ flex-direction: column;
221
+ gap: 0;
222
+ }
223
+ .week-item {
224
+ display: grid;
225
+ grid-template-columns: 80px 1fr auto;
226
+ gap: 2rem;
227
+ align-items: baseline;
228
+ padding: 2rem 0;
229
+ text-decoration: none;
230
+ color: inherit;
231
+ border-top: 1px solid rgba(255,255,255,0.06);
232
+ transition: all 0.4s cubic-bezier(0.16, 1, 0.3, 1);
233
+ position: relative;
234
+ }
235
+ .week-item:last-child { border-bottom: 1px solid rgba(255,255,255,0.06); }
236
+ .week-item::before {
237
+ content: '';
238
+ position: absolute;
239
+ left: -3rem; top: 0; bottom: 0;
240
+ width: 2px;
241
+ background: {{accentColor}};
242
+ transform: scaleY(0);
243
+ transform-origin: top;
244
+ transition: transform 0.4s cubic-bezier(0.16, 1, 0.3, 1);
245
+ }
246
+ .week-item:hover { padding-left: 1rem; }
247
+ .week-item:hover::before { transform: scaleY(1); }
248
+
249
+ .week-item-week {
250
+ font-family: {{monoFamily}};
251
+ font-size: 0.6875rem;
252
+ font-weight: 700;
253
+ color: {{accentColor}};
254
+ letter-spacing: 0.1em;
255
+ }
256
+ .week-item-content {}
257
+ .week-item-title {
258
+ font-size: 1.25rem;
259
+ font-weight: 600;
260
+ letter-spacing: -0.01em;
261
+ margin-bottom: 0.375rem;
262
+ transition: color 0.3s;
263
+ }
264
+ .week-item:hover .week-item-title { color: {{accentColor}}; }
265
+ .week-item-subtitle {
266
+ font-size: 0.875rem;
267
+ color: rgba(255,255,255,0.35);
268
+ line-height: 1.5;
269
+ display: -webkit-box;
270
+ -webkit-line-clamp: 1;
271
+ -webkit-box-orient: vertical;
272
+ overflow: hidden;
273
+ }
274
+ .week-item-date {
275
+ font-family: {{monoFamily}};
276
+ font-size: 0.75rem;
277
+ margin-top: 0.5rem;
278
+ font-size: 0.75rem;
279
+ color: rgba(255,255,255,0.2);
280
+ padding-top: 0.25rem;
281
+ }
282
+ .week-item-stat-value { font-weight: 700; }
283
+ .stat-commits .week-item-stat-value { color: #3fb950; }
284
+ .stat-prs .week-item-stat-value { color: #8957e5; }
285
+ .stat-reviews .week-item-stat-value { color: #58a6ff; }
286
+
287
+ /* FOOTER */
288
+ .footer {
289
+ max-width: 960px;
290
+ margin: 0 auto;
291
+ text-align: center;
292
+ padding: 4rem 3rem;
293
+ font-size: 0.8125rem;
294
+ color: rgba(255,255,255,0.3);
295
+ border-top: 1px solid rgba(255,255,255,0.08);
296
+ }
297
+ .footer a { color: rgba(255,255,255,0.5); text-decoration: none; transition: color 0.2s; }
298
+ .footer a:hover { color: rgba(255,255,255,0.6); }
299
+
300
+ @media (max-width: 768px) {
301
+ .hero { padding: 0 1.5rem 4rem; min-height: auto; padding-top: 8rem; }
302
+ .hero-title { font-size: clamp(3rem, 15vw, 5rem); max-width: 100%; }
303
+ .hero-avatar-wrap { position: relative; top: auto; right: auto; margin-bottom: 2rem; }
304
+ .hero-avatar { width: 100px; height: 100px; }
305
+ .hero-profile { flex-direction: column; gap: 2rem; }
306
+ .hero-stats { flex-direction: row; gap: 2rem; }
307
+ .index-nav-inner { padding: 0.75rem 1.5rem; }
308
+ .index-content { padding: 0 1.5rem 4rem; }
309
+ .week-item { grid-template-columns: 1fr; gap: 0.5rem; }
310
+ .week-item::before { left: -1.5rem; }
311
+ .week-item-stats { margin-top: 0.5rem; }
312
+ .year-label { font-size: 3rem; }
313
+ }
314
+ </style>
12
315
  </head>
13
316
  <body>
14
- <div class="container">
15
- <header class="header">
16
- <div class="header-text">
17
- <h1>Weekly Reports</h1>
18
- <p class="date-range">All generated reports</p>
19
- </div>
20
- </header>
21
-
22
- <div class="section">
23
- <h2>Reports</h2>
24
- <table class="repo-table">
25
- <thead><tr><th>Week</th><th>Link</th></tr></thead>
26
- <tbody>
27
- {{#each reports}}
28
- <tr>
29
- <td>{{this.label}}</td>
30
- <td><a href="{{this.path}}/">View Report</a></td>
31
- </tr>
32
- {{/each}}
33
- </tbody>
34
- </table>
317
+
318
+ <nav class="index-nav">
319
+ <div class="index-nav-inner">
320
+ <span class="nav-site-title">{{siteTitle}}</span>
321
+ </div>
322
+ </nav>
323
+
324
+ <section class="hero">
325
+ <!-- Geometric decorations -->
326
+ <div class="geo-circle geo-circle-1"></div>
327
+ <div class="geo-circle geo-circle-2"></div>
328
+ <div class="geo-circle geo-circle-3"></div>
329
+ <div class="geo-line geo-line-1"></div>
330
+ <div class="geo-line geo-line-2"></div>
331
+ <div class="geo-dot geo-dot-1"></div>
332
+ <div class="geo-dot geo-dot-2"></div>
333
+ <div class="geo-dot geo-dot-3"></div>
334
+
335
+ {{#if avatarUrl}}
336
+ <a href="https://github.com/{{username}}" class="hero-avatar-wrap" target="_blank" rel="noopener nofollow">
337
+ <img src="{{avatarUrl}}" alt="{{username}}" class="hero-avatar" width="180" height="180" />
338
+ </a>
339
+ {{/if}}
340
+
341
+ <div class="hero-inner">
342
+ <h1 class="hero-title">{{siteTitle}}</h1>
343
+
344
+ {{#if username}}
345
+ <a href="https://github.com/{{username}}" class="hero-profile" target="_blank" rel="noopener nofollow">
346
+ <div class="hero-name-block">
347
+ <div class="hero-display-name">{{displayName}}</div>
348
+ <div class="hero-handle">@{{username}}</div>
349
+ {{#if profile.company}}<div class="hero-bio">{{profile.company}}</div>{{/if}}
350
+ {{#if profile.location}}<div class="hero-bio">{{profile.location}}</div>{{/if}}
351
+ </div>
352
+ {{#if profile}}
353
+ <div class="hero-stats">
354
+ {{#if profile.followers}}<div class="hero-stat"><span class="hero-stat-value">{{profile.followers}}</span>followers</div>{{/if}}
355
+ {{#if profile.publicRepos}}<div class="hero-stat"><span class="hero-stat-value">{{profile.publicRepos}}</span>repos</div>{{/if}}
356
+ </div>
357
+ {{/if}}
358
+ </a>
359
+ {{/if}}
35
360
  </div>
361
+ </section>
36
362
 
37
- <footer class="footer">
38
- <p>Generated by <a href="https://deariary.com?utm_source=github-weekly-reporter&utm_medium=footer">deariary</a></p>
39
- </footer>
363
+ <div class="index-content">
364
+ {{#each yearGroups}}
365
+ <div class="year-group">
366
+ <div class="year-label">{{this.year}}</div>
367
+ <div class="week-list">
368
+ {{#each this.reports}}
369
+ <a href="{{this.path}}/" class="week-item">
370
+ <div class="week-item-week">{{this.week}}</div>
371
+ <div class="week-item-content">
372
+ <div class="week-item-title">{{#if this.title}}{{this.title}}{{else}}Week {{this.week}}{{/if}}</div>
373
+ {{#if this.subtitle}}<div class="week-item-subtitle">{{this.subtitle}}</div>{{/if}}
374
+ <div class="week-item-date">{{this.dateLabel}}</div>
375
+ </div>
376
+ {{#if this.stats}}
377
+ <div class="week-item-stats">
378
+ <span class="week-item-stat stat-commits"><span class="week-item-stat-value">{{this.stats.commits}}</span> commits</span>
379
+ <span class="week-item-stat stat-prs"><span class="week-item-stat-value">{{this.stats.prs}}</span> PRs</span>
380
+ <span class="week-item-stat stat-reviews"><span class="week-item-stat-value">{{this.stats.reviews}}</span> reviews</span>
381
+ </div>
382
+ {{/if}}
383
+ </a>
384
+ {{/each}}
385
+ </div>
386
+ </div>
387
+ {{/each}}
40
388
  </div>
389
+
390
+ <footer class="footer">
391
+ {{poweredBy}} <a href="https://deariary.com?utm_source=github-weekly-reporter&utm_medium=footer" target="_blank" rel="noopener">deariary</a>
392
+ &nbsp;&middot;&nbsp;
393
+ {{generatedWith}} <a href="https://github.com/deariary/github-weekly-reporter" target="_blank" rel="noopener">github-weekly-reporter</a>
394
+ </footer>
395
+
41
396
  </body>
42
397
  </html>`;
43
- export const renderIndexPage = (reportPaths, theme = "default") => {
44
- const reports = reportPaths
45
- .sort()
46
- .reverse()
47
- .map((p) => ({ path: p, label: p.replace("/", " ") }));
398
+ const weekToDateLabel = (path) => {
399
+ const [year, week] = path.split("/");
400
+ return `${year} ${week}`;
401
+ };
402
+ const groupByYear = (reports) => {
403
+ const sorted = [...reports].sort((a, b) => b.path.localeCompare(a.path));
404
+ const groups = new Map();
405
+ sorted.forEach((r) => {
406
+ const existing = groups.get(r.year) ?? [];
407
+ existing.push(r);
408
+ groups.set(r.year, existing);
409
+ });
410
+ return [...groups.entries()].map(([year, reps]) => ({ year, reports: reps }));
411
+ };
412
+ export const renderIndexPage = (reports, pageData, language = "en", siteTitle) => {
413
+ const locale = getLocale(language);
414
+ const fontConfig = getFontConfig(language);
415
+ const resolvedSiteTitle = siteTitle ?? "Dev\nPulse";
48
416
  const template = Handlebars.compile(TEMPLATE);
49
- return template({ reports, css: buildCSS(theme) });
417
+ return template({
418
+ yearGroups: groupByYear(reports),
419
+ css: buildCSS(language),
420
+ username: pageData?.username,
421
+ avatarUrl: pageData?.avatarUrl,
422
+ profile: pageData?.profile,
423
+ displayName: pageData?.profile?.name ?? pageData?.username,
424
+ siteTitle: resolvedSiteTitle,
425
+ lang: language,
426
+ weeklyReports: locale.weeklyReports,
427
+ poweredBy: locale.poweredBy,
428
+ generatedWith: locale.generatedWith,
429
+ monoFamily: fontConfig.monoFamily,
430
+ accentColor: "#39d353",
431
+ });
50
432
  };
433
+ export const buildReportEntry = (path, title, subtitle, stats) => ({
434
+ path,
435
+ week: path.split("/")[1] ?? path,
436
+ year: path.split("/")[0] ?? "",
437
+ title,
438
+ subtitle,
439
+ dateLabel: weekToDateLabel(path),
440
+ stats,
441
+ });
51
442
  //# sourceMappingURL=index-page.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-page.js","sourceRoot":"","sources":["../../src/deployer/index-page.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAE1D,OAAO,UAAU,MAAM,YAAY,CAAC;AAEpC,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAOjD,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAsCT,CAAC;AAET,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,WAAqB,EAAE,QAAe,SAAS,EAAU,EAAE;IACzF,MAAM,OAAO,GAAkB,WAAW;SACvC,IAAI,EAAE;SACN,OAAO,EAAE;SACT,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAEzD,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9C,OAAO,QAAQ,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AACrD,CAAC,CAAC"}
1
+ {"version":3,"file":"index-page.js","sourceRoot":"","sources":["../../src/deployer/index-page.ts"],"names":[],"mappings":"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"}
@@ -3,5 +3,5 @@ export type WeekId = {
3
3
  week: number;
4
4
  path: string;
5
5
  };
6
- export declare const getWeekId: (date?: Date) => WeekId;
6
+ export declare const getWeekId: (date?: Date, timezone?: string) => WeekId;
7
7
  //# sourceMappingURL=week.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"week.d.ts","sourceRoot":"","sources":["../../src/deployer/week.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,MAAM,GAAG;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AASF,eAAO,MAAM,SAAS,GAAI,OAAM,IAAiB,KAAG,MAKnD,CAAC"}
1
+ {"version":3,"file":"week.d.ts","sourceRoot":"","sources":["../../src/deployer/week.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,MAAM,GAAG;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAwBF,eAAO,MAAM,SAAS,GACpB,OAAM,IAAiB,EACvB,WAAU,MAAc,KACvB,MAKF,CAAC"}
@@ -1,13 +1,24 @@
1
- // ISO week number calculation
2
- const getISOWeekNumber = (date) => {
3
- const d = new Date(Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()));
1
+ // ISO week number calculation (timezone-aware)
2
+ const localDateParts = (date, tz) => {
3
+ const fmt = new Intl.DateTimeFormat("en-CA", {
4
+ timeZone: tz,
5
+ year: "numeric",
6
+ month: "2-digit",
7
+ day: "2-digit",
8
+ });
9
+ const [year, month, day] = fmt.format(date).split("-").map(Number);
10
+ return { year, month: month - 1, day };
11
+ };
12
+ const getISOWeekNumber = (date, timezone) => {
13
+ const { year, month, day } = localDateParts(date, timezone);
14
+ const d = new Date(Date.UTC(year, month, day));
4
15
  d.setUTCDate(d.getUTCDate() + 4 - (d.getUTCDay() || 7));
5
16
  const yearStart = new Date(Date.UTC(d.getUTCFullYear(), 0, 1));
6
17
  return Math.ceil(((d.getTime() - yearStart.getTime()) / 86_400_000 + 1) / 7);
7
18
  };
8
- export const getWeekId = (date = new Date()) => {
9
- const year = date.getUTCFullYear();
10
- const week = getISOWeekNumber(date);
19
+ export const getWeekId = (date = new Date(), timezone = "UTC") => {
20
+ const { year } = localDateParts(date, timezone);
21
+ const week = getISOWeekNumber(date, timezone);
11
22
  const padded = String(week).padStart(2, "0");
12
23
  return { year, week, path: `${year}/W${padded}` };
13
24
  };
@@ -1 +1 @@
1
- {"version":3,"file":"week.js","sourceRoot":"","sources":["../../src/deployer/week.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAQ9B,MAAM,gBAAgB,GAAG,CAAC,IAAU,EAAU,EAAE;IAC9C,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IAC3F,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/D,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/E,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,OAAa,IAAI,IAAI,EAAE,EAAU,EAAE;IAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;IACnC,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC7C,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,KAAK,MAAM,EAAE,EAAE,CAAC;AACpD,CAAC,CAAC"}
1
+ {"version":3,"file":"week.js","sourceRoot":"","sources":["../../src/deployer/week.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAQ/C,MAAM,cAAc,GAAG,CACrB,IAAU,EACV,EAAU,EACoC,EAAE;IAChD,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;QAC3C,QAAQ,EAAE,EAAE;QACZ,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE,SAAS;KACf,CAAC,CAAC;IACH,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACnE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC;AACzC,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,IAAU,EAAE,QAAgB,EAAU,EAAE;IAChE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC5D,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/D,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/E,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,OAAa,IAAI,IAAI,EAAE,EACvB,WAAmB,KAAK,EAChB,EAAE;IACV,MAAM,EAAE,IAAI,EAAE,GAAG,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC7C,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,KAAK,MAAM,EAAE,EAAE,CAAC;AACpD,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { Language } from "../types.js";
2
+ export type FontConfig = {
3
+ importUrl: string;
4
+ bodyFamily: string;
5
+ monoFamily: string;
6
+ };
7
+ export declare const getFontConfig: (language: Language) => FontConfig;
8
+ //# sourceMappingURL=fonts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fonts.d.ts","sourceRoot":"","sources":["../../src/i18n/fonts.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,MAAM,UAAU,GAAG;IAEvB,SAAS,EAAE,MAAM,CAAC;IAElB,UAAU,EAAE,MAAM,CAAC;IAEnB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAmDF,eAAO,MAAM,aAAa,GAAI,UAAU,QAAQ,KAAG,UACtB,CAAC"}