negodesign 0.0.12 → 0.0.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/core/card/promotion/CardPromotion.svelte +44 -0
- package/dist/components/core/card/promotion/CardPromotion.svelte.d.ts +8 -0
- package/dist/components/core/card/promotion/data.d.ts +3 -0
- package/dist/components/core/card/promotion/data.js +31 -0
- package/dist/components/core/card/shared/CardFavorite.svelte +20 -20
- package/dist/components/core/card/shared/CardFavorite.svelte.d.ts +1 -1
- package/dist/components/core/card/types.d.ts +10 -0
- package/dist/components/core/carousel/promotion/ui/CarouselPromotion.svelte +53 -0
- package/dist/components/core/carousel/promotion/ui/CarouselPromotion.svelte.d.ts +4 -0
- package/dist/components/core/carousel/shared/ui/SimpleBadgeCarousel.svelte +59 -0
- package/dist/components/core/carousel/shared/ui/SimpleBadgeCarousel.svelte.d.ts +4 -0
- package/dist/components/core/carousel/types.d.ts +12 -1
- package/dist/components/core/panel/CarouselSlot.svelte +38 -0
- package/dist/components/core/panel/CarouselSlot.svelte.d.ts +11 -0
- package/dist/globals.css +44 -1
- package/dist/i18n/langs/en.d.ts +1 -0
- package/dist/i18n/langs/en.js +1 -0
- package/dist/i18n/langs/pt.d.ts +1 -0
- package/dist/i18n/langs/pt.js +1 -0
- package/dist/i18n/translations.d.ts +2 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +2 -1
- package/dist/styles/globals.css +6 -2
- package/package.json +1 -1
- package/dist/components/core/carousel/ui/SimpleCarousel.svelte +0 -62
- package/dist/components/core/carousel/ui/SimpleCarousel.svelte.d.ts +0 -4
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import CardFavorite from "../shared/CardFavorite.svelte";
|
|
3
|
+
/**
|
|
4
|
+
* Card component with a title and content.
|
|
5
|
+
* @component
|
|
6
|
+
*/
|
|
7
|
+
import type { CardPromotionProps } from "../types";
|
|
8
|
+
|
|
9
|
+
let {
|
|
10
|
+
logo,
|
|
11
|
+
imageUrl,
|
|
12
|
+
title,
|
|
13
|
+
isFavorite = false,
|
|
14
|
+
}: CardPromotionProps = $props();
|
|
15
|
+
</script>
|
|
16
|
+
|
|
17
|
+
<article class="relative rounded-sm">
|
|
18
|
+
{#if logo}
|
|
19
|
+
<div class="absolute top-1 left-1 z-2 flex gap-1 p-2">
|
|
20
|
+
<img src={logo} width={30} height={30} alt={title} class="rounded-lg" />
|
|
21
|
+
</div>
|
|
22
|
+
{/if}
|
|
23
|
+
|
|
24
|
+
<div class="absolute top-1 right-1 z-2 flex gap-1 p-2">
|
|
25
|
+
<CardFavorite {isFavorite} />
|
|
26
|
+
</div>
|
|
27
|
+
|
|
28
|
+
{#if imageUrl}
|
|
29
|
+
<img
|
|
30
|
+
src={imageUrl}
|
|
31
|
+
alt={imageUrl}
|
|
32
|
+
class="rounded-lg md:h-37.5 md:w-37.5 lg:h-50 lg:w-50 object-cover object-center"
|
|
33
|
+
/>
|
|
34
|
+
{/if}
|
|
35
|
+
<div class="absolute inset-0 bg-black/5 rounded-sm h-full w-full"></div>
|
|
36
|
+
|
|
37
|
+
<div
|
|
38
|
+
class="absolute bottom-1 inset-x-0 flex justify-center m-auto bg-black/10 backdrop-blur-sm max-w-11/12 p-2 rounded-md"
|
|
39
|
+
>
|
|
40
|
+
{#if title}
|
|
41
|
+
<div class="text-center font-semibold text-[12px]">{title}</div>
|
|
42
|
+
{/if}
|
|
43
|
+
</div>
|
|
44
|
+
</article>
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Card component with a title and content.
|
|
3
|
+
* @component
|
|
4
|
+
*/
|
|
5
|
+
import type { CardPromotionProps } from "../types";
|
|
6
|
+
declare const CardPromotion: import("svelte").Component<CardPromotionProps, {}, "">;
|
|
7
|
+
type CardPromotion = ReturnType<typeof CardPromotion>;
|
|
8
|
+
export default CardPromotion;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
const items = [
|
|
2
|
+
{
|
|
3
|
+
id: 1,
|
|
4
|
+
imageUrl: 'https://images.unsplash.com/photo-1507525428034-b723cf961d3e?q=80&w=1170&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',
|
|
5
|
+
title: 'Hotel Baía Azul',
|
|
6
|
+
isFavorite: true,
|
|
7
|
+
},
|
|
8
|
+
{
|
|
9
|
+
id: 2,
|
|
10
|
+
imageUrl: 'https://images.unsplash.com/photo-1507525428034-b723cf961d3e?q=80&w=1170&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',
|
|
11
|
+
title: 'Miramar Suites',
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
id: 3,
|
|
15
|
+
imageUrl: 'https://images.unsplash.com/photo-1507525428034-b723cf961d3e?q=80&w=1170&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',
|
|
16
|
+
title: 'Palm Resort & Spa',
|
|
17
|
+
isFavorite: true
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
id: 4,
|
|
21
|
+
imageUrl: 'https://images.unsplash.com/photo-1507525428034-b723cf961d3e?q=80&w=1170&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',
|
|
22
|
+
title: 'Hotel Central Park',
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
id: 5,
|
|
26
|
+
imageUrl: 'https://images.unsplash.com/photo-1507525428034-b723cf961d3e?q=80&w=1170&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D',
|
|
27
|
+
title: 'Villa Serena Boutique',
|
|
28
|
+
isFavorite: true,
|
|
29
|
+
},
|
|
30
|
+
];
|
|
31
|
+
export default items;
|
|
@@ -1,28 +1,28 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
import { Button } from "../../../ui/button/index.js";
|
|
3
|
+
import { HeartAddIcon, HeartRemoveIcon } from "@hugeicons/core-free-icons";
|
|
4
|
+
import { HugeiconsIcon } from "@hugeicons/svelte";
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
type Props = {
|
|
7
|
+
isFavorite: boolean;
|
|
8
|
+
onFavoriteClick?: () => void;
|
|
9
|
+
};
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
let { isFavorite, onFavoriteClick }: Props = $props();
|
|
12
12
|
</script>
|
|
13
13
|
|
|
14
14
|
{#if isFavorite}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
15
|
+
<Button
|
|
16
|
+
class="w-8 h-8 rounded-full bg-[#ce2356]"
|
|
17
|
+
onclick={() => onFavoriteClick!()}
|
|
18
|
+
>
|
|
19
|
+
<HugeiconsIcon icon={HeartRemoveIcon} />
|
|
20
|
+
</Button>
|
|
21
21
|
{:else}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
22
|
+
<Button
|
|
23
|
+
class="w-8 h-8 rounded-full bg-[#808080]"
|
|
24
|
+
onclick={() => onFavoriteClick!()}
|
|
25
|
+
>
|
|
26
|
+
<HugeiconsIcon icon={HeartAddIcon} />
|
|
27
|
+
</Button>
|
|
28
28
|
{/if}
|
|
@@ -42,3 +42,13 @@ export interface CardProfileProps {
|
|
|
42
42
|
onButtonProfile?: (id: string | number) => void;
|
|
43
43
|
onButtonDetails?: (id: string | number) => void;
|
|
44
44
|
}
|
|
45
|
+
export interface CardPromotionProps {
|
|
46
|
+
id: string | number;
|
|
47
|
+
logo?: string;
|
|
48
|
+
imageUrl?: string;
|
|
49
|
+
title?: string;
|
|
50
|
+
className?: string;
|
|
51
|
+
isFavorite?: boolean;
|
|
52
|
+
oldPrice?: string | number;
|
|
53
|
+
newPrice?: string | number;
|
|
54
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import CardPromotion from "../../../card/promotion/CardPromotion.svelte";
|
|
3
|
+
import type { CarouselPromotionProps } from "../../types.js";
|
|
4
|
+
import Button from "../../../../ui/button/button.svelte";
|
|
5
|
+
import CarouselSlot from "../../../panel/CarouselSlot.svelte";
|
|
6
|
+
import { t } from "../../../../../i18n";
|
|
7
|
+
import { HugeiconsIcon } from "@hugeicons/svelte";
|
|
8
|
+
import { ArrowRight02Icon } from "@hugeicons/core-free-icons";
|
|
9
|
+
|
|
10
|
+
const {
|
|
11
|
+
title,
|
|
12
|
+
items,
|
|
13
|
+
isButtonPreviousAndNext = true,
|
|
14
|
+
buttonPreviousAndNextClass = "",
|
|
15
|
+
containerClass = "",
|
|
16
|
+
onButtonViewAll,
|
|
17
|
+
}: CarouselPromotionProps = $props();
|
|
18
|
+
</script>
|
|
19
|
+
|
|
20
|
+
<div class="w-full flex justify-center">
|
|
21
|
+
<div class="w-[95%] p-2 rounded-xl {containerClass}">
|
|
22
|
+
<div class="ml-10 flex flex-col gap-1">
|
|
23
|
+
<div class="flex justify-between">
|
|
24
|
+
<div class="text-xl">{title ?? $t("label.promotion")}</div>
|
|
25
|
+
{#if onButtonViewAll}
|
|
26
|
+
<div>
|
|
27
|
+
<Button
|
|
28
|
+
variant="ghost"
|
|
29
|
+
size="sm"
|
|
30
|
+
class="flex items-center gap-0.5"
|
|
31
|
+
onclick={onButtonViewAll}
|
|
32
|
+
>
|
|
33
|
+
{$t("label.view.full")}
|
|
34
|
+
<HugeiconsIcon icon={ArrowRight02Icon} />
|
|
35
|
+
</Button>
|
|
36
|
+
</div>
|
|
37
|
+
{/if}
|
|
38
|
+
</div>
|
|
39
|
+
</div>
|
|
40
|
+
<CarouselSlot
|
|
41
|
+
isBorderBottom={false}
|
|
42
|
+
{isButtonPreviousAndNext}
|
|
43
|
+
{buttonPreviousAndNextClass}
|
|
44
|
+
containerClass="w-full"
|
|
45
|
+
>
|
|
46
|
+
{#each items as item (item.id)}
|
|
47
|
+
<div class="mx-2">
|
|
48
|
+
<CardPromotion {...item} />
|
|
49
|
+
</div>
|
|
50
|
+
{/each}
|
|
51
|
+
</CarouselSlot>
|
|
52
|
+
</div>
|
|
53
|
+
</div>
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import * as Carousel from "../../../../ui/carousel/index.js";
|
|
3
|
+
import type { SimpleBadgeCarouselProps } from "../../types.js";
|
|
4
|
+
import { HugeiconsIcon } from "@hugeicons/svelte";
|
|
5
|
+
import CarouselSlot from "../../../panel/CarouselSlot.svelte";
|
|
6
|
+
|
|
7
|
+
const {
|
|
8
|
+
items,
|
|
9
|
+
imageClass,
|
|
10
|
+
iconClass,
|
|
11
|
+
labelClass,
|
|
12
|
+
activeClass,
|
|
13
|
+
valueActive,
|
|
14
|
+
orientation = "horizontal",
|
|
15
|
+
isBorderItem = true,
|
|
16
|
+
isBorderBottom = true,
|
|
17
|
+
isButtonPreviousAndNext = true,
|
|
18
|
+
buttonPreviousAndNextClass = "",
|
|
19
|
+
}: SimpleBadgeCarouselProps = $props();
|
|
20
|
+
|
|
21
|
+
const DEFAULT_IMG_OR_ICON_CLASS = "size-5 rounded-lg";
|
|
22
|
+
</script>
|
|
23
|
+
|
|
24
|
+
<CarouselSlot
|
|
25
|
+
{isBorderBottom}
|
|
26
|
+
{isButtonPreviousAndNext}
|
|
27
|
+
{buttonPreviousAndNextClass}
|
|
28
|
+
>
|
|
29
|
+
{#each items as item (item.value)}
|
|
30
|
+
<Carousel.Item
|
|
31
|
+
onclick={() => item.onClick?.(item.value)}
|
|
32
|
+
class={`
|
|
33
|
+
flex cursor-pointer items-center justify-center gap-1 basis-auto mx-3 pl-0
|
|
34
|
+
${isBorderItem ? "border border-solid border-gray-300 rounded-lg" : ""}
|
|
35
|
+
${item.value === valueActive ? activeClass : ""}`}
|
|
36
|
+
>
|
|
37
|
+
<div
|
|
38
|
+
class={`
|
|
39
|
+
flex gap-1 mx-2 p-0.5 justify-center items-center
|
|
40
|
+
${orientation === "horizontal" ? "flex-row" : "flex-col"}
|
|
41
|
+
`}
|
|
42
|
+
>
|
|
43
|
+
{#if item.image}
|
|
44
|
+
<img
|
|
45
|
+
src={item.image}
|
|
46
|
+
alt={item.label}
|
|
47
|
+
class={imageClass || DEFAULT_IMG_OR_ICON_CLASS}
|
|
48
|
+
/>
|
|
49
|
+
{:else if item.icon}
|
|
50
|
+
<HugeiconsIcon
|
|
51
|
+
icon={item.icon}
|
|
52
|
+
class={iconClass || DEFAULT_IMG_OR_ICON_CLASS}
|
|
53
|
+
/>
|
|
54
|
+
{/if}
|
|
55
|
+
<div class={`${labelClass}`}>{item.label}</div>
|
|
56
|
+
</div>
|
|
57
|
+
</Carousel.Item>
|
|
58
|
+
{/each}
|
|
59
|
+
</CarouselSlot>
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { IconSvgElement } from "@hugeicons/svelte";
|
|
2
|
+
import type { CardPromotionProps } from "../card/types";
|
|
2
3
|
export interface ItemCarousel {
|
|
3
4
|
value: string;
|
|
4
5
|
label: string;
|
|
@@ -8,7 +9,7 @@ export interface ItemCarousel {
|
|
|
8
9
|
isActive?: boolean;
|
|
9
10
|
onClick?: (value: string) => void;
|
|
10
11
|
}
|
|
11
|
-
export interface
|
|
12
|
+
export interface SimpleBadgeCarouselProps {
|
|
12
13
|
items: ItemCarousel[];
|
|
13
14
|
orientation?: "horizontal" | "vertical";
|
|
14
15
|
imageClass?: string;
|
|
@@ -21,3 +22,13 @@ export interface SimpleCarouselProps {
|
|
|
21
22
|
isButtonPreviousAndNext?: boolean;
|
|
22
23
|
buttonPreviousAndNextClass?: string;
|
|
23
24
|
}
|
|
25
|
+
export interface CarouselPromotionProps {
|
|
26
|
+
title?: string;
|
|
27
|
+
description?: string;
|
|
28
|
+
items: CardPromotionProps[];
|
|
29
|
+
isBorderBottom?: boolean;
|
|
30
|
+
isButtonPreviousAndNext?: boolean;
|
|
31
|
+
buttonPreviousAndNextClass?: string;
|
|
32
|
+
containerClass?: string;
|
|
33
|
+
onButtonViewAll?: () => void;
|
|
34
|
+
}
|
|
@@ -0,0 +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>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Snippet } from "svelte";
|
|
2
|
+
type Props = {
|
|
3
|
+
isBorderBottom?: boolean;
|
|
4
|
+
isButtonPreviousAndNext?: boolean;
|
|
5
|
+
buttonPreviousAndNextClass?: string;
|
|
6
|
+
containerClass?: string;
|
|
7
|
+
children: Snippet;
|
|
8
|
+
};
|
|
9
|
+
declare const CarouselSlot: import("svelte").Component<Props, {}, "">;
|
|
10
|
+
type CarouselSlot = ReturnType<typeof CarouselSlot>;
|
|
11
|
+
export default CarouselSlot;
|
package/dist/globals.css
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
--color-red-900: oklch(39.6% 0.141 25.723);
|
|
10
10
|
--color-yellow-500: oklch(79.5% 0.184 86.047);
|
|
11
11
|
--color-green-500: oklch(72.3% 0.219 149.579);
|
|
12
|
+
--color-blue-50: oklch(97% 0.014 254.604);
|
|
12
13
|
--color-blue-500: oklch(62.3% 0.214 259.815);
|
|
13
14
|
--color-blue-900: oklch(37.9% 0.146 265.522);
|
|
14
15
|
--color-slate-400: oklch(70.4% 0.04 256.788);
|
|
@@ -256,6 +257,9 @@
|
|
|
256
257
|
.inset-0 {
|
|
257
258
|
inset: 0px;
|
|
258
259
|
}
|
|
260
|
+
.inset-x-0 {
|
|
261
|
+
inset-inline: 0px;
|
|
262
|
+
}
|
|
259
263
|
.inset-y-0 {
|
|
260
264
|
inset-block: 0px;
|
|
261
265
|
}
|
|
@@ -283,6 +287,9 @@
|
|
|
283
287
|
.top-0 {
|
|
284
288
|
top: 0px;
|
|
285
289
|
}
|
|
290
|
+
.top-1 {
|
|
291
|
+
top: var(--spacing);
|
|
292
|
+
}
|
|
286
293
|
.top-1\.5 {
|
|
287
294
|
top: calc(var(--spacing) * 1.5);
|
|
288
295
|
}
|
|
@@ -331,6 +338,9 @@
|
|
|
331
338
|
.bottom-0 {
|
|
332
339
|
bottom: 0px;
|
|
333
340
|
}
|
|
341
|
+
.bottom-1 {
|
|
342
|
+
bottom: var(--spacing);
|
|
343
|
+
}
|
|
334
344
|
.bottom-2 {
|
|
335
345
|
bottom: calc(var(--spacing) * 2);
|
|
336
346
|
}
|
|
@@ -765,6 +775,9 @@
|
|
|
765
775
|
.w-\[15px\] {
|
|
766
776
|
width: 15px;
|
|
767
777
|
}
|
|
778
|
+
.w-\[95\%\] {
|
|
779
|
+
width: 95%;
|
|
780
|
+
}
|
|
768
781
|
.w-\[100px\] {
|
|
769
782
|
width: 100px;
|
|
770
783
|
}
|
|
@@ -801,6 +814,9 @@
|
|
|
801
814
|
.max-w-7xl {
|
|
802
815
|
max-width: var(--container-7xl);
|
|
803
816
|
}
|
|
817
|
+
.max-w-11\/12 {
|
|
818
|
+
max-width: calc(11 / 12 * 100%);
|
|
819
|
+
}
|
|
804
820
|
.max-w-\[calc\(100\%-2rem\)\] {
|
|
805
821
|
max-width: calc(100% - 2rem);
|
|
806
822
|
}
|
|
@@ -1281,6 +1297,12 @@
|
|
|
1281
1297
|
.bg-background {
|
|
1282
1298
|
background-color: var(--background);
|
|
1283
1299
|
}
|
|
1300
|
+
.bg-black\/5 {
|
|
1301
|
+
background-color: color-mix(in srgb, #000 5%, transparent);
|
|
1302
|
+
@supports (color: color-mix(in lab, red, red)) {
|
|
1303
|
+
background-color: color-mix(in oklab, var(--color-black) 5%, transparent);
|
|
1304
|
+
}
|
|
1305
|
+
}
|
|
1284
1306
|
.bg-black\/10 {
|
|
1285
1307
|
background-color: color-mix(in srgb, #000 10%, transparent);
|
|
1286
1308
|
@supports (color: color-mix(in lab, red, red)) {
|
|
@@ -1305,6 +1327,9 @@
|
|
|
1305
1327
|
background-color: color-mix(in oklab, var(--color-black) 80%, transparent);
|
|
1306
1328
|
}
|
|
1307
1329
|
}
|
|
1330
|
+
.bg-blue-50 {
|
|
1331
|
+
background-color: var(--color-blue-50);
|
|
1332
|
+
}
|
|
1308
1333
|
.bg-blue-500 {
|
|
1309
1334
|
background-color: var(--color-blue-500);
|
|
1310
1335
|
}
|
|
@@ -1419,6 +1444,9 @@
|
|
|
1419
1444
|
.object-cover {
|
|
1420
1445
|
object-fit: cover;
|
|
1421
1446
|
}
|
|
1447
|
+
.object-center {
|
|
1448
|
+
object-position: center;
|
|
1449
|
+
}
|
|
1422
1450
|
.p-0 {
|
|
1423
1451
|
padding: 0px;
|
|
1424
1452
|
}
|
|
@@ -3152,6 +3180,9 @@
|
|
|
3152
3180
|
.md\:flex {
|
|
3153
3181
|
display: flex;
|
|
3154
3182
|
}
|
|
3183
|
+
.md\:h-37\.5 {
|
|
3184
|
+
height: calc(var(--spacing) * 37.5);
|
|
3185
|
+
}
|
|
3155
3186
|
.md\:min-h-15 {
|
|
3156
3187
|
min-height: calc(var(--spacing) * 15);
|
|
3157
3188
|
}
|
|
@@ -3164,6 +3195,9 @@
|
|
|
3164
3195
|
.md\:w-11\/12 {
|
|
3165
3196
|
width: calc(11 / 12 * 100%);
|
|
3166
3197
|
}
|
|
3198
|
+
.md\:w-37\.5 {
|
|
3199
|
+
width: calc(var(--spacing) * 37.5);
|
|
3200
|
+
}
|
|
3167
3201
|
.md\:max-w-md {
|
|
3168
3202
|
max-width: var(--container-md);
|
|
3169
3203
|
}
|
|
@@ -3252,9 +3286,15 @@
|
|
|
3252
3286
|
.lg\:block {
|
|
3253
3287
|
display: block;
|
|
3254
3288
|
}
|
|
3289
|
+
.lg\:h-50 {
|
|
3290
|
+
height: calc(var(--spacing) * 50);
|
|
3291
|
+
}
|
|
3255
3292
|
.lg\:h-105 {
|
|
3256
3293
|
height: calc(var(--spacing) * 105);
|
|
3257
3294
|
}
|
|
3295
|
+
.lg\:w-50 {
|
|
3296
|
+
width: calc(var(--spacing) * 50);
|
|
3297
|
+
}
|
|
3258
3298
|
.lg\:w-105 {
|
|
3259
3299
|
width: calc(var(--spacing) * 105);
|
|
3260
3300
|
}
|
|
@@ -3318,6 +3358,9 @@
|
|
|
3318
3358
|
background-color: color-mix(in oklab, var(--destructive) 20%, transparent);
|
|
3319
3359
|
}
|
|
3320
3360
|
}
|
|
3361
|
+
.dark\:bg-gray-800:is(.dark *) {
|
|
3362
|
+
background-color: var(--color-gray-800);
|
|
3363
|
+
}
|
|
3321
3364
|
.dark\:bg-input\/30:is(.dark *) {
|
|
3322
3365
|
background-color: var(--input);
|
|
3323
3366
|
@supports (color: color-mix(in lab, red, red)) {
|
|
@@ -4050,7 +4093,7 @@
|
|
|
4050
4093
|
.container-fixed {
|
|
4051
4094
|
width: calc(11 / 12 * 100%);
|
|
4052
4095
|
@media (width >= 64rem) {
|
|
4053
|
-
width: calc(
|
|
4096
|
+
width: calc(11 / 12 * 100%);
|
|
4054
4097
|
}
|
|
4055
4098
|
}
|
|
4056
4099
|
}
|
package/dist/i18n/langs/en.d.ts
CHANGED
package/dist/i18n/langs/en.js
CHANGED
|
@@ -55,6 +55,7 @@ export default {
|
|
|
55
55
|
"label.close": "Close",
|
|
56
56
|
"label.navigation": "Navigation",
|
|
57
57
|
"label.navigation.text": "Navigate through our application to access all features features and content",
|
|
58
|
+
"label.promotion": "Promotions",
|
|
58
59
|
"text.login": "Enter your credentials below to securely access your account and continue where you left off.",
|
|
59
60
|
"text.register": "Fill in the fields below with your information to create your new account and enjoy all our features.",
|
|
60
61
|
"text.forget-password": "Enter your email address below and we will send you a link to reset your password.",
|
package/dist/i18n/langs/pt.d.ts
CHANGED
package/dist/i18n/langs/pt.js
CHANGED
|
@@ -55,6 +55,7 @@ export default {
|
|
|
55
55
|
"label.close": "Fechar",
|
|
56
56
|
"label.navigation": "Navegação",
|
|
57
57
|
"label.navigation.text": "Navega pela nossa aplicação",
|
|
58
|
+
"label.promotion": "Promoções",
|
|
58
59
|
"text.login": "Insira as suas credenciais abaixo para aceder à sua conta com segurança e continuar de onde parou.",
|
|
59
60
|
"text.register": "Preencha os campos abaixo com as suas informações para criar a sua nova conta e aproveitar todos os nossos recursos.",
|
|
60
61
|
"text.forget-password": "Insira o seu endereço de email abaixo e enviaremos um link para redefinir a sua senha.",
|
|
@@ -56,6 +56,7 @@ declare const _default: {
|
|
|
56
56
|
"label.close": string;
|
|
57
57
|
"label.navigation": string;
|
|
58
58
|
"label.navigation.text": string;
|
|
59
|
+
"label.promotion": string;
|
|
59
60
|
"text.login": string;
|
|
60
61
|
"text.register": string;
|
|
61
62
|
"text.forget-password": string;
|
|
@@ -145,6 +146,7 @@ declare const _default: {
|
|
|
145
146
|
"label.close": string;
|
|
146
147
|
"label.navigation": string;
|
|
147
148
|
"label.navigation.text": string;
|
|
149
|
+
"label.promotion": string;
|
|
148
150
|
"text.login": string;
|
|
149
151
|
"text.register": string;
|
|
150
152
|
"text.forget-password": string;
|
package/dist/index.d.ts
CHANGED
|
@@ -13,6 +13,7 @@ import PrivacyPolicyOrTermsOfUse from "./components/pages/privacy-policy-or-term
|
|
|
13
13
|
import PageOtpVerification from "./components/pages/security/otp-verification/PageOtpVerification.svelte";
|
|
14
14
|
import PageForgetPassword from "./components/pages/security/forget-password/PageForgetPassword.svelte";
|
|
15
15
|
import PageResetPassword from "./components/pages/security/reset-password/PageResetPassword.svelte";
|
|
16
|
+
import SimpleBadgeCarousel from "./components/core/carousel/shared/ui/SimpleBadgeCarousel.svelte";
|
|
16
17
|
import PageLogin from "./components/pages/security/login/PageLogin.svelte";
|
|
17
18
|
import SearchInput from "./components/core/search/SearchInput.svelte";
|
|
18
19
|
import NavMenu from "./components/core/nav/ui/nav-menu.svelte";
|
|
@@ -29,7 +30,7 @@ export { getMergedTranslations } from "./i18n/config";
|
|
|
29
30
|
export { getLocales } from "./i18n/config";
|
|
30
31
|
export {
|
|
31
32
|
/** Componente raiz do Negodesign. Configura o tema, idioma e traduções. @property {Record<string, Record<string, string>>} translations - Traduções customizadas @property {Snippet} children - Conteúdo da aplicação */
|
|
32
|
-
NegoDesign, NavMenu, SearchInput,
|
|
33
|
+
NegoDesign, NavMenu, SearchInput, SimpleBadgeCarousel,
|
|
33
34
|
/** Página de login com carousel hero e card de autenticação. @see PageLoginProps */
|
|
34
35
|
PageLogin,
|
|
35
36
|
/** Página de recuperação de senha com carousel hero e card de recuperação. @see PageForgetPasswordProps */
|
package/dist/index.js
CHANGED
|
@@ -13,6 +13,7 @@ import PrivacyPolicyOrTermsOfUse from "./components/pages/privacy-policy-or-term
|
|
|
13
13
|
import PageOtpVerification from "./components/pages/security/otp-verification/PageOtpVerification.svelte";
|
|
14
14
|
import PageForgetPassword from "./components/pages/security/forget-password/PageForgetPassword.svelte";
|
|
15
15
|
import PageResetPassword from "./components/pages/security/reset-password/PageResetPassword.svelte";
|
|
16
|
+
import SimpleBadgeCarousel from "./components/core/carousel/shared/ui/SimpleBadgeCarousel.svelte";
|
|
16
17
|
import PageLogin from "./components/pages/security/login/PageLogin.svelte";
|
|
17
18
|
import SearchInput from "./components/core/search/SearchInput.svelte";
|
|
18
19
|
import NavMenu from "./components/core/nav/ui/nav-menu.svelte";
|
|
@@ -29,7 +30,7 @@ export { getMergedTranslations } from "./i18n/config";
|
|
|
29
30
|
export { getLocales } from "./i18n/config";
|
|
30
31
|
export {
|
|
31
32
|
/** Componente raiz do Negodesign. Configura o tema, idioma e traduções. @property {Record<string, Record<string, string>>} translations - Traduções customizadas @property {Snippet} children - Conteúdo da aplicação */
|
|
32
|
-
NegoDesign, NavMenu, SearchInput,
|
|
33
|
+
NegoDesign, NavMenu, SearchInput, SimpleBadgeCarousel,
|
|
33
34
|
/** Página de login com carousel hero e card de autenticação. @see PageLoginProps */
|
|
34
35
|
PageLogin,
|
|
35
36
|
/** Página de recuperação de senha com carousel hero e card de recuperação. @see PageForgetPasswordProps */
|
package/dist/styles/globals.css
CHANGED
|
@@ -16,7 +16,9 @@
|
|
|
16
16
|
@apply max-md:bg-linear-to-r max-md:from-[#0077b6] max-md:via-[#219ebc] max-md:to-[#219ebc] dark:max-md:from-[#06344d] dark:max-md:via-[#023845] dark:max-md:to-[#074656];
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
-
.container-fixed {
|
|
19
|
+
.container-fixed {
|
|
20
|
+
@apply w-11/12 lg:w-11/12;
|
|
21
|
+
}
|
|
20
22
|
}
|
|
21
23
|
|
|
22
24
|
:root {
|
|
@@ -134,10 +136,12 @@
|
|
|
134
136
|
* {
|
|
135
137
|
@apply border-border outline-ring/50;
|
|
136
138
|
}
|
|
139
|
+
|
|
137
140
|
body {
|
|
138
141
|
@apply bg-background text-foreground;
|
|
139
142
|
}
|
|
143
|
+
|
|
140
144
|
html {
|
|
141
145
|
@apply font-sans;
|
|
142
146
|
}
|
|
143
|
-
}
|
|
147
|
+
}
|
package/package.json
CHANGED
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import * as Carousel from "../../../ui/carousel/index.js";
|
|
3
|
-
import type { SimpleCarouselProps } from "../types.js";
|
|
4
|
-
import { HugeiconsIcon } from "@hugeicons/svelte";
|
|
5
|
-
|
|
6
|
-
const {
|
|
7
|
-
items,
|
|
8
|
-
imageClass,
|
|
9
|
-
iconClass,
|
|
10
|
-
labelClass,
|
|
11
|
-
activeClass,
|
|
12
|
-
valueActive,
|
|
13
|
-
orientation = "horizontal",
|
|
14
|
-
isBorderItem = true,
|
|
15
|
-
isBorderBottom = true,
|
|
16
|
-
isButtonPreviousAndNext = true,
|
|
17
|
-
buttonPreviousAndNextClass = "",
|
|
18
|
-
}: SimpleCarouselProps = $props();
|
|
19
|
-
|
|
20
|
-
const DEFAULT_IMG_OR_ICON_CLASS = "size-5 rounded-lg";
|
|
21
|
-
</script>
|
|
22
|
-
|
|
23
|
-
<nav class={`relative py-3 px-2 ${isBorderBottom ? "border-b" : ""}`}>
|
|
24
|
-
<Carousel.Root>
|
|
25
|
-
<Carousel.Content class="ml-10">
|
|
26
|
-
{#each items as item (item.value)}
|
|
27
|
-
<Carousel.Item
|
|
28
|
-
onclick={() => item.onClick?.(item.value)}
|
|
29
|
-
class={`
|
|
30
|
-
flex cursor-pointer items-center justify-center gap-1 basis-auto mx-3 pl-0
|
|
31
|
-
${isBorderItem ? "border border-solid border-gray-300 rounded-lg" : ""}
|
|
32
|
-
${item.value === valueActive ? activeClass : ""}`}
|
|
33
|
-
>
|
|
34
|
-
<div class={`
|
|
35
|
-
flex gap-1 mx-2 p-0.5 justify-center items-center
|
|
36
|
-
${orientation === "horizontal" ? "flex-row" : "flex-col"}
|
|
37
|
-
`}>
|
|
38
|
-
{#if item.image}
|
|
39
|
-
<img
|
|
40
|
-
src={item.image}
|
|
41
|
-
alt={item.label}
|
|
42
|
-
class={imageClass || DEFAULT_IMG_OR_ICON_CLASS}
|
|
43
|
-
/>
|
|
44
|
-
{:else if item.icon}
|
|
45
|
-
<HugeiconsIcon
|
|
46
|
-
icon={item.icon}
|
|
47
|
-
class={iconClass || DEFAULT_IMG_OR_ICON_CLASS}
|
|
48
|
-
/>
|
|
49
|
-
{/if}
|
|
50
|
-
<div class={`${labelClass}`}>{item.label}</div>
|
|
51
|
-
</div>
|
|
52
|
-
</Carousel.Item>
|
|
53
|
-
{/each}
|
|
54
|
-
</Carousel.Content>
|
|
55
|
-
{#if isButtonPreviousAndNext}
|
|
56
|
-
<Carousel.Previous
|
|
57
|
-
class={`absolute top-1/2 -translate-y-1/2 left-1 mt-0.5 ${buttonPreviousAndNextClass}`}
|
|
58
|
-
/>
|
|
59
|
-
<Carousel.Next class={`absolute top-1/2 -translate-y-1/2 right-1 mt-0.5 ${buttonPreviousAndNextClass}`} />
|
|
60
|
-
{/if}
|
|
61
|
-
</Carousel.Root>
|
|
62
|
-
</nav>
|