|
|
@@ -22,6 +22,78 @@ enum IndeedBrandLogo {
|
|
22
|
22
|
}
|
|
23
|
23
|
}
|
|
24
|
24
|
|
|
|
25
|
+/// Sidebar “Indeed” row icon — outline or filled template glyph tinted like SF Symbols.
|
|
|
26
|
+enum IndeedSidebarNavIcon {
|
|
|
27
|
+ private static let canvas: CGFloat = 18
|
|
|
28
|
+ private static var outlineImage: NSImage?
|
|
|
29
|
+ private static var filledImage: NSImage?
|
|
|
30
|
+
|
|
|
31
|
+ static func image(filled: Bool) -> NSImage {
|
|
|
32
|
+ if filled {
|
|
|
33
|
+ if let filledImage { return filledImage }
|
|
|
34
|
+ let image = makeImage(filled: true)
|
|
|
35
|
+ filledImage = image
|
|
|
36
|
+ return image
|
|
|
37
|
+ }
|
|
|
38
|
+ if let outlineImage { return outlineImage }
|
|
|
39
|
+ let image = makeImage(filled: false)
|
|
|
40
|
+ outlineImage = image
|
|
|
41
|
+ return image
|
|
|
42
|
+ }
|
|
|
43
|
+
|
|
|
44
|
+ private static func makeImage(filled: Bool) -> NSImage {
|
|
|
45
|
+ let size = NSSize(width: canvas, height: canvas)
|
|
|
46
|
+ let image = NSImage(size: size, flipped: true) { _ in
|
|
|
47
|
+ if filled {
|
|
|
48
|
+ drawFilledMark()
|
|
|
49
|
+ } else {
|
|
|
50
|
+ drawOutlineMark()
|
|
|
51
|
+ }
|
|
|
52
|
+ return true
|
|
|
53
|
+ }
|
|
|
54
|
+ image.isTemplate = true
|
|
|
55
|
+ return image
|
|
|
56
|
+ }
|
|
|
57
|
+
|
|
|
58
|
+ /// Stylized “i” mark (dot + stem + brow) aligned with SF Symbol nav icons.
|
|
|
59
|
+ private static func drawOutlineMark() {
|
|
|
60
|
+ let stroke: CGFloat = 1.25
|
|
|
61
|
+ NSColor.black.setStroke()
|
|
|
62
|
+
|
|
|
63
|
+ let dot = NSBezierPath(ovalIn: NSRect(x: 7.2, y: 2.8, width: 3.6, height: 3.6))
|
|
|
64
|
+ dot.lineWidth = stroke
|
|
|
65
|
+ dot.stroke()
|
|
|
66
|
+
|
|
|
67
|
+ let stem = NSBezierPath(roundedRect: NSRect(x: 7.2, y: 7.2, width: 3.6, height: 8.2), xRadius: 1.8, yRadius: 1.8)
|
|
|
68
|
+ stem.lineWidth = stroke
|
|
|
69
|
+ stem.stroke()
|
|
|
70
|
+
|
|
|
71
|
+ let brow = NSBezierPath()
|
|
|
72
|
+ brow.move(to: NSPoint(x: 4.6, y: 6.4))
|
|
|
73
|
+ brow.curve(to: NSPoint(x: 13.4, y: 6.4), controlPoint1: NSPoint(x: 6.2, y: 2.2), controlPoint2: NSPoint(x: 11.8, y: 2.2))
|
|
|
74
|
+ brow.lineWidth = stroke
|
|
|
75
|
+ brow.lineCapStyle = .round
|
|
|
76
|
+ brow.stroke()
|
|
|
77
|
+ }
|
|
|
78
|
+
|
|
|
79
|
+ private static func drawFilledMark() {
|
|
|
80
|
+ NSColor.black.setFill()
|
|
|
81
|
+
|
|
|
82
|
+ let dot = NSBezierPath(ovalIn: NSRect(x: 7.2, y: 2.8, width: 3.6, height: 3.6))
|
|
|
83
|
+ dot.fill()
|
|
|
84
|
+
|
|
|
85
|
+ let stem = NSBezierPath(roundedRect: NSRect(x: 7.2, y: 7.2, width: 3.6, height: 8.2), xRadius: 1.8, yRadius: 1.8)
|
|
|
86
|
+ stem.fill()
|
|
|
87
|
+
|
|
|
88
|
+ let brow = NSBezierPath()
|
|
|
89
|
+ brow.move(to: NSPoint(x: 4.6, y: 6.4))
|
|
|
90
|
+ brow.curve(to: NSPoint(x: 13.4, y: 6.4), controlPoint1: NSPoint(x: 6.2, y: 2.2), controlPoint2: NSPoint(x: 11.8, y: 2.2))
|
|
|
91
|
+ brow.lineWidth = 1.35
|
|
|
92
|
+ brow.lineCapStyle = .round
|
|
|
93
|
+ brow.stroke()
|
|
|
94
|
+ }
|
|
|
95
|
+}
|
|
|
96
|
+
|
|
25
|
97
|
final class IndeedLogoView: NSView {
|
|
26
|
98
|
private let imageView = NSImageView()
|
|
27
|
99
|
private let variant: IndeedBrandLogo.Variant
|