ðš CSS Advent Calendar: Day 23 / Declarative Web Design
Published on
Updated on
Intrinsic Web Design/Every Layout/Utopia ãš Declarative Design. ãããŠãContainer Size Queries ã®å®çŸ
Table of Contents
Table of Contents
ã¯ããã«
Thoughts in Common around Recent Web Design â Intrinsic Web Design/Every Layout/Utopia
Intrinsic Web Design ã Jen Simmons ã«ãã£ãŠæå±ãããããããããåãªã Breakpoint ããŒã¹ã® Responsive ããè±åŽãã Web Design ã«é¢ããèå¯ã掻çºã«ãªããæ§ã ãªææ³ãçè«ãæå±ãããããã«ãªããŸããã
Every Layout ã Utopia ã®ã¢ãããŒãã¯ãã®ä»£è¡šçãªäŸã§ãã
Intrinsic Web Design ã¯ãWeb Design ã«ããããã³ã³ãã³ãèªäœãæ¬æ¥æã€æ§è³ªãå€ãå©çšããããšããèãæ¹ã§ããã
Every Layout ã¯ãCSS åºæã®æ§è³ªãçãããªãããããã«ããŠå¹ççã§å ç¢ãªã¬ã€ã¢ãŠãã®å®è£ ãå¯èœãããã¿ãŒã³åããŠæç€ºãããã®ã§ããã
Utopia ã¯ãWeb Design ã«ããããäžéããäžéã®ã¹ã±ãŒãªã³ã°ããèšç®åŒãšããŠè¡šçŸãããã®ã§ããã
åºå
žïŒ Designing with fluid type scales | Utopia
ãããŠãããã Intrinsic Web Design ã Every LayoutãUtopia ã®ã¢ãããŒãã«ã¯ãããã€ãã®å ±éç¹ãååšããããšãã2022幎㫠Jeremy Keith ã瀺ããŸãã
1. Give up Control
ãŸãããããã®èãæ¹ã§ã¯ãæå³çã«ãå¶åŸ¡ãææŸãããšããããŠããŸãã
Utopia ã®ã¹ã±ãŒãªã³ã°ãäŸã«ãšããšãæå°å€ãšæå€§å€ãæå®ããã ãã§ãäžéã®å€ã¯ãã¹ãŠèšç®åŒã«ãã£ãŠæ±ºãŸããŸãã Viewport ã 768px ã®ãšãäœpx ãã©ããã¯äžæã§ãããæå° 1remã»æå€§ 1.5rem ã®éã«ãããŠæµåçãªå€åã«ãªãããã Viewport ã«åãããã¹ã±ãŒãªã³ã°åŒãå°åºãããŸãã
font-size: clamp(1.2rem, 0.5rem + 0.666vw, 1.33rem);
åºå
žïŒ Designing with fluid type scales | Utopia
Intrinsic Web Design ã«ãäžè²«ããŠåæ§ã®ç¹åŸŽããããŸããã äŸãã°ãã«ã©ã ã¬ã€ã¢ãŠããå®çŸããéãMedia Query ãçšããŠãããããã®ç»é¢å¹ ã®å Žåã«èŠçŽ ã®å¹ ãæå®ãããšãã£ãããšã¯è¡ããŸããã ã³ã³ãã³ãã®éãå¹ ã«å¿ããããšãã§ãããGrid ãªã©ã®å©çšãæšå¥šããŠããŸãã
ç¹å®ã®ç»é¢å¹ ãç¶æ³ã«ãããçµæã®åºåãç®æãã®ã§ã¯ãªããã«ãŒã«ã®ã¿ãèšå®ããããšã¯ã·ã¹ãã ã«æé©åãå§ããããšãéèŠããŠããç¹ãå ±éã§ãã
2. Remove Assumptions
ããã¯ããã¶ã€ã³ã«æœåšãããåæãå¶çŽãåãé€ããããšã«ãç¹ãããŸãã
åŸæ¥ã®ãã¶ã€ã³ã¯ãViewport 㯠1024pxããããã©ã«ã font-size 㯠16pxããwriting-mode ã¯å·Šããå³ããšãã£ãåæã®äžã«æãç«ã£ãŠããŸããã rem ã logical property ãç»å Žããåã® CSS ã§ã¯ãããããåæãªãã«ãã¶ã€ã³ã衚çŸããææ®µãéãããŠããããšã«å ãã ãã¶ã€ã³ããŒã«ã¯ããã©ãŠã¶ã®ããã«å®éã®è¡šç€ºç°å¢ã倿°ãšããŠç¥ãããšãã§ããªããã°ãããããå©çšããã¬ã³ããªã³ã°ãšã³ãžã³å ã§è¡ãããè€éãªèšç®ãã·ãã¥ã¬ãŒãããããšãã§ããŸããã
äŸãã°ããã¿ã³ã以äžã®ããã«ã¹ã¿ã€ã«ãããšããŸãã font-size ã 16pxãå·ŠåŽã® padding ã 16px ã®ãã¿ã³ã®ã¹ã¿ã€ã«ã§ãããç¹ã«äœã®åé¡ããªããããããŸããã
button {
font-size: 16px;
padding-left: 16px;
}
ãããã16px ã¯ãæ¬åœã«ã16pxããæå³ããŠããã®ã§ããããïŒ padding-left ã¯ãæ¬åœã«ãå·ŠåŽãã«ä»äžãããã®ã§ããããïŒ
ãããããã©ã«ã font-size ã 16px ã§ããããšããLTR ã§ããããšãåæãšããŠããã®ã§ããã°ãwriting-mode: vertical-rl;
ãšãã£ãæ³å®å€ã®ç¶æ³ã§ãã¶ã€ã³ãç Žç¶»ããã§ãããã
çŸåšã® CSS ã§ã¯ãæ¬æ¥ã®ãã¶ã€ã³ã®æå³ããæç« ã®å§ãŸãã«ããã©ãŠã¶ã®ããã©ã«ã font-size åã ã padding ãèšããããšããããã«ã»ãã³ãã£ãã¯ã«è§£éã§ããã°ã以äžã®ããã«æžãããšãã§ããŸãã
button {
font-size: 1rem;
padding-inline-start: 1rem;
}
ãã®ããã«ã»ãã³ãã£ãã¯ãªå®£èšã«ã§ãããšãæ§ã ãªè¡šç€ºç°å¢ã«ãããŠãããã©ãŠã¶ã«æå³ããçµæã®å°åºãå§ããããšãã§ããŸãã
3. Fault Tolerance
æ³å®å€ã®ç¶æ³ã«å¯Ÿå¿ã§ãããšããããšã¯ãèšãæãããªãã°ãFault ToleranceïŒèé害æ§ïŒã ããããšããããšã§ãã
Responsive Web Design ã§ã¯ããViewport ã 320px ãã 1920px ã®éã§å€åããããšãã£ãããæ³å®ãããç¯å²å
ãã§ã®å€åã«å¯ŸããŠãMedia Query ãçšããŠå¯Ÿå¿ããŠããŸããã
ãããå®éã«ã¯ãMedia Query å®çŸ©å€ã®ç»é¢å¹
ããŠãŒã¶èšå®ã®å€æŽãã¢ã¯ã»ã·ããªãã£æ©èœã®å©çšãªã©ãæ³å®/衚çŸã§ããªãç¶æ³ã¯èšãç¥ããªãã»ã©ååšããŸãã
ããããæ³å®å€ã®ç¶æ³ã«çŽé¢ããæãMedia Query ã«ãã£ãŠå®çŸ©ãããã«ãŒã«ã¯é©çšããããpadding-left
ã¯å·ŠåŽã«åºå®ãããfont-size: 16px;
ã¯ãŠãŒã¶èšå®ãåæ ããããªããããããŸããã
Intrinsic Web Design ã Every LayoutãUtopia ã§ã¯ãã³ã³ãããŒã«ãææŸããç¹å®ã®åæã«äŸåããªãããšã§ãæ³å®å€ã®ç¶æ³ã«ãããŠãããã°ãçã¿ã«ãããã¶ã€ã³ã«ããããšãç®æããŠãããšãèšããŸãã
Declarative Design
ãããã®å ±éé ããDeclarativeïŒå®£èšçïŒ ãšããåèªã«ãã£ãŠè¡šçŸããã®ããJeremy Keith ã®æå±ãã Declarative Design ã§ãã
Imperative vs Declarative
ããã°ã©ãã³ã°ã«ã¯ãImperative ãš Declarative ã®å€§ããåããŠäºã€ã®ã¢ãããŒãããããŸãã
Imperative ãªã¢ãããŒãã§ã¯ããé åãäœããã«ãŒãããŠãæ¡ä»¶ããã§ãã¯ããçµæãè¿ããããã«ãå ·äœçãªæé ãéäžæç€ºãããã®ã§ãã å€ãã®ããã°ã©ãã³ã°èšèªã¯ããã«ããããJavaScript ããã®äžã€ã§ãã
const results = [];
for (let i = 0; i < items.length; i++) {
if (items[i].condition === true) {
results.push(items[i]);
}
}
return results;
察ããŠãDeclarative ãªã¢ãããŒãã¯ã欲ããçµæã ããèšè¿°ããå ·äœçãªåŠçã¯ã·ã¹ãã ã«å§ããŸãã ã€ãŸããDeclarative ã§ãããšããããšã¯ããåºåããå¶åŸ¡ããããšããã®ã§ã¯ãªãããé©åãªå ¥åããã宣èšãããããšã«çŠç¹ãåœãŠãŠãããšãããããšãã§ããŸãã
äŸãã°ãSQL ã®ãããªã¯ãšãªèšèªã¯ããæ¡ä»¶ãçã®é ç®ãéžæãããã®ããã«èšè¿°ãããå žåçã« Declarative ãªèšèªã§ãã
SELECT * FROM items WHERE condition = true
CSS is Declarative and Fault Tolerant
ãé©åãªå ¥åããã宣èšãããå ·äœçãªåŠçããã©ãŠã¶ã«å§ãã â ããã¯ããã©ãŠã¶ã«ãHintsãããSuggestããããInfluenceããäžãããCSS ã®æ¬è³ªãšå矩ã§ãããšæããããšãã§ããŸãã
ãã£ãŠãCSS ã¯å®£èšçãªèšèªã§ãããšãããŸãã
CSS ã¯å®£èšçãªèšèªãšããŠããäœãéæããããããèšè¿°ãããã©ã®ããã«éæããããã¯ãã©ãŠã¶ã«å§ããŸãã ãã®å®£èšçãªæ§è³ªã«ãããç°ãªãç°å¢ãæ¡ä»¶äžã§ãããã©ãŠã¶ãæé©ãªæ¹æ³ã§æå³ãå®çŸã§ããæè»æ§ãæã£ãŠããŸãã
Media Query/Container Query/if()
/etc ã®ãããªæ¡ä»¶åå²ãcalc()
/sin()
/pow()
/sign()
/etc ã®èšç®ãè¡ã颿°ãªã©ããæçµçã«ã¯ãã®å®£èšçãªæ§è³ªã®äžéšãšããŠè§£éã§ããŸãã
æ¡ä»¶åå²ãäŸã«ãšããšãImperative ãªèšèªã§ã¯ãA ã®å Žåã«ã¯ B ãå®è¡ããããšããæ¡ä»¶åå²ãå¶åŸ¡ãããŒã®äžéšãšããŠååšãããã®å€ã以ãŠåŠçãå®è¡ãããŸãã ãããŠãæçµçãªåºåã¯ãæ¡ä»¶åå²ã®çµæã«äŸåããŠæ±ºå®ãããŸãã
ããããCSS ã«ã¯ããå®è¡ããããšããæŠå¿µããããŸããã ãA ã®å Žåã«ã¯ B ãæå¹ãšããããšããæ¡ä»¶ã¯ååšããŠãããã®å€ãåŸç¶ã®äœãã®å®è¡ã掻æ§ã«åœ±é¿ãäžããããã§ã¯ãããŸããã ããã«ãåºåïŒã¹ã¿ã€ã«ã«ãŒã«ãé©çšããããã©ããïŒã®æçµæ±ºå®æš©ã¯ããã©ãŠã¶ã«ãããŸãã
äŸãã°ã@media
ã @container
㯠Conditional Group Rules ã§ãããRules (Qualified Rule) ã¯ã宣èšã®ãã£ã³ã¯ãã§ãã
qualified rule
A qualified rule has a prelude consisting of a list of component values, a list of declarations, and a list of child rules.
ã宣èšãã®ãã£ã³ã¯ã«å¯Ÿããæ¡ä»¶ã§ãããããæ¡ä»¶åå²ã®çµæãåŸç¶ã®äœãã®å®è¡/掻æ§ã«åœ±é¿ãäžããããšããªããã°ãæçµçãªå€ãšããŠæ¡çšãããããå¶åŸ¡ããããšãã§ããŸããã
æçµçãªå€ãå¶åŸ¡ã§ããªãããšã¯ãå®éã®ã³ãŒãã§èããŠãããããŸãã
/* stylesheet.css */
@media (width > 768px) {
.card { padding: 2rem; }
}
@container (width > 500px) {
.card { padding: 3rem; }
}
.card {
padding: if(style(--condition: true): 4rem; else: 1rem;);
padding: 5rem;
}
- âç»é¢å¹ ãâ 768px 以äžã®æã¯ 2rem ã«
- âã³ã³ãããâ 500px 以äžã®æã¯ 3rem ã«
--condition
ã true ã®æã¯ 4rem ã«- ãã以å€ã¯ 1rem ã«
- ã ãã©ã宣èšé åºã«ãã£ãŠæçµçã«ã¯ 5rem ã«
ãã£ãŠãæ¡ä»¶åå²ã颿°ããCSS ã«ãããŠã¯å¶åŸ¡ãããŒã®äžéšã§ã¯ãªããé©çšããã宣èšããã©ãŠã¶ã«å§ããããã®ã宣èšããšããç«ã¡äœçœ®ã§è«ããããšãšããŸãã
Being Declarative achieves Full Flexibility in Designing on the Web
Intrinsic Web Design ã Every LayoutãUtopia ã®ã¡ã³ã¿ã«ã¢ãã«ã«ã¯ã次ã®ãããªèãæ¹ãå«ãŸããŠããŸãã
To design âadaptable pagesâ (Allsoppâs term), we must relinquish control to the algorithms (like text wrapping) browsers use to lay out web pages automatically. But thatâs not to say thereâs no place for influencing layout.
Think of yourself as the browserâs mentor, rather than its micro-manager.
Andy Bell â Axioms: Every Layout
We say CSS is âdeclarativeâ, but the more and more I write breakpoints to accommodate all the different ways a design can change across the viewport spectrum, the more I feel like Iâm writing imperative code. At what quantity does a set of declarative rules begin to look like imperative instructions?
In contrast, one of the principles of Utopia is to be declarative and âdescribe what is to be done rather than command how to do itâ. This approach declares a set of rules such that you could pick any viewport width and, using a formula, derive what the type size and spacing would be at that size.
Jim Nielsen â Thoughts on Exerting Control With Media Queries - Jim Nielsenâs Blog
Intrinsic: belonging to the essential nature or constitution of a thing
ãäœãããããã宣èšãããã©ãŠã¶ã®ã¡ã³ã¿ãŒãšããŠæ¯ãèãããã©ã®ããã«ããããã®å ·äœçãªæé ãæç€ºãããããŒãžã£ã«ãªãããšãé¿ãã â ã€ãŸãã宣èšçã«ãªãããšã§ãCSS ã®æ¬è³ªïŒIntrinsicïŒã«åºã¥ããã çã«Fault Tolerant ãªæè»æ§ãæã€ãã¶ã€ã³ãå¯èœã«ãªããšããããšãã§ããŸãã
Mindset Shift
ãã®ã¢ãããŒããå®çŸããããã«ã¯ããã¶ã€ã³ã«ããã€ã³ãã»ããã®è»¢æããæ±ããªããã°ãªããŸããã
ãã¶ã€ã³ããŒã«ã¯ãç¹å®ã®æ¡ä»¶äžã§ã®ããžã¥ã¢ã«çµæãäœæããããšã«ç¹åããŠããŸãã å®éã®ãŠãŒã¶ãŒç°å¢ã®å€æ§æ§ïŒOSãããã€ã¹ããŠãŒã¶ãŒèšå®ãã¢ã¯ã»ã·ããªãã£æ©èœãetcïŒããã¹ãŠã·ãã¥ã¬ãŒãããããšã¯å°é£ã§ãã
ããããåæãã³ã³ãããŒã«ããŠããŠã¯ãCSS ã®æ¬è³ªïŒIntrinsicïŒã«åºã¥ãããFault Tolerant ã§æè»ãªãã¶ã€ã³ã¯å®çŸã§ããŸããã ãã£ãŠãæ³å®å€ã®ç¶æ³ã«ãããŠãæåŸ ãããã¶ã€ã³ããŠãŒã¶ã«å±ããããšãã§ããªãå¯èœæ§ãåŠããªããªããŸãã
åŸã£ãŠãåæãã³ã³ãããŒã«ãããæåŸ ããåºåããã©ãŠã¶ã«å§ããããã®ã宣èšããã¶ã€ã³ãããããšãæ±ããããŸãã
ãããå®çŸããããã«ãEvery Layout ã§ã¯ããããžã¥ã¢ã«çãªææç©ãäœæãã代ããã«ãææç©ã®ç¹åŸŽãæ§æããããã®ãšã㊠Web Design ãèãããšè¡šçŸããŠããŸãã
Designing without seeing:
Designing by axiom requires something of a mental shift. Axioms do not directly create visual artefacts, only the characteristics of artefacts that might emerge.
Andy Bell â Axioms: Every Layout
ãã®ãã¶ã€ã³ã®ãã€ã³ãã»ããã瀺ããã®ããDeclarative Design ã§ãã
Canât be Declarative to the Containers ⊠Now, Resolved.
Declarative Design ã¯ãCSS ã宣èšçã§ããããšãåæã«äž»åŒµå¯èœãªèãæ¹ã§ãã ãããŠãCSS ã®å®£èšçãªæ§è³ªãé²åºãããã°ãããã»ã©ãDeclarative Design ã¯å®çŸãããããªããŸãã ãªããªãã°ã宣èšã®æ¹æ³ã«å¹ ãåºããã»ã©ããé©åãªå ¥åããã宣èšããã ããšã容æã«ãªãããã§ãã
ã³ã³ããŒãã³ãå¿åãå®çããŠä»¥æ¥ããã®ãå®£èšæ¹æ³ããšããŠå§åçã«æ¬ èœããŠããã®ãããã³ã³ããã«å¯ŸããŠã³ã³ãã³ãã宣èšçã«ãªããæ©èœã§ããã
BoxïŒã³ã³ããïŒãš ContentïŒã³ã³ãã³ãïŒã¯ãFlow ã«ãã£ãŠå®è£ ã¬ãã«ã§éåžžã«ã¿ã€ãã«çµã³ã€ããŠããããããåå ãšãªã£ãŠãã³ã³ããã Query ããŠã³ã³ãã³ããå¶åŸ¡ããããšãå°é£ã§ãããïŒDay 22 ãåç §ïŒ
ãã®åé¡ã«å¯ŸããŠå¯ŸåŠããè°è«ãã2020幎ããããæ¬æ Œçã«å§ãŸããDavid Baron ã® @container
ãš Brian Kardell ã® switch()
ã®2ã€ã®ã¢ãããŒããæ€èšãããŸããã
- dbaron/container-queries-implementability: Proposal for container queries designed to be implementable in web browsers
- All Them Switches: Responsive Elements and More
ãã®äžã§ããCSS Containment ãå©çšãã @container
ã®ã¢ãããŒããç¶æ¿ããŠææ¡ãããã®ããMiriam Suzanne ã®ææ¡ã§ãã
CSS Containment ã¯ãèŠçŽ ã®å éšã§çºçãã倿Žãå€éšã«åœ±é¿ãäžããªããããå°ã蟌ãããä»çµã¿ã§ãã
éåžžãCSS ã§ã¯åèŠçŽ ã®ãµã€ãºãã¹ã¿ã€ã«ã®å€æŽã芪èŠçŽ ã«åœ±é¿ãäžããŸãïŒe.g. åèŠçŽ ã®ããã¹ããå¢ãããšèŠªèŠçŽ ã®é«ããå¢ããïŒã ãã㯠Flow ã¬ã€ã¢ãŠãã®åºæ¬çãªæ§è³ªã§ãããContainer Queries ã§ã¯ã芪ã®ãµã€ãºãåºæºã«åã®ã¹ã¿ã€ã«ã倿Žãããå¿ èŠãããããã埪ç°åç §ã®åé¡ãçããŠããŸããã
CSS Containment ã® contain: size layout style;
ã䜿çšãããšãFlow ã«ãã£ãŠçãã Size/Layout/Style ã«ãããåæ¹åã®äŸåé¢ä¿ãæã¡åãããšãå¯èœã§ãã
- Size Containment: åèŠçŽ ã®ãµã€ãºå€æŽã芪èŠçŽ ã®ãµã€ãºã«åœ±é¿ããªã
- Layout Containment: èŠçŽ å éšã®ã¬ã€ã¢ãŠã倿Žãå€éšã«åœ±é¿ããªã
- Style Containment: ã«ãŠã³ã¿ãŒãªã©ã®ã¹ã¿ã€ã«æ å ±ãèŠçŽ ã®å¢çãè¶ããªã
ããã«ãããBox ãš Content ã®éã®åæ¹åã®äŸåé¢ä¿ãæã¡åãããããŸã§ Container Queries ã§åé¡ã«ãªã£ãŠããã¬ã€ã¢ãŠãæã®åŸªç°ãé²ãããšãå¯èœã«ãªããšèããããŸããã
ããããSize Containment 㯠Intrinsic 㪠Sizing ãå®å šã«å¶éããŠããŸããããContent ã Container ã®ãµã€ãºã決å®ã§ããªããªã£ãŠããŸããŸãã
äŸãã°ã以äžã«ãŠãcontain: size layout style;
ã®ã³ã¡ã³ãã¢ãŠããå€ããšãSize Containment ãæå¹ã«ãªããContainer ã® Sizing ã«ãCSS is Awesomeãã®ã³ã³ãã³ããµã€ãºãå©çšãããªããªãããšãããããŸãã
See the Pen CSS is Awesome by saku (@sakupi01) on CodePen.
埪ç°ãæã¡åãããã« Size Containment ãå©çšããŠã¯ãã³ã³ãã³ããã³ã³ããã overflow ããŠããŸããããªãæãŸãããªãçµæãæããŠããŸããŸãã ããã¯ãSize Containment ããããã¯æ¹åã»ã€ã³ã©ã€ã³æ¹åã®äž¡æ¹ãå°ã蟌ããŠããŸããããå°ã蟌ããããã絶察㫠Flow ããäœå°ããªããªã£ãŠããŸãããã§ãã
ããã§èããããã®ããã³ã³ããã®ã€ã³ã©ã€ã³ãµã€ãºã®ã¿å°ã蟌ãããããã¯æ¹åã«ã¯ Flow ãèš±å¯ãããcontain: inline-size;
ã§ããã
contain: inline-size layout style;
ãšããããšã§ããããã¯æ¹åã« Flow ããäœå°ãæ®ã㊠overflow ãé²ãã€ã€ãã¬ã€ã¢ãŠãã®åŸªç°ãæã¡åãããšãå¯èœã«ãªããŸãã
.container {
contain: inline-size layout style;
}
ç
©é㪠Value æå®ãé¿ã Declarative ã«ã³ã³ãããã¯ãšãªãããããContainer Queries ã§ã¯ä»¥äžã®ããã« container-type
ãæå®ããŸãã
Containment ã®æ©èœãšããŠã¯ãäžèšãšå€ãããŸããã
.container {
container-type: inline-size;
}
Container Size Queries ãå©çšããéã«èšè¿°ãã container-type: inline-size;
ã¯ãBox ã Content ã®ã€ã³ã©ã€ã³ãµã€ãºã«äŸåããããšããã£ã³ã»ã«ããContent ã Box ã®ã€ã³ã©ã€ã³ãµã€ãºãã¯ãšãªå¯èœã«ããããšãæå³ããŸãã
ãã®ãããªèæ¯ã«ãããCSS Container Queries 㯠CSS Containment Module ã®äžéšãšããŠä»æ§çå®ãããŠããŸãã
å®è£ äžã®èª²é¡ã CSS Containment ã«ãã£ãŠå æãããã³ã³ããã«å¯ŸããŠå®£èšçãªã³ã³ãã³ãããå®çŸå¯èœã«ãã CSS Container Queries ã¯ãDeclarative 㪠Design ã®å¹ ã倧ããåºããæ©èœã§ãã
Appendix
- Adactio: JournalâDeclarative design
- Adactio: JournalâDeclarative design systems
- Adactio: JournalâDesign systems roundup
- Declarative Design. A presentation given at the final An⊠| by Jeremy Keith | Medium
- Be the browserâs mentor, not its micromanager. - Build Excellent Websites
- CSS Container Query Proposal & Explainer