@property --a { syntax: ""; inherits: true; initial-value: 0deg; } @property --l { syntax: ""; inherits: true; initial-value: 0; } @property --x { syntax: ""; inherits: false; initial-value: 0; } @property --y { syntax: ""; inherits: false; initial-value: 0; } @property --o { syntax: ""; inherits: false; initial-value: 0; } .ai { --s: 32px; // --p: calc(var(--s) / 4); width: var(--s); aspect-ratio: 1; --bg-color: color-mix(in srgb, #7b7bf4, transparent 90%); background: radial-gradient( 60% 75% at center, var(--bg-color) 50%, transparent 50% ), radial-gradient(75% 60% at center, var(--bg-color) 50%, transparent 50%); padding: var(--p); margin-right: 6px; display: grid; place-items: center; position: relative; border-radius: 50%; transform: scale(1.0); } $count: 4; :root { --count: #{$count}; --radius: 6vmin; } @keyframes ai { from { --a: 360deg; --l: 0.35; --o: 1; } 30% { --l: 1.5; } 70% { --o: 0.4; --l: 0.05; } 98% { --o: 0.7; } to { --a: 0deg; --l: 0.35; --o: 1; } } .c { opacity: 0.9; position: absolute; width: 10vmin; aspect-ratio: 1; border-radius: 50%; --offset-per-item: calc(360deg / var(--count)); --current-angle-offset: calc(var(--offset-per-item) * var(--i) + var(--a)); translate: calc( cos(var(--current-angle-offset)) * var(--radius) + var(--x, 0) ) calc(sin(var(--current-angle-offset)) * var(--radius) * -1); scale: calc(0.6 + var(--l)); animation: ai 5.5s cubic-bezier(0.45, -0.35, 0.16, 1.5) infinite; transition: opacity 0.3s linear; opacity: var(--o, 1); @for $i from 0 through $count { &:nth-child(#{$i + 1}) { --i: #{$i}; } } } .c1 { background: #79e3ee; background: radial-gradient(50% 50% at center, #79e3ee, #e7e7fb); background: radial-gradient(50% 50% at center, #c979ee, #74bcd6); --x: 1vmin; width: 16vmin; animation-timing-function: cubic-bezier(0.12, 0.32, 0.68, 0.24); } .c2 { background: radial-gradient(50% 50% at center, #ef788c, #e7e7fb); width: 15vmin; } .c3 { background: radial-gradient(50% 50% at center, #eb7fc6, transparent); width: 5vmin; opacity: 0.6; --x: -1vmin; } .c4 { background: #6d67c8; animation-timing-function: cubic-bezier(0.39, -0.03, 0.75, 0.47); } .container { overflow: hidden; background: #b6a9f8; width: 100%; border-radius: 50%; aspect-ratio: 1; position: relative; display: grid; place-items: center; } .glass { overflow: hidden; position: absolute; --w: 0.5vmin; inset: calc(var(--s) - var(--s)); border-radius: 50%; backdrop-filter: blur(1.3vmin); box-shadow: 0 0 8vmin color-mix(in srgb, black, transparent 70%); background: radial-gradient( 10vmin at 70% 30%, rgba(255, 255, 255, 0.2), transparent ); // // lines // &:after { // content: ""; // position: absolute; // inset: 0; // --c: rgba(255, 255, 255, 0.03); // --w: 0.0625rem; // --g: 0.1875rem; // background: repeating-linear-gradient( // var(--c), // var(--c), // var(--w), // transparent var(--w), // transparent calc(var(--w) + var(--g)) // ); // border-radius: inherit; // border: 1vmin rgba(255, 255, 255, 0.1) solid; // } } @property --value { syntax: ""; inherits: true; initial-value: 0deg; } @property --width-ratio { syntax: ""; inherits: true; initial-value: 0; } @property --scale { syntax: ""; inherits: true; initial-value: 0; } :root { --width: 1vmin; --duration: 8s; } .rings { aspect-ratio: 1; border-radius: 50%; position: absolute; inset: 0; perspective: 11rem; opacity: .9; &:before, &:after { content: ""; position: absolute; inset: 0; background: rgba(255, 0, 0, 1); border-radius: 50%; --width-ratio: 1; border: calc(var(--width) * var(--width-ratio)) solid transparent; mask: linear-gradient(#fff 0 0) padding-box, linear-gradient(#fff 0 0); background: linear-gradient( white, blue, magenta, violet, lightyellow) border-box; mask-composite: exclude; animation: ring var(--duration) ease-in-out infinite; --start: 180deg; --value: var(--start); --scale: 1; transform: rotateY(var(--value)) rotateX(var(--value)) rotateZ(var(--value)) scale(var(--scale)); } &:before { --start: 180deg; } &:after { --start: 90deg; } > .rings { &:before { --start: 360deg; } &:after { --start: 270deg; } } } @keyframes ring { from { --value: var(--start); --scale: 1; } 50% { --scale: 1.2; --width-ratio: 1.5; } 70% { --scale: 1; --value: calc(var(--start) + 180deg); --width-ratio: 1; } 80% { --scale: 1.2; --width-ratio: 1.5; } to { --value: calc(var(--start) + 360deg); --scale: 1; --width-ratio: 1; } }