summaryrefslogtreecommitdiffhomepage
path: root/packages/frontend/src/lib/components/HotReloadIndicator.svelte
diff options
context:
space:
mode:
authorAdam Malczewski <[email protected]>2026-05-20 15:04:26 +0900
committerAdam Malczewski <[email protected]>2026-05-20 15:04:26 +0900
commitadc8bd185b54935e7a31aae04da3175b7989927a (patch)
tree031fa53009a4708ce0cc15c0e3dcb2f2a73cf2d9 /packages/frontend/src/lib/components/HotReloadIndicator.svelte
parent52af4ca33b1f83b8f863a6267d447944f55e729d (diff)
downloaddispatch-adc8bd185b54935e7a31aae04da3175b7989927a.tar.gz
dispatch-adc8bd185b54935e7a31aae04da3175b7989927a.zip
feat: phase 3 — config, skills, model groups, task list, and sidebar UI
- Config system: TOML-based dispatch.toml with hot-reload via chokidar - Model/key resolution: tag-based model selection, key fallback chains - Skills system: directory loader with TOML frontmatter, agent mappings - Task list tool: add/update/list/get operations with WebSocket events - API routes: GET /config, /skills, /skills/:name, /models, /models/resolve - Frontend: sidebar with model status, task list, config viewer, skills browser, permission log - Sliding sidebar animation using CSS transitions (not Svelte transitions)
Diffstat (limited to 'packages/frontend/src/lib/components/HotReloadIndicator.svelte')
-rw-r--r--packages/frontend/src/lib/components/HotReloadIndicator.svelte35
1 files changed, 35 insertions, 0 deletions
diff --git a/packages/frontend/src/lib/components/HotReloadIndicator.svelte b/packages/frontend/src/lib/components/HotReloadIndicator.svelte
new file mode 100644
index 0000000..3e34d3b
--- /dev/null
+++ b/packages/frontend/src/lib/components/HotReloadIndicator.svelte
@@ -0,0 +1,35 @@
+<script lang="ts">
+ const { active }: { active: boolean } = $props();
+
+ let visible = $state(false);
+ let timer: ReturnType<typeof setTimeout> | null = null;
+
+ $effect(() => {
+ if (active) {
+ visible = true;
+ if (timer !== null) clearTimeout(timer);
+ timer = setTimeout(() => {
+ visible = false;
+ timer = null;
+ }, 2000);
+ }
+ return () => {
+ if (timer !== null) {
+ clearTimeout(timer);
+ timer = null;
+ }
+ visible = false;
+ };
+ });
+</script>
+
+{#if visible}
+ <div
+ class="flex items-center gap-1.5 px-2 py-0.5 rounded-full bg-info/20 text-info text-xs font-medium animate-pulse"
+ role="status"
+ aria-live="polite"
+ >
+ <span class="status status-xs status-info"></span>
+ <span>Config reloaded</span>
+ </div>
+{/if}