diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 4772e19..6af2095 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -660,7 +660,7 @@ export default function App() { value={gainModeDb} onChange={(e) => setGainModeDb(Math.max(-24, Math.min(24, Number(e.target.value) || 0)))} className="w-16 px-1.5 py-1 text-xs bg-editor-surface border border-editor-border rounded text-editor-text focus:outline-none focus:border-editor-accent" - data-tooltip="Volume adjustment in decibels for new gain zones — positive boosts, negative reduces" + title="Volume adjustment in decibels for new gain zones — positive boosts, negative reduces" disabled={!canEdit} /> @@ -681,7 +681,7 @@ export default function App() { value={speedModeValue} onChange={(e) => setSpeedModeValue(Math.max(0.25, Math.min(4, Number(e.target.value) || 1)))} className="w-16 px-1.5 py-1 text-xs bg-editor-surface border border-editor-border rounded text-editor-text focus:outline-none focus:border-editor-accent" - data-tooltip="Playback speed multiplier for new speed zones — 1x is normal, 2x is double speed" + title="Playback speed multiplier for new speed zones — 1x is normal, 2x is double speed" disabled={!canEdit} /> @@ -754,7 +754,7 @@ export default function App() { @@ -53,7 +53,7 @@ export default function AppendClipPanel() { onClick={() => reorderAdditionalClip(clip.id, 1)} disabled={idx === additionalClips.length - 1} className="p-0.5 rounded hover:bg-editor-bg disabled:opacity-30 text-editor-text-muted hover:text-editor-text" - data-tooltip="Move down" + title="Move down" > @@ -61,7 +61,7 @@ export default function AppendClipPanel() { @@ -74,7 +74,7 @@ export default function AppendClipPanel() { onClick={handleAddClip} disabled={!videoPath} className="w-full flex items-center justify-center gap-2 px-3 py-2 rounded-lg border-2 border-dashed border-editor-border text-xs text-editor-text-muted hover:text-editor-text hover:border-editor-text-muted disabled:opacity-40 transition-colors" - data-tooltip="Select a video or audio file to append during export" + title="Select a video or audio file to append during export" > Add Clip diff --git a/frontend/src/components/BackgroundMusicPanel.tsx b/frontend/src/components/BackgroundMusicPanel.tsx index 83355de..8ed8ba2 100644 --- a/frontend/src/components/BackgroundMusicPanel.tsx +++ b/frontend/src/components/BackgroundMusicPanel.tsx @@ -38,7 +38,7 @@ export default function BackgroundMusicPanel() { @@ -71,7 +71,7 @@ export default function BackgroundMusicPanel() { value={backgroundMusic.volumeDb} onChange={(e) => updateBackgroundMusic({ volumeDb: Number(e.target.value) })} className="flex-1 h-1.5" - data-tooltip="Background music volume relative to main audio — positive boosts, negative reduces" + title="Background music volume relative to main audio — positive boosts, negative reduces" /> {backgroundMusic.volumeDb} dB @@ -83,7 +83,7 @@ export default function BackgroundMusicPanel() { checked={backgroundMusic.duckingEnabled} onChange={(e) => updateBackgroundMusic({ duckingEnabled: e.target.checked })} className="w-4 h-4 rounded bg-editor-surface border-editor-border accent-editor-accent" - data-tooltip="Automatically lower music volume when speech is detected" + title="Automatically lower music volume when speech is detected" />
Auto-ducking @@ -105,7 +105,7 @@ export default function BackgroundMusicPanel() { value={backgroundMusic.duckingDb} onChange={(e) => updateBackgroundMusic({ duckingDb: Number(e.target.value) })} className="flex-1 h-1.5" - data-tooltip="How much to reduce music volume during speech (1-20 dB)" + title="How much to reduce music volume during speech (1-20 dB)" /> {backgroundMusic.duckingDb} dB
@@ -119,7 +119,7 @@ export default function BackgroundMusicPanel() { value={backgroundMusic.duckingAttackMs} onChange={(e) => updateBackgroundMusic({ duckingAttackMs: Number(e.target.value) })} className="flex-1 h-1.5" - data-tooltip="How quickly the ducking effect engages when speech starts" + title="How quickly the ducking effect engages when speech starts" /> {backgroundMusic.duckingAttackMs}ms @@ -133,7 +133,7 @@ export default function BackgroundMusicPanel() { value={backgroundMusic.duckingReleaseMs} onChange={(e) => updateBackgroundMusic({ duckingReleaseMs: Number(e.target.value) })} className="flex-1 h-1.5" - data-tooltip="How quickly the ducking effect fades when speech ends" + title="How quickly the ducking effect fades when speech ends" /> {backgroundMusic.duckingReleaseMs}ms diff --git a/frontend/src/components/ExportDialog.tsx b/frontend/src/components/ExportDialog.tsx index cc4c9ad..1891252 100644 --- a/frontend/src/components/ExportDialog.tsx +++ b/frontend/src/components/ExportDialog.tsx @@ -252,7 +252,7 @@ export default function ExportDialog() { { value: '1080p', label: '1080p (Full HD)' }, { value: '4k', label: '4K (Ultra HD)' }, ]} - data-tooltip="Output video resolution — higher resolution = larger file" + title="Output video resolution — higher resolution = larger file" /> )} @@ -267,7 +267,7 @@ export default function ExportDialog() { { value: 'webm', label: 'WebM (VP9)' }, ...(isAudioOnly ? [{ value: 'wav' as const, label: 'WAV (Uncompressed)' }] : []), ]} - data-tooltip="Output container format — MP4 is most compatible" + title="Output container format — MP4 is most compatible" /> {/* Video zoom / punch-in */} @@ -278,7 +278,7 @@ export default function ExportDialog() { checked={options.zoom?.enabled || false} onChange={(e) => setOptions((o) => ({ ...o, zoom: { ...o.zoom!, enabled: e.target.checked } }))} className="w-4 h-4 rounded bg-editor-surface border-editor-border accent-editor-accent" - data-tooltip="Crop and reposition the video frame — useful for removing black bars or reframing" + title="Crop and reposition the video frame — useful for removing black bars or reframing" />
@@ -302,7 +302,7 @@ export default function ExportDialog() { value={options.zoom?.zoomFactor || 1} onChange={(e) => setOptions((o) => ({ ...o, zoom: { ...o.zoom!, zoomFactor: Number(e.target.value) } }))} className="flex-1 h-1.5" - data-tooltip="Magnification level — 1.0x is original, higher values zoom in" + title="Magnification level — 1.0x is original, higher values zoom in" /> {options.zoom?.zoomFactor?.toFixed(2)}x
@@ -316,7 +316,7 @@ export default function ExportDialog() { value={options.zoom?.panX || 0} onChange={(e) => setOptions((o) => ({ ...o, zoom: { ...o.zoom!, panX: Number(e.target.value) } }))} className="flex-1 h-1.5" - data-tooltip="Horizontal position of the crop window — negative moves left, positive moves right" + title="Horizontal position of the crop window — negative moves left, positive moves right" /> {((options.zoom?.panX || 0) * 100).toFixed(0)}% @@ -330,7 +330,7 @@ export default function ExportDialog() { value={options.zoom?.panY || 0} onChange={(e) => setOptions((o) => ({ ...o, zoom: { ...o.zoom!, panY: Number(e.target.value) } }))} className="flex-1 h-1.5" - data-tooltip="Vertical position of the crop window — negative moves up, positive moves down" + title="Vertical position of the crop window — negative moves up, positive moves down" /> {((options.zoom?.panY || 0) * 100).toFixed(0)}% @@ -347,7 +347,7 @@ export default function ExportDialog() { checked={options.removeBackground || false} onChange={(e) => setOptions((o) => ({ ...o, removeBackground: e.target.checked }))} className="w-4 h-4 rounded bg-editor-surface border-editor-border accent-editor-accent" - data-tooltip="Remove or replace the background behind the speaker" + title="Remove or replace the background behind the speaker" />
@@ -416,7 +416,7 @@ export default function ExportDialog() { checked={options.normalizeAudio} onChange={(e) => setOptions((o) => ({ ...o, normalizeAudio: e.target.checked }))} className="w-4 h-4 rounded bg-editor-surface border-editor-border accent-editor-accent" - data-tooltip="Normalize audio to a consistent loudness target" + title="Normalize audio to a consistent loudness target" />
Normalize loudness @@ -432,7 +432,7 @@ export default function ExportDialog() { value={options.normalizeTarget} onChange={(e) => setOptions((o) => ({ ...o, normalizeTarget: Number(e.target.value) }))} className="flex-1 px-2 py-1.5 text-xs bg-editor-surface border border-editor-border rounded focus:outline-none focus:border-editor-accent [color-scheme:dark]" - data-tooltip="Loudness target — YouTube (-14), Spotify (-16), Broadcast (-23)" + title="Loudness target — YouTube (-14), Spotify (-16), Broadcast (-23)" > @@ -451,7 +451,7 @@ export default function ExportDialog() { checked={options.enhanceAudio} onChange={(e) => setOptions((o) => ({ ...o, enhanceAudio: e.target.checked }))} className="w-4 h-4 rounded bg-editor-surface border-editor-border accent-editor-accent" - data-tooltip="Apply noise reduction and speech enhancement" + title="Apply noise reduction and speech enhancement" /> Enhance audio (Studio Sound) @@ -466,7 +466,7 @@ export default function ExportDialog() { { value: 'burn-in', label: 'Burn-in (permanent)' }, { value: 'sidecar', label: 'Sidecar SRT file' }, ]} - data-tooltip="Burn captions into video, export as separate SRT/VTT file, or none" + title="Burn captions into video, export as separate SRT/VTT file, or none" /> {/* Transcript-only export */} @@ -491,7 +491,7 @@ export default function ExportDialog() { onClick={handleTranscriptExport} disabled={isTranscribingTranscript || words.length === 0} className="flex items-center gap-1.5 px-3 py-1.5 text-xs rounded bg-editor-accent/20 text-editor-accent hover:bg-editor-accent/30 disabled:opacity-40 transition-colors" - data-tooltip="Export just the transcript text or subtitles without the video" + title="Export just the transcript text or subtitles without the video" > {isTranscribingTranscript ? ( @@ -508,7 +508,7 @@ export default function ExportDialog() { onClick={handleExport} disabled={isExporting || !videoPath} className="w-full flex items-center justify-center gap-2 px-4 py-3 bg-editor-accent hover:bg-editor-accent-hover disabled:opacity-50 rounded-lg text-sm font-semibold transition-colors" - data-tooltip="Start export with current settings" + title="Start export with current settings" > {isExporting ? ( <> diff --git a/frontend/src/components/LicenseDialog.tsx b/frontend/src/components/LicenseDialog.tsx index 5d8ba79..096e873 100644 --- a/frontend/src/components/LicenseDialog.tsx +++ b/frontend/src/components/LicenseDialog.tsx @@ -144,7 +144,7 @@ function LicenseActivateDialog({ diff --git a/frontend/src/components/MarkersPanel.tsx b/frontend/src/components/MarkersPanel.tsx index ea5760a..eeadc19 100644 --- a/frontend/src/components/MarkersPanel.tsx +++ b/frontend/src/components/MarkersPanel.tsx @@ -92,7 +92,7 @@ export default function MarkersPanel() { - + + )}
@@ -151,7 +151,7 @@ export default function MarkersPanel() {
@@ -182,7 +182,7 @@ export default function SettingsPanel() { value={confidenceThreshold} onChange={(e) => setConfidenceThreshold(Number(e.target.value))} className="flex-1 h-1.5" - data-tooltip="Words below this confidence get an orange underline — lower values show fewer warnings" + title="Words below this confidence get an orange underline — lower values show fewer warnings" /> setConfidenceThreshold(Math.max(0, Math.min(1, Number(e.target.value) || 0)))} className="w-16 px-2 py-1 bg-editor-bg border border-editor-border rounded-lg text-xs text-editor-text focus:outline-none focus:border-editor-accent" - data-tooltip="Words below this confidence get an orange underline — lower values show fewer warnings" + title="Words below this confidence get an orange underline — lower values show fewer warnings" />
@@ -212,14 +212,14 @@ export default function SettingsPanel() { @@ -243,12 +243,12 @@ export default function SettingsPanel() { onKeyDown={(e) => handleKeyCapture(e, i)} className="w-28 px-2 py-1 text-[10px] font-mono bg-editor-bg border border-editor-border rounded text-center focus:outline-none focus:border-editor-accent" placeholder="Type shortcut" - data-tooltip="Click then press the desired key combination" + title="Click then press the desired key combination" /> @@ -311,7 +311,7 @@ export default function SettingsPanel() { onClick={() => handleDeleteModel(m)} disabled={deleting === m.path} className="p-1.5 rounded text-editor-text-muted hover:text-red-400 hover:bg-red-500/10 transition-colors disabled:opacity-40" - data-tooltip="Delete model" + title="Delete model" > @@ -323,7 +323,7 @@ export default function SettingsPanel() { onClick={fetchModels} disabled={loadingModels} className="text-[10px] text-editor-accent hover:underline flex items-center gap-0.5" - data-tooltip="Refresh list of downloaded models" + title="Refresh list of downloaded models" > Refresh @@ -348,7 +348,7 @@ export default function SettingsPanel() { onClick={fetchOllamaModels} disabled={loadingOllamaModels} className="text-[10px] text-editor-accent hover:underline flex items-center gap-0.5" - data-tooltip="Refresh available Ollama models" + title="Refresh available Ollama models" > Refresh @@ -359,7 +359,7 @@ export default function SettingsPanel() { value={providers.ollama.model} onChange={(e) => setProviderConfig('ollama', { model: e.target.value })} className="w-full px-3 py-2 bg-editor-surface border border-editor-border rounded-lg text-xs text-white focus:outline-none focus:border-editor-accent" - data-tooltip="Which Ollama model to use for AI features" + title="Which Ollama model to use for AI features" > {ollamaModels.map((m) => ( @@ -461,7 +461,7 @@ function InputField({ value={value} onChange={(e) => onChange(e.target.value)} placeholder={placeholder} - data-tooltip={title} + title={title} className="w-full px-3 py-2 bg-editor-bg border border-editor-border rounded-lg text-xs text-editor-text placeholder:text-editor-text-muted/50 focus:outline-none focus:border-editor-accent" />
diff --git a/frontend/src/components/SilenceTrimmerPanel.tsx b/frontend/src/components/SilenceTrimmerPanel.tsx index e8a2090..3c4c67d 100644 --- a/frontend/src/components/SilenceTrimmerPanel.tsx +++ b/frontend/src/components/SilenceTrimmerPanel.tsx @@ -134,7 +134,7 @@ export default function SilenceTrimmerPanel() { value={minSilenceMs} onChange={(e) => setMinSilenceMs(Number(e.target.value) || 500)} className="w-full px-2.5 py-1.5 text-xs bg-editor-surface border border-editor-border rounded focus:border-editor-accent focus:outline-none" - data-tooltip="Minimum duration of silence to detect in milliseconds" + title="Minimum duration of silence to detect in milliseconds" /> @@ -150,7 +150,7 @@ export default function SilenceTrimmerPanel() { value={silenceDb} onChange={(e) => setSilenceDb(Number(e.target.value) || -35)} className="w-full px-2.5 py-1.5 text-xs bg-editor-surface border border-editor-border rounded focus:border-editor-accent focus:outline-none" - data-tooltip="Volume threshold in dB — lower values detect quieter sounds as silence" + title="Volume threshold in dB — lower values detect quieter sounds as silence" /> @@ -167,7 +167,7 @@ export default function SilenceTrimmerPanel() { value={preBufferMs} onChange={(e) => setPreBufferMs(Number(e.target.value) || 0)} className="w-full px-2.5 py-1.5 text-xs bg-editor-surface border border-editor-border rounded focus:border-editor-accent focus:outline-none" - data-tooltip="Extra time to add before each detected silence" + title="Extra time to add before each detected silence" />
@@ -182,7 +182,7 @@ export default function SilenceTrimmerPanel() { value={postBufferMs} onChange={(e) => setPostBufferMs(Number(e.target.value) || 0)} className="w-full px-2.5 py-1.5 text-xs bg-editor-surface border border-editor-border rounded focus:border-editor-accent focus:outline-none" - data-tooltip="Extra time to add after each detected silence" + title="Extra time to add after each detected silence" />
@@ -191,7 +191,7 @@ export default function SilenceTrimmerPanel() { onClick={detectSilence} disabled={isDetecting || !videoPath} className="w-full flex items-center justify-center gap-2 px-4 py-2.5 bg-editor-accent hover:bg-editor-accent-hover disabled:opacity-50 rounded-lg text-sm font-medium transition-colors" - data-tooltip="Scan the entire audio track for silent pauses" + title="Scan the entire audio track for silent pauses" > {isDetecting ? ( <> @@ -219,7 +219,7 @@ export default function SilenceTrimmerPanel() { diff --git a/frontend/src/components/TranscriptEditor.tsx b/frontend/src/components/TranscriptEditor.tsx index 3d1ec32..710ecb9 100644 --- a/frontend/src/components/TranscriptEditor.tsx +++ b/frontend/src/components/TranscriptEditor.tsx @@ -511,7 +511,7 @@ export default function TranscriptEditor({ requestAnimationFrame(() => searchInputRef.current?.focus()); }} className="flex items-center gap-1 px-2 py-1 text-xs text-editor-text-muted hover:text-editor-text hover:bg-editor-surface rounded" - data-tooltip="Find (Ctrl+F)" + title="Find (Ctrl+F)" > Find @@ -534,21 +534,21 @@ export default function TranscriptEditor({ @@ -561,7 +561,7 @@ export default function TranscriptEditor({ onClick={cutSelectedWords} disabled={!canEdit} className="flex items-center gap-1 px-2 py-1 text-xs bg-red-500/20 text-red-300 rounded hover:bg-red-500/30 transition-colors disabled:opacity-40" - data-tooltip="Remove this word range from the output" + title="Remove this word range from the output" > Cut @@ -570,7 +570,7 @@ export default function TranscriptEditor({ onClick={muteSelectedWords} disabled={!canEdit} className="flex items-center gap-1 px-2 py-1 text-xs bg-blue-500/20 text-blue-300 rounded hover:bg-blue-500/30 transition-colors disabled:opacity-40" - data-tooltip="Silence audio for this word range" + title="Silence audio for this word range" > Mute @@ -579,7 +579,7 @@ export default function TranscriptEditor({ onClick={gainSelectedWords} disabled={!canEdit} className="flex items-center gap-1 px-2 py-1 text-xs bg-amber-500/20 text-amber-300 rounded hover:bg-amber-500/30 transition-colors disabled:opacity-40" - data-tooltip="Adjust volume for this word range — positive boosts, negative reduces" + title="Adjust volume for this word range — positive boosts, negative reduces" > Gain ({gainModeDb > 0 ? '+' : ''}{gainModeDb.toFixed(1)} dB) @@ -588,7 +588,7 @@ export default function TranscriptEditor({ onClick={speedSelectedWords} disabled={!canEdit} className="flex items-center gap-1 px-2 py-1 text-xs bg-emerald-500/20 text-emerald-300 rounded hover:bg-emerald-500/30 transition-colors disabled:opacity-40" - data-tooltip="Change playback speed for this word range — lower is slower, higher is faster" + title="Change playback speed for this word range — lower is slower, higher is faster" > Speed {speedModeValue.toFixed(2)}x @@ -597,7 +597,7 @@ export default function TranscriptEditor({ onClick={handleReTranscribe} disabled={isReTranscribing || !canEdit} className="flex items-center gap-1 px-2 py-1 text-xs bg-purple-500/20 text-purple-300 rounded hover:bg-purple-500/30 disabled:opacity-40 transition-colors" - data-tooltip="Re-run Whisper transcription on this segment" + title="Re-run Whisper transcription on this segment" > {isReTranscribing ? 'Re-transcribing...' : 'Re-transcribe'} diff --git a/frontend/src/components/WaveformTimeline.tsx b/frontend/src/components/WaveformTimeline.tsx index 1296317..3ccd2f4 100644 --- a/frontend/src/components/WaveformTimeline.tsx +++ b/frontend/src/components/WaveformTimeline.tsx @@ -1259,7 +1259,7 @@ export default function WaveformTimeline({ {markOutTime !== null && O {markOutTime.toFixed(2)}s}
-
@@ -193,7 +193,7 @@ export default function ZoneEditor() { ? 'bg-editor-accent text-white' : 'text-editor-text-muted hover:text-editor-text' }`} - data-tooltip="Show all zones" + title="Show all zones" > All @@ -204,7 +204,7 @@ export default function ZoneEditor() { ? 'bg-red-500/30 text-red-500' : 'text-editor-text-muted hover:text-editor-text' }`} - data-tooltip="Show only Cut zones" + title="Show only Cut zones" > Cut @@ -215,7 +215,7 @@ export default function ZoneEditor() { ? 'bg-orange-500/30 text-orange-500' : 'text-editor-text-muted hover:text-editor-text' }`} - data-tooltip="Show only Mute zones" + title="Show only Mute zones" > Mute @@ -226,7 +226,7 @@ export default function ZoneEditor() { ? 'bg-amber-500/30 text-amber-500' : 'text-editor-text-muted hover:text-editor-text' }`} - data-tooltip="Show only Gain zones" + title="Show only Gain zones" > Gain @@ -237,7 +237,7 @@ export default function ZoneEditor() { ? 'bg-emerald-500/30 text-emerald-500' : 'text-editor-text-muted hover:text-editor-text' }`} - data-tooltip="Show only Speed zones" + title="Show only Speed zones" > Speed @@ -279,7 +279,7 @@ export default function ZoneEditor() { removeZone('cut', range.id); }} className="p-1 rounded hover:bg-red-500/20 text-red-500/70 hover:text-red-500 opacity-0 group-hover:opacity-100 transition-opacity" - data-tooltip="Delete cut zone" + title="Delete cut zone" > @@ -316,7 +316,7 @@ export default function ZoneEditor() { removeZone('mute', range.id); }} className="p-1 rounded hover:bg-orange-500/20 text-orange-500/70 hover:text-orange-500 opacity-0 group-hover:opacity-100 transition-opacity" - data-tooltip="Delete mute zone" + title="Delete mute zone" > @@ -355,7 +355,7 @@ export default function ZoneEditor() { value={globalGainDb} onChange={(e) => setGlobalGainDb(Math.max(-24, Math.min(24, Number(e.target.value) || 0)))} className="w-14 px-1.5 py-0.5 text-xs bg-editor-surface border border-editor-border rounded focus:border-editor-accent focus:outline-none" - data-tooltip="Volume adjustment in decibels — +6 dB doubles volume, -6 dB halves it" + title="Volume adjustment in decibels — +6 dB doubles volume, -6 dB halves it" /> dB @@ -385,7 +385,7 @@ export default function ZoneEditor() { onClick={(e) => e.stopPropagation()} onChange={(e) => updateGainRange(range.id, Number(e.target.value) || 0)} className="w-16 px-1.5 py-0.5 text-xs bg-editor-surface border border-editor-border rounded focus:border-editor-accent focus:outline-none" - data-tooltip="Volume adjustment in decibels — +6 dB doubles volume, -6 dB halves it" + title="Volume adjustment in decibels — +6 dB doubles volume, -6 dB halves it" /> {renderPreviewButton(range.start, range.end, 'hover:bg-amber-500/20 text-amber-500/70 hover:text-amber-500')} @@ -435,7 +435,7 @@ export default function ZoneEditor() { onClick={(e) => e.stopPropagation()} onChange={(e) => updateSpeedRange(range.id, Number(e.target.value) || 1)} className="w-16 px-1.5 py-0.5 text-xs bg-editor-surface border border-editor-border rounded focus:border-editor-accent focus:outline-none" - data-tooltip="Playback speed multiplier — 1.0x is normal, 2.0x is twice as fast" + title="Playback speed multiplier — 1.0x is normal, 2.0x is twice as fast" /> {renderPreviewButton(range.start, range.end, 'hover:bg-emerald-500/20 text-emerald-500/70 hover:text-emerald-500')} diff --git a/frontend/src/index.css b/frontend/src/index.css index 5c4d0fe..475ba49 100644 --- a/frontend/src/index.css +++ b/frontend/src/index.css @@ -47,45 +47,6 @@ video::-webkit-media-controls { display: none !important; } -[data-tooltip] { - position: relative; -} -[data-tooltip]::after { - content: attr(data-tooltip); - position: absolute; - bottom: calc(100% + 6px); - left: 50%; - transform: translateX(-50%); - padding: 4px 8px; - border-radius: 4px; - background: #1f2133; - color: #e2e8f0; - font-size: 11px; - line-height: 1.3; - white-space: nowrap; - pointer-events: none; - opacity: 0; - transition: opacity 0.1s ease; - z-index: 100; - border: 1px solid #2a2d3a; - box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4); - font-family: 'Inter', system-ui, sans-serif; -} -[data-tooltip]:hover::after { - opacity: 1; -} -/* Tooltip on the left side for elements near the right edge */ -[data-tooltip-side="left"]::after { - left: auto; - right: 0; - transform: none; -} - -/* Tooltip on the right side for elements near the left edge */ -[data-tooltip-side="right"]::after { - left: 0; - transform: none; -}