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,109 +1,109 @@
1
- <script lang="ts">
2
- import * as Carousel from "../../../../ui/carousel/index.js";
3
- import type { CarouselBadgeProps } from "../../types.js";
4
- import { HugeiconsIcon } from "@hugeicons/svelte";
5
- import Skeleton from "../../../../ui/skeleton/skeleton.svelte";
6
- import { useDevice } from "../../../../../hooks/responsive.svelte";
7
-
8
- const {
9
- items = [],
10
- imageClass,
11
- iconClass,
12
- labelClass,
13
- activeClass = "bg-gradient text-white rounded-full px-3",
14
- orientation = "horizontal",
15
- itemStyle = "DEFAULT",
16
- isBorderInline = false,
17
- showButton = true,
18
- isLoading = false,
19
- btnNavClass,
20
- itemClass,
21
- onClick,
22
- }: CarouselBadgeProps = $props();
23
-
24
- const TOP_NAV = $derived(isBorderInline ? "top-5.5" : "top-7.5");
25
- const borderB = $derived(
26
- isBorderInline ? `border-b-2 ${itemStyle == "BORDER" ? "pb-2" : ""}` : "",
27
- );
28
- const isInlineBorder = $derived(isBorderInline && itemStyle == "INLINE");
29
- const DEFAULT_IMG_OR_ICON_CLASS = "size-3 md:size-6";
30
-
31
- const responsive = useDevice();
32
- const skeletonCount = $derived(responsive.isMobile ? 2 : 8);
33
-
34
- let selectedValue = $state<unknown>(undefined);
35
-
36
- function isSelected(item: (typeof items)[number]) {
37
- return item.value !== undefined && item.value === selectedValue;
38
- }
39
-
40
- function selectItem(item: (typeof items)[number]) {
41
- selectedValue = item.value;
42
- item.onClick?.(item.value);
43
- onClick?.(item.value);
44
- }
45
- </script>
46
-
47
- {#snippet itemVisual(item: (typeof items)[number])}
48
- {#if item.image}
49
- <img
50
- src={item.image}
51
- alt={item.label}
52
- class={imageClass || DEFAULT_IMG_OR_ICON_CLASS}
53
- />
54
- {:else if typeof item.icon === "string"}
55
- <i class={`${item.icon} ${iconClass || DEFAULT_IMG_OR_ICON_CLASS}`}></i>
56
- {:else if item.icon}
57
- <HugeiconsIcon
58
- icon={item.icon}
59
- class={iconClass || DEFAULT_IMG_OR_ICON_CLASS}
60
- />
61
- {/if}
62
- {/snippet}
63
-
64
- {#if items.length > 0}
65
- <Carousel.Root>
66
- <Carousel.Content class={borderB}>
67
- {#if isLoading}
68
- <div class="flex items-center justify-between w-full gap-1 md:gap-2">
69
- {#each Array.from( { length: skeletonCount }, ) as _, i (`skeleton-${i}`)}
70
- <Skeleton class="h-4 w-25 bg-gray-50/90" />
71
- {/each}
72
- </div>
73
- {:else}
74
- {#each items as item, i (`badge-${i}-${item.value ?? item.label ?? i}`)}
75
- <Carousel.Item
76
- class="basis-auto relative"
77
- onclick={() => selectItem(item)}
78
- >
79
- <div
80
- class="flex gap-1 mx-2 p-1 justify-center items-center cursor-pointer relative hover:text-lg hover:font-bold
81
- {isSelected(item)
82
- ? isInlineBorder
83
- ? 'text-gradient font-bold'
84
- : activeClass
85
- : ''}
86
- {itemStyle == 'BORDER' ? 'border-2 rounded-full min-w-25 px-1' : ''}
87
- {orientation === 'horizontal' ? 'flex-row' : 'flex-col'}
88
- {isInlineBorder ? 'pb-3' : ''}
89
- {itemClass}
90
- "
91
- >
92
- {@render itemVisual(item)}
93
- <div class={labelClass}>{item.label}</div>
94
- </div>
95
- {#if isSelected(item) && isInlineBorder}
96
- <div class="absolute pt-5 w-full h-2 bg-gradient"></div>
97
- {/if}
98
- </Carousel.Item>
99
- {/each}
100
- {/if}
101
- </Carousel.Content>
102
- {#if showButton}
103
- {@const navClass =
104
- "absolute -translate-y-1/2 z-50 bg-blue-700! text-white! cursor-pointer"}
105
- <Carousel.Previous class="-left-8 {navClass} {TOP_NAV} {btnNavClass}" />
106
- <Carousel.Next class="-right-8 {navClass} {TOP_NAV} {btnNavClass}" />
107
- {/if}
108
- </Carousel.Root>
109
- {/if}
1
+ <script lang="ts">
2
+ import * as Carousel from "../../../../ui/carousel/index.js";
3
+ import type { CarouselBadgeProps } from "../../types.js";
4
+ import { HugeiconsIcon } from "@hugeicons/svelte";
5
+ import Skeleton from "../../../../ui/skeleton/skeleton.svelte";
6
+ import { useDevice } from "../../../../../hooks/responsive.svelte";
7
+
8
+ const {
9
+ items = [],
10
+ imageClass,
11
+ iconClass,
12
+ labelClass,
13
+ activeClass = "bg-gradient text-white rounded-full px-3",
14
+ orientation = "horizontal",
15
+ itemStyle = "DEFAULT",
16
+ isBorderInline = false,
17
+ showButton = true,
18
+ isLoading = false,
19
+ btnNavClass,
20
+ itemClass,
21
+ onClick,
22
+ }: CarouselBadgeProps = $props();
23
+
24
+ const TOP_NAV = $derived(isBorderInline ? "top-5.5" : "top-7.5");
25
+ const borderB = $derived(
26
+ isBorderInline ? `border-b-2 ${itemStyle == "BORDER" ? "pb-2" : ""}` : "",
27
+ );
28
+ const isInlineBorder = $derived(isBorderInline && itemStyle == "INLINE");
29
+ const DEFAULT_IMG_OR_ICON_CLASS = "size-3 md:size-6";
30
+
31
+ const responsive = useDevice();
32
+ const skeletonCount = $derived(responsive.isMobile ? 2 : 8);
33
+
34
+ let selectedValue = $state<unknown>(undefined);
35
+
36
+ function isSelected(item: (typeof items)[number]) {
37
+ return item.value !== undefined && item.value === selectedValue;
38
+ }
39
+
40
+ function selectItem(item: (typeof items)[number]) {
41
+ selectedValue = item.value;
42
+ item.onClick?.(item.value);
43
+ onClick?.(item.value);
44
+ }
45
+ </script>
46
+
47
+ {#snippet itemVisual(item: (typeof items)[number])}
48
+ {#if item.image}
49
+ <img
50
+ src={item.image}
51
+ alt={item.label}
52
+ class={imageClass || DEFAULT_IMG_OR_ICON_CLASS}
53
+ />
54
+ {:else if typeof item.icon === "string"}
55
+ <i class={`${item.icon} ${iconClass || DEFAULT_IMG_OR_ICON_CLASS}`}></i>
56
+ {:else if item.icon}
57
+ <HugeiconsIcon
58
+ icon={item.icon}
59
+ class={iconClass || DEFAULT_IMG_OR_ICON_CLASS}
60
+ />
61
+ {/if}
62
+ {/snippet}
63
+
64
+ {#if items.length > 0}
65
+ <Carousel.Root>
66
+ <Carousel.Content class={borderB}>
67
+ {#if isLoading}
68
+ <div class="flex items-center justify-between w-full gap-1 md:gap-2">
69
+ {#each Array.from( { length: skeletonCount }, ) as _, i (`skeleton-${i}`)}
70
+ <Skeleton class="h-4 w-25 bg-gray-50/90" />
71
+ {/each}
72
+ </div>
73
+ {:else}
74
+ {#each items as item, i (`badge-${i}-${item.value ?? item.label ?? i}`)}
75
+ <Carousel.Item
76
+ class="basis-auto relative"
77
+ onclick={() => selectItem(item)}
78
+ >
79
+ <div
80
+ class="flex gap-1 mx-2 p-1 justify-center items-center cursor-pointer relative hover:text-lg hover:font-bold
81
+ {isSelected(item)
82
+ ? isInlineBorder
83
+ ? 'text-gradient font-bold'
84
+ : activeClass
85
+ : ''}
86
+ {itemStyle == 'BORDER' ? 'border-2 rounded-full min-w-25 px-1' : ''}
87
+ {orientation === 'horizontal' ? 'flex-row' : 'flex-col'}
88
+ {isInlineBorder ? 'pb-3' : ''}
89
+ {itemClass}
90
+ "
91
+ >
92
+ {@render itemVisual(item)}
93
+ <div class={labelClass}>{item.label}</div>
94
+ </div>
95
+ {#if isSelected(item) && isInlineBorder}
96
+ <div class="absolute pt-5 w-full h-2 bg-gradient"></div>
97
+ {/if}
98
+ </Carousel.Item>
99
+ {/each}
100
+ {/if}
101
+ </Carousel.Content>
102
+ {#if showButton}
103
+ {@const navClass =
104
+ "absolute -translate-y-1/2 z-50 bg-blue-700! text-white! cursor-pointer"}
105
+ <Carousel.Previous class="-left-8 {navClass} {TOP_NAV} {btnNavClass}" />
106
+ <Carousel.Next class="-right-8 {navClass} {TOP_NAV} {btnNavClass}" />
107
+ {/if}
108
+ </Carousel.Root>
109
+ {/if}
@@ -1,4 +1,5 @@
1
1
  import type { CardMediaProps } from "../../../card/types";
2
+ import type { GridProps } from "../../../grid/data/types";
2
3
  import type { CarouselSlotProps } from "../../../panel/type";
3
4
  import type { CarouselHeaderProps } from "../../types";
4
5
  /**
@@ -10,6 +11,8 @@ export interface CarouselGridMediaProps {
10
11
  headerProps?: CarouselHeaderProps;
11
12
  /** Props do slot/container do carousel (botões navegação, plugins) */
12
13
  slotProps?: CarouselSlotProps;
14
+ /** Props do grid simples */
15
+ gridProps?: GridProps;
13
16
  /** Classe CSS adicional para o container do grid */
14
17
  gridClass?: string;
15
18
  /** Exibe ícone antes da descrição */
@@ -11,6 +11,7 @@
11
11
  const {
12
12
  headerProps,
13
13
  slotProps,
14
+ gridProps,
14
15
  gridClass,
15
16
  items,
16
17
  variant,
@@ -35,7 +36,7 @@
35
36
  description={$t("empty.media.description")}
36
37
  />
37
38
  {:else}
38
- <CarouselGridSlot {slotProps} {gridClass} totalItems={items?.length ?? 0}>
39
+ <CarouselGridSlot {slotProps} {gridClass} {gridProps}>
39
40
  {#if isLoading}
40
41
  {#each Array.from( { length: responsive.isMobile ? 3 : 6 }, ) as _, i (`loading-${i}`)}
41
42
  {#if responsive.isMobile}
@@ -1,4 +1,5 @@
1
1
  import type { CardProductProps } from "../../../card/types";
2
+ import type { GridProps } from "../../../grid/data/types";
2
3
  import type { CarouselSlotProps } from "../../../panel/type";
3
4
  import type { CarouselHeaderProps } from "../../types";
4
5
  /**
@@ -9,6 +10,8 @@ export interface CarouselGridProductProps {
9
10
  headerProps?: CarouselHeaderProps;
10
11
  /** Props do slot/container do carousel (botões navegação, plugins) */
11
12
  slotProps?: CarouselSlotProps;
13
+ /** Props do grid simples */
14
+ gridProps?: GridProps;
12
15
  /** Classe CSS adicional para o container do grid */
13
16
  gridClass?: string;
14
17
  /** Variante visual do card: 1 ou 2 */
@@ -19,4 +22,9 @@ export interface CarouselGridProductProps {
19
22
  isLoading?: boolean;
20
23
  isDescriptionIcon?: boolean;
21
24
  isDescriptionLabel?: boolean;
25
+ onClickBuy?: (id: string | number) => void;
26
+ /** Callback ao clicar no botão carrinho */
27
+ onClickShop?: (id: string | number) => void;
28
+ /** Callback ao clicar no botão favorito */
29
+ onClickFavorite?: (id: string | number) => void;
22
30
  }
@@ -1,22 +1,26 @@
1
1
  <script lang="ts">
2
+ import NotFoundEmpty from "../../../../panel/NotFoundEmpty.svelte";
2
3
  import CarouselGridSlot from "../../shared/ui/CarouselGridSlot.svelte";
3
4
  import CarouselHeader from "../../../shared/ui/CarouselHeader.svelte";
4
- import NotFoundEmpty from "../../../../panel/NotFoundEmpty.svelte";
5
5
  import * as Carousel from "../../../../../ui/carousel/index.js";
6
- import { useDevice } from "../../../../../../hooks/responsive.svelte";
7
- import { t } from "../../../../../../i18n";
8
6
  import CardProduct from "../../../../card/product/CardProduct.svelte";
9
7
  import type { CarouselGridProductProps } from "../types";
8
+ import { useDevice } from "../../../../../../hooks/responsive.svelte";
9
+ import { t } from "../../../../../../i18n";
10
10
 
11
11
  const {
12
12
  headerProps,
13
13
  slotProps,
14
+ gridProps,
14
15
  gridClass = "lg:grid-cols-4 xl:grid-cols-5 2xl:grid-cols-6",
15
16
  items,
16
17
  variant,
17
18
  isLoading = false,
18
19
  isDescriptionIcon = false,
19
20
  isDescriptionLabel = false,
21
+ onClickBuy,
22
+ onClickFavorite,
23
+ onClickShop,
20
24
  }: CarouselGridProductProps = $props();
21
25
 
22
26
  const responsive = useDevice();
@@ -30,7 +34,7 @@
30
34
  description={$t("empty.products.description")}
31
35
  />
32
36
  {:else}
33
- <CarouselGridSlot {slotProps} {gridClass} totalItems={items?.length ?? 0}>
37
+ <CarouselGridSlot {slotProps} {gridClass} {gridProps}>
34
38
  {#if isLoading}
35
39
  {#each Array.from( { length: responsive.isMobile ? 3 : 6 }, ) as _, i (`loading-${i}`)}
36
40
  {#if responsive.isMobile}
@@ -52,6 +56,9 @@
52
56
  {variant}
53
57
  {isDescriptionIcon}
54
58
  {isDescriptionLabel}
59
+ {onClickBuy}
60
+ {onClickFavorite}
61
+ {onClickShop}
55
62
  />
56
63
  </Carousel.Item>
57
64
  {:else}
@@ -61,6 +68,9 @@
61
68
  {variant}
62
69
  {isDescriptionIcon}
63
70
  {isDescriptionLabel}
71
+ {onClickBuy}
72
+ {onClickFavorite}
73
+ {onClickShop}
64
74
  />
65
75
  </div>
66
76
  {/if}
@@ -34,7 +34,7 @@
34
34
  description={$t("empty.profiles.description")}
35
35
  />
36
36
  {:else}
37
- <CarouselGridSlot {slotProps} {gridClass} totalItems={items?.length ?? 0}>
37
+ <CarouselGridSlot {slotProps} {gridClass}>
38
38
  {#if isLoading}
39
39
  {#each Array.from( { length: responsive.isMobile ? 3 : 6 }, ) as _, i (`loading-${i}`)}
40
40
  {#if responsive.isMobile}
@@ -29,7 +29,7 @@
29
29
  description={$t("empty.promotions.description")}
30
30
  />
31
31
  {:else}
32
- <CarouselGridSlot {slotProps} {gridClass} totalItems={items?.length ?? 0}>
32
+ <CarouselGridSlot {slotProps} {gridClass}>
33
33
  {#if isLoading}
34
34
  {#each Array.from( { length: responsive.isMobile ? 3 : 6 }, ) as _, i (`loading-${i}`)}
35
35
  {#if responsive.isMobile}
@@ -4,19 +4,24 @@
4
4
  import type { CarouselSlotProps } from "../../../../panel/type";
5
5
  import { useDevice } from "../../../../../../hooks/responsive.svelte";
6
6
  import Autoplay from "embla-carousel-autoplay";
7
+ import type { GridProps } from "../../../../grid/data/types";
8
+ import SimpleGrid from "../../../../grid/ui/SimpleGrid.svelte";
7
9
 
8
10
  type Props = {
9
11
  slotProps?: CarouselSlotProps;
10
- totalItems: number;
12
+ gridProps?: GridProps;
11
13
  gridClass?: string;
12
14
  children: Snippet;
13
15
  };
14
16
 
15
- const { slotProps, totalItems, gridClass, children }: Props = $props();
17
+ const { slotProps, gridProps, gridClass, children }: Props = $props();
16
18
 
17
19
  const responsive = useDevice();
18
20
  </script>
19
21
 
22
+ {#if gridProps}
23
+ <SimpleGrid {...gridProps} />
24
+ {/if}
20
25
  {#if responsive.isMobile}
21
26
  <CarouselSlot
22
27
  {...slotProps}
@@ -26,7 +31,7 @@
26
31
  </CarouselSlot>
27
32
  {:else}
28
33
  <div
29
- class="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5 2xl:grid-cols-6 gap-4 p-2 {gridClass}"
34
+ class="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4 p-2 {gridClass}"
30
35
  >
31
36
  {@render children()}
32
37
  </div>
@@ -1,8 +1,9 @@
1
1
  import type { Snippet } from "svelte";
2
2
  import type { CarouselSlotProps } from "../../../../panel/type";
3
+ import type { GridProps } from "../../../../grid/data/types";
3
4
  type Props = {
4
5
  slotProps?: CarouselSlotProps;
5
- totalItems: number;
6
+ gridProps?: GridProps;
6
7
  gridClass?: string;
7
8
  children: Snippet;
8
9
  };
@@ -0,0 +1,30 @@
1
+ import type { MenuVarientProps } from "../../nav/data/types";
2
+ /**
3
+ * Item individual do CarouselHero — slide com imagem,
4
+ * título e descrição.
5
+ */
6
+ export interface CarouselHeroItem {
7
+ /** Título do slide hero */
8
+ title: string;
9
+ /** URL da imagem de fundo do slide */
10
+ image: string;
11
+ /** Descrição do slide */
12
+ description: string;
13
+ }
14
+ /**
15
+ * Props do CarouselHero — carousel hero principal (ex: página de login)
16
+ * com slides em fullscreen e menu de navegação sobreposto.
17
+ */
18
+ export interface CarouselHeroProps {
19
+ /** Lista de slides do hero */
20
+ items: CarouselHeroItem[];
21
+ /** Configuração do menu de navegação sobreposto */
22
+ navMenu: MenuVarientProps;
23
+ /** Classe CSS adicional para o container */
24
+ className?: string;
25
+ /** Classe CSS personalizada para o título */
26
+ titleClass?: string;
27
+ /** Classe CSS personalizada para a descrição */
28
+ descriptionClass?: string;
29
+ sectionClass?: string;
30
+ }