From 9c561074b624925d14ee0e7d9e64d0a6f5958531 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Catriel=20M=C3=BCller?= Date: Wed, 3 Jun 2026 08:58:17 -0300 Subject: [PATCH] feat(cli): add animated console loading screens --- .changeset/console-loading-logo.md | 5 ++ bun.lock | 3 ++ packages/kilo-console/package.json | 1 + packages/kilo-console/public/logo.lottie | Bin 0 -> 32127 bytes .../src/components/LoadingLogo.tsx | 34 +++++++++++++ .../src/components/LoadingScreen.tsx | 20 ++++++++ .../kilo-console/src/layouts/ConfigLayout.tsx | 5 +- .../routes/projects/ProjectConsoleRoute.tsx | 9 ++-- .../src/routes/projects/ProjectsRoute.tsx | 9 ++-- packages/kilo-console/src/styles.css | 1 + packages/kilo-console/src/styles/loading.css | 46 ++++++++++++++++++ 11 files changed, 118 insertions(+), 15 deletions(-) create mode 100644 .changeset/console-loading-logo.md create mode 100644 packages/kilo-console/public/logo.lottie create mode 100644 packages/kilo-console/src/components/LoadingLogo.tsx create mode 100644 packages/kilo-console/src/components/LoadingScreen.tsx create mode 100644 packages/kilo-console/src/styles/loading.css diff --git a/.changeset/console-loading-logo.md b/.changeset/console-loading-logo.md new file mode 100644 index 0000000000..d39b44da15 --- /dev/null +++ b/.changeset/console-loading-logo.md @@ -0,0 +1,5 @@ +--- +"@kilocode/cli": patch +--- + +Show the animated Kilo logo while the console and dashboard finish loading. diff --git a/bun.lock b/bun.lock index 3938c57547..a921861a7d 100644 --- a/bun.lock +++ b/bun.lock @@ -85,6 +85,7 @@ "dependencies": { "@kilocode/kilo-web-ui": "workspace:*", "@kilocode/sdk": "workspace:*", + "@lottiefiles/dotlottie-web": "0.74.0", "@opencode-ai/ui": "workspace:*", "@solidjs/router": "catalog:", "ghostty-web": "0.4.0", @@ -1354,6 +1355,8 @@ "@leichtgewicht/ip-codec": ["@leichtgewicht/ip-codec@2.0.5", "", {}, "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw=="], + "@lottiefiles/dotlottie-web": ["@lottiefiles/dotlottie-web@0.74.0", "", {}, "sha512-rG12+dJSVhQDdleGr9epR7zU/UJ6hh8jzBDHAurClHP5t5dSrOh3eP3UCFxolpVPcobaRVYsBnYg4HQokQewpg=="], + "@lukeed/ms": ["@lukeed/ms@2.0.2", "", {}, "sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA=="], "@lydell/node-pty": ["@lydell/node-pty@1.2.0-beta.10", "", { "optionalDependencies": { "@lydell/node-pty-darwin-arm64": "1.2.0-beta.10", "@lydell/node-pty-darwin-x64": "1.2.0-beta.10", "@lydell/node-pty-linux-arm64": "1.2.0-beta.10", "@lydell/node-pty-linux-x64": "1.2.0-beta.10", "@lydell/node-pty-win32-arm64": "1.2.0-beta.10", "@lydell/node-pty-win32-x64": "1.2.0-beta.10" } }, "sha512-Fv+A3+MZVA8qhkBIZsM1E6dCdHNMyXXz22mAYiMWd03LlyK///F3OH6CKPX9mj4id7LUlxpr45yPzyBVy9aDPw=="], diff --git a/packages/kilo-console/package.json b/packages/kilo-console/package.json index 45539070c3..74cefc973b 100644 --- a/packages/kilo-console/package.json +++ b/packages/kilo-console/package.json @@ -13,6 +13,7 @@ "dependencies": { "@kilocode/kilo-web-ui": "workspace:*", "@kilocode/sdk": "workspace:*", + "@lottiefiles/dotlottie-web": "0.74.0", "@opencode-ai/ui": "workspace:*", "@solidjs/router": "catalog:", "ghostty-web": "0.4.0", diff --git a/packages/kilo-console/public/logo.lottie b/packages/kilo-console/public/logo.lottie new file mode 100644 index 0000000000000000000000000000000000000000..d16c02faf118d5acfd49a1537a4a48dbe3552d38 GIT binary patch literal 32127 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 literal 0 HcmV?d00001 diff --git a/packages/kilo-console/src/components/LoadingLogo.tsx b/packages/kilo-console/src/components/LoadingLogo.tsx new file mode 100644 index 0000000000..6e261e69fa --- /dev/null +++ b/packages/kilo-console/src/components/LoadingLogo.tsx @@ -0,0 +1,34 @@ +import { DotLottie } from "@lottiefiles/dotlottie-web" +import { onCleanup, onMount } from "solid-js" + +const src = `${import.meta.env.BASE_URL}logo.lottie` + +export function LoadingLogo(props: { class?: string }) { + let canvas: HTMLCanvasElement | undefined + + onMount(() => { + if (!canvas) return + + const motion = !window.matchMedia("(prefers-reduced-motion: reduce)").matches + const player = new DotLottie({ + autoplay: motion, + canvas, + loop: motion, + src, + renderConfig: { + autoResize: true, + }, + }) + + onCleanup(() => player.destroy()) + }) + + return ( + (canvas = node)} + class={`console-loading-logo${props.class ? ` ${props.class}` : ""}`} + role="img" + aria-label="Kilo loading animation" + /> + ) +} diff --git a/packages/kilo-console/src/components/LoadingScreen.tsx b/packages/kilo-console/src/components/LoadingScreen.tsx new file mode 100644 index 0000000000..e1ffc181d0 --- /dev/null +++ b/packages/kilo-console/src/components/LoadingScreen.tsx @@ -0,0 +1,20 @@ +import { LoadingLogo } from "./LoadingLogo" + +type Variant = "fullscreen" | "content" + +export function LoadingScreen(props: { variant: Variant }) { + return ( +
+ +
+ ) +} diff --git a/packages/kilo-console/src/layouts/ConfigLayout.tsx b/packages/kilo-console/src/layouts/ConfigLayout.tsx index 09ce8141bd..8f779b9328 100644 --- a/packages/kilo-console/src/layouts/ConfigLayout.tsx +++ b/packages/kilo-console/src/layouts/ConfigLayout.tsx @@ -1,6 +1,7 @@ import { Show } from "solid-js" import type { JSX } from "solid-js" import { Card } from "@kilocode/kilo-web-ui/card" +import { LoadingScreen } from "../components/LoadingScreen" import { ConfigProvider } from "../context/ConfigProvider" import { useConfig } from "../context/config" import { ConfigSidebar } from "../routes/config/ConfigSidebar" @@ -43,9 +44,7 @@ function ConfigContent(props: { children?: JSX.Element }) { - + {props.children} diff --git a/packages/kilo-console/src/routes/projects/ProjectConsoleRoute.tsx b/packages/kilo-console/src/routes/projects/ProjectConsoleRoute.tsx index 294b1ca2e0..7f576e7fb6 100644 --- a/packages/kilo-console/src/routes/projects/ProjectConsoleRoute.tsx +++ b/packages/kilo-console/src/routes/projects/ProjectConsoleRoute.tsx @@ -2,6 +2,7 @@ import { A, useLocation, useParams } from "@solidjs/router" import { createEffect, createMemo, createResource, createSignal, For, onCleanup, Show } from "solid-js" import { Card } from "@kilocode/kilo-web-ui/card" import { Icon } from "@kilocode/kilo-web-ui/icon" +import { LoadingScreen } from "../../components/LoadingScreen" import { createProjectPty, createProjectWorktree, @@ -677,14 +678,10 @@ export function ProjectConsoleRoute() {
- + - +