zabi-components 5.0.21 → 5.0.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/README.md +1 -0
  2. package/dist/atoms/CardContent.svelte +1 -1
  3. package/dist/atoms/CardHeader.svelte +1 -1
  4. package/dist/atoms/Checkbox.svelte +1 -7
  5. package/dist/atoms/CodeBlock.svelte +6 -6
  6. package/dist/atoms/ColorPicker.svelte +80 -72
  7. package/dist/atoms/Input.svelte +14 -10
  8. package/dist/atoms/Input.svelte.d.ts +2 -0
  9. package/dist/atoms/List.svelte +47 -0
  10. package/dist/atoms/List.svelte.d.ts +19 -0
  11. package/dist/atoms/ListItem.svelte +148 -0
  12. package/dist/atoms/ListItem.svelte.d.ts +35 -0
  13. package/dist/atoms/Progress.svelte +3 -5
  14. package/dist/atoms/Select.svelte +59 -16
  15. package/dist/atoms/Select.svelte.d.ts +13 -1
  16. package/dist/atoms/Textarea.svelte +11 -9
  17. package/dist/atoms/Textarea.svelte.d.ts +1 -0
  18. package/dist/atoms/Toggle.svelte +1 -7
  19. package/dist/atoms/Tooltip.svelte +8 -15
  20. package/dist/atoms/index.d.ts +2 -0
  21. package/dist/atoms/index.js +2 -0
  22. package/dist/components/atoms/index.d.ts +2 -0
  23. package/dist/components/atoms/index.d.ts.map +1 -1
  24. package/dist/components/index.d.ts +4 -0
  25. package/dist/components/index.d.ts.map +1 -1
  26. package/dist/components/molecules/index.d.ts +0 -1
  27. package/dist/components/molecules/index.d.ts.map +1 -1
  28. package/dist/components/molecules/navigation-menu-context.d.ts +7 -0
  29. package/dist/components/molecules/navigation-menu-context.d.ts.map +1 -0
  30. package/dist/components/organisms/index.d.ts +2 -0
  31. package/dist/components/organisms/index.d.ts.map +1 -1
  32. package/dist/index.d.ts +4 -0
  33. package/dist/index.js +5 -8
  34. package/dist/molecules/Alert.svelte +8 -3
  35. package/dist/molecules/ContactForm.svelte +63 -31
  36. package/dist/molecules/ContactForm.svelte.d.ts +1 -4
  37. package/dist/molecules/Dropdown.svelte +2 -1
  38. package/dist/molecules/ImageUpload.svelte +26 -3
  39. package/dist/molecules/ImageUpload.svelte.d.ts +1 -0
  40. package/dist/molecules/Modal.svelte +44 -43
  41. package/dist/molecules/NavigationMenu.svelte +7 -10
  42. package/dist/molecules/NavigationMenuContent.svelte +8 -8
  43. package/dist/molecules/NavigationMenuItem.svelte +7 -6
  44. package/dist/molecules/NavigationMenuLink.svelte +7 -5
  45. package/dist/molecules/NavigationMenuList.svelte +0 -7
  46. package/dist/molecules/NavigationMenuTrigger.svelte +7 -7
  47. package/dist/molecules/SlideUp.svelte +30 -0
  48. package/dist/molecules/Tabs.svelte +71 -4
  49. package/dist/molecules/index.d.ts +0 -1
  50. package/dist/molecules/index.js +0 -1
  51. package/dist/molecules/navigation-menu-context.d.ts +6 -0
  52. package/dist/molecules/navigation-menu-context.js +1 -0
  53. package/dist/organisms/Navigation.svelte +7 -4
  54. package/dist/organisms/Navigation.svelte.d.ts +1 -0
  55. package/dist/organisms/SidebarNavigation.svelte +420 -0
  56. package/dist/organisms/SidebarNavigation.svelte.d.ts +44 -0
  57. package/dist/organisms/SidebarProjectPanel.svelte +174 -0
  58. package/dist/organisms/SidebarProjectPanel.svelte.d.ts +32 -0
  59. package/dist/organisms/index.d.ts +2 -0
  60. package/dist/organisms/index.js +2 -0
  61. package/dist/zabi-components.css +302 -0
  62. package/package.json +5 -4
  63. package/dist/molecules/Sidebar.svelte +0 -324
  64. package/dist/molecules/Sidebar.svelte.d.ts +0 -30
@@ -0,0 +1,174 @@
1
+ <script lang="ts">
2
+ import Input from "../atoms/Input.svelte";
3
+ import Badge from "../atoms/Badge.svelte";
4
+ import { Search, X } from "@lucide/svelte";
5
+ import type { Component } from "svelte";
6
+
7
+ export interface SidebarProjectPanelItem {
8
+ id: string;
9
+ label: string;
10
+ icon?: Component<{ size?: number; class?: string }>;
11
+ description?: string;
12
+ badgeText?: string;
13
+ }
14
+
15
+ interface Props {
16
+ className?: string;
17
+ widthClass?: string;
18
+ ariaLabel?: string;
19
+ title?: string;
20
+ subtitle?: string;
21
+ showSearch?: boolean;
22
+ searchPlaceholder?: string;
23
+ searchValue?: string;
24
+ items?: SidebarProjectPanelItem[];
25
+ selectedItemId?: string;
26
+ emptyStateTitle?: string;
27
+ emptyStateDescription?: string;
28
+ selectLabel?: string;
29
+ closeLabel?: string;
30
+ onSelect?: (item: SidebarProjectPanelItem) => void;
31
+ onClose?: () => void;
32
+ }
33
+
34
+ let {
35
+ className = "",
36
+ widthClass = "w-80",
37
+ ariaLabel = "Project picker panel",
38
+ title = "Projects",
39
+ subtitle = "Choose a project to continue",
40
+ showSearch = true,
41
+ searchPlaceholder = "Search projects...",
42
+ searchValue = $bindable(""),
43
+ items = [],
44
+ selectedItemId = $bindable(""),
45
+ emptyStateTitle = "No projects found",
46
+ emptyStateDescription = "Try a different keyword or create a new project.",
47
+ selectLabel = "Select project",
48
+ closeLabel = "Close panel",
49
+ onSelect,
50
+ onClose,
51
+ ...restProps
52
+ }: Props = $props();
53
+
54
+ const normalizedSearchTerm = $derived(searchValue.trim().toLowerCase());
55
+ const filteredItems = $derived(
56
+ normalizedSearchTerm
57
+ ? items.filter((item) =>
58
+ item.label.toLowerCase().includes(normalizedSearchTerm),
59
+ )
60
+ : items,
61
+ );
62
+
63
+ const containerClasses = $derived.by(() => {
64
+ const resolvedWidthClass = widthClass.trim() || "w-80";
65
+ return `${resolvedWidthClass} shrink-0 rounded-2xl border border-border bg-background p-4 ${className}`.trim();
66
+ });
67
+
68
+ function getItemClasses(itemId: string): string {
69
+ const isActive = selectedItemId === itemId;
70
+ const baseClasses =
71
+ "w-full rounded-xl px-3 py-3 text-left transition-colors duration-150 focus:outline-none focus:ring-2 focus:ring-brand-500 focus:ring-offset-0";
72
+ if (isActive) {
73
+ return `${baseClasses} bg-action-primary-subtle text-headline`;
74
+ }
75
+ return `${baseClasses} hover:bg-base-50 text-description`;
76
+ }
77
+
78
+ function handleSelect(item: SidebarProjectPanelItem): void {
79
+ selectedItemId = item.id;
80
+ if (onSelect) {
81
+ onSelect(item);
82
+ }
83
+ }
84
+
85
+ function handleClose(): void {
86
+ if (onClose) {
87
+ onClose();
88
+ }
89
+ }
90
+ </script>
91
+
92
+ <aside class={containerClasses} aria-label={ariaLabel} {...restProps}>
93
+ <div class="mb-4 flex items-start justify-between gap-3">
94
+ <div class="min-w-0">
95
+ <h3 class="truncate text-base font-semibold text-headline">{title}</h3>
96
+ <p class="mt-1 text-sm text-description">{subtitle}</p>
97
+ </div>
98
+ <button
99
+ type="button"
100
+ class="inline-flex size-8 shrink-0 items-center justify-center rounded-md text-description hover:bg-base-50 hover:text-headline focus:outline-none focus:ring-2 focus:ring-brand-500 focus:ring-offset-0"
101
+ aria-label={closeLabel}
102
+ onclick={handleClose}
103
+ >
104
+ <X size={16} />
105
+ </button>
106
+ </div>
107
+
108
+ {#if showSearch}
109
+ <div class="relative mb-3">
110
+ <span
111
+ class="pointer-events-none absolute left-4 top-1/2 z-10 -translate-y-1/2 text-description"
112
+ aria-hidden="true"
113
+ >
114
+ <Search size={18} />
115
+ </span>
116
+ <Input
117
+ type="search"
118
+ bind:value={searchValue}
119
+ placeholder={searchPlaceholder}
120
+ aria-label={searchPlaceholder}
121
+ class="w-full min-w-0 rounded-xl pl-11"
122
+ />
123
+ </div>
124
+ {/if}
125
+
126
+ {#if filteredItems.length > 0}
127
+ <ul class="space-y-2" aria-label={selectLabel}>
128
+ {#each filteredItems as item (item.id)}
129
+ <li>
130
+ <button
131
+ type="button"
132
+ class={getItemClasses(item.id)}
133
+ onclick={() => handleSelect(item)}
134
+ aria-pressed={selectedItemId === item.id}
135
+ >
136
+ <span class="flex items-center justify-between gap-3">
137
+ <span class="flex min-w-0 items-start gap-2">
138
+ {#if item.icon}
139
+ {@const Icon = item.icon}
140
+ <span
141
+ class="mt-0.5 inline-flex size-4 shrink-0 items-center justify-center text-current"
142
+ aria-hidden="true"
143
+ >
144
+ <Icon size={16} />
145
+ </span>
146
+ {/if}
147
+ <span class="min-w-0">
148
+ <span class="block truncate text-sm font-medium text-current">
149
+ {item.label}
150
+ </span>
151
+ {#if item.description}
152
+ <span
153
+ class="mt-0.5 block truncate text-xs text-description"
154
+ >
155
+ {item.description}
156
+ </span>
157
+ {/if}
158
+ </span>
159
+ </span>
160
+ {#if item.badgeText}
161
+ <Badge text={item.badgeText} size="sm" />
162
+ {/if}
163
+ </span>
164
+ </button>
165
+ </li>
166
+ {/each}
167
+ </ul>
168
+ {:else}
169
+ <div class="rounded-xl border border-dashed border-border bg-base-50 p-4">
170
+ <h4 class="text-sm font-semibold text-headline">{emptyStateTitle}</h4>
171
+ <p class="mt-1 text-sm text-description">{emptyStateDescription}</p>
172
+ </div>
173
+ {/if}
174
+ </aside>
@@ -0,0 +1,32 @@
1
+ import type { Component } from "svelte";
2
+ export interface SidebarProjectPanelItem {
3
+ id: string;
4
+ label: string;
5
+ icon?: Component<{
6
+ size?: number;
7
+ class?: string;
8
+ }>;
9
+ description?: string;
10
+ badgeText?: string;
11
+ }
12
+ interface Props {
13
+ className?: string;
14
+ widthClass?: string;
15
+ ariaLabel?: string;
16
+ title?: string;
17
+ subtitle?: string;
18
+ showSearch?: boolean;
19
+ searchPlaceholder?: string;
20
+ searchValue?: string;
21
+ items?: SidebarProjectPanelItem[];
22
+ selectedItemId?: string;
23
+ emptyStateTitle?: string;
24
+ emptyStateDescription?: string;
25
+ selectLabel?: string;
26
+ closeLabel?: string;
27
+ onSelect?: (item: SidebarProjectPanelItem) => void;
28
+ onClose?: () => void;
29
+ }
30
+ declare const SidebarProjectPanel: Component<Props, {}, "searchValue" | "selectedItemId">;
31
+ type SidebarProjectPanel = ReturnType<typeof SidebarProjectPanel>;
32
+ export default SidebarProjectPanel;
@@ -1,2 +1,4 @@
1
1
  export { default as Navbar } from './Navbar.svelte';
2
2
  export { default as Navigation } from './Navigation.svelte';
3
+ export { default as SidebarNavigation } from './SidebarNavigation.svelte';
4
+ export { default as SidebarProjectPanel } from './SidebarProjectPanel.svelte';
@@ -1,2 +1,4 @@
1
1
  export { default as Navbar } from './Navbar.svelte';
2
2
  export { default as Navigation } from './Navigation.svelte';
3
+ export { default as SidebarNavigation } from './SidebarNavigation.svelte';
4
+ export { default as SidebarProjectPanel } from './SidebarProjectPanel.svelte';