@snacky/ui 0.10.0 → 0.11.0
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/CHANGELOG.md +34 -0
- package/README.md +4 -3
- package/dist/index.cjs +134 -111
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +22 -2
- package/dist/index.css.map +1 -1
- package/dist/index.d.cts +24 -1
- package/dist/index.d.ts +24 -1
- package/dist/index.js +99 -77
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -230,6 +230,29 @@ interface AlertBannerProps {
|
|
|
230
230
|
/** Snacky Alert Banner - inline info/warning strip, optionally with a countdown. */
|
|
231
231
|
declare function AlertBanner({ message, countdown, className }: AlertBannerProps): react.JSX.Element;
|
|
232
232
|
|
|
233
|
+
interface PageIndicatorProps {
|
|
234
|
+
/** How many pages the carousel has. */
|
|
235
|
+
count: number;
|
|
236
|
+
/** Zero-based index of the page currently shown. */
|
|
237
|
+
activeIndex: number;
|
|
238
|
+
/**
|
|
239
|
+
* Announced to screen readers, defaulting to "Page 2 of 3". Pass your own
|
|
240
|
+
* when the pages are not pages (a step counter, an onboarding sequence).
|
|
241
|
+
*/
|
|
242
|
+
ariaLabel?: string;
|
|
243
|
+
className?: string;
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Snacky Page Indicator - the dot row under a carousel. Figma draws the current
|
|
247
|
+
* page as a 28x8 pill and every other page as an 8x8 dot, 4 apart, and the Home
|
|
248
|
+
* hero carousel sits it 10 below the banner, centred.
|
|
249
|
+
*
|
|
250
|
+
* It reports position, it does not change it: the dots are decoration to a
|
|
251
|
+
* screen reader and the row carries the label instead. Make the carousel itself
|
|
252
|
+
* keyboard operable; do not wire clicks onto these.
|
|
253
|
+
*/
|
|
254
|
+
declare function PageIndicator({ count, activeIndex, ariaLabel, className }: PageIndicatorProps): react.JSX.Element;
|
|
255
|
+
|
|
233
256
|
interface NotificationBadgeProps {
|
|
234
257
|
count: number;
|
|
235
258
|
max?: number;
|
|
@@ -676,4 +699,4 @@ declare const SnackyIcons: {
|
|
|
676
699
|
solid: typeof solid;
|
|
677
700
|
};
|
|
678
701
|
|
|
679
|
-
export { Accordion, type AccordionProps, AddressResult, type AddressResultProps, AlertBanner, type AlertBannerProps, Avatar, type AvatarProps, type AvatarSize, BottomSheet, type BottomSheetProps, Button, type ButtonProps, type ButtonSize, type ButtonVariant, Calendar, type CalendarProps, Callout, type CalloutProps, type CalloutVariant, ChatInput, type ChatInputProps, Checkbox, type CheckboxProps, CopyField, type CopyFieldProps, DiscountTag, type DiscountTagProps, FilterChip, type FilterChipProps, FullWidthBanner, Header, type HeaderLeadingIcon, type HeaderProps, HeroBanner, IconButton, type IconButtonProps, type IconButtonVariant, type IconProps, Illustration, type IllustrationProps, type IllustrationVariant, type ImageBannerProps, ImagePlaceholder, type ImagePlaceholderProps, InfoBadge, type InfoBadgeProps, NavBar, type NavBarProps, type NavItem, NotificationBadge, type NotificationBadgeProps, NotificationListItem, type NotificationListItemProps, OrderListItem, type OrderListItemProps, type OrderStatus, OtpField, type OtpFieldProps, PointBalanceBanner, type PointBalanceBannerProps, ProductCard, type ProductCardDetailsProps, type ProductCardListProps, type ProductCardProps, ProductChip, type ProductChipProps, ProductImage, type ProductImageProps, type ProductImageUsage, RadioOption, type RadioOptionProps, SearchField, type SearchFieldProps, Section, type SectionProps, SnackyIcons, SoldOutBadge, type SoldOutBadgeProps, SquareBanner, type Step, type StepState, Stepper, type StepperProps, TabRow, type TabRowProps, TextField, type TextFieldProps, Toggle, type ToggleProps, UploadButton, type UploadButtonProps, VariantBadge, type VariantBadgeProps, typography };
|
|
702
|
+
export { Accordion, type AccordionProps, AddressResult, type AddressResultProps, AlertBanner, type AlertBannerProps, Avatar, type AvatarProps, type AvatarSize, BottomSheet, type BottomSheetProps, Button, type ButtonProps, type ButtonSize, type ButtonVariant, Calendar, type CalendarProps, Callout, type CalloutProps, type CalloutVariant, ChatInput, type ChatInputProps, Checkbox, type CheckboxProps, CopyField, type CopyFieldProps, DiscountTag, type DiscountTagProps, FilterChip, type FilterChipProps, FullWidthBanner, Header, type HeaderLeadingIcon, type HeaderProps, HeroBanner, IconButton, type IconButtonProps, type IconButtonVariant, type IconProps, Illustration, type IllustrationProps, type IllustrationVariant, type ImageBannerProps, ImagePlaceholder, type ImagePlaceholderProps, InfoBadge, type InfoBadgeProps, NavBar, type NavBarProps, type NavItem, NotificationBadge, type NotificationBadgeProps, NotificationListItem, type NotificationListItemProps, OrderListItem, type OrderListItemProps, type OrderStatus, OtpField, type OtpFieldProps, PageIndicator, type PageIndicatorProps, PointBalanceBanner, type PointBalanceBannerProps, ProductCard, type ProductCardDetailsProps, type ProductCardListProps, type ProductCardProps, ProductChip, type ProductChipProps, ProductImage, type ProductImageProps, type ProductImageUsage, RadioOption, type RadioOptionProps, SearchField, type SearchFieldProps, Section, type SectionProps, SnackyIcons, SoldOutBadge, type SoldOutBadgeProps, SquareBanner, type Step, type StepState, Stepper, type StepperProps, TabRow, type TabRowProps, TextField, type TextFieldProps, Toggle, type ToggleProps, UploadButton, type UploadButtonProps, VariantBadge, type VariantBadgeProps, typography };
|
package/dist/index.js
CHANGED
|
@@ -776,43 +776,64 @@ function AlertBanner({ message, countdown, className }) {
|
|
|
776
776
|
] });
|
|
777
777
|
}
|
|
778
778
|
|
|
779
|
+
// src/components/PageIndicator/PageIndicator.tsx
|
|
780
|
+
import { jsx as jsx21 } from "react/jsx-runtime";
|
|
781
|
+
function PageIndicator({ count, activeIndex, ariaLabel, className }) {
|
|
782
|
+
return /* @__PURE__ */ jsx21(
|
|
783
|
+
"div",
|
|
784
|
+
{
|
|
785
|
+
className: cx("snacky-page-indicator", className),
|
|
786
|
+
role: "status",
|
|
787
|
+
"aria-label": ariaLabel ?? `Page ${activeIndex + 1} of ${count}`,
|
|
788
|
+
children: Array.from({ length: count }, (_, i) => /* @__PURE__ */ jsx21(
|
|
789
|
+
"span",
|
|
790
|
+
{
|
|
791
|
+
"aria-hidden": "true",
|
|
792
|
+
className: cx("snacky-page-indicator__dot", i === activeIndex && "snacky-page-indicator__dot--active")
|
|
793
|
+
},
|
|
794
|
+
i
|
|
795
|
+
))
|
|
796
|
+
}
|
|
797
|
+
);
|
|
798
|
+
}
|
|
799
|
+
|
|
779
800
|
// src/components/Badge/Badge.tsx
|
|
780
|
-
import { Fragment, jsx as
|
|
801
|
+
import { Fragment, jsx as jsx22, jsxs as jsxs14 } from "react/jsx-runtime";
|
|
781
802
|
function NotificationBadge({ count, max = 99, children, className }) {
|
|
782
|
-
if (count <= 0) return /* @__PURE__ */
|
|
803
|
+
if (count <= 0) return /* @__PURE__ */ jsx22(Fragment, { children });
|
|
783
804
|
return /* @__PURE__ */ jsxs14("span", { className: cx("snacky-badge-wrap", className), children: [
|
|
784
805
|
children,
|
|
785
|
-
/* @__PURE__ */
|
|
806
|
+
/* @__PURE__ */ jsx22("span", { className: "snacky-badge-notification", children: count > max ? `${max}+` : count })
|
|
786
807
|
] });
|
|
787
808
|
}
|
|
788
809
|
function DiscountTag({ label, className }) {
|
|
789
|
-
return /* @__PURE__ */
|
|
810
|
+
return /* @__PURE__ */ jsx22("span", { className: cx("snacky-discount-tag", className), children: label });
|
|
790
811
|
}
|
|
791
812
|
function SoldOutBadge({ className }) {
|
|
792
|
-
return /* @__PURE__ */
|
|
813
|
+
return /* @__PURE__ */ jsx22("span", { className: cx("snacky-soldout-badge", className), children: "Sold Out" });
|
|
793
814
|
}
|
|
794
815
|
function InfoBadge({ label, icon: icon3, className }) {
|
|
795
816
|
return /* @__PURE__ */ jsxs14("span", { className: cx("snacky-info-badge", className), children: [
|
|
796
|
-
icon3 && /* @__PURE__ */
|
|
817
|
+
icon3 && /* @__PURE__ */ jsx22("span", { className: "snacky-info-badge__icon", children: icon3 }),
|
|
797
818
|
label
|
|
798
819
|
] });
|
|
799
820
|
}
|
|
800
821
|
var VariantBadge = InfoBadge;
|
|
801
822
|
|
|
802
823
|
// src/components/Callout/Callout.tsx
|
|
803
|
-
import { jsx as
|
|
824
|
+
import { jsx as jsx23, jsxs as jsxs15 } from "react/jsx-runtime";
|
|
804
825
|
function Callout({ message, timestamp, variant, statusIcon, className }) {
|
|
805
826
|
return /* @__PURE__ */ jsxs15("div", { className: cx("snacky-callout", `snacky-callout--${variant}`, className), children: [
|
|
806
|
-
/* @__PURE__ */
|
|
827
|
+
/* @__PURE__ */ jsx23("p", { className: "snacky-callout__message", children: message }),
|
|
807
828
|
/* @__PURE__ */ jsxs15("span", { className: "snacky-callout__meta", children: [
|
|
808
829
|
timestamp,
|
|
809
|
-
statusIcon && variant !== "received" && /* @__PURE__ */
|
|
830
|
+
statusIcon && variant !== "received" && /* @__PURE__ */ jsx23("span", { className: "snacky-callout__meta-icon", children: statusIcon })
|
|
810
831
|
] })
|
|
811
832
|
] });
|
|
812
833
|
}
|
|
813
834
|
|
|
814
835
|
// src/components/List/List.tsx
|
|
815
|
-
import { jsx as
|
|
836
|
+
import { jsx as jsx24, jsxs as jsxs16 } from "react/jsx-runtime";
|
|
816
837
|
var STATUS_LABEL = {
|
|
817
838
|
waiting: "Waiting for Payment",
|
|
818
839
|
process: "Order Processing",
|
|
@@ -850,31 +871,31 @@ function OrderListItem({
|
|
|
850
871
|
onKeyDown: onClick ? (e) => (e.key === "Enter" || e.key === " ") && onClick() : void 0,
|
|
851
872
|
children: [
|
|
852
873
|
/* @__PURE__ */ jsxs16("div", { className: "snacky-order-item__top", children: [
|
|
853
|
-
/* @__PURE__ */
|
|
874
|
+
/* @__PURE__ */ jsx24("div", { className: "snacky-order-item__thumb-box", children: /* @__PURE__ */ jsx24("img", { className: "snacky-order-item__thumb", src: productImage, alt: "" }) }),
|
|
854
875
|
/* @__PURE__ */ jsxs16("div", { className: "snacky-order-item__info", children: [
|
|
855
|
-
/* @__PURE__ */
|
|
876
|
+
/* @__PURE__ */ jsx24(
|
|
856
877
|
"span",
|
|
857
878
|
{
|
|
858
879
|
className: cx("snacky-order-item__status", status === "cancelled" && "snacky-order-item__status--cancelled"),
|
|
859
880
|
children: STATUS_LABEL[status]
|
|
860
881
|
}
|
|
861
882
|
),
|
|
862
|
-
/* @__PURE__ */
|
|
883
|
+
/* @__PURE__ */ jsx24("span", { className: "snacky-order-item__name", children: productName })
|
|
863
884
|
] })
|
|
864
885
|
] }),
|
|
865
886
|
/* @__PURE__ */ jsxs16("div", { className: "snacky-order-item__details", children: [
|
|
866
|
-
/* @__PURE__ */
|
|
887
|
+
/* @__PURE__ */ jsx24("span", { className: "snacky-order-item__count", children: itemsSummary }),
|
|
867
888
|
/* @__PURE__ */ jsxs16("span", { className: cx("snacky-order-item__total", isCod && "snacky-order-item__total--cod"), children: [
|
|
868
889
|
"Order Total: ",
|
|
869
|
-
/* @__PURE__ */
|
|
890
|
+
/* @__PURE__ */ jsx24("b", { children: total })
|
|
870
891
|
] }),
|
|
871
|
-
isCod && /* @__PURE__ */
|
|
892
|
+
isCod && /* @__PURE__ */ jsx24("span", { className: "snacky-order-item__cod", children: "COD" })
|
|
872
893
|
] }),
|
|
873
894
|
status === "waiting" && paymentDeadline && /* @__PURE__ */ jsxs16("div", { className: "snacky-order-item__deadline", children: [
|
|
874
895
|
"Pay before ",
|
|
875
896
|
paymentDeadline
|
|
876
897
|
] }),
|
|
877
|
-
action && /* @__PURE__ */
|
|
898
|
+
action && /* @__PURE__ */ jsx24("div", { className: "snacky-order-item__action-row", children: /* @__PURE__ */ jsx24(
|
|
878
899
|
Button,
|
|
879
900
|
{
|
|
880
901
|
variant: "primary",
|
|
@@ -899,8 +920,8 @@ function NotificationListItem({ title, message, unread = false, onClick, classNa
|
|
|
899
920
|
onClick,
|
|
900
921
|
onKeyDown: onClick ? (e) => (e.key === "Enter" || e.key === " ") && onClick() : void 0,
|
|
901
922
|
children: [
|
|
902
|
-
/* @__PURE__ */
|
|
903
|
-
/* @__PURE__ */
|
|
923
|
+
/* @__PURE__ */ jsx24("span", { className: "snacky-notif-item__title", children: title }),
|
|
924
|
+
/* @__PURE__ */ jsx24("span", { className: "snacky-notif-item__message", children: message })
|
|
904
925
|
]
|
|
905
926
|
}
|
|
906
927
|
);
|
|
@@ -908,7 +929,7 @@ function NotificationListItem({ title, message, unread = false, onClick, classNa
|
|
|
908
929
|
|
|
909
930
|
// src/components/Accordion/Accordion.tsx
|
|
910
931
|
import { useId as useId4, useState as useState2 } from "react";
|
|
911
|
-
import { jsx as
|
|
932
|
+
import { jsx as jsx25, jsxs as jsxs17 } from "react/jsx-runtime";
|
|
912
933
|
function Accordion({ title, leadingIcon, children, defaultOpen = false, className }) {
|
|
913
934
|
const [open, setOpen] = useState2(defaultOpen);
|
|
914
935
|
const panelId = useId4();
|
|
@@ -922,27 +943,27 @@ function Accordion({ title, leadingIcon, children, defaultOpen = false, classNam
|
|
|
922
943
|
"aria-controls": panelId,
|
|
923
944
|
onClick: () => setOpen((v) => !v),
|
|
924
945
|
children: [
|
|
925
|
-
leadingIcon && /* @__PURE__ */
|
|
926
|
-
/* @__PURE__ */
|
|
927
|
-
/* @__PURE__ */
|
|
946
|
+
leadingIcon && /* @__PURE__ */ jsx25("span", { className: "snacky-accordion__icon", children: leadingIcon }),
|
|
947
|
+
/* @__PURE__ */ jsx25("span", { className: "snacky-accordion__title", children: title }),
|
|
948
|
+
/* @__PURE__ */ jsx25(
|
|
928
949
|
"svg",
|
|
929
950
|
{
|
|
930
951
|
className: cx("snacky-accordion__chevron", open && "snacky-accordion__chevron--open"),
|
|
931
952
|
viewBox: "0 0 20 20",
|
|
932
953
|
fill: "none",
|
|
933
|
-
children: /* @__PURE__ */
|
|
954
|
+
children: /* @__PURE__ */ jsx25("path", { d: "M5 7.5L10 12.5L15 7.5", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" })
|
|
934
955
|
}
|
|
935
956
|
)
|
|
936
957
|
]
|
|
937
958
|
}
|
|
938
959
|
),
|
|
939
|
-
open && /* @__PURE__ */
|
|
960
|
+
open && /* @__PURE__ */ jsx25("div", { id: panelId, className: "snacky-accordion__panel", children })
|
|
940
961
|
] });
|
|
941
962
|
}
|
|
942
963
|
|
|
943
964
|
// src/components/Modal/BottomSheet.tsx
|
|
944
965
|
import { useEffect } from "react";
|
|
945
|
-
import { jsx as
|
|
966
|
+
import { jsx as jsx26, jsxs as jsxs18 } from "react/jsx-runtime";
|
|
946
967
|
function BottomSheet({ open, onDismiss, children, showHandle = false, className }) {
|
|
947
968
|
useEffect(() => {
|
|
948
969
|
if (!open) return;
|
|
@@ -953,7 +974,7 @@ function BottomSheet({ open, onDismiss, children, showHandle = false, className
|
|
|
953
974
|
return () => window.removeEventListener("keydown", onKeyDown);
|
|
954
975
|
}, [open, onDismiss]);
|
|
955
976
|
if (!open) return null;
|
|
956
|
-
return /* @__PURE__ */
|
|
977
|
+
return /* @__PURE__ */ jsx26("div", { className: "snacky-sheet-overlay", onClick: onDismiss, children: /* @__PURE__ */ jsxs18(
|
|
957
978
|
"div",
|
|
958
979
|
{
|
|
959
980
|
className: cx("snacky-sheet", className),
|
|
@@ -961,7 +982,7 @@ function BottomSheet({ open, onDismiss, children, showHandle = false, className
|
|
|
961
982
|
"aria-modal": "true",
|
|
962
983
|
onClick: (e) => e.stopPropagation(),
|
|
963
984
|
children: [
|
|
964
|
-
showHandle && /* @__PURE__ */
|
|
985
|
+
showHandle && /* @__PURE__ */ jsx26("div", { className: "snacky-sheet__handle" }),
|
|
965
986
|
children
|
|
966
987
|
]
|
|
967
988
|
}
|
|
@@ -969,29 +990,29 @@ function BottomSheet({ open, onDismiss, children, showHandle = false, className
|
|
|
969
990
|
}
|
|
970
991
|
|
|
971
992
|
// src/components/Section/Section.tsx
|
|
972
|
-
import { jsx as
|
|
993
|
+
import { jsx as jsx27, jsxs as jsxs19 } from "react/jsx-runtime";
|
|
973
994
|
function Section({ title, onAction, children, className }) {
|
|
974
995
|
return /* @__PURE__ */ jsxs19("section", { className: cx("snacky-section", className), children: [
|
|
975
996
|
/* @__PURE__ */ jsxs19("div", { className: "snacky-section__header", children: [
|
|
976
|
-
/* @__PURE__ */
|
|
977
|
-
onAction && /* @__PURE__ */
|
|
997
|
+
/* @__PURE__ */ jsx27("h3", { className: "snacky-section__title", children: title }),
|
|
998
|
+
onAction && /* @__PURE__ */ jsx27(IconButton, { size: "small", icon: /* @__PURE__ */ jsx27(angleSmallRight, {}), onClick: onAction, ariaLabel: `See more: ${title}` })
|
|
978
999
|
] }),
|
|
979
1000
|
children
|
|
980
1001
|
] });
|
|
981
1002
|
}
|
|
982
1003
|
|
|
983
1004
|
// src/components/Stepper/Stepper.tsx
|
|
984
|
-
import { jsx as
|
|
1005
|
+
import { jsx as jsx28, jsxs as jsxs20 } from "react/jsx-runtime";
|
|
985
1006
|
function Stepper({ steps, className }) {
|
|
986
|
-
return /* @__PURE__ */
|
|
1007
|
+
return /* @__PURE__ */ jsx28("ol", { className: cx("snacky-stepper", className), children: steps.map((step, i) => /* @__PURE__ */ jsxs20(
|
|
987
1008
|
"li",
|
|
988
1009
|
{
|
|
989
1010
|
className: cx("snacky-stepper__step", i === steps.length - 1 && "snacky-stepper__step--last"),
|
|
990
1011
|
children: [
|
|
991
|
-
/* @__PURE__ */
|
|
1012
|
+
/* @__PURE__ */ jsx28("span", { className: cx("snacky-stepper__dot", `snacky-stepper__dot--${step.state}`), children: step.state === "cancelled" && /* @__PURE__ */ jsx28(close, { width: 12, height: 12 }) }),
|
|
992
1013
|
/* @__PURE__ */ jsxs20("span", { className: "snacky-stepper__body", children: [
|
|
993
|
-
/* @__PURE__ */
|
|
994
|
-
step.timestamp && /* @__PURE__ */
|
|
1014
|
+
/* @__PURE__ */ jsx28("span", { className: cx("snacky-stepper__label", `snacky-stepper__label--${step.state}`), children: step.label }),
|
|
1015
|
+
step.timestamp && /* @__PURE__ */ jsx28("span", { className: "snacky-stepper__time", children: step.timestamp })
|
|
995
1016
|
] })
|
|
996
1017
|
]
|
|
997
1018
|
},
|
|
@@ -1000,7 +1021,7 @@ function Stepper({ steps, className }) {
|
|
|
1000
1021
|
}
|
|
1001
1022
|
|
|
1002
1023
|
// src/components/Calendar/Calendar.tsx
|
|
1003
|
-
import { jsx as
|
|
1024
|
+
import { jsx as jsx29, jsxs as jsxs21 } from "react/jsx-runtime";
|
|
1004
1025
|
var WEEKDAYS = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
|
|
1005
1026
|
var MONTHS = [
|
|
1006
1027
|
"January",
|
|
@@ -1049,14 +1070,14 @@ function Calendar({
|
|
|
1049
1070
|
const isInRange = (d) => lo && hi && d > lo && d < hi;
|
|
1050
1071
|
return /* @__PURE__ */ jsxs21("div", { className: cx("snacky-calendar", className), children: [
|
|
1051
1072
|
/* @__PURE__ */ jsxs21("div", { className: "snacky-calendar__header", children: [
|
|
1052
|
-
/* @__PURE__ */
|
|
1073
|
+
/* @__PURE__ */ jsx29(
|
|
1053
1074
|
"button",
|
|
1054
1075
|
{
|
|
1055
1076
|
type: "button",
|
|
1056
1077
|
className: "snacky-calendar__nav",
|
|
1057
1078
|
onClick: onPrevMonth,
|
|
1058
1079
|
"aria-label": "Previous month",
|
|
1059
|
-
children: /* @__PURE__ */
|
|
1080
|
+
children: /* @__PURE__ */ jsx29(back, { width: 24, height: 24 })
|
|
1060
1081
|
}
|
|
1061
1082
|
),
|
|
1062
1083
|
/* @__PURE__ */ jsxs21("span", { className: "snacky-calendar__label", children: [
|
|
@@ -1064,19 +1085,19 @@ function Calendar({
|
|
|
1064
1085
|
" ",
|
|
1065
1086
|
month.getFullYear()
|
|
1066
1087
|
] }),
|
|
1067
|
-
/* @__PURE__ */
|
|
1088
|
+
/* @__PURE__ */ jsx29(
|
|
1068
1089
|
"button",
|
|
1069
1090
|
{
|
|
1070
1091
|
type: "button",
|
|
1071
1092
|
className: "snacky-calendar__nav snacky-calendar__nav--next",
|
|
1072
1093
|
onClick: onNextMonth,
|
|
1073
1094
|
"aria-label": "Next month",
|
|
1074
|
-
children: /* @__PURE__ */
|
|
1095
|
+
children: /* @__PURE__ */ jsx29(back, { width: 24, height: 24 })
|
|
1075
1096
|
}
|
|
1076
1097
|
)
|
|
1077
1098
|
] }),
|
|
1078
1099
|
/* @__PURE__ */ jsxs21("div", { className: "snacky-calendar__grid", children: [
|
|
1079
|
-
WEEKDAYS.map((d) => /* @__PURE__ */
|
|
1100
|
+
WEEKDAYS.map((d) => /* @__PURE__ */ jsx29("span", { className: "snacky-calendar__weekday", children: d }, d)),
|
|
1080
1101
|
days.map((d, i) => {
|
|
1081
1102
|
const outside = d.getMonth() !== month.getMonth();
|
|
1082
1103
|
return /* @__PURE__ */ jsxs21(
|
|
@@ -1093,26 +1114,26 @@ function Calendar({
|
|
|
1093
1114
|
disabled: outside,
|
|
1094
1115
|
"aria-current": isEnd(d) ? "date" : void 0,
|
|
1095
1116
|
children: [
|
|
1096
|
-
/* @__PURE__ */
|
|
1097
|
-
marked.some((m) => sameDay(m, d)) && /* @__PURE__ */
|
|
1117
|
+
/* @__PURE__ */ jsx29("span", { className: "snacky-calendar__day-number", children: d.getDate() }),
|
|
1118
|
+
marked.some((m) => sameDay(m, d)) && /* @__PURE__ */ jsx29("span", { className: "snacky-calendar__marker" })
|
|
1098
1119
|
]
|
|
1099
1120
|
},
|
|
1100
1121
|
i
|
|
1101
1122
|
);
|
|
1102
1123
|
})
|
|
1103
1124
|
] }),
|
|
1104
|
-
onAction && /* @__PURE__ */
|
|
1125
|
+
onAction && /* @__PURE__ */ jsx29(Button, { onClick: onAction, style: { width: "100%" }, children: actionLabel })
|
|
1105
1126
|
] });
|
|
1106
1127
|
}
|
|
1107
1128
|
|
|
1108
1129
|
// src/components/Avatar/Avatar.tsx
|
|
1109
|
-
import { jsx as
|
|
1130
|
+
import { jsx as jsx30 } from "react/jsx-runtime";
|
|
1110
1131
|
function Avatar({ src, alt, size = "md", className }) {
|
|
1111
|
-
return /* @__PURE__ */
|
|
1132
|
+
return /* @__PURE__ */ jsx30("img", { src, alt, className: cx("snacky-avatar", `snacky-avatar--${size}`, className) });
|
|
1112
1133
|
}
|
|
1113
1134
|
|
|
1114
1135
|
// src/components/Illustration/Illustration.tsx
|
|
1115
|
-
import { jsx as
|
|
1136
|
+
import { jsx as jsx31 } from "react/jsx-runtime";
|
|
1116
1137
|
var SIZE = {
|
|
1117
1138
|
empty: { width: 268, height: 200 },
|
|
1118
1139
|
createAccount: { width: 360, height: 240 },
|
|
@@ -1122,47 +1143,47 @@ var SIZE = {
|
|
|
1122
1143
|
};
|
|
1123
1144
|
function Illustration({ variant, src, alt, className }) {
|
|
1124
1145
|
const { width, height } = SIZE[variant];
|
|
1125
|
-
return /* @__PURE__ */
|
|
1146
|
+
return /* @__PURE__ */ jsx31("img", { src, alt, width, height, className: cx("snacky-illustration", className) });
|
|
1126
1147
|
}
|
|
1127
1148
|
|
|
1128
1149
|
// src/components/ProductImage/ProductImage.tsx
|
|
1129
|
-
import { jsx as
|
|
1150
|
+
import { jsx as jsx32, jsxs as jsxs22 } from "react/jsx-runtime";
|
|
1130
1151
|
function ProductImage({ src, alt, usage, sold = false, className }) {
|
|
1131
1152
|
return /* @__PURE__ */ jsxs22("span", { className: cx("snacky-product-image-wrap", `snacky-product-image-wrap--${usage}`, className), children: [
|
|
1132
|
-
/* @__PURE__ */
|
|
1133
|
-
sold && /* @__PURE__ */
|
|
1153
|
+
/* @__PURE__ */ jsx32("img", { src, alt, className: cx("snacky-product-image", `snacky-product-image--${usage}`) }),
|
|
1154
|
+
sold && /* @__PURE__ */ jsx32("span", { className: "snacky-product-image-sold-overlay", children: /* @__PURE__ */ jsx32("span", { className: "snacky-product-image-sold-label", children: "Sold Out" }) })
|
|
1134
1155
|
] });
|
|
1135
1156
|
}
|
|
1136
1157
|
|
|
1137
1158
|
// src/components/ProductCard/ProductCard.tsx
|
|
1138
|
-
import { jsx as
|
|
1159
|
+
import { jsx as jsx33, jsxs as jsxs23 } from "react/jsx-runtime";
|
|
1139
1160
|
function ProductCard(props) {
|
|
1140
1161
|
if (props.variant === "details") {
|
|
1141
1162
|
const { productName: productName2, imageUrl: imageUrl2, price: price2, rating: rating2, originalPrice: originalPrice2, discountLabel: discountLabel2, ratingCount, favorited, onFavoriteClick, onShareClick, onChatClick, sold, ratingIcon: ratingIcon2, favoriteIcon, shareIcon, chatIcon, onClick: onClick2, className: className2 } = props;
|
|
1142
1163
|
return /* @__PURE__ */ jsxs23("div", { className: cx("snacky-product-card", "snacky-product-card--details", className2), children: [
|
|
1143
|
-
/* @__PURE__ */
|
|
1144
|
-
/* @__PURE__ */
|
|
1145
|
-
sold && /* @__PURE__ */
|
|
1164
|
+
/* @__PURE__ */ jsx33("div", { className: "snacky-product-card__image-block", children: /* @__PURE__ */ jsxs23("div", { className: "snacky-product-card__image-wrap", onClick: onClick2, children: [
|
|
1165
|
+
/* @__PURE__ */ jsx33("img", { className: "snacky-product-card__image", src: imageUrl2, alt: productName2 }),
|
|
1166
|
+
sold && /* @__PURE__ */ jsx33("span", { className: "snacky-product-card__sold-overlay", children: /* @__PURE__ */ jsx33(SoldOutBadge, {}) })
|
|
1146
1167
|
] }) }),
|
|
1147
1168
|
/* @__PURE__ */ jsxs23("div", { className: "snacky-product-card__details-body", children: [
|
|
1148
|
-
/* @__PURE__ */
|
|
1169
|
+
/* @__PURE__ */ jsx33("p", { className: "snacky-product-card__name", children: productName2 }),
|
|
1149
1170
|
/* @__PURE__ */ jsxs23("div", { className: "snacky-product-card__price-row", children: [
|
|
1150
|
-
/* @__PURE__ */
|
|
1151
|
-
originalPrice2 && /* @__PURE__ */
|
|
1152
|
-
discountLabel2 && /* @__PURE__ */
|
|
1171
|
+
/* @__PURE__ */ jsx33("span", { className: "snacky-product-card__price", children: price2 }),
|
|
1172
|
+
originalPrice2 && /* @__PURE__ */ jsx33("span", { className: "snacky-product-card__original-price", children: originalPrice2 }),
|
|
1173
|
+
discountLabel2 && /* @__PURE__ */ jsx33(DiscountTag, { label: discountLabel2 })
|
|
1153
1174
|
] }),
|
|
1154
1175
|
/* @__PURE__ */ jsxs23("div", { className: "snacky-product-card__footer-row", children: [
|
|
1155
1176
|
/* @__PURE__ */ jsxs23("span", { className: "snacky-product-card__rating", children: [
|
|
1156
|
-
/* @__PURE__ */
|
|
1177
|
+
/* @__PURE__ */ jsx33("span", { className: "snacky-product-card__rating-icon", children: ratingIcon2 ?? /* @__PURE__ */ jsx33(star, { width: 16, height: 16 }) }),
|
|
1157
1178
|
rating2,
|
|
1158
1179
|
" (",
|
|
1159
1180
|
ratingCount,
|
|
1160
1181
|
")"
|
|
1161
1182
|
] }),
|
|
1162
1183
|
/* @__PURE__ */ jsxs23("div", { className: "snacky-product-card__actions snacky-product-card__actions--details", children: [
|
|
1163
|
-
/* @__PURE__ */
|
|
1164
|
-
/* @__PURE__ */
|
|
1165
|
-
/* @__PURE__ */
|
|
1184
|
+
/* @__PURE__ */ jsx33(IconButton, { variant: "secondary", icon: favoriteIcon ?? (favorited ? /* @__PURE__ */ jsx33(heart2, { width: 20, height: 20 }) : /* @__PURE__ */ jsx33(heart, { width: 20, height: 20 })), selected: favorited, onClick: onFavoriteClick, ariaLabel: "Favorite" }),
|
|
1185
|
+
/* @__PURE__ */ jsx33(IconButton, { variant: "secondary", icon: shareIcon ?? /* @__PURE__ */ jsx33(share, { width: 20, height: 20 }), onClick: onShareClick, ariaLabel: "Share" }),
|
|
1186
|
+
/* @__PURE__ */ jsx33(IconButton, { variant: "secondary", icon: chatIcon ?? /* @__PURE__ */ jsx33(chat, { width: 20, height: 20 }), onClick: onChatClick, ariaLabel: "Chat with seller" })
|
|
1166
1187
|
] })
|
|
1167
1188
|
] })
|
|
1168
1189
|
] })
|
|
@@ -1179,24 +1200,24 @@ function ProductCard(props) {
|
|
|
1179
1200
|
onKeyDown: (e) => (e.key === "Enter" || e.key === " ") && onClick?.(),
|
|
1180
1201
|
children: [
|
|
1181
1202
|
/* @__PURE__ */ jsxs23("div", { className: "snacky-product-card__image-wrap", children: [
|
|
1182
|
-
/* @__PURE__ */
|
|
1183
|
-
discountLabel && /* @__PURE__ */
|
|
1203
|
+
/* @__PURE__ */ jsx33("img", { className: "snacky-product-card__image", src: imageUrl, alt: productName }),
|
|
1204
|
+
discountLabel && /* @__PURE__ */ jsx33("span", { className: "snacky-product-card__discount", children: /* @__PURE__ */ jsx33(DiscountTag, { label: discountLabel }) })
|
|
1184
1205
|
] }),
|
|
1185
|
-
/* @__PURE__ */
|
|
1206
|
+
/* @__PURE__ */ jsx33("p", { className: "snacky-product-card__name", children: productName }),
|
|
1186
1207
|
/* @__PURE__ */ jsxs23("div", { className: "snacky-product-card__price-row", children: [
|
|
1187
|
-
/* @__PURE__ */
|
|
1188
|
-
originalPrice && /* @__PURE__ */
|
|
1208
|
+
/* @__PURE__ */ jsx33("span", { className: "snacky-product-card__price", children: price }),
|
|
1209
|
+
originalPrice && /* @__PURE__ */ jsx33("span", { className: "snacky-product-card__original-price", children: originalPrice })
|
|
1189
1210
|
] }),
|
|
1190
1211
|
/* @__PURE__ */ jsxs23("div", { className: "snacky-product-card__footer-row", children: [
|
|
1191
1212
|
/* @__PURE__ */ jsxs23("span", { className: "snacky-product-card__rating", children: [
|
|
1192
|
-
/* @__PURE__ */
|
|
1213
|
+
/* @__PURE__ */ jsx33("span", { className: "snacky-product-card__rating-icon", children: ratingIcon ?? /* @__PURE__ */ jsx33(star, { width: 16, height: 16 }) }),
|
|
1193
1214
|
rating
|
|
1194
1215
|
] }),
|
|
1195
|
-
/* @__PURE__ */
|
|
1216
|
+
/* @__PURE__ */ jsx33(
|
|
1196
1217
|
IconButton,
|
|
1197
1218
|
{
|
|
1198
1219
|
variant: "primary",
|
|
1199
|
-
icon: cartIcon ?? /* @__PURE__ */
|
|
1220
|
+
icon: cartIcon ?? /* @__PURE__ */ jsx33(cartAdd, { width: 16, height: 16 }),
|
|
1200
1221
|
onClick: (e) => {
|
|
1201
1222
|
e.stopPropagation();
|
|
1202
1223
|
onAddToCart();
|
|
@@ -1211,10 +1232,10 @@ function ProductCard(props) {
|
|
|
1211
1232
|
}
|
|
1212
1233
|
|
|
1213
1234
|
// src/components/ImagePlaceholder/ImagePlaceholder.tsx
|
|
1214
|
-
import { jsx as
|
|
1235
|
+
import { jsx as jsx34, jsxs as jsxs24 } from "react/jsx-runtime";
|
|
1215
1236
|
function ImagePlaceholder({ width, height, className }) {
|
|
1216
1237
|
const iconSize = Math.round(Math.min(width, height) * 0.32);
|
|
1217
|
-
return /* @__PURE__ */
|
|
1238
|
+
return /* @__PURE__ */ jsx34(
|
|
1218
1239
|
"div",
|
|
1219
1240
|
{
|
|
1220
1241
|
className: cx("snacky-image-placeholder", className),
|
|
@@ -1233,9 +1254,9 @@ function ImagePlaceholder({ width, height, className }) {
|
|
|
1233
1254
|
strokeLinecap: "round",
|
|
1234
1255
|
strokeLinejoin: "round",
|
|
1235
1256
|
children: [
|
|
1236
|
-
/* @__PURE__ */
|
|
1237
|
-
/* @__PURE__ */
|
|
1238
|
-
/* @__PURE__ */
|
|
1257
|
+
/* @__PURE__ */ jsx34("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2" }),
|
|
1258
|
+
/* @__PURE__ */ jsx34("circle", { cx: "8.5", cy: "8.5", r: "1.5", fill: "currentColor", stroke: "none" }),
|
|
1259
|
+
/* @__PURE__ */ jsx34("polyline", { points: "21 15 16 10 5 21" })
|
|
1239
1260
|
]
|
|
1240
1261
|
}
|
|
1241
1262
|
)
|
|
@@ -1268,6 +1289,7 @@ export {
|
|
|
1268
1289
|
NotificationListItem,
|
|
1269
1290
|
OrderListItem,
|
|
1270
1291
|
OtpField,
|
|
1292
|
+
PageIndicator,
|
|
1271
1293
|
PointBalanceBanner,
|
|
1272
1294
|
ProductCard,
|
|
1273
1295
|
ProductChip,
|