diff options
| author | Armand Philippot <git@armandphilippot.com> | 2023-09-26 18:43:11 +0200 |
|---|---|---|
| committer | Armand Philippot <git@armandphilippot.com> | 2023-10-24 12:25:00 +0200 |
| commit | 388e687857345c85ee550cd5da472675e05a6ff5 (patch) | |
| tree | 0f035a3cad57a75959c028949a57227a83d480e2 /src/styles | |
| parent | 70efcfeaa0603415dd992cb662d8efb960e6e49a (diff) | |
refactor(components): rewrite Button and ButtonLink components
Both:
* move styles to Sass placeholders
Button:
* add `isPressed` prop to Button
* add `isLoading` prop to Button (to differentiate state from
disabled)
ButtonLink:
* replace `external` prop with `isExternal` prop
* replace `href` prop with `to` prop
Diffstat (limited to 'src/styles')
| -rw-r--r-- | src/styles/abstracts/_placeholders.scss | 1 | ||||
| -rw-r--r-- | src/styles/abstracts/placeholders/_buttons.scss | 193 |
2 files changed, 194 insertions, 0 deletions
diff --git a/src/styles/abstracts/_placeholders.scss b/src/styles/abstracts/_placeholders.scss index 18b1c03..7729e84 100644 --- a/src/styles/abstracts/_placeholders.scss +++ b/src/styles/abstracts/_placeholders.scss @@ -1,4 +1,5 @@ @forward "./placeholders/animations"; +@forward "./placeholders/buttons"; @forward "./placeholders/clearfix"; @forward "./placeholders/layout"; @forward "./placeholders/list"; diff --git a/src/styles/abstracts/placeholders/_buttons.scss b/src/styles/abstracts/placeholders/_buttons.scss new file mode 100644 index 0000000..38388a1 --- /dev/null +++ b/src/styles/abstracts/placeholders/_buttons.scss @@ -0,0 +1,193 @@ +@use "../functions" as fun; + +%button { + display: inline-flex; + place-content: center; + align-items: center; + gap: var(--spacing-2xs); + border: none; + border-radius: fun.convert-px(5); + font-size: var(--font-size-md); + font-weight: 600; + text-decoration: none; + transition: all 0.3s ease-in-out 0s; + + &[aria-busy="true"] { + cursor: wait; + } + + &[aria-disabled="true"] { + cursor: not-allowed; + } +} + +%primary-button { + background: var(--color-primary); + border: fun.convert-px(2) solid var(--color-bg); + box-shadow: + 0 0 0 fun.convert-px(2) var(--color-primary), + 0 0 0 fun.convert-px(3) var(--color-primary-darker), + fun.convert-px(2) fun.convert-px(2) 0 fun.convert-px(3) + var(--color-primary-dark); + color: var(--color-fg-inverted); + text-shadow: fun.convert-px(2) fun.convert-px(2) 0 var(--color-shadow); + + &:disabled { + background: var(--color-primary-darker); + } + + &:not(:disabled) { + &:hover, + &:focus { + background: var(--color-primary-light); + box-shadow: + 0 0 0 fun.convert-px(2) var(--color-primary-light), + 0 0 0 fun.convert-px(3) var(--color-primary-darker), + fun.convert-px(7) fun.convert-px(7) 0 fun.convert-px(2) + var(--color-primary-dark); + color: var(--color-fg-inverted); + transform: translateX(#{fun.convert-px(-4)}) + translateY(#{fun.convert-px(-4)}); + } + + &:focus:not(:hover) { + text-decoration: underline solid var(--color-fg-inverted) + fun.convert-px(2); + } + + &:active, + &[aria-pressed="true"] { + box-shadow: + 0 0 0 fun.convert-px(2) var(--color-primary), + 0 0 0 fun.convert-px(3) var(--color-primary-darker), + 0 0 0 0 var(--color-primary-dark); + transform: translateX(#{fun.convert-px(4)}) + translateY(#{fun.convert-px(4)}); + + &:not(:hover, :focus) { + background: var(--color-primary-dark); + } + } + } +} + +%secondary-button { + background: var(--color-bg); + border: fun.convert-px(3) solid var(--color-primary); + box-shadow: + fun.convert-px(1) fun.convert-px(1) fun.convert-px(1) var(--color-shadow), + fun.convert-px(1) fun.convert-px(2) fun.convert-px(2) fun.convert-px(-2) + var(--color-shadow), + fun.convert-px(3) fun.convert-px(4) fun.convert-px(5) fun.convert-px(-4) + var(--color-shadow); + color: var(--color-primary); + + &:disabled { + border-color: var(--color-border-dark); + color: var(--color-fg-light); + } + + &:not(:disabled) { + &:hover, + &:focus { + border-color: var(--color-primary-light); + color: var(--color-primary-light); + box-shadow: + fun.convert-px(1) fun.convert-px(1) fun.convert-px(1) + var(--color-shadow-light), + fun.convert-px(1) fun.convert-px(2) fun.convert-px(2) fun.convert-px(-2) + var(--color-shadow-light), + fun.convert-px(3) fun.convert-px(4) fun.convert-px(5) fun.convert-px(-4) + var(--color-shadow-light), + fun.convert-px(7) fun.convert-px(10) fun.convert-px(12) + fun.convert-px(-3) var(--color-shadow-light); + transform: scale(var(--scale-up, 1.1)); + } + + &:focus:not(:hover) { + text-decoration: underline var(--color-primary-light) fun.convert-px(3); + } + + &:active, + &[aria-pressed="true"] { + box-shadow: 0 0 0 0 var(--color-shadow); + transform: scale(var(--scale-down, 0.94)); + + &:not(:hover, :focus) { + border-color: var(--color-primary-dark); + color: var(--color-primary-dark); + } + } + } +} + +%tertiary-button { + background: var(--color-bg); + border: fun.convert-px(3) solid var(--color-primary); + box-shadow: + fun.convert-px(2) fun.convert-px(2) 0 0 var(--color-bg), + fun.convert-px(3) fun.convert-px(3) 0 0 var(--color-primary-dark), + fun.convert-px(5) fun.convert-px(5) 0 0 var(--color-bg), + fun.convert-px(6) fun.convert-px(6) 0 0 var(--color-primary-dark); + color: var(--color-primary); + + &:disabled { + color: var(--color-fg-light); + border-color: var(--color-border-dark); + box-shadow: + fun.convert-px(2) fun.convert-px(2) 0 0 var(--color-bg), + fun.convert-px(3) fun.convert-px(3) 0 0 var(--color-primary-darker), + fun.convert-px(5) fun.convert-px(5) 0 0 var(--color-bg), + fun.convert-px(6) fun.convert-px(6) 0 0 var(--color-primary-darker); + } + + &:not(:disabled) { + &:hover, + &:focus { + border-color: var(--color-primary-light); + box-shadow: + fun.convert-px(2) fun.convert-px(3) 0 0 var(--color-bg), + fun.convert-px(4) fun.convert-px(5) 0 0 var(--color-primary), + fun.convert-px(6) fun.convert-px(8) 0 0 var(--color-bg), + fun.convert-px(8) fun.convert-px(10) 0 0 var(--color-primary), + fun.convert-px(10) fun.convert-px(12) fun.convert-px(1) 0 + var(--color-shadow-light), + fun.convert-px(10) fun.convert-px(12) fun.convert-px(5) + fun.convert-px(1) var(--color-shadow-light); + color: var(--color-primary-light); + transform: translateX(#{fun.convert-px(-3)}) + translateY(#{fun.convert-px(-5)}); + } + + &:focus:not(:hover) { + text-decoration: underline var(--color-primary) fun.convert-px(2); + } + + &:active, + &[aria-pressed="true"] { + box-shadow: 0 0 0 0 var(--color-shadow); + transform: translateX(#{fun.convert-px(5)}) + translateY(#{fun.convert-px(6)}); + } + } +} + +%circle-or-square-button { + width: min-content; + padding: var(--spacing-md); + aspect-ratio: 1 / 1; +} + +%circle-button { + @extend %circle-or-square-button; + + border-radius: 50%; +} + +%rectangle-button { + padding: var(--spacing-2xs) var(--spacing-sm); +} + +%square-button { + @extend %circle-or-square-button; +} |
