negodesign 0.0.55 → 0.0.57

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 (216) hide show
  1. package/dist/components/core/banner/AdCardBanner.svelte +74 -74
  2. package/dist/components/core/banner/CtaCardBanner.svelte +118 -118
  3. package/dist/components/core/breadcrumb/breadcrumb-list.svelte +31 -31
  4. package/dist/components/core/button/ButtonBack.svelte +18 -18
  5. package/dist/components/core/button/ButtonLogin.svelte +15 -15
  6. package/dist/components/core/button/ButtonLoginWith.svelte +57 -57
  7. package/dist/components/core/button/ButtonSend.svelte +15 -15
  8. package/dist/components/core/card/highlight/01/CardHighlight01.svelte +103 -103
  9. package/dist/components/core/card/highlight/02/CardHighlight02.svelte +99 -99
  10. package/dist/components/core/card/highlight/CardHighlight.svelte +22 -22
  11. package/dist/components/core/card/media/01/CardMedia01.svelte +133 -133
  12. package/dist/components/core/card/media/02/CardMedia02.svelte +127 -127
  13. package/dist/components/core/card/media/CardMedia.svelte +18 -18
  14. package/dist/components/core/card/product/01/CardProduct01.svelte +136 -136
  15. package/dist/components/core/card/product/02/CardProduct02.svelte +124 -124
  16. package/dist/components/core/card/product/CardProduct.svelte +22 -22
  17. package/dist/components/core/card/profile/01/CardProfile01.svelte +134 -134
  18. package/dist/components/core/card/profile/02/CardProfile02.svelte +132 -132
  19. package/dist/components/core/card/profile/CardProfile.svelte +18 -18
  20. package/dist/components/core/card/promotion/CardPromotion.svelte +139 -139
  21. package/dist/components/core/card/promotion/CardPromotionPrice.svelte +32 -32
  22. package/dist/components/core/card/shared/CardButton.svelte +42 -42
  23. package/dist/components/core/card/shared/CardCart.svelte +36 -36
  24. package/dist/components/core/card/shared/CardDescription.svelte +41 -41
  25. package/dist/components/core/card/shared/CardFavorite.svelte +33 -33
  26. package/dist/components/core/card/shared/CardLogo.svelte +19 -19
  27. package/dist/components/core/card/shared/CardPhoneOrWhatsapp.svelte +45 -45
  28. package/dist/components/core/card/shared/CardStarRating.svelte +24 -24
  29. package/dist/components/core/card/shared/CardTags.svelte +95 -95
  30. package/dist/components/core/card/shared/CardThumbnailVideo.svelte +232 -232
  31. package/dist/components/core/card/shared/CardTitlePrice.svelte +24 -24
  32. package/dist/components/core/card/shared/TruncatableText.svelte +49 -49
  33. package/dist/components/core/card/types.d.ts +4 -0
  34. package/dist/components/core/carousel/badge/type.d.ts +27 -0
  35. package/dist/components/core/carousel/badge/ui/CarouselBadge.svelte +109 -109
  36. package/dist/components/core/carousel/grid/media/types.d.ts +3 -0
  37. package/dist/components/core/carousel/grid/media/ui/CarouselGridMedia.svelte +2 -1
  38. package/dist/components/core/carousel/grid/product/types.d.ts +8 -0
  39. package/dist/components/core/carousel/grid/product/ui/CarouselGridProduct.svelte +14 -4
  40. package/dist/components/core/carousel/grid/profile/ui/CarouselGridProfile.svelte +1 -1
  41. package/dist/components/core/carousel/grid/promotion/ui/CarouselGridPromotion.svelte +1 -1
  42. package/dist/components/core/carousel/grid/shared/ui/CarouselGridSlot.svelte +8 -3
  43. package/dist/components/core/carousel/grid/shared/ui/CarouselGridSlot.svelte.d.ts +2 -1
  44. package/dist/components/core/carousel/hero/types.d.ts +30 -0
  45. package/dist/components/core/carousel/hero/{CarouselHero.svelte → ui/CarouselHero.svelte} +163 -161
  46. package/dist/components/core/carousel/shared/ui/CarouselHeader.svelte +60 -60
  47. package/dist/components/core/carousel/types.d.ts +2 -56
  48. package/dist/components/core/datatable/ui/DataTableActions.svelte +28 -28
  49. package/dist/components/core/datatable/ui/DataTableCheckbox.svelte +22 -22
  50. package/dist/components/core/datatable/ui/DataTableContent.svelte +59 -59
  51. package/dist/components/core/datatable/ui/DataTableCore.svelte +151 -151
  52. package/dist/components/core/datatable/ui/DataTableDragHandle.svelte +8 -8
  53. package/dist/components/core/datatable/ui/DataTableListFilter.svelte +59 -59
  54. package/dist/components/core/datatable/ui/DataTableListPagination.svelte +35 -35
  55. package/dist/components/core/footer/ui/Footer.svelte +18 -18
  56. package/dist/components/core/form/ui/input-base.svelte +81 -81
  57. package/dist/components/core/form/ui/input-email-or-phone.svelte +23 -23
  58. package/dist/components/core/form/ui/input-email.svelte +23 -23
  59. package/dist/components/core/form/ui/input-password-confirm.svelte +23 -23
  60. package/dist/components/core/form/ui/input-password.svelte +23 -23
  61. package/dist/components/core/form/ui/input-phone.svelte +33 -33
  62. package/dist/components/core/form/ui/input-username.svelte +22 -22
  63. package/dist/components/core/grid/data/types.d.ts +16 -0
  64. package/dist/components/core/grid/ui/01/Grid01.svelte +27 -0
  65. package/dist/components/core/grid/ui/01/Grid01.svelte.d.ts +4 -0
  66. package/dist/components/core/grid/ui/02/Grid02.svelte +27 -0
  67. package/dist/components/core/grid/ui/02/Grid02.svelte.d.ts +4 -0
  68. package/dist/components/core/grid/ui/PanelGrid.svelte +27 -0
  69. package/dist/components/core/grid/ui/PanelGrid.svelte.d.ts +4 -0
  70. package/dist/components/core/grid/ui/SimpleGrid.svelte +35 -0
  71. package/dist/components/core/grid/ui/SimpleGrid.svelte.d.ts +4 -0
  72. package/dist/components/core/grid/ui/shared/DescriptionGrid.svelte +17 -0
  73. package/dist/components/core/grid/ui/shared/DescriptionGrid.svelte.d.ts +7 -0
  74. package/dist/components/core/grid/ui/shared/IconRenderGrid.svelte +16 -0
  75. package/dist/components/core/grid/ui/shared/IconRenderGrid.svelte.d.ts +7 -0
  76. package/dist/components/core/grid/ui/shared/TitleGrid.svelte +11 -0
  77. package/dist/components/core/grid/ui/shared/TitleGrid.svelte.d.ts +7 -0
  78. package/dist/components/core/hero/SimpleHero.svelte +65 -65
  79. package/dist/components/core/label/LabelOr.svelte +25 -25
  80. package/dist/components/core/link/link-forget-password.svelte +12 -12
  81. package/dist/components/core/link/link-privacy-polity.svelte +12 -12
  82. package/dist/components/core/link/link-terms-of-service.svelte +12 -12
  83. package/dist/components/core/nav/data/complex-menu-utils.d.ts +7 -0
  84. package/dist/components/core/nav/data/complex-menu-utils.js +15 -0
  85. package/dist/components/core/nav/data/nav-menu.d.ts +21 -7
  86. package/dist/components/core/nav/{ui/shared → data}/types.d.ts +15 -2
  87. package/dist/components/core/nav/ui/ComplexMenu.svelte +36 -0
  88. package/dist/components/core/nav/ui/ComplexMenu.svelte.d.ts +4 -0
  89. package/dist/components/core/nav/ui/Menu.svelte +70 -66
  90. package/dist/components/core/nav/ui/Menu.svelte.d.ts +1 -1
  91. package/dist/components/core/nav/ui/SimpleMenu.svelte +14 -0
  92. package/dist/components/core/nav/ui/SimpleMenu.svelte.d.ts +4 -0
  93. package/dist/components/core/nav/ui/mobile/ComplexMenuMobile.svelte +98 -0
  94. package/dist/components/core/nav/ui/mobile/ComplexMenuMobile.svelte.d.ts +4 -0
  95. package/dist/components/core/nav/ui/mobile/MenuMobile.svelte +54 -0
  96. package/dist/components/core/nav/ui/mobile/MenuMobile.svelte.d.ts +11 -0
  97. package/dist/components/core/nav/ui/mobile/SimpleMenuMobile.svelte +42 -0
  98. package/dist/components/core/nav/ui/mobile/{nav-menu-drawer.svelte.d.ts → SimpleMenuMobile.svelte.d.ts} +3 -3
  99. package/dist/components/core/nav/ui/shared/CollapsibleNavMenu.svelte +24 -0
  100. package/dist/components/core/nav/ui/shared/CollapsibleNavMenu.svelte.d.ts +8 -0
  101. package/dist/components/core/nav/ui/shared/MenuButton.svelte +51 -0
  102. package/dist/components/core/nav/ui/shared/MenuButton.svelte.d.ts +4 -0
  103. package/dist/components/core/nav/ui/shared/MenuLinks.svelte +40 -40
  104. package/dist/components/core/nav/ui/shared/MenuListItem.svelte +48 -48
  105. package/dist/components/core/nav/ui/shared/MenuListItem.svelte.d.ts +1 -1
  106. package/dist/components/core/nav/ui/shared/MenuLogo.svelte +13 -0
  107. package/dist/components/core/nav/ui/shared/MenuLogo.svelte.d.ts +4 -0
  108. package/dist/components/core/nav/ui/shared/NavMenuItem.svelte +28 -0
  109. package/dist/components/core/nav/ui/shared/NavMenuItem.svelte.d.ts +4 -0
  110. package/dist/components/core/nav/ui/shared/dropdown/DropdownMenuListItem.svelte +40 -0
  111. package/dist/components/core/nav/ui/shared/dropdown/DropdownMenuListItem.svelte.d.ts +4 -0
  112. package/dist/components/core/nav/ui/shared/dropdown/DropdownNavigationMenuItem.svelte +12 -0
  113. package/dist/components/core/nav/ui/shared/dropdown/DropdownNavigationMenuItem.svelte.d.ts +4 -0
  114. package/dist/components/core/nav/ui/shared/dropdown/DropdownNavigationMenuItemCard.svelte +49 -0
  115. package/dist/components/core/nav/ui/shared/dropdown/DropdownNavigationMenuItemCard.svelte.d.ts +4 -0
  116. package/dist/components/core/nav/ui/shared/dropdown/DropdownNavigationMenuItemGrid.svelte +30 -0
  117. package/dist/components/core/nav/ui/shared/dropdown/DropdownNavigationMenuItemGrid.svelte.d.ts +4 -0
  118. package/dist/components/core/nav/ui/shared/dropdown/DropdownNavigationMenuItemList.svelte +24 -0
  119. package/dist/components/core/nav/ui/shared/dropdown/DropdownNavigationMenuItemList.svelte.d.ts +4 -0
  120. package/dist/components/core/nav/ui/shared/dropdown/DropdownNavigationMenuItems.svelte +24 -0
  121. package/dist/components/core/nav/ui/shared/dropdown/DropdownNavigationMenuItems.svelte.d.ts +4 -0
  122. package/dist/components/core/nav/ui/shared/{NavigationMenuItem.svelte → navigation/NavigationMenuItem.svelte} +15 -15
  123. package/dist/components/core/nav/ui/shared/{NavigationMenuItem.svelte.d.ts → navigation/NavigationMenuItem.svelte.d.ts} +1 -1
  124. package/dist/components/core/nav/ui/shared/{NavigationMenuItemCard.svelte → navigation/NavigationMenuItemCard.svelte} +62 -62
  125. package/dist/components/core/nav/ui/shared/{NavigationMenuItemCard.svelte.d.ts → navigation/NavigationMenuItemCard.svelte.d.ts} +1 -1
  126. package/dist/components/core/nav/ui/shared/{NavigationMenuItemGrid.svelte → navigation/NavigationMenuItemGrid.svelte} +32 -32
  127. package/dist/components/core/nav/ui/shared/{NavigationMenuItemGrid.svelte.d.ts → navigation/NavigationMenuItemGrid.svelte.d.ts} +1 -1
  128. package/dist/components/core/nav/ui/shared/{NavigationMenuItemList.svelte → navigation/NavigationMenuItemList.svelte} +24 -24
  129. package/dist/components/core/nav/ui/shared/{NavigationMenuItemList.svelte.d.ts → navigation/NavigationMenuItemList.svelte.d.ts} +1 -1
  130. package/dist/components/core/nav/ui/shared/{NavigationMenuItems.svelte → navigation/NavigationMenuItems.svelte} +21 -21
  131. package/dist/components/core/nav/ui/shared/{NavigationMenuItems.svelte.d.ts → navigation/NavigationMenuItems.svelte.d.ts} +1 -1
  132. package/dist/components/core/panel/CarouselSlot.svelte +57 -57
  133. package/dist/components/core/panel/LeftHero.svelte +117 -117
  134. package/dist/components/core/search/SearchInput.svelte +32 -32
  135. package/dist/components/core/search/shared/SearchInputCore.svelte +66 -66
  136. package/dist/components/core/sidebar/MenuBarSidebar.svelte +70 -70
  137. package/dist/components/core/sidebar/MenuBarSidebar.svelte.d.ts +2 -2
  138. package/dist/components/core/sidebar/data/nav-menu-sidebar.js +1 -0
  139. package/dist/components/core/sidebar/data/nav-top-bar-sidebar.js +1 -0
  140. package/dist/components/core/sidebar/data/nav-user-sidebar.js +1 -0
  141. package/dist/components/core/sidebar/types.d.ts +2 -2
  142. package/dist/components/core/sidebar/ui/navbar/NavMenuBarSidebar.svelte +97 -97
  143. package/dist/components/core/sidebar/ui/navbar/NavMenuBarSidebar.svelte.d.ts +1 -1
  144. package/dist/components/core/sidebar/ui/navbar/NavMenuBottomSidebar.svelte +33 -33
  145. package/dist/components/core/sidebar/ui/navbar/NavMenuBottomSidebar.svelte.d.ts +1 -1
  146. package/dist/components/core/sidebar/ui/navbar/NavMenuTopBarSidebar.svelte +103 -103
  147. package/dist/components/core/sidebar/ui/navbar/NavMenuTopBarSidebar.svelte.d.ts +1 -1
  148. package/dist/components/core/tabs/ui/tab-underline.svelte +43 -43
  149. package/dist/components/pages/admin/01/ui/AdminContent.svelte +14 -14
  150. package/dist/components/pages/admin/01/ui/AdminPanel.svelte +46 -46
  151. package/dist/components/pages/privacy-policy-or-terms-of-use/types.d.ts +2 -0
  152. package/dist/components/pages/security/login/01/ui/FormRegister.svelte +28 -28
  153. package/dist/components/pages/security/login/01/ui/LoginCard.svelte +107 -107
  154. package/dist/components/pages/security/login/PageLogin.svelte +22 -22
  155. package/dist/components/ui/badge/badge.svelte +49 -49
  156. package/dist/components/ui/button/button.svelte +82 -82
  157. package/dist/components/ui/chart/chart-container.svelte +80 -80
  158. package/dist/components/ui/chart/chart-style.svelte +37 -37
  159. package/dist/components/ui/chart/chart-tooltip.svelte +184 -184
  160. package/dist/components/ui/checkbox/checkbox.svelte +40 -40
  161. package/dist/components/ui/data-table/flex-render.svelte +40 -40
  162. package/dist/components/ui/drawer/drawer-close.svelte +7 -7
  163. package/dist/components/ui/drawer/drawer-content.svelte +33 -33
  164. package/dist/components/ui/drawer/drawer-description.svelte +17 -17
  165. package/dist/components/ui/drawer/drawer-footer.svelte +20 -20
  166. package/dist/components/ui/drawer/drawer-header.svelte +20 -20
  167. package/dist/components/ui/drawer/drawer-nested.svelte +12 -12
  168. package/dist/components/ui/drawer/drawer-overlay.svelte +17 -17
  169. package/dist/components/ui/drawer/drawer-portal.svelte +7 -7
  170. package/dist/components/ui/drawer/drawer-title.svelte +17 -17
  171. package/dist/components/ui/drawer/drawer-trigger.svelte +7 -7
  172. package/dist/components/ui/drawer/drawer.svelte +12 -12
  173. package/dist/components/ui/select/select-content.svelte +45 -45
  174. package/dist/components/ui/select/select-group-heading.svelte +21 -21
  175. package/dist/components/ui/select/select-group.svelte +17 -17
  176. package/dist/components/ui/select/select-item.svelte +41 -41
  177. package/dist/components/ui/select/select-label.svelte +20 -20
  178. package/dist/components/ui/select/select-portal.svelte +7 -7
  179. package/dist/components/ui/select/select-scroll-down-button.svelte +21 -21
  180. package/dist/components/ui/select/select-scroll-up-button.svelte +21 -21
  181. package/dist/components/ui/select/select-separator.svelte +18 -18
  182. package/dist/components/ui/select/select-trigger.svelte +30 -30
  183. package/dist/components/ui/select/select.svelte +11 -11
  184. package/dist/components/ui/sidebar/sidebar-menu-sub-button.svelte +39 -39
  185. package/dist/components/ui/star-rating/star-rating-star.svelte +41 -41
  186. package/dist/components/ui/star-rating/star-rating.svelte +20 -20
  187. package/dist/components/ui/table/table-body.svelte +15 -15
  188. package/dist/components/ui/table/table-caption.svelte +20 -20
  189. package/dist/components/ui/table/table-cell.svelte +15 -15
  190. package/dist/components/ui/table/table-footer.svelte +20 -20
  191. package/dist/components/ui/table/table-head.svelte +15 -15
  192. package/dist/components/ui/table/table-header.svelte +20 -20
  193. package/dist/components/ui/table/table-row.svelte +15 -15
  194. package/dist/components/ui/table/table.svelte +17 -17
  195. package/dist/components/ui/tabs/tabs-content.svelte +17 -17
  196. package/dist/components/ui/tabs/tabs-list.svelte +40 -40
  197. package/dist/components/ui/tabs/tabs-trigger.svelte +23 -23
  198. package/dist/components/ui/tabs/tabs.svelte +19 -19
  199. package/dist/globals.css +56 -2
  200. package/dist/index.d.ts +1 -8
  201. package/dist/index.js +1 -8
  202. package/dist/styles/globals.css +149 -149
  203. package/dist/styles/hgi-stroke-rounded.css +1 -1
  204. package/dist/types/index.d.ts +9 -7
  205. package/package.json +113 -113
  206. package/dist/components/core/nav/ui/NavMenu.svelte +0 -122
  207. package/dist/components/core/nav/ui/NavMenu.svelte.d.ts +0 -4
  208. package/dist/components/core/nav/ui/mobile/nav-menu-drawer.svelte +0 -85
  209. package/dist/components/core/{nav/data/nav-menu-sidebar.js → carousel/badge/type.js} +0 -0
  210. package/dist/components/core/{nav/ui/shared → carousel/hero}/types.js +0 -0
  211. package/dist/components/core/carousel/hero/{CarouselHero.svelte.d.ts → ui/CarouselHero.svelte.d.ts} +1 -1
  212. /package/dist/components/core/{nav/data/nav-top-bar-sidebar.js → grid/data/types.js} +0 -0
  213. /package/dist/components/core/nav/data/{nav-user-sidebar.js → types.js} +0 -0
  214. /package/dist/components/core/{nav → sidebar}/data/nav-menu-sidebar.d.ts +0 -0
  215. /package/dist/components/core/{nav → sidebar}/data/nav-top-bar-sidebar.d.ts +0 -0
  216. /package/dist/components/core/{nav → sidebar}/data/nav-user-sidebar.d.ts +0 -0
@@ -1,161 +1,163 @@
1
- <script lang="ts">
2
- import type { CarouselHeroItem, CarouselHeroProps } from "../types";
3
- import NavMenu from "../../nav/ui/NavMenu.svelte";
4
- import type { Snippet } from "svelte";
5
-
6
- let {
7
- items,
8
- navMenu,
9
- children,
10
- className,
11
- titleClass,
12
- descriptionClass,
13
- intervalMs = 5000,
14
- transitionMs = 1200,
15
- indicatorShow = false,
16
- sectionClass,
17
- }: CarouselHeroProps & {
18
- children?: Snippet;
19
- intervalMs?: number;
20
- transitionMs?: number;
21
- indicatorShow?: boolean;
22
- } = $props();
23
-
24
- let layers = $state<[string, string]>([items?.[0]?.image ?? "", ""]);
25
- let active = $state<0 | 1>(0);
26
- let index = $state(0);
27
- let switching = false;
28
-
29
- // eslint-disable-next-line svelte/prefer-svelte-reactivity
30
- const preloadCache = new Map<string, Promise<void>>();
31
-
32
- function preload(src: string): Promise<void> {
33
- if (!src) return Promise.resolve();
34
- const cached = preloadCache.get(src);
35
- if (cached) return cached;
36
-
37
- const promise = new Promise<void>((resolve) => {
38
- const img = new Image();
39
- img.onload = () => resolve();
40
- img.onerror = () => resolve();
41
- img.src = src;
42
- });
43
-
44
- preloadCache.set(src, promise);
45
- return promise;
46
- }
47
-
48
- $effect(() => {
49
- items?.forEach((item) => void preload(item.image));
50
- });
51
-
52
- async function goTo(nextIndex: number) {
53
- if (!items || nextIndex === index || switching) return;
54
- switching = true;
55
-
56
- const nextSrc = items[nextIndex].image;
57
- await preload(nextSrc);
58
-
59
- const nextLayer = active === 0 ? 1 : 0;
60
- layers[nextLayer] = nextSrc;
61
- active = nextLayer;
62
- index = nextIndex;
63
- switching = false;
64
- }
65
-
66
- $effect(() => {
67
- if (!items || items.length <= 1) return;
68
-
69
- const timer = setInterval(() => {
70
- goTo((index + 1) % items.length);
71
- }, intervalMs);
72
-
73
- return () => clearInterval(timer);
74
- });
75
-
76
- function fadeIn(node: HTMLElement) {
77
- requestAnimationFrame(() => {
78
- node.style.opacity = "1";
79
- });
80
- return {};
81
- }
82
-
83
- let selected = $derived<CarouselHeroItem | undefined>(items?.[index]);
84
- </script>
85
-
86
- {#if selected}
87
- <header
88
- class="w-full relative flex flex-col justify-center items-center h-75 md:h-100 overflow-hidden {className}"
89
- >
90
- {#each layers as bg, i (`layer-${i}`)}
91
- <div
92
- style="
93
- position: absolute;
94
- inset: 0;
95
- will-change: opacity;
96
- background-image: {bg ? `url(${bg})` : 'none'};
97
- background-size: cover;
98
- background-position: center;
99
- background-repeat: no-repeat;
100
- opacity: {i === active ? 1 : 0};
101
- transition: opacity {transitionMs}ms ease-in-out;
102
- "
103
- ></div>
104
- {/each}
105
-
106
- <div
107
- style="position: absolute; inset: 0; height: 100%; background-color: rgba(0,0,0,0.4);"
108
- ></div>
109
-
110
- <div class="relative z-10 w-full flex flex-col items-center flex-1">
111
- <NavMenu {...navMenu} />
112
-
113
- <section
114
- class="flex flex-col justify-center items-center flex-1 w-full h-auto text-center px-4 {sectionClass}"
115
- >
116
- {#key selected.title}
117
- <div
118
- style="transition: opacity {transitionMs * 0.6}ms ease-in-out;"
119
- class="opacity-0 flex flex-col justify-center items-center text-center"
120
- use:fadeIn
121
- >
122
- <div>
123
- <h1
124
- class="text-white text-2xl md:text-4xl font-bold {titleClass}"
125
- >
126
- {selected.title}
127
- </h1>
128
- </div>
129
- <div class="flex flex-col justify-center items-center">
130
- <p class="text-white/90 mt-2 max-w-2xl {descriptionClass}">
131
- {selected.description}
132
- </p>
133
- </div>
134
- </div>
135
- {/key}
136
-
137
- {#if children}
138
- {@render children()}
139
- {/if}
140
- </section>
141
- </div>
142
-
143
- {#if indicatorShow}
144
- {#if items && items.length > 1}
145
- <div
146
- style="position: absolute; bottom: 0.75rem; z-index: 10; display: flex; gap: 0.5rem;"
147
- >
148
- {#each items as item, i (`hero-dot-${i}`)}
149
- <button
150
- aria-label={`Ir para o slide ${i + 1}: ${item.title}`}
151
- class="w-2 h-2 rounded-full transition-colors {i === index
152
- ? 'bg-white'
153
- : 'bg-white/40'}"
154
- onclick={() => goTo(i)}
155
- ></button>
156
- {/each}
157
- </div>
158
- {/if}
159
- {/if}
160
- </header>
161
- {/if}
1
+ <script lang="ts">
2
+ import type { Snippet } from "svelte";
3
+ import Menu from "../../../nav/ui/Menu.svelte";
4
+ import type { CarouselHeroItem, CarouselHeroProps } from "../types";
5
+
6
+ let {
7
+ items,
8
+ navMenu,
9
+ children,
10
+ className,
11
+ titleClass,
12
+ descriptionClass,
13
+ intervalMs = 5000,
14
+ transitionMs = 1200,
15
+ indicatorShow = false,
16
+ sectionClass,
17
+ }: CarouselHeroProps & {
18
+ children?: Snippet;
19
+ intervalMs?: number;
20
+ transitionMs?: number;
21
+ indicatorShow?: boolean;
22
+ } = $props();
23
+
24
+ const initialImage = $derived(items?.[0]?.image ?? "");
25
+ let layers = $state<[string, string]>(["", ""]);
26
+ let active = $state<0 | 1>(0);
27
+ let index = $state(0);
28
+ let switching = false;
29
+
30
+ // eslint-disable-next-line svelte/prefer-svelte-reactivity
31
+ const preloadCache = new Map<string, Promise<void>>();
32
+
33
+ function preload(src: string): Promise<void> {
34
+ if (!src) return Promise.resolve();
35
+ const cached = preloadCache.get(src);
36
+ if (cached) return cached;
37
+
38
+ const promise = new Promise<void>((resolve) => {
39
+ const img = new Image();
40
+ img.onload = () => resolve();
41
+ img.onerror = () => resolve();
42
+ img.src = src;
43
+ });
44
+
45
+ preloadCache.set(src, promise);
46
+ return promise;
47
+ }
48
+
49
+ $effect(() => {
50
+ items?.forEach((item) => void preload(item.image));
51
+ });
52
+
53
+ async function goTo(nextIndex: number) {
54
+ if (!items || nextIndex === index || switching) return;
55
+ switching = true;
56
+
57
+ const nextSrc = items[nextIndex].image;
58
+ await preload(nextSrc);
59
+
60
+ const nextLayer = active === 0 ? 1 : 0;
61
+ layers[nextLayer] = nextSrc;
62
+ active = nextLayer;
63
+ index = nextIndex;
64
+ switching = false;
65
+ }
66
+
67
+ $effect(() => {
68
+ if (!items || items.length <= 1) return;
69
+
70
+ const timer = setInterval(() => {
71
+ goTo((index + 1) % items.length);
72
+ }, intervalMs);
73
+
74
+ return () => clearInterval(timer);
75
+ });
76
+
77
+ function fadeIn(node: HTMLElement) {
78
+ requestAnimationFrame(() => {
79
+ node.style.opacity = "1";
80
+ });
81
+ return {};
82
+ }
83
+
84
+ let selected = $derived<CarouselHeroItem | undefined>(items?.[index]);
85
+ </script>
86
+
87
+ {#if selected}
88
+ <header
89
+ class="w-full relative flex flex-col justify-center items-center h-75 md:h-100 overflow-hidden {className}"
90
+ >
91
+ {#each layers as bg, i (`layer-${i}`)}
92
+ {@const src = bg || (i === 0 ? initialImage : "")}
93
+ <div
94
+ style="
95
+ position: absolute;
96
+ inset: 0;
97
+ will-change: opacity;
98
+ background-image: {src ? `url(${src})` : 'none'};
99
+ background-size: cover;
100
+ background-position: center;
101
+ background-repeat: no-repeat;
102
+ opacity: {i === active ? 1 : 0};
103
+ transition: opacity {transitionMs}ms ease-in-out;
104
+ "
105
+ ></div>
106
+ {/each}
107
+
108
+ <div
109
+ style="position: absolute; inset: 0; height: 100%; background-color: rgba(0,0,0,0.4);"
110
+ ></div>
111
+
112
+ <div class="relative z-10 w-full flex flex-col items-center flex-1">
113
+ <Menu {navMenu} />
114
+
115
+ <section
116
+ class="flex flex-col justify-center items-center flex-1 w-full h-auto text-center px-4 {sectionClass}"
117
+ >
118
+ {#key selected.title}
119
+ <div
120
+ style="transition: opacity {transitionMs * 0.6}ms ease-in-out;"
121
+ class="opacity-0 flex flex-col justify-center items-center text-center"
122
+ use:fadeIn
123
+ >
124
+ <div>
125
+ <h1
126
+ class="text-white text-2xl md:text-4xl font-bold {titleClass}"
127
+ >
128
+ {selected.title}
129
+ </h1>
130
+ </div>
131
+ <div class="flex flex-col justify-center items-center">
132
+ <p class="text-white/90 mt-2 max-w-2xl {descriptionClass}">
133
+ {selected.description}
134
+ </p>
135
+ </div>
136
+ </div>
137
+ {/key}
138
+
139
+ {#if children}
140
+ {@render children()}
141
+ {/if}
142
+ </section>
143
+ </div>
144
+
145
+ {#if indicatorShow}
146
+ {#if items && items.length > 1}
147
+ <div
148
+ style="position: absolute; bottom: 0.75rem; z-index: 10; display: flex; gap: 0.5rem;"
149
+ >
150
+ {#each items as item, i (`hero-dot-${i}`)}
151
+ <button
152
+ aria-label={`Ir para o slide ${i + 1}: ${item.title}`}
153
+ class="w-2 h-2 rounded-full transition-colors {i === index
154
+ ? 'bg-white'
155
+ : 'bg-white/40'}"
156
+ onclick={() => goTo(i)}
157
+ ></button>
158
+ {/each}
159
+ </div>
160
+ {/if}
161
+ {/if}
162
+ </header>
163
+ {/if}
@@ -1,60 +1,60 @@
1
- <script lang="ts">
2
- import Button from "../../../../ui/button/button.svelte";
3
- import { t } from "../../../../../i18n";
4
- import { HugeiconsIcon } from "@hugeicons/svelte";
5
- import { ArrowRight02Icon } from "@hugeicons/core-free-icons";
6
- import type { CarouselHeaderProps } from "../../types";
7
- import type { Snippet } from "svelte";
8
-
9
- type Props = {
10
- children: Snippet;
11
- };
12
-
13
- const {
14
- title,
15
- description,
16
- titleClass,
17
- descriptionClass,
18
- containerClass = "",
19
- onButtonViewAll,
20
- children,
21
- isBorder,
22
- }: CarouselHeaderProps & Props = $props();
23
- </script>
24
-
25
- <div class="w-full flex justify-center">
26
- <div
27
- class="w-[95%] p-2 rounded-xl
28
- {isBorder ? 'border border-gray-50 dark:border-gray-800' : ''}
29
- {containerClass}"
30
- >
31
- <div class="flex flex-col gap-1">
32
- <div class="flex justify-between">
33
- <div>
34
- {#if title}
35
- <h1 class={`text-xl ${titleClass}`}>{title}</h1>
36
- {/if}
37
- {#if description}
38
- <div class={`mt-3 ${descriptionClass}`}>
39
- {description}
40
- </div>
41
- {/if}
42
- </div>
43
- {#if onButtonViewAll}
44
- <div>
45
- <Button
46
- variant="ghost"
47
- size="sm"
48
- class="flex items-center gap-0.5"
49
- onclick={onButtonViewAll}
50
- >
51
- {$t("label.view.full")}
52
- <HugeiconsIcon icon={ArrowRight02Icon} />
53
- </Button>
54
- </div>
55
- {/if}
56
- </div>
57
- </div>
58
- <div>{@render children()}</div>
59
- </div>
60
- </div>
1
+ <script lang="ts">
2
+ import Button from "../../../../ui/button/button.svelte";
3
+ import { t } from "../../../../../i18n";
4
+ import { HugeiconsIcon } from "@hugeicons/svelte";
5
+ import { ArrowRight02Icon } from "@hugeicons/core-free-icons";
6
+ import type { CarouselHeaderProps } from "../../types";
7
+ import type { Snippet } from "svelte";
8
+
9
+ type Props = {
10
+ children: Snippet;
11
+ };
12
+
13
+ const {
14
+ title,
15
+ description,
16
+ titleClass,
17
+ descriptionClass,
18
+ containerClass = "",
19
+ onButtonViewAll,
20
+ children,
21
+ isBorder,
22
+ }: CarouselHeaderProps & Props = $props();
23
+ </script>
24
+
25
+ <div class="w-full flex justify-center">
26
+ <div
27
+ class="w-[95%] p-2 rounded-xl
28
+ {isBorder ? 'border border-gray-50 dark:border-gray-800' : ''}
29
+ {containerClass}"
30
+ >
31
+ <div class="flex flex-col gap-1">
32
+ <div class="flex justify-between">
33
+ <div>
34
+ {#if title}
35
+ <h1 class={`text-xl ${titleClass}`}>{title}</h1>
36
+ {/if}
37
+ {#if description}
38
+ <div class={`mt-3 ${descriptionClass}`}>
39
+ {description}
40
+ </div>
41
+ {/if}
42
+ </div>
43
+ {#if onButtonViewAll}
44
+ <div>
45
+ <Button
46
+ variant="ghost"
47
+ size="sm"
48
+ class="flex items-center gap-0.5"
49
+ onclick={onButtonViewAll}
50
+ >
51
+ {$t("label.view.full")}
52
+ <HugeiconsIcon icon={ArrowRight02Icon} />
53
+ </Button>
54
+ </div>
55
+ {/if}
56
+ </div>
57
+ </div>
58
+ <div>{@render children()}</div>
59
+ </div>
60
+ </div>
@@ -1,5 +1,6 @@
1
1
  import type { IconSvgElement } from "@hugeicons/svelte";
2
- import type { NavMenuProps } from "../nav/data/nav-menu";
2
+ export type { CarouselBadgeProps } from "./badge/type";
3
+ export type { CarouselHeroItem, CarouselHeroProps } from "./hero/types";
3
4
  /**
4
5
  * Item individual do CarouselBadge — categoria/opção com ícone,
5
6
  * imagem, label e callback de clique.
@@ -42,58 +43,3 @@ export interface CarouselHeaderProps {
42
43
  /** Exibe borda inferior no header */
43
44
  isBorder?: boolean;
44
45
  }
45
- /**
46
- * Props do CarouselBadge — carousel de badges/categorias
47
- * com orientação horizontal ou vertical.
48
- */
49
- export interface CarouselBadgeProps {
50
- /** Lista de itens do carousel de badges */
51
- items: ItemCarousel[];
52
- /** Orientação do layout: horizontal (padrão) ou vertical */
53
- orientation?: "horizontal" | "vertical";
54
- /** Classe CSS personalizada para a imagem */
55
- imageClass?: string;
56
- /** Classe CSS personalizada para o ícone */
57
- iconClass?: string;
58
- /** Classe CSS personalizada para o label */
59
- labelClass?: string;
60
- /** Classe CSS personalizada para o estado ativo */
61
- activeClass?: string;
62
- /** Estado de carregamento (skeleton) */
63
- isLoading?: boolean;
64
- itemClass?: string;
65
- btnNavClass?: string;
66
- isBorderInline?: boolean;
67
- showButton?: boolean;
68
- itemStyle?: 'BORDER' | 'INLINE' | 'DEFAULT';
69
- onClick?: (value: string | number) => void;
70
- }
71
- /**
72
- * Item individual do CarouselHero — slide com imagem,
73
- * título e descrição.
74
- */
75
- export interface CarouselHeroItem {
76
- /** Título do slide hero */
77
- title: string;
78
- /** URL da imagem de fundo do slide */
79
- image: string;
80
- /** Descrição do slide */
81
- description: string;
82
- }
83
- /**
84
- * Props do CarouselHero — carousel hero principal (ex: página de login)
85
- * com slides em fullscreen e menu de navegação sobreposto.
86
- */
87
- export interface CarouselHeroProps {
88
- /** Lista de slides do hero */
89
- items: CarouselHeroItem[];
90
- /** Configuração do menu de navegação sobreposto */
91
- navMenu: NavMenuProps;
92
- /** Classe CSS adicional para o container */
93
- className?: string;
94
- /** Classe CSS personalizada para o título */
95
- titleClass?: string;
96
- /** Classe CSS personalizada para a descrição */
97
- descriptionClass?: string;
98
- sectionClass?: string;
99
- }
@@ -1,28 +1,28 @@
1
- <script lang="ts" generics="T">
2
- import type { CellContext } from "@tanstack/table-core";
3
- import * as DropdownMenu from "../../../ui/dropdown-menu/index.js";
4
- import Button from "../../../ui/button/button.svelte";
5
- import { MoreHorizontalIcon } from "@hugeicons/core-free-icons";
6
- import { HugeiconsIcon } from "@hugeicons/svelte";
7
-
8
- let { row }: CellContext<T, unknown> = $props();
9
- </script>
10
-
11
- <DropdownMenu.Root>
12
- <DropdownMenu.Trigger>
13
- {#snippet child({ props })}
14
- <Button {...props} variant="ghost" class="size-8 p-0">
15
- <HugeiconsIcon icon={MoreHorizontalIcon} class="size-4" />
16
- <span class="sr-only">Open menu</span>
17
- </Button>
18
- {/snippet}
19
- </DropdownMenu.Trigger>
20
- <DropdownMenu.Content align="end">
21
- <DropdownMenu.Item onclick={() => console.log(row.original)}
22
- >Copy</DropdownMenu.Item
23
- >
24
- <DropdownMenu.Item onclick={() => console.log(row.original)}
25
- >Delete</DropdownMenu.Item
26
- >
27
- </DropdownMenu.Content>
28
- </DropdownMenu.Root>
1
+ <script lang="ts" generics="T">
2
+ import type { CellContext } from "@tanstack/table-core";
3
+ import * as DropdownMenu from "../../../ui/dropdown-menu/index.js";
4
+ import Button from "../../../ui/button/button.svelte";
5
+ import { MoreHorizontalIcon } from "@hugeicons/core-free-icons";
6
+ import { HugeiconsIcon } from "@hugeicons/svelte";
7
+
8
+ let { row }: CellContext<T, unknown> = $props();
9
+ </script>
10
+
11
+ <DropdownMenu.Root>
12
+ <DropdownMenu.Trigger>
13
+ {#snippet child({ props })}
14
+ <Button {...props} variant="ghost" class="size-8 p-0">
15
+ <HugeiconsIcon icon={MoreHorizontalIcon} class="size-4" />
16
+ <span class="sr-only">Open menu</span>
17
+ </Button>
18
+ {/snippet}
19
+ </DropdownMenu.Trigger>
20
+ <DropdownMenu.Content align="end">
21
+ <DropdownMenu.Item onclick={() => console.log(row.original)}
22
+ >Copy</DropdownMenu.Item
23
+ >
24
+ <DropdownMenu.Item onclick={() => console.log(row.original)}
25
+ >Delete</DropdownMenu.Item
26
+ >
27
+ </DropdownMenu.Content>
28
+ </DropdownMenu.Root>
@@ -1,22 +1,22 @@
1
- <script lang="ts">
2
- import { Checkbox } from "../../../ui/checkbox";
3
-
4
- let {
5
- checked = $bindable(false),
6
- indeterminate = $bindable(false),
7
- onCheckedChange,
8
- ...restProps
9
- }: {
10
- checked?: boolean;
11
- indeterminate?: boolean;
12
- onCheckedChange?: (value: boolean) => void;
13
- [key: string]: unknown;
14
- } = $props();
15
- </script>
16
-
17
- <Checkbox
18
- bind:checked
19
- bind:indeterminate
20
- onCheckedChange={(v) => onCheckedChange?.(!!v)}
21
- {...restProps}
22
- />
1
+ <script lang="ts">
2
+ import { Checkbox } from "../../../ui/checkbox";
3
+
4
+ let {
5
+ checked = $bindable(false),
6
+ indeterminate = $bindable(false),
7
+ onCheckedChange,
8
+ ...restProps
9
+ }: {
10
+ checked?: boolean;
11
+ indeterminate?: boolean;
12
+ onCheckedChange?: (value: boolean) => void;
13
+ [key: string]: unknown;
14
+ } = $props();
15
+ </script>
16
+
17
+ <Checkbox
18
+ bind:checked
19
+ bind:indeterminate
20
+ onCheckedChange={(v) => onCheckedChange?.(!!v)}
21
+ {...restProps}
22
+ />