Skip to content

[BUG] Right-justified panels with right-aligned titles display incorrectly #3641

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
1 of 2 tasks
NorthIsUp opened this issue Feb 26, 2025 · 5 comments
Open
1 of 2 tasks

Comments

@NorthIsUp
Copy link

NorthIsUp commented Feb 26, 2025

Describe the bug

a picture is worth a thousand words, the issue is the gap in the box

Image
note: "a" is an extra gap and "b" the missing gap

In [4]: panel = Panel("hi", title="[red]ho", title_align="right", width=20, style="blue")

In [5]: Console().print(panel, justify='right')
                                                                      ╭─ ──────────── ho─╮
                                                                      │               hi │
                                                                      ╰──────────────────╯

In [6]: panel = Panel("hi", title="[red]ho", title_align="left", width=20, style="blue")

In [7]: Console().print(panel, justify='right')
                                                                      ╭─ ho ─────────────╮
                                                                      │               hi │
                                                                      ╰──────────────────╯

In [8]:

Platform

Click to expand

What platform (Win/Linux/Mac) are you running on? What terminal software are you using?

I may ask you to copy and paste the output of the following commands. It may save some time if you do it now.

If you're using Rich in a terminal:

python -m rich.diagnose
pip freeze | grep rich

If you're using Rich in a Jupyter Notebook, run the following snippet in a cell
and paste the output in your bug report.

╭───────────────────────── <class 'rich.console.Console'> ─────────────────────────╮
│ A high level console interface.                                                  │
│                                                                                  │
│ ╭──────────────────────────────────────────────────────────────────────────────╮ │
│ │ <console width=204 ColorSystem.TRUECOLOR>                                    │ │
│ ╰──────────────────────────────────────────────────────────────────────────────╯ │
│                                                                                  │
│     color_system = 'truecolor'                                                   │
│         encoding = 'utf-8'                                                       │
│             file = <_io.TextIOWrapper name='<stdout>' mode='w' encoding='utf-8'> │
│           height = 62                                                            │
│    is_alt_screen = False                                                         │
│ is_dumb_terminal = False                                                         │
│   is_interactive = True                                                          │
│       is_jupyter = False                                                         │
│      is_terminal = True                                                          │
│   legacy_windows = False                                                         │
│         no_color = False                                                         │
│          options = ConsoleOptions(                                               │
│                        size=ConsoleDimensions(width=204, height=62),             │
│                        legacy_windows=False,                                     │
│                        min_width=1,                                              │
│                        max_width=204,                                            │
│                        is_terminal=True,                                         │
│                        encoding='utf-8',                                         │
│                        max_height=62,                                            │
│                        justify=None,                                             │
│                        overflow=None,                                            │
│                        no_wrap=False,                                            │
│                        highlight=None,                                           │
│                        markup=None,                                              │
│                        height=None                                               │
│                    )                                                             │
│            quiet = False                                                         │
│           record = False                                                         │
│         safe_box = True                                                          │
│             size = ConsoleDimensions(width=204, height=62)                       │
│        soft_wrap = False                                                         │
│           stderr = False                                                         │
│            style = None                                                          │
│         tab_size = 8                                                             │
│            width = 204                                                           │
╰──────────────────────────────────────────────────────────────────────────────────╯
╭─── <class 'rich._windows.WindowsConsoleFeatures'> ────╮
│ Windows features available.                           │
│                                                       │
│ ╭───────────────────────────────────────────────────╮ │
│ │ WindowsConsoleFeatures(vt=False, truecolor=False) │ │
│ ╰───────────────────────────────────────────────────╯ │
│                                                       │
│ truecolor = False                                     │
│        vt = False                                     │
╰───────────────────────────────────────────────────────╯
╭────── Environment Variables ───────╮
│ {                                  │
│     'TERM': 'xterm-256color',      │
│     'COLORTERM': 'truecolor',      │
│     'CLICOLOR': None,              │
│     'NO_COLOR': None,              │
│     'TERM_PROGRAM': 'iTerm.app',   │
│     'COLUMNS': None,               │
│     'LINES': '62',                 │
│     'JUPYTER_COLUMNS': None,       │
│     'JUPYTER_LINES': None,         │
│     'JPY_PARENT_PID': None,        │
│     'VSCODE_VERBOSE_LOGGING': None │
│ }                                  │
╰────────────────────────────────────╯
platform="Darwin"
Copy link

Thank you for your issue. Give us a little time to review it.

PS. You might want to check the FAQ if you haven't done so already.

This is an automated reply, generated by FAQtory

@NorthIsUp
Copy link
Author

NorthIsUp commented Feb 26, 2025

example test

def test_with_justify() -> None:
    panel = Panel(
        "Hello, World",
        title="title",
        subtitle="subtitle",
        title_align="right",
    )
    console = Console(
        file=io.StringIO(),
        width=50,
        height=20,
        legacy_windows=False,
        force_terminal=True,
        color_system="truecolor",
    )
    console.print(panel, justify="right")

    result = cleandoc(console.file.getvalue())
    expected = cleandoc("""
        ╭────── title ─╮
        │ Hello, World │
        ╰── subtitle ──╯
        """)
    assert result == expected

@BenRachmiel
Copy link

BenRachmiel commented Mar 2, 2025

Hey, I've taken a look at the issue and it appears to stem from containers.justify (specifically lines 139-142, where the trailing whitespace gets mistakenly rstrip'd and then padded to the beginning of the segment. If you need a fix: I've found that changing the line "line.rstrip()" to "line[:-1].rstrip()" prevents this behavior, and, at least in the case of the example you gave, solves the issue.

This isn't an elegant solution, but seeing as the titles are padded with whitespace it may be "right." Checking tests, I don't see that this introduces regressions covered by the test. If @willmcgugan doesn't have an issue with it, I'll submit a pull request introducing the change.

@NorthIsUp
Copy link
Author

glad you found it! I spent about an hour looking for the cause but I'm not familiar with the code base.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants
@NorthIsUp @BenRachmiel and others