andy-stack_vaultkeeper-ai/Components/StreamingIndicator.svelte

264 lines
5.9 KiB
Svelte
Raw Normal View History

<script lang="ts">
export let streamingElement: HTMLElement | undefined;
export let editModeActive: boolean = false;
</script>
<div class="container" class:edit-mode={editModeActive} bind:this={streamingElement}>
<span class="📦"></span>
<span class="📦"></span>
<span class="📦"></span>
<span class="📦"></span>
<span class="📦"></span>
</div>
<style>
:root {
--duration: 1.5s;
--container-size: 100px;
--box-size: 12px;
--box-border-radius: 15%;
}
.container {
width: var(--container-size);
display: flex;
justify-content: space-between;
align-items: center;
position: relative;
margin-left: 4px;
padding-top: 12px;
--streaming-color: var(--interactive-accent);
}
.container.edit-mode {
--streaming-color: var(--interactive-accent-blue);
}
.📦 {
width: var(--box-size);
height: var(--box-size);
position: relative;
display: block;
transform-origin: -50% center;
border-radius: var(--box-border-radius);
}
.📦:after {
content: "";
width: 100%;
height: 100%;
position: absolute;
top: 0;
right: 0;
background-color: color-mix(in srgb, var(--streaming-color) 85%, white 15%);
border-radius: var(--box-border-radius);
box-shadow: 0px 0px 8px 4px color-mix(in srgb, var(--streaming-color) 40%, transparent 80%);
}
.📦:nth-child(1) {
animation: slide var(--duration) ease-in-out infinite alternate;
}
.📦:nth-child(1):after {
animation: color-change var(--duration) ease-in-out infinite alternate;
}
.📦:nth-child(2) {
animation: flip-1 var(--duration) ease-in-out infinite alternate;
}
.📦:nth-child(2):after {
animation: squidge-1 var(--duration) ease-in-out infinite alternate;
}
.📦:nth-child(3) {
animation: flip-2 var(--duration) ease-in-out infinite alternate;
}
.📦:nth-child(3):after {
animation: squidge-2 var(--duration) ease-in-out infinite alternate;
}
.📦:nth-child(4) {
animation: flip-3 var(--duration) ease-in-out infinite alternate;
}
.📦:nth-child(4):after {
animation: squidge-3 var(--duration) ease-in-out infinite alternate;
}
.📦:nth-child(5) {
animation: flip-4 var(--duration) ease-in-out infinite alternate;
}
.📦:nth-child(5):after {
animation: squidge-4 var(--duration) ease-in-out infinite alternate;
}
.📦:nth-child(2):after {
background-color: color-mix(in srgb, var(--streaming-color) 75%, white 25%);
}
.📦:nth-child(3):after {
background-color: color-mix(in srgb, var(--streaming-color) 80%, white 20%);
}
.📦:nth-child(4):after {
background-color: color-mix(in srgb, var(--streaming-color) 90%, white 10%);
}
.📦:nth-child(5):after {
background-color: color-mix(in srgb, var(--streaming-color) 95%, white 5%);
}
@keyframes slide {
0% {
background-color: color-mix(in srgb, var(--streaming-color) 70%, white 30%);
transform: translatex(0vw);
}
100% {
background-color: color-mix(in srgb, var(--streaming-color) 95%, white 5%);
transform: translatex(
calc(var(--container-size) - (var(--box-size) * 1.25))
);
}
}
@keyframes color-change {
0% {
background-color: color-mix(in srgb, var(--streaming-color) 70%, white 30%);
}
100% {
background-color: color-mix(in srgb, var(--streaming-color) 95%, white 5%);
}
}
@keyframes flip-1 {
0%,
15% {
transform: rotate(0);
}
35%,
100% {
transform: rotate(-180deg);
}
}
@keyframes squidge-1 {
5% {
transform-origin: center bottom;
transform: scalex(1) scaley(1);
}
15% {
transform-origin: center bottom;
transform: scalex(1.3) scaley(0.7);
}
25%,
20% {
transform-origin: center bottom;
transform: scalex(0.8) scaley(1.4);
}
55%,
100% {
transform-origin: center top;
transform: scalex(1) scaley(1);
}
40% {
transform-origin: center top;
transform: scalex(1.3) scaley(0.7);
}
}
@keyframes flip-2 {
0%,
30% {
transform: rotate(0);
}
50%,
100% {
transform: rotate(-180deg);
}
}
@keyframes squidge-2 {
20% {
transform-origin: center bottom;
transform: scalex(1) scaley(1);
}
30% {
transform-origin: center bottom;
transform: scalex(1.3) scaley(0.7);
}
40%,
35% {
transform-origin: center bottom;
transform: scalex(0.8) scaley(1.4);
}
70%,
100% {
transform-origin: center top;
transform: scalex(1) scaley(1);
}
55% {
transform-origin: center top;
transform: scalex(1.3) scaley(0.7);
}
}
@keyframes flip-3 {
0%,
45% {
transform: rotate(0);
}
65%,
100% {
transform: rotate(-180deg);
}
}
@keyframes squidge-3 {
35% {
transform-origin: center bottom;
transform: scalex(1) scaley(1);
}
45% {
transform-origin: center bottom;
transform: scalex(1.3) scaley(0.7);
}
55%,
50% {
transform-origin: center bottom;
transform: scalex(0.8) scaley(1.4);
}
85%,
100% {
transform-origin: center top;
transform: scalex(1) scaley(1);
}
70% {
transform-origin: center top;
transform: scalex(1.3) scaley(0.7);
}
}
@keyframes flip-4 {
0%,
60% {
transform: rotate(0);
}
80%,
100% {
transform: rotate(-180deg);
}
}
@keyframes squidge-4 {
50% {
transform-origin: center bottom;
transform: scalex(1) scaley(1);
}
60% {
transform-origin: center bottom;
transform: scalex(1.3) scaley(0.7);
}
70%,
65% {
transform-origin: center bottom;
transform: scalex(0.8) scaley(1.4);
}
100%,
100% {
transform-origin: center top;
transform: scalex(1) scaley(1);
}
85% {
transform-origin: center top;
transform: scalex(1.3) scaley(0.7);
}
}
</style>