Last active
October 21, 2023 11:45
-
-
Save panstav/8d4fb38f9f0e6dfbe94b0074f0c9b7af to your computer and use it in GitHub Desktop.
bulma-o-steps.sass with RTL support
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| $steps-default-color: $grey-lighter !default | |
| $steps-completed-color: $success !default | |
| $steps-active-color: $success !default | |
| $steps-horizontal-min-width: 10em !default | |
| $steps-vertical-min-height: 4em !default | |
| $steps-marker-size: 2 !default | |
| $steps-divider-size: .4em !default | |
| $steps-gap-size: .3rem !default | |
| $steps-hollow-border-size: .3em !default | |
| $steps-thin-divider-size: 1px !default | |
| $steps-thin-marker-size: .8em !default | |
| =steps-horizontal | |
| +tablet | |
| &:not(.is-vertical) | |
| @content | |
| &.is-horizontal | |
| @content | |
| =steps-vertical | |
| +mobile | |
| &:not(.is-horizontal) | |
| @content | |
| &.is-vertical | |
| @content | |
| =steps-all-segments | |
| &.steps .steps-segment | |
| @content | |
| =steps-active-segment | |
| &.steps .steps-segment.is-active | |
| @content | |
| =steps-inactive-segments | |
| &.steps .steps-segment.is-active ~ .steps-segment | |
| @content | |
| .steps | |
| +block | |
| .steps-segment | |
| position: relative | |
| &:not(:last-child):after | |
| // This will contain the horizontal or vertical divider | |
| content: " " | |
| display: block | |
| position: absolute | |
| +steps-vertical | |
| .steps-segment | |
| display: block | |
| &:not(:last-child) | |
| min-height: $steps-vertical-min-height | |
| &.is-short | |
| .steps-segment | |
| flex-grow: 0 | |
| &:not(:last-child) | |
| //this is commented because text would be running perpendicular to the line, so we won't need as much room | |
| // min-height: $steps-horizontal-min-width | |
| &.is-short.is-centered | |
| justify-content: center | |
| &.is-short.is-bottom | |
| justify-content: flex-end | |
| &:not(.is-short) | |
| height: 100% | |
| display: flex | |
| flex-direction: column | |
| .steps-segment:not(:last-child) | |
| flex-grow: 1 | |
| +steps-horizontal | |
| display: flex | |
| .steps-segment:not(:last-child) | |
| flex-basis: 1rem | |
| flex-grow: 1 | |
| flex-shrink: 1 | |
| &.is-narrow | |
| .steps-segment | |
| flex-grow: 0 | |
| &:not(:last-child) | |
| min-width: $steps-horizontal-min-width | |
| &.is-narrow.is-centered | |
| justify-content: center | |
| &.is-narrow.is-right | |
| justify-content: flex-end | |
| &.has-content-centered | |
| text-align: center | |
| &.is-balanced, &.has-content-centered | |
| .steps-segment:last-child | |
| flex-basis: 1rem | |
| flex-grow: 1 | |
| flex-shrink: 1 | |
| &.is-narrow.has-content-centered | |
| .steps-segment:last-child | |
| flex-grow: 0 | |
| min-width: $steps-horizontal-min-width | |
| .steps-content.is-divider-content | |
| text-align: center | |
| // Marker style | |
| .steps-marker | |
| align-items: center | |
| display: flex | |
| border-radius: 50% | |
| font-weight: $weight-bold | |
| justify-content: center | |
| // Position & z-index are needed to put it above the divider | |
| position: relative | |
| z-index: 5 | |
| // Use a mixin to define all ratios in the same spot | |
| =steps-size($size) | |
| font-size: $size | |
| .steps-marker | |
| height: $size * $steps-marker-size | |
| width: $size * $steps-marker-size | |
| overflow: hidden | |
| +steps-vertical | |
| // Draw a vertical divider | |
| display: flex | |
| flex-direction: column | |
| .steps-segment:not(:last-child):after | |
| // top and bottom position is almost touching the inner side of a hollow border marker | |
| bottom: -$steps-gap-size * 0.8 | |
| inset-inline-start: calc(#{$size * ($steps-marker-size * 0.5)} - (#{$steps-divider-size * 0.5})) | |
| top: ($size * $steps-marker-size) - ($steps-gap-size * 0.8) | |
| width: $steps-divider-size | |
| // Align the content with the marker | |
| .steps-content | |
| margin-inline-start: calc(#{$size * $steps-marker-size * 0.5} + .5em) | |
| margin-top: -$size * $steps-marker-size | |
| padding-inline-start: 1em | |
| padding-bottom: 1em | |
| .steps-content.is-divider-content | |
| margin-top: 0 | |
| padding-bottom: 0 | |
| &.has-content-centered | |
| +tablet | |
| .steps-content | |
| padding-top: calc(#{$size * $steps-marker-size * 0.5} - .5em) | |
| &:not(.is-thin) | |
| &.has-gaps .steps-segment, .steps-segment.has-gaps | |
| &:not(:last-child):after | |
| top: ($size * $steps-marker-size) + $steps-gap-size | |
| bottom: $steps-gap-size | |
| +steps-horizontal | |
| // Draw a horizontal divider | |
| .steps-segment:not(:last-child):after | |
| height: $steps-divider-size | |
| // top and bottom position is almost touching the inner side of a hollow border marker | |
| inset-inline-start: ($size * $steps-marker-size) - ($steps-gap-size * 0.8) | |
| inset-inline-end: -$steps-gap-size * 0.8 | |
| top: calc(#{$size * ($steps-marker-size * 0.5)} - (#{$steps-divider-size * 0.5})) | |
| &.has-content-above .steps-segment:not(:last-child)::after | |
| bottom: calc(#{$size * $steps-marker-size * 0.5} - (#{$steps-divider-size * 0.5})) | |
| top: auto | |
| // extra data | |
| .extra-data | |
| inset-inline-start: calc(50% + #{($size * $steps-marker-size * 0.5) + $steps-gap-size}) | |
| inset-inline-end: calc(-50% + #{($size * $steps-marker-size * 0.5) + $steps-gap-size}) | |
| bottom: 100% | |
| position: absolute | |
| &.has-overflow-right | |
| overflow: visible | |
| inset-inline-end: auto | |
| white-space: nowrap | |
| min-width: calc(100% - #{$size * $steps-marker-size * 0.5} - (#{$steps-divider-size * 0.5})) | |
| &.has-overflow-left | |
| overflow: visible | |
| inset-inline-start: auto | |
| white-space: nowrap | |
| min-width: calc(100% - #{$size * $steps-marker-size * 0.5} - (#{$steps-divider-size * 0.5})) | |
| &.has-overflow-centered | |
| overflow: visible | |
| inset-inline-start: auto | |
| white-space: nowrap | |
| min-width: calc(100% - #{$size * $steps-marker-size * 0.5} - (#{$steps-divider-size * 0.5})) | |
| &.has-content-above .extra-data | |
| top: 100% | |
| bottom: auto | |
| // Align the content with the marker | |
| .steps-content | |
| margin-inline-start: $size * $steps-marker-size * 0.5 | |
| &:not(:last-child) | |
| margin-inline-end: -$size * $steps-marker-size * 0.5 | |
| &.is-divider-content | |
| margin-inline-end: -$size * $steps-marker-size * 0.5 | |
| padding-inline-start: 2em | |
| padding-inline-end: 2em | |
| &.has-content-centered | |
| .steps-segment:not(:last-child):after | |
| inset-inline-start: 50% | |
| inset-inline-end: -50% | |
| .steps-marker | |
| position: absolute | |
| inset-inline-start: calc(50% - #{$size * $steps-marker-size * 0.5}) | |
| .steps-content | |
| margin-top: $size * $steps-marker-size | |
| margin-inline-start: .5em | |
| margin-inline-end: .5em | |
| padding-top: .2em | |
| &.has-content-above.has-content-centered .steps-content | |
| margin-bottom: $size * $steps-marker-size | |
| padding-bottom: .2em | |
| &:not(.is-thin) | |
| &.has-gaps .steps-segment, .steps-segment.has-gaps | |
| &:not(:last-child):after | |
| inset-inline-start: ($size * $steps-marker-size) + $steps-gap-size | |
| inset-inline-end: $steps-gap-size | |
| &.has-content-centered | |
| &.has-gaps .steps-segment, .steps-segment.has-gaps | |
| &:not(:last-child):after | |
| inset-inline-start: calc(50% + #{($size * $steps-marker-size * 0.5) + $steps-gap-size}) | |
| inset-inline-end: calc(-50% + #{($size * $steps-marker-size * 0.5) + $steps-gap-size}) | |
| .steps | |
| +steps-size($size-normal) | |
| .steps.is-small | |
| +steps-size($size-small) | |
| .steps.is-medium | |
| +steps-size($size-medium) | |
| .steps.is-large | |
| +steps-size($size-large) | |
| // Divider Default Colors | |
| .steps-segment | |
| &:after | |
| background-color: $steps-completed-color | |
| &.is-active | |
| &:after | |
| background-color: $steps-default-color | |
| &.is-active ~ .steps-segment | |
| &:after | |
| background-color: $steps-default-color | |
| // Marker Default Colors | |
| .steps:not(.is-hollow) | |
| .steps-marker:not(.is-hollow) | |
| background-color: $steps-completed-color | |
| color: findColorInvert($steps-completed-color) | |
| .steps-segment.is-active | |
| .steps-marker:not(.is-hollow) | |
| background-color: $steps-active-color | |
| color: findColorInvert($steps-active-color) | |
| .steps-segment.is-active | |
| & ~ .steps-segment .steps-marker:not(.is-hollow) | |
| background-color: $steps-default-color | |
| color: findColorInvert($steps-default-color) | |
| // Hollow style | |
| .steps.is-hollow .steps-marker, | |
| .steps-marker.is-hollow | |
| border: $steps-hollow-border-size solid $steps-completed-color | |
| .steps.is-hollow .is-active .steps-marker, | |
| .steps .is-active .steps-marker.is-hollow | |
| border-color: $steps-active-color | |
| .steps.is-hollow .steps-segment.is-active ~ .steps-segment .steps-marker, | |
| .steps-segment.is-active ~ .steps-segment .steps-marker.is-hollow | |
| border-color: $steps-default-color | |
| // Override marker color per step | |
| @each $name, $pair in $colors | |
| $color: nth($pair, 1) | |
| $color-invert: nth($pair, 2) | |
| .steps:not(.is-hollow) .steps-marker:not(.is-hollow) | |
| &.is-#{$name} | |
| background-color: $color !important | |
| color: $color-invert !important | |
| .steps.is-hollow .steps-marker, | |
| .steps .steps-marker.is-hollow | |
| &.is-#{$name} | |
| border-color: $color !important | |
| // Divider dashed style | |
| =steps-divider-background($angle, $color, $size) | |
| background: repeating-linear-gradient($angle, $color, $color $size, transparent $size, transparent #{$size * 2}) | |
| .steps | |
| +steps-vertical | |
| &.is-dashed .steps-segment, .steps-segment.is-dashed | |
| &:after | |
| +steps-divider-background(0deg, $steps-completed-color, 5px) | |
| &.is-dashed .steps-segment.is-active, | |
| &.is-dashed .steps-segment.is-active ~ .steps-segment, | |
| .steps-segment.is-active.is-dashed, | |
| .steps-segment.is-active ~ .steps-segment.is-dashed | |
| &:after | |
| +steps-divider-background(0deg, $steps-default-color, 5px) | |
| +steps-horizontal | |
| &.is-dashed .steps-segment, | |
| .steps-segment.is-dashed | |
| &:after | |
| +steps-divider-background(90deg, $steps-completed-color, 10px) | |
| // the active segment and any subsequent segment get the default colot | |
| &.is-dashed .steps-segment.is-active, | |
| &.is-dashed .steps-segment.is-active ~ .steps-segment, | |
| .steps-segment.is-active.is-dashed, | |
| .steps-segment.is-active ~ .steps-segment.is-dashed | |
| &:after | |
| +steps-divider-background(90deg, $steps-default-color, 10px) | |
| // Thin modifier | |
| .steps.is-thin | |
| .steps-marker | |
| width: $steps-thin-marker-size | |
| height: $steps-thin-marker-size | |
| &.is-hollow .steps-marker, | |
| .steps-marker.is-hollow | |
| border-width: $steps-thin-divider-size | |
| height: calc(#{$steps-thin-marker-size} + #{$steps-thin-divider-size}) | |
| width: calc(#{$steps-thin-marker-size} + #{$steps-thin-divider-size}) | |
| +steps-vertical | |
| .steps-segment | |
| &:not(:last-child):after | |
| bottom: 0 | |
| inset-inline-start: calc(#{$steps-thin-marker-size * 0.5} - #{$steps-thin-divider-size * 0.5}) | |
| top: $steps-thin-marker-size | |
| width: $steps-thin-divider-size | |
| .steps-content | |
| margin-top: -$steps-thin-marker-size * 1.5 | |
| margin-inline-start: $steps-thin-marker-size | |
| &.has-gaps .steps-segment, .steps-segment.has-gaps | |
| &:not(:last-child):after | |
| bottom: $steps-thin-marker-size * 0.5 | |
| top: $steps-thin-marker-size * 1.5 | |
| &.has-content-centered | |
| .steps-content | |
| padding-top: $steps-thin-marker-size * 2 | |
| +steps-horizontal | |
| .steps-segment | |
| &:not(:last-child):after | |
| inset-inline-start: $steps-thin-marker-size | |
| inset-inline-end: 0 | |
| top: calc(#{$steps-thin-marker-size * 0.5} - #{$steps-thin-divider-size * 0.5}) | |
| height: $steps-thin-divider-size | |
| &.has-content-above .steps-segment:not(:last-child)::after | |
| bottom: calc(#{$steps-thin-marker-size * 0.5} - #{$steps-thin-divider-size * 0.5}) | |
| top: auto | |
| .steps-content | |
| margin-top: $steps-thin-marker-size | |
| &.has-content-centered | |
| .steps-segment | |
| &:not(:last-child):after | |
| inset-inline-start: calc(50% + #{$steps-thin-marker-size * 0.5}) | |
| inset-inline-end: calc(-50% + #{$steps-thin-marker-size * 0.5}) | |
| .steps-marker | |
| position: absolute | |
| inset-inline-start: calc(50% - #{$steps-thin-marker-size * 0.5}) | |
| &.has-gaps .steps-segment, .steps-segment.has-gaps | |
| &:not(:last-child):after | |
| inset-inline-start: $steps-thin-marker-size * 1.5 | |
| inset-inline-end: $steps-thin-marker-size * 0.5 | |
| &.has-content-centered.has-gaps .steps-segment, &.has-content-centered .steps-segment.has-gaps | |
| &:not(:last-child):after | |
| inset-inline-start: calc(50% + #{($steps-thin-marker-size * 0.5) + ($steps-thin-marker-size * 0.5)}) | |
| inset-inline-end: calc(-50% + #{($steps-thin-marker-size * 0.5) + ($steps-thin-marker-size * 0.5)}) | |
| //.has-content-above | |
| .steps:not(.is-vertical).has-content-above | |
| .steps-segment | |
| +tablet | |
| display: flex | |
| flex-direction: column-reverse | |
| .steps-content | |
| margin-top: 0 | |
| padding-top: 0 | |
| display: flex | |
| flex-direction: column-reverse |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment