@@ -132,8 +132,19 @@ export class SummaryViewProvider implements vscode.WebviewViewProvider {
132132 --border-color: var(--vscode-panel-border);
133133 --header-background: var(--vscode-titleBar-activeBackground);
134134 --header-foreground: var(--vscode-titleBar-activeForeground);
135- --chart-grid-color: var(--vscode-panel-border);
136- --chart-text-color: var(--vscode-editor-foreground);
135+ --chart-grid-color: rgba(255, 255, 255, 0.1);
136+ --chart-text-color: rgba(255, 255, 255, 0.9);
137+ --input-background: var(--vscode-input-background);
138+ --input-foreground: var(--vscode-input-foreground);
139+ --input-border: var(--vscode-input-border);
140+ --button-background: var(--vscode-button-background);
141+ --button-foreground: var(--vscode-button-foreground);
142+ --button-hover: var(--vscode-button-hoverBackground);
143+ --cell-background-0: var(--vscode-editor-background);
144+ --cell-background-1: color-mix(in srgb, var(--vscode-charts-blue) 30%, transparent);
145+ --cell-background-2: color-mix(in srgb, var(--vscode-charts-blue) 50%, transparent);
146+ --cell-background-3: color-mix(in srgb, var(--vscode-charts-blue) 70%, transparent);
147+ --cell-background-4: color-mix(in srgb, var(--vscode-charts-blue) 90%, transparent);
137148 }
138149 body {
139150 font-family: var(--vscode-font-family);
@@ -319,11 +330,11 @@ export class SummaryViewProvider implements vscode.WebviewViewProvider {
319330 .heatmap-cell:hover {
320331 transform: scale(1.1);
321332 }
322- .heatmap-cell[data-level="0"] { background-color: var(--vscode-editor- background); }
323- .heatmap-cell[data-level="1"] { background-color: #4a72b0 ; }
324- .heatmap-cell[data-level="2"] { background-color: #3861a5 ; }
325- .heatmap-cell[data-level="3"] { background-color: #254b91 ; }
326- .heatmap-cell[data-level="4"] { background-color: #1a3b7c ; }
333+ .heatmap-cell[data-level="0"] { background-color: var(--cell- background-0 ); }
334+ .heatmap-cell[data-level="1"] { background-color: var(--cell-background-1) ; }
335+ .heatmap-cell[data-level="2"] { background-color: var(--cell-background-2) ; }
336+ .heatmap-cell[data-level="3"] { background-color: var(--cell-background-3) ; }
337+ .heatmap-cell[data-level="4"] { background-color: var(--cell-background-4) ; }
327338 .heatmap-legend {
328339 display: flex;
329340 align-items: center;
@@ -429,6 +440,96 @@ export class SummaryViewProvider implements vscode.WebviewViewProvider {
429440 <script>
430441 const vscode = acquireVsCodeApi();
431442
443+ // Get theme colors
444+ const isDarkTheme = document.body.classList.contains('vscode-dark');
445+ const style = getComputedStyle(document.documentElement);
446+
447+ // Theme-aware colors
448+ const chartColors = {
449+ text: isDarkTheme ? 'rgba(255, 255, 255, 0.9)' : 'rgba(0, 0, 0, 0.9)',
450+ background: style.getPropertyValue('--vscode-editor-background'),
451+ grid: isDarkTheme ? 'rgba(255, 255, 255, 0.1)' : 'rgba(0, 0, 0, 0.1)',
452+ accent: style.getPropertyValue('--vscode-textLink-foreground'),
453+ chartBlues: [
454+ 'rgba(64, 159, 255, 0.8)',
455+ 'rgba(49, 120, 198, 0.8)',
456+ 'rgba(35, 86, 141, 0.8)',
457+ 'rgba(28, 69, 113, 0.8)',
458+ 'rgba(21, 52, 85, 0.8)'
459+ ]
460+ };
461+
462+ // Common chart configuration
463+ const commonChartConfig = {
464+ responsive: true,
465+ maintainAspectRatio: false,
466+ scales: {
467+ y: {
468+ beginAtZero: true,
469+ grid: {
470+ color: chartColors.grid,
471+ borderColor: chartColors.grid,
472+ lineWidth: 0.5
473+ },
474+ ticks: {
475+ color: chartColors.text,
476+ font: {
477+ size: 12,
478+ weight: '500'
479+ },
480+ padding: 8
481+ },
482+ title: {
483+ display: true,
484+ color: chartColors.text
485+ }
486+ },
487+ x: {
488+ grid: {
489+ color: chartColors.grid,
490+ borderColor: chartColors.grid,
491+ lineWidth: 0.5
492+ },
493+ ticks: {
494+ color: chartColors.text,
495+ font: {
496+ size: 12,
497+ weight: '500'
498+ },
499+ padding: 8
500+ },
501+ title: {
502+ display: true,
503+ color: chartColors.text
504+ }
505+ }
506+ },
507+ plugins: {
508+ legend: {
509+ display: true,
510+ position: 'top',
511+ labels: {
512+ color: chartColors.text,
513+ font: {
514+ size: 12,
515+ weight: '600'
516+ },
517+ padding: 20,
518+ usePointStyle: true
519+ }
520+ },
521+ tooltip: {
522+ backgroundColor: isDarkTheme ? 'rgba(0, 0, 0, 0.8)' : 'rgba(255, 255, 255, 0.8)',
523+ titleColor: chartColors.text,
524+ bodyColor: chartColors.text,
525+ borderColor: chartColors.grid,
526+ borderWidth: 1,
527+ padding: 12,
528+ displayColors: false
529+ }
530+ }
531+ };
532+
432533 window.addEventListener('message', event => {
433534 const message = event.data;
434535 if (message.command === 'update') {
@@ -482,7 +583,7 @@ export class SummaryViewProvider implements vscode.WebviewViewProvider {
482583 const content = document.getElementById('content');
483584 content.innerHTML = \`
484585 <div class="chart-container">
485- <div class="chart-title">Project Summary</div>
586+ <div class="chart-title">Project Summary 1 </div>
486587 <div class="chart-wrapper">
487588 <canvas id="projectChart"></canvas>
488589 </div>
@@ -495,109 +596,94 @@ export class SummaryViewProvider implements vscode.WebviewViewProvider {
495596 </div>
496597 \`;
497598
498- // Create project summary chart
599+ // Project summary chart
499600 const projectCtx = document.getElementById('projectChart').getContext('2d');
500601 const projectData = Object.entries(data.projectSummary)
501602 .sort((a, b) => b[1] - a[1])
502- .slice(0, 5); // Show top 5 projects
603+ .slice(0, 5);
503604
504605 new Chart(projectCtx, {
505606 type: 'bar',
506607 data: {
507608 labels: projectData.map(([project]) => project),
508609 datasets: [{
509610 label: 'Coding Time (hours)',
510- data: projectData.map(([_, time]) => time / 60 ),
511- backgroundColor: 'rgba(74, 114, 176, 0.7)' ,
512- borderColor: 'rgba(74, 114, 176, 1)' ,
611+ data: projectData.map(([_, time]) => time / 3600 ),
612+ backgroundColor: chartColors.chartBlues ,
613+ borderColor: chartColors.grid ,
513614 borderWidth: 1
514615 }]
515616 },
516617 options: {
517- responsive: true,
518- maintainAspectRatio: false,
519- scales: {
520- y: {
521- beginAtZero: true,
522- grid: {
523- color: 'var(--chart-grid-color)'
524- },
525- ticks: {
526- color: 'var(--chart-text-color)'
527- }
528- },
529- x: {
530- grid: {
531- color: 'var(--chart-grid-color)'
532- },
533- ticks: {
534- color: 'var(--chart-text-color)'
535- }
536- }
537- },
618+ ...commonChartConfig,
619+ indexAxis: 'y',
538620 plugins: {
539- legend: {
540- labels: {
541- color: 'var(--chart-text-color)'
621+ ...commonChartConfig.plugins,
622+ tooltip: {
623+ ...commonChartConfig.plugins.tooltip,
624+ callbacks: {
625+ label: function(context) {
626+ const hours = context.raw;
627+ return \`\${Math.floor(hours)}h \${Math.round((hours % 1) * 60)}m\`;
628+ }
542629 }
543630 }
544631 }
545632 }
546633 });
547634
548- // Create daily summary chart
635+ // Daily summary chart
549636 const dailyCtx = document.getElementById('dailyChart').getContext('2d');
550637 const dailyData = Object.entries(data.dailySummary)
551- .sort((a, b) => b [0].localeCompare(a [0]))
552- .slice(0, 7);
638+ .sort((a, b) => new Date(a [0]).getTime() - new Date(b [0]).getTime( ))
639+ .slice(- 7);
553640
554641 new Chart(dailyCtx, {
555642 type: 'line',
556643 data: {
557- labels: dailyData.map(([date]) => date),
644+ labels: dailyData.map(([date]) => {
645+ const d = new Date(date);
646+ return d.toLocaleDateString('en-US', { weekday: 'short', month: 'short', day: 'numeric' });
647+ }),
558648 datasets: [{
559649 label: 'Coding Time (hours)',
560- data: dailyData.map(([_, time]) => time / 60 ),
650+ data: dailyData.map(([_, time]) => time / 3600 ),
561651 fill: true,
562- backgroundColor: 'rgba(74, 114, 176, 0.2)',
563- borderColor: 'rgba(74, 114, 176, 1)',
564- tension: 0.4
652+ backgroundColor: \`\${chartColors.accent}33\`,
653+ borderColor: chartColors.accent,
654+ borderWidth: 2,
655+ tension: 0.4,
656+ pointBackgroundColor: chartColors.accent,
657+ pointBorderColor: chartColors.background,
658+ pointBorderWidth: 2,
659+ pointRadius: 4,
660+ pointHoverRadius: 6
565661 }]
566662 },
567663 options: {
568- responsive: true,
569- maintainAspectRatio: false,
664+ ...commonChartConfig,
570665 scales: {
666+ ...commonChartConfig.scales,
571667 y: {
572- beginAtZero: true,
573- grid: {
574- color: 'var(--chart-grid-color)'
575- },
668+ ...commonChartConfig.scales.y,
576669 ticks: {
577- color: 'var(--chart-text-color)'
670+ ...commonChartConfig.scales.y.ticks,
671+ callback: function(value) {
672+ return \`\${value}h\`;
673+ }
578674 }
579675 },
580676 x: {
581- grid: {
582- color: 'var(--chart-grid-color)'
583- },
677+ ...commonChartConfig.scales.x,
584678 ticks: {
585- color: 'var(--chart-text-color)'
586- }
587- }
588- },
589- plugins: {
590- legend: {
591- labels: {
592- color: 'var(--chart-text-color)'
679+ ...commonChartConfig.scales.x.ticks,
680+ maxRotation: 45,
681+ minRotation: 45
593682 }
594683 }
595684 }
596685 }
597686 });
598-
599- // Add heatmap creation
600- createHeatmap(data);
601687 }
602688
603689 function displaySearchResult(entries) {
0 commit comments