diff --git a/src/lib/components/atoms/Chip.svelte b/src/lib/components/atoms/Chip.svelte
new file mode 100644
index 0000000..034defc
--- /dev/null
+++ b/src/lib/components/atoms/Chip.svelte
@@ -0,0 +1,53 @@
+
+
+
+
+
setTimeout(onclick, 100))}
+ class={[
+ "inline-flex cursor-pointer items-center gap-x-1 rounded-lg px-3 py-1.5 text-sm font-medium transition active:scale-95",
+ selected
+ ? "bg-primary-500 text-white active:bg-primary-400"
+ : "bg-gray-100 text-gray-700 active:bg-gray-200",
+ className,
+ ]}
+>
+
+ {@render children()}
+
+ {#if selected && removable}
+
+ {/if}
+
diff --git a/src/lib/components/atoms/RowVirtualizer.svelte b/src/lib/components/atoms/RowVirtualizer.svelte
index 67a684d..2641806 100644
--- a/src/lib/components/atoms/RowVirtualizer.svelte
+++ b/src/lib/components/atoms/RowVirtualizer.svelte
@@ -6,13 +6,22 @@
interface Props {
class?: ClassValue;
count: number;
+ estimateItemHeight: (index: number) => number;
+ getItemKey?: (index: number) => string | number;
item: Snippet<[index: number]>;
- itemHeight: (index: number) => number;
itemGap?: number;
placeholder?: Snippet;
}
- let { class: className, count, item, itemHeight, itemGap, placeholder }: Props = $props();
+ let {
+ class: className,
+ count,
+ estimateItemHeight,
+ getItemKey,
+ item,
+ itemGap,
+ placeholder,
+ }: Props = $props();
let element: HTMLElement | undefined = $state();
let scrollMargin = $state(0);
@@ -20,8 +29,9 @@
let virtualizer = $derived(
createWindowVirtualizer({
count,
- estimateSize: itemHeight,
+ estimateSize: estimateItemHeight,
gap: itemGap,
+ getItemKey: getItemKey,
scrollMargin,
}),
);
diff --git a/src/lib/components/atoms/buttons/ActionEntryButton.svelte b/src/lib/components/atoms/buttons/ActionEntryButton.svelte
index c29fd7f..b257241 100644
--- a/src/lib/components/atoms/buttons/ActionEntryButton.svelte
+++ b/src/lib/components/atoms/buttons/ActionEntryButton.svelte
@@ -49,7 +49,7 @@
-