diff options
| author | Armand Philippot <git@armandphilippot.com> | 2023-10-31 16:00:45 +0100 |
|---|---|---|
| committer | Armand Philippot <git@armandphilippot.com> | 2023-11-11 18:15:27 +0100 |
| commit | 3ff4c37a7a2c40340c17f9e6c1754444bce0f839 (patch) | |
| tree | 551ca3df148d46af2bd27995fa98c01378030644 /src/components/molecules/modals/modal/modal.module.scss | |
| parent | 0e52a59917406ad03c174e030c6c1c92ab23449d (diff) | |
refactor(components): rewrite Modal component
* add an optional close button
* add an icon prop
Diffstat (limited to 'src/components/molecules/modals/modal/modal.module.scss')
| -rw-r--r-- | src/components/molecules/modals/modal/modal.module.scss | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/src/components/molecules/modals/modal/modal.module.scss b/src/components/molecules/modals/modal/modal.module.scss new file mode 100644 index 0000000..81047f3 --- /dev/null +++ b/src/components/molecules/modals/modal/modal.module.scss @@ -0,0 +1,159 @@ +@use "../../../../styles/abstracts/functions" as fun; +@use "../../../../styles/abstracts/mixins" as mix; + +.modal { + --btn-border-size: #{fun.convert-px(1)}; + --header-size: #{fun.convert-px(44)}; + --padding: clamp(var(--spacing-sm), 2.5vw, var(--spacing-md)); + + max-width: 100%; + padding: var(--padding); + position: relative; + box-shadow: + fun.convert-px(0.2) fun.convert-px(0.2) fun.convert-px(0.3) 0 + var(--color-shadow), + fun.convert-px(1.5) fun.convert-px(1.5) fun.convert-px(2.5) + fun.convert-px(-0.3) var(--color-shadow), + fun.convert-px(4.7) fun.convert-px(4.7) fun.convert-px(8) fun.convert-px(-1) + var(--color-shadow); + + &--primary { + background: var(--color-bg-secondary); + border: fun.convert-px(3) solid; + border-image: radial-gradient( + ellipse at top, + var(--color-primary-lighter) 20%, + var(--color-primary) 100% + ) + 1; + } + + &--secondary { + background: var(--color-bg); + border: fun.convert-px(2) solid var(--color-primary-dark); + border-radius: fun.convert-px(3); + } + + &--primary#{&}--has-btn { + --btn-offset-y: #{fun.convert-px(-15)}; + + margin-top: calc(var(--btn-offset-y) * -1); + } + + &--secondary#{&}--has-header { + margin-top: calc(var(--header-size) / 2); + } +} + +.header { + display: flex; + flex-flow: row nowrap; +} + +:where(.header) { + > .icon, + > .title { + display: flex; + flex-flow: row wrap; + align-items: center; + } +} + +.btn { + width: var(--header-size); + min-height: var(--header-size); + background: var(--color-bg); + border: var(--btn-border-size) solid var(--color-primary); + box-shadow: + fun.convert-px(0.2) fun.convert-px(0.2) fun.convert-px(0.3) 0 + var(--color-shadow), + fun.convert-px(1.5) fun.convert-px(1.5) fun.convert-px(2.5) + fun.convert-px(-0.3) var(--color-shadow); +} + +:where(.modal--primary) { + > .header { + align-items: center; + gap: var(--spacing-2xs); + margin-bottom: var(--spacing-2xs); + } + + :where(.header) > .btn { + position: absolute; + top: var(--btn-offset-y); + right: fun.convert-px(-10); + border-image: radial-gradient( + ellipse at top, + var(--color-primary-lighter) 20%, + var(--color-primary) 100% + ) + 1; + } +} + +:where(.modal--secondary) { + :where(.header) { + > .icon, + > .title { + min-height: var(--header-size); + border: fun.convert-px(1) solid var(--color-primary-dark); + box-shadow: + fun.convert-px(0.2) fun.convert-px(0.2) fun.convert-px(0.3) 0 + var(--color-shadow), + fun.convert-px(1.5) fun.convert-px(1.5) fun.convert-px(2.5) + fun.convert-px(-0.3) var(--color-shadow); + } + + > .icon, + > .btn { + flex: 0 0 var(--header-size); + } + + > .icon { + display: flex; + place-content: center; + background: var(--color-primary); + color: var(--color-fg-inverted); + + path { + fill: var(--color-fg-inverted); + stroke: var(--color-fg-inverted); + } + } + + > .title { + min-height: var(--header-size); + padding-inline: var(--spacing-xs); + background: var(--color-bg); + color: var(--color-primary-darker); + font-variant: small-caps; + + > * { + margin-block: 0; + } + } + } + + > .header { + justify-content: center; + width: 100%; + margin: calc(var(--header-size) / -2 - var(--padding)) auto + var(--spacing-sm); + + > * + * { + margin-inline-start: calc(var(--btn-border-size) * -1); + } + } +} + +.btn:where(:hover, :focus) { + .icon { + transform: scale(1.2); + } +} + +.btn:where(:active) { + .icon { + transform: scale(0.9); + } +} |
