- From: Zouhir ⚡️ via GitHub <sysbot+gh@w3.org>
- Date: Thu, 15 Oct 2020 03:06:02 +0000
- To: public-css-archive@w3.org
zouhir has just created a new issue for https://github.com/w3c/csswg-drafts: == Updating the css `env()` function to enable selection by index from a list of pre-defined environment variables == In issue #5621 we highlighted a new syntax for the media feature that was proposed to help Web developers match and insert rules that are specific to dual-screen and foldable devices, the new syntax can be extended to cover multi-screen scenarios and offers better scalability. Detecting whether the browser viewport is spanning across 2 or more screens is only one part of the solution, the other part is informing developers about the geometry and size of each screen and while the `env()` function is great for exposing such hardware-specific configurations, we believe it could be extended and improved to offer better experience for Web developers. ## Illustrating the problem of verbosity Today, user-agents provide [custom-identifiers](https://developer.mozilla.org/en-US/docs/Web/CSS/custom-ident) that web developers pass to the `env()` function as a first argument to get back a value that can be assigned to numerous CSS properties. Following is an illustration of how the `safe-area-inset-top` custom-ident is used to help developers prevent content from being occluded by a smartphone's notch: ```css body { padding-top: env(safe-area-inset-top); } ``` <img width="647" alt="smartphone-notch-inset" src="https://user-images.githubusercontent.com/5052316/96070484-26bf1c80-0e55-11eb-9725-4134f8dc731e.png"> In dual-screen and foldable devices scenarios where the browser window is spanning across more than 1 display region, the user-agent might want to expose the geometry of each display region. Today, that would be something like: | Display Region 1 | Display Region 2 | ... | Display Region N | |:----------------------|:----------------------|:---:|:----------------------| | env(viewport-segment-1-width) | env(viewport-segment-2-width) | ... | env(viewport-segment-n-width) | | env(viewport-segment-1-height) | env(viewport-segment-2-height) | ... | env(viewport-segment-n-height) | | env(viewport-segment-1-top) | env(viewport-segment-2-top) | ... | env(viewport-segment-n-top) | | env(viewport-segment-1-left) | env(viewport-segment-2-left) | ... | env(viewport-segment-n-left) | | env(viewport-segment-1-bottom) | env(viewport-segment-2-bottom) | ... | env(viewport-segment-n-bottom) | | env(viewport-segment-1-right) | env(viewport-segment-2-right) | ... | env(viewport-segment-n-right) | <img width="1111" src="https://user-images.githubusercontent.com/5052316/96070895-f035d180-0e55-11eb-919f-526ba890d960.png"> Stylistically, the solution demonstrated above to expose the display regions' geometry is verbose. Creating a list of custom-identifiers accompanied by a mechanism for web developers to retrieve values by index offers greater scalability and better ergonomics. ## Proposal: CSS `index()` function The `index()` CSS function can be used within the `env()` function to select one value by index from a user-agent-defined environment variables list. ### Syntax and example usage The example below illustrates how to use the browser-provided `env()` variables to create a 2-column CSS Grid layout, where each column's size should equal the corresponding display's width. <img width="843" alt="grid-example" src="https://user-images.githubusercontent.com/5052316/96071296-aac5d400-0e56-11eb-8bd6-d8e93eb7a6b2.png"> #### HTML ```html <div id="grid"> <div id="A"></div> <div id="B"></div> </div> ``` #### CSS ```css #grid { display: grid; height: 100vh; grid-template-columns: env(index(display-width 0), 1fr) env(index(display-width 1), 1fr); grid-template-rows: 100vh; } ``` ### Formal syntax ``` index( <custom-ident> <index-value> ) ``` #### Parameters - *custom-ident*: arbitrary user agent-defined string, [mdn](https://developer.mozilla.org/en-US/docs/Web/CSS/custom-ident) - *index-value*: integer, with the index origin being 0 matching arrays behaviour. ### Behavior #### Case sensitivity User-agent-defined property names are case-sensitive. `env()` respects that today and `index()` will not introduce any changes to that behavior. Example: ```css height: env( index(display-height 0) , 700px); /* height equals the first display-region height */ height: env( index(Display-Height 0) , 700px); /* 700px, because 'Display-Height' does not match the 'display-height' property */ ``` ### "2D" Screen setup In the case we have more than 1 row and 1 column of screens, we propose flattening-out the screens matrix to a linear list where the top-left gets the index 0 followed by the consecutive screens on that row. <img width="280" src="https://user-images.githubusercontent.com/5052316/96072093-56bbef00-0e58-11eb-9ee1-b3e251ad5330.png"> photo credit [wikipedia](https://en.wikipedia.org/wiki/Row-_and_column-major_order) ### Possible future uses #### Usage with `env()` in media query rules `env()` function values can be used as a part of a descriptor such as Media Query rules; thus using `env(index(ua-property 0))` is also supported. #### Usage with custom properties The `index()` function will initially be scoped to the user-agent-defined lists of environment variables. However, if developers in the future are empowered to create lists as custom properties values, `index()` function can be used with `var()` the same way this document proposes for use with `env()`. Please view or discuss this issue at https://github.com/w3c/csswg-drafts/issues/5622 using your GitHub account -- Sent via github-notify-ml as configured in https://github.com/w3c/github-notify-ml-config
Received on Thursday, 15 October 2020 03:06:05 UTC