From 2c2fc5f196b16675294fe5b72ad47753ccd392fb Mon Sep 17 00:00:00 2001 From: Alexei Frolov Date: Sun, 2 Aug 2026 13:21:26 -0700 Subject: [PATCH] Fix heading spacing in panel history feed Updates the status to shrink if the heading doesn't fit in the row instead of overlapping, and shortens relative date strings. --- src/main/java/io/blert/BlertPluginPanel.java | 11 +++--- src/main/java/io/blert/ui/FeedItem.java | 39 +++++++++----------- 2 files changed, 24 insertions(+), 26 deletions(-) diff --git a/src/main/java/io/blert/BlertPluginPanel.java b/src/main/java/io/blert/BlertPluginPanel.java index 77f9804..006edbe 100644 --- a/src/main/java/io/blert/BlertPluginPanel.java +++ b/src/main/java/io/blert/BlertPluginPanel.java @@ -906,14 +906,15 @@ private JLabel createHeader(String name) { private String formatTimeAgo(Instant time) { long seconds = Duration.between(time, Instant.now()).getSeconds(); - if (seconds < 60) return "Just now"; + if (seconds < 60) return "now"; long minutes = seconds / 60; - if (minutes < 60) return minutes + "m ago"; + if (minutes < 60) return minutes + "m"; long hours = minutes / 60; - if (hours < 24) return hours + "h ago"; + if (hours < 24) return hours + "h"; long days = hours / 24; - if (days < 30) return days + "d ago"; - return (days / 365) + "y ago"; + if (days < 30) return days + "d"; + if (days < 365) return Math.min(days / 30, 11) + "mo"; + return (days / 365) + "y"; } /** diff --git a/src/main/java/io/blert/ui/FeedItem.java b/src/main/java/io/blert/ui/FeedItem.java index 426e9f7..a7ea210 100644 --- a/src/main/java/io/blert/ui/FeedItem.java +++ b/src/main/java/io/blert/ui/FeedItem.java @@ -51,44 +51,41 @@ public void mouseExited(MouseEvent e) { } private static JPanel getTitlePanel(String title, String mode, int ticks, @Nullable String timestamp) { - JPanel header = new JPanel(new BorderLayout()); + JPanel header = new JPanel(); + header.setLayout(new BoxLayout(header, BoxLayout.X_AXIS)); header.setOpaque(false); - JPanel leftHead = new JPanel(new FlowLayout(FlowLayout.LEFT, 0, 0)); - leftHead.setOpaque(false); - JLabel titleLabel = new JLabel(title); titleLabel.setFont(FONT_BOLD.deriveFont(11f)); titleLabel.setForeground(TEXT_MAIN); - leftHead.add(titleLabel); + titleLabel.setMinimumSize(new Dimension(0, titleLabel.getPreferredSize().height)); + header.add(titleLabel); if (!mode.isEmpty()) { - JLabel modeLabel = new JLabel(" • " + mode); - modeLabel.setFont(FONT_SMALLEST); - modeLabel.setForeground(TEXT_MUTED); - leftHead.add(modeLabel); + header.add(mutedLabel(" • " + mode)); } if (ticks > 0) { - JLabel ticksLabel = new JLabel(" • " + Tick.asTimeString(ticks)); - ticksLabel.setFont(FONT_SMALLEST); - ticksLabel.setForeground(TEXT_MUTED); - leftHead.add(ticksLabel); + header.add(mutedLabel(" • " + Tick.asTimeString(ticks))); } - header.add(leftHead, BorderLayout.WEST); - - if (Strings.isNullOrEmpty(timestamp)) { - return header; + if (!Strings.isNullOrEmpty(timestamp)) { + header.add(Box.createHorizontalGlue()); + JLabel timeLabel = mutedLabel(timestamp); + timeLabel.setBorder(new EmptyBorder(0, 6, 0, 0)); + header.add(timeLabel); } - JLabel timeLabel = new JLabel(timestamp); - timeLabel.setFont(FONT_SMALLEST); - timeLabel.setForeground(TEXT_MUTED); - header.add(timeLabel, BorderLayout.EAST); return header; } + private static JLabel mutedLabel(String text) { + JLabel label = new JLabel(text); + label.setFont(FONT_SMALLEST); + label.setForeground(TEXT_MUTED); + return label; + } + void setCardHovered(boolean hovered) { this.isHovered = hovered; repaint();