Open eirikbacker opened 2 months ago
Good suggestion. We'll definitely have a look at this.
To avoid more subject and ongoing refactors, I suggest we have a look at this after we finish issues we have already comited to doing.
Relevant issues on this subject:
Edit: Updated list of finished issues before this as we are able to do more things in parallel now.
A less radical approach to solve only #2453 and getting rid of useContext
would be stuff like this:
.ds-pagination {
&[data-size='sm'] .ds-button {
--dsc-button-font-size: var(--ds-font-size-4);
--dsc-button-gap: var(--ds-sizing-1);
--dsc-button-padding-block: var(--ds-spacing-2);
--dsc-button-padding-inline: var(--ds-spacing-3);
}
&[data-size='lg'] .ds-button {
--dsc-button-font-size: var(--ds-font-size-6);
--dsc-button-gap: var(--ds-sizing-3);
--dsc-button-padding-block: var(--ds-spacing-3);
--dsc-button-padding-inline: var(--ds-spacing-5);
}
}
Which would still make this work
<nav class="ds-pagination" data-size="sm"> <-- data-size er satt én gang wee
<ol>
<li><button type="button">1</button></li>
<li><button type="button">2</button></li>
<li><button type="button">3</button></li>
<li><button type="button">4</button></li>
<li><button type="button">5</button></li>
<li><button type="button">6</button></li>
</ol>
</nav>
As for scaling sizes based on font-size, this warrants further consideration:
Also, I can't seem to get your example to work. I tried setting it up in a codesandbox but the relative sizing variables don't actually do anything – see the missing padding.
@unekinn The approach of
.ds-pagination {
&[data-size='sm'] .ds-button {
--dsc-button-font-size: var(--ds-font-size-4);
--dsc-button-gap: var(--ds-sizing-1);
--dsc-button-padding-block: var(--ds-spacing-2);
--dsc-button-padding-inline: var(--ds-spacing-3);
}
}
Might be a direction, but I'm concerned of:
@composes ds-button[data-size="sm"]
instead of replicating (and thus forgetting to update) CSS, but we can quickly run into specificity issues as each component file hava certain specificity logic, and this can quickly break if composing. Also, if composing, should it also compose i.e. .ds-button[ds-size="sm"][aria-busy="true"]
or not?.ds-button
from inside .ds-pagination
@media
etc.Sorry - some errors in initially posted pseudo-code 😇 Here is a corrected working example: https://codepen.io/eirikbacker/pen/RwXNpXo
As we only multiply by whole numbers, there is no chance of half-pixels ❤️ (unless changing the root font-size to something like 16.5px
but that is indeed forcing a wave of half-pixel-problems anyway ☺️ )
Status: Lasse is experimenting with this setup as "modes" in Figma
Oppdatert matematisk formel, som tilpasser skalaen basert på font-størrelse, og setter en minimum skala: Se demo
:root {
/* The config */
--ds-sizing-scale-base: var(--ds-font-size-5); /* 18px */
--ds-sizing-scale-min: 0.125rem; /* Minimum 2px steps */
--ds-sizing-scale: 0.25rem; /* Default 4px steps */
--ds-sizing-adjust: calc((var(--ds-sizing-scale-base) - 1em) * .5); /* Fallback if not supporting round() */
--ds-sizing-adjust: round(up, calc((var(--ds-sizing-scale-base) - 1em) * .5), 0.0625rem); /* stylelint-disable-line declaration-block-no-duplicate-custom-properties */
/* The scale */
--ds-sizing-scale-1: max(calc((var(--ds-sizing-scale) - var(--ds-sizing-adjust)) * 1 + var(--ds-sizing-adjust)), calc(var(--ds-sizing-scale-min) * 1));
--ds-sizing-scale-2: max(calc((var(--ds-sizing-scale) - var(--ds-sizing-adjust)) * 2 + var(--ds-sizing-adjust)), calc(var(--ds-sizing-scale-min) * 2));
--ds-sizing-scale-3: max(calc((var(--ds-sizing-scale) - var(--ds-sizing-adjust)) * 3 + var(--ds-sizing-adjust)), calc(var(--ds-sizing-scale-min) * 3));
--ds-sizing-scale-4: max(calc((var(--ds-sizing-scale) - var(--ds-sizing-adjust)) * 4 + var(--ds-sizing-adjust)), calc(var(--ds-sizing-scale-min) * 4));
--ds-sizing-scale-5: max(calc((var(--ds-sizing-scale) - var(--ds-sizing-adjust)) * 5 + var(--ds-sizing-adjust)), calc(var(--ds-sizing-scale-min) * 5));
--ds-sizing-scale-6: max(calc((var(--ds-sizing-scale) - var(--ds-sizing-adjust)) * 6 + var(--ds-sizing-adjust)), calc(var(--ds-sizing-scale-min) * 6));
--ds-sizing-scale-7: max(calc((var(--ds-sizing-scale) - var(--ds-sizing-adjust)) * 7 + var(--ds-sizing-adjust)), calc(var(--ds-sizing-scale-min) * 7));
--ds-sizing-scale-8: max(calc((var(--ds-sizing-scale) - var(--ds-sizing-adjust)) * 8 + var(--ds-sizing-adjust)), calc(var(--ds-sizing-scale-min) * 8));
--ds-sizing-scale-9: max(calc((var(--ds-sizing-scale) - var(--ds-sizing-adjust)) * 9 + var(--ds-sizing-adjust)), calc(var(--ds-sizing-scale-min) * 9));
--ds-sizing-scale-10: max(calc((var(--ds-sizing-scale) - var(--ds-sizing-adjust)) * 10 + var(--ds-sizing-adjust)), calc(var(--ds-sizing-scale-min) * 10));
}
Forenklet:
skala: 4px
minimum: 2px
fontStørrelseStart: 18px;
justering: (fontStørrelseStart - fontStørrelseNå) * .5;
skala-1: (skala - justering) * 1 + justering
==========================================================================================
så f.eks med tall, dersom fontStørrelseNå = 20px:
justering: (18px - 20px) * .5 = 1px;
skala-1: (4px - 1px) * 1 + 1px;
Next step: Should be tested in Figma. Create some sketches/ user interfaces with the suggested scale.
TL;DR: Her er et kjørende eksempel: https://codepen.io/eirikbacker/pen/RwXNpXo
Prerequisite #2526
Har tenkt en stund på dette med
size
. I de fleste tilfeller, vil vi at når man settersize
, på en komponent, så påvirker det også bestanddelene inni. F.eks;Pagination size="sm"
gjør atPagination.Button
også skal hasize="sm"
,Dropdown size="sm"
gjør atDropdown.Item
skal hasize="sm"
og så videre.useContext
APIet som sendersize
nedover. Jeg tenker det er både kjipt fordi det ikke lar seg oversette til oss som jobber uten React, og det er kjipt fordi det gjør applikasjonene tyngre da det krever med rendering i nettleser.La oss ta et eksempel med Pagination:
padding: 5px
på Pagination, så er det lett å arvepadding: 5px
påPagination.Button
.padding: 5px
påPagination
, vi vil hapadding: 0
påPagination
, men fortstatt hapadding: 5px
påPagination.Button
- hvordan får vi til det?font-size
font-size
, så får vi til noen nydeligepadding
-skalaer - også påPagination.Button
- som blir større og mindre, nårfont-size
justeres.Pagination
, så trenger vi ikke å defineregap
mange ganger, fordigap
også kan basere seg påfont-size
.Dette vil være relevant for
gap/padding/margin/width/height
- alt som handler om størrelse, kan være skala-basert påfont-size
I stede for å skrive slik som i dag:
Kunne vi ha skrevet dette:
Og isteden for å skrive slik når (man ikke bruker React):
Vil man kunne skrive dette:
Systemet baserer seg på at man lager en (eller flere) skala, basert på font-size:
Da går det også an å gjøre:
...så dette tror jeg vil være mulig å gjenskape i Figma også?
Ser at det vil kreve en liten opprydding; er ikke alltid vi skalerer gap f.eks konsekvent, men det tror jeg er fint å rydde i uansett. Vil gjerne høre hva dere tenker og gjerne sparre med @Thunear og @Febakke litt på om det designmessig gir mening også.
Vil også løst #1781 Vil også påvirke #1583