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.
- package/README.md +1 -0
- package/dist/atoms/CardContent.svelte +1 -1
- package/dist/atoms/CardHeader.svelte +1 -1
- package/dist/atoms/Checkbox.svelte +1 -7
- package/dist/atoms/CodeBlock.svelte +6 -6
- package/dist/atoms/ColorPicker.svelte +80 -72
- package/dist/atoms/Input.svelte +14 -10
- package/dist/atoms/Input.svelte.d.ts +2 -0
- package/dist/atoms/List.svelte +47 -0
- package/dist/atoms/List.svelte.d.ts +19 -0
- package/dist/atoms/ListItem.svelte +148 -0
- package/dist/atoms/ListItem.svelte.d.ts +35 -0
- package/dist/atoms/Progress.svelte +3 -5
- package/dist/atoms/Select.svelte +59 -16
- package/dist/atoms/Select.svelte.d.ts +13 -1
- package/dist/atoms/Textarea.svelte +11 -9
- package/dist/atoms/Textarea.svelte.d.ts +1 -0
- package/dist/atoms/Toggle.svelte +1 -7
- package/dist/atoms/Tooltip.svelte +8 -15
- package/dist/atoms/index.d.ts +2 -0
- package/dist/atoms/index.js +2 -0
- package/dist/components/atoms/index.d.ts +2 -0
- package/dist/components/atoms/index.d.ts.map +1 -1
- package/dist/components/index.d.ts +4 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/molecules/index.d.ts +0 -1
- package/dist/components/molecules/index.d.ts.map +1 -1
- package/dist/components/molecules/navigation-menu-context.d.ts +7 -0
- package/dist/components/molecules/navigation-menu-context.d.ts.map +1 -0
- package/dist/components/organisms/index.d.ts +2 -0
- package/dist/components/organisms/index.d.ts.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.js +5 -8
- package/dist/molecules/Alert.svelte +8 -3
- package/dist/molecules/ContactForm.svelte +63 -31
- package/dist/molecules/ContactForm.svelte.d.ts +1 -4
- package/dist/molecules/Dropdown.svelte +2 -1
- package/dist/molecules/ImageUpload.svelte +26 -3
- package/dist/molecules/ImageUpload.svelte.d.ts +1 -0
- package/dist/molecules/Modal.svelte +44 -43
- package/dist/molecules/NavigationMenu.svelte +7 -10
- package/dist/molecules/NavigationMenuContent.svelte +8 -8
- package/dist/molecules/NavigationMenuItem.svelte +7 -6
- package/dist/molecules/NavigationMenuLink.svelte +7 -5
- package/dist/molecules/NavigationMenuList.svelte +0 -7
- package/dist/molecules/NavigationMenuTrigger.svelte +7 -7
- package/dist/molecules/SlideUp.svelte +30 -0
- package/dist/molecules/Tabs.svelte +71 -4
- package/dist/molecules/index.d.ts +0 -1
- package/dist/molecules/index.js +0 -1
- package/dist/molecules/navigation-menu-context.d.ts +6 -0
- package/dist/molecules/navigation-menu-context.js +1 -0
- package/dist/organisms/Navigation.svelte +7 -4
- package/dist/organisms/Navigation.svelte.d.ts +1 -0
- package/dist/organisms/SidebarNavigation.svelte +420 -0
- package/dist/organisms/SidebarNavigation.svelte.d.ts +44 -0
- package/dist/organisms/SidebarProjectPanel.svelte +174 -0
- package/dist/organisms/SidebarProjectPanel.svelte.d.ts +32 -0
- package/dist/organisms/index.d.ts +2 -0
- package/dist/organisms/index.js +2 -0
- package/dist/zabi-components.css +302 -0
- package/package.json +5 -4
- package/dist/molecules/Sidebar.svelte +0 -324
- 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;
|
package/dist/organisms/index.js
CHANGED