@@ -665,6 +665,16 @@ const Dashboard = (function() {
665665 * @param {Object } event - The event object
666666 * @param {boolean } skipRender - If true, skip DOM rendering (used for batch init)
667667 */
668+ /**
669+ * Builds the timestamp HTML with a local-time tooltip
670+ */
671+ function buildTimestampHtml ( isoTimestamp ) {
672+ const dt = new Date ( isoTimestamp ) ;
673+ const utcTime = dt . toLocaleTimeString ( 'en-US' , { hour12 : false , timeZone : 'UTC' } ) + ' UTC' ;
674+ const localTime = dt . toLocaleTimeString ( 'en-US' , { hour12 : false } ) ;
675+ return `<span class="timestamp">${ utcTime } <span class="timestamp-tooltip">Local Time: ${ localTime } </span></span>` ;
676+ }
677+
668678 function addEventToLog ( event , skipRender ) {
669679 eventLog . unshift ( event ) ;
670680 if ( skipRender ) return ;
@@ -673,7 +683,7 @@ const Dashboard = (function() {
673683 if ( logEl ) {
674684 const levelClass = event . level . toLowerCase ( ) ;
675685 const simClass = getSimulationClass ( event . simulationType ) ;
676- const time = new Date ( event . timestamp ) . toLocaleTimeString ( 'en-US' , { hour12 : false , timeZone : 'UTC' } ) + ' UTC' ;
686+ const timestampHtml = buildTimestampHtml ( event . timestamp ) ;
677687 const emoji = getSimulationEmoji ( event . simulationType , event . event ) ;
678688 const prefix = emoji ? emoji + ' ' : '' ;
679689
@@ -692,13 +702,13 @@ const Dashboard = (function() {
692702
693703 if ( isSimulationBoundaryEvent ) {
694704 // Make the message text clickable with dotted underline
695- eventDiv . innerHTML = `<span class="timestamp"> ${ time } </span> ${ prefix } <span class="sim-message"
705+ eventDiv . innerHTML = `${ timestampHtml } ${ prefix } <span class="sim-message"
696706 data-sim-id="${ event . simulationId } "
697707 title="Click to copy Simulation ID: ${ event . simulationId } "
698708 onclick="Dashboard.copySimulationId('${ event . simulationId } ', this)">${ event . message } </span>` ;
699709 } else {
700710 // Regular event without clickable simulation ID
701- eventDiv . innerHTML = `<span class="timestamp"> ${ time } </span> ${ prefix } ${ event . message } ` ;
711+ eventDiv . innerHTML = `${ timestampHtml } ${ prefix } ${ event . message } ` ;
702712 }
703713
704714 logEl . insertBefore ( eventDiv , logEl . firstChild ) ;
@@ -720,7 +730,7 @@ const Dashboard = (function() {
720730 eventLog . forEach ( event => {
721731 const levelClass = event . level . toLowerCase ( ) ;
722732 const simClass = getSimulationClass ( event . simulationType ) ;
723- const time = new Date ( event . timestamp ) . toLocaleTimeString ( 'en-US' , { hour12 : false , timeZone : 'UTC' } ) + ' UTC' ;
733+ const timestampHtml = buildTimestampHtml ( event . timestamp ) ;
724734 const emoji = getSimulationEmoji ( event . simulationType , event . event ) ;
725735 const prefix = emoji ? emoji + ' ' : '' ;
726736 const nonSimClass = simClass ? '' : 'non-sim' ;
@@ -737,12 +747,12 @@ const Dashboard = (function() {
737747 event . event === 'MEMORY_RELEASED' ) ;
738748
739749 if ( isSimulationBoundaryEvent ) {
740- eventDiv . innerHTML = `<span class="timestamp"> ${ time } </span> ${ prefix } <span class="sim-message"
750+ eventDiv . innerHTML = `${ timestampHtml } ${ prefix } <span class="sim-message"
741751 data-sim-id="${ event . simulationId } "
742752 title="Click to copy Simulation ID: ${ event . simulationId } "
743753 onclick="Dashboard.copySimulationId('${ event . simulationId } ', this)">${ event . message } </span>` ;
744754 } else {
745- eventDiv . innerHTML = `<span class="timestamp"> ${ time } </span> ${ prefix } ${ event . message } ` ;
755+ eventDiv . innerHTML = `${ timestampHtml } ${ prefix } ${ event . message } ` ;
746756 }
747757
748758 logEl . appendChild ( eventDiv ) ;
0 commit comments