style: limit emoji borders to selected and hovered tiles

This commit is contained in:
2026-10-17 01:29:38 +02:00
parent 6085cbd217
commit 1980c9dbc1
3 changed files with 71 additions and 3 deletions
+27 -2
View File
@@ -284,7 +284,7 @@ final class EmojiPickerController: NSViewController, NSCollectionViewDataSource,
@MainActor
private final class EmojiItem: NSCollectionViewItem {
let button = NSButton()
let button = EmojiButton()
var clicked: (() -> Void)?
override func loadView() {
@@ -294,7 +294,6 @@ private final class EmojiItem: NSCollectionViewItem {
button.action = #selector(copyEmoji)
button.wantsLayer = true
button.layer?.cornerRadius = 10
button.layer?.borderWidth = 0.5
button.layer?.borderColor = SunsetPalette.secondaryText.withAlphaComponent(0.22).cgColor
view = button
}
@@ -302,7 +301,33 @@ private final class EmojiItem: NSCollectionViewItem {
func highlight(_ selected: Bool) {
button.layer?.backgroundColor = selected ? SunsetPalette.accent.withAlphaComponent(0.22).cgColor : nil
button.setAccessibilitySelected(selected)
button.selected = selected
}
@objc private func copyEmoji() { clicked?() }
}
@MainActor
private final class EmojiButton: NSButton {
var selected = false { didSet { updateBorder() } }
private var hovered = false { didSet { updateBorder() } }
private var hoverTracking: NSTrackingArea?
override func updateTrackingAreas() {
super.updateTrackingAreas()
if let hoverTracking { removeTrackingArea(hoverTracking) }
let tracking = NSTrackingArea(rect: .zero,
options: [.mouseEnteredAndExited, .activeInKeyWindow, .inVisibleRect],
owner: self, userInfo: nil)
addTrackingArea(tracking)
hoverTracking = tracking
hovered = window.map { visibleRect.contains(convert($0.mouseLocationOutsideOfEventStream, from: nil)) } ?? false
}
override func mouseEntered(with event: NSEvent) { hovered = true }
override func mouseExited(with event: NSEvent) { hovered = false }
private func updateBorder() {
layer?.borderWidth = selected || hovered ? 0.5 : 0
}
}