@@ -4086,6 +4086,104 @@ if (window.performance && window.performance.mark) {
40864086 console . log ( "✓ Performance markers available" ) ;
40874087}
40884088
4089+ // ===================================================================
4090+ // Tool Tips for components with Alpine.js
4091+ // ===================================================================
4092+
4093+ /* global Alpine */
4094+ function setupTooltipsWithAlpine ( ) {
4095+ document . addEventListener ( "alpine:init" , ( ) => {
4096+ console . log ( "Initializing Alpine tooltip directive..." ) ;
4097+
4098+ Alpine . directive ( "tooltip" , ( el , { expression } , { evaluate } ) => {
4099+ let tooltipEl = null ;
4100+
4101+ const moveTooltip = ( e ) => {
4102+ if ( ! tooltipEl ) {
4103+ return ;
4104+ }
4105+
4106+ const paddingX = 12 ;
4107+ const paddingY = 20 ;
4108+ const tipRect = tooltipEl . getBoundingClientRect ( ) ;
4109+
4110+ let left = e . clientX + paddingX ;
4111+ let top = e . clientY + paddingY ;
4112+
4113+ if ( left + tipRect . width > window . innerWidth - 8 ) {
4114+ left = e . clientX - tipRect . width - paddingX ;
4115+ }
4116+ if ( top + tipRect . height > window . innerHeight - 8 ) {
4117+ top = e . clientY - tipRect . height - paddingY ;
4118+ }
4119+
4120+ tooltipEl . style . left = `${ left } px` ;
4121+ tooltipEl . style . top = `${ top } px` ;
4122+ } ;
4123+
4124+ const showTooltip = ( event ) => {
4125+ const text = evaluate ( expression ) ;
4126+ if ( ! text ) {
4127+ return ;
4128+ }
4129+
4130+ hideTooltip ( ) ; // Clean up any existing tooltip
4131+
4132+ tooltipEl = document . createElement ( "div" ) ;
4133+ tooltipEl . textContent = text ;
4134+ tooltipEl . setAttribute ( "role" , "tooltip" ) ;
4135+ tooltipEl . className =
4136+ "fixed z-50 max-w-xs px-3 py-2 text-sm text-white bg-black/80 rounded-lg shadow-lg pointer-events-none opacity-0 transition-opacity duration-200" ;
4137+
4138+ document . body . appendChild ( tooltipEl ) ;
4139+
4140+ if ( event ?. clientX && event ?. clientY ) {
4141+ moveTooltip ( event ) ;
4142+ el . addEventListener ( "mousemove" , moveTooltip ) ;
4143+ } else {
4144+ const rect = el . getBoundingClientRect ( ) ;
4145+ const scrollY = window . scrollY || window . pageYOffset ;
4146+ const scrollX = window . scrollX || window . pageXOffset ;
4147+ tooltipEl . style . left = `${ rect . left + scrollX } px` ;
4148+ tooltipEl . style . top = `${ rect . bottom + scrollY + 10 } px` ;
4149+ }
4150+
4151+ requestAnimationFrame ( ( ) => {
4152+ tooltipEl . style . opacity = "1" ;
4153+ } ) ;
4154+ window . addEventListener ( "scroll" , hideTooltip , {
4155+ passive : true ,
4156+ } ) ;
4157+ window . addEventListener ( "resize" , hideTooltip , {
4158+ passive : true ,
4159+ } ) ;
4160+ } ;
4161+
4162+ const hideTooltip = ( ) => {
4163+ if ( ! tooltipEl ) {
4164+ return ;
4165+ }
4166+
4167+ tooltipEl . style . opacity = "0" ;
4168+ el . removeEventListener ( "mousemove" , moveTooltip ) ;
4169+ window . removeEventListener ( "scroll" , hideTooltip ) ;
4170+ window . removeEventListener ( "resize" , hideTooltip ) ;
4171+ el . addEventListener ( "click" , hideTooltip ) ;
4172+ const toRemove = tooltipEl ;
4173+ tooltipEl = null ;
4174+ setTimeout ( ( ) => toRemove . remove ( ) , 200 ) ;
4175+ } ;
4176+ el . addEventListener ( "mouseenter" , showTooltip ) ;
4177+ el . addEventListener ( "mouseleave" , hideTooltip ) ;
4178+ el . addEventListener ( "focus" , showTooltip ) ;
4179+ el . addEventListener ( "blur" , hideTooltip ) ;
4180+ el . addEventListener ( "click" , hideTooltip ) ;
4181+ } ) ;
4182+ } ) ;
4183+ }
4184+
4185+ setupTooltipsWithAlpine ( ) ;
4186+
40894187// ===================================================================
40904188// SINGLE CONSOLIDATED INITIALIZATION SYSTEM
40914189// ===================================================================
@@ -4094,6 +4192,8 @@ document.addEventListener("DOMContentLoaded", () => {
40944192 console . log ( "🔐 DOM loaded - initializing secure admin interface..." ) ;
40954193
40964194 try {
4195+ // initializeTooltips();
4196+
40974197 // 1. Initialize CodeMirror editors first
40984198 initializeCodeMirrorEditors ( ) ;
40994199
0 commit comments