diff --git a/hexawebshare/src/components/admin/crud-data/DataTableToolbar.stories.svelte b/hexawebshare/src/components/admin/crud-data/DataTableToolbar.stories.svelte
new file mode 100644
index 0000000..b98d8ae
--- /dev/null
+++ b/hexawebshare/src/components/admin/crud-data/DataTableToolbar.stories.svelte
@@ -0,0 +1,1110 @@
+
+
+
+
+
+
+
+{#snippet filterContentSnippet()}
+
+
+
+
+
+
+
+
+
+
+
+{/snippet}
+
+
+{#snippet tagFilterContentSnippet()}
+
+
+
+
+
+ {
+ tagFilterSearch = (e.target as HTMLInputElement).value;
+ }}
+ ariaLabel="Search tags"
+ class="w-full"
+ />
+
+
+
+ {#if selectedTags.length > 0}
+
+
+
+ {#each selectedTags as tag (tag)}
+
+
e.stopPropagation()}>
+ {
+ selectedTags = selectedTags.filter((t) => t !== tag);
+ }}
+ removeLabel="Remove {tag}"
+ />
+
+ {/each}
+
+
+ {/if}
+
+
+
+
+
+
+ {#each availableTags.filter((tag) => !selectedTags.includes(tag) && (tagFilterSearch === '' || tag
+ .toLowerCase()
+ .includes(tagFilterSearch.toLowerCase()))) as tag (tag)}
+
+
e.stopPropagation()}>
+ {
+ if (!selectedTags.includes(tag)) {
+ selectedTags = [...selectedTags, tag];
+ }
+ }}
+ ariaLabel="Select {tag}"
+ />
+
+ {/each}
+
+
+
+
+
+
+
+
+
+
+{/snippet}
+
+
+
+ {#snippet children()}
+
+ {/snippet}
+
+
+
+
+ {#snippet children()}
+
+ {/snippet}
+
+
+
+
+ {#snippet children()}
+
+ {/snippet}
+
+
+
+
+ {#snippet children()}
+ {#snippet customFilterContent()}
+
+
+
+
+
+
+
+
+
+
+
+ {/snippet}
+
+
+
+
+
+ {#if appliedStatus !== 'all' || appliedCategory !== 'all'}
+
+
+
+
+
+
+ {#if appliedStatus !== 'all'}
+
+ {/if}
+ {#if appliedCategory !== 'all'}
+
+ {/if}
+
+
+ {:else}
+
+
+
+ {/if}
+
+
+
+ {#if showFiltersApplyToast}
+
{
+ showFiltersApplyToast = false;
+ }}
+ />
+ {/if}
+
+ {#if showFiltersResetToast}
+ {
+ showFiltersResetToast = false;
+ }}
+ />
+ {/if}
+
+ {/snippet}
+
+
+
+
+ {#snippet children()}
+
+ {/snippet}
+
+
+
+
+ {#snippet children()}
+ {#snippet customTagFilterContent()}
+
+
+
+
+
+ {
+ tagFilterSearch = (e.target as HTMLInputElement).value;
+ }}
+ ariaLabel="Search tags"
+ class="w-full"
+ />
+
+
+
+ {#if selectedTags.length > 0}
+
+
+
+ {#each selectedTags as tag (tag)}
+ {
+ selectedTags = selectedTags.filter((t) => t !== tag);
+ }}
+ removeLabel="Remove {tag}"
+ />
+ {/each}
+
+
+ {/if}
+
+
+
+
+
+
+ {#each availableTags.filter((tag) => !selectedTags.includes(tag) && (tagFilterSearch === '' || tag
+ .toLowerCase()
+ .includes(tagFilterSearch.toLowerCase()))) as tag (tag)}
+ {
+ if (!selectedTags.includes(tag)) {
+ selectedTags = [...selectedTags, tag];
+ }
+ }}
+ ariaLabel="Select {tag}"
+ />
+ {/each}
+
+
+
+
+
+
+
+
+
+
+ {/snippet}
+
+
+
+
+
+ {#if appliedTags.length > 0}
+
+
+
+
+ {#each appliedTags as tag (tag)}
+
+ {/each}
+
+
+ {:else}
+
+
+
+ {/if}
+
+
+
+ {#if showApplyToast}
+
0
+ ? `Applied ${appliedTags.length} filter${appliedTags.length > 1 ? 's' : ''}`
+ : 'No filters selected'}
+ variant="success"
+ position="top-right"
+ duration={3000}
+ showIcon={true}
+ closable={true}
+ onDismiss={() => {
+ showApplyToast = false;
+ }}
+ />
+ {/if}
+
+ {#if showClearToast}
+ {
+ showClearToast = false;
+ }}
+ />
+ {/if}
+
+ {/snippet}
+
+
+
+
+ {#snippet children()}
+
+ {/snippet}
+
+
+
+
+ {#snippet children()}
+
+ {/snippet}
+
+
+
+
+ {#snippet children()}
+
+ {/snippet}
+
+
+
+
+ {#snippet children()}
+
+ {/snippet}
+
+
+
+
+ {#snippet children()}
+
+ {/snippet}
+
diff --git a/hexawebshare/src/components/admin/crud-data/DataTableToolbar.svelte b/hexawebshare/src/components/admin/crud-data/DataTableToolbar.svelte
index 315da07..ed6e875 100644
--- a/hexawebshare/src/components/admin/crud-data/DataTableToolbar.svelte
+++ b/hexawebshare/src/components/admin/crud-data/DataTableToolbar.svelte
@@ -2,3 +2,788 @@
SPDX-FileCopyrightText: 2025 hexaTune LLC
SPDX-License-Identifier: MIT
-->
+
+
+
+
+
+
+
+
+
+
+ {#if loading}
+
+ {/if}
+ {#if showSearch}
+
+
+
+
+ {/if}
+
+ {#if showFilter}
+ {#snippet filterTrigger()}
+
+ {/snippet}
+ {#snippet defaultNoFilterContent()}
+
+
+
+ {/snippet}
+
{
+ filterOpen = open;
+ }}
+ trigger={filterTrigger}
+ >
+ {#snippet children()}
+ {@render (filterContent || defaultNoFilterContent)()}
+ {/snippet}
+
+ {/if}
+
+
+ {#if showBulkActions}
+
+
+
+ {#if onClearSelection}
+
+ {/if}
+
+ {/if}
+
+
+
+
+
+
+ {#if showBulkActions}
+ {#each bulkActions as action (action.label)}
+
+ {/each}
+ {/if}
+
+
+ {#if actions.length > 0}
+ {#each actions as action (action.label)}
+ {#if typeof action.icon === 'string'}
+
+ {#snippet children()}
+
+ {#if action.icon === 'add' || action.icon === 'plus'}
+
+ {#snippet children()}
+
+ {/snippet}
+
+ {:else if action.icon === 'export' || action.icon === 'download'}
+
+ {#snippet children()}
+
+ {/snippet}
+
+ {:else if action.icon === 'import' || action.icon === 'upload'}
+
+ {#snippet children()}
+
+ {/snippet}
+
+ {:else if action.icon === 'refresh' || action.icon === 'reload'}
+
+ {#snippet children()}
+
+ {/snippet}
+
+ {/if}
+ {/snippet}
+
+ {:else if action.icon}
+
+ {@render action.icon()}
+ {:else}
+
+
+ {/if}
+ {/each}
+ {/if}
+
+
+ {#if showViewOptions && viewOptions.length > 0}
+
+
+
+
diff --git a/hexawebshare/src/components/core/forms/Input.svelte b/hexawebshare/src/components/core/forms/Input.svelte
index 4939b34..a63d699 100644
--- a/hexawebshare/src/components/core/forms/Input.svelte
+++ b/hexawebshare/src/components/core/forms/Input.svelte
@@ -133,6 +133,10 @@ SPDX-License-Identifier: MIT
* Focus event handler
*/
onfocus?: (event: Event) => void;
+ /**
+ * Keydown event handler
+ */
+ onkeydown?: (event: KeyboardEvent) => void;
/**
* Additional CSS classes
*/
@@ -161,6 +165,11 @@ SPDX-License-Identifier: MIT
loading = false,
requiredLabel = 'required',
loadingLabel = 'Loading',
+ onchange,
+ oninput,
+ onblur,
+ onfocus,
+ onkeydown,
class: className = '',
...props
}: Props = $props();
@@ -234,6 +243,11 @@ SPDX-License-Identifier: MIT
aria-required={required}
aria-disabled={disabled}
aria-busy={loading}
+ {onchange}
+ {oninput}
+ {onblur}
+ {onfocus}
+ {onkeydown}
{...props}
/>
{#if loading}
diff --git a/hexawebshare/src/components/core/overlay-navigation/Dropdown.svelte b/hexawebshare/src/components/core/overlay-navigation/Dropdown.svelte
index 8b98727..9cfcb61 100644
--- a/hexawebshare/src/components/core/overlay-navigation/Dropdown.svelte
+++ b/hexawebshare/src/components/core/overlay-navigation/Dropdown.svelte
@@ -425,7 +425,13 @@ SPDX-License-Identifier: MIT
}
-
+