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,35 @@
1
+ import type { Component } from "svelte";
2
+ export interface ListItemData {
3
+ /** Unique identifier for stable rendering and active-state tracking. */
4
+ id: string;
5
+ /** Primary item label. */
6
+ label: string;
7
+ /** Optional secondary text shown under the label. */
8
+ description?: string;
9
+ /** Optional URL; when set, the item renders as an anchor. */
10
+ href?: string;
11
+ /** Optional leading icon rendered before text. */
12
+ icon?: Component<{
13
+ size?: number;
14
+ class?: string;
15
+ }>;
16
+ /** Link target, only used when href is provided. */
17
+ target?: "_self" | "_blank" | "_parent" | "_top";
18
+ /** Link rel attribute, only used when href is provided. */
19
+ rel?: string;
20
+ /** Disabled state for the item. */
21
+ disabled?: boolean;
22
+ }
23
+ interface Props {
24
+ /** Item data to render. */
25
+ item: ListItemData;
26
+ /** Active-state styling flag. */
27
+ selected?: boolean;
28
+ /** Whether to show the right-arrow icon. */
29
+ showArrow?: boolean;
30
+ /** Item click callback. */
31
+ onclick?: (item: ListItemData, event: MouseEvent) => void;
32
+ }
33
+ declare const ListItem: Component<Props, {}, "">;
34
+ type ListItem = ReturnType<typeof ListItem>;
35
+ export default ListItem;
@@ -1,4 +1,6 @@
1
1
  <script lang="ts">
2
+ import { generateId } from "../../routes/lib/ssr-safe.js";
3
+
2
4
  interface Props {
3
5
  value?: number;
4
6
  max?: number;
@@ -14,11 +16,7 @@
14
16
  ...restProps
15
17
  }: Props = $props();
16
18
 
17
- let progressId = $state(
18
- typeof window !== "undefined"
19
- ? `progress-${Math.random().toString(36).substr(2, 9)}`
20
- : `progress-ssr-${Date.now()}`,
21
- );
19
+ const progressId = generateId("progress");
22
20
 
23
21
  let percentage = $derived(Math.min(Math.max((value / max) * 100, 0), 100));
24
22
 
@@ -7,14 +7,7 @@
7
7
  AlertTriangle,
8
8
  AlertCircle,
9
9
  } from "@lucide/svelte";
10
-
11
- function generateId(prefix: string = "id"): string {
12
- if (typeof window !== "undefined") {
13
- return `${prefix}-${Math.random().toString(36).substr(2, 9)}`;
14
- } else {
15
- return `${prefix}-ssr-${Date.now()}`;
16
- }
17
- }
10
+ import { generateId } from "../../routes/lib/ssr-safe.js";
18
11
 
19
12
  interface Props {
20
13
  value?: string | number | undefined;
@@ -33,30 +26,49 @@
33
26
  menuWidth?: string;
34
27
  /** Message shown when no options match the search. */
35
28
  noResultsText?: string;
29
+ /** Shows a loading state while options are being fetched. */
30
+ isLoading?: boolean;
31
+ /** Loading text shown in trigger and dropdown body. */
32
+ loadingText?: string;
33
+ /** Empty state title shown when there are no available options. */
34
+ emptyStateTitle?: string;
35
+ /** Empty state description shown when there are no available options. */
36
+ emptyStateDescription?: string;
37
+ /** Optional empty state action label. */
38
+ emptyStateActionLabel?: string;
36
39
  placeholder?: string;
37
40
  label?: string;
41
+ required?: boolean;
38
42
  disabled?: boolean;
39
43
  size?: "sm" | "md" | "lg";
40
44
  variant?: "default" | "success" | "warning" | "error";
41
45
  message?: string;
42
46
  onchange?: (event: Event) => void;
47
+ onEmptyStateAction?: () => void;
43
48
  }
44
49
 
45
50
  let {
46
- value = undefined,
51
+ value = $bindable(undefined),
47
52
  options = [],
48
53
  searchable = true,
49
54
  searchPlaceholder = "Search options",
50
55
  maxMenuHeight = "60vh",
51
56
  menuWidth = "100%",
52
57
  noResultsText = "No results found",
58
+ isLoading = false,
59
+ loadingText = "Loading options...",
60
+ emptyStateTitle = "No options available",
61
+ emptyStateDescription = "Add an option to start making selections.",
62
+ emptyStateActionLabel = "",
53
63
  placeholder = "Select an option",
54
64
  label = "",
65
+ required = false,
55
66
  disabled = false,
56
67
  size = "md",
57
68
  variant = "default",
58
69
  message = "",
59
70
  onchange,
71
+ onEmptyStateAction,
60
72
  ...restProps
61
73
  }: Props = $props();
62
74
 
@@ -170,7 +182,7 @@
170
182
  });
171
183
 
172
184
  function handleOptionClick(optionValue: string | number) {
173
- if (disabled) return;
185
+ if (disabled || isLoading) return;
174
186
  value = optionValue;
175
187
  isOpen = false;
176
188
 
@@ -185,7 +197,7 @@
185
197
  }
186
198
 
187
199
  function handleTriggerClick(event: MouseEvent) {
188
- if (disabled) return;
200
+ if (disabled || isLoading) return;
189
201
  event.stopPropagation();
190
202
  isOpen = !isOpen;
191
203
  }
@@ -238,14 +250,20 @@
238
250
  aria-describedby={message ? `${selectId}-message` : undefined}
239
251
  >
240
252
  <span
241
- class="text-left flex-1 truncate {isEmpty()
253
+ class="text-left flex-1 truncate {isLoading
254
+ ? 'text-description'
255
+ : isEmpty()
242
256
  ? 'text-description'
243
257
  : 'text-body'}"
244
258
  >
245
- {isEmpty()
259
+ {#if isLoading}
260
+ {loadingText}
261
+ {:else}
262
+ {isEmpty()
246
263
  ? placeholder
247
264
  : options.find((opt) => opt.value === value)?.label ||
248
265
  placeholder}
266
+ {/if}
249
267
  </span>
250
268
  <ChevronDown
251
269
  size={20}
@@ -257,7 +275,7 @@
257
275
  {/snippet}
258
276
  {#snippet children()}
259
277
  <div class="px-2 pb-2 pt-1" style:width={menuWidth}>
260
- {#if searchable}
278
+ {#if searchable && !isLoading}
261
279
  <div class="px-1 pb-2">
262
280
  <input
263
281
  type="text"
@@ -273,7 +291,13 @@
273
291
  class="overflow-y-auto px-1"
274
292
  style:max-height={maxMenuHeight}
275
293
  >
276
- {#if filteredOptions().length > 0}
294
+ {#if isLoading}
295
+ <div class="space-y-2 px-2 py-2" role="status" aria-live="polite">
296
+ <div class="h-8 w-full animate-pulse rounded-md bg-base-200"></div>
297
+ <div class="h-8 w-full animate-pulse rounded-md bg-base-200"></div>
298
+ <p class="text-xs text-description">{loadingText}</p>
299
+ </div>
300
+ {:else if filteredOptions().length > 0}
277
301
  {#each filteredOptions() as option (option.value)}
278
302
  {@const buttonRestProps = {
279
303
  "data-value": String(option.value),
@@ -297,13 +321,32 @@
297
321
  <div class="px-3 py-2 text-sm text-description">
298
322
  {noResultsText}
299
323
  </div>
324
+ {:else}
325
+ <div class="rounded-md border border-border bg-base-50 px-3 py-3 text-sm">
326
+ <p class="font-medium text-headline">{emptyStateTitle}</p>
327
+ <p class="mt-1 text-description">{emptyStateDescription}</p>
328
+ {#if emptyStateActionLabel && onEmptyStateAction}
329
+ <button
330
+ type="button"
331
+ class="mt-3 inline-flex min-h-11 items-center rounded-lg bg-action-primary px-3 py-2 text-sm text-action-primary"
332
+ onclick={onEmptyStateAction}
333
+ >
334
+ {emptyStateActionLabel}
335
+ </button>
336
+ {/if}
337
+ </div>
300
338
  {/if}
301
339
  </div>
302
340
  </div>
303
341
  {/snippet}
304
342
  </Dropdown>
305
343
  {#if message && variant !== "default"}
306
- <p id={`${selectId}-message`} class={messageClasses()} role="alert">
344
+ <p
345
+ id={`${selectId}-message`}
346
+ class={messageClasses()}
347
+ role={variant === "error" ? "alert" : "status"}
348
+ aria-live={variant === "error" ? "assertive" : "polite"}
349
+ >
307
350
  {#if getIcon()}
308
351
  {@const Icon = getIcon()}
309
352
  <Icon size={14} class="shrink-0" />
@@ -15,14 +15,26 @@ interface Props {
15
15
  menuWidth?: string;
16
16
  /** Message shown when no options match the search. */
17
17
  noResultsText?: string;
18
+ /** Shows a loading state while options are being fetched. */
19
+ isLoading?: boolean;
20
+ /** Loading text shown in trigger and dropdown body. */
21
+ loadingText?: string;
22
+ /** Empty state title shown when there are no available options. */
23
+ emptyStateTitle?: string;
24
+ /** Empty state description shown when there are no available options. */
25
+ emptyStateDescription?: string;
26
+ /** Optional empty state action label. */
27
+ emptyStateActionLabel?: string;
18
28
  placeholder?: string;
19
29
  label?: string;
30
+ required?: boolean;
20
31
  disabled?: boolean;
21
32
  size?: "sm" | "md" | "lg";
22
33
  variant?: "default" | "success" | "warning" | "error";
23
34
  message?: string;
24
35
  onchange?: (event: Event) => void;
36
+ onEmptyStateAction?: () => void;
25
37
  }
26
- declare const Select: import("svelte").Component<Props, {}, "">;
38
+ declare const Select: import("svelte").Component<Props, {}, "value">;
27
39
  type Select = ReturnType<typeof Select>;
28
40
  export default Select;
@@ -1,20 +1,14 @@
1
1
  <script lang="ts">
2
2
  import { CheckCircle, AlertTriangle, AlertCircle } from "@lucide/svelte";
3
3
  import type { SemanticVariant, SizeVariant } from "../../types/variants.js";
4
-
5
- function generateId(prefix: string = "id"): string {
6
- if (typeof window !== "undefined") {
7
- return `${prefix}-${Math.random().toString(36).substr(2, 9)}`;
8
- } else {
9
- return `${prefix}-ssr-${Date.now()}`;
10
- }
11
- }
4
+ import { generateId } from "../../routes/lib/ssr-safe.js";
12
5
 
13
6
  interface Props {
14
7
  value?: string;
15
8
  name?: string;
16
9
  label?: string;
17
10
  placeholder?: string;
11
+ required?: boolean;
18
12
  disabled?: boolean;
19
13
  rows?: number;
20
14
  size?: SizeVariant;
@@ -28,6 +22,7 @@
28
22
  name = "",
29
23
  label = "",
30
24
  placeholder = "",
25
+ required = false,
31
26
  disabled = false,
32
27
  rows = 4,
33
28
  variant = "default",
@@ -96,16 +91,23 @@
96
91
  {name}
97
92
  {value}
98
93
  {placeholder}
94
+ {required}
99
95
  {disabled}
100
96
  {rows}
101
97
  class={textareaClasses()}
102
98
  oninput={handleInput}
103
99
  aria-invalid={variant === "error" ? "true" : undefined}
100
+ aria-required={required ? "true" : undefined}
104
101
  aria-describedby={message ? `${textareaId}-message` : undefined}
105
102
  {...restProps}
106
103
  ></textarea>
107
104
  {#if message && variant !== "default"}
108
- <p id={`${textareaId}-message`} class={messageClasses()} role="alert">
105
+ <p
106
+ id={`${textareaId}-message`}
107
+ class={messageClasses()}
108
+ role={variant === "error" ? "alert" : "status"}
109
+ aria-live={variant === "error" ? "assertive" : "polite"}
110
+ >
109
111
  {#if getIcon()}
110
112
  {@const Icon = getIcon()}
111
113
  <Icon size={14} class="shrink-0" />
@@ -4,6 +4,7 @@ interface Props {
4
4
  name?: string;
5
5
  label?: string;
6
6
  placeholder?: string;
7
+ required?: boolean;
7
8
  disabled?: boolean;
8
9
  rows?: number;
9
10
  size?: SizeVariant;
@@ -1,11 +1,5 @@
1
1
  <script lang="ts">
2
- function generateId(prefix: string = "id"): string {
3
- if (typeof window !== "undefined") {
4
- return `${prefix}-${Math.random().toString(36).substr(2, 9)}`;
5
- } else {
6
- return `${prefix}-ssr-${Date.now()}`;
7
- }
8
- }
2
+ import { generateId } from "../../routes/lib/ssr-safe.js";
9
3
 
10
4
  interface Props {
11
5
  checked?: boolean;
@@ -1,5 +1,5 @@
1
1
  <script lang="ts">
2
- import { onMount } from "svelte";
2
+ import { generateId } from "../../routes/lib/ssr-safe.js";
3
3
 
4
4
  interface Props {
5
5
  content?: string;
@@ -17,8 +17,8 @@
17
17
  ...restProps
18
18
  }: Props & { children?: any } = $props();
19
19
 
20
- let triggerId = `tooltip-trigger-${Math.random().toString(36).substr(2, 9)}`;
21
- let tooltipId = `tooltip-${Math.random().toString(36).substr(2, 9)}`;
20
+ const triggerId = generateId("tooltip-trigger");
21
+ const tooltipId = generateId("tooltip");
22
22
  let isVisible = $state(false);
23
23
  let triggerElement: HTMLElement | null = $state(null);
24
24
 
@@ -56,17 +56,10 @@
56
56
  function handleMouseLeave() {
57
57
  isVisible = false;
58
58
  }
59
-
60
- onMount(() => {
61
- if (typeof window !== "undefined") {
62
- window.addEventListener("keydown", handleKeydown);
63
- return () => {
64
- window.removeEventListener("keydown", handleKeydown);
65
- };
66
- }
67
- });
68
59
  </script>
69
60
 
61
+ <svelte:window onkeydown={handleKeydown} />
62
+
70
63
  <div
71
64
  class="tooltip-container relative inline-block"
72
65
  data-placement={placement}
@@ -249,8 +242,8 @@
249
242
 
250
243
  @media (prefers-contrast: high) {
251
244
  :root {
252
- --tooltip-bg: #000000;
253
- --tooltip-color: #ffffff;
245
+ --tooltip-bg: CanvasText;
246
+ --tooltip-color: Canvas;
254
247
  --tooltip-padding: 0.75rem 1rem;
255
248
  }
256
249
  }
@@ -276,7 +269,7 @@
276
269
  }
277
270
 
278
271
  .tooltip-container:focus-visible {
279
- outline: 2px solid var(--color-focus, #8fa8ff);
272
+ outline: 2px solid var(--color-focus);
280
273
  outline-offset: 2px;
281
274
  border-radius: var(--tooltip-radius);
282
275
  }
@@ -10,5 +10,7 @@ export { default as Input } from './Input.svelte';
10
10
  export { default as Textarea } from './Textarea.svelte';
11
11
  export { default as Select } from './Select.svelte';
12
12
  export { default as ColorPicker } from './ColorPicker.svelte';
13
+ export { default as List } from './List.svelte';
14
+ export { default as ListItem } from './ListItem.svelte';
13
15
  export { default as Heading } from './Heading.svelte';
14
16
  export { default as ThemeToggle } from './ThemeToggle.svelte';
@@ -10,5 +10,7 @@ export { default as Input } from './Input.svelte';
10
10
  export { default as Textarea } from './Textarea.svelte';
11
11
  export { default as Select } from './Select.svelte';
12
12
  export { default as ColorPicker } from './ColorPicker.svelte';
13
+ export { default as List } from './List.svelte';
14
+ export { default as ListItem } from './ListItem.svelte';
13
15
  export { default as Heading } from './Heading.svelte';
14
16
  export { default as ThemeToggle } from './ThemeToggle.svelte';
@@ -10,6 +10,8 @@ export { default as Input } from './Input.svelte';
10
10
  export { default as Textarea } from './Textarea.svelte';
11
11
  export { default as Select } from './Select.svelte';
12
12
  export { default as ColorPicker } from './ColorPicker.svelte';
13
+ export { default as List } from './List.svelte';
14
+ export { default as ListItem } from './ListItem.svelte';
13
15
  export { default as Heading } from './Heading.svelte';
14
16
  export { default as ThemeToggle } from './ThemeToggle.svelte';
15
17
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/atoms/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/atoms/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC"}
@@ -6,6 +6,8 @@ export { default as Input } from './atoms/Input.svelte';
6
6
  export { default as Textarea } from './atoms/Textarea.svelte';
7
7
  export { default as Select } from './atoms/Select.svelte';
8
8
  export { default as ColorPicker } from './atoms/ColorPicker.svelte';
9
+ export { default as List } from './atoms/List.svelte';
10
+ export { default as ListItem } from './atoms/ListItem.svelte';
9
11
  export { default as Heading } from './atoms/Heading.svelte';
10
12
  export { default as ThemeToggle } from './atoms/ThemeToggle.svelte';
11
13
  export { default as Alert } from './molecules/Alert.svelte';
@@ -19,6 +21,8 @@ export { default as SlideUp } from './molecules/SlideUp.svelte';
19
21
  export { default as Tabs } from './molecules/Tabs.svelte';
20
22
  export { default as Navbar } from './organisms/Navbar.svelte';
21
23
  export { default as Navigation } from './organisms/Navigation.svelte';
24
+ export { default as SidebarNavigation } from './organisms/SidebarNavigation.svelte';
25
+ export { default as SidebarProjectPanel } from './organisms/SidebarProjectPanel.svelte';
22
26
  export declare const createId: (prefix?: string) => string;
23
27
  export declare const cn: (...classes: (string | undefined | null | false)[]) => string;
24
28
  export declare const getFormData: (form: HTMLFormElement) => Record<string, any>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAE,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEpE,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAE1D,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAEtE,eAAO,MAAM,QAAQ,GAAI,SAAQ,MAAa,KAAG,MAMhD,CAAC;AAEF,eAAO,MAAM,EAAE,GAAI,GAAG,SAAS,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,KAAK,CAAC,EAAE,KAAG,MAClC,CAAC;AAEtC,eAAO,MAAM,WAAW,GAAI,MAAM,eAAe,KAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAGrE,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,OAAO,MAAM,KAAG,OAG7C,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,OAAO,GAAG,KAAG,OAE7C,CAAC;AAEF,eAAO,MAAM,SAAS,QAAO,OAE5B,CAAC;AAEF,eAAO,MAAM,UAAU,QAAO,MAAM,GAAG,SAEtC,CAAC;AAEF,eAAO,MAAM,YAAY,QAAO,QAAQ,GAAG,SAE1C,CAAC;AAEF,eAAO,MAAM,gBAAgB,QAAO,OAAO,GAAG,SAE7C,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,SAAQ,MAAa,KAAG,MAKlD,CAAC;AAEF,OAAO,EACH,GAAG,EACH,IAAI,EACJ,OAAO,EACP,IAAI,EACJ,YAAY,EACZ,SAAS,EACT,WAAW,EACX,YAAY,EACZ,GAAG,EACH,SAAS,EACT,SAAS,EACT,QAAQ,EACX,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"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"}
@@ -12,7 +12,6 @@ export { default as NavigationMenuTrigger } from './NavigationMenuTrigger.svelte
12
12
  export { default as NavigationMenuContent } from './NavigationMenuContent.svelte';
13
13
  export { default as NavigationMenuLink } from './NavigationMenuLink.svelte';
14
14
  export { default as Section } from './Section.svelte';
15
- export { default as Sidebar } from './Sidebar.svelte';
16
15
  export { default as SlideUp } from './SlideUp.svelte';
17
16
  export { default as Tabs } from './Tabs.svelte';
18
17
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/molecules/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/molecules/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,7 @@
1
+ export interface NavigationMenuContextValue {
2
+ activeItem: string | null;
3
+ setActiveItem: (item: string | null) => void;
4
+ isMobile: boolean;
5
+ }
6
+ export declare const NAVIGATION_MENU_CONTEXT_KEY: unique symbol;
7
+ //# sourceMappingURL=navigation-menu-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigation-menu-context.d.ts","sourceRoot":"","sources":["../../../src/components/molecules/navigation-menu-context.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,0BAA0B;IACvC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC7C,QAAQ,EAAE,OAAO,CAAC;CACrB;AAED,eAAO,MAAM,2BAA2B,eAA4B,CAAC"}
@@ -1,3 +1,5 @@
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';
3
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/organisms/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/organisms/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,8BAA8B,CAAC"}
package/dist/index.d.ts CHANGED
@@ -6,6 +6,8 @@ export { default as Input } from './atoms/Input.svelte';
6
6
  export { default as Textarea } from './atoms/Textarea.svelte';
7
7
  export { default as Select } from './atoms/Select.svelte';
8
8
  export { default as ColorPicker } from './atoms/ColorPicker.svelte';
9
+ export { default as List } from './atoms/List.svelte';
10
+ export { default as ListItem } from './atoms/ListItem.svelte';
9
11
  export { default as Heading } from './atoms/Heading.svelte';
10
12
  export { default as ThemeToggle } from './atoms/ThemeToggle.svelte';
11
13
  export { default as Alert } from './molecules/Alert.svelte';
@@ -19,6 +21,8 @@ export { default as SlideUp } from './molecules/SlideUp.svelte';
19
21
  export { default as Tabs } from './molecules/Tabs.svelte';
20
22
  export { default as Navbar } from './organisms/Navbar.svelte';
21
23
  export { default as Navigation } from './organisms/Navigation.svelte';
24
+ export { default as SidebarNavigation } from './organisms/SidebarNavigation.svelte';
25
+ export { default as SidebarProjectPanel } from './organisms/SidebarProjectPanel.svelte';
22
26
  export declare const createId: (prefix?: string) => string;
23
27
  export declare const cn: (...classes: (string | undefined | null | false)[]) => string;
24
28
  export declare const getFormData: (form: HTMLFormElement) => Record<string, any>;
package/dist/index.js CHANGED
@@ -6,6 +6,8 @@ export { default as Input } from './atoms/Input.svelte';
6
6
  export { default as Textarea } from './atoms/Textarea.svelte';
7
7
  export { default as Select } from './atoms/Select.svelte';
8
8
  export { default as ColorPicker } from './atoms/ColorPicker.svelte';
9
+ export { default as List } from './atoms/List.svelte';
10
+ export { default as ListItem } from './atoms/ListItem.svelte';
9
11
  export { default as Heading } from './atoms/Heading.svelte';
10
12
  export { default as ThemeToggle } from './atoms/ThemeToggle.svelte';
11
13
  export { default as Alert } from './molecules/Alert.svelte';
@@ -19,14 +21,9 @@ export { default as SlideUp } from './molecules/SlideUp.svelte';
19
21
  export { default as Tabs } from './molecules/Tabs.svelte';
20
22
  export { default as Navbar } from './organisms/Navbar.svelte';
21
23
  export { default as Navigation } from './organisms/Navigation.svelte';
22
- export const createId = (prefix = 'id') => {
23
- if (typeof window !== 'undefined') {
24
- return `${prefix}-${Math.random().toString(36).substr(2, 9)}`;
25
- }
26
- else {
27
- return `${prefix}-ssr-${Date.now()}`;
28
- }
29
- };
24
+ export { default as SidebarNavigation } from './organisms/SidebarNavigation.svelte';
25
+ export { default as SidebarProjectPanel } from './organisms/SidebarProjectPanel.svelte';
26
+ export const createId = (prefix = 'id') => generateId(prefix);
30
27
  export const cn = (...classes) => classes.filter(Boolean).join(' ');
31
28
  export const getFormData = (form) => {
32
29
  const formData = new FormData(form);
@@ -1,5 +1,6 @@
1
1
  <script lang="ts">
2
2
  import type { ExtendedSemanticVariant } from "../../types/variants.js";
3
+ type AlertVisualVariant = Exclude<ExtendedSemanticVariant, "default">;
3
4
 
4
5
  interface Props {
5
6
  variant?: ExtendedSemanticVariant;
@@ -27,6 +28,10 @@
27
28
  }
28
29
  }
29
30
 
31
+ const visualVariant = $derived<AlertVisualVariant>(
32
+ variant === "default" ? "info" : variant,
33
+ );
34
+
30
35
  let alertClasses = $derived({
31
36
  info: "text-info border border-info",
32
37
  success: "text-success border border-success",
@@ -64,10 +69,10 @@
64
69
 
65
70
  <div
66
71
  class="relative rounded-md p-4 border {alertClasses[
67
- variant
72
+ visualVariant
68
73
  ]} transition-all duration-200 motion-reduce:transition-none {className}"
69
74
  role={alertRole}
70
- aria-live={variant === "success" || variant === "info"
75
+ aria-live={visualVariant === "success" || visualVariant === "info"
71
76
  ? "polite"
72
77
  : "assertive"}
73
78
  aria-atomic="true"
@@ -98,7 +103,7 @@
98
103
 
99
104
  <div class="flex items-start gap-3 {closable ? 'pr-8' : ''}">
100
105
  <div class="shrink-0 mt-0.5">
101
- {@html iconSvg[variant]}
106
+ {@html iconSvg[visualVariant]}
102
107
  </div>
103
108
 
104
109
  <div class="flex-1 min-w-0">