negodesign 0.0.29 → 0.0.31
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/assets/lonely-404.mp4 +0 -0
- package/dist/components/core/banner/AdCardBanner.svelte.d.ts +4 -0
- package/dist/components/core/banner/CtaCardBanner.svelte +118 -0
- package/dist/components/core/banner/CtaCardBanner.svelte.d.ts +4 -0
- package/dist/components/core/banner/{BannerNotification.svelte → NotificationBanner.svelte} +4 -3
- package/dist/components/core/banner/NotificationBanner.svelte.d.ts +4 -0
- package/dist/components/core/banner/types.d.ts +38 -7
- package/dist/components/core/card/highlight/01/CardHighlight01.svelte +15 -26
- package/dist/components/core/card/highlight/02/CardHighlight02.svelte +13 -24
- package/dist/components/core/card/media/01/CardMedia01.svelte +2 -12
- package/dist/components/core/card/media/02/CardMedia02.svelte +2 -12
- package/dist/components/core/card/promotion/CardPromotion.svelte +5 -1
- package/dist/components/core/card/shared/CardButton.svelte +9 -3
- package/dist/components/core/card/shared/CardButton.svelte.d.ts +1 -1
- package/dist/components/core/card/shared/CardLogo.svelte +19 -0
- package/dist/components/core/card/shared/CardLogo.svelte.d.ts +7 -0
- package/dist/components/core/card/shared/CardThumbnailVideo.svelte +3 -0
- package/dist/components/core/card/types.d.ts +97 -0
- package/dist/components/core/carousel/grid/media/types.d.ts +11 -0
- package/dist/components/core/carousel/grid/media/ui/CarouselGridMedia.svelte +2 -1
- package/dist/components/core/carousel/grid/profile/types.d.ts +11 -0
- package/dist/components/core/carousel/grid/profile/ui/CarouselGridProfile.svelte +3 -5
- package/dist/components/core/carousel/grid/shared/ui/CarouselGridSlot.svelte +4 -9
- package/dist/components/core/carousel/grid/shared/ui/CarouselGridSlot.svelte.d.ts +1 -0
- package/dist/components/core/carousel/highlights/types.d.ts +11 -0
- package/dist/components/core/carousel/promotion/types.d.ts +10 -0
- package/dist/components/core/carousel/types.d.ts +56 -0
- package/dist/components/core/datatable/data/data-table.d.ts +25 -0
- package/dist/components/core/footer/types.d.ts +51 -0
- package/dist/components/core/footer/types.js +1 -0
- package/dist/components/core/footer/ui/01/Footer01.svelte +76 -0
- package/dist/components/core/footer/ui/01/Footer01.svelte.d.ts +4 -0
- package/dist/components/core/footer/ui/02/Footer02.svelte +53 -0
- package/dist/components/core/footer/ui/02/Footer02.svelte.d.ts +4 -0
- package/dist/components/core/footer/ui/Footer.svelte +18 -0
- package/dist/components/core/footer/ui/Footer.svelte.d.ts +7 -0
- package/dist/components/core/footer/ui/shared/FooterColumn.svelte +18 -0
- package/dist/components/core/footer/ui/shared/FooterColumn.svelte.d.ts +4 -0
- package/dist/components/core/footer/ui/shared/FooterNewsLetter.svelte +57 -0
- package/dist/components/core/footer/ui/shared/FooterNewsLetter.svelte.d.ts +9 -0
- package/dist/components/core/footer/ui/shared/FooterSocialIcon.svelte +62 -0
- package/dist/components/core/footer/ui/shared/FooterSocialIcon.svelte.d.ts +4 -0
- package/dist/components/core/nav/data/nav-menu-sidebar.d.ts +29 -0
- package/dist/components/core/nav/data/nav-menu.d.ts +43 -0
- package/dist/components/core/nav/data/nav-user-sidebar.d.ts +14 -0
- package/dist/components/core/nav/ui/menu-links.svelte +1 -1
- package/dist/components/core/panel/CarouselSlot.svelte +2 -2
- package/dist/components/core/panel/LeftHero.svelte +2 -2
- package/dist/components/core/panel/type.d.ts +11 -0
- package/dist/components/core/search/types.d.ts +17 -5
- package/dist/components/core/sidebar/types.d.ts +19 -0
- package/dist/components/core/sidebar/types.js +1 -0
- package/dist/components/core/tabs/data/TabModel.d.ts +11 -0
- package/dist/components/core/tabs/types.d.ts +11 -0
- package/dist/components/core/tabs/types.js +1 -0
- package/dist/components/pages/admin/01/ui/types.d.ts +21 -0
- package/dist/components/pages/admin/01/ui/types.js +1 -0
- package/dist/components/pages/product-details/01/ProductDetails01.svelte +71 -0
- package/dist/components/pages/product-details/01/ProductDetails01.svelte.d.ts +11 -0
- package/dist/components/pages/product-details/02/ProductDetails02.svelte +88 -0
- package/dist/components/pages/product-details/02/ProductDetails02.svelte.d.ts +11 -0
- package/dist/components/pages/product-details/03/ProductDetails03.svelte +77 -0
- package/dist/components/pages/product-details/03/ProductDetails03.svelte.d.ts +11 -0
- package/dist/components/pages/product-details/04/ProductDetails04.svelte +65 -0
- package/dist/components/pages/product-details/04/ProductDetails04.svelte.d.ts +11 -0
- package/dist/components/pages/product-details/ProductDetails.svelte +38 -0
- package/dist/components/pages/product-details/ProductDetails.svelte.d.ts +4 -0
- package/dist/components/pages/product-details/shared/ProductDetailActions.svelte +82 -0
- package/dist/components/pages/product-details/shared/ProductDetailActions.svelte.d.ts +13 -0
- package/dist/components/pages/product-details/shared/ProductDetailBreadcrumb.svelte +46 -0
- package/dist/components/pages/product-details/shared/ProductDetailBreadcrumb.svelte.d.ts +8 -0
- package/dist/components/pages/product-details/shared/ProductDetailDescription.svelte +38 -0
- package/dist/components/pages/product-details/shared/ProductDetailDescription.svelte.d.ts +8 -0
- package/dist/components/pages/product-details/shared/ProductDetailFeatures.svelte +40 -0
- package/dist/components/pages/product-details/shared/ProductDetailFeatures.svelte.d.ts +7 -0
- package/dist/components/pages/product-details/shared/ProductDetailFilesVertical.svelte +72 -0
- package/dist/components/pages/product-details/shared/ProductDetailFilesVertical.svelte.d.ts +9 -0
- package/dist/components/pages/product-details/shared/ProductDetailHeader.svelte +41 -0
- package/dist/components/pages/product-details/shared/ProductDetailHeader.svelte.d.ts +9 -0
- package/dist/components/pages/product-details/shared/ProductDetailImage.svelte +70 -0
- package/dist/components/pages/product-details/shared/ProductDetailImage.svelte.d.ts +9 -0
- package/dist/components/pages/product-details/shared/ProductDetailMap.svelte +57 -0
- package/dist/components/pages/product-details/shared/ProductDetailMap.svelte.d.ts +9 -0
- package/dist/components/pages/product-details/shared/ProductDetailPrice.svelte +44 -0
- package/dist/components/pages/product-details/shared/ProductDetailPrice.svelte.d.ts +9 -0
- package/dist/components/pages/product-details/shared/ProductDetailRating.svelte +42 -0
- package/dist/components/pages/product-details/shared/ProductDetailRating.svelte.d.ts +8 -0
- package/dist/components/pages/product-details/shared/ProductDetailReviews.svelte +70 -0
- package/dist/components/pages/product-details/shared/ProductDetailReviews.svelte.d.ts +8 -0
- package/dist/components/pages/product-details/shared/ProductDetailTabs.svelte +96 -0
- package/dist/components/pages/product-details/shared/ProductDetailTabs.svelte.d.ts +12 -0
- package/dist/components/pages/product-details/shared/ProductDetailTags.svelte +35 -0
- package/dist/components/pages/product-details/shared/ProductDetailTags.svelte.d.ts +8 -0
- package/dist/components/pages/product-details/shared/ProductPurchasePanel.svelte +58 -0
- package/dist/components/pages/product-details/shared/ProductPurchasePanel.svelte.d.ts +11 -0
- package/dist/components/pages/product-details/types.d.ts +170 -0
- package/dist/components/pages/product-details/types.js +1 -0
- package/dist/components/pages/profile-user/01/ProfileUser01.svelte +113 -0
- package/dist/components/pages/profile-user/01/ProfileUser01.svelte.d.ts +27 -0
- package/dist/components/pages/profile-user/02/ProfileUser02.svelte +83 -0
- package/dist/components/pages/profile-user/02/ProfileUser02.svelte.d.ts +20 -0
- package/dist/components/pages/profile-user/03/ProfileUser03.svelte +85 -0
- package/dist/components/pages/profile-user/03/ProfileUser03.svelte.d.ts +20 -0
- package/dist/components/pages/profile-user/ProfileUser.svelte +53 -0
- package/dist/components/pages/profile-user/ProfileUser.svelte.d.ts +4 -0
- package/dist/components/pages/profile-user/shared/ProfileUserAddress.svelte +84 -0
- package/dist/components/pages/profile-user/shared/ProfileUserAddress.svelte.d.ts +8 -0
- package/dist/components/pages/profile-user/shared/ProfileUserHeader.svelte +104 -0
- package/dist/components/pages/profile-user/shared/ProfileUserHeader.svelte.d.ts +9 -0
- package/dist/components/pages/profile-user/shared/ProfileUserResetPassword.svelte +116 -0
- package/dist/components/pages/profile-user/shared/ProfileUserResetPassword.svelte.d.ts +7 -0
- package/dist/components/pages/profile-user/shared/ProfileUserSetting.svelte +176 -0
- package/dist/components/pages/profile-user/shared/ProfileUserSetting.svelte.d.ts +14 -0
- package/dist/components/pages/profile-user/shared/ProfileUserTabs.svelte +78 -0
- package/dist/components/pages/profile-user/shared/ProfileUserTabs.svelte.d.ts +22 -0
- package/dist/components/pages/profile-user/types.d.ts +144 -0
- package/dist/components/pages/profile-user/types.js +1 -0
- package/dist/globals.css +319 -4
- package/dist/i18n/langs/en.d.ts +87 -0
- package/dist/i18n/langs/en.js +87 -0
- package/dist/i18n/langs/pt.d.ts +87 -0
- package/dist/i18n/langs/pt.js +93 -6
- package/dist/i18n/translations.d.ts +174 -0
- package/dist/index.d.ts +194 -27
- package/dist/index.js +194 -27
- package/dist/styles/globals.css +1 -1
- package/dist/types/index.d.ts +196 -5
- package/package.json +1 -1
- package/dist/components/core/banner/BannerNotification.svelte.d.ts +0 -4
- package/dist/components/core/banner/CardAdBanner.svelte.d.ts +0 -4
- /package/dist/components/core/banner/{CardAdBanner.svelte → AdCardBanner.svelte} +0 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { t } from "../../../../../i18n";
|
|
3
|
+
import type { FooterProps } from "../../types";
|
|
4
|
+
import FooterColumn from "../shared/FooterColumn.svelte";
|
|
5
|
+
import FooterNewsLetter from "../shared/FooterNewsLetter.svelte";
|
|
6
|
+
import SocialIcon from "../shared/FooterSocialIcon.svelte";
|
|
7
|
+
|
|
8
|
+
let {
|
|
9
|
+
items,
|
|
10
|
+
isNewsletter = false,
|
|
11
|
+
socialsMedia,
|
|
12
|
+
companyName,
|
|
13
|
+
newsletterTitle,
|
|
14
|
+
newsletterDescription,
|
|
15
|
+
onSubscribe,
|
|
16
|
+
}: FooterProps = $props();
|
|
17
|
+
|
|
18
|
+
const year = new Date().getFullYear();
|
|
19
|
+
</script>
|
|
20
|
+
|
|
21
|
+
<footer class="p-10">
|
|
22
|
+
<div class="flex flex-wrap justify-between gap-10">
|
|
23
|
+
{#each items as column, i (i)}
|
|
24
|
+
<FooterColumn title={column.title} items={column.items} />
|
|
25
|
+
{/each}
|
|
26
|
+
|
|
27
|
+
{#if isNewsletter}
|
|
28
|
+
<div class="min-w-60">
|
|
29
|
+
<FooterNewsLetter
|
|
30
|
+
{isNewsletter}
|
|
31
|
+
{newsletterTitle}
|
|
32
|
+
{newsletterDescription}
|
|
33
|
+
{onSubscribe}
|
|
34
|
+
/>
|
|
35
|
+
</div>
|
|
36
|
+
{/if}
|
|
37
|
+
</div>
|
|
38
|
+
|
|
39
|
+
<div
|
|
40
|
+
class="mt-10 flex flex-col gap-4 border-t border-gray/10 pt-6 md:flex-row md:items-center md:justify-between"
|
|
41
|
+
>
|
|
42
|
+
<p class="text-sm">
|
|
43
|
+
© {year}
|
|
44
|
+
{companyName}
|
|
45
|
+
{$t("footer.copyr")}
|
|
46
|
+
</p>
|
|
47
|
+
<div class="flex items-center gap-4">
|
|
48
|
+
{#each socialsMedia as social, i (i)}
|
|
49
|
+
<SocialIcon icon={social.icon} text={social.text} />
|
|
50
|
+
{/each}
|
|
51
|
+
</div>
|
|
52
|
+
</div>
|
|
53
|
+
</footer>
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import Footer01 from "./01/Footer01.svelte";
|
|
3
|
+
import Footer02 from "./02/Footer02.svelte";
|
|
4
|
+
import type { FooterProps } from "../types";
|
|
5
|
+
|
|
6
|
+
let {
|
|
7
|
+
variant = 1,
|
|
8
|
+
...restProps
|
|
9
|
+
}: FooterProps & {
|
|
10
|
+
variant?: 1 | 2;
|
|
11
|
+
} = $props();
|
|
12
|
+
</script>
|
|
13
|
+
|
|
14
|
+
{#if variant === 2}
|
|
15
|
+
<Footer02 {...restProps} />
|
|
16
|
+
{:else}
|
|
17
|
+
<Footer01 {...restProps} />
|
|
18
|
+
{/if}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { FooterColumnProps } from "../../types";
|
|
3
|
+
|
|
4
|
+
let { title, items }: FooterColumnProps = $props();
|
|
5
|
+
</script>
|
|
6
|
+
|
|
7
|
+
<div class="min-w-27.5">
|
|
8
|
+
<h3 class="mb-4 text-sm font-semibold">{title}</h3>
|
|
9
|
+
<ul class="space-y-3">
|
|
10
|
+
{#each items as item, i (i)}
|
|
11
|
+
<li>
|
|
12
|
+
<a href={item.href ?? "#"} class="text-sm transition-colors">
|
|
13
|
+
{item.text}
|
|
14
|
+
</a>
|
|
15
|
+
</li>
|
|
16
|
+
{/each}
|
|
17
|
+
</ul>
|
|
18
|
+
</div>
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { t } from "../../../../../i18n";
|
|
3
|
+
import type { FooterProps } from "../../types";
|
|
4
|
+
|
|
5
|
+
type Props = {
|
|
6
|
+
isNewsletter?: boolean;
|
|
7
|
+
newsletterTitle?: string;
|
|
8
|
+
newsletterDescription?: string;
|
|
9
|
+
onSubscribe?: (email: string) => void;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
let {
|
|
13
|
+
isNewsletter = false,
|
|
14
|
+
newsletterTitle,
|
|
15
|
+
newsletterDescription,
|
|
16
|
+
onSubscribe,
|
|
17
|
+
}: Props = $props();
|
|
18
|
+
|
|
19
|
+
let email = $state("");
|
|
20
|
+
|
|
21
|
+
function handleSubscribe(e: SubmitEvent) {
|
|
22
|
+
e.preventDefault();
|
|
23
|
+
const value = email.trim();
|
|
24
|
+
if (!value) return;
|
|
25
|
+
onSubscribe?.(value);
|
|
26
|
+
email = "";
|
|
27
|
+
}
|
|
28
|
+
</script>
|
|
29
|
+
|
|
30
|
+
{#if isNewsletter}
|
|
31
|
+
<div>
|
|
32
|
+
<h3 class="mb-1 text-sm font-semibold">
|
|
33
|
+
{newsletterTitle ?? $t("footer.subscribe.title")}
|
|
34
|
+
</h3>
|
|
35
|
+
<p class="text-sm leading-relaxed">
|
|
36
|
+
{newsletterDescription ?? $t("footer.subscribe.text")}
|
|
37
|
+
</p>
|
|
38
|
+
<form
|
|
39
|
+
onsubmit={handleSubscribe}
|
|
40
|
+
class="flex flex-col items-stretch gap-2 sm:flex-row"
|
|
41
|
+
>
|
|
42
|
+
<input
|
|
43
|
+
type="email"
|
|
44
|
+
bind:value={email}
|
|
45
|
+
placeholder="Enter your email"
|
|
46
|
+
required
|
|
47
|
+
class="w-56 rounded-lg border border-gray px-3.5 py-2 text-sm placeholder:text-slate-500 outline-none"
|
|
48
|
+
/>
|
|
49
|
+
<button
|
|
50
|
+
type="submit"
|
|
51
|
+
class="shrink-0 rounded-lg px-4 py-2 text-sm font-medium text-white transition-colors bg-gradient"
|
|
52
|
+
>
|
|
53
|
+
{$t("footer.subscribe")}
|
|
54
|
+
</button>
|
|
55
|
+
</form>
|
|
56
|
+
</div>
|
|
57
|
+
{/if}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
type Props = {
|
|
2
|
+
isNewsletter?: boolean;
|
|
3
|
+
newsletterTitle?: string;
|
|
4
|
+
newsletterDescription?: string;
|
|
5
|
+
onSubscribe?: (email: string) => void;
|
|
6
|
+
};
|
|
7
|
+
declare const FooterNewsLetter: import("svelte").Component<Props, {}, "">;
|
|
8
|
+
type FooterNewsLetter = ReturnType<typeof FooterNewsLetter>;
|
|
9
|
+
export default FooterNewsLetter;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { FooterSocialItem } from "../../types";
|
|
3
|
+
|
|
4
|
+
let { icon, text, href }: FooterSocialItem = $props();
|
|
5
|
+
</script>
|
|
6
|
+
|
|
7
|
+
<a
|
|
8
|
+
{href}
|
|
9
|
+
aria-label={text}
|
|
10
|
+
title={text}
|
|
11
|
+
target="_blank"
|
|
12
|
+
class="transition-color"
|
|
13
|
+
>
|
|
14
|
+
{#if icon === "facebook"}
|
|
15
|
+
<svg viewBox="0 0 24 24" fill="currentColor" class="h-4.5 w-4.5">
|
|
16
|
+
<path
|
|
17
|
+
d="M22 12.06C22 6.5 17.52 2 12 2S2 6.5 2 12.06c0 5 3.66 9.15 8.44 9.94v-7.03H7.9v-2.91h2.54V9.85c0-2.5 1.49-3.89 3.77-3.89 1.09 0 2.24.2 2.24.2v2.46h-1.26c-1.24 0-1.63.77-1.63 1.56v1.88h2.78l-.44 2.91h-2.34V22c4.78-.79 8.44-4.94 8.44-9.94Z"
|
|
18
|
+
/>
|
|
19
|
+
</svg>
|
|
20
|
+
{:else if icon === "instagram"}
|
|
21
|
+
<svg
|
|
22
|
+
viewBox="0 0 24 24"
|
|
23
|
+
fill="none"
|
|
24
|
+
stroke="currentColor"
|
|
25
|
+
stroke-width="1.8"
|
|
26
|
+
class="h-4.5 w-4.5"
|
|
27
|
+
>
|
|
28
|
+
<rect x="3" y="3" width="18" height="18" rx="5" />
|
|
29
|
+
<circle cx="12" cy="12" r="4" />
|
|
30
|
+
<circle cx="17.2" cy="6.8" r="1" fill="currentColor" stroke="none" />
|
|
31
|
+
</svg>
|
|
32
|
+
{:else if icon === "x"}
|
|
33
|
+
<svg viewBox="0 0 24 24" fill="currentColor" class="h-4 w-4">
|
|
34
|
+
<path
|
|
35
|
+
d="M18.9 2H22l-7.6 8.7L23.3 22h-7.3l-5.7-7.1L3.7 22H.6l8.1-9.3L.9 2h7.5l5.2 6.5L18.9 2Zm-1.3 18h1.8L6.5 3.9H4.6L17.6 20Z"
|
|
36
|
+
/>
|
|
37
|
+
</svg>
|
|
38
|
+
{:else if icon === "github"}
|
|
39
|
+
<svg viewBox="0 0 24 24" fill="currentColor" class="h-4.5 w-4.5">
|
|
40
|
+
<path
|
|
41
|
+
d="M12 2a10 10 0 0 0-3.16 19.49c.5.1.68-.22.68-.48v-1.7c-2.78.6-3.37-1.34-3.37-1.34-.46-1.15-1.11-1.46-1.11-1.46-.9-.62.07-.6.07-.6 1 .07 1.53 1.03 1.53 1.03.9 1.52 2.34 1.08 2.91.83.09-.66.35-1.08.63-1.33-2.22-.25-4.56-1.11-4.56-4.93 0-1.09.39-1.98 1.03-2.68-.1-.25-.45-1.27.1-2.65 0 0 .84-.27 2.75 1.02a9.6 9.6 0 0 1 5 0c1.9-1.3 2.74-1.02 2.74-1.02.56 1.38.2 2.4.1 2.65.65.7 1.03 1.59 1.03 2.68 0 3.83-2.34 4.68-4.57 4.92.36.31.68.92.68 1.85v2.74c0 .27.18.58.69.48A10 10 0 0 0 12 2Z"
|
|
42
|
+
/>
|
|
43
|
+
</svg>
|
|
44
|
+
{:else if icon === "youtube"}
|
|
45
|
+
<svg viewBox="0 0 24 24" fill="currentColor" class="h-4.5 w-4.5">
|
|
46
|
+
<path
|
|
47
|
+
d="M22.5 7.2a2.9 2.9 0 0 0-2-2.05C18.7 4.7 12 4.7 12 4.7s-6.7 0-8.5.45a2.9 2.9 0 0 0-2 2.05A30 30 0 0 0 1 12a30 30 0 0 0 .5 4.8 2.9 2.9 0 0 0 2 2.05c1.8.45 8.5.45 8.5.45s6.7 0 8.5-.45a2.9 2.9 0 0 0 2-2.05A30 30 0 0 0 23 12a30 30 0 0 0-.5-4.8ZM9.8 15.2V8.8L15.5 12l-5.7 3.2Z"
|
|
48
|
+
/>
|
|
49
|
+
</svg>
|
|
50
|
+
{:else if icon == "linkedin"}
|
|
51
|
+
<svg
|
|
52
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
53
|
+
viewBox="0 0 384 512"
|
|
54
|
+
fill="currentColor"
|
|
55
|
+
class="h-4.5 w-4.5"
|
|
56
|
+
>
|
|
57
|
+
<path
|
|
58
|
+
d="M204.1 0H180.1C161.9 0 147 14.1 147 32.3V177c0 4.7 0 9.3 1.6 13.7l3.8 11.1-12.2 12.6c-9.3 9.6-16.8 19.7-22.5 30.2-5.7 10.6-8.5 21.5-8.5 32.6V480c0 17.7 14.3 32 32 32h43.3c17.7 0 32-14.3 32-32V256c0-10.7-2.5-21.2-7.5-30.7-5-9.5-12.7-17.2-22.6-22.6l-12.6-6.5 4-11.5c2.5-7.5 4-15.4 4-23.5V32.3c0-17.7-14.1-32.3-32-32.3zM432 0H408c-17.7 0-32 14.3-32 32V256c0 17.7 14.3 32 32 32h44c17.7 0 32-14.3 32-32V32c0-17.7-14.3-32-32-32zm0 192H408v320h44c17.7 0 32-14.3 32-32V224c0-17.7-14.3-32-32-32zM147 323c0-8.4 2.2-16.6 6.4-23.8l13.3-21.7 12.7-6.6c5.5-2.8 11-6.3 16.3-10.4 5.2-4.1 9.6-9 13-14.6 3.4-5.7 5-11.7 5.4-17.9V32.3c0-8.4-2.2-16.6-6.4-23.8l-13.3-21.7-12.7-6.6c-5.5-2.8-11-6.3-16.3-10.4-5.2-4.1-9.6-9-13-14.6-3.4-5.7-5-11.7-5.4-17.9V0c17.7 0 32 14.3 32 32v90.3c0 8.4 2.2 16.6 6.4 23.8l13.3 21.7 12.7 6.6c5.5 2.8 11 6.3 16.3 10.4 5.2 4.1 9.6 9 13 14.6 3.4 5.7 5 11.7 5.4 17.9v90.3c0 17.7-14.3 32-32 32h-44c-17.7 0-32-14.3-32-32v-90.4z"
|
|
59
|
+
/>
|
|
60
|
+
</svg>
|
|
61
|
+
{/if}
|
|
62
|
+
</a>
|
|
@@ -1,21 +1,50 @@
|
|
|
1
1
|
import type { IconSvgElement } from "@hugeicons/svelte";
|
|
2
|
+
/**
|
|
3
|
+
* Grupo/categoria de menus na sidebar (ex: "Gestão", "Relatórios").
|
|
4
|
+
*/
|
|
2
5
|
export interface GroupMenuSidebarProps {
|
|
6
|
+
/** Nome/título do grupo de menus */
|
|
3
7
|
name: string;
|
|
4
8
|
}
|
|
9
|
+
/**
|
|
10
|
+
* Submenu de um item principal da sidebar.
|
|
11
|
+
*/
|
|
5
12
|
export interface SubMenuSidebarProps {
|
|
13
|
+
/** Título do submenu */
|
|
6
14
|
title: string;
|
|
15
|
+
/** URL de destino do submenu */
|
|
7
16
|
url: string;
|
|
17
|
+
/** Ícone SVG do submenu */
|
|
8
18
|
icon: IconSvgElement;
|
|
19
|
+
/** Indica se o submenu está ativo/selecionado */
|
|
9
20
|
isActive?: boolean;
|
|
10
21
|
}
|
|
22
|
+
/**
|
|
23
|
+
* Item de menu principal da sidebar.
|
|
24
|
+
* Pode ser um item simples ou ter submenus.
|
|
25
|
+
*/
|
|
11
26
|
export interface NavMenuSidebarProps {
|
|
27
|
+
/** Título/nome do item de menu */
|
|
12
28
|
title: string;
|
|
29
|
+
/** URL de destino (se não tiver submenus) */
|
|
13
30
|
url?: string;
|
|
31
|
+
/** Ícone SVG do item de menu */
|
|
14
32
|
icon: IconSvgElement;
|
|
33
|
+
/** Indica se o item está ativo/selecionado */
|
|
15
34
|
isActive?: boolean;
|
|
35
|
+
/** Grupo/categoria a que o menu pertence */
|
|
16
36
|
group?: GroupMenuSidebarProps;
|
|
17
37
|
}
|
|
38
|
+
/**
|
|
39
|
+
* Item de menu com submenus aninhados.
|
|
40
|
+
* Estende NavMenuSidebarProps adicionando suporte a submenus.
|
|
41
|
+
*/
|
|
18
42
|
export interface NavMenuAndSubmenuSidebarProps extends NavMenuSidebarProps {
|
|
43
|
+
/** Lista de submenus abaixo do item principal */
|
|
19
44
|
submenus?: SubMenuSidebarProps[];
|
|
20
45
|
}
|
|
46
|
+
/**
|
|
47
|
+
* Tipo união para itens da barra lateral — pode ser
|
|
48
|
+
* um item simples ou um item com submenus.
|
|
49
|
+
*/
|
|
21
50
|
export type NavMenuItem = NavMenuSidebarProps | NavMenuAndSubmenuSidebarProps;
|
|
@@ -1,36 +1,79 @@
|
|
|
1
1
|
import type { IconSvgElement } from "@hugeicons/svelte";
|
|
2
|
+
/**
|
|
3
|
+
* Props do logotipo no NavMenu.
|
|
4
|
+
*/
|
|
2
5
|
export interface NavMenuLogoProps {
|
|
6
|
+
/** URL da imagem do logotipo */
|
|
3
7
|
img?: string;
|
|
8
|
+
/** URL de destino ao clicar no logo */
|
|
4
9
|
url?: string;
|
|
10
|
+
/** Texto alternativo / label do logo */
|
|
5
11
|
label: string;
|
|
12
|
+
/** Classe CSS adicional */
|
|
6
13
|
className?: string;
|
|
14
|
+
/** Callback ao clicar no logo */
|
|
7
15
|
onclick?: () => void;
|
|
8
16
|
}
|
|
17
|
+
/**
|
|
18
|
+
* Props de um link individual no menu de navegação.
|
|
19
|
+
*/
|
|
9
20
|
export interface NavMenuLinksProps {
|
|
21
|
+
/** URL de destino do link */
|
|
10
22
|
url?: string;
|
|
23
|
+
/** Alias de `url` — URL de destino do link (compatibilidade) */
|
|
24
|
+
href?: string;
|
|
25
|
+
/** Texto exibido no link */
|
|
11
26
|
label: string;
|
|
27
|
+
/** Ícone SVG opcional antes do label */
|
|
12
28
|
icon?: IconSvgElement;
|
|
29
|
+
/** Callback ao clicar no link */
|
|
13
30
|
onclick?: () => void;
|
|
14
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* Props de um item de ação (botão ou link) no menu de navegação.
|
|
34
|
+
* Usado para login, registo, etc.
|
|
35
|
+
*/
|
|
15
36
|
export interface NavMenuActionsProps {
|
|
37
|
+
/** URL de destino da ação */
|
|
16
38
|
url?: string;
|
|
39
|
+
/** Texto exibido na ação */
|
|
17
40
|
label: string;
|
|
41
|
+
/** Tipo de elemento: botão estilizado ou link simples */
|
|
18
42
|
type?: 'BUTTON' | 'LINK';
|
|
43
|
+
/** Classe CSS adicional */
|
|
19
44
|
className?: string;
|
|
45
|
+
/** Ícone SVG opcional */
|
|
20
46
|
icon?: IconSvgElement;
|
|
47
|
+
/** Callback ao clicar na ação */
|
|
21
48
|
onclick?: () => void;
|
|
22
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* Props do componente NavMenu — barra de navegação principal
|
|
52
|
+
* com logo, links, ações (login/registo), language switcher e light switch.
|
|
53
|
+
*/
|
|
23
54
|
export interface NavMenuProps {
|
|
55
|
+
/** Classe CSS adicional para o container do nav */
|
|
24
56
|
navClass?: string;
|
|
57
|
+
/** Classe CSS personalizada para cada link */
|
|
25
58
|
linkClass?: string;
|
|
59
|
+
/** Classe CSS personalizada para o grupo de links/açōes */
|
|
26
60
|
groupClass?: string;
|
|
61
|
+
/** Classe CSS personalizada para os botões */
|
|
27
62
|
buttonClass?: string;
|
|
63
|
+
/** Configuração do logotipo */
|
|
28
64
|
logo?: NavMenuLogoProps;
|
|
65
|
+
/** Lista de links de navegação */
|
|
29
66
|
links: NavMenuLinksProps[];
|
|
67
|
+
/** Lista de ações (ex: Login, Registar) */
|
|
30
68
|
actions?: NavMenuActionsProps[];
|
|
69
|
+
/** Alinhamento dos links e das ações */
|
|
31
70
|
align?: 'LINK_SEPARATED_ACTIONS' | 'LINK_INTO_ACTIONS';
|
|
71
|
+
/** Exibe o interruptor de tema (claro/escuro) */
|
|
32
72
|
isLightSwitch?: boolean;
|
|
73
|
+
/** Exibe o seletor de idioma */
|
|
33
74
|
isLanguageSwitcher?: boolean;
|
|
75
|
+
/** Callback ao clicar no botão Login */
|
|
34
76
|
onclickButtonLogin?: () => void;
|
|
77
|
+
/** Callback ao clicar no botão Registar */
|
|
35
78
|
onclickButtonRegister?: () => void;
|
|
36
79
|
}
|
|
@@ -1,14 +1,28 @@
|
|
|
1
1
|
import type { IconSvgElement } from "@hugeicons/svelte";
|
|
2
|
+
/**
|
|
3
|
+
* Props do bloco de usuário logado na sidebar.
|
|
4
|
+
* Contém dados do usuário (nome, email, avatar), ações rápidas
|
|
5
|
+
* e callback de logout.
|
|
6
|
+
*/
|
|
2
7
|
export interface NavUserSidebarProps {
|
|
8
|
+
/** Dados do utilizador autenticado */
|
|
3
9
|
user: {
|
|
10
|
+
/** Nome completo do utilizador */
|
|
4
11
|
name: string;
|
|
12
|
+
/** Email do utilizador */
|
|
5
13
|
email: string;
|
|
14
|
+
/** URL da imagem de perfil/avatar (opcional) */
|
|
6
15
|
avatar?: string;
|
|
7
16
|
};
|
|
17
|
+
/** Lista de ações rápidas (ex: "Perfil", "Definições") */
|
|
8
18
|
actions?: {
|
|
19
|
+
/** Texto exibido na ação */
|
|
9
20
|
label: string;
|
|
21
|
+
/** Ícone SVG da ação */
|
|
10
22
|
icon: IconSvgElement;
|
|
23
|
+
/** Callback acionado ao clicar na ação */
|
|
11
24
|
onclick?: () => void;
|
|
12
25
|
}[];
|
|
26
|
+
/** Callback acionado ao clicar no botão de terminar sessão */
|
|
13
27
|
onLogout?: () => void;
|
|
14
28
|
}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
positionButtonPreviousAndNext = "center",
|
|
7
7
|
isButtonPreviousAndNext = true,
|
|
8
8
|
buttonPreviousAndNextClass = "",
|
|
9
|
-
isBorderBottom =
|
|
9
|
+
isBorderBottom = false,
|
|
10
10
|
containerClass = "w-full",
|
|
11
11
|
plugins = [],
|
|
12
12
|
children,
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
<Carousel.Content
|
|
25
25
|
class={positionButtonPreviousAndNext == "top_right" ? "" : "ml-0"}
|
|
26
26
|
>
|
|
27
|
-
{@render children()}
|
|
27
|
+
{@render children?.()}
|
|
28
28
|
</Carousel.Content>
|
|
29
29
|
{#if positionButtonPreviousAndNext == "center"}
|
|
30
30
|
{#if isButtonPreviousAndNext}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { HugeiconsIcon } from "@hugeicons/svelte";
|
|
3
3
|
import { ArrowRight01Icon } from "@hugeicons/core-free-icons";
|
|
4
|
-
import type { LoginCarouselProps } from "../../pages/security/login/types";
|
|
4
|
+
import type { LoginCarouselProps } from "../../pages/security/login/types";
|
|
5
5
|
import type { Snippet } from "svelte";
|
|
6
6
|
import Button from "../../ui/button/button.svelte";
|
|
7
7
|
import { t } from "../../../i18n";
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
</script>
|
|
41
41
|
|
|
42
42
|
<div
|
|
43
|
-
class="relative flex flex-col justify-between overflow-hidden h-screen p-8 bg-gradient
|
|
43
|
+
class="relative flex flex-col justify-between overflow-hidden h-screen p-8 bg-gradient text-white"
|
|
44
44
|
>
|
|
45
45
|
<div class="flex items-center gap-2">
|
|
46
46
|
<div class="font-bold text-xl tracking-wider flex items-center gap-2">
|
|
@@ -1,11 +1,22 @@
|
|
|
1
1
|
import type { CarouselPlugins } from "../../ui/carousel/context";
|
|
2
2
|
import type { Snippet } from "svelte";
|
|
3
|
+
/**
|
|
4
|
+
* Props do slot/container de carousel (CarouselSlot).
|
|
5
|
+
* Controla botões de navegação, bordas, plugins e conteúdo customizado.
|
|
6
|
+
*/
|
|
3
7
|
export type CarouselSlotProps = {
|
|
8
|
+
/** Posição dos botões anterior/próximo: centro ou canto superior direito */
|
|
4
9
|
positionButtonPreviousAndNext?: "center" | "top_right";
|
|
10
|
+
/** Classe CSS personalizada para botões anterior/próximo */
|
|
5
11
|
buttonPreviousAndNextClass?: string;
|
|
12
|
+
/** Exibe os botões anterior/próximo */
|
|
6
13
|
isButtonPreviousAndNext?: boolean;
|
|
14
|
+
/** Exibe borda inferior no slot */
|
|
7
15
|
isBorderBottom?: boolean;
|
|
16
|
+
/** Classe CSS adicional para o container */
|
|
8
17
|
containerClass?: string;
|
|
18
|
+
/** Plugins do carousel (ex: autoplay, loop) */
|
|
9
19
|
plugins?: CarouselPlugins;
|
|
20
|
+
/** Snippet de conteúdo customizado renderizado dentro do slot */
|
|
10
21
|
children?: Snippet;
|
|
11
22
|
};
|
|
@@ -1,15 +1,27 @@
|
|
|
1
|
-
/**
|
|
1
|
+
/**
|
|
2
|
+
* Props base para o componente de input de busca.
|
|
3
|
+
*/
|
|
2
4
|
export interface SearchItemProps {
|
|
3
|
-
/** Callback
|
|
5
|
+
/** Callback acionado ao submeter a busca (enter ou clique no botão) */
|
|
4
6
|
onSubmit?: (q: string) => void;
|
|
5
|
-
/**
|
|
7
|
+
/** Classe CSS personalizada para o botão de busca */
|
|
6
8
|
buttonClass?: string;
|
|
9
|
+
/** Placeholder exibido no campo de input */
|
|
7
10
|
placeholder?: string;
|
|
11
|
+
/** Classe CSS personalizada para o campo de input */
|
|
8
12
|
inputClass?: string;
|
|
13
|
+
/** Classe CSS personalizada para o ícone de busca */
|
|
9
14
|
iconClass?: string;
|
|
10
15
|
}
|
|
11
|
-
/**
|
|
16
|
+
/**
|
|
17
|
+
* Props do SearchInput — input de busca completo com duas variantes visuais.
|
|
18
|
+
* @extends SearchItemProps
|
|
19
|
+
*/
|
|
12
20
|
export interface SearchInputProps extends SearchItemProps {
|
|
13
|
-
/**
|
|
21
|
+
/**
|
|
22
|
+
* Variante visual do input de busca.
|
|
23
|
+
* 1 = borda completa ao redor;
|
|
24
|
+
* 2 = apenas borda inferior (underline style).
|
|
25
|
+
*/
|
|
14
26
|
variant?: 1 | 2;
|
|
15
27
|
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Snippet } from "svelte";
|
|
2
|
+
import type { NavUserSidebarProps } from "../nav/data/nav-user-sidebar";
|
|
3
|
+
import type { NavMenuItem, NavMenuSidebarProps } from "../nav/data/nav-menu-sidebar";
|
|
4
|
+
/**
|
|
5
|
+
* Props do componente MenuBarSidebar — sidebar de navegação admin
|
|
6
|
+
* com menus, usuário logado e botões de ação (ex: logout).
|
|
7
|
+
*/
|
|
8
|
+
export interface MenuBarSidebarProps {
|
|
9
|
+
/** Botões do rodapé da sidebar (ex: logout) */
|
|
10
|
+
menusButtons?: NavMenuSidebarProps[];
|
|
11
|
+
/** Itens de navegação principal */
|
|
12
|
+
menus: NavMenuItem[];
|
|
13
|
+
/** Dados do usuário logado */
|
|
14
|
+
user: NavUserSidebarProps;
|
|
15
|
+
/** Snippet customizado para o footer da sidebar */
|
|
16
|
+
footer?: Snippet;
|
|
17
|
+
/** Snippet customizado para o header da sidebar */
|
|
18
|
+
header?: Snippet;
|
|
19
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,9 +1,20 @@
|
|
|
1
1
|
import type { Snippet } from "svelte";
|
|
2
|
+
/**
|
|
3
|
+
* Item básico de uma aba — valor identificador e label visível.
|
|
4
|
+
*/
|
|
2
5
|
export interface TabItem {
|
|
6
|
+
/** Texto exibido na aba */
|
|
3
7
|
label: string;
|
|
8
|
+
/** Valor único identificador da aba */
|
|
4
9
|
value: string;
|
|
5
10
|
}
|
|
11
|
+
/**
|
|
12
|
+
* Props completas de uma aba no TabUnderline — item (label/value)
|
|
13
|
+
* mais o conteúdo (Snippet) renderizado quando a aba está ativa.
|
|
14
|
+
*/
|
|
6
15
|
export interface TabProps {
|
|
16
|
+
/** Dados da aba (label + valor) */
|
|
7
17
|
item: TabItem;
|
|
18
|
+
/** Snippet com o conteúdo exibido ao selecionar a aba */
|
|
8
19
|
children?: Snippet;
|
|
9
20
|
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { TabProps } from "./data/TabModel";
|
|
2
|
+
/**
|
|
3
|
+
* Props do componente TabUnderline — abas com estilo underline
|
|
4
|
+
* que trocam o conteúdo conforme a aba selecionada.
|
|
5
|
+
*/
|
|
6
|
+
export interface TabUnderlineProps {
|
|
7
|
+
/** Lista de abas com seu conteúdo (Snippet) */
|
|
8
|
+
items?: TabProps[];
|
|
9
|
+
/** Classe CSS adicional para o container */
|
|
10
|
+
className?: string;
|
|
11
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Snippet } from "svelte";
|
|
2
|
+
/**
|
|
3
|
+
* Props do componente AdminPanel — layout principal de administração
|
|
4
|
+
* com sidebar, header (breadcrumb, language switcher, light switch) e área de conteúdo.
|
|
5
|
+
*/
|
|
6
|
+
export interface AdminPanelProps {
|
|
7
|
+
/** Snippet com a sidebar da aplicação */
|
|
8
|
+
appsidebar?: Snippet;
|
|
9
|
+
/** Snippet com o conteúdo principal */
|
|
10
|
+
content?: Snippet;
|
|
11
|
+
/** Snippet com a navegação breadcrumb */
|
|
12
|
+
breadcrumb?: Snippet;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Props do componente AdminContent — wrapper de conteúdo
|
|
16
|
+
* para páginas admin com padding e layout flex.
|
|
17
|
+
*/
|
|
18
|
+
export interface AdminContentProps {
|
|
19
|
+
/** Snippet com o conteúdo interno da página */
|
|
20
|
+
children?: Snippet;
|
|
21
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|