;
border?: CardVariants["border"];
- shadow?: CardVariants["shadow"];
background?: CardVariants["background"];
size?: "default" | "inline";
class?: string;
@@ -18,7 +17,6 @@
message,
icon,
border = true,
- shadow = false,
background = false,
size = "default",
class: className,
@@ -31,7 +29,7 @@
{#if size === "inline"}
@@ -40,14 +38,14 @@
{:else}
{#if Icon}
{/if}
- {message}{@render children?.()}
+ {message}{@render children?.()}
{/if}
diff --git a/web/src/lib/components/ui/Error.svelte b/web/src/lib/components/ui/Error.svelte
index dfe7aa067..66c2e75d8 100644
--- a/web/src/lib/components/ui/Error.svelte
+++ b/web/src/lib/components/ui/Error.svelte
@@ -4,28 +4,28 @@
export const error = tv({
slots: {
root: "overflow-hidden rounded-sm border border-border-danger bg-background-danger-subtle text-foreground-danger dark:border-border-danger/60 dark:bg-background-danger-subtle/20",
- header: "flex items-center gap-2",
+ header: "flex items-center gap-xs",
icon: "shrink-0",
label: "min-w-0",
- toggle: "flex w-full items-center gap-2 border-t border-border-danger text-foreground-danger transition-colors hover:text-foreground-danger-strong dark:border-border-danger/60",
+ toggle: "flex w-full items-center gap-xs border-t border-border-danger text-foreground-danger transition-colors hover:text-foreground-danger-strong dark:border-border-danger/60",
chevron: "shrink-0 transition-transform",
body: "border-t border-border-danger typography-monospace-regular text-foreground-danger-strong dark:border-border-danger/60"
},
variants: {
size: {
small: {
- header: "px-3 py-2 typography-paragraph-small",
- icon: "size-4",
- toggle: "px-3 py-2 typography-paragraph-small",
- chevron: "size-4",
- body: "px-3 py-2 typography-paragraph-small"
+ header: "px-sm py-xs typography-paragraph-small",
+ icon: "size-3.5",
+ toggle: "px-sm py-xs typography-paragraph-small",
+ chevron: "size-3.5",
+ body: "px-sm py-xs typography-paragraph-small"
},
large: {
- header: "px-4 py-3 typography-paragraph-large",
- icon: "size-5",
- toggle: "px-4 py-3 typography-paragraph-small",
- chevron: "size-4",
- body: "px-4 py-3 typography-paragraph-small"
+ header: "px-md py-sm typography-paragraph-large",
+ icon: "size-4",
+ toggle: "px-md py-sm typography-paragraph-small",
+ chevron: "size-3.5",
+ body: "px-md py-sm typography-paragraph-small"
}
}
},
diff --git a/web/src/lib/components/ui/Field.stories.svelte b/web/src/lib/components/ui/Field.stories.svelte
index 7c12cc5ff..46cfa5ff2 100644
--- a/web/src/lib/components/ui/Field.stories.svelte
+++ b/web/src/lib/components/ui/Field.stories.svelte
@@ -27,7 +27,7 @@
{id}
type="text"
placeholder="Placeholder"
- class="w-full rounded-sm border border-border-default bg-background-default px-3 py-2 typography-paragraph-small outline-none placeholder:text-foreground-placeholder focus:border-border-strong focus:ring-1 focus:ring-border-strong"
+ class="w-full rounded-sm border border-border-default bg-background-default px-sm py-xs typography-paragraph-small outline-none placeholder:text-foreground-placeholder focus:border-border-strong focus:ring-1 focus:ring-border-strong"
/>
{/snippet}
diff --git a/web/src/lib/components/ui/GraphCell.stories.svelte b/web/src/lib/components/ui/GraphCell.stories.svelte
index cc13c06c1..0cbf1c620 100644
--- a/web/src/lib/components/ui/GraphCell.stories.svelte
+++ b/web/src/lib/components/ui/GraphCell.stories.svelte
@@ -43,7 +43,7 @@
{#snippet template(args)}
-
+
{/snippet}
@@ -52,7 +52,7 @@
{#snippet template(args)}
-
+
{#each run as band, i (i)}
@@ -69,7 +69,7 @@
{#snippet template()}
-
+
{#each run as band, i (i)}
@@ -89,7 +89,7 @@
{#snippet template()}
{#each run as band, i (i)}
@@ -102,7 +102,7 @@
{#snippet template()}
-
+
@@ -114,7 +114,7 @@
{#snippet template()}
{#each run as band, i (i)}
diff --git a/web/src/lib/components/ui/Hovercard.stories.svelte b/web/src/lib/components/ui/Hovercard.stories.svelte
index 99e5969f4..5601cc652 100644
--- a/web/src/lib/components/ui/Hovercard.stories.svelte
+++ b/web/src/lib/components/ui/Hovercard.stories.svelte
@@ -13,9 +13,9 @@
{#snippet card()}
-
+
Rich content
-
+
Any markup can live in the card — it stays open while you move the pointer into it.
diff --git a/web/src/lib/components/ui/Hovercard.svelte b/web/src/lib/components/ui/Hovercard.svelte
index 5047738d2..55858c916 100644
--- a/web/src/lib/components/ui/Hovercard.svelte
+++ b/web/src/lib/components/ui/Hovercard.svelte
@@ -15,7 +15,7 @@
// overflow-visible so the card's own content (e.g. a nested popover) isn't clipped
// pointer-events-auto because the card is a child of whatever the trigger sits in,
// and a card the pointer falls through closes the moment it is reached for
- card: "hovercard-card pointer-events-auto fixed inset-auto z-50 m-0 h-fit popover-transition overflow-visible rounded-sm border border-border-default bg-background-default text-foreground-default shadow-regular"
+ card: "hovercard-card pointer-events-auto fixed inset-auto z-50 m-none h-fit popover-transition overflow-visible rounded-sm border border-border-default bg-background-default text-foreground-default shadow-regular"
},
variants: {
align: {
diff --git a/web/src/lib/components/ui/Input.stories.svelte b/web/src/lib/components/ui/Input.stories.svelte
index c6603183a..bc23d5ffe 100644
--- a/web/src/lib/components/ui/Input.stories.svelte
+++ b/web/src/lib/components/ui/Input.stories.svelte
@@ -71,7 +71,7 @@
-
+
@@ -80,7 +80,7 @@
-
+
@@ -88,9 +88,9 @@
-
+
{#each ["small", "regular", "large"] as const as s (s)}
-
+
@@ -101,7 +101,7 @@
-
+
-
+
-
+
-
+
-
+
-
+
{#each ["small", "regular", "large"] as const as s (s)}
-
+
diff --git a/web/src/lib/components/ui/Link.svelte b/web/src/lib/components/ui/Link.svelte
index f6521274d..53bd57adc 100644
--- a/web/src/lib/components/ui/Link.svelte
+++ b/web/src/lib/components/ui/Link.svelte
@@ -2,7 +2,7 @@
import { tv, type VariantProps } from "tailwind-variants";
export const link = tv({
- base: "inline-flex cursor-pointer items-center gap-1 no-underline transition-colors duration-150 ease-in-out select-none hover:underline focus-visible:outline-2 focus-visible:outline-offset-2",
+ base: "inline-flex cursor-pointer items-center gap-2xs no-underline transition-colors duration-150 ease-in-out select-none hover:underline focus-visible:outline-2 focus-visible:outline-offset-2",
variants: {
variant: {
default:
@@ -71,7 +71,7 @@
}: Props = $props();
const classes = $derived(link({ variant, size, disabled, class: className }));
- const iconSize = $derived(size === "small" ? "size-3" : "size-4");
+ const iconSize = "size-3.5";
{#if href}
diff --git a/web/src/lib/components/ui/ListPanel.svelte b/web/src/lib/components/ui/ListPanel.svelte
new file mode 100644
index 000000000..4d26b5beb
--- /dev/null
+++ b/web/src/lib/components/ui/ListPanel.svelte
@@ -0,0 +1,25 @@
+
+
+
+
+
+ {#if toolbar}
+
+ {@render toolbar()}
+
+ {/if}
+
+ {@render children()}
+
diff --git a/web/src/lib/components/ui/ListToolbar.svelte b/web/src/lib/components/ui/ListToolbar.svelte
new file mode 100644
index 000000000..5b91daa73
--- /dev/null
+++ b/web/src/lib/components/ui/ListToolbar.svelte
@@ -0,0 +1,46 @@
+
+
+
+
+
+ {#if search}
+
+ {@render search()}
+
+ {/if}
+
+ {#if filters}
+
+ {@render filters()}
+
+ {/if}
+
+ {#if trailing}
+
+ {@render trailing()}
+
+ {/if}
+
diff --git a/web/src/lib/components/ui/Logo.stories.svelte b/web/src/lib/components/ui/Logo.stories.svelte
index 01a9f0154..08358b2a0 100644
--- a/web/src/lib/components/ui/Logo.stories.svelte
+++ b/web/src/lib/components/ui/Logo.stories.svelte
@@ -21,7 +21,7 @@
-
+
@@ -31,7 +31,7 @@
-
+
@@ -39,7 +39,7 @@
-
+
diff --git a/web/src/lib/components/ui/Logo.svelte b/web/src/lib/components/ui/Logo.svelte
index 1fbda2f3e..08468e8ed 100644
--- a/web/src/lib/components/ui/Logo.svelte
+++ b/web/src/lib/components/ui/Logo.svelte
@@ -70,10 +70,10 @@
{/snippet}
{#if alpha}
-
+
{@render mark()}
alpha
diff --git a/web/src/lib/components/ui/MarkdownEditor.svelte b/web/src/lib/components/ui/MarkdownEditor.svelte
index bbec4c641..20bd5827c 100644
--- a/web/src/lib/components/ui/MarkdownEditor.svelte
+++ b/web/src/lib/components/ui/MarkdownEditor.svelte
@@ -38,7 +38,7 @@
}: Props = $props();
const surface = $derived(transparent ? "bg-transparent" : "bg-background-default");
- const pane = `rounded border border-border-default px-2.5 py-2 ${textareaMinHeight}`;
+ const pane = `rounded border border-border-default px-2.5 py-xs ${textareaMinHeight}`;
let preview = $state | null>(null);
let textareaEl = $state();
@@ -72,8 +72,6 @@