diff --git a/api/streak.js b/api/streak.js
index cd1cef0..0cf4817 100644
--- a/api/streak.js
+++ b/api/streak.js
@@ -49,10 +49,27 @@ module.exports = async (req, res) => {
let longestStreak = 0;
let tempStreak = 0;
+ // Corrected streak logic: find last day with activity and check if it's today/yesterday
+ const today = new Date().toISOString().split('T')[0];
+ const yesterday = new Date(Date.now() - 86400000).toISOString().split('T')[0];
+
+ let lastActiveIndex = -1;
for (let i = sortedDays.length - 1; i >= 0; i--) {
- if (sortedDays[i].count > 0) currentStreak++;
- else break;
+ if (sortedDays[i].count > 0) {
+ if (sortedDays[i].date === today || sortedDays[i].date === yesterday) {
+ lastActiveIndex = i;
+ }
+ break;
+ }
+ }
+
+ if (lastActiveIndex !== -1) {
+ for (let i = lastActiveIndex; i >= 0; i--) {
+ if (sortedDays[i].count > 0) currentStreak++;
+ else break;
+ }
}
+
for (const day of sortedDays) {
if (day.count > 0) { tempStreak++; longestStreak = Math.max(longestStreak, tempStreak); }
else tempStreak = 0;
diff --git a/src/svg-language.js b/src/svg-language.js
index 10f5bc7..0172b0c 100644
--- a/src/svg-language.js
+++ b/src/svg-language.js
@@ -20,7 +20,7 @@ function generateLanguageSVG(options) {
const barY = headerHeight + 8;
const listStartY = barY + barHeight + 20;
const listItemHeight = 24;
- const cols = Math.min(topLangs.length, 6);
+ const cols = Math.min(topLangs.length, 3);
const rows = Math.ceil(topLangs.length / cols);
const listHeight = rows * listItemHeight;
const cardWidth = 460;
@@ -48,10 +48,13 @@ function generateLanguageSVG(options) {
const color = getLanguageColor(lang.name);
const pct = lang.percentage >= 10 ? Math.round(lang.percentage) : lang.percentage.toFixed(1);
+ const maxLabelLen = 18;
+ const displayName = lang.name.length > maxLabelLen ? lang.name.substring(0, maxLabelLen - 3) + "..." : lang.name;
+
langList += `
- ${escapeXml(lang.name)}
+ ${escapeXml(displayName)}
${pct}%
`;
});
@@ -96,13 +99,23 @@ function generateLanguageCompactSVG(options) {
});
let labels = "";
- let labelX = padX;
- topLangs.forEach((lang) => {
+ const cols = 3;
+ const colWidth = (cardWidth - padX * 2) / cols;
+
+ topLangs.forEach((lang, index) => {
const color = getLanguageColor(lang.name);
const pct = lang.percentage >= 10 ? Math.round(lang.percentage) : lang.percentage.toFixed(1);
- labels += ``;
- labels += `${escapeXml(lang.name)} ${pct}%`;
- labelX += 84;
+
+ const col = index % cols;
+ const row = Math.floor(index / cols);
+ const labelX = padX + col * colWidth;
+ const labelY = 84 + row * 18;
+
+ const maxLabelLen = 16;
+ const displayName = lang.name.length > maxLabelLen ? lang.name.substring(0, maxLabelLen - 3) + "..." : lang.name;
+
+ labels += ``;
+ labels += `${escapeXml(displayName)} ${pct}%`;
});
return `