@snacky/ui 0.1.7 → 0.2.1

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.cjs CHANGED
@@ -899,7 +899,7 @@ function Accordion({ title, leadingIcon, children, defaultOpen = false, classNam
899
899
  // src/components/Modal/BottomSheet.tsx
900
900
  var import_react11 = require("react");
901
901
  var import_jsx_runtime25 = require("react/jsx-runtime");
902
- function BottomSheet({ open, onDismiss, children, hideHandle = false, className }) {
902
+ function BottomSheet({ open, onDismiss, children, showHandle = false, className }) {
903
903
  (0, import_react11.useEffect)(() => {
904
904
  if (!open) return;
905
905
  function onKeyDown(e) {
@@ -917,7 +917,7 @@ function BottomSheet({ open, onDismiss, children, hideHandle = false, className
917
917
  "aria-modal": "true",
918
918
  onClick: (e) => e.stopPropagation(),
919
919
  children: [
920
- !hideHandle && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "snacky-sheet__handle" }),
920
+ showHandle && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: "snacky-sheet__handle" }),
921
921
  children
922
922
  ]
923
923
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/theme/tokens.ts","../src/components/Button/Button.tsx","../src/utils/cx.ts","../src/components/IconButton/IconButton.tsx","../src/components/IconButton/UploadButton.tsx","../src/components/Input/TextField.tsx","../src/components/Input/SearchField.tsx","../src/components/Input/OtpField.tsx","../src/components/Input/CopyField.tsx","../src/components/Input/ChatInput.tsx","../src/components/Input/AddressResult.tsx","../src/components/Chips/ProductChip.tsx","../src/components/Chips/FilterChip.tsx","../src/components/RadioButton/RadioButton.tsx","../src/components/Checkbox/Checkbox.tsx","../src/components/Toggle/Toggle.tsx","../src/components/Navbar/Navbar.tsx","../src/components/Tab/Tab.tsx","../src/icons/outline.tsx","../src/icons/solid.tsx","../src/icons/index.ts","../src/components/Header/Header.tsx","../src/components/Banner/Banner.tsx","../src/components/Badge/Badge.tsx","../src/components/Callout/Callout.tsx","../src/components/List/List.tsx","../src/components/Accordion/Accordion.tsx","../src/components/Modal/BottomSheet.tsx","../src/components/Section/Section.tsx","../src/components/Avatar/Avatar.tsx","../src/components/Illustration/Illustration.tsx","../src/components/ProductImage/ProductImage.tsx","../src/components/ProductCard/ProductCard.tsx"],"sourcesContent":["// Snacky UI - React component library generated from the Snacky App design\n// system (../../index.html, tokens.json, components.json). Import the theme\n// once at your app root:\n//\n// import '@snacky/ui/styles.css';\n//\nimport './theme/tokens.css';\n\nexport { typography } from './theme/tokens.js';\n\nexport * from './components/Button/index.js';\nexport * from './components/IconButton/index.js';\nexport * from './components/Input/index.js';\nexport * from './components/Chips/index.js';\nexport * from './components/RadioButton/index.js';\nexport * from './components/Checkbox/index.js';\nexport * from './components/Toggle/index.js';\nexport * from './components/Navbar/index.js';\nexport * from './components/Tab/index.js';\nexport * from './components/Header/index.js';\nexport * from './components/Banner/index.js';\nexport * from './components/Badge/index.js';\nexport * from './components/Callout/index.js';\nexport * from './components/List/index.js';\nexport * from './components/Accordion/index.js';\nexport * from './components/Modal/index.js';\nexport * from './components/Section/index.js';\nexport * from './components/Avatar/index.js';\nexport * from './components/Illustration/index.js';\nexport * from './components/ProductImage/index.js';\nexport * from './components/ProductCard/index.js';\n\nexport { SnackyIcons } from './icons/index.js';\nexport type { IconProps } from './icons/index.js';\n","// Generated from tokens.json by scripts/generate-react-tokens.js - do not hand-edit.\nimport type { CSSProperties } from 'react';\n\nexport const typography: Record<string, Record<string, CSSProperties>> = {\n h1: {\n bold: { fontFamily: 'Poppins, sans-serif', fontSize: '32px', fontWeight: 700, lineHeight: '36px', letterSpacing: '0.01em' },\n },\n h2: {\n bold: { fontFamily: 'Poppins, sans-serif', fontSize: '20px', fontWeight: 700, lineHeight: '36px', letterSpacing: '0.01em' },\n },\n h3: {\n bold: { fontFamily: 'Poppins, sans-serif', fontSize: '16px', fontWeight: 700, lineHeight: '36px', letterSpacing: '0.01em' },\n regular: { fontFamily: 'Poppins, sans-serif', fontSize: '16px', fontWeight: 400, lineHeight: '36px', letterSpacing: 'normal' },\n },\n body: {\n semibold: { fontFamily: 'Poppins, sans-serif', fontSize: '14px', fontWeight: 600, lineHeight: '24px', letterSpacing: 'normal' },\n regular: { fontFamily: 'Poppins, sans-serif', fontSize: '14px', fontWeight: 400, lineHeight: '24px', letterSpacing: 'normal' },\n },\n small: {\n semibold: { fontFamily: 'Poppins, sans-serif', fontSize: '12px', fontWeight: 600, lineHeight: '24px', letterSpacing: 'normal' },\n bold: { fontFamily: 'Poppins, sans-serif', fontSize: '12px', fontWeight: 700, lineHeight: '24px', letterSpacing: '0.01em' },\n regular: { fontFamily: 'Poppins, sans-serif', fontSize: '12px', fontWeight: 400, lineHeight: '24px', letterSpacing: 'normal' },\n },\n caption: {\n semibold: { fontFamily: 'Poppins, sans-serif', fontSize: '10px', fontWeight: 600, lineHeight: '23px', letterSpacing: '0.01em' },\n regular: { fontFamily: 'Poppins, sans-serif', fontSize: '10px', fontWeight: 400, lineHeight: '16px', letterSpacing: '0.01em' },\n },\n};\n","import { forwardRef, type ButtonHTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './Button.css';\n\nexport type ButtonVariant = 'primary' | 'secondary' | 'tertiary';\nexport type ButtonSize = 'default' | 'small';\n\nexport interface ButtonProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'color'> {\n /** Hierarchy. Danger is a separate intent that layers onto any of these - it is not a fourth hierarchy. */\n variant?: ButtonVariant;\n /** Danger intent - a filled/outlined/text red treatment layered onto `variant`. */\n danger?: boolean;\n size?: ButtonSize;\n /** Optional 24x24 leading icon or social logo slot. */\n icon?: ReactNode;\n children?: ReactNode;\n}\n\n/**\n * Snacky Button - Primary/Secondary/Tertiary hierarchy, each with an optional\n * Danger intent, in two sizes. Hover/pressed are real CSS pseudo-classes, not\n * JS-tracked state, matching the design system's documented interaction model.\n */\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button(\n { variant = 'primary', danger = false, size = 'default', icon, children, className, disabled, ...rest },\n ref\n) {\n return (\n <button\n ref={ref}\n type=\"button\"\n disabled={disabled}\n className={cx(\n 'snacky-btn',\n `snacky-btn--${variant}`,\n size === 'small' && 'snacky-btn--small',\n danger && 'snacky-btn--danger',\n className\n )}\n {...rest}\n >\n {/* Icon is absolutely positioned at the left edge, matching the real\n Figma slot: the label stays centered on the button regardless of\n whether an icon is present, it doesn't shift the label over. */}\n {icon && <span className=\"snacky-btn__icon\">{icon}</span>}\n {children}\n </button>\n );\n});\n","export function cx(...parts: Array<string | false | null | undefined>): string {\n return parts.filter(Boolean).join(' ');\n}\n","import { forwardRef, type ButtonHTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './IconButton.css';\n\nexport type IconButtonVariant = 'primary' | 'secondary' | 'tertiary';\n\nexport interface IconButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: IconButtonVariant;\n /** 24px (default) or 16px (small) circle - only meaningful on the primary variant. */\n size?: 'default' | 'small';\n icon: ReactNode;\n /** Toggled/favorited state on the Secondary variant - tints the icon with icon-active, fill unchanged. */\n selected?: boolean;\n /** Accessible label - required since the button has no visible text. */\n ariaLabel: string;\n}\n\n/**\n * Snacky Icon Button - compact circular touch target for a single icon.\n * Secondary doubles as a toggle control via `selected` (e.g. Favorite).\n */\nexport const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(function IconButton(\n { variant = 'primary', size = 'default', icon, selected = false, ariaLabel, className, disabled, ...rest },\n ref\n) {\n return (\n <button\n ref={ref}\n type=\"button\"\n disabled={disabled}\n aria-label={ariaLabel}\n aria-pressed={selected}\n className={cx(\n 'snacky-iconbtn',\n `snacky-iconbtn--${variant}`,\n size === 'small' && 'snacky-iconbtn--small',\n selected && 'snacky-iconbtn--selected',\n className\n )}\n {...rest}\n >\n <span className=\"snacky-iconbtn__icon\">{icon}</span>\n </button>\n );\n});\n","import { forwardRef, type ButtonHTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './UploadButton.css';\n\nexport interface UploadButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n icon: ReactNode;\n ariaLabel?: string;\n}\n\n/** Snacky Upload Button - circular dashed-border image drop zone. */\nexport const UploadButton = forwardRef<HTMLButtonElement, UploadButtonProps>(function UploadButton(\n { icon, ariaLabel = 'Upload image', className, ...rest },\n ref\n) {\n return (\n <button ref={ref} type=\"button\" aria-label={ariaLabel} className={cx('snacky-upload', className)} {...rest}>\n {icon}\n </button>\n );\n});\n","import { forwardRef, useId, type InputHTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './TextField.css';\n\nexport interface TextFieldProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'onChange' | 'size'> {\n value: string;\n onChange: (value: string) => void;\n label?: string;\n /** Leading (left) icon or logo - e.g. a marker or payment-method logo. */\n leadingIcon?: ReactNode;\n /** Trailing (right) icon - e.g. eye toggle, chevron, calendar, clear. */\n trailingIcon?: ReactNode;\n /** Rotates the trailing icon 180deg - used by Dropdown while open. */\n trailingIconRotated?: boolean;\n error?: boolean | string;\n}\n\n/**\n * Snacky Text Field - the shared 312x48 field used for Text, Password\n * (type=\"password\" + trailingIcon), Dropdown (trailingIcon chevron, readOnly),\n * Date Picker (trailingIcon calendar, readOnly) and Address (leading/trailing\n * marker). Focus/error borders are real CSS (:focus-within, .snacky-field--error),\n * not JS-tracked state.\n */\nexport const TextField = forwardRef<HTMLInputElement, TextFieldProps>(function TextField(\n {\n value,\n onChange,\n label,\n leadingIcon,\n trailingIcon,\n trailingIconRotated = false,\n error,\n disabled,\n className,\n id,\n ...rest\n },\n ref\n) {\n const autoId = useId();\n const fieldId = id ?? autoId;\n const errorMessage = typeof error === 'string' ? error : undefined;\n\n return (\n <div className={className}>\n {label && (\n <label className=\"snacky-field-label\" htmlFor={fieldId}>\n {label}\n </label>\n )}\n <div\n className={cx('snacky-field', !!error && 'snacky-field--error', disabled && 'snacky-field--disabled')}\n >\n {leadingIcon && <span className=\"snacky-field__icon\">{leadingIcon}</span>}\n <input\n ref={ref}\n id={fieldId}\n className=\"snacky-field__input\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n disabled={disabled}\n {...rest}\n />\n {trailingIcon && (\n <span\n className=\"snacky-field__icon\"\n style={trailingIconRotated ? { transform: 'rotate(180deg)' } : undefined}\n >\n {trailingIcon}\n </span>\n )}\n </div>\n {errorMessage && <span className=\"snacky-field-error\">{errorMessage}</span>}\n </div>\n );\n});\n","import { forwardRef, type InputHTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './SearchField.css';\n\nexport interface SearchFieldProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'onChange'> {\n value: string;\n onChange: (value: string) => void;\n searchIcon?: ReactNode;\n onClear?: () => void;\n}\n\n/** Snacky Search Field - compact 40px field with a leading search icon and a clear button once filled. */\nexport const SearchField = forwardRef<HTMLInputElement, SearchFieldProps>(function SearchField(\n { value, onChange, searchIcon, onClear, className, placeholder = 'Search products...', ...rest },\n ref\n) {\n return (\n <div className={cx('snacky-search', className)}>\n {searchIcon && <span className=\"snacky-search__icon\">{searchIcon}</span>}\n <input\n ref={ref}\n className=\"snacky-search__input\"\n value={value}\n placeholder={placeholder}\n onChange={(e) => onChange(e.target.value)}\n {...rest}\n />\n {value && onClear && (\n <button type=\"button\" className=\"snacky-search__clear\" onClick={onClear} aria-label=\"Clear search\">\n ✕\n </button>\n )}\n </div>\n );\n});\n","import { useRef } from 'react';\nimport type { KeyboardEvent } from 'react';\nimport './OtpField.css';\n\nexport interface OtpFieldProps {\n value: string;\n onChange: (value: string) => void;\n length?: number;\n disabled?: boolean;\n}\n\n/** Snacky OTP Field - N individual 48x48 cells with auto-advance and backspace-to-previous. */\nexport function OtpField({ value, onChange, length = 6, disabled }: OtpFieldProps) {\n const cellRefs = useRef<Array<HTMLInputElement | null>>([]);\n const digits = Array.from({ length }, (_, i) => value[i] ?? '');\n\n function setDigit(index: number, digit: string) {\n const next = digits.slice();\n next[index] = digit;\n onChange(next.join(''));\n if (digit && index < length - 1) cellRefs.current[index + 1]?.focus();\n }\n\n function handleKeyDown(index: number, e: KeyboardEvent<HTMLInputElement>) {\n if (e.key === 'Backspace' && !digits[index] && index > 0) {\n cellRefs.current[index - 1]?.focus();\n }\n }\n\n return (\n <div className=\"snacky-otp\">\n {digits.map((digit, i) => (\n <input\n key={i}\n ref={(el) => {\n cellRefs.current[i] = el;\n }}\n className=\"snacky-otp__cell\"\n inputMode=\"numeric\"\n maxLength={1}\n value={digit}\n disabled={disabled}\n onChange={(e) => setDigit(i, e.target.value.replace(/\\D/g, '').slice(-1))}\n onKeyDown={(e) => handleKeyDown(i, e)}\n aria-label={`Digit ${i + 1}`}\n />\n ))}\n </div>\n );\n}\n","import { useState } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './CopyField.css';\n\nexport interface CopyFieldProps {\n value: string;\n onCopy?: (value: string) => void;\n className?: string;\n}\n\n/** Snacky Copy Field - a read-only value with a \"Copy\" link that flips to \"Copied\" briefly. */\nexport function CopyField({ value, onCopy, className }: CopyFieldProps) {\n const [copied, setCopied] = useState(false);\n\n async function handleCopy() {\n try {\n await navigator.clipboard.writeText(value);\n } catch {\n // clipboard API unavailable - the copy affordance still reports success visually\n }\n onCopy?.(value);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }\n\n return (\n <div className={cx('snacky-copy', className)}>\n <span className=\"snacky-copy__value\">{value}</span>\n <button type=\"button\" className={cx('snacky-copy__action', copied && 'snacky-copy__action--copied')} onClick={handleCopy}>\n {copied ? 'Copied' : 'Copy'}\n </button>\n </div>\n );\n}\n","import { type InputHTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './ChatInput.css';\n\nexport interface ChatInputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'onChange'> {\n value: string;\n onChange: (value: string) => void;\n onSend: () => void;\n sendIcon?: ReactNode;\n}\n\n/** Snacky Chat Input - message compose bar with an inline 48x48 send button. */\nexport function ChatInput({ value, onChange, onSend, sendIcon, className, placeholder = 'Write your message here', ...rest }: ChatInputProps) {\n return (\n <div className={cx('snacky-chatfield', className)}>\n <input\n className=\"snacky-chatfield__input\"\n value={value}\n placeholder={placeholder}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={(e) => e.key === 'Enter' && value && onSend()}\n {...rest}\n />\n <button\n type=\"button\"\n className={cx('snacky-chatfield__send', value && 'snacky-chatfield__send--active')}\n onClick={onSend}\n disabled={!value}\n aria-label=\"Send\"\n >\n {sendIcon ?? '➤'}\n </button>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './AddressResult.css';\n\nexport interface AddressResultProps {\n icon?: ReactNode;\n title: string;\n subtitle: string;\n onClick?: () => void;\n className?: string;\n}\n\n/** Snacky Address Search Result row - selected address entry in a results list. */\nexport function AddressResult({ icon, title, subtitle, onClick, className }: AddressResultProps) {\n return (\n <button type=\"button\" className={cx('snacky-address-result', className)} onClick={onClick}>\n {icon && <span className=\"snacky-address-result__icon\">{icon}</span>}\n <span>\n <p className=\"snacky-address-result__title\">{title}</p>\n <p className=\"snacky-address-result__subtitle\">{subtitle}</p>\n </span>\n </button>\n );\n}\n","import type { ButtonHTMLAttributes, ReactNode } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './Chips.css';\n\nexport interface ProductChipProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n label: string;\n selected: boolean;\n thumbnail: ReactNode;\n}\n\n/** Snacky Product Chip - pill chip with a 24x24 thumbnail (e.g. weight/variant picker). */\nexport function ProductChip({ label, selected, thumbnail, onClick, className, ...rest }: ProductChipProps) {\n return (\n <button\n type=\"button\"\n className={cx('snacky-chip', selected && 'snacky-chip--selected', className)}\n aria-pressed={selected}\n onClick={onClick}\n {...rest}\n >\n <span className=\"snacky-chip__thumb\">{thumbnail}</span>\n {label}\n </button>\n );\n}\n","import type { ButtonHTMLAttributes } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './Chips.css';\n\nexport interface FilterChipProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n label: string;\n selected: boolean;\n}\n\n/** Snacky Filter Chip - text-only pill toggle, e.g. category/sort filters. */\nexport function FilterChip({ label, selected, onClick, className, ...rest }: FilterChipProps) {\n return (\n <button\n type=\"button\"\n className={cx('snacky-chip', selected && 'snacky-chip--selected', className)}\n aria-pressed={selected}\n onClick={onClick}\n {...rest}\n >\n {label}\n </button>\n );\n}\n","import { useId } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './RadioButton.css';\n\nexport interface RadioOptionProps {\n label: string;\n selected: boolean;\n onClick: () => void;\n disabled?: boolean;\n name?: string;\n className?: string;\n}\n\n/** Snacky Radio Option - single-selection control. Always use within a group of 2+ options. */\nexport function RadioOption({ label, selected, onClick, disabled, name, className }: RadioOptionProps) {\n const id = useId();\n return (\n <label\n htmlFor={id}\n className={cx('snacky-radio-option', disabled && 'snacky-radio-option--disabled', className)}\n >\n <input\n id={id}\n type=\"radio\"\n className=\"snacky-radio\"\n name={name}\n checked={selected}\n disabled={disabled}\n onChange={onClick}\n />\n {label}\n </label>\n );\n}\n","import { useId } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './Checkbox.css';\n\nexport interface CheckboxProps {\n label: string;\n checked: boolean;\n onChange: (checked: boolean) => void;\n disabled?: boolean;\n className?: string;\n}\n\n/** Snacky Checkbox - binary on/off selection control. */\nexport function Checkbox({ label, checked, onChange, disabled, className }: CheckboxProps) {\n const id = useId();\n return (\n <label htmlFor={id} className={cx('snacky-checkbox-option', className)}>\n <input\n id={id}\n type=\"checkbox\"\n className=\"snacky-checkbox\"\n checked={checked}\n disabled={disabled}\n onChange={(e) => onChange(e.target.checked)}\n />\n {label}\n </label>\n );\n}\n","import { cx } from '../../utils/cx.js';\nimport './Toggle.css';\n\nexport interface ToggleProps {\n checked: boolean;\n onChange: (checked: boolean) => void;\n disabled?: boolean;\n ariaLabel?: string;\n className?: string;\n}\n\n/** Snacky Toggle - switch for settings that take effect immediately, no confirm step. */\nexport function Toggle({ checked, onChange, disabled, ariaLabel = 'Toggle', className }: ToggleProps) {\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n aria-label={ariaLabel}\n disabled={disabled}\n className={cx('snacky-toggle', checked && 'snacky-toggle--on', className)}\n onClick={() => onChange(!checked)}\n >\n <span className=\"snacky-toggle__track\" />\n <span className=\"snacky-toggle__thumb\" />\n </button>\n );\n}\n","import type { ReactNode } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './Navbar.css';\n\nexport interface NavItem {\n label: string;\n icon: ReactNode;\n activeIcon?: ReactNode;\n}\n\nexport interface NavBarProps {\n items: NavItem[];\n selected: number;\n onSelect: (index: number) => void;\n className?: string;\n}\n\n/** Snacky Nav Bar - bottom navigation, 5 tabs for the customer flow. */\nexport function NavBar({ items, selected, onSelect, className }: NavBarProps) {\n return (\n <nav className={cx('snacky-navbar', className)}>\n {items.map((item, i) => {\n const active = i === selected;\n return (\n <button\n key={item.label}\n type=\"button\"\n className={cx('snacky-navbar__item', active && 'snacky-navbar__item--active')}\n aria-current={active ? 'page' : undefined}\n onClick={() => onSelect(i)}\n >\n <span className=\"snacky-navbar__icon\">{active && item.activeIcon ? item.activeIcon : item.icon}</span>\n {item.label}\n </button>\n );\n })}\n </nav>\n );\n}\n","import { cx } from '../../utils/cx.js';\nimport './Tab.css';\n\nexport interface TabRowProps {\n tabs: string[];\n selected: number;\n onSelect: (index: number) => void;\n className?: string;\n}\n\n/** Snacky Tab Row - inline tab selector with a 2px accent underline on the active tab. */\nexport function TabRow({ tabs, selected, onSelect, className }: TabRowProps) {\n return (\n <div className={cx('snacky-tabrow', className)} role=\"tablist\">\n {tabs.map((tab, i) => (\n <button\n key={tab}\n type=\"button\"\n role=\"tab\"\n aria-selected={i === selected}\n className={cx('snacky-tab', i === selected && 'snacky-tab--active')}\n onClick={() => onSelect(i)}\n >\n {tab}\n </button>\n ))}\n </div>\n );\n}\n","import type { IconProps } from './types.js';\n\n/**\n * Starter outline icon set - generic 24x24, 1.5px stroke, matching the\n * documented Outline style. This covers the icons most needed to build a\n * form (eye/eyeOff, chevronDown, calendar, search, close, location, send,\n * check, plus/minus) plus the 5 Navbar icons.\n *\n * This is NOT the full documented 41-icon Outline set - the rest should be\n * exported from the real Figma icon components (via the same\n * download_assets/get_screenshot tooling used to build this design system)\n * and dropped in here, rather than redrawn from memory.\n */\nfunction base(path: React.ReactNode) {\n return function OutlineIcon({ width = 24, height = 24, color = 'currentColor', ...rest }: IconProps) {\n return (\n <svg width={width} height={height} viewBox=\"0 0 24 24\" fill=\"none\" stroke={color} strokeWidth={1.5} strokeLinecap=\"round\" strokeLinejoin=\"round\" {...rest}>\n {path}\n </svg>\n );\n };\n}\n\nexport const home = base(<path d=\"M4 10.5 12 4l8 6.5V19a1 1 0 0 1-1 1h-4v-6H9v6H5a1 1 0 0 1-1-1v-8.5Z\" />);\nexport const category = base(<><rect x=\"4\" y=\"4\" width=\"7\" height=\"7\" rx=\"1\" /><rect x=\"13\" y=\"4\" width=\"7\" height=\"7\" rx=\"1\" /><rect x=\"4\" y=\"13\" width=\"7\" height=\"7\" rx=\"1\" /><rect x=\"13\" y=\"13\" width=\"7\" height=\"7\" rx=\"1\" /></>);\nexport const cart = base(<><circle cx=\"9\" cy=\"20\" r=\"1\" /><circle cx=\"17\" cy=\"20\" r=\"1\" /><path d=\"M3 4h2l2.4 11.6a1.5 1.5 0 0 0 1.47 1.2h8.06a1.5 1.5 0 0 0 1.47-1.2L20 7H6\" /></>);\nexport const cartAdd = base(<><circle cx=\"9\" cy=\"20\" r=\"1\" /><circle cx=\"17\" cy=\"20\" r=\"1\" /><path d=\"M3 4h2l2.4 11.6a1.5 1.5 0 0 0 1.47 1.2h8.06a1.5 1.5 0 0 0 1.47-1.2L20 7H6\" /><path d=\"M18 2v5M15.5 4.5h5\" /></>);\nexport const history = base(<><path d=\"M3 12a9 9 0 1 0 3-6.7\" /><path d=\"M3 4v4h4\" /><path d=\"M12 8v4l3 2\" /></>);\nexport const account = base(<><circle cx=\"12\" cy=\"8\" r=\"3.5\" /><path d=\"M5 20c0-3.3 3.1-6 7-6s7 2.7 7 6\" /></>);\nexport const eye = base(<><path d=\"M2 12s3.5-6.5 10-6.5S22 12 22 12s-3.5 6.5-10 6.5S2 12 2 12Z\" /><circle cx=\"12\" cy=\"12\" r=\"2.5\" /></>);\nexport const eyeOff = base(<><path d=\"M3 3l18 18\" /><path d=\"M10.6 5.6A9.9 9.9 0 0 1 12 5.5c6.5 0 10 6.5 10 6.5a15.9 15.9 0 0 1-3.4 4.2M6.5 6.8A16.4 16.4 0 0 0 2 12s3.5 6.5 10 6.5a10 10 0 0 0 4-.8\" /><path d=\"M9.9 9.9a2.5 2.5 0 0 0 3.5 3.5\" /></>);\nexport const chevronDown = base(<path d=\"M6 9l6 6 6-6\" />);\nexport const chevronUp = base(<path d=\"M6 15l6-6 6 6\" />);\nexport const chevronRight = base(<path d=\"M9 6l6 6-6 6\" />);\nexport const back = base(<path d=\"M15 6l-6 6 6 6\" />);\nexport const close = base(<path d=\"M6 6l12 12M18 6L6 18\" />);\nexport const closeCircle = base(<><circle cx=\"12\" cy=\"12\" r=\"9\" /><path d=\"M9 9l6 6M15 9l-6 6\" /></>);\nexport const calendar = base(<><rect x=\"3\" y=\"5\" width=\"18\" height=\"16\" rx=\"2\" /><path d=\"M3 9h18M8 3v4M16 3v4\" /></>);\nexport const search = base(<><circle cx=\"11\" cy=\"11\" r=\"7\" /><path d=\"M21 21l-4.3-4.3\" /></>);\nexport const location = base(<><path d=\"M12 21s7-7.2 7-12a7 7 0 0 0-14 0c0 4.8 7 12 7 12Z\" /><circle cx=\"12\" cy=\"9\" r=\"2.5\" /></>);\nexport const pin = location;\nexport const send = base(<path d=\"M22 2 11 13M22 2l-7 20-4-9-9-4 20-7Z\" />);\nexport const chat = base(<path d=\"M21 12a8 8 0 1 1-3.3-6.5L21 4l-1 4.7A7.9 7.9 0 0 1 21 12Z\" />);\nexport const messageSquare = base(<path d=\"M4 4h16v12H8l-4 4V4Z\" />);\nexport const heart = base(<path d=\"M12 20s-7-4.4-9.3-9A5 5 0 0 1 12 6a5 5 0 0 1 9.3 5c-2.3 4.6-9.3 9-9.3 9Z\" />);\nexport const bell = base(<><path d=\"M6 9a6 6 0 0 1 12 0c0 5 2 6 2 6H4s2-1 2-6Z\" /><path d=\"M10 19a2 2 0 0 0 4 0\" /></>);\nexport const check = base(<path d=\"M5 13l4 4 10-10\" />);\nexport const plus = base(<path d=\"M12 5v14M5 12h14\" />);\nexport const minus = base(<path d=\"M5 12h14\" />);\nexport const trash = base(<><path d=\"M4 7h16M9 7V5a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2M6 7l1 13a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1l1-13\" /></>);\nexport const edit = base(<><path d=\"M4 20h4L18.5 9.5a2.1 2.1 0 0 0-3-3L5 17v3Z\" /></>);\nexport const share = base(<><circle cx=\"6\" cy=\"12\" r=\"2.5\" /><circle cx=\"18\" cy=\"6\" r=\"2.5\" /><circle cx=\"18\" cy=\"18\" r=\"2.5\" /><path d=\"M8.3 10.7l7.4-4.4M8.3 13.3l7.4 4.4\" /></>);\nexport const camera = base(<><path d=\"M4 8h3l2-2h6l2 2h3v11H4V8Z\" /><circle cx=\"12\" cy=\"13.5\" r=\"3.5\" /></>);\nexport const phone = base(<path d=\"M6 3h3l2 5-2.5 1.5a12 12 0 0 0 6 6L16 13l5 2v3a2 2 0 0 1-2 2A16 16 0 0 1 4 5a2 2 0 0 1 2-2Z\" />);\nexport const lock = base(<><rect x=\"5\" y=\"11\" width=\"14\" height=\"9\" rx=\"1.5\" /><path d=\"M8 11V8a4 4 0 0 1 8 0v3\" /></>);\nexport const document = base(<><path d=\"M7 3h7l4 4v14H7V3Z\" /><path d=\"M14 3v4h4\" /></>);\nexport const creditCard = base(<><rect x=\"3\" y=\"6\" width=\"18\" height=\"12\" rx=\"2\" /><path d=\"M3 10h18\" /></>);\nexport const receipt = base(<><path d=\"M6 3h12v18l-2-1.5-2 1.5-2-1.5-2 1.5-2-1.5-2 1.5V3Z\" /><path d=\"M9 8h6M9 12h6\" /></>);\nexport const smartphone = base(<><rect x=\"7\" y=\"2\" width=\"10\" height=\"20\" rx=\"2\" /><path d=\"M11 19h2\" /></>);\nexport const key = base(<><circle cx=\"8\" cy=\"15\" r=\"4\" /><path d=\"M11 12l9-9M17 6l3 3M14 9l2 2\" /></>);\nexport const help = base(<><circle cx=\"12\" cy=\"12\" r=\"9\" /><path d=\"M9.5 9.5a2.5 2.5 0 1 1 3.5 2.3c-.9.4-1 1-1 1.7\" /><path d=\"M12 17h.01\" /></>);\nexport const logout = base(<><path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\" /><path d=\"M16 17l5-5-5-5M21 12H9\" /></>);\nexport const truck = base(<><path d=\"M2 7h11v10H2V7Z\" /><path d=\"M13 10h4l4 3v4h-8v-7Z\" /><circle cx=\"7\" cy=\"19\" r=\"1.5\" /><circle cx=\"17\" cy=\"19\" r=\"1.5\" /></>);\nexport const cash = base(<><rect x=\"2\" y=\"6\" width=\"20\" height=\"12\" rx=\"2\" /><circle cx=\"12\" cy=\"12\" r=\"3\" /></>);\nexport const clock = base(<><circle cx=\"12\" cy=\"12\" r=\"9\" /><path d=\"M12 7v5l3.5 2\" /></>);\n","import type { IconProps } from './types.js';\n\n/**\n * Starter solid icon set - filled counterparts for the active/selected\n * Navbar + Favorite states. Only a handful are provided (matching the\n * highest-traffic use cases); export the remaining documented set (10\n * icons: Home, Category, Cart, Document, Person, Bell, Truck, Cash, Gift,\n * Heart) from Figma the same way as the outline set.\n */\nfunction base(path: React.ReactNode) {\n return function SolidIcon({ width = 24, height = 24, color = 'currentColor', ...rest }: IconProps) {\n return (\n <svg width={width} height={height} viewBox=\"0 0 24 24\" fill={color} {...rest}>\n {path}\n </svg>\n );\n };\n}\n\nexport const home = base(<path d=\"M4 10.5 12 4l8 6.5V19a1 1 0 0 1-1 1h-4v-6H9v6H5a1 1 0 0 1-1-1v-8.5Z\" />);\nexport const category = base(<><rect x=\"4\" y=\"4\" width=\"7\" height=\"7\" rx=\"1\" /><rect x=\"13\" y=\"4\" width=\"7\" height=\"7\" rx=\"1\" /><rect x=\"4\" y=\"13\" width=\"7\" height=\"7\" rx=\"1\" /><rect x=\"13\" y=\"13\" width=\"7\" height=\"7\" rx=\"1\" /></>);\nexport const cart = base(<path d=\"M3 4h2l2.4 11.6a1.5 1.5 0 0 0 1.47 1.2h8.06a1.5 1.5 0 0 0 1.47-1.2L20 7H6l-.4-2H3v-1Zm6 16a1 1 0 1 0 0-2 1 1 0 0 0 0 2Zm8 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z\" />);\nexport const heart = base(<path d=\"M12 20s-7-4.4-9.3-9A5 5 0 0 1 12 6a5 5 0 0 1 9.3 5c-2.3 4.6-9.3 9-9.3 9Z\" />);\n","import * as outline from './outline.js';\nimport * as solid from './solid.js';\n\n/** Matches the `<SnackyIcons.outline.home />` / `<SnackyIcons.solid.home />` namespace used throughout the design system's documented code samples. */\nexport const SnackyIcons = { outline, solid };\nexport type { IconProps } from './types.js';\n","import type { ReactNode } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport { SnackyIcons } from '../../icons/index.js';\nimport './Header.css';\n\nexport type HeaderLeadingIcon = 'back' | 'close';\n\nexport interface HeaderProps {\n title: string;\n /** Back drills deeper into a flow (goes to the previous screen); Close dismisses it entirely. */\n leadingIcon?: HeaderLeadingIcon;\n onLeadingClick?: () => void;\n /** Only ever pairs with leadingIcon=\"close\", never \"back\", per the documented variants. */\n trailingIcon?: ReactNode;\n onTrailingClick?: () => void;\n className?: string;\n}\n\n/**\n * Snacky Header - page header bar. Title always centers in the remaining\n * space - when a leading icon is present but there's no trailing action,\n * the title row gets matching right padding so it stays optically centered\n * against the whole bar, not just the leftover space next to the icon.\n */\nexport function Header({ title, leadingIcon, onLeadingClick, trailingIcon, onTrailingClick, className }: HeaderProps) {\n const LeadingIconEl = leadingIcon === 'back' ? SnackyIcons.outline.back : SnackyIcons.outline.close;\n return (\n <header className={cx('snacky-header', className)}>\n {leadingIcon && (\n <button\n type=\"button\"\n className=\"snacky-header__icon-btn\"\n onClick={onLeadingClick}\n aria-label={leadingIcon === 'back' ? 'Back' : 'Close'}\n >\n <LeadingIconEl width={24} height={24} />\n </button>\n )}\n <div className={cx('snacky-header__title-row', leadingIcon && !trailingIcon && 'snacky-header__title-row--balance')}>\n <span className=\"snacky-header__title\">{title}</span>\n </div>\n {trailingIcon && (\n <button type=\"button\" className=\"snacky-header__icon-btn\" onClick={onTrailingClick} aria-label=\"Action\">\n {trailingIcon}\n </button>\n )}\n </header>\n );\n}\n","import type { ReactNode } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './Banner.css';\n\nexport interface ImageBannerProps {\n imageUrl: string;\n alt: string;\n onClick?: () => void;\n className?: string;\n}\n\n/** Snacky Hero Banner - main promo carousel image. */\nexport function HeroBanner({ imageUrl, alt, onClick, className }: ImageBannerProps) {\n return <img src={imageUrl} alt={alt} onClick={onClick} className={cx('snacky-banner-hero', className)} />;\n}\n\n/** Snacky Square Banner - featured category tile (Discount / Favourites / Deals). */\nexport function SquareBanner({ imageUrl, alt, onClick, className }: ImageBannerProps) {\n return <img src={imageUrl} alt={alt} onClick={onClick} className={cx('snacky-banner-square', className)} />;\n}\n\n/** Snacky Full-width Banner - prominent promotional banner on detail pages. */\nexport function FullWidthBanner({ imageUrl, alt, onClick, className }: ImageBannerProps) {\n return <img src={imageUrl} alt={alt} onClick={onClick} className={cx('snacky-banner-full', className)} />;\n}\n\nexport interface PointBalanceBannerProps {\n pointsIcon: ReactNode;\n points: string;\n balanceIcon: ReactNode;\n balance: string;\n className?: string;\n}\n\n/** Snacky Point Balance Banner - loyalty points + wallet balance summary strip. */\nexport function PointBalanceBanner({ pointsIcon, points, balanceIcon, balance, className }: PointBalanceBannerProps) {\n return (\n <div className={cx('snacky-banner-point-balance', className)}>\n <div className=\"snacky-banner-point-balance__item\">\n <span className=\"snacky-banner-point-balance__icon\">{pointsIcon}</span>\n <div>\n <p className=\"snacky-banner-point-balance__label\">Points</p>\n <p className=\"snacky-banner-point-balance__value\">{points}</p>\n </div>\n </div>\n <div className=\"snacky-banner-point-balance__divider\" />\n <div className=\"snacky-banner-point-balance__item\">\n <span className=\"snacky-banner-point-balance__icon\">{balanceIcon}</span>\n <div>\n <p className=\"snacky-banner-point-balance__label\">Balance</p>\n <p className=\"snacky-banner-point-balance__value\">{balance}</p>\n </div>\n </div>\n </div>\n );\n}\n\nexport interface AlertBannerProps {\n message: string;\n countdown?: string;\n className?: string;\n}\n\n/** Snacky Alert Banner - inline info/warning strip, optionally with a countdown. */\nexport function AlertBanner({ message, countdown, className }: AlertBannerProps) {\n return (\n <div className={cx('snacky-banner-alert', className)}>\n <p className=\"snacky-banner-alert__message\">{message}</p>\n {countdown && <p className=\"snacky-banner-alert__countdown\">{countdown}</p>}\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './Badge.css';\n\nexport interface NotificationBadgeProps {\n count: number;\n max?: number;\n children: ReactNode;\n className?: string;\n}\n\n/** Snacky Notification Badge - numeric count overlay on an icon (e.g. cart). */\nexport function NotificationBadge({ count, max = 99, children, className }: NotificationBadgeProps) {\n if (count <= 0) return <>{children}</>;\n return (\n <span className={cx('snacky-badge-wrap', className)}>\n {children}\n <span className=\"snacky-badge-notification\">{count > max ? `${max}+` : count}</span>\n </span>\n );\n}\n\nexport interface DiscountTagProps {\n label: string;\n className?: string;\n}\n\n/** Snacky Discount Tag - inline promo/percentage-off tag, e.g. on Product Card. */\nexport function DiscountTag({ label, className }: DiscountTagProps) {\n return <span className={cx('snacky-discount-tag', className)}>{label}</span>;\n}\n\nexport interface SoldOutBadgeProps {\n className?: string;\n}\n\n/** Snacky Sold Out Badge - absolute overlay on a product image. Position it with your own layout. */\nexport function SoldOutBadge({ className }: SoldOutBadgeProps) {\n return <span className={cx('snacky-soldout-badge', className)}>Sold Out</span>;\n}\n\nexport interface VariantBadgeProps {\n label: string;\n className?: string;\n}\n\n/** Snacky Variant Badge - static, non-interactive label for the currently selected product variant. */\nexport function VariantBadge({ label, className }: VariantBadgeProps) {\n return <span className={cx('snacky-variant-badge', className)}>{label}</span>;\n}\n","import type { ReactNode } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './Callout.css';\n\nexport type CalloutVariant = 'received' | 'sent' | 'pending';\n\nexport interface CalloutProps {\n message: string;\n timestamp: string;\n variant: CalloutVariant;\n /** Sent shows a checkmark, Pending a clock - pass your own icon for either. */\n statusIcon?: ReactNode;\n className?: string;\n}\n\n/** Snacky Callout - chat message bubble. Received aligns left/white, Sent/Pending align right/accent. */\nexport function Callout({ message, timestamp, variant, statusIcon, className }: CalloutProps) {\n return (\n <div className={cx('snacky-callout', `snacky-callout--${variant}`, className)}>\n <p className=\"snacky-callout__message\">{message}</p>\n <span className=\"snacky-callout__meta\">\n {timestamp}\n {statusIcon && variant !== 'received' && <span className=\"snacky-callout__meta-icon\">{statusIcon}</span>}\n </span>\n </div>\n );\n}\n","import { cx } from '../../utils/cx.js';\nimport { Button } from '../Button/Button.js';\nimport './List.css';\n\nexport type OrderStatus = 'waiting' | 'process' | 'processCod' | 'shipped' | 'received' | 'cancelled';\n\nconst STATUS_LABEL: Record<OrderStatus, string> = {\n waiting: 'Waiting for Payment',\n process: 'Order Processing',\n processCod: 'Order Processing',\n shipped: 'Order Shipped',\n received: 'Order Received',\n cancelled: 'Order Cancelled',\n};\n\nconst STATUS_ACTION: Partial<Record<OrderStatus, string>> = {\n shipped: 'Track Shipment',\n received: 'Buy Again',\n cancelled: 'Buy Again',\n};\n\nexport interface OrderListItemProps {\n productImage: string;\n /** The first/representative product in the order, shown next to the status. */\n productName: string;\n status: OrderStatus;\n /** e.g. \"2 products\" */\n itemsSummary: string;\n /** e.g. \"Rp 8,000\" */\n total: string;\n /** Waiting status only, e.g. \"Dec 30, 11:00\" */\n paymentDeadline?: string;\n /** Overrides the status-derived CTA label (Track Shipment / Buy Again). */\n actionLabel?: string;\n onAction?: () => void;\n /** Card click, e.g. to open order detail. */\n onClick?: () => void;\n className?: string;\n}\n\n/**\n * Snacky Order List Item - order summary card. Layout, CTA, and the COD chip\n * / payment-deadline banner are all driven by `status`, matching the real\n * per-status variants (Waiting/Process/Process COD/Shipped/Received/Cancelled).\n */\nexport function OrderListItem({\n productImage,\n productName,\n status,\n itemsSummary,\n total,\n paymentDeadline,\n actionLabel,\n onAction,\n onClick,\n className,\n}: OrderListItemProps) {\n const action = actionLabel ?? STATUS_ACTION[status];\n const isCod = status === 'processCod';\n\n return (\n <div\n className={cx('snacky-order-item', className)}\n role={onClick ? 'button' : undefined}\n tabIndex={onClick ? 0 : undefined}\n onClick={onClick}\n onKeyDown={onClick ? (e) => (e.key === 'Enter' || e.key === ' ') && onClick() : undefined}\n >\n <div className=\"snacky-order-item__top\">\n <div className=\"snacky-order-item__thumb-box\">\n <img className=\"snacky-order-item__thumb\" src={productImage} alt=\"\" />\n </div>\n <div className=\"snacky-order-item__info\">\n <span\n className={cx('snacky-order-item__status', status === 'cancelled' && 'snacky-order-item__status--cancelled')}\n >\n {STATUS_LABEL[status]}\n </span>\n <span className=\"snacky-order-item__name\">{productName}</span>\n </div>\n </div>\n\n <div className=\"snacky-order-item__details\">\n <span className=\"snacky-order-item__count\">{itemsSummary}</span>\n <span className={cx('snacky-order-item__total', isCod && 'snacky-order-item__total--cod')}>\n Order Total: <b>{total}</b>\n </span>\n {isCod && <span className=\"snacky-order-item__cod\">COD</span>}\n </div>\n\n {status === 'waiting' && paymentDeadline && (\n <div className=\"snacky-order-item__deadline\">Pay before {paymentDeadline}</div>\n )}\n\n {action && (\n <div className=\"snacky-order-item__action-row\">\n <Button\n variant=\"primary\"\n onClick={(e) => {\n e.stopPropagation();\n onAction?.();\n }}\n >\n {action}\n </Button>\n </div>\n )}\n </div>\n );\n}\n\nexport interface NotificationListItemProps {\n title: string;\n message: string;\n unread?: boolean;\n onClick?: () => void;\n className?: string;\n}\n\n/** Snacky Notification List Item - accent-tinted background for unread items. */\nexport function NotificationListItem({ title, message, unread = false, onClick, className }: NotificationListItemProps) {\n return (\n <div\n className={cx('snacky-notif-item', unread && 'snacky-notif-item--unread', className)}\n role={onClick ? 'button' : undefined}\n tabIndex={onClick ? 0 : undefined}\n onClick={onClick}\n onKeyDown={onClick ? (e) => (e.key === 'Enter' || e.key === ' ') && onClick() : undefined}\n >\n <span className=\"snacky-notif-item__title\">{title}</span>\n <span className=\"snacky-notif-item__message\">{message}</span>\n </div>\n );\n}\n","import { useId, useState, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './Accordion.css';\n\nexport interface AccordionProps {\n title: string;\n /** When passed, uses the compact 12px title (icon-slot variant) - e.g. a payment-method logo. */\n leadingIcon?: ReactNode;\n children: ReactNode;\n defaultOpen?: boolean;\n className?: string;\n}\n\n/**\n * Snacky Accordion - header and (when open) panel render as two separate\n * elevated cards with a small gap between them, not one continuous card;\n * title size responds to whether `leadingIcon` is passed (matches the\n * Figma source, which models icon presence as a real variant rather than\n * optional content). Neither state ever has a border, only elevation.\n */\nexport function Accordion({ title, leadingIcon, children, defaultOpen = false, className }: AccordionProps) {\n const [open, setOpen] = useState(defaultOpen);\n const panelId = useId();\n\n return (\n <div className={cx('snacky-accordion', !!leadingIcon && 'snacky-accordion--icon', className)}>\n <button\n type=\"button\"\n className=\"snacky-accordion__header\"\n aria-expanded={open}\n aria-controls={panelId}\n onClick={() => setOpen((v) => !v)}\n >\n {leadingIcon && <span className=\"snacky-accordion__icon\">{leadingIcon}</span>}\n <span className=\"snacky-accordion__title\">{title}</span>\n <svg\n className={cx('snacky-accordion__chevron', open && 'snacky-accordion__chevron--open')}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n >\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n {open && (\n <div id={panelId} className=\"snacky-accordion__panel\">\n {children}\n </div>\n )}\n </div>\n );\n}\n","import { useEffect, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './BottomSheet.css';\n\nexport interface BottomSheetProps {\n open: boolean;\n onDismiss: () => void;\n children: ReactNode;\n /** Hide the drag-handle bar, e.g. for content that supplies its own header. */\n hideHandle?: boolean;\n className?: string;\n}\n\n/**\n * Snacky Bottom Sheet - the shared modal shell every documented Modal\n * \"variant\" (Welcome, Success, Confirmation, Calendar, Variants Selector,\n * Payment Methods, Buyer Reviews, Driver Tracking) composes from, matching\n * `SnackyBottomSheet(onDismiss = {...}) { ...content... }` in the code samples.\n * 20px radius on top corners only, dim overlay backdrop, dismiss on\n * backdrop click or Escape.\n */\nexport function BottomSheet({ open, onDismiss, children, hideHandle = false, className }: BottomSheetProps) {\n useEffect(() => {\n if (!open) return;\n function onKeyDown(e: KeyboardEvent) {\n if (e.key === 'Escape') onDismiss();\n }\n window.addEventListener('keydown', onKeyDown);\n return () => window.removeEventListener('keydown', onKeyDown);\n }, [open, onDismiss]);\n\n if (!open) return null;\n\n return (\n <div className=\"snacky-sheet-overlay\" onClick={onDismiss}>\n <div\n className={cx('snacky-sheet', className)}\n role=\"dialog\"\n aria-modal=\"true\"\n onClick={(e) => e.stopPropagation()}\n >\n {!hideHandle && <div className=\"snacky-sheet__handle\" />}\n {children}\n </div>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './Section.css';\n\nexport interface SectionProps {\n title: string;\n /** Small circular chevron button in the header, shown when provided (e.g. \"see more\"). */\n onAction?: () => void;\n children: ReactNode;\n className?: string;\n}\n\n/**\n * Snacky Section - the shared content-block shell every documented Section\n * \"variant\" (Variant Selector, Product Description, Buyer Reviews, product\n * rows, Order Summary, etc.) composes from, matching\n * `SnackySection(title = \"...\", onAction = {...}) { ...content... }`.\n */\nexport function Section({ title, onAction, children, className }: SectionProps) {\n return (\n <section className={cx('snacky-section', className)}>\n <div className=\"snacky-section__header\">\n <h3 className=\"snacky-section__title\">{title}</h3>\n {onAction && (\n <button type=\"button\" className=\"snacky-section__action\" onClick={onAction} aria-label={`See more: ${title}`}>\n <svg viewBox=\"0 0 16 16\" fill=\"none\" width=\"16\" height=\"16\">\n <path d=\"M6 3.5L10.5 8L6 12.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n )}\n </div>\n {children}\n </section>\n );\n}\n","import { cx } from '../../utils/cx.js';\nimport './Avatar.css';\n\nexport type AvatarSize = 'sm' | 'md' | 'lg';\n\nexport interface AvatarProps {\n src: string;\n alt: string;\n size?: AvatarSize;\n className?: string;\n}\n\n/** Snacky Avatar - circular profile photo in three fixed sizes (32 / 56 / 72px). */\nexport function Avatar({ src, alt, size = 'md', className }: AvatarProps) {\n return <img src={src} alt={alt} className={cx('snacky-avatar', `snacky-avatar--${size}`, className)} />;\n}\n","import { cx } from '../../utils/cx.js';\nimport './Illustration.css';\n\nexport type IllustrationVariant = 'empty' | 'createAccount' | 'welcome' | 'success' | 'discountReferral';\n\nconst SIZE: Record<IllustrationVariant, { width: number; height: number }> = {\n empty: { width: 268, height: 200 },\n createAccount: { width: 360, height: 240 },\n welcome: { width: 200, height: 200 },\n success: { width: 200, height: 200 },\n discountReferral: { width: 268, height: 200 },\n};\n\nexport interface IllustrationProps {\n variant: IllustrationVariant;\n /** Host your own export of this illustration (this package ships no artwork). */\n src: string;\n alt: string;\n className?: string;\n}\n\n/** Snacky Illustration - decorative spot illustration for empty states, onboarding, confirmations. */\nexport function Illustration({ variant, src, alt, className }: IllustrationProps) {\n const { width, height } = SIZE[variant];\n return <img src={src} alt={alt} width={width} height={height} className={cx('snacky-illustration', className)} />;\n}\n","import { cx } from '../../utils/cx.js';\nimport './ProductImage.css';\n\nexport type ProductImageUsage = 'product-card' | 'product-details' | 'list' | 'review' | 'variant' | 'accordion-modal';\n\nexport interface ProductImageProps {\n src: string;\n alt: string;\n usage: ProductImageUsage;\n /** Overlays a centered \"Sold Out\" badge - product-card and product-details only. */\n sold?: boolean;\n className?: string;\n}\n\n/**\n * Snacky Product Image - adapts its frame size/border to where it appears:\n * product-card (128) and product-details (200) are bare transparent images;\n * list (56/48 inner) and review (48/40 inner, bordered) wrap in a padded\n * frame; variant (88) is a bordered selection frame; accordion-modal (24)\n * renders a payment-method logo instead of a product photo.\n */\nexport function ProductImage({ src, alt, usage, sold = false, className }: ProductImageProps) {\n return (\n <span className={cx('snacky-product-image-wrap', `snacky-product-image-wrap--${usage}`, className)}>\n <img src={src} alt={alt} className={cx('snacky-product-image', `snacky-product-image--${usage}`)} />\n {sold && (\n <span className=\"snacky-product-image-sold-overlay\">\n <span className=\"snacky-product-image-sold-label\">Sold Out</span>\n </span>\n )}\n </span>\n );\n}\n","import type { ReactNode } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport { DiscountTag } from '../Badge/Badge.js';\nimport { SoldOutBadge } from '../Badge/Badge.js';\nimport { IconButton } from '../IconButton/IconButton.js';\nimport './ProductCard.css';\n\ninterface BaseProductCardProps {\n productName: string;\n imageUrl: string;\n price: string;\n rating: number;\n onClick?: () => void;\n className?: string;\n}\n\nexport interface ProductCardListProps extends BaseProductCardProps {\n variant?: 'list';\n originalPrice?: string;\n discountLabel?: string;\n onAddToCart: () => void;\n cartIcon?: ReactNode;\n ratingIcon?: ReactNode;\n}\n\nexport interface ProductCardDetailsProps extends BaseProductCardProps {\n variant: 'details';\n originalPrice?: string;\n discountLabel?: string;\n ratingCount: number;\n favorited: boolean;\n onFavoriteClick: () => void;\n onShareClick: () => void;\n onChatClick: () => void;\n sold?: boolean;\n ratingIcon?: ReactNode;\n favoriteIcon?: ReactNode;\n shareIcon?: ReactNode;\n chatIcon?: ReactNode;\n}\n\nexport type ProductCardProps = ProductCardListProps | ProductCardDetailsProps;\n\n/**\n * Snacky Product Card - `list` (default) for horizontal carousels/2-column\n * grids, `details` for the product detail page with rating count and\n * Favorite/Share/Chat actions.\n */\nexport function ProductCard(props: ProductCardProps) {\n if (props.variant === 'details') {\n const { productName, imageUrl, price, rating, originalPrice, discountLabel, ratingCount, favorited, onFavoriteClick, onShareClick, onChatClick, sold, ratingIcon, favoriteIcon, shareIcon, chatIcon, onClick, className } = props;\n return (\n <div className={cx('snacky-product-card', 'snacky-product-card--details', className)}>\n <div className=\"snacky-product-card__image-wrap\" onClick={onClick}>\n <img className=\"snacky-product-card__image\" src={imageUrl} alt={productName} />\n {sold && (\n <span className=\"snacky-product-card__discount\">\n <SoldOutBadge />\n </span>\n )}\n </div>\n <p className=\"snacky-product-card__name\">{productName}</p>\n <div className=\"snacky-product-card__price-row\">\n <span className=\"snacky-product-card__price\">{price}</span>\n {originalPrice && <span className=\"snacky-product-card__original-price\">{originalPrice}</span>}\n {discountLabel && <DiscountTag label={discountLabel} />}\n </div>\n <div className=\"snacky-product-card__footer-row\">\n <span className=\"snacky-product-card__rating\">\n {ratingIcon && <span className=\"snacky-product-card__rating-icon\">{ratingIcon}</span>}\n {rating} ({ratingCount})\n </span>\n <div className=\"snacky-product-card__actions snacky-product-card__actions--details\">\n <IconButton variant=\"secondary\" icon={favoriteIcon ?? '♥'} selected={favorited} onClick={onFavoriteClick} ariaLabel=\"Favorite\" />\n <IconButton variant=\"secondary\" icon={shareIcon ?? '⤴'} onClick={onShareClick} ariaLabel=\"Share\" />\n <IconButton variant=\"secondary\" icon={chatIcon ?? '💬'} onClick={onChatClick} ariaLabel=\"Chat with seller\" />\n </div>\n </div>\n </div>\n );\n }\n\n const { productName, imageUrl, price, rating, originalPrice, discountLabel, onAddToCart, cartIcon, ratingIcon, onClick, className } = props;\n return (\n <div\n className={cx('snacky-product-card', 'snacky-product-card--list', className)}\n role=\"button\"\n tabIndex={0}\n onClick={onClick}\n onKeyDown={(e) => (e.key === 'Enter' || e.key === ' ') && onClick?.()}\n >\n <div className=\"snacky-product-card__image-wrap\">\n <img className=\"snacky-product-card__image\" src={imageUrl} alt={productName} />\n {discountLabel && (\n <span className=\"snacky-product-card__discount\">\n <DiscountTag label={discountLabel} />\n </span>\n )}\n </div>\n <p className=\"snacky-product-card__name\">{productName}</p>\n <div className=\"snacky-product-card__price-row\">\n <span className=\"snacky-product-card__price\">{price}</span>\n {originalPrice && <span className=\"snacky-product-card__original-price\">{originalPrice}</span>}\n </div>\n <div className=\"snacky-product-card__footer-row\">\n <span className=\"snacky-product-card__rating\">\n {ratingIcon && <span className=\"snacky-product-card__rating-icon\">{ratingIcon}</span>}\n {rating}\n </span>\n <IconButton\n variant=\"primary\"\n icon={cartIcon ?? '+'}\n onClick={(e) => {\n e.stopPropagation();\n onAddToCart();\n }}\n ariaLabel=\"Add to cart\"\n />\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["Button","import_react","import_jsx_runtime","IconButton","import_react","import_jsx_runtime","UploadButton","import_react","import_jsx_runtime","TextField","import_react","import_jsx_runtime","SearchField","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","cart","category","heart","home","import_jsx_runtime","base","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","productName","imageUrl","price","rating","originalPrice","discountLabel","ratingIcon","onClick","className"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/theme/tokens.ts","../src/components/Button/Button.tsx","../src/utils/cx.ts","../src/components/IconButton/IconButton.tsx","../src/components/IconButton/UploadButton.tsx","../src/components/Input/TextField.tsx","../src/components/Input/SearchField.tsx","../src/components/Input/OtpField.tsx","../src/components/Input/CopyField.tsx","../src/components/Input/ChatInput.tsx","../src/components/Input/AddressResult.tsx","../src/components/Chips/ProductChip.tsx","../src/components/Chips/FilterChip.tsx","../src/components/RadioButton/RadioButton.tsx","../src/components/Checkbox/Checkbox.tsx","../src/components/Toggle/Toggle.tsx","../src/components/Navbar/Navbar.tsx","../src/components/Tab/Tab.tsx","../src/icons/outline.tsx","../src/icons/solid.tsx","../src/icons/index.ts","../src/components/Header/Header.tsx","../src/components/Banner/Banner.tsx","../src/components/Badge/Badge.tsx","../src/components/Callout/Callout.tsx","../src/components/List/List.tsx","../src/components/Accordion/Accordion.tsx","../src/components/Modal/BottomSheet.tsx","../src/components/Section/Section.tsx","../src/components/Avatar/Avatar.tsx","../src/components/Illustration/Illustration.tsx","../src/components/ProductImage/ProductImage.tsx","../src/components/ProductCard/ProductCard.tsx"],"sourcesContent":["// Snacky UI - React component library generated from the Snacky App design\n// system (../../index.html, tokens.json, components.json). Import the theme\n// once at your app root:\n//\n// import '@snacky/ui/styles.css';\n//\nimport './theme/tokens.css';\n\nexport { typography } from './theme/tokens.js';\n\nexport * from './components/Button/index.js';\nexport * from './components/IconButton/index.js';\nexport * from './components/Input/index.js';\nexport * from './components/Chips/index.js';\nexport * from './components/RadioButton/index.js';\nexport * from './components/Checkbox/index.js';\nexport * from './components/Toggle/index.js';\nexport * from './components/Navbar/index.js';\nexport * from './components/Tab/index.js';\nexport * from './components/Header/index.js';\nexport * from './components/Banner/index.js';\nexport * from './components/Badge/index.js';\nexport * from './components/Callout/index.js';\nexport * from './components/List/index.js';\nexport * from './components/Accordion/index.js';\nexport * from './components/Modal/index.js';\nexport * from './components/Section/index.js';\nexport * from './components/Avatar/index.js';\nexport * from './components/Illustration/index.js';\nexport * from './components/ProductImage/index.js';\nexport * from './components/ProductCard/index.js';\n\nexport { SnackyIcons } from './icons/index.js';\nexport type { IconProps } from './icons/index.js';\n","// Generated from tokens.json by scripts/generate-react-tokens.js - do not hand-edit.\nimport type { CSSProperties } from 'react';\n\nexport const typography: Record<string, Record<string, CSSProperties>> = {\n h1: {\n bold: { fontFamily: 'Poppins, sans-serif', fontSize: '32px', fontWeight: 700, lineHeight: '36px', letterSpacing: '0.01em' },\n },\n h2: {\n bold: { fontFamily: 'Poppins, sans-serif', fontSize: '20px', fontWeight: 700, lineHeight: '36px', letterSpacing: '0.01em' },\n },\n h3: {\n bold: { fontFamily: 'Poppins, sans-serif', fontSize: '16px', fontWeight: 700, lineHeight: '36px', letterSpacing: '0.01em' },\n regular: { fontFamily: 'Poppins, sans-serif', fontSize: '16px', fontWeight: 400, lineHeight: '36px', letterSpacing: 'normal' },\n },\n body: {\n semibold: { fontFamily: 'Poppins, sans-serif', fontSize: '14px', fontWeight: 600, lineHeight: '24px', letterSpacing: 'normal' },\n regular: { fontFamily: 'Poppins, sans-serif', fontSize: '14px', fontWeight: 400, lineHeight: '24px', letterSpacing: 'normal' },\n },\n small: {\n semibold: { fontFamily: 'Poppins, sans-serif', fontSize: '12px', fontWeight: 600, lineHeight: '24px', letterSpacing: 'normal' },\n bold: { fontFamily: 'Poppins, sans-serif', fontSize: '12px', fontWeight: 700, lineHeight: '24px', letterSpacing: '0.01em' },\n regular: { fontFamily: 'Poppins, sans-serif', fontSize: '12px', fontWeight: 400, lineHeight: '24px', letterSpacing: 'normal' },\n },\n caption: {\n semibold: { fontFamily: 'Poppins, sans-serif', fontSize: '10px', fontWeight: 600, lineHeight: '23px', letterSpacing: '0.01em' },\n regular: { fontFamily: 'Poppins, sans-serif', fontSize: '10px', fontWeight: 400, lineHeight: '16px', letterSpacing: '0.01em' },\n },\n};\n","import { forwardRef, type ButtonHTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './Button.css';\n\nexport type ButtonVariant = 'primary' | 'secondary' | 'tertiary';\nexport type ButtonSize = 'default' | 'small';\n\nexport interface ButtonProps extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'color'> {\n /** Hierarchy. Danger is a separate intent that layers onto any of these - it is not a fourth hierarchy. */\n variant?: ButtonVariant;\n /** Danger intent - a filled/outlined/text red treatment layered onto `variant`. */\n danger?: boolean;\n size?: ButtonSize;\n /** Optional 24x24 leading icon or social logo slot. */\n icon?: ReactNode;\n children?: ReactNode;\n}\n\n/**\n * Snacky Button - Primary/Secondary/Tertiary hierarchy, each with an optional\n * Danger intent, in two sizes. Hover/pressed are real CSS pseudo-classes, not\n * JS-tracked state, matching the design system's documented interaction model.\n */\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button(\n { variant = 'primary', danger = false, size = 'default', icon, children, className, disabled, ...rest },\n ref\n) {\n return (\n <button\n ref={ref}\n type=\"button\"\n disabled={disabled}\n className={cx(\n 'snacky-btn',\n `snacky-btn--${variant}`,\n size === 'small' && 'snacky-btn--small',\n danger && 'snacky-btn--danger',\n className\n )}\n {...rest}\n >\n {/* Icon is absolutely positioned at the left edge, matching the real\n Figma slot: the label stays centered on the button regardless of\n whether an icon is present, it doesn't shift the label over. */}\n {icon && <span className=\"snacky-btn__icon\">{icon}</span>}\n {children}\n </button>\n );\n});\n","export function cx(...parts: Array<string | false | null | undefined>): string {\n return parts.filter(Boolean).join(' ');\n}\n","import { forwardRef, type ButtonHTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './IconButton.css';\n\nexport type IconButtonVariant = 'primary' | 'secondary' | 'tertiary';\n\nexport interface IconButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: IconButtonVariant;\n /** 24px (default) or 16px (small) circle - only meaningful on the primary variant. */\n size?: 'default' | 'small';\n icon: ReactNode;\n /** Toggled/favorited state on the Secondary variant - tints the icon with icon-active, fill unchanged. */\n selected?: boolean;\n /** Accessible label - required since the button has no visible text. */\n ariaLabel: string;\n}\n\n/**\n * Snacky Icon Button - compact circular touch target for a single icon.\n * Secondary doubles as a toggle control via `selected` (e.g. Favorite).\n */\nexport const IconButton = forwardRef<HTMLButtonElement, IconButtonProps>(function IconButton(\n { variant = 'primary', size = 'default', icon, selected = false, ariaLabel, className, disabled, ...rest },\n ref\n) {\n return (\n <button\n ref={ref}\n type=\"button\"\n disabled={disabled}\n aria-label={ariaLabel}\n aria-pressed={selected}\n className={cx(\n 'snacky-iconbtn',\n `snacky-iconbtn--${variant}`,\n size === 'small' && 'snacky-iconbtn--small',\n selected && 'snacky-iconbtn--selected',\n className\n )}\n {...rest}\n >\n <span className=\"snacky-iconbtn__icon\">{icon}</span>\n </button>\n );\n});\n","import { forwardRef, type ButtonHTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './UploadButton.css';\n\nexport interface UploadButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n icon: ReactNode;\n ariaLabel?: string;\n}\n\n/** Snacky Upload Button - circular dashed-border image drop zone. */\nexport const UploadButton = forwardRef<HTMLButtonElement, UploadButtonProps>(function UploadButton(\n { icon, ariaLabel = 'Upload image', className, ...rest },\n ref\n) {\n return (\n <button ref={ref} type=\"button\" aria-label={ariaLabel} className={cx('snacky-upload', className)} {...rest}>\n {icon}\n </button>\n );\n});\n","import { forwardRef, useId, type InputHTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './TextField.css';\n\nexport interface TextFieldProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'onChange' | 'size'> {\n value: string;\n onChange: (value: string) => void;\n label?: string;\n /** Leading (left) icon or logo - e.g. a marker or payment-method logo. */\n leadingIcon?: ReactNode;\n /** Trailing (right) icon - e.g. eye toggle, chevron, calendar, clear. */\n trailingIcon?: ReactNode;\n /** Rotates the trailing icon 180deg - used by Dropdown while open. */\n trailingIconRotated?: boolean;\n error?: boolean | string;\n}\n\n/**\n * Snacky Text Field - the shared 312x48 field used for Text, Password\n * (type=\"password\" + trailingIcon), Dropdown (trailingIcon chevron, readOnly),\n * Date Picker (trailingIcon calendar, readOnly) and Address (leading/trailing\n * marker). Focus/error borders are real CSS (:focus-within, .snacky-field--error),\n * not JS-tracked state.\n */\nexport const TextField = forwardRef<HTMLInputElement, TextFieldProps>(function TextField(\n {\n value,\n onChange,\n label,\n leadingIcon,\n trailingIcon,\n trailingIconRotated = false,\n error,\n disabled,\n className,\n id,\n ...rest\n },\n ref\n) {\n const autoId = useId();\n const fieldId = id ?? autoId;\n const errorMessage = typeof error === 'string' ? error : undefined;\n\n return (\n <div className={className}>\n {label && (\n <label className=\"snacky-field-label\" htmlFor={fieldId}>\n {label}\n </label>\n )}\n <div\n className={cx('snacky-field', !!error && 'snacky-field--error', disabled && 'snacky-field--disabled')}\n >\n {leadingIcon && <span className=\"snacky-field__icon\">{leadingIcon}</span>}\n <input\n ref={ref}\n id={fieldId}\n className=\"snacky-field__input\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n disabled={disabled}\n {...rest}\n />\n {trailingIcon && (\n <span\n className=\"snacky-field__icon\"\n style={trailingIconRotated ? { transform: 'rotate(180deg)' } : undefined}\n >\n {trailingIcon}\n </span>\n )}\n </div>\n {errorMessage && <span className=\"snacky-field-error\">{errorMessage}</span>}\n </div>\n );\n});\n","import { forwardRef, type InputHTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './SearchField.css';\n\nexport interface SearchFieldProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'onChange'> {\n value: string;\n onChange: (value: string) => void;\n searchIcon?: ReactNode;\n onClear?: () => void;\n}\n\n/** Snacky Search Field - compact 40px field with a leading search icon and a clear button once filled. */\nexport const SearchField = forwardRef<HTMLInputElement, SearchFieldProps>(function SearchField(\n { value, onChange, searchIcon, onClear, className, placeholder = 'Search products...', ...rest },\n ref\n) {\n return (\n <div className={cx('snacky-search', className)}>\n {searchIcon && <span className=\"snacky-search__icon\">{searchIcon}</span>}\n <input\n ref={ref}\n className=\"snacky-search__input\"\n value={value}\n placeholder={placeholder}\n onChange={(e) => onChange(e.target.value)}\n {...rest}\n />\n {value && onClear && (\n <button type=\"button\" className=\"snacky-search__clear\" onClick={onClear} aria-label=\"Clear search\">\n ✕\n </button>\n )}\n </div>\n );\n});\n","import { useRef } from 'react';\nimport type { KeyboardEvent } from 'react';\nimport './OtpField.css';\n\nexport interface OtpFieldProps {\n value: string;\n onChange: (value: string) => void;\n length?: number;\n disabled?: boolean;\n}\n\n/** Snacky OTP Field - N individual 48x48 cells with auto-advance and backspace-to-previous. */\nexport function OtpField({ value, onChange, length = 6, disabled }: OtpFieldProps) {\n const cellRefs = useRef<Array<HTMLInputElement | null>>([]);\n const digits = Array.from({ length }, (_, i) => value[i] ?? '');\n\n function setDigit(index: number, digit: string) {\n const next = digits.slice();\n next[index] = digit;\n onChange(next.join(''));\n if (digit && index < length - 1) cellRefs.current[index + 1]?.focus();\n }\n\n function handleKeyDown(index: number, e: KeyboardEvent<HTMLInputElement>) {\n if (e.key === 'Backspace' && !digits[index] && index > 0) {\n cellRefs.current[index - 1]?.focus();\n }\n }\n\n return (\n <div className=\"snacky-otp\">\n {digits.map((digit, i) => (\n <input\n key={i}\n ref={(el) => {\n cellRefs.current[i] = el;\n }}\n className=\"snacky-otp__cell\"\n inputMode=\"numeric\"\n maxLength={1}\n value={digit}\n disabled={disabled}\n onChange={(e) => setDigit(i, e.target.value.replace(/\\D/g, '').slice(-1))}\n onKeyDown={(e) => handleKeyDown(i, e)}\n aria-label={`Digit ${i + 1}`}\n />\n ))}\n </div>\n );\n}\n","import { useState } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './CopyField.css';\n\nexport interface CopyFieldProps {\n value: string;\n onCopy?: (value: string) => void;\n className?: string;\n}\n\n/** Snacky Copy Field - a read-only value with a \"Copy\" link that flips to \"Copied\" briefly. */\nexport function CopyField({ value, onCopy, className }: CopyFieldProps) {\n const [copied, setCopied] = useState(false);\n\n async function handleCopy() {\n try {\n await navigator.clipboard.writeText(value);\n } catch {\n // clipboard API unavailable - the copy affordance still reports success visually\n }\n onCopy?.(value);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }\n\n return (\n <div className={cx('snacky-copy', className)}>\n <span className=\"snacky-copy__value\">{value}</span>\n <button type=\"button\" className={cx('snacky-copy__action', copied && 'snacky-copy__action--copied')} onClick={handleCopy}>\n {copied ? 'Copied' : 'Copy'}\n </button>\n </div>\n );\n}\n","import { type InputHTMLAttributes, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './ChatInput.css';\n\nexport interface ChatInputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'onChange'> {\n value: string;\n onChange: (value: string) => void;\n onSend: () => void;\n sendIcon?: ReactNode;\n}\n\n/** Snacky Chat Input - message compose bar with an inline 48x48 send button. */\nexport function ChatInput({ value, onChange, onSend, sendIcon, className, placeholder = 'Write your message here', ...rest }: ChatInputProps) {\n return (\n <div className={cx('snacky-chatfield', className)}>\n <input\n className=\"snacky-chatfield__input\"\n value={value}\n placeholder={placeholder}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={(e) => e.key === 'Enter' && value && onSend()}\n {...rest}\n />\n <button\n type=\"button\"\n className={cx('snacky-chatfield__send', value && 'snacky-chatfield__send--active')}\n onClick={onSend}\n disabled={!value}\n aria-label=\"Send\"\n >\n {sendIcon ?? '➤'}\n </button>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './AddressResult.css';\n\nexport interface AddressResultProps {\n icon?: ReactNode;\n title: string;\n subtitle: string;\n onClick?: () => void;\n className?: string;\n}\n\n/** Snacky Address Search Result row - selected address entry in a results list. */\nexport function AddressResult({ icon, title, subtitle, onClick, className }: AddressResultProps) {\n return (\n <button type=\"button\" className={cx('snacky-address-result', className)} onClick={onClick}>\n {icon && <span className=\"snacky-address-result__icon\">{icon}</span>}\n <span>\n <p className=\"snacky-address-result__title\">{title}</p>\n <p className=\"snacky-address-result__subtitle\">{subtitle}</p>\n </span>\n </button>\n );\n}\n","import type { ButtonHTMLAttributes, ReactNode } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './Chips.css';\n\nexport interface ProductChipProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n label: string;\n selected: boolean;\n thumbnail: ReactNode;\n}\n\n/** Snacky Product Chip - pill chip with a 24x24 thumbnail (e.g. weight/variant picker). */\nexport function ProductChip({ label, selected, thumbnail, onClick, className, ...rest }: ProductChipProps) {\n return (\n <button\n type=\"button\"\n className={cx('snacky-chip', selected && 'snacky-chip--selected', className)}\n aria-pressed={selected}\n onClick={onClick}\n {...rest}\n >\n <span className=\"snacky-chip__thumb\">{thumbnail}</span>\n {label}\n </button>\n );\n}\n","import type { ButtonHTMLAttributes } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './Chips.css';\n\nexport interface FilterChipProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n label: string;\n selected: boolean;\n}\n\n/** Snacky Filter Chip - text-only pill toggle, e.g. category/sort filters. */\nexport function FilterChip({ label, selected, onClick, className, ...rest }: FilterChipProps) {\n return (\n <button\n type=\"button\"\n className={cx('snacky-chip', selected && 'snacky-chip--selected', className)}\n aria-pressed={selected}\n onClick={onClick}\n {...rest}\n >\n {label}\n </button>\n );\n}\n","import { useId } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './RadioButton.css';\n\nexport interface RadioOptionProps {\n label: string;\n selected: boolean;\n onClick: () => void;\n disabled?: boolean;\n name?: string;\n className?: string;\n}\n\n/** Snacky Radio Option - single-selection control. Always use within a group of 2+ options. */\nexport function RadioOption({ label, selected, onClick, disabled, name, className }: RadioOptionProps) {\n const id = useId();\n return (\n <label\n htmlFor={id}\n className={cx('snacky-radio-option', disabled && 'snacky-radio-option--disabled', className)}\n >\n <input\n id={id}\n type=\"radio\"\n className=\"snacky-radio\"\n name={name}\n checked={selected}\n disabled={disabled}\n onChange={onClick}\n />\n {label}\n </label>\n );\n}\n","import { useId } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './Checkbox.css';\n\nexport interface CheckboxProps {\n label: string;\n checked: boolean;\n onChange: (checked: boolean) => void;\n disabled?: boolean;\n className?: string;\n}\n\n/** Snacky Checkbox - binary on/off selection control. */\nexport function Checkbox({ label, checked, onChange, disabled, className }: CheckboxProps) {\n const id = useId();\n return (\n <label htmlFor={id} className={cx('snacky-checkbox-option', className)}>\n <input\n id={id}\n type=\"checkbox\"\n className=\"snacky-checkbox\"\n checked={checked}\n disabled={disabled}\n onChange={(e) => onChange(e.target.checked)}\n />\n {label}\n </label>\n );\n}\n","import { cx } from '../../utils/cx.js';\nimport './Toggle.css';\n\nexport interface ToggleProps {\n checked: boolean;\n onChange: (checked: boolean) => void;\n disabled?: boolean;\n ariaLabel?: string;\n className?: string;\n}\n\n/** Snacky Toggle - switch for settings that take effect immediately, no confirm step. */\nexport function Toggle({ checked, onChange, disabled, ariaLabel = 'Toggle', className }: ToggleProps) {\n return (\n <button\n type=\"button\"\n role=\"switch\"\n aria-checked={checked}\n aria-label={ariaLabel}\n disabled={disabled}\n className={cx('snacky-toggle', checked && 'snacky-toggle--on', className)}\n onClick={() => onChange(!checked)}\n >\n <span className=\"snacky-toggle__track\" />\n <span className=\"snacky-toggle__thumb\" />\n </button>\n );\n}\n","import type { ReactNode } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './Navbar.css';\n\nexport interface NavItem {\n label: string;\n icon: ReactNode;\n activeIcon?: ReactNode;\n}\n\nexport interface NavBarProps {\n items: NavItem[];\n selected: number;\n onSelect: (index: number) => void;\n className?: string;\n}\n\n/** Snacky Nav Bar - bottom navigation, 5 tabs for the customer flow. */\nexport function NavBar({ items, selected, onSelect, className }: NavBarProps) {\n return (\n <nav className={cx('snacky-navbar', className)}>\n {items.map((item, i) => {\n const active = i === selected;\n return (\n <button\n key={item.label}\n type=\"button\"\n className={cx('snacky-navbar__item', active && 'snacky-navbar__item--active')}\n aria-current={active ? 'page' : undefined}\n onClick={() => onSelect(i)}\n >\n <span className=\"snacky-navbar__icon\">{active && item.activeIcon ? item.activeIcon : item.icon}</span>\n {item.label}\n </button>\n );\n })}\n </nav>\n );\n}\n","import { cx } from '../../utils/cx.js';\nimport './Tab.css';\n\nexport interface TabRowProps {\n tabs: string[];\n selected: number;\n onSelect: (index: number) => void;\n className?: string;\n}\n\n/** Snacky Tab Row - inline tab selector with a 2px accent underline on the active tab. */\nexport function TabRow({ tabs, selected, onSelect, className }: TabRowProps) {\n return (\n <div className={cx('snacky-tabrow', className)} role=\"tablist\">\n {tabs.map((tab, i) => (\n <button\n key={tab}\n type=\"button\"\n role=\"tab\"\n aria-selected={i === selected}\n className={cx('snacky-tab', i === selected && 'snacky-tab--active')}\n onClick={() => onSelect(i)}\n >\n {tab}\n </button>\n ))}\n </div>\n );\n}\n","import type { IconProps } from './types.js';\n\n/**\n * Starter outline icon set - generic 24x24, 1.5px stroke, matching the\n * documented Outline style. This covers the icons most needed to build a\n * form (eye/eyeOff, chevronDown, calendar, search, close, location, send,\n * check, plus/minus) plus the 5 Navbar icons.\n *\n * This is NOT the full documented 41-icon Outline set - the rest should be\n * exported from the real Figma icon components (via the same\n * download_assets/get_screenshot tooling used to build this design system)\n * and dropped in here, rather than redrawn from memory.\n */\nfunction base(path: React.ReactNode) {\n return function OutlineIcon({ width = 24, height = 24, color = 'currentColor', ...rest }: IconProps) {\n return (\n <svg width={width} height={height} viewBox=\"0 0 24 24\" fill=\"none\" stroke={color} strokeWidth={1.5} strokeLinecap=\"round\" strokeLinejoin=\"round\" {...rest}>\n {path}\n </svg>\n );\n };\n}\n\nexport const home = base(<path d=\"M4 10.5 12 4l8 6.5V19a1 1 0 0 1-1 1h-4v-6H9v6H5a1 1 0 0 1-1-1v-8.5Z\" />);\nexport const category = base(<><rect x=\"4\" y=\"4\" width=\"7\" height=\"7\" rx=\"1\" /><rect x=\"13\" y=\"4\" width=\"7\" height=\"7\" rx=\"1\" /><rect x=\"4\" y=\"13\" width=\"7\" height=\"7\" rx=\"1\" /><rect x=\"13\" y=\"13\" width=\"7\" height=\"7\" rx=\"1\" /></>);\nexport const cart = base(<><circle cx=\"9\" cy=\"20\" r=\"1\" /><circle cx=\"17\" cy=\"20\" r=\"1\" /><path d=\"M3 4h2l2.4 11.6a1.5 1.5 0 0 0 1.47 1.2h8.06a1.5 1.5 0 0 0 1.47-1.2L20 7H6\" /></>);\nexport const cartAdd = base(<><circle cx=\"9\" cy=\"20\" r=\"1\" /><circle cx=\"17\" cy=\"20\" r=\"1\" /><path d=\"M3 4h2l2.4 11.6a1.5 1.5 0 0 0 1.47 1.2h8.06a1.5 1.5 0 0 0 1.47-1.2L20 7H6\" /><path d=\"M18 2v5M15.5 4.5h5\" /></>);\nexport const history = base(<><path d=\"M3 12a9 9 0 1 0 3-6.7\" /><path d=\"M3 4v4h4\" /><path d=\"M12 8v4l3 2\" /></>);\nexport const account = base(<><circle cx=\"12\" cy=\"8\" r=\"3.5\" /><path d=\"M5 20c0-3.3 3.1-6 7-6s7 2.7 7 6\" /></>);\nexport const eye = base(<><path d=\"M2 12s3.5-6.5 10-6.5S22 12 22 12s-3.5 6.5-10 6.5S2 12 2 12Z\" /><circle cx=\"12\" cy=\"12\" r=\"2.5\" /></>);\nexport const eyeOff = base(<><path d=\"M3 3l18 18\" /><path d=\"M10.6 5.6A9.9 9.9 0 0 1 12 5.5c6.5 0 10 6.5 10 6.5a15.9 15.9 0 0 1-3.4 4.2M6.5 6.8A16.4 16.4 0 0 0 2 12s3.5 6.5 10 6.5a10 10 0 0 0 4-.8\" /><path d=\"M9.9 9.9a2.5 2.5 0 0 0 3.5 3.5\" /></>);\nexport const chevronDown = base(<path d=\"M6 9l6 6 6-6\" />);\nexport const chevronUp = base(<path d=\"M6 15l6-6 6 6\" />);\nexport const chevronRight = base(<path d=\"M9 6l6 6-6 6\" />);\nexport const back = base(<path d=\"M15 6l-6 6 6 6\" />);\nexport const close = base(<path d=\"M6 6l12 12M18 6L6 18\" />);\nexport const closeCircle = base(<><circle cx=\"12\" cy=\"12\" r=\"9\" /><path d=\"M9 9l6 6M15 9l-6 6\" /></>);\nexport const calendar = base(<><rect x=\"3\" y=\"5\" width=\"18\" height=\"16\" rx=\"2\" /><path d=\"M3 9h18M8 3v4M16 3v4\" /></>);\nexport const search = base(<><circle cx=\"11\" cy=\"11\" r=\"7\" /><path d=\"M21 21l-4.3-4.3\" /></>);\nexport const location = base(<><path d=\"M12 21s7-7.2 7-12a7 7 0 0 0-14 0c0 4.8 7 12 7 12Z\" /><circle cx=\"12\" cy=\"9\" r=\"2.5\" /></>);\nexport const pin = location;\nexport const send = base(<path d=\"M22 2 11 13M22 2l-7 20-4-9-9-4 20-7Z\" />);\nexport const chat = base(<path d=\"M21 12a8 8 0 1 1-3.3-6.5L21 4l-1 4.7A7.9 7.9 0 0 1 21 12Z\" />);\nexport const messageSquare = base(<path d=\"M4 4h16v12H8l-4 4V4Z\" />);\nexport const heart = base(<path d=\"M12 20s-7-4.4-9.3-9A5 5 0 0 1 12 6a5 5 0 0 1 9.3 5c-2.3 4.6-9.3 9-9.3 9Z\" />);\nexport const bell = base(<><path d=\"M6 9a6 6 0 0 1 12 0c0 5 2 6 2 6H4s2-1 2-6Z\" /><path d=\"M10 19a2 2 0 0 0 4 0\" /></>);\nexport const check = base(<path d=\"M5 13l4 4 10-10\" />);\nexport const plus = base(<path d=\"M12 5v14M5 12h14\" />);\nexport const minus = base(<path d=\"M5 12h14\" />);\nexport const trash = base(<><path d=\"M4 7h16M9 7V5a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v2M6 7l1 13a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1l1-13\" /></>);\nexport const edit = base(<><path d=\"M4 20h4L18.5 9.5a2.1 2.1 0 0 0-3-3L5 17v3Z\" /></>);\nexport const share = base(<><circle cx=\"6\" cy=\"12\" r=\"2.5\" /><circle cx=\"18\" cy=\"6\" r=\"2.5\" /><circle cx=\"18\" cy=\"18\" r=\"2.5\" /><path d=\"M8.3 10.7l7.4-4.4M8.3 13.3l7.4 4.4\" /></>);\nexport const camera = base(<><path d=\"M4 8h3l2-2h6l2 2h3v11H4V8Z\" /><circle cx=\"12\" cy=\"13.5\" r=\"3.5\" /></>);\nexport const phone = base(<path d=\"M6 3h3l2 5-2.5 1.5a12 12 0 0 0 6 6L16 13l5 2v3a2 2 0 0 1-2 2A16 16 0 0 1 4 5a2 2 0 0 1 2-2Z\" />);\nexport const lock = base(<><rect x=\"5\" y=\"11\" width=\"14\" height=\"9\" rx=\"1.5\" /><path d=\"M8 11V8a4 4 0 0 1 8 0v3\" /></>);\nexport const document = base(<><path d=\"M7 3h7l4 4v14H7V3Z\" /><path d=\"M14 3v4h4\" /></>);\nexport const creditCard = base(<><rect x=\"3\" y=\"6\" width=\"18\" height=\"12\" rx=\"2\" /><path d=\"M3 10h18\" /></>);\nexport const receipt = base(<><path d=\"M6 3h12v18l-2-1.5-2 1.5-2-1.5-2 1.5-2-1.5-2 1.5V3Z\" /><path d=\"M9 8h6M9 12h6\" /></>);\nexport const smartphone = base(<><rect x=\"7\" y=\"2\" width=\"10\" height=\"20\" rx=\"2\" /><path d=\"M11 19h2\" /></>);\nexport const key = base(<><circle cx=\"8\" cy=\"15\" r=\"4\" /><path d=\"M11 12l9-9M17 6l3 3M14 9l2 2\" /></>);\nexport const help = base(<><circle cx=\"12\" cy=\"12\" r=\"9\" /><path d=\"M9.5 9.5a2.5 2.5 0 1 1 3.5 2.3c-.9.4-1 1-1 1.7\" /><path d=\"M12 17h.01\" /></>);\nexport const logout = base(<><path d=\"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\" /><path d=\"M16 17l5-5-5-5M21 12H9\" /></>);\nexport const truck = base(<><path d=\"M2 7h11v10H2V7Z\" /><path d=\"M13 10h4l4 3v4h-8v-7Z\" /><circle cx=\"7\" cy=\"19\" r=\"1.5\" /><circle cx=\"17\" cy=\"19\" r=\"1.5\" /></>);\nexport const cash = base(<><rect x=\"2\" y=\"6\" width=\"20\" height=\"12\" rx=\"2\" /><circle cx=\"12\" cy=\"12\" r=\"3\" /></>);\nexport const clock = base(<><circle cx=\"12\" cy=\"12\" r=\"9\" /><path d=\"M12 7v5l3.5 2\" /></>);\n","import type { IconProps } from './types.js';\n\n/**\n * Starter solid icon set - filled counterparts for the active/selected\n * Navbar + Favorite states. Only a handful are provided (matching the\n * highest-traffic use cases); export the remaining documented set (10\n * icons: Home, Category, Cart, Document, Person, Bell, Truck, Cash, Gift,\n * Heart) from Figma the same way as the outline set.\n */\nfunction base(path: React.ReactNode) {\n return function SolidIcon({ width = 24, height = 24, color = 'currentColor', ...rest }: IconProps) {\n return (\n <svg width={width} height={height} viewBox=\"0 0 24 24\" fill={color} {...rest}>\n {path}\n </svg>\n );\n };\n}\n\nexport const home = base(<path d=\"M4 10.5 12 4l8 6.5V19a1 1 0 0 1-1 1h-4v-6H9v6H5a1 1 0 0 1-1-1v-8.5Z\" />);\nexport const category = base(<><rect x=\"4\" y=\"4\" width=\"7\" height=\"7\" rx=\"1\" /><rect x=\"13\" y=\"4\" width=\"7\" height=\"7\" rx=\"1\" /><rect x=\"4\" y=\"13\" width=\"7\" height=\"7\" rx=\"1\" /><rect x=\"13\" y=\"13\" width=\"7\" height=\"7\" rx=\"1\" /></>);\nexport const cart = base(<path d=\"M3 4h2l2.4 11.6a1.5 1.5 0 0 0 1.47 1.2h8.06a1.5 1.5 0 0 0 1.47-1.2L20 7H6l-.4-2H3v-1Zm6 16a1 1 0 1 0 0-2 1 1 0 0 0 0 2Zm8 0a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z\" />);\nexport const heart = base(<path d=\"M12 20s-7-4.4-9.3-9A5 5 0 0 1 12 6a5 5 0 0 1 9.3 5c-2.3 4.6-9.3 9-9.3 9Z\" />);\n","import * as outline from './outline.js';\nimport * as solid from './solid.js';\n\n/** Matches the `<SnackyIcons.outline.home />` / `<SnackyIcons.solid.home />` namespace used throughout the design system's documented code samples. */\nexport const SnackyIcons = { outline, solid };\nexport type { IconProps } from './types.js';\n","import type { ReactNode } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport { SnackyIcons } from '../../icons/index.js';\nimport './Header.css';\n\nexport type HeaderLeadingIcon = 'back' | 'close';\n\nexport interface HeaderProps {\n title: string;\n /** Back drills deeper into a flow (goes to the previous screen); Close dismisses it entirely. */\n leadingIcon?: HeaderLeadingIcon;\n onLeadingClick?: () => void;\n /** Only ever pairs with leadingIcon=\"close\", never \"back\", per the documented variants. */\n trailingIcon?: ReactNode;\n onTrailingClick?: () => void;\n className?: string;\n}\n\n/**\n * Snacky Header - page header bar. Title always centers in the remaining\n * space - when a leading icon is present but there's no trailing action,\n * the title row gets matching right padding so it stays optically centered\n * against the whole bar, not just the leftover space next to the icon.\n */\nexport function Header({ title, leadingIcon, onLeadingClick, trailingIcon, onTrailingClick, className }: HeaderProps) {\n const LeadingIconEl = leadingIcon === 'back' ? SnackyIcons.outline.back : SnackyIcons.outline.close;\n return (\n <header className={cx('snacky-header', className)}>\n {leadingIcon && (\n <button\n type=\"button\"\n className=\"snacky-header__icon-btn\"\n onClick={onLeadingClick}\n aria-label={leadingIcon === 'back' ? 'Back' : 'Close'}\n >\n <LeadingIconEl width={24} height={24} />\n </button>\n )}\n <div className={cx('snacky-header__title-row', leadingIcon && !trailingIcon && 'snacky-header__title-row--balance')}>\n <span className=\"snacky-header__title\">{title}</span>\n </div>\n {trailingIcon && (\n <button type=\"button\" className=\"snacky-header__icon-btn\" onClick={onTrailingClick} aria-label=\"Action\">\n {trailingIcon}\n </button>\n )}\n </header>\n );\n}\n","import type { ReactNode } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './Banner.css';\n\nexport interface ImageBannerProps {\n imageUrl: string;\n alt: string;\n onClick?: () => void;\n className?: string;\n}\n\n/** Snacky Hero Banner - main promo carousel image. */\nexport function HeroBanner({ imageUrl, alt, onClick, className }: ImageBannerProps) {\n return <img src={imageUrl} alt={alt} onClick={onClick} className={cx('snacky-banner-hero', className)} />;\n}\n\n/** Snacky Square Banner - featured category tile (Discount / Favourites / Deals). */\nexport function SquareBanner({ imageUrl, alt, onClick, className }: ImageBannerProps) {\n return <img src={imageUrl} alt={alt} onClick={onClick} className={cx('snacky-banner-square', className)} />;\n}\n\n/** Snacky Full-width Banner - prominent promotional banner on detail pages. */\nexport function FullWidthBanner({ imageUrl, alt, onClick, className }: ImageBannerProps) {\n return <img src={imageUrl} alt={alt} onClick={onClick} className={cx('snacky-banner-full', className)} />;\n}\n\nexport interface PointBalanceBannerProps {\n pointsIcon: ReactNode;\n points: string;\n balanceIcon: ReactNode;\n balance: string;\n className?: string;\n}\n\n/** Snacky Point Balance Banner - loyalty points + wallet balance summary strip. */\nexport function PointBalanceBanner({ pointsIcon, points, balanceIcon, balance, className }: PointBalanceBannerProps) {\n return (\n <div className={cx('snacky-banner-point-balance', className)}>\n <div className=\"snacky-banner-point-balance__item\">\n <span className=\"snacky-banner-point-balance__icon\">{pointsIcon}</span>\n <div>\n <p className=\"snacky-banner-point-balance__label\">Points</p>\n <p className=\"snacky-banner-point-balance__value\">{points}</p>\n </div>\n </div>\n <div className=\"snacky-banner-point-balance__divider\" />\n <div className=\"snacky-banner-point-balance__item\">\n <span className=\"snacky-banner-point-balance__icon\">{balanceIcon}</span>\n <div>\n <p className=\"snacky-banner-point-balance__label\">Balance</p>\n <p className=\"snacky-banner-point-balance__value\">{balance}</p>\n </div>\n </div>\n </div>\n );\n}\n\nexport interface AlertBannerProps {\n message: string;\n countdown?: string;\n className?: string;\n}\n\n/** Snacky Alert Banner - inline info/warning strip, optionally with a countdown. */\nexport function AlertBanner({ message, countdown, className }: AlertBannerProps) {\n return (\n <div className={cx('snacky-banner-alert', className)}>\n <p className=\"snacky-banner-alert__message\">{message}</p>\n {countdown && <p className=\"snacky-banner-alert__countdown\">{countdown}</p>}\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './Badge.css';\n\nexport interface NotificationBadgeProps {\n count: number;\n max?: number;\n children: ReactNode;\n className?: string;\n}\n\n/** Snacky Notification Badge - numeric count overlay on an icon (e.g. cart). */\nexport function NotificationBadge({ count, max = 99, children, className }: NotificationBadgeProps) {\n if (count <= 0) return <>{children}</>;\n return (\n <span className={cx('snacky-badge-wrap', className)}>\n {children}\n <span className=\"snacky-badge-notification\">{count > max ? `${max}+` : count}</span>\n </span>\n );\n}\n\nexport interface DiscountTagProps {\n label: string;\n className?: string;\n}\n\n/** Snacky Discount Tag - inline promo/percentage-off tag, e.g. on Product Card. */\nexport function DiscountTag({ label, className }: DiscountTagProps) {\n return <span className={cx('snacky-discount-tag', className)}>{label}</span>;\n}\n\nexport interface SoldOutBadgeProps {\n className?: string;\n}\n\n/** Snacky Sold Out Badge - absolute overlay on a product image. Position it with your own layout. */\nexport function SoldOutBadge({ className }: SoldOutBadgeProps) {\n return <span className={cx('snacky-soldout-badge', className)}>Sold Out</span>;\n}\n\nexport interface VariantBadgeProps {\n label: string;\n className?: string;\n}\n\n/** Snacky Variant Badge - static, non-interactive label for the currently selected product variant. */\nexport function VariantBadge({ label, className }: VariantBadgeProps) {\n return <span className={cx('snacky-variant-badge', className)}>{label}</span>;\n}\n","import type { ReactNode } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './Callout.css';\n\nexport type CalloutVariant = 'received' | 'sent' | 'pending';\n\nexport interface CalloutProps {\n message: string;\n timestamp: string;\n variant: CalloutVariant;\n /** Sent shows a checkmark, Pending a clock - pass your own icon for either. */\n statusIcon?: ReactNode;\n className?: string;\n}\n\n/** Snacky Callout - chat message bubble. Received aligns left/white, Sent/Pending align right/accent. */\nexport function Callout({ message, timestamp, variant, statusIcon, className }: CalloutProps) {\n return (\n <div className={cx('snacky-callout', `snacky-callout--${variant}`, className)}>\n <p className=\"snacky-callout__message\">{message}</p>\n <span className=\"snacky-callout__meta\">\n {timestamp}\n {statusIcon && variant !== 'received' && <span className=\"snacky-callout__meta-icon\">{statusIcon}</span>}\n </span>\n </div>\n );\n}\n","import { cx } from '../../utils/cx.js';\nimport { Button } from '../Button/Button.js';\nimport './List.css';\n\nexport type OrderStatus = 'waiting' | 'process' | 'processCod' | 'shipped' | 'received' | 'cancelled';\n\nconst STATUS_LABEL: Record<OrderStatus, string> = {\n waiting: 'Waiting for Payment',\n process: 'Order Processing',\n processCod: 'Order Processing',\n shipped: 'Order Shipped',\n received: 'Order Received',\n cancelled: 'Order Cancelled',\n};\n\nconst STATUS_ACTION: Partial<Record<OrderStatus, string>> = {\n shipped: 'Track Shipment',\n received: 'Buy Again',\n cancelled: 'Buy Again',\n};\n\nexport interface OrderListItemProps {\n productImage: string;\n /** The first/representative product in the order, shown next to the status. */\n productName: string;\n status: OrderStatus;\n /** e.g. \"2 products\" */\n itemsSummary: string;\n /** e.g. \"Rp 8,000\" */\n total: string;\n /** Waiting status only, e.g. \"Dec 30, 11:00\" */\n paymentDeadline?: string;\n /** Overrides the status-derived CTA label (Track Shipment / Buy Again). */\n actionLabel?: string;\n onAction?: () => void;\n /** Card click, e.g. to open order detail. */\n onClick?: () => void;\n className?: string;\n}\n\n/**\n * Snacky Order List Item - order summary card. Layout, CTA, and the COD chip\n * / payment-deadline banner are all driven by `status`, matching the real\n * per-status variants (Waiting/Process/Process COD/Shipped/Received/Cancelled).\n */\nexport function OrderListItem({\n productImage,\n productName,\n status,\n itemsSummary,\n total,\n paymentDeadline,\n actionLabel,\n onAction,\n onClick,\n className,\n}: OrderListItemProps) {\n const action = actionLabel ?? STATUS_ACTION[status];\n const isCod = status === 'processCod';\n\n return (\n <div\n className={cx('snacky-order-item', className)}\n role={onClick ? 'button' : undefined}\n tabIndex={onClick ? 0 : undefined}\n onClick={onClick}\n onKeyDown={onClick ? (e) => (e.key === 'Enter' || e.key === ' ') && onClick() : undefined}\n >\n <div className=\"snacky-order-item__top\">\n <div className=\"snacky-order-item__thumb-box\">\n <img className=\"snacky-order-item__thumb\" src={productImage} alt=\"\" />\n </div>\n <div className=\"snacky-order-item__info\">\n <span\n className={cx('snacky-order-item__status', status === 'cancelled' && 'snacky-order-item__status--cancelled')}\n >\n {STATUS_LABEL[status]}\n </span>\n <span className=\"snacky-order-item__name\">{productName}</span>\n </div>\n </div>\n\n <div className=\"snacky-order-item__details\">\n <span className=\"snacky-order-item__count\">{itemsSummary}</span>\n <span className={cx('snacky-order-item__total', isCod && 'snacky-order-item__total--cod')}>\n Order Total: <b>{total}</b>\n </span>\n {isCod && <span className=\"snacky-order-item__cod\">COD</span>}\n </div>\n\n {status === 'waiting' && paymentDeadline && (\n <div className=\"snacky-order-item__deadline\">Pay before {paymentDeadline}</div>\n )}\n\n {action && (\n <div className=\"snacky-order-item__action-row\">\n <Button\n variant=\"primary\"\n onClick={(e) => {\n e.stopPropagation();\n onAction?.();\n }}\n >\n {action}\n </Button>\n </div>\n )}\n </div>\n );\n}\n\nexport interface NotificationListItemProps {\n title: string;\n message: string;\n unread?: boolean;\n onClick?: () => void;\n className?: string;\n}\n\n/** Snacky Notification List Item - accent-tinted background for unread items. */\nexport function NotificationListItem({ title, message, unread = false, onClick, className }: NotificationListItemProps) {\n return (\n <div\n className={cx('snacky-notif-item', unread && 'snacky-notif-item--unread', className)}\n role={onClick ? 'button' : undefined}\n tabIndex={onClick ? 0 : undefined}\n onClick={onClick}\n onKeyDown={onClick ? (e) => (e.key === 'Enter' || e.key === ' ') && onClick() : undefined}\n >\n <span className=\"snacky-notif-item__title\">{title}</span>\n <span className=\"snacky-notif-item__message\">{message}</span>\n </div>\n );\n}\n","import { useId, useState, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './Accordion.css';\n\nexport interface AccordionProps {\n title: string;\n /** When passed, uses the compact 12px title (icon-slot variant) - e.g. a payment-method logo. */\n leadingIcon?: ReactNode;\n children: ReactNode;\n defaultOpen?: boolean;\n className?: string;\n}\n\n/**\n * Snacky Accordion - header and (when open) panel render as two separate\n * elevated cards with a small gap between them, not one continuous card;\n * title size responds to whether `leadingIcon` is passed (matches the\n * Figma source, which models icon presence as a real variant rather than\n * optional content). Neither state ever has a border, only elevation.\n */\nexport function Accordion({ title, leadingIcon, children, defaultOpen = false, className }: AccordionProps) {\n const [open, setOpen] = useState(defaultOpen);\n const panelId = useId();\n\n return (\n <div className={cx('snacky-accordion', !!leadingIcon && 'snacky-accordion--icon', className)}>\n <button\n type=\"button\"\n className=\"snacky-accordion__header\"\n aria-expanded={open}\n aria-controls={panelId}\n onClick={() => setOpen((v) => !v)}\n >\n {leadingIcon && <span className=\"snacky-accordion__icon\">{leadingIcon}</span>}\n <span className=\"snacky-accordion__title\">{title}</span>\n <svg\n className={cx('snacky-accordion__chevron', open && 'snacky-accordion__chevron--open')}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n >\n <path d=\"M5 7.5L10 12.5L15 7.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n {open && (\n <div id={panelId} className=\"snacky-accordion__panel\">\n {children}\n </div>\n )}\n </div>\n );\n}\n","import { useEffect, type ReactNode } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './BottomSheet.css';\n\nexport interface BottomSheetProps {\n open: boolean;\n onDismiss: () => void;\n children: ReactNode;\n /** Show the drag-handle bar. Confirmed against Figma: none of the 9\n * documented Modal variants show one, so this defaults to false - opt\n * in only if a future variant actually needs it. */\n showHandle?: boolean;\n className?: string;\n}\n\n/**\n * Snacky Bottom Sheet - the shared modal shell every documented Modal\n * \"variant\" (Welcome, Success, Confirmation, Calendar, Variants Selector,\n * Payment Methods, Buyer Reviews, Driver Tracking) composes from, matching\n * `SnackyBottomSheet(onDismiss = {...}) { ...content... }` in the code samples.\n * 20px radius on top corners only, dim overlay backdrop, dismiss on\n * backdrop click or Escape.\n */\nexport function BottomSheet({ open, onDismiss, children, showHandle = false, className }: BottomSheetProps) {\n useEffect(() => {\n if (!open) return;\n function onKeyDown(e: KeyboardEvent) {\n if (e.key === 'Escape') onDismiss();\n }\n window.addEventListener('keydown', onKeyDown);\n return () => window.removeEventListener('keydown', onKeyDown);\n }, [open, onDismiss]);\n\n if (!open) return null;\n\n return (\n <div className=\"snacky-sheet-overlay\" onClick={onDismiss}>\n <div\n className={cx('snacky-sheet', className)}\n role=\"dialog\"\n aria-modal=\"true\"\n onClick={(e) => e.stopPropagation()}\n >\n {showHandle && <div className=\"snacky-sheet__handle\" />}\n {children}\n </div>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport './Section.css';\n\nexport interface SectionProps {\n title: string;\n /** Small circular chevron button in the header, shown when provided (e.g. \"see more\"). */\n onAction?: () => void;\n children: ReactNode;\n className?: string;\n}\n\n/**\n * Snacky Section - the shared content-block shell every documented Section\n * \"variant\" (Variant Selector, Product Description, Buyer Reviews, product\n * rows, Order Summary, etc.) composes from, matching\n * `SnackySection(title = \"...\", onAction = {...}) { ...content... }`.\n */\nexport function Section({ title, onAction, children, className }: SectionProps) {\n return (\n <section className={cx('snacky-section', className)}>\n <div className=\"snacky-section__header\">\n <h3 className=\"snacky-section__title\">{title}</h3>\n {onAction && (\n <button type=\"button\" className=\"snacky-section__action\" onClick={onAction} aria-label={`See more: ${title}`}>\n <svg viewBox=\"0 0 16 16\" fill=\"none\" width=\"16\" height=\"16\">\n <path d=\"M6 3.5L10.5 8L6 12.5\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n </button>\n )}\n </div>\n {children}\n </section>\n );\n}\n","import { cx } from '../../utils/cx.js';\nimport './Avatar.css';\n\nexport type AvatarSize = 'sm' | 'md' | 'lg';\n\nexport interface AvatarProps {\n src: string;\n alt: string;\n size?: AvatarSize;\n className?: string;\n}\n\n/** Snacky Avatar - circular profile photo in three fixed sizes (32 / 56 / 72px). */\nexport function Avatar({ src, alt, size = 'md', className }: AvatarProps) {\n return <img src={src} alt={alt} className={cx('snacky-avatar', `snacky-avatar--${size}`, className)} />;\n}\n","import { cx } from '../../utils/cx.js';\nimport './Illustration.css';\n\nexport type IllustrationVariant = 'empty' | 'createAccount' | 'welcome' | 'success' | 'discountReferral';\n\nconst SIZE: Record<IllustrationVariant, { width: number; height: number }> = {\n empty: { width: 268, height: 200 },\n createAccount: { width: 360, height: 240 },\n welcome: { width: 200, height: 200 },\n success: { width: 200, height: 200 },\n discountReferral: { width: 268, height: 200 },\n};\n\nexport interface IllustrationProps {\n variant: IllustrationVariant;\n /** Host your own export of this illustration (this package ships no artwork). */\n src: string;\n alt: string;\n className?: string;\n}\n\n/** Snacky Illustration - decorative spot illustration for empty states, onboarding, confirmations. */\nexport function Illustration({ variant, src, alt, className }: IllustrationProps) {\n const { width, height } = SIZE[variant];\n return <img src={src} alt={alt} width={width} height={height} className={cx('snacky-illustration', className)} />;\n}\n","import { cx } from '../../utils/cx.js';\nimport './ProductImage.css';\n\nexport type ProductImageUsage = 'product-card' | 'product-details' | 'list' | 'review' | 'variant' | 'accordion-modal';\n\nexport interface ProductImageProps {\n src: string;\n alt: string;\n usage: ProductImageUsage;\n /** Overlays a centered \"Sold Out\" badge - product-card and product-details only. */\n sold?: boolean;\n className?: string;\n}\n\n/**\n * Snacky Product Image - adapts its frame size/border to where it appears:\n * product-card (128) and product-details (200) are bare transparent images;\n * list (56/48 inner) and review (48/40 inner, bordered) wrap in a padded\n * frame; variant (88) is a bordered selection frame; accordion-modal (24)\n * renders a payment-method logo instead of a product photo.\n */\nexport function ProductImage({ src, alt, usage, sold = false, className }: ProductImageProps) {\n return (\n <span className={cx('snacky-product-image-wrap', `snacky-product-image-wrap--${usage}`, className)}>\n <img src={src} alt={alt} className={cx('snacky-product-image', `snacky-product-image--${usage}`)} />\n {sold && (\n <span className=\"snacky-product-image-sold-overlay\">\n <span className=\"snacky-product-image-sold-label\">Sold Out</span>\n </span>\n )}\n </span>\n );\n}\n","import type { ReactNode } from 'react';\nimport { cx } from '../../utils/cx.js';\nimport { DiscountTag } from '../Badge/Badge.js';\nimport { SoldOutBadge } from '../Badge/Badge.js';\nimport { IconButton } from '../IconButton/IconButton.js';\nimport './ProductCard.css';\n\ninterface BaseProductCardProps {\n productName: string;\n imageUrl: string;\n price: string;\n rating: number;\n onClick?: () => void;\n className?: string;\n}\n\nexport interface ProductCardListProps extends BaseProductCardProps {\n variant?: 'list';\n originalPrice?: string;\n discountLabel?: string;\n onAddToCart: () => void;\n cartIcon?: ReactNode;\n ratingIcon?: ReactNode;\n}\n\nexport interface ProductCardDetailsProps extends BaseProductCardProps {\n variant: 'details';\n originalPrice?: string;\n discountLabel?: string;\n ratingCount: number;\n favorited: boolean;\n onFavoriteClick: () => void;\n onShareClick: () => void;\n onChatClick: () => void;\n sold?: boolean;\n ratingIcon?: ReactNode;\n favoriteIcon?: ReactNode;\n shareIcon?: ReactNode;\n chatIcon?: ReactNode;\n}\n\nexport type ProductCardProps = ProductCardListProps | ProductCardDetailsProps;\n\n/**\n * Snacky Product Card - `list` (default) for horizontal carousels/2-column\n * grids, `details` for the product detail page with rating count and\n * Favorite/Share/Chat actions.\n */\nexport function ProductCard(props: ProductCardProps) {\n if (props.variant === 'details') {\n const { productName, imageUrl, price, rating, originalPrice, discountLabel, ratingCount, favorited, onFavoriteClick, onShareClick, onChatClick, sold, ratingIcon, favoriteIcon, shareIcon, chatIcon, onClick, className } = props;\n return (\n <div className={cx('snacky-product-card', 'snacky-product-card--details', className)}>\n <div className=\"snacky-product-card__image-wrap\" onClick={onClick}>\n <img className=\"snacky-product-card__image\" src={imageUrl} alt={productName} />\n {sold && (\n <span className=\"snacky-product-card__discount\">\n <SoldOutBadge />\n </span>\n )}\n </div>\n <p className=\"snacky-product-card__name\">{productName}</p>\n <div className=\"snacky-product-card__price-row\">\n <span className=\"snacky-product-card__price\">{price}</span>\n {originalPrice && <span className=\"snacky-product-card__original-price\">{originalPrice}</span>}\n {discountLabel && <DiscountTag label={discountLabel} />}\n </div>\n <div className=\"snacky-product-card__footer-row\">\n <span className=\"snacky-product-card__rating\">\n {ratingIcon && <span className=\"snacky-product-card__rating-icon\">{ratingIcon}</span>}\n {rating} ({ratingCount})\n </span>\n <div className=\"snacky-product-card__actions snacky-product-card__actions--details\">\n <IconButton variant=\"secondary\" icon={favoriteIcon ?? '♥'} selected={favorited} onClick={onFavoriteClick} ariaLabel=\"Favorite\" />\n <IconButton variant=\"secondary\" icon={shareIcon ?? '⤴'} onClick={onShareClick} ariaLabel=\"Share\" />\n <IconButton variant=\"secondary\" icon={chatIcon ?? '💬'} onClick={onChatClick} ariaLabel=\"Chat with seller\" />\n </div>\n </div>\n </div>\n );\n }\n\n const { productName, imageUrl, price, rating, originalPrice, discountLabel, onAddToCart, cartIcon, ratingIcon, onClick, className } = props;\n return (\n <div\n className={cx('snacky-product-card', 'snacky-product-card--list', className)}\n role=\"button\"\n tabIndex={0}\n onClick={onClick}\n onKeyDown={(e) => (e.key === 'Enter' || e.key === ' ') && onClick?.()}\n >\n <div className=\"snacky-product-card__image-wrap\">\n <img className=\"snacky-product-card__image\" src={imageUrl} alt={productName} />\n {discountLabel && (\n <span className=\"snacky-product-card__discount\">\n <DiscountTag label={discountLabel} />\n </span>\n )}\n </div>\n <p className=\"snacky-product-card__name\">{productName}</p>\n <div className=\"snacky-product-card__price-row\">\n <span className=\"snacky-product-card__price\">{price}</span>\n {originalPrice && <span className=\"snacky-product-card__original-price\">{originalPrice}</span>}\n </div>\n <div className=\"snacky-product-card__footer-row\">\n <span className=\"snacky-product-card__rating\">\n {ratingIcon && <span className=\"snacky-product-card__rating-icon\">{ratingIcon}</span>}\n {rating}\n </span>\n <IconButton\n variant=\"primary\"\n icon={cartIcon ?? '+'}\n onClick={(e) => {\n e.stopPropagation();\n onAddToCart();\n }}\n ariaLabel=\"Add to cart\"\n />\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["Button","import_react","import_jsx_runtime","IconButton","import_react","import_jsx_runtime","UploadButton","import_react","import_jsx_runtime","TextField","import_react","import_jsx_runtime","SearchField","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","cart","category","heart","home","import_jsx_runtime","base","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","productName","imageUrl","price","rating","originalPrice","discountLabel","ratingIcon","onClick","className"]}
package/dist/index.css CHANGED
@@ -1420,7 +1420,7 @@
1420
1420
  border: none;
1421
1421
  border-radius: var(--radius-full);
1422
1422
  background: var(--bg-action-primary);
1423
- color: var(--text-on-action-primary);
1423
+ color: var(--icon-on-accent);
1424
1424
  cursor: pointer;
1425
1425
  }
1426
1426
  .snacky-section__action:hover {