negodesign 0.0.23 → 0.0.25

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 (124) hide show
  1. package/dist/components/core/breadcrumb/breadcrumb-list.svelte +31 -31
  2. package/dist/components/core/button/ButtonBack.svelte +18 -18
  3. package/dist/components/core/button/ButtonLogin.svelte +15 -15
  4. package/dist/components/core/button/ButtonLoginWith.svelte +57 -57
  5. package/dist/components/core/button/ButtonSend.svelte +15 -15
  6. package/dist/components/core/card/highlight/CardHighlight.svelte +67 -44
  7. package/dist/components/core/card/media/01/CardMedia01.svelte +114 -114
  8. package/dist/components/core/card/media/02/CardMedia02.svelte +113 -113
  9. package/dist/components/core/card/media/CardMedia.svelte +17 -17
  10. package/dist/components/core/card/profile/01/CardProfile01.svelte +101 -101
  11. package/dist/components/core/card/profile/02/CardProfile02.svelte +97 -97
  12. package/dist/components/core/card/profile/CardProfile.svelte +17 -17
  13. package/dist/components/core/card/promotion/CardPromotion.svelte +102 -81
  14. package/dist/components/core/card/shared/CardButton.svelte +30 -30
  15. package/dist/components/core/card/shared/CardCart.svelte +36 -32
  16. package/dist/components/core/card/shared/CardCart.svelte.d.ts +1 -0
  17. package/dist/components/core/card/shared/CardDescription.svelte +23 -23
  18. package/dist/components/core/card/shared/CardFavorite.svelte +33 -29
  19. package/dist/components/core/card/shared/CardFavorite.svelte.d.ts +1 -0
  20. package/dist/components/core/card/shared/CardStarRating.svelte +20 -20
  21. package/dist/components/core/card/shared/CardTags.svelte +56 -56
  22. package/dist/components/core/card/shared/CardThumbnailVideo.svelte +169 -169
  23. package/dist/components/core/card/shared/TruncatableText.svelte +55 -55
  24. package/dist/components/core/card/types.d.ts +1 -0
  25. package/dist/components/core/carousel/{shared/ui/SimpleBadgeCarousel.svelte → badge/ui/CarouselBadge.svelte} +80 -80
  26. package/dist/components/core/carousel/badge/ui/CarouselBadge.svelte.d.ts +4 -0
  27. package/dist/components/core/carousel/hero/CarouselHero.svelte +158 -152
  28. package/dist/components/core/carousel/highlights/types.d.ts +9 -0
  29. package/dist/components/core/carousel/highlights/types.js +1 -0
  30. package/dist/components/core/carousel/highlights/ui/CarouselHighlights.svelte +41 -65
  31. package/dist/components/core/carousel/highlights/ui/CarouselHighlights.svelte.d.ts +1 -1
  32. package/dist/components/core/carousel/promotion/types.d.ts +9 -0
  33. package/dist/components/core/carousel/promotion/types.js +1 -0
  34. package/dist/components/core/carousel/promotion/ui/CarouselPromotion.svelte +41 -65
  35. package/dist/components/core/carousel/promotion/ui/CarouselPromotion.svelte.d.ts +1 -1
  36. package/dist/components/core/carousel/shared/ui/CarouselHeader.svelte +50 -0
  37. package/dist/components/core/carousel/shared/ui/CarouselHeader.svelte.d.ts +4 -0
  38. package/dist/components/core/carousel/types.d.ts +11 -26
  39. package/dist/components/core/datatable/ui/DataTableActions.svelte +28 -28
  40. package/dist/components/core/datatable/ui/DataTableCheckbox.svelte +22 -22
  41. package/dist/components/core/datatable/ui/DataTableContent.svelte +59 -59
  42. package/dist/components/core/datatable/ui/DataTableCore.svelte +151 -151
  43. package/dist/components/core/datatable/ui/DataTableDragHandle.svelte +8 -8
  44. package/dist/components/core/datatable/ui/DataTableListFilter.svelte +59 -59
  45. package/dist/components/core/datatable/ui/DataTableListPagination.svelte +35 -35
  46. package/dist/components/core/form/ui/input-base.svelte +81 -81
  47. package/dist/components/core/form/ui/input-email-or-phone.svelte +23 -23
  48. package/dist/components/core/form/ui/input-email.svelte +23 -23
  49. package/dist/components/core/form/ui/input-password-confirm.svelte +23 -23
  50. package/dist/components/core/form/ui/input-password.svelte +23 -23
  51. package/dist/components/core/form/ui/input-phone.svelte +33 -33
  52. package/dist/components/core/form/ui/input-username.svelte +22 -22
  53. package/dist/components/core/hero/SimpleHero.svelte +65 -65
  54. package/dist/components/core/label/LabelOr.svelte +25 -25
  55. package/dist/components/core/link/link-forget-password.svelte +12 -12
  56. package/dist/components/core/link/link-privacy-polity.svelte +12 -12
  57. package/dist/components/core/link/link-terms-of-service.svelte +12 -12
  58. package/dist/components/core/nav/ui/menu-links.svelte +27 -27
  59. package/dist/components/core/nav/ui/mobile/nav-menu-drawer.svelte +85 -85
  60. package/dist/components/core/nav/ui/nav-menu-bottom-sidebar.svelte +33 -33
  61. package/dist/components/core/nav/ui/nav-menu-sidebar.svelte +97 -97
  62. package/dist/components/core/nav/ui/nav-menu-top-bar-sidebar.svelte +103 -103
  63. package/dist/components/core/nav/ui/nav-menu.svelte +106 -106
  64. package/dist/components/core/panel/CarouselSlot.svelte +38 -38
  65. package/dist/components/core/panel/LeftHero.svelte +116 -116
  66. package/dist/components/core/search/SearchInput.svelte +32 -32
  67. package/dist/components/core/search/shared/SearchInputCore.svelte +66 -66
  68. package/dist/components/core/sidebar/MenuBarSidebar.svelte +70 -70
  69. package/dist/components/core/tabs/ui/tab-underline.svelte +43 -43
  70. package/dist/components/pages/admin/01/ui/AdminContent.svelte +14 -14
  71. package/dist/components/pages/admin/01/ui/AdminPanel.svelte +46 -46
  72. package/dist/components/pages/security/login/01/ui/FormRegister.svelte +28 -28
  73. package/dist/components/pages/security/login/01/ui/LoginCard.svelte +107 -107
  74. package/dist/components/pages/security/login/PageLogin.svelte +22 -22
  75. package/dist/components/ui/badge/badge.svelte +49 -49
  76. package/dist/components/ui/button/button.svelte +82 -82
  77. package/dist/components/ui/chart/chart-container.svelte +80 -80
  78. package/dist/components/ui/chart/chart-style.svelte +37 -37
  79. package/dist/components/ui/chart/chart-tooltip.svelte +184 -184
  80. package/dist/components/ui/checkbox/checkbox.svelte +40 -40
  81. package/dist/components/ui/data-table/flex-render.svelte +40 -40
  82. package/dist/components/ui/drawer/drawer-close.svelte +7 -7
  83. package/dist/components/ui/drawer/drawer-content.svelte +33 -33
  84. package/dist/components/ui/drawer/drawer-description.svelte +17 -17
  85. package/dist/components/ui/drawer/drawer-footer.svelte +20 -20
  86. package/dist/components/ui/drawer/drawer-header.svelte +20 -20
  87. package/dist/components/ui/drawer/drawer-nested.svelte +12 -12
  88. package/dist/components/ui/drawer/drawer-overlay.svelte +17 -17
  89. package/dist/components/ui/drawer/drawer-portal.svelte +7 -7
  90. package/dist/components/ui/drawer/drawer-title.svelte +17 -17
  91. package/dist/components/ui/drawer/drawer-trigger.svelte +7 -7
  92. package/dist/components/ui/drawer/drawer.svelte +12 -12
  93. package/dist/components/ui/select/select-content.svelte +45 -45
  94. package/dist/components/ui/select/select-group-heading.svelte +21 -21
  95. package/dist/components/ui/select/select-group.svelte +17 -17
  96. package/dist/components/ui/select/select-item.svelte +41 -41
  97. package/dist/components/ui/select/select-label.svelte +20 -20
  98. package/dist/components/ui/select/select-portal.svelte +7 -7
  99. package/dist/components/ui/select/select-scroll-down-button.svelte +21 -21
  100. package/dist/components/ui/select/select-scroll-up-button.svelte +21 -21
  101. package/dist/components/ui/select/select-separator.svelte +18 -18
  102. package/dist/components/ui/select/select-trigger.svelte +30 -30
  103. package/dist/components/ui/select/select.svelte +11 -11
  104. package/dist/components/ui/sidebar/sidebar-menu-sub-button.svelte +39 -39
  105. package/dist/components/ui/star-rating/star-rating-star.svelte +41 -41
  106. package/dist/components/ui/star-rating/star-rating.svelte +20 -20
  107. package/dist/components/ui/table/table-body.svelte +15 -15
  108. package/dist/components/ui/table/table-caption.svelte +20 -20
  109. package/dist/components/ui/table/table-cell.svelte +15 -15
  110. package/dist/components/ui/table/table-footer.svelte +20 -20
  111. package/dist/components/ui/table/table-head.svelte +15 -15
  112. package/dist/components/ui/table/table-header.svelte +20 -20
  113. package/dist/components/ui/table/table-row.svelte +15 -15
  114. package/dist/components/ui/table/table.svelte +17 -17
  115. package/dist/components/ui/tabs/tabs-content.svelte +17 -17
  116. package/dist/components/ui/tabs/tabs-list.svelte +40 -40
  117. package/dist/components/ui/tabs/tabs-trigger.svelte +23 -23
  118. package/dist/components/ui/tabs/tabs.svelte +19 -19
  119. package/dist/globals.css +6 -12
  120. package/dist/index.d.ts +2 -2
  121. package/dist/index.js +2 -2
  122. package/dist/styles/globals.css +149 -149
  123. package/package.json +113 -113
  124. package/dist/components/core/carousel/shared/ui/SimpleBadgeCarousel.svelte.d.ts +0 -4
@@ -1,38 +1,38 @@
1
- <script lang="ts">
2
- import * as Carousel from "../../ui/carousel/index.js";
3
- import type { Snippet } from "svelte";
4
-
5
- type Props = {
6
- isBorderBottom?: boolean;
7
- isButtonPreviousAndNext?: boolean;
8
- buttonPreviousAndNextClass?: string;
9
- containerClass?: string;
10
- children: Snippet;
11
- };
12
-
13
- const {
14
- isBorderBottom = true,
15
- isButtonPreviousAndNext = true,
16
- buttonPreviousAndNextClass = "",
17
- containerClass = "",
18
- children,
19
- }: Props = $props();
20
- </script>
21
-
22
- <div
23
- class={`relative py-3 px-2 ${isBorderBottom ? "border-b" : ""} ${containerClass}`}
24
- >
25
- <Carousel.Root>
26
- <Carousel.Content class="ml-10">
27
- {@render children()}
28
- </Carousel.Content>
29
- {#if isButtonPreviousAndNext}
30
- <Carousel.Previous
31
- class={`absolute top-1/2 -translate-y-1/2 left-1 mt-0.5 ${buttonPreviousAndNextClass}`}
32
- />
33
- <Carousel.Next
34
- class={`absolute top-1/2 -translate-y-1/2 right-1 mt-0.5 ${buttonPreviousAndNextClass}`}
35
- />
36
- {/if}
37
- </Carousel.Root>
38
- </div>
1
+ <script lang="ts">
2
+ import * as Carousel from "../../ui/carousel/index.js";
3
+ import type { Snippet } from "svelte";
4
+
5
+ type Props = {
6
+ isBorderBottom?: boolean;
7
+ isButtonPreviousAndNext?: boolean;
8
+ buttonPreviousAndNextClass?: string;
9
+ containerClass?: string;
10
+ children: Snippet;
11
+ };
12
+
13
+ const {
14
+ isBorderBottom = true,
15
+ isButtonPreviousAndNext = true,
16
+ buttonPreviousAndNextClass = "",
17
+ containerClass = "",
18
+ children,
19
+ }: Props = $props();
20
+ </script>
21
+
22
+ <div
23
+ class={`relative py-3 px-2 ${isBorderBottom ? "border-b" : ""} ${containerClass}`}
24
+ >
25
+ <Carousel.Root>
26
+ <Carousel.Content class="ml-10">
27
+ {@render children()}
28
+ </Carousel.Content>
29
+ {#if isButtonPreviousAndNext}
30
+ <Carousel.Previous
31
+ class={`absolute top-1/2 -translate-y-1/2 left-1 mt-0.5 ${buttonPreviousAndNextClass}`}
32
+ />
33
+ <Carousel.Next
34
+ class={`absolute top-1/2 -translate-y-1/2 right-1 mt-0.5 ${buttonPreviousAndNextClass}`}
35
+ />
36
+ {/if}
37
+ </Carousel.Root>
38
+ </div>
@@ -1,117 +1,117 @@
1
- <script lang="ts">
2
- import { HugeiconsIcon } from "@hugeicons/svelte";
3
- import { ArrowRight01Icon } from "@hugeicons/core-free-icons";
1
+ <script lang="ts">
2
+ import { HugeiconsIcon } from "@hugeicons/svelte";
3
+ import { ArrowRight01Icon } from "@hugeicons/core-free-icons";
4
4
  import type { LoginCarouselProps } from "../../pages/security/login/types";
5
- import type { Snippet } from "svelte";
6
- import Button from "../../ui/button/button.svelte";
7
- import { t } from "../../../i18n";
8
- import Logo from "../../../assets/login-01-admin.webp";
9
-
10
- type Props = {
11
- title?: string | Snippet;
12
- variant?: "NUMBER" | "DOT";
13
- autoPlayInterval?: number;
14
- };
15
-
16
- let {
17
- title,
18
- items = [],
19
- variant = "DOT",
20
- autoPlayInterval = 5000,
21
- }: Props & LoginCarouselProps = $props();
22
-
23
- let currentIndex = $state(0);
24
- let currentItem = $derived(items[currentIndex] ?? items[0]);
25
-
26
- function goTo(index: number) {
27
- currentIndex = index;
28
- }
29
-
30
- function next() {
31
- if (items.length === 0) return;
32
- currentIndex = (currentIndex + 1) % items.length;
33
- }
34
-
35
- $effect(() => {
36
- if (items.length <= 1) return;
37
- const timer = setInterval(next, autoPlayInterval);
38
- return () => clearInterval(timer);
39
- });
40
- </script>
41
-
42
- <div
43
- class="relative flex flex-col justify-between overflow-hidden h-screen p-8 bg-gradient-left text-white"
44
- >
45
- <div class="flex items-center gap-2">
46
- <div class="font-bold text-xl tracking-wider flex items-center gap-2">
47
- {#if typeof title === "function"}
48
- {@render title()}
49
- {:else}
50
- {title || $t("label.welcome")}
51
- {/if}
52
- </div>
53
- </div>
54
-
55
- <section class="flex flex-col gap-5">
56
- <div class="my-auto max-w-sm md:max-w-md lg:max-w-100">
57
- {#if currentItem}
58
- {#key currentIndex}
59
- <div
60
- class="text-xl md:text-2xl font-bold tracking-tight mb-4 leading-tight animate-in fade-in duration-300"
61
- >
62
- {currentItem.title}
63
- </div>
64
- <p
65
- class=" text-sm mb-6 leading-relaxed animate-in fade-in duration-300"
66
- >
67
- {currentItem.description}
68
- </p>
69
- {/key}
70
- <Button
71
- variant="outline"
72
- class="inline-flex items-center gap-2 text-sm font-semibold bg-primary"
73
- >
74
- {currentItem.buttonText}
75
- <HugeiconsIcon icon={ArrowRight01Icon} size={16} />
76
- </Button>
77
- {/if}
78
- </div>
79
-
80
- <div class="flex items-center gap-2 mb-2">
81
- {#each items as it, i (it.title)}
82
- <button
83
- type="button"
84
- onclick={() => goTo(i)}
85
- aria-label={`Ir para o item ${i + 1}`}
86
- aria-current={currentIndex === i}
87
- class="transition-all duration-300 focus:outline-none flex items-center justify-center {currentIndex ===
88
- i
89
- ? 'opacity-100 scale-110'
90
- : 'opacity-50 hover:opacity-75'}"
91
- >
92
- {#if variant === "NUMBER"}
93
- <span
94
- class="w-6 h-6 text-xs font-semibold rounded-full text-primary flex items-center justify-center"
95
- >
96
- {i + 1}
97
- </span>
98
- {:else}
99
- <span class="w-2 h-2 rounded-full bg-white"></span>
100
- {/if}
101
- </button>
102
- {/each}
103
- </div>
104
- </section>
105
-
106
- <aside
107
- class="hidden z-50 lg:block lg:absolute lg:right-0 lg:-bottom-3 lg:w-105 lg:h-105"
108
- >
109
- <img
110
- src={Logo}
111
- alt=""
112
- class="shadow rounded-tl-lg rounded-bl-lg lg:w-105 lg:h-105"
113
- />
114
- </aside>
115
- </div>
116
-
117
- <aside class="absolute grid-pattern p-0 top-0 h-screen w-8/12"></aside>
5
+ import type { Snippet } from "svelte";
6
+ import Button from "../../ui/button/button.svelte";
7
+ import { t } from "../../../i18n";
8
+ import Logo from "../../../assets/login-01-admin.webp";
9
+
10
+ type Props = {
11
+ title?: string | Snippet;
12
+ variant?: "NUMBER" | "DOT";
13
+ autoPlayInterval?: number;
14
+ };
15
+
16
+ let {
17
+ title,
18
+ items = [],
19
+ variant = "DOT",
20
+ autoPlayInterval = 5000,
21
+ }: Props & LoginCarouselProps = $props();
22
+
23
+ let currentIndex = $state(0);
24
+ let currentItem = $derived(items[currentIndex] ?? items[0]);
25
+
26
+ function goTo(index: number) {
27
+ currentIndex = index;
28
+ }
29
+
30
+ function next() {
31
+ if (items.length === 0) return;
32
+ currentIndex = (currentIndex + 1) % items.length;
33
+ }
34
+
35
+ $effect(() => {
36
+ if (items.length <= 1) return;
37
+ const timer = setInterval(next, autoPlayInterval);
38
+ return () => clearInterval(timer);
39
+ });
40
+ </script>
41
+
42
+ <div
43
+ class="relative flex flex-col justify-between overflow-hidden h-screen p-8 bg-gradient-left text-white"
44
+ >
45
+ <div class="flex items-center gap-2">
46
+ <div class="font-bold text-xl tracking-wider flex items-center gap-2">
47
+ {#if typeof title === "function"}
48
+ {@render title()}
49
+ {:else}
50
+ {title || $t("label.welcome")}
51
+ {/if}
52
+ </div>
53
+ </div>
54
+
55
+ <section class="flex flex-col gap-5">
56
+ <div class="my-auto max-w-sm md:max-w-md lg:max-w-100">
57
+ {#if currentItem}
58
+ {#key currentIndex}
59
+ <div
60
+ class="text-xl md:text-2xl font-bold tracking-tight mb-4 leading-tight animate-in fade-in duration-300"
61
+ >
62
+ {currentItem.title}
63
+ </div>
64
+ <p
65
+ class=" text-sm mb-6 leading-relaxed animate-in fade-in duration-300"
66
+ >
67
+ {currentItem.description}
68
+ </p>
69
+ {/key}
70
+ <Button
71
+ variant="outline"
72
+ class="inline-flex items-center gap-2 text-sm font-semibold bg-primary"
73
+ >
74
+ {currentItem.buttonText}
75
+ <HugeiconsIcon icon={ArrowRight01Icon} size={16} />
76
+ </Button>
77
+ {/if}
78
+ </div>
79
+
80
+ <div class="flex items-center gap-2 mb-2">
81
+ {#each items as it, i (it.title)}
82
+ <button
83
+ type="button"
84
+ onclick={() => goTo(i)}
85
+ aria-label={`Ir para o item ${i + 1}`}
86
+ aria-current={currentIndex === i}
87
+ class="transition-all duration-300 focus:outline-none flex items-center justify-center {currentIndex ===
88
+ i
89
+ ? 'opacity-100 scale-110'
90
+ : 'opacity-50 hover:opacity-75'}"
91
+ >
92
+ {#if variant === "NUMBER"}
93
+ <span
94
+ class="w-6 h-6 text-xs font-semibold rounded-full text-primary flex items-center justify-center"
95
+ >
96
+ {i + 1}
97
+ </span>
98
+ {:else}
99
+ <span class="w-2 h-2 rounded-full bg-white"></span>
100
+ {/if}
101
+ </button>
102
+ {/each}
103
+ </div>
104
+ </section>
105
+
106
+ <aside
107
+ class="hidden z-50 lg:block lg:absolute lg:right-0 lg:-bottom-3 lg:w-105 lg:h-105"
108
+ >
109
+ <img
110
+ src={Logo}
111
+ alt=""
112
+ class="shadow rounded-tl-lg rounded-bl-lg lg:w-105 lg:h-105"
113
+ />
114
+ </aside>
115
+ </div>
116
+
117
+ <aside class="absolute grid-pattern p-0 top-0 h-screen w-8/12"></aside>
@@ -1,32 +1,32 @@
1
- <script lang="ts" module>
2
- /**
3
- * Main Privacy Policy / Terms of Use component.
4
- * Allows choosing between two layout variants:
5
- * - **1**: Three-column layout with sidebar, content, and TOC (scroll-spy).
6
- * - **2**: Simple layout with colored hero and centered content.
7
- *
8
- * @component
9
- * @example
10
- * ```svelte
11
- * <!-- Variant 1 (default) — docs layout with sidebar -->
12
- * <PrivacyPolicyOrTermsOfUse variant={1} data={pageData} />
13
- *
14
- * <!-- Variant 2 — layout with hero -->
15
- * <PrivacyPolicyOrTermsOfUse variant={2} data={pageData} />
16
- * ```
17
- */
18
- </script>
19
-
20
- <script lang="ts">
21
- import Search01 from "./01/Search01.svelte";
22
- import Search02 from "./02/Search02.svelte";
23
- import type { SearchInputProps } from "./types";
24
-
25
- let { variant = 1, ...restProps }: SearchInputProps = $props();
26
- </script>
27
-
28
- {#if variant === 2}
29
- <Search02 {...restProps} />
30
- {:else}
31
- <Search01 {...restProps} />
32
- {/if}
1
+ <script lang="ts" module>
2
+ /**
3
+ * Main Privacy Policy / Terms of Use component.
4
+ * Allows choosing between two layout variants:
5
+ * - **1**: Three-column layout with sidebar, content, and TOC (scroll-spy).
6
+ * - **2**: Simple layout with colored hero and centered content.
7
+ *
8
+ * @component
9
+ * @example
10
+ * ```svelte
11
+ * <!-- Variant 1 (default) — docs layout with sidebar -->
12
+ * <PrivacyPolicyOrTermsOfUse variant={1} data={pageData} />
13
+ *
14
+ * <!-- Variant 2 — layout with hero -->
15
+ * <PrivacyPolicyOrTermsOfUse variant={2} data={pageData} />
16
+ * ```
17
+ */
18
+ </script>
19
+
20
+ <script lang="ts">
21
+ import Search01 from "./01/Search01.svelte";
22
+ import Search02 from "./02/Search02.svelte";
23
+ import type { SearchInputProps } from "./types";
24
+
25
+ let { variant = 1, ...restProps }: SearchInputProps = $props();
26
+ </script>
27
+
28
+ {#if variant === 2}
29
+ <Search02 {...restProps} />
30
+ {:else}
31
+ <Search01 {...restProps} />
32
+ {/if}
@@ -1,66 +1,66 @@
1
- <script lang="ts" module>
2
- /**
3
- * Reusable search input component used by Search01 and Search02.
4
- * Renders a text input with a search icon and submit button.
5
- * @component
6
- */
7
- </script>
8
-
9
- <script lang="ts">
10
- import { HugeiconsIcon } from "@hugeicons/svelte";
11
- import { Search01Icon } from "@hugeicons/core-free-icons";
12
- import Button from "../../../ui/button/button.svelte";
13
- import { Separator } from "../../../ui/separator/index";
14
- import { t } from "../../../../i18n";
15
- import type { SearchInputProps } from "../types";
16
-
17
- let { onSubmit, placeholder, variant = 1, buttonClass, inputClass, iconClass }: SearchInputProps = $props();
18
-
19
- let value = $state("");
20
-
21
- function handleKeydown(e: KeyboardEvent) {
22
- if (e.key === "Enter") onSubmit?.(value);
23
- }
24
- </script>
25
-
26
- <div class="container relative">
27
- <div
28
- class="mx-auto md:w-11/12 z-10 {variant === 2
29
- ? 'border-b'
30
- : 'border bg-input rounded-lg shadow'} m-auto"
31
- >
32
- <div class="flex items-center gap-2 py-1 px-2 w-full md:min-h-15">
33
- <div class="items-center gap-2 hidden md:flex">
34
- <HugeiconsIcon
35
- icon={Search01Icon}
36
- size={20}
37
- color="currentColor"
38
- strokeWidth={1.5}
39
- class={iconClass}
40
- />
41
- </div>
42
- <input
43
- type="search"
44
- bind:value
45
- onkeydown={handleKeydown}
46
- class="text-sm w-full bg-transparent border-none outline-none focus:outline-none focus:ring-0 focus:border-transparent {inputClass}"
47
- placeholder={placeholder || $t("label.search.placeholder")}
48
- />
49
- <div class="flex gap-1">
50
- <Separator class="w-full" orientation="vertical" />
51
- <Button
52
- onclick={() => onSubmit?.(value)}
53
- class={`flex justify-center items-center cursor-pointer ${buttonClass}`}
54
- >
55
- <HugeiconsIcon
56
- icon={Search01Icon}
57
- size={15}
58
- color="currentColor"
59
- strokeWidth={2}
60
- />
61
- <span class="hidden md:block">{$t("label.search")}</span>
62
- </Button>
63
- </div>
64
- </div>
65
- </div>
66
- </div>
1
+ <script lang="ts" module>
2
+ /**
3
+ * Reusable search input component used by Search01 and Search02.
4
+ * Renders a text input with a search icon and submit button.
5
+ * @component
6
+ */
7
+ </script>
8
+
9
+ <script lang="ts">
10
+ import { HugeiconsIcon } from "@hugeicons/svelte";
11
+ import { Search01Icon } from "@hugeicons/core-free-icons";
12
+ import Button from "../../../ui/button/button.svelte";
13
+ import { Separator } from "../../../ui/separator/index";
14
+ import { t } from "../../../../i18n";
15
+ import type { SearchInputProps } from "../types";
16
+
17
+ let { onSubmit, placeholder, variant = 1, buttonClass, inputClass, iconClass }: SearchInputProps = $props();
18
+
19
+ let value = $state("");
20
+
21
+ function handleKeydown(e: KeyboardEvent) {
22
+ if (e.key === "Enter") onSubmit?.(value);
23
+ }
24
+ </script>
25
+
26
+ <div class="container relative">
27
+ <div
28
+ class="mx-auto md:w-11/12 z-10 {variant === 2
29
+ ? 'border-b'
30
+ : 'border bg-input rounded-lg shadow'} m-auto"
31
+ >
32
+ <div class="flex items-center gap-2 py-1 px-2 w-full md:min-h-15">
33
+ <div class="items-center gap-2 hidden md:flex">
34
+ <HugeiconsIcon
35
+ icon={Search01Icon}
36
+ size={20}
37
+ color="currentColor"
38
+ strokeWidth={1.5}
39
+ class={iconClass}
40
+ />
41
+ </div>
42
+ <input
43
+ type="search"
44
+ bind:value
45
+ onkeydown={handleKeydown}
46
+ class="text-sm w-full bg-transparent border-none outline-none focus:outline-none focus:ring-0 focus:border-transparent {inputClass}"
47
+ placeholder={placeholder || $t("label.search.placeholder")}
48
+ />
49
+ <div class="flex gap-1">
50
+ <Separator class="w-full" orientation="vertical" />
51
+ <Button
52
+ onclick={() => onSubmit?.(value)}
53
+ class={`flex justify-center items-center cursor-pointer ${buttonClass}`}
54
+ >
55
+ <HugeiconsIcon
56
+ icon={Search01Icon}
57
+ size={15}
58
+ color="currentColor"
59
+ strokeWidth={2}
60
+ />
61
+ <span class="hidden md:block">{$t("label.search")}</span>
62
+ </Button>
63
+ </div>
64
+ </div>
65
+ </div>
66
+ </div>
@@ -1,70 +1,70 @@
1
- <script lang="ts">
2
- import * as Sidebar from "../../ui/sidebar/index.js";
3
- import type { ComponentProps } from "svelte";
4
-
5
- import type { NavUserSidebarProps } from "../nav/data/nav-user-sidebar";
6
- import type {
7
- NavMenuItem,
8
- NavMenuSidebarProps,
9
- } from "../nav/data/nav-menu-sidebar";
10
- import type { Snippet } from "svelte";
11
- import NavMenuTopBarSidebar from "../nav/ui/nav-menu-top-bar-sidebar.svelte";
12
- import NavMenuBottomSidebar from "../nav/ui/nav-menu-bottom-sidebar.svelte";
13
- import NavMenuBarSidebar from "../nav/ui/nav-menu-sidebar.svelte";
14
- import NavUserSidebar from "../nav/ui/nav-user-sidebar.svelte";
15
- import { t } from "../../../i18n";
16
-
17
- /**
18
- * Navigation sidebar with menus, user, and buttons.
19
- * @property {NavMenuSidebar[]} menusButtons - Footer buttons (e.g., logout)
20
- * @property {NavMenuItem[]} menus - Main navigation items
21
- * @property {NavUserSidebarItem} user - Logged-in user data
22
- * @property {Snippet} footer - Snippet customizado do footer
23
- * @property {Snippet} header - Snippet customizado do header
24
- */
25
- type Props = {
26
- menusButtons?: NavMenuSidebarProps[];
27
- menus: NavMenuItem[];
28
- user: NavUserSidebarProps;
29
- footer?: Snippet;
30
- header?: Snippet;
31
- };
32
-
33
- let {
34
- ref = $bindable(null),
35
- collapsible = "icon",
36
- menusButtons,
37
- menus,
38
- user,
39
- footer,
40
- header,
41
- ...restProps
42
- }: ComponentProps<typeof Sidebar.Root> & Props = $props();
43
- </script>
44
-
45
- <Sidebar.Root bind:ref {collapsible} {...restProps}>
46
- <Sidebar.Header>
47
- {#if header}
48
- {@render header?.()}
49
- {:else}
50
- <NavMenuTopBarSidebar
51
- content={{
52
- title: $t("label.panel"),
53
- subtitle: $t("label.administrative"),
54
- }}
55
- />
56
- {/if}
57
- </Sidebar.Header>
58
- <Sidebar.Content>
59
- <NavMenuBarSidebar items={menus} />
60
- </Sidebar.Content>
61
- <Sidebar.Footer>
62
- {#if footer}
63
- {@render footer?.()}
64
- {:else if menusButtons && menusButtons.length > 0}
65
- <NavMenuBottomSidebar items={menusButtons} class="mt-auto" />
66
- {/if}
67
- <NavUserSidebar {user} />
68
- </Sidebar.Footer>
69
- <Sidebar.Rail />
70
- </Sidebar.Root>
1
+ <script lang="ts">
2
+ import * as Sidebar from "../../ui/sidebar/index.js";
3
+ import type { ComponentProps } from "svelte";
4
+
5
+ import type { NavUserSidebarProps } from "../nav/data/nav-user-sidebar";
6
+ import type {
7
+ NavMenuItem,
8
+ NavMenuSidebarProps,
9
+ } from "../nav/data/nav-menu-sidebar";
10
+ import type { Snippet } from "svelte";
11
+ import NavMenuTopBarSidebar from "../nav/ui/nav-menu-top-bar-sidebar.svelte";
12
+ import NavMenuBottomSidebar from "../nav/ui/nav-menu-bottom-sidebar.svelte";
13
+ import NavMenuBarSidebar from "../nav/ui/nav-menu-sidebar.svelte";
14
+ import NavUserSidebar from "../nav/ui/nav-user-sidebar.svelte";
15
+ import { t } from "../../../i18n";
16
+
17
+ /**
18
+ * Navigation sidebar with menus, user, and buttons.
19
+ * @property {NavMenuSidebar[]} menusButtons - Footer buttons (e.g., logout)
20
+ * @property {NavMenuItem[]} menus - Main navigation items
21
+ * @property {NavUserSidebarItem} user - Logged-in user data
22
+ * @property {Snippet} footer - Snippet customizado do footer
23
+ * @property {Snippet} header - Snippet customizado do header
24
+ */
25
+ type Props = {
26
+ menusButtons?: NavMenuSidebarProps[];
27
+ menus: NavMenuItem[];
28
+ user: NavUserSidebarProps;
29
+ footer?: Snippet;
30
+ header?: Snippet;
31
+ };
32
+
33
+ let {
34
+ ref = $bindable(null),
35
+ collapsible = "icon",
36
+ menusButtons,
37
+ menus,
38
+ user,
39
+ footer,
40
+ header,
41
+ ...restProps
42
+ }: ComponentProps<typeof Sidebar.Root> & Props = $props();
43
+ </script>
44
+
45
+ <Sidebar.Root bind:ref {collapsible} {...restProps}>
46
+ <Sidebar.Header>
47
+ {#if header}
48
+ {@render header?.()}
49
+ {:else}
50
+ <NavMenuTopBarSidebar
51
+ content={{
52
+ title: $t("label.panel"),
53
+ subtitle: $t("label.administrative"),
54
+ }}
55
+ />
56
+ {/if}
57
+ </Sidebar.Header>
58
+ <Sidebar.Content>
59
+ <NavMenuBarSidebar items={menus} />
60
+ </Sidebar.Content>
61
+ <Sidebar.Footer>
62
+ {#if footer}
63
+ {@render footer?.()}
64
+ {:else if menusButtons && menusButtons.length > 0}
65
+ <NavMenuBottomSidebar items={menusButtons} class="mt-auto" />
66
+ {/if}
67
+ <NavUserSidebar {user} />
68
+ </Sidebar.Footer>
69
+ <Sidebar.Rail />
70
+ </Sidebar.Root>