Skip to content
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

fix(ui-containers): Use display: contents #3957

Merged
merged 5 commits into from
Dec 20, 2023
Merged

Conversation

gadenbuie
Copy link
Member

@gadenbuie gadenbuie commented Dec 11, 2023

Allows children of conditionPanel() and uiOutput() to automatically participate in the grid/flex layout of the parent container.

For uiOutput() we use div:where(.shiny-html-output), for two reasons:

  1. This only applies when inline = FALSE or a div() container is used.
  2. The :where() ensures that users can use .shiny-html-output without fighting our rule.

For posit-dev/py-shiny#881

gadenbuie and others added 2 commits December 11, 2023 12:59
Allows children of `conditionPanel()` and `uiOutput()` to automatically participate in the grid/flex layout of the parent container.

/* Conditional panels and uiOutput */
[data-display-if],
div:where(.shiny-html-output) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you think of any scenarios this might break existing apps?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

First and most obvious: this would break apps where users were directly styling the conditionalPanel() or uiOutput() container using selectors that target our the emitted markup directly. It's hard to know in advance how those apps would be broken.

In most other cases, I believe setting display: contents is much closer to what users are expecting happens with the children of the conditional panel or UI outputs. In particular that it's much closer to adding the children directly into the layout.

The original issue in posit-dev/py-shiny#881 is a good example that it's not obvious that both approaches add intermediate containers. Outside of flex/grid layouts the impact of the layout container is minimal, but there's greater impact now that we're using both flex and grid more often.

Copy link

@martinamorris martinamorris Jul 12, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It turns out our shiny application statnetWeb is one of those that breaks with this change.

As the current maintainer, and someone not well versed in this syntax, can you pls tell me if there is a straightforward change to the 2 example code chunks below that will update to the new shiny syntax required:

conditionalPanel(condition = 'input.filetype < 5',
               column(6,
                    br(),
                    fileInput(inputId='rawdatafile', label=NULL, accept='text'),
                    verbatimTextOutput('rawdatafile'))
                )
             conditionalPanel(condition='input.filetype == 3',
                 column(6,
                        uiOutput('pajchooser'))),

Many thanks!

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @martinamorris, could you please open a new issue? It'd be helpful if you could describe a bit more how the app has broken and how we could reproduce the issue. It's possible that your issue is related to the change in this PR, but it could also be something else -- this PR didn't involve any syntax changes to conditionalPanel().

Copy link

@martinamorris martinamorris Jul 12, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will do, thx. The break occurred with the 1.8.1 CRAN update, and affects the page rendering for pages constructed with conditionalPanel. I followed the link from your 1.8.1 release tag to this commit, but this may not be the culprit.

Will show how I reproduced the issue, with some screenshots.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done: #4099

@gadenbuie gadenbuie merged commit d29f4cd into main Dec 20, 2023
12 checks passed
@gadenbuie gadenbuie deleted the feat/ui-display-contents branch December 20, 2023 03:27
@ismirsehregal
Copy link
Contributor

With this change merged, I can no longer use this workaround, can I?

@cpsievert
Copy link
Collaborator

@ismirsehregal from what I can tell, the workaround offered in that issue still works? Are you encountering a different issue?

@gadenbuie
Copy link
Member Author

@cpsievert I came to the same conclusion -- but while looking at the reprex I started think we should initially hide the contents of a conditionalPanel() until it's been initialized.

@ismirsehregal
Copy link
Contributor

@cpsievert thanks for the feedback. I just read the NEWS:

This is probably what most users intend when they use these functions, but it may break apps that applied styles directly to the container elements created by these two functions.

and thought it might affect the above mentioned "workaround" which I'm still using every now and then.

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

Successfully merging this pull request may close these issues.

None yet

5 participants