-
Notifications
You must be signed in to change notification settings - Fork 258
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
1b4ea47
commit 273591e
Showing
13 changed files
with
260 additions
and
55 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
# Viewport size | ||
|
||
## Overview | ||
The viewport size API allows you to access the current viewport size. This can be useful for creating responsive and adaptive designs that are suitable for the user's screen size. | ||
|
||
## Examples | ||
|
||
### Responsive Design | ||
|
||
Responsive design is having a single fluid layout that adapts to all screen sizes. | ||
|
||
You can use the viewport size to dynamically set the property of a style. This can be useful if you want to fit two boxes in a row for larger screens (e.g. desktop) and a single box for smaller screens (e.g. mobile) as shown in the example below: | ||
|
||
```py | ||
import mesop as me | ||
|
||
@me.page() | ||
def page(): | ||
if me.viewport_size().width > 640: | ||
width = me.viewport_size().width / 2 | ||
else: | ||
width = me.viewport_size().width | ||
for i in range(8): | ||
me.box(style=me.Style(width=width)) | ||
``` | ||
|
||
> Tip: Responsive design tends to take less work and is usually a good starting point. | ||
### Adaptive Design | ||
|
||
Adaptive design is having multiple fixed layouts for specific device categories at specific breakpoints, typically viewport width. | ||
|
||
For example, oftentimes you will hide the nav component on a mobile device and instead show a hamburger menu, while for a larger device you will always show the nav component on the left side. | ||
|
||
```py | ||
import mesop as me | ||
|
||
@me.page() | ||
def page(): | ||
if me.viewport_size().width > 480: | ||
nav_component() | ||
body() | ||
else: | ||
body(show_menu_button=True) | ||
``` | ||
|
||
> Tip: Adaptive design tends to take more work and is best for optimizing complex mobile and desktop experiences. | ||
## API | ||
|
||
::: mesop.features.viewport_size.viewport_size | ||
|
||
::: mesop.features.viewport_size.Size |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
import mesop as me | ||
|
||
|
||
@me.page(path="/viewport_size") | ||
def app(): | ||
me.text( | ||
f"viewport_size width={me.viewport_size().width} height={me.viewport_size().height}" | ||
) | ||
|
||
if me.viewport_size().width > 640: | ||
width = round(me.viewport_size().width / 2) | ||
else: | ||
width = me.viewport_size().width | ||
|
||
me.box( | ||
style=me.Style( | ||
width=width, | ||
height=40, | ||
background="blue", | ||
) | ||
) | ||
|
||
# Example of adaptive design: | ||
if me.viewport_size().width > 640: | ||
with me.box( | ||
style=me.Style( | ||
width="100%", | ||
height=100, | ||
background="pink", | ||
) | ||
): | ||
me.text("Only shown on large screens") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
from dataclasses import dataclass | ||
|
||
from mesop.runtime import runtime | ||
|
||
|
||
@dataclass(kw_only=True) | ||
class Size: | ||
""" | ||
Attributes: | ||
width: The width of the viewport in pixels. | ||
height: The height of the viewport in pixels. | ||
""" | ||
|
||
width: int | ||
height: int | ||
|
||
|
||
def viewport_size() -> Size: | ||
""" | ||
Returns the current viewport size. | ||
Returns: | ||
Size: The current viewport size. | ||
""" | ||
pb_size = runtime().context().viewport_size() | ||
return Size( | ||
width=pb_size.width, | ||
height=pb_size.height, | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
import {test, expect} from '@playwright/test'; | ||
|
||
test('viewport_size', async ({page}) => { | ||
await page.goto('/viewport_size'); | ||
await page.setViewportSize({width: 400, height: 300}); | ||
// For the following assertions, make sure the width has updated so that | ||
// there isn't a race condition. | ||
expect(await page.getByText('viewport_size width=400').textContent()).toEqual( | ||
'viewport_size width=400 height=300', | ||
); | ||
await page.setViewportSize({width: 500, height: 200}); | ||
expect(await page.getByText('viewport_size width=500').textContent()).toEqual( | ||
'viewport_size width=500 height=200', | ||
); | ||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.