@srimandir/astrology-common 7.2.2 → 7.2.4
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.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/components/UserReviewsSection/UserReviewsSection.tsx","../src/components/FAQAccordion/FAQAccordion.tsx","../src/components/PageHeader/PageHeader.tsx","../src/components/FormContainer/FormContainer.tsx","../src/components/FormSectionHeader/FormSectionHeader.tsx","../src/components/PrivacyBanner/PrivacyBanner.tsx","../src/components/FormField/FormField.tsx","../src/components/FormTextInput/FormTextInput.tsx","../src/components/FormDateInput/FormDateInput.tsx","../src/components/FormTimeInput/FormTimeInput.tsx","../src/components/FormLocationInput/FormLocationInput.tsx","../src/components/FormSegmentedControl/FormSegmentedControl.tsx","../src/components/FormTagPills/FormTagPills.tsx","../src/components/FormCheckboxWithHelp/FormCheckboxWithHelp.tsx","../src/components/FormFooterNote/FormFooterNote.tsx","../src/components/FooterShell/FooterShell.tsx","../src/components/FooterShell/FooterCTAButton.tsx","../src/components/CircularMarquee/CircularMarquee.tsx","../src/components/MarqueeStrip/MarqueeStrip.tsx","../src/components/ContactUsSection/ContactUsSection.tsx","../src/components/ConsultationSlotSelector/slotUtils.ts","../src/components/ConsultationSlotSelector/SlotIcons.tsx","../src/components/ConsultationSlotSelector/PhoneNumberSection.tsx","../src/components/ConsultationSlotSelector/AstrologyProfilesSection.tsx","../src/components/ConsultationSlotSelector/ConsultationSlotSelector.tsx","../src/components/ConsultationSlotSelector/mockSlots.ts","../src/components/PhoneNumberInput/icons.tsx","../src/components/PhoneNumberInput/countries.ts","../src/utils/phoneValidation.ts","../src/components/PhoneNumberInput/usePhoneNumberInput.ts","../src/components/PhoneNumberInput/PhoneNumberInput.tsx","../src/components/Consultations/icons.tsx","../src/components/Consultations/AstrologerPhoto.tsx","../src/components/Consultations/RecommendedBadge.tsx","../src/components/Consultations/AstrologerCard.tsx","../src/components/Consultations/AstrologerList.tsx","../src/components/Consultations/mockAstrologers.ts"],"sourcesContent":["import { useState, useMemo } from 'react';\nimport styles from './UserReviewsSection.module.scss';\n\nconst DEFAULT_INITIAL_VISIBLE = 3;\nconst MAX_TESTIMONIALS = 15;\n\nexport interface Testimonial {\n quote: string;\n authorName: string;\n authorAvatarUrl?: string;\n rating?: number;\n}\n\nfunction buildTestimonialsFromTranslations(\n t: (key: string) => string\n): Testimonial[] {\n const itemsByIndex = new Map<number, Testimonial>();\n\n for (let i = 1; i <= MAX_TESTIMONIALS; i += 1) {\n const quoteKey = `feedbackTestimonial${i}`;\n const quote = t(quoteKey);\n if (!quote || quote === quoteKey) continue;\n\n const authorKey = `feedbackAuthor${i}`;\n const authorName = (() => {\n const v = t(authorKey);\n return v && v !== authorKey ? v : t('guest');\n })();\n\n const avatarKey = `feedbackAuthor${i}AvatarUrl`;\n const avatar = (() => {\n const v = t(avatarKey);\n return v && v !== avatarKey ? v : undefined;\n })();\n\n itemsByIndex.set(i, {\n quote,\n authorName,\n authorAvatarUrl: avatar,\n rating: 5,\n });\n }\n\n const maleIndices: number[] = [];\n const femaleIndices: number[] = [];\n for (let i = 1; i <= MAX_TESTIMONIALS; i += 1) {\n if (i >= 9) femaleIndices.push(i);\n else maleIndices.push(i);\n }\n\n const mixed: Testimonial[] = [];\n let m = 0;\n let f = 0;\n while (m < maleIndices.length || f < femaleIndices.length) {\n if (f < femaleIndices.length) {\n const idx = femaleIndices[f++];\n const item = itemsByIndex.get(idx);\n if (item) mixed.push(item);\n }\n if (m < maleIndices.length) {\n const idx = maleIndices[m++];\n const item = itemsByIndex.get(idx);\n if (item) mixed.push(item);\n }\n }\n\n return mixed;\n}\n\nexport interface UserReviewsSectionProps {\n /** Translation function; uses keys: feedbackTitle, feedbackRating, feedbackTrust, readMoreReviews, readLess, feedbackTestimonial1-15, feedbackAuthor1-15, guest */\n t: (key: string) => string;\n /** Override testimonials; if not set, built from t() */\n testimonials?: Testimonial[];\n /** Initial number of reviews to show before \"Read more\" */\n initialVisible?: number;\n /** If set, \"Read more\" renders as external link */\n readMoreHref?: string;\n onReadMore?: () => void;\n className?: string;\n /** Optional class name for the section heading (e.g. to use bold in one app and semibold in another) */\n headingClassName?: string;\n}\n\nexport function UserReviewsSection({\n t,\n testimonials: testimonialsProp,\n initialVisible = DEFAULT_INITIAL_VISIBLE,\n readMoreHref,\n onReadMore,\n className = '',\n headingClassName,\n}: UserReviewsSectionProps) {\n const testimonials =\n testimonialsProp ??\n useMemo(() => buildTestimonialsFromTranslations(t), [t]);\n\n const [expanded, setExpanded] = useState(false);\n const hasMore = testimonials.length > initialVisible;\n const visibleTestimonials =\n hasMore && !expanded ? testimonials.slice(0, initialVisible) : testimonials;\n\n const title = t('feedbackTitle');\n const ratingLabel = t('feedbackRating');\n const trustText = t('feedbackTrust');\n const readMoreLabel = t('readMoreReviews');\n const readLessLabel = t('readLess');\n\n return (\n <section\n className={`${styles.section} ${className}`}\n aria-labelledby=\"reviews-heading\"\n > \n <h2\n id=\"reviews-heading\"\n className={[styles.heading, headingClassName].filter(Boolean).join(' ')}\n >\n {title}\n </h2>\n <p className={styles.trustLine}>\n <span className={styles.star} aria-hidden>\n ★\n </span>\n <span className={styles.ratingNum}>{ratingLabel}</span>\n <span className={styles.dot} aria-hidden />\n <span className={styles.trustText}>{trustText}</span>\n </p>\n <ul className={styles.cardList}>\n {visibleTestimonials.map((item, index) => (\n <li key={index} className={styles.card}>\n <p className={styles.quote}>{item.quote}</p>\n <div className={styles.author}>\n {item.authorAvatarUrl ? (\n <img\n src={item.authorAvatarUrl}\n alt=\"\"\n className={styles.avatar}\n width={40}\n height={40}\n />\n ) : (\n <div className={styles.avatarPlaceholder} aria-hidden />\n )}\n <div className={styles.authorInfo}>\n <span className={styles.authorName}>{item.authorName}</span>\n <span className={styles.stars} aria-hidden>\n {'★'.repeat(item.rating ?? 5)}\n </span>\n </div>\n </div>\n </li>\n ))}\n </ul>\n {hasMore && (\n <div className={styles.readMoreWrap}>\n <button\n type=\"button\"\n className={styles.toggleBtn}\n onClick={() => setExpanded((e) => !e)}\n aria-expanded={expanded}\n >\n {expanded ? readLessLabel : readMoreLabel}\n <span className={styles.arrow} aria-hidden>\n ›\n </span>\n </button>\n </div>\n )}\n {(readMoreHref || onReadMore) && !hasMore && (\n <div className={styles.readMoreWrap}>\n {readMoreHref ? (\n <a\n href={readMoreHref}\n className={styles.readMore}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {readMoreLabel}\n <span className={styles.arrow} aria-hidden>\n ›\n </span>\n </a>\n ) : (\n <button\n type=\"button\"\n className={styles.readMore}\n onClick={() => onReadMore?.()}\n >\n {readMoreLabel}\n <span className={styles.arrow} aria-hidden>\n ›\n </span>\n </button>\n )}\n </div>\n )}\n </section>\n );\n}\n","import { useState, useMemo } from 'react';\nimport styles from './FAQAccordion.module.scss';\n\nexport interface FAQItemKey {\n qKey: string;\n aKey: string;\n}\n\nexport interface FAQAccordionProps {\n /** Translation function; uses keys: faqTitle, and item qKey/aKey (or resolved answer key) */\n t: (key: string) => string;\n /** List of Q&A item keys (translation keys for question and answer) */\n items: FAQItemKey[];\n /** Optional: map answer key to another key (e.g. faqA1 -> faqA1Global) */\n resolveAnswerKey?: (aKey: string) => string;\n /** Index of the item to open by default (-1 = none) */\n defaultOpenIndex?: number;\n /** Called when an item is expanded; receives the question text */\n onItemOpen?: (questionText: string) => void;\n className?: string;\n /** Optional class name for the section heading (e.g. to use bold in one app and semibold in another) */\n headingClassName?: string;\n}\n\nexport function FAQAccordion({\n t,\n items,\n resolveAnswerKey,\n defaultOpenIndex = 0,\n onItemOpen,\n className = '',\n headingClassName,\n}: FAQAccordionProps) {\n const resolvedItems = useMemo(\n () =>\n items.map(({ qKey, aKey }) => ({\n question: t(qKey),\n answer: t(resolveAnswerKey ? resolveAnswerKey(aKey) : aKey),\n })),\n [t, items, resolveAnswerKey]\n );\n\n const [openIndex, setOpenIndex] = useState<number>(defaultOpenIndex);\n const title = t('faqTitle');\n\n return (\n <section\n className={`${styles.section} ${className}`}\n aria-labelledby=\"faq-heading\"\n >\n <h2\n id=\"faq-heading\"\n className={[styles.heading, headingClassName].filter(Boolean).join(' ')}\n >\n {title}\n </h2>\n <div className={styles.accordion} role=\"list\">\n {resolvedItems.map((item, index) => {\n const isOpen = openIndex === index;\n return (\n <div\n key={index}\n className={`${styles.item} ${isOpen ? styles.itemOpen : ''}`}\n role=\"listitem\"\n >\n <button\n type=\"button\"\n className={styles.question}\n onClick={() => {\n const nextOpen = !isOpen;\n setOpenIndex(isOpen ? -1 : index);\n if (nextOpen) onItemOpen?.(item.question);\n }}\n aria-expanded={isOpen}\n aria-controls={`faq-answer-${index}`}\n id={`faq-question-${index}`}\n >\n <span>{item.question}</span>\n <span\n className={`${styles.chevron} ${isOpen ? styles.chevronOpen : ''}`}\n aria-hidden\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n aria-hidden\n focusable=\"false\"\n >\n <path\n d=\"M5.8 8.3a1 1 0 0 1 1.4 0L10 11.09l2.8-2.8a1 1 0 1 1 1.4 1.42l-3.5 3.5a1 1 0 0 1-1.4 0l-3.5-3.5A1 1 0 0 1 5.8 8.3z\"\n fill=\"currentColor\"\n />\n </svg>\n </span>\n </button>\n <div\n id={`faq-answer-${index}`}\n role=\"region\"\n aria-labelledby={`faq-question-${index}`}\n className={`${styles.answerWrap} ${isOpen ? styles.answerOpen : ''}`}\n hidden={!isOpen}\n >\n <p className={styles.answer}>{item.answer}</p>\n </div>\n </div>\n );\n })}\n </div>\n </section>\n );\n}\n","import type { ReactNode } from 'react';\nimport styles from './PageHeader.module.scss';\n\n/** Minimal image component props for optional optimized logo (e.g. next/image). */\nexport interface PageHeaderImageProps {\n src: string;\n alt: string;\n width?: number;\n height?: number;\n className?: string;\n}\n\nexport interface PageHeaderProps {\n /** Translation function; uses keys: sriMandir, ratingText */\n t: (key: string) => string;\n /** Logo image URL; if not set, a placeholder is shown */\n logoUrl?: string;\n /** Optional image component for logo (e.g. next/image adapter) */\n imageComponent?: React.ComponentType<PageHeaderImageProps>;\n /** Optional slot for language selector or other header actions */\n languageSelector?: ReactNode;\n /** Whether to show the languageSelector slot */\n showLanguageSelector?: boolean;\n className?: string;\n}\n\nconst DEFAULT_LOGO_WIDTH = 120;\nconst DEFAULT_LOGO_HEIGHT = 40;\n\nexport function PageHeader({\n t,\n logoUrl,\n imageComponent: ImageComponent,\n languageSelector,\n showLanguageSelector = true,\n className = '',\n}: PageHeaderProps) {\n const showSlot = showLanguageSelector && languageSelector != null;\n const brandName = t('sriMandir');\n const ratingText = t('ratingText');\n\n return (\n <header className={`${styles.header} ${className}`}>\n <div className={styles.brand}>\n <div className={styles.logo}>\n {logoUrl ? (\n ImageComponent ? (\n <ImageComponent\n src={logoUrl}\n alt={brandName}\n className={styles.logoImg}\n width={DEFAULT_LOGO_WIDTH}\n height={DEFAULT_LOGO_HEIGHT}\n />\n ) : (\n <img\n src={logoUrl}\n alt={brandName}\n className={styles.logoImg}\n width={DEFAULT_LOGO_WIDTH}\n height={DEFAULT_LOGO_HEIGHT}\n decoding=\"async\"\n />\n )\n ) : (\n <div className={styles.logoPlaceholder} aria-hidden />\n )}\n </div>\n <div className={styles.brandText}>\n <span className={styles.brandName}>{brandName}</span>\n {ratingText != null && ratingText !== '' && (\n <span className={styles.rating}>\n {ratingText}\n </span>\n )}\n </div>\n </div>\n {showSlot && <div className={styles.langSlot}>{languageSelector}</div>}\n </header>\n );\n}\n","import type { ReactNode } from 'react';\nimport styles from './FormContainer.module.scss';\n\nexport interface FormContainerProps {\n /** Form content (e.g. PrivacyBanner + FormSectionHeader + form fields) */\n children: ReactNode;\n className?: string;\n /** Accessibility label for the section */\n 'aria-label'?: string;\n}\n\nexport function FormContainer({\n children,\n className = '',\n 'aria-label': ariaLabel,\n}: FormContainerProps) {\n return (\n <section\n className={`${styles.wrap} ${className}`}\n aria-label={ariaLabel}\n >\n <div className={styles.card}>\n <div className={styles.cardInner}>{children}</div>\n </div>\n </section>\n );\n}\n","import type { ReactNode } from 'react';\nimport styles from './FormSectionHeader.module.scss';\n\nconst BackIcon = () => (\n <svg\n className={styles.backIcon}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden\n >\n <path\n d=\"M15 18l-6-6 6-6\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nexport interface FormSectionHeaderProps {\n /** Form title */\n title: string;\n /** Optional subtitle below title */\n subtitle?: string;\n /** Optional back button; when provided, back button is shown and this is the aria-label */\n onBack?: () => void;\n backAriaLabel?: string;\n className?: string;\n}\n\nexport function FormSectionHeader({\n title,\n subtitle,\n onBack,\n backAriaLabel = 'Back',\n className = '',\n}: FormSectionHeaderProps) {\n return (\n <header className={`${styles.header} ${className}`}>\n <div className={styles.left}>\n {onBack != null && (\n <button\n type=\"button\"\n className={styles.backBtn}\n onClick={onBack}\n aria-label={backAriaLabel}\n >\n <BackIcon />\n </button>\n )}\n <div className={styles.titleWrap}>\n <h1 className={styles.title}>{title}</h1>\n {subtitle != null && subtitle !== '' && (\n <p className={styles.subtitle}>{subtitle}</p>\n )}\n </div>\n </div>\n </header>\n );\n}\n","import styles from './PrivacyBanner.module.scss';\n\nconst DEFAULT_SHIELD_ICON =\n 'https://srm-cdn.a4b.io/yoda/1770707793537.svg';\n\nexport interface PrivacyBannerProps {\n /** Text to show (e.g. \"100% Private & Secure\") */\n text: string;\n /** Optional shield icon URL */\n iconUrl?: string;\n className?: string;\n}\n\nexport function PrivacyBanner({\n text,\n iconUrl = DEFAULT_SHIELD_ICON,\n className = '',\n}: PrivacyBannerProps) {\n return (\n <div className={`${styles.banner} ${className}`} role=\"status\">\n <span className={styles.text}> <img\n src={iconUrl}\n alt=\"\"\n className={styles.icon}\n width={18}\n height={18}\n aria-hidden\n /> {text}</span>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport { useState, useEffect } from 'react';\nimport styles from './FormField.module.scss';\n\nconst DEFAULT_INFO_ICON = 'https://srm-cdn.a4b.io/yoda/1770372066357.svg';\n\nexport interface FormFieldProps {\n /** Field label (e.g. \"Enter Your Name\") */\n label: string;\n /** HTML id for the control (for label association) */\n id: string;\n /** Whether to show required asterisk */\n required?: boolean;\n /** Optional help text below label, above input */\n help?: string;\n /** Optional info tooltip text; when set, shows (i) icon that toggles tooltip */\n infoTooltip?: string;\n infoAriaLabel?: string;\n /** Icon URL for info button (default: common info icon) */\n infoIconUrl?: string;\n /** Control content (input, etc.) */\n children: ReactNode;\n className?: string;\n}\n\nexport function FormField({\n label,\n id,\n required = false,\n help,\n infoTooltip,\n infoAriaLabel = 'Info',\n infoIconUrl = DEFAULT_INFO_ICON,\n children,\n className = '',\n}: FormFieldProps) {\n const [infoOpen, setInfoOpen] = useState(false);\n\n useEffect(() => {\n if (!infoTooltip) return;\n const onDoc = (e: MouseEvent) => {\n const t = e.target as HTMLElement | null;\n if (t?.closest?.('[data-info-tooltip]') != null) return;\n setInfoOpen(false);\n };\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setInfoOpen(false);\n };\n document.addEventListener('mousedown', onDoc);\n document.addEventListener('keydown', onKey);\n return () => {\n document.removeEventListener('mousedown', onDoc);\n document.removeEventListener('keydown', onKey);\n };\n }, [infoTooltip]);\n\n return (\n <div className={`${styles.field} ${className}`}>\n <div className={styles.labelRow}>\n <label className={styles.label} htmlFor={id}>\n {label}\n {required && <span className={styles.req}>*</span>}\n </label>\n {infoTooltip != null && infoTooltip !== '' && (\n <div className={styles.infoWrap} data-info-tooltip>\n <button\n type=\"button\"\n className={styles.infoBtn}\n aria-label={infoAriaLabel}\n aria-expanded={infoOpen}\n onClick={() => setInfoOpen((v) => !v)}\n >\n <img\n className={styles.infoImg}\n src={infoIconUrl}\n alt=\"\"\n aria-hidden\n />\n </button>\n {infoOpen && (\n <div className={styles.tooltip} role=\"tooltip\">\n {infoTooltip}\n <span className={styles.tooltipArrow} aria-hidden />\n </div>\n )}\n </div>\n )}\n </div>\n {help != null && help !== '' && (\n <div className={styles.help}>{help}</div>\n )}\n <div className={styles.inputWrap}>{children}</div>\n </div>\n );\n}\n","import type { InputHTMLAttributes } from 'react';\nimport styles from './FormTextInput.module.scss';\n\nexport interface FormTextInputProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, 'className'> {\n id: string;\n /** Optional icon URL on the right (e.g. location pin) */\n iconUrl?: string;\n iconAlt?: string;\n /** If true, icon is clickable (e.g. open picker) */\n iconInteractive?: boolean;\n onIconClick?: () => void;\n className?: string;\n}\n\nexport function FormTextInput({\n id,\n iconUrl,\n iconAlt = '',\n iconInteractive = false,\n onIconClick,\n className = '',\n ...rest\n}: FormTextInputProps) {\n return (\n <div className={`${styles.wrap} ${className}`}>\n <input\n {...rest}\n id={id}\n className={styles.input}\n type={rest.type ?? 'text'}\n />\n {iconUrl != null && (\n <button\n type=\"button\"\n className={\n iconInteractive\n ? `${styles.iconBtn} ${styles.iconBtnInteractive}`\n : styles.iconBtn\n }\n aria-label={iconAlt || undefined}\n onClick={iconInteractive ? onIconClick : undefined}\n tabIndex={iconInteractive ? 0 : -1}\n >\n <img\n className={styles.iconImg}\n src={iconUrl}\n alt=\"\"\n aria-hidden\n width={22}\n height={22}\n />\n </button>\n )}\n </div>\n );\n}\n","import type { InputHTMLAttributes } from 'react';\nimport { useRef, useMemo } from 'react';\nimport styles from './FormDateInput.module.scss';\n\nconst ICON_DATE = 'https://srm-cdn.a4b.io/yoda/1770372045894.svg';\n\nexport interface FormDateInputProps\n extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'type' | 'className' | 'value' | 'onChange'\n > {\n id: string;\n value: string;\n onChange: (value: string) => void;\n /** Optional: open native picker when icon clicked */\n onIconClick?: () => void;\n className?: string;\n}\n\nexport function FormDateInput({\n id,\n value,\n onChange,\n onIconClick,\n className = '',\n ...rest\n}: FormDateInputProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n const maxDate = useMemo(() => {\n const d = new Date();\n const pad = (n: number) => String(n).padStart(2, '0');\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;\n }, []);\n\n const handleIconClick = () => {\n if (onIconClick) {\n onIconClick();\n return;\n }\n const el = inputRef.current;\n if (\n el &&\n typeof (el as HTMLInputElement & { showPicker?: () => void })\n .showPicker === 'function'\n ) {\n (el as HTMLInputElement & { showPicker: () => void }).showPicker();\n } else {\n el?.focus();\n }\n };\n\n return (\n <div className={`${styles.wrap} ${className}`}>\n <input\n {...rest}\n ref={inputRef}\n id={id}\n type=\"date\"\n className={styles.input}\n value={value}\n max={maxDate}\n onChange={(e) => onChange(e.target.value)}\n />\n <button\n type=\"button\"\n className={`${styles.iconBtn}`}\n aria-label=\"Open date picker\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={(e) => {\n e.preventDefault();\n handleIconClick();\n }}\n >\n <img\n className={styles.iconImg}\n src={ICON_DATE}\n alt=\"\"\n aria-hidden\n width={22}\n height={22}\n />\n </button>\n </div>\n );\n}\n","import styles from './FormTimeInput.module.scss';\n\nconst ICON_TIME = 'https://srm-cdn.a4b.io/yoda/1770372014782.svg';\n\nexport interface FormTimeInputProps {\n id: string;\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n disabled?: boolean;\n onIconClick?: () => void;\n className?: string;\n}\n\nexport function FormTimeInput({\n id,\n value,\n onChange,\n placeholder = 'HH:MM AM',\n disabled = false,\n onIconClick,\n className = '',\n}: FormTimeInputProps) {\n return (\n <div className={`${styles.wrap} ${className}`}>\n <input\n id={id}\n type=\"time\"\n className={styles.input}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder}\n disabled={disabled}\n onClick={() => !disabled && onIconClick?.()}\n />\n <button\n type=\"button\"\n className={styles.iconBtn}\n aria-label=\"Open time picker\"\n disabled={disabled}\n onClick={(e) => {\n e.preventDefault();\n if (!disabled) onIconClick?.();\n }}\n >\n <img\n className={styles.iconImg}\n src={ICON_TIME}\n alt=\"\"\n aria-hidden\n width={22}\n height={22}\n />\n </button>\n </div>\n );\n}\n","import type { InputHTMLAttributes } from 'react';\nimport styles from './FormLocationInput.module.scss';\n\nconst ICON_LOCATION = 'https://srm-cdn.a4b.io/yoda/1770372031092.svg';\n\nexport interface FormLocationInputProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, 'className'> {\n id: string;\n iconUrl?: string;\n className?: string;\n}\n\nexport function FormLocationInput({\n id,\n iconUrl = ICON_LOCATION,\n className = '',\n ...rest\n}: FormLocationInputProps) {\n return (\n <div className={`${styles.wrap} ${className}`}>\n <input {...rest} id={id} className={styles.input} type=\"text\" />\n <div className={styles.iconBtn} aria-hidden>\n <img\n className={styles.iconImg}\n src={iconUrl}\n alt=\"\"\n width={22}\n height={22}\n />\n </div>\n </div>\n );\n}\n","import styles from './FormSegmentedControl.module.scss';\n\nexport interface SegmentedOption {\n value: string;\n label: string;\n}\n\nexport interface FormSegmentedControlProps {\n id: string;\n options: SegmentedOption[];\n value: string;\n onChange: (value: string) => void;\n className?: string;\n}\n\nexport function FormSegmentedControl({\n id,\n options,\n value,\n onChange,\n className = '',\n}: FormSegmentedControlProps) {\n return (\n <div\n className={`${styles.segmented} ${className}`}\n role=\"group\"\n aria-labelledby={`${id}-label`}\n >\n {options.map((opt) => (\n <button\n key={opt.value}\n type=\"button\"\n id={opt.value === value ? id : undefined}\n className={`${styles.segmentedOption} ${opt.value === value ? styles.active : ''}`}\n onClick={() => onChange(opt.value)}\n >\n {opt.label}\n </button>\n ))}\n </div>\n );\n}\n","import styles from './FormTagPills.module.scss';\n\nexport interface FormTagPillsProps {\n id: string;\n options: { key: string; label: string }[];\n selected: string[];\n onChange: (selected: string[]) => void;\n className?: string;\n}\n\nexport function FormTagPills({\n id,\n options,\n selected,\n onChange,\n className = '',\n}: FormTagPillsProps) {\n const toggle = (key: string) => {\n if (selected.includes(key)) {\n onChange(selected.filter((k) => k !== key));\n } else {\n onChange([...selected, key]);\n }\n };\n\n return (\n <div\n className={`${styles.pillsWrap} ${className}`}\n role=\"group\"\n aria-labelledby={`${id}-label`}\n >\n {options.map((opt) => (\n <button\n key={opt.key}\n type=\"button\"\n className={`${styles.pill} ${selected.includes(opt.key) ? styles.selected : ''}`}\n onClick={() => toggle(opt.key)}\n >\n {opt.label}\n </button>\n ))}\n </div>\n );\n}\n","import styles from './FormCheckboxWithHelp.module.scss';\n\nexport interface FormCheckboxWithHelpProps {\n id: string;\n checked: boolean;\n onChange: (checked: boolean) => void;\n primaryText: string;\n helpText?: string;\n className?: string;\n}\n\nexport function FormCheckboxWithHelp({\n id,\n checked,\n onChange,\n primaryText,\n helpText,\n className = '',\n}: FormCheckboxWithHelpProps) {\n return (\n <div className={`${styles.wrapper} ${className}`}>\n <div className={styles.checkboxRow}>\n <input\n id={id}\n type=\"checkbox\"\n className={styles.checkbox}\n checked={checked}\n onChange={(e) => onChange(e.target.checked)}\n />\n <label htmlFor={id} className={styles.checkboxText}>\n {primaryText}\n </label>\n </div>\n {helpText != null && helpText !== '' && (\n <p className={styles.checkboxHelp}>{helpText}</p>\n )}\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport styles from './FormFooterNote.module.scss';\n\nexport interface FormFooterNoteProps {\n children: ReactNode;\n className?: string;\n}\n\nexport function FormFooterNote({\n children,\n className = '',\n}: FormFooterNoteProps) {\n return <p className={`${styles.footerNote} ${className}`}>{children}</p>;\n}\n","import type { ReactNode } from 'react';\nimport styles from './FooterShell.module.scss';\n\nexport interface FooterShellProps {\n /** Optional circular marquee content (e.g. badges). When provided, marquee is shown. */\n marquee?: ReactNode;\n /** Main footer content (e.g. CTA button or static text) */\n children: ReactNode;\n className?: string;\n}\n\nexport function FooterShell({\n marquee,\n children,\n className = '',\n}: FooterShellProps) {\n return (\n <footer className={`${styles.footer} ${className}`} role=\"contentinfo\">\n <div className={styles.inner}>\n {marquee != null && (\n <div className={styles.badges} aria-hidden>\n {marquee}\n </div>\n )}\n <div className={styles.ctaWrap}>{children}</div>\n </div>\n </footer>\n );\n}\n","import type { ReactNode } from 'react';\nimport styles from './FooterShell.module.scss';\n\nexport interface FooterCTAButtonProps {\n /** Button/link content */\n children: ReactNode;\n /** When set, renders an anchor instead of a button */\n href?: string;\n /** Disabled state; for anchor uses aria-disabled and preventDefault on click */\n disabled?: boolean;\n /** Click handler (used when href is not set) */\n onClick?: (e: React.MouseEvent<HTMLElement>) => void;\n /** When true, render as static div (no button/link) - for \"display only\" CTA like \"Check My Dosha for FREE\" */\n static?: boolean;\n className?: string;\n 'aria-label'?: string;\n}\n\nexport function FooterCTAButton({\n children,\n href,\n disabled = false,\n onClick,\n static: staticOnly = false,\n className = '',\n 'aria-label': ariaLabel,\n}: FooterCTAButtonProps) {\n const buttonClass = `${styles.ctaButton} ${className}`.trim();\n const staticClass = `${styles.ctaStatic} ${className}`.trim();\n const ariaProps = ariaLabel != null ? { 'aria-label': ariaLabel } : {};\n\n if (staticOnly) {\n return (\n <div className={staticClass} role=\"presentation\">\n {children}\n </div>\n );\n }\n\n if (href != null) {\n return (\n <a\n href={href}\n className={buttonClass}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-disabled={disabled}\n onClick={(e) => disabled && e.preventDefault()}\n {...ariaProps}\n >\n {children}\n </a>\n );\n }\n\n return (\n <button\n type=\"button\"\n className={buttonClass}\n disabled={disabled}\n onClick={onClick}\n {...ariaProps}\n >\n {children}\n </button>\n );\n}\n","import type { ReactNode } from 'react';\nimport styles from './CircularMarquee.module.scss';\n\nexport interface CircularMarqueeProps {\n /** Content to scroll (will be duplicated for seamless loop). Use same structure in both places (e.g. a single row of badges). */\n children: ReactNode;\n /** Optional class name for the wrapper */\n className?: string;\n}\n\n/**\n * Horizontal infinite marquee. Duplicates children so the loop is seamless.\n * Use for trust badges, labels, etc. under header or in footer.\n */\nexport function CircularMarquee({ children, className = '' }: CircularMarqueeProps) {\n return (\n <div className={`${styles.wrapper} ${className}`} aria-hidden>\n <div className={styles.track}>\n {children}\n {children}\n </div>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport { CircularMarquee } from '../CircularMarquee/CircularMarquee';\nimport styles from './MarqueeStrip.module.scss';\n\nexport interface MarqueeStripProps {\n /** Content to scroll in the marquee (e.g. a row of badges). Pass a single row; it will be duplicated for the loop. */\n children: ReactNode;\n className?: string;\n}\n\n/**\n * Horizontal bar (e.g. under the header) with the same circular marquee as the footer.\n * Renders a strip with background and border, and CircularMarquee inside.\n */\nexport function MarqueeStrip({ children, className = '' }: MarqueeStripProps) {\n return (\n <div className={`${styles.strip} ${className}`} role=\"region\" aria-label=\"Trust badges\">\n <CircularMarquee>{children}</CircularMarquee>\n </div>\n );\n}\n","import styles from './ContactUsSection.module.scss';\n\nexport interface ContactUsSectionProps {\n /** Section heading (e.g. \"Contact Us\") */\n title: string;\n /** Brand or company name line */\n brandName: string;\n /** WhatsApp contact line (e.g. \"Whatsapp: 8296947757\") */\n whatsAppLine: string;\n /** Email contact line (e.g. \"Email: support@example.com\") */\n emailLine: string;\n className?: string;\n}\n\n/**\n * Generic \"Contact Us\" section: title + brand name + WhatsApp + email.\n * Pass pre-resolved strings so each app can use its own t() and config.\n */\nexport function ContactUsSection({\n title,\n brandName,\n whatsAppLine,\n emailLine,\n className = '',\n}: ContactUsSectionProps) {\n return (\n <section className={`${styles.section} ${className}`} aria-labelledby=\"contact-heading\">\n <h2 id=\"contact-heading\" className={styles.heading}>\n {title}\n </h2>\n <div className={styles.content}>\n <p className={styles.brandName}>{brandName}</p>\n <p className={styles.line}>{whatsAppLine}</p>\n <p className={styles.line}>{emailLine}</p>\n </div>\n </section>\n );\n}\n","import type {\n ConsultationLanguageOption,\n ConsultationSlotDateLabel,\n ConsultationSlotPeriod,\n} from './types';\n\n/**\n * Formats an ISO datetime (e.g. \"2026-08-03T09:00:00+05:30\") into a short\n * label like \"9:00 AM\". Reads the hour/minute directly off the string\n * instead of going through `Date`, so the slot shows the exact wall-clock\n * time the backend sent rather than being reinterpreted in the browser's\n * local timezone.\n */\nexport const formatSlotTime = (isoDateTime: string): string => {\n const match = isoDateTime.match(/T(\\d{2}):(\\d{2})/);\n if (!match) return isoDateTime;\n const hour24 = Number(match[1]);\n const minute = match[2];\n const period = hour24 >= 12 ? 'PM' : 'AM';\n const hour12 = hour24 % 12 || 12;\n return `${hour12}:${minute} ${period}`;\n};\n\n/** Builds a short day-tab label (\"Today\" / \"Tomorrow\" / weekday) + day number for a \"yyyy-MM-dd\" date string. */\nexport const formatSlotDayLabel = (\n isoDate: string,\n referenceDate: Date = new Date()\n): ConsultationSlotDateLabel => {\n const dayNames = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n const date = new Date(`${isoDate}T00:00:00`);\n if (Number.isNaN(date.getTime())) {\n return { id: isoDate, dayLabel: isoDate, dayNum: '' };\n }\n\n const startOfDay = (d: Date) =>\n new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();\n const diffDays = Math.round(\n (startOfDay(date) - startOfDay(referenceDate)) / (1000 * 60 * 60 * 24)\n );\n\n const dayLabel =\n diffDays === 0 ? 'Today' : diffDays === 1 ? 'Tomorrow' : dayNames[date.getDay()];\n\n return { id: isoDate, dayLabel, dayNum: String(date.getDate()) };\n};\n\nexport const CONSULTATION_PERIOD_ORDER: ConsultationSlotPeriod[] = [\n 'morning',\n 'afternoon',\n 'evening',\n];\n\n/**\n * Default consultation-language dropdown options. Host apps can pass their\n * own list through the `languageOptions` prop — `labelKey` resolves via the\n * `t` prop and falls back to `label`.\n */\nexport const CONSULTATION_LANGUAGE_OPTIONS: ConsultationLanguageOption[] = [\n { code: 'en', labelKey: 'formReportLanguageEnglish', label: 'English' },\n { code: 'hi', labelKey: 'formReportLanguageHindi', label: 'Hindi' },\n { code: 'te', labelKey: 'formReportLanguageTelugu', label: 'Telugu' },\n { code: 'kn', labelKey: 'formReportLanguageKannada', label: 'Kannada' },\n { code: 'gu', labelKey: 'formReportLanguageGujarati', label: 'Gujarati' },\n { code: 'mr', labelKey: 'formReportLanguageMarathi', label: 'Marathi' },\n { code: 'ta', labelKey: 'formReportLanguageTamil', label: 'Tamil' },\n];\n","import React from 'react';\n\n/** Tick shown next to the selected consultation language */\nexport const CheckIcon: React.FC = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden>\n <path\n d=\"M3.5 8.5l2.5 2.5 6-6\"\n stroke=\"#22c55e\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n/** Down chevron, used by the consultation-language dropdown trigger */\nexport const ChevronDownIcon: React.FC = () => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n >\n <path d=\"M6 9l6 6 6-6\" />\n </svg>\n);\n\n/** Sun icon for \"Morning\" period tab */\nexport const MorningIcon: React.FC = () => (\n <img\n src=\"https://srm-cdn.a4b.io/yoda/1785316603029.svg\"\n width={16}\n height={16}\n alt=\"\"\n aria-hidden\n />\n);\n\n/** Sun-cloud icon for \"Afternoon\" period tab */\nexport const AfternoonIcon: React.FC = () => (\n <img\n src=\"https://srm-cdn.a4b.io/yoda/1785316621747.svg\"\n width={16}\n height={16}\n alt=\"\"\n aria-hidden\n />\n);\n\n/** Moon icon for \"Evening\" period tab */\nexport const EveningIcon: React.FC = () => (\n <img\n src=\"https://srm-cdn.a4b.io/yoda/1785316635953.svg\"\n width={16}\n height={16}\n alt=\"\"\n aria-hidden\n />\n);\n\n/** Calendar-with-slash icon for the \"No slots available\" empty state */\nexport const CalendarOffIcon: React.FC = () => (\n <svg width=\"40\" height=\"40\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden>\n <rect x=\"3\" y=\"4.5\" width=\"18\" height=\"16\" rx=\"3\" stroke=\"#D1D5DB\" strokeWidth=\"1.6\" />\n <path d=\"M3 9.5h18\" stroke=\"#D1D5DB\" strokeWidth=\"1.6\" />\n <path d=\"M8 2.5v4M16 2.5v4\" stroke=\"#D1D5DB\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n <path d=\"M7.5 20.5L17 6\" stroke=\"#9CA3AF\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n </svg>\n);\n\n","/**\n * PhoneNumberSection — PLACEHOLDER.\n *\n * Dummy stand-in for the \"phone number\" block that sits above the slot\n * picker, so the layout can be reviewed end to end. It renders a static\n * number and an inert \"Change\" affordance; swap it for the real\n * (validated, OTP-backed) implementation before shipping, or replace it\n * wholesale via `ConsultationSlotSelector`'s `phoneNumberSection` prop.\n */\nimport React from 'react';\nimport styles from './PhoneNumberSection.module.scss';\n\nexport interface PhoneNumberSectionProps {\n /** Section title. Wins over `t(\"planPhoneNumberHeading\")`. */\n title?: string;\n /** Dial code shown before the number, e.g. \"+91\" */\n countryCode?: string;\n /** The number itself, e.g. \"98765 43210\" */\n phoneNumber?: string;\n /** Helper line under the number. */\n helperText?: string;\n /** Called when \"Change\" is tapped; the link is hidden when not passed. */\n onEdit?: () => void;\n /** Translation lookup; every string falls back to the English default. */\n t?: (key: string, options?: any) => string | undefined;\n className?: string;\n}\n\nexport const PhoneNumberSection: React.FC<PhoneNumberSectionProps> = ({\n title,\n countryCode = '+91',\n phoneNumber = '98765 43210',\n helperText,\n onEdit,\n t,\n className = '',\n}) => (\n <section className={[styles.section, className].filter(Boolean).join(' ')}>\n <div className={styles.headerRow}>\n <span className={styles.title}>\n {title ?? t?.('planPhoneNumberHeading') ?? 'Your phone number'}\n </span>\n {onEdit && (\n <button type=\"button\" className={styles.changeBtn} onClick={onEdit}>\n {t?.('planPhoneNumberChange') ?? 'Change'}\n </button>\n )}\n </div>\n\n <div className={styles.numberRow}>\n <span className={styles.countryCode}>{countryCode}</span>\n <span className={styles.number}>{phoneNumber}</span>\n </div>\n\n <p className={styles.helper}>\n {helperText ??\n t?.('planPhoneNumberHelper') ??\n 'The astrologer will call you on this number at your booked slot.'}\n </p>\n </section>\n);\n","/**\n * AstrologyProfilesSection — PLACEHOLDER.\n *\n * Dummy stand-in for the \"astrology profiles\" block that sits above the slot\n * picker, so the layout can be reviewed end to end. It renders a horizontal\n * strip of selectable profile cards plus an inert \"Add profile\" tile; swap it\n * for the real (API-backed) implementation before shipping, or replace it\n * wholesale via `ConsultationSlotSelector`'s `astrologyProfilesSection` prop.\n */\nimport React, { useState } from 'react';\nimport styles from './AstrologyProfilesSection.module.scss';\n\nexport interface AstrologyProfile {\n id: string;\n /** Person's name, e.g. \"Aarav Sharma\" */\n name: string;\n /** Free-form birth line, e.g. \"12 Mar 1994 • 06:45 AM\" */\n birthDetails?: string;\n /** Birth place, e.g. \"Bengaluru, India\" */\n birthPlace?: string;\n /** Relation tag shown as a pill, e.g. \"Self\", \"Spouse\" */\n relation?: string;\n}\n\nconst PLACEHOLDER_PROFILES: AstrologyProfile[] = [\n {\n id: 'self',\n name: 'Aarav Sharma',\n birthDetails: '12 Mar 1994 • 06:45 AM',\n birthPlace: 'Bengaluru, India',\n relation: 'Self',\n },\n {\n id: 'spouse',\n name: 'Diya Sharma',\n birthDetails: '04 Sep 1996 • 11:20 PM',\n birthPlace: 'Pune, India',\n relation: 'Spouse',\n },\n];\n\nexport interface AstrologyProfilesSectionProps {\n /** Section title. Wins over `t(\"planAstrologyProfilesHeading\")`. */\n title?: string;\n /** Profiles to show. Defaults to placeholder data. */\n profiles?: AstrologyProfile[];\n /** Selected profile id. Omit to let the component manage it. */\n selectedProfileId?: string;\n onProfileSelect?: (profileId: string) => void;\n /** Called when \"Add profile\" is tapped; the tile is hidden when not passed. */\n onAddProfile?: () => void;\n /** Translation lookup; every string falls back to the English default. */\n t?: (key: string, options?: any) => string | undefined;\n className?: string;\n}\n\nexport const AstrologyProfilesSection: React.FC<AstrologyProfilesSectionProps> = ({\n title,\n profiles = PLACEHOLDER_PROFILES,\n selectedProfileId,\n onProfileSelect,\n onAddProfile,\n t,\n className = '',\n}) => {\n const [internalSelectedId, setInternalSelectedId] = useState(profiles[0]?.id ?? '');\n const activeId = selectedProfileId ?? internalSelectedId;\n\n const handleSelect = (profileId: string) => {\n setInternalSelectedId(profileId);\n onProfileSelect?.(profileId);\n };\n\n return (\n <section className={[styles.section, className].filter(Boolean).join(' ')}>\n <p className={styles.title}>\n {title ?? t?.('planAstrologyProfilesHeading') ?? 'Astrology profile'}\n </p>\n\n <div className={styles.profileRow} role=\"radiogroup\" aria-label=\"Astrology profile\">\n {profiles.map((profile) => {\n const isSelected = profile.id === activeId;\n return (\n <button\n key={profile.id}\n type=\"button\"\n role=\"radio\"\n aria-checked={isSelected}\n className={[styles.profileCard, isSelected ? styles.profileCardSelected : '']\n .filter(Boolean)\n .join(' ')}\n onClick={() => handleSelect(profile.id)}\n >\n <span className={styles.profileTop}>\n <span className={styles.avatar} aria-hidden>\n {profile.name.charAt(0).toUpperCase()}\n </span>\n <span className={styles.profileName}>{profile.name}</span>\n </span>\n {profile.relation && <span className={styles.relationPill}>{profile.relation}</span>}\n {profile.birthDetails && (\n <span className={styles.profileMeta}>{profile.birthDetails}</span>\n )}\n {profile.birthPlace && (\n <span className={styles.profileMeta}>{profile.birthPlace}</span>\n )}\n </button>\n );\n })}\n\n {onAddProfile && (\n <button type=\"button\" className={styles.addCard} onClick={onAddProfile}>\n <span className={styles.addIcon} aria-hidden>\n +\n </span>\n {t?.('planAddAstrologyProfile') ?? 'Add profile'}\n </button>\n )}\n </div>\n </section>\n );\n};\n","/**\n * ConsultationSlotSelector — presentational slot-picker extracted from the\n * kundli-generator consultation modal.\n *\n * It renders only the UI: the consultation-language row and the date /\n * time-of-day / time-slot selection (plus loading, error and empty states),\n * optionally preceded by the phone-number and astrology-profile sections.\n * All fetching, analytics and modal chrome (header, footer CTA, guidance\n * topics) stay in the host app.\n *\n * Selection is controlled-optional: pass `selectedDate` / `selectedPeriod` /\n * `selectedSlotStart` / `selectedLanguage` to drive it from the host, or omit\n * them and the component keeps its own state, defaulting to the first\n * available day / period / slot.\n */\nimport React, { Fragment, useEffect, useMemo, useRef, useState } from 'react';\nimport type {\n ConsultationLanguageOption,\n ConsultationSlot,\n ConsultationSlotDay,\n ConsultationSlotPeriod,\n} from './types';\nimport {\n CONSULTATION_LANGUAGE_OPTIONS,\n CONSULTATION_PERIOD_ORDER,\n formatSlotDayLabel,\n formatSlotTime,\n} from './slotUtils';\nimport {\n AfternoonIcon,\n CalendarOffIcon,\n CheckIcon,\n ChevronDownIcon,\n EveningIcon,\n MorningIcon,\n} from './SlotIcons';\nimport { PhoneNumberSection } from './PhoneNumberSection';\nimport { AstrologyProfilesSection } from './AstrologyProfilesSection';\nimport styles from './ConsultationSlotSelector.module.scss';\n\nexport interface ConsultationSlotSelectorProps {\n /** Availability for the currently selected consultation language. */\n days: ConsultationSlotDay[];\n\n /** Renders the shimmer skeleton instead of the slot grid. */\n loading?: boolean;\n /** Renders the error message (with a Retry button when `onRetry` is given). */\n error?: boolean;\n onRetry?: () => void;\n\n /** Selected date, ISO \"yyyy-MM-dd\". Omit to let the component manage it. */\n selectedDate?: string;\n onDateSelect?: (date: string) => void;\n\n /** Selected time-of-day tab. Omit to let the component manage it. */\n selectedPeriod?: ConsultationSlotPeriod;\n onPeriodSelect?: (period: ConsultationSlotPeriod) => void;\n\n /**\n * `start` of the selected slot. Omit to let the component manage it\n * (defaults to the first slot of the visible period); pass `null` to show\n * nothing as selected.\n */\n selectedSlotStart?: string | null;\n onSlotSelect?: (slot: ConsultationSlot) => void;\n\n /** Hides the whole consultation-language row + its divider. */\n hideLanguageSelector?: boolean;\n languageOptions?: ConsultationLanguageOption[];\n /** Selected language code. Omit to let the component manage it. */\n selectedLanguage?: string;\n onLanguageSelect?: (code: string) => void;\n\n /** Shows the (placeholder) phone-number section above the slot picker. */\n showPhoneNumberSection?: boolean;\n /** Replaces the placeholder phone-number section with your own node. */\n phoneNumberSection?: React.ReactNode;\n\n /** Shows the (placeholder) astrology-profiles section above the slot picker. */\n showAstrologyProfilesSection?: boolean;\n /** Replaces the placeholder astrology-profiles section with your own node. */\n astrologyProfilesSection?: React.ReactNode;\n\n /** Heading above the date tabs. Wins over `t(\"planSelectSlotHeading\")`. */\n heading?: string;\n /** Label on the left of the language dropdown. Wins over `t(...)`. */\n languageLabel?: string;\n /** Replaces the \"Your Report will be ready in 24-48 hours\" banner; `null` hides it. */\n reportReadyNote?: React.ReactNode;\n\n /**\n * International build — labels the evening tab \"Evening/Night\", since slots\n * that late in IST land at night in most timezones global users book from.\n */\n isGlobal?: boolean;\n\n /** Translation lookup; every string falls back to the English default. */\n t?: (key: string, options?: any) => string | undefined;\n\n className?: string;\n}\n\nconst PERIOD_ICONS: Record<ConsultationSlotPeriod, React.FC> = {\n morning: MorningIcon,\n afternoon: AfternoonIcon,\n evening: EveningIcon,\n};\n\nconst PERIOD_LABEL_KEYS: Record<ConsultationSlotPeriod, string> = {\n morning: 'planPeriodMorning',\n afternoon: 'planPeriodAfternoon',\n evening: 'planPeriodEvening',\n};\n\nconst cx = (...classNames: (string | false | undefined)[]) =>\n classNames.filter(Boolean).join(' ');\n\nexport const ConsultationSlotSelector: React.FC<ConsultationSlotSelectorProps> = ({\n days,\n loading = false,\n error = false,\n onRetry,\n selectedDate,\n onDateSelect,\n selectedPeriod,\n onPeriodSelect,\n selectedSlotStart,\n onSlotSelect,\n hideLanguageSelector = false,\n languageOptions = CONSULTATION_LANGUAGE_OPTIONS,\n selectedLanguage,\n onLanguageSelect,\n showPhoneNumberSection = true,\n phoneNumberSection,\n showAstrologyProfilesSection = true,\n astrologyProfilesSection,\n heading,\n languageLabel,\n reportReadyNote,\n isGlobal = true,\n t,\n className = '',\n}) => {\n const availableDays = useMemo(\n () => days.filter((d) => d.has_availability && d.slots.length > 0),\n [days]\n );\n\n // ===== Date =====\n const [internalDate, setInternalDate] = useState('');\n const activeDate = useMemo(() => {\n const candidate = selectedDate ?? internalDate;\n return availableDays.some((d) => d.date === candidate)\n ? candidate\n : (availableDays[0]?.date ?? '');\n }, [selectedDate, internalDate, availableDays]);\n\n const activeDay = useMemo(\n () => availableDays.find((d) => d.date === activeDate) ?? null,\n [availableDays, activeDate]\n );\n\n // ===== Period =====\n const periodsForActiveDay = useMemo(() => {\n if (!activeDay) return [];\n const present = new Set(activeDay.slots.map((s) => s.period));\n return CONSULTATION_PERIOD_ORDER.filter((p) => present.has(p));\n }, [activeDay]);\n\n const [internalPeriod, setInternalPeriod] = useState<ConsultationSlotPeriod | ''>('');\n const activePeriod = useMemo<ConsultationSlotPeriod>(() => {\n const candidate = selectedPeriod ?? internalPeriod;\n return candidate && periodsForActiveDay.includes(candidate)\n ? candidate\n : (periodsForActiveDay[0] ?? 'morning');\n }, [selectedPeriod, internalPeriod, periodsForActiveDay]);\n\n // ===== Slot =====\n const slotsForActivePeriod = useMemo(\n () => (activeDay ? activeDay.slots.filter((s) => s.period === activePeriod) : []),\n [activeDay, activePeriod]\n );\n\n const [internalSlotStart, setInternalSlotStart] = useState('');\n const activeSlotStart = useMemo(() => {\n // `null` is an explicit \"nothing selected\" from the host — don't default.\n if (selectedSlotStart === null) return '';\n const candidate = selectedSlotStart ?? internalSlotStart;\n return slotsForActivePeriod.some((s) => s.start === candidate)\n ? candidate\n : (slotsForActivePeriod[0]?.start ?? '');\n }, [selectedSlotStart, internalSlotStart, slotsForActivePeriod]);\n\n // ===== Language =====\n const [internalLanguage, setInternalLanguage] = useState(\n () => languageOptions[0]?.code ?? 'en'\n );\n const activeLanguage = selectedLanguage ?? internalLanguage;\n const activeLanguageOption =\n languageOptions.find((option) => option.code === activeLanguage) ?? languageOptions[0];\n\n const [isLanguageMenuOpen, setIsLanguageMenuOpen] = useState(false);\n const languageMenuRef = useRef<HTMLDivElement | null>(null);\n\n // Close the language dropdown on outside click.\n useEffect(() => {\n if (!isLanguageMenuOpen) return;\n const handleClickOutside = (event: MouseEvent) => {\n if (languageMenuRef.current && !languageMenuRef.current.contains(event.target as Node)) {\n setIsLanguageMenuOpen(false);\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [isLanguageMenuOpen]);\n\n // ===== Sliding tab indicators =====\n // Both pills are measured from the actual DOM nodes so they line up exactly\n // regardless of label width/locale or how many tabs are shown, then animated\n // purely via CSS transform/width transitions for a smooth iOS-style switch.\n const dateTabsRef = useRef<HTMLDivElement | null>(null);\n const dateTabRefs = useRef<Partial<Record<string, HTMLButtonElement | null>>>({});\n const [dateIndicatorRect, setDateIndicatorRect] = useState<{\n left: number;\n top: number;\n width: number;\n height: number;\n } | null>(null);\n\n const periodTabsRef = useRef<HTMLDivElement | null>(null);\n const periodTabRefs = useRef<Partial<Record<ConsultationSlotPeriod, HTMLButtonElement | null>>>(\n {}\n );\n const [periodIndicatorRect, setPeriodIndicatorRect] = useState<{\n left: number;\n width: number;\n } | null>(null);\n\n useEffect(() => {\n const measure = () => {\n const container = dateTabsRef.current;\n const activeTab = dateTabRefs.current[activeDate];\n if (!container || !activeTab) {\n setDateIndicatorRect(null);\n return;\n }\n const containerRect = container.getBoundingClientRect();\n const tabRect = activeTab.getBoundingClientRect();\n setDateIndicatorRect({\n left: tabRect.left - containerRect.left,\n top: tabRect.top - containerRect.top,\n width: tabRect.width,\n height: tabRect.height,\n });\n };\n measure();\n window.addEventListener('resize', measure);\n return () => window.removeEventListener('resize', measure);\n }, [activeDate, availableDays, loading, error]);\n\n useEffect(() => {\n const measure = () => {\n const container = periodTabsRef.current;\n const activeTab = periodTabRefs.current[activePeriod];\n if (!container || !activeTab) {\n setPeriodIndicatorRect(null);\n return;\n }\n const containerRect = container.getBoundingClientRect();\n const tabRect = activeTab.getBoundingClientRect();\n setPeriodIndicatorRect({\n left: tabRect.left - containerRect.left,\n width: tabRect.width,\n });\n };\n measure();\n window.addEventListener('resize', measure);\n return () => window.removeEventListener('resize', measure);\n }, [activePeriod, periodsForActiveDay, loading, error]);\n\n // ===== Handlers =====\n const handleDateSelect = (date: string) => {\n setInternalDate(date);\n onDateSelect?.(date);\n };\n\n const handlePeriodSelect = (period: ConsultationSlotPeriod) => {\n setInternalPeriod(period);\n onPeriodSelect?.(period);\n };\n\n const handleSlotSelect = (slot: ConsultationSlot) => {\n setInternalSlotStart(slot.start);\n onSlotSelect?.(slot);\n };\n\n const handleLanguageSelect = (code: string) => {\n setInternalLanguage(code);\n setIsLanguageMenuOpen(false);\n onLanguageSelect?.(code);\n };\n\n return (\n <div className={cx(styles.root, className)}>\n {showPhoneNumberSection && (phoneNumberSection ?? <PhoneNumberSection t={t} />)}\n {showAstrologyProfilesSection &&\n (astrologyProfilesSection ?? <AstrologyProfilesSection t={t} />)}\n\n {/* Consultation language selector — a purely client-side switch over\n availability the host already fetched for every language. */}\n {!hideLanguageSelector && (\n <>\n <div className={styles.languageRow}>\n <span className={styles.languageLabel}>\n {languageLabel ??\n t?.('planConsultationLanguageLabel') ??\n 'Your consultation language'}\n </span>\n <div className={styles.languageDropdown} ref={languageMenuRef}>\n <button\n type=\"button\"\n className={styles.languageDropdownBtn}\n onClick={() => setIsLanguageMenuOpen((prev) => !prev)}\n aria-haspopup=\"listbox\"\n aria-expanded={isLanguageMenuOpen}\n >\n {(activeLanguageOption?.labelKey && t?.(activeLanguageOption.labelKey)) ??\n activeLanguageOption?.label}\n <ChevronDownIcon />\n </button>\n {isLanguageMenuOpen && (\n <ul className={styles.languageMenu} role=\"listbox\">\n {languageOptions.map((option) => {\n const isSelected = option.code === activeLanguage;\n return (\n <li\n key={option.code}\n role=\"option\"\n aria-selected={isSelected}\n className={cx(\n styles.languageMenuItem,\n isSelected && styles.languageMenuItemSelected\n )}\n onClick={() => handleLanguageSelect(option.code)}\n >\n {(option.labelKey && t?.(option.labelKey)) ?? option.label}\n {isSelected && <CheckIcon />}\n </li>\n );\n })}\n </ul>\n )}\n </div>\n </div>\n <hr className={styles.languageDivider} />\n </>\n )}\n\n {/* Date + time slot selection */}\n <p className={styles.sectionHeading}>\n {heading ?? t?.('planSelectSlotHeading') ?? 'Book your preferred consultation slot'}\n </p>\n\n {reportReadyNote === undefined ? (\n <p className={styles.reportReadyBanner}>\n {t?.('planReportReadyPrefix') ?? 'Your Report will be ready in'}{' '}\n <span className={styles.reportReadyDuration}>\n {t?.('planReportReadyDuration') ?? '24-48 hours'}\n </span>{' '}\n {t?.('planReportReadySuffix') ?? 'from today'}\n </p>\n ) : (\n reportReadyNote\n )}\n\n {loading && (\n <div className={styles.loadingWrap} aria-busy=\"true\" aria-live=\"polite\">\n <div className={styles.skeletonDateTabs}>\n {Array.from({ length: 5 }).map((_, idx) => (\n <div key={idx} className={cx(styles.skeletonDateTab, styles.skeletonShimmer)} />\n ))}\n </div>\n <div className={styles.skeletonPeriodTabs}>\n {Array.from({ length: 3 }).map((_, idx) => (\n <div key={idx} className={cx(styles.skeletonPeriodTab, styles.skeletonShimmer)} />\n ))}\n </div>\n <div className={styles.skeletonTimeGrid}>\n {Array.from({ length: 6 }).map((_, idx) => (\n <div key={idx} className={cx(styles.skeletonTimeSlot, styles.skeletonShimmer)} />\n ))}\n </div>\n </div>\n )}\n\n {!loading && error && (\n <div className={styles.stateMessage}>\n {t?.('planSlotsLoadError') ?? \"Couldn't load slots. Please try again.\"}\n {onRetry && (\n <button type=\"button\" className={styles.retryBtn} onClick={onRetry}>\n {t?.('planRetry') ?? 'Retry'}\n </button>\n )}\n </div>\n )}\n\n {!loading && !error && availableDays.length === 0 && (\n <div className={styles.emptyState}>\n <span className={styles.emptyStateIcon}>\n <CalendarOffIcon />\n </span>\n <p className={styles.emptyStateTitle}>\n {t?.('planNoSlotsAvailableTitle') ?? 'No slots available'}\n </p>\n <p className={styles.emptyStateSubtitle}>\n {t?.('planNoSlotsAvailableSubtitle') ??\n 'Try a different consultation language above, or check back soon.'}\n </p>\n </div>\n )}\n\n {!loading && !error && availableDays.length > 0 && (\n <>\n <div\n className={styles.dateTabs}\n ref={dateTabsRef}\n role=\"radiogroup\"\n aria-label=\"Consultation date\"\n >\n {dateIndicatorRect && (\n <span\n className={styles.dateTabIndicator}\n style={{\n transform: `translate(${dateIndicatorRect.left}px, ${dateIndicatorRect.top}px)`,\n width: dateIndicatorRect.width,\n height: dateIndicatorRect.height,\n }}\n aria-hidden=\"true\"\n />\n )}\n {availableDays.map((day) => {\n const isSelected = day.date === activeDate;\n const { dayLabel, dayNum } = formatSlotDayLabel(day.date);\n return (\n <Fragment key={day.date}>\n <button\n type=\"button\"\n ref={(el) => {\n dateTabRefs.current[day.date] = el;\n }}\n className={cx(styles.dateTab, isSelected && styles.dateTabSelected)}\n role=\"radio\"\n aria-checked={isSelected}\n onClick={() => handleDateSelect(day.date)}\n >\n <span className={styles.dateTabLabel}>{t?.(dayLabel) ?? dayLabel}</span>\n <span className={styles.dateTabNum}>{dayNum}</span>\n </button>\n <span className={styles.dateTabDivider} aria-hidden />\n </Fragment>\n );\n })}\n </div>\n\n <div\n className={styles.periodTabs}\n ref={periodTabsRef}\n role=\"tablist\"\n aria-label=\"Time of day\"\n >\n {periodIndicatorRect && (\n <span\n className={styles.periodTabIndicator}\n style={{\n transform: `translateX(${periodIndicatorRect.left}px)`,\n width: periodIndicatorRect.width,\n }}\n aria-hidden=\"true\"\n />\n )}\n {periodsForActiveDay.map((period) => {\n const Icon = PERIOD_ICONS[period];\n const isEveningNight = period === 'evening' && isGlobal;\n const labelKey = isEveningNight\n ? 'planPeriodEveningNight'\n : PERIOD_LABEL_KEYS[period];\n return (\n <button\n key={period}\n ref={(el) => {\n periodTabRefs.current[period] = el;\n }}\n type=\"button\"\n className={cx(\n styles.periodTab,\n period === activePeriod && styles.periodTabSelected\n )}\n role=\"tab\"\n aria-selected={period === activePeriod}\n onClick={() => handlePeriodSelect(period)}\n >\n <Icon />\n {t?.(labelKey) ??\n (isEveningNight\n ? 'Evening/Night'\n : period.charAt(0).toUpperCase() + period.slice(1))}\n </button>\n );\n })}\n </div>\n\n <div\n key={`${activeDate}-${activePeriod}`}\n className={styles.timeGrid}\n role=\"radiogroup\"\n aria-label=\"Consultation time\"\n >\n {slotsForActivePeriod.map((slot, idx) => (\n <button\n key={`${slot.start}-${idx}`}\n type=\"button\"\n className={cx(\n styles.timeSlot,\n activeSlotStart === slot.start && styles.timeSlotSelected,\n slot.disabled && styles.timeSlotDisabled\n )}\n role=\"radio\"\n aria-checked={activeSlotStart === slot.start}\n aria-disabled={slot.disabled || undefined}\n disabled={slot.disabled}\n onClick={() => !slot.disabled && handleSlotSelect(slot)}\n >\n {formatSlotTime(slot.start)}\n </button>\n ))}\n </div>\n </>\n )}\n </div>\n );\n};\n","/**\n * Dummy availability data for Storybook / local previews.\n *\n * Dates are generated relative to \"today\" so the date tabs always read\n * \"Today\", \"Tomorrow\", then weekday names — exactly like the real API\n * response would.\n */\nimport type { ConsultationSlot, ConsultationSlotDay, ConsultationSlotPeriod } from './types';\n\n/** \"+05:30\" — the mock data is IST, matching what the real API returns. */\nconst OFFSET = '+05:30';\n\nconst toIsoDate = (date: Date): string => {\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n return `${date.getFullYear()}-${month}-${day}`;\n};\n\nconst makeSlot = (\n isoDate: string,\n hour: number,\n minute: number,\n period: ConsultationSlotPeriod\n): ConsultationSlot => {\n const pad = (n: number) => String(n).padStart(2, '0');\n const endMinute = minute + 30;\n const endHour = hour + Math.floor(endMinute / 60);\n return {\n start: `${isoDate}T${pad(hour)}:${pad(minute)}:00${OFFSET}`,\n end: `${isoDate}T${pad(endHour)}:${pad(endMinute % 60)}:00${OFFSET}`,\n period,\n };\n};\n\n/** Slot start times per period, as [hour, minute] pairs. */\nconst SLOT_TIMES: Record<ConsultationSlotPeriod, [number, number][]> = {\n morning: [\n [9, 0],\n [9, 30],\n [10, 0],\n [10, 30],\n [11, 0],\n [11, 30],\n ],\n afternoon: [\n [12, 30],\n [13, 0],\n [14, 0],\n [15, 30],\n [16, 0],\n ],\n evening: [\n [18, 0],\n [18, 30],\n [19, 0],\n [20, 0],\n ],\n};\n\nconst buildDay = (\n dayOffset: number,\n periods: ConsultationSlotPeriod[]\n): ConsultationSlotDay => {\n const date = new Date();\n date.setDate(date.getDate() + dayOffset);\n const isoDate = toIsoDate(date);\n const slots = periods.flatMap((period) =>\n SLOT_TIMES[period].map(([hour, minute]) => makeSlot(isoDate, hour, minute, period))\n );\n return { date: isoDate, has_availability: slots.length > 0, slots };\n};\n\n/** Five days of availability with a deliberately uneven period mix. */\nexport const MOCK_SLOT_DAYS: ConsultationSlotDay[] = [\n buildDay(0, ['morning', 'afternoon', 'evening']),\n buildDay(1, ['morning', 'afternoon']),\n buildDay(2, ['afternoon', 'evening']),\n buildDay(3, ['morning', 'evening']),\n buildDay(4, ['morning', 'afternoon', 'evening']),\n];\n\n/** Every day sold out — drives the \"No slots available\" empty state. */\nexport const MOCK_SLOT_DAYS_EMPTY: ConsultationSlotDay[] = MOCK_SLOT_DAYS.map((day) => ({\n ...day,\n has_availability: false,\n slots: [],\n}));\n","import React from 'react';\n\n/** Down chevron, used by the phone-input country-code dropdown trigger */\nexport const ChevronDownIcon: React.FC = () => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n >\n <path d=\"M6 9l6 6 6-6\" />\n </svg>\n);\n","/** Dial-code country list + flag helper for `PhoneNumberInput`. */\n\nexport interface Country {\n name: string;\n code: string;\n iso: string;\n}\n\nexport const DEFAULT_COUNTRIES: Country[] = [\n { name: 'United States', code: '+1', iso: 'US' },\n { name: 'United Kingdom', code: '+44', iso: 'GB' },\n { name: 'Australia', code: '+61', iso: 'AU' },\n { name: 'Canada', code: '+1', iso: 'CA' },\n { name: 'United Arab Emirates', code: '+971', iso: 'AE' },\n { name: 'Singapore', code: '+65', iso: 'SG' },\n { name: 'New Zealand', code: '+64', iso: 'NZ' },\n { name: 'Mauritius', code: '+230', iso: 'MU' },\n { name: 'Netherlands', code: '+31', iso: 'NL' },\n { name: 'Malaysia', code: '+60', iso: 'MY' },\n { name: 'Germany', code: '+49', iso: 'DE' },\n { name: 'South Africa', code: '+27', iso: 'ZA' },\n { name: 'Qatar', code: '+974', iso: 'QA' },\n { name: 'Ireland', code: '+353', iso: 'IE' },\n { name: 'Oman', code: '+968', iso: 'OM' },\n { name: 'Saudi Arabia', code: '+966', iso: 'SA' },\n { name: 'Hong Kong', code: '+852', iso: 'HK' },\n { name: 'France', code: '+33', iso: 'FR' },\n { name: 'Switzerland', code: '+41', iso: 'CH' },\n { name: 'Bahrain', code: '+973', iso: 'BH' },\n { name: 'Trinidad and Tobago', code: '+1-868', iso: 'TT' },\n { name: 'Kuwait', code: '+965', iso: 'KW' },\n { name: 'Belgium', code: '+32', iso: 'BE' },\n { name: 'Japan', code: '+81', iso: 'JP' },\n { name: 'Italy', code: '+39', iso: 'IT' },\n { name: 'Spain', code: '+34', iso: 'ES' },\n { name: 'Norway', code: '+47', iso: 'NO' },\n { name: 'Sweden', code: '+46', iso: 'SE' },\n { name: 'Portugal', code: '+351', iso: 'PT' },\n { name: 'Poland', code: '+48', iso: 'PL' },\n { name: 'Denmark', code: '+45', iso: 'DK' },\n { name: 'Nepal', code: '+977', iso: 'NP' },\n { name: 'Bangladesh', code: '+880', iso: 'BD' },\n { name: 'Kenya', code: '+254', iso: 'KE' },\n { name: 'Mexico', code: '+52', iso: 'MX' },\n { name: 'Czechia', code: '+420', iso: 'CZ' },\n { name: 'Indonesia', code: '+62', iso: 'ID' },\n { name: 'Taiwan', code: '+886', iso: 'TW' },\n { name: 'Fiji', code: '+679', iso: 'FJ' },\n { name: 'Guyana', code: '+592', iso: 'GY' },\n { name: 'Finland', code: '+358', iso: 'FI' },\n { name: 'Nigeria', code: '+234', iso: 'NG' },\n { name: 'Jamaica', code: '+1-876', iso: 'JM' },\n { name: 'Sri Lanka', code: '+94', iso: 'LK' },\n { name: 'Thailand', code: '+66', iso: 'TH' },\n { name: 'Hungary', code: '+36', iso: 'HU' },\n { name: 'Tanzania', code: '+255', iso: 'TZ' },\n { name: 'Sint Maarten', code: '+1-721', iso: 'SX' },\n { name: 'Philippines', code: '+63', iso: 'PH' },\n { name: 'Estonia', code: '+372', iso: 'EE' },\n { name: 'Ukraine', code: '+380', iso: 'UA' },\n { name: 'Austria', code: '+43', iso: 'AT' },\n { name: 'Réunion', code: '+262', iso: 'RE' },\n { name: 'India', code: '+91', iso: 'IN' },\n];\n\n/**\n * Renders a flag purely from the ISO alpha-2 code via Unicode regional\n * indicator symbols — no image assets/CDN needed. Pass `getFlagUrl` to\n * `PhoneNumberInput` instead if the host wants real flag images.\n */\nexport const getFlagEmoji = (iso: string | undefined): string => {\n if (!iso || iso.length !== 2) return '🏳️';\n const codePoints = iso\n .toUpperCase()\n .split('')\n .map((char) => 127397 + char.charCodeAt(0));\n return String.fromCodePoint(...codePoints);\n};\n","/** Phone validation patterns by dial code, used by `PhoneNumberInput`. */\nconst PHONE_PATTERNS: Record<\n string,\n { pattern: RegExp; minLength: number; maxLength: number; description: string }\n> = {\n '+1': {\n pattern: /^[2-9]\\d{9}$/,\n minLength: 10,\n maxLength: 10,\n description: '10 digits, cannot start with 0 or 1',\n },\n '+44': {\n pattern: /^\\d{10}$/,\n minLength: 10,\n maxLength: 10,\n description: '10 digits',\n },\n '+61': {\n pattern: /^\\d{9}$/,\n minLength: 9,\n maxLength: 9,\n description: '9 digits',\n },\n '+971': {\n pattern: /^\\d{8,9}$/,\n minLength: 8,\n maxLength: 9,\n description: '8-9 digits',\n },\n '+65': {\n pattern: /^\\d{8}$/,\n minLength: 8,\n maxLength: 8,\n description: '8 digits',\n },\n '+49': {\n pattern: /^\\d{10,11}$/,\n minLength: 10,\n maxLength: 11,\n description: '10-11 digits',\n },\n '+91': {\n pattern: /^[6-9]\\d{9}$/,\n minLength: 10,\n maxLength: 10,\n description: '10 digits, must start with 6-9',\n },\n '+974': {\n pattern: /^\\d{8}$/,\n minLength: 8,\n maxLength: 8,\n description: '8 digits',\n },\n '+60': {\n pattern: /^\\d{9,10}$/,\n minLength: 9,\n maxLength: 10,\n description: '9-10 digits',\n },\n '+27': {\n pattern: /^\\d{9}$/,\n minLength: 9,\n maxLength: 9,\n description: '9 digits',\n },\n '+64': {\n pattern: /^\\d{8,10}$/,\n minLength: 8,\n maxLength: 10,\n description: '8-10 digits',\n },\n '+230': {\n pattern: /^\\d{7,8}$/,\n minLength: 7,\n maxLength: 8,\n description: '7-8 digits',\n },\n};\n\nconst DEFAULT_PATTERN = {\n pattern: /^\\d{6,15}$/,\n minLength: 6,\n maxLength: 15,\n description: '6-15 digits',\n};\n\n/** Phone number is treated as optional — an empty string is always valid. */\nexport const validatePhoneByCountryCode = (\n phoneNumber: string,\n countryCode: string\n): { isValid: boolean; error: string } => {\n if (!phoneNumber) {\n return { isValid: true, error: '' };\n }\n\n const validation = PHONE_PATTERNS[countryCode] || DEFAULT_PATTERN;\n const isValid = validation.pattern.test(phoneNumber);\n\n if (!isValid) {\n return {\n isValid: false,\n error: `Please enter a valid phone number (${validation.description})`,\n };\n }\n\n return { isValid: true, error: '' };\n};\n\nexport const getMaxLengthForCountry = (countryCode: string): number => {\n const validation = PHONE_PATTERNS[countryCode] || DEFAULT_PATTERN;\n return validation.maxLength;\n};\n","import { useCallback, useState } from 'react';\nimport type { Country } from './countries';\nimport { validatePhoneByCountryCode, getMaxLengthForCountry } from '../../utils/phoneValidation';\n\ninterface UsePhoneNumberInputOptions {\n countryCode: string;\n contactNumber: string;\n countries: Country[];\n onCountryCodeChange: (code: string, countryName: string) => void;\n onPhoneNumberChange: (value: string) => void;\n onValidationChange?: (isValid: boolean, error: string) => void;\n onDropdownFocus?: (countryCode: string) => void;\n onInputFocus?: (countryCode: string) => void;\n}\n\nexport const usePhoneNumberInput = ({\n countryCode,\n contactNumber,\n countries,\n onCountryCodeChange,\n onPhoneNumberChange,\n onValidationChange,\n onDropdownFocus,\n onInputFocus,\n}: UsePhoneNumberInputOptions) => {\n const [isDropdownOpen, setIsDropdownOpen] = useState(false);\n\n const selectedCountry = countries.find((c) => c.code === countryCode) ?? countries[0];\n const maxLength = getMaxLengthForCountry(countryCode);\n\n const handleCountrySelect = useCallback(\n (country: Country) => {\n onCountryCodeChange(country.code, country.name);\n setIsDropdownOpen(false);\n\n if (contactNumber && onValidationChange) {\n const { isValid, error } = validatePhoneByCountryCode(contactNumber, country.code);\n onValidationChange(isValid, error);\n }\n },\n [contactNumber, onCountryCodeChange, onValidationChange]\n );\n\n const handlePhoneChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value.replace(/[^\\d]/g, '');\n const trimmedValue = value.slice(0, getMaxLengthForCountry(countryCode));\n onPhoneNumberChange(trimmedValue);\n\n if (onValidationChange) {\n const { isValid, error } = validatePhoneByCountryCode(trimmedValue, countryCode);\n onValidationChange(isValid, error);\n }\n },\n [countryCode, onPhoneNumberChange, onValidationChange]\n );\n\n const handleDropdownToggle = useCallback(() => {\n setIsDropdownOpen((prev) => {\n if (!prev) onDropdownFocus?.(countryCode);\n return !prev;\n });\n }, [countryCode, onDropdownFocus]);\n\n const handlePhoneFocus = useCallback(() => {\n setIsDropdownOpen(false);\n onInputFocus?.(countryCode);\n }, [countryCode, onInputFocus]);\n\n return {\n isDropdownOpen,\n selectedCountry,\n maxLength,\n handleCountrySelect,\n handlePhoneChange,\n handleDropdownToggle,\n handlePhoneFocus,\n closeDropdown: () => setIsDropdownOpen(false),\n };\n};\n","/**\n * PhoneNumberInput — country-code + number entry, extracted from the\n * hanuman app's `PhoneInput` (src/components/inputs/phone-input) so\n * consultation-booking hosts get a real, validated implementation instead\n * of the `PhoneNumberSection` placeholder. Renders flags as Unicode emoji\n * by default (no image assets/CDN needed) — pass `getFlagUrl` for real\n * flag images instead.\n *\n * Controlled-optional: pass `countryCode`/`contactNumber` + their `on*Change`\n * pairs to drive it from the host, or omit them and it manages its own state.\n */\nimport React, { useEffect, useRef, useState } from 'react';\nimport { ChevronDownIcon } from './icons';\nimport { DEFAULT_COUNTRIES, getFlagEmoji, type Country } from './countries';\nimport { usePhoneNumberInput } from './usePhoneNumberInput';\nimport { validatePhoneByCountryCode, getMaxLengthForCountry } from '../../utils/phoneValidation';\nimport styles from './PhoneNumberInput.module.scss';\n\nexport { validatePhoneByCountryCode, getMaxLengthForCountry };\n\nconst cx = (...classNames: (string | false | undefined)[]) =>\n classNames.filter(Boolean).join(' ');\n\nexport interface PhoneNumberInputProps {\n /** Dial code, e.g. \"+91\". Omit to let the component manage it. */\n countryCode?: string;\n /** The number itself, digits only. Omit to let the component manage it. */\n contactNumber?: string;\n error?: string;\n label?: React.ReactNode;\n helperText?: React.ReactNode;\n /** Defaults to `DEFAULT_COUNTRIES`. */\n countries?: Country[];\n /** Returns a flag image URL for an ISO code; falls back to an emoji flag when omitted/null. */\n getFlagUrl?: (iso: string) => string | null | undefined;\n onCountryCodeChange?: (code: string, countryName: string) => void;\n onPhoneNumberChange?: (value: string) => void;\n onValidationChange?: (isValid: boolean, error: string) => void;\n onDropdownFocus?: (countryCode: string) => void;\n onInputFocus?: (countryCode: string) => void;\n inputRef?: (ele: HTMLInputElement | null) => void;\n /** Translation lookup; every string falls back to the English default. */\n t?: (key: string, options?: any) => string | undefined;\n className?: string;\n}\n\nexport const PhoneNumberInput: React.FC<PhoneNumberInputProps> = ({\n countryCode,\n contactNumber,\n error,\n label,\n helperText,\n countries = DEFAULT_COUNTRIES,\n getFlagUrl,\n onCountryCodeChange,\n onPhoneNumberChange,\n onValidationChange,\n onDropdownFocus,\n onInputFocus,\n inputRef,\n t,\n className = '',\n}) => {\n const [internalCountryCode, setInternalCountryCode] = useState(countries[0]?.code ?? '+91');\n const [internalNumber, setInternalNumber] = useState('');\n const activeCountryCode = countryCode ?? internalCountryCode;\n const activeNumber = contactNumber ?? internalNumber;\n\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n const {\n isDropdownOpen,\n selectedCountry,\n maxLength,\n handleCountrySelect,\n handlePhoneChange,\n handleDropdownToggle,\n handlePhoneFocus,\n closeDropdown,\n } = usePhoneNumberInput({\n countryCode: activeCountryCode,\n contactNumber: activeNumber,\n countries,\n onCountryCodeChange: (code, name) => {\n setInternalCountryCode(code);\n onCountryCodeChange?.(code, name);\n },\n onPhoneNumberChange: (value) => {\n setInternalNumber(value);\n onPhoneNumberChange?.(value);\n },\n onValidationChange,\n onDropdownFocus,\n onInputFocus,\n });\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n closeDropdown();\n }\n };\n if (isDropdownOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n }\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [isDropdownOpen, closeDropdown]);\n\n const renderFlag = (iso: string | undefined, alt: string) => {\n const flagUrl = iso ? getFlagUrl?.(iso) : null;\n if (flagUrl) {\n return <img src={flagUrl} alt={alt} width={20} height={14} className={styles.flagImg} />;\n }\n return (\n <span className={styles.flagEmoji} aria-hidden>\n {getFlagEmoji(iso)}\n </span>\n );\n };\n\n return (\n <div className={cx(styles.root, className)}>\n {label && <div className={styles.label}>{label}</div>}\n\n <div className={styles.row}>\n <div className={styles.dropdownWrap} ref={dropdownRef}>\n <button type=\"button\" className={styles.dropdownBtn} onClick={handleDropdownToggle}>\n {renderFlag(selectedCountry?.iso, selectedCountry?.name ?? 'Flag')}\n <span>{selectedCountry?.code ?? '+91'}</span>\n <ChevronDownIcon />\n </button>\n\n {isDropdownOpen && (\n <div className={styles.dropdownMenu} role=\"listbox\">\n {countries.map((country) => (\n <button\n key={`${country.code}-${country.iso}`}\n type=\"button\"\n role=\"option\"\n aria-selected={country.code === selectedCountry?.code}\n className={styles.dropdownItem}\n onClick={() => handleCountrySelect(country)}\n >\n {renderFlag(country.iso, country.name)}\n <span className={styles.dropdownItemCode}>{country.code}</span>\n <span className={styles.dropdownItemName}>{country.name}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n\n <input\n type=\"tel\"\n inputMode=\"numeric\"\n autoComplete=\"off\"\n value={activeNumber}\n maxLength={maxLength}\n ref={inputRef}\n className={cx(styles.input, error && styles.inputError)}\n placeholder={t?.('planPhoneNumberPlaceholder') ?? '0000000000'}\n onChange={handlePhoneChange}\n onFocus={handlePhoneFocus}\n />\n </div>\n\n {helperText && <div className={styles.helper}>{helperText}</div>}\n {error && <p className={styles.error}>{error}</p>}\n </div>\n );\n};\n","import React from 'react';\n\n/** Star rating icon shown on `AstrologerPhoto`'s rating pill */\nexport const StarIcon: React.FC = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden>\n <path\n d=\"M8 1.33337L10.06 5.50671L14.6667 6.18004L11.3333 9.42671L12.12 14.0134L8 11.8467L3.88 14.0134L4.66667 9.42671L1.33333 6.18004L5.94 5.50671L8 1.33337Z\"\n fill=\"#F59E0B\"\n stroke=\"#F59E0B\"\n strokeWidth=\"1.2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n/** Filled check-circle shown on a selected `AstrologerCard` */\nexport const CheckCircleIcon: React.FC = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" aria-hidden>\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\"\n fill=\"#F97316\"\n />\n </svg>\n);\n","import React from 'react';\nimport { StarIcon } from './icons';\nimport styles from './AstrologerCard.module.scss';\n\n/** Neutral, dependency-free placeholder avatar (gray circle + person glyph). */\nconst DEFAULT_FALLBACK_PHOTO =\n \"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='64' height='78' viewBox='0 0 64 78'><rect width='64' height='78' fill='%23F3F4F6'/><circle cx='32' cy='30' r='12' fill='%23D1D5DB'/><path d='M12 70c2-14 12-22 20-22s18 8 20 22' fill='%23D1D5DB'/></svg>\";\n\nexport interface AstrologerPhotoProps {\n photoUrl: string;\n name: string;\n rating: number;\n /** Shown when `photoUrl` is empty or fails to load. Defaults to a neutral avatar glyph. */\n fallbackPhotoUrl?: string;\n}\n\nexport const AstrologerPhoto: React.FC<AstrologerPhotoProps> = ({\n photoUrl,\n name,\n rating,\n fallbackPhotoUrl = DEFAULT_FALLBACK_PHOTO,\n}) => (\n <div className={styles.photoWrap}>\n <div className={styles.photoFrame}>\n <img\n src={photoUrl || fallbackPhotoUrl}\n alt={name}\n width={64}\n height={78}\n className={styles.photoImg}\n onError={(event) => {\n (event.target as HTMLImageElement).src = fallbackPhotoUrl;\n }}\n />\n </div>\n <div className={styles.ratingPill}>\n <span className={styles.ratingValue}>{rating}</span>\n <StarIcon />\n </div>\n </div>\n);\n","import React from 'react';\nimport styles from './AstrologerCard.module.scss';\n\nexport interface RecommendedBadgeProps {\n /** Wins over `t(\"planRecommendedAstrologer\")`. */\n label?: string;\n t?: (key: string, options?: any) => string | undefined;\n}\n\nexport const RecommendedBadge: React.FC<RecommendedBadgeProps> = ({ label, t }) => (\n <div className={styles.recommendedBadge}>\n <span className={styles.recommendedLabel}>\n {label ?? t?.('planRecommendedAstrologer') ?? 'Recommended'}\n </span>\n </div>\n);\n","import React from 'react';\nimport type { AstrologerListItem } from './types';\nimport { AstrologerPhoto } from './AstrologerPhoto';\nimport { RecommendedBadge } from './RecommendedBadge';\nimport { CheckCircleIcon } from './icons';\nimport styles from './AstrologerCard.module.scss';\n\nconst cx = (...classNames: (string | false | undefined)[]) =>\n classNames.filter(Boolean).join(' ');\n\n/** e.g. 1200 → \"1.2K consultations\" */\nconst defaultFormatConsultationCount = (count: number): string => {\n if (count >= 1000) {\n const k = count / 1000;\n return `${Number.isInteger(k) ? k : k.toFixed(1)}K consultations`;\n }\n return `${count} consultations`;\n};\n\nexport interface AstrologerCardProps {\n astrologer: AstrologerListItem;\n isSelected?: boolean;\n onClick?: (astrologer: AstrologerListItem) => void;\n /** Passed through to `AstrologerPhoto`. */\n fallbackPhotoUrl?: string;\n formatConsultationCount?: (count: number) => string;\n}\n\nexport const AstrologerCard: React.FC<AstrologerCardProps> = ({\n astrologer,\n isSelected = false,\n onClick,\n fallbackPhotoUrl,\n formatConsultationCount = defaultFormatConsultationCount,\n}) => (\n <button\n type=\"button\"\n onClick={() => onClick?.(astrologer)}\n className={cx(styles.card, isSelected && styles.cardSelected)}\n >\n <AstrologerPhoto\n photoUrl={astrologer.photo_url}\n name={astrologer.name}\n rating={astrologer.rating}\n fallbackPhotoUrl={fallbackPhotoUrl}\n />\n\n <div className={styles.info}>\n <span className={styles.name}>{astrologer.name}</span>\n <div className={styles.meta}>\n <span className={styles.languages}>{astrologer.languages.join(', ')}</span>\n <span className={styles.consultationCount}>\n {formatConsultationCount(astrologer.consultation_count)}\n </span>\n </div>\n </div>\n\n {isSelected && (\n <div className={styles.checkIcon}>\n <CheckCircleIcon />\n </div>\n )}\n\n {astrologer.is_recommended && <RecommendedBadge />}\n </button>\n);\n","/**\n * AstrologerList — horizontally scrollable astrologer picker, extracted from\n * the hanuman app's astro-consultation slot-selection sheet\n * (src/features/epuja/order-details/components/astro-consultation/slot-selection-sheet)\n * so consultation-booking hosts get a real astrologer picker instead of the\n * generic `AstrologyProfilesSection` placeholder.\n *\n * Controlled-optional: pass `selectedAstrologerId` + `onAstrologerSelect` to\n * drive it from the host, or omit them and it manages its own state.\n */\nimport React, { useState } from 'react';\nimport type { AstrologerListItem } from './types';\nimport { AstrologerCard } from './AstrologerCard';\nimport styles from './AstrologerList.module.scss';\n\nconst cx = (...classNames: (string | false | undefined)[]) =>\n classNames.filter(Boolean).join(' ');\n\nexport interface AstrologerListProps {\n astrologers: AstrologerListItem[];\n /** Renders shimmer skeleton cards instead of the astrologer list. */\n loading?: boolean;\n /** Selected astrologer id. Omit to let the component manage it. */\n selectedAstrologerId?: string;\n onAstrologerSelect?: (astrologer: AstrologerListItem) => void;\n /** Section title. Wins over `t(\"planSelectAstrologerHeading\")`. */\n title?: string;\n fallbackPhotoUrl?: string;\n formatConsultationCount?: (count: number) => string;\n /** Translation lookup; every string falls back to the English default. */\n t?: (key: string, options?: any) => string | undefined;\n className?: string;\n}\n\nexport const AstrologerList: React.FC<AstrologerListProps> = ({\n astrologers,\n loading = false,\n selectedAstrologerId,\n onAstrologerSelect,\n title,\n fallbackPhotoUrl,\n formatConsultationCount,\n t,\n className = '',\n}) => {\n const [internalSelectedId, setInternalSelectedId] = useState('');\n const activeId = selectedAstrologerId ?? internalSelectedId;\n\n const handleSelect = (astrologer: AstrologerListItem) => {\n setInternalSelectedId(astrologer.astrologer_id);\n onAstrologerSelect?.(astrologer);\n };\n\n return (\n <section className={cx(styles.section, className)}>\n <p className={styles.title}>\n {title ?? t?.('planSelectAstrologerHeading') ?? 'Select an astrologer'}\n </p>\n\n <div className={styles.row} role=\"radiogroup\" aria-label=\"Astrologer\">\n {loading\n ? Array.from({ length: 2 }).map((_, idx) => (\n <div key={idx} className={cx(styles.skeletonCard, styles.skeletonShimmer)} />\n ))\n : astrologers.map((astrologer) => (\n <AstrologerCard\n key={astrologer.astrologer_id}\n astrologer={astrologer}\n isSelected={astrologer.astrologer_id === activeId}\n onClick={handleSelect}\n fallbackPhotoUrl={fallbackPhotoUrl}\n formatConsultationCount={formatConsultationCount}\n />\n ))}\n </div>\n </section>\n );\n};\n","/** Dummy astrologer data for Storybook / local previews. */\nimport type { AstrologerListItem } from './types';\n\nexport const MOCK_ASTROLOGERS: AstrologerListItem[] = [\n {\n astrologer_id: 'astro-1',\n name: 'Pandit Ramesh Sharma',\n photo_url: '',\n languages: ['Hindi', 'English'],\n rating: 4.8,\n consultation_count: 12500,\n is_recommended: true,\n },\n {\n astrologer_id: 'astro-2',\n name: 'Dr. Anjali Mehta',\n photo_url: '',\n languages: ['English', 'Gujarati'],\n rating: 4.6,\n consultation_count: 870,\n },\n {\n astrologer_id: 'astro-3',\n name: 'Acharya Vivek Joshi',\n photo_url: '',\n languages: ['Hindi', 'Marathi', 'English'],\n rating: 4.9,\n consultation_count: 3400,\n },\n];\n"],"names":["DEFAULT_INITIAL_VISIBLE","MAX_TESTIMONIALS","buildTestimonialsFromTranslations","itemsByIndex","i","quoteKey","quote","authorKey","authorName","v","avatarKey","avatar","maleIndices","femaleIndices","mixed","m","f","idx","item","UserReviewsSection","testimonialsProp","initialVisible","readMoreHref","onReadMore","className","headingClassName","testimonials","useMemo","expanded","setExpanded","useState","hasMore","visibleTestimonials","title","ratingLabel","trustText","readMoreLabel","readLessLabel","jsxs","styles","jsx","index","e","FAQAccordion","items","resolveAnswerKey","defaultOpenIndex","onItemOpen","resolvedItems","qKey","aKey","openIndex","setOpenIndex","isOpen","nextOpen","DEFAULT_LOGO_WIDTH","DEFAULT_LOGO_HEIGHT","PageHeader","logoUrl","ImageComponent","languageSelector","showLanguageSelector","showSlot","brandName","ratingText","FormContainer","children","ariaLabel","BackIcon","FormSectionHeader","subtitle","onBack","backAriaLabel","DEFAULT_SHIELD_ICON","PrivacyBanner","text","iconUrl","DEFAULT_INFO_ICON","FormField","label","id","required","help","infoTooltip","infoAriaLabel","infoIconUrl","infoOpen","setInfoOpen","useEffect","onDoc","onKey","FormTextInput","iconAlt","iconInteractive","onIconClick","rest","ICON_DATE","FormDateInput","value","onChange","inputRef","useRef","maxDate","d","pad","n","handleIconClick","el","ICON_TIME","FormTimeInput","placeholder","disabled","ICON_LOCATION","FormLocationInput","FormSegmentedControl","options","opt","FormTagPills","selected","toggle","key","k","FormCheckboxWithHelp","checked","primaryText","helpText","FormFooterNote","FooterShell","marquee","FooterCTAButton","href","onClick","staticOnly","buttonClass","staticClass","ariaProps","CircularMarquee","MarqueeStrip","ContactUsSection","whatsAppLine","emailLine","formatSlotTime","isoDateTime","match","hour24","minute","period","formatSlotDayLabel","isoDate","referenceDate","dayNames","date","startOfDay","diffDays","dayLabel","CONSULTATION_PERIOD_ORDER","CONSULTATION_LANGUAGE_OPTIONS","CheckIcon","ChevronDownIcon","MorningIcon","AfternoonIcon","EveningIcon","CalendarOffIcon","PhoneNumberSection","countryCode","phoneNumber","helperText","onEdit","t","PLACEHOLDER_PROFILES","AstrologyProfilesSection","profiles","selectedProfileId","onProfileSelect","onAddProfile","internalSelectedId","setInternalSelectedId","activeId","handleSelect","profileId","profile","isSelected","PERIOD_ICONS","PERIOD_LABEL_KEYS","cx","classNames","ConsultationSlotSelector","days","loading","error","onRetry","selectedDate","onDateSelect","selectedPeriod","onPeriodSelect","selectedSlotStart","onSlotSelect","hideLanguageSelector","languageOptions","selectedLanguage","onLanguageSelect","showPhoneNumberSection","phoneNumberSection","showAstrologyProfilesSection","astrologyProfilesSection","heading","languageLabel","reportReadyNote","isGlobal","availableDays","internalDate","setInternalDate","activeDate","candidate","activeDay","periodsForActiveDay","present","s","p","internalPeriod","setInternalPeriod","activePeriod","slotsForActivePeriod","internalSlotStart","setInternalSlotStart","activeSlotStart","internalLanguage","setInternalLanguage","activeLanguage","activeLanguageOption","option","isLanguageMenuOpen","setIsLanguageMenuOpen","languageMenuRef","handleClickOutside","event","dateTabsRef","dateTabRefs","dateIndicatorRect","setDateIndicatorRect","periodTabsRef","periodTabRefs","periodIndicatorRect","setPeriodIndicatorRect","measure","container","activeTab","containerRect","tabRect","handleDateSelect","handlePeriodSelect","handleSlotSelect","slot","handleLanguageSelect","code","Fragment","prev","_","day","dayNum","Icon","isEveningNight","labelKey","OFFSET","toIsoDate","month","makeSlot","hour","endMinute","endHour","SLOT_TIMES","buildDay","dayOffset","periods","slots","MOCK_SLOT_DAYS","MOCK_SLOT_DAYS_EMPTY","DEFAULT_COUNTRIES","getFlagEmoji","iso","codePoints","char","PHONE_PATTERNS","DEFAULT_PATTERN","validatePhoneByCountryCode","validation","getMaxLengthForCountry","usePhoneNumberInput","contactNumber","countries","onCountryCodeChange","onPhoneNumberChange","onValidationChange","onDropdownFocus","onInputFocus","isDropdownOpen","setIsDropdownOpen","selectedCountry","c","maxLength","handleCountrySelect","useCallback","country","isValid","handlePhoneChange","trimmedValue","handleDropdownToggle","handlePhoneFocus","PhoneNumberInput","getFlagUrl","internalCountryCode","setInternalCountryCode","internalNumber","setInternalNumber","activeCountryCode","activeNumber","dropdownRef","closeDropdown","name","renderFlag","alt","flagUrl","StarIcon","CheckCircleIcon","DEFAULT_FALLBACK_PHOTO","AstrologerPhoto","photoUrl","rating","fallbackPhotoUrl","RecommendedBadge","defaultFormatConsultationCount","count","AstrologerCard","astrologer","formatConsultationCount","AstrologerList","astrologers","selectedAstrologerId","onAstrologerSelect","MOCK_ASTROLOGERS"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/components/UserReviewsSection/UserReviewsSection.tsx","../src/components/FAQAccordion/FAQAccordion.tsx","../src/components/PageHeader/PageHeader.tsx","../src/components/FormContainer/FormContainer.tsx","../src/components/FormSectionHeader/FormSectionHeader.tsx","../src/components/PrivacyBanner/PrivacyBanner.tsx","../src/components/FormField/FormField.tsx","../src/components/FormTextInput/FormTextInput.tsx","../src/components/FormDateInput/FormDateInput.tsx","../src/components/FormTimeInput/FormTimeInput.tsx","../src/components/FormLocationInput/FormLocationInput.tsx","../src/components/FormSegmentedControl/FormSegmentedControl.tsx","../src/components/FormTagPills/FormTagPills.tsx","../src/components/FormCheckboxWithHelp/FormCheckboxWithHelp.tsx","../src/components/FormFooterNote/FormFooterNote.tsx","../src/components/FooterShell/FooterShell.tsx","../src/components/FooterShell/FooterCTAButton.tsx","../src/components/CircularMarquee/CircularMarquee.tsx","../src/components/MarqueeStrip/MarqueeStrip.tsx","../src/components/ContactUsSection/ContactUsSection.tsx","../src/components/ConsultationSlotSelector/slotUtils.ts","../src/components/ConsultationSlotSelector/SlotIcons.tsx","../src/components/ConsultationSlotSelector/PhoneNumberSection.tsx","../src/components/ConsultationSlotSelector/AstrologyProfilesSection.tsx","../src/components/ConsultationSlotSelector/ConsultationSlotSelector.tsx","../src/components/ConsultationSlotSelector/mockSlots.ts","../src/components/PhoneNumberInput/icons.tsx","../src/components/PhoneNumberInput/countries.ts","../src/utils/phoneValidation.ts","../src/components/PhoneNumberInput/usePhoneNumberInput.ts","../src/components/PhoneNumberInput/PhoneNumberInput.tsx","../src/components/Consultations/icons.tsx","../src/components/Consultations/AstrologerPhoto.tsx","../src/components/Consultations/RecommendedBadge.tsx","../src/components/Consultations/AstrologerCard.tsx","../src/components/Consultations/AstrologerList.tsx","../src/components/Consultations/mockAstrologers.ts"],"sourcesContent":["import { useState, useMemo } from 'react';\nimport styles from './UserReviewsSection.module.scss';\n\nconst DEFAULT_INITIAL_VISIBLE = 3;\nconst MAX_TESTIMONIALS = 15;\n\nexport interface Testimonial {\n quote: string;\n authorName: string;\n authorAvatarUrl?: string;\n rating?: number;\n}\n\nfunction buildTestimonialsFromTranslations(\n t: (key: string) => string\n): Testimonial[] {\n const itemsByIndex = new Map<number, Testimonial>();\n\n for (let i = 1; i <= MAX_TESTIMONIALS; i += 1) {\n const quoteKey = `feedbackTestimonial${i}`;\n const quote = t(quoteKey);\n if (!quote || quote === quoteKey) continue;\n\n const authorKey = `feedbackAuthor${i}`;\n const authorName = (() => {\n const v = t(authorKey);\n return v && v !== authorKey ? v : t('guest');\n })();\n\n const avatarKey = `feedbackAuthor${i}AvatarUrl`;\n const avatar = (() => {\n const v = t(avatarKey);\n return v && v !== avatarKey ? v : undefined;\n })();\n\n itemsByIndex.set(i, {\n quote,\n authorName,\n authorAvatarUrl: avatar,\n rating: 5,\n });\n }\n\n const maleIndices: number[] = [];\n const femaleIndices: number[] = [];\n for (let i = 1; i <= MAX_TESTIMONIALS; i += 1) {\n if (i >= 9) femaleIndices.push(i);\n else maleIndices.push(i);\n }\n\n const mixed: Testimonial[] = [];\n let m = 0;\n let f = 0;\n while (m < maleIndices.length || f < femaleIndices.length) {\n if (f < femaleIndices.length) {\n const idx = femaleIndices[f++];\n const item = itemsByIndex.get(idx);\n if (item) mixed.push(item);\n }\n if (m < maleIndices.length) {\n const idx = maleIndices[m++];\n const item = itemsByIndex.get(idx);\n if (item) mixed.push(item);\n }\n }\n\n return mixed;\n}\n\nexport interface UserReviewsSectionProps {\n /** Translation function; uses keys: feedbackTitle, feedbackRating, feedbackTrust, readMoreReviews, readLess, feedbackTestimonial1-15, feedbackAuthor1-15, guest */\n t: (key: string) => string;\n /** Override testimonials; if not set, built from t() */\n testimonials?: Testimonial[];\n /** Initial number of reviews to show before \"Read more\" */\n initialVisible?: number;\n /** If set, \"Read more\" renders as external link */\n readMoreHref?: string;\n onReadMore?: () => void;\n className?: string;\n /** Optional class name for the section heading (e.g. to use bold in one app and semibold in another) */\n headingClassName?: string;\n}\n\nexport function UserReviewsSection({\n t,\n testimonials: testimonialsProp,\n initialVisible = DEFAULT_INITIAL_VISIBLE,\n readMoreHref,\n onReadMore,\n className = '',\n headingClassName,\n}: UserReviewsSectionProps) {\n const testimonials =\n testimonialsProp ??\n useMemo(() => buildTestimonialsFromTranslations(t), [t]);\n\n const [expanded, setExpanded] = useState(false);\n const hasMore = testimonials.length > initialVisible;\n const visibleTestimonials =\n hasMore && !expanded ? testimonials.slice(0, initialVisible) : testimonials;\n\n const title = t('feedbackTitle');\n const ratingLabel = t('feedbackRating');\n const trustText = t('feedbackTrust');\n const readMoreLabel = t('readMoreReviews');\n const readLessLabel = t('readLess');\n\n return (\n <section\n className={`${styles.section} ${className}`}\n aria-labelledby=\"reviews-heading\"\n > \n <h2\n id=\"reviews-heading\"\n className={[styles.heading, headingClassName].filter(Boolean).join(' ')}\n >\n {title}\n </h2>\n <p className={styles.trustLine}>\n <span className={styles.star} aria-hidden>\n ★\n </span>\n <span className={styles.ratingNum}>{ratingLabel}</span>\n <span className={styles.dot} aria-hidden />\n <span className={styles.trustText}>{trustText}</span>\n </p>\n <ul className={styles.cardList}>\n {visibleTestimonials.map((item, index) => (\n <li key={index} className={styles.card}>\n <p className={styles.quote}>{item.quote}</p>\n <div className={styles.author}>\n {item.authorAvatarUrl ? (\n <img\n src={item.authorAvatarUrl}\n alt=\"\"\n className={styles.avatar}\n width={40}\n height={40}\n />\n ) : (\n <div className={styles.avatarPlaceholder} aria-hidden />\n )}\n <div className={styles.authorInfo}>\n <span className={styles.authorName}>{item.authorName}</span>\n <span className={styles.stars} aria-hidden>\n {'★'.repeat(item.rating ?? 5)}\n </span>\n </div>\n </div>\n </li>\n ))}\n </ul>\n {hasMore && (\n <div className={styles.readMoreWrap}>\n <button\n type=\"button\"\n className={styles.toggleBtn}\n onClick={() => setExpanded((e) => !e)}\n aria-expanded={expanded}\n >\n {expanded ? readLessLabel : readMoreLabel}\n <span className={styles.arrow} aria-hidden>\n ›\n </span>\n </button>\n </div>\n )}\n {(readMoreHref || onReadMore) && !hasMore && (\n <div className={styles.readMoreWrap}>\n {readMoreHref ? (\n <a\n href={readMoreHref}\n className={styles.readMore}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {readMoreLabel}\n <span className={styles.arrow} aria-hidden>\n ›\n </span>\n </a>\n ) : (\n <button\n type=\"button\"\n className={styles.readMore}\n onClick={() => onReadMore?.()}\n >\n {readMoreLabel}\n <span className={styles.arrow} aria-hidden>\n ›\n </span>\n </button>\n )}\n </div>\n )}\n </section>\n );\n}\n","import { useState, useMemo } from 'react';\nimport styles from './FAQAccordion.module.scss';\n\nexport interface FAQItemKey {\n qKey: string;\n aKey: string;\n}\n\nexport interface FAQAccordionProps {\n /** Translation function; uses keys: faqTitle, and item qKey/aKey (or resolved answer key) */\n t: (key: string) => string;\n /** List of Q&A item keys (translation keys for question and answer) */\n items: FAQItemKey[];\n /** Optional: map answer key to another key (e.g. faqA1 -> faqA1Global) */\n resolveAnswerKey?: (aKey: string) => string;\n /** Index of the item to open by default (-1 = none) */\n defaultOpenIndex?: number;\n /** Called when an item is expanded; receives the question text */\n onItemOpen?: (questionText: string) => void;\n className?: string;\n /** Optional class name for the section heading (e.g. to use bold in one app and semibold in another) */\n headingClassName?: string;\n}\n\nexport function FAQAccordion({\n t,\n items,\n resolveAnswerKey,\n defaultOpenIndex = 0,\n onItemOpen,\n className = '',\n headingClassName,\n}: FAQAccordionProps) {\n const resolvedItems = useMemo(\n () =>\n items.map(({ qKey, aKey }) => ({\n question: t(qKey),\n answer: t(resolveAnswerKey ? resolveAnswerKey(aKey) : aKey),\n })),\n [t, items, resolveAnswerKey]\n );\n\n const [openIndex, setOpenIndex] = useState<number>(defaultOpenIndex);\n const title = t('faqTitle');\n\n return (\n <section\n className={`${styles.section} ${className}`}\n aria-labelledby=\"faq-heading\"\n >\n <h2\n id=\"faq-heading\"\n className={[styles.heading, headingClassName].filter(Boolean).join(' ')}\n >\n {title}\n </h2>\n <div className={styles.accordion} role=\"list\">\n {resolvedItems.map((item, index) => {\n const isOpen = openIndex === index;\n return (\n <div\n key={index}\n className={`${styles.item} ${isOpen ? styles.itemOpen : ''}`}\n role=\"listitem\"\n >\n <button\n type=\"button\"\n className={styles.question}\n onClick={() => {\n const nextOpen = !isOpen;\n setOpenIndex(isOpen ? -1 : index);\n if (nextOpen) onItemOpen?.(item.question);\n }}\n aria-expanded={isOpen}\n aria-controls={`faq-answer-${index}`}\n id={`faq-question-${index}`}\n >\n <span>{item.question}</span>\n <span\n className={`${styles.chevron} ${isOpen ? styles.chevronOpen : ''}`}\n aria-hidden\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n aria-hidden\n focusable=\"false\"\n >\n <path\n d=\"M5.8 8.3a1 1 0 0 1 1.4 0L10 11.09l2.8-2.8a1 1 0 1 1 1.4 1.42l-3.5 3.5a1 1 0 0 1-1.4 0l-3.5-3.5A1 1 0 0 1 5.8 8.3z\"\n fill=\"currentColor\"\n />\n </svg>\n </span>\n </button>\n <div\n id={`faq-answer-${index}`}\n role=\"region\"\n aria-labelledby={`faq-question-${index}`}\n className={`${styles.answerWrap} ${isOpen ? styles.answerOpen : ''}`}\n hidden={!isOpen}\n >\n <p className={styles.answer}>{item.answer}</p>\n </div>\n </div>\n );\n })}\n </div>\n </section>\n );\n}\n","import type { ReactNode } from 'react';\nimport styles from './PageHeader.module.scss';\n\n/** Minimal image component props for optional optimized logo (e.g. next/image). */\nexport interface PageHeaderImageProps {\n src: string;\n alt: string;\n width?: number;\n height?: number;\n className?: string;\n}\n\nexport interface PageHeaderProps {\n /** Translation function; uses keys: sriMandir, ratingText */\n t: (key: string) => string;\n /** Logo image URL; if not set, a placeholder is shown */\n logoUrl?: string;\n /** Optional image component for logo (e.g. next/image adapter) */\n imageComponent?: React.ComponentType<PageHeaderImageProps>;\n /** Optional slot for language selector or other header actions */\n languageSelector?: ReactNode;\n /** Whether to show the languageSelector slot */\n showLanguageSelector?: boolean;\n className?: string;\n}\n\nconst DEFAULT_LOGO_WIDTH = 120;\nconst DEFAULT_LOGO_HEIGHT = 40;\n\nexport function PageHeader({\n t,\n logoUrl,\n imageComponent: ImageComponent,\n languageSelector,\n showLanguageSelector = true,\n className = '',\n}: PageHeaderProps) {\n const showSlot = showLanguageSelector && languageSelector != null;\n const brandName = t('sriMandir');\n const ratingText = t('ratingText');\n\n return (\n <header className={`${styles.header} ${className}`}>\n <div className={styles.brand}>\n <div className={styles.logo}>\n {logoUrl ? (\n ImageComponent ? (\n <ImageComponent\n src={logoUrl}\n alt={brandName}\n className={styles.logoImg}\n width={DEFAULT_LOGO_WIDTH}\n height={DEFAULT_LOGO_HEIGHT}\n />\n ) : (\n <img\n src={logoUrl}\n alt={brandName}\n className={styles.logoImg}\n width={DEFAULT_LOGO_WIDTH}\n height={DEFAULT_LOGO_HEIGHT}\n decoding=\"async\"\n />\n )\n ) : (\n <div className={styles.logoPlaceholder} aria-hidden />\n )}\n </div>\n <div className={styles.brandText}>\n <span className={styles.brandName}>{brandName}</span>\n {ratingText != null && ratingText !== '' && (\n <span className={styles.rating}>\n {ratingText}\n </span>\n )}\n </div>\n </div>\n {showSlot && <div className={styles.langSlot}>{languageSelector}</div>}\n </header>\n );\n}\n","import type { ReactNode } from 'react';\nimport styles from './FormContainer.module.scss';\n\nexport interface FormContainerProps {\n /** Form content (e.g. PrivacyBanner + FormSectionHeader + form fields) */\n children: ReactNode;\n className?: string;\n /** Accessibility label for the section */\n 'aria-label'?: string;\n}\n\nexport function FormContainer({\n children,\n className = '',\n 'aria-label': ariaLabel,\n}: FormContainerProps) {\n return (\n <section\n className={`${styles.wrap} ${className}`}\n aria-label={ariaLabel}\n >\n <div className={styles.card}>\n <div className={styles.cardInner}>{children}</div>\n </div>\n </section>\n );\n}\n","import type { ReactNode } from 'react';\nimport styles from './FormSectionHeader.module.scss';\n\nconst BackIcon = () => (\n <svg\n className={styles.backIcon}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden\n >\n <path\n d=\"M15 18l-6-6 6-6\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nexport interface FormSectionHeaderProps {\n /** Form title */\n title: string;\n /** Optional subtitle below title */\n subtitle?: string;\n /** Optional back button; when provided, back button is shown and this is the aria-label */\n onBack?: () => void;\n backAriaLabel?: string;\n className?: string;\n}\n\nexport function FormSectionHeader({\n title,\n subtitle,\n onBack,\n backAriaLabel = 'Back',\n className = '',\n}: FormSectionHeaderProps) {\n return (\n <header className={`${styles.header} ${className}`}>\n <div className={styles.left}>\n {onBack != null && (\n <button\n type=\"button\"\n className={styles.backBtn}\n onClick={onBack}\n aria-label={backAriaLabel}\n >\n <BackIcon />\n </button>\n )}\n <div className={styles.titleWrap}>\n <h1 className={styles.title}>{title}</h1>\n {subtitle != null && subtitle !== '' && (\n <p className={styles.subtitle}>{subtitle}</p>\n )}\n </div>\n </div>\n </header>\n );\n}\n","import styles from './PrivacyBanner.module.scss';\n\nconst DEFAULT_SHIELD_ICON =\n 'https://srm-cdn.a4b.io/yoda/1770707793537.svg';\n\nexport interface PrivacyBannerProps {\n /** Text to show (e.g. \"100% Private & Secure\") */\n text: string;\n /** Optional shield icon URL */\n iconUrl?: string;\n className?: string;\n}\n\nexport function PrivacyBanner({\n text,\n iconUrl = DEFAULT_SHIELD_ICON,\n className = '',\n}: PrivacyBannerProps) {\n return (\n <div className={`${styles.banner} ${className}`} role=\"status\">\n <span className={styles.text}> <img\n src={iconUrl}\n alt=\"\"\n className={styles.icon}\n width={18}\n height={18}\n aria-hidden\n /> {text}</span>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport { useState, useEffect } from 'react';\nimport styles from './FormField.module.scss';\n\nconst DEFAULT_INFO_ICON = 'https://srm-cdn.a4b.io/yoda/1770372066357.svg';\n\nexport interface FormFieldProps {\n /** Field label (e.g. \"Enter Your Name\") */\n label: string;\n /** HTML id for the control (for label association) */\n id: string;\n /** Whether to show required asterisk */\n required?: boolean;\n /** Optional help text below label, above input */\n help?: string;\n /** Optional info tooltip text; when set, shows (i) icon that toggles tooltip */\n infoTooltip?: string;\n infoAriaLabel?: string;\n /** Icon URL for info button (default: common info icon) */\n infoIconUrl?: string;\n /** Control content (input, etc.) */\n children: ReactNode;\n className?: string;\n}\n\nexport function FormField({\n label,\n id,\n required = false,\n help,\n infoTooltip,\n infoAriaLabel = 'Info',\n infoIconUrl = DEFAULT_INFO_ICON,\n children,\n className = '',\n}: FormFieldProps) {\n const [infoOpen, setInfoOpen] = useState(false);\n\n useEffect(() => {\n if (!infoTooltip) return;\n const onDoc = (e: MouseEvent) => {\n const t = e.target as HTMLElement | null;\n if (t?.closest?.('[data-info-tooltip]') != null) return;\n setInfoOpen(false);\n };\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') setInfoOpen(false);\n };\n document.addEventListener('mousedown', onDoc);\n document.addEventListener('keydown', onKey);\n return () => {\n document.removeEventListener('mousedown', onDoc);\n document.removeEventListener('keydown', onKey);\n };\n }, [infoTooltip]);\n\n return (\n <div className={`${styles.field} ${className}`}>\n <div className={styles.labelRow}>\n <label className={styles.label} htmlFor={id}>\n {label}\n {required && <span className={styles.req}>*</span>}\n </label>\n {infoTooltip != null && infoTooltip !== '' && (\n <div className={styles.infoWrap} data-info-tooltip>\n <button\n type=\"button\"\n className={styles.infoBtn}\n aria-label={infoAriaLabel}\n aria-expanded={infoOpen}\n onClick={() => setInfoOpen((v) => !v)}\n >\n <img\n className={styles.infoImg}\n src={infoIconUrl}\n alt=\"\"\n aria-hidden\n />\n </button>\n {infoOpen && (\n <div className={styles.tooltip} role=\"tooltip\">\n {infoTooltip}\n <span className={styles.tooltipArrow} aria-hidden />\n </div>\n )}\n </div>\n )}\n </div>\n {help != null && help !== '' && (\n <div className={styles.help}>{help}</div>\n )}\n <div className={styles.inputWrap}>{children}</div>\n </div>\n );\n}\n","import type { InputHTMLAttributes } from 'react';\nimport styles from './FormTextInput.module.scss';\n\nexport interface FormTextInputProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, 'className'> {\n id: string;\n /** Optional icon URL on the right (e.g. location pin) */\n iconUrl?: string;\n iconAlt?: string;\n /** If true, icon is clickable (e.g. open picker) */\n iconInteractive?: boolean;\n onIconClick?: () => void;\n className?: string;\n}\n\nexport function FormTextInput({\n id,\n iconUrl,\n iconAlt = '',\n iconInteractive = false,\n onIconClick,\n className = '',\n ...rest\n}: FormTextInputProps) {\n return (\n <div className={`${styles.wrap} ${className}`}>\n <input\n {...rest}\n id={id}\n className={styles.input}\n type={rest.type ?? 'text'}\n />\n {iconUrl != null && (\n <button\n type=\"button\"\n className={\n iconInteractive\n ? `${styles.iconBtn} ${styles.iconBtnInteractive}`\n : styles.iconBtn\n }\n aria-label={iconAlt || undefined}\n onClick={iconInteractive ? onIconClick : undefined}\n tabIndex={iconInteractive ? 0 : -1}\n >\n <img\n className={styles.iconImg}\n src={iconUrl}\n alt=\"\"\n aria-hidden\n width={22}\n height={22}\n />\n </button>\n )}\n </div>\n );\n}\n","import type { InputHTMLAttributes } from 'react';\nimport { useRef, useMemo } from 'react';\nimport styles from './FormDateInput.module.scss';\n\nconst ICON_DATE = 'https://srm-cdn.a4b.io/yoda/1770372045894.svg';\n\nexport interface FormDateInputProps\n extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n 'type' | 'className' | 'value' | 'onChange'\n > {\n id: string;\n value: string;\n onChange: (value: string) => void;\n /** Optional: open native picker when icon clicked */\n onIconClick?: () => void;\n className?: string;\n}\n\nexport function FormDateInput({\n id,\n value,\n onChange,\n onIconClick,\n className = '',\n ...rest\n}: FormDateInputProps) {\n const inputRef = useRef<HTMLInputElement>(null);\n const maxDate = useMemo(() => {\n const d = new Date();\n const pad = (n: number) => String(n).padStart(2, '0');\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;\n }, []);\n\n const handleIconClick = () => {\n if (onIconClick) {\n onIconClick();\n return;\n }\n const el = inputRef.current;\n if (\n el &&\n typeof (el as HTMLInputElement & { showPicker?: () => void })\n .showPicker === 'function'\n ) {\n (el as HTMLInputElement & { showPicker: () => void }).showPicker();\n } else {\n el?.focus();\n }\n };\n\n return (\n <div className={`${styles.wrap} ${className}`}>\n <input\n {...rest}\n ref={inputRef}\n id={id}\n type=\"date\"\n className={styles.input}\n value={value}\n max={maxDate}\n onChange={(e) => onChange(e.target.value)}\n />\n <button\n type=\"button\"\n className={`${styles.iconBtn}`}\n aria-label=\"Open date picker\"\n onMouseDown={(e) => e.preventDefault()}\n onClick={(e) => {\n e.preventDefault();\n handleIconClick();\n }}\n >\n <img\n className={styles.iconImg}\n src={ICON_DATE}\n alt=\"\"\n aria-hidden\n width={22}\n height={22}\n />\n </button>\n </div>\n );\n}\n","import styles from './FormTimeInput.module.scss';\n\nconst ICON_TIME = 'https://srm-cdn.a4b.io/yoda/1770372014782.svg';\n\nexport interface FormTimeInputProps {\n id: string;\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n disabled?: boolean;\n onIconClick?: () => void;\n className?: string;\n}\n\nexport function FormTimeInput({\n id,\n value,\n onChange,\n placeholder = 'HH:MM AM',\n disabled = false,\n onIconClick,\n className = '',\n}: FormTimeInputProps) {\n return (\n <div className={`${styles.wrap} ${className}`}>\n <input\n id={id}\n type=\"time\"\n className={styles.input}\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder}\n disabled={disabled}\n onClick={() => !disabled && onIconClick?.()}\n />\n <button\n type=\"button\"\n className={styles.iconBtn}\n aria-label=\"Open time picker\"\n disabled={disabled}\n onClick={(e) => {\n e.preventDefault();\n if (!disabled) onIconClick?.();\n }}\n >\n <img\n className={styles.iconImg}\n src={ICON_TIME}\n alt=\"\"\n aria-hidden\n width={22}\n height={22}\n />\n </button>\n </div>\n );\n}\n","import type { InputHTMLAttributes } from 'react';\nimport styles from './FormLocationInput.module.scss';\n\nconst ICON_LOCATION = 'https://srm-cdn.a4b.io/yoda/1770372031092.svg';\n\nexport interface FormLocationInputProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, 'className'> {\n id: string;\n iconUrl?: string;\n className?: string;\n}\n\nexport function FormLocationInput({\n id,\n iconUrl = ICON_LOCATION,\n className = '',\n ...rest\n}: FormLocationInputProps) {\n return (\n <div className={`${styles.wrap} ${className}`}>\n <input {...rest} id={id} className={styles.input} type=\"text\" />\n <div className={styles.iconBtn} aria-hidden>\n <img\n className={styles.iconImg}\n src={iconUrl}\n alt=\"\"\n width={22}\n height={22}\n />\n </div>\n </div>\n );\n}\n","import styles from './FormSegmentedControl.module.scss';\n\nexport interface SegmentedOption {\n value: string;\n label: string;\n}\n\nexport interface FormSegmentedControlProps {\n id: string;\n options: SegmentedOption[];\n value: string;\n onChange: (value: string) => void;\n className?: string;\n}\n\nexport function FormSegmentedControl({\n id,\n options,\n value,\n onChange,\n className = '',\n}: FormSegmentedControlProps) {\n return (\n <div\n className={`${styles.segmented} ${className}`}\n role=\"group\"\n aria-labelledby={`${id}-label`}\n >\n {options.map((opt) => (\n <button\n key={opt.value}\n type=\"button\"\n id={opt.value === value ? id : undefined}\n className={`${styles.segmentedOption} ${opt.value === value ? styles.active : ''}`}\n onClick={() => onChange(opt.value)}\n >\n {opt.label}\n </button>\n ))}\n </div>\n );\n}\n","import styles from './FormTagPills.module.scss';\n\nexport interface FormTagPillsProps {\n id: string;\n options: { key: string; label: string }[];\n selected: string[];\n onChange: (selected: string[]) => void;\n className?: string;\n}\n\nexport function FormTagPills({\n id,\n options,\n selected,\n onChange,\n className = '',\n}: FormTagPillsProps) {\n const toggle = (key: string) => {\n if (selected.includes(key)) {\n onChange(selected.filter((k) => k !== key));\n } else {\n onChange([...selected, key]);\n }\n };\n\n return (\n <div\n className={`${styles.pillsWrap} ${className}`}\n role=\"group\"\n aria-labelledby={`${id}-label`}\n >\n {options.map((opt) => (\n <button\n key={opt.key}\n type=\"button\"\n className={`${styles.pill} ${selected.includes(opt.key) ? styles.selected : ''}`}\n onClick={() => toggle(opt.key)}\n >\n {opt.label}\n </button>\n ))}\n </div>\n );\n}\n","import styles from './FormCheckboxWithHelp.module.scss';\n\nexport interface FormCheckboxWithHelpProps {\n id: string;\n checked: boolean;\n onChange: (checked: boolean) => void;\n primaryText: string;\n helpText?: string;\n className?: string;\n}\n\nexport function FormCheckboxWithHelp({\n id,\n checked,\n onChange,\n primaryText,\n helpText,\n className = '',\n}: FormCheckboxWithHelpProps) {\n return (\n <div className={`${styles.wrapper} ${className}`}>\n <div className={styles.checkboxRow}>\n <input\n id={id}\n type=\"checkbox\"\n className={styles.checkbox}\n checked={checked}\n onChange={(e) => onChange(e.target.checked)}\n />\n <label htmlFor={id} className={styles.checkboxText}>\n {primaryText}\n </label>\n </div>\n {helpText != null && helpText !== '' && (\n <p className={styles.checkboxHelp}>{helpText}</p>\n )}\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport styles from './FormFooterNote.module.scss';\n\nexport interface FormFooterNoteProps {\n children: ReactNode;\n className?: string;\n}\n\nexport function FormFooterNote({\n children,\n className = '',\n}: FormFooterNoteProps) {\n return <p className={`${styles.footerNote} ${className}`}>{children}</p>;\n}\n","import type { ReactNode } from 'react';\nimport styles from './FooterShell.module.scss';\n\nexport interface FooterShellProps {\n /** Optional circular marquee content (e.g. badges). When provided, marquee is shown. */\n marquee?: ReactNode;\n /** Main footer content (e.g. CTA button or static text) */\n children: ReactNode;\n className?: string;\n}\n\nexport function FooterShell({\n marquee,\n children,\n className = '',\n}: FooterShellProps) {\n return (\n <footer className={`${styles.footer} ${className}`} role=\"contentinfo\">\n <div className={styles.inner}>\n {marquee != null && (\n <div className={styles.badges} aria-hidden>\n {marquee}\n </div>\n )}\n <div className={styles.ctaWrap}>{children}</div>\n </div>\n </footer>\n );\n}\n","import type { ReactNode } from 'react';\nimport styles from './FooterShell.module.scss';\n\nexport interface FooterCTAButtonProps {\n /** Button/link content */\n children: ReactNode;\n /** When set, renders an anchor instead of a button */\n href?: string;\n /** Disabled state; for anchor uses aria-disabled and preventDefault on click */\n disabled?: boolean;\n /** Click handler (used when href is not set) */\n onClick?: (e: React.MouseEvent<HTMLElement>) => void;\n /** When true, render as static div (no button/link) - for \"display only\" CTA like \"Check My Dosha for FREE\" */\n static?: boolean;\n className?: string;\n 'aria-label'?: string;\n}\n\nexport function FooterCTAButton({\n children,\n href,\n disabled = false,\n onClick,\n static: staticOnly = false,\n className = '',\n 'aria-label': ariaLabel,\n}: FooterCTAButtonProps) {\n const buttonClass = `${styles.ctaButton} ${className}`.trim();\n const staticClass = `${styles.ctaStatic} ${className}`.trim();\n const ariaProps = ariaLabel != null ? { 'aria-label': ariaLabel } : {};\n\n if (staticOnly) {\n return (\n <div className={staticClass} role=\"presentation\">\n {children}\n </div>\n );\n }\n\n if (href != null) {\n return (\n <a\n href={href}\n className={buttonClass}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-disabled={disabled}\n onClick={(e) => disabled && e.preventDefault()}\n {...ariaProps}\n >\n {children}\n </a>\n );\n }\n\n return (\n <button\n type=\"button\"\n className={buttonClass}\n disabled={disabled}\n onClick={onClick}\n {...ariaProps}\n >\n {children}\n </button>\n );\n}\n","import type { ReactNode } from 'react';\nimport styles from './CircularMarquee.module.scss';\n\nexport interface CircularMarqueeProps {\n /** Content to scroll (will be duplicated for seamless loop). Use same structure in both places (e.g. a single row of badges). */\n children: ReactNode;\n /** Optional class name for the wrapper */\n className?: string;\n}\n\n/**\n * Horizontal infinite marquee. Duplicates children so the loop is seamless.\n * Use for trust badges, labels, etc. under header or in footer.\n */\nexport function CircularMarquee({ children, className = '' }: CircularMarqueeProps) {\n return (\n <div className={`${styles.wrapper} ${className}`} aria-hidden>\n <div className={styles.track}>\n {children}\n {children}\n </div>\n </div>\n );\n}\n","import type { ReactNode } from 'react';\nimport { CircularMarquee } from '../CircularMarquee/CircularMarquee';\nimport styles from './MarqueeStrip.module.scss';\n\nexport interface MarqueeStripProps {\n /** Content to scroll in the marquee (e.g. a row of badges). Pass a single row; it will be duplicated for the loop. */\n children: ReactNode;\n className?: string;\n}\n\n/**\n * Horizontal bar (e.g. under the header) with the same circular marquee as the footer.\n * Renders a strip with background and border, and CircularMarquee inside.\n */\nexport function MarqueeStrip({ children, className = '' }: MarqueeStripProps) {\n return (\n <div className={`${styles.strip} ${className}`} role=\"region\" aria-label=\"Trust badges\">\n <CircularMarquee>{children}</CircularMarquee>\n </div>\n );\n}\n","import styles from './ContactUsSection.module.scss';\n\nexport interface ContactUsSectionProps {\n /** Section heading (e.g. \"Contact Us\") */\n title: string;\n /** Brand or company name line */\n brandName: string;\n /** WhatsApp contact line (e.g. \"Whatsapp: 8296947757\") */\n whatsAppLine: string;\n /** Email contact line (e.g. \"Email: support@example.com\") */\n emailLine: string;\n className?: string;\n}\n\n/**\n * Generic \"Contact Us\" section: title + brand name + WhatsApp + email.\n * Pass pre-resolved strings so each app can use its own t() and config.\n */\nexport function ContactUsSection({\n title,\n brandName,\n whatsAppLine,\n emailLine,\n className = '',\n}: ContactUsSectionProps) {\n return (\n <section className={`${styles.section} ${className}`} aria-labelledby=\"contact-heading\">\n <h2 id=\"contact-heading\" className={styles.heading}>\n {title}\n </h2>\n <div className={styles.content}>\n <p className={styles.brandName}>{brandName}</p>\n <p className={styles.line}>{whatsAppLine}</p>\n <p className={styles.line}>{emailLine}</p>\n </div>\n </section>\n );\n}\n","import type {\n ConsultationLanguageOption,\n ConsultationSlotDateLabel,\n ConsultationSlotPeriod,\n} from './types';\n\n/**\n * Formats an ISO datetime (e.g. \"2026-08-03T09:00:00+05:30\") into a short\n * label like \"9:00 AM\". Reads the hour/minute directly off the string\n * instead of going through `Date`, so the slot shows the exact wall-clock\n * time the backend sent rather than being reinterpreted in the browser's\n * local timezone.\n */\nexport const formatSlotTime = (isoDateTime: string): string => {\n const match = isoDateTime.match(/T(\\d{2}):(\\d{2})/);\n if (!match) return isoDateTime;\n const hour24 = Number(match[1]);\n const minute = match[2];\n const period = hour24 >= 12 ? 'PM' : 'AM';\n const hour12 = hour24 % 12 || 12;\n return `${hour12}:${minute} ${period}`;\n};\n\n/** Builds a short day-tab label (\"Today\" / \"Tomorrow\" / weekday) + day number for a \"yyyy-MM-dd\" date string. */\nexport const formatSlotDayLabel = (\n isoDate: string,\n referenceDate: Date = new Date()\n): ConsultationSlotDateLabel => {\n const dayNames = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n const date = new Date(`${isoDate}T00:00:00`);\n if (Number.isNaN(date.getTime())) {\n return { id: isoDate, dayLabel: isoDate, dayNum: '' };\n }\n\n const startOfDay = (d: Date) =>\n new Date(d.getFullYear(), d.getMonth(), d.getDate()).getTime();\n const diffDays = Math.round(\n (startOfDay(date) - startOfDay(referenceDate)) / (1000 * 60 * 60 * 24)\n );\n\n const dayLabel =\n diffDays === 0 ? 'Today' : diffDays === 1 ? 'Tomorrow' : dayNames[date.getDay()];\n\n return { id: isoDate, dayLabel, dayNum: String(date.getDate()) };\n};\n\nexport const CONSULTATION_PERIOD_ORDER: ConsultationSlotPeriod[] = [\n 'morning',\n 'afternoon',\n 'evening',\n];\n\n/**\n * Default consultation-language dropdown options. Host apps can pass their\n * own list through the `languageOptions` prop — `labelKey` resolves via the\n * `t` prop and falls back to `label`.\n */\nexport const CONSULTATION_LANGUAGE_OPTIONS: ConsultationLanguageOption[] = [\n { code: 'en', labelKey: 'formReportLanguageEnglish', label: 'English' },\n { code: 'hi', labelKey: 'formReportLanguageHindi', label: 'Hindi' },\n { code: 'te', labelKey: 'formReportLanguageTelugu', label: 'Telugu' },\n { code: 'kn', labelKey: 'formReportLanguageKannada', label: 'Kannada' },\n { code: 'gu', labelKey: 'formReportLanguageGujarati', label: 'Gujarati' },\n { code: 'mr', labelKey: 'formReportLanguageMarathi', label: 'Marathi' },\n { code: 'ta', labelKey: 'formReportLanguageTamil', label: 'Tamil' },\n];\n","import React from 'react';\n\n/** Tick shown next to the selected consultation language */\nexport const CheckIcon: React.FC = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden>\n <path\n d=\"M3.5 8.5l2.5 2.5 6-6\"\n stroke=\"#22c55e\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n/** Down chevron, used by the consultation-language dropdown trigger */\nexport const ChevronDownIcon: React.FC = () => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n >\n <path d=\"M6 9l6 6 6-6\" />\n </svg>\n);\n\n/** Sun icon for \"Morning\" period tab */\nexport const MorningIcon: React.FC = () => (\n <img\n src=\"https://srm-cdn.a4b.io/yoda/1785316603029.svg\"\n width={16}\n height={16}\n alt=\"\"\n aria-hidden\n />\n);\n\n/** Sun-cloud icon for \"Afternoon\" period tab */\nexport const AfternoonIcon: React.FC = () => (\n <img\n src=\"https://srm-cdn.a4b.io/yoda/1785316621747.svg\"\n width={16}\n height={16}\n alt=\"\"\n aria-hidden\n />\n);\n\n/** Moon icon for \"Evening\" period tab */\nexport const EveningIcon: React.FC = () => (\n <img\n src=\"https://srm-cdn.a4b.io/yoda/1785316635953.svg\"\n width={16}\n height={16}\n alt=\"\"\n aria-hidden\n />\n);\n\n/** Calendar-with-slash icon for the \"No slots available\" empty state */\nexport const CalendarOffIcon: React.FC = () => (\n <svg width=\"40\" height=\"40\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden>\n <rect x=\"3\" y=\"4.5\" width=\"18\" height=\"16\" rx=\"3\" stroke=\"#D1D5DB\" strokeWidth=\"1.6\" />\n <path d=\"M3 9.5h18\" stroke=\"#D1D5DB\" strokeWidth=\"1.6\" />\n <path d=\"M8 2.5v4M16 2.5v4\" stroke=\"#D1D5DB\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n <path d=\"M7.5 20.5L17 6\" stroke=\"#9CA3AF\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n </svg>\n);\n\n","/**\n * PhoneNumberSection — PLACEHOLDER.\n *\n * Dummy stand-in for the \"phone number\" block that sits above the slot\n * picker, so the layout can be reviewed end to end. It renders a static\n * number and an inert \"Change\" affordance; swap it for the real\n * (validated, OTP-backed) implementation before shipping, or replace it\n * wholesale via `ConsultationSlotSelector`'s `phoneNumberSection` prop.\n */\nimport React from 'react';\nimport styles from './PhoneNumberSection.module.scss';\n\nexport interface PhoneNumberSectionProps {\n /** Section title. Wins over `t(\"planPhoneNumberHeading\")`. */\n title?: string;\n /** Dial code shown before the number, e.g. \"+91\" */\n countryCode?: string;\n /** The number itself, e.g. \"98765 43210\" */\n phoneNumber?: string;\n /** Helper line under the number. */\n helperText?: string;\n /** Called when \"Change\" is tapped; the link is hidden when not passed. */\n onEdit?: () => void;\n /** Translation lookup; every string falls back to the English default. */\n t?: (key: string, options?: any) => string | undefined;\n className?: string;\n}\n\nexport const PhoneNumberSection: React.FC<PhoneNumberSectionProps> = ({\n title,\n countryCode = '+91',\n phoneNumber = '98765 43210',\n helperText,\n onEdit,\n t,\n className = '',\n}) => (\n <section className={[styles.section, className].filter(Boolean).join(' ')}>\n <div className={styles.headerRow}>\n <span className={styles.title}>\n {title ?? t?.('planPhoneNumberHeading') ?? 'Your phone number'}\n </span>\n {onEdit && (\n <button type=\"button\" className={styles.changeBtn} onClick={onEdit}>\n {t?.('planPhoneNumberChange') ?? 'Change'}\n </button>\n )}\n </div>\n\n <div className={styles.numberRow}>\n <span className={styles.countryCode}>{countryCode}</span>\n <span className={styles.number}>{phoneNumber}</span>\n </div>\n\n <p className={styles.helper}>\n {helperText ??\n t?.('planPhoneNumberHelper') ??\n 'The astrologer will call you on this number at your booked slot.'}\n </p>\n </section>\n);\n","/**\n * AstrologyProfilesSection — PLACEHOLDER.\n *\n * Dummy stand-in for the \"astrology profiles\" block that sits above the slot\n * picker, so the layout can be reviewed end to end. It renders a horizontal\n * strip of selectable profile cards plus an inert \"Add profile\" tile; swap it\n * for the real (API-backed) implementation before shipping, or replace it\n * wholesale via `ConsultationSlotSelector`'s `astrologyProfilesSection` prop.\n */\nimport React, { useState } from 'react';\nimport styles from './AstrologyProfilesSection.module.scss';\n\nexport interface AstrologyProfile {\n id: string;\n /** Person's name, e.g. \"Aarav Sharma\" */\n name: string;\n /** Free-form birth line, e.g. \"12 Mar 1994 • 06:45 AM\" */\n birthDetails?: string;\n /** Birth place, e.g. \"Bengaluru, India\" */\n birthPlace?: string;\n /** Relation tag shown as a pill, e.g. \"Self\", \"Spouse\" */\n relation?: string;\n}\n\nconst PLACEHOLDER_PROFILES: AstrologyProfile[] = [\n {\n id: 'self',\n name: 'Aarav Sharma',\n birthDetails: '12 Mar 1994 • 06:45 AM',\n birthPlace: 'Bengaluru, India',\n relation: 'Self',\n },\n {\n id: 'spouse',\n name: 'Diya Sharma',\n birthDetails: '04 Sep 1996 • 11:20 PM',\n birthPlace: 'Pune, India',\n relation: 'Spouse',\n },\n];\n\nexport interface AstrologyProfilesSectionProps {\n /** Section title. Wins over `t(\"planAstrologyProfilesHeading\")`. */\n title?: string;\n /** Profiles to show. Defaults to placeholder data. */\n profiles?: AstrologyProfile[];\n /** Selected profile id. Omit to let the component manage it. */\n selectedProfileId?: string;\n onProfileSelect?: (profileId: string) => void;\n /** Called when \"Add profile\" is tapped; the tile is hidden when not passed. */\n onAddProfile?: () => void;\n /** Translation lookup; every string falls back to the English default. */\n t?: (key: string, options?: any) => string | undefined;\n className?: string;\n}\n\nexport const AstrologyProfilesSection: React.FC<AstrologyProfilesSectionProps> = ({\n title,\n profiles = PLACEHOLDER_PROFILES,\n selectedProfileId,\n onProfileSelect,\n onAddProfile,\n t,\n className = '',\n}) => {\n const [internalSelectedId, setInternalSelectedId] = useState(profiles[0]?.id ?? '');\n const activeId = selectedProfileId ?? internalSelectedId;\n\n const handleSelect = (profileId: string) => {\n setInternalSelectedId(profileId);\n onProfileSelect?.(profileId);\n };\n\n return (\n <section className={[styles.section, className].filter(Boolean).join(' ')}>\n <p className={styles.title}>\n {title ?? t?.('planAstrologyProfilesHeading') ?? 'Astrology profile'}\n </p>\n\n <div className={styles.profileRow} role=\"radiogroup\" aria-label=\"Astrology profile\">\n {profiles.map((profile) => {\n const isSelected = profile.id === activeId;\n return (\n <button\n key={profile.id}\n type=\"button\"\n role=\"radio\"\n aria-checked={isSelected}\n className={[styles.profileCard, isSelected ? styles.profileCardSelected : '']\n .filter(Boolean)\n .join(' ')}\n onClick={() => handleSelect(profile.id)}\n >\n <span className={styles.profileTop}>\n <span className={styles.avatar} aria-hidden>\n {profile.name.charAt(0).toUpperCase()}\n </span>\n <span className={styles.profileName}>{profile.name}</span>\n </span>\n {profile.relation && <span className={styles.relationPill}>{profile.relation}</span>}\n {profile.birthDetails && (\n <span className={styles.profileMeta}>{profile.birthDetails}</span>\n )}\n {profile.birthPlace && (\n <span className={styles.profileMeta}>{profile.birthPlace}</span>\n )}\n </button>\n );\n })}\n\n {onAddProfile && (\n <button type=\"button\" className={styles.addCard} onClick={onAddProfile}>\n <span className={styles.addIcon} aria-hidden>\n +\n </span>\n {t?.('planAddAstrologyProfile') ?? 'Add profile'}\n </button>\n )}\n </div>\n </section>\n );\n};\n","/**\n * ConsultationSlotSelector — presentational slot-picker extracted from the\n * kundli-generator consultation modal.\n *\n * It renders only the UI: the consultation-language row and the date /\n * time-of-day / time-slot selection (plus loading, error and empty states),\n * optionally preceded by the phone-number and astrology-profile sections.\n * All fetching, analytics and modal chrome (header, footer CTA, guidance\n * topics) stay in the host app.\n *\n * Selection is controlled-optional: pass `selectedDate` / `selectedPeriod` /\n * `selectedSlotStart` / `selectedLanguage` to drive it from the host, or omit\n * them and the component keeps its own state, defaulting to the first\n * available day / period / slot.\n */\nimport React, { Fragment, useEffect, useMemo, useRef, useState } from 'react';\nimport type {\n ConsultationLanguageOption,\n ConsultationSlot,\n ConsultationSlotDay,\n ConsultationSlotPeriod,\n} from './types';\nimport {\n CONSULTATION_LANGUAGE_OPTIONS,\n CONSULTATION_PERIOD_ORDER,\n formatSlotDayLabel,\n formatSlotTime,\n} from './slotUtils';\nimport {\n AfternoonIcon,\n CalendarOffIcon,\n CheckIcon,\n ChevronDownIcon,\n EveningIcon,\n MorningIcon,\n} from './SlotIcons';\nimport { PhoneNumberSection } from './PhoneNumberSection';\nimport { AstrologyProfilesSection } from './AstrologyProfilesSection';\nimport styles from './ConsultationSlotSelector.module.scss';\n\nexport interface ConsultationSlotSelectorProps {\n /** Availability for the currently selected consultation language. */\n days: ConsultationSlotDay[];\n\n /** Renders the shimmer skeleton instead of the slot grid. */\n loading?: boolean;\n /** Renders the error message (with a Retry button when `onRetry` is given). */\n error?: boolean;\n onRetry?: () => void;\n\n /** Selected date, ISO \"yyyy-MM-dd\". Omit to let the component manage it. */\n selectedDate?: string;\n onDateSelect?: (date: string) => void;\n\n /** Selected time-of-day tab. Omit to let the component manage it. */\n selectedPeriod?: ConsultationSlotPeriod;\n onPeriodSelect?: (period: ConsultationSlotPeriod) => void;\n\n /**\n * `start` of the selected slot. Omit to let the component manage it\n * (defaults to the first slot of the visible period); pass `null` to show\n * nothing as selected.\n */\n selectedSlotStart?: string | null;\n onSlotSelect?: (slot: ConsultationSlot) => void;\n\n /** Hides the whole consultation-language row + its divider. */\n hideLanguageSelector?: boolean;\n languageOptions?: ConsultationLanguageOption[];\n /** Selected language code. Omit to let the component manage it. */\n selectedLanguage?: string;\n onLanguageSelect?: (code: string) => void;\n\n /** Shows the (placeholder) phone-number section above the slot picker. */\n showPhoneNumberSection?: boolean;\n /** Replaces the placeholder phone-number section with your own node. */\n phoneNumberSection?: React.ReactNode;\n\n /** Shows the (placeholder) astrology-profiles section above the slot picker. */\n showAstrologyProfilesSection?: boolean;\n /** Replaces the placeholder astrology-profiles section with your own node. */\n astrologyProfilesSection?: React.ReactNode;\n\n /** Heading above the date tabs. Wins over `t(\"planSelectSlotHeading\")`. */\n heading?: string;\n /** Right-aligned next to the heading, e.g. \"Timezone: Asia/Kolkata\". Omit to hide. */\n timezoneLabel?: string;\n /** Label on the left of the language dropdown. Wins over `t(...)`. */\n languageLabel?: string;\n /** Replaces the \"Your Report will be ready in 24-48 hours\" banner; `null` hides it. */\n reportReadyNote?: React.ReactNode;\n\n /**\n * International build — labels the evening tab \"Evening/Night\", since slots\n * that late in IST land at night in most timezones global users book from.\n */\n isGlobal?: boolean;\n\n /** Translation lookup; every string falls back to the English default. */\n t?: (key: string, options?: any) => string | undefined;\n\n className?: string;\n}\n\nconst PERIOD_ICONS: Record<ConsultationSlotPeriod, React.FC> = {\n morning: MorningIcon,\n afternoon: AfternoonIcon,\n evening: EveningIcon,\n};\n\nconst PERIOD_LABEL_KEYS: Record<ConsultationSlotPeriod, string> = {\n morning: 'planPeriodMorning',\n afternoon: 'planPeriodAfternoon',\n evening: 'planPeriodEvening',\n};\n\nconst cx = (...classNames: (string | false | undefined)[]) =>\n classNames.filter(Boolean).join(' ');\n\nexport const ConsultationSlotSelector: React.FC<ConsultationSlotSelectorProps> = ({\n days,\n loading = false,\n error = false,\n onRetry,\n selectedDate,\n onDateSelect,\n selectedPeriod,\n onPeriodSelect,\n selectedSlotStart,\n onSlotSelect,\n hideLanguageSelector = false,\n languageOptions = CONSULTATION_LANGUAGE_OPTIONS,\n selectedLanguage,\n onLanguageSelect,\n showPhoneNumberSection = true,\n phoneNumberSection,\n showAstrologyProfilesSection = true,\n astrologyProfilesSection,\n heading,\n timezoneLabel,\n languageLabel,\n reportReadyNote,\n isGlobal = true,\n t,\n className = '',\n}) => {\n const availableDays = useMemo(\n () => days.filter((d) => d.has_availability && d.slots.length > 0),\n [days]\n );\n\n // ===== Date =====\n const [internalDate, setInternalDate] = useState('');\n const activeDate = useMemo(() => {\n const candidate = selectedDate ?? internalDate;\n return availableDays.some((d) => d.date === candidate)\n ? candidate\n : (availableDays[0]?.date ?? '');\n }, [selectedDate, internalDate, availableDays]);\n\n const activeDay = useMemo(\n () => availableDays.find((d) => d.date === activeDate) ?? null,\n [availableDays, activeDate]\n );\n\n // ===== Period =====\n const periodsForActiveDay = useMemo(() => {\n if (!activeDay) return [];\n const present = new Set(activeDay.slots.map((s) => s.period));\n return CONSULTATION_PERIOD_ORDER.filter((p) => present.has(p));\n }, [activeDay]);\n\n const [internalPeriod, setInternalPeriod] = useState<ConsultationSlotPeriod | ''>('');\n const activePeriod = useMemo<ConsultationSlotPeriod>(() => {\n const candidate = selectedPeriod ?? internalPeriod;\n return candidate && periodsForActiveDay.includes(candidate)\n ? candidate\n : (periodsForActiveDay[0] ?? 'morning');\n }, [selectedPeriod, internalPeriod, periodsForActiveDay]);\n\n // ===== Slot =====\n const slotsForActivePeriod = useMemo(\n () => (activeDay ? activeDay.slots.filter((s) => s.period === activePeriod) : []),\n [activeDay, activePeriod]\n );\n\n const [internalSlotStart, setInternalSlotStart] = useState('');\n const activeSlotStart = useMemo(() => {\n // `null` is an explicit \"nothing selected\" from the host — don't default.\n if (selectedSlotStart === null) return '';\n const candidate = selectedSlotStart ?? internalSlotStart;\n return slotsForActivePeriod.some((s) => s.start === candidate)\n ? candidate\n : (slotsForActivePeriod[0]?.start ?? '');\n }, [selectedSlotStart, internalSlotStart, slotsForActivePeriod]);\n\n // ===== Language =====\n const [internalLanguage, setInternalLanguage] = useState(\n () => languageOptions[0]?.code ?? 'en'\n );\n const activeLanguage = selectedLanguage ?? internalLanguage;\n const activeLanguageOption =\n languageOptions.find((option) => option.code === activeLanguage) ?? languageOptions[0];\n\n const [isLanguageMenuOpen, setIsLanguageMenuOpen] = useState(false);\n const languageMenuRef = useRef<HTMLDivElement | null>(null);\n\n // Close the language dropdown on outside click.\n useEffect(() => {\n if (!isLanguageMenuOpen) return;\n const handleClickOutside = (event: MouseEvent) => {\n if (languageMenuRef.current && !languageMenuRef.current.contains(event.target as Node)) {\n setIsLanguageMenuOpen(false);\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [isLanguageMenuOpen]);\n\n // ===== Sliding tab indicators =====\n // Both pills are measured from the actual DOM nodes so they line up exactly\n // regardless of label width/locale or how many tabs are shown, then animated\n // purely via CSS transform/width transitions for a smooth iOS-style switch.\n const dateTabsRef = useRef<HTMLDivElement | null>(null);\n const dateTabRefs = useRef<Partial<Record<string, HTMLButtonElement | null>>>({});\n const [dateIndicatorRect, setDateIndicatorRect] = useState<{\n left: number;\n top: number;\n width: number;\n height: number;\n } | null>(null);\n\n const periodTabsRef = useRef<HTMLDivElement | null>(null);\n const periodTabRefs = useRef<Partial<Record<ConsultationSlotPeriod, HTMLButtonElement | null>>>(\n {}\n );\n const [periodIndicatorRect, setPeriodIndicatorRect] = useState<{\n left: number;\n width: number;\n } | null>(null);\n\n useEffect(() => {\n const measure = () => {\n const container = dateTabsRef.current;\n const activeTab = dateTabRefs.current[activeDate];\n if (!container || !activeTab) {\n setDateIndicatorRect(null);\n return;\n }\n const containerRect = container.getBoundingClientRect();\n const tabRect = activeTab.getBoundingClientRect();\n setDateIndicatorRect({\n left: tabRect.left - containerRect.left,\n top: tabRect.top - containerRect.top,\n width: tabRect.width,\n height: tabRect.height,\n });\n };\n measure();\n window.addEventListener('resize', measure);\n return () => window.removeEventListener('resize', measure);\n }, [activeDate, availableDays, loading, error]);\n\n useEffect(() => {\n const measure = () => {\n const container = periodTabsRef.current;\n const activeTab = periodTabRefs.current[activePeriod];\n if (!container || !activeTab) {\n setPeriodIndicatorRect(null);\n return;\n }\n const containerRect = container.getBoundingClientRect();\n const tabRect = activeTab.getBoundingClientRect();\n setPeriodIndicatorRect({\n left: tabRect.left - containerRect.left,\n width: tabRect.width,\n });\n };\n measure();\n window.addEventListener('resize', measure);\n return () => window.removeEventListener('resize', measure);\n }, [activePeriod, periodsForActiveDay, loading, error]);\n\n // ===== Handlers =====\n const handleDateSelect = (date: string) => {\n setInternalDate(date);\n onDateSelect?.(date);\n };\n\n const handlePeriodSelect = (period: ConsultationSlotPeriod) => {\n setInternalPeriod(period);\n onPeriodSelect?.(period);\n };\n\n const handleSlotSelect = (slot: ConsultationSlot) => {\n setInternalSlotStart(slot.start);\n onSlotSelect?.(slot);\n };\n\n const handleLanguageSelect = (code: string) => {\n setInternalLanguage(code);\n setIsLanguageMenuOpen(false);\n onLanguageSelect?.(code);\n };\n\n return (\n <div className={cx(styles.root, className)}>\n {showPhoneNumberSection && (phoneNumberSection ?? <PhoneNumberSection t={t} />)}\n {showAstrologyProfilesSection &&\n (astrologyProfilesSection ?? <AstrologyProfilesSection t={t} />)}\n\n {/* Consultation language selector — a purely client-side switch over\n availability the host already fetched for every language. */}\n {!hideLanguageSelector && (\n <>\n <div className={styles.languageRow}>\n <span className={styles.languageLabel}>\n {languageLabel ??\n t?.('planConsultationLanguageLabel') ??\n 'Your consultation language'}\n </span>\n <div className={styles.languageDropdown} ref={languageMenuRef}>\n <button\n type=\"button\"\n className={styles.languageDropdownBtn}\n onClick={() => setIsLanguageMenuOpen((prev) => !prev)}\n aria-haspopup=\"listbox\"\n aria-expanded={isLanguageMenuOpen}\n >\n {(activeLanguageOption?.labelKey && t?.(activeLanguageOption.labelKey)) ??\n activeLanguageOption?.label}\n <ChevronDownIcon />\n </button>\n {isLanguageMenuOpen && (\n <ul className={styles.languageMenu} role=\"listbox\">\n {languageOptions.map((option) => {\n const isSelected = option.code === activeLanguage;\n return (\n <li\n key={option.code}\n role=\"option\"\n aria-selected={isSelected}\n className={cx(\n styles.languageMenuItem,\n isSelected && styles.languageMenuItemSelected\n )}\n onClick={() => handleLanguageSelect(option.code)}\n >\n {(option.labelKey && t?.(option.labelKey)) ?? option.label}\n {isSelected && <CheckIcon />}\n </li>\n );\n })}\n </ul>\n )}\n </div>\n </div>\n <hr className={styles.languageDivider} />\n </>\n )}\n\n {/* Date + time slot selection */}\n <div className={styles.sectionHeadingRow}>\n <p className={styles.sectionHeading}>\n {heading ?? t?.('planSelectSlotHeading') ?? 'Book your preferred consultation slot'}\n </p>\n {timezoneLabel && <p className={styles.timezoneLabel}>{timezoneLabel}</p>}\n </div>\n\n {reportReadyNote === undefined ? (\n <p className={styles.reportReadyBanner}>\n {t?.('planReportReadyPrefix') ?? 'Your Report will be ready in'}{' '}\n <span className={styles.reportReadyDuration}>\n {t?.('planReportReadyDuration') ?? '24-48 hours'}\n </span>{' '}\n {t?.('planReportReadySuffix') ?? 'from today'}\n </p>\n ) : (\n reportReadyNote\n )}\n\n {loading && (\n <div className={styles.loadingWrap} aria-busy=\"true\" aria-live=\"polite\">\n <div className={styles.skeletonDateTabs}>\n {Array.from({ length: 5 }).map((_, idx) => (\n <div key={idx} className={cx(styles.skeletonDateTab, styles.skeletonShimmer)} />\n ))}\n </div>\n <div className={styles.skeletonPeriodTabs}>\n {Array.from({ length: 3 }).map((_, idx) => (\n <div key={idx} className={cx(styles.skeletonPeriodTab, styles.skeletonShimmer)} />\n ))}\n </div>\n <div className={styles.skeletonTimeGrid}>\n {Array.from({ length: 6 }).map((_, idx) => (\n <div key={idx} className={cx(styles.skeletonTimeSlot, styles.skeletonShimmer)} />\n ))}\n </div>\n </div>\n )}\n\n {!loading && error && (\n <div className={styles.stateMessage}>\n {t?.('planSlotsLoadError') ?? \"Couldn't load slots. Please try again.\"}\n {onRetry && (\n <button type=\"button\" className={styles.retryBtn} onClick={onRetry}>\n {t?.('planRetry') ?? 'Retry'}\n </button>\n )}\n </div>\n )}\n\n {!loading && !error && availableDays.length === 0 && (\n <div className={styles.emptyState}>\n <span className={styles.emptyStateIcon}>\n <CalendarOffIcon />\n </span>\n <p className={styles.emptyStateTitle}>\n {t?.('planNoSlotsAvailableTitle') ?? 'No slots available'}\n </p>\n <p className={styles.emptyStateSubtitle}>\n {t?.('planNoSlotsAvailableSubtitle') ??\n 'Try a different consultation language above, or check back soon.'}\n </p>\n </div>\n )}\n\n {!loading && !error && availableDays.length > 0 && (\n <>\n <div\n className={styles.dateTabs}\n ref={dateTabsRef}\n role=\"radiogroup\"\n aria-label=\"Consultation date\"\n >\n {dateIndicatorRect && (\n <span\n className={styles.dateTabIndicator}\n style={{\n transform: `translate(${dateIndicatorRect.left}px, ${dateIndicatorRect.top}px)`,\n width: dateIndicatorRect.width,\n height: dateIndicatorRect.height,\n }}\n aria-hidden=\"true\"\n />\n )}\n {availableDays.map((day) => {\n const isSelected = day.date === activeDate;\n const { dayLabel, dayNum } = formatSlotDayLabel(day.date);\n return (\n <Fragment key={day.date}>\n <button\n type=\"button\"\n ref={(el) => {\n dateTabRefs.current[day.date] = el;\n }}\n className={cx(styles.dateTab, isSelected && styles.dateTabSelected)}\n role=\"radio\"\n aria-checked={isSelected}\n onClick={() => handleDateSelect(day.date)}\n >\n <span className={styles.dateTabLabel}>{t?.(dayLabel) ?? dayLabel}</span>\n <span className={styles.dateTabNum}>{dayNum}</span>\n </button>\n <span className={styles.dateTabDivider} aria-hidden />\n </Fragment>\n );\n })}\n </div>\n\n <div\n className={styles.periodTabs}\n ref={periodTabsRef}\n role=\"tablist\"\n aria-label=\"Time of day\"\n >\n {periodIndicatorRect && (\n <span\n className={styles.periodTabIndicator}\n style={{\n transform: `translateX(${periodIndicatorRect.left}px)`,\n width: periodIndicatorRect.width,\n }}\n aria-hidden=\"true\"\n />\n )}\n {periodsForActiveDay.map((period) => {\n const Icon = PERIOD_ICONS[period];\n const isEveningNight = period === 'evening' && isGlobal;\n const labelKey = isEveningNight\n ? 'planPeriodEveningNight'\n : PERIOD_LABEL_KEYS[period];\n return (\n <button\n key={period}\n ref={(el) => {\n periodTabRefs.current[period] = el;\n }}\n type=\"button\"\n className={cx(\n styles.periodTab,\n period === activePeriod && styles.periodTabSelected\n )}\n role=\"tab\"\n aria-selected={period === activePeriod}\n onClick={() => handlePeriodSelect(period)}\n >\n <Icon />\n {t?.(labelKey) ??\n (isEveningNight\n ? 'Evening/Night'\n : period.charAt(0).toUpperCase() + period.slice(1))}\n </button>\n );\n })}\n </div>\n\n <div\n key={`${activeDate}-${activePeriod}`}\n className={styles.timeGrid}\n role=\"radiogroup\"\n aria-label=\"Consultation time\"\n >\n {slotsForActivePeriod.map((slot, idx) => (\n <button\n key={`${slot.start}-${idx}`}\n type=\"button\"\n className={cx(\n styles.timeSlot,\n activeSlotStart === slot.start && styles.timeSlotSelected,\n slot.disabled && styles.timeSlotDisabled\n )}\n role=\"radio\"\n aria-checked={activeSlotStart === slot.start}\n aria-disabled={slot.disabled || undefined}\n disabled={slot.disabled}\n onClick={() => !slot.disabled && handleSlotSelect(slot)}\n >\n {formatSlotTime(slot.start)}\n </button>\n ))}\n </div>\n </>\n )}\n </div>\n );\n};\n","/**\n * Dummy availability data for Storybook / local previews.\n *\n * Dates are generated relative to \"today\" so the date tabs always read\n * \"Today\", \"Tomorrow\", then weekday names — exactly like the real API\n * response would.\n */\nimport type { ConsultationSlot, ConsultationSlotDay, ConsultationSlotPeriod } from './types';\n\n/** \"+05:30\" — the mock data is IST, matching what the real API returns. */\nconst OFFSET = '+05:30';\n\nconst toIsoDate = (date: Date): string => {\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n return `${date.getFullYear()}-${month}-${day}`;\n};\n\nconst makeSlot = (\n isoDate: string,\n hour: number,\n minute: number,\n period: ConsultationSlotPeriod\n): ConsultationSlot => {\n const pad = (n: number) => String(n).padStart(2, '0');\n const endMinute = minute + 30;\n const endHour = hour + Math.floor(endMinute / 60);\n return {\n start: `${isoDate}T${pad(hour)}:${pad(minute)}:00${OFFSET}`,\n end: `${isoDate}T${pad(endHour)}:${pad(endMinute % 60)}:00${OFFSET}`,\n period,\n };\n};\n\n/** Slot start times per period, as [hour, minute] pairs. */\nconst SLOT_TIMES: Record<ConsultationSlotPeriod, [number, number][]> = {\n morning: [\n [9, 0],\n [9, 30],\n [10, 0],\n [10, 30],\n [11, 0],\n [11, 30],\n ],\n afternoon: [\n [12, 30],\n [13, 0],\n [14, 0],\n [15, 30],\n [16, 0],\n ],\n evening: [\n [18, 0],\n [18, 30],\n [19, 0],\n [20, 0],\n ],\n};\n\nconst buildDay = (\n dayOffset: number,\n periods: ConsultationSlotPeriod[]\n): ConsultationSlotDay => {\n const date = new Date();\n date.setDate(date.getDate() + dayOffset);\n const isoDate = toIsoDate(date);\n const slots = periods.flatMap((period) =>\n SLOT_TIMES[period].map(([hour, minute]) => makeSlot(isoDate, hour, minute, period))\n );\n return { date: isoDate, has_availability: slots.length > 0, slots };\n};\n\n/** Five days of availability with a deliberately uneven period mix. */\nexport const MOCK_SLOT_DAYS: ConsultationSlotDay[] = [\n buildDay(0, ['morning', 'afternoon', 'evening']),\n buildDay(1, ['morning', 'afternoon']),\n buildDay(2, ['afternoon', 'evening']),\n buildDay(3, ['morning', 'evening']),\n buildDay(4, ['morning', 'afternoon', 'evening']),\n];\n\n/** Every day sold out — drives the \"No slots available\" empty state. */\nexport const MOCK_SLOT_DAYS_EMPTY: ConsultationSlotDay[] = MOCK_SLOT_DAYS.map((day) => ({\n ...day,\n has_availability: false,\n slots: [],\n}));\n","import React from 'react';\n\n/** Down chevron, used by the phone-input country-code dropdown trigger */\nexport const ChevronDownIcon: React.FC = () => (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n >\n <path d=\"M6 9l6 6 6-6\" />\n </svg>\n);\n","/** Dial-code country list + flag helper for `PhoneNumberInput`. */\n\nexport interface Country {\n name: string;\n code: string;\n iso: string;\n}\n\nexport const DEFAULT_COUNTRIES: Country[] = [\n { name: 'United States', code: '+1', iso: 'US' },\n { name: 'United Kingdom', code: '+44', iso: 'GB' },\n { name: 'Australia', code: '+61', iso: 'AU' },\n { name: 'Canada', code: '+1', iso: 'CA' },\n { name: 'United Arab Emirates', code: '+971', iso: 'AE' },\n { name: 'Singapore', code: '+65', iso: 'SG' },\n { name: 'New Zealand', code: '+64', iso: 'NZ' },\n { name: 'Mauritius', code: '+230', iso: 'MU' },\n { name: 'Netherlands', code: '+31', iso: 'NL' },\n { name: 'Malaysia', code: '+60', iso: 'MY' },\n { name: 'Germany', code: '+49', iso: 'DE' },\n { name: 'South Africa', code: '+27', iso: 'ZA' },\n { name: 'Qatar', code: '+974', iso: 'QA' },\n { name: 'Ireland', code: '+353', iso: 'IE' },\n { name: 'Oman', code: '+968', iso: 'OM' },\n { name: 'Saudi Arabia', code: '+966', iso: 'SA' },\n { name: 'Hong Kong', code: '+852', iso: 'HK' },\n { name: 'France', code: '+33', iso: 'FR' },\n { name: 'Switzerland', code: '+41', iso: 'CH' },\n { name: 'Bahrain', code: '+973', iso: 'BH' },\n { name: 'Trinidad and Tobago', code: '+1-868', iso: 'TT' },\n { name: 'Kuwait', code: '+965', iso: 'KW' },\n { name: 'Belgium', code: '+32', iso: 'BE' },\n { name: 'Japan', code: '+81', iso: 'JP' },\n { name: 'Italy', code: '+39', iso: 'IT' },\n { name: 'Spain', code: '+34', iso: 'ES' },\n { name: 'Norway', code: '+47', iso: 'NO' },\n { name: 'Sweden', code: '+46', iso: 'SE' },\n { name: 'Portugal', code: '+351', iso: 'PT' },\n { name: 'Poland', code: '+48', iso: 'PL' },\n { name: 'Denmark', code: '+45', iso: 'DK' },\n { name: 'Nepal', code: '+977', iso: 'NP' },\n { name: 'Bangladesh', code: '+880', iso: 'BD' },\n { name: 'Kenya', code: '+254', iso: 'KE' },\n { name: 'Mexico', code: '+52', iso: 'MX' },\n { name: 'Czechia', code: '+420', iso: 'CZ' },\n { name: 'Indonesia', code: '+62', iso: 'ID' },\n { name: 'Taiwan', code: '+886', iso: 'TW' },\n { name: 'Fiji', code: '+679', iso: 'FJ' },\n { name: 'Guyana', code: '+592', iso: 'GY' },\n { name: 'Finland', code: '+358', iso: 'FI' },\n { name: 'Nigeria', code: '+234', iso: 'NG' },\n { name: 'Jamaica', code: '+1-876', iso: 'JM' },\n { name: 'Sri Lanka', code: '+94', iso: 'LK' },\n { name: 'Thailand', code: '+66', iso: 'TH' },\n { name: 'Hungary', code: '+36', iso: 'HU' },\n { name: 'Tanzania', code: '+255', iso: 'TZ' },\n { name: 'Sint Maarten', code: '+1-721', iso: 'SX' },\n { name: 'Philippines', code: '+63', iso: 'PH' },\n { name: 'Estonia', code: '+372', iso: 'EE' },\n { name: 'Ukraine', code: '+380', iso: 'UA' },\n { name: 'Austria', code: '+43', iso: 'AT' },\n { name: 'Réunion', code: '+262', iso: 'RE' },\n { name: 'India', code: '+91', iso: 'IN' },\n];\n\n/**\n * Renders a flag purely from the ISO alpha-2 code via Unicode regional\n * indicator symbols — no image assets/CDN needed. Pass `getFlagUrl` to\n * `PhoneNumberInput` instead if the host wants real flag images.\n */\nexport const getFlagEmoji = (iso: string | undefined): string => {\n if (!iso || iso.length !== 2) return '🏳️';\n const codePoints = iso\n .toUpperCase()\n .split('')\n .map((char) => 127397 + char.charCodeAt(0));\n return String.fromCodePoint(...codePoints);\n};\n","/** Phone validation patterns by dial code, used by `PhoneNumberInput`. */\nconst PHONE_PATTERNS: Record<\n string,\n { pattern: RegExp; minLength: number; maxLength: number; description: string }\n> = {\n '+1': {\n pattern: /^[2-9]\\d{9}$/,\n minLength: 10,\n maxLength: 10,\n description: '10 digits, cannot start with 0 or 1',\n },\n '+44': {\n pattern: /^\\d{10}$/,\n minLength: 10,\n maxLength: 10,\n description: '10 digits',\n },\n '+61': {\n pattern: /^\\d{9}$/,\n minLength: 9,\n maxLength: 9,\n description: '9 digits',\n },\n '+971': {\n pattern: /^\\d{8,9}$/,\n minLength: 8,\n maxLength: 9,\n description: '8-9 digits',\n },\n '+65': {\n pattern: /^\\d{8}$/,\n minLength: 8,\n maxLength: 8,\n description: '8 digits',\n },\n '+49': {\n pattern: /^\\d{10,11}$/,\n minLength: 10,\n maxLength: 11,\n description: '10-11 digits',\n },\n '+91': {\n pattern: /^[6-9]\\d{9}$/,\n minLength: 10,\n maxLength: 10,\n description: '10 digits, must start with 6-9',\n },\n '+974': {\n pattern: /^\\d{8}$/,\n minLength: 8,\n maxLength: 8,\n description: '8 digits',\n },\n '+60': {\n pattern: /^\\d{9,10}$/,\n minLength: 9,\n maxLength: 10,\n description: '9-10 digits',\n },\n '+27': {\n pattern: /^\\d{9}$/,\n minLength: 9,\n maxLength: 9,\n description: '9 digits',\n },\n '+64': {\n pattern: /^\\d{8,10}$/,\n minLength: 8,\n maxLength: 10,\n description: '8-10 digits',\n },\n '+230': {\n pattern: /^\\d{7,8}$/,\n minLength: 7,\n maxLength: 8,\n description: '7-8 digits',\n },\n};\n\nconst DEFAULT_PATTERN = {\n pattern: /^\\d{6,15}$/,\n minLength: 6,\n maxLength: 15,\n description: '6-15 digits',\n};\n\n/** Phone number is treated as optional — an empty string is always valid. */\nexport const validatePhoneByCountryCode = (\n phoneNumber: string,\n countryCode: string\n): { isValid: boolean; error: string } => {\n if (!phoneNumber) {\n return { isValid: true, error: '' };\n }\n\n const validation = PHONE_PATTERNS[countryCode] || DEFAULT_PATTERN;\n const isValid = validation.pattern.test(phoneNumber);\n\n if (!isValid) {\n return {\n isValid: false,\n error: `Please enter a valid phone number (${validation.description})`,\n };\n }\n\n return { isValid: true, error: '' };\n};\n\nexport const getMaxLengthForCountry = (countryCode: string): number => {\n const validation = PHONE_PATTERNS[countryCode] || DEFAULT_PATTERN;\n return validation.maxLength;\n};\n","import { useCallback, useState } from 'react';\nimport type { Country } from './countries';\nimport { validatePhoneByCountryCode, getMaxLengthForCountry } from '../../utils/phoneValidation';\n\ninterface UsePhoneNumberInputOptions {\n countryCode: string;\n contactNumber: string;\n countries: Country[];\n onCountryCodeChange: (code: string, countryName: string) => void;\n onPhoneNumberChange: (value: string) => void;\n onValidationChange?: (isValid: boolean, error: string) => void;\n onDropdownFocus?: (countryCode: string) => void;\n onInputFocus?: (countryCode: string) => void;\n}\n\nexport const usePhoneNumberInput = ({\n countryCode,\n contactNumber,\n countries,\n onCountryCodeChange,\n onPhoneNumberChange,\n onValidationChange,\n onDropdownFocus,\n onInputFocus,\n}: UsePhoneNumberInputOptions) => {\n const [isDropdownOpen, setIsDropdownOpen] = useState(false);\n\n const selectedCountry = countries.find((c) => c.code === countryCode) ?? countries[0];\n const maxLength = getMaxLengthForCountry(countryCode);\n\n const handleCountrySelect = useCallback(\n (country: Country) => {\n onCountryCodeChange(country.code, country.name);\n setIsDropdownOpen(false);\n\n if (contactNumber && onValidationChange) {\n const { isValid, error } = validatePhoneByCountryCode(contactNumber, country.code);\n onValidationChange(isValid, error);\n }\n },\n [contactNumber, onCountryCodeChange, onValidationChange]\n );\n\n const handlePhoneChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const value = e.target.value.replace(/[^\\d]/g, '');\n const trimmedValue = value.slice(0, getMaxLengthForCountry(countryCode));\n onPhoneNumberChange(trimmedValue);\n\n if (onValidationChange) {\n const { isValid, error } = validatePhoneByCountryCode(trimmedValue, countryCode);\n onValidationChange(isValid, error);\n }\n },\n [countryCode, onPhoneNumberChange, onValidationChange]\n );\n\n const handleDropdownToggle = useCallback(() => {\n setIsDropdownOpen((prev) => {\n if (!prev) onDropdownFocus?.(countryCode);\n return !prev;\n });\n }, [countryCode, onDropdownFocus]);\n\n const handlePhoneFocus = useCallback(() => {\n setIsDropdownOpen(false);\n onInputFocus?.(countryCode);\n }, [countryCode, onInputFocus]);\n\n return {\n isDropdownOpen,\n selectedCountry,\n maxLength,\n handleCountrySelect,\n handlePhoneChange,\n handleDropdownToggle,\n handlePhoneFocus,\n closeDropdown: () => setIsDropdownOpen(false),\n };\n};\n","/**\n * PhoneNumberInput — country-code + number entry, extracted from the\n * hanuman app's `PhoneInput` (src/components/inputs/phone-input) so\n * consultation-booking hosts get a real, validated implementation instead\n * of the `PhoneNumberSection` placeholder. Renders flags as Unicode emoji\n * by default (no image assets/CDN needed) — pass `getFlagUrl` for real\n * flag images instead.\n *\n * Controlled-optional: pass `countryCode`/`contactNumber` + their `on*Change`\n * pairs to drive it from the host, or omit them and it manages its own state.\n */\nimport React, { useEffect, useRef, useState } from 'react';\nimport { ChevronDownIcon } from './icons';\nimport { DEFAULT_COUNTRIES, getFlagEmoji, type Country } from './countries';\nimport { usePhoneNumberInput } from './usePhoneNumberInput';\nimport { validatePhoneByCountryCode, getMaxLengthForCountry } from '../../utils/phoneValidation';\nimport styles from './PhoneNumberInput.module.scss';\n\nexport { validatePhoneByCountryCode, getMaxLengthForCountry };\n\nconst cx = (...classNames: (string | false | undefined)[]) =>\n classNames.filter(Boolean).join(' ');\n\nexport interface PhoneNumberInputProps {\n /** Dial code, e.g. \"+91\". Omit to let the component manage it. */\n countryCode?: string;\n /** The number itself, digits only. Omit to let the component manage it. */\n contactNumber?: string;\n error?: string;\n label?: React.ReactNode;\n helperText?: React.ReactNode;\n /** Defaults to `DEFAULT_COUNTRIES`. */\n countries?: Country[];\n /** Returns a flag image URL for an ISO code; falls back to an emoji flag when omitted/null. */\n getFlagUrl?: (iso: string) => string | null | undefined;\n onCountryCodeChange?: (code: string, countryName: string) => void;\n onPhoneNumberChange?: (value: string) => void;\n onValidationChange?: (isValid: boolean, error: string) => void;\n onDropdownFocus?: (countryCode: string) => void;\n onInputFocus?: (countryCode: string) => void;\n inputRef?: (ele: HTMLInputElement | null) => void;\n /** Translation lookup; every string falls back to the English default. */\n t?: (key: string, options?: any) => string | undefined;\n className?: string;\n}\n\nexport const PhoneNumberInput: React.FC<PhoneNumberInputProps> = ({\n countryCode,\n contactNumber,\n error,\n label,\n helperText,\n countries = DEFAULT_COUNTRIES,\n getFlagUrl,\n onCountryCodeChange,\n onPhoneNumberChange,\n onValidationChange,\n onDropdownFocus,\n onInputFocus,\n inputRef,\n t,\n className = '',\n}) => {\n const [internalCountryCode, setInternalCountryCode] = useState(countries[0]?.code ?? '+91');\n const [internalNumber, setInternalNumber] = useState('');\n const activeCountryCode = countryCode ?? internalCountryCode;\n const activeNumber = contactNumber ?? internalNumber;\n\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n const {\n isDropdownOpen,\n selectedCountry,\n maxLength,\n handleCountrySelect,\n handlePhoneChange,\n handleDropdownToggle,\n handlePhoneFocus,\n closeDropdown,\n } = usePhoneNumberInput({\n countryCode: activeCountryCode,\n contactNumber: activeNumber,\n countries,\n onCountryCodeChange: (code, name) => {\n setInternalCountryCode(code);\n onCountryCodeChange?.(code, name);\n },\n onPhoneNumberChange: (value) => {\n setInternalNumber(value);\n onPhoneNumberChange?.(value);\n },\n onValidationChange,\n onDropdownFocus,\n onInputFocus,\n });\n\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n closeDropdown();\n }\n };\n if (isDropdownOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n }\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [isDropdownOpen, closeDropdown]);\n\n const renderFlag = (iso: string | undefined, alt: string) => {\n const flagUrl = iso ? getFlagUrl?.(iso) : null;\n if (flagUrl) {\n return <img src={flagUrl} alt={alt} width={20} height={14} className={styles.flagImg} />;\n }\n return (\n <span className={styles.flagEmoji} aria-hidden>\n {getFlagEmoji(iso)}\n </span>\n );\n };\n\n return (\n <div className={cx(styles.root, className)}>\n {label && <div className={styles.label}>{label}</div>}\n\n <div className={styles.row}>\n <div className={styles.dropdownWrap} ref={dropdownRef}>\n <button type=\"button\" className={styles.dropdownBtn} onClick={handleDropdownToggle}>\n {renderFlag(selectedCountry?.iso, selectedCountry?.name ?? 'Flag')}\n <span>{selectedCountry?.code ?? '+91'}</span>\n <ChevronDownIcon />\n </button>\n\n {isDropdownOpen && (\n <div className={styles.dropdownMenu} role=\"listbox\">\n {countries.map((country) => (\n <button\n key={`${country.code}-${country.iso}`}\n type=\"button\"\n role=\"option\"\n aria-selected={country.code === selectedCountry?.code}\n className={styles.dropdownItem}\n onClick={() => handleCountrySelect(country)}\n >\n {renderFlag(country.iso, country.name)}\n <span className={styles.dropdownItemCode}>{country.code}</span>\n <span className={styles.dropdownItemName}>{country.name}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n\n <input\n type=\"tel\"\n inputMode=\"numeric\"\n autoComplete=\"off\"\n value={activeNumber}\n maxLength={maxLength}\n ref={inputRef}\n className={cx(styles.input, error && styles.inputError)}\n placeholder={t?.('planPhoneNumberPlaceholder') ?? '0000000000'}\n onChange={handlePhoneChange}\n onFocus={handlePhoneFocus}\n />\n </div>\n\n {helperText && <div className={styles.helper}>{helperText}</div>}\n {error && <p className={styles.error}>{error}</p>}\n </div>\n );\n};\n","import React from 'react';\n\n/** Star rating icon shown on `AstrologerPhoto`'s rating pill */\nexport const StarIcon: React.FC = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden>\n <path\n d=\"M8 1.33337L10.06 5.50671L14.6667 6.18004L11.3333 9.42671L12.12 14.0134L8 11.8467L3.88 14.0134L4.66667 9.42671L1.33333 6.18004L5.94 5.50671L8 1.33337Z\"\n fill=\"#F59E0B\"\n stroke=\"#F59E0B\"\n strokeWidth=\"1.2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\n/** Filled check-circle shown on a selected `AstrologerCard` */\nexport const CheckCircleIcon: React.FC = () => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" aria-hidden>\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\"\n fill=\"#F97316\"\n />\n </svg>\n);\n","import React from 'react';\nimport { StarIcon } from './icons';\nimport styles from './AstrologerCard.module.scss';\n\n/** Neutral, dependency-free placeholder avatar (gray circle + person glyph). */\nconst DEFAULT_FALLBACK_PHOTO =\n \"data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='64' height='78' viewBox='0 0 64 78'><rect width='64' height='78' fill='%23F3F4F6'/><circle cx='32' cy='30' r='12' fill='%23D1D5DB'/><path d='M12 70c2-14 12-22 20-22s18 8 20 22' fill='%23D1D5DB'/></svg>\";\n\nexport interface AstrologerPhotoProps {\n photoUrl: string;\n name: string;\n rating: number;\n /** Shown when `photoUrl` is empty or fails to load. Defaults to a neutral avatar glyph. */\n fallbackPhotoUrl?: string;\n}\n\nexport const AstrologerPhoto: React.FC<AstrologerPhotoProps> = ({\n photoUrl,\n name,\n rating,\n fallbackPhotoUrl = DEFAULT_FALLBACK_PHOTO,\n}) => (\n <div className={styles.photoWrap}>\n <div className={styles.photoFrame}>\n <img\n src={photoUrl || fallbackPhotoUrl}\n alt={name}\n width={64}\n height={78}\n className={styles.photoImg}\n onError={(event) => {\n (event.target as HTMLImageElement).src = fallbackPhotoUrl;\n }}\n />\n </div>\n <div className={styles.ratingPill}>\n <span className={styles.ratingValue}>{rating}</span>\n <StarIcon />\n </div>\n </div>\n);\n","import React from 'react';\nimport styles from './AstrologerCard.module.scss';\n\nexport interface RecommendedBadgeProps {\n /** Wins over `t(\"planRecommendedAstrologer\")`. */\n label?: string;\n t?: (key: string, options?: any) => string | undefined;\n}\n\nexport const RecommendedBadge: React.FC<RecommendedBadgeProps> = ({ label, t }) => (\n <div className={styles.recommendedBadge}>\n <span className={styles.recommendedLabel}>\n {label ?? t?.('planRecommendedAstrologer') ?? 'Recommended'}\n </span>\n </div>\n);\n","import React from 'react';\nimport type { AstrologerListItem } from './types';\nimport { AstrologerPhoto } from './AstrologerPhoto';\nimport { RecommendedBadge } from './RecommendedBadge';\nimport { CheckCircleIcon } from './icons';\nimport styles from './AstrologerCard.module.scss';\n\nconst cx = (...classNames: (string | false | undefined)[]) =>\n classNames.filter(Boolean).join(' ');\n\n/** e.g. 1200 → \"1.2K consultations\" */\nconst defaultFormatConsultationCount = (count: number): string => {\n if (count >= 1000) {\n const k = count / 1000;\n return `${Number.isInteger(k) ? k : k.toFixed(1)}K consultations`;\n }\n return `${count} consultations`;\n};\n\nexport interface AstrologerCardProps {\n astrologer: AstrologerListItem;\n isSelected?: boolean;\n onClick?: (astrologer: AstrologerListItem) => void;\n /** Passed through to `AstrologerPhoto`. */\n fallbackPhotoUrl?: string;\n formatConsultationCount?: (count: number) => string;\n}\n\nexport const AstrologerCard: React.FC<AstrologerCardProps> = ({\n astrologer,\n isSelected = false,\n onClick,\n fallbackPhotoUrl,\n formatConsultationCount = defaultFormatConsultationCount,\n}) => (\n <button\n type=\"button\"\n onClick={() => onClick?.(astrologer)}\n className={cx(styles.card, isSelected && styles.cardSelected)}\n >\n <AstrologerPhoto\n photoUrl={astrologer.photo_url}\n name={astrologer.name}\n rating={astrologer.rating}\n fallbackPhotoUrl={fallbackPhotoUrl}\n />\n\n <div className={styles.info}>\n <span className={styles.name}>{astrologer.name}</span>\n <div className={styles.meta}>\n <span className={styles.languages}>{astrologer.languages.join(', ')}</span>\n <span className={styles.consultationCount}>\n {formatConsultationCount(astrologer.consultation_count)}\n </span>\n </div>\n </div>\n\n {isSelected && (\n <div className={styles.checkIcon}>\n <CheckCircleIcon />\n </div>\n )}\n\n {astrologer.is_recommended && <RecommendedBadge />}\n </button>\n);\n","/**\n * AstrologerList — horizontally scrollable astrologer picker, extracted from\n * the hanuman app's astro-consultation slot-selection sheet\n * (src/features/epuja/order-details/components/astro-consultation/slot-selection-sheet)\n * so consultation-booking hosts get a real astrologer picker instead of the\n * generic `AstrologyProfilesSection` placeholder.\n *\n * Controlled-optional: pass `selectedAstrologerId` + `onAstrologerSelect` to\n * drive it from the host, or omit them and it manages its own state.\n */\nimport React, { useState } from 'react';\nimport type { AstrologerListItem } from './types';\nimport { AstrologerCard } from './AstrologerCard';\nimport styles from './AstrologerList.module.scss';\n\nconst cx = (...classNames: (string | false | undefined)[]) =>\n classNames.filter(Boolean).join(' ');\n\nexport interface AstrologerListProps {\n astrologers: AstrologerListItem[];\n /** Renders shimmer skeleton cards instead of the astrologer list. */\n loading?: boolean;\n /** Selected astrologer id. Omit to let the component manage it. */\n selectedAstrologerId?: string;\n onAstrologerSelect?: (astrologer: AstrologerListItem) => void;\n /** Section title. Wins over `t(\"planSelectAstrologerHeading\")`. */\n title?: string;\n fallbackPhotoUrl?: string;\n formatConsultationCount?: (count: number) => string;\n /** Translation lookup; every string falls back to the English default. */\n t?: (key: string, options?: any) => string | undefined;\n className?: string;\n}\n\nexport const AstrologerList: React.FC<AstrologerListProps> = ({\n astrologers,\n loading = false,\n selectedAstrologerId,\n onAstrologerSelect,\n title,\n fallbackPhotoUrl,\n formatConsultationCount,\n t,\n className = '',\n}) => {\n const [internalSelectedId, setInternalSelectedId] = useState('');\n const activeId = selectedAstrologerId ?? internalSelectedId;\n\n const handleSelect = (astrologer: AstrologerListItem) => {\n setInternalSelectedId(astrologer.astrologer_id);\n onAstrologerSelect?.(astrologer);\n };\n\n return (\n <section className={cx(styles.section, className)}>\n <p className={styles.title}>\n {title ?? t?.('planSelectAstrologerHeading') ?? 'Select an astrologer'}\n </p>\n\n <div className={styles.row} role=\"radiogroup\" aria-label=\"Astrologer\">\n {loading\n ? Array.from({ length: 2 }).map((_, idx) => (\n <div key={idx} className={cx(styles.skeletonCard, styles.skeletonShimmer)} />\n ))\n : astrologers.map((astrologer) => (\n <AstrologerCard\n key={astrologer.astrologer_id}\n astrologer={astrologer}\n isSelected={astrologer.astrologer_id === activeId}\n onClick={handleSelect}\n fallbackPhotoUrl={fallbackPhotoUrl}\n formatConsultationCount={formatConsultationCount}\n />\n ))}\n </div>\n </section>\n );\n};\n","/** Dummy astrologer data for Storybook / local previews. */\nimport type { AstrologerListItem } from './types';\n\nexport const MOCK_ASTROLOGERS: AstrologerListItem[] = [\n {\n astrologer_id: 'astro-1',\n name: 'Pandit Ramesh Sharma',\n photo_url: '',\n languages: ['Hindi', 'English'],\n rating: 4.8,\n consultation_count: 12500,\n is_recommended: true,\n },\n {\n astrologer_id: 'astro-2',\n name: 'Dr. Anjali Mehta',\n photo_url: '',\n languages: ['English', 'Gujarati'],\n rating: 4.6,\n consultation_count: 870,\n },\n {\n astrologer_id: 'astro-3',\n name: 'Acharya Vivek Joshi',\n photo_url: '',\n languages: ['Hindi', 'Marathi', 'English'],\n rating: 4.9,\n consultation_count: 3400,\n },\n];\n"],"names":["DEFAULT_INITIAL_VISIBLE","MAX_TESTIMONIALS","buildTestimonialsFromTranslations","itemsByIndex","i","quoteKey","quote","authorKey","authorName","v","avatarKey","avatar","maleIndices","femaleIndices","mixed","m","f","idx","item","UserReviewsSection","testimonialsProp","initialVisible","readMoreHref","onReadMore","className","headingClassName","testimonials","useMemo","expanded","setExpanded","useState","hasMore","visibleTestimonials","title","ratingLabel","trustText","readMoreLabel","readLessLabel","jsxs","styles","jsx","index","e","FAQAccordion","items","resolveAnswerKey","defaultOpenIndex","onItemOpen","resolvedItems","qKey","aKey","openIndex","setOpenIndex","isOpen","nextOpen","DEFAULT_LOGO_WIDTH","DEFAULT_LOGO_HEIGHT","PageHeader","logoUrl","ImageComponent","languageSelector","showLanguageSelector","showSlot","brandName","ratingText","FormContainer","children","ariaLabel","BackIcon","FormSectionHeader","subtitle","onBack","backAriaLabel","DEFAULT_SHIELD_ICON","PrivacyBanner","text","iconUrl","DEFAULT_INFO_ICON","FormField","label","id","required","help","infoTooltip","infoAriaLabel","infoIconUrl","infoOpen","setInfoOpen","useEffect","onDoc","onKey","FormTextInput","iconAlt","iconInteractive","onIconClick","rest","ICON_DATE","FormDateInput","value","onChange","inputRef","useRef","maxDate","d","pad","n","handleIconClick","el","ICON_TIME","FormTimeInput","placeholder","disabled","ICON_LOCATION","FormLocationInput","FormSegmentedControl","options","opt","FormTagPills","selected","toggle","key","k","FormCheckboxWithHelp","checked","primaryText","helpText","FormFooterNote","FooterShell","marquee","FooterCTAButton","href","onClick","staticOnly","buttonClass","staticClass","ariaProps","CircularMarquee","MarqueeStrip","ContactUsSection","whatsAppLine","emailLine","formatSlotTime","isoDateTime","match","hour24","minute","period","formatSlotDayLabel","isoDate","referenceDate","dayNames","date","startOfDay","diffDays","dayLabel","CONSULTATION_PERIOD_ORDER","CONSULTATION_LANGUAGE_OPTIONS","CheckIcon","ChevronDownIcon","MorningIcon","AfternoonIcon","EveningIcon","CalendarOffIcon","PhoneNumberSection","countryCode","phoneNumber","helperText","onEdit","t","PLACEHOLDER_PROFILES","AstrologyProfilesSection","profiles","selectedProfileId","onProfileSelect","onAddProfile","internalSelectedId","setInternalSelectedId","activeId","handleSelect","profileId","profile","isSelected","PERIOD_ICONS","PERIOD_LABEL_KEYS","cx","classNames","ConsultationSlotSelector","days","loading","error","onRetry","selectedDate","onDateSelect","selectedPeriod","onPeriodSelect","selectedSlotStart","onSlotSelect","hideLanguageSelector","languageOptions","selectedLanguage","onLanguageSelect","showPhoneNumberSection","phoneNumberSection","showAstrologyProfilesSection","astrologyProfilesSection","heading","timezoneLabel","languageLabel","reportReadyNote","isGlobal","availableDays","internalDate","setInternalDate","activeDate","candidate","activeDay","periodsForActiveDay","present","s","internalPeriod","setInternalPeriod","activePeriod","slotsForActivePeriod","internalSlotStart","setInternalSlotStart","activeSlotStart","internalLanguage","setInternalLanguage","activeLanguage","activeLanguageOption","option","isLanguageMenuOpen","setIsLanguageMenuOpen","languageMenuRef","handleClickOutside","event","dateTabsRef","dateTabRefs","dateIndicatorRect","setDateIndicatorRect","periodTabsRef","periodTabRefs","periodIndicatorRect","setPeriodIndicatorRect","measure","container","activeTab","containerRect","tabRect","handleDateSelect","handlePeriodSelect","handleSlotSelect","slot","handleLanguageSelect","code","Fragment","prev","_","day","dayNum","Icon","isEveningNight","labelKey","OFFSET","toIsoDate","month","makeSlot","hour","endMinute","endHour","SLOT_TIMES","buildDay","dayOffset","periods","slots","MOCK_SLOT_DAYS","MOCK_SLOT_DAYS_EMPTY","DEFAULT_COUNTRIES","getFlagEmoji","iso","codePoints","char","PHONE_PATTERNS","DEFAULT_PATTERN","validatePhoneByCountryCode","validation","getMaxLengthForCountry","usePhoneNumberInput","contactNumber","countries","onCountryCodeChange","onPhoneNumberChange","onValidationChange","onDropdownFocus","onInputFocus","isDropdownOpen","setIsDropdownOpen","selectedCountry","c","maxLength","handleCountrySelect","useCallback","country","isValid","handlePhoneChange","trimmedValue","handleDropdownToggle","handlePhoneFocus","PhoneNumberInput","getFlagUrl","internalCountryCode","setInternalCountryCode","internalNumber","setInternalNumber","activeCountryCode","activeNumber","dropdownRef","closeDropdown","name","renderFlag","alt","flagUrl","StarIcon","CheckCircleIcon","DEFAULT_FALLBACK_PHOTO","AstrologerPhoto","photoUrl","rating","fallbackPhotoUrl","RecommendedBadge","defaultFormatConsultationCount","count","AstrologerCard","astrologer","formatConsultationCount","AstrologerList","astrologers","selectedAstrologerId","onAstrologerSelect","MOCK_ASTROLOGERS"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;GAGMA,KAA0B,GAC1BC,KAAmB;AASzB,SAASC,GACP,GACe;AACf,QAAMC,wBAAmB,IAAA;AAEzB,WAASC,IAAI,GAAGA,KAAKH,IAAkBG,KAAK,GAAG;AAC7C,UAAMC,IAAW,sBAAsBD,CAAC,IAClCE,IAAQ,EAAED,CAAQ;AACxB,QAAI,CAACC,KAASA,MAAUD,EAAU;AAElC,UAAME,IAAY,iBAAiBH,CAAC,IAC9BI,KAAc,MAAM;AACxB,YAAMC,IAAI,EAAEF,CAAS;AACrB,aAAOE,KAAKA,MAAMF,IAAYE,IAAI,EAAE,OAAO;AAAA,IAC7C,GAAA,GAEMC,IAAY,iBAAiBN,CAAC,aAC9BO,KAAU,MAAM;AACpB,YAAMF,IAAI,EAAEC,CAAS;AACrB,aAAOD,KAAKA,MAAMC,IAAYD,IAAI;AAAA,IACpC,GAAA;AAEA,IAAAN,EAAa,IAAIC,GAAG;AAAA,MAClB,OAAAE;AAAA,MACA,YAAAE;AAAA,MACA,iBAAiBG;AAAA,MACjB,QAAQ;AAAA,IAAA,CACT;AAAA,EACH;AAEA,QAAMC,IAAwB,CAAA,GACxBC,IAA0B,CAAA;AAChC,WAAST,IAAI,GAAGA,KAAKH,IAAkBG,KAAK;AAC1C,IAAIA,KAAK,IAAGS,EAAc,KAAKT,CAAC,IAC3BQ,EAAY,KAAKR,CAAC;AAGzB,QAAMU,IAAuB,CAAA;AAC7B,MAAIC,IAAI,GACJC,IAAI;AACR,SAAOD,IAAIH,EAAY,UAAUI,IAAIH,EAAc,UAAQ;AACzD,QAAIG,IAAIH,EAAc,QAAQ;AAC5B,YAAMI,IAAMJ,EAAcG,GAAG,GACvBE,IAAOf,EAAa,IAAIc,CAAG;AACjC,MAAIC,KAAMJ,EAAM,KAAKI,CAAI;AAAA,IAC3B;AACA,QAAIH,IAAIH,EAAY,QAAQ;AAC1B,YAAMK,IAAML,EAAYG,GAAG,GACrBG,IAAOf,EAAa,IAAIc,CAAG;AACjC,MAAIC,KAAMJ,EAAM,KAAKI,CAAI;AAAA,IAC3B;AAAA,EACF;AAEA,SAAOJ;AACT;AAiBO,SAASK,GAAmB;AAAA,EACjC;AAAA,EACA,cAAcC;AAAA,EACd,gBAAAC,IAAiBrB;AAAA,EACjB,cAAAsB;AAAA,EACA,YAAAC;AAAA,EACA,WAAAC,IAAY;AAAA,EACZ,kBAAAC;AACF,GAA4B;AAC1B,QAAMC,IACJN,KACAO,EAAQ,MAAMzB,GAAkC,CAAC,GAAG,CAAC,CAAC,CAAC,GAEnD,CAAC0B,GAAUC,CAAW,IAAIC,EAAS,EAAK,GACxCC,IAAUL,EAAa,SAASL,GAChCW,IACJD,KAAW,CAACH,IAAWF,EAAa,MAAM,GAAGL,CAAc,IAAIK,GAE3DO,IAAQ,EAAE,eAAe,GACzBC,IAAc,EAAE,gBAAgB,GAChCC,IAAY,EAAE,eAAe,GAC7BC,IAAgB,EAAE,iBAAiB,GACnCC,IAAgB,EAAE,UAAU;AAElC,SACE,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,GAAGC,EAAO,OAAO,IAAIf,CAAS;AAAA,MACzC,mBAAgB;AAAA,MAEhB,UAAA;AAAA,QAAA,gBAAAgB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,IAAG;AAAA,YACH,WAAW,CAACD,EAAO,SAASd,CAAgB,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,YAErE,UAAAQ;AAAA,UAAA;AAAA,QAAA;AAAA,QAEH,gBAAAK,EAAC,KAAA,EAAE,WAAWC,EAAO,WACnB,UAAA;AAAA,UAAA,gBAAAC,EAAC,UAAK,WAAWD,EAAO,MAAM,eAAW,IAAC,UAAA,KAE1C;AAAA,UACA,gBAAAC,EAAC,QAAA,EAAK,WAAWD,EAAO,WAAY,UAAAL,GAAY;AAAA,4BAC/C,QAAA,EAAK,WAAWK,EAAO,KAAK,eAAW,IAAC;AAAA,UACzC,gBAAAC,EAAC,QAAA,EAAK,WAAWD,EAAO,WAAY,UAAAJ,EAAA,CAAU;AAAA,QAAA,GAChD;AAAA,QACA,gBAAAK,EAAC,MAAA,EAAG,WAAWD,EAAO,UACnB,UAAAP,EAAoB,IAAI,CAACd,GAAMuB,MAC9B,gBAAAH,EAAC,MAAA,EAAe,WAAWC,EAAO,MAChC,UAAA;AAAA,UAAA,gBAAAC,EAAC,KAAA,EAAE,WAAWD,EAAO,OAAQ,YAAK,OAAM;AAAA,UACxC,gBAAAD,EAAC,OAAA,EAAI,WAAWC,EAAO,QACpB,UAAA;AAAA,YAAArB,EAAK,kBACJ,gBAAAsB;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,KAAKtB,EAAK;AAAA,gBACV,KAAI;AAAA,gBACJ,WAAWqB,EAAO;AAAA,gBAClB,OAAO;AAAA,gBACP,QAAQ;AAAA,cAAA;AAAA,YAAA,IAGV,gBAAAC,EAAC,OAAA,EAAI,WAAWD,EAAO,mBAAmB,eAAW,IAAC;AAAA,YAExD,gBAAAD,EAAC,OAAA,EAAI,WAAWC,EAAO,YACrB,UAAA;AAAA,cAAA,gBAAAC,EAAC,QAAA,EAAK,WAAWD,EAAO,YAAa,YAAK,YAAW;AAAA,cACrD,gBAAAC,EAAC,QAAA,EAAK,WAAWD,EAAO,OAAO,eAAW,IACvC,UAAA,IAAI,OAAOrB,EAAK,UAAU,CAAC,EAAA,CAC9B;AAAA,YAAA,EAAA,CACF;AAAA,UAAA,EAAA,CACF;AAAA,QAAA,KApBOuB,CAqBT,CACD,GACH;AAAA,QACCV,KACC,gBAAAS,EAAC,OAAA,EAAI,WAAWD,EAAO,cACrB,UAAA,gBAAAD;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAWC,EAAO;AAAA,YAClB,SAAS,MAAMV,EAAY,CAACa,MAAM,CAACA,CAAC;AAAA,YACpC,iBAAed;AAAA,YAEd,UAAA;AAAA,cAAAA,IAAWS,IAAgBD;AAAA,gCAC3B,QAAA,EAAK,WAAWG,EAAO,OAAO,eAAW,IAAC,UAAA,IAAA,CAE3C;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA,GAEJ;AAAA,SAEAjB,KAAgBC,MAAe,CAACQ,uBAC/B,OAAA,EAAI,WAAWQ,EAAO,cACpB,UAAAjB,IACC,gBAAAgB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAMhB;AAAA,YACN,WAAWiB,EAAO;AAAA,YAClB,QAAO;AAAA,YACP,KAAI;AAAA,YAEH,UAAA;AAAA,cAAAH;AAAA,gCACA,QAAA,EAAK,WAAWG,EAAO,OAAO,eAAW,IAAC,UAAA,IAAA,CAE3C;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA,IAGF,gBAAAD;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAWC,EAAO;AAAA,YAClB,SAAS,MAAMhB,IAAA;AAAA,YAEd,UAAA;AAAA,cAAAa;AAAA,gCACA,QAAA,EAAK,WAAWG,EAAO,OAAO,eAAW,IAAC,UAAA,IAAA,CAE3C;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA,EACF,CAEJ;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIR;;;;;;;;;;;;;;AC9KO,SAASI,GAAa;AAAA,EAC3B;AAAA,EACA,OAAAC;AAAA,EACA,kBAAAC;AAAA,EACA,kBAAAC,IAAmB;AAAA,EACnB,YAAAC;AAAA,EACA,WAAAvB,IAAY;AAAA,EACZ,kBAAAC;AACF,GAAsB;AACpB,QAAMuB,IAAgBrB;AAAA,IACpB,MACEiB,EAAM,IAAI,CAAC,EAAE,MAAAK,GAAM,MAAAC,SAAY;AAAA,MAC7B,UAAU,EAAED,CAAI;AAAA,MAChB,QAAQ,EAAEJ,IAAmBA,EAAiBK,CAAI,IAAIA,CAAI;AAAA,IAAA,EAC1D;AAAA,IACJ,CAAC,GAAGN,GAAOC,CAAgB;AAAA,EAAA,GAGvB,CAACM,GAAWC,CAAY,IAAItB,EAAiBgB,CAAgB,GAC7Db,IAAQ,EAAE,UAAU;AAE1B,SACE,gBAAAK;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,GAAGC,EAAO,OAAO,IAAIf,CAAS;AAAA,MACzC,mBAAgB;AAAA,MAEhB,UAAA;AAAA,QAAA,gBAAAgB;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,IAAG;AAAA,YACH,WAAW,CAACD,EAAO,SAASd,CAAgB,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAAA,YAErE,UAAAQ;AAAA,UAAA;AAAA,QAAA;AAAA,QAEH,gBAAAO,EAAC,OAAA,EAAI,WAAWD,EAAO,WAAW,MAAK,QACpC,UAAAS,EAAc,IAAI,CAAC9B,GAAMuB,MAAU;AAClC,gBAAMY,IAASF,MAAcV;AAC7B,iBACE,gBAAAH;AAAA,YAAC;AAAA,YAAA;AAAA,cAEC,WAAW,GAAGC,EAAO,IAAI,IAAIc,IAASd,EAAO,WAAW,EAAE;AAAA,cAC1D,MAAK;AAAA,cAEL,UAAA;AAAA,gBAAA,gBAAAD;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,WAAWC,EAAO;AAAA,oBAClB,SAAS,MAAM;AACb,4BAAMe,IAAW,CAACD;AAClB,sBAAAD,EAAaC,IAAS,KAAKZ,CAAK,GAC5Ba,KAAUP,IAAa7B,EAAK,QAAQ;AAAA,oBAC1C;AAAA,oBACA,iBAAemC;AAAA,oBACf,iBAAe,cAAcZ,CAAK;AAAA,oBAClC,IAAI,gBAAgBA,CAAK;AAAA,oBAEzB,UAAA;AAAA,sBAAA,gBAAAD,EAAC,QAAA,EAAM,YAAK,SAAA,CAAS;AAAA,sBACrB,gBAAAA;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,WAAW,GAAGD,EAAO,OAAO,IAAIc,IAASd,EAAO,cAAc,EAAE;AAAA,0BAChE,eAAW;AAAA,0BAEX,UAAA,gBAAAC;AAAA,4BAAC;AAAA,4BAAA;AAAA,8BACC,OAAM;AAAA,8BACN,QAAO;AAAA,8BACP,SAAQ;AAAA,8BACR,MAAK;AAAA,8BACL,eAAW;AAAA,8BACX,WAAU;AAAA,8BAEV,UAAA,gBAAAA;AAAA,gCAAC;AAAA,gCAAA;AAAA,kCACC,GAAE;AAAA,kCACF,MAAK;AAAA,gCAAA;AAAA,8BAAA;AAAA,4BACP;AAAA,0BAAA;AAAA,wBACF;AAAA,sBAAA;AAAA,oBACF;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAEF,gBAAAA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,IAAI,cAAcC,CAAK;AAAA,oBACvB,MAAK;AAAA,oBACL,mBAAiB,gBAAgBA,CAAK;AAAA,oBACtC,WAAW,GAAGF,EAAO,UAAU,IAAIc,IAASd,EAAO,aAAa,EAAE;AAAA,oBAClE,QAAQ,CAACc;AAAA,oBAET,4BAAC,KAAA,EAAE,WAAWd,EAAO,QAAS,YAAK,OAAA,CAAO;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAC5C;AAAA,YAAA;AAAA,YA5CKE;AAAA,UAAA;AAAA,QA+CX,CAAC,EAAA,CACH;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;;;;;;;;;;;GCtFMc,KAAqB,KACrBC,KAAsB;AAErB,SAASC,GAAW;AAAA,EACzB;AAAA,EACA,SAAAC;AAAA,EACA,gBAAgBC;AAAA,EAChB,kBAAAC;AAAA,EACA,sBAAAC,IAAuB;AAAA,EACvB,WAAArC,IAAY;AACd,GAAoB;AAClB,QAAMsC,IAAWD,KAAwBD,KAAoB,MACvDG,IAAY,EAAE,WAAW,GACzBC,IAAa,EAAE,YAAY;AAEjC,SACE,gBAAA1B,EAAC,YAAO,WAAW,GAAGC,EAAO,MAAM,IAAIf,CAAS,IAC9C,UAAA;AAAA,IAAA,gBAAAc,EAAC,OAAA,EAAI,WAAWC,EAAO,OACrB,UAAA;AAAA,MAAA,gBAAAC,EAAC,OAAA,EAAI,WAAWD,EAAO,MACpB,cACCoB,IACE,gBAAAnB;AAAA,QAACmB;AAAA,QAAA;AAAA,UACC,KAAKD;AAAA,UACL,KAAKK;AAAA,UACL,WAAWxB,EAAO;AAAA,UAClB,OAAOgB;AAAA,UACP,QAAQC;AAAA,QAAA;AAAA,MAAA,IAGV,gBAAAhB;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,KAAKkB;AAAA,UACL,KAAKK;AAAA,UACL,WAAWxB,EAAO;AAAA,UAClB,OAAOgB;AAAA,UACP,QAAQC;AAAA,UACR,UAAS;AAAA,QAAA;AAAA,MAAA,sBAIZ,OAAA,EAAI,WAAWjB,EAAO,iBAAiB,eAAW,IAAC,GAExD;AAAA,MACA,gBAAAD,EAAC,OAAA,EAAI,WAAWC,EAAO,WACrB,UAAA;AAAA,QAAA,gBAAAC,EAAC,QAAA,EAAK,WAAWD,EAAO,WAAY,UAAAwB,GAAU;AAAA,QAC7CC,KAAc,QAAQA,MAAe,wBACnC,QAAA,EAAK,WAAWzB,EAAO,QACrB,UAAAyB,EAAA,CACH;AAAA,MAAA,EAAA,CAEJ;AAAA,IAAA,GACF;AAAA,IACCF,KAAY,gBAAAtB,EAAC,OAAA,EAAI,WAAWD,EAAO,UAAW,UAAAqB,EAAA,CAAiB;AAAA,EAAA,GAClE;AAEJ;;;;;;ACrEO,SAASK,GAAc;AAAA,EAC5B,UAAAC;AAAA,EACA,WAAA1C,IAAY;AAAA,EACZ,cAAc2C;AAChB,GAAuB;AACrB,SACE,gBAAA3B;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,GAAGD,GAAO,IAAI,IAAIf,CAAS;AAAA,MACtC,cAAY2C;AAAA,MAEZ,UAAA,gBAAA3B,EAAC,OAAA,EAAI,WAAWD,GAAO,MACrB,UAAA,gBAAAC,EAAC,OAAA,EAAI,WAAWD,GAAO,WAAY,UAAA2B,EAAA,CAAS,EAAA,CAC9C;AAAA,IAAA;AAAA,EAAA;AAGN;;;;;;;;;GCvBME,KAAW,MACf,gBAAA5B;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,WAAWD,EAAO;AAAA,IAClB,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,OAAM;AAAA,IACN,eAAW;AAAA,IAEX,UAAA,gBAAAC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,gBAAe;AAAA,MAAA;AAAA,IAAA;AAAA,EACjB;AACF;AAcK,SAAS6B,GAAkB;AAAA,EAChC,OAAApC;AAAA,EACA,UAAAqC;AAAA,EACA,QAAAC;AAAA,EACA,eAAAC,IAAgB;AAAA,EAChB,WAAAhD,IAAY;AACd,GAA2B;AACzB,SACE,gBAAAgB,EAAC,UAAA,EAAO,WAAW,GAAGD,EAAO,MAAM,IAAIf,CAAS,IAC9C,UAAA,gBAAAc,EAAC,OAAA,EAAI,WAAWC,EAAO,MACpB,UAAA;AAAA,IAAAgC,KAAU,QACT,gBAAA/B;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAWD,EAAO;AAAA,QAClB,SAASgC;AAAA,QACT,cAAYC;AAAA,QAEZ,4BAACJ,IAAA,CAAA,CAAS;AAAA,MAAA;AAAA,IAAA;AAAA,IAGd,gBAAA9B,EAAC,OAAA,EAAI,WAAWC,EAAO,WACrB,UAAA;AAAA,MAAA,gBAAAC,EAAC,MAAA,EAAG,WAAWD,EAAO,OAAQ,UAAAN,GAAM;AAAA,MACnCqC,KAAY,QAAQA,MAAa,wBAC/B,KAAA,EAAE,WAAW/B,EAAO,UAAW,UAAA+B,EAAA,CAAS;AAAA,IAAA,EAAA,CAE7C;AAAA,EAAA,EAAA,CACF,EAAA,CACF;AAEJ;;;;;GC3DMG,KACJ;AAUK,SAASC,GAAc;AAAA,EAC5B,MAAAC;AAAA,EACA,SAAAC,IAAUH;AAAA,EACV,WAAAjD,IAAY;AACd,GAAuB;AACrB,SACE,gBAAAgB,EAAC,OAAA,EAAI,WAAW,GAAGD,GAAO,MAAM,IAAIf,CAAS,IAAI,MAAK,UACpD,UAAA,gBAAAc,EAAC,QAAA,EAAK,WAAWC,GAAO,MAAM,UAAA;AAAA,IAAA;AAAA,IAAC,gBAAAC;AAAA,MAAC;AAAA,MAAA;AAAA,QAC9B,KAAKoC;AAAA,QACL,KAAI;AAAA,QACJ,WAAWrC,GAAO;AAAA,QAClB,OAAO;AAAA,QACP,QAAQ;AAAA,QACR,eAAW;AAAA,MAAA;AAAA,IAAA;AAAA,IACX;AAAA,IAAEoC;AAAA,EAAA,EAAA,CAAK,EAAA,CACX;AAEJ;;;;;;;;;;;;;GC1BME,KAAoB;AAqBnB,SAASC,GAAU;AAAA,EACxB,OAAAC;AAAA,EACA,IAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,MAAAC;AAAA,EACA,aAAAC;AAAA,EACA,eAAAC,IAAgB;AAAA,EAChB,aAAAC,IAAcR;AAAA,EACd,UAAAX;AAAA,EACA,WAAA1C,IAAY;AACd,GAAmB;AACjB,QAAM,CAAC8D,GAAUC,CAAW,IAAIzD,EAAS,EAAK;AAE9C,SAAA0D,GAAU,MAAM;AACd,QAAI,CAACL,EAAa;AAClB,UAAMM,IAAQ,CAAC/C,MAAkB;AAE/B,MADUA,EAAE,QACL,UAAU,qBAAqB,KAAK,QAC3C6C,EAAY,EAAK;AAAA,IACnB,GACMG,IAAQ,CAAChD,MAAqB;AAClC,MAAIA,EAAE,QAAQ,YAAU6C,EAAY,EAAK;AAAA,IAC3C;AACA,oBAAS,iBAAiB,aAAaE,CAAK,GAC5C,SAAS,iBAAiB,WAAWC,CAAK,GACnC,MAAM;AACX,eAAS,oBAAoB,aAAaD,CAAK,GAC/C,SAAS,oBAAoB,WAAWC,CAAK;AAAA,IAC/C;AAAA,EACF,GAAG,CAACP,CAAW,CAAC,GAGd,gBAAA7C,EAAC,SAAI,WAAW,GAAGC,EAAO,KAAK,IAAIf,CAAS,IAC1C,UAAA;AAAA,IAAA,gBAAAc,EAAC,OAAA,EAAI,WAAWC,EAAO,UACrB,UAAA;AAAA,MAAA,gBAAAD,EAAC,SAAA,EAAM,WAAWC,EAAO,OAAO,SAASyC,GACtC,UAAA;AAAA,QAAAD;AAAA,QACAE,KAAY,gBAAAzC,EAAC,QAAA,EAAK,WAAWD,EAAO,KAAK,UAAA,IAAA,CAAC;AAAA,MAAA,GAC7C;AAAA,MACC4C,KAAe,QAAQA,MAAgB,MACtC,gBAAA7C,EAAC,SAAI,WAAWC,EAAO,UAAU,qBAAiB,IAChD,UAAA;AAAA,QAAA,gBAAAC;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,WAAWD,EAAO;AAAA,YAClB,cAAY6C;AAAA,YACZ,iBAAeE;AAAA,YACf,SAAS,MAAMC,EAAY,CAAC9E,MAAM,CAACA,CAAC;AAAA,YAEpC,UAAA,gBAAA+B;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAWD,EAAO;AAAA,gBAClB,KAAK8C;AAAA,gBACL,KAAI;AAAA,gBACJ,eAAW;AAAA,cAAA;AAAA,YAAA;AAAA,UACb;AAAA,QAAA;AAAA,QAEDC,KACC,gBAAAhD,EAAC,OAAA,EAAI,WAAWC,EAAO,SAAS,MAAK,WAClC,UAAA;AAAA,UAAA4C;AAAA,4BACA,QAAA,EAAK,WAAW5C,EAAO,cAAc,eAAW,GAAA,CAAC;AAAA,QAAA,EAAA,CACpD;AAAA,MAAA,EAAA,CAEJ;AAAA,IAAA,GAEJ;AAAA,IACC2C,KAAQ,QAAQA,MAAS,wBACvB,OAAA,EAAI,WAAW3C,EAAO,MAAO,UAAA2C,EAAA,CAAK;AAAA,IAErC,gBAAA1C,EAAC,OAAA,EAAI,WAAWD,EAAO,WAAY,UAAA2B,EAAA,CAAS;AAAA,EAAA,GAC9C;AAEJ;;;;;;;;AC/EO,SAASyB,GAAc;AAAA,EAC5B,IAAAX;AAAA,EACA,SAAAJ;AAAA,EACA,SAAAgB,IAAU;AAAA,EACV,iBAAAC,IAAkB;AAAA,EAClB,aAAAC;AAAA,EACA,WAAAtE,IAAY;AAAA,EACZ,GAAGuE;AACL,GAAuB;AACrB,SACE,gBAAAzD,EAAC,SAAI,WAAW,GAAGC,EAAO,IAAI,IAAIf,CAAS,IACzC,UAAA;AAAA,IAAA,gBAAAgB;AAAA,MAAC;AAAA,MAAA;AAAA,QACE,GAAGuD;AAAA,QACJ,IAAAf;AAAA,QACA,WAAWzC,EAAO;AAAA,QAClB,MAAMwD,EAAK,QAAQ;AAAA,MAAA;AAAA,IAAA;AAAA,IAEpBnB,KAAW,QACV,gBAAApC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,WACEqD,IACI,GAAGtD,EAAO,OAAO,IAAIA,EAAO,kBAAkB,KAC9CA,EAAO;AAAA,QAEb,cAAYqD,KAAW;AAAA,QACvB,SAASC,IAAkBC,IAAc;AAAA,QACzC,UAAUD,IAAkB,IAAI;AAAA,QAEhC,UAAA,gBAAArD;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWD,EAAO;AAAA,YAClB,KAAKqC;AAAA,YACL,KAAI;AAAA,YACJ,eAAW;AAAA,YACX,OAAO;AAAA,YACP,QAAQ;AAAA,UAAA;AAAA,QAAA;AAAA,MACV;AAAA,IAAA;AAAA,EACF,GAEJ;AAEJ;;;;;;GCpDMoB,KAAY;AAeX,SAASC,GAAc;AAAA,EAC5B,IAAAjB;AAAA,EACA,OAAAkB;AAAA,EACA,UAAAC;AAAA,EACA,aAAAL;AAAA,EACA,WAAAtE,IAAY;AAAA,EACZ,GAAGuE;AACL,GAAuB;AACrB,QAAMK,IAAWC,EAAyB,IAAI,GACxCC,IAAU3E,EAAQ,MAAM;AAC5B,UAAM4E,wBAAQ,KAAA,GACRC,IAAM,CAACC,MAAc,OAAOA,CAAC,EAAE,SAAS,GAAG,GAAG;AACpD,WAAO,GAAGF,EAAE,YAAA,CAAa,IAAIC,EAAID,EAAE,SAAA,IAAa,CAAC,CAAC,IAAIC,EAAID,EAAE,QAAA,CAAS,CAAC;AAAA,EACxE,GAAG,CAAA,CAAE,GAECG,IAAkB,MAAM;AAC5B,QAAIZ,GAAa;AACf,MAAAA,EAAA;AACA;AAAA,IACF;AACA,UAAMa,IAAKP,EAAS;AACpB,IACEO,KACA,OAAQA,EACL,cAAe,aAEjBA,EAAqD,WAAA,IAEtDA,GAAI,MAAA;AAAA,EAER;AAEA,SACE,gBAAArE,EAAC,SAAI,WAAW,GAAGC,GAAO,IAAI,IAAIf,CAAS,IACzC,UAAA;AAAA,IAAA,gBAAAgB;AAAA,MAAC;AAAA,MAAA;AAAA,QACE,GAAGuD;AAAA,QACJ,KAAKK;AAAA,QACL,IAAApB;AAAA,QACA,MAAK;AAAA,QACL,WAAWzC,GAAO;AAAA,QAClB,OAAA2D;AAAA,QACA,KAAKI;AAAA,QACL,UAAU,CAAC5D,MAAMyD,EAASzD,EAAE,OAAO,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,IAE1C,gBAAAF;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAW,GAAGD,GAAO,OAAO;AAAA,QAC5B,cAAW;AAAA,QACX,aAAa,CAACG,MAAMA,EAAE,eAAA;AAAA,QACtB,SAAS,CAACA,MAAM;AACd,UAAAA,EAAE,eAAA,GACFgE,EAAA;AAAA,QACF;AAAA,QAEA,UAAA,gBAAAlE;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWD,GAAO;AAAA,YAClB,KAAKyD;AAAA,YACL,KAAI;AAAA,YACJ,eAAW;AAAA,YACX,OAAO;AAAA,YACP,QAAQ;AAAA,UAAA;AAAA,QAAA;AAAA,MACV;AAAA,IAAA;AAAA,EACF,GACF;AAEJ;;;;;;GClFMY,KAAY;AAYX,SAASC,GAAc;AAAA,EAC5B,IAAA7B;AAAA,EACA,OAAAkB;AAAA,EACA,UAAAC;AAAA,EACA,aAAAW,IAAc;AAAA,EACd,UAAAC,IAAW;AAAA,EACX,aAAAjB;AAAA,EACA,WAAAtE,IAAY;AACd,GAAuB;AACrB,SACE,gBAAAc,EAAC,SAAI,WAAW,GAAGC,GAAO,IAAI,IAAIf,CAAS,IACzC,UAAA;AAAA,IAAA,gBAAAgB;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,IAAAwC;AAAA,QACA,MAAK;AAAA,QACL,WAAWzC,GAAO;AAAA,QAClB,OAAA2D;AAAA,QACA,UAAU,CAACxD,MAAMyD,EAASzD,EAAE,OAAO,KAAK;AAAA,QACxC,aAAAoE;AAAA,QACA,UAAAC;AAAA,QACA,SAAS,MAAM,CAACA,KAAYjB,IAAA;AAAA,MAAc;AAAA,IAAA;AAAA,IAE5C,gBAAAtD;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAWD,GAAO;AAAA,QAClB,cAAW;AAAA,QACX,UAAAwE;AAAA,QACA,SAAS,CAACrE,MAAM;AACd,UAAAA,EAAE,eAAA,GACGqE,KAAUjB,IAAA;AAAA,QACjB;AAAA,QAEA,UAAA,gBAAAtD;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWD,GAAO;AAAA,YAClB,KAAKqE;AAAA,YACL,KAAI;AAAA,YACJ,eAAW;AAAA,YACX,OAAO;AAAA,YACP,QAAQ;AAAA,UAAA;AAAA,QAAA;AAAA,MACV;AAAA,IAAA;AAAA,EACF,GACF;AAEJ;;;;;;GCrDMI,KAAgB;AASf,SAASC,GAAkB;AAAA,EAChC,IAAAjC;AAAA,EACA,SAAAJ,IAAUoC;AAAA,EACV,WAAAxF,IAAY;AAAA,EACZ,GAAGuE;AACL,GAA2B;AACzB,SACE,gBAAAzD,EAAC,SAAI,WAAW,GAAGC,GAAO,IAAI,IAAIf,CAAS,IACzC,UAAA;AAAA,IAAA,gBAAAgB,EAAC,SAAA,EAAO,GAAGuD,GAAM,IAAAf,GAAQ,WAAWzC,GAAO,OAAO,MAAK,QAAO;AAAA,sBAC7D,OAAA,EAAI,WAAWA,GAAO,SAAS,eAAW,IACzC,UAAA,gBAAAC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWD,GAAO;AAAA,QAClB,KAAKqC;AAAA,QACL,KAAI;AAAA,QACJ,OAAO;AAAA,QACP,QAAQ;AAAA,MAAA;AAAA,IAAA,EACV,CACF;AAAA,EAAA,GACF;AAEJ;;;;;;ACjBO,SAASsC,GAAqB;AAAA,EACnC,IAAAlC;AAAA,EACA,SAAAmC;AAAA,EACA,OAAAjB;AAAA,EACA,UAAAC;AAAA,EACA,WAAA3E,IAAY;AACd,GAA8B;AAC5B,SACE,gBAAAgB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,GAAGD,GAAO,SAAS,IAAIf,CAAS;AAAA,MAC3C,MAAK;AAAA,MACL,mBAAiB,GAAGwD,CAAE;AAAA,MAErB,UAAAmC,EAAQ,IAAI,CAACC,MACZ,gBAAA5E;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,MAAK;AAAA,UACL,IAAI4E,EAAI,UAAUlB,IAAQlB,IAAK;AAAA,UAC/B,WAAW,GAAGzC,GAAO,eAAe,IAAI6E,EAAI,UAAUlB,IAAQ3D,GAAO,SAAS,EAAE;AAAA,UAChF,SAAS,MAAM4D,EAASiB,EAAI,KAAK;AAAA,UAEhC,UAAAA,EAAI;AAAA,QAAA;AAAA,QANAA,EAAI;AAAA,MAAA,CAQZ;AAAA,IAAA;AAAA,EAAA;AAGP;;;;;;AC/BO,SAASC,GAAa;AAAA,EAC3B,IAAArC;AAAA,EACA,SAAAmC;AAAA,EACA,UAAAG;AAAA,EACA,UAAAnB;AAAA,EACA,WAAA3E,IAAY;AACd,GAAsB;AACpB,QAAM+F,IAAS,CAACC,MAAgB;AAC9B,IAAIF,EAAS,SAASE,CAAG,IACvBrB,EAASmB,EAAS,OAAO,CAACG,MAAMA,MAAMD,CAAG,CAAC,IAE1CrB,EAAS,CAAC,GAAGmB,GAAUE,CAAG,CAAC;AAAA,EAE/B;AAEA,SACE,gBAAAhF;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,GAAGD,GAAO,SAAS,IAAIf,CAAS;AAAA,MAC3C,MAAK;AAAA,MACL,mBAAiB,GAAGwD,CAAE;AAAA,MAErB,UAAAmC,EAAQ,IAAI,CAACC,MACZ,gBAAA5E;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,MAAK;AAAA,UACL,WAAW,GAAGD,GAAO,IAAI,IAAI+E,EAAS,SAASF,EAAI,GAAG,IAAI7E,GAAO,WAAW,EAAE;AAAA,UAC9E,SAAS,MAAMgF,EAAOH,EAAI,GAAG;AAAA,UAE5B,UAAAA,EAAI;AAAA,QAAA;AAAA,QALAA,EAAI;AAAA,MAAA,CAOZ;AAAA,IAAA;AAAA,EAAA;AAGP;;;;;;;;AChCO,SAASM,GAAqB;AAAA,EACnC,IAAA1C;AAAA,EACA,SAAA2C;AAAA,EACA,UAAAxB;AAAA,EACA,aAAAyB;AAAA,EACA,UAAAC;AAAA,EACA,WAAArG,IAAY;AACd,GAA8B;AAC5B,SACE,gBAAAc,EAAC,SAAI,WAAW,GAAGC,GAAO,OAAO,IAAIf,CAAS,IAC5C,UAAA;AAAA,IAAA,gBAAAc,EAAC,OAAA,EAAI,WAAWC,GAAO,aACrB,UAAA;AAAA,MAAA,gBAAAC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,IAAAwC;AAAA,UACA,MAAK;AAAA,UACL,WAAWzC,GAAO;AAAA,UAClB,SAAAoF;AAAA,UACA,UAAU,CAACjF,MAAMyD,EAASzD,EAAE,OAAO,OAAO;AAAA,QAAA;AAAA,MAAA;AAAA,wBAE3C,SAAA,EAAM,SAASsC,GAAI,WAAWzC,GAAO,cACnC,UAAAqF,EAAA,CACH;AAAA,IAAA,GACF;AAAA,IACCC,KAAY,QAAQA,MAAa,wBAC/B,KAAA,EAAE,WAAWtF,GAAO,cAAe,UAAAsF,EAAA,CAAS;AAAA,EAAA,GAEjD;AAEJ;;;;AC9BO,SAASC,GAAe;AAAA,EAC7B,UAAA5D;AAAA,EACA,WAAA1C,IAAY;AACd,GAAwB;AACtB,SAAO,gBAAAgB,EAAC,OAAE,WAAW,GAAGD,GAAO,UAAU,IAAIf,CAAS,IAAK,UAAA0C,EAAA,CAAS;AACtE;;;;;;;;;;;;;;;ACFO,SAAS6D,GAAY;AAAA,EAC1B,SAAAC;AAAA,EACA,UAAA9D;AAAA,EACA,WAAA1C,IAAY;AACd,GAAqB;AACnB,SACE,gBAAAgB,EAAC,UAAA,EAAO,WAAW,GAAGD,EAAO,MAAM,IAAIf,CAAS,IAAI,MAAK,eACvD,UAAA,gBAAAc,EAAC,OAAA,EAAI,WAAWC,EAAO,OACpB,UAAA;AAAA,IAAAyF,KAAW,0BACT,OAAA,EAAI,WAAWzF,EAAO,QAAQ,eAAW,IACvC,UAAAyF,EAAA,CACH;AAAA,IAEF,gBAAAxF,EAAC,OAAA,EAAI,WAAWD,EAAO,SAAU,UAAA2B,EAAA,CAAS;AAAA,EAAA,EAAA,CAC5C,EAAA,CACF;AAEJ;ACVO,SAAS+D,GAAgB;AAAA,EAC9B,UAAA/D;AAAA,EACA,MAAAgE;AAAA,EACA,UAAAnB,IAAW;AAAA,EACX,SAAAoB;AAAA,EACA,QAAQC,IAAa;AAAA,EACrB,WAAA5G,IAAY;AAAA,EACZ,cAAc2C;AAChB,GAAyB;AACvB,QAAMkE,IAAc,GAAG9F,EAAO,SAAS,IAAIf,CAAS,GAAG,KAAA,GACjD8G,IAAc,GAAG/F,EAAO,SAAS,IAAIf,CAAS,GAAG,KAAA,GACjD+G,IAAYpE,KAAa,OAAO,EAAE,cAAcA,EAAA,IAAc,CAAA;AAEpE,SAAIiE,sBAEC,OAAA,EAAI,WAAWE,GAAa,MAAK,gBAC/B,UAAApE,GACH,IAIAgE,KAAQ,OAER,gBAAA1F;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAA0F;AAAA,MACA,WAAWG;AAAA,MACX,QAAO;AAAA,MACP,KAAI;AAAA,MACJ,iBAAetB;AAAA,MACf,SAAS,CAACrE,MAAMqE,KAAYrE,EAAE,eAAA;AAAA,MAC7B,GAAG6F;AAAA,MAEH,UAAArE;AAAA,IAAA;AAAA,EAAA,IAML,gBAAA1B;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAW6F;AAAA,MACX,UAAAtB;AAAA,MACA,SAAAoB;AAAA,MACC,GAAGI;AAAA,MAEH,UAAArE;AAAA,IAAA;AAAA,EAAA;AAGP;;;;;ACpDO,SAASsE,GAAgB,EAAE,UAAAtE,GAAU,WAAA1C,IAAY,MAA4B;AAClF,SACE,gBAAAgB,EAAC,OAAA,EAAI,WAAW,GAAGD,GAAO,OAAO,IAAIf,CAAS,IAAI,eAAW,IAC3D,UAAA,gBAAAc,EAAC,OAAA,EAAI,WAAWC,GAAO,OACpB,UAAA;AAAA,IAAA2B;AAAA,IACAA;AAAA,EAAA,EAAA,CACH,EAAA,CACF;AAEJ;;;;ACTO,SAASuE,GAAa,EAAE,UAAAvE,GAAU,WAAA1C,IAAY,MAAyB;AAC5E,2BACG,OAAA,EAAI,WAAW,GAAGe,GAAO,KAAK,IAAIf,CAAS,IAAI,MAAK,UAAS,cAAW,gBACvE,UAAA,gBAAAgB,EAACgG,IAAA,EAAiB,UAAAtE,GAAS,GAC7B;AAEJ;;;;;;;;ACFO,SAASwE,GAAiB;AAAA,EAC/B,OAAAzG;AAAA,EACA,WAAA8B;AAAA,EACA,cAAA4E;AAAA,EACA,WAAAC;AAAA,EACA,WAAApH,IAAY;AACd,GAA0B;AACxB,SACE,gBAAAc,EAAC,WAAA,EAAQ,WAAW,GAAGC,EAAO,OAAO,IAAIf,CAAS,IAAI,mBAAgB,mBACpE,UAAA;AAAA,IAAA,gBAAAgB,EAAC,QAAG,IAAG,mBAAkB,WAAWD,EAAO,SACxC,UAAAN,GACH;AAAA,IACA,gBAAAK,EAAC,OAAA,EAAI,WAAWC,EAAO,SACrB,UAAA;AAAA,MAAA,gBAAAC,EAAC,KAAA,EAAE,WAAWD,EAAO,WAAY,UAAAwB,GAAU;AAAA,MAC3C,gBAAAvB,EAAC,KAAA,EAAE,WAAWD,EAAO,MAAO,UAAAoG,GAAa;AAAA,MACzC,gBAAAnG,EAAC,KAAA,EAAE,WAAWD,EAAO,MAAO,UAAAqG,EAAA,CAAU;AAAA,IAAA,EAAA,CACxC;AAAA,EAAA,GACF;AAEJ;ACxBO,MAAMC,KAAiB,CAACC,MAAgC;AAC7D,QAAMC,IAAQD,EAAY,MAAM,kBAAkB;AAClD,MAAI,CAACC,EAAO,QAAOD;AACnB,QAAME,IAAS,OAAOD,EAAM,CAAC,CAAC,GACxBE,IAASF,EAAM,CAAC,GAChBG,IAASF,KAAU,KAAK,OAAO;AAErC,SAAO,GADQA,IAAS,MAAM,EACd,IAAIC,CAAM,IAAIC,CAAM;AACtC,GAGaC,KAAqB,CAChCC,GACAC,IAAsB,oBAAI,WACI;AAC9B,QAAMC,IAAW,CAAC,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO,KAAK,GAC3DC,IAAO,oBAAI,KAAK,GAAGH,CAAO,WAAW;AAC3C,MAAI,OAAO,MAAMG,EAAK,QAAA,CAAS;AAC7B,WAAO,EAAE,IAAIH,GAAS,UAAUA,GAAS,QAAQ,GAAA;AAGnD,QAAMI,IAAa,CAACjD,MAClB,IAAI,KAAKA,EAAE,YAAA,GAAeA,EAAE,YAAYA,EAAE,QAAA,CAAS,EAAE,QAAA,GACjDkD,IAAW,KAAK;AAAA,KACnBD,EAAWD,CAAI,IAAIC,EAAWH,CAAa,MAAM,MAAO,KAAK,KAAK;AAAA,EAAA,GAG/DK,IACJD,MAAa,IAAI,UAAUA,MAAa,IAAI,aAAaH,EAASC,EAAK,OAAA,CAAQ;AAEjF,SAAO,EAAE,IAAIH,GAAS,UAAAM,GAAU,QAAQ,OAAOH,EAAK,QAAA,CAAS,EAAA;AAC/D,GAEaI,KAAsD;AAAA,EACjE;AAAA,EACA;AAAA,EACA;AACF,GAOaC,KAA8D;AAAA,EACzE,EAAE,MAAM,MAAM,UAAU,6BAA6B,OAAO,UAAA;AAAA,EAC5D,EAAE,MAAM,MAAM,UAAU,2BAA2B,OAAO,QAAA;AAAA,EAC1D,EAAE,MAAM,MAAM,UAAU,4BAA4B,OAAO,SAAA;AAAA,EAC3D,EAAE,MAAM,MAAM,UAAU,6BAA6B,OAAO,UAAA;AAAA,EAC5D,EAAE,MAAM,MAAM,UAAU,8BAA8B,OAAO,WAAA;AAAA,EAC7D,EAAE,MAAM,MAAM,UAAU,6BAA6B,OAAO,UAAA;AAAA,EAC5D,EAAE,MAAM,MAAM,UAAU,2BAA2B,OAAO,QAAA;AAC5D,GC9DaC,KAAsB,MACjC,gBAAArH,EAAC,OAAA,EAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,eAAW,IACrE,UAAA,gBAAAA;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,GAAE;AAAA,IACF,QAAO;AAAA,IACP,aAAY;AAAA,IACZ,eAAc;AAAA,IACd,gBAAe;AAAA,EAAA;AACjB,GACF,GAIWsH,KAA4B,MACvC,gBAAAtH;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,OAAM;AAAA,IACN,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,QAAO;AAAA,IACP,aAAY;AAAA,IACZ,eAAc;AAAA,IACd,gBAAe;AAAA,IACf,eAAW;AAAA,IAEX,UAAA,gBAAAA,EAAC,QAAA,EAAK,GAAE,eAAA,CAAe;AAAA,EAAA;AACzB,GAIWuH,KAAwB,MACnC,gBAAAvH;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,KAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,KAAI;AAAA,IACJ,eAAW;AAAA,EAAA;AACb,GAIWwH,KAA0B,MACrC,gBAAAxH;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,KAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,KAAI;AAAA,IACJ,eAAW;AAAA,EAAA;AACb,GAIWyH,KAAwB,MACnC,gBAAAzH;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,KAAI;AAAA,IACJ,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,KAAI;AAAA,IACJ,eAAW;AAAA,EAAA;AACb,GAIW0H,KAA4B,MACvC,gBAAA5H,EAAC,OAAA,EAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,eAAW,IACrE,UAAA;AAAA,EAAA,gBAAAE,EAAC,QAAA,EAAK,GAAE,KAAI,GAAE,OAAM,OAAM,MAAK,QAAO,MAAK,IAAG,KAAI,QAAO,WAAU,aAAY,OAAM;AAAA,oBACpF,QAAA,EAAK,GAAE,aAAY,QAAO,WAAU,aAAY,OAAM;AAAA,EACvD,gBAAAA,EAAC,UAAK,GAAE,qBAAoB,QAAO,WAAU,aAAY,OAAM,eAAc,QAAA,CAAQ;AAAA,EACrF,gBAAAA,EAAC,UAAK,GAAE,kBAAiB,QAAO,WAAU,aAAY,OAAM,eAAc,QAAA,CAAQ;AAAA,GACpF;;;;;;;;;GC5CW2H,KAAwD,CAAC;AAAA,EACpE,OAAAlI;AAAA,EACA,aAAAmI,IAAc;AAAA,EACd,aAAAC,IAAc;AAAA,EACd,YAAAC;AAAA,EACA,QAAAC;AAAA,EACA,GAAAC;AAAA,EACA,WAAAhJ,IAAY;AACd,MACE,gBAAAc,EAAC,WAAA,EAAQ,WAAW,CAACC,EAAO,SAASf,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GACtE,UAAA;AAAA,EAAA,gBAAAc,EAAC,OAAA,EAAI,WAAWC,EAAO,WACrB,UAAA;AAAA,IAAA,gBAAAC,EAAC,QAAA,EAAK,WAAWD,EAAO,OACrB,eAASiI,IAAI,wBAAwB,KAAK,oBAAA,CAC7C;AAAA,IACCD,KACC,gBAAA/H,EAAC,UAAA,EAAO,MAAK,UAAS,WAAWD,EAAO,WAAW,SAASgI,GACzD,UAAAC,IAAI,uBAAuB,KAAK,SAAA,CACnC;AAAA,EAAA,GAEJ;AAAA,EAEA,gBAAAlI,EAAC,OAAA,EAAI,WAAWC,EAAO,WACrB,UAAA;AAAA,IAAA,gBAAAC,EAAC,QAAA,EAAK,WAAWD,EAAO,aAAc,UAAA6H,GAAY;AAAA,IAClD,gBAAA5H,EAAC,QAAA,EAAK,WAAWD,EAAO,QAAS,UAAA8H,EAAA,CAAY;AAAA,EAAA,GAC/C;AAAA,EAEA,gBAAA7H,EAAC,OAAE,WAAWD,EAAO,QAClB,UAAA+H,KACCE,IAAI,uBAAuB,KAC3B,mEAAA,CACJ;AAAA,EAAA,CACF;;;;;;;;;;;;;GCnCIC,KAA2C;AAAA,EAC/C;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,UAAU;AAAA,EAAA;AAAA,EAEZ;AAAA,IACE,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,UAAU;AAAA,EAAA;AAEd,GAiBaC,KAAoE,CAAC;AAAA,EAChF,OAAAzI;AAAA,EACA,UAAA0I,IAAWF;AAAA,EACX,mBAAAG;AAAA,EACA,iBAAAC;AAAA,EACA,cAAAC;AAAA,EACA,GAAAN;AAAA,EACA,WAAAhJ,IAAY;AACd,MAAM;AACJ,QAAM,CAACuJ,GAAoBC,CAAqB,IAAIlJ,EAAS6I,EAAS,CAAC,GAAG,MAAM,EAAE,GAC5EM,IAAWL,KAAqBG,GAEhCG,IAAe,CAACC,MAAsB;AAC1C,IAAAH,EAAsBG,CAAS,GAC/BN,IAAkBM,CAAS;AAAA,EAC7B;AAEA,SACE,gBAAA7I,EAAC,WAAA,EAAQ,WAAW,CAACC,EAAO,SAASf,CAAS,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG,GACtE,UAAA;AAAA,IAAA,gBAAAgB,EAAC,KAAA,EAAE,WAAWD,EAAO,OAClB,eAASiI,IAAI,8BAA8B,KAAK,oBAAA,CACnD;AAAA,IAEA,gBAAAlI,EAAC,SAAI,WAAWC,EAAO,YAAY,MAAK,cAAa,cAAW,qBAC7D,UAAA;AAAA,MAAAoI,EAAS,IAAI,CAACS,MAAY;AACzB,cAAMC,IAAaD,EAAQ,OAAOH;AAClC,eACE,gBAAA3I;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,MAAK;AAAA,YACL,MAAK;AAAA,YACL,gBAAc+I;AAAA,YACd,WAAW,CAAC9I,EAAO,aAAa8I,IAAa9I,EAAO,sBAAsB,EAAE,EACzE,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,YACX,SAAS,MAAM2I,EAAaE,EAAQ,EAAE;AAAA,YAEtC,UAAA;AAAA,cAAA,gBAAA9I,EAAC,QAAA,EAAK,WAAWC,EAAO,YACtB,UAAA;AAAA,gBAAA,gBAAAC,EAAC,QAAA,EAAK,WAAWD,EAAO,QAAQ,eAAW,IACxC,UAAA6I,EAAQ,KAAK,OAAO,CAAC,EAAE,YAAA,GAC1B;AAAA,kCACC,QAAA,EAAK,WAAW7I,EAAO,aAAc,YAAQ,KAAA,CAAK;AAAA,cAAA,GACrD;AAAA,cACC6I,EAAQ,YAAY,gBAAA5I,EAAC,QAAA,EAAK,WAAWD,EAAO,cAAe,YAAQ,SAAA,CAAS;AAAA,cAC5E6I,EAAQ,gBACP,gBAAA5I,EAAC,QAAA,EAAK,WAAWD,EAAO,aAAc,YAAQ,aAAA,CAAa;AAAA,cAE5D6I,EAAQ,cACP,gBAAA5I,EAAC,QAAA,EAAK,WAAWD,EAAO,aAAc,YAAQ,WAAA,CAAW;AAAA,YAAA;AAAA,UAAA;AAAA,UApBtD6I,EAAQ;AAAA,QAAA;AAAA,MAwBnB,CAAC;AAAA,MAEAN,uBACE,UAAA,EAAO,MAAK,UAAS,WAAWvI,EAAO,SAAS,SAASuI,GACxD,UAAA;AAAA,QAAA,gBAAAtI,EAAC,UAAK,WAAWD,EAAO,SAAS,eAAW,IAAC,UAAA,KAE7C;AAAA,QACCiI,IAAI,yBAAyB,KAAK;AAAA,MAAA,EAAA,CACrC;AAAA,IAAA,EAAA,CAEJ;AAAA,EAAA,GACF;AAEJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GCjBMc,KAAyD;AAAA,EAC7D,SAASvB;AAAA,EACT,WAAWC;AAAA,EACX,SAASC;AACX,GAEMsB,KAA4D;AAAA,EAChE,SAAS;AAAA,EACT,WAAW;AAAA,EACX,SAAS;AACX,GAEMC,IAAK,IAAIC,MACbA,EAAW,OAAO,OAAO,EAAE,KAAK,GAAG,GAExBC,KAAoE,CAAC;AAAA,EAChF,MAAAC;AAAA,EACA,SAAAC,IAAU;AAAA,EACV,OAAAC,IAAQ;AAAA,EACR,SAAAC;AAAA,EACA,cAAAC;AAAA,EACA,cAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,gBAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,cAAAC;AAAA,EACA,sBAAAC,IAAuB;AAAA,EACvB,iBAAAC,IAAkB1C;AAAA,EAClB,kBAAA2C;AAAA,EACA,kBAAAC;AAAA,EACA,wBAAAC,IAAyB;AAAA,EACzB,oBAAAC;AAAA,EACA,8BAAAC,IAA+B;AAAA,EAC/B,0BAAAC;AAAA,EACA,SAAAC;AAAA,EACA,eAAAC;AAAA,EACA,eAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,UAAAC,KAAW;AAAA,EACX,GAAAzC;AAAA,EACA,WAAAhJ,KAAY;AACd,MAAM;AACJ,QAAM0L,IAAgBvL;AAAA,IACpB,MAAMgK,EAAK,OAAO,CAACpF,MAAMA,EAAE,oBAAoBA,EAAE,MAAM,SAAS,CAAC;AAAA,IACjE,CAACoF,CAAI;AAAA,EAAA,GAID,CAACwB,IAAcC,EAAe,IAAItL,EAAS,EAAE,GAC7CuL,IAAa1L,EAAQ,MAAM;AAC/B,UAAM2L,IAAYvB,KAAgBoB;AAClC,WAAOD,EAAc,KAAK,CAAC3G,MAAMA,EAAE,SAAS+G,CAAS,IACjDA,IACCJ,EAAc,CAAC,GAAG,QAAQ;AAAA,EACjC,GAAG,CAACnB,GAAcoB,IAAcD,CAAa,CAAC,GAExCK,IAAY5L;AAAA,IAChB,MAAMuL,EAAc,KAAK,CAAC3G,MAAMA,EAAE,SAAS8G,CAAU,KAAK;AAAA,IAC1D,CAACH,GAAeG,CAAU;AAAA,EAAA,GAItBG,IAAsB7L,EAAQ,MAAM;AACxC,QAAI,CAAC4L,EAAW,QAAO,CAAA;AACvB,UAAME,IAAU,IAAI,IAAIF,EAAU,MAAM,IAAI,CAACG,MAAMA,EAAE,MAAM,CAAC;AAC5D,WAAO/D,GAA0B,OAAO,CAAC,MAAM8D,EAAQ,IAAI,CAAC,CAAC;AAAA,EAC/D,GAAG,CAACF,CAAS,CAAC,GAER,CAACI,GAAgBC,CAAiB,IAAI9L,EAAsC,EAAE,GAC9E+L,IAAelM,EAAgC,MAAM;AACzD,UAAM2L,IAAYrB,KAAkB0B;AACpC,WAAOL,KAAaE,EAAoB,SAASF,CAAS,IACtDA,IACCE,EAAoB,CAAC,KAAK;AAAA,EACjC,GAAG,CAACvB,GAAgB0B,GAAgBH,CAAmB,CAAC,GAGlDM,KAAuBnM;AAAA,IAC3B,MAAO4L,IAAYA,EAAU,MAAM,OAAO,CAACG,MAAMA,EAAE,WAAWG,CAAY,IAAI,CAAA;AAAA,IAC9E,CAACN,GAAWM,CAAY;AAAA,EAAA,GAGpB,CAACE,IAAmBC,EAAoB,IAAIlM,EAAS,EAAE,GACvDmM,KAAkBtM,EAAQ,MAAM;AAEpC,QAAIwK,MAAsB,KAAM,QAAO;AACvC,UAAMmB,IAAYnB,KAAqB4B;AACvC,WAAOD,GAAqB,KAAK,CAACJ,MAAMA,EAAE,UAAUJ,CAAS,IACzDA,IACCQ,GAAqB,CAAC,GAAG,SAAS;AAAA,EACzC,GAAG,CAAC3B,GAAmB4B,IAAmBD,EAAoB,CAAC,GAGzD,CAACI,IAAkBC,EAAmB,IAAIrM;AAAA,IAC9C,MAAMwK,EAAgB,CAAC,GAAG,QAAQ;AAAA,EAAA,GAE9B8B,KAAiB7B,KAAoB2B,IACrCG,KACJ/B,EAAgB,KAAK,CAACgC,MAAWA,EAAO,SAASF,EAAc,KAAK9B,EAAgB,CAAC,GAEjF,CAACiC,IAAoBC,EAAqB,IAAI1M,EAAS,EAAK,GAC5D2M,KAAkBpI,EAA8B,IAAI;AAG1D,EAAAb,GAAU,MAAM;AACd,QAAI,CAAC+I,GAAoB;AACzB,UAAMG,IAAqB,CAACC,MAAsB;AAChD,MAAIF,GAAgB,WAAW,CAACA,GAAgB,QAAQ,SAASE,EAAM,MAAc,KACnFH,GAAsB,EAAK;AAAA,IAE/B;AACA,oBAAS,iBAAiB,aAAaE,CAAkB,GAClD,MAAM,SAAS,oBAAoB,aAAaA,CAAkB;AAAA,EAC3E,GAAG,CAACH,EAAkB,CAAC;AAMvB,QAAMK,KAAcvI,EAA8B,IAAI,GAChDwI,KAAcxI,EAA0D,EAAE,GAC1E,CAACyI,IAAmBC,EAAoB,IAAIjN,EAKxC,IAAI,GAERkN,KAAgB3I,EAA8B,IAAI,GAClD4I,KAAgB5I;AAAA,IACpB,CAAA;AAAA,EAAC,GAEG,CAAC6I,IAAqBC,EAAsB,IAAIrN,EAG5C,IAAI;AAEd,EAAA0D,GAAU,MAAM;AACd,UAAM4J,IAAU,MAAM;AACpB,YAAMC,IAAYT,GAAY,SACxBU,IAAYT,GAAY,QAAQxB,CAAU;AAChD,UAAI,CAACgC,KAAa,CAACC,GAAW;AAC5B,QAAAP,GAAqB,IAAI;AACzB;AAAA,MACF;AACA,YAAMQ,IAAgBF,EAAU,sBAAA,GAC1BG,IAAUF,EAAU,sBAAA;AAC1B,MAAAP,GAAqB;AAAA,QACnB,MAAMS,EAAQ,OAAOD,EAAc;AAAA,QACnC,KAAKC,EAAQ,MAAMD,EAAc;AAAA,QACjC,OAAOC,EAAQ;AAAA,QACf,QAAQA,EAAQ;AAAA,MAAA,CACjB;AAAA,IACH;AACA,WAAAJ,EAAA,GACA,OAAO,iBAAiB,UAAUA,CAAO,GAClC,MAAM,OAAO,oBAAoB,UAAUA,CAAO;AAAA,EAC3D,GAAG,CAAC/B,GAAYH,GAAetB,GAASC,CAAK,CAAC,GAE9CrG,GAAU,MAAM;AACd,UAAM4J,IAAU,MAAM;AACpB,YAAMC,IAAYL,GAAc,SAC1BM,IAAYL,GAAc,QAAQpB,CAAY;AACpD,UAAI,CAACwB,KAAa,CAACC,GAAW;AAC5B,QAAAH,GAAuB,IAAI;AAC3B;AAAA,MACF;AACA,YAAMI,IAAgBF,EAAU,sBAAA,GAC1BG,IAAUF,EAAU,sBAAA;AAC1B,MAAAH,GAAuB;AAAA,QACrB,MAAMK,EAAQ,OAAOD,EAAc;AAAA,QACnC,OAAOC,EAAQ;AAAA,MAAA,CAChB;AAAA,IACH;AACA,WAAAJ,EAAA,GACA,OAAO,iBAAiB,UAAUA,CAAO,GAClC,MAAM,OAAO,oBAAoB,UAAUA,CAAO;AAAA,EAC3D,GAAG,CAACvB,GAAcL,GAAqB5B,GAASC,CAAK,CAAC;AAGtD,QAAM4D,KAAmB,CAAClG,MAAiB;AACzC,IAAA6D,GAAgB7D,CAAI,GACpByC,IAAezC,CAAI;AAAA,EACrB,GAEMmG,KAAqB,CAACxG,MAAmC;AAC7D,IAAA0E,EAAkB1E,CAAM,GACxBgD,IAAiBhD,CAAM;AAAA,EACzB,GAEMyG,KAAmB,CAACC,MAA2B;AACnD,IAAA5B,GAAqB4B,EAAK,KAAK,GAC/BxD,IAAewD,CAAI;AAAA,EACrB,GAEMC,KAAuB,CAACC,MAAiB;AAC7C,IAAA3B,GAAoB2B,CAAI,GACxBtB,GAAsB,EAAK,GAC3BhC,IAAmBsD,CAAI;AAAA,EACzB;AAEA,2BACG,OAAA,EAAI,WAAWtE,EAAGjJ,EAAO,MAAMf,EAAS,GACtC,UAAA;AAAA,IAAAiL,MAA2BC,KAAsB,gBAAAlK,EAAC2H,IAAA,EAAmB,GAAAK,EAAA,CAAM;AAAA,IAC3EmC,MACEC,KAA4B,gBAAApK,EAACkI,IAAA,EAAyB,GAAAF,EAAA,CAAM;AAAA,IAI9D,CAAC6B,KACA,gBAAA/J,EAAAyN,IAAA,EACE,UAAA;AAAA,MAAA,gBAAAzN,EAAC,OAAA,EAAI,WAAWC,EAAO,aACrB,UAAA;AAAA,QAAA,gBAAAC,EAAC,QAAA,EAAK,WAAWD,EAAO,eACrB,eACCiI,IAAI,+BAA+B,KACnC,6BAAA,CACJ;AAAA,0BACC,OAAA,EAAI,WAAWjI,EAAO,kBAAkB,KAAKkM,IAC5C,UAAA;AAAA,UAAA,gBAAAnM;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,WAAWC,EAAO;AAAA,cAClB,SAAS,MAAMiM,GAAsB,CAACwB,MAAS,CAACA,CAAI;AAAA,cACpD,iBAAc;AAAA,cACd,iBAAezB;AAAA,cAEb,UAAA;AAAA,iBAAAF,IAAsB,YAAY7D,IAAI6D,GAAqB,QAAQ,MACnEA,IAAsB;AAAA,kCACvBvE,IAAA,CAAA,CAAgB;AAAA,cAAA;AAAA,YAAA;AAAA,UAAA;AAAA,UAElByE,MACC,gBAAA/L,EAAC,MAAA,EAAG,WAAWD,EAAO,cAAc,MAAK,WACtC,UAAA+J,EAAgB,IAAI,CAACgC,MAAW;AAC/B,kBAAMjD,IAAaiD,EAAO,SAASF;AACnC,mBACE,gBAAA9L;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,MAAK;AAAA,gBACL,iBAAe+I;AAAA,gBACf,WAAWG;AAAAA,kBACTjJ,EAAO;AAAA,kBACP8I,KAAc9I,EAAO;AAAA,gBAAA;AAAA,gBAEvB,SAAS,MAAMsN,GAAqBvB,EAAO,IAAI;AAAA,gBAE7C,UAAA;AAAA,mBAAAA,EAAO,YAAY9D,IAAI8D,EAAO,QAAQ,MAAMA,EAAO;AAAA,kBACpDjD,uBAAexB,IAAA,CAAA,CAAU;AAAA,gBAAA;AAAA,cAAA;AAAA,cAVrByE,EAAO;AAAA,YAAA;AAAA,UAalB,CAAC,EAAA,CACH;AAAA,QAAA,EAAA,CAEJ;AAAA,MAAA,GACF;AAAA,MACA,gBAAA9L,EAAC,MAAA,EAAG,WAAWD,EAAO,gBAAA,CAAiB;AAAA,IAAA,GACzC;AAAA,IAIF,gBAAAD,EAAC,OAAA,EAAI,WAAWC,EAAO,mBACrB,UAAA;AAAA,MAAA,gBAAAC,EAAC,KAAA,EAAE,WAAWD,EAAO,gBAClB,eAAWiI,IAAI,uBAAuB,KAAK,wCAAA,CAC9C;AAAA,MACCsC,KAAiB,gBAAAtK,EAAC,KAAA,EAAE,WAAWD,EAAO,eAAgB,UAAAuK,EAAA,CAAc;AAAA,IAAA,GACvE;AAAA,IAECE,MAAoB,SACnB,gBAAA1K,EAAC,KAAA,EAAE,WAAWC,EAAO,mBAClB,UAAA;AAAA,MAAAiI,IAAI,uBAAuB,KAAK;AAAA,MAAgC;AAAA,MACjE,gBAAAhI,EAAC,UAAK,WAAWD,EAAO,qBACrB,UAAAiI,IAAI,yBAAyB,KAAK,eACrC;AAAA,MAAQ;AAAA,MACPA,IAAI,uBAAuB,KAAK;AAAA,IAAA,EAAA,CACnC,IAEAwC;AAAA,IAGDpB,uBACE,OAAA,EAAI,WAAWrJ,EAAO,aAAa,aAAU,QAAO,aAAU,UAC7D,UAAA;AAAA,MAAA,gBAAAC,EAAC,OAAA,EAAI,WAAWD,EAAO,kBACpB,UAAA,MAAM,KAAK,EAAE,QAAQ,EAAA,CAAG,EAAE,IAAI,CAAC0N,GAAGhP,MACjC,gBAAAuB,EAAC,OAAA,EAAc,WAAWgJ,EAAGjJ,EAAO,iBAAiBA,EAAO,eAAe,EAAA,GAAjEtB,CAAoE,CAC/E,EAAA,CACH;AAAA,MACA,gBAAAuB,EAAC,OAAA,EAAI,WAAWD,EAAO,oBACpB,UAAA,MAAM,KAAK,EAAE,QAAQ,EAAA,CAAG,EAAE,IAAI,CAAC0N,GAAGhP,MACjC,gBAAAuB,EAAC,OAAA,EAAc,WAAWgJ,EAAGjJ,EAAO,mBAAmBA,EAAO,eAAe,EAAA,GAAnEtB,CAAsE,CACjF,EAAA,CACH;AAAA,MACA,gBAAAuB,EAAC,OAAA,EAAI,WAAWD,EAAO,kBACpB,UAAA,MAAM,KAAK,EAAE,QAAQ,EAAA,CAAG,EAAE,IAAI,CAAC0N,GAAGhP,MACjC,gBAAAuB,EAAC,OAAA,EAAc,WAAWgJ,EAAGjJ,EAAO,kBAAkBA,EAAO,eAAe,EAAA,GAAlEtB,CAAqE,CAChF,EAAA,CACH;AAAA,IAAA,GACF;AAAA,IAGD,CAAC2K,KAAWC,uBACV,OAAA,EAAI,WAAWtJ,EAAO,cACpB,UAAA;AAAA,MAAAiI,IAAI,oBAAoB,KAAK;AAAA,MAC7BsB,KACC,gBAAAtJ,EAAC,UAAA,EAAO,MAAK,UAAS,WAAWD,EAAO,UAAU,SAASuJ,GACxD,UAAAtB,IAAI,WAAW,KAAK,QAAA,CACvB;AAAA,IAAA,GAEJ;AAAA,IAGD,CAACoB,KAAW,CAACC,KAASqB,EAAc,WAAW,KAC9C,gBAAA5K,EAAC,OAAA,EAAI,WAAWC,EAAO,YACrB,UAAA;AAAA,MAAA,gBAAAC,EAAC,UAAK,WAAWD,EAAO,gBACtB,UAAA,gBAAAC,EAAC0H,MAAgB,GACnB;AAAA,MACA,gBAAA1H,EAAC,OAAE,WAAWD,EAAO,iBAClB,UAAAiI,IAAI,2BAA2B,KAAK,sBACvC;AAAA,MACA,gBAAAhI,EAAC,OAAE,WAAWD,EAAO,oBAClB,UAAAiI,IAAI,8BAA8B,KACjC,mEAAA,CACJ;AAAA,IAAA,GACF;AAAA,IAGD,CAACoB,KAAW,CAACC,KAASqB,EAAc,SAAS,KAC5C,gBAAA5K,EAAAyN,IAAA,EACE,UAAA;AAAA,MAAA,gBAAAzN;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAWC,EAAO;AAAA,UAClB,KAAKqM;AAAA,UACL,MAAK;AAAA,UACL,cAAW;AAAA,UAEV,UAAA;AAAA,YAAAE,MACC,gBAAAtM;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAWD,EAAO;AAAA,gBAClB,OAAO;AAAA,kBACL,WAAW,aAAauM,GAAkB,IAAI,OAAOA,GAAkB,GAAG;AAAA,kBAC1E,OAAOA,GAAkB;AAAA,kBACzB,QAAQA,GAAkB;AAAA,gBAAA;AAAA,gBAE5B,eAAY;AAAA,cAAA;AAAA,YAAA;AAAA,YAGf5B,EAAc,IAAI,CAACgD,MAAQ;AAC1B,oBAAM7E,IAAa6E,EAAI,SAAS7C,GAC1B,EAAE,UAAA3D,GAAU,QAAAyG,EAAA,IAAWhH,GAAmB+G,EAAI,IAAI;AACxD,qBACE,gBAAA5N,EAACyN,IAAA,EACC,UAAA;AAAA,gBAAA,gBAAAzN;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,KAAK,CAACqE,MAAO;AACX,sBAAAkI,GAAY,QAAQqB,EAAI,IAAI,IAAIvJ;AAAA,oBAClC;AAAA,oBACA,WAAW6E,EAAGjJ,EAAO,SAAS8I,KAAc9I,EAAO,eAAe;AAAA,oBAClE,MAAK;AAAA,oBACL,gBAAc8I;AAAA,oBACd,SAAS,MAAMoE,GAAiBS,EAAI,IAAI;AAAA,oBAExC,UAAA;AAAA,sBAAA,gBAAA1N,EAAC,UAAK,WAAWD,EAAO,cAAe,UAAAiI,IAAId,CAAQ,KAAKA,GAAS;AAAA,sBACjE,gBAAAlH,EAAC,QAAA,EAAK,WAAWD,EAAO,YAAa,UAAA4N,EAAA,CAAO;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,kCAE7C,QAAA,EAAK,WAAW5N,EAAO,gBAAgB,eAAW,GAAA,CAAC;AAAA,cAAA,EAAA,GAdvC2N,EAAI,IAenB;AAAA,YAEJ,CAAC;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAGH,gBAAA5N;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAWC,EAAO;AAAA,UAClB,KAAKyM;AAAA,UACL,MAAK;AAAA,UACL,cAAW;AAAA,UAEV,UAAA;AAAA,YAAAE,MACC,gBAAA1M;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,WAAWD,EAAO;AAAA,gBAClB,OAAO;AAAA,kBACL,WAAW,cAAc2M,GAAoB,IAAI;AAAA,kBACjD,OAAOA,GAAoB;AAAA,gBAAA;AAAA,gBAE7B,eAAY;AAAA,cAAA;AAAA,YAAA;AAAA,YAGf1B,EAAoB,IAAI,CAACtE,MAAW;AACnC,oBAAMkH,IAAO9E,GAAapC,CAAM,GAC1BmH,IAAiBnH,MAAW,aAAa+D,IACzCqD,IAAWD,IACb,2BACA9E,GAAkBrC,CAAM;AAC5B,qBACE,gBAAA5G;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBAEC,KAAK,CAACqE,MAAO;AACX,oBAAAsI,GAAc,QAAQ/F,CAAM,IAAIvC;AAAA,kBAClC;AAAA,kBACA,MAAK;AAAA,kBACL,WAAW6E;AAAAA,oBACTjJ,EAAO;AAAA,oBACP2G,MAAW2E,KAAgBtL,EAAO;AAAA,kBAAA;AAAA,kBAEpC,MAAK;AAAA,kBACL,iBAAe2G,MAAW2E;AAAA,kBAC1B,SAAS,MAAM6B,GAAmBxG,CAAM;AAAA,kBAExC,UAAA;AAAA,oBAAA,gBAAA1G,EAAC4N,GAAA,EAAK;AAAA,oBACL5F,IAAI8F,CAAQ,MACVD,IACG,kBACAnH,EAAO,OAAO,CAAC,EAAE,YAAA,IAAgBA,EAAO,MAAM,CAAC;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAjBhDA;AAAA,cAAA;AAAA,YAoBX,CAAC;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,MAGH,gBAAA1G;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,WAAWD,EAAO;AAAA,UAClB,MAAK;AAAA,UACL,cAAW;AAAA,UAEV,UAAAuL,GAAqB,IAAI,CAAC8B,GAAM3O,MAC/B,gBAAAuB;AAAA,YAAC;AAAA,YAAA;AAAA,cAEC,MAAK;AAAA,cACL,WAAWgJ;AAAAA,gBACTjJ,EAAO;AAAA,gBACP0L,OAAoB2B,EAAK,SAASrN,EAAO;AAAA,gBACzCqN,EAAK,YAAYrN,EAAO;AAAA,cAAA;AAAA,cAE1B,MAAK;AAAA,cACL,gBAAc0L,OAAoB2B,EAAK;AAAA,cACvC,iBAAeA,EAAK,YAAY;AAAA,cAChC,UAAUA,EAAK;AAAA,cACf,SAAS,MAAM,CAACA,EAAK,YAAYD,GAAiBC,CAAI;AAAA,cAErD,UAAA/G,GAAe+G,EAAK,KAAK;AAAA,YAAA;AAAA,YAbrB,GAAGA,EAAK,KAAK,IAAI3O,CAAG;AAAA,UAAA,CAe5B;AAAA,QAAA;AAAA,QAtBI,GAAGoM,CAAU,IAAIQ,CAAY;AAAA,MAAA;AAAA,IAuBpC,EAAA,CACF;AAAA,EAAA,GAEJ;AAEJ,GCxhBM0C,KAAS,UAETC,KAAY,CAACjH,MAAuB;AACxC,QAAMkH,IAAQ,OAAOlH,EAAK,SAAA,IAAa,CAAC,EAAE,SAAS,GAAG,GAAG,GACnD2G,IAAM,OAAO3G,EAAK,QAAA,CAAS,EAAE,SAAS,GAAG,GAAG;AAClD,SAAO,GAAGA,EAAK,YAAA,CAAa,IAAIkH,CAAK,IAAIP,CAAG;AAC9C,GAEMQ,KAAW,CACftH,GACAuH,GACA1H,GACAC,MACqB;AACrB,QAAM1C,IAAM,CAACC,MAAc,OAAOA,CAAC,EAAE,SAAS,GAAG,GAAG,GAC9CmK,IAAY3H,IAAS,IACrB4H,IAAUF,IAAO,KAAK,MAAMC,IAAY,EAAE;AAChD,SAAO;AAAA,IACL,OAAO,GAAGxH,CAAO,IAAI5C,EAAImK,CAAI,CAAC,IAAInK,EAAIyC,CAAM,CAAC,MAAMsH,EAAM;AAAA,IACzD,KAAK,GAAGnH,CAAO,IAAI5C,EAAIqK,CAAO,CAAC,IAAIrK,EAAIoK,IAAY,EAAE,CAAC,MAAML,EAAM;AAAA,IAClE,QAAArH;AAAA,EAAA;AAEJ,GAGM4H,KAAiE;AAAA,EACrE,SAAS;AAAA,IACP,CAAC,GAAG,CAAC;AAAA,IACL,CAAC,GAAG,EAAE;AAAA,IACN,CAAC,IAAI,CAAC;AAAA,IACN,CAAC,IAAI,EAAE;AAAA,IACP,CAAC,IAAI,CAAC;AAAA,IACN,CAAC,IAAI,EAAE;AAAA,EAAA;AAAA,EAET,WAAW;AAAA,IACT,CAAC,IAAI,EAAE;AAAA,IACP,CAAC,IAAI,CAAC;AAAA,IACN,CAAC,IAAI,CAAC;AAAA,IACN,CAAC,IAAI,EAAE;AAAA,IACP,CAAC,IAAI,CAAC;AAAA,EAAA;AAAA,EAER,SAAS;AAAA,IACP,CAAC,IAAI,CAAC;AAAA,IACN,CAAC,IAAI,EAAE;AAAA,IACP,CAAC,IAAI,CAAC;AAAA,IACN,CAAC,IAAI,CAAC;AAAA,EAAA;AAEV,GAEMC,KAAW,CACfC,GACAC,MACwB;AACxB,QAAM1H,wBAAW,KAAA;AACjB,EAAAA,EAAK,QAAQA,EAAK,QAAA,IAAYyH,CAAS;AACvC,QAAM5H,IAAUoH,GAAUjH,CAAI,GACxB2H,IAAQD,EAAQ;AAAA,IAAQ,CAAC/H,MAC7B4H,GAAW5H,CAAM,EAAE,IAAI,CAAC,CAACyH,GAAM1H,CAAM,MAAMyH,GAAStH,GAASuH,GAAM1H,GAAQC,CAAM,CAAC;AAAA,EAAA;AAEpF,SAAO,EAAE,MAAME,GAAS,kBAAkB8H,EAAM,SAAS,GAAG,OAAAA,EAAA;AAC9D,GAGaC,KAAwC;AAAA,EACnDJ,GAAS,GAAG,CAAC,WAAW,aAAa,SAAS,CAAC;AAAA,EAC/CA,GAAS,GAAG,CAAC,WAAW,WAAW,CAAC;AAAA,EACpCA,GAAS,GAAG,CAAC,aAAa,SAAS,CAAC;AAAA,EACpCA,GAAS,GAAG,CAAC,WAAW,SAAS,CAAC;AAAA,EAClCA,GAAS,GAAG,CAAC,WAAW,aAAa,SAAS,CAAC;AACjD,GAGaK,KAA8CD,GAAe,IAAI,CAACjB,OAAS;AAAA,EACtF,GAAGA;AAAA,EACH,kBAAkB;AAAA,EAClB,OAAO,CAAA;AACT,EAAE,GCnFWpG,KAA4B,MACvC,gBAAAtH;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,OAAM;AAAA,IACN,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,MAAK;AAAA,IACL,QAAO;AAAA,IACP,aAAY;AAAA,IACZ,eAAc;AAAA,IACd,gBAAe;AAAA,IACf,eAAW;AAAA,IAEX,UAAA,gBAAAA,EAAC,QAAA,EAAK,GAAE,eAAA,CAAe;AAAA,EAAA;AACzB,GCRW6O,KAA+B;AAAA,EAC1C,EAAE,MAAM,iBAAiB,MAAM,MAAM,KAAK,KAAA;AAAA,EAC1C,EAAE,MAAM,kBAAkB,MAAM,OAAO,KAAK,KAAA;AAAA,EAC5C,EAAE,MAAM,aAAa,MAAM,OAAO,KAAK,KAAA;AAAA,EACvC,EAAE,MAAM,UAAU,MAAM,MAAM,KAAK,KAAA;AAAA,EACnC,EAAE,MAAM,wBAAwB,MAAM,QAAQ,KAAK,KAAA;AAAA,EACnD,EAAE,MAAM,aAAa,MAAM,OAAO,KAAK,KAAA;AAAA,EACvC,EAAE,MAAM,eAAe,MAAM,OAAO,KAAK,KAAA;AAAA,EACzC,EAAE,MAAM,aAAa,MAAM,QAAQ,KAAK,KAAA;AAAA,EACxC,EAAE,MAAM,eAAe,MAAM,OAAO,KAAK,KAAA;AAAA,EACzC,EAAE,MAAM,YAAY,MAAM,OAAO,KAAK,KAAA;AAAA,EACtC,EAAE,MAAM,WAAW,MAAM,OAAO,KAAK,KAAA;AAAA,EACrC,EAAE,MAAM,gBAAgB,MAAM,OAAO,KAAK,KAAA;AAAA,EAC1C,EAAE,MAAM,SAAS,MAAM,QAAQ,KAAK,KAAA;AAAA,EACpC,EAAE,MAAM,WAAW,MAAM,QAAQ,KAAK,KAAA;AAAA,EACtC,EAAE,MAAM,QAAQ,MAAM,QAAQ,KAAK,KAAA;AAAA,EACnC,EAAE,MAAM,gBAAgB,MAAM,QAAQ,KAAK,KAAA;AAAA,EAC3C,EAAE,MAAM,aAAa,MAAM,QAAQ,KAAK,KAAA;AAAA,EACxC,EAAE,MAAM,UAAU,MAAM,OAAO,KAAK,KAAA;AAAA,EACpC,EAAE,MAAM,eAAe,MAAM,OAAO,KAAK,KAAA;AAAA,EACzC,EAAE,MAAM,WAAW,MAAM,QAAQ,KAAK,KAAA;AAAA,EACtC,EAAE,MAAM,uBAAuB,MAAM,UAAU,KAAK,KAAA;AAAA,EACpD,EAAE,MAAM,UAAU,MAAM,QAAQ,KAAK,KAAA;AAAA,EACrC,EAAE,MAAM,WAAW,MAAM,OAAO,KAAK,KAAA;AAAA,EACrC,EAAE,MAAM,SAAS,MAAM,OAAO,KAAK,KAAA;AAAA,EACnC,EAAE,MAAM,SAAS,MAAM,OAAO,KAAK,KAAA;AAAA,EACnC,EAAE,MAAM,SAAS,MAAM,OAAO,KAAK,KAAA;AAAA,EACnC,EAAE,MAAM,UAAU,MAAM,OAAO,KAAK,KAAA;AAAA,EACpC,EAAE,MAAM,UAAU,MAAM,OAAO,KAAK,KAAA;AAAA,EACpC,EAAE,MAAM,YAAY,MAAM,QAAQ,KAAK,KAAA;AAAA,EACvC,EAAE,MAAM,UAAU,MAAM,OAAO,KAAK,KAAA;AAAA,EACpC,EAAE,MAAM,WAAW,MAAM,OAAO,KAAK,KAAA;AAAA,EACrC,EAAE,MAAM,SAAS,MAAM,QAAQ,KAAK,KAAA;AAAA,EACpC,EAAE,MAAM,cAAc,MAAM,QAAQ,KAAK,KAAA;AAAA,EACzC,EAAE,MAAM,SAAS,MAAM,QAAQ,KAAK,KAAA;AAAA,EACpC,EAAE,MAAM,UAAU,MAAM,OAAO,KAAK,KAAA;AAAA,EACpC,EAAE,MAAM,WAAW,MAAM,QAAQ,KAAK,KAAA;AAAA,EACtC,EAAE,MAAM,aAAa,MAAM,OAAO,KAAK,KAAA;AAAA,EACvC,EAAE,MAAM,UAAU,MAAM,QAAQ,KAAK,KAAA;AAAA,EACrC,EAAE,MAAM,QAAQ,MAAM,QAAQ,KAAK,KAAA;AAAA,EACnC,EAAE,MAAM,UAAU,MAAM,QAAQ,KAAK,KAAA;AAAA,EACrC,EAAE,MAAM,WAAW,MAAM,QAAQ,KAAK,KAAA;AAAA,EACtC,EAAE,MAAM,WAAW,MAAM,QAAQ,KAAK,KAAA;AAAA,EACtC,EAAE,MAAM,WAAW,MAAM,UAAU,KAAK,KAAA;AAAA,EACxC,EAAE,MAAM,aAAa,MAAM,OAAO,KAAK,KAAA;AAAA,EACvC,EAAE,MAAM,YAAY,MAAM,OAAO,KAAK,KAAA;AAAA,EACtC,EAAE,MAAM,WAAW,MAAM,OAAO,KAAK,KAAA;AAAA,EACrC,EAAE,MAAM,YAAY,MAAM,QAAQ,KAAK,KAAA;AAAA,EACvC,EAAE,MAAM,gBAAgB,MAAM,UAAU,KAAK,KAAA;AAAA,EAC7C,EAAE,MAAM,eAAe,MAAM,OAAO,KAAK,KAAA;AAAA,EACzC,EAAE,MAAM,WAAW,MAAM,QAAQ,KAAK,KAAA;AAAA,EACtC,EAAE,MAAM,WAAW,MAAM,QAAQ,KAAK,KAAA;AAAA,EACtC,EAAE,MAAM,WAAW,MAAM,OAAO,KAAK,KAAA;AAAA,EACrC,EAAE,MAAM,WAAW,MAAM,QAAQ,KAAK,KAAA;AAAA,EACtC,EAAE,MAAM,SAAS,MAAM,OAAO,KAAK,KAAA;AACrC,GAOaC,KAAe,CAACC,MAAoC;AAC/D,MAAI,CAACA,KAAOA,EAAI,WAAW,EAAG,QAAO;AACrC,QAAMC,IAAaD,EAChB,YAAA,EACA,MAAM,EAAE,EACR,IAAI,CAACE,MAAS,SAASA,EAAK,WAAW,CAAC,CAAC;AAC5C,SAAO,OAAO,cAAc,GAAGD,CAAU;AAC3C,GC5EME,KAGF;AAAA,EACF,MAAM;AAAA,IACJ,SAAS;AAAA,IACT,WAAW;AAAA,IACX,WAAW;AAAA,IACX,aAAa;AAAA,EAAA;AAAA,EAEf,OAAO;AAAA,IACL,SAAS;AAAA,IACT,WAAW;AAAA,IACX,WAAW;AAAA,IACX,aAAa;AAAA,EAAA;AAAA,EAEf,OAAO;AAAA,IACL,SAAS;AAAA,IACT,WAAW;AAAA,IACX,WAAW;AAAA,IACX,aAAa;AAAA,EAAA;AAAA,EAEf,QAAQ;AAAA,IACN,SAAS;AAAA,IACT,WAAW;AAAA,IACX,WAAW;AAAA,IACX,aAAa;AAAA,EAAA;AAAA,EAEf,OAAO;AAAA,IACL,SAAS;AAAA,IACT,WAAW;AAAA,IACX,WAAW;AAAA,IACX,aAAa;AAAA,EAAA;AAAA,EAEf,OAAO;AAAA,IACL,SAAS;AAAA,IACT,WAAW;AAAA,IACX,WAAW;AAAA,IACX,aAAa;AAAA,EAAA;AAAA,EAEf,OAAO;AAAA,IACL,SAAS;AAAA,IACT,WAAW;AAAA,IACX,WAAW;AAAA,IACX,aAAa;AAAA,EAAA;AAAA,EAEf,QAAQ;AAAA,IACN,SAAS;AAAA,IACT,WAAW;AAAA,IACX,WAAW;AAAA,IACX,aAAa;AAAA,EAAA;AAAA,EAEf,OAAO;AAAA,IACL,SAAS;AAAA,IACT,WAAW;AAAA,IACX,WAAW;AAAA,IACX,aAAa;AAAA,EAAA;AAAA,EAEf,OAAO;AAAA,IACL,SAAS;AAAA,IACT,WAAW;AAAA,IACX,WAAW;AAAA,IACX,aAAa;AAAA,EAAA;AAAA,EAEf,OAAO;AAAA,IACL,SAAS;AAAA,IACT,WAAW;AAAA,IACX,WAAW;AAAA,IACX,aAAa;AAAA,EAAA;AAAA,EAEf,QAAQ;AAAA,IACN,SAAS;AAAA,IACT,WAAW;AAAA,IACX,WAAW;AAAA,IACX,aAAa;AAAA,EAAA;AAEjB,GAEMC,KAAkB;AAAA,EACtB,SAAS;AAAA,EAET,WAAW;AAAA,EACX,aAAa;AACf,GAGaC,KAA6B,CACxCvH,GACAD,MACwC;AACxC,MAAI,CAACC;AACH,WAAO,EAAE,SAAS,IAAM,OAAO,GAAA;AAGjC,QAAMwH,IAAaH,GAAetH,CAAW,KAAKuH;AAGlD,SAFgBE,EAAW,QAAQ,KAAKxH,CAAW,IAS5C,EAAE,SAAS,IAAM,OAAO,GAAA,IANtB;AAAA,IACL,SAAS;AAAA,IACT,OAAO,sCAAsCwH,EAAW,WAAW;AAAA,EAAA;AAKzE,GAEaC,KAAyB,CAAC1H,OAClBsH,GAAetH,CAAW,KAAKuH,IAChC,WC/FPI,KAAsB,CAAC;AAAA,EAClC,aAAA3H;AAAA,EACA,eAAA4H;AAAA,EACA,WAAAC;AAAA,EACA,qBAAAC;AAAA,EACA,qBAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,cAAAC;AACF,MAAkC;AAChC,QAAM,CAACC,GAAgBC,CAAiB,IAAI1Q,EAAS,EAAK,GAEpD2Q,IAAkBR,EAAU,KAAK,CAACS,MAAMA,EAAE,SAAStI,CAAW,KAAK6H,EAAU,CAAC,GAC9EU,IAAYb,GAAuB1H,CAAW,GAE9CwI,IAAsBC;AAAA,IAC1B,CAACC,MAAqB;AAIpB,UAHAZ,EAAoBY,EAAQ,MAAMA,EAAQ,IAAI,GAC9CN,EAAkB,EAAK,GAEnBR,KAAiBI,GAAoB;AACvC,cAAM,EAAE,SAAAW,GAAS,OAAAlH,EAAA,IAAU+F,GAA2BI,GAAec,EAAQ,IAAI;AACjF,QAAAV,EAAmBW,GAASlH,CAAK;AAAA,MACnC;AAAA,IACF;AAAA,IACA,CAACmG,GAAeE,GAAqBE,CAAkB;AAAA,EAAA,GAGnDY,IAAoBH;AAAA,IACxB,CAACnQ,MAA2C;AAE1C,YAAMuQ,IADQvQ,EAAE,OAAO,MAAM,QAAQ,UAAU,EAAE,EACtB,MAAM,GAAGoP,GAAuB1H,CAAW,CAAC;AAGvE,UAFA+H,EAAoBc,CAAY,GAE5Bb,GAAoB;AACtB,cAAM,EAAE,SAAAW,GAAS,OAAAlH,EAAA,IAAU+F,GAA2BqB,GAAc7I,CAAW;AAC/E,QAAAgI,EAAmBW,GAASlH,CAAK;AAAA,MACnC;AAAA,IACF;AAAA,IACA,CAACzB,GAAa+H,GAAqBC,CAAkB;AAAA,EAAA,GAGjDc,IAAuBL,GAAY,MAAM;AAC7C,IAAAL,EAAkB,CAACxC,OACZA,KAAMqC,IAAkBjI,CAAW,GACjC,CAAC4F,EACT;AAAA,EACH,GAAG,CAAC5F,GAAaiI,CAAe,CAAC,GAE3Bc,IAAmBN,GAAY,MAAM;AACzC,IAAAL,EAAkB,EAAK,GACvBF,IAAelI,CAAW;AAAA,EAC5B,GAAG,CAACA,GAAakI,CAAY,CAAC;AAE9B,SAAO;AAAA,IACL,gBAAAC;AAAA,IACA,iBAAAE;AAAA,IACA,WAAAE;AAAA,IACA,qBAAAC;AAAA,IACA,mBAAAI;AAAA,IACA,sBAAAE;AAAA,IACA,kBAAAC;AAAA,IACA,eAAe,MAAMX,EAAkB,EAAK;AAAA,EAAA;AAEhD;;;;;;;;;;;;;;;;GC3DMhH,KAAK,IAAIC,MACbA,EAAW,OAAO,OAAO,EAAE,KAAK,GAAG,GAyBxB2H,KAAoD,CAAC;AAAA,EAChE,aAAAhJ;AAAA,EACA,eAAA4H;AAAA,EACA,OAAAnG;AAAA,EACA,OAAA9G;AAAA,EACA,YAAAuF;AAAA,EACA,WAAA2H,IAAYZ;AAAA,EACZ,YAAAgC;AAAA,EACA,qBAAAnB;AAAA,EACA,qBAAAC;AAAA,EACA,oBAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,cAAAC;AAAA,EACA,UAAAlM;AAAA,EACA,GAAAoE;AAAA,EACA,WAAAhJ,IAAY;AACd,MAAM;AACJ,QAAM,CAAC8R,GAAqBC,CAAsB,IAAIzR,EAASmQ,EAAU,CAAC,GAAG,QAAQ,KAAK,GACpF,CAACuB,GAAgBC,CAAiB,IAAI3R,EAAS,EAAE,GACjD4R,IAAoBtJ,KAAekJ,GACnCK,IAAe3B,KAAiBwB,GAEhCI,IAAcvN,EAAuB,IAAI,GAEzC;AAAA,IACJ,gBAAAkM;AAAA,IACA,iBAAAE;AAAA,IACA,WAAAE;AAAA,IACA,qBAAAC;AAAA,IACA,mBAAAI;AAAA,IACA,sBAAAE;AAAA,IACA,kBAAAC;AAAA,IACA,eAAAU;AAAA,EAAA,IACE9B,GAAoB;AAAA,IACtB,aAAa2B;AAAA,IACb,eAAeC;AAAA,IACf,WAAA1B;AAAA,IACA,qBAAqB,CAACnC,GAAMgE,MAAS;AACnC,MAAAP,EAAuBzD,CAAI,GAC3BoC,IAAsBpC,GAAMgE,CAAI;AAAA,IAClC;AAAA,IACA,qBAAqB,CAAC5N,MAAU;AAC9B,MAAAuN,EAAkBvN,CAAK,GACvBiM,IAAsBjM,CAAK;AAAA,IAC7B;AAAA,IACA,oBAAAkM;AAAA,IACA,iBAAAC;AAAA,IACA,cAAAC;AAAA,EAAA,CACD;AAED,EAAA9M,GAAU,MAAM;AACd,UAAMkJ,IAAqB,CAACC,MAAsB;AAChD,MAAIiF,EAAY,WAAW,CAACA,EAAY,QAAQ,SAASjF,EAAM,MAAc,KAC3EkF,EAAA;AAAA,IAEJ;AACA,WAAItB,MACF,SAAS,iBAAiB,aAAa7D,CAAkB,GAEpD,MAAM,SAAS,oBAAoB,aAAaA,CAAkB;AAAA,EAC3E,GAAG,CAAC6D,IAAgBsB,CAAa,CAAC;AAElC,QAAME,IAAa,CAACxC,GAAyByC,MAAgB;AAC3D,UAAMC,IAAU1C,IAAM8B,IAAa9B,CAAG,IAAI;AAC1C,WAAI0C,IACK,gBAAAzR,EAAC,OAAA,EAAI,KAAKyR,GAAS,KAAAD,GAAU,OAAO,IAAI,QAAQ,IAAI,WAAWzR,EAAO,QAAA,CAAS,IAGtF,gBAAAC,EAAC,UAAK,WAAWD,EAAO,WAAW,eAAW,IAC3C,UAAA+O,GAAaC,CAAG,EAAA,CACnB;AAAA,EAEJ;AAEA,2BACG,OAAA,EAAI,WAAW/F,GAAGjJ,EAAO,MAAMf,CAAS,GACtC,UAAA;AAAA,IAAAuD,KAAS,gBAAAvC,EAAC,OAAA,EAAI,WAAWD,EAAO,OAAQ,UAAAwC,GAAM;AAAA,IAE/C,gBAAAzC,EAAC,OAAA,EAAI,WAAWC,EAAO,KACrB,UAAA;AAAA,MAAA,gBAAAD,EAAC,OAAA,EAAI,WAAWC,EAAO,cAAc,KAAKqR,GACxC,UAAA;AAAA,QAAA,gBAAAtR,EAAC,YAAO,MAAK,UAAS,WAAWC,EAAO,aAAa,SAAS2Q,IAC3D,UAAA;AAAA,UAAAa,EAAWtB,GAAiB,KAAKA,GAAiB,QAAQ,MAAM;AAAA,UACjE,gBAAAjQ,EAAC,QAAA,EAAM,UAAAiQ,GAAiB,QAAQ,OAAM;AAAA,4BACrC3I,IAAA,CAAA,CAAgB;AAAA,QAAA,GACnB;AAAA,QAECyI,MACC,gBAAA/P,EAAC,OAAA,EAAI,WAAWD,EAAO,cAAc,MAAK,WACvC,UAAA0P,EAAU,IAAI,CAACa,MACd,gBAAAxQ;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,MAAK;AAAA,YACL,MAAK;AAAA,YACL,iBAAewQ,EAAQ,SAASL,GAAiB;AAAA,YACjD,WAAWlQ,EAAO;AAAA,YAClB,SAAS,MAAMqQ,EAAoBE,CAAO;AAAA,YAEzC,UAAA;AAAA,cAAAiB,EAAWjB,EAAQ,KAAKA,EAAQ,IAAI;AAAA,gCACpC,QAAA,EAAK,WAAWvQ,EAAO,kBAAmB,YAAQ,MAAK;AAAA,gCACvD,QAAA,EAAK,WAAWA,EAAO,kBAAmB,YAAQ,KAAA,CAAK;AAAA,YAAA;AAAA,UAAA;AAAA,UATnD,GAAGuQ,EAAQ,IAAI,IAAIA,EAAQ,GAAG;AAAA,QAAA,CAWtC,EAAA,CACH;AAAA,MAAA,GAEJ;AAAA,MAEA,gBAAAtQ;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,WAAU;AAAA,UACV,cAAa;AAAA,UACb,OAAOmR;AAAA,UACP,WAAAhB;AAAA,UACA,KAAKvM;AAAA,UACL,WAAWoF,GAAGjJ,EAAO,OAAOsJ,KAAStJ,EAAO,UAAU;AAAA,UACtD,aAAaiI,IAAI,4BAA4B,KAAK;AAAA,UAClD,UAAUwI;AAAA,UACV,SAASG;AAAA,QAAA;AAAA,MAAA;AAAA,IACX,GACF;AAAA,IAEC7I,KAAc,gBAAA9H,EAAC,OAAA,EAAI,WAAWD,EAAO,QAAS,UAAA+H,GAAW;AAAA,IACzDuB,KAAS,gBAAArJ,EAAC,KAAA,EAAE,WAAWD,EAAO,OAAQ,UAAAsJ,EAAA,CAAM;AAAA,EAAA,GAC/C;AAEJ,GCvKaqI,KAAqB,MAChC,gBAAA1R,EAAC,OAAA,EAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,eAAW,IACrE,UAAA,gBAAAA;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,GAAE;AAAA,IACF,MAAK;AAAA,IACL,QAAO;AAAA,IACP,aAAY;AAAA,IACZ,eAAc;AAAA,IACd,gBAAe;AAAA,EAAA;AACjB,GACF,GAIW2R,KAA4B,MACvC,gBAAA3R,EAAC,OAAA,EAAI,OAAM,MAAK,QAAO,MAAK,SAAQ,aAAY,MAAK,QAAO,eAAW,IACrE,UAAA,gBAAAA;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,UAAS;AAAA,IACT,UAAS;AAAA,IACT,GAAE;AAAA,IACF,MAAK;AAAA,EAAA;AACP,GACF;;;;;;;;;;;;;;;;GCpBI4R,KACJ,oRAUWC,KAAkD,CAAC;AAAA,EAC9D,UAAAC;AAAA,EACA,MAAAR;AAAA,EACA,QAAAS;AAAA,EACA,kBAAAC,IAAmBJ;AACrB,MACE,gBAAA9R,EAAC,OAAA,EAAI,WAAWC,EAAO,WACrB,UAAA;AAAA,EAAA,gBAAAC,EAAC,OAAA,EAAI,WAAWD,EAAO,YACrB,UAAA,gBAAAC;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAK8R,KAAYE;AAAA,MACjB,KAAKV;AAAA,MACL,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,WAAWvR,EAAO;AAAA,MAClB,SAAS,CAACoM,MAAU;AACjB,QAAAA,EAAM,OAA4B,MAAM6F;AAAA,MAC3C;AAAA,IAAA;AAAA,EAAA,GAEJ;AAAA,EACA,gBAAAlS,EAAC,OAAA,EAAI,WAAWC,EAAO,YACrB,UAAA;AAAA,IAAA,gBAAAC,EAAC,QAAA,EAAK,WAAWD,EAAO,aAAc,UAAAgS,GAAO;AAAA,sBAC5CL,IAAA,CAAA,CAAS;AAAA,EAAA,EAAA,CACZ;AAAA,EAAA,CACF,GC9BWO,KAAoD,CAAC,EAAE,OAAA1P,GAAO,GAAAyF,QACzE,gBAAAhI,EAAC,SAAI,WAAWD,EAAO,kBACrB,UAAA,gBAAAC,EAAC,QAAA,EAAK,WAAWD,EAAO,kBACrB,eAASiI,IAAI,2BAA2B,KAAK,cAAA,CAChD,EAAA,CACF,GCPIgB,KAAK,IAAIC,MACbA,EAAW,OAAO,OAAO,EAAE,KAAK,GAAG,GAG/BiJ,KAAiC,CAACC,MAA0B;AAChE,MAAIA,KAAS,KAAM;AACjB,UAAMlN,IAAIkN,IAAQ;AAClB,WAAO,GAAG,OAAO,UAAUlN,CAAC,IAAIA,IAAIA,EAAE,QAAQ,CAAC,CAAC;AAAA,EAClD;AACA,SAAO,GAAGkN,CAAK;AACjB,GAWaC,KAAgD,CAAC;AAAA,EAC5D,YAAAC;AAAA,EACA,YAAAxJ,IAAa;AAAA,EACb,SAAAlD;AAAA,EACA,kBAAAqM;AAAA,EACA,yBAAAM,IAA0BJ;AAC5B,MACE,gBAAApS;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,MAAK;AAAA,IACL,SAAS,MAAM6F,IAAU0M,CAAU;AAAA,IACnC,WAAWrJ,GAAGjJ,EAAO,MAAM8I,KAAc9I,EAAO,YAAY;AAAA,IAE5D,UAAA;AAAA,MAAA,gBAAAC;AAAA,QAAC6R;AAAA,QAAA;AAAA,UACC,UAAUQ,EAAW;AAAA,UACrB,MAAMA,EAAW;AAAA,UACjB,QAAQA,EAAW;AAAA,UACnB,kBAAAL;AAAA,QAAA;AAAA,MAAA;AAAA,MAGF,gBAAAlS,EAAC,OAAA,EAAI,WAAWC,EAAO,MACrB,UAAA;AAAA,QAAA,gBAAAC,EAAC,QAAA,EAAK,WAAWD,EAAO,MAAO,YAAW,MAAK;AAAA,QAC/C,gBAAAD,EAAC,OAAA,EAAI,WAAWC,EAAO,MACrB,UAAA;AAAA,UAAA,gBAAAC,EAAC,QAAA,EAAK,WAAWD,EAAO,WAAY,YAAW,UAAU,KAAK,IAAI,EAAA,CAAE;AAAA,UACpE,gBAAAC,EAAC,UAAK,WAAWD,EAAO,mBACrB,UAAAuS,EAAwBD,EAAW,kBAAkB,EAAA,CACxD;AAAA,QAAA,EAAA,CACF;AAAA,MAAA,GACF;AAAA,MAECxJ,uBACE,OAAA,EAAI,WAAW9I,EAAO,WACrB,UAAA,gBAAAC,EAAC2R,MAAgB,EAAA,CACnB;AAAA,MAGDU,EAAW,kBAAkB,gBAAArS,EAACiS,IAAA,CAAA,CAAiB;AAAA,IAAA;AAAA,EAAA;AAClD;;;;;;GCjDIjJ,KAAK,IAAIC,MACbA,EAAW,OAAO,OAAO,EAAE,KAAK,GAAG,GAkBxBsJ,KAAgD,CAAC;AAAA,EAC5D,aAAAC;AAAA,EACA,SAAApJ,IAAU;AAAA,EACV,sBAAAqJ;AAAA,EACA,oBAAAC;AAAA,EACA,OAAAjT;AAAA,EACA,kBAAAuS;AAAA,EACA,yBAAAM;AAAA,EACA,GAAAtK;AAAA,EACA,WAAAhJ,IAAY;AACd,MAAM;AACJ,QAAM,CAACuJ,GAAoBC,CAAqB,IAAIlJ,EAAS,EAAE,GACzDmJ,IAAWgK,KAAwBlK,GAEnCG,IAAe,CAAC2J,MAAmC;AACvD,IAAA7J,EAAsB6J,EAAW,aAAa,GAC9CK,IAAqBL,CAAU;AAAA,EACjC;AAEA,2BACG,WAAA,EAAQ,WAAWrJ,GAAGjJ,GAAO,SAASf,CAAS,GAC9C,UAAA;AAAA,IAAA,gBAAAgB,EAAC,KAAA,EAAE,WAAWD,GAAO,OAClB,eAASiI,IAAI,6BAA6B,KAAK,uBAAA,CAClD;AAAA,sBAEC,OAAA,EAAI,WAAWjI,GAAO,KAAK,MAAK,cAAa,cAAW,cACtD,UAAAqJ,IACG,MAAM,KAAK,EAAE,QAAQ,EAAA,CAAG,EAAE,IAAI,CAACqE,GAAGhP,MAChC,gBAAAuB,EAAC,OAAA,EAAc,WAAWgJ,GAAGjJ,GAAO,cAAcA,GAAO,eAAe,EAAA,GAA9DtB,CAAiE,CAC5E,IACD+T,EAAY,IAAI,CAACH,MACf,gBAAArS;AAAA,MAACoS;AAAA,MAAA;AAAA,QAEC,YAAAC;AAAA,QACA,YAAYA,EAAW,kBAAkB5J;AAAA,QACzC,SAASC;AAAA,QACT,kBAAAsJ;AAAA,QACA,yBAAAM;AAAA,MAAA;AAAA,MALKD,EAAW;AAAA,IAAA,CAOnB,EAAA,CACP;AAAA,EAAA,GACF;AAEJ,GC1EaM,KAAyC;AAAA,EACpD;AAAA,IACE,eAAe;AAAA,IACf,MAAM;AAAA,IACN,WAAW;AAAA,IACX,WAAW,CAAC,SAAS,SAAS;AAAA,IAC9B,QAAQ;AAAA,IACR,oBAAoB;AAAA,IACpB,gBAAgB;AAAA,EAAA;AAAA,EAElB;AAAA,IACE,eAAe;AAAA,IACf,MAAM;AAAA,IACN,WAAW;AAAA,IACX,WAAW,CAAC,WAAW,UAAU;AAAA,IACjC,QAAQ;AAAA,IACR,oBAAoB;AAAA,EAAA;AAAA,EAEtB;AAAA,IACE,eAAe;AAAA,IACf,MAAM;AAAA,IACN,WAAW;AAAA,IACX,WAAW,CAAC,SAAS,WAAW,SAAS;AAAA,IACzC,QAAQ;AAAA,IACR,oBAAoB;AAAA,EAAA;AAExB;"}
|