@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/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 jsx21, jsxs as jsxs14 } from "react/jsx-runtime";
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__ */ jsx21(Fragment, { children });
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__ */ jsx21("span", { className: "snacky-badge-notification", children: count > max ? `${max}+` : count })
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__ */ jsx21("span", { className: cx("snacky-discount-tag", className), children: label });
810
+ return /* @__PURE__ */ jsx22("span", { className: cx("snacky-discount-tag", className), children: label });
790
811
  }
791
812
  function SoldOutBadge({ className }) {
792
- return /* @__PURE__ */ jsx21("span", { className: cx("snacky-soldout-badge", className), children: "Sold Out" });
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__ */ jsx21("span", { className: "snacky-info-badge__icon", children: icon3 }),
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 jsx22, jsxs as jsxs15 } from "react/jsx-runtime";
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__ */ jsx22("p", { className: "snacky-callout__message", children: message }),
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__ */ jsx22("span", { className: "snacky-callout__meta-icon", children: statusIcon })
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 jsx23, jsxs as jsxs16 } from "react/jsx-runtime";
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__ */ jsx23("div", { className: "snacky-order-item__thumb-box", children: /* @__PURE__ */ jsx23("img", { className: "snacky-order-item__thumb", src: productImage, alt: "" }) }),
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__ */ jsx23(
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__ */ jsx23("span", { className: "snacky-order-item__name", children: productName })
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__ */ jsx23("span", { className: "snacky-order-item__count", children: itemsSummary }),
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__ */ jsx23("b", { children: total })
890
+ /* @__PURE__ */ jsx24("b", { children: total })
870
891
  ] }),
871
- isCod && /* @__PURE__ */ jsx23("span", { className: "snacky-order-item__cod", children: "COD" })
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__ */ jsx23("div", { className: "snacky-order-item__action-row", children: /* @__PURE__ */ jsx23(
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__ */ jsx23("span", { className: "snacky-notif-item__title", children: title }),
903
- /* @__PURE__ */ jsx23("span", { className: "snacky-notif-item__message", children: message })
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 jsx24, jsxs as jsxs17 } from "react/jsx-runtime";
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__ */ jsx24("span", { className: "snacky-accordion__icon", children: leadingIcon }),
926
- /* @__PURE__ */ jsx24("span", { className: "snacky-accordion__title", children: title }),
927
- /* @__PURE__ */ jsx24(
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__ */ jsx24("path", { d: "M5 7.5L10 12.5L15 7.5", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" })
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__ */ jsx24("div", { id: panelId, className: "snacky-accordion__panel", children })
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 jsx25, jsxs as jsxs18 } from "react/jsx-runtime";
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__ */ jsx25("div", { className: "snacky-sheet-overlay", onClick: onDismiss, children: /* @__PURE__ */ jsxs18(
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__ */ jsx25("div", { className: "snacky-sheet__handle" }),
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 jsx26, jsxs as jsxs19 } from "react/jsx-runtime";
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__ */ jsx26("h3", { className: "snacky-section__title", children: title }),
977
- onAction && /* @__PURE__ */ jsx26(IconButton, { size: "small", icon: /* @__PURE__ */ jsx26(angleSmallRight, {}), onClick: onAction, ariaLabel: `See more: ${title}` })
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 jsx27, jsxs as jsxs20 } from "react/jsx-runtime";
1005
+ import { jsx as jsx28, jsxs as jsxs20 } from "react/jsx-runtime";
985
1006
  function Stepper({ steps, className }) {
986
- return /* @__PURE__ */ jsx27("ol", { className: cx("snacky-stepper", className), children: steps.map((step, i) => /* @__PURE__ */ jsxs20(
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__ */ jsx27("span", { className: cx("snacky-stepper__dot", `snacky-stepper__dot--${step.state}`), children: step.state === "cancelled" && /* @__PURE__ */ jsx27(close, { width: 12, height: 12 }) }),
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__ */ jsx27("span", { className: cx("snacky-stepper__label", `snacky-stepper__label--${step.state}`), children: step.label }),
994
- step.timestamp && /* @__PURE__ */ jsx27("span", { className: "snacky-stepper__time", children: step.timestamp })
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 jsx28, jsxs as jsxs21 } from "react/jsx-runtime";
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__ */ jsx28(
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__ */ jsx28(back, { width: 24, height: 24 })
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__ */ jsx28(
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__ */ jsx28(back, { width: 24, height: 24 })
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__ */ jsx28("span", { className: "snacky-calendar__weekday", children: d }, d)),
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__ */ jsx28("span", { className: "snacky-calendar__day-number", children: d.getDate() }),
1097
- marked.some((m) => sameDay(m, d)) && /* @__PURE__ */ jsx28("span", { className: "snacky-calendar__marker" })
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__ */ jsx28(Button, { onClick: onAction, style: { width: "100%" }, children: actionLabel })
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 jsx29 } from "react/jsx-runtime";
1130
+ import { jsx as jsx30 } from "react/jsx-runtime";
1110
1131
  function Avatar({ src, alt, size = "md", className }) {
1111
- return /* @__PURE__ */ jsx29("img", { src, alt, className: cx("snacky-avatar", `snacky-avatar--${size}`, className) });
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 jsx30 } from "react/jsx-runtime";
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__ */ jsx30("img", { src, alt, width, height, className: cx("snacky-illustration", className) });
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 jsx31, jsxs as jsxs22 } from "react/jsx-runtime";
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__ */ jsx31("img", { src, alt, className: cx("snacky-product-image", `snacky-product-image--${usage}`) }),
1133
- sold && /* @__PURE__ */ jsx31("span", { className: "snacky-product-image-sold-overlay", children: /* @__PURE__ */ jsx31("span", { className: "snacky-product-image-sold-label", children: "Sold Out" }) })
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 jsx32, jsxs as jsxs23 } from "react/jsx-runtime";
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__ */ jsx32("div", { className: "snacky-product-card__image-block", children: /* @__PURE__ */ jsxs23("div", { className: "snacky-product-card__image-wrap", onClick: onClick2, children: [
1144
- /* @__PURE__ */ jsx32("img", { className: "snacky-product-card__image", src: imageUrl2, alt: productName2 }),
1145
- sold && /* @__PURE__ */ jsx32("span", { className: "snacky-product-card__sold-overlay", children: /* @__PURE__ */ jsx32(SoldOutBadge, {}) })
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__ */ jsx32("p", { className: "snacky-product-card__name", children: productName2 }),
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__ */ jsx32("span", { className: "snacky-product-card__price", children: price2 }),
1151
- originalPrice2 && /* @__PURE__ */ jsx32("span", { className: "snacky-product-card__original-price", children: originalPrice2 }),
1152
- discountLabel2 && /* @__PURE__ */ jsx32(DiscountTag, { label: discountLabel2 })
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__ */ jsx32("span", { className: "snacky-product-card__rating-icon", children: ratingIcon2 ?? /* @__PURE__ */ jsx32(star, { width: 16, height: 16 }) }),
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__ */ jsx32(IconButton, { variant: "secondary", icon: favoriteIcon ?? (favorited ? /* @__PURE__ */ jsx32(heart2, { width: 20, height: 20 }) : /* @__PURE__ */ jsx32(heart, { width: 20, height: 20 })), selected: favorited, onClick: onFavoriteClick, ariaLabel: "Favorite" }),
1164
- /* @__PURE__ */ jsx32(IconButton, { variant: "secondary", icon: shareIcon ?? /* @__PURE__ */ jsx32(share, { width: 20, height: 20 }), onClick: onShareClick, ariaLabel: "Share" }),
1165
- /* @__PURE__ */ jsx32(IconButton, { variant: "secondary", icon: chatIcon ?? /* @__PURE__ */ jsx32(chat, { width: 20, height: 20 }), onClick: onChatClick, ariaLabel: "Chat with seller" })
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__ */ jsx32("img", { className: "snacky-product-card__image", src: imageUrl, alt: productName }),
1183
- discountLabel && /* @__PURE__ */ jsx32("span", { className: "snacky-product-card__discount", children: /* @__PURE__ */ jsx32(DiscountTag, { label: discountLabel }) })
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__ */ jsx32("p", { className: "snacky-product-card__name", children: productName }),
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__ */ jsx32("span", { className: "snacky-product-card__price", children: price }),
1188
- originalPrice && /* @__PURE__ */ jsx32("span", { className: "snacky-product-card__original-price", children: originalPrice })
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__ */ jsx32("span", { className: "snacky-product-card__rating-icon", children: ratingIcon ?? /* @__PURE__ */ jsx32(star, { width: 16, height: 16 }) }),
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__ */ jsx32(
1216
+ /* @__PURE__ */ jsx33(
1196
1217
  IconButton,
1197
1218
  {
1198
1219
  variant: "primary",
1199
- icon: cartIcon ?? /* @__PURE__ */ jsx32(cartAdd, { width: 16, height: 16 }),
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 jsx33, jsxs as jsxs24 } from "react/jsx-runtime";
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__ */ jsx33(
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__ */ jsx33("rect", { x: "3", y: "3", width: "18", height: "18", rx: "2" }),
1237
- /* @__PURE__ */ jsx33("circle", { cx: "8.5", cy: "8.5", r: "1.5", fill: "currentColor", stroke: "none" }),
1238
- /* @__PURE__ */ jsx33("polyline", { points: "21 15 16 10 5 21" })
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,