diff --git a/hexawebshare/src/components/admin/layout/AdminTopbar.stories.svelte b/hexawebshare/src/components/admin/layout/AdminTopbar.stories.svelte
new file mode 100644
index 0000000..6b9f1e1
--- /dev/null
+++ b/hexawebshare/src/components/admin/layout/AdminTopbar.stories.svelte
@@ -0,0 +1,111 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/hexawebshare/src/components/admin/layout/AdminTopbar.svelte b/hexawebshare/src/components/admin/layout/AdminTopbar.svelte
index 315da07..5145ad7 100644
--- a/hexawebshare/src/components/admin/layout/AdminTopbar.svelte
+++ b/hexawebshare/src/components/admin/layout/AdminTopbar.svelte
@@ -2,3 +2,284 @@
SPDX-FileCopyrightText: 2025 hexaTune LLC
SPDX-License-Identifier: MIT
-->
+
+
+
+
+ {#if isMobileSearchOpen}
+
+
+ {
+ onSearch?.(q);
+ if (q) isMobileSearchOpen = false;
+ }}
+ />
+
+
+ {:else}
+
+
+
+
+
+
+
+
+
+
+
+ {#if onSearch}
+
+ {/if}
+
+
+
+
+
+
+ {#if onSearch}
+
+ (isMobileSearchOpen = true)}
+ >
+
+
+
+
+
+ {/if}
+
+
+ {#if notifications.length > 0}
+
+ {#snippet trigger()}
+
+
+
+
+ {#if unreadCount > 0}
+
+ {/if}
+
+ {/snippet}
+
+ {#snippet children()}
+
+ {/snippet}
+
+ {:else}
+ console.log('No notifications')}
+ >
+
+
+
+
+ {/if}
+
+
+ {#if isLoggedIn}
+
+ {#snippet trigger()}
+
+ {/snippet}
+
+
+
+ {:else}
+
+
+ {/if}
+
diff --git a/hexawebshare/src/components/core/buttons/Button.svelte b/hexawebshare/src/components/core/buttons/Button.svelte
index 850edbf..9040bf8 100644
--- a/hexawebshare/src/components/core/buttons/Button.svelte
+++ b/hexawebshare/src/components/core/buttons/Button.svelte
@@ -69,32 +69,30 @@ SPDX-License-Identifier: MIT
}: Props = $props();
let buttonClasses = $derived(
- // If custom class is provided, use it (for menu items and special cases)
- className
- ? className
- : [
- 'btn',
- variant === 'primary' && 'btn-primary',
- variant === 'secondary' && 'btn-secondary',
- variant === 'accent' && 'btn-accent',
- variant === 'neutral' && 'btn-neutral',
- variant === 'info' && 'btn-info',
- variant === 'success' && 'btn-success',
- variant === 'warning' && 'btn-warning',
- variant === 'error' && 'btn-error',
- variant === 'ghost' && 'btn-ghost',
- variant === 'link' && 'btn-link',
- size === 'xs' && 'btn-xs',
- size === 'sm' && 'btn-sm',
- size === 'md' && 'btn-md',
- size === 'lg' && 'btn-lg',
- outline && 'btn-outline',
- wide && 'btn-wide',
- block && 'btn-block',
- glass && 'glass'
- ]
- .filter(Boolean)
- .join(' ')
+ [
+ 'btn',
+ variant === 'primary' && 'btn-primary',
+ variant === 'secondary' && 'btn-secondary',
+ variant === 'accent' && 'btn-accent',
+ variant === 'neutral' && 'btn-neutral',
+ variant === 'info' && 'btn-info',
+ variant === 'success' && 'btn-success',
+ variant === 'warning' && 'btn-warning',
+ variant === 'error' && 'btn-error',
+ variant === 'ghost' && 'btn-ghost',
+ variant === 'link' && 'btn-link',
+ size === 'xs' && 'btn-xs',
+ size === 'sm' && 'btn-sm',
+ size === 'md' && 'btn-md',
+ size === 'lg' && 'btn-lg',
+ outline && 'btn-outline',
+ wide && 'btn-wide',
+ block && 'btn-block',
+ glass && 'glass',
+ className
+ ]
+ .filter(Boolean)
+ .join(' ')
);
diff --git a/hexawebshare/src/components/core/buttons/IconButton.svelte b/hexawebshare/src/components/core/buttons/IconButton.svelte
index 056b29d..483cfb0 100644
--- a/hexawebshare/src/components/core/buttons/IconButton.svelte
+++ b/hexawebshare/src/components/core/buttons/IconButton.svelte
@@ -75,12 +75,13 @@ SPDX-License-Identifier: MIT
defaultIconPoints = '12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2',
defaultIconWidth = '20',
defaultIconHeight = '20',
+ onclick,
+ onkeydown,
...props
}: Props = $props();
let buttonClasses = $derived(
[
- className,
'btn',
variant === 'primary' && 'btn-primary',
variant === 'secondary' && 'btn-secondary',
@@ -113,6 +114,8 @@ SPDX-License-Identifier: MIT
{disabled}
aria-label={ariaLabel}
aria-expanded={ariaExpanded}
+ {onclick}
+ {onkeydown}
{...props}
>
{#if loading}
diff --git a/hexawebshare/src/components/core/forms/SearchInput.svelte b/hexawebshare/src/components/core/forms/SearchInput.svelte
index 5cce02e..085ae7c 100644
--- a/hexawebshare/src/components/core/forms/SearchInput.svelte
+++ b/hexawebshare/src/components/core/forms/SearchInput.svelte
@@ -179,21 +179,24 @@ SPDX-License-Identifier: MIT
[
'input',
'input-bordered',
+ 'bg-base-200/40',
+ 'transition-all duration-200 ease-in-out',
+ 'focus:outline-none focus:border-primary/40 focus:ring-4 focus:ring-primary/5',
'w-full',
'pl-10',
showClearButton && value ? 'pr-10' : 'pr-4',
- variant === 'primary' && 'input-primary',
- variant === 'secondary' && 'input-secondary',
- variant === 'accent' && 'input-accent',
- variant === 'info' && 'input-info',
- variant === 'success' && 'input-success',
- variant === 'warning' && 'input-warning',
- variant === 'error' && 'input-error',
+ variant === 'primary' && 'input-primary focus:ring-primary/10',
+ variant === 'secondary' && 'input-secondary focus:ring-secondary/10',
+ variant === 'accent' && 'input-accent focus:ring-accent/10',
+ variant === 'info' && 'input-info focus:ring-info/10',
+ variant === 'success' && 'input-success focus:ring-success/10',
+ variant === 'warning' && 'input-warning focus:ring-warning/10',
+ variant === 'error' && 'input-error focus:ring-error/10',
size === 'xs' && 'input-xs',
size === 'sm' && 'input-sm',
size === 'md' && 'input-md',
size === 'lg' && 'input-lg',
- error !== undefined && error !== '' && 'input-error'
+ error !== undefined && error !== '' && 'input-error focus:ring-error/10'
]
.filter(Boolean)
.join(' ')
@@ -333,7 +336,7 @@ SPDX-License-Identifier: MIT
/>
-
+
{#if loading}
{:else if showClearButton && value}
@@ -344,7 +347,7 @@ SPDX-License-Identifier: MIT
onclick={handleClear}
{disabled}
ariaLabel={clearLabel}
- class="h-auto min-h-0 p-0.5"
+ class="h-8 min-h-0 w-8 p-0"
>