diff --git a/docs/SMOKE_TEST.md b/docs/SMOKE_TEST.md index d1861f0..6fe378d 100644 --- a/docs/SMOKE_TEST.md +++ b/docs/SMOKE_TEST.md @@ -61,6 +61,7 @@ Use this checklist before a release or after changes to panel, pasteboard, setti 28. Confirm the selected card shows a green corner Stack control, the action rail does not duplicate Stack, and clips added to Stack keep a visible corner indicator when selection moves away. 29. Confirm single-line text cards do not repeat the same text in both title and body, while multi-line text cards show the remaining lines below the first line. 30. Confirm the Pinned empty state points to the Pin action instead of a plain-key shortcut. +31. Confirm each card's source or type badge reads as an attached header-corner tile instead of a small floating icon. ## Copy And Paste diff --git a/sources/clipbored/views/ClipboardPanelView.swift b/sources/clipbored/views/ClipboardPanelView.swift index 5432ffe..bd9901c 100644 --- a/sources/clipbored/views/ClipboardPanelView.swift +++ b/sources/clipbored/views/ClipboardPanelView.swift @@ -3077,7 +3077,15 @@ private final class ClipboardItemCardView: NSView, NSDraggingSource { } private var headerBadgeSize: CGFloat { - layout.isCompact ? 36 : 42 + layout.headerHeight + } + + private var headerBadgeCornerRadius: CGFloat { + layout.isCompact ? 13 : 15 + } + + private var headerBadgeIconInset: CGFloat { + layout.isCompact ? 9 : 10 } private var stackCornerButtonSize: CGFloat { @@ -3988,10 +3996,10 @@ private final class ClipboardItemCardView: NSView, NSDraggingSource { private func iconBadge(for item: ClipboardItem) -> NSView { let badge = NSView() badge.wantsLayer = true - badge.layer?.cornerRadius = 8 - badge.layer?.backgroundColor = NSColor.white.withAlphaComponent(0.92).cgColor + badge.layer?.cornerRadius = headerBadgeCornerRadius + badge.layer?.backgroundColor = NSColor.white.withAlphaComponent(0.95).cgColor badge.layer?.borderWidth = 1 - badge.layer?.borderColor = Palette.divider + badge.layer?.borderColor = NSColor.white.withAlphaComponent(0.52).cgColor badge.translatesAutoresizingMaskIntoConstraints = false if let bundleId = item.sourceAppBundleId, let appURL = NSWorkspace.shared.urlForApplication(withBundleIdentifier: bundleId) { @@ -4000,10 +4008,10 @@ private final class ClipboardItemCardView: NSView, NSDraggingSource { icon.translatesAutoresizingMaskIntoConstraints = false badge.addSubview(icon) NSLayoutConstraint.activate([ - icon.leadingAnchor.constraint(equalTo: badge.leadingAnchor, constant: 8), - icon.trailingAnchor.constraint(equalTo: badge.trailingAnchor, constant: -8), - icon.topAnchor.constraint(equalTo: badge.topAnchor, constant: 8), - icon.bottomAnchor.constraint(equalTo: badge.bottomAnchor, constant: -8) + icon.leadingAnchor.constraint(equalTo: badge.leadingAnchor, constant: headerBadgeIconInset), + icon.trailingAnchor.constraint(equalTo: badge.trailingAnchor, constant: -headerBadgeIconInset), + icon.topAnchor.constraint(equalTo: badge.topAnchor, constant: headerBadgeIconInset), + icon.bottomAnchor.constraint(equalTo: badge.bottomAnchor, constant: -headerBadgeIconInset) ]) } else { let image = NSImage(systemSymbolName: headerBadgeSymbol(for: item.kind), accessibilityDescription: kindLabel(for: item.kind)) @@ -4015,11 +4023,12 @@ private final class ClipboardItemCardView: NSView, NSDraggingSource { icon.contentTintColor = accentColor(for: item.kind) icon.translatesAutoresizingMaskIntoConstraints = false badge.addSubview(icon) + let symbolInset = headerBadgeIconInset + 2 NSLayoutConstraint.activate([ - icon.leadingAnchor.constraint(equalTo: badge.leadingAnchor, constant: 9), - icon.trailingAnchor.constraint(equalTo: badge.trailingAnchor, constant: -9), - icon.topAnchor.constraint(equalTo: badge.topAnchor, constant: 9), - icon.bottomAnchor.constraint(equalTo: badge.bottomAnchor, constant: -9) + icon.leadingAnchor.constraint(equalTo: badge.leadingAnchor, constant: symbolInset), + icon.trailingAnchor.constraint(equalTo: badge.trailingAnchor, constant: -symbolInset), + icon.topAnchor.constraint(equalTo: badge.topAnchor, constant: symbolInset), + icon.bottomAnchor.constraint(equalTo: badge.bottomAnchor, constant: -symbolInset) ]) } return badge diff --git a/tests/clipboredtests/ClipboardPanelViewTests.swift b/tests/clipboredtests/ClipboardPanelViewTests.swift index 4063902..58d9b8a 100644 --- a/tests/clipboredtests/ClipboardPanelViewTests.swift +++ b/tests/clipboredtests/ClipboardPanelViewTests.swift @@ -437,6 +437,8 @@ final class ClipboardPanelViewTests: XCTestCase { XCTAssertEqual(fixture.view.debugFirstCardVisibleActionRailWidth, 210) XCTAssertFalse(fixture.view.debugFirstCardFooterDetailIsHidden) XCTAssertFalse(fixture.view.debugFirstCardHeaderBadgeIsHidden) + XCTAssertEqual(fixture.view.debugFirstCardHeaderBadgeFrame.width, 56, accuracy: 0.5) + XCTAssertEqual(fixture.view.debugFirstCardHeaderBadgeFrame.height, 56, accuracy: 0.5) XCTAssertEqual(fixture.view.debugFirstCardHeaderBadgeFrame.maxX, 320, accuracy: 0.5) XCTAssertEqual(fixture.view.debugFirstCardHeaderBadgeFrame.maxY, 244, accuracy: 0.5) @@ -451,6 +453,8 @@ final class ClipboardPanelViewTests: XCTestCase { XCTAssertEqual(fixture.view.debugFirstCardVisibleActionRailWidth, 238) XCTAssertFalse(fixture.view.debugFirstCardFooterDetailIsHidden) XCTAssertFalse(fixture.view.debugFirstCardHeaderBadgeIsHidden) + XCTAssertEqual(fixture.view.debugFirstCardHeaderBadgeFrame.width, 56, accuracy: 0.5) + XCTAssertEqual(fixture.view.debugFirstCardHeaderBadgeFrame.height, 56, accuracy: 0.5) XCTAssertEqual(fixture.view.debugFirstCardHeaderBadgeFrame.maxX, 320, accuracy: 0.5) XCTAssertEqual(fixture.view.debugFirstCardHeaderBadgeFrame.maxY, 244, accuracy: 0.5) } @@ -467,6 +471,8 @@ final class ClipboardPanelViewTests: XCTestCase { XCTAssertEqual(fixture.view.debugFirstCardVisibleActionRailWidth, 196) XCTAssertLessThanOrEqual(fixture.view.debugFirstCardVisibleActionRailWidth, 197) XCTAssertFalse(fixture.view.debugFirstCardHeaderBadgeIsHidden) + XCTAssertEqual(fixture.view.debugFirstCardHeaderBadgeFrame.width, 50, accuracy: 0.5) + XCTAssertEqual(fixture.view.debugFirstCardHeaderBadgeFrame.height, 50, accuracy: 0.5) XCTAssertEqual(fixture.view.debugFirstCardHeaderBadgeFrame.maxX, 264, accuracy: 0.5) XCTAssertEqual(fixture.view.debugFirstCardHeaderBadgeFrame.maxY, 220, accuracy: 0.5) XCTAssertEqual(