@mixin element-invisible { position: absolute; width: 1px; height: 1px; margin: -1px; border: 0; padding: 0; clip: rect(0 0 0 0); overflow: hidden; } @mixin hide { display: none; } @mixin centerer { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); } /// Mixin to place items on a circle /// @author Kitty Giraudel /// @author Ana Tudor /// @param {Integer} $item-count - Number of items on the circle /// @param {Length} $circle-size - Large circle size /// @param {Length} $item-size - Single item size @mixin on-circle-old($item-count, $circle-size, $item-size) { position: relative; width: $circle-size; height: $circle-size; padding: 0; border-radius: 50%; list-style: none; > * { display: block; position: absolute; top: 50%; left: 50%; width: $item-size; height: $item-size; margin: -($item-size / 2); $angle: (360 / $item-count); $rot: 0; @for $i from 1 through $item-count { &:nth-of-type(#{$i}) { transform: rotate($rot * 1deg) translate($circle-size / 2) rotate($rot * -1deg); } $rot: $rot + $angle; } } } /// Mixin to place items on a circle responsively /// $author Sơn Trần-Nguyễn /// $author Hugo Giraudel /// $author Ana Tudor /// $param {percentage} [$item-size=20%] - Size of a single item as percentage of the circle. /// $param {integer} [$max-items=8] - Max number of items to be placed on the circle @mixin circle-blackmagic($item-size: 10%, $max-items: 32) { $radius: math.div(100% * 50%, $item-size) + $item-size; & > * { display: block; position: absolute; // Move the items to center of the listing. top: 50%; left: 50%; width: $item-size; height: $item-size; // Offset half the size so they are truly centered. // Usually we use negative translation with transform, // but transform is used for positioning them, so we // use negative margin instead. margin: -1 * math.div($item-size, 2); // First one is always at the top. &:nth-of-type(1) { transform: rotate(270deg) translate($radius) rotate(90deg); } // Supports number of items from 1 to $max-items. @for $index from 0 to $max-items + 1 { @include circle-witchery($radius, $index); } } } @mixin circle-witchery($radius, $item-count) { $angle: math.div(360, $item-count + 1); &:nth-last-child(#{$item-count + 1}):first-child { @for $index from 0 through $item-count { $i: $index + 1; $rot: $angle * ($i); & ~ :nth-of-type(#{$i}) { transform: rotate($rot * 1deg + 270deg % 360deg) translate($radius) rotate($rot * -1deg + 90deg); } } } }