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

Import CSS and Inject into Iframe #412

Merged
merged 106 commits into from
Oct 23, 2023

Conversation

alextaing
Copy link
Contributor

@alextaing alextaing commented Oct 16, 2023

This PR adds user styling into the preview iframe. First, Studio dynamically imports user CSS and adds it to the head of Studio as a disabled style tag. Then, the IframePortal injects the style into the preview panel depending on the page CSS and the CSS of the components in the component tree.

Note that this PR would break acceptance test screenshots since Tailwind is not currently configured in e2e-tests, so we turned off screenshots in this PR. This will be reverted in the following PR when we add Tailwind.

J-SLAP-2912
TEST=manual

alextaing and others added 7 commits October 11, 2023 14:29
This PR adds a list in `ComponentMetadata` of the file paths to the CSS
files that each component imports. In `ComponentFile`, a dependency tree
is used to find all transitive CSS for each component. The
`dependency-tree` library allows for optimization by passing in already
parsed dependency trees, so component tree is formed in Parsing
Orchestrator so that previous dependencies can be accessed.

J=SLAP-2912
TEST=auto,manual
This PR modifies how page CSS is parsed. Instead of storing relative CSS
file paths in `cssImports` for `pageState`, we now store absolute CSS
paths. This is so we can easily dynamically import them in `studio-ui`.
Since we do this, we have to make sure that when we write back the CSS
import, it is transformed back into the relative path.

J=SLAP-2912
TEST=auto,manual
This PR adds a new plugin that adds the `?inline` query param to all user CSS imports.  This plugin ignores CSS imports from Studio.  The inline parameter tells Vite not to inject the CSS as a styletag into the document head.  We want this because injected CSS will affect studio styling. We also change all Studio CSS styling to include the `?studioCSS` query parameter to make sure that it is ignored by this plugin.

J=SLAP-2912
TEST=manual
@alextaing alextaing force-pushed the dev/inject-css-into-iframe branch 2 times, most recently from 95b2793 to 94d0a2d Compare October 17, 2023 19:04
@alextaing alextaing requested a review from nmanu1 October 17, 2023 19:25
alextaing and others added 19 commits October 17, 2023 15:42
This PR adds a list in `ComponentMetadata` of the file paths to the CSS
files that each component imports. In `ComponentFile`, a dependency tree
is used to find all transitive CSS for each component. The
`dependency-tree` library allows for optimization by passing in already
parsed dependency trees, so component tree is formed in Parsing
Orchestrator so that previous dependencies can be accessed.

J=SLAP-2912
TEST=auto,manual
This PR modifies how page CSS is parsed. Instead of storing relative CSS
file paths in `cssImports` for `pageState`, we now store absolute CSS
paths. This is so we can easily dynamically import them in `studio-ui`.
Since we do this, we have to make sure that when we write back the CSS
import, it is transformed back into the relative path.

J=SLAP-2912
TEST=auto,manual
This PR adds a new plugin that adds the `?inline` query param to all user CSS imports.  This plugin ignores CSS imports from Studio.  The inline parameter tells Vite not to inject the CSS as a styletag into the document head.  We want this because injected CSS will affect studio styling. We also change all Studio CSS styling to include the `?studioCSS` query parameter to make sure that it is ignored by this plugin.

J=SLAP-2912
TEST=manual
This PR adds a list in `ComponentMetadata` of the file paths to the CSS
files that each component imports. In `ComponentFile`, a dependency tree
is used to find all transitive CSS for each component. The
`dependency-tree` library allows for optimization by passing in already
parsed dependency trees, so component tree is formed in Parsing
Orchestrator so that previous dependencies can be accessed.

J=SLAP-2912
TEST=auto,manual
packages/studio-ui/src/AppWithLazyLoading.tsx Outdated Show resolved Hide resolved
packages/studio-ui/src/utils/loadUserAssets.tsx Outdated Show resolved Hide resolved
packages/studio-ui/src/utils/loadUserAssets.tsx Outdated Show resolved Hide resolved
packages/studio-ui/src/utils/loadUserAssets.tsx Outdated Show resolved Hide resolved
packages/studio-ui/src/utils/loadUserAssets.tsx Outdated Show resolved Hide resolved
@alextaing alextaing requested a review from nmanu1 October 23, 2023 19:43
@alextaing alextaing merged commit c030a42 into feature/css-in-iframe Oct 23, 2023
15 checks passed
@alextaing alextaing deleted the dev/inject-css-into-iframe branch October 23, 2023 20:08
alextaing added a commit that referenced this pull request Oct 26, 2023
This PR configures Tailwind in our test site and end-to-end tests. We
also re-introduce screenshots for Darwin that we turned off in (#412).
Note that the `loadingOverlay` wait was fixed in our
`StudioPlaywrightPage`. Before, we waited for a button to be visible as
a check for the overlay to be gone. However, Playwright only considers
`hidden` [elements to be not
visible](https://playwright.dev/docs/actionability#visible), while our
`loadingOverlay` uses `opacity` to "toggle" visibility. Additionally,
since Playwright [defaults to fast-forwarding
transitions](https://playwright.dev/docs/api/class-pageassertions) for
`toHaveScreenshot`, we shouldn't have to worry about the opacity
transition time.

I also squeeze in a quick variable rename from `userStyles` to
`activeStyle` to more accurately describe that we are not injecting all
user styles, but only the ones on the active page and its component
tree.

J=SLAP-2912
TEST=auto, manual
alextaing added a commit that referenced this pull request Oct 26, 2023
At long last, this PR allows users to view their CSS and SCSS styling in
the Preview Panel. This base of this feature is complete, however, it
does have a known edge case which we have a maintenance item to address.
When using third party styling imports, Studio will not resolve aliased
file paths to style files. See [this
thread](#412 (comment)).

J=SLAP-2912
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.

2 participants