|
|
@@ -812,7 +812,7 @@ final class DashboardView: NSView, NSTextFieldDelegate {
|
|
812
|
812
|
applyButton.setContentCompressionResistancePriority(.required, for: .horizontal)
|
|
813
|
813
|
|
|
814
|
814
|
let savedOn = isJobSaved(job)
|
|
815
|
|
- let savedButton = JobPayloadButton(title: savedOn ? "Saved" : "Save", target: self, action: #selector(didTapJobSaved(_:)))
|
|
|
815
|
+ let savedButton = SaveJobPayloadButton(title: savedOn ? "Saved" : "Save", target: self, action: #selector(didTapJobSaved(_:)))
|
|
816
|
816
|
savedButton.jobPayload = job
|
|
817
|
817
|
savedButton.cardContext = context
|
|
818
|
818
|
savedButton.setButtonType(.toggle)
|
|
|
@@ -925,20 +925,13 @@ final class DashboardView: NSView, NSTextFieldDelegate {
|
|
925
|
925
|
|
|
926
|
926
|
private func styleJobSavedButton(_ button: NSButton) {
|
|
927
|
927
|
button.wantsLayer = true
|
|
928
|
|
- button.layer?.cornerRadius = 8
|
|
929
|
|
- let on = button.state == .on
|
|
|
928
|
+ button.layer?.cornerRadius = 10
|
|
930
|
929
|
let hovering = (button as? HoverableButton)?.isHovering ?? false
|
|
931
|
|
- if on {
|
|
932
|
|
- button.layer?.backgroundColor = (hovering ? Theme.selectionFillHover : Theme.selectionFill).cgColor
|
|
933
|
|
- button.layer?.borderWidth = 1
|
|
934
|
|
- button.layer?.borderColor = Theme.brandBlue.cgColor
|
|
935
|
|
- button.contentTintColor = Theme.brandBlue
|
|
936
|
|
- } else {
|
|
937
|
|
- button.layer?.backgroundColor = (hovering ? Theme.proCardFill : Theme.cardBackground).cgColor
|
|
938
|
|
- button.layer?.borderWidth = 1
|
|
939
|
|
- button.layer?.borderColor = Theme.brandBlue.cgColor
|
|
940
|
|
- button.contentTintColor = Theme.brandBlue
|
|
941
|
|
- }
|
|
|
930
|
+ // Reference: white surface, soft blue outline, brand blue icon + label (no tinted fill on hover).
|
|
|
931
|
+ button.layer?.backgroundColor = Theme.cardBackground.cgColor
|
|
|
932
|
+ button.layer?.borderWidth = 1
|
|
|
933
|
+ button.layer?.borderColor = (hovering ? Theme.searchBarBorderHover : Theme.searchBarBorder).cgColor
|
|
|
934
|
+ button.contentTintColor = Theme.brandBlue
|
|
942
|
935
|
}
|
|
943
|
936
|
|
|
944
|
937
|
@objc private func didTapJobApply(_ sender: NSButton) {
|
|
|
@@ -2674,11 +2667,37 @@ private final class FeatureShortcutCardView: NSView {
|
|
2674
|
2667
|
}
|
|
2675
|
2668
|
|
|
2676
|
2669
|
/// `NSButton` that carries a `JobListing` for card actions (`representedObject` is unavailable on `NSButton` in this target).
|
|
2677
|
|
-private final class JobPayloadButton: HoverableButton {
|
|
|
2670
|
+private class JobPayloadButton: HoverableButton {
|
|
2678
|
2671
|
var jobPayload: JobListing?
|
|
2679
|
2672
|
var cardContext: JobListingCardContext = .homeSearchResults
|
|
2680
|
2673
|
}
|
|
2681
|
2674
|
|
|
|
2675
|
+/// Insets image + title so the Save pill matches the reference (balanced padding, not flush to the stroke).
|
|
|
2676
|
+private final class SaveJobButtonCell: NSButtonCell {
|
|
|
2677
|
+ private let horizontalInset: CGFloat = 10
|
|
|
2678
|
+ private let verticalInset: CGFloat = 3
|
|
|
2679
|
+ private let imageTitleGap: CGFloat = 5
|
|
|
2680
|
+
|
|
|
2681
|
+ override func imageRect(forBounds rect: NSRect) -> NSRect {
|
|
|
2682
|
+ super.imageRect(forBounds: rect.insetBy(dx: horizontalInset, dy: verticalInset))
|
|
|
2683
|
+ }
|
|
|
2684
|
+
|
|
|
2685
|
+ override func titleRect(forBounds rect: NSRect) -> NSRect {
|
|
|
2686
|
+ let padded = rect.insetBy(dx: horizontalInset, dy: verticalInset)
|
|
|
2687
|
+ var t = super.titleRect(forBounds: padded)
|
|
|
2688
|
+ t.origin.x += imageTitleGap
|
|
|
2689
|
+ t.size.width = max(0, t.size.width - imageTitleGap)
|
|
|
2690
|
+ return t
|
|
|
2691
|
+ }
|
|
|
2692
|
+}
|
|
|
2693
|
+
|
|
|
2694
|
+private final class SaveJobPayloadButton: JobPayloadButton {
|
|
|
2695
|
+ override class var cellClass: AnyClass? {
|
|
|
2696
|
+ get { SaveJobButtonCell.self }
|
|
|
2697
|
+ set { }
|
|
|
2698
|
+ }
|
|
|
2699
|
+}
|
|
|
2700
|
+
|
|
2682
|
2701
|
/// `NSButton` with a tracking area that reports hover transitions and (optionally) swaps in a pointing-hand cursor while hovered.
|
|
2683
|
2702
|
private class HoverableButton: NSButton {
|
|
2684
|
2703
|
var hoverHandler: ((Bool) -> Void)?
|