tguikit 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/shared/lib/cn.ts","../src/components/Accordion/Accordion.module.css","../src/components/Accordion/context.ts","../src/components/Accordion/Accordion.tsx","../src/components/Accordion/AccordionItem.tsx","../src/components/Avatar/Avatar.module.css","../src/components/Avatar/Avatar.variants.ts","../src/components/Avatar/Avatar.tsx","../src/components/AvatarStack/AvatarStack.module.css","../src/components/AvatarStack/AvatarStack.tsx","../src/components/Badge/Badge.module.css","../src/components/Badge/Badge.variants.ts","../src/components/Badge/Badge.tsx","../src/components/Banner/Banner.module.css","../src/components/Banner/Banner.variants.ts","../src/components/Banner/Banner.tsx","../src/components/Blockquote/Blockquote.module.css","../src/components/Blockquote/Blockquote.tsx","../src/components/Spinner/Spinner.module.css","../src/components/Spinner/Spinner.variants.ts","../src/components/Spinner/Spinner.tsx","../src/components/Typography/Typography.module.css","../src/components/Typography/Typography.variants.ts","../src/components/Typography/Typography.tsx","../src/components/Subheadline/Subheadline.module.css","../src/components/Subheadline/Subheadline.variants.ts","../src/components/Subheadline/Subheadline.tsx","../src/components/TguiProvider/context.ts","../src/components/TguiProvider/useTgui.ts","../src/components/Tappable/Ripple.module.css","../src/components/Tappable/Ripple.tsx","../src/components/Tappable/Tappable.module.css","../src/components/Tappable/useRipple.ts","../src/components/Tappable/Tappable.tsx","../src/components/Text/Text.module.css","../src/components/Text/Text.tsx","../src/shared/lib/telegram.ts","../src/shared/lib/appearance.ts","../src/shared/lib/platform.ts","../src/components/TguiProvider/TguiProvider.module.css","../src/components/TguiProvider/TguiProvider.tsx","../src/components/Button/Button.module.css","../src/components/Button/Button.variants.ts","../src/components/Button/Button.tsx","../src/components/Caption/Caption.module.css","../src/components/Caption/Caption.variants.ts","../src/components/Caption/Caption.tsx","../src/components/Card/Card.context.ts","../src/components/Card/Card.module.css","../src/components/Cell/Cell.module.css","../src/components/Cell/Cell.variants.ts","../src/components/Cell/Cell.tsx","../src/components/Card/CardCell.tsx","../src/components/Card/Card.tsx","../src/components/Checkbox/Checkbox.module.css","../src/components/Checkbox/Checkbox.tsx","../src/components/Chip/Chip.module.css","../src/components/Chip/Chip.variants.ts","../src/components/Chip/Chip.tsx","../src/components/CircularProgress/CircularProgress.module.css","../src/components/CircularProgress/CircularProgress.variants.ts","../src/components/CircularProgress/CircularProgress.tsx","../src/components/Divider/Divider.module.css","../src/components/Divider/Divider.tsx","../src/components/FixedLayout/FixedLayout.module.css","../src/components/FixedLayout/FixedLayout.tsx","../src/components/Headline/Headline.module.css","../src/components/Headline/Headline.tsx","../src/components/HorizontalScroll/HorizontalScroll.module.css","../src/components/HorizontalScroll/HorizontalScroll.tsx","../src/components/IconButton/IconButton.module.css","../src/components/IconButton/IconButton.variants.ts","../src/components/IconButton/IconButton.tsx","../src/components/Image/Image.module.css","../src/components/Image/Image.tsx","../src/components/FormField/FormField.module.css","../src/components/FormField/FormField.tsx","../src/components/Input/Input.module.css","../src/components/Input/Input.tsx","../src/components/LargeTitle/LargeTitle.module.css","../src/components/LargeTitle/LargeTitle.tsx","../src/components/Link/Link.module.css","../src/components/Link/Link.tsx","../src/components/List/List.module.css","../src/components/List/List.tsx","../src/components/PinInput/PinInput.module.css","../src/components/PinInput/PinInput.tsx","../src/components/Title/Title.module.css","../src/components/Title/Title.variants.ts","../src/components/Title/Title.tsx","../src/components/Placeholder/Placeholder.module.css","../src/components/Placeholder/Placeholder.tsx","../src/components/Portal/Portal.tsx","../src/components/Progress/Progress.module.css","../src/components/Progress/Progress.tsx","../src/components/Radio/Radio.module.css","../src/components/Radio/Radio.tsx","../src/components/Rating/Rating.module.css","../src/components/Rating/Rating.tsx","../src/components/Section/Section.module.css","../src/components/Section/SectionFooter.tsx","../src/components/Section/SectionHeader.tsx","../src/components/Section/Section.tsx","../src/components/SegmentedControl/SegmentedControl.module.css","../src/components/SegmentedControl/SegmentedControl.tsx","../src/components/SegmentedControl/SegmentedControlItem.tsx","../src/components/Select/Select.module.css","../src/components/Select/Select.tsx","../src/shared/lib/useReducedMotion.ts","../src/components/Sheet/Sheet.module.css","../src/components/Sheet/Sheet.tsx","../src/components/Skeleton/Skeleton.module.css","../src/components/Skeleton/Skeleton.tsx","../src/components/Slider/Slider.module.css","../src/components/Slider/Slider.tsx","../src/components/Snackbar/context.ts","../src/components/Snackbar/Snackbar.module.css","../src/components/Snackbar/SnackbarProvider.tsx","../src/components/Snackbar/useSnackbar.ts","../src/components/Spoiler/particles.ts","../src/components/Spoiler/Spoiler.module.css","../src/components/Spoiler/Spoiler.tsx","../src/components/Switch/Switch.module.css","../src/components/Switch/Switch.tsx","../src/components/TabBar/TabBar.module.css","../src/components/TabBar/TabBarItem.tsx","../src/components/TabBar/TabBar.tsx","../src/components/Textarea/Textarea.module.css","../src/components/Textarea/Textarea.tsx","../src/components/Tooltip/Tooltip.module.css","../src/components/Tooltip/Tooltip.tsx"],"sourcesContent":["import { type ClassValue, clsx } from 'clsx';\n\nexport function cn(...inputs: ClassValue[]) {\n return clsx(inputs);\n}\n",".accordion {\n display: flex;\n flex-direction: column;\n}\n\n.item {\n border-bottom: var(--tgui--border--width, 1px) solid var(--tgui--divider);\n}\n\n.item:last-child {\n border-bottom: 0;\n}\n\n.header {\n display: flex;\n align-items: center;\n gap: 12px;\n width: 100%;\n padding: 15px var(--tgui--accordion--inset, 20px);\n border: 0;\n background: transparent;\n color: var(--tgui--text_color);\n font-family: var(--tgui--font-family);\n font-size: 16px;\n font-weight: var(--tgui--font_weight--accent2);\n line-height: 22px;\n text-align: start;\n cursor: pointer;\n}\n\n.title {\n flex: 1;\n min-width: 0;\n}\n\n.chevron {\n flex-shrink: 0;\n width: 18px;\n height: 18px;\n color: var(--tgui--secondary_hint_color);\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .chevron {\n transition: transform 0.2s ease;\n }\n}\n\n.header[aria-expanded=\"true\"] .chevron {\n transform: rotate(180deg);\n}\n\n@media (hover: hover) and (pointer: fine) {\n .header:hover .title {\n color: var(--tgui--link_color);\n }\n}\n\n.panel {\n display: grid;\n grid-template-rows: 0fr;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .panel {\n transition: grid-template-rows 0.25s ease;\n }\n}\n\n.panel--open {\n grid-template-rows: 1fr;\n}\n\n.panelInner {\n overflow: hidden;\n}\n\n.panelContent {\n padding: 2px var(--tgui--accordion--inset, 20px) 16px;\n color: var(--tgui--subtitle_text_color);\n font-family: var(--tgui--font-family);\n font-size: 15px;\n line-height: 21px;\n}\n","import { createContext } from 'react';\n\nexport interface AccordionContextValue {\n open: string[];\n toggle: (value: string) => void;\n}\n\nexport const AccordionContext = createContext<AccordionContextValue | null>(null);\n\nAccordionContext.displayName = 'AccordionContext';\n","'use client';\n\nimport { type HTMLAttributes, type Ref, useCallback, useMemo, useState } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './Accordion.module.css';\nimport { AccordionContext } from './context';\n\nconst toArray = (value: string | string[] | undefined): string[] =>\n value == null ? [] : Array.isArray(value) ? value : [value];\n\nexport interface AccordionProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onChange'> {\n ref?: Ref<HTMLDivElement>;\n multiple?: boolean;\n value?: string | string[];\n defaultValue?: string | string[];\n onChange?: (value: string[]) => void;\n}\n\nexport function Accordion({\n ref,\n multiple = false,\n value: valueProp,\n defaultValue,\n onChange,\n className,\n children,\n ...rest\n}: AccordionProps) {\n const [uncontrolled, setUncontrolled] = useState(() => toArray(defaultValue));\n const open = valueProp != null ? toArray(valueProp) : uncontrolled;\n\n const toggle = useCallback(\n (item: string) => {\n const isOpen = open.includes(item);\n const next = isOpen ? open.filter((v) => v !== item) : multiple ? [...open, item] : [item];\n if (valueProp == null) setUncontrolled(next);\n onChange?.(next);\n },\n [open, multiple, valueProp, onChange],\n );\n\n const context = useMemo(() => ({ open, toggle }), [open, toggle]);\n\n return (\n <AccordionContext.Provider value={context}>\n <div ref={ref} className={cn(styles.accordion, className)} {...rest}>\n {children}\n </div>\n </AccordionContext.Provider>\n );\n}\n\nAccordion.displayName = 'Accordion';\n","'use client';\n\nimport { type HTMLAttributes, type ReactNode, type Ref, useContext, useId } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './Accordion.module.css';\nimport { AccordionContext } from './context';\n\nexport interface AccordionItemProps extends HTMLAttributes<HTMLDivElement> {\n ref?: Ref<HTMLDivElement>;\n value: string;\n header: ReactNode;\n}\n\nexport function AccordionItem({\n ref,\n value,\n header,\n className,\n children,\n ...rest\n}: AccordionItemProps) {\n const context = useContext(AccordionContext);\n if (!context) {\n throw new Error('AccordionItem must be used within an <Accordion>.');\n }\n const panelId = useId();\n const open = context.open.includes(value);\n\n return (\n <div ref={ref} className={cn(styles.item, className)} {...rest}>\n <button\n type=\"button\"\n className={styles.header}\n aria-expanded={open}\n aria-controls={panelId}\n onClick={() => context.toggle(value)}\n >\n <span className={styles.title}>{header}</span>\n <svg className={styles.chevron} viewBox=\"0 0 18 18\" fill=\"none\" aria-hidden>\n <path\n d=\"M4.5 7l4.5 4.5L13.5 7\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n <div className={cn(styles.panel, open && styles['panel--open'])}>\n <div className={styles.panelInner}>\n <div id={panelId} className={styles.panelContent} inert={!open} aria-hidden={!open}>\n {children}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nAccordionItem.displayName = 'AccordionItem';\n",".avatar {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n flex-shrink: 0;\n overflow: hidden;\n border-radius: 50%;\n background: var(--tgui--tertiary_bg_color);\n color: var(--tgui--subtitle_text_color);\n font-family: var(--tgui--font-family);\n font-weight: var(--tgui--font_weight--accent2);\n line-height: 1;\n user-select: none;\n}\n\n.s20 {\n width: 20px;\n height: 20px;\n font-size: 9px;\n}\n\n.s24 {\n width: 24px;\n height: 24px;\n font-size: 10px;\n}\n\n.s28 {\n width: 28px;\n height: 28px;\n font-size: 11px;\n}\n\n.s40 {\n width: 40px;\n height: 40px;\n font-size: 15px;\n}\n\n.s48 {\n width: 48px;\n height: 48px;\n font-size: 18px;\n}\n\n.s96 {\n width: 96px;\n height: 96px;\n font-size: 34px;\n}\n\n.img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n}\n\n.acronym {\n text-transform: uppercase;\n}\n\n.icon {\n display: flex;\n width: 60%;\n height: 60%;\n}\n\n.icon > svg {\n width: 100%;\n height: 100%;\n}\n","import { cva } from 'class-variance-authority';\nimport styles from './Avatar.module.css';\n\nexport type AvatarSize = 20 | 24 | 28 | 40 | 48 | 96;\n\nexport const avatar = cva(styles.avatar, {\n variants: {\n size: {\n 20: styles.s20,\n 24: styles.s24,\n 28: styles.s28,\n 40: styles.s40,\n 48: styles.s48,\n 96: styles.s96,\n },\n },\n defaultVariants: { size: 40 },\n});\n","'use client';\n\nimport { type HTMLAttributes, type ReactNode, type Ref, useState } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './Avatar.module.css';\nimport { type AvatarSize, avatar } from './Avatar.variants';\n\nexport type { AvatarSize };\n\nexport interface AvatarProps extends HTMLAttributes<HTMLSpanElement> {\n ref?: Ref<HTMLSpanElement>;\n size?: AvatarSize;\n src?: string;\n alt?: string;\n acronym?: string;\n fallbackIcon?: ReactNode;\n}\n\nfunction PersonIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden>\n <path d=\"M12 12a4 4 0 1 0 0-8 4 4 0 0 0 0 8Zm0 2c-4.2 0-7 2.4-7 4.5V20h14v-1.5c0-2.1-2.8-4.5-7-4.5Z\" />\n </svg>\n );\n}\n\nexport function Avatar({\n ref,\n size = 40,\n src,\n alt = '',\n acronym,\n fallbackIcon,\n className,\n children,\n ...rest\n}: AvatarProps) {\n const [failedSrc, setFailedSrc] = useState<string | null>(null);\n const showImage = src != null && src !== '' && src !== failedSrc;\n\n return (\n <span ref={ref} className={cn(avatar({ size }), className)} {...rest}>\n {showImage ? (\n <img\n className={styles.img}\n src={src}\n alt={alt}\n loading=\"lazy\"\n onError={() => setFailedSrc(src)}\n />\n ) : acronym ? (\n <span className={styles.acronym}>{acronym}</span>\n ) : (\n <span className={styles.icon}>{fallbackIcon ?? <PersonIcon />}</span>\n )}\n {children}\n </span>\n );\n}\n\nAvatar.displayName = 'Avatar';\n",".stack {\n display: inline-flex;\n align-items: center;\n}\n\n.stack > * {\n margin-inline-start: calc(-1 * var(--tgui--avatar-stack--overlap, 8px));\n border-radius: 50%;\n box-shadow: 0 0 0 2px var(--tgui--bg_color);\n}\n\n.stack > *:first-child {\n margin-inline-start: 0;\n}\n","import type { CSSProperties, HTMLAttributes, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './AvatarStack.module.css';\n\nexport interface AvatarStackProps extends HTMLAttributes<HTMLDivElement> {\n ref?: Ref<HTMLDivElement>;\n overlap?: number;\n}\n\nexport function AvatarStack({ ref, overlap, className, style, ...rest }: AvatarStackProps) {\n return (\n <div\n ref={ref}\n className={cn(styles.stack, className)}\n style={\n overlap != null\n ? ({ ...style, '--tgui--avatar-stack--overlap': `${overlap}px` } as CSSProperties)\n : style\n }\n {...rest}\n />\n );\n}\n\nAvatarStack.displayName = 'AvatarStack';\n",".badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n flex-shrink: 0;\n font-family: var(--tgui--font-family);\n font-weight: var(--tgui--font_weight--accent2);\n}\n\n.number {\n min-width: 20px;\n height: 20px;\n padding: 0 6px;\n border-radius: 10px;\n font-size: 13px;\n line-height: 1;\n}\n\n.large.number {\n min-width: 24px;\n height: 24px;\n padding: 0 8px;\n border-radius: 12px;\n font-size: 15px;\n}\n\n.dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n}\n\n.large.dot {\n width: 10px;\n height: 10px;\n}\n\n.mode-primary {\n color: var(--tgui--button_text_color);\n background: var(--tgui--button_color);\n}\n\n.mode-critical {\n color: var(--tgui--white);\n background: var(--tgui--destructive_text_color);\n}\n\n.mode-secondary {\n color: var(--tgui--link_color);\n background: var(--tgui--secondary_fill);\n}\n\n.mode-gray {\n color: var(--tgui--plain_foreground);\n background: var(--tgui--tertiary_bg_color);\n}\n\n.mode-white {\n color: var(--tgui--black);\n background: var(--tgui--white);\n}\n","import { cva } from 'class-variance-authority';\nimport styles from './Badge.module.css';\n\nexport type BadgeType = 'number' | 'dot';\nexport type BadgeMode = 'primary' | 'critical' | 'secondary' | 'gray' | 'white';\n\nexport const badge = cva(styles.badge, {\n variants: {\n type: { number: styles.number, dot: styles.dot },\n mode: {\n primary: styles['mode-primary'],\n critical: styles['mode-critical'],\n secondary: styles['mode-secondary'],\n gray: styles['mode-gray'],\n white: styles['mode-white'],\n },\n large: { true: styles.large },\n },\n defaultVariants: { type: 'number', mode: 'primary' },\n});\n","import type { HTMLAttributes, ReactNode, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { type BadgeMode, type BadgeType, badge } from './Badge.variants';\n\nexport type { BadgeMode, BadgeType };\n\nexport interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {\n ref?: Ref<HTMLSpanElement>;\n type?: BadgeType;\n mode?: BadgeMode;\n large?: boolean;\n children?: ReactNode;\n}\n\nexport function Badge({\n ref,\n type = 'number',\n mode = 'primary',\n large = false,\n className,\n children,\n ...rest\n}: BadgeProps) {\n return (\n <span ref={ref} className={cn(badge({ type, mode, large }), className)} {...rest}>\n {type === 'number' ? children : null}\n </span>\n );\n}\n\nBadge.displayName = 'Badge';\n",".banner {\n position: relative;\n display: flex;\n gap: 16px;\n box-sizing: border-box;\n padding: 16px;\n border-radius: 12px;\n overflow: hidden;\n font-family: var(--tgui--font-family);\n}\n\n.type-section {\n background: var(--tgui--tertiary_bg_color);\n color: var(--tgui--text_color);\n}\n\n.type-image {\n color: var(--tgui--white);\n}\n\n.background {\n position: absolute;\n inset: 0;\n z-index: 0;\n}\n\n.background > * {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n\n.type-image::after {\n content: \"\";\n position: absolute;\n inset: 0;\n z-index: 1;\n background: linear-gradient(180deg, rgb(0 0 0 / 0.1), rgb(0 0 0 / 0.55));\n}\n\n.before {\n position: relative;\n z-index: 2;\n flex-shrink: 0;\n}\n\n.body {\n position: relative;\n z-index: 2;\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 0;\n flex: 1;\n}\n\n.callout {\n font-size: 13px;\n line-height: 16px;\n font-weight: var(--tgui--font_weight--accent2);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n opacity: 0.75;\n}\n\n.header {\n font-size: 16px;\n line-height: 22px;\n font-weight: var(--tgui--font_weight--accent1);\n}\n\n.subheader {\n font-size: 14px;\n line-height: 20px;\n opacity: 0.8;\n}\n\n.description {\n margin-top: 4px;\n font-size: 14px;\n line-height: 20px;\n}\n\n.actions {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n margin-top: 12px;\n}\n\n.close {\n position: relative;\n z-index: 2;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 24px;\n height: 24px;\n margin: -4px -4px auto auto;\n padding: 0;\n border: 0;\n border-radius: 50%;\n color: currentColor;\n background: transparent;\n cursor: pointer;\n opacity: 0.7;\n}\n\n@media (hover: hover) and (pointer: fine) {\n .close:hover {\n opacity: 1;\n }\n}\n","import { cva } from 'class-variance-authority';\nimport styles from './Banner.module.css';\n\nexport type BannerType = 'section' | 'image';\n\nexport const banner = cva(styles.banner, {\n variants: {\n type: {\n section: styles['type-section'],\n image: styles['type-image'],\n },\n },\n defaultVariants: { type: 'section' },\n});\n","import type { HTMLAttributes, ReactNode, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './Banner.module.css';\nimport { type BannerType, banner } from './Banner.variants';\n\nexport type { BannerType };\n\nexport interface BannerProps extends HTMLAttributes<HTMLElement> {\n ref?: Ref<HTMLElement>;\n type?: BannerType;\n before?: ReactNode;\n callout?: ReactNode;\n header?: ReactNode;\n subheader?: ReactNode;\n description?: ReactNode;\n actions?: ReactNode;\n background?: ReactNode;\n onClose?: () => void;\n closeLabel?: string;\n}\n\nexport function Banner({\n ref,\n type = 'section',\n before,\n callout,\n header,\n subheader,\n description,\n actions,\n background,\n onClose,\n closeLabel = 'Close',\n className,\n children,\n ...rest\n}: BannerProps) {\n return (\n <section ref={ref} className={cn(banner({ type }), className)} {...rest}>\n {type === 'image' && background != null ? (\n <div className={styles.background} aria-hidden>\n {background}\n </div>\n ) : null}\n\n {before != null ? <div className={styles.before}>{before}</div> : null}\n\n <div className={styles.body}>\n {callout != null ? <span className={styles.callout}>{callout}</span> : null}\n {header != null ? <span className={styles.header}>{header}</span> : null}\n {subheader != null ? <span className={styles.subheader}>{subheader}</span> : null}\n {description != null ? <p className={styles.description}>{description}</p> : null}\n {children}\n {actions != null ? <div className={styles.actions}>{actions}</div> : null}\n </div>\n\n {onClose != null ? (\n <button type=\"button\" className={styles.close} aria-label={closeLabel} onClick={onClose}>\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" aria-hidden>\n <path\n d=\"M3.5 3.5l7 7M10.5 3.5l-7 7\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n ) : null}\n </section>\n );\n}\n\nBanner.displayName = 'Banner';\n",".blockquote {\n margin: 0;\n padding: 8px 12px 8px 16px;\n border-radius: 4px 12px 12px 4px;\n border-inline-start: 3px solid var(--tgui--link_color);\n background: var(--tgui--secondary_fill);\n color: var(--tgui--text_color);\n font-family: var(--tgui--font-family);\n font-size: 15px;\n line-height: 21px;\n}\n\n.cite {\n display: block;\n margin-top: 6px;\n color: var(--tgui--hint_color);\n font-size: 13px;\n font-style: normal;\n}\n","import type { BlockquoteHTMLAttributes, ReactNode, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './Blockquote.module.css';\n\nexport interface BlockquoteProps extends BlockquoteHTMLAttributes<HTMLQuoteElement> {\n ref?: Ref<HTMLQuoteElement>;\n author?: ReactNode;\n}\n\nexport function Blockquote({ ref, author, className, children, ...rest }: BlockquoteProps) {\n return (\n <blockquote ref={ref} className={cn(styles.blockquote, className)} {...rest}>\n {children}\n {author != null ? <cite className={styles.cite}>{author}</cite> : null}\n </blockquote>\n );\n}\n\nBlockquote.displayName = 'Blockquote';\n",".spinner {\n display: inline-block;\n box-sizing: border-box;\n border-radius: 50%;\n border-style: solid;\n border-color: currentColor;\n border-top-color: transparent;\n animation: tgui-spinner 0.6s linear infinite;\n}\n\n.s {\n width: 16px;\n height: 16px;\n border-width: 2px;\n}\n\n.m {\n width: 24px;\n height: 24px;\n border-width: 2.5px;\n}\n\n.l {\n width: 32px;\n height: 32px;\n border-width: 3px;\n}\n\n@keyframes tgui-spinner {\n to {\n transform: rotate(360deg);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .spinner {\n animation-duration: 1.6s;\n }\n}\n","import { cva } from 'class-variance-authority';\nimport styles from './Spinner.module.css';\n\nexport type SpinnerSize = 's' | 'm' | 'l';\n\nexport const spinner = cva(styles.spinner, {\n variants: {\n size: { s: styles.s, m: styles.m, l: styles.l },\n },\n defaultVariants: { size: 'm' },\n});\n","import type { HTMLAttributes, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { type SpinnerSize, spinner } from './Spinner.variants';\n\nexport type { SpinnerSize };\n\nexport interface SpinnerProps extends HTMLAttributes<HTMLSpanElement> {\n ref?: Ref<HTMLSpanElement>;\n size?: SpinnerSize;\n}\n\nexport function Spinner({ ref, size = 'm', className, ...rest }: SpinnerProps) {\n return (\n <span\n ref={ref}\n role=\"status\"\n aria-label=\"Loading\"\n className={cn(spinner({ size }), className)}\n {...rest}\n />\n );\n}\n\nSpinner.displayName = 'Spinner';\n",".typography {\n margin: 0;\n font-family: var(--tgui--font-family);\n}\n\n.weight-1 {\n font-weight: var(--tgui--font_weight--accent1);\n}\n\n.weight-2 {\n font-weight: var(--tgui--font_weight--accent2);\n}\n\n.weight-3 {\n font-weight: var(--tgui--font_weight--accent3);\n}\n\n.caps {\n text-transform: uppercase;\n}\n","import { cva } from 'class-variance-authority';\nimport styles from './Typography.module.css';\n\nexport const typography = cva(styles.typography, {\n variants: {\n weight: {\n '1': styles['weight-1'],\n '2': styles['weight-2'],\n '3': styles['weight-3'],\n },\n caps: { true: styles.caps },\n },\n defaultVariants: { weight: '3' },\n});\n","import type { AllHTMLAttributes, ElementType, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { typography } from './Typography.variants';\n\nexport interface TypographyProps extends AllHTMLAttributes<HTMLElement> {\n ref?: Ref<HTMLElement>;\n weight?: '1' | '2' | '3';\n caps?: boolean;\n Component?: ElementType;\n}\n\nexport function Typography({\n ref,\n weight,\n caps,\n Component = 'span',\n className,\n ...rest\n}: TypographyProps) {\n return <Component ref={ref} className={cn(typography({ weight, caps }), className)} {...rest} />;\n}\n\nTypography.displayName = 'Typography';\n",".level-1 {\n font-size: var(--tgui--subheadline1--font_size);\n line-height: var(--tgui--subheadline1--line_height);\n}\n\n.level-2 {\n font-size: var(--tgui--subheadline2--font_size);\n line-height: var(--tgui--subheadline2--line_height);\n}\n","import { cva } from 'class-variance-authority';\nimport styles from './Subheadline.module.css';\n\nexport type SubheadlineLevel = '1' | '2';\n\nexport const subheadline = cva('', {\n variants: {\n level: {\n '1': styles['level-1'],\n '2': styles['level-2'],\n },\n },\n defaultVariants: { level: '1' },\n});\n","import type { Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { Typography, type TypographyProps } from '../Typography';\nimport { type SubheadlineLevel, subheadline } from './Subheadline.variants';\n\nexport interface SubheadlineProps extends TypographyProps {\n ref?: Ref<HTMLElement>;\n level?: SubheadlineLevel;\n}\n\nexport function Subheadline({\n ref,\n level,\n Component = 'h6',\n className,\n ...rest\n}: SubheadlineProps) {\n return (\n <Typography\n ref={ref}\n Component={Component}\n className={cn(subheadline({ level }), className)}\n {...rest}\n />\n );\n}\n\nSubheadline.displayName = 'Subheadline';\n","import { createContext } from 'react';\nimport type { TguiContextValue } from '../../shared/types/tgui';\n\nexport const TguiContext = createContext<TguiContextValue | null>(null);\n\nTguiContext.displayName = 'TguiContext';\n","import { useContext } from 'react';\nimport type { TguiContextValue } from '../../shared/types/tgui';\nimport { TguiContext } from './context';\n\nexport function useTgui(): TguiContextValue {\n const context = useContext(TguiContext);\n\n if (context === null) {\n throw new Error('useTgui must be used within a <TguiProvider>.');\n }\n\n return context;\n}\n",".ripple {\n position: absolute;\n inset: 0;\n overflow: hidden;\n border-radius: inherit;\n pointer-events: none;\n}\n\n.wave {\n position: absolute;\n width: 24px;\n height: 24px;\n border-radius: 50%;\n transform: translate(-50%, -50%);\n background: var(--tgui--outline);\n opacity: 0;\n animation: wave-rise 0.35s cubic-bezier(0.3, 0.3, 0.5, 1);\n}\n\n@keyframes wave-rise {\n from {\n transform: translate(-50%, -50%) scale(1);\n opacity: 1;\n }\n 30% {\n opacity: 1;\n }\n to {\n transform: translate(-50%, -50%) scale(8);\n opacity: 0;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .wave {\n animation: none;\n }\n}\n","import styles from './Ripple.module.css';\nimport type { Wave } from './useRipple';\n\ninterface RippleProps {\n waves: Wave[];\n onWaveEnd: (id: number) => void;\n}\n\nexport function Ripple({ waves, onWaveEnd }: RippleProps) {\n return (\n <span aria-hidden className={styles.ripple}>\n {waves.map((wave) => (\n <span\n key={wave.id}\n className={styles.wave}\n style={{ top: wave.y, left: wave.x }}\n onAnimationEnd={() => onWaveEnd(wave.id)}\n />\n ))}\n </span>\n );\n}\n",".tappable {\n position: relative;\n isolation: isolate;\n cursor: pointer;\n transition: opacity 0.15s ease-out;\n}\n\n.tappable[data-readonly] {\n cursor: default;\n}\n\n.tappable[data-disabled] {\n cursor: default;\n opacity: 0.35;\n}\n\n.tappable--ios:not([data-disabled]):not([data-readonly]):active,\n.tappable--opacity:not([data-disabled]):not([data-readonly]):active {\n opacity: 0.65;\n}\n\n@media (hover: hover) and (pointer: fine) {\n .tappable--ios:not([data-disabled]):not([data-readonly]):hover,\n .tappable--opacity:not([data-disabled]):not([data-readonly]):hover {\n opacity: 0.85;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .tappable {\n transition: none;\n }\n}\n","import { type PointerEvent, useCallback, useEffect, useRef, useState } from 'react';\n\nconst PRESS_DELAY = 70;\nconst WAVE_FALLBACK = 600;\n\nexport interface Wave {\n id: number;\n x: number;\n y: number;\n}\n\ntype Timer = ReturnType<typeof setTimeout>;\n\nexport function useRipple() {\n const [waves, setWaves] = useState<Wave[]>([]);\n const nextId = useRef(0);\n const pressTimers = useRef(new Map<number, Timer>());\n const waveTimers = useRef(new Set<Timer>());\n\n useEffect(() => {\n const press = pressTimers.current;\n const wave = waveTimers.current;\n return () => {\n for (const timer of press.values()) clearTimeout(timer);\n for (const timer of wave) clearTimeout(timer);\n };\n }, []);\n\n const removeWave = useCallback((id: number) => {\n setWaves((current) => current.filter((wave) => wave.id !== id));\n }, []);\n\n const onPointerDown = useCallback(\n (event: PointerEvent<HTMLElement>) => {\n const { top, left } = event.currentTarget.getBoundingClientRect();\n const x = event.clientX - left;\n const y = event.clientY - top;\n const { pointerId } = event;\n\n const press = setTimeout(() => {\n pressTimers.current.delete(pointerId);\n const id = nextId.current++;\n setWaves((current) => [...current, { id, x, y }]);\n\n const fallback = setTimeout(() => {\n waveTimers.current.delete(fallback);\n removeWave(id);\n }, WAVE_FALLBACK);\n waveTimers.current.add(fallback);\n }, PRESS_DELAY);\n\n pressTimers.current.set(pointerId, press);\n },\n [removeWave],\n );\n\n const onPointerCancel = useCallback((event: PointerEvent<HTMLElement>) => {\n const press = pressTimers.current.get(event.pointerId);\n if (press) {\n clearTimeout(press);\n pressTimers.current.delete(event.pointerId);\n }\n }, []);\n\n return { waves, onPointerDown, onPointerCancel, removeWave };\n}\n","'use client';\n\nimport type { AllHTMLAttributes, ElementType, PointerEvent, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { useTgui } from '../TguiProvider/useTgui';\nimport { Ripple } from './Ripple';\nimport styles from './Tappable.module.css';\nimport { useRipple } from './useRipple';\n\nexport interface TappableProps extends AllHTMLAttributes<HTMLElement> {\n ref?: Ref<HTMLElement>;\n Component?: ElementType;\n interactiveAnimation?: 'background' | 'opacity';\n}\n\nexport function Tappable({\n ref,\n Component = 'div',\n interactiveAnimation = 'background',\n className,\n children,\n onPointerDown,\n onPointerCancel,\n ...rest\n}: TappableProps) {\n const { platform } = useTgui();\n const ripple = useRipple();\n const disabled = Boolean(rest.disabled);\n const readOnly = Boolean(rest.readOnly);\n\n const interactive = Component !== 'div' && Component !== 'span';\n const hasRipple =\n platform === 'base' &&\n interactiveAnimation === 'background' &&\n !readOnly &&\n !disabled &&\n (interactive || rest.onClick != null);\n\n const handlePointerDown = (event: PointerEvent<HTMLElement>) => {\n if (hasRipple) ripple.onPointerDown(event);\n onPointerDown?.(event);\n };\n\n const handlePointerCancel = (event: PointerEvent<HTMLElement>) => {\n if (hasRipple) ripple.onPointerCancel(event);\n onPointerCancel?.(event);\n };\n\n return (\n <Component\n ref={ref}\n className={cn(\n styles.tappable,\n platform === 'ios' && styles['tappable--ios'],\n interactiveAnimation === 'opacity' && styles['tappable--opacity'],\n className,\n )}\n data-readonly={readOnly || undefined}\n data-disabled={disabled || undefined}\n aria-disabled={disabled || undefined}\n onPointerDown={handlePointerDown}\n onPointerCancel={handlePointerCancel}\n {...rest}\n >\n {hasRipple && <Ripple waves={ripple.waves} onWaveEnd={ripple.removeWave} />}\n {children}\n </Component>\n );\n}\n\nTappable.displayName = 'Tappable';\n",".text {\n font-size: var(--tgui--text--font_size);\n line-height: var(--tgui--text--line_height);\n}\n","import type { Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { Typography, type TypographyProps } from '../Typography';\nimport styles from './Text.module.css';\n\nexport interface TextProps extends TypographyProps {\n ref?: Ref<HTMLElement>;\n}\n\nexport function Text({ ref, className, Component = 'span', ...rest }: TextProps) {\n return (\n <Typography ref={ref} Component={Component} className={cn(styles.text, className)} {...rest} />\n );\n}\n\nText.displayName = 'Text';\n","import type { WebApp } from '../types/telegram';\n\nexport function getTelegramWebApp(): WebApp | undefined {\n if (typeof window === 'undefined') {\n return undefined;\n }\n\n return window.Telegram?.WebApp;\n}\n","import type { Appearance } from '../types/tgui';\nimport { getTelegramWebApp } from './telegram';\n\nconst DARK_QUERY = '(prefers-color-scheme: dark)';\n\nfunction canMatchMedia() {\n return typeof window !== 'undefined' && typeof window.matchMedia === 'function';\n}\n\nexport function getAppearance(): Appearance {\n const webApp = getTelegramWebApp();\n if (webApp) {\n return webApp.colorScheme === 'dark' ? 'dark' : 'light';\n }\n\n if (canMatchMedia()) {\n return window.matchMedia(DARK_QUERY).matches ? 'dark' : 'light';\n }\n\n return 'light';\n}\n\nexport function subscribeAppearance(onChange: () => void): () => void {\n const webApp = getTelegramWebApp();\n if (webApp) {\n webApp.onEvent('themeChanged', onChange);\n return () => webApp.offEvent('themeChanged', onChange);\n }\n\n if (!canMatchMedia()) {\n return () => {};\n }\n\n const media = window.matchMedia(DARK_QUERY);\n media.addEventListener('change', onChange);\n return () => media.removeEventListener('change', onChange);\n}\n","import type { TguiPlatform } from '../types/tgui';\nimport { getTelegramWebApp } from './telegram';\n\nconst TELEGRAM_IOS_LIKE = new Set(['ios', 'macos']);\n\nexport function getPlatform(): TguiPlatform {\n const webApp = getTelegramWebApp();\n if (webApp) {\n return TELEGRAM_IOS_LIKE.has(webApp.platform) ? 'ios' : 'base';\n }\n\n if (typeof navigator === 'undefined') {\n return 'base';\n }\n\n const ua = navigator.userAgent;\n const isIpadOs = ua.includes('Macintosh') && navigator.maxTouchPoints > 1;\n\n return /iphone|ipad|ipod/i.test(ua) || isIpadOs ? 'ios' : 'base';\n}\n",".wrapper {\n --tgui--font-family:\n system-ui, -apple-system, BlinkMacSystemFont, \"Roboto\", \"Apple Color Emoji\", \"Helvetica Neue\",\n sans-serif;\n\n --tgui--font_weight--accent1: 700;\n --tgui--font_weight--accent2: 600;\n --tgui--font_weight--accent3: 400;\n\n --tgui--large_title--font_size: 34px;\n --tgui--large_title--line_height: 42px;\n\n --tgui--title1--font_size: 28px;\n --tgui--title1--line_height: 36px;\n --tgui--title2--font_size: 24px;\n --tgui--title2--line_height: 32px;\n --tgui--title3--font_size: 20px;\n --tgui--title3--line_height: 24px;\n\n --tgui--headline--font_size: 19px;\n --tgui--headline--line_height: 28px;\n\n --tgui--text--font_size: 17px;\n --tgui--text--line_height: 26px;\n\n --tgui--subheadline1--font_size: 16px;\n --tgui--subheadline1--line_height: 24px;\n --tgui--subheadline2--font_size: 15px;\n --tgui--subheadline2--line_height: 22px;\n\n --tgui--caption1--font_size: 13px;\n --tgui--caption1--line_height: 20px;\n --tgui--caption2--font_size: 11px;\n --tgui--caption2--line_height: 16px;\n\n --tgui--border--width: 1px;\n --tgui--base--section--box_shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.1);\n\n --tgui--bg_color: var(--tg-theme-bg-color, #ffffff);\n --tgui--text_color: var(--tg-theme-text-color, #000000);\n --tgui--hint_color: var(--tg-theme-hint-color, #707579);\n --tgui--link_color: var(--tg-theme-link-color, #007aff);\n --tgui--button_color: var(--tg-theme-button-color, #007aff);\n --tgui--button_text_color: var(--tg-theme-button-text-color, #ffffff);\n --tgui--secondary_bg_color: var(--tg-theme-secondary-bg-color, #efeff4);\n --tgui--header_bg_color: var(--tg-theme-header-bg-color, #ffffff);\n --tgui--accent_text_color: var(--tg-theme-accent-text-color, #007aff);\n --tgui--section_bg_color: var(--tg-theme-section-bg-color, #ffffff);\n --tgui--section_header_text_color: var(--tg-theme-section-header-text-color, #707579);\n --tgui--subtitle_text_color: var(--tg-theme-subtitle-text-color, #707579);\n --tgui--destructive_text_color: var(--tg-theme-destructive-text-color, #e53935);\n\n --tgui--skeleton: rgba(0, 0, 0, 0.07);\n --tgui--divider: rgba(0, 0, 0, 0.15);\n --tgui--outline: rgba(0, 0, 0, 0.05);\n --tgui--surface_primary: rgba(255, 255, 255, 0.95);\n\n --tgui--tertiary_bg_color: #f4f4f7;\n --tgui--quartenary_bg_color: #f6f6fa;\n --tgui--segmented_control_active_bg: var(--tgui--bg_color);\n --tgui--card_bg_color: var(--tgui--section_bg_color);\n --tgui--secondary_hint_color: #a2acb0;\n --tgui--secondary_fill: rgba(67, 120, 255, 0.14);\n --tgui--green: #31d158;\n --tgui--destructive_background: #e53935;\n --tgui--primary_code_highlight: #4378ff;\n --tgui--secondary_code_highlight: #b00fb4;\n --tgui--tertiary_code_highlight: #3a9f20;\n --tgui--plain_background: rgba(0, 0, 0, 0.04);\n --tgui--plain_foreground: rgba(0, 0, 0, 0.8);\n --tgui--toast_accent_color: #55a6ff;\n\n --tgui--surface_dark: rgba(56, 56, 56, 0.85);\n --tgui--tooltip_background_dark: rgba(0, 0, 0, 0.85);\n --tgui--white: #ffffff;\n --tgui--black: #000000;\n\n --tgui--z-index--simple: 1;\n --tgui--z-index--skeleton: 2;\n --tgui--z-index--overlay: 3;\n\n -webkit-tap-highlight-color: transparent;\n -webkit-text-size-adjust: 100%;\n\n font-family: var(--tgui--font-family);\n color: var(--tgui--text_color);\n}\n\n.wrapper--ios {\n --tgui--large_title--line_height: 41px;\n --tgui--title1--line_height: 34px;\n --tgui--title2--line_height: 28px;\n --tgui--title3--line_height: 25px;\n --tgui--headline--line_height: 24px;\n --tgui--text--line_height: 22px;\n --tgui--subheadline1--line_height: 21px;\n --tgui--subheadline2--line_height: 20px;\n --tgui--caption1--line_height: 16px;\n --tgui--caption2--line_height: 13px;\n}\n\n.wrapper--dark {\n --tgui--bg_color: var(--tg-theme-bg-color, #212121);\n --tgui--text_color: var(--tg-theme-text-color, #ffffff);\n --tgui--hint_color: var(--tg-theme-hint-color, #aaaaaa);\n --tgui--link_color: var(--tg-theme-link-color, #2990ff);\n --tgui--button_color: var(--tg-theme-button-color, #2990ff);\n --tgui--button_text_color: var(--tg-theme-button-text-color, #ffffff);\n --tgui--secondary_bg_color: var(--tg-theme-secondary-bg-color, #0f0f0f);\n --tgui--header_bg_color: var(--tg-theme-header-bg-color, #212121);\n --tgui--accent_text_color: var(--tg-theme-accent-text-color, #007aff);\n --tgui--section_bg_color: var(--tg-theme-section-bg-color, #212121);\n --tgui--section_header_text_color: var(--tg-theme-section-header-text-color, #aaaaaa);\n --tgui--subtitle_text_color: var(--tg-theme-subtitle-text-color, #aaaaaa);\n --tgui--destructive_text_color: var(--tg-theme-destructive-text-color, #e53935);\n\n --tgui--skeleton: rgba(255, 255, 255, 0.07);\n --tgui--divider: rgba(255, 255, 255, 0.05);\n --tgui--outline: rgba(255, 255, 255, 0.1);\n --tgui--surface_primary: rgba(23, 23, 23, 0.95);\n --tgui--tertiary_bg_color: #2a2a2a;\n --tgui--quartenary_bg_color: #2f2f2f;\n --tgui--segmented_control_active_bg: #2f2f2f;\n --tgui--card_bg_color: #262626;\n --tgui--secondary_hint_color: #78797e;\n --tgui--secondary_fill: rgba(41, 144, 255, 0.2);\n --tgui--surface_dark: #48484a;\n --tgui--tooltip_background_dark: #48484a;\n --tgui--green: #32e55e;\n --tgui--destructive_background: rgba(255, 35, 35, 0.02);\n --tgui--primary_code_highlight: #2990ff;\n --tgui--secondary_code_highlight: #e937ed;\n --tgui--tertiary_code_highlight: #5ae536;\n --tgui--plain_background: rgba(255, 255, 255, 0.08);\n --tgui--plain_foreground: rgba(255, 255, 255, 0.95);\n}\n\n@media (min-resolution: 2dppx) {\n .wrapper {\n --tgui--border--width: 0.5px;\n }\n}\n\n@supports (padding-top: env(safe-area-inset-bottom)) {\n .wrapper {\n --tgui--safe_area_inset_bottom: env(safe-area-inset-bottom);\n }\n}\n\n@supports (color: color-mix(in srgb, red 10%, transparent)) {\n .wrapper {\n --tgui--secondary_fill: color-mix(in srgb, var(--tgui--accent_text_color) 14%, transparent);\n --tgui--tertiary_bg_color: color-mix(\n in srgb,\n var(--tgui--secondary_bg_color),\n var(--tgui--bg_color) 40%\n );\n --tgui--quartenary_bg_color: color-mix(\n in srgb,\n var(--tgui--secondary_bg_color),\n var(--tgui--bg_color) 20%\n );\n }\n\n .wrapper--dark {\n --tgui--secondary_fill: color-mix(in srgb, var(--tgui--accent_text_color) 20%, transparent);\n --tgui--card_bg_color: color-mix(in srgb, var(--tgui--bg_color), #fff 7%);\n --tgui--tertiary_bg_color: color-mix(in srgb, var(--tgui--bg_color), #fff 10%);\n --tgui--quartenary_bg_color: color-mix(in srgb, var(--tgui--bg_color), #fff 14%);\n --tgui--segmented_control_active_bg: color-mix(in srgb, var(--tgui--bg_color), #fff 12%);\n }\n}\n","import {\n type HTMLAttributes,\n type Ref,\n useCallback,\n useMemo,\n useState,\n useSyncExternalStore,\n} from 'react';\nimport { getAppearance, subscribeAppearance } from '../../shared/lib/appearance';\nimport { cn } from '../../shared/lib/cn';\nimport { getPlatform } from '../../shared/lib/platform';\nimport type { Appearance, TguiPlatform } from '../../shared/types/tgui';\nimport { TguiContext } from './context';\nimport styles from './TguiProvider.module.css';\n\nexport interface TguiProviderProps extends HTMLAttributes<HTMLDivElement> {\n ref?: Ref<HTMLDivElement>;\n platform?: TguiPlatform;\n appearance?: Appearance;\n portalContainer?: HTMLElement | null;\n}\n\nconst getServerAppearance = (): Appearance => 'light';\n\nexport function TguiProvider({\n ref,\n platform: platformProp,\n appearance: appearanceProp,\n portalContainer: portalContainerProp,\n className,\n children,\n ...rest\n}: TguiProviderProps) {\n const platform = useMemo(() => platformProp ?? getPlatform(), [platformProp]);\n\n const systemAppearance = useSyncExternalStore(\n subscribeAppearance,\n getAppearance,\n getServerAppearance,\n );\n const appearance = appearanceProp ?? systemAppearance;\n\n const [wrapper, setWrapper] = useState<HTMLDivElement | null>(null);\n const setRef = useCallback(\n (node: HTMLDivElement | null) => {\n setWrapper(node);\n\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n },\n [ref],\n );\n\n const value = useMemo(\n () => ({\n platform,\n appearance,\n portalContainer: portalContainerProp ?? wrapper,\n }),\n [platform, appearance, portalContainerProp, wrapper],\n );\n\n return (\n <div\n ref={setRef}\n className={cn(\n styles.wrapper,\n platform === 'ios' && styles['wrapper--ios'],\n appearance === 'dark' && styles['wrapper--dark'],\n className,\n )}\n {...rest}\n >\n <TguiContext.Provider value={value}>{children}</TguiContext.Provider>\n </div>\n );\n}\n\nTguiProvider.displayName = 'TguiProvider';\n",".button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n max-inline-size: 100%;\n min-inline-size: 80px;\n border: none;\n border-radius: var(--tgui--button--border_radius, 8px);\n text-decoration: none;\n}\n\n.stretched {\n inline-size: 100%;\n flex-grow: 1;\n}\n\n.button::after {\n content: \"\";\n position: absolute;\n inset: 0;\n border-radius: inherit;\n opacity: 0;\n background: var(--tgui--bg_color);\n transition: opacity 0.15s ease-out;\n}\n\n@media (hover: hover) and (pointer: fine) {\n .button:not([data-disabled]):hover::after {\n opacity: var(--tgui--button--wash-opacity);\n }\n}\n\n.before,\n.after {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.content {\n display: flex;\n flex: 0 1 auto;\n min-inline-size: 0;\n align-items: center;\n justify-content: center;\n z-index: var(--tgui--z-index--simple);\n}\n\n.label {\n min-inline-size: 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n\n.content svg {\n display: block;\n}\n\n.loading {\n pointer-events: none;\n}\n\n.loading .before,\n.loading .after,\n.loading .content {\n opacity: 0;\n}\n\n.spinner {\n position: absolute;\n color: var(--tgui--button--spinner-color);\n}\n\n.size-s {\n height: 36px;\n min-width: 34px;\n gap: 6px;\n padding: 8px 12px;\n border-radius: 999px;\n}\n\n.size-m {\n height: 42px;\n min-width: 42px;\n gap: 8px;\n padding: 8px 14px;\n}\n\n.size-l {\n height: 50px;\n gap: 10px;\n padding: 10px 20px;\n}\n\n.ios.size-m {\n border-radius: 12px;\n}\n\n.ios::after {\n content: none;\n}\n\n.mode-filled {\n --tgui--button--wash-opacity: 0.15;\n --tgui--button--spinner-color: var(--tgui--button_text_color);\n color: var(--tgui--button_text_color);\n background: var(--tgui--button_color);\n}\n\n.mode-bezeled {\n --tgui--button--wash-opacity: 0.07;\n --tgui--button--spinner-color: var(--tgui--link_color);\n color: var(--tgui--link_color);\n background: var(--tgui--secondary_fill);\n}\n\n.mode-plain {\n --tgui--button--wash-opacity: 0.03;\n --tgui--button--spinner-color: var(--tgui--plain_foreground);\n color: var(--tgui--link_color);\n background: transparent;\n}\n\n.mode-gray {\n --tgui--button--wash-opacity: 0.5;\n --tgui--button--spinner-color: var(--tgui--plain_foreground);\n color: var(--tgui--plain_foreground);\n background: var(--tgui--plain_background);\n}\n\n.mode-outline {\n --tgui--button--wash-opacity: 0.5;\n --tgui--button--spinner-color: var(--tgui--plain_foreground);\n color: var(--tgui--plain_foreground);\n background: transparent;\n box-shadow: 0 0 0 1px var(--tgui--outline);\n}\n\n.mode-white {\n --tgui--button--wash-opacity: 0.5;\n --tgui--button--spinner-color: var(--tgui--surface_dark);\n color: var(--tgui--black);\n background: var(--tgui--white);\n}\n","import { cva } from 'class-variance-authority';\nimport type { TguiPlatform } from '../../shared/types/tgui';\nimport styles from './Button.module.css';\n\nexport type ButtonMode = 'filled' | 'bezeled' | 'plain' | 'gray' | 'outline' | 'white';\nexport type ButtonSize = 's' | 'm' | 'l';\n\nexport const button = cva(styles.button, {\n variants: {\n mode: {\n filled: styles['mode-filled'],\n bezeled: styles['mode-bezeled'],\n plain: styles['mode-plain'],\n gray: styles['mode-gray'],\n outline: styles['mode-outline'],\n white: styles['mode-white'],\n },\n size: {\n s: styles['size-s'],\n m: styles['size-m'],\n l: styles['size-l'],\n },\n stretched: { true: styles.stretched },\n platform: { ios: styles.ios, base: null },\n },\n defaultVariants: { mode: 'filled', size: 'm' },\n});\n\nexport type ButtonVariantInput = {\n mode?: ButtonMode;\n size?: ButtonSize;\n stretched?: boolean;\n platform: TguiPlatform;\n};\n","'use client';\n\nimport type { AllHTMLAttributes, ElementType, ReactNode, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { Spinner } from '../Spinner';\nimport { Subheadline } from '../Subheadline';\nimport { Tappable } from '../Tappable';\nimport { Text } from '../Text';\nimport { useTgui } from '../TguiProvider';\nimport styles from './Button.module.css';\nimport { type ButtonMode, type ButtonSize, button } from './Button.variants';\n\nexport interface ButtonProps extends Omit<AllHTMLAttributes<HTMLElement>, 'size'> {\n ref?: Ref<HTMLElement>;\n Component?: ElementType;\n mode?: ButtonMode;\n size?: ButtonSize;\n stretched?: boolean;\n loading?: boolean;\n before?: ReactNode;\n after?: ReactNode;\n}\n\nfunction Label({ size, children }: { size: ButtonSize; children: ReactNode }) {\n const shared = { weight: '2', className: styles.content } as const;\n const inner = <span className={styles.label}>{children}</span>;\n return size === 'l' ? (\n <Text {...shared}>{inner}</Text>\n ) : (\n <Subheadline level=\"2\" {...shared}>\n {inner}\n </Subheadline>\n );\n}\n\nexport function Button({\n ref,\n Component = 'button',\n mode = 'filled',\n size = 'm',\n stretched = false,\n loading = false,\n type,\n before,\n after,\n children,\n className,\n ...rest\n}: ButtonProps) {\n const { platform } = useTgui();\n\n return (\n <Tappable\n ref={ref}\n Component={Component}\n type={Component === 'button' ? (type ?? 'button') : type}\n aria-busy={loading || undefined}\n className={cn(\n button({ mode, size, stretched, platform }),\n loading && styles.loading,\n className,\n )}\n {...rest}\n >\n {loading ? <Spinner size=\"s\" className={styles.spinner} aria-hidden /> : null}\n {before ? <span className={styles.before}>{before}</span> : null}\n <Label size={size}>{children}</Label>\n {after ? <span className={styles.after}>{after}</span> : null}\n </Tappable>\n );\n}\n\nButton.displayName = 'Button';\n",".level-1 {\n font-size: var(--tgui--caption1--font_size);\n line-height: var(--tgui--caption1--line_height);\n}\n\n.level-2 {\n font-size: var(--tgui--caption2--font_size);\n line-height: var(--tgui--caption2--line_height);\n}\n","import { cva } from 'class-variance-authority';\nimport styles from './Caption.module.css';\n\nexport type CaptionLevel = '1' | '2';\n\nexport const caption = cva('', {\n variants: {\n level: {\n '1': styles['level-1'],\n '2': styles['level-2'],\n },\n },\n defaultVariants: { level: '1' },\n});\n","import type { Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { Typography, type TypographyProps } from '../Typography';\nimport { type CaptionLevel, caption } from './Caption.variants';\n\nexport interface CaptionProps extends TypographyProps {\n ref?: Ref<HTMLElement>;\n level?: CaptionLevel;\n}\n\nexport function Caption({ ref, level, Component = 'span', className, ...rest }: CaptionProps) {\n return (\n <Typography\n ref={ref}\n Component={Component}\n className={cn(caption({ level }), className)}\n {...rest}\n />\n );\n}\n\nCaption.displayName = 'Caption';\n","import { createContext } from 'react';\n\nexport type CardType = 'plain' | 'ambient';\n\nexport const CardContext = createContext<{ type: CardType }>({ type: 'plain' });\n",".card {\n position: relative;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n border-radius: 20px;\n background: var(--tgui--card_bg_color);\n box-shadow:\n 0 32px 64px 0 rgba(0, 0, 0, 0.04),\n 0 0 2px 1px rgba(0, 0, 0, 0.02);\n}\n\n.card > * {\n flex-shrink: 0;\n}\n\n.cardAmbient {\n background: var(--tgui--black);\n}\n\n.cell {\n padding: 0 20px;\n background: var(--tgui--card_bg_color);\n}\n\n.cellAmbient {\n --tgui--cell--middle--padding: 12px 0;\n\n position: absolute;\n inset: auto 0 0 0;\n padding-top: 64px;\n padding-bottom: 4px;\n background: linear-gradient(\n 180deg,\n rgba(0, 0, 0, 0) 0%,\n rgba(0, 0, 0, 0.12) 22%,\n rgba(0, 0, 0, 0.55) 62%,\n rgba(0, 0, 0, 0.85) 100%\n );\n color: var(--tgui--white);\n}\n\n.cellHeader {\n font-weight: var(--tgui--font_weight--accent2);\n}\n\n.cellSubtitle {\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n}\n\n.cellAmbient .cellHeader {\n color: var(--tgui--white);\n}\n\n.cellAmbient .cellSubtitle {\n color: rgba(255, 255, 255, 0.8);\n}\n",".cell {\n --tgui--cell--middle--padding: 16px 0;\n\n display: flex;\n align-items: center;\n gap: 24px;\n padding: 0 24px;\n}\n\n.before,\n.after {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.middle {\n flex-grow: 1;\n min-inline-size: 0;\n max-inline-size: 100%;\n padding: var(--tgui--cell--middle--padding);\n\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.middle > *,\n.title {\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n\n.multiline .middle > *,\n.multiline .title {\n white-space: normal;\n}\n\n.head {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n.subhead {\n color: var(--tgui--subtitle_text_color);\n}\n\n.hint,\n.subtitle,\n.description {\n color: var(--tgui--hint_color);\n}\n\n.hovered {\n background: var(--tgui--tertiary_bg_color);\n}\n\n.ios {\n --tgui--cell--middle--padding: 12px 0;\n gap: 16px;\n padding: 0 16px;\n}\n\n@media (hover: hover) and (pointer: fine) {\n .interactive:not([data-disabled]):hover {\n background: var(--tgui--tertiary_bg_color);\n }\n}\n","import { cva } from 'class-variance-authority';\nimport styles from './Cell.module.css';\n\nexport const cell = cva(styles.cell, {\n variants: {\n platform: { ios: styles.ios, base: null },\n hovered: { true: styles.hovered },\n interactive: { true: styles.interactive },\n multiline: { true: styles.multiline },\n },\n});\n","'use client';\n\nimport type { ElementType, ReactNode, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { Caption } from '../Caption';\nimport { Subheadline } from '../Subheadline';\nimport { Tappable, type TappableProps } from '../Tappable';\nimport { Text } from '../Text';\nimport { useTgui } from '../TguiProvider';\nimport styles from './Cell.module.css';\nimport { cell } from './Cell.variants';\n\nexport interface CellProps extends Omit<TappableProps, 'Component'> {\n ref?: Ref<HTMLElement>;\n Component?: ElementType;\n subhead?: ReactNode;\n hint?: ReactNode;\n titleBadge?: ReactNode;\n subtitle?: ReactNode;\n description?: ReactNode;\n before?: ReactNode;\n after?: ReactNode;\n hovered?: boolean;\n multiline?: boolean;\n}\n\nfunction CellTitle({ ios, children }: { ios: boolean; children: ReactNode }) {\n return ios ? (\n <Text className={styles.head}>{children}</Text>\n ) : (\n <Subheadline level=\"1\" className={styles.head}>\n {children}\n </Subheadline>\n );\n}\n\nfunction CellDescription({ ios, children }: { ios: boolean; children: ReactNode }) {\n return ios ? (\n <Caption className={styles.description}>{children}</Caption>\n ) : (\n <Subheadline level=\"2\" className={styles.description}>\n {children}\n </Subheadline>\n );\n}\n\nexport function Cell({\n ref,\n Component = 'div',\n subhead,\n children,\n hint,\n titleBadge,\n subtitle,\n description,\n before,\n after,\n hovered,\n multiline,\n className,\n ...rest\n}: CellProps) {\n const { platform } = useTgui();\n const ios = platform === 'ios';\n const hasTitle = children != null || hint != null || titleBadge != null;\n const interactive =\n rest.onClick != null ||\n rest.href != null ||\n Component === 'a' ||\n Component === 'button' ||\n Component === 'label';\n\n return (\n <Tappable\n ref={ref}\n Component={Component}\n className={cn(cell({ platform, hovered, multiline, interactive }), className)}\n {...rest}\n >\n {before != null ? <div className={styles.before}>{before}</div> : null}\n\n <div className={styles.middle}>\n {subhead != null ? (\n <Subheadline level=\"2\" className={styles.subhead}>\n {subhead}\n </Subheadline>\n ) : null}\n\n {hasTitle ? (\n <CellTitle ios={ios}>\n {children != null ? <span className={styles.title}>{children}</span> : null}\n {hint != null ? <span className={styles.hint}>{hint}</span> : null}\n {titleBadge}\n </CellTitle>\n ) : null}\n\n {subtitle != null ? (\n <Subheadline level=\"2\" className={styles.subtitle}>\n {subtitle}\n </Subheadline>\n ) : null}\n\n {description != null ? <CellDescription ios={ios}>{description}</CellDescription> : null}\n </div>\n\n {after != null ? <div className={styles.after}>{after}</div> : null}\n </Tappable>\n );\n}\n\nCell.displayName = 'Cell';\n","'use client';\n\nimport { type Ref, useContext } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { Cell, type CellProps } from '../Cell';\nimport { CardContext } from './Card.context';\nimport styles from './Card.module.css';\n\nexport interface CardCellProps extends CellProps {\n ref?: Ref<HTMLElement>;\n}\n\nexport function CardCell({ ref, children, subtitle, className, ...rest }: CardCellProps) {\n const { type } = useContext(CardContext);\n const ambient = type === 'ambient';\n\n return (\n <Cell\n ref={ref}\n className={cn(styles.cell, ambient && styles.cellAmbient, className)}\n subtitle={\n subtitle != null ? <span className={styles.cellSubtitle}>{subtitle}</span> : undefined\n }\n {...rest}\n >\n {children != null ? <span className={styles.cellHeader}>{children}</span> : null}\n </Cell>\n );\n}\n\nCardCell.displayName = 'CardCell';\n","'use client';\n\nimport { type HTMLAttributes, type Ref, useMemo } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { CardContext, type CardType } from './Card.context';\nimport styles from './Card.module.css';\nimport { CardCell } from './CardCell';\n\nexport interface CardProps extends HTMLAttributes<HTMLElement> {\n ref?: Ref<HTMLElement>;\n type?: CardType;\n}\n\nexport function Card({ ref, type = 'plain', className, children, ...rest }: CardProps) {\n const context = useMemo(() => ({ type }), [type]);\n\n return (\n <CardContext.Provider value={context}>\n <article\n ref={ref}\n className={cn(styles.card, type === 'ambient' && styles.cardAmbient, className)}\n {...rest}\n >\n {children}\n </article>\n </CardContext.Provider>\n );\n}\n\nCard.displayName = 'Card';\nCard.Cell = CardCell;\n",".checkbox {\n position: relative;\n display: inline-flex;\n cursor: pointer;\n}\n\n.checkbox[data-disabled] {\n cursor: default;\n opacity: 0.3;\n}\n\n.input {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n margin: 0;\n opacity: 0;\n cursor: inherit;\n}\n\n.box {\n position: relative;\n width: 20px;\n height: 20px;\n border-radius: 6px;\n box-shadow: inset 0 0 0 2px var(--tgui--outline);\n pointer-events: none;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .box {\n transition:\n box-shadow 0.15s ease-out,\n background 0.15s ease-out;\n }\n}\n\n.input:checked + .box,\n.input:indeterminate + .box {\n background: var(--tgui--link_color);\n box-shadow: none;\n}\n\n.input:focus-visible + .box {\n box-shadow: 0 0 0 2px var(--tgui--link_color);\n}\n\n.input:checked + .box::after {\n content: \"\";\n position: absolute;\n left: 7px;\n top: 3px;\n width: 5px;\n height: 9px;\n border: solid var(--tgui--button_text_color);\n border-width: 0 2px 2px 0;\n transform: rotate(45deg);\n}\n\n.input:indeterminate + .box::after {\n content: \"\";\n position: absolute;\n left: 4px;\n top: 9px;\n width: 12px;\n height: 2px;\n background: var(--tgui--button_text_color);\n}\n","import { type InputHTMLAttributes, type Ref, useEffect, useRef } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './Checkbox.module.css';\n\nexport interface CheckboxProps extends InputHTMLAttributes<HTMLInputElement> {\n ref?: Ref<HTMLInputElement>;\n indeterminate?: boolean;\n}\n\nexport function Checkbox({\n ref,\n indeterminate = false,\n disabled,\n className,\n style,\n ...rest\n}: CheckboxProps) {\n const inner = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (inner.current) inner.current.indeterminate = indeterminate;\n }, [indeterminate]);\n\n const mergeRef = (node: HTMLInputElement | null) => {\n inner.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n };\n\n return (\n <span\n className={cn(styles.checkbox, className)}\n style={style}\n data-disabled={disabled || undefined}\n >\n <input\n ref={mergeRef}\n type=\"checkbox\"\n className={styles.input}\n disabled={disabled}\n {...rest}\n />\n <span className={styles.box} aria-hidden />\n </span>\n );\n}\n\nCheckbox.displayName = 'Checkbox';\n",".chip {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n box-sizing: border-box;\n min-height: 32px;\n padding: 4px 12px;\n border: 0;\n border-radius: 16px;\n color: var(--tgui--text_color);\n font-family: var(--tgui--font-family);\n font-size: 14px;\n line-height: 18px;\n}\n\n.mode-elevated {\n background: var(--tgui--tertiary_bg_color);\n box-shadow: 0 1px 4px rgb(0 0 0 / 0.1);\n}\n\n.mode-outline {\n background: transparent;\n box-shadow: inset 0 0 0 1px var(--tgui--outline);\n}\n\n.clickable {\n cursor: pointer;\n user-select: none;\n}\n\n@media (hover: hover) and (pointer: fine) {\n .clickable:not([data-disabled]):hover {\n opacity: 0.85;\n }\n}\n\n.before,\n.after {\n display: inline-flex;\n align-items: center;\n margin-left: -2px;\n}\n\n.after {\n margin-left: 0;\n margin-right: -4px;\n}\n\n.label {\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n\n.remove {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 18px;\n height: 18px;\n margin-right: -4px;\n padding: 0;\n border: 0;\n border-radius: 50%;\n color: var(--tgui--secondary_hint_color);\n background: transparent;\n cursor: pointer;\n}\n\n@media (hover: hover) and (pointer: fine) {\n .remove:hover {\n opacity: 0.6;\n }\n}\n","import { cva } from 'class-variance-authority';\nimport styles from './Chip.module.css';\n\nexport type ChipMode = 'elevated' | 'outline';\n\nexport const chip = cva(styles.chip, {\n variants: {\n mode: {\n elevated: styles['mode-elevated'],\n outline: styles['mode-outline'],\n },\n clickable: { true: styles.clickable },\n },\n defaultVariants: { mode: 'elevated' },\n});\n","import type { AllHTMLAttributes, ElementType, ReactNode, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './Chip.module.css';\nimport { type ChipMode, chip } from './Chip.variants';\n\nexport type { ChipMode };\n\nexport interface ChipProps extends Omit<AllHTMLAttributes<HTMLElement>, 'onClick'> {\n ref?: Ref<HTMLElement>;\n Component?: ElementType;\n mode?: ChipMode;\n before?: ReactNode;\n after?: ReactNode;\n onClick?: () => void;\n onRemove?: () => void;\n removeLabel?: string;\n}\n\nexport function Chip({\n ref,\n Component = 'div',\n mode = 'elevated',\n before,\n after,\n onClick,\n onRemove,\n removeLabel = 'Remove',\n className,\n children,\n ...rest\n}: ChipProps) {\n const clickable = onClick != null;\n\n return (\n <Component\n ref={ref}\n className={cn(chip({ mode, clickable }), className)}\n onClick={onClick}\n {...rest}\n >\n {before != null ? <span className={styles.before}>{before}</span> : null}\n <span className={styles.label}>{children}</span>\n {onRemove != null ? (\n <button\n type=\"button\"\n className={styles.remove}\n aria-label={removeLabel}\n onClick={(event) => {\n event.stopPropagation();\n onRemove();\n }}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" aria-hidden>\n <path\n d=\"M3 3l6 6M9 3l-6 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n ) : after != null ? (\n <span className={styles.after}>{after}</span>\n ) : null}\n </Component>\n );\n}\n\nChip.displayName = 'Chip';\n",".root {\n display: inline-flex;\n color: var(--tgui--link_color);\n}\n\n.svg {\n display: block;\n}\n\n.track {\n stroke: var(--tgui--tertiary_bg_color);\n}\n\n.indicator {\n stroke: currentColor;\n transform: rotate(-90deg);\n transform-origin: 50% 50%;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .indicator {\n transition: stroke-dashoffset 0.25s ease;\n }\n}\n","export type CircularProgressSize = 's' | 'm' | 'l';\n\nexport const DIMENSION: Record<CircularProgressSize, number> = { s: 20, m: 28, l: 36 };\nexport const STROKE: Record<CircularProgressSize, number> = { s: 2, m: 2.5, l: 3 };\n","import type { HTMLAttributes, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './CircularProgress.module.css';\nimport { type CircularProgressSize, DIMENSION, STROKE } from './CircularProgress.variants';\n\nexport type { CircularProgressSize };\n\nexport interface CircularProgressProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'size'> {\n ref?: Ref<HTMLSpanElement>;\n value?: number;\n size?: CircularProgressSize;\n}\n\nexport function CircularProgress({\n ref,\n value = 0,\n size = 'm',\n className,\n ...rest\n}: CircularProgressProps) {\n const clamped = Math.max(0, Math.min(100, value));\n const dimension = DIMENSION[size];\n const stroke = STROKE[size];\n const radius = (dimension - stroke) / 2;\n const circumference = 2 * Math.PI * radius;\n const center = dimension / 2;\n\n return (\n <span\n ref={ref}\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={Math.round(clamped)}\n className={cn(styles.root, className)}\n {...rest}\n >\n <svg\n className={styles.svg}\n width={dimension}\n height={dimension}\n viewBox={`0 0 ${dimension} ${dimension}`}\n aria-hidden\n >\n <circle\n className={styles.track}\n cx={center}\n cy={center}\n r={radius}\n strokeWidth={stroke}\n fill=\"none\"\n />\n <circle\n className={styles.indicator}\n cx={center}\n cy={center}\n r={radius}\n strokeWidth={stroke}\n strokeLinecap=\"round\"\n strokeDasharray={circumference}\n strokeDashoffset={circumference * (1 - clamped / 100)}\n fill=\"none\"\n />\n </svg>\n </span>\n );\n}\n\nCircularProgress.displayName = 'CircularProgress';\n",".divider {\n margin: 0;\n border: none;\n border-block-start: var(--tgui--border--width) solid var(--tgui--outline);\n}\n","import type { HTMLAttributes, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './Divider.module.css';\n\nexport interface DividerProps extends HTMLAttributes<HTMLHRElement> {\n ref?: Ref<HTMLHRElement>;\n}\n\nexport function Divider({ ref, className, ...rest }: DividerProps) {\n return <hr ref={ref} className={cn(styles.divider, className)} {...rest} />;\n}\n\nDivider.displayName = 'Divider';\n",".fixedLayout {\n position: fixed;\n left: 0;\n right: 0;\n z-index: var(--tgui--z-index--fixed, 100);\n box-sizing: border-box;\n}\n\n.top {\n top: 0;\n padding-top: env(safe-area-inset-top, 0px);\n}\n\n.bottom {\n bottom: 0;\n padding-bottom: env(safe-area-inset-bottom, 0px);\n}\n","import type { HTMLAttributes, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './FixedLayout.module.css';\n\nexport interface FixedLayoutProps extends HTMLAttributes<HTMLDivElement> {\n ref?: Ref<HTMLDivElement>;\n vertical?: 'top' | 'bottom';\n}\n\nexport function FixedLayout({ ref, vertical = 'bottom', className, ...rest }: FixedLayoutProps) {\n return (\n <div ref={ref} className={cn(styles.fixedLayout, styles[vertical], className)} {...rest} />\n );\n}\n\nFixedLayout.displayName = 'FixedLayout';\n",".headline {\n font-size: var(--tgui--headline--font_size);\n line-height: var(--tgui--headline--line_height);\n}\n","import type { Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { Typography, type TypographyProps } from '../Typography';\nimport styles from './Headline.module.css';\n\nexport interface HeadlineProps extends TypographyProps {\n ref?: Ref<HTMLElement>;\n}\n\nexport function Headline({\n ref,\n weight = '2',\n className,\n Component = 'h5',\n ...rest\n}: HeadlineProps) {\n return (\n <Typography\n ref={ref}\n weight={weight}\n Component={Component}\n className={cn(styles.headline, className)}\n {...rest}\n />\n );\n}\n\nHeadline.displayName = 'Headline';\n",".root {\n --tgui--hscroll--fade: 36px;\n --tgui--hscroll--bg: var(--tgui--bg_color);\n position: relative;\n min-width: 0;\n max-width: 100%;\n}\n\n.edge {\n position: absolute;\n top: 0;\n bottom: 0;\n width: var(--tgui--hscroll--fade);\n z-index: 1;\n opacity: 0;\n pointer-events: none;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .edge {\n transition: opacity 0.2s ease;\n }\n}\n\n.edge.visible {\n opacity: 1;\n}\n\n.edge--start {\n left: 0;\n background: linear-gradient(to right, var(--tgui--hscroll--bg), transparent);\n}\n\n.edge--end {\n right: 0;\n background: linear-gradient(to left, var(--tgui--hscroll--bg), transparent);\n}\n\n.scroller {\n display: flex;\n min-width: 0;\n overflow-x: auto;\n overflow-y: hidden;\n scrollbar-width: none;\n -ms-overflow-style: none;\n -webkit-overflow-scrolling: touch;\n overscroll-behavior-x: contain;\n}\n\n.scroller::-webkit-scrollbar {\n display: none;\n}\n\n.scroller > * {\n -webkit-user-drag: none;\n}\n\n@media (hover: hover) and (pointer: fine) {\n .scroller {\n cursor: grab;\n }\n\n .scroller[data-grabbing=\"true\"] {\n cursor: grabbing;\n }\n\n .scroller[data-grabbing=\"true\"] * {\n pointer-events: none;\n }\n}\n\n.snap {\n scroll-snap-type: x mandatory;\n}\n\n.snap > * {\n scroll-snap-align: start;\n}\n","'use client';\n\nimport {\n type HTMLAttributes,\n type PointerEvent as ReactPointerEvent,\n type Ref,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './HorizontalScroll.module.css';\n\nconst DRAG_THRESHOLD = 4;\n\nexport interface HorizontalScrollProps extends HTMLAttributes<HTMLDivElement> {\n ref?: Ref<HTMLDivElement>;\n snap?: boolean;\n fade?: boolean;\n}\n\nexport function HorizontalScroll({\n ref,\n snap = false,\n fade = true,\n className,\n children,\n ...rest\n}: HorizontalScrollProps) {\n const scrollerRef = useRef<HTMLDivElement | null>(null);\n const [edges, setEdges] = useState({ start: false, end: false });\n const drag = useRef({ down: false, moved: false, startX: 0, startScroll: 0 });\n\n const measure = useCallback(() => {\n const el = scrollerRef.current;\n if (!el) return;\n const start = el.scrollLeft > 1;\n const end = el.scrollLeft < el.scrollWidth - el.clientWidth - 1;\n setEdges((prev) => (prev.start === start && prev.end === end ? prev : { start, end }));\n }, []);\n\n useEffect(() => {\n const el = scrollerRef.current;\n if (!el) return;\n measure();\n el.addEventListener('scroll', measure, { passive: true });\n const observer = typeof ResizeObserver !== 'undefined' ? new ResizeObserver(measure) : null;\n observer?.observe(el);\n return () => {\n el.removeEventListener('scroll', measure);\n observer?.disconnect();\n };\n }, [measure]);\n\n const onPointerDown = (event: ReactPointerEvent<HTMLDivElement>) => {\n if (event.pointerType !== 'mouse' || event.button !== 0) return;\n const el = scrollerRef.current;\n if (!el) return;\n drag.current = {\n down: true,\n moved: false,\n startX: event.clientX,\n startScroll: el.scrollLeft,\n };\n };\n\n const onPointerMove = (event: ReactPointerEvent<HTMLDivElement>) => {\n const state = drag.current;\n const el = scrollerRef.current;\n if (!state.down || !el) return;\n const dx = event.clientX - state.startX;\n if (!state.moved) {\n if (Math.abs(dx) < DRAG_THRESHOLD) return;\n state.moved = true;\n el.setPointerCapture(event.pointerId);\n el.dataset.grabbing = 'true';\n el.style.scrollBehavior = 'auto';\n }\n event.preventDefault();\n el.scrollLeft = state.startScroll - dx;\n };\n\n const endDrag = (event: ReactPointerEvent<HTMLDivElement>) => {\n const el = scrollerRef.current;\n if (el && drag.current.moved) {\n el.releasePointerCapture?.(event.pointerId);\n delete el.dataset.grabbing;\n el.style.scrollBehavior = '';\n }\n drag.current.down = false;\n };\n\n return (\n <div\n ref={ref}\n className={cn(styles.root, className)}\n data-start={fade ? String(edges.start) : undefined}\n data-end={fade ? String(edges.end) : undefined}\n {...rest}\n >\n {fade ? (\n <>\n <span\n className={cn(styles.edge, styles['edge--start'], edges.start && styles.visible)}\n aria-hidden\n />\n <span\n className={cn(styles.edge, styles['edge--end'], edges.end && styles.visible)}\n aria-hidden\n />\n </>\n ) : null}\n {/* biome-ignore lint/a11y/noStaticElementInteractions: pointer handlers only add mouse drag-to-scroll on top of the native scroll region; keyboard and touch scroll it without them */}\n <div\n ref={scrollerRef}\n className={cn(styles.scroller, snap && styles.snap)}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={endDrag}\n onPointerCancel={endDrag}\n onDragStart={(event) => event.preventDefault()}\n onClickCapture={(event) => {\n if (drag.current.moved) {\n event.stopPropagation();\n drag.current.moved = false;\n }\n }}\n >\n {children}\n </div>\n </div>\n );\n}\n\nHorizontalScroll.displayName = 'HorizontalScroll';\n",".iconButton {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n padding: 0;\n border: none;\n overflow: hidden;\n border-radius: 10px;\n color: var(--tgui--link_color);\n background: transparent;\n}\n\n.circle {\n border-radius: 50%;\n}\n\n.s {\n width: 30px;\n height: 30px;\n}\n\n.m {\n width: 36px;\n height: 36px;\n}\n\n.l {\n width: 44px;\n height: 44px;\n}\n\n.iconButton::after {\n content: \"\";\n position: absolute;\n inset: 0;\n opacity: 0;\n background: currentColor;\n}\n\n.ios::after {\n content: none;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .iconButton::after {\n transition: opacity 0.15s ease-out;\n }\n}\n\n@media (hover: hover) and (pointer: fine) {\n .iconButton:not([data-disabled]):hover::after {\n opacity: 0.08;\n }\n}\n\n.icon {\n display: flex;\n z-index: var(--tgui--z-index--simple);\n}\n\n.icon svg {\n display: block;\n}\n\n.mode-bezeled {\n color: var(--tgui--link_color);\n background: var(--tgui--secondary_fill);\n}\n\n.mode-plain {\n color: var(--tgui--link_color);\n}\n\n.mode-gray {\n color: var(--tgui--plain_foreground);\n background: var(--tgui--plain_background);\n}\n\n.mode-outline {\n color: var(--tgui--plain_foreground);\n box-shadow: inset 0 0 0 1px var(--tgui--outline);\n}\n","import { cva } from 'class-variance-authority';\nimport styles from './IconButton.module.css';\n\nexport type IconButtonMode = 'bezeled' | 'plain' | 'gray' | 'outline';\nexport type IconButtonSize = 's' | 'm' | 'l';\n\nexport const iconButton = cva(styles.iconButton, {\n variants: {\n mode: {\n bezeled: styles['mode-bezeled'],\n plain: styles['mode-plain'],\n gray: styles['mode-gray'],\n outline: styles['mode-outline'],\n },\n size: { s: styles.s, m: styles.m, l: styles.l },\n circle: { true: styles.circle },\n platform: { ios: styles.ios, base: null },\n },\n defaultVariants: { mode: 'plain', size: 'm' },\n});\n","'use client';\n\nimport type { AllHTMLAttributes, ElementType, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { Tappable } from '../Tappable';\nimport { useTgui } from '../TguiProvider';\nimport styles from './IconButton.module.css';\nimport { type IconButtonMode, type IconButtonSize, iconButton } from './IconButton.variants';\n\nexport type { IconButtonMode, IconButtonSize };\n\nexport interface IconButtonProps extends Omit<AllHTMLAttributes<HTMLElement>, 'size'> {\n ref?: Ref<HTMLElement>;\n Component?: ElementType;\n mode?: IconButtonMode;\n size?: IconButtonSize;\n circle?: boolean;\n}\n\nexport function IconButton({\n ref,\n Component = 'button',\n mode = 'plain',\n size = 'm',\n circle = false,\n type,\n className,\n children,\n ...rest\n}: IconButtonProps) {\n const { platform } = useTgui();\n\n return (\n <Tappable\n ref={ref}\n Component={Component}\n type={Component === 'button' ? (type ?? 'button') : type}\n className={cn(iconButton({ mode, size, circle, platform }), className)}\n {...rest}\n >\n <span className={styles.icon}>{children}</span>\n </Tappable>\n );\n}\n\nIconButton.displayName = 'IconButton';\n",".frame {\n position: relative;\n display: inline-block;\n overflow: hidden;\n flex-shrink: 0;\n background: var(--tgui--tertiary_bg_color);\n line-height: 0;\n}\n\n.bordered {\n box-shadow: inset 0 0 0 1px var(--tgui--outline);\n}\n\n.img {\n display: block;\n width: 100%;\n height: 100%;\n object-fit: var(--tgui--image--fit, cover);\n}\n\n.loading .img {\n opacity: 0;\n}\n\n.placeholder,\n.fallback {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--tgui--secondary_hint_color);\n}\n\n.placeholder {\n overflow: hidden;\n background: var(--tgui--skeleton);\n}\n\n.placeholder::after {\n content: \"\";\n position: absolute;\n inset: 0;\n transform: translateX(-100%);\n background: linear-gradient(\n 90deg,\n transparent,\n color-mix(in srgb, var(--tgui--text_color) 6%, transparent),\n transparent\n );\n animation: tgui-image-shimmer 1.5s ease-in-out infinite;\n}\n\n@keyframes tgui-image-shimmer {\n to {\n transform: translateX(100%);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .placeholder::after {\n animation: none;\n }\n}\n\n.fallback svg {\n width: 32%;\n height: 32%;\n max-width: 48px;\n max-height: 48px;\n}\n","'use client';\n\nimport {\n type CSSProperties,\n type ImgHTMLAttributes,\n type ReactNode,\n type Ref,\n useState,\n} from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './Image.module.css';\n\ntype Fit = 'cover' | 'contain' | 'fill' | 'none' | 'scale-down';\n\nexport interface ImageProps extends Omit<ImgHTMLAttributes<HTMLImageElement>, 'width' | 'height'> {\n ref?: Ref<HTMLImageElement>;\n size?: number;\n width?: number | string;\n height?: number | string;\n aspectRatio?: number | string;\n fit?: Fit;\n radius?: number | 'full';\n bordered?: boolean;\n fallback?: ReactNode;\n}\n\nconst BrokenIcon = (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden>\n <path\n d=\"M3 5h18v14H3zM3 15l5-5 4 4 3-3 6 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nexport function Image({\n ref,\n size,\n width,\n height,\n aspectRatio,\n fit = 'cover',\n radius,\n bordered = false,\n fallback = BrokenIcon,\n src,\n alt = '',\n className,\n style,\n onLoad,\n onError,\n ...rest\n}: ImageProps) {\n const [failedSrc, setFailedSrc] = useState<string | null>(null);\n const [loaded, setLoaded] = useState(false);\n const errored = src != null && src === failedSrc;\n\n const frameStyle: CSSProperties = {\n ...style,\n width: size ?? width,\n height: size ?? height,\n aspectRatio,\n borderRadius: radius === 'full' ? '50%' : radius,\n '--tgui--image--fit': fit,\n } as CSSProperties;\n\n return (\n <div\n className={cn(\n styles.frame,\n bordered && styles.bordered,\n !loaded && styles.loading,\n className,\n )}\n style={frameStyle}\n >\n {src != null && !errored ? (\n <img\n ref={ref}\n className={styles.img}\n src={src}\n alt={alt}\n draggable={false}\n onLoad={(event) => {\n setLoaded(true);\n onLoad?.(event);\n }}\n onError={(event) => {\n setFailedSrc(src);\n onError?.(event);\n }}\n {...rest}\n />\n ) : null}\n {!loaded && !errored ? <div className={styles.placeholder} aria-hidden /> : null}\n {errored ? (\n <div className={styles.fallback} aria-hidden>\n {fallback}\n </div>\n ) : null}\n </div>\n );\n}\n\nImage.displayName = 'Image';\n",".base {\n position: relative;\n padding: 20px 22px 16px;\n background: var(--tgui--bg_color);\n}\n\n.body {\n display: flex;\n align-items: center;\n box-sizing: border-box;\n padding: 12px 16px;\n}\n\n.body > :not(:first-child) {\n margin-left: 12px;\n}\n\n.base .body {\n border-radius: 14px;\n box-shadow: 0 0 0 2px var(--tgui--outline);\n}\n\n.ios .body {\n min-height: 48px;\n border-radius: 12px;\n background: var(--tgui--tertiary_bg_color);\n}\n\n.align-start .body {\n align-items: flex-start;\n}\n\n.before,\n.after {\n display: flex;\n align-items: center;\n}\n\n.header {\n position: absolute;\n top: 6px;\n left: 32px;\n max-width: calc(100% - 76px);\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n padding: 0 6px;\n border-radius: 5px;\n color: var(--tgui--secondary_hint_color);\n background: var(--tgui--bg_color);\n}\n\n.focused.base .body {\n box-shadow: 0 0 0 2px var(--tgui--link_color);\n}\n\n.focused.base .header {\n color: var(--tgui--link_color);\n}\n\n.error.base .body {\n box-shadow: 0 0 0 2px var(--tgui--destructive_text_color);\n}\n\n.error.base .header {\n color: var(--tgui--destructive_text_color);\n}\n\n.error.ios .body {\n box-shadow: 0 0 0 1.5px var(--tgui--destructive_text_color);\n}\n\n.disabled {\n pointer-events: none;\n}\n\n.disabled.ios {\n opacity: 0.35;\n}\n","import type { ReactNode, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './FormField.module.css';\n\nexport type FormFieldStatus = 'default' | 'error' | 'focused';\n\nexport interface FormFieldProps {\n ref?: Ref<HTMLDivElement>;\n ios?: boolean;\n status?: FormFieldStatus;\n disabled?: boolean;\n alignStart?: boolean;\n header?: ReactNode;\n before?: ReactNode;\n after?: ReactNode;\n className?: string;\n children: ReactNode;\n}\n\nexport function FormField({\n ref,\n ios = false,\n status = 'default',\n disabled = false,\n alignStart = false,\n header,\n before,\n after,\n className,\n children,\n}: FormFieldProps) {\n return (\n <div\n ref={ref}\n className={cn(\n ios ? styles.ios : styles.base,\n status === 'error' && styles.error,\n status === 'focused' && styles.focused,\n disabled && styles.disabled,\n alignStart && styles['align-start'],\n className,\n )}\n aria-disabled={disabled || undefined}\n >\n {/* biome-ignore lint/a11y/noLabelWithoutControl: the control is the field passed in as children */}\n <label className={styles.body}>\n {before != null ? <span className={styles.before}>{before}</span> : null}\n {children}\n {after != null ? <span className={styles.after}>{after}</span> : null}\n </label>\n {header != null && !ios ? <span className={styles.header}>{header}</span> : null}\n </div>\n );\n}\n\nFormField.displayName = 'FormField';\n",".field {\n display: block;\n width: 100%;\n margin: 0;\n padding: 0;\n border: 0;\n outline: 0;\n background: transparent;\n color: var(--tgui--text_color);\n text-overflow: ellipsis;\n}\n\n.field::placeholder {\n color: var(--tgui--secondary_hint_color);\n}\n\n.field::-webkit-outer-spin-button,\n.field::-webkit-inner-spin-button {\n appearance: none;\n}\n","'use client';\n\nimport {\n type FocusEvent,\n type InputHTMLAttributes,\n type ReactNode,\n type Ref,\n useState,\n} from 'react';\nimport { FormField } from '../FormField';\nimport { Subheadline } from '../Subheadline';\nimport { Text } from '../Text';\nimport { useTgui } from '../TguiProvider';\nimport styles from './Input.module.css';\n\nexport type InputStatus = 'default' | 'error' | 'focused';\n\nexport interface InputProps extends InputHTMLAttributes<HTMLInputElement> {\n ref?: Ref<HTMLInputElement>;\n header?: ReactNode;\n before?: ReactNode;\n after?: ReactNode;\n status?: InputStatus;\n}\n\nexport function Input({\n ref,\n type = 'text',\n header,\n before,\n after,\n status,\n disabled,\n className,\n onFocus,\n onBlur,\n ...rest\n}: InputProps) {\n const { platform } = useTgui();\n const ios = platform === 'ios';\n const [focused, setFocused] = useState(false);\n const state = status ?? (focused ? 'focused' : 'default');\n const Typography = ios ? Text : Subheadline;\n\n const handleFocus = (event: FocusEvent<HTMLInputElement>) => {\n if (!disabled) setFocused(true);\n onFocus?.(event);\n };\n const handleBlur = (event: FocusEvent<HTMLInputElement>) => {\n setFocused(false);\n onBlur?.(event);\n };\n\n return (\n <FormField\n ios={ios}\n status={state}\n disabled={disabled}\n header={header}\n before={before}\n after={after}\n className={className}\n >\n <Typography\n ref={ref as Ref<HTMLElement>}\n Component=\"input\"\n className={styles.field}\n type={type}\n disabled={disabled}\n onFocus={handleFocus}\n onBlur={handleBlur}\n {...rest}\n />\n </FormField>\n );\n}\n\nInput.displayName = 'Input';\n",".large-title {\n font-size: var(--tgui--large_title--font_size);\n line-height: var(--tgui--large_title--line_height);\n\n letter-spacing: -0.02em;\n}\n","import type { Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { Typography, type TypographyProps } from '../Typography';\nimport styles from './LargeTitle.module.css';\n\nexport interface LargeTitleProps extends TypographyProps {\n ref?: Ref<HTMLElement>;\n}\n\nexport function LargeTitle({\n ref,\n weight = '1',\n className,\n Component = 'h1',\n ...rest\n}: LargeTitleProps) {\n return (\n <Typography\n ref={ref}\n weight={weight}\n Component={Component}\n className={cn(styles['large-title'], className)}\n {...rest}\n />\n );\n}\n\nLargeTitle.displayName = 'LargeTitle';\n",".link {\n color: var(--tgui--link_color);\n text-decoration: none;\n border-radius: 3px;\n outline-offset: 2px;\n}\n\n@media (hover: hover) and (pointer: fine) {\n .link:hover {\n text-decoration: underline;\n }\n}\n\n.link:focus-visible {\n outline: 2px solid var(--tgui--link_color);\n}\n\n.icon {\n display: inline-block;\n width: 0.85em;\n height: 0.85em;\n margin-inline-start: 0.15em;\n vertical-align: -0.05em;\n}\n","import type { AnchorHTMLAttributes, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './Link.module.css';\n\nexport interface LinkProps extends AnchorHTMLAttributes<HTMLAnchorElement> {\n ref?: Ref<HTMLAnchorElement>;\n}\n\nexport function Link({ ref, target, rel, className, children, ...rest }: LinkProps) {\n const external = target === '_blank';\n return (\n <a\n ref={ref}\n target={target}\n rel={external ? (rel ?? 'noopener noreferrer') : rel}\n className={cn(styles.link, className)}\n {...rest}\n >\n {children}\n {external ? (\n <svg className={styles.icon} viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden>\n <path\n d=\"M6 3h7v7M13 3l-8 8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n ) : null}\n </a>\n );\n}\n\nLink.displayName = 'Link';\n",".list {\n box-sizing: border-box;\n}\n\n.ios {\n padding: 10px 18px;\n}\n\n.list > :not(:last-child) {\n margin-bottom: 12px;\n}\n","'use client';\n\nimport type { ElementType, HTMLAttributes, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { useTgui } from '../TguiProvider';\nimport styles from './List.module.css';\n\nexport interface ListProps extends HTMLAttributes<HTMLElement> {\n ref?: Ref<HTMLElement>;\n Component?: ElementType;\n}\n\nexport function List({ ref, Component = 'div', className, children, ...rest }: ListProps) {\n const { platform } = useTgui();\n\n return (\n <Component\n ref={ref}\n className={cn(styles.list, platform === 'ios' && styles.ios, className)}\n {...rest}\n >\n {children}\n </Component>\n );\n}\n\nList.displayName = 'List';\n",".pinInput {\n display: inline-flex;\n gap: 10px;\n}\n\n.cell {\n width: 44px;\n height: 52px;\n padding: 0;\n border: 0;\n border-radius: 12px;\n background: var(--tgui--tertiary_bg_color);\n color: var(--tgui--text_color);\n font-family: var(--tgui--font-family);\n font-size: 24px;\n font-weight: var(--tgui--font_weight--accent2);\n text-align: center;\n caret-color: var(--tgui--link_color);\n box-shadow: inset 0 0 0 1.5px transparent;\n transition: box-shadow 0.12s ease;\n}\n\n.cell:focus {\n outline: none;\n box-shadow: inset 0 0 0 1.5px var(--tgui--link_color);\n}\n\n.cell:disabled {\n opacity: 0.4;\n}\n\n.pinInput[data-invalid] .cell {\n box-shadow: inset 0 0 0 1.5px var(--tgui--destructive_text_color);\n}\n","'use client';\n\nimport {\n type ClipboardEvent as ReactClipboardEvent,\n type KeyboardEvent as ReactKeyboardEvent,\n type Ref,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './PinInput.module.css';\n\nconst PATTERNS = {\n numeric: /[0-9]/,\n alphanumeric: /[a-z0-9]/i,\n};\n\nexport interface PinInputProps {\n ref?: Ref<HTMLDivElement>;\n length?: number;\n value?: string;\n defaultValue?: string;\n onChange?: (value: string) => void;\n onComplete?: (value: string) => void;\n type?: 'numeric' | 'alphanumeric';\n mask?: boolean;\n disabled?: boolean;\n invalid?: boolean;\n name?: string;\n 'aria-label'?: string;\n className?: string;\n}\n\nexport function PinInput({\n ref,\n length = 4,\n value: valueProp,\n defaultValue = '',\n onChange,\n onComplete,\n type = 'numeric',\n mask = false,\n disabled = false,\n invalid = false,\n name,\n 'aria-label': ariaLabel = 'Verification code',\n className,\n}: PinInputProps) {\n const [uncontrolled, setUncontrolled] = useState(defaultValue.slice(0, length));\n const raw = valueProp ?? uncontrolled;\n const chars = useMemo(() => {\n const next = raw.split('').slice(0, length);\n while (next.length < length) next.push('');\n return next;\n }, [raw, length]);\n\n const inputs = useRef<(HTMLInputElement | null)[]>([]);\n const pattern = PATTERNS[type];\n\n const commit = (next: string[]) => {\n const value = next.join('');\n if (valueProp == null) setUncontrolled(value);\n onChange?.(value);\n if (value.length === length && next.every(Boolean)) onComplete?.(value);\n };\n\n const focusCell = (index: number) => {\n const clamped = Math.max(0, Math.min(length - 1, index));\n inputs.current[clamped]?.focus();\n inputs.current[clamped]?.select();\n };\n\n const handleChange = (index: number, incoming: string) => {\n const char = incoming\n .split('')\n .reverse()\n .find((c) => pattern.test(c));\n if (!char) return;\n const next = [...chars];\n next[index] = char;\n commit(next);\n focusCell(index + 1);\n };\n\n const handleKeyDown = (index: number, event: ReactKeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Backspace') {\n event.preventDefault();\n const next = [...chars];\n if (next[index]) {\n next[index] = '';\n commit(next);\n } else if (index > 0) {\n next[index - 1] = '';\n commit(next);\n focusCell(index - 1);\n }\n } else if (event.key === 'ArrowLeft') {\n event.preventDefault();\n focusCell(index - 1);\n } else if (event.key === 'ArrowRight') {\n event.preventDefault();\n focusCell(index + 1);\n }\n };\n\n const handlePaste = (index: number, event: ReactClipboardEvent<HTMLInputElement>) => {\n event.preventDefault();\n const pasted = event.clipboardData\n .getData('text')\n .split('')\n .filter((c) => pattern.test(c));\n if (pasted.length === 0) return;\n const next = [...chars];\n for (let i = 0; i < pasted.length && index + i < length; i += 1) {\n next[index + i] = pasted[i];\n }\n commit(next);\n focusCell(index + pasted.length);\n };\n\n return (\n // biome-ignore lint/a11y/useSemanticElements: a labelled group of separate inputs; <fieldset> would add a border box and legend semantics we don't want\n <div\n ref={ref}\n className={cn(styles.pinInput, className)}\n role=\"group\"\n aria-label={ariaLabel}\n data-invalid={invalid || undefined}\n >\n {chars.map((char, index) => (\n <input\n // biome-ignore lint/suspicious/noArrayIndexKey: fixed-length positional cells\n key={index}\n ref={(node) => {\n inputs.current[index] = node;\n }}\n className={styles.cell}\n type={mask ? 'password' : 'text'}\n inputMode={type === 'numeric' ? 'numeric' : 'text'}\n autoComplete={index === 0 ? 'one-time-code' : 'off'}\n name={name ? `${name}-${index}` : undefined}\n aria-label={`${ariaLabel}, digit ${index + 1}`}\n maxLength={1}\n value={char}\n disabled={disabled}\n onChange={(event) => handleChange(index, event.target.value)}\n onKeyDown={(event) => handleKeyDown(index, event)}\n onPaste={(event) => handlePaste(index, event)}\n onFocus={(event) => event.target.select()}\n />\n ))}\n </div>\n );\n}\n\nPinInput.displayName = 'PinInput';\n",".level-1 {\n font-size: var(--tgui--title1--font_size);\n line-height: var(--tgui--title1--line_height);\n}\n\n.level-2 {\n font-size: var(--tgui--title2--font_size);\n line-height: var(--tgui--title2--line_height);\n}\n\n.level-3 {\n font-size: var(--tgui--title3--font_size);\n line-height: var(--tgui--title3--line_height);\n}\n","import type { ElementType } from 'react';\nimport styles from './Title.module.css';\n\nexport type TitleLevel = '1' | '2' | '3';\n\nexport const TITLE_LEVELS: Record<TitleLevel, { tag: ElementType; className: string }> = {\n '1': { tag: 'h2', className: styles['level-1'] },\n '2': { tag: 'h3', className: styles['level-2'] },\n '3': { tag: 'h4', className: styles['level-3'] },\n};\n","import type { Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { Typography, type TypographyProps } from '../Typography';\nimport { TITLE_LEVELS, type TitleLevel } from './Title.variants';\n\nexport interface TitleProps extends TypographyProps {\n ref?: Ref<HTMLElement>;\n level?: TitleLevel;\n}\n\nexport function Title({ ref, level = '2', Component, className, ...rest }: TitleProps) {\n const { tag, className: levelClass } = TITLE_LEVELS[level];\n\n return (\n <Typography\n ref={ref}\n Component={Component ?? tag}\n className={cn(levelClass, className)}\n {...rest}\n />\n );\n}\n\nTitle.displayName = 'Title';\n",".placeholder {\n overflow: hidden;\n\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n\n gap: 24px;\n padding: 32px;\n}\n\n.fields {\n margin: 0;\n text-align: center;\n overflow-wrap: anywhere;\n}\n\n.description {\n color: var(--tgui--hint_color);\n}\n\n.description:not(:first-child) {\n margin-top: 8px;\n}\n","import type { HTMLAttributes, ReactNode, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { Text } from '../Text';\nimport { Title } from '../Title';\nimport styles from './Placeholder.module.css';\n\nexport interface PlaceholderProps extends HTMLAttributes<HTMLElement> {\n ref?: Ref<HTMLElement>;\n children?: ReactNode;\n header?: ReactNode;\n description?: ReactNode;\n action?: ReactNode;\n}\n\nexport function Placeholder({\n ref,\n children,\n header,\n description,\n action,\n className,\n ...rest\n}: PlaceholderProps) {\n return (\n <section ref={ref} className={cn(styles.placeholder, className)} {...rest}>\n {children}\n {header != null || description != null ? (\n <dl className={styles.fields}>\n {header != null ? (\n <Title Component=\"dt\" level=\"3\" weight=\"2\">\n {header}\n </Title>\n ) : null}\n {description != null ? (\n <Text Component=\"dd\" className={styles.description}>\n {description}\n </Text>\n ) : null}\n </dl>\n ) : null}\n {action}\n </section>\n );\n}\n\nPlaceholder.displayName = 'Placeholder';\n","'use client';\n\nimport type { ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useTgui } from '../TguiProvider';\n\nexport interface PortalProps {\n children?: ReactNode;\n container?: Element | DocumentFragment | null;\n}\n\nexport function Portal({ children, container }: PortalProps) {\n const { portalContainer } = useTgui();\n const target = container ?? portalContainer;\n if (!target) return null;\n return createPortal(children, target);\n}\n\nPortal.displayName = 'Portal';\n",".track {\n overflow: hidden;\n width: 100%;\n height: 4px;\n border-radius: 2px;\n background: var(--tgui--tertiary_bg_color);\n}\n\n.bar {\n height: 100%;\n border-radius: inherit;\n background: var(--tgui--link_color);\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .bar {\n transition: width 0.25s ease;\n }\n}\n","import type { HTMLAttributes, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './Progress.module.css';\n\nexport interface ProgressProps extends HTMLAttributes<HTMLDivElement> {\n ref?: Ref<HTMLDivElement>;\n value?: number;\n}\n\nexport function Progress({ ref, value = 0, className, ...rest }: ProgressProps) {\n const clamped = Math.max(0, Math.min(100, value));\n return (\n <div\n ref={ref}\n role=\"progressbar\"\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={Math.round(clamped)}\n className={cn(styles.track, className)}\n {...rest}\n >\n <div className={styles.bar} style={{ width: `${clamped}%` }} />\n </div>\n );\n}\n\nProgress.displayName = 'Progress';\n",".radio {\n position: relative;\n display: inline-flex;\n cursor: pointer;\n}\n\n.radio[data-disabled] {\n cursor: default;\n opacity: 0.3;\n}\n\n.input {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n margin: 0;\n opacity: 0;\n cursor: inherit;\n}\n\n.dot {\n position: relative;\n width: 20px;\n height: 20px;\n border-radius: 50%;\n box-shadow: inset 0 0 0 2px var(--tgui--outline);\n pointer-events: none;\n}\n\n.dot::after {\n content: \"\";\n position: absolute;\n inset: 5px;\n border-radius: 50%;\n background: var(--tgui--link_color);\n transform: scale(0);\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .dot {\n transition: box-shadow 0.15s ease-out;\n }\n\n .dot::after {\n transition: transform 0.15s ease-out;\n }\n}\n\n.input:checked + .dot {\n box-shadow: inset 0 0 0 2px var(--tgui--link_color);\n}\n\n.input:checked + .dot::after {\n transform: scale(1);\n}\n\n.input:focus-visible + .dot {\n box-shadow:\n inset 0 0 0 2px var(--tgui--outline),\n 0 0 0 2px var(--tgui--link_color);\n}\n\n.input:checked:focus-visible + .dot {\n box-shadow:\n inset 0 0 0 2px var(--tgui--link_color),\n 0 0 0 2px var(--tgui--link_color);\n}\n","import type { InputHTMLAttributes, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './Radio.module.css';\n\nexport interface RadioProps extends InputHTMLAttributes<HTMLInputElement> {\n ref?: Ref<HTMLInputElement>;\n}\n\nexport function Radio({ ref, disabled, className, style, ...rest }: RadioProps) {\n return (\n <span\n className={cn(styles.radio, className)}\n style={style}\n data-disabled={disabled || undefined}\n >\n <input ref={ref} type=\"radio\" className={styles.input} disabled={disabled} {...rest} />\n <span className={styles.dot} aria-hidden />\n </span>\n );\n}\n\nRadio.displayName = 'Radio';\n",".rating {\n position: relative;\n display: inline-flex;\n width: max-content;\n}\n\n.row {\n display: flex;\n gap: 2px;\n}\n\n.empty {\n color: color-mix(in srgb, var(--tgui--rating--color, #f5a623) 22%, transparent);\n}\n\n.fill {\n position: absolute;\n inset: 0;\n pointer-events: none;\n color: var(--tgui--rating--color, #f5a623);\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .fill {\n transition: clip-path 0.15s ease-out;\n }\n}\n\n.star {\n display: block;\n width: 1em;\n height: 1em;\n padding: 0;\n border: 0;\n background: transparent;\n color: inherit;\n font-size: 24px;\n line-height: 0;\n}\n\n.interactive .star {\n cursor: pointer;\n}\n\n.interactive:not([data-disabled]) .star:focus-visible {\n outline: 2px solid var(--tgui--link_color);\n outline-offset: 2px;\n border-radius: 4px;\n}\n\n.star svg {\n display: block;\n width: 100%;\n height: 100%;\n}\n\n.rating[data-disabled] {\n opacity: 0.4;\n}\n","'use client';\n\nimport {\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n type Ref,\n useState,\n} from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './Rating.module.css';\n\nconst DefaultStar = (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden>\n <path d=\"M12 2l2.9 6.3 6.9.8-5.1 4.7 1.4 6.8L12 17.8 5.9 20.4l1.4-6.8L2.2 9.1l6.9-.8z\" />\n </svg>\n);\n\nexport interface RatingProps {\n ref?: Ref<HTMLDivElement>;\n value?: number;\n defaultValue?: number;\n onChange?: (value: number) => void;\n count?: number;\n readOnly?: boolean;\n disabled?: boolean;\n icon?: ReactNode;\n name?: string;\n 'aria-label'?: string;\n className?: string;\n}\n\nexport function Rating({\n ref,\n value: valueProp,\n defaultValue = 0,\n onChange,\n count = 5,\n readOnly = false,\n disabled = false,\n icon = DefaultStar,\n name,\n 'aria-label': ariaLabel = 'Rating',\n className,\n}: RatingProps) {\n const [uncontrolled, setUncontrolled] = useState(defaultValue);\n const value = valueProp ?? uncontrolled;\n const [hovered, setHovered] = useState<number | null>(null);\n\n const interactive = !readOnly && !disabled;\n const shown = hovered ?? value;\n const pct = Math.max(0, Math.min(1, shown / count)) * 100;\n\n const set = (next: number) => {\n if (!interactive) return;\n if (valueProp == null) setUncontrolled(next);\n onChange?.(next);\n };\n\n const onKeyDown = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n if (!interactive) return;\n if (event.key === 'ArrowRight' || event.key === 'ArrowUp') {\n event.preventDefault();\n set(Math.min(count, Math.round(value) + 1));\n } else if (event.key === 'ArrowLeft' || event.key === 'ArrowDown') {\n event.preventDefault();\n set(Math.max(0, Math.round(value) - 1));\n }\n };\n\n const stars = Array.from({ length: count }, (_, i) => i + 1);\n\n const interactiveHandlers = interactive\n ? { onKeyDown, onMouseLeave: () => setHovered(null) }\n : {};\n\n const role = interactive ? 'radiogroup' : 'img';\n const label = interactive ? ariaLabel : `${ariaLabel}: ${value} out of ${count}`;\n\n return (\n // biome-ignore lint/a11y/useAriaPropsSupportedByRole: role is radiogroup or img, both support aria-label\n <div\n ref={ref}\n className={cn(styles.rating, interactive && styles.interactive, className)}\n data-disabled={disabled || undefined}\n role={role}\n aria-label={label}\n {...interactiveHandlers}\n >\n <div className={cn(styles.row, styles.empty)} aria-hidden={!interactive}>\n {stars.map((star) =>\n interactive ? (\n // biome-ignore lint/a11y/useSemanticElements: a button in a radiogroup is the rating ARIA pattern; a native radio can't hold the icon\n <button\n key={star}\n type=\"button\"\n role=\"radio\"\n aria-checked={Math.round(value) === star}\n aria-label={`${star}`}\n tabIndex={star === (Math.round(value) || 1) ? 0 : -1}\n name={name}\n className={styles.star}\n onClick={() => set(star)}\n onMouseEnter={() => setHovered(star)}\n onFocus={() => setHovered(star)}\n onBlur={() => setHovered(null)}\n >\n {icon}\n </button>\n ) : (\n <span key={star} className={styles.star}>\n {icon}\n </span>\n ),\n )}\n </div>\n <div className={styles.fill} style={{ clipPath: `inset(0 ${100 - pct}% 0 0)` }} aria-hidden>\n <div className={styles.row}>\n {stars.map((star) => (\n <span key={star} className={styles.star}>\n {icon}\n </span>\n ))}\n </div>\n </div>\n </div>\n );\n}\n\nRating.displayName = 'Rating';\n",".body {\n display: flex;\n flex-direction: column;\n}\n\n.sectionBase .bodyWithHeader {\n background: var(--tgui--section_bg_color);\n box-shadow: var(--tgui--base--section--box_shadow);\n}\n\n.sectionIos .body {\n border-radius: 12px;\n background: var(--tgui--section_bg_color);\n}\n\n.sectionIos .body > :first-child {\n border-radius: 12px 12px 0 0;\n}\n\n.sectionIos .body > :last-child {\n border-radius: 0 0 12px 12px;\n}\n\n.sectionIos .body > :only-child {\n border-radius: 12px;\n}\n\n.header {\n padding: 20px 24px 4px 22px;\n color: var(--tgui--link_color);\n}\n\n.headerLarge {\n padding-left: 24px;\n color: var(--tgui--text_color);\n}\n\n.headerIos {\n padding: 16px 16px 8px;\n color: var(--tgui--section_header_text_color);\n}\n\n.headerIos.headerLarge {\n padding: 0 0 12px;\n color: var(--tgui--text_color);\n}\n\n.footer {\n padding: 12px 24px;\n}\n\n.footerIos {\n padding: 8px 16px 0;\n}\n\n.footerCentered {\n padding: 16px 24px 20px;\n text-align: center;\n}\n\n.footerIos.footerCentered {\n padding: 16px 16px 0;\n}\n\n.footerText {\n color: var(--tgui--hint_color);\n}\n","'use client';\n\nimport type { HTMLAttributes, ReactNode, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { Caption } from '../Caption';\nimport { Subheadline } from '../Subheadline';\nimport { useTgui } from '../TguiProvider';\nimport styles from './Section.module.css';\n\nexport interface SectionFooterProps extends HTMLAttributes<HTMLElement> {\n ref?: Ref<HTMLElement>;\n centered?: boolean;\n}\n\nfunction FooterText({ ios, children }: { ios: boolean; children: ReactNode }) {\n return ios ? (\n <Caption className={styles.footerText}>{children}</Caption>\n ) : (\n <Subheadline level=\"2\" className={styles.footerText}>\n {children}\n </Subheadline>\n );\n}\n\nexport function SectionFooter({\n ref,\n centered = false,\n className,\n children,\n ...rest\n}: SectionFooterProps) {\n const { platform } = useTgui();\n const ios = platform === 'ios';\n\n return (\n <footer\n ref={ref}\n className={cn(\n styles.footer,\n ios && styles.footerIos,\n centered && styles.footerCentered,\n className,\n )}\n {...rest}\n >\n <FooterText ios={ios}>{children}</FooterText>\n </footer>\n );\n}\n\nSectionFooter.displayName = 'SectionFooter';\n","'use client';\n\nimport type { HTMLAttributes, ReactNode, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { Caption } from '../Caption';\nimport { Subheadline } from '../Subheadline';\nimport { Text } from '../Text';\nimport { useTgui } from '../TguiProvider';\nimport styles from './Section.module.css';\n\nexport interface SectionHeaderProps extends HTMLAttributes<HTMLElement> {\n ref?: Ref<HTMLElement>;\n large?: boolean;\n}\n\nfunction HeaderText({\n ios,\n large,\n children,\n}: {\n ios: boolean;\n large: boolean;\n children: ReactNode;\n}) {\n if (large) {\n return ios ? (\n <Subheadline Component=\"h2\" level=\"1\" weight=\"2\">\n {children}\n </Subheadline>\n ) : (\n <Text Component=\"h2\" weight=\"2\">\n {children}\n </Text>\n );\n }\n return ios ? (\n <Caption Component=\"h2\" caps>\n {children}\n </Caption>\n ) : (\n <Subheadline Component=\"h2\" level=\"2\" weight=\"2\">\n {children}\n </Subheadline>\n );\n}\n\nexport function SectionHeader({\n ref,\n large = false,\n className,\n children,\n ...rest\n}: SectionHeaderProps) {\n const { platform } = useTgui();\n const ios = platform === 'ios';\n\n return (\n <header\n ref={ref}\n className={cn(styles.header, ios && styles.headerIos, large && styles.headerLarge, className)}\n {...rest}\n >\n <HeaderText ios={ios} large={large}>\n {children}\n </HeaderText>\n </header>\n );\n}\n\nSectionHeader.displayName = 'SectionHeader';\n","'use client';\n\nimport {\n Children,\n Fragment,\n type HTMLAttributes,\n isValidElement,\n type ReactNode,\n type Ref,\n} from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { Divider } from '../Divider';\nimport { useTgui } from '../TguiProvider';\nimport styles from './Section.module.css';\nimport { SectionFooter } from './SectionFooter';\nimport { SectionHeader } from './SectionHeader';\n\nexport interface SectionProps extends HTMLAttributes<HTMLElement> {\n ref?: Ref<HTMLElement>;\n header?: ReactNode;\n footer?: ReactNode;\n}\n\nconst isText = (node: ReactNode) => typeof node === 'string' || typeof node === 'number';\n\nexport function Section({ ref, header, footer, className, children, ...rest }: SectionProps) {\n const { platform } = useTgui();\n const rows = Children.toArray(children);\n\n return (\n <section\n ref={ref}\n className={cn(platform === 'ios' ? styles.sectionIos : styles.sectionBase, className)}\n {...rest}\n >\n <div className={styles.bodyWithHeader}>\n {isText(header) ? <SectionHeader>{header}</SectionHeader> : header}\n <div className={styles.body}>\n {rows.map((row, i) => (\n <Fragment key={isValidElement(row) ? row.key : i}>\n {row}\n {i < rows.length - 1 ? <Divider /> : null}\n </Fragment>\n ))}\n </div>\n </div>\n {isText(footer) ? <SectionFooter>{footer}</SectionFooter> : footer}\n </section>\n );\n}\n\nSection.displayName = 'Section';\nSection.Header = SectionHeader;\nSection.Footer = SectionFooter;\n",".control {\n position: relative;\n display: flex;\n box-sizing: border-box;\n padding: 2px;\n border-radius: 9px;\n background: var(--tgui--secondary_fill);\n}\n\n.pill {\n position: absolute;\n top: 2px;\n left: 0;\n bottom: 2px;\n border-radius: 7px;\n background: var(--tgui--segmented_control_active_bg, var(--tgui--bg_color));\n box-shadow: 0 1px 3px rgb(0 0 0 / 0.12);\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .pill {\n transition:\n transform 0.22s cubic-bezier(0.32, 0.72, 0, 1),\n width 0.22s cubic-bezier(0.32, 0.72, 0, 1);\n }\n}\n\n.item {\n position: relative;\n z-index: var(--tgui--z-index--simple, 1);\n flex: 1 1 0;\n min-width: 0;\n padding: 6px 12px;\n border: 0;\n border-radius: 7px;\n background: transparent;\n color: var(--tgui--text_color);\n font-family: var(--tgui--font-family);\n font-size: 14px;\n font-weight: var(--tgui--font_weight--accent2);\n line-height: 20px;\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n cursor: pointer;\n transition: color 0.15s ease;\n}\n\n.item[data-selected] {\n cursor: default;\n}\n\n.item:disabled {\n opacity: 0.35;\n cursor: default;\n}\n\n@media (hover: hover) and (pointer: fine) {\n .item:not([data-selected]):not(:disabled):hover {\n color: var(--tgui--link_color);\n }\n}\n","'use client';\n\nimport {\n type HTMLAttributes,\n type MutableRefObject,\n type KeyboardEvent as ReactKeyboardEvent,\n type Ref,\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './SegmentedControl.module.css';\n\nexport interface SegmentedControlProps extends HTMLAttributes<HTMLDivElement> {\n ref?: Ref<HTMLDivElement>;\n}\n\nexport function SegmentedControl({\n ref,\n className,\n children,\n onKeyDown,\n ...rest\n}: SegmentedControlProps) {\n const trackRef = useRef<HTMLDivElement | null>(null);\n const [pill, setPill] = useState<{ left: number; width: number } | null>(null);\n\n const measure = useCallback(() => {\n const track = trackRef.current;\n if (!track) return;\n const selected = track.querySelector<HTMLElement>('[role=\"radio\"][data-selected]');\n const next = selected ? { left: selected.offsetLeft, width: selected.offsetWidth } : null;\n setPill((prev) => {\n if (prev === next) return prev;\n if (prev && next && prev.left === next.left && prev.width === next.width) return prev;\n return next;\n });\n }, []);\n\n useLayoutEffect(measure);\n\n useEffect(() => {\n const track = trackRef.current;\n if (!track || typeof ResizeObserver === 'undefined') return;\n const observer = new ResizeObserver(measure);\n observer.observe(track);\n return () => observer.disconnect();\n }, [measure]);\n\n const setRef = useCallback(\n (node: HTMLDivElement | null) => {\n trackRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as MutableRefObject<HTMLDivElement | null>).current = node;\n },\n [ref],\n );\n\n const handleKeyDown = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n if (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight') return;\n const track = trackRef.current;\n if (!track) return;\n const radios = Array.from(\n track.querySelectorAll<HTMLButtonElement>('[role=\"radio\"]:not(:disabled)'),\n );\n const current = radios.indexOf(document.activeElement as HTMLButtonElement);\n if (current < 0) return;\n event.preventDefault();\n const delta = event.key === 'ArrowRight' ? 1 : -1;\n const next = radios[(current + delta + radios.length) % radios.length];\n next.focus();\n next.click();\n };\n\n return (\n <div\n ref={setRef}\n role=\"radiogroup\"\n className={cn(styles.control, className)}\n onKeyDown={handleKeyDown}\n {...rest}\n >\n <div\n className={styles.pill}\n style={\n pill ? { transform: `translateX(${pill.left}px)`, width: pill.width } : { opacity: 0 }\n }\n aria-hidden\n />\n {children}\n </div>\n );\n}\n\nSegmentedControl.displayName = 'SegmentedControl';\n","import type { ButtonHTMLAttributes, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './SegmentedControl.module.css';\n\nexport interface SegmentedControlItemProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n ref?: Ref<HTMLButtonElement>;\n selected?: boolean;\n}\n\nexport function SegmentedControlItem({\n ref,\n selected = false,\n className,\n ...rest\n}: SegmentedControlItemProps) {\n return (\n // biome-ignore lint/a11y/useSemanticElements: a button in a radiogroup is the segmented-control ARIA pattern; a native radio can't hold arbitrary content\n <button\n ref={ref}\n type=\"button\"\n role=\"radio\"\n aria-checked={selected}\n tabIndex={selected ? 0 : -1}\n data-selected={selected || undefined}\n className={cn(styles.item, className)}\n {...rest}\n />\n );\n}\n\nSegmentedControlItem.displayName = 'SegmentedControlItem';\n",".base {\n position: relative;\n padding: 20px 22px 16px;\n background: var(--tgui--bg_color);\n}\n\n.row {\n position: relative;\n box-sizing: border-box;\n border-radius: 14px;\n}\n\n.base .row {\n box-shadow: inset 0 0 0 2px var(--tgui--outline);\n}\n\n.ios .row {\n border-radius: 12px;\n background: var(--tgui--tertiary_bg_color);\n}\n\n.select {\n appearance: none;\n display: block;\n width: 100%;\n min-height: 48px;\n margin: 0;\n padding: 12px 44px 12px 16px;\n border: 0;\n outline: 0;\n border-radius: inherit;\n background: transparent;\n color: var(--tgui--text_color);\n}\n\n.chevron {\n position: absolute;\n top: 50%;\n right: 18px;\n width: 8px;\n height: 8px;\n border: solid var(--tgui--secondary_hint_color);\n border-width: 0 2px 2px 0;\n transform: translateY(-75%) rotate(45deg);\n pointer-events: none;\n}\n\n.header {\n position: absolute;\n top: 6px;\n left: 32px;\n max-width: calc(100% - 76px);\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n padding: 0 6px;\n border-radius: 5px;\n color: var(--tgui--secondary_hint_color);\n background: var(--tgui--bg_color);\n}\n\n.focused.base .row {\n box-shadow: inset 0 0 0 2px var(--tgui--link_color);\n}\n\n.focused.base .header {\n color: var(--tgui--link_color);\n}\n\n.error.base .row {\n box-shadow: inset 0 0 0 2px var(--tgui--destructive_text_color);\n}\n\n.error.base .header {\n color: var(--tgui--destructive_text_color);\n}\n\n.error.ios .row {\n box-shadow: inset 0 0 0 1.5px var(--tgui--destructive_text_color);\n}\n\n.disabled {\n pointer-events: none;\n}\n\n.disabled.ios {\n opacity: 0.35;\n}\n","'use client';\n\nimport {\n type FocusEvent,\n type ReactNode,\n type Ref,\n type SelectHTMLAttributes,\n useState,\n} from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport type { InputStatus } from '../Input';\nimport { Subheadline } from '../Subheadline';\nimport { Text } from '../Text';\nimport { useTgui } from '../TguiProvider';\nimport styles from './Select.module.css';\n\nexport interface SelectProps extends SelectHTMLAttributes<HTMLSelectElement> {\n ref?: Ref<HTMLSelectElement>;\n header?: ReactNode;\n status?: InputStatus;\n}\n\nexport function Select({\n ref,\n header,\n status,\n disabled,\n className,\n onFocus,\n onBlur,\n children,\n ...rest\n}: SelectProps) {\n const { platform } = useTgui();\n const ios = platform === 'ios';\n const [focused, setFocused] = useState(false);\n const state = status ?? (focused ? 'focused' : 'default');\n const Typography = ios ? Text : Subheadline;\n\n const handleFocus = (event: FocusEvent<HTMLSelectElement>) => {\n if (!disabled) setFocused(true);\n onFocus?.(event);\n };\n const handleBlur = (event: FocusEvent<HTMLSelectElement>) => {\n setFocused(false);\n onBlur?.(event);\n };\n\n return (\n <div\n className={cn(\n ios ? styles.ios : styles.base,\n state === 'error' && styles.error,\n state === 'focused' && styles.focused,\n disabled && styles.disabled,\n className,\n )}\n aria-disabled={disabled || undefined}\n >\n <div className={styles.row}>\n <Typography\n ref={ref as Ref<HTMLElement>}\n Component=\"select\"\n className={styles.select}\n disabled={disabled}\n onFocus={handleFocus}\n onBlur={handleBlur}\n {...rest}\n >\n {children}\n </Typography>\n <span aria-hidden className={styles.chevron} />\n </div>\n {header != null && !ios ? <span className={styles.header}>{header}</span> : null}\n </div>\n );\n}\n\nSelect.displayName = 'Select';\n","import { useSyncExternalStore } from 'react';\n\nconst QUERY = '(prefers-reduced-motion: reduce)';\n\nfunction subscribe(callback: () => void) {\n if (typeof window === 'undefined' || !window.matchMedia) return () => {};\n const query = window.matchMedia(QUERY);\n query.addEventListener('change', callback);\n return () => query.removeEventListener('change', callback);\n}\n\nfunction getSnapshot() {\n if (typeof window === 'undefined' || !window.matchMedia) return false;\n return window.matchMedia(QUERY).matches;\n}\n\nexport function useReducedMotion() {\n return useSyncExternalStore(subscribe, getSnapshot, () => false);\n}\n",".backdrop {\n position: fixed;\n inset: 0;\n z-index: var(--tgui--z-index--overlay, 1000);\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n background: rgb(0 0 0 / 0.4);\n opacity: 0;\n}\n\n.backdrop--contained {\n position: absolute;\n}\n\n.backdrop--visible {\n opacity: 1;\n}\n\n.panel {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n max-width: 512px;\n max-height: var(--tgui--sheet--max-height, 50%);\n margin: 0 auto;\n border-radius: 16px 16px 0 0;\n background: var(--tgui--bg_color);\n color: var(--tgui--text_color);\n box-shadow: 0 -8px 32px rgb(0 0 0 / 0.18);\n transform: translateY(100%);\n will-change: transform;\n contain: layout;\n}\n\n.panel--visible {\n transform: translateY(0);\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .backdrop {\n transition: opacity 0.34s ease;\n }\n\n .panel {\n transition: transform 0.34s cubic-bezier(0.32, 0.72, 0, 1);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .backdrop {\n transition: opacity 0.18s linear;\n }\n\n .panel {\n transform: none;\n opacity: 0;\n transition: opacity 0.18s linear;\n }\n\n .panel--visible {\n opacity: 1;\n }\n}\n\n.grip {\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n padding-top: 8px;\n touch-action: none;\n cursor: grab;\n}\n\n.handle {\n align-self: center;\n width: 36px;\n height: 4px;\n border-radius: 2px;\n background: var(--tgui--quaternary_bg_color, var(--tgui--tertiary_bg_color));\n}\n\n.header {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 20px;\n font-family: var(--tgui--font-family);\n font-size: 20px;\n font-weight: var(--tgui--font_weight--accent1);\n line-height: 1.2;\n}\n\n.title {\n flex: 1;\n min-width: 0;\n}\n\n.close {\n margin-right: -7px;\n color: var(--tgui--secondary_hint_color);\n}\n\n.body {\n flex: 1 1 auto;\n min-height: 0;\n overflow-y: auto;\n overscroll-behavior: contain;\n padding: 4px 20px calc(20px + env(safe-area-inset-bottom));\n -webkit-overflow-scrolling: touch;\n}\n\n.grip + .body {\n padding-top: 0;\n}\n","'use client';\n\nimport {\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n type PointerEvent as ReactPointerEvent,\n type Ref,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { useReducedMotion } from '../../shared/lib/useReducedMotion';\nimport { IconButton } from '../IconButton';\nimport { Portal } from '../Portal';\nimport styles from './Sheet.module.css';\n\nconst DURATION_MS = 340;\nconst DRAG_THRESHOLD = 6;\nconst DISMISS_DISTANCE = 96;\nconst DISMISS_VELOCITY = 0.5;\n\nexport interface SheetProps {\n ref?: Ref<HTMLDivElement>;\n open: boolean;\n onClose: () => void;\n header?: ReactNode;\n children?: ReactNode;\n dismissable?: boolean;\n closeLabel?: string;\n className?: string;\n container?: Element | DocumentFragment | null;\n}\n\nfunction focusable(root: HTMLElement) {\n return Array.from(\n root.querySelectorAll<HTMLElement>(\n 'a[href],button:not([disabled]),textarea:not([disabled]),input:not([disabled]),select:not([disabled]),[tabindex]:not([tabindex=\"-1\"])',\n ),\n ).filter((el) => el.offsetParent !== null || el === document.activeElement);\n}\n\nexport function Sheet({\n ref,\n open,\n onClose,\n header,\n children,\n dismissable = true,\n closeLabel = 'Close',\n className,\n container,\n}: SheetProps) {\n const reducedMotion = useReducedMotion();\n const contained = container != null;\n const [rendered, setRendered] = useState(open);\n const [visible, setVisible] = useState(false);\n\n const panelRef = useRef<HTMLDivElement | null>(null);\n const restoreFocusRef = useRef<HTMLElement | null>(null);\n const drag = useRef({ id: -1, active: false, startY: 0, lastY: 0, lastT: 0, velocity: 0 });\n\n useEffect(() => {\n if (open) {\n setRendered(true);\n return;\n }\n setVisible(false);\n if (reducedMotion) {\n setRendered(false);\n return;\n }\n const id = setTimeout(() => setRendered(false), DURATION_MS);\n return () => clearTimeout(id);\n }, [open, reducedMotion]);\n\n useEffect(() => {\n if (!rendered || !open) return;\n const panel = panelRef.current;\n if (!panel) return;\n // reflow so the browser registers the off-screen start before the class flips\n void panel.offsetHeight;\n setVisible(true);\n }, [rendered, open]);\n\n useEffect(() => {\n if (!rendered) return;\n restoreFocusRef.current = document.activeElement as HTMLElement | null;\n\n const { body, documentElement } = document;\n const previous = { overflow: body.style.overflow, paddingRight: body.style.paddingRight };\n if (!contained) {\n const scrollbar = window.innerWidth - documentElement.clientWidth;\n body.style.overflow = 'hidden';\n if (scrollbar > 0) body.style.paddingRight = `${scrollbar}px`;\n }\n\n const id = requestAnimationFrame(() => panelRef.current?.focus({ preventScroll: true }));\n return () => {\n cancelAnimationFrame(id);\n body.style.overflow = previous.overflow;\n body.style.paddingRight = previous.paddingRight;\n restoreFocusRef.current?.focus?.({ preventScroll: true });\n };\n }, [rendered, contained]);\n\n useEffect(() => {\n if (!rendered) return;\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && dismissable) {\n event.stopPropagation();\n onClose();\n }\n };\n document.addEventListener('keydown', onKeyDown);\n return () => document.removeEventListener('keydown', onKeyDown);\n }, [rendered, dismissable, onClose]);\n\n const trapTab = useCallback((event: ReactKeyboardEvent<HTMLDivElement>) => {\n if (event.key !== 'Tab' || !panelRef.current) return;\n const items = focusable(panelRef.current);\n if (items.length === 0) {\n event.preventDefault();\n panelRef.current.focus();\n return;\n }\n const first = items[0];\n const last = items[items.length - 1];\n const active = document.activeElement;\n if (event.shiftKey && (active === first || active === panelRef.current)) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && active === last) {\n event.preventDefault();\n first.focus();\n }\n }, []);\n\n const onPointerDown = (event: ReactPointerEvent<HTMLDivElement>) => {\n if (!dismissable || event.button !== 0 || reducedMotion) return;\n if ((event.target as HTMLElement).closest('button')) return;\n drag.current = {\n id: event.pointerId,\n active: false,\n startY: event.clientY,\n lastY: event.clientY,\n lastT: event.timeStamp,\n velocity: 0,\n };\n };\n\n const onPointerMove = (event: ReactPointerEvent<HTMLDivElement>) => {\n const state = drag.current;\n if (state.id !== event.pointerId) return;\n const delta = event.clientY - state.startY;\n if (!state.active) {\n if (delta < DRAG_THRESHOLD) return;\n state.active = true;\n event.currentTarget.setPointerCapture(event.pointerId);\n if (panelRef.current) panelRef.current.style.transition = 'none';\n }\n const dt = event.timeStamp - state.lastT;\n if (dt >= 1) {\n const instant = (event.clientY - state.lastY) / dt;\n state.velocity = state.velocity * 0.6 + instant * 0.4;\n state.lastY = event.clientY;\n state.lastT = event.timeStamp;\n }\n if (panelRef.current) {\n panelRef.current.style.transform = `translateY(${Math.max(0, delta)}px)`;\n }\n };\n\n const endDrag = (event: ReactPointerEvent<HTMLDivElement>) => {\n const state = drag.current;\n if (state.id !== event.pointerId) return;\n drag.current = { ...state, id: -1, active: false };\n if (!state.active) return;\n event.currentTarget.releasePointerCapture?.(event.pointerId);\n\n const panel = panelRef.current;\n const travelled = event.clientY - state.startY;\n const dismiss = travelled > DISMISS_DISTANCE || state.velocity > DISMISS_VELOCITY;\n\n if (panel) {\n panel.style.transition = '';\n panel.getBoundingClientRect();\n panel.style.transform = '';\n }\n if (dismiss) {\n setVisible(false);\n onClose();\n }\n };\n\n if (!rendered) return null;\n\n const showPanel = visible && open;\n\n return (\n <Portal container={container}>\n <div\n ref={ref}\n className={cn(\n styles.backdrop,\n contained && styles['backdrop--contained'],\n showPanel && styles['backdrop--visible'],\n )}\n onPointerDown={(event) => {\n if (event.target === event.currentTarget && dismissable) onClose();\n }}\n >\n <div\n ref={panelRef}\n role=\"dialog\"\n aria-modal=\"true\"\n tabIndex={-1}\n className={cn(styles.panel, showPanel && styles['panel--visible'], className)}\n onKeyDown={trapTab}\n >\n <div\n className={styles.grip}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={endDrag}\n onPointerCancel={endDrag}\n >\n {dismissable ? <span className={styles.handle} aria-hidden /> : null}\n {header != null ? (\n <div className={styles.header}>\n <div className={styles.title}>{header}</div>\n {dismissable ? (\n <IconButton\n mode=\"gray\"\n size=\"s\"\n circle\n className={styles.close}\n aria-label={closeLabel}\n onClick={onClose}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden>\n <path\n d=\"M4 4l8 8M12 4l-8 8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n />\n </svg>\n </IconButton>\n ) : null}\n </div>\n ) : null}\n </div>\n <div className={styles.body}>{children}</div>\n </div>\n </div>\n </Portal>\n );\n}\n\nSheet.displayName = 'Sheet';\n",".skeleton {\n display: block;\n}\n\n.visible {\n position: relative;\n overflow: hidden;\n min-height: 1em;\n border-radius: 8px;\n background: var(--tgui--skeleton);\n color: transparent;\n pointer-events: none;\n}\n\n.visible * {\n visibility: hidden;\n}\n\n.visible::after {\n content: \"\";\n position: absolute;\n inset: 0;\n transform: translateX(-100%);\n background: linear-gradient(\n 90deg,\n transparent,\n color-mix(in srgb, var(--tgui--text_color) 5%, transparent),\n transparent\n );\n animation: tgui-skeleton 1.5s ease-in-out infinite;\n}\n\n@keyframes tgui-skeleton {\n to {\n transform: translateX(100%);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .visible::after {\n animation: none;\n }\n}\n\n@media (prefers-reduced-transparency: reduce) {\n .visible {\n background: var(--tgui--tertiary_bg_color);\n }\n}\n","import type { HTMLAttributes, ReactNode, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './Skeleton.module.css';\n\nexport interface SkeletonProps extends HTMLAttributes<HTMLDivElement> {\n ref?: Ref<HTMLDivElement>;\n visible?: boolean;\n children?: ReactNode;\n}\n\nexport function Skeleton({ ref, visible = true, className, children, ...rest }: SkeletonProps) {\n return (\n <div\n ref={ref}\n aria-hidden={visible || undefined}\n className={cn(styles.skeleton, visible && styles.visible, className)}\n {...rest}\n >\n {children}\n </div>\n );\n}\n\nSkeleton.displayName = 'Skeleton';\n",".slider {\n display: flex;\n align-items: center;\n gap: 12px;\n width: 100%;\n}\n\n.track {\n position: relative;\n flex: 1;\n height: 28px;\n display: flex;\n align-items: center;\n}\n\n.rail {\n position: absolute;\n left: 0;\n right: 0;\n height: 4px;\n border-radius: 2px;\n background: var(--tgui--secondary_fill);\n}\n\n.fill {\n position: absolute;\n left: 0;\n height: 4px;\n border-radius: 2px;\n background: var(--tgui--link_color);\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .fill {\n transition: width 0.1s linear;\n }\n}\n\n.input {\n position: relative;\n z-index: 1;\n width: 100%;\n height: 28px;\n margin: 0;\n padding: 0;\n background: transparent;\n appearance: none;\n cursor: pointer;\n}\n\n.input:focus-visible {\n outline: none;\n}\n\n.input::-webkit-slider-thumb {\n appearance: none;\n width: 22px;\n height: 22px;\n border-radius: 50%;\n background: var(--tgui--bg_color);\n box-shadow: 0 1px 4px rgb(0 0 0 / 0.25);\n cursor: grab;\n}\n\n.input:active::-webkit-slider-thumb {\n cursor: grabbing;\n}\n\n.input::-moz-range-thumb {\n width: 22px;\n height: 22px;\n border: 0;\n border-radius: 50%;\n background: var(--tgui--bg_color);\n box-shadow: 0 1px 4px rgb(0 0 0 / 0.25);\n}\n\n.input:focus-visible::-webkit-slider-thumb {\n box-shadow:\n 0 1px 4px rgb(0 0 0 / 0.25),\n 0 0 0 4px var(--tgui--secondary_fill);\n}\n\n.input:focus-visible::-moz-range-thumb {\n box-shadow:\n 0 1px 4px rgb(0 0 0 / 0.25),\n 0 0 0 4px var(--tgui--secondary_fill);\n}\n\n.input:disabled {\n cursor: default;\n}\n\n.slider[data-disabled] {\n opacity: 0.4;\n}\n\n.side {\n flex-shrink: 0;\n color: var(--tgui--hint_color);\n font-family: var(--tgui--font-family);\n font-size: 14px;\n}\n","'use client';\n\nimport {\n type ChangeEvent,\n type InputHTMLAttributes,\n type ReactNode,\n type Ref,\n useState,\n} from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './Slider.module.css';\n\nexport interface SliderProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, 'value' | 'defaultValue' | 'onChange'> {\n ref?: Ref<HTMLInputElement>;\n value?: number;\n defaultValue?: number;\n onChange?: (value: number) => void;\n min?: number;\n max?: number;\n step?: number;\n before?: ReactNode;\n after?: ReactNode;\n}\n\nexport function Slider({\n ref,\n value: valueProp,\n defaultValue,\n onChange,\n min = 0,\n max = 100,\n step = 1,\n before,\n after,\n disabled,\n className,\n ...rest\n}: SliderProps) {\n const [uncontrolled, setUncontrolled] = useState(defaultValue ?? min);\n const value = valueProp ?? uncontrolled;\n const percent = max > min ? ((value - min) / (max - min)) * 100 : 0;\n\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n const next = Number(event.target.value);\n if (valueProp == null) setUncontrolled(next);\n onChange?.(next);\n };\n\n return (\n <div className={cn(styles.slider, className)} data-disabled={disabled || undefined}>\n {before != null ? <span className={styles.side}>{before}</span> : null}\n <span className={styles.track}>\n <span className={styles.rail} />\n <span\n className={styles.fill}\n style={{ width: `${Math.max(0, Math.min(100, percent))}%` }}\n />\n <input\n ref={ref}\n type=\"range\"\n className={styles.input}\n min={min}\n max={max}\n step={step}\n value={value}\n disabled={disabled}\n onChange={handleChange}\n {...rest}\n />\n </span>\n {after != null ? <span className={styles.side}>{after}</span> : null}\n </div>\n );\n}\n\nSlider.displayName = 'Slider';\n","import type { ReactNode } from 'react';\nimport { createContext } from 'react';\n\nexport interface SnackbarOptions {\n message: ReactNode;\n description?: ReactNode;\n before?: ReactNode;\n action?: { label: string; onClick: () => void };\n duration?: number;\n}\n\nexport interface SnackbarApi {\n show: (options: SnackbarOptions) => string;\n dismiss: (id: string) => void;\n}\n\nexport const SnackbarContext = createContext<SnackbarApi | null>(null);\n\nSnackbarContext.displayName = 'SnackbarContext';\n",".viewport {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: var(--tgui--z-index--overlay, 1000);\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n padding: 12px;\n padding-bottom: calc(12px + env(safe-area-inset-bottom, 0px));\n overflow: clip;\n overflow-clip-margin: 28px;\n pointer-events: none;\n}\n\n.snackbar {\n display: flex;\n align-items: center;\n gap: 12px;\n width: 100%;\n max-width: 440px;\n box-sizing: border-box;\n padding: 12px 16px;\n border-radius: 12px;\n background: var(--tgui--bg_color);\n color: var(--tgui--text_color);\n box-shadow: 0 6px 24px rgb(0 0 0 / 0.22);\n pointer-events: auto;\n touch-action: pan-y;\n opacity: 0;\n transform: translateY(16px);\n}\n\n.snackbar--visible {\n opacity: 1;\n transform: translateY(0);\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .snackbar {\n transition:\n opacity 0.22s ease,\n transform 0.22s cubic-bezier(0.32, 0.72, 0, 1);\n }\n}\n\n.snackbar--dragging {\n transition: none;\n}\n\n.before {\n display: flex;\n flex-shrink: 0;\n color: var(--tgui--link_color);\n}\n\n.body {\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n min-width: 0;\n font-family: var(--tgui--font-family);\n}\n\n.message {\n font-size: 15px;\n line-height: 20px;\n}\n\n.description {\n font-size: 13px;\n line-height: 18px;\n color: var(--tgui--hint_color);\n}\n\n.action {\n flex-shrink: 0;\n padding: 4px 8px;\n margin-right: -8px;\n border: 0;\n border-radius: 8px;\n background: transparent;\n color: var(--tgui--link_color);\n font-family: var(--tgui--font-family);\n font-size: 15px;\n font-weight: var(--tgui--font_weight--accent2);\n cursor: pointer;\n}\n","'use client';\n\nimport {\n type ReactNode,\n type PointerEvent as ReactPointerEvent,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { useReducedMotion } from '../../shared/lib/useReducedMotion';\nimport { Portal } from '../Portal';\nimport { SnackbarContext, type SnackbarOptions } from './context';\nimport styles from './Snackbar.module.css';\n\nconst EXIT_MS = 240;\nconst SWIPE_DISMISS = 80;\n\ninterface SnackItem extends SnackbarOptions {\n id: string;\n}\n\nexport interface SnackbarProviderProps {\n children: ReactNode;\n duration?: number;\n max?: number;\n}\n\nexport function SnackbarProvider({ children, duration = 4000, max = 3 }: SnackbarProviderProps) {\n const [items, setItems] = useState<SnackItem[]>([]);\n const nextId = useRef(0);\n\n const dismiss = useCallback((id: string) => {\n setItems((current) => current.filter((item) => item.id !== id));\n }, []);\n\n const show = useCallback(\n (options: SnackbarOptions) => {\n const id = `snackbar-${nextId.current++}`;\n setItems((current) => [...current, { ...options, id }].slice(-max));\n return id;\n },\n [max],\n );\n\n const api = useMemo(() => ({ show, dismiss }), [show, dismiss]);\n\n return (\n <SnackbarContext.Provider value={api}>\n {children}\n {items.length > 0 ? (\n <Portal>\n <div className={styles.viewport}>\n {items.map((item) => (\n <SnackbarItem\n key={item.id}\n item={item}\n defaultDuration={duration}\n onDismiss={() => dismiss(item.id)}\n />\n ))}\n </div>\n </Portal>\n ) : null}\n </SnackbarContext.Provider>\n );\n}\n\nSnackbarProvider.displayName = 'SnackbarProvider';\n\ninterface SnackbarItemProps {\n item: SnackItem;\n defaultDuration: number;\n onDismiss: () => void;\n}\n\nfunction SnackbarItem({ item, defaultDuration, onDismiss }: SnackbarItemProps) {\n const reducedMotion = useReducedMotion();\n const [visible, setVisible] = useState(false);\n const [leaving, setLeaving] = useState(false);\n const nodeRef = useRef<HTMLDivElement | null>(null);\n\n const duration = item.duration ?? defaultDuration;\n const remaining = useRef(duration);\n const startedAt = useRef(0);\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const drag = useRef({ id: -1, startX: 0, active: false });\n\n useLayoutEffect(() => {\n const node = nodeRef.current;\n if (node) void node.offsetHeight;\n setVisible(true);\n }, []);\n\n const close = useCallback(() => {\n setLeaving(true);\n setVisible(false);\n if (reducedMotion) {\n onDismiss();\n return;\n }\n const id = setTimeout(onDismiss, EXIT_MS);\n return () => clearTimeout(id);\n }, [reducedMotion, onDismiss]);\n\n const pause = useCallback(() => {\n if (!timer.current) return;\n clearTimeout(timer.current);\n timer.current = null;\n remaining.current -= Date.now() - startedAt.current;\n }, []);\n\n const resume = useCallback(() => {\n if (duration <= 0 || leaving || timer.current) return;\n startedAt.current = Date.now();\n timer.current = setTimeout(() => close(), Math.max(0, remaining.current));\n }, [duration, leaving, close]);\n\n useEffect(() => {\n resume();\n return pause;\n }, [resume, pause]);\n\n const onPointerDown = (event: ReactPointerEvent<HTMLDivElement>) => {\n if (event.button !== 0) return;\n drag.current = { id: event.pointerId, startX: event.clientX, active: false };\n pause();\n };\n\n const onPointerMove = (event: ReactPointerEvent<HTMLDivElement>) => {\n const state = drag.current;\n if (state.id !== event.pointerId) return;\n const dx = event.clientX - state.startX;\n if (!state.active) {\n if (Math.abs(dx) < 6) return;\n state.active = true;\n event.currentTarget.setPointerCapture(event.pointerId);\n nodeRef.current?.classList.add(styles['snackbar--dragging']);\n }\n if (nodeRef.current) {\n nodeRef.current.style.transform = `translateX(${dx}px)`;\n nodeRef.current.style.opacity = `${Math.max(0, 1 - Math.abs(dx) / 240)}`;\n }\n };\n\n const endDrag = (event: ReactPointerEvent<HTMLDivElement>) => {\n const state = drag.current;\n if (state.id !== event.pointerId) return;\n drag.current = { id: -1, startX: 0, active: false };\n const node = nodeRef.current;\n if (!node) return;\n node.classList.remove(styles['snackbar--dragging']);\n const dx = event.clientX - state.startX;\n if (state.active && Math.abs(dx) > SWIPE_DISMISS) {\n if (reducedMotion) {\n onDismiss();\n return;\n }\n node.style.transition = 'transform 0.2s ease-out, opacity 0.2s ease-out';\n node.style.transform = `translateX(${Math.sign(dx) * (window.innerWidth || 400)}px)`;\n node.style.opacity = '0';\n setTimeout(onDismiss, 190);\n return;\n }\n node.style.transform = '';\n node.style.opacity = '';\n resume();\n };\n\n return (\n <div\n ref={nodeRef}\n className={cn(styles.snackbar, visible && !leaving && styles['snackbar--visible'])}\n role=\"status\"\n onMouseEnter={pause}\n onMouseLeave={resume}\n onFocus={pause}\n onBlur={resume}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={endDrag}\n onPointerCancel={endDrag}\n >\n {item.before != null ? <span className={styles.before}>{item.before}</span> : null}\n <div className={styles.body}>\n <span className={styles.message}>{item.message}</span>\n {item.description != null ? (\n <span className={styles.description}>{item.description}</span>\n ) : null}\n </div>\n {item.action != null ? (\n <button\n type=\"button\"\n className={styles.action}\n onClick={() => {\n item.action?.onClick();\n close();\n }}\n >\n {item.action.label}\n </button>\n ) : null}\n </div>\n );\n}\n","import { useContext } from 'react';\nimport { type SnackbarApi, SnackbarContext } from './context';\n\nexport function useSnackbar(): SnackbarApi {\n const api = useContext(SnackbarContext);\n if (!api) {\n throw new Error('useSnackbar must be used within a <SnackbarProvider>.');\n }\n return api;\n}\n","export interface Particle {\n x0: number;\n y0: number;\n vx: number;\n vy: number;\n life: number;\n respawn: number;\n phase: number;\n size: number;\n square: boolean;\n}\n\nconst TAU = Math.PI * 2;\nconst clamp01 = (value: number) => Math.max(0, Math.min(1, value));\nconst easeOutCubic = (t: number) => 1 - (1 - t) ** 3;\n\n// particle grows in over `up` seconds, holds, shrinks over `down` seconds\nfunction trapezoid(life: number, up: number, down: number, t: number) {\n const hold = Math.max(up, life - down);\n if (t < up) return Math.max(0, t / up);\n if (t > hold) return Math.max(0, 1 - (t - hold) / (life - hold));\n return 1;\n}\n\nexport function createParticles(w: number, h: number, density: number): Particle[] {\n const count = Math.round(Math.min(1800, Math.max(12, density * w * h)));\n const particles: Particle[] = [];\n for (let i = 0; i < count; i += 1) {\n const speed = 2 + Math.random() * 10;\n const angle = Math.random() * TAU;\n const life = 0.3 + Math.random() * 1.2;\n const respawn = Math.random();\n particles.push({\n x0: Math.random() * w,\n y0: Math.random() * h,\n vx: speed * Math.cos(angle),\n vy: speed * Math.sin(angle),\n life,\n respawn,\n phase: Math.random() * (life + respawn),\n size: 1 + Math.random() * 0.7,\n square: Math.random() > 0.5,\n });\n }\n return particles;\n}\n\n// paints one frame; `stop` is the loop time (s) at which the reveal began, or null\nexport function paintParticles(\n ctx: CanvasRenderingContext2D,\n pixelW: number,\n pixelH: number,\n dpr: number,\n particles: Particle[],\n color: readonly [number, number, number],\n time: number,\n stop: number | null,\n fade: number,\n) {\n ctx.clearRect(0, 0, pixelW, pixelH);\n const w = pixelW / dpr;\n const h = pixelH / dpr;\n const [r, g, b] = color;\n const n = particles.length;\n\n for (let i = 0; i < n; i += 1) {\n const p = particles[i];\n const period = p.life + p.respawn;\n\n if (stop != null) {\n const spawned = Math.floor((time + p.phase) / period);\n const lastAllowed = Math.floor((stop + p.phase) / period);\n if (spawned > lastAllowed) continue;\n }\n\n const local = (time + p.phase) % period;\n if (local >= p.life) continue;\n\n let x = (p.x0 + p.vx * local) % w;\n if (x < 0) x += w;\n let y = (p.y0 + p.vy * local) % h;\n if (y < 0) y += h;\n\n const visible = trapezoid(p.life, 0.15, 0.3, local);\n let alpha = visible * (0.45 + 0.55 * (1 - local / p.life));\n\n if (stop != null && fade > 0) {\n const fadeStart = stop + ((2 / 3) * fade * i) / n;\n const progress = clamp01((time - fadeStart) / ((1 / 3) * fade));\n alpha *= easeOutCubic(1 - progress);\n }\n\n if (alpha <= 0.01) continue;\n\n const size = Math.max(0.5, p.size * visible) * dpr;\n ctx.fillStyle = `rgba(${r}, ${g}, ${b}, ${alpha.toFixed(3)})`;\n ctx.beginPath();\n if (p.square) {\n ctx.rect(x * dpr, y * dpr, size, size);\n } else {\n ctx.arc(x * dpr, y * dpr, size / 2, 0, TAU);\n }\n ctx.fill();\n }\n}\n",".spoiler {\n --tgui--spoiler--p: 0;\n --tgui--spoiler--edge: 10px;\n --tgui--spoiler--edge-y: 3px;\n --tgui--spoiler--radius: 5px;\n position: relative;\n display: inline-block;\n max-width: 100%;\n border-radius: 4px;\n vertical-align: baseline;\n isolation: isolate;\n color: var(--tgui--text_color);\n}\n\n.spoiler:not(.revealed) {\n cursor: pointer;\n}\n\n.spoiler::before,\n.canvas {\n border-radius: var(--tgui--spoiler--radius);\n overflow: hidden;\n -webkit-mask-image:\n linear-gradient(\n to right,\n transparent,\n #000 var(--tgui--spoiler--edge),\n #000 calc(100% - var(--tgui--spoiler--edge)),\n transparent\n ),\n linear-gradient(\n to bottom,\n transparent,\n #000 var(--tgui--spoiler--edge-y),\n #000 calc(100% - var(--tgui--spoiler--edge-y)),\n transparent\n );\n -webkit-mask-composite: source-in;\n mask-image:\n linear-gradient(\n to right,\n transparent,\n #000 var(--tgui--spoiler--edge),\n #000 calc(100% - var(--tgui--spoiler--edge)),\n transparent\n ),\n linear-gradient(\n to bottom,\n transparent,\n #000 var(--tgui--spoiler--edge-y),\n #000 calc(100% - var(--tgui--spoiler--edge-y)),\n transparent\n );\n mask-composite: intersect;\n}\n\n.spoiler::before {\n content: \"\";\n position: absolute;\n inset: -1px -3px;\n z-index: 0;\n background: currentColor;\n opacity: calc((1 - var(--tgui--spoiler--p)) * 0.06);\n pointer-events: none;\n}\n\n.content {\n display: inline-block;\n position: relative;\n z-index: 2;\n opacity: var(--tgui--spoiler--p);\n}\n\n.spoiler:not(.revealed) .content {\n user-select: none;\n pointer-events: none;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .content,\n .spoiler::before {\n transition: opacity 0.4s ease;\n }\n}\n\n.canvas {\n position: absolute;\n inset: -1px -3px;\n z-index: 1;\n width: calc(100% + 6px);\n height: calc(100% + 2px);\n pointer-events: none;\n}\n\n.spoiler:focus-visible {\n outline: 2px solid var(--tgui--link_color);\n outline-offset: 2px;\n}\n","'use client';\n\nimport {\n type CSSProperties,\n type HTMLAttributes,\n type KeyboardEvent as ReactKeyboardEvent,\n type Ref,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { useReducedMotion } from '../../shared/lib/useReducedMotion';\nimport { createParticles, type Particle, paintParticles } from './particles';\nimport styles from './Spoiler.module.css';\n\nconst FADE_S = 0.5;\n\nexport interface SpoilerProps extends HTMLAttributes<HTMLSpanElement> {\n ref?: Ref<HTMLSpanElement>;\n revealed?: boolean;\n defaultRevealed?: boolean;\n onRevealedChange?: (revealed: boolean) => void;\n revealOn?: 'click' | 'hover';\n accentColor?: string;\n density?: number;\n fps?: number;\n revealLabel?: string;\n}\n\nfunction parseColor(value: string): [number, number, number] {\n const parts = value.match(/-?\\d*\\.?\\d+/g);\n if (!parts || parts.length < 3) return [128, 128, 128];\n return [Number(parts[0]), Number(parts[1]), Number(parts[2])];\n}\n\nexport function Spoiler({\n ref,\n revealed: revealedProp,\n defaultRevealed = false,\n onRevealedChange,\n revealOn = 'click',\n accentColor,\n density = 0.1,\n fps = 40,\n revealLabel = 'Reveal hidden text',\n className,\n style,\n children,\n onClick,\n onKeyDown,\n onMouseEnter,\n onMouseLeave,\n ...rest\n}: SpoilerProps) {\n const [uncontrolled, setUncontrolled] = useState(defaultRevealed);\n const revealed = revealedProp ?? uncontrolled;\n const reducedMotion = useReducedMotion();\n const isButton = revealOn === 'click';\n\n const rootRef = useRef<HTMLSpanElement | null>(null);\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n const particles = useRef<Particle[]>([]);\n const colorRef = useRef<[number, number, number]>([128, 128, 128]);\n const inView = useRef(true);\n const stopAt = useRef<number | null>(revealed ? 0 : null);\n const loopTime = useRef(0);\n\n const [painting, setPainting] = useState(!revealed);\n\n const setRevealed = (next: boolean) => {\n if (next) {\n stopAt.current = loopTime.current;\n } else {\n stopAt.current = null;\n setPainting(true);\n }\n if (revealedProp == null) setUncontrolled(next);\n onRevealedChange?.(next);\n };\n\n useEffect(() => {\n if (!painting) return;\n const root = rootRef.current;\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext('2d');\n if (!root || !canvas || !ctx) return;\n\n const dpr = Math.min(2, window.devicePixelRatio || 1);\n\n const sync = () => {\n const box = canvas.getBoundingClientRect();\n const w = Math.max(1, Math.round(box.width * dpr));\n const h = Math.max(1, Math.round(box.height * dpr));\n if (canvas.width !== w || canvas.height !== h) {\n canvas.width = w;\n canvas.height = h;\n particles.current = createParticles(w / dpr, h / dpr, density);\n }\n colorRef.current = parseColor(accentColor ?? getComputedStyle(root).color);\n };\n sync();\n\n if (reducedMotion) {\n paintParticles(\n ctx,\n canvas.width,\n canvas.height,\n dpr,\n particles.current,\n colorRef.current,\n 0.6,\n null,\n 0,\n );\n return;\n }\n\n let raf = 0;\n let start = 0;\n let last = -1;\n const frameGap = 1000 / Math.max(8, fps);\n\n const loop = (now: number) => {\n if (!start) start = now;\n const time = (now - start) / 1000;\n loopTime.current = time;\n const stop = stopAt.current;\n\n if (stop != null && time > stop + FADE_S + 0.06) {\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n setPainting(false);\n return;\n }\n\n raf = requestAnimationFrame(loop);\n if (!inView.current || now - last < frameGap) return;\n last = now;\n\n paintParticles(\n ctx,\n canvas.width,\n canvas.height,\n dpr,\n particles.current,\n colorRef.current,\n time,\n stop,\n FADE_S,\n );\n };\n\n raf = requestAnimationFrame(loop);\n\n const ro = typeof ResizeObserver !== 'undefined' ? new ResizeObserver(sync) : null;\n ro?.observe(root);\n const io =\n typeof IntersectionObserver !== 'undefined'\n ? new IntersectionObserver(([entry]) => {\n inView.current = entry.isIntersecting;\n })\n : null;\n io?.observe(root);\n\n return () => {\n cancelAnimationFrame(raf);\n ro?.disconnect();\n io?.disconnect();\n };\n }, [painting, reducedMotion, density, fps, accentColor]);\n\n const toggle = () => setRevealed(!revealed);\n\n return (\n // biome-ignore lint/a11y/useSemanticElements: a spoiler sits inline inside a sentence; a <button> would break the text flow and reset typography\n <span\n ref={(node) => {\n rootRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as { current: HTMLSpanElement | null }).current = node;\n }}\n className={cn(styles.spoiler, revealed && styles.revealed, className)}\n role=\"button\"\n tabIndex={0}\n aria-pressed={revealed}\n aria-label={revealed ? undefined : revealLabel}\n style={{ ...style, '--tgui--spoiler--p': revealed ? 1 : 0 } as CSSProperties}\n onClick={(event) => {\n onClick?.(event);\n if (isButton) toggle();\n }}\n onKeyDown={(event: ReactKeyboardEvent<HTMLSpanElement>) => {\n onKeyDown?.(event);\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n toggle();\n }\n }}\n onMouseEnter={(event) => {\n onMouseEnter?.(event);\n if (!isButton && !revealed) setRevealed(true);\n }}\n onMouseLeave={(event) => {\n onMouseLeave?.(event);\n if (!isButton && revealed) setRevealed(false);\n }}\n {...rest}\n >\n <span className={styles.content} aria-hidden={!revealed}>\n {children}\n </span>\n {painting ? <canvas ref={canvasRef} className={styles.canvas} aria-hidden /> : null}\n </span>\n );\n}\n\nSpoiler.displayName = 'Spoiler';\n",".switch {\n position: relative;\n overflow: hidden;\n display: inline-flex;\n align-items: center;\n width: 52px;\n height: 32px;\n border-radius: 16px;\n cursor: pointer;\n flex-shrink: 0;\n}\n\n.switch[data-disabled] {\n cursor: default;\n opacity: 0.4;\n}\n\n.input {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n margin: 0;\n opacity: 0;\n cursor: inherit;\n}\n\n.control::before {\n position: absolute;\n content: \"\";\n inset: 0;\n background: var(--tgui--secondary_bg_color);\n}\n\n.base .control::before {\n border-radius: 16px;\n border: 3px solid var(--tgui--secondary_hint_color);\n}\n\n.control::after {\n position: absolute;\n content: \"\";\n top: 50%;\n transform: translateY(-50%);\n border-radius: 50%;\n}\n\n.base .control::after {\n width: 16px;\n height: 16px;\n margin-left: 8px;\n background: var(--tgui--secondary_hint_color);\n}\n\n.ios .control::before {\n background: rgba(120, 120, 128, 0.22);\n}\n\n.ios .control::after {\n width: 28px;\n height: 28px;\n margin-left: 2px;\n background: var(--tgui--white);\n box-shadow:\n 0 3px 8px 0 rgba(0, 0, 0, 0.12),\n 0 1px 1px 0 rgba(0, 0, 0, 0.16);\n}\n\n.input:checked + .control::before {\n border-color: var(--tgui--link_color);\n background-color: var(--tgui--link_color);\n}\n\n.input:checked + .control::after {\n transform: translateX(20px) translateY(-50%);\n}\n\n.base .input:checked + .control::after {\n width: 24px;\n height: 24px;\n background: var(--tgui--white);\n transform: translateX(16px) translateY(-50%);\n}\n\n.input:focus-visible + .control::before {\n box-shadow: 0 0 0 2px var(--tgui--link_color);\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .control::before {\n transition:\n background-color 0.2s ease,\n border-color 0.2s ease;\n }\n .control::after {\n transition: transform 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);\n }\n .ios .control::after {\n transition: transform 0.2s cubic-bezier(0.36, -0.24, 0.26, 1.32);\n }\n}\n","'use client';\n\nimport type { InputHTMLAttributes, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { useTgui } from '../TguiProvider';\nimport styles from './Switch.module.css';\n\nexport interface SwitchProps extends InputHTMLAttributes<HTMLInputElement> {\n ref?: Ref<HTMLInputElement>;\n}\n\nexport function Switch({ ref, disabled, className, style, ...rest }: SwitchProps) {\n const { platform } = useTgui();\n\n return (\n <label\n className={cn(styles.switch, platform === 'ios' ? styles.ios : styles.base, className)}\n style={style}\n data-disabled={disabled || undefined}\n >\n <input ref={ref} type=\"checkbox\" className={styles.input} disabled={disabled} {...rest} />\n <span aria-hidden className={styles.control} />\n </label>\n );\n}\n\nSwitch.displayName = 'Switch';\n",".bar {\n display: flex;\n align-items: stretch;\n padding: 0 16px;\n padding-bottom: env(safe-area-inset-bottom, 0px);\n background: var(--tgui--surface_primary);\n box-shadow: 0 -0.5px 0 var(--tgui--divider);\n}\n\n.barIos {\n padding: 0;\n padding-bottom: calc(6px + env(safe-area-inset-bottom, 0px));\n}\n\n.item {\n flex: 1 0 0;\n min-inline-size: 0;\n max-inline-size: 100%;\n margin: 0;\n padding: 10px 16px 14px;\n border: none;\n background: transparent;\n\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 4px;\n\n color: var(--tgui--secondary_hint_color);\n}\n\n.itemIos {\n padding: 7px 12px 2px;\n gap: 3px;\n}\n\n.itemSelected {\n color: var(--tgui--link_color);\n}\n\n.icon {\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 64px;\n height: 32px;\n padding: 2px 10px;\n border-radius: 16px;\n}\n\n.itemIos .icon {\n min-width: 0;\n height: 28px;\n padding: 0;\n}\n\n.itemSelected:not(.itemIos) .icon {\n background: var(--tgui--secondary_fill);\n}\n\n.text {\n max-inline-size: 100%;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .item {\n transition: color 0.15s ease-out;\n }\n\n .icon {\n transition: background 0.15s ease-out;\n }\n}\n","'use client';\n\nimport type { ButtonHTMLAttributes, ReactNode, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { Caption } from '../Caption';\nimport { Tappable } from '../Tappable';\nimport { useTgui } from '../TguiProvider';\nimport styles from './TabBar.module.css';\n\nexport interface TabBarItemProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n ref?: Ref<HTMLElement>;\n selected?: boolean;\n text?: string;\n children?: ReactNode;\n}\n\nexport function TabBarItem({ ref, selected, text, children, className, ...rest }: TabBarItemProps) {\n const { platform } = useTgui();\n const ios = platform === 'ios';\n\n return (\n <Tappable\n ref={ref}\n Component=\"button\"\n interactiveAnimation=\"opacity\"\n aria-current={selected ? 'page' : undefined}\n className={cn(styles.item, ios && styles.itemIos, selected && styles.itemSelected, className)}\n {...rest}\n >\n {children != null ? <span className={styles.icon}>{children}</span> : null}\n {text != null ? (\n <Caption className={styles.text} weight=\"2\" level={ios ? '2' : '1'}>\n {text}\n </Caption>\n ) : null}\n </Tappable>\n );\n}\n\nTabBarItem.displayName = 'TabBarItem';\n","'use client';\n\nimport type { HTMLAttributes, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { useTgui } from '../TguiProvider';\nimport styles from './TabBar.module.css';\nimport { TabBarItem } from './TabBarItem';\n\nexport interface TabBarProps extends HTMLAttributes<HTMLElement> {\n ref?: Ref<HTMLElement>;\n}\n\nexport function TabBar({ ref, className, children, ...rest }: TabBarProps) {\n const { platform } = useTgui();\n\n return (\n <nav\n ref={ref}\n className={cn(styles.bar, platform === 'ios' && styles.barIos, className)}\n {...rest}\n >\n {children}\n </nav>\n );\n}\n\nTabBar.displayName = 'TabBar';\nTabBar.Item = TabBarItem;\n",".field {\n display: block;\n width: 100%;\n margin: 0;\n padding: 0;\n border: 0;\n outline: 0;\n resize: none;\n background: transparent;\n color: var(--tgui--text_color);\n font-family: inherit;\n line-height: 1.4;\n overflow-y: auto;\n}\n\n.field::placeholder {\n color: var(--tgui--secondary_hint_color);\n}\n","'use client';\n\nimport {\n type ChangeEvent,\n type FocusEvent,\n type MutableRefObject,\n type ReactNode,\n type Ref,\n type TextareaHTMLAttributes,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { FormField } from '../FormField';\nimport { Subheadline } from '../Subheadline';\nimport { Text } from '../Text';\nimport { useTgui } from '../TguiProvider';\nimport styles from './Textarea.module.css';\n\nexport type TextareaStatus = 'default' | 'error' | 'focused';\n\nexport interface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {\n ref?: Ref<HTMLTextAreaElement>;\n header?: ReactNode;\n status?: TextareaStatus;\n autoGrow?: boolean;\n maxRows?: number;\n}\n\nexport function Textarea({\n ref,\n header,\n status,\n autoGrow = false,\n maxRows,\n rows = 3,\n disabled,\n className,\n value,\n defaultValue,\n onFocus,\n onBlur,\n onChange,\n ...rest\n}: TextareaProps) {\n const { platform } = useTgui();\n const ios = platform === 'ios';\n const [focused, setFocused] = useState(false);\n const state = status ?? (focused ? 'focused' : 'default');\n const Typography = ios ? Text : Subheadline;\n\n const innerRef = useRef<HTMLTextAreaElement>(null);\n const setRefs = useCallback(\n (node: HTMLTextAreaElement | null) => {\n innerRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as MutableRefObject<HTMLTextAreaElement | null>).current = node;\n },\n [ref],\n );\n\n const resize = useCallback(() => {\n const el = innerRef.current;\n if (!el || !autoGrow) return;\n el.style.height = 'auto';\n const cs = getComputedStyle(el);\n const lineHeight = Number.parseFloat(cs.lineHeight) || 20;\n const max = maxRows ? lineHeight * maxRows : Number.POSITIVE_INFINITY;\n el.style.height = `${Math.min(el.scrollHeight, max)}px`;\n el.style.overflowY = el.scrollHeight > max ? 'auto' : 'hidden';\n }, [autoGrow, maxRows]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: value drives the re-measure\n useEffect(resize, [resize, value, defaultValue]);\n\n const handleFocus = (event: FocusEvent<HTMLTextAreaElement>) => {\n if (!disabled) setFocused(true);\n onFocus?.(event);\n };\n const handleBlur = (event: FocusEvent<HTMLTextAreaElement>) => {\n setFocused(false);\n onBlur?.(event);\n };\n const handleChange = (event: ChangeEvent<HTMLTextAreaElement>) => {\n resize();\n onChange?.(event);\n };\n\n return (\n <FormField\n ios={ios}\n status={state}\n disabled={disabled}\n alignStart\n header={header}\n className={className}\n >\n <Typography\n ref={setRefs as Ref<HTMLElement>}\n Component=\"textarea\"\n className={styles.field}\n rows={rows}\n disabled={disabled}\n value={value}\n defaultValue={defaultValue}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onChange={handleChange}\n {...rest}\n />\n </FormField>\n );\n}\n\nTextarea.displayName = 'Textarea';\n",".trigger {\n display: inline-flex;\n}\n\n.tooltip {\n position: fixed;\n top: 0;\n left: 0;\n z-index: var(--tgui--z-index--overlay, 1000);\n max-width: 260px;\n padding: 6px 10px;\n border-radius: 8px;\n background: var(--tgui--tooltip_background_dark, rgba(0, 0, 0, 0.86));\n color: var(--tgui--white, #ffffff);\n font-family: var(--tgui--font-family);\n font-size: 13px;\n line-height: 17px;\n box-shadow: 0 4px 16px rgb(0 0 0 / 0.24);\n pointer-events: none;\n opacity: 0;\n transform: scale(0.92);\n transform-origin: var(--tgui--tooltip--origin-x, 50%) var(--tgui--tooltip--origin-y, 50%);\n}\n\n.tooltip--visible {\n opacity: 1;\n transform: scale(1);\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .tooltip {\n transition:\n opacity 0.13s ease,\n transform 0.13s cubic-bezier(0.32, 0.72, 0, 1);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .tooltip {\n transform: none;\n }\n}\n\n.arrow {\n position: absolute;\n width: 8px;\n height: 8px;\n background: inherit;\n transform: rotate(45deg);\n}\n","'use client';\n\nimport {\n type CSSProperties,\n type ReactNode,\n type Ref,\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { Portal } from '../Portal';\nimport styles from './Tooltip.module.css';\n\nexport type TooltipPlacement = 'top' | 'bottom' | 'left' | 'right';\n\nexport interface TooltipProps {\n ref?: Ref<HTMLSpanElement>;\n children: ReactNode;\n content: ReactNode;\n placement?: TooltipPlacement;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n className?: string;\n}\n\nconst GAP = 8;\nconst MARGIN = 8;\nconst clamp = (value: number, min: number, max: number) => Math.max(min, Math.min(max, value));\n\ninterface Position {\n top: number;\n left: number;\n placement: TooltipPlacement;\n originX: number;\n originY: number;\n arrow: CSSProperties;\n}\n\nfunction compute(trigger: DOMRect, tip: DOMRect, want: TooltipPlacement): Position {\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n let placement = want;\n if (placement === 'top' && trigger.top - tip.height - GAP < MARGIN) placement = 'bottom';\n else if (placement === 'bottom' && trigger.bottom + tip.height + GAP > vh - MARGIN)\n placement = 'top';\n else if (placement === 'left' && trigger.left - tip.width - GAP < MARGIN) placement = 'right';\n else if (placement === 'right' && trigger.right + tip.width + GAP > vw - MARGIN)\n placement = 'left';\n\n let top = 0;\n let left = 0;\n if (placement === 'top' || placement === 'bottom') {\n left = trigger.left + trigger.width / 2 - tip.width / 2;\n top = placement === 'top' ? trigger.top - tip.height - GAP : trigger.bottom + GAP;\n } else {\n top = trigger.top + trigger.height / 2 - tip.height / 2;\n left = placement === 'left' ? trigger.left - tip.width - GAP : trigger.right + GAP;\n }\n left = clamp(left, MARGIN, vw - tip.width - MARGIN);\n top = clamp(top, MARGIN, vh - tip.height - MARGIN);\n\n const centerX = trigger.left + trigger.width / 2 - left;\n const centerY = trigger.top + trigger.height / 2 - top;\n const arrow: CSSProperties = {};\n if (placement === 'top') {\n arrow.left = clamp(centerX, 10, tip.width - 10) - 4;\n arrow.bottom = -4;\n } else if (placement === 'bottom') {\n arrow.left = clamp(centerX, 10, tip.width - 10) - 4;\n arrow.top = -4;\n } else if (placement === 'left') {\n arrow.top = clamp(centerY, 10, tip.height - 10) - 4;\n arrow.right = -4;\n } else {\n arrow.top = clamp(centerY, 10, tip.height - 10) - 4;\n arrow.left = -4;\n }\n\n return {\n top,\n left,\n placement,\n originX: clamp(centerX, 0, tip.width),\n originY: clamp(centerY, 0, tip.height),\n arrow,\n };\n}\n\nexport function Tooltip({\n ref,\n children,\n content,\n placement = 'top',\n open: openProp,\n onOpenChange,\n className,\n}: TooltipProps) {\n const [uncontrolled, setUncontrolled] = useState(false);\n const open = openProp ?? uncontrolled;\n\n const triggerRef = useRef<HTMLSpanElement | null>(null);\n const tipRef = useRef<HTMLDivElement | null>(null);\n const pressTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const [pos, setPos] = useState<Position | null>(null);\n const [visible, setVisible] = useState(false);\n const id = useId();\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (openProp == null) setUncontrolled(next);\n onOpenChange?.(next);\n },\n [openProp, onOpenChange],\n );\n\n const reposition = useCallback(() => {\n const trigger = triggerRef.current;\n const tip = tipRef.current;\n if (!trigger || !tip) return;\n setPos(compute(trigger.getBoundingClientRect(), tip.getBoundingClientRect(), placement));\n }, [placement]);\n\n useLayoutEffect(() => {\n if (!open) {\n setVisible(false);\n setPos(null);\n return;\n }\n reposition();\n }, [open, reposition]);\n\n useEffect(() => {\n if (!open || !pos) return;\n const raf = requestAnimationFrame(() => setVisible(true));\n const onScroll = () => setOpen(false);\n window.addEventListener('scroll', onScroll, true);\n window.addEventListener('resize', reposition);\n return () => {\n cancelAnimationFrame(raf);\n window.removeEventListener('scroll', onScroll, true);\n window.removeEventListener('resize', reposition);\n };\n }, [open, pos, reposition, setOpen]);\n\n useEffect(() => {\n if (!open) return;\n const onKey = (event: KeyboardEvent) => {\n if (event.key === 'Escape') setOpen(false);\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [open, setOpen]);\n\n const clearPress = useCallback(() => {\n if (pressTimer.current) {\n clearTimeout(pressTimer.current);\n pressTimer.current = null;\n }\n }, []);\n\n useEffect(() => clearPress, [clearPress]);\n\n return (\n <>\n {/* biome-ignore lint/a11y/noStaticElementInteractions: this span only relays hover/focus to the described tooltip; the child is the real control */}\n <span\n ref={(node) => {\n triggerRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as { current: HTMLSpanElement | null }).current = node;\n }}\n className={cn(styles.trigger, className)}\n aria-describedby={open ? id : undefined}\n onPointerEnter={(event) => {\n if (event.pointerType !== 'touch') setOpen(true);\n }}\n onPointerLeave={(event) => {\n if (event.pointerType !== 'touch') setOpen(false);\n clearPress();\n }}\n onPointerDown={(event) => {\n if (event.pointerType === 'touch') {\n pressTimer.current = setTimeout(() => setOpen(true), 450);\n }\n }}\n onPointerUp={clearPress}\n onPointerCancel={clearPress}\n onFocus={() => setOpen(true)}\n onBlur={() => setOpen(false)}\n >\n {children}\n </span>\n {open ? (\n <Portal>\n <div\n ref={tipRef}\n id={id}\n role=\"tooltip\"\n className={cn(styles.tooltip, visible && styles['tooltip--visible'])}\n style={\n pos\n ? ({\n top: pos.top,\n left: pos.left,\n '--tgui--tooltip--origin-x': `${pos.originX}px`,\n '--tgui--tooltip--origin-y': `${pos.originY}px`,\n } as CSSProperties)\n : undefined\n }\n data-placement={pos?.placement}\n >\n {content}\n {pos ? <span className={styles.arrow} style={pos.arrow} aria-hidden /> : null}\n </div>\n </Portal>\n ) : null}\n </>\n );\n}\n\nTooltip.displayName = 'Tooltip';\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["__defProp","__name","__defProp","__name","setRef","__defProp","__name","getElementRef","__defProp","__name","__defProp","__name"],"sources":["../src/shared/lib/cn.ts","../src/components/TguiProvider/context.ts","../src/shared/lib/telegram.ts","../src/shared/lib/appearance.ts","../src/shared/lib/platform.ts","../src/components/TguiProvider/TguiProvider.module.css","../src/components/TguiProvider/TguiProvider.tsx","../src/shared/lib/haptics.ts","../src/components/TguiProvider/useHaptic.ts","../src/components/TguiProvider/useTgui.ts","../src/components/Accordion/Accordion.module.css","../src/components/Accordion/context.ts","../src/components/Accordion/Accordion.tsx","../src/components/Accordion/AccordionItem.tsx","../src/components/Avatar/Avatar.module.css","../src/components/Avatar/Avatar.variants.ts","../src/components/Avatar/Avatar.tsx","../src/components/AvatarStack/AvatarStack.module.css","../src/components/AvatarStack/AvatarStack.tsx","../src/components/Badge/Badge.module.css","../src/components/Badge/Badge.variants.ts","../src/components/Badge/Badge.tsx","../src/components/Banner/Banner.module.css","../src/components/Banner/Banner.variants.ts","../src/components/Banner/Banner.tsx","../src/components/Blockquote/Blockquote.module.css","../src/components/Blockquote/Blockquote.tsx","../src/components/Breadcrumbs/Breadcrumbs.module.css","../src/components/Breadcrumbs/Breadcrumbs.tsx","../src/components/Spinner/Spinner.module.css","../src/components/Spinner/Spinner.variants.ts","../src/components/Spinner/Spinner.tsx","../src/components/Typography/Typography.module.css","../src/components/Typography/Typography.variants.ts","../src/components/Typography/Typography.tsx","../src/components/Subheadline/Subheadline.module.css","../src/components/Subheadline/Subheadline.variants.ts","../src/components/Subheadline/Subheadline.tsx","../src/components/Tappable/Ripple.module.css","../src/components/Tappable/Ripple.tsx","../src/components/Tappable/Tappable.module.css","../src/components/Tappable/useRipple.ts","../src/components/Tappable/Tappable.tsx","../src/components/Text/Text.module.css","../src/components/Text/Text.tsx","../src/components/Button/Button.module.css","../src/components/Button/Button.variants.ts","../src/components/Button/Button.tsx","../src/components/Callout/Callout.module.css","../src/components/Callout/Callout.tsx","../src/components/Caption/Caption.module.css","../src/components/Caption/Caption.variants.ts","../src/components/Caption/Caption.tsx","../src/components/Card/Card.context.ts","../src/components/Card/Card.module.css","../src/components/Cell/Cell.module.css","../src/components/Cell/Cell.variants.ts","../src/components/Cell/Cell.tsx","../src/components/Card/CardCell.tsx","../src/components/Card/Card.tsx","../src/components/Checkbox/Checkbox.module.css","../src/components/Checkbox/Checkbox.tsx","../src/components/Chip/Chip.module.css","../src/components/Chip/Chip.variants.ts","../src/components/Chip/Chip.tsx","../src/components/CircularProgress/CircularProgress.module.css","../src/components/CircularProgress/CircularProgress.variants.ts","../src/components/CircularProgress/CircularProgress.tsx","../node_modules/@radix-ui/primitive/dist/index.mjs","../node_modules/@radix-ui/react-compose-refs/dist/index.mjs","../node_modules/@radix-ui/react-slot/dist/index.mjs","../node_modules/@radix-ui/react-primitive/dist/index.mjs","../node_modules/@radix-ui/react-use-callback-ref/dist/index.mjs","../node_modules/@radix-ui/react-dismissable-layer/dist/index.mjs","../node_modules/@radix-ui/react-focus-scope/dist/index.mjs","../node_modules/@radix-ui/react-use-layout-effect/dist/index.mjs","../node_modules/@radix-ui/react-presence/dist/index.mjs","../src/components/Portal/Portal.tsx","../src/components/Dialog/Dialog.module.css","../src/components/Dialog/Dialog.tsx","../src/components/Divider/Divider.module.css","../src/components/Divider/Divider.tsx","../src/components/DropdownMenu/context.ts","../src/components/DropdownMenu/CheckIcon.tsx","../src/components/DropdownMenu/DropdownMenu.module.css","../src/components/DropdownMenu/DropdownMenuCheckboxItem.tsx","../src/shared/lib/floatingPosition.ts","../src/components/DropdownMenu/DropdownMenuContent.tsx","../src/components/DropdownMenu/DropdownMenuItem.tsx","../src/components/DropdownMenu/DropdownMenuLabel.tsx","../src/components/DropdownMenu/DropdownMenuRadioGroup.tsx","../src/components/DropdownMenu/DropdownMenuRadioItem.tsx","../src/components/DropdownMenu/DropdownMenuSeparator.tsx","../src/components/DropdownMenu/DropdownMenuTrigger.tsx","../src/components/DropdownMenu/DropdownMenu.tsx","../src/components/FixedLayout/FixedLayout.module.css","../src/components/FixedLayout/FixedLayout.tsx","../src/components/Footnote/Footnote.module.css","../src/components/Footnote/Footnote.tsx","../src/components/Headline/Headline.module.css","../src/components/Headline/Headline.tsx","../src/components/HorizontalScroll/HorizontalScroll.module.css","../src/components/HorizontalScroll/HorizontalScroll.tsx","../src/components/IconButton/IconButton.module.css","../src/components/IconButton/IconButton.variants.ts","../src/components/IconButton/IconButton.tsx","../src/components/Image/Image.module.css","../src/components/Image/Image.tsx","../src/components/InlineButtons/context.ts","../src/components/InlineButtons/InlineButtons.module.css","../src/components/InlineButtons/InlineButtons.variants.ts","../src/components/InlineButtons/InlineButtonsItem.tsx","../src/components/InlineButtons/InlineButtons.tsx","../src/components/FormField/FormField.module.css","../src/components/FormField/FormField.tsx","../src/components/Input/Input.module.css","../src/components/Input/Input.tsx","../src/components/LargeTitle/LargeTitle.module.css","../src/components/LargeTitle/LargeTitle.tsx","../src/components/Link/Link.module.css","../src/components/Link/Link.tsx","../src/components/List/List.module.css","../src/components/List/List.tsx","../src/components/Pagination/Pagination.module.css","../src/components/Pagination/paginationRange.ts","../src/components/Pagination/CompactPagination.tsx","../src/components/Pagination/Pagination.tsx","../src/components/PinInput/PinInput.module.css","../src/components/PinInput/PinInput.tsx","../src/components/Title/Title.module.css","../src/components/Title/Title.variants.ts","../src/components/Title/Title.tsx","../src/components/Placeholder/Placeholder.module.css","../src/components/Placeholder/Placeholder.tsx","../src/components/Popover/context.ts","../src/components/Popover/Popover.module.css","../src/components/Popover/PopoverContent.tsx","../src/components/Popover/PopoverTrigger.tsx","../src/components/Popover/Popover.tsx","../src/components/Progress/Progress.module.css","../src/components/Progress/Progress.tsx","../src/components/Radio/Radio.module.css","../src/components/Radio/Radio.tsx","../src/components/Rating/Rating.module.css","../src/components/Rating/Rating.tsx","../src/components/SearchBar/SearchBar.module.css","../src/components/SearchBar/SearchBar.tsx","../src/components/Section/Section.module.css","../src/components/Section/SectionFooter.tsx","../src/components/Section/SectionHeader.tsx","../src/components/Section/Section.tsx","../src/components/SegmentedControl/context.ts","../src/components/SegmentedControl/SegmentedControl.module.css","../src/components/SegmentedControl/SegmentedControl.tsx","../src/components/SegmentedControl/SegmentedControlItem.tsx","../src/components/Select/Select.module.css","../src/components/Select/Select.tsx","../src/shared/lib/useReducedMotion.ts","../src/components/Sheet/Sheet.module.css","../src/components/Sheet/Sheet.tsx","../src/components/Skeleton/Skeleton.module.css","../src/components/Skeleton/Skeleton.tsx","../src/components/Slider/Slider.module.css","../src/components/Slider/Slider.tsx","../src/components/Snackbar/context.ts","../src/components/Snackbar/Snackbar.module.css","../src/components/Snackbar/SnackbarProvider.tsx","../src/components/Snackbar/useSnackbar.ts","../src/components/Spoiler/particles.ts","../src/components/Spoiler/Spoiler.module.css","../src/components/Spoiler/Spoiler.tsx","../src/components/Stepper/Stepper.module.css","../src/components/Stepper/Stepper.tsx","../src/components/Steps/Steps.module.css","../src/components/Steps/Steps.tsx","../src/components/Switch/Switch.module.css","../src/components/Switch/Switch.tsx","../src/components/TabBar/TabBar.module.css","../src/components/TabBar/TabBarItem.tsx","../src/components/TabBar/TabBar.tsx","../src/components/Textarea/Textarea.module.css","../src/components/Textarea/Textarea.tsx","../src/components/Timeline/Timeline.module.css","../src/components/Timeline/Timeline.tsx","../src/components/Timeline/TimelineItem.tsx","../src/components/Tooltip/Tooltip.module.css","../src/components/Tooltip/Tooltip.tsx"],"sourcesContent":["import { type ClassValue, clsx } from 'clsx';\n\nexport function cn(...inputs: ClassValue[]) {\n return clsx(inputs);\n}\n","import { createContext } from 'react';\nimport type { TguiContextValue } from '../../shared/types/tgui';\n\nexport const TguiContext = createContext<TguiContextValue | null>(null);\n\nTguiContext.displayName = 'TguiContext';\n","import type { WebApp } from '../types/telegram';\n\nexport function getTelegramWebApp(): WebApp | undefined {\n if (typeof window === 'undefined') return undefined;\n return window.Telegram?.WebApp;\n}\n\n// true only inside a Telegram client whose Bot API is at least `version`\nexport function isTelegramVersionAtLeast(version: string): boolean {\n const webApp = getTelegramWebApp();\n if (webApp == null) return false;\n try {\n return webApp.isVersionAtLeast(version);\n } catch {\n return false;\n }\n}\n","import type { Appearance } from '../types/tgui';\nimport { getTelegramWebApp } from './telegram';\n\nconst DARK_QUERY = '(prefers-color-scheme: dark)';\n\nfunction canMatchMedia() {\n return typeof window !== 'undefined' && typeof window.matchMedia === 'function';\n}\n\nexport function getAppearance(): Appearance {\n const webApp = getTelegramWebApp();\n if (webApp) {\n return webApp.colorScheme === 'dark' ? 'dark' : 'light';\n }\n\n if (canMatchMedia()) {\n return window.matchMedia(DARK_QUERY).matches ? 'dark' : 'light';\n }\n\n return 'light';\n}\n\nexport function subscribeAppearance(onChange: () => void): () => void {\n const webApp = getTelegramWebApp();\n if (webApp != null && typeof webApp.onEvent === 'function') {\n webApp.onEvent('themeChanged', onChange);\n return () => webApp.offEvent?.('themeChanged', onChange);\n }\n\n if (!canMatchMedia()) {\n return () => {};\n }\n\n const media = window.matchMedia(DARK_QUERY);\n media.addEventListener('change', onChange);\n return () => media.removeEventListener('change', onChange);\n}\n","import type { TguiPlatform } from '../types/tgui';\nimport { getTelegramWebApp } from './telegram';\n\nconst TELEGRAM_IOS_LIKE = new Set(['ios', 'macos']);\n\nexport function getPlatform(): TguiPlatform {\n const webApp = getTelegramWebApp();\n if (webApp) {\n return TELEGRAM_IOS_LIKE.has(webApp.platform) ? 'ios' : 'base';\n }\n\n if (typeof navigator === 'undefined') {\n return 'base';\n }\n\n const ua = navigator.userAgent;\n const isIpadOs = ua.includes('Macintosh') && navigator.maxTouchPoints > 1;\n\n return /iphone|ipad|ipod/i.test(ua) || isIpadOs ? 'ios' : 'base';\n}\n","/* design tokens: palette (raw) → semantic (the component API, light/dark) → component */\n\n.wrapper {\n /* ─── palette ─────────────────────────────────────────────── */\n --tgui--white: #ffffff;\n --tgui--black: #000000;\n --tgui--palette-blue: #007aff;\n --tgui--palette-red: #ff3b30;\n --tgui--palette-green: #34c759;\n --tgui--palette-orange: #ff9500;\n --tgui--palette-yellow: #ffcc00;\n --tgui--palette-purple: #af52de;\n\n /* ─── semantic · surfaces ─────────────────────────────────── */\n --tgui--bg: var(--tg-theme-bg-color, #ffffff);\n --tgui--bg-secondary: var(--tg-theme-secondary-bg-color, #f2f2f7);\n --tgui--bg-elevated: var(--tg-theme-section-bg-color, #ffffff);\n --tgui--fill: rgba(120, 120, 128, 0.12);\n --tgui--fill-secondary: rgba(120, 120, 128, 0.08);\n --tgui--fill-tertiary: rgba(118, 118, 128, 0.05);\n\n /* ─── semantic · content (greyscale hierarchy) ────────────── */\n --tgui--label: var(--tg-theme-text-color, #000000);\n /* secondaryLabel darkened from the iOS #8e8e93 to clear WCAG AA on white + tint */\n --tgui--label-secondary: var(--tg-theme-hint-color, #68686d);\n --tgui--label-tertiary: rgba(60, 60, 67, 0.3);\n --tgui--label-quaternary: rgba(60, 60, 67, 0.18);\n --tgui--placeholder: rgba(60, 60, 67, 0.3);\n\n /* ─── semantic · lines ───────────────────────────────────── */\n --tgui--separator: rgba(60, 60, 67, 0.13);\n --tgui--separator-opaque: #c6c6c8;\n\n /* ─── semantic · accent & status ─────────────────────────── */\n --tgui--accent: var(--tg-theme-button-color, #007aff);\n --tgui--accent-label: var(--tg-theme-button-text-color, #ffffff);\n /* *-strong: accent/link/destructive made WCAG-AA-safe (raw hues run ≈3.6:1) */\n --tgui--accent-strong: var(--tgui--accent);\n --tgui--accent-fill: rgba(0, 122, 255, 0.12);\n --tgui--link: var(--tg-theme-link-color, #007aff);\n --tgui--link-strong: var(--tgui--link);\n --tgui--destructive: var(--tg-theme-destructive-text-color, #ff3b30);\n --tgui--destructive-label: #ffffff;\n --tgui--destructive-strong: var(--tgui--destructive);\n --tgui--success: #34c759;\n --tgui--warning: #ff9500;\n\n /* ─── semantic · focus ───────────────────────────────────── */\n /* one ring for every interactive component – outline, so overflow never clips it\n and it survives forced-colors. resolves per theme via --tgui--accent.\n -shadow is the same ring as a box-shadow, for small proxies (checkbox / knob). */\n --tgui--focus-ring: 2px solid var(--tgui--accent);\n --tgui--focus-ring-offset: 2px;\n --tgui--focus-ring-shadow: 0 0 0 2px var(--tgui--accent);\n\n /* ─── semantic · surface ─────────────────────────────────── */\n /* one background for every raised surface in the kit – cards, sections, tab bar,\n and every floating overlay (popover, menu, dialog, sheet, tooltip, snackbar).\n resolves per theme through --tgui--bg-elevated, so no dark override of its own. */\n --tgui--surface-bg: var(--tgui--bg-elevated);\n /* the floating elevation – hairline ring + ambient shadow – only overlays wear it */\n --tgui--overlay-shadow: 0 0 0 0.5px var(--tgui--separator), var(--tgui--shadow-lg);\n\n /* ─── spacing (name = px) ────────────────────────────────── */\n --tgui--space-2: 2px;\n --tgui--space-4: 4px;\n --tgui--space-8: 8px;\n --tgui--space-12: 12px;\n --tgui--space-16: 16px;\n --tgui--space-20: 20px;\n --tgui--space-24: 24px;\n --tgui--space-32: 32px;\n --tgui--space-40: 40px;\n --tgui--space-48: 48px;\n --tgui--space-64: 64px;\n --tgui--page-margin: 16px;\n --tgui--tap-target: 44px;\n --tgui--hairline: 1px;\n\n /* device safe area, chaining in Telegram's own value where it provides one */\n --tgui--safe-area-top: var(--tg-safe-area-inset-top, 0px);\n --tgui--safe-area-right: var(--tg-safe-area-inset-right, 0px);\n --tgui--safe-area-bottom: var(--tg-safe-area-inset-bottom, 0px);\n --tgui--safe-area-left: var(--tg-safe-area-inset-left, 0px);\n /* margin taken by Telegram's own UI inside the webview */\n --tgui--content-safe-area-top: var(--tg-content-safe-area-inset-top, 0px);\n --tgui--content-safe-area-bottom: var(--tg-content-safe-area-inset-bottom, 0px);\n\n /* ─── radius (one knob + derived) ───────────────────────── */\n --tgui--radius: 12px;\n --tgui--radius-sm: 8px;\n --tgui--radius-lg: 16px;\n --tgui--radius-full: 999px;\n\n /* ─── elevation (soft, low-opacity, large-radius) ───────── */\n --tgui--shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.06);\n --tgui--shadow-md: 0 4px 16px rgba(0, 0, 0, 0.12);\n --tgui--shadow-lg: 0 8px 32px rgba(0, 0, 0, 0.18);\n\n /* ─── materials (blur + bg; components apply both; fallback below) ─ */\n --tgui--material-blur-ultra-thin: blur(20px) saturate(1.8);\n --tgui--material-blur-thin: blur(30px) saturate(1.8);\n --tgui--material-blur-regular: blur(40px) saturate(1.8);\n --tgui--material-blur-thick: blur(50px) saturate(1.8);\n --tgui--material-bg-ultra-thin: rgba(255, 255, 255, 0.55);\n --tgui--material-bg-thin: rgba(255, 255, 255, 0.7);\n --tgui--material-bg-regular: rgba(255, 255, 255, 0.82);\n --tgui--material-bg-thick: rgba(255, 255, 255, 0.93);\n\n /* ─── motion ─────────────────────────────────────────────── */\n --tgui--duration-instant: 100ms;\n --tgui--duration-overlay: 150ms;\n --tgui--duration-fast: 200ms;\n --tgui--duration-base: 300ms;\n --tgui--duration-slow: 340ms;\n --tgui--ease-standard: cubic-bezier(0.4, 0, 0.2, 1);\n --tgui--ease-out: cubic-bezier(0, 0, 0.2, 1);\n --tgui--ease-in: cubic-bezier(0.4, 0, 1, 1);\n --tgui--ease-spring: cubic-bezier(0.32, 0.72, 0, 1);\n\n /* ─── z-index ────────────────────────────────────────────── */\n --tgui--z-base: 1;\n --tgui--z-raised: 10;\n --tgui--z-sticky: 100;\n --tgui--z-overlay: 1000;\n --tgui--z-toast: 1100;\n\n /* ─── typography ─────────────────────────────────────────── */\n --tgui--font-family:\n -apple-system, BlinkMacSystemFont, \"SF Pro Text\", \"SF Pro Display\", \"Helvetica Neue\",\n \"Segoe UI\", \"Roboto\", system-ui, sans-serif;\n --tgui--font-family-mono: ui-monospace, \"SF Mono\", \"Geist Mono\", \"Menlo\", monospace;\n\n --tgui--weight-regular: 400;\n --tgui--weight-medium: 500;\n --tgui--weight-semibold: 600;\n --tgui--weight-bold: 700;\n\n /* iOS semantic text styles: size / line-height / weight / tracking */\n --tgui--font-large-title-size: 34px;\n --tgui--font-large-title-line: 41px;\n --tgui--font-large-title-weight: 700;\n --tgui--font-large-title-tracking: 0.4px;\n\n --tgui--font-title-1-size: 28px;\n --tgui--font-title-1-line: 34px;\n --tgui--font-title-1-weight: 700;\n --tgui--font-title-1-tracking: 0.36px;\n\n --tgui--font-title-2-size: 22px;\n --tgui--font-title-2-line: 28px;\n --tgui--font-title-2-weight: 700;\n --tgui--font-title-2-tracking: 0.35px;\n\n --tgui--font-title-3-size: 20px;\n --tgui--font-title-3-line: 25px;\n --tgui--font-title-3-weight: 600;\n --tgui--font-title-3-tracking: 0.38px;\n\n --tgui--font-headline-size: 17px;\n --tgui--font-headline-line: 22px;\n --tgui--font-headline-weight: 600;\n --tgui--font-headline-tracking: -0.43px;\n\n --tgui--font-body-size: 17px;\n --tgui--font-body-line: 22px;\n --tgui--font-body-weight: 400;\n --tgui--font-body-tracking: -0.43px;\n\n --tgui--font-callout-size: 16px;\n --tgui--font-callout-line: 21px;\n --tgui--font-callout-weight: 400;\n --tgui--font-callout-tracking: -0.31px;\n\n --tgui--font-subheadline-size: 15px;\n --tgui--font-subheadline-line: 20px;\n --tgui--font-subheadline-weight: 400;\n --tgui--font-subheadline-tracking: -0.23px;\n\n --tgui--font-footnote-size: 13px;\n --tgui--font-footnote-line: 18px;\n --tgui--font-footnote-weight: 400;\n --tgui--font-footnote-tracking: -0.08px;\n\n --tgui--font-caption-1-size: 12px;\n --tgui--font-caption-1-line: 16px;\n --tgui--font-caption-1-weight: 400;\n --tgui--font-caption-1-tracking: 0px;\n\n --tgui--font-caption-2-size: 11px;\n --tgui--font-caption-2-line: 13px;\n --tgui--font-caption-2-weight: 400;\n --tgui--font-caption-2-tracking: 0.06px;\n\n /* ─── field chrome (shared by FormField / SearchBar / Stepper) ─── */\n --tgui--field-padding-x: 16px;\n --tgui--field-padding-y: 12px;\n --tgui--field-radius: 12px;\n --tgui--field-gap: 12px;\n --tgui--field-min-height: 48px;\n\n -webkit-tap-highlight-color: transparent;\n -webkit-text-size-adjust: 100%;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n font-family: var(--tgui--font-family);\n font-optical-sizing: auto;\n color: var(--tgui--label);\n}\n\n/* platform: iOS shares the HIG type scale with base; kept for CSS-only iOS diffs */\n.wrapper--ios {\n /* intentionally minimal – structural platform differences are handled in JS */\n}\n\n.wrapper--dark {\n --tgui--palette-blue: #0a84ff;\n --tgui--palette-red: #ff453a;\n --tgui--palette-green: #30d158;\n --tgui--palette-orange: #ff9f0a;\n\n --tgui--bg: var(--tg-theme-bg-color, #000000);\n --tgui--bg-secondary: var(--tg-theme-secondary-bg-color, #000000);\n --tgui--bg-elevated: var(--tg-theme-section-bg-color, #1c1c1e);\n --tgui--fill: rgba(120, 120, 128, 0.24);\n --tgui--fill-secondary: rgba(120, 120, 128, 0.16);\n --tgui--fill-tertiary: rgba(118, 118, 128, 0.12);\n\n --tgui--label: var(--tg-theme-text-color, #ffffff);\n --tgui--label-secondary: var(--tg-theme-hint-color, #98989e);\n --tgui--label-tertiary: rgba(235, 235, 245, 0.3);\n --tgui--label-quaternary: rgba(235, 235, 245, 0.16);\n --tgui--placeholder: rgba(235, 235, 245, 0.3);\n\n --tgui--separator: rgba(84, 84, 88, 0.6);\n --tgui--separator-opaque: #38383a;\n\n --tgui--accent: var(--tg-theme-button-color, #0a84ff);\n --tgui--accent-fill: rgba(10, 132, 255, 0.2);\n --tgui--link: var(--tg-theme-link-color, #0a84ff);\n --tgui--destructive: var(--tg-theme-destructive-text-color, #ff453a);\n --tgui--success: #30d158;\n --tgui--warning: #ff9f0a;\n\n --tgui--shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3);\n --tgui--shadow-md: 0 4px 16px rgba(0, 0, 0, 0.4);\n --tgui--shadow-lg: 0 8px 32px rgba(0, 0, 0, 0.5);\n\n --tgui--material-bg-ultra-thin: rgba(28, 28, 30, 0.55);\n --tgui--material-bg-thin: rgba(28, 28, 30, 0.7);\n --tgui--material-bg-regular: rgba(28, 28, 30, 0.82);\n --tgui--material-bg-thick: rgba(28, 28, 30, 0.93);\n}\n\n@media (min-resolution: 2dppx) {\n .wrapper {\n --tgui--hairline: 0.5px;\n }\n}\n\n@supports (padding: max(0px, env(safe-area-inset-top))) {\n .wrapper {\n --tgui--safe-area-top: max(env(safe-area-inset-top), var(--tg-safe-area-inset-top, 0px));\n --tgui--safe-area-right: max(env(safe-area-inset-right), var(--tg-safe-area-inset-right, 0px));\n --tgui--safe-area-bottom: max(\n env(safe-area-inset-bottom),\n var(--tg-safe-area-inset-bottom, 0px)\n );\n --tgui--safe-area-left: max(env(safe-area-inset-left), var(--tg-safe-area-inset-left, 0px));\n }\n}\n\n@supports (color: color-mix(in srgb, red 10%, transparent)) {\n .wrapper {\n --tgui--accent-fill: color-mix(in srgb, var(--tgui--accent) 12%, transparent);\n --tgui--accent-strong: color-mix(in srgb, var(--tgui--accent) 76%, #000);\n --tgui--link-strong: color-mix(in srgb, var(--tgui--link) 76%, #000);\n --tgui--destructive-strong: color-mix(in srgb, var(--tgui--destructive) 76%, #000);\n --tgui--material-bg-ultra-thin: color-mix(in srgb, var(--tgui--bg-elevated) 55%, transparent);\n --tgui--material-bg-thin: color-mix(in srgb, var(--tgui--bg-elevated) 70%, transparent);\n --tgui--material-bg-regular: color-mix(in srgb, var(--tgui--bg-elevated) 82%, transparent);\n --tgui--material-bg-thick: color-mix(in srgb, var(--tgui--bg-elevated) 93%, transparent);\n }\n\n .wrapper--dark {\n --tgui--accent-fill: color-mix(in srgb, var(--tgui--accent) 22%, transparent);\n /* fill stays deep for white text; text hues stay raw (bright on near-black) */\n --tgui--accent-strong: color-mix(in srgb, var(--tgui--accent) 80%, #000);\n --tgui--link-strong: var(--tgui--link);\n --tgui--destructive-strong: var(--tgui--destructive);\n }\n}\n\n/* material fallbacks – must come after the color-mix block to win */\n@media (prefers-reduced-transparency: reduce) {\n .wrapper {\n --tgui--material-blur-ultra-thin: none;\n --tgui--material-blur-thin: none;\n --tgui--material-blur-regular: none;\n --tgui--material-blur-thick: none;\n --tgui--material-bg-ultra-thin: var(--tgui--bg-elevated);\n --tgui--material-bg-thin: var(--tgui--bg-elevated);\n --tgui--material-bg-regular: var(--tgui--bg-elevated);\n --tgui--material-bg-thick: var(--tgui--bg-elevated);\n }\n}\n\n@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {\n .wrapper {\n --tgui--material-bg-ultra-thin: var(--tgui--bg-elevated);\n --tgui--material-bg-thin: var(--tgui--bg-elevated);\n --tgui--material-bg-regular: var(--tgui--bg-elevated);\n --tgui--material-bg-thick: var(--tgui--bg-elevated);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .wrapper *,\n .wrapper *::before,\n .wrapper *::after {\n /* biome-ignore lint/complexity/noImportantStyles: a reduced-motion reset must beat every component's own transition/animation */\n animation-duration: 0.01ms !important;\n /* biome-ignore lint/complexity/noImportantStyles: see above */\n animation-iteration-count: 1 !important;\n /* biome-ignore lint/complexity/noImportantStyles: see above */\n transition-duration: 0.01ms !important;\n /* biome-ignore lint/complexity/noImportantStyles: see above */\n scroll-behavior: auto !important;\n }\n}\n","import {\n type HTMLAttributes,\n type Ref,\n useCallback,\n useMemo,\n useState,\n useSyncExternalStore,\n} from 'react';\nimport { getAppearance, subscribeAppearance } from '../../shared/lib/appearance';\nimport { cn } from '../../shared/lib/cn';\nimport { getPlatform } from '../../shared/lib/platform';\nimport type { Appearance, TguiPlatform } from '../../shared/types/tgui';\nimport { TguiContext } from './context';\nimport styles from './TguiProvider.module.css';\n\nexport interface TguiProviderProps extends HTMLAttributes<HTMLDivElement> {\n ref?: Ref<HTMLDivElement>;\n platform?: TguiPlatform;\n appearance?: Appearance;\n portalContainer?: HTMLElement | null;\n // set false to opt every component out of Telegram haptic feedback\n haptics?: boolean;\n}\n\nconst getServerAppearance = (): Appearance => 'light';\n\nexport function TguiProvider({\n ref,\n platform: platformProp,\n appearance: appearanceProp,\n portalContainer: portalContainerProp,\n haptics = true,\n className,\n children,\n ...rest\n}: TguiProviderProps) {\n const platform = useMemo(() => platformProp ?? getPlatform(), [platformProp]);\n\n const systemAppearance = useSyncExternalStore(\n subscribeAppearance,\n getAppearance,\n getServerAppearance,\n );\n const appearance = appearanceProp ?? systemAppearance;\n\n const [wrapper, setWrapper] = useState<HTMLDivElement | null>(null);\n const setRef = useCallback(\n (node: HTMLDivElement | null) => {\n setWrapper(node);\n\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n },\n [ref],\n );\n\n const value = useMemo(\n () => ({\n platform,\n appearance,\n portalContainer: portalContainerProp ?? wrapper,\n haptics,\n }),\n [platform, appearance, portalContainerProp, wrapper, haptics],\n );\n\n return (\n <div\n ref={setRef}\n data-slot=\"tgui-provider\"\n data-platform={platform}\n data-appearance={appearance}\n className={cn(\n styles.wrapper,\n platform === 'ios' && styles['wrapper--ios'],\n appearance === 'dark' && styles['wrapper--dark'],\n className,\n )}\n {...rest}\n >\n <TguiContext.Provider value={value}>{children}</TguiContext.Provider>\n </div>\n );\n}\n\nTguiProvider.displayName = 'TguiProvider';\n","import { getTelegramWebApp } from './telegram';\n\n// semantic intents, mapped to Telegram's HapticFeedback API\nexport type HapticIntent = 'tap' | 'press' | 'select' | 'success' | 'warning' | 'error';\n\n// fire a haptic through the Telegram client; a no-op everywhere else\nexport function triggerHaptic(intent: HapticIntent): void {\n const haptic = getTelegramWebApp()?.HapticFeedback;\n if (haptic == null) return;\n try {\n switch (intent) {\n case 'tap':\n haptic.impactOccurred('light');\n break;\n case 'press':\n haptic.impactOccurred('medium');\n break;\n case 'select':\n haptic.selectionChanged();\n break;\n case 'success':\n haptic.notificationOccurred('success');\n break;\n case 'warning':\n haptic.notificationOccurred('warning');\n break;\n case 'error':\n haptic.notificationOccurred('error');\n break;\n }\n } catch {\n // older clients throw on styles they don't support\n }\n}\n","import { useCallback, useContext } from 'react';\nimport { type HapticIntent, triggerHaptic } from '../../shared/lib/haptics';\nimport { TguiContext } from './context';\n\n// returns a stable function that fires a Telegram haptic, respecting the\n// provider's `haptics` flag; a no-op outside Telegram and provider-optional\nexport function useHaptic(): (intent: HapticIntent) => void {\n const enabled = useContext(TguiContext)?.haptics ?? true;\n return useCallback(\n (intent: HapticIntent) => {\n if (enabled) triggerHaptic(intent);\n },\n [enabled],\n );\n}\n","import { useContext } from 'react';\nimport type { TguiContextValue } from '../../shared/types/tgui';\nimport { TguiContext } from './context';\n\nexport function useTgui(): TguiContextValue {\n const context = useContext(TguiContext);\n\n if (context === null) {\n throw new Error('useTgui must be used within a <TguiProvider>.');\n }\n\n return context;\n}\n",".accordion {\n display: flex;\n flex-direction: column;\n}\n\n.item {\n border-bottom: var(--tgui--hairline, 1px) solid var(--tgui--separator);\n}\n\n.item:last-child {\n border-bottom: 0;\n}\n\n.header {\n display: flex;\n align-items: center;\n gap: 12px;\n width: 100%;\n padding: 15px var(--tgui--accordion-inset, 20px);\n border: 0;\n background: transparent;\n color: var(--tgui--label);\n font-family: var(--tgui--font-family);\n font-size: 16px;\n font-weight: var(--tgui--weight-semibold);\n line-height: 22px;\n text-align: start;\n cursor: pointer;\n}\n\n.title {\n flex: 1;\n min-width: 0;\n}\n\n.header:focus-visible {\n outline: var(--tgui--focus-ring);\n outline-offset: calc(-1 * var(--tgui--focus-ring-offset));\n}\n\n.chevron {\n flex-shrink: 0;\n width: 18px;\n height: 18px;\n color: var(--tgui--label-tertiary);\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .chevron {\n transition: transform 0.2s ease;\n }\n}\n\n.header[aria-expanded=\"true\"] .chevron {\n transform: rotate(180deg);\n}\n\n@media (hover: hover) and (pointer: fine) {\n .header:hover .title {\n color: var(--tgui--link-strong);\n }\n}\n\n.panel {\n display: grid;\n grid-template-rows: 0fr;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .panel {\n transition: grid-template-rows 0.25s ease;\n }\n}\n\n.panel[data-state=\"open\"] {\n grid-template-rows: 1fr;\n}\n\n.panelInner {\n overflow: hidden;\n}\n\n.panelContent {\n padding: 2px var(--tgui--accordion-inset, 20px) 16px;\n color: var(--tgui--label-secondary);\n font-family: var(--tgui--font-family);\n font-size: 15px;\n line-height: 21px;\n}\n","import { createContext } from 'react';\n\nexport interface AccordionContextValue {\n open: string[];\n toggle: (value: string) => void;\n}\n\nexport const AccordionContext = createContext<AccordionContextValue | null>(null);\n\nAccordionContext.displayName = 'AccordionContext';\n","'use client';\n\nimport { type HTMLAttributes, type Ref, useCallback, useMemo, useState } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { useHaptic } from '../TguiProvider';\nimport styles from './Accordion.module.css';\nimport { AccordionContext } from './context';\n\nconst toArray = (value: string | string[] | undefined): string[] =>\n value == null ? [] : Array.isArray(value) ? value : [value];\n\nexport interface AccordionProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onChange'> {\n ref?: Ref<HTMLDivElement>;\n multiple?: boolean;\n value?: string | string[];\n defaultValue?: string | string[];\n onValueChange?: (value: string[]) => void;\n}\n\nexport function Accordion({\n ref,\n multiple = false,\n value: valueProp,\n defaultValue,\n onValueChange,\n className,\n children,\n ...rest\n}: AccordionProps) {\n const [uncontrolled, setUncontrolled] = useState(() => toArray(defaultValue));\n const open = valueProp != null ? toArray(valueProp) : uncontrolled;\n const haptic = useHaptic();\n\n const toggle = useCallback(\n (item: string) => {\n const isOpen = open.includes(item);\n const next = isOpen ? open.filter((v) => v !== item) : multiple ? [...open, item] : [item];\n haptic('tap');\n if (valueProp == null) setUncontrolled(next);\n onValueChange?.(next);\n },\n [open, multiple, valueProp, onValueChange, haptic],\n );\n\n const context = useMemo(() => ({ open, toggle }), [open, toggle]);\n\n return (\n <AccordionContext.Provider value={context}>\n <div ref={ref} data-slot=\"accordion\" className={cn(styles.accordion, className)} {...rest}>\n {children}\n </div>\n </AccordionContext.Provider>\n );\n}\n\nAccordion.displayName = 'Accordion';\n","'use client';\n\nimport { type HTMLAttributes, type ReactNode, type Ref, useContext, useId } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './Accordion.module.css';\nimport { AccordionContext } from './context';\n\nexport interface AccordionItemProps extends HTMLAttributes<HTMLDivElement> {\n ref?: Ref<HTMLDivElement>;\n value: string;\n header: ReactNode;\n}\n\nexport function AccordionItem({\n ref,\n value,\n header,\n className,\n children,\n ...rest\n}: AccordionItemProps) {\n const context = useContext(AccordionContext);\n if (!context) {\n throw new Error('AccordionItem must be used within an <Accordion>.');\n }\n const panelId = useId();\n const open = context.open.includes(value);\n\n const state = open ? 'open' : 'closed';\n\n return (\n <div\n ref={ref}\n data-slot=\"accordion-item\"\n data-state={state}\n className={cn(styles.item, className)}\n {...rest}\n >\n <button\n type=\"button\"\n data-slot=\"accordion-trigger\"\n data-state={state}\n className={styles.header}\n aria-expanded={open}\n aria-controls={panelId}\n onClick={() => context.toggle(value)}\n >\n <span className={styles.title}>{header}</span>\n <svg className={styles.chevron} viewBox=\"0 0 18 18\" fill=\"none\" aria-hidden>\n <path\n d=\"M4.5 7l4.5 4.5L13.5 7\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </button>\n <div data-slot=\"accordion-panel\" data-state={state} className={styles.panel}>\n <div className={styles.panelInner}>\n <div\n id={panelId}\n data-slot=\"accordion-content\"\n className={styles.panelContent}\n inert={!open}\n aria-hidden={!open}\n >\n {children}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nAccordionItem.displayName = 'AccordionItem';\n",".avatar {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n flex-shrink: 0;\n overflow: hidden;\n border-radius: 50%;\n background: var(--tgui--fill);\n color: var(--tgui--label-secondary);\n font-family: var(--tgui--font-family);\n font-weight: var(--tgui--weight-semibold);\n line-height: 1;\n user-select: none;\n}\n\n.s20 {\n width: 20px;\n height: 20px;\n font-size: 9px;\n}\n\n.s24 {\n width: 24px;\n height: 24px;\n font-size: 10px;\n}\n\n.s28 {\n width: 28px;\n height: 28px;\n font-size: 11px;\n}\n\n.s40 {\n width: 40px;\n height: 40px;\n font-size: 15px;\n}\n\n.s48 {\n width: 48px;\n height: 48px;\n font-size: 18px;\n}\n\n.s96 {\n width: 96px;\n height: 96px;\n font-size: 34px;\n}\n\n.img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n}\n\n.acronym {\n text-transform: uppercase;\n}\n\n.icon {\n display: flex;\n width: 60%;\n height: 60%;\n}\n\n.icon > svg {\n width: 100%;\n height: 100%;\n}\n","import { cva } from 'class-variance-authority';\nimport styles from './Avatar.module.css';\n\nexport type AvatarSize = 20 | 24 | 28 | 40 | 48 | 96;\n\nexport const avatar = cva(styles.avatar, {\n variants: {\n size: {\n 20: styles.s20,\n 24: styles.s24,\n 28: styles.s28,\n 40: styles.s40,\n 48: styles.s48,\n 96: styles.s96,\n },\n },\n defaultVariants: { size: 40 },\n});\n","'use client';\n\nimport { type HTMLAttributes, type ReactNode, type Ref, useState } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './Avatar.module.css';\nimport { type AvatarSize, avatar } from './Avatar.variants';\n\nexport type { AvatarSize };\n\nexport interface AvatarProps extends HTMLAttributes<HTMLSpanElement> {\n ref?: Ref<HTMLSpanElement>;\n size?: AvatarSize;\n src?: string;\n alt?: string;\n acronym?: string;\n fallbackIcon?: ReactNode;\n}\n\nfunction PersonIcon() {\n return (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden>\n <path d=\"M12 12a4 4 0 1 0 0-8 4 4 0 0 0 0 8Zm0 2c-4.2 0-7 2.4-7 4.5V20h14v-1.5c0-2.1-2.8-4.5-7-4.5Z\" />\n </svg>\n );\n}\n\nexport function Avatar({\n ref,\n size = 40,\n src,\n alt = '',\n acronym,\n fallbackIcon,\n className,\n children,\n ...rest\n}: AvatarProps) {\n const [failedSrc, setFailedSrc] = useState<string | null>(null);\n const showImage = src != null && src !== '' && src !== failedSrc;\n\n return (\n <span ref={ref} data-slot=\"avatar\" className={cn(avatar({ size }), className)} {...rest}>\n {showImage ? (\n <img\n data-slot=\"avatar-image\"\n className={styles.img}\n src={src}\n alt={alt}\n loading=\"lazy\"\n onError={() => setFailedSrc(src)}\n />\n ) : acronym ? (\n <span data-slot=\"avatar-fallback\" className={styles.acronym}>\n {acronym}\n </span>\n ) : (\n <span data-slot=\"avatar-fallback\" className={styles.icon}>\n {fallbackIcon ?? <PersonIcon />}\n </span>\n )}\n {children}\n </span>\n );\n}\n\nAvatar.displayName = 'Avatar';\n",".stack {\n display: inline-flex;\n align-items: center;\n}\n\n.stack > * {\n margin-inline-start: calc(-1 * var(--tgui--avatar-stack-overlap, 8px));\n border-radius: 50%;\n box-shadow: 0 0 0 2px var(--tgui--bg);\n}\n\n.stack > *:first-child {\n margin-inline-start: 0;\n}\n","import type { CSSProperties, HTMLAttributes, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './AvatarStack.module.css';\n\nexport interface AvatarStackProps extends HTMLAttributes<HTMLDivElement> {\n ref?: Ref<HTMLDivElement>;\n overlap?: number;\n}\n\nexport function AvatarStack({ ref, overlap, className, style, ...rest }: AvatarStackProps) {\n return (\n <div\n ref={ref}\n data-slot=\"avatar-stack\"\n className={cn(styles.stack, className)}\n style={\n overlap != null\n ? ({ ...style, '--tgui--avatar-stack-overlap': `${overlap}px` } as CSSProperties)\n : style\n }\n {...rest}\n />\n );\n}\n\nAvatarStack.displayName = 'AvatarStack';\n",".badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n flex-shrink: 0;\n font-family: var(--tgui--font-family);\n font-weight: var(--tgui--weight-semibold);\n}\n\n.number {\n min-width: 20px;\n height: 20px;\n padding: 0 6px;\n border-radius: 10px;\n font-size: 13px;\n line-height: 1;\n}\n\n.large.number {\n min-width: 24px;\n height: 24px;\n padding: 0 8px;\n border-radius: 12px;\n font-size: 15px;\n}\n\n.dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n}\n\n.large.dot {\n width: 10px;\n height: 10px;\n}\n\n.mode-primary {\n color: var(--tgui--accent-label);\n background: var(--tgui--accent-strong);\n}\n\n.mode-critical {\n color: var(--tgui--white);\n background: var(--tgui--destructive);\n}\n\n@supports (color: color-mix(in srgb, red 10%, transparent)) {\n .mode-critical {\n /* deep enough for the white count to pass AA in both themes */\n background: color-mix(in srgb, var(--tgui--destructive) 78%, #000);\n }\n}\n\n.mode-secondary {\n color: var(--tgui--link-strong);\n background: var(--tgui--accent-fill);\n}\n\n.mode-gray {\n color: var(--tgui--label);\n background: var(--tgui--fill);\n}\n\n.mode-white {\n color: var(--tgui--black);\n background: var(--tgui--white);\n}\n","import { cva } from 'class-variance-authority';\nimport styles from './Badge.module.css';\n\nexport type BadgeType = 'number' | 'dot';\nexport type BadgeMode = 'primary' | 'critical' | 'secondary' | 'gray' | 'white';\n\nexport const badge = cva(styles.badge, {\n variants: {\n type: { number: styles.number, dot: styles.dot },\n mode: {\n primary: styles['mode-primary'],\n critical: styles['mode-critical'],\n secondary: styles['mode-secondary'],\n gray: styles['mode-gray'],\n white: styles['mode-white'],\n },\n large: { true: styles.large },\n },\n defaultVariants: { type: 'number', mode: 'primary' },\n});\n","import type { HTMLAttributes, ReactNode, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { type BadgeMode, type BadgeType, badge } from './Badge.variants';\n\nexport type { BadgeMode, BadgeType };\n\nexport interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {\n ref?: Ref<HTMLSpanElement>;\n type?: BadgeType;\n mode?: BadgeMode;\n large?: boolean;\n children?: ReactNode;\n}\n\nexport function Badge({\n ref,\n type = 'number',\n mode = 'primary',\n large = false,\n className,\n children,\n ...rest\n}: BadgeProps) {\n return (\n <span\n ref={ref}\n data-slot=\"badge\"\n data-mode={mode}\n className={cn(badge({ type, mode, large }), className)}\n {...rest}\n >\n {type === 'number' ? children : null}\n </span>\n );\n}\n\nBadge.displayName = 'Badge';\n",".banner {\n position: relative;\n display: flex;\n gap: 16px;\n box-sizing: border-box;\n padding: 16px;\n border-radius: 12px;\n overflow: hidden;\n font-family: var(--tgui--font-family);\n}\n\n.type-section {\n background: var(--tgui--fill);\n color: var(--tgui--label);\n}\n\n.type-image {\n color: var(--tgui--white);\n}\n\n.background {\n position: absolute;\n inset: 0;\n z-index: 0;\n}\n\n.background > * {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n\n.type-image::after {\n content: \"\";\n position: absolute;\n inset: 0;\n z-index: 1;\n background: linear-gradient(180deg, rgb(0 0 0 / 0.1), rgb(0 0 0 / 0.55));\n}\n\n.before {\n position: relative;\n z-index: 2;\n flex-shrink: 0;\n}\n\n.body {\n position: relative;\n z-index: 2;\n display: flex;\n flex-direction: column;\n gap: 4px;\n min-width: 0;\n flex: 1;\n}\n\n.callout {\n font-size: 13px;\n line-height: 16px;\n font-weight: var(--tgui--weight-semibold);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n opacity: 0.75;\n}\n\n.header {\n font-size: 16px;\n line-height: 22px;\n font-weight: var(--tgui--weight-bold);\n}\n\n.subheader {\n font-size: 14px;\n line-height: 20px;\n opacity: 0.8;\n}\n\n.description {\n margin-top: 4px;\n font-size: 14px;\n line-height: 20px;\n}\n\n.actions {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n margin-top: 12px;\n}\n\n.close {\n position: relative;\n z-index: 2;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 24px;\n height: 24px;\n margin: -4px -4px auto auto;\n padding: 0;\n border: 0;\n border-radius: 50%;\n color: currentColor;\n background: transparent;\n cursor: pointer;\n opacity: 0.7;\n}\n\n.close:focus-visible {\n outline: var(--tgui--focus-ring);\n outline-offset: var(--tgui--focus-ring-offset);\n opacity: 1;\n}\n\n@media (hover: hover) and (pointer: fine) {\n .close:hover {\n opacity: 1;\n }\n}\n","import { cva } from 'class-variance-authority';\nimport styles from './Banner.module.css';\n\nexport type BannerType = 'section' | 'image';\n\nexport const banner = cva(styles.banner, {\n variants: {\n type: {\n section: styles['type-section'],\n image: styles['type-image'],\n },\n },\n defaultVariants: { type: 'section' },\n});\n","import type { HTMLAttributes, ReactNode, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './Banner.module.css';\nimport { type BannerType, banner } from './Banner.variants';\n\nexport type { BannerType };\n\nexport interface BannerProps extends HTMLAttributes<HTMLElement> {\n ref?: Ref<HTMLElement>;\n type?: BannerType;\n before?: ReactNode;\n callout?: ReactNode;\n header?: ReactNode;\n subheader?: ReactNode;\n description?: ReactNode;\n actions?: ReactNode;\n background?: ReactNode;\n onClose?: () => void;\n closeLabel?: string;\n}\n\nexport function Banner({\n ref,\n type = 'section',\n before,\n callout,\n header,\n subheader,\n description,\n actions,\n background,\n onClose,\n closeLabel = 'Close',\n className,\n children,\n ...rest\n}: BannerProps) {\n return (\n <section\n ref={ref}\n data-slot=\"banner\"\n data-type={type}\n className={cn(banner({ type }), className)}\n {...rest}\n >\n {type === 'image' && background != null ? (\n <div data-slot=\"banner-background\" className={styles.background} aria-hidden>\n {background}\n </div>\n ) : null}\n\n {before != null ? (\n <div data-slot=\"banner-before\" className={styles.before}>\n {before}\n </div>\n ) : null}\n\n <div data-slot=\"banner-body\" className={styles.body}>\n {callout != null ? (\n <span data-slot=\"banner-callout\" className={styles.callout}>\n {callout}\n </span>\n ) : null}\n {header != null ? (\n <span data-slot=\"banner-title\" className={styles.header}>\n {header}\n </span>\n ) : null}\n {subheader != null ? (\n <span data-slot=\"banner-subtitle\" className={styles.subheader}>\n {subheader}\n </span>\n ) : null}\n {description != null ? (\n <p data-slot=\"banner-description\" className={styles.description}>\n {description}\n </p>\n ) : null}\n {children}\n {actions != null ? (\n <div data-slot=\"banner-actions\" className={styles.actions}>\n {actions}\n </div>\n ) : null}\n </div>\n\n {onClose != null ? (\n <button\n type=\"button\"\n data-slot=\"banner-close\"\n className={styles.close}\n aria-label={closeLabel}\n onClick={onClose}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" aria-hidden>\n <path\n d=\"M3.5 3.5l7 7M10.5 3.5l-7 7\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n ) : null}\n </section>\n );\n}\n\nBanner.displayName = 'Banner';\n",".blockquote {\n margin: 0;\n padding: 8px 12px 8px 16px;\n border-radius: 4px 12px 12px 4px;\n border-inline-start: 3px solid var(--tgui--link);\n background: var(--tgui--accent-fill);\n color: var(--tgui--label);\n font-family: var(--tgui--font-family);\n font-size: 15px;\n line-height: 21px;\n}\n\n.cite {\n display: block;\n margin-top: 6px;\n color: var(--tgui--label-secondary);\n font-size: 13px;\n font-style: normal;\n}\n","import type { BlockquoteHTMLAttributes, ReactNode, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './Blockquote.module.css';\n\nexport interface BlockquoteProps extends BlockquoteHTMLAttributes<HTMLQuoteElement> {\n ref?: Ref<HTMLQuoteElement>;\n author?: ReactNode;\n}\n\nexport function Blockquote({ ref, author, className, children, ...rest }: BlockquoteProps) {\n return (\n <blockquote\n ref={ref}\n data-slot=\"blockquote\"\n className={cn(styles.blockquote, className)}\n {...rest}\n >\n {children}\n {author != null ? (\n <cite data-slot=\"blockquote-author\" className={styles.cite}>\n {author}\n </cite>\n ) : null}\n </blockquote>\n );\n}\n\nBlockquote.displayName = 'Blockquote';\n",".nav {\n min-width: 0;\n font-family: var(--tgui--font-family);\n font-size: 14px;\n line-height: 18px;\n}\n\n.list {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: 6px;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.item {\n display: flex;\n align-items: center;\n gap: 6px;\n min-width: 0;\n}\n\n.link {\n margin: 0;\n padding: 0;\n border: 0;\n background: none;\n color: var(--tgui--link-strong);\n font: inherit;\n cursor: pointer;\n text-decoration: none;\n border-radius: 4px;\n}\n\n@media (hover: hover) and (pointer: fine) {\n .link:hover {\n text-decoration: underline;\n }\n}\n\n.link:focus-visible {\n outline: var(--tgui--focus-ring);\n outline-offset: var(--tgui--focus-ring-offset);\n}\n\n.current {\n overflow: hidden;\n max-width: 220px;\n color: var(--tgui--label);\n font-weight: var(--tgui--weight-semibold);\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n\n.ellipsis {\n color: var(--tgui--label-secondary);\n}\n\n.chevron {\n flex-shrink: 0;\n color: var(--tgui--label-secondary);\n}\n","import type { HTMLAttributes, ReactNode, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './Breadcrumbs.module.css';\n\nexport interface BreadcrumbItem {\n label: ReactNode;\n href?: string;\n onClick?: () => void;\n}\n\nexport interface BreadcrumbsProps extends Omit<HTMLAttributes<HTMLElement>, 'children'> {\n ref?: Ref<HTMLElement>;\n items: BreadcrumbItem[];\n maxItems?: number;\n}\n\nconst Chevron = () => (\n <svg\n data-slot=\"breadcrumbs-separator\"\n className={styles.chevron}\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 18 18\"\n fill=\"none\"\n aria-hidden\n >\n <path\n d=\"M6.75 4.5L11.25 9l-4.5 4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nexport function Breadcrumbs({ ref, items, maxItems = 4, className, ...rest }: BreadcrumbsProps) {\n const collapsed = items.length > maxItems;\n const visible: (BreadcrumbItem | 'ellipsis')[] = collapsed\n ? [items[0], 'ellipsis', ...items.slice(items.length - (maxItems - 1))]\n : items;\n\n return (\n <nav\n ref={ref}\n aria-label=\"Breadcrumbs\"\n data-slot=\"breadcrumbs\"\n className={cn(styles.nav, className)}\n {...rest}\n >\n <ol data-slot=\"breadcrumbs-list\" className={styles.list}>\n {visible.map((item, index) => {\n const isLast = index === visible.length - 1;\n return (\n // biome-ignore lint/suspicious/noArrayIndexKey: breadcrumb trail order is stable\n <li key={index} data-slot=\"breadcrumbs-item\" className={styles.item}>\n {item === 'ellipsis' ? (\n <span data-slot=\"breadcrumbs-ellipsis\" className={styles.ellipsis} aria-hidden>\n …\n </span>\n ) : isLast ? (\n <span data-slot=\"breadcrumbs-page\" className={styles.current} aria-current=\"page\">\n {item.label}\n </span>\n ) : item.href != null ? (\n <a\n href={item.href}\n data-slot=\"breadcrumbs-link\"\n className={styles.link}\n onClick={item.onClick}\n >\n {item.label}\n </a>\n ) : (\n <button\n type=\"button\"\n data-slot=\"breadcrumbs-link\"\n className={styles.link}\n onClick={item.onClick}\n >\n {item.label}\n </button>\n )}\n {!isLast ? <Chevron /> : null}\n </li>\n );\n })}\n </ol>\n </nav>\n );\n}\n\nBreadcrumbs.displayName = 'Breadcrumbs';\n",".spinner {\n display: inline-block;\n box-sizing: border-box;\n border-radius: 50%;\n border-style: solid;\n border-color: currentColor;\n border-top-color: transparent;\n animation: tgui-spinner 0.6s linear infinite;\n}\n\n.s {\n width: 16px;\n height: 16px;\n border-width: 2px;\n}\n\n.m {\n width: 24px;\n height: 24px;\n border-width: 2.5px;\n}\n\n.l {\n width: 32px;\n height: 32px;\n border-width: 3px;\n}\n\n@keyframes tgui-spinner {\n to {\n transform: rotate(360deg);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .spinner {\n animation-duration: 1.6s;\n }\n}\n","import { cva } from 'class-variance-authority';\nimport styles from './Spinner.module.css';\n\nexport type SpinnerSize = 's' | 'm' | 'l';\n\nexport const spinner = cva(styles.spinner, {\n variants: {\n size: { s: styles.s, m: styles.m, l: styles.l },\n },\n defaultVariants: { size: 'm' },\n});\n","import type { HTMLAttributes, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { type SpinnerSize, spinner } from './Spinner.variants';\n\nexport type { SpinnerSize };\n\nexport interface SpinnerProps extends HTMLAttributes<HTMLSpanElement> {\n ref?: Ref<HTMLSpanElement>;\n size?: SpinnerSize;\n}\n\nexport function Spinner({ ref, size = 'm', className, ...rest }: SpinnerProps) {\n return (\n <span\n ref={ref}\n role=\"status\"\n aria-label=\"Loading\"\n data-slot=\"spinner\"\n className={cn(spinner({ size }), className)}\n {...rest}\n />\n );\n}\n\nSpinner.displayName = 'Spinner';\n",".typography {\n margin: 0;\n font-family: var(--tgui--font-family);\n}\n\n.weight-1 {\n font-weight: var(--tgui--weight-bold);\n}\n\n.weight-2 {\n font-weight: var(--tgui--weight-semibold);\n}\n\n.weight-3 {\n font-weight: var(--tgui--weight-regular);\n}\n\n.caps {\n text-transform: uppercase;\n}\n","import { cva } from 'class-variance-authority';\nimport styles from './Typography.module.css';\n\nexport const typography = cva(styles.typography, {\n variants: {\n weight: {\n '1': styles['weight-1'],\n '2': styles['weight-2'],\n '3': styles['weight-3'],\n },\n caps: { true: styles.caps },\n },\n defaultVariants: { weight: '3' },\n});\n","import type { AllHTMLAttributes, ElementType, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { typography } from './Typography.variants';\n\nexport interface TypographyProps extends AllHTMLAttributes<HTMLElement> {\n ref?: Ref<HTMLElement>;\n weight?: '1' | '2' | '3';\n caps?: boolean;\n Component?: ElementType;\n}\n\nexport function Typography({\n ref,\n weight,\n caps,\n Component = 'span',\n className,\n ...rest\n}: TypographyProps) {\n return (\n <Component\n ref={ref}\n data-slot=\"typography\"\n className={cn(typography({ weight, caps }), className)}\n {...rest}\n />\n );\n}\n\nTypography.displayName = 'Typography';\n",".level-1 {\n font-size: var(--tgui--font-subheadline-size);\n line-height: var(--tgui--font-subheadline-line);\n letter-spacing: var(--tgui--font-subheadline-tracking);\n}\n\n.level-2 {\n font-size: var(--tgui--font-footnote-size);\n line-height: var(--tgui--font-footnote-line);\n letter-spacing: var(--tgui--font-footnote-tracking);\n}\n","import { cva } from 'class-variance-authority';\nimport styles from './Subheadline.module.css';\n\nexport type SubheadlineLevel = '1' | '2';\n\nexport const subheadline = cva('', {\n variants: {\n level: {\n '1': styles['level-1'],\n '2': styles['level-2'],\n },\n },\n defaultVariants: { level: '1' },\n});\n","import type { Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { Typography, type TypographyProps } from '../Typography';\nimport { type SubheadlineLevel, subheadline } from './Subheadline.variants';\n\nexport interface SubheadlineProps extends TypographyProps {\n ref?: Ref<HTMLElement>;\n level?: SubheadlineLevel;\n}\n\nexport function Subheadline({\n ref,\n level,\n Component = 'h6',\n className,\n ...rest\n}: SubheadlineProps) {\n return (\n <Typography\n data-slot=\"subheadline\"\n ref={ref}\n Component={Component}\n className={cn(subheadline({ level }), className)}\n {...rest}\n />\n );\n}\n\nSubheadline.displayName = 'Subheadline';\n",".ripple {\n position: absolute;\n inset: 0;\n overflow: hidden;\n border-radius: inherit;\n pointer-events: none;\n}\n\n.wave {\n position: absolute;\n width: 24px;\n height: 24px;\n border-radius: 50%;\n transform: translate(-50%, -50%);\n background: var(--tgui--separator);\n opacity: 0;\n animation: wave-rise 0.35s cubic-bezier(0.3, 0.3, 0.5, 1);\n}\n\n@keyframes wave-rise {\n from {\n transform: translate(-50%, -50%) scale(1);\n opacity: 1;\n }\n 30% {\n opacity: 1;\n }\n to {\n transform: translate(-50%, -50%) scale(8);\n opacity: 0;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .wave {\n animation: none;\n }\n}\n","import styles from './Ripple.module.css';\nimport type { Wave } from './useRipple';\n\ninterface RippleProps {\n waves: Wave[];\n onWaveEnd: (id: number) => void;\n}\n\nexport function Ripple({ waves, onWaveEnd }: RippleProps) {\n return (\n <span aria-hidden className={styles.ripple}>\n {waves.map((wave) => (\n <span\n key={wave.id}\n className={styles.wave}\n style={{ top: wave.y, left: wave.x }}\n onAnimationEnd={() => onWaveEnd(wave.id)}\n />\n ))}\n </span>\n );\n}\n",".tappable {\n position: relative;\n isolation: isolate;\n cursor: pointer;\n transition: opacity 0.15s ease-out;\n /* a tap target is a control surface, not a document – no text selection, like a native row/button */\n user-select: none;\n}\n\n.tappable[data-readonly] {\n cursor: default;\n}\n\n.tappable[data-disabled] {\n cursor: default;\n opacity: 0.35;\n}\n\n.tappable--ios:not([data-disabled]):not([data-readonly]):active,\n.tappable--opacity:not([data-disabled]):not([data-readonly]):active {\n opacity: 0.65;\n}\n\n@media (hover: hover) and (pointer: fine) {\n .tappable--ios:not([data-disabled]):not([data-readonly]):hover,\n .tappable--opacity:not([data-disabled]):not([data-readonly]):hover {\n opacity: 0.85;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .tappable {\n transition: none;\n }\n}\n","import { type PointerEvent, useCallback, useEffect, useRef, useState } from 'react';\n\nconst PRESS_DELAY = 70;\nconst WAVE_FALLBACK = 600;\n\nexport interface Wave {\n id: number;\n x: number;\n y: number;\n}\n\ntype Timer = ReturnType<typeof setTimeout>;\n\nexport function useRipple() {\n const [waves, setWaves] = useState<Wave[]>([]);\n const nextId = useRef(0);\n const pressTimers = useRef(new Map<number, Timer>());\n const waveTimers = useRef(new Set<Timer>());\n\n useEffect(() => {\n const press = pressTimers.current;\n const wave = waveTimers.current;\n return () => {\n for (const timer of press.values()) clearTimeout(timer);\n for (const timer of wave) clearTimeout(timer);\n };\n }, []);\n\n const removeWave = useCallback((id: number) => {\n setWaves((current) => current.filter((wave) => wave.id !== id));\n }, []);\n\n const onPointerDown = useCallback(\n (event: PointerEvent<HTMLElement>) => {\n const { top, left } = event.currentTarget.getBoundingClientRect();\n const x = event.clientX - left;\n const y = event.clientY - top;\n const { pointerId } = event;\n\n const press = setTimeout(() => {\n pressTimers.current.delete(pointerId);\n const id = nextId.current++;\n setWaves((current) => [...current, { id, x, y }]);\n\n const fallback = setTimeout(() => {\n waveTimers.current.delete(fallback);\n removeWave(id);\n }, WAVE_FALLBACK);\n waveTimers.current.add(fallback);\n }, PRESS_DELAY);\n\n pressTimers.current.set(pointerId, press);\n },\n [removeWave],\n );\n\n const onPointerCancel = useCallback((event: PointerEvent<HTMLElement>) => {\n const press = pressTimers.current.get(event.pointerId);\n if (press) {\n clearTimeout(press);\n pressTimers.current.delete(event.pointerId);\n }\n }, []);\n\n return { waves, onPointerDown, onPointerCancel, removeWave };\n}\n","'use client';\n\nimport type { AllHTMLAttributes, ElementType, PointerEvent, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { useHaptic } from '../TguiProvider/useHaptic';\nimport { useTgui } from '../TguiProvider/useTgui';\nimport { Ripple } from './Ripple';\nimport styles from './Tappable.module.css';\nimport { useRipple } from './useRipple';\n\nexport interface TappableProps extends AllHTMLAttributes<HTMLElement> {\n ref?: Ref<HTMLElement>;\n Component?: ElementType;\n // background = ripple on base · opacity = dim on both · none = component owns it\n interactiveAnimation?: 'background' | 'opacity' | 'none';\n}\n\nexport function Tappable({\n ref,\n Component = 'div',\n interactiveAnimation = 'background',\n className,\n children,\n onPointerDown,\n onPointerCancel,\n ...rest\n}: TappableProps) {\n const { platform } = useTgui();\n const haptic = useHaptic();\n const ripple = useRipple();\n const disabled = Boolean(rest.disabled);\n const readOnly = Boolean(rest.readOnly);\n\n const interactive = Component !== 'div' && Component !== 'span';\n const tappable = !readOnly && !disabled && (interactive || rest.onClick != null);\n const hasRipple = platform === 'base' && interactiveAnimation === 'background' && tappable;\n\n const handlePointerDown = (event: PointerEvent<HTMLElement>) => {\n // feedback lands on the press, iOS-style\n if (tappable && event.isPrimary) haptic('tap');\n if (hasRipple) ripple.onPointerDown(event);\n onPointerDown?.(event);\n };\n\n const handlePointerCancel = (event: PointerEvent<HTMLElement>) => {\n if (hasRipple) ripple.onPointerCancel(event);\n onPointerCancel?.(event);\n };\n\n return (\n <Component\n ref={ref}\n data-slot=\"tappable\"\n className={cn(\n styles.tappable,\n platform === 'ios' && interactiveAnimation !== 'none' && styles['tappable--ios'],\n interactiveAnimation === 'opacity' && styles['tappable--opacity'],\n className,\n )}\n data-readonly={readOnly || undefined}\n data-disabled={disabled || undefined}\n aria-disabled={disabled || undefined}\n onPointerDown={handlePointerDown}\n onPointerCancel={handlePointerCancel}\n {...rest}\n >\n {hasRipple && <Ripple waves={ripple.waves} onWaveEnd={ripple.removeWave} />}\n {children}\n </Component>\n );\n}\n\nTappable.displayName = 'Tappable';\n",".text {\n font-size: var(--tgui--font-body-size);\n line-height: var(--tgui--font-body-line);\n letter-spacing: var(--tgui--font-body-tracking);\n}\n","import type { Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { Typography, type TypographyProps } from '../Typography';\nimport styles from './Text.module.css';\n\nexport interface TextProps extends TypographyProps {\n ref?: Ref<HTMLElement>;\n}\n\nexport function Text({ ref, className, Component = 'span', ...rest }: TextProps) {\n return (\n <Typography\n ref={ref}\n data-slot=\"text\"\n Component={Component}\n className={cn(styles.text, className)}\n {...rest}\n />\n );\n}\n\nText.displayName = 'Text';\n",".button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n box-sizing: border-box;\n max-inline-size: 100%;\n min-inline-size: 80px;\n border: none;\n /* one radius for every size and platform (override with --tgui--button-radius) */\n border-radius: var(--tgui--button-radius, var(--tgui--radius));\n text-decoration: none;\n}\n\n.stretched {\n inline-size: 100%;\n flex-grow: 1;\n}\n\n.button:focus-visible {\n outline: var(--tgui--focus-ring);\n outline-offset: var(--tgui--focus-ring-offset);\n}\n\n.button::after {\n content: \"\";\n position: absolute;\n inset: 0;\n border-radius: inherit;\n opacity: 0;\n background: var(--tgui--bg);\n transition: opacity 0.15s ease-out;\n}\n\n@media (hover: hover) and (pointer: fine) {\n .button:not([data-disabled]):hover::after {\n opacity: var(--tgui--button-wash-opacity);\n }\n}\n\n.before,\n.after {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.content {\n display: flex;\n flex: 0 1 auto;\n min-inline-size: 0;\n align-items: center;\n justify-content: center;\n z-index: var(--tgui--z-base);\n}\n\n.label {\n min-inline-size: 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n\n.content svg {\n display: block;\n}\n\n.button[data-loading] {\n pointer-events: none;\n}\n\n.button[data-loading] .before,\n.button[data-loading] .after,\n.button[data-loading] .content {\n opacity: 0;\n}\n\n.spinner {\n position: absolute;\n color: var(--tgui--button-spinner-color);\n}\n\n.size-s {\n height: 36px;\n min-width: 34px;\n gap: 6px;\n padding: 8px 12px;\n}\n\n.size-m {\n height: 42px;\n min-width: 42px;\n gap: 8px;\n padding: 8px 14px;\n}\n\n.size-l {\n height: 50px;\n gap: 10px;\n padding: 10px 20px;\n}\n\n.ios::after {\n content: none;\n}\n\n.mode-filled {\n --tgui--button-wash-opacity: 0.15;\n --tgui--button-spinner-color: var(--tgui--accent-label);\n color: var(--tgui--accent-label);\n background: var(--tgui--accent-strong);\n}\n\n.mode-bezeled {\n --tgui--button-wash-opacity: 0.07;\n --tgui--button-spinner-color: var(--tgui--link-strong);\n color: var(--tgui--link-strong);\n background: var(--tgui--accent-fill);\n}\n\n.mode-plain {\n --tgui--button-wash-opacity: 0.03;\n --tgui--button-spinner-color: var(--tgui--label);\n color: var(--tgui--link-strong);\n background: transparent;\n}\n\n.mode-gray {\n --tgui--button-wash-opacity: 0.5;\n --tgui--button-spinner-color: var(--tgui--label);\n color: var(--tgui--label);\n background: var(--tgui--fill-tertiary);\n}\n\n.mode-outline {\n --tgui--button-wash-opacity: 0.5;\n --tgui--button-spinner-color: var(--tgui--label);\n color: var(--tgui--label);\n background: transparent;\n box-shadow: 0 0 0 1px var(--tgui--separator);\n}\n\n.mode-white {\n --tgui--button-wash-opacity: 0.5;\n --tgui--button-spinner-color: var(--tgui--label);\n color: var(--tgui--black);\n background: var(--tgui--white);\n}\n","import { cva } from 'class-variance-authority';\nimport type { TguiPlatform } from '../../shared/types/tgui';\nimport styles from './Button.module.css';\n\nexport type ButtonMode = 'filled' | 'bezeled' | 'plain' | 'gray' | 'outline' | 'white';\nexport type ButtonSize = 's' | 'm' | 'l';\n\nexport const button = cva(styles.button, {\n variants: {\n mode: {\n filled: styles['mode-filled'],\n bezeled: styles['mode-bezeled'],\n plain: styles['mode-plain'],\n gray: styles['mode-gray'],\n outline: styles['mode-outline'],\n white: styles['mode-white'],\n },\n size: {\n s: styles['size-s'],\n m: styles['size-m'],\n l: styles['size-l'],\n },\n stretched: { true: styles.stretched },\n platform: { ios: styles.ios, base: null },\n },\n defaultVariants: { mode: 'filled', size: 'm' },\n});\n\nexport type ButtonVariantInput = {\n mode?: ButtonMode;\n size?: ButtonSize;\n stretched?: boolean;\n platform: TguiPlatform;\n};\n","'use client';\n\nimport type { AllHTMLAttributes, ElementType, ReactNode, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { Spinner } from '../Spinner';\nimport { Subheadline } from '../Subheadline';\nimport { Tappable } from '../Tappable';\nimport { Text } from '../Text';\nimport { useTgui } from '../TguiProvider';\nimport styles from './Button.module.css';\nimport { type ButtonMode, type ButtonSize, button } from './Button.variants';\n\nexport interface ButtonProps extends Omit<AllHTMLAttributes<HTMLElement>, 'size'> {\n ref?: Ref<HTMLElement>;\n Component?: ElementType;\n mode?: ButtonMode;\n size?: ButtonSize;\n stretched?: boolean;\n loading?: boolean;\n before?: ReactNode;\n after?: ReactNode;\n}\n\nfunction Label({ size, children }: { size: ButtonSize; children: ReactNode }) {\n // Text / Subheadline are used for their type step only – the label is not a\n // heading, so force a span.\n const shared = { weight: '2', Component: 'span', className: styles.content } as const;\n const inner = (\n <span data-slot=\"button-label\" className={styles.label}>\n {children}\n </span>\n );\n return size === 'l' ? (\n <Text {...shared}>{inner}</Text>\n ) : (\n <Subheadline level=\"2\" {...shared}>\n {inner}\n </Subheadline>\n );\n}\n\nexport function Button({\n ref,\n Component = 'button',\n mode = 'filled',\n size = 'm',\n stretched = false,\n loading = false,\n type,\n before,\n after,\n children,\n className,\n ...rest\n}: ButtonProps) {\n const { platform } = useTgui();\n\n return (\n <Tappable\n ref={ref}\n Component={Component}\n type={Component === 'button' ? (type ?? 'button') : type}\n data-slot=\"button\"\n data-loading={loading || undefined}\n aria-busy={loading || undefined}\n className={cn(button({ mode, size, stretched, platform }), className)}\n {...rest}\n >\n {loading ? (\n <Spinner size=\"s\" data-slot=\"button-spinner\" className={styles.spinner} aria-hidden />\n ) : null}\n {before ? (\n <span data-slot=\"button-before\" className={styles.before}>\n {before}\n </span>\n ) : null}\n <Label size={size}>{children}</Label>\n {after ? (\n <span data-slot=\"button-after\" className={styles.after}>\n {after}\n </span>\n ) : null}\n </Tappable>\n );\n}\n\nButton.displayName = 'Button';\n",".callout {\n font-size: var(--tgui--font-callout-size);\n line-height: var(--tgui--font-callout-line);\n letter-spacing: var(--tgui--font-callout-tracking);\n}\n","import type { Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { Typography, type TypographyProps } from '../Typography';\nimport styles from './Callout.module.css';\n\nexport interface CalloutProps extends TypographyProps {\n ref?: Ref<HTMLElement>;\n}\n\nexport function Callout({ ref, className, Component = 'span', ...rest }: CalloutProps) {\n return (\n <Typography\n data-slot=\"callout\"\n ref={ref}\n Component={Component}\n className={cn(styles.callout, className)}\n {...rest}\n />\n );\n}\n\nCallout.displayName = 'Callout';\n",".level-1 {\n font-size: var(--tgui--font-caption-1-size);\n line-height: var(--tgui--font-caption-1-line);\n letter-spacing: var(--tgui--font-caption-1-tracking);\n}\n\n.level-2 {\n font-size: var(--tgui--font-caption-2-size);\n line-height: var(--tgui--font-caption-2-line);\n letter-spacing: var(--tgui--font-caption-2-tracking);\n}\n","import { cva } from 'class-variance-authority';\nimport styles from './Caption.module.css';\n\nexport type CaptionLevel = '1' | '2';\n\nexport const caption = cva('', {\n variants: {\n level: {\n '1': styles['level-1'],\n '2': styles['level-2'],\n },\n },\n defaultVariants: { level: '1' },\n});\n","import type { Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { Typography, type TypographyProps } from '../Typography';\nimport { type CaptionLevel, caption } from './Caption.variants';\n\nexport interface CaptionProps extends TypographyProps {\n ref?: Ref<HTMLElement>;\n level?: CaptionLevel;\n}\n\nexport function Caption({ ref, level, Component = 'span', className, ...rest }: CaptionProps) {\n return (\n <Typography\n data-slot=\"caption\"\n ref={ref}\n Component={Component}\n className={cn(caption({ level }), className)}\n {...rest}\n />\n );\n}\n\nCaption.displayName = 'Caption';\n","import { createContext } from 'react';\n\nexport type CardType = 'plain' | 'ambient';\n\nexport const CardContext = createContext<{ type: CardType }>({ type: 'plain' });\n",".card {\n position: relative;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n border-radius: 20px;\n background: var(--tgui--surface-bg);\n box-shadow:\n 0 32px 64px 0 rgba(0, 0, 0, 0.04),\n 0 0 2px 1px rgba(0, 0, 0, 0.02);\n}\n\n.card > * {\n flex-shrink: 0;\n}\n\n.cardAmbient {\n background: var(--tgui--black);\n}\n\n.cell {\n padding: 0 20px;\n background: var(--tgui--surface-bg);\n}\n\n.cellAmbient {\n --tgui--cell-middle-padding: 12px 0;\n\n position: absolute;\n inset: auto 0 0 0;\n padding-top: 64px;\n padding-bottom: 4px;\n background: linear-gradient(\n 180deg,\n rgba(0, 0, 0, 0) 0%,\n rgba(0, 0, 0, 0.12) 22%,\n rgba(0, 0, 0, 0.55) 62%,\n rgba(0, 0, 0, 0.85) 100%\n );\n color: var(--tgui--white);\n}\n\n.cellHeader {\n font-weight: var(--tgui--weight-semibold);\n}\n\n.cellSubtitle {\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n}\n\n.cellAmbient .cellHeader {\n color: var(--tgui--white);\n}\n\n.cellAmbient .cellSubtitle {\n color: rgba(255, 255, 255, 0.8);\n}\n",".cell {\n --tgui--cell-middle-padding: 16px 0;\n\n display: flex;\n align-items: center;\n gap: 24px;\n padding: 0 24px;\n}\n\n.before,\n.after {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.middle {\n flex-grow: 1;\n min-inline-size: 0;\n max-inline-size: 100%;\n padding: var(--tgui--cell-middle-padding);\n\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.middle > *,\n.title {\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n\n.multiline .middle > *,\n.multiline .title {\n white-space: normal;\n}\n\n.head {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n}\n\n.subhead {\n color: var(--tgui--label-secondary);\n}\n\n.hint,\n.subtitle,\n.description {\n color: var(--tgui--label-secondary);\n}\n\n/* row press / hover highlight – a clear tint, distinct from the grouped canvas */\n.cell {\n --tgui--cell-highlight: var(--tgui--fill);\n}\n\n@supports (color: color-mix(in srgb, red 10%, transparent)) {\n .cell {\n --tgui--cell-highlight: color-mix(in srgb, var(--tgui--label) 9%, transparent);\n }\n}\n\n.hovered,\n.interactive:not([data-disabled]):active {\n background: var(--tgui--cell-highlight);\n}\n\n/* inset – a row is flush to the card edge, an outset ring would be clipped */\n.interactive:focus-visible {\n outline: var(--tgui--focus-ring);\n outline-offset: calc(-1 * var(--tgui--focus-ring-offset));\n}\n\n.ios {\n --tgui--cell-middle-padding: 12px 0;\n gap: 16px;\n padding: 0 16px;\n}\n\n@media (hover: hover) and (pointer: fine) {\n .interactive:not([data-disabled]):hover {\n background: var(--tgui--cell-highlight);\n }\n}\n","import { cva } from 'class-variance-authority';\nimport styles from './Cell.module.css';\n\nexport const cell = cva(styles.cell, {\n variants: {\n platform: { ios: styles.ios, base: null },\n hovered: { true: styles.hovered },\n interactive: { true: styles.interactive },\n multiline: { true: styles.multiline },\n },\n});\n","'use client';\n\nimport type { ElementType, ReactNode, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { Caption } from '../Caption';\nimport { Subheadline } from '../Subheadline';\nimport { Tappable, type TappableProps } from '../Tappable';\nimport { Text } from '../Text';\nimport { useTgui } from '../TguiProvider';\nimport styles from './Cell.module.css';\nimport { cell } from './Cell.variants';\n\nexport interface CellProps extends Omit<TappableProps, 'Component'> {\n ref?: Ref<HTMLElement>;\n Component?: ElementType;\n subhead?: ReactNode;\n hint?: ReactNode;\n titleBadge?: ReactNode;\n subtitle?: ReactNode;\n description?: ReactNode;\n before?: ReactNode;\n after?: ReactNode;\n hovered?: boolean;\n multiline?: boolean;\n}\n\n// a row is not a document section: text slots render as spans\nfunction CellTitle({ ios, children }: { ios: boolean; children: ReactNode }) {\n return ios ? (\n <Text Component=\"span\" className={styles.head}>\n {children}\n </Text>\n ) : (\n <Subheadline Component=\"span\" level=\"1\" className={styles.head}>\n {children}\n </Subheadline>\n );\n}\n\nfunction CellDescription({ ios, children }: { ios: boolean; children: ReactNode }) {\n return ios ? (\n <Caption Component=\"span\" className={styles.description}>\n {children}\n </Caption>\n ) : (\n <Subheadline Component=\"span\" level=\"2\" className={styles.description}>\n {children}\n </Subheadline>\n );\n}\n\nexport function Cell({\n ref,\n Component = 'div',\n subhead,\n children,\n hint,\n titleBadge,\n subtitle,\n description,\n before,\n after,\n hovered,\n multiline,\n className,\n ...rest\n}: CellProps) {\n const { platform } = useTgui();\n const ios = platform === 'ios';\n const hasTitle = children != null || hint != null || titleBadge != null;\n const interactive =\n rest.onClick != null ||\n rest.href != null ||\n Component === 'a' ||\n Component === 'button' ||\n Component === 'label';\n\n return (\n <Tappable\n ref={ref}\n Component={Component}\n // a list row highlights its background – it never dims like a button\n interactiveAnimation={ios ? 'none' : 'background'}\n data-slot=\"cell\"\n className={cn(cell({ platform, hovered, multiline, interactive }), className)}\n {...rest}\n >\n {before != null ? (\n <div data-slot=\"cell-before\" className={styles.before}>\n {before}\n </div>\n ) : null}\n\n <div data-slot=\"cell-content\" className={styles.middle}>\n {subhead != null ? (\n <Subheadline Component=\"span\" level=\"2\" className={styles.subhead}>\n {subhead}\n </Subheadline>\n ) : null}\n\n {hasTitle ? (\n <CellTitle ios={ios}>\n {children != null ? <span className={styles.title}>{children}</span> : null}\n {hint != null ? <span className={styles.hint}>{hint}</span> : null}\n {titleBadge}\n </CellTitle>\n ) : null}\n\n {subtitle != null ? (\n <Subheadline Component=\"span\" level=\"2\" className={styles.subtitle}>\n {subtitle}\n </Subheadline>\n ) : null}\n\n {description != null ? <CellDescription ios={ios}>{description}</CellDescription> : null}\n </div>\n\n {after != null ? (\n <div data-slot=\"cell-after\" className={styles.after}>\n {after}\n </div>\n ) : null}\n </Tappable>\n );\n}\n\nCell.displayName = 'Cell';\n","'use client';\n\nimport { type Ref, useContext } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { Cell, type CellProps } from '../Cell';\nimport { CardContext } from './Card.context';\nimport styles from './Card.module.css';\n\nexport interface CardCellProps extends CellProps {\n ref?: Ref<HTMLElement>;\n}\n\nexport function CardCell({ ref, children, subtitle, className, ...rest }: CardCellProps) {\n const { type } = useContext(CardContext);\n const ambient = type === 'ambient';\n\n return (\n <Cell\n ref={ref}\n data-slot=\"card-cell\"\n className={cn(styles.cell, ambient && styles.cellAmbient, className)}\n subtitle={\n subtitle != null ? (\n <span data-slot=\"card-cell-subtitle\" className={styles.cellSubtitle}>\n {subtitle}\n </span>\n ) : undefined\n }\n {...rest}\n >\n {children != null ? (\n <span data-slot=\"card-cell-title\" className={styles.cellHeader}>\n {children}\n </span>\n ) : null}\n </Cell>\n );\n}\n\nCardCell.displayName = 'CardCell';\n","'use client';\n\nimport { type HTMLAttributes, type Ref, useMemo } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { CardContext, type CardType } from './Card.context';\nimport styles from './Card.module.css';\nimport { CardCell } from './CardCell';\n\nexport interface CardProps extends HTMLAttributes<HTMLElement> {\n ref?: Ref<HTMLElement>;\n type?: CardType;\n}\n\nexport function Card({ ref, type = 'plain', className, children, ...rest }: CardProps) {\n const context = useMemo(() => ({ type }), [type]);\n\n return (\n <CardContext.Provider value={context}>\n <article\n ref={ref}\n data-slot=\"card\"\n data-type={type}\n className={cn(styles.card, type === 'ambient' && styles.cardAmbient, className)}\n {...rest}\n >\n {children}\n </article>\n </CardContext.Provider>\n );\n}\n\nCard.displayName = 'Card';\nCard.Cell = CardCell;\n",".checkbox {\n position: relative;\n display: inline-flex;\n cursor: pointer;\n}\n\n.checkbox[data-disabled] {\n cursor: default;\n opacity: 0.3;\n}\n\n.input {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n margin: 0;\n opacity: 0;\n cursor: inherit;\n}\n\n.box {\n position: relative;\n width: 20px;\n height: 20px;\n border-radius: 6px;\n box-shadow: inset 0 0 0 2px var(--tgui--separator);\n pointer-events: none;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .box {\n transition:\n box-shadow 0.15s ease-out,\n background 0.15s ease-out;\n }\n}\n\n.input:checked + .box,\n.input:indeterminate + .box {\n background: var(--tgui--link);\n box-shadow: none;\n}\n\n.input:focus-visible + .box {\n box-shadow: var(--tgui--focus-ring-shadow);\n}\n\n.input:checked + .box::after {\n content: \"\";\n position: absolute;\n left: 7px;\n top: 3px;\n width: 5px;\n height: 9px;\n border: solid var(--tgui--accent-label);\n border-width: 0 2px 2px 0;\n transform: rotate(45deg);\n}\n\n.input:indeterminate + .box::after {\n content: \"\";\n position: absolute;\n left: 4px;\n top: 9px;\n width: 12px;\n height: 2px;\n background: var(--tgui--accent-label);\n}\n","import { type ChangeEvent, type InputHTMLAttributes, type Ref, useEffect, useRef } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { useHaptic } from '../TguiProvider';\nimport styles from './Checkbox.module.css';\n\nexport interface CheckboxProps extends InputHTMLAttributes<HTMLInputElement> {\n ref?: Ref<HTMLInputElement>;\n indeterminate?: boolean;\n}\n\nexport function Checkbox({\n ref,\n indeterminate = false,\n disabled,\n className,\n style,\n onChange,\n ...rest\n}: CheckboxProps) {\n const inner = useRef<HTMLInputElement>(null);\n const haptic = useHaptic();\n\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n haptic('select');\n onChange?.(event);\n };\n\n useEffect(() => {\n if (inner.current) inner.current.indeterminate = indeterminate;\n }, [indeterminate]);\n\n const mergeRef = (node: HTMLInputElement | null) => {\n inner.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) ref.current = node;\n };\n\n return (\n <span\n data-slot=\"checkbox\"\n className={cn(styles.checkbox, className)}\n style={style}\n data-disabled={disabled || undefined}\n >\n <input\n ref={mergeRef}\n type=\"checkbox\"\n data-slot=\"checkbox-input\"\n className={styles.input}\n disabled={disabled}\n onChange={handleChange}\n {...rest}\n />\n <span className={styles.box} data-slot=\"checkbox-indicator\" aria-hidden />\n </span>\n );\n}\n\nCheckbox.displayName = 'Checkbox';\n",".chip {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n box-sizing: border-box;\n min-height: 32px;\n padding: 4px 12px;\n border: 0;\n border-radius: 16px;\n color: var(--tgui--label);\n font-family: var(--tgui--font-family);\n font-size: 14px;\n line-height: 18px;\n}\n\n.mode-elevated {\n background: var(--tgui--fill);\n box-shadow: 0 1px 4px rgb(0 0 0 / 0.1);\n}\n\n.mode-outline {\n background: transparent;\n box-shadow: inset 0 0 0 1px var(--tgui--separator);\n}\n\n.clickable {\n cursor: pointer;\n user-select: none;\n}\n\n.clickable:focus-visible,\n.remove:focus-visible {\n outline: var(--tgui--focus-ring);\n outline-offset: var(--tgui--focus-ring-offset);\n}\n\n@media (hover: hover) and (pointer: fine) {\n .clickable:not([data-disabled]):hover {\n opacity: 0.85;\n }\n}\n\n.before,\n.after {\n display: inline-flex;\n align-items: center;\n margin-inline-start: -2px;\n}\n\n.after {\n margin-inline-start: 0;\n margin-inline-end: -4px;\n}\n\n.label {\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n\n.remove {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n width: 18px;\n height: 18px;\n margin-inline-end: -4px;\n padding: 0;\n border: 0;\n border-radius: 50%;\n color: var(--tgui--label-tertiary);\n background: transparent;\n cursor: pointer;\n}\n\n@media (hover: hover) and (pointer: fine) {\n .remove:hover {\n opacity: 0.6;\n }\n}\n","import { cva } from 'class-variance-authority';\nimport styles from './Chip.module.css';\n\nexport type ChipMode = 'elevated' | 'outline';\n\nexport const chip = cva(styles.chip, {\n variants: {\n mode: {\n elevated: styles['mode-elevated'],\n outline: styles['mode-outline'],\n },\n clickable: { true: styles.clickable },\n },\n defaultVariants: { mode: 'elevated' },\n});\n","import type { AllHTMLAttributes, ElementType, ReactNode, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { useHaptic } from '../TguiProvider';\nimport styles from './Chip.module.css';\nimport { type ChipMode, chip } from './Chip.variants';\n\nexport type { ChipMode };\n\nexport interface ChipProps extends Omit<AllHTMLAttributes<HTMLElement>, 'onClick'> {\n ref?: Ref<HTMLElement>;\n Component?: ElementType;\n mode?: ChipMode;\n before?: ReactNode;\n after?: ReactNode;\n onClick?: () => void;\n onRemove?: () => void;\n removeLabel?: string;\n}\n\nexport function Chip({\n ref,\n Component = 'div',\n mode = 'elevated',\n before,\n after,\n onClick,\n onRemove,\n removeLabel = 'Remove',\n className,\n children,\n ...rest\n}: ChipProps) {\n const clickable = onClick != null;\n const haptic = useHaptic();\n\n return (\n <Component\n ref={ref}\n data-slot=\"chip\"\n className={cn(chip({ mode, clickable }), className)}\n onClick={\n onClick == null\n ? undefined\n : () => {\n haptic('tap');\n onClick();\n }\n }\n {...rest}\n >\n {before != null ? (\n <span data-slot=\"chip-before\" className={styles.before}>\n {before}\n </span>\n ) : null}\n <span data-slot=\"chip-label\" className={styles.label}>\n {children}\n </span>\n {onRemove != null ? (\n <button\n type=\"button\"\n data-slot=\"chip-remove\"\n className={styles.remove}\n aria-label={removeLabel}\n onClick={(event) => {\n event.stopPropagation();\n haptic('tap');\n onRemove();\n }}\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" aria-hidden>\n <path\n d=\"M3 3l6 6M9 3l-6 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n ) : after != null ? (\n <span data-slot=\"chip-after\" className={styles.after}>\n {after}\n </span>\n ) : null}\n </Component>\n );\n}\n\nChip.displayName = 'Chip';\n",".root {\n display: inline-flex;\n color: var(--tgui--link);\n}\n\n.svg {\n display: block;\n}\n\n.track {\n stroke: var(--tgui--fill);\n}\n\n.indicator {\n stroke: currentColor;\n transform: rotate(-90deg);\n transform-origin: 50% 50%;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .indicator {\n transition: stroke-dashoffset 0.25s ease;\n }\n}\n","export type CircularProgressSize = 's' | 'm' | 'l';\n\nexport const DIMENSION: Record<CircularProgressSize, number> = { s: 20, m: 28, l: 36 };\nexport const STROKE: Record<CircularProgressSize, number> = { s: 2, m: 2.5, l: 3 };\n","import type { HTMLAttributes, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './CircularProgress.module.css';\nimport { type CircularProgressSize, DIMENSION, STROKE } from './CircularProgress.variants';\n\nexport type { CircularProgressSize };\n\nexport interface CircularProgressProps extends Omit<HTMLAttributes<HTMLSpanElement>, 'size'> {\n ref?: Ref<HTMLSpanElement>;\n value?: number;\n size?: CircularProgressSize;\n}\n\nexport function CircularProgress({\n ref,\n value = 0,\n size = 'm',\n className,\n 'aria-label': ariaLabel,\n ...rest\n}: CircularProgressProps) {\n const clamped = Math.max(0, Math.min(100, value));\n const dimension = DIMENSION[size];\n const stroke = STROKE[size];\n const radius = (dimension - stroke) / 2;\n const circumference = 2 * Math.PI * radius;\n const center = dimension / 2;\n\n return (\n <span\n ref={ref}\n role=\"progressbar\"\n aria-label={ariaLabel ?? 'Progress'}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={Math.round(clamped)}\n data-slot=\"circular-progress\"\n className={cn(styles.root, className)}\n {...rest}\n >\n <svg\n className={styles.svg}\n width={dimension}\n height={dimension}\n viewBox={`0 0 ${dimension} ${dimension}`}\n aria-hidden\n >\n <circle\n className={styles.track}\n cx={center}\n cy={center}\n r={radius}\n strokeWidth={stroke}\n fill=\"none\"\n />\n <circle\n className={styles.indicator}\n cx={center}\n cy={center}\n r={radius}\n strokeWidth={stroke}\n strokeLinecap=\"round\"\n strokeDasharray={circumference}\n strokeDashoffset={circumference * (1 - clamped / 100)}\n fill=\"none\"\n />\n </svg>\n </span>\n );\n}\n\nCircularProgress.displayName = 'CircularProgress';\n","var __defProp = Object.defineProperty;\nvar __name = (target, value) => __defProp(target, \"name\", { value, configurable: true });\n\n// src/primitive.tsx\nvar canUseDOM = !!(typeof window !== \"undefined\" && window.document && window.document.createElement);\nfunction composeEventHandlers(originalEventHandler, ourEventHandler, { checkForDefaultPrevented = true } = {}) {\n return /* @__PURE__ */ __name(function handleEvent(event) {\n originalEventHandler?.(event);\n if (checkForDefaultPrevented === false || !event || !event.defaultPrevented) {\n return ourEventHandler?.(event);\n }\n }, \"handleEvent\");\n}\n__name(composeEventHandlers, \"composeEventHandlers\");\nfunction getOwnerWindow(element) {\n if (!canUseDOM) {\n throw new Error(\"Cannot access window outside of the DOM\");\n }\n return element?.ownerDocument?.defaultView ?? window;\n}\n__name(getOwnerWindow, \"getOwnerWindow\");\nfunction getOwnerDocument(element) {\n if (!canUseDOM) {\n throw new Error(\"Cannot access document outside of the DOM\");\n }\n return element?.ownerDocument ?? document;\n}\n__name(getOwnerDocument, \"getOwnerDocument\");\nfunction getActiveElement(node, activeDescendant = false) {\n const { activeElement } = getOwnerDocument(node);\n if (!activeElement?.nodeName) {\n return null;\n }\n if (isFrame(activeElement) && activeElement.contentDocument) {\n return getActiveElement(activeElement.contentDocument.body, activeDescendant);\n }\n if (activeDescendant) {\n const id = activeElement.getAttribute(\"aria-activedescendant\");\n if (id) {\n const element = getOwnerDocument(activeElement).getElementById(id);\n if (element) {\n return element;\n }\n }\n }\n return activeElement;\n}\n__name(getActiveElement, \"getActiveElement\");\nfunction isFrame(element) {\n return element.tagName === \"IFRAME\";\n}\n__name(isFrame, \"isFrame\");\nexport {\n canUseDOM,\n composeEventHandlers,\n getActiveElement,\n getOwnerDocument,\n getOwnerWindow,\n isFrame\n};\n//# sourceMappingURL=index.mjs.map\n","var __defProp = Object.defineProperty;\nvar __name = (target, value) => __defProp(target, \"name\", { value, configurable: true });\n\n// src/compose-refs.tsx\nimport * as React from \"react\";\nfunction setRef(ref, value) {\n if (typeof ref === \"function\") {\n return ref(value);\n } else if (ref !== null && ref !== void 0) {\n ref.current = value;\n }\n}\n__name(setRef, \"setRef\");\nfunction composeRefs(...refs) {\n return (node) => {\n let hasCleanup = false;\n const cleanups = refs.map((ref) => {\n const cleanup = setRef(ref, node);\n if (!hasCleanup && typeof cleanup == \"function\") {\n hasCleanup = true;\n }\n return cleanup;\n });\n if (hasCleanup) {\n return () => {\n for (let i = 0; i < cleanups.length; i++) {\n const cleanup = cleanups[i];\n if (typeof cleanup == \"function\") {\n cleanup();\n } else {\n setRef(refs[i], null);\n }\n }\n };\n }\n };\n}\n__name(composeRefs, \"composeRefs\");\nfunction useComposedRefs(...refs) {\n return React.useCallback(composeRefs(...refs), refs);\n}\n__name(useComposedRefs, \"useComposedRefs\");\nexport {\n composeRefs,\n useComposedRefs\n};\n//# sourceMappingURL=index.mjs.map\n","var __defProp = Object.defineProperty;\nvar __name = (target, value) => __defProp(target, \"name\", { value, configurable: true });\n\n// src/slot.tsx\nimport * as React from \"react\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\n// @__NO_SIDE_EFFECTS__\nfunction createSlot(ownerName) {\n const Slot2 = React.forwardRef((props, forwardedRef) => {\n let { children, ...slotProps } = props;\n let slottableElement = null;\n let hasSlottable = false;\n const newChildren = [];\n if (isLazyComponent(children) && typeof use === \"function\") {\n children = use(children._payload);\n }\n React.Children.forEach(children, (maybeSlottable) => {\n if (isSlottable(maybeSlottable)) {\n hasSlottable = true;\n const slottable = maybeSlottable;\n let child = \"child\" in slottable.props ? slottable.props.child : slottable.props.children;\n if (isLazyComponent(child) && typeof use === \"function\") {\n child = use(child._payload);\n }\n slottableElement = getSlottableElementFromSlottable(slottable, child);\n newChildren.push(slottableElement?.props?.children);\n } else {\n newChildren.push(maybeSlottable);\n }\n });\n if (slottableElement) {\n slottableElement = React.cloneElement(slottableElement, void 0, newChildren);\n } else if (\n // A `Slottable` was found but it didn't resolve to a single element (e.g.\n // it wrapped multiple elements, text, or a render-prop `child` that\n // wasn't an element). Don't fall back to treating the `Slottable` wrapper\n // itself as the slot target — throw a descriptive error below instead.\n !hasSlottable && React.Children.count(children) === 1 && React.isValidElement(children)\n ) {\n slottableElement = children;\n }\n const slottableElementRef = slottableElement ? getElementRef(slottableElement) : void 0;\n const composedRef = useComposedRefs(forwardedRef, slottableElementRef);\n if (!slottableElement) {\n if (children || children === 0) {\n throw new Error(\n hasSlottable ? createSlottableError(ownerName) : createSlotError(ownerName)\n );\n }\n return children;\n }\n const mergedProps = mergeProps(slotProps, slottableElement.props ?? {});\n if (slottableElement.type !== React.Fragment) {\n mergedProps.ref = forwardedRef ? composedRef : slottableElementRef;\n }\n return React.cloneElement(slottableElement, mergedProps);\n });\n Slot2.displayName = `${ownerName}.Slot`;\n return Slot2;\n}\n__name(createSlot, \"createSlot\");\nvar Slot = /* @__PURE__ */ createSlot(\"Slot\");\nvar SLOTTABLE_IDENTIFIER = Symbol.for(\"radix.slottable\");\n// @__NO_SIDE_EFFECTS__\nfunction createSlottable(ownerName) {\n const Slottable2 = /* @__PURE__ */ __name((props) => \"child\" in props ? props.children(props.child) : props.children, \"Slottable\");\n Slottable2.displayName = `${ownerName}.Slottable`;\n Slottable2.__radixId = SLOTTABLE_IDENTIFIER;\n return Slottable2;\n}\n__name(createSlottable, \"createSlottable\");\nvar Slottable = /* @__PURE__ */ createSlottable(\"Slottable\");\nvar getSlottableElementFromSlottable = /* @__PURE__ */ __name((slottable, child) => {\n if (\"child\" in slottable.props) {\n const child2 = slottable.props.child;\n if (!React.isValidElement(child2)) return null;\n return React.cloneElement(child2, void 0, slottable.props.children(child2.props.children));\n }\n return React.isValidElement(child) ? child : null;\n}, \"getSlottableElementFromSlottable\");\nfunction mergeProps(slotProps, childProps) {\n const overrideProps = { ...childProps };\n for (const propName in childProps) {\n const slotPropValue = slotProps[propName];\n const childPropValue = childProps[propName];\n const isHandler = /^on[A-Z]/.test(propName);\n if (isHandler) {\n if (slotPropValue && childPropValue) {\n overrideProps[propName] = (...args) => {\n const result = childPropValue(...args);\n slotPropValue(...args);\n return result;\n };\n } else if (slotPropValue) {\n overrideProps[propName] = slotPropValue;\n }\n } else if (propName === \"style\") {\n overrideProps[propName] = { ...slotPropValue, ...childPropValue };\n } else if (propName === \"className\") {\n overrideProps[propName] = [slotPropValue, childPropValue].filter(Boolean).join(\" \");\n }\n }\n return { ...slotProps, ...overrideProps };\n}\n__name(mergeProps, \"mergeProps\");\nfunction getElementRef(element) {\n let getter = Object.getOwnPropertyDescriptor(element.props, \"ref\")?.get;\n let mayWarn = getter && \"isReactWarning\" in getter && getter.isReactWarning;\n if (mayWarn) {\n return element.ref;\n }\n getter = Object.getOwnPropertyDescriptor(element, \"ref\")?.get;\n mayWarn = getter && \"isReactWarning\" in getter && getter.isReactWarning;\n if (mayWarn) {\n return element.props.ref;\n }\n return element.props.ref || element.ref;\n}\n__name(getElementRef, \"getElementRef\");\nfunction isSlottable(child) {\n return React.isValidElement(child) && typeof child.type === \"function\" && \"__radixId\" in child.type && child.type.__radixId === SLOTTABLE_IDENTIFIER;\n}\n__name(isSlottable, \"isSlottable\");\nvar REACT_LAZY_TYPE = Symbol.for(\"react.lazy\");\nfunction isLazyComponent(element) {\n return element != null && typeof element === \"object\" && \"$$typeof\" in element && element.$$typeof === REACT_LAZY_TYPE && \"_payload\" in element && isPromiseLike(element._payload);\n}\n__name(isLazyComponent, \"isLazyComponent\");\nfunction isPromiseLike(value) {\n return typeof value === \"object\" && value !== null && \"then\" in value;\n}\n__name(isPromiseLike, \"isPromiseLike\");\nvar createSlotError = /* @__PURE__ */ __name((ownerName) => {\n return `${ownerName} failed to slot onto its children. Expected a single React element child or \\`Slottable\\`.`;\n}, \"createSlotError\");\nvar createSlottableError = /* @__PURE__ */ __name((ownerName) => {\n return `${ownerName} failed to slot onto its \\`Slottable\\`. Expected \\`Slottable\\` to receive a single React element child.`;\n}, \"createSlottableError\");\nvar use = React[\" use \".trim().toString()];\nexport {\n Slot as Root,\n Slot,\n Slottable,\n createSlot,\n createSlottable\n};\n//# sourceMappingURL=index.mjs.map\n","var __defProp = Object.defineProperty;\nvar __name = (target, value) => __defProp(target, \"name\", { value, configurable: true });\n\n// src/primitive.tsx\nimport * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport { createSlot } from \"@radix-ui/react-slot\";\nimport { jsx } from \"react/jsx-runtime\";\nvar NODES = [\n \"a\",\n \"button\",\n \"div\",\n \"form\",\n \"h2\",\n \"h3\",\n \"img\",\n \"input\",\n \"label\",\n \"li\",\n \"nav\",\n \"ol\",\n \"p\",\n \"select\",\n \"span\",\n \"svg\",\n \"ul\"\n];\nvar Primitive = NODES.reduce((primitive, node) => {\n const Slot = createSlot(`Primitive.${node}`);\n const Node = React.forwardRef((props, forwardedRef) => {\n const { asChild, ...primitiveProps } = props;\n const Comp = asChild ? Slot : node;\n if (typeof window !== \"undefined\") {\n window[Symbol.for(\"radix-ui\")] = true;\n }\n return /* @__PURE__ */ jsx(Comp, { ...primitiveProps, ref: forwardedRef });\n });\n Node.displayName = `Primitive.${node}`;\n return { ...primitive, [node]: Node };\n}, {});\nfunction dispatchDiscreteCustomEvent(target, event) {\n if (target) ReactDOM.flushSync(() => target.dispatchEvent(event));\n}\n__name(dispatchDiscreteCustomEvent, \"dispatchDiscreteCustomEvent\");\nvar Root = Primitive;\nexport {\n Primitive,\n Root,\n dispatchDiscreteCustomEvent\n};\n//# sourceMappingURL=index.mjs.map\n","var __defProp = Object.defineProperty;\nvar __name = (target, value) => __defProp(target, \"name\", { value, configurable: true });\n\n// src/use-callback-ref.tsx\nimport * as React from \"react\";\nfunction useCallbackRef(callback) {\n const callbackRef = React.useRef(callback);\n React.useEffect(() => {\n callbackRef.current = callback;\n });\n return React.useMemo(() => ((...args) => callbackRef.current?.(...args)), []);\n}\n__name(useCallbackRef, \"useCallbackRef\");\nexport {\n useCallbackRef\n};\n//# sourceMappingURL=index.mjs.map\n","\"use client\";\nvar __defProp = Object.defineProperty;\nvar __name = (target, value) => __defProp(target, \"name\", { value, configurable: true });\n\n// src/dismissable-layer.tsx\nimport * as React from \"react\";\nimport { composeEventHandlers } from \"@radix-ui/primitive\";\nimport { Primitive, dispatchDiscreteCustomEvent } from \"@radix-ui/react-primitive\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { useCallbackRef } from \"@radix-ui/react-use-callback-ref\";\nimport { jsx } from \"react/jsx-runtime\";\nvar CONTEXT_UPDATE = \"dismissableLayer.update\";\nvar POINTER_DOWN_OUTSIDE = \"dismissableLayer.pointerDownOutside\";\nvar FOCUS_OUTSIDE = \"dismissableLayer.focusOutside\";\nvar originalBodyPointerEvents;\nvar DismissableLayerContext = React.createContext({\n layers: /* @__PURE__ */ new Set(),\n layersWithOutsidePointerEventsDisabled: /* @__PURE__ */ new Set(),\n branches: /* @__PURE__ */ new Set(),\n // Outside elements that belong to a layer's own dismiss affordance (eg, a\n // dialog overlay). Pressing them should dismiss the layer regardless of\n // whether or not they stop propagation.\n //\n // See https://github.com/radix-ui/primitives/issues/3346\n dismissableSurfaces: /* @__PURE__ */ new Set()\n});\nvar DismissableLayer = /* @__PURE__ */ React.forwardRef(\n // blank line to reduce diff noise\n /* @__PURE__ */ __name(function DismissableLayer2(props, forwardedRef) {\n const {\n disableOutsidePointerEvents = false,\n deferPointerDownOutside = false,\n onEscapeKeyDown,\n onPointerDownOutside,\n onFocusOutside,\n onInteractOutside,\n onDismiss,\n ...layerProps\n } = props;\n const context = React.useContext(DismissableLayerContext);\n const [node, setNode] = React.useState(null);\n const ownerDocument = node?.ownerDocument ?? globalThis?.document;\n const [, force] = React.useState({});\n const composedRefs = useComposedRefs(forwardedRef, setNode);\n const layers = Array.from(context.layers);\n const [highestLayerWithOutsidePointerEventsDisabled] = [\n ...context.layersWithOutsidePointerEventsDisabled\n ].slice(-1);\n const highestLayerWithOutsidePointerEventsDisabledIndex = highestLayerWithOutsidePointerEventsDisabled ? layers.indexOf(highestLayerWithOutsidePointerEventsDisabled) : -1;\n const index = node ? layers.indexOf(node) : -1;\n const isBodyPointerEventsDisabled = context.layersWithOutsidePointerEventsDisabled.size > 0;\n const isPointerEventsEnabled = index >= highestLayerWithOutsidePointerEventsDisabledIndex;\n const isDeferredPointerDownOutsideRef = React.useRef(false);\n const pointerDownOutside = usePointerDownOutside(\n (event) => {\n onPointerDownOutside?.(event);\n onInteractOutside?.(event);\n if (!event.defaultPrevented) onDismiss?.();\n },\n {\n ownerDocument,\n deferPointerDownOutside,\n isDeferredPointerDownOutsideRef,\n dismissableSurfaces: context.dismissableSurfaces,\n shouldHandlePointerDownOutside: React.useCallback(\n (target) => {\n if (!(target instanceof Node)) {\n return false;\n }\n const isPointerDownOnBranch = [...context.branches].some(\n (branch) => branch.contains(target)\n );\n return isPointerEventsEnabled && !isPointerDownOnBranch;\n },\n [context.branches, isPointerEventsEnabled]\n )\n }\n );\n const focusOutside = useFocusOutside((event) => {\n if (deferPointerDownOutside && isDeferredPointerDownOutsideRef.current) {\n return;\n }\n const target = event.target;\n const isFocusInBranch = [...context.branches].some((branch) => branch.contains(target));\n if (isFocusInBranch) return;\n onFocusOutside?.(event);\n onInteractOutside?.(event);\n if (!event.defaultPrevented) onDismiss?.();\n }, ownerDocument);\n const isHighestLayer = node ? index === layers.length - 1 : false;\n const handleKeyDown = useCallbackRef((event) => {\n if (event.key !== \"Escape\") {\n return;\n }\n onEscapeKeyDown?.(event);\n if (!event.defaultPrevented && onDismiss) {\n event.preventDefault();\n onDismiss();\n }\n });\n React.useEffect(() => {\n if (!isHighestLayer) {\n return;\n }\n ownerDocument.addEventListener(\"keydown\", handleKeyDown, { capture: true });\n return () => ownerDocument.removeEventListener(\"keydown\", handleKeyDown, { capture: true });\n }, [ownerDocument, isHighestLayer, handleKeyDown]);\n React.useEffect(() => {\n if (!node) return;\n if (disableOutsidePointerEvents) {\n if (context.layersWithOutsidePointerEventsDisabled.size === 0) {\n originalBodyPointerEvents = ownerDocument.body.style.pointerEvents;\n ownerDocument.body.style.pointerEvents = \"none\";\n }\n context.layersWithOutsidePointerEventsDisabled.add(node);\n }\n context.layers.add(node);\n dispatchUpdate();\n return () => {\n if (disableOutsidePointerEvents) {\n context.layersWithOutsidePointerEventsDisabled.delete(node);\n if (context.layersWithOutsidePointerEventsDisabled.size === 0) {\n ownerDocument.body.style.pointerEvents = originalBodyPointerEvents;\n }\n }\n };\n }, [node, ownerDocument, disableOutsidePointerEvents, context]);\n React.useEffect(() => {\n return () => {\n if (!node) return;\n context.layers.delete(node);\n context.layersWithOutsidePointerEventsDisabled.delete(node);\n dispatchUpdate();\n };\n }, [node, context]);\n React.useEffect(() => {\n const handleUpdate = /* @__PURE__ */ __name(() => force({}), \"handleUpdate\");\n document.addEventListener(CONTEXT_UPDATE, handleUpdate);\n return () => document.removeEventListener(CONTEXT_UPDATE, handleUpdate);\n }, []);\n return /* @__PURE__ */ jsx(\n Primitive.div,\n {\n ...layerProps,\n ref: composedRefs,\n style: {\n pointerEvents: isBodyPointerEventsDisabled ? isPointerEventsEnabled ? \"auto\" : \"none\" : void 0,\n ...props.style\n },\n onFocusCapture: composeEventHandlers(props.onFocusCapture, focusOutside.onFocusCapture),\n onBlurCapture: composeEventHandlers(props.onBlurCapture, focusOutside.onBlurCapture),\n onPointerDownCapture: composeEventHandlers(\n props.onPointerDownCapture,\n pointerDownOutside.onPointerDownCapture\n )\n }\n );\n }, \"DismissableLayer\")\n);\nvar DismissableLayerBranch = /* @__PURE__ */ React.forwardRef(/* @__PURE__ */ __name(function DismissableLayerBranch2(props, forwardedRef) {\n const context = React.useContext(DismissableLayerContext);\n const ref = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, ref);\n React.useEffect(() => {\n const node = ref.current;\n if (node) {\n context.branches.add(node);\n return () => {\n context.branches.delete(node);\n };\n }\n }, [context.branches]);\n return /* @__PURE__ */ jsx(Primitive.div, { ...props, ref: composedRefs });\n}, \"DismissableLayerBranch\"));\nfunction useDismissableLayerSurface() {\n const context = React.useContext(DismissableLayerContext);\n const [node, setNode] = React.useState(null);\n React.useEffect(() => {\n if (!node) {\n return;\n }\n context.dismissableSurfaces.add(node);\n return () => {\n context.dismissableSurfaces.delete(node);\n };\n }, [node, context.dismissableSurfaces]);\n return setNode;\n}\n__name(useDismissableLayerSurface, \"useDismissableLayerSurface\");\nvar IS_TRUE = /* @__PURE__ */ __name(() => true, \"IS_TRUE\");\nfunction usePointerDownOutside(onPointerDownOutside, args) {\n const {\n ownerDocument = globalThis?.document,\n deferPointerDownOutside = false,\n isDeferredPointerDownOutsideRef,\n dismissableSurfaces,\n shouldHandlePointerDownOutside = IS_TRUE\n } = args;\n const handlePointerDownOutside = useCallbackRef(onPointerDownOutside);\n const isPointerInsideReactTreeRef = React.useRef(false);\n const isPointerDownOutsideRef = React.useRef(false);\n const interceptedOutsideInteractionEventsRef = React.useRef(/* @__PURE__ */ new Map());\n const handleClickRef = React.useRef(() => {\n });\n React.useEffect(() => {\n function resetOutsideInteraction() {\n isPointerDownOutsideRef.current = false;\n isDeferredPointerDownOutsideRef.current = false;\n interceptedOutsideInteractionEventsRef.current.clear();\n }\n __name(resetOutsideInteraction, \"resetOutsideInteraction\");\n function isOutsideInteractionIntercepted() {\n return Array.from(interceptedOutsideInteractionEventsRef.current.values()).some(Boolean);\n }\n __name(isOutsideInteractionIntercepted, \"isOutsideInteractionIntercepted\");\n function handleInteractionCapture(event) {\n if (!isPointerDownOutsideRef.current) {\n return;\n }\n const target = event.target;\n const isDismissableSurface = target instanceof Node && [...dismissableSurfaces].some((surface) => surface.contains(target));\n if (!isDismissableSurface) {\n interceptedOutsideInteractionEventsRef.current.set(event.type, true);\n }\n if (event.type === \"click\") {\n window.setTimeout(() => {\n if (isPointerDownOutsideRef.current) {\n handleClickRef.current();\n }\n }, 0);\n }\n }\n __name(handleInteractionCapture, \"handleInteractionCapture\");\n function handleInteractionBubble(event) {\n if (isPointerDownOutsideRef.current) {\n interceptedOutsideInteractionEventsRef.current.set(event.type, false);\n }\n }\n __name(handleInteractionBubble, \"handleInteractionBubble\");\n const handlePointerDown = /* @__PURE__ */ __name((event) => {\n if (event.target && !isPointerInsideReactTreeRef.current) {\n let handleAndDispatchPointerDownOutsideEvent2 = function() {\n ownerDocument.removeEventListener(\"click\", handleClickRef.current);\n const wasOutsideInteractionIntercepted = isOutsideInteractionIntercepted();\n resetOutsideInteraction();\n if (!wasOutsideInteractionIntercepted) {\n handleAndDispatchCustomEvent(\n POINTER_DOWN_OUTSIDE,\n handlePointerDownOutside,\n eventDetail,\n { discrete: true }\n );\n }\n };\n var handleAndDispatchPointerDownOutsideEvent = handleAndDispatchPointerDownOutsideEvent2;\n __name(handleAndDispatchPointerDownOutsideEvent2, \"handleAndDispatchPointerDownOutsideEvent\");\n if (!shouldHandlePointerDownOutside(event.target)) {\n ownerDocument.removeEventListener(\"click\", handleClickRef.current);\n resetOutsideInteraction();\n isPointerInsideReactTreeRef.current = false;\n return;\n }\n const eventDetail = { originalEvent: event };\n isPointerDownOutsideRef.current = true;\n isDeferredPointerDownOutsideRef.current = deferPointerDownOutside && event.button === 0;\n interceptedOutsideInteractionEventsRef.current.clear();\n if (!deferPointerDownOutside || event.button !== 0) {\n handleAndDispatchPointerDownOutsideEvent2();\n } else {\n ownerDocument.removeEventListener(\"click\", handleClickRef.current);\n handleClickRef.current = handleAndDispatchPointerDownOutsideEvent2;\n ownerDocument.addEventListener(\"click\", handleClickRef.current, { once: true });\n }\n } else {\n ownerDocument.removeEventListener(\"click\", handleClickRef.current);\n resetOutsideInteraction();\n }\n isPointerInsideReactTreeRef.current = false;\n }, \"handlePointerDown\");\n const outsideInteractionEvents = [\n \"pointerup\",\n \"mousedown\",\n \"mouseup\",\n \"touchstart\",\n \"touchend\",\n \"click\"\n ];\n for (const eventName of outsideInteractionEvents) {\n ownerDocument.addEventListener(eventName, handleInteractionCapture, true);\n ownerDocument.addEventListener(eventName, handleInteractionBubble);\n }\n const timerId = window.setTimeout(() => {\n ownerDocument.addEventListener(\"pointerdown\", handlePointerDown);\n }, 0);\n return () => {\n window.clearTimeout(timerId);\n ownerDocument.removeEventListener(\"pointerdown\", handlePointerDown);\n ownerDocument.removeEventListener(\"click\", handleClickRef.current);\n for (const eventName of outsideInteractionEvents) {\n ownerDocument.removeEventListener(eventName, handleInteractionCapture, true);\n ownerDocument.removeEventListener(eventName, handleInteractionBubble);\n }\n };\n }, [\n ownerDocument,\n handlePointerDownOutside,\n deferPointerDownOutside,\n isDeferredPointerDownOutsideRef,\n dismissableSurfaces,\n shouldHandlePointerDownOutside\n ]);\n return {\n // ensures we check React component tree (not just DOM tree)\n onPointerDownCapture: /* @__PURE__ */ __name(() => isPointerInsideReactTreeRef.current = true, \"onPointerDownCapture\")\n };\n}\n__name(usePointerDownOutside, \"usePointerDownOutside\");\nfunction useFocusOutside(onFocusOutside, ownerDocument = globalThis?.document) {\n const handleFocusOutside = useCallbackRef(onFocusOutside);\n const isFocusInsideReactTreeRef = React.useRef(false);\n React.useEffect(() => {\n const handleFocus = /* @__PURE__ */ __name((event) => {\n if (event.target && !isFocusInsideReactTreeRef.current) {\n const eventDetail = { originalEvent: event };\n handleAndDispatchCustomEvent(FOCUS_OUTSIDE, handleFocusOutside, eventDetail, {\n discrete: false\n });\n }\n }, \"handleFocus\");\n ownerDocument.addEventListener(\"focusin\", handleFocus);\n return () => ownerDocument.removeEventListener(\"focusin\", handleFocus);\n }, [ownerDocument, handleFocusOutside]);\n return {\n onFocusCapture: /* @__PURE__ */ __name(() => isFocusInsideReactTreeRef.current = true, \"onFocusCapture\"),\n onBlurCapture: /* @__PURE__ */ __name(() => isFocusInsideReactTreeRef.current = false, \"onBlurCapture\")\n };\n}\n__name(useFocusOutside, \"useFocusOutside\");\nfunction dispatchUpdate() {\n const event = new CustomEvent(CONTEXT_UPDATE);\n document.dispatchEvent(event);\n}\n__name(dispatchUpdate, \"dispatchUpdate\");\nfunction handleAndDispatchCustomEvent(name, handler, detail, { discrete }) {\n const target = detail.originalEvent.target;\n const event = new CustomEvent(name, { bubbles: false, cancelable: true, detail });\n if (handler) target.addEventListener(name, handler, { once: true });\n if (discrete) {\n dispatchDiscreteCustomEvent(target, event);\n } else {\n target.dispatchEvent(event);\n }\n}\n__name(handleAndDispatchCustomEvent, \"handleAndDispatchCustomEvent\");\nvar Root = DismissableLayer;\nvar Branch = DismissableLayerBranch;\nexport {\n Branch,\n DismissableLayer,\n DismissableLayerBranch,\n Root,\n useDismissableLayerSurface\n};\n//# sourceMappingURL=index.mjs.map\n","\"use client\";\nvar __defProp = Object.defineProperty;\nvar __name = (target, value) => __defProp(target, \"name\", { value, configurable: true });\n\n// src/focus-scope.tsx\nimport * as React from \"react\";\nimport { useComposedRefs } from \"@radix-ui/react-compose-refs\";\nimport { Primitive } from \"@radix-ui/react-primitive\";\nimport { useCallbackRef } from \"@radix-ui/react-use-callback-ref\";\nimport { jsx } from \"react/jsx-runtime\";\nvar AUTOFOCUS_ON_MOUNT = \"focusScope.autoFocusOnMount\";\nvar AUTOFOCUS_ON_UNMOUNT = \"focusScope.autoFocusOnUnmount\";\nvar EVENT_OPTIONS = { bubbles: false, cancelable: true };\nvar FocusScope = /* @__PURE__ */ React.forwardRef(\n /* @__PURE__ */ __name(function FocusScope2(props, forwardedRef) {\n const {\n loop = false,\n trapped = false,\n onMountAutoFocus: onMountAutoFocusProp,\n onUnmountAutoFocus: onUnmountAutoFocusProp,\n ...scopeProps\n } = props;\n const [container, setContainer] = React.useState(null);\n const onMountAutoFocus = useCallbackRef(onMountAutoFocusProp);\n const onUnmountAutoFocus = useCallbackRef(onUnmountAutoFocusProp);\n const lastFocusedElementRef = React.useRef(null);\n const composedRefs = useComposedRefs(forwardedRef, setContainer);\n const focusScope = React.useRef({\n paused: false,\n pause() {\n this.paused = true;\n },\n resume() {\n this.paused = false;\n }\n }).current;\n React.useEffect(() => {\n if (trapped) {\n let handleFocusIn2 = function(event) {\n if (focusScope.paused || !container) return;\n const target = event.target;\n if (container.contains(target)) {\n lastFocusedElementRef.current = target;\n } else {\n focus(lastFocusedElementRef.current, { select: true });\n }\n }, handleFocusOut2 = function(event) {\n if (focusScope.paused || !container) return;\n const relatedTarget = event.relatedTarget;\n if (relatedTarget === null) return;\n if (!container.contains(relatedTarget)) {\n focus(lastFocusedElementRef.current, { select: true });\n }\n }, handleMutations2 = function(mutations) {\n const focusedElement = document.activeElement;\n if (focusedElement !== document.body) return;\n for (const mutation of mutations) {\n if (mutation.removedNodes.length > 0) focus(container);\n }\n };\n var handleFocusIn = handleFocusIn2, handleFocusOut = handleFocusOut2, handleMutations = handleMutations2;\n __name(handleFocusIn2, \"handleFocusIn\");\n __name(handleFocusOut2, \"handleFocusOut\");\n __name(handleMutations2, \"handleMutations\");\n document.addEventListener(\"focusin\", handleFocusIn2);\n document.addEventListener(\"focusout\", handleFocusOut2);\n const mutationObserver = new MutationObserver(handleMutations2);\n if (container) mutationObserver.observe(container, { childList: true, subtree: true });\n return () => {\n document.removeEventListener(\"focusin\", handleFocusIn2);\n document.removeEventListener(\"focusout\", handleFocusOut2);\n mutationObserver.disconnect();\n };\n }\n }, [trapped, container, focusScope.paused]);\n React.useEffect(() => {\n if (container) {\n focusScopesStack.add(focusScope);\n const previouslyFocusedElement = document.activeElement;\n const hasFocusedCandidate = container.contains(previouslyFocusedElement);\n if (!hasFocusedCandidate) {\n const mountEvent = new CustomEvent(AUTOFOCUS_ON_MOUNT, EVENT_OPTIONS);\n container.addEventListener(AUTOFOCUS_ON_MOUNT, onMountAutoFocus);\n container.dispatchEvent(mountEvent);\n if (!mountEvent.defaultPrevented) {\n focusFirst(removeLinks(getTabbableCandidates(container)), { select: true });\n if (document.activeElement === previouslyFocusedElement) {\n focus(container);\n }\n }\n }\n return () => {\n container.removeEventListener(AUTOFOCUS_ON_MOUNT, onMountAutoFocus);\n setTimeout(() => {\n const unmountEvent = new CustomEvent(AUTOFOCUS_ON_UNMOUNT, EVENT_OPTIONS);\n container.addEventListener(AUTOFOCUS_ON_UNMOUNT, onUnmountAutoFocus);\n container.dispatchEvent(unmountEvent);\n if (!unmountEvent.defaultPrevented) {\n focus(previouslyFocusedElement ?? document.body, { select: true });\n }\n container.removeEventListener(AUTOFOCUS_ON_UNMOUNT, onUnmountAutoFocus);\n focusScopesStack.remove(focusScope);\n }, 0);\n };\n }\n }, [container, onMountAutoFocus, onUnmountAutoFocus, focusScope]);\n const handleKeyDown = React.useCallback(\n (event) => {\n if (!loop && !trapped) return;\n if (focusScope.paused) return;\n const isTabKey = event.key === \"Tab\" && !event.altKey && !event.ctrlKey && !event.metaKey;\n const focusedElement = document.activeElement;\n if (isTabKey && focusedElement) {\n const container2 = event.currentTarget;\n const [first, last] = getTabbableEdges(container2);\n const hasTabbableElementsInside = first && last;\n if (!hasTabbableElementsInside) {\n if (focusedElement === container2) event.preventDefault();\n } else {\n if (!event.shiftKey && focusedElement === last) {\n event.preventDefault();\n if (loop) focus(first, { select: true });\n } else if (event.shiftKey && focusedElement === first) {\n event.preventDefault();\n if (loop) focus(last, { select: true });\n }\n }\n }\n },\n [loop, trapped, focusScope.paused]\n );\n return /* @__PURE__ */ jsx(Primitive.div, { tabIndex: -1, ...scopeProps, ref: composedRefs, onKeyDown: handleKeyDown });\n }, \"FocusScope\")\n);\nfunction focusFirst(candidates, { select = false } = {}) {\n const previouslyFocusedElement = document.activeElement;\n for (const candidate of candidates) {\n focus(candidate, { select });\n if (document.activeElement !== previouslyFocusedElement) return;\n }\n}\n__name(focusFirst, \"focusFirst\");\nfunction getTabbableEdges(container) {\n const candidates = getTabbableCandidates(container);\n const first = findVisible(candidates, container);\n const last = findVisible(candidates.reverse(), container);\n return [first, last];\n}\n__name(getTabbableEdges, \"getTabbableEdges\");\nfunction getTabbableCandidates(container) {\n const nodes = [];\n const walker = document.createTreeWalker(container, NodeFilter.SHOW_ELEMENT, {\n acceptNode: /* @__PURE__ */ __name((node) => {\n const isHiddenInput = node.tagName === \"INPUT\" && node.type === \"hidden\";\n if (node.disabled || node.hidden || isHiddenInput) return NodeFilter.FILTER_SKIP;\n return node.tabIndex >= 0 ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP;\n }, \"acceptNode\")\n });\n while (walker.nextNode()) nodes.push(walker.currentNode);\n return nodes;\n}\n__name(getTabbableCandidates, \"getTabbableCandidates\");\nfunction findVisible(elements, container) {\n const canUseCheckVisibility = typeof container.checkVisibility === \"function\" && container.checkVisibility({ checkVisibilityCSS: true });\n for (const element of elements) {\n const hidden = canUseCheckVisibility ? !element.checkVisibility({ checkVisibilityCSS: true }) : isHidden(element, { upTo: container });\n if (!hidden) {\n return element;\n }\n }\n}\n__name(findVisible, \"findVisible\");\nfunction isHidden(node, { upTo }) {\n if (getComputedStyle(node).visibility === \"hidden\") return true;\n while (node) {\n if (upTo !== void 0 && node === upTo) return false;\n if (getComputedStyle(node).display === \"none\") return true;\n node = node.parentElement;\n }\n return false;\n}\n__name(isHidden, \"isHidden\");\nfunction isSelectableInput(element) {\n return element instanceof HTMLInputElement && \"select\" in element;\n}\n__name(isSelectableInput, \"isSelectableInput\");\nfunction focus(element, { select = false } = {}) {\n if (element && element.focus) {\n const previouslyFocusedElement = document.activeElement;\n element.focus({ preventScroll: true });\n if (element !== previouslyFocusedElement && isSelectableInput(element) && select)\n element.select();\n }\n}\n__name(focus, \"focus\");\nvar focusScopesStack = createFocusScopesStack();\nfunction createFocusScopesStack() {\n let stack = [];\n return {\n add(focusScope) {\n const activeFocusScope = stack[0];\n if (focusScope !== activeFocusScope) {\n activeFocusScope?.pause();\n }\n stack = arrayRemove(stack, focusScope);\n stack.unshift(focusScope);\n },\n remove(focusScope) {\n stack = arrayRemove(stack, focusScope);\n stack[0]?.resume();\n }\n };\n}\n__name(createFocusScopesStack, \"createFocusScopesStack\");\nfunction arrayRemove(array, item) {\n const updatedArray = [...array];\n const index = updatedArray.indexOf(item);\n if (index !== -1) {\n updatedArray.splice(index, 1);\n }\n return updatedArray;\n}\n__name(arrayRemove, \"arrayRemove\");\nfunction removeLinks(items) {\n return items.filter((item) => item.tagName !== \"A\");\n}\n__name(removeLinks, \"removeLinks\");\nvar Root = FocusScope;\nexport {\n FocusScope,\n Root\n};\n//# sourceMappingURL=index.mjs.map\n","// src/use-layout-effect.tsx\nimport * as React from \"react\";\nvar useLayoutEffect2 = globalThis?.document ? React.useLayoutEffect : () => {\n};\nexport {\n useLayoutEffect2 as useLayoutEffect\n};\n//# sourceMappingURL=index.mjs.map\n","\"use client\";\nvar __defProp = Object.defineProperty;\nvar __name = (target, value) => __defProp(target, \"name\", { value, configurable: true });\n\n// src/presence.tsx\nimport * as React2 from \"react\";\nimport { useLayoutEffect } from \"@radix-ui/react-use-layout-effect\";\n\n// src/use-state-machine.tsx\nimport * as React from \"react\";\nfunction useStateMachine(initialState, machine) {\n return React.useReducer((state, event) => {\n const nextState = machine[state][event];\n return nextState ?? state;\n }, initialState);\n}\n__name(useStateMachine, \"useStateMachine\");\n\n// src/presence.tsx\nvar Presence = /* @__PURE__ */ __name((props) => {\n const { present, children } = props;\n const presence = usePresence(present);\n const child = typeof children === \"function\" ? children({ present: presence.isPresent }) : React2.Children.only(children);\n const ref = useStableComposedRefs(presence.ref, getElementRef(child));\n const forceMount = typeof children === \"function\";\n return forceMount || presence.isPresent ? React2.cloneElement(child, { ref }) : null;\n}, \"Presence\");\nfunction usePresence(present) {\n const [node, setNode] = React2.useState();\n const stylesRef = React2.useRef(null);\n const prevPresentRef = React2.useRef(present);\n const prevAnimationNameRef = React2.useRef(\"none\");\n const mountAnimationNameRef = React2.useRef(void 0);\n const initialState = present ? \"mounted\" : \"unmounted\";\n const [state, send] = useStateMachine(initialState, {\n mounted: {\n UNMOUNT: \"unmounted\",\n ANIMATION_OUT: \"unmountSuspended\"\n },\n unmountSuspended: {\n MOUNT: \"mounted\",\n ANIMATION_END: \"unmounted\"\n },\n unmounted: {\n MOUNT: \"mounted\"\n }\n });\n React2.useEffect(() => {\n if (state === \"mounted\") {\n prevAnimationNameRef.current = mountAnimationNameRef.current ?? getAnimationName(stylesRef.current);\n mountAnimationNameRef.current = void 0;\n } else {\n prevAnimationNameRef.current = \"none\";\n }\n }, [state]);\n useLayoutEffect(() => {\n const styles = stylesRef.current;\n const wasPresent = prevPresentRef.current;\n const hasPresentChanged = wasPresent !== present;\n if (hasPresentChanged) {\n const prevAnimationName = prevAnimationNameRef.current;\n const currentAnimationName = getAnimationName(styles);\n if (present) {\n mountAnimationNameRef.current = currentAnimationName;\n send(\"MOUNT\");\n } else if (currentAnimationName === \"none\" || styles?.display === \"none\") {\n send(\"UNMOUNT\");\n } else {\n const isAnimating = prevAnimationName !== currentAnimationName;\n if (wasPresent && isAnimating) {\n send(\"ANIMATION_OUT\");\n } else {\n send(\"UNMOUNT\");\n }\n }\n prevPresentRef.current = present;\n }\n }, [present, send]);\n useLayoutEffect(() => {\n if (node) {\n let timeoutId;\n const ownerWindow = node.ownerDocument.defaultView ?? window;\n const handleAnimationEnd = /* @__PURE__ */ __name((event) => {\n const currentAnimationName = getAnimationName(stylesRef.current);\n const isCurrentAnimation = currentAnimationName.includes(CSS.escape(event.animationName));\n if (event.target === node && isCurrentAnimation) {\n send(\"ANIMATION_END\");\n if (!prevPresentRef.current) {\n const currentFillMode = node.style.animationFillMode;\n node.style.animationFillMode = \"forwards\";\n timeoutId = ownerWindow.setTimeout(() => {\n if (node.style.animationFillMode === \"forwards\") {\n node.style.animationFillMode = currentFillMode;\n }\n });\n }\n }\n }, \"handleAnimationEnd\");\n const handleAnimationStart = /* @__PURE__ */ __name((event) => {\n if (event.target === node) {\n prevAnimationNameRef.current = getAnimationName(stylesRef.current);\n }\n }, \"handleAnimationStart\");\n node.addEventListener(\"animationstart\", handleAnimationStart);\n node.addEventListener(\"animationcancel\", handleAnimationEnd);\n node.addEventListener(\"animationend\", handleAnimationEnd);\n return () => {\n ownerWindow.clearTimeout(timeoutId);\n node.removeEventListener(\"animationstart\", handleAnimationStart);\n node.removeEventListener(\"animationcancel\", handleAnimationEnd);\n node.removeEventListener(\"animationend\", handleAnimationEnd);\n };\n } else {\n send(\"ANIMATION_END\");\n }\n }, [node, send]);\n return {\n isPresent: [\"mounted\", \"unmountSuspended\"].includes(state),\n ref: React2.useCallback((node2) => {\n if (node2) {\n const styles = getComputedStyle(node2);\n stylesRef.current = styles;\n mountAnimationNameRef.current = getAnimationName(styles);\n } else {\n stylesRef.current = null;\n }\n setNode(node2);\n }, [])\n };\n}\n__name(usePresence, \"usePresence\");\nfunction setRef(ref, value) {\n if (typeof ref === \"function\") {\n return ref(value);\n } else if (ref !== null && ref !== void 0) {\n ref.current = value;\n }\n}\n__name(setRef, \"setRef\");\nfunction useStableComposedRefs(...refs) {\n const refsRef = React2.useRef(refs);\n refsRef.current = refs;\n return React2.useCallback((node) => {\n const currentRefs = refsRef.current;\n let hasCleanup = false;\n const cleanups = currentRefs.map((ref) => {\n const cleanup = setRef(ref, node);\n if (!hasCleanup && typeof cleanup === \"function\") {\n hasCleanup = true;\n }\n return cleanup;\n });\n if (hasCleanup) {\n return () => {\n for (let i = 0; i < cleanups.length; i++) {\n const cleanup = cleanups[i];\n if (typeof cleanup === \"function\") {\n cleanup();\n } else {\n setRef(currentRefs[i], null);\n }\n }\n };\n }\n }, []);\n}\n__name(useStableComposedRefs, \"useStableComposedRefs\");\nfunction getAnimationName(styles) {\n return styles?.animationName || \"none\";\n}\n__name(getAnimationName, \"getAnimationName\");\nfunction getElementRef(element) {\n let getter = Object.getOwnPropertyDescriptor(element.props, \"ref\")?.get;\n let mayWarn = getter && \"isReactWarning\" in getter && getter.isReactWarning;\n if (mayWarn) {\n return element.ref;\n }\n getter = Object.getOwnPropertyDescriptor(element, \"ref\")?.get;\n mayWarn = getter && \"isReactWarning\" in getter && getter.isReactWarning;\n if (mayWarn) {\n return element.props.ref;\n }\n return element.props.ref || element.ref;\n}\n__name(getElementRef, \"getElementRef\");\nvar Root = Presence;\nexport {\n Presence,\n Root\n};\n//# sourceMappingURL=index.mjs.map\n","'use client';\n\nimport type { ReactNode } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useTgui } from '../TguiProvider';\n\nexport interface PortalProps {\n children?: ReactNode;\n container?: Element | DocumentFragment | null;\n}\n\nexport function Portal({ children, container }: PortalProps) {\n const { portalContainer } = useTgui();\n const target = container ?? portalContainer;\n if (!target) return null;\n return createPortal(children, target);\n}\n\nPortal.displayName = 'Portal';\n",".overlay {\n position: fixed;\n inset: 0;\n z-index: var(--tgui--z-overlay);\n display: grid;\n place-items: center;\n padding: 24px;\n background: rgb(0 0 0 / 0.4);\n}\n\n.content {\n width: 100%;\n max-width: 270px;\n overflow: hidden;\n border-radius: var(--tgui--radius-lg);\n background: var(--tgui--surface-bg);\n color: var(--tgui--label);\n box-shadow: var(--tgui--overlay-shadow);\n transform-origin: center;\n}\n\n/* the element is visible at rest; the animations only ferry it in and out,\n so a paused/skipped animation can never leave the dialog invisible */\n@media (prefers-reduced-motion: no-preference) {\n .overlay[data-state=\"open\"] {\n animation: dialog-overlay-in var(--tgui--duration-overlay) ease;\n }\n\n .overlay[data-state=\"closed\"] {\n animation: dialog-overlay-out var(--tgui--duration-overlay) ease forwards;\n }\n\n .content[data-state=\"open\"] {\n animation: dialog-in var(--tgui--duration-overlay) var(--tgui--ease-spring);\n }\n\n .content[data-state=\"closed\"] {\n animation: dialog-out var(--tgui--duration-overlay) var(--tgui--ease-in) forwards;\n }\n}\n\n@keyframes dialog-overlay-in {\n from {\n opacity: 0;\n }\n}\n\n@keyframes dialog-overlay-out {\n to {\n opacity: 0;\n }\n}\n\n@keyframes dialog-in {\n from {\n opacity: 0;\n transform: scale(0.96);\n }\n}\n\n@keyframes dialog-out {\n to {\n opacity: 0;\n transform: scale(0.96);\n }\n}\n\n.body {\n padding: 20px 16px 16px;\n text-align: center;\n}\n\n.title {\n margin: 0;\n font-family: var(--tgui--font-family);\n font-size: 17px;\n font-weight: var(--tgui--weight-semibold);\n line-height: 22px;\n}\n\n.description {\n margin: 4px 0 0;\n font-family: var(--tgui--font-family);\n font-size: 13px;\n line-height: 18px;\n color: var(--tgui--label-secondary);\n}\n\n.actions {\n display: flex;\n border-top: var(--tgui--hairline) solid var(--tgui--separator);\n}\n\n.actions[data-layout=\"stacked\"] {\n flex-direction: column;\n}\n\n.action {\n flex: 1 1 0;\n min-width: 0;\n padding: 11px 12px;\n border: 0;\n background: transparent;\n color: var(--tgui--link-strong);\n font-family: var(--tgui--font-family);\n font-size: 17px;\n font-weight: var(--tgui--weight-regular);\n line-height: 22px;\n cursor: pointer;\n}\n\n.action[data-default=\"true\"] {\n font-weight: var(--tgui--weight-semibold);\n}\n\n.action[data-role=\"destructive\"] {\n color: var(--tgui--destructive-strong);\n}\n\n.actions:not([data-layout=\"stacked\"]) .action + .action {\n border-inline-start: var(--tgui--hairline) solid var(--tgui--separator);\n}\n\n.actions[data-layout=\"stacked\"] .action + .action {\n border-top: var(--tgui--hairline) solid var(--tgui--separator);\n}\n\n@media (hover: hover) and (pointer: fine) {\n .action:hover {\n background: var(--tgui--fill);\n }\n}\n\n.action:active {\n background: var(--tgui--fill);\n}\n\n.action:focus-visible {\n outline: var(--tgui--focus-ring);\n outline-offset: calc(-1 * var(--tgui--focus-ring-offset));\n}\n","'use client';\n\nimport { DismissableLayer } from '@radix-ui/react-dismissable-layer';\nimport { FocusScope } from '@radix-ui/react-focus-scope';\nimport { Presence } from '@radix-ui/react-presence';\nimport { type KeyboardEvent as ReactKeyboardEvent, type ReactNode, useEffect, useId } from 'react';\nimport { getTelegramWebApp, isTelegramVersionAtLeast } from '../../shared/lib/telegram';\nimport type { PopupButton } from '../../shared/types/telegram';\nimport { Portal } from '../Portal';\nimport styles from './Dialog.module.css';\n\nexport type DialogActionRole = 'default' | 'cancel' | 'destructive';\n\nexport interface DialogAction {\n label: ReactNode;\n onClick?: () => void;\n role?: DialogActionRole;\n}\n\nexport interface DialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title: ReactNode;\n description?: ReactNode;\n actions: DialogAction[];\n cancelLabel?: string;\n container?: Element | DocumentFragment | null;\n}\n\n// a destructive alert always offers a way out; add one if the caller didn't\nfunction withCancel(actions: DialogAction[], cancelLabel: string): DialogAction[] {\n const hasCancel = actions.some((a) => a.role === 'cancel');\n const hasDestructive = actions.some((a) => a.role === 'destructive');\n if (hasCancel || !hasDestructive) return actions.slice(0, 3);\n return [...actions.slice(0, 2), { label: cancelLabel, role: 'cancel' }];\n}\n\n// the Telegram native popup fits only plain-string, length-bounded content\nfunction toNativePopup(\n title: ReactNode,\n description: ReactNode,\n actions: DialogAction[],\n): { title?: string; message: string; buttons: PopupButton[] } | null {\n if (!isTelegramVersionAtLeast('6.2')) return null;\n const heading = typeof title === 'string' ? title : null;\n const body = typeof description === 'string' ? description : null;\n const message = body ?? heading;\n if (message == null || message.length < 1 || message.length > 256) return null;\n if (heading != null && (body == null || heading.length > 64)) {\n // no room for both, or title too long → render ours\n if (body == null && heading.length <= 256) {\n // title-only: send it as the message\n } else {\n return null;\n }\n }\n const buttons: PopupButton[] = [];\n for (const [index, action] of actions.entries()) {\n if (action.role === 'cancel') {\n buttons.push({ id: String(index), type: 'cancel' });\n continue;\n }\n if (typeof action.label !== 'string' || action.label.length < 1 || action.label.length > 64) {\n return null;\n }\n buttons.push({\n id: String(index),\n type: action.role === 'destructive' ? 'destructive' : 'default',\n text: action.label,\n });\n }\n return {\n title: body != null ? (heading ?? undefined) : undefined,\n message: body ?? (heading as string),\n buttons: buttons.slice(0, 3),\n };\n}\n\nexport function Dialog({\n open,\n onOpenChange,\n title,\n description,\n actions,\n cancelLabel = 'Cancel',\n container,\n}: DialogProps) {\n const titleId = useId();\n const descId = useId();\n const resolved = withCancel(actions, cancelLabel);\n const defaultIndex = resolved.findIndex((a) => a.role === 'default' || a.role == null);\n const cancelIndex = resolved.findIndex((a) => a.role === 'cancel');\n const stacked = resolved.length > 2;\n const native = toNativePopup(title, description, resolved);\n\n const run = (action: DialogAction) => {\n action.onClick?.();\n onOpenChange(false);\n };\n\n // inside a recent Telegram client this is a real UIAlertController / native dialog\n // biome-ignore lint/correctness/useExhaustiveDependencies: fire once per open transition\n useEffect(() => {\n if (!open || native == null) return;\n const webApp = getTelegramWebApp();\n if (webApp == null) return;\n webApp.showPopup(native, (buttonId) => {\n const index = Number(buttonId);\n if (Number.isInteger(index)) resolved[index]?.onClick?.();\n onOpenChange(false);\n });\n }, [open, native != null]);\n\n useEffect(() => {\n if (!open || native != null) return;\n const { body } = document;\n const previousOverflow = body.style.overflow;\n body.style.overflow = 'hidden';\n return () => {\n body.style.overflow = previousOverflow;\n };\n }, [open, native]);\n\n const state = open ? 'open' : 'closed';\n\n const onKeyDown = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n if (event.key === 'Enter' && defaultIndex >= 0) {\n event.preventDefault();\n run(resolved[defaultIndex]);\n }\n };\n\n // native popup renders no DOM of its own\n if (native != null) return null;\n\n return (\n <Portal container={container}>\n <Presence present={open}>\n <div data-slot=\"dialog-overlay\" data-state={state} className={styles.overlay}>\n <FocusScope asChild trapped loop>\n <DismissableLayer\n asChild\n onEscapeKeyDown={() => {\n if (cancelIndex >= 0) run(resolved[cancelIndex]);\n else onOpenChange(false);\n }}\n >\n <div\n role=\"alertdialog\"\n aria-modal=\"true\"\n aria-labelledby={titleId}\n aria-describedby={description != null ? descId : undefined}\n data-slot=\"dialog-content\"\n data-state={state}\n className={styles.content}\n onKeyDown={onKeyDown}\n >\n <div className={styles.body}>\n <h2 id={titleId} data-slot=\"dialog-title\" className={styles.title}>\n {title}\n </h2>\n {description != null ? (\n <p id={descId} data-slot=\"dialog-description\" className={styles.description}>\n {description}\n </p>\n ) : null}\n </div>\n <div\n data-slot=\"dialog-actions\"\n data-layout={stacked ? 'stacked' : 'row'}\n className={styles.actions}\n >\n {resolved.map((action, index) => (\n <button\n // biome-ignore lint/suspicious/noArrayIndexKey: actions are a fixed positional list\n key={index}\n type=\"button\"\n data-slot=\"dialog-action\"\n data-role={action.role ?? 'default'}\n data-default={index === defaultIndex || undefined}\n className={styles.action}\n onClick={() => run(action)}\n >\n {action.label}\n </button>\n ))}\n </div>\n </div>\n </DismissableLayer>\n </FocusScope>\n </div>\n </Presence>\n </Portal>\n );\n}\n\nDialog.displayName = 'Dialog';\n",".divider {\n margin: 0;\n border: none;\n border-block-start: var(--tgui--hairline) solid var(--tgui--separator);\n}\n","import type { HTMLAttributes, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './Divider.module.css';\n\nexport interface DividerProps extends HTMLAttributes<HTMLHRElement> {\n ref?: Ref<HTMLHRElement>;\n}\n\nexport function Divider({ ref, className, ...rest }: DividerProps) {\n return <hr ref={ref} data-slot=\"divider\" className={cn(styles.divider, className)} {...rest} />;\n}\n\nDivider.displayName = 'Divider';\n","import { createContext, type RefObject } from 'react';\n\nexport interface DropdownMenuContextValue {\n open: boolean;\n setOpen: (open: boolean) => void;\n triggerRef: RefObject<HTMLElement | null>;\n contentId: string;\n}\n\nexport const DropdownMenuContext = createContext<DropdownMenuContextValue | null>(null);\nDropdownMenuContext.displayName = 'DropdownMenuContext';\n\nexport interface DropdownMenuRadioContextValue {\n value: string | undefined;\n select: (value: string) => void;\n}\n\nexport const DropdownMenuRadioContext = createContext<DropdownMenuRadioContextValue | null>(null);\nDropdownMenuRadioContext.displayName = 'DropdownMenuRadioContext';\n","export function CheckIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden>\n <path\n d=\"M3.5 8.5l3 3 6-7\"\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n );\n}\n",".content {\n position: fixed;\n top: 0;\n inset-inline-start: 0;\n z-index: var(--tgui--z-overlay);\n min-width: 200px;\n max-width: 280px;\n padding: 5px;\n overflow: hidden auto;\n max-height: calc(100vh - 32px);\n border-radius: var(--tgui--radius);\n background: var(--tgui--surface-bg);\n color: var(--tgui--label);\n box-shadow: var(--tgui--overlay-shadow);\n}\n\n.content[data-side=\"bottom\"] {\n transform-origin: top center;\n}\n\n.content[data-side=\"top\"] {\n transform-origin: bottom center;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .content[data-state=\"open\"] {\n animation: dropdown-menu-in var(--tgui--duration-overlay) var(--tgui--ease-spring);\n }\n\n .content[data-state=\"closed\"] {\n animation: dropdown-menu-out var(--tgui--duration-overlay) var(--tgui--ease-in) forwards;\n }\n}\n\n@keyframes dropdown-menu-in {\n from {\n opacity: 0;\n transform: scale(0.96);\n }\n}\n\n@keyframes dropdown-menu-out {\n to {\n opacity: 0;\n transform: scale(0.96);\n }\n}\n\n.item {\n display: flex;\n align-items: center;\n gap: 10px;\n width: 100%;\n box-sizing: border-box;\n padding: 9px 10px;\n border: 0;\n border-radius: var(--tgui--radius-sm);\n background: transparent;\n color: var(--tgui--label);\n font-family: var(--tgui--font-family);\n font-size: 16px;\n line-height: 21px;\n text-align: start;\n cursor: pointer;\n}\n\n.item:disabled {\n opacity: 0.35;\n cursor: default;\n}\n\n.item[data-destructive] {\n color: var(--tgui--destructive-strong);\n}\n\n@media (hover: hover) and (pointer: fine) {\n .item:not(:disabled):hover {\n background: var(--tgui--fill);\n }\n}\n\n.item:not(:disabled):active,\n.item:focus-visible {\n background: var(--tgui--fill);\n}\n\n.item:focus-visible {\n outline: none;\n}\n\n.itemIcon,\n.itemIndicator {\n display: flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n color: var(--tgui--label-secondary);\n}\n\n.itemIndicator {\n color: var(--tgui--link-strong);\n}\n\n.itemLabel {\n min-width: 0;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n\n.itemSelectable .itemLabel {\n flex: 1;\n}\n\n.separator {\n height: var(--tgui--hairline);\n margin: 5px 0;\n border: 0;\n background: var(--tgui--separator);\n}\n\n.label {\n padding: 8px 10px 4px;\n color: var(--tgui--label-secondary);\n font-family: var(--tgui--font-family);\n font-size: 12px;\n font-weight: var(--tgui--weight-semibold);\n letter-spacing: 0.04em;\n text-transform: uppercase;\n}\n","'use client';\n\nimport type { ButtonHTMLAttributes, ReactNode, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { CheckIcon } from './CheckIcon';\nimport styles from './DropdownMenu.module.css';\n\nexport interface DropdownMenuCheckboxItemProps\n extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'onChange'> {\n ref?: Ref<HTMLButtonElement>;\n checked?: boolean;\n onCheckedChange?: (checked: boolean) => void;\n}\n\nexport function DropdownMenuCheckboxItem({\n ref,\n checked = false,\n onCheckedChange,\n disabled,\n className,\n children,\n onClick,\n ...rest\n}: DropdownMenuCheckboxItemProps) {\n return (\n <button\n ref={ref}\n type=\"button\"\n role=\"menuitemcheckbox\"\n aria-checked={checked}\n tabIndex={-1}\n disabled={disabled}\n data-slot=\"dropdown-menu-checkbox-item\"\n className={cn(styles.item, styles.itemSelectable, className)}\n onClick={(event) => {\n onClick?.(event);\n onCheckedChange?.(!checked);\n }}\n {...rest}\n >\n <span data-slot=\"dropdown-menu-item-indicator\" className={styles.itemIndicator} aria-hidden>\n {checked ? <CheckIcon /> : null}\n </span>\n <span className={styles.itemLabel}>{children as ReactNode}</span>\n </button>\n );\n}\n\nDropdownMenuCheckboxItem.displayName = 'DropdownMenuCheckboxItem';\n","export type FloatingSide = 'top' | 'bottom' | 'left' | 'right';\nexport type FloatingAlign = 'start' | 'center' | 'end';\nexport type FloatingPlacement = FloatingSide | `${FloatingSide}-start` | `${FloatingSide}-end`;\n\nexport interface FloatingPosition {\n top: number;\n left: number;\n side: FloatingSide;\n}\n\nconst MARGIN = 8;\nconst clamp = (value: number, min: number, max: number) => Math.max(min, Math.min(max, value));\n\nfunction parsePlacement(placement: FloatingPlacement): {\n side: FloatingSide;\n align: FloatingAlign;\n} {\n const [side, align] = placement.split('-') as [FloatingSide, FloatingAlign | undefined];\n return { side, align: align ?? 'center' };\n}\n\n// a `position: fixed` element is offset by any ancestor that establishes a\n// containing block (transform / filter / perspective / will-change / contain).\n// returns the offset + scale to convert viewport coords into that block's space.\nexport function getFixedOffset(floatingEl: Element | null): {\n x: number;\n y: number;\n scale: number;\n} {\n let node = floatingEl?.parentElement ?? null;\n while (node != null && node !== document.documentElement) {\n const cs = getComputedStyle(node);\n if (\n cs.transform !== 'none' ||\n cs.perspective !== 'none' ||\n (cs.filter != null && cs.filter !== 'none') ||\n cs.willChange === 'transform' ||\n cs.willChange === 'perspective' ||\n cs.willChange === 'filter' ||\n cs.contain === 'layout' ||\n cs.contain === 'paint' ||\n cs.contain === 'strict' ||\n cs.contain === 'content'\n ) {\n const rect = node.getBoundingClientRect();\n const scale = rect.width > 0 ? rect.width / node.offsetWidth : 1;\n return { x: rect.left, y: rect.top, scale: scale || 1 };\n }\n node = node.parentElement;\n }\n return { x: 0, y: 0, scale: 1 };\n}\n\nexport function computeFloatingPosition(\n anchor: DOMRect,\n floating: DOMRect,\n placement: FloatingPlacement,\n gap: number,\n floatingEl?: Element | null,\n): FloatingPosition {\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n const { side: wantSide, align } = parsePlacement(placement);\n let side = wantSide;\n\n if (side === 'top' && anchor.top - floating.height - gap < MARGIN) side = 'bottom';\n else if (side === 'bottom' && anchor.bottom + floating.height + gap > vh - MARGIN) side = 'top';\n else if (side === 'left' && anchor.left - floating.width - gap < MARGIN) side = 'right';\n else if (side === 'right' && anchor.right + floating.width + gap > vw - MARGIN) side = 'left';\n\n let top = 0;\n let left = 0;\n\n if (side === 'top' || side === 'bottom') {\n if (align === 'start') left = anchor.left;\n else if (align === 'end') left = anchor.right - floating.width;\n else left = anchor.left + anchor.width / 2 - floating.width / 2;\n top = side === 'top' ? anchor.top - floating.height - gap : anchor.bottom + gap;\n } else {\n if (align === 'start') top = anchor.top;\n else if (align === 'end') top = anchor.bottom - floating.height;\n else top = anchor.top + anchor.height / 2 - floating.height / 2;\n left = side === 'left' ? anchor.left - floating.width - gap : anchor.right + gap;\n }\n\n left = clamp(left, MARGIN, vw - floating.width - MARGIN);\n top = clamp(top, MARGIN, vh - floating.height - MARGIN);\n\n // translate viewport coords into the containing block's space\n if (floatingEl != null) {\n const offset = getFixedOffset(floatingEl);\n left = (left - offset.x) / offset.scale;\n top = (top - offset.y) / offset.scale;\n }\n\n return { top, left, side };\n}\n","'use client';\n\nimport { DismissableLayer } from '@radix-ui/react-dismissable-layer';\nimport { FocusScope } from '@radix-ui/react-focus-scope';\nimport { Presence } from '@radix-ui/react-presence';\nimport {\n type HTMLAttributes,\n type KeyboardEvent as ReactKeyboardEvent,\n type Ref,\n useCallback,\n useContext,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport {\n computeFloatingPosition,\n type FloatingPlacement,\n type FloatingPosition,\n} from '../../shared/lib/floatingPosition';\nimport { Portal } from '../Portal';\nimport { DropdownMenuContext } from './context';\nimport styles from './DropdownMenu.module.css';\n\nexport interface DropdownMenuContentProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'className'> {\n ref?: Ref<HTMLDivElement>;\n placement?: FloatingPlacement;\n gap?: number;\n container?: Element | DocumentFragment | null;\n className?: string;\n}\n\nconst ITEM_SELECTOR = '[role=\"menuitem\"],[role=\"menuitemcheckbox\"],[role=\"menuitemradio\"]';\n\nexport function DropdownMenuContent({\n ref,\n placement = 'bottom-start',\n gap = 6,\n container,\n className,\n children,\n onKeyDown,\n ...rest\n}: DropdownMenuContentProps) {\n const ctx = useContext(DropdownMenuContext);\n const nodeRef = useRef<HTMLDivElement | null>(null);\n const [contentNode, setContentNode] = useState<HTMLDivElement | null>(null);\n const [position, setPosition] = useState<FloatingPosition | null>(null);\n\n const open = ctx?.open ?? false;\n const setOpen = ctx?.setOpen;\n const triggerRef = ctx?.triggerRef;\n\n const reposition = useCallback(() => {\n const trigger = triggerRef?.current;\n const node = nodeRef.current;\n if (!trigger || !node) return;\n setPosition(\n computeFloatingPosition(\n trigger.getBoundingClientRect(),\n node.getBoundingClientRect(),\n placement,\n gap,\n node,\n ),\n );\n }, [placement, gap, triggerRef]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: contentNode re-runs this once Presence mounts the div\n useLayoutEffect(() => {\n if (open) reposition();\n }, [open, reposition, contentNode]);\n\n useEffect(() => {\n if (!open) return;\n const onScrollOrResize = () => reposition();\n window.addEventListener('resize', onScrollOrResize);\n window.addEventListener('scroll', onScrollOrResize, true);\n return () => {\n window.removeEventListener('resize', onScrollOrResize);\n window.removeEventListener('scroll', onScrollOrResize, true);\n };\n }, [open, reposition]);\n\n const handleKeyDown = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n if (!nodeRef.current) return;\n const items = [...nodeRef.current.querySelectorAll<HTMLElement>(ITEM_SELECTOR)].filter(\n (el) => !el.hasAttribute('disabled') && el.getAttribute('aria-disabled') !== 'true',\n );\n if (items.length === 0) return;\n const current = items.indexOf(document.activeElement as HTMLElement);\n const move = (next: number) => {\n event.preventDefault();\n items[(next + items.length) % items.length]?.focus();\n };\n if (event.key === 'ArrowDown') move(current + 1);\n else if (event.key === 'ArrowUp') move(current - 1);\n else if (event.key === 'Home') move(0);\n else if (event.key === 'End') move(items.length - 1);\n };\n\n if (ctx == null) return null;\n\n return (\n <Portal container={container}>\n <Presence present={open}>\n <FocusScope\n asChild\n trapped\n loop\n onUnmountAutoFocus={(event) => {\n event.preventDefault();\n triggerRef?.current?.focus();\n }}\n >\n <DismissableLayer\n asChild\n deferPointerDownOutside\n onEscapeKeyDown={() => setOpen?.(false)}\n onPointerDownOutside={() => setOpen?.(false)}\n onFocusOutside={() => setOpen?.(false)}\n >\n <div\n ref={(node) => {\n nodeRef.current = node;\n setContentNode(node);\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as { current: HTMLDivElement | null }).current = node;\n }}\n id={ctx.contentId}\n role=\"menu\"\n data-slot=\"dropdown-menu-content\"\n data-side={position?.side}\n data-state={position ? (open ? 'open' : 'closed') : undefined}\n className={cn(styles.content, className)}\n style={\n position\n ? { top: position.top, left: position.left }\n : { top: 0, left: 0, opacity: 0, pointerEvents: 'none' }\n }\n onKeyDown={handleKeyDown}\n {...rest}\n >\n {children}\n </div>\n </DismissableLayer>\n </FocusScope>\n </Presence>\n </Portal>\n );\n}\n\nDropdownMenuContent.displayName = 'DropdownMenuContent';\n","'use client';\n\nimport { type ButtonHTMLAttributes, type ReactNode, type Ref, useContext } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { DropdownMenuContext } from './context';\nimport styles from './DropdownMenu.module.css';\n\nexport interface DropdownMenuItemProps\n extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'onSelect'> {\n ref?: Ref<HTMLButtonElement>;\n icon?: ReactNode;\n destructive?: boolean;\n // fired on activation; the menu closes afterwards unless you call preventDefault\n onSelect?: (event: { preventDefault: () => void }) => void;\n}\n\nexport function DropdownMenuItem({\n ref,\n icon,\n destructive = false,\n disabled,\n className,\n children,\n onSelect,\n onClick,\n ...rest\n}: DropdownMenuItemProps) {\n const ctx = useContext(DropdownMenuContext);\n\n return (\n <button\n ref={ref}\n type=\"button\"\n role=\"menuitem\"\n tabIndex={-1}\n disabled={disabled}\n data-slot=\"dropdown-menu-item\"\n data-destructive={destructive || undefined}\n className={cn(styles.item, className)}\n onClick={(event) => {\n onClick?.(event);\n let prevented = false;\n onSelect?.({ preventDefault: () => (prevented = true) });\n if (!prevented) ctx?.setOpen(false);\n }}\n {...rest}\n >\n {icon != null ? (\n <span data-slot=\"dropdown-menu-item-icon\" className={styles.itemIcon}>\n {icon}\n </span>\n ) : null}\n <span className={styles.itemLabel}>{children}</span>\n </button>\n );\n}\n\nDropdownMenuItem.displayName = 'DropdownMenuItem';\n","import type { HTMLAttributes, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './DropdownMenu.module.css';\n\nexport interface DropdownMenuLabelProps extends HTMLAttributes<HTMLDivElement> {\n ref?: Ref<HTMLDivElement>;\n}\n\nexport function DropdownMenuLabel({ ref, className, ...rest }: DropdownMenuLabelProps) {\n return (\n <div\n ref={ref}\n data-slot=\"dropdown-menu-label\"\n className={cn(styles.label, className)}\n {...rest}\n />\n );\n}\n\nDropdownMenuLabel.displayName = 'DropdownMenuLabel';\n","'use client';\n\nimport { type ReactNode, useCallback, useMemo, useState } from 'react';\nimport { DropdownMenuRadioContext } from './context';\n\nexport interface DropdownMenuRadioGroupProps {\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n children: ReactNode;\n}\n\nexport function DropdownMenuRadioGroup({\n value: valueProp,\n defaultValue,\n onValueChange,\n children,\n}: DropdownMenuRadioGroupProps) {\n const [uncontrolled, setUncontrolled] = useState(defaultValue);\n const value = valueProp ?? uncontrolled;\n\n const select = useCallback(\n (next: string) => {\n if (valueProp == null) setUncontrolled(next);\n onValueChange?.(next);\n },\n [valueProp, onValueChange],\n );\n\n const context = useMemo(() => ({ value, select }), [value, select]);\n\n return (\n <DropdownMenuRadioContext.Provider value={context}>\n {children}\n </DropdownMenuRadioContext.Provider>\n );\n}\n\nDropdownMenuRadioGroup.displayName = 'DropdownMenuRadioGroup';\n","'use client';\n\nimport { type ButtonHTMLAttributes, type ReactNode, type Ref, useContext } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { CheckIcon } from './CheckIcon';\nimport { DropdownMenuContext, DropdownMenuRadioContext } from './context';\nimport styles from './DropdownMenu.module.css';\n\nexport interface DropdownMenuRadioItemProps\n extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'value'> {\n ref?: Ref<HTMLButtonElement>;\n value: string;\n}\n\nexport function DropdownMenuRadioItem({\n ref,\n value,\n disabled,\n className,\n children,\n onClick,\n ...rest\n}: DropdownMenuRadioItemProps) {\n const menu = useContext(DropdownMenuContext);\n const group = useContext(DropdownMenuRadioContext);\n const checked = group?.value === value;\n\n return (\n <button\n ref={ref}\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={checked}\n tabIndex={-1}\n disabled={disabled}\n data-slot=\"dropdown-menu-radio-item\"\n className={cn(styles.item, styles.itemSelectable, className)}\n onClick={(event) => {\n onClick?.(event);\n group?.select(value);\n menu?.setOpen(false);\n }}\n {...rest}\n >\n <span data-slot=\"dropdown-menu-item-indicator\" className={styles.itemIndicator} aria-hidden>\n {checked ? <CheckIcon /> : null}\n </span>\n <span className={styles.itemLabel}>{children as ReactNode}</span>\n </button>\n );\n}\n\nDropdownMenuRadioItem.displayName = 'DropdownMenuRadioItem';\n","import type { HTMLAttributes, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './DropdownMenu.module.css';\n\nexport interface DropdownMenuSeparatorProps extends HTMLAttributes<HTMLHRElement> {\n ref?: Ref<HTMLHRElement>;\n}\n\nexport function DropdownMenuSeparator({ ref, className, ...rest }: DropdownMenuSeparatorProps) {\n return (\n <hr\n ref={ref}\n data-slot=\"dropdown-menu-separator\"\n className={cn(styles.separator, className)}\n {...rest}\n />\n );\n}\n\nDropdownMenuSeparator.displayName = 'DropdownMenuSeparator';\n","'use client';\n\nimport { cloneElement, isValidElement, type ReactElement, useContext } from 'react';\nimport { DropdownMenuContext } from './context';\n\nexport interface DropdownMenuTriggerProps {\n children: ReactElement;\n}\n\nexport function DropdownMenuTrigger({ children }: DropdownMenuTriggerProps) {\n const ctx = useContext(DropdownMenuContext);\n if (ctx == null || !isValidElement(children)) return children;\n const { open, setOpen, triggerRef, contentId } = ctx;\n\n const child = children as ReactElement<Record<string, unknown>>;\n const childRef = (child.props as { ref?: unknown }).ref;\n const childOnClick = child.props.onClick as ((event: unknown) => void) | undefined;\n\n return cloneElement(child, {\n ref: (node: HTMLElement | null) => {\n triggerRef.current = node;\n if (typeof childRef === 'function') childRef(node);\n else if (childRef && typeof childRef === 'object')\n (childRef as { current: HTMLElement | null }).current = node;\n },\n onClick: (event: unknown) => {\n childOnClick?.(event);\n setOpen(!open);\n },\n 'aria-haspopup': 'menu',\n 'aria-expanded': open,\n 'aria-controls': open ? contentId : undefined,\n 'data-slot': 'dropdown-menu-trigger',\n 'data-state': open ? 'open' : 'closed',\n });\n}\n\nDropdownMenuTrigger.displayName = 'DropdownMenuTrigger';\n","'use client';\n\nimport { type ReactNode, useCallback, useId, useMemo, useRef, useState } from 'react';\nimport { DropdownMenuContext } from './context';\nimport { DropdownMenuCheckboxItem } from './DropdownMenuCheckboxItem';\nimport { DropdownMenuContent } from './DropdownMenuContent';\nimport { DropdownMenuItem } from './DropdownMenuItem';\nimport { DropdownMenuLabel } from './DropdownMenuLabel';\nimport { DropdownMenuRadioGroup } from './DropdownMenuRadioGroup';\nimport { DropdownMenuRadioItem } from './DropdownMenuRadioItem';\nimport { DropdownMenuSeparator } from './DropdownMenuSeparator';\nimport { DropdownMenuTrigger } from './DropdownMenuTrigger';\n\nexport interface DropdownMenuProps {\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n children: ReactNode;\n}\n\nexport function DropdownMenu({\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n children,\n}: DropdownMenuProps) {\n const [uncontrolled, setUncontrolled] = useState(defaultOpen);\n const open = openProp ?? uncontrolled;\n const triggerRef = useRef<HTMLElement | null>(null);\n const contentId = useId();\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (openProp == null) setUncontrolled(next);\n onOpenChange?.(next);\n },\n [openProp, onOpenChange],\n );\n\n const context = useMemo(\n () => ({ open, setOpen, triggerRef, contentId }),\n [open, setOpen, contentId],\n );\n\n return <DropdownMenuContext.Provider value={context}>{children}</DropdownMenuContext.Provider>;\n}\n\nDropdownMenu.displayName = 'DropdownMenu';\nDropdownMenu.Trigger = DropdownMenuTrigger;\nDropdownMenu.Content = DropdownMenuContent;\nDropdownMenu.Item = DropdownMenuItem;\nDropdownMenu.CheckboxItem = DropdownMenuCheckboxItem;\nDropdownMenu.RadioGroup = DropdownMenuRadioGroup;\nDropdownMenu.RadioItem = DropdownMenuRadioItem;\nDropdownMenu.Separator = DropdownMenuSeparator;\nDropdownMenu.Label = DropdownMenuLabel;\n",".fixedLayout {\n position: fixed;\n left: 0;\n right: 0;\n z-index: var(--tgui--z-sticky, 100);\n box-sizing: border-box;\n}\n\n.top {\n top: 0;\n padding-top: var(--tgui--safe-area-top);\n}\n\n.bottom {\n bottom: 0;\n padding-bottom: calc(var(--tgui--safe-area-bottom) + var(--tgui--content-safe-area-bottom));\n}\n","import type { HTMLAttributes, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './FixedLayout.module.css';\n\nexport interface FixedLayoutProps extends HTMLAttributes<HTMLDivElement> {\n ref?: Ref<HTMLDivElement>;\n vertical?: 'top' | 'bottom';\n}\n\nexport function FixedLayout({ ref, vertical = 'bottom', className, ...rest }: FixedLayoutProps) {\n return (\n <div\n ref={ref}\n data-slot=\"fixed-layout\"\n className={cn(styles.fixedLayout, styles[vertical], className)}\n {...rest}\n />\n );\n}\n\nFixedLayout.displayName = 'FixedLayout';\n",".footnote {\n font-size: var(--tgui--font-footnote-size);\n line-height: var(--tgui--font-footnote-line);\n letter-spacing: var(--tgui--font-footnote-tracking);\n}\n","import type { Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { Typography, type TypographyProps } from '../Typography';\nimport styles from './Footnote.module.css';\n\nexport interface FootnoteProps extends TypographyProps {\n ref?: Ref<HTMLElement>;\n}\n\nexport function Footnote({ ref, className, Component = 'span', ...rest }: FootnoteProps) {\n return (\n <Typography\n data-slot=\"footnote\"\n ref={ref}\n Component={Component}\n className={cn(styles.footnote, className)}\n {...rest}\n />\n );\n}\n\nFootnote.displayName = 'Footnote';\n",".headline {\n font-size: var(--tgui--font-headline-size);\n line-height: var(--tgui--font-headline-line);\n letter-spacing: var(--tgui--font-headline-tracking);\n}\n","import type { Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { Typography, type TypographyProps } from '../Typography';\nimport styles from './Headline.module.css';\n\nexport interface HeadlineProps extends TypographyProps {\n ref?: Ref<HTMLElement>;\n}\n\nexport function Headline({\n ref,\n weight = '2',\n className,\n Component = 'h5',\n ...rest\n}: HeadlineProps) {\n return (\n <Typography\n data-slot=\"headline\"\n ref={ref}\n weight={weight}\n Component={Component}\n className={cn(styles.headline, className)}\n {...rest}\n />\n );\n}\n\nHeadline.displayName = 'Headline';\n",".root {\n --tgui--hscroll-fade: 36px;\n --tgui--hscroll-bg: var(--tgui--bg);\n position: relative;\n min-width: 0;\n max-width: 100%;\n}\n\n.edge {\n position: absolute;\n top: 0;\n bottom: 0;\n width: var(--tgui--hscroll-fade);\n z-index: 1;\n opacity: 0;\n pointer-events: none;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .edge {\n transition: opacity 0.2s ease;\n }\n}\n\n.edge--start {\n left: 0;\n background: linear-gradient(to right, var(--tgui--hscroll-bg), transparent);\n}\n\n.edge--end {\n right: 0;\n background: linear-gradient(to left, var(--tgui--hscroll-bg), transparent);\n}\n\n.root[data-start=\"true\"] .edge--start,\n.root[data-end=\"true\"] .edge--end {\n opacity: 1;\n}\n\n.scroller {\n display: flex;\n min-width: 0;\n overflow-x: auto;\n overflow-y: hidden;\n scrollbar-width: none;\n -ms-overflow-style: none;\n -webkit-overflow-scrolling: touch;\n overscroll-behavior-x: contain;\n}\n\n.scroller::-webkit-scrollbar {\n display: none;\n}\n\n.scroller:focus-visible {\n outline: var(--tgui--focus-ring);\n outline-offset: calc(-1 * var(--tgui--focus-ring-offset));\n border-radius: var(--tgui--radius-sm);\n}\n\n.scroller > * {\n -webkit-user-drag: none;\n}\n\n@media (hover: hover) and (pointer: fine) {\n .scroller {\n cursor: grab;\n }\n\n .scroller[data-grabbing=\"true\"] {\n cursor: grabbing;\n }\n\n .scroller[data-grabbing=\"true\"] * {\n pointer-events: none;\n }\n}\n\n.snap {\n scroll-snap-type: x mandatory;\n}\n\n.snap > * {\n scroll-snap-align: start;\n}\n","'use client';\n\nimport {\n type HTMLAttributes,\n type PointerEvent as ReactPointerEvent,\n type Ref,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './HorizontalScroll.module.css';\n\nconst DRAG_THRESHOLD = 4;\n\nexport interface HorizontalScrollProps extends HTMLAttributes<HTMLDivElement> {\n ref?: Ref<HTMLDivElement>;\n snap?: boolean;\n fade?: boolean;\n // names the scroll region for assistive tech; the region is keyboard-focusable\n scrollLabel?: string;\n}\n\nexport function HorizontalScroll({\n ref,\n snap = false,\n fade = true,\n scrollLabel = 'Scrollable content',\n className,\n children,\n ...rest\n}: HorizontalScrollProps) {\n const scrollerRef = useRef<HTMLDivElement | null>(null);\n const [edges, setEdges] = useState({ start: false, end: false });\n const drag = useRef({ down: false, moved: false, startX: 0, startScroll: 0 });\n\n const measure = useCallback(() => {\n const el = scrollerRef.current;\n if (!el) return;\n const start = el.scrollLeft > 1;\n const end = el.scrollLeft < el.scrollWidth - el.clientWidth - 1;\n setEdges((prev) => (prev.start === start && prev.end === end ? prev : { start, end }));\n }, []);\n\n useEffect(() => {\n const el = scrollerRef.current;\n if (!el) return;\n measure();\n el.addEventListener('scroll', measure, { passive: true });\n const observer = typeof ResizeObserver !== 'undefined' ? new ResizeObserver(measure) : null;\n observer?.observe(el);\n return () => {\n el.removeEventListener('scroll', measure);\n observer?.disconnect();\n };\n }, [measure]);\n\n const onPointerDown = (event: ReactPointerEvent<HTMLDivElement>) => {\n if (event.pointerType !== 'mouse' || event.button !== 0) return;\n const el = scrollerRef.current;\n if (!el) return;\n drag.current = {\n down: true,\n moved: false,\n startX: event.clientX,\n startScroll: el.scrollLeft,\n };\n };\n\n const onPointerMove = (event: ReactPointerEvent<HTMLDivElement>) => {\n const state = drag.current;\n const el = scrollerRef.current;\n if (!state.down || !el) return;\n const dx = event.clientX - state.startX;\n if (!state.moved) {\n if (Math.abs(dx) < DRAG_THRESHOLD) return;\n state.moved = true;\n el.setPointerCapture(event.pointerId);\n el.dataset.grabbing = 'true';\n el.style.scrollBehavior = 'auto';\n }\n event.preventDefault();\n el.scrollLeft = state.startScroll - dx;\n };\n\n const endDrag = (event: ReactPointerEvent<HTMLDivElement>) => {\n const el = scrollerRef.current;\n if (el && drag.current.moved) {\n el.releasePointerCapture?.(event.pointerId);\n delete el.dataset.grabbing;\n el.style.scrollBehavior = '';\n }\n drag.current.down = false;\n };\n\n return (\n <div\n ref={ref}\n data-slot=\"horizontal-scroll\"\n className={cn(styles.root, className)}\n data-start={fade ? String(edges.start) : undefined}\n data-end={fade ? String(edges.end) : undefined}\n {...rest}\n >\n {fade ? (\n <>\n <span\n data-slot=\"horizontal-scroll-fade-start\"\n className={cn(styles.edge, styles['edge--start'])}\n aria-hidden\n />\n <span\n data-slot=\"horizontal-scroll-fade-end\"\n className={cn(styles.edge, styles['edge--end'])}\n aria-hidden\n />\n </>\n ) : null}\n {/* biome-ignore lint/a11y/useSemanticElements: a scroll region is a group, not a fieldset */}\n <div\n ref={scrollerRef}\n data-slot=\"horizontal-scroll-viewport\"\n className={cn(styles.scroller, snap && styles.snap)}\n // biome-ignore lint/a11y/noNoninteractiveTabindex: a scroll region must be keyboard-focusable to arrow-scroll\n tabIndex={0}\n role=\"group\"\n aria-label={scrollLabel}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={endDrag}\n onPointerCancel={endDrag}\n onDragStart={(event) => event.preventDefault()}\n onClickCapture={(event) => {\n if (drag.current.moved) {\n event.stopPropagation();\n drag.current.moved = false;\n }\n }}\n >\n {children}\n </div>\n </div>\n );\n}\n\nHorizontalScroll.displayName = 'HorizontalScroll';\n",".iconButton {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n padding: 0;\n border: none;\n overflow: hidden;\n border-radius: 10px;\n color: var(--tgui--link);\n background: transparent;\n}\n\n.circle {\n border-radius: 50%;\n}\n\n.iconButton:focus-visible {\n outline: var(--tgui--focus-ring);\n outline-offset: var(--tgui--focus-ring-offset);\n}\n\n.s {\n width: 30px;\n height: 30px;\n}\n\n.m {\n width: 36px;\n height: 36px;\n}\n\n.l {\n width: 44px;\n height: 44px;\n}\n\n.iconButton::after {\n content: \"\";\n position: absolute;\n inset: 0;\n opacity: 0;\n background: currentColor;\n}\n\n.ios::after {\n content: none;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .iconButton::after {\n transition: opacity 0.15s ease-out;\n }\n}\n\n@media (hover: hover) and (pointer: fine) {\n .iconButton:not([data-disabled]):hover::after {\n opacity: 0.08;\n }\n}\n\n.icon {\n display: flex;\n z-index: var(--tgui--z-base);\n}\n\n.icon svg {\n display: block;\n}\n\n.mode-bezeled {\n color: var(--tgui--link);\n background: var(--tgui--accent-fill);\n}\n\n.mode-plain {\n color: var(--tgui--link);\n}\n\n.mode-gray {\n color: var(--tgui--label);\n background: var(--tgui--fill-tertiary);\n}\n\n.mode-outline {\n color: var(--tgui--label);\n box-shadow: inset 0 0 0 1px var(--tgui--separator);\n}\n","import { cva } from 'class-variance-authority';\nimport styles from './IconButton.module.css';\n\nexport type IconButtonMode = 'bezeled' | 'plain' | 'gray' | 'outline';\nexport type IconButtonSize = 's' | 'm' | 'l';\n\nexport const iconButton = cva(styles.iconButton, {\n variants: {\n mode: {\n bezeled: styles['mode-bezeled'],\n plain: styles['mode-plain'],\n gray: styles['mode-gray'],\n outline: styles['mode-outline'],\n },\n size: { s: styles.s, m: styles.m, l: styles.l },\n circle: { true: styles.circle },\n platform: { ios: styles.ios, base: null },\n },\n defaultVariants: { mode: 'plain', size: 'm' },\n});\n","'use client';\n\nimport type { AllHTMLAttributes, ElementType, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { Tappable } from '../Tappable';\nimport { useTgui } from '../TguiProvider';\nimport styles from './IconButton.module.css';\nimport { type IconButtonMode, type IconButtonSize, iconButton } from './IconButton.variants';\n\nexport type { IconButtonMode, IconButtonSize };\n\nexport interface IconButtonProps extends Omit<AllHTMLAttributes<HTMLElement>, 'size'> {\n ref?: Ref<HTMLElement>;\n Component?: ElementType;\n mode?: IconButtonMode;\n size?: IconButtonSize;\n circle?: boolean;\n}\n\nexport function IconButton({\n ref,\n Component = 'button',\n mode = 'plain',\n size = 'm',\n circle = false,\n type,\n className,\n children,\n ...rest\n}: IconButtonProps) {\n const { platform } = useTgui();\n\n return (\n <Tappable\n ref={ref}\n Component={Component}\n type={Component === 'button' ? (type ?? 'button') : type}\n data-slot=\"icon-button\"\n className={cn(iconButton({ mode, size, circle, platform }), className)}\n {...rest}\n >\n <span data-slot=\"icon-button-icon\" className={styles.icon}>\n {children}\n </span>\n </Tappable>\n );\n}\n\nIconButton.displayName = 'IconButton';\n",".frame {\n position: relative;\n display: inline-block;\n overflow: hidden;\n flex-shrink: 0;\n background: var(--tgui--fill);\n line-height: 0;\n}\n\n.bordered {\n box-shadow: inset 0 0 0 1px var(--tgui--separator);\n}\n\n.img {\n display: block;\n width: 100%;\n height: 100%;\n object-fit: var(--tgui--image-fit, cover);\n}\n\n.frame[data-state=\"loading\"] .img {\n opacity: 0;\n}\n\n.placeholder,\n.fallback {\n position: absolute;\n inset: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--tgui--label-tertiary);\n}\n\n.placeholder {\n overflow: hidden;\n background: var(--tgui--fill);\n}\n\n.placeholder::after {\n content: \"\";\n position: absolute;\n inset: 0;\n transform: translateX(-100%);\n background: linear-gradient(\n 90deg,\n transparent,\n color-mix(in srgb, var(--tgui--label) 6%, transparent),\n transparent\n );\n animation: tgui-image-shimmer 1.5s ease-in-out infinite;\n}\n\n@keyframes tgui-image-shimmer {\n to {\n transform: translateX(100%);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .placeholder::after {\n animation: none;\n }\n}\n\n.fallback svg {\n width: 32%;\n height: 32%;\n max-width: 48px;\n max-height: 48px;\n}\n","'use client';\n\nimport {\n type CSSProperties,\n type ImgHTMLAttributes,\n type ReactNode,\n type Ref,\n useState,\n} from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './Image.module.css';\n\ntype Fit = 'cover' | 'contain' | 'fill' | 'none' | 'scale-down';\n\nexport interface ImageProps extends Omit<ImgHTMLAttributes<HTMLImageElement>, 'width' | 'height'> {\n ref?: Ref<HTMLImageElement>;\n size?: number;\n width?: number | string;\n height?: number | string;\n aspectRatio?: number | string;\n fit?: Fit;\n radius?: number | 'full';\n bordered?: boolean;\n fallback?: ReactNode;\n}\n\nconst BrokenIcon = (\n <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden>\n <path\n d=\"M3 5h18v14H3zM3 15l5-5 4 4 3-3 6 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nexport function Image({\n ref,\n size,\n width,\n height,\n aspectRatio,\n fit = 'cover',\n radius,\n bordered = false,\n fallback = BrokenIcon,\n src,\n alt = '',\n className,\n style,\n onLoad,\n onError,\n ...rest\n}: ImageProps) {\n const [failedSrc, setFailedSrc] = useState<string | null>(null);\n const [loaded, setLoaded] = useState(false);\n const errored = src != null && src === failedSrc;\n\n const frameStyle: CSSProperties = {\n ...style,\n width: size ?? width,\n height: size ?? height,\n aspectRatio,\n borderRadius: radius === 'full' ? '50%' : radius,\n '--tgui--image-fit': fit,\n } as CSSProperties;\n\n return (\n <div\n data-slot=\"image\"\n data-state={errored ? 'error' : loaded ? 'loaded' : 'loading'}\n data-bordered={bordered || undefined}\n className={cn(styles.frame, bordered && styles.bordered, className)}\n style={frameStyle}\n >\n {src != null && !errored ? (\n <img\n ref={ref}\n data-slot=\"image-img\"\n className={styles.img}\n src={src}\n alt={alt}\n draggable={false}\n onLoad={(event) => {\n setLoaded(true);\n onLoad?.(event);\n }}\n onError={(event) => {\n setFailedSrc(src);\n onError?.(event);\n }}\n {...rest}\n />\n ) : null}\n {!loaded && !errored ? (\n <div data-slot=\"image-placeholder\" className={styles.placeholder} aria-hidden />\n ) : null}\n {errored ? (\n <div data-slot=\"image-fallback\" className={styles.fallback} aria-hidden>\n {fallback}\n </div>\n ) : null}\n </div>\n );\n}\n\nImage.displayName = 'Image';\n","import { createContext } from 'react';\nimport type { InlineButtonsMode } from './InlineButtons.variants';\n\nexport interface InlineButtonsContextValue {\n mode: InlineButtonsMode;\n}\n\nexport const InlineButtonsContext = createContext<InlineButtonsContextValue>({ mode: 'bezeled' });\n\nInlineButtonsContext.displayName = 'InlineButtonsContext';\n",".group {\n display: flex;\n gap: 8px;\n overflow-x: auto;\n scroll-snap-type: x proximity;\n scrollbar-width: none;\n -ms-overflow-style: none;\n -webkit-overflow-scrolling: touch;\n}\n\n.group::-webkit-scrollbar {\n display: none;\n}\n\n.item {\n display: flex;\n flex: 1 1 0;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 4px;\n min-width: 72px;\n padding: 10px 4px;\n border: 0;\n border-radius: 12px;\n color: var(--tgui--link-strong);\n scroll-snap-align: start;\n}\n\n/* the row is an overflow scroller – an outset ring would be clipped */\n.item:focus-visible {\n outline: var(--tgui--focus-ring);\n outline-offset: calc(-1 * var(--tgui--focus-ring-offset));\n}\n\n.mode-bezeled {\n background: var(--tgui--accent-fill);\n}\n\n.mode-plain {\n background: transparent;\n}\n\n.mode-gray {\n color: var(--tgui--label);\n background: var(--tgui--fill-tertiary);\n}\n\n.icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 24px;\n height: 24px;\n}\n\n.icon svg {\n display: block;\n width: 100%;\n height: 100%;\n}\n\n.label {\n max-width: 100%;\n overflow: hidden;\n color: inherit;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n","import { cva } from 'class-variance-authority';\nimport styles from './InlineButtons.module.css';\n\nexport type InlineButtonsMode = 'bezeled' | 'plain' | 'gray';\n\nexport const inlineButtonsItem = cva(styles.item, {\n variants: {\n mode: {\n bezeled: styles['mode-bezeled'],\n plain: styles['mode-plain'],\n gray: styles['mode-gray'],\n },\n },\n defaultVariants: { mode: 'bezeled' },\n});\n","'use client';\n\nimport { type ButtonHTMLAttributes, type ReactNode, type Ref, useContext } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { Caption } from '../Caption';\nimport { Tappable } from '../Tappable';\nimport { InlineButtonsContext } from './context';\nimport styles from './InlineButtons.module.css';\nimport { inlineButtonsItem } from './InlineButtons.variants';\n\nexport interface InlineButtonsItemProps\n extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'children'> {\n ref?: Ref<HTMLButtonElement>;\n icon: ReactNode;\n children: ReactNode;\n}\n\nexport function InlineButtonsItem({\n ref,\n icon,\n children,\n className,\n ...rest\n}: InlineButtonsItemProps) {\n const { mode } = useContext(InlineButtonsContext);\n\n return (\n <Tappable\n ref={ref}\n Component=\"button\"\n type=\"button\"\n interactiveAnimation=\"opacity\"\n data-slot=\"inline-buttons-item\"\n className={cn(inlineButtonsItem({ mode }), className)}\n {...rest}\n >\n <span data-slot=\"inline-buttons-item-icon\" className={styles.icon}>\n {icon}\n </span>\n <Caption data-slot=\"inline-buttons-item-label\" className={styles.label} level=\"2\" weight=\"2\">\n {children}\n </Caption>\n </Tappable>\n );\n}\n\nInlineButtonsItem.displayName = 'InlineButtonsItem';\n","'use client';\n\nimport type { HTMLAttributes, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { InlineButtonsContext } from './context';\nimport styles from './InlineButtons.module.css';\nimport type { InlineButtonsMode } from './InlineButtons.variants';\nimport { InlineButtonsItem } from './InlineButtonsItem';\n\nexport type { InlineButtonsMode };\n\nexport interface InlineButtonsProps extends HTMLAttributes<HTMLDivElement> {\n ref?: Ref<HTMLDivElement>;\n mode?: InlineButtonsMode;\n}\n\nexport function InlineButtons({\n ref,\n mode = 'bezeled',\n className,\n children,\n ...rest\n}: InlineButtonsProps) {\n return (\n <InlineButtonsContext.Provider value={{ mode }}>\n {/* biome-ignore lint/a11y/useSemanticElements: a row of action buttons, not a form control group; <fieldset> would add a border box and legend semantics we don't want */}\n <div\n ref={ref}\n role=\"group\"\n data-slot=\"inline-buttons\"\n className={cn(styles.group, className)}\n {...rest}\n >\n {children}\n </div>\n </InlineButtonsContext.Provider>\n );\n}\n\nInlineButtons.displayName = 'InlineButtons';\nInlineButtons.Item = InlineButtonsItem;\n",".base {\n position: relative;\n padding: 20px 22px 16px;\n background: var(--tgui--bg);\n}\n\n.body {\n display: flex;\n align-items: center;\n box-sizing: border-box;\n padding: var(--tgui--field-padding-y) var(--tgui--field-padding-x);\n}\n\n.body > :not(:first-child) {\n margin-inline-start: var(--tgui--field-gap);\n}\n\n.base .body {\n border-radius: 14px;\n box-shadow: 0 0 0 1.5px var(--tgui--separator-opaque);\n}\n\n.ios .body {\n min-height: var(--tgui--field-min-height);\n border-radius: var(--tgui--field-radius);\n background: var(--tgui--fill);\n}\n\n.align-start .body {\n align-items: flex-start;\n}\n\n.before,\n.after {\n display: flex;\n align-items: center;\n}\n\n.header {\n position: absolute;\n top: 6px;\n inset-inline-start: 32px;\n margin: 0;\n max-width: calc(100% - 76px);\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n padding: 0 6px;\n border-radius: 5px;\n color: var(--tgui--label-secondary);\n background: var(--tgui--bg);\n}\n\n/* iOS filled fields don't show a floating label – keep it for assistive tech only */\n.ios .header {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n border: 0;\n}\n\n.base[data-state=\"focused\"] .body {\n box-shadow: 0 0 0 2px var(--tgui--link);\n}\n\n.base[data-state=\"focused\"] .header {\n color: var(--tgui--link-strong);\n}\n\n.base[data-state=\"error\"] .body {\n box-shadow: 0 0 0 2px var(--tgui--destructive);\n}\n\n.base[data-state=\"error\"] .header {\n color: var(--tgui--destructive-strong);\n}\n\n.ios[data-state=\"error\"] .body {\n box-shadow: 0 0 0 1.5px var(--tgui--destructive);\n}\n\n.base[data-disabled],\n.ios[data-disabled] {\n pointer-events: none;\n}\n\n.ios[data-disabled] {\n opacity: 0.35;\n}\n","import type { ReactNode, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './FormField.module.css';\n\nexport type FormFieldStatus = 'default' | 'error' | 'focused';\n\nexport interface FormFieldProps {\n ref?: Ref<HTMLDivElement>;\n ios?: boolean;\n status?: FormFieldStatus;\n disabled?: boolean;\n alignStart?: boolean;\n header?: ReactNode;\n before?: ReactNode;\n after?: ReactNode;\n className?: string;\n children: ReactNode;\n}\n\nexport function FormField({\n ref,\n ios = false,\n status = 'default',\n disabled = false,\n alignStart = false,\n header,\n before,\n after,\n className,\n children,\n}: FormFieldProps) {\n return (\n <div\n ref={ref}\n data-slot=\"form-field\"\n data-state={status}\n data-disabled={disabled || undefined}\n className={cn(ios ? styles.ios : styles.base, alignStart && styles['align-start'], className)}\n aria-disabled={disabled || undefined}\n >\n {/* biome-ignore lint/a11y/noLabelWithoutControl: the control is the field passed in as children */}\n <label className={styles.body} data-slot=\"form-field-body\">\n {before != null ? (\n <span className={styles.before} data-slot=\"form-field-before\">\n {before}\n </span>\n ) : null}\n {children}\n {after != null ? (\n <span className={styles.after} data-slot=\"form-field-after\">\n {after}\n </span>\n ) : null}\n {/* inside the label so it names the control; hidden on iOS */}\n {header != null ? (\n <span className={styles.header} data-slot=\"form-field-label\">\n {header}\n </span>\n ) : null}\n </label>\n </div>\n );\n}\n\nFormField.displayName = 'FormField';\n",".field {\n display: block;\n width: 100%;\n margin: 0;\n padding: 0;\n border: 0;\n outline: 0;\n background: transparent;\n color: var(--tgui--label);\n text-overflow: ellipsis;\n}\n\n.field::placeholder {\n color: var(--tgui--label-tertiary);\n}\n\n.field::-webkit-outer-spin-button,\n.field::-webkit-inner-spin-button {\n appearance: none;\n}\n","'use client';\n\nimport {\n type FocusEvent,\n type InputHTMLAttributes,\n type ReactNode,\n type Ref,\n useState,\n} from 'react';\nimport { FormField } from '../FormField';\nimport { Subheadline } from '../Subheadline';\nimport { Text } from '../Text';\nimport { useTgui } from '../TguiProvider';\nimport styles from './Input.module.css';\n\nexport type InputStatus = 'default' | 'error' | 'focused';\n\nexport interface InputProps extends InputHTMLAttributes<HTMLInputElement> {\n ref?: Ref<HTMLInputElement>;\n header?: ReactNode;\n before?: ReactNode;\n after?: ReactNode;\n status?: InputStatus;\n}\n\nexport function Input({\n ref,\n type = 'text',\n header,\n before,\n after,\n status,\n disabled,\n className,\n onFocus,\n onBlur,\n ...rest\n}: InputProps) {\n const { platform } = useTgui();\n const ios = platform === 'ios';\n const [focused, setFocused] = useState(false);\n const state = status ?? (focused ? 'focused' : 'default');\n const Typography = ios ? Text : Subheadline;\n\n const handleFocus = (event: FocusEvent<HTMLInputElement>) => {\n if (!disabled) setFocused(true);\n onFocus?.(event);\n };\n const handleBlur = (event: FocusEvent<HTMLInputElement>) => {\n setFocused(false);\n onBlur?.(event);\n };\n\n return (\n <FormField\n ios={ios}\n status={state}\n disabled={disabled}\n header={header}\n before={before}\n after={after}\n className={className}\n >\n <Typography\n ref={ref as Ref<HTMLElement>}\n Component=\"input\"\n data-slot=\"input\"\n className={styles.field}\n type={type}\n disabled={disabled}\n aria-invalid={state === 'error' || undefined}\n onFocus={handleFocus}\n onBlur={handleBlur}\n {...rest}\n />\n </FormField>\n );\n}\n\nInput.displayName = 'Input';\n",".large-title {\n font-size: var(--tgui--font-large-title-size);\n line-height: var(--tgui--font-large-title-line);\n letter-spacing: var(--tgui--font-large-title-tracking);\n}\n","import type { Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { Typography, type TypographyProps } from '../Typography';\nimport styles from './LargeTitle.module.css';\n\nexport interface LargeTitleProps extends TypographyProps {\n ref?: Ref<HTMLElement>;\n}\n\nexport function LargeTitle({\n ref,\n weight = '1',\n className,\n Component = 'h1',\n ...rest\n}: LargeTitleProps) {\n return (\n <Typography\n data-slot=\"large-title\"\n ref={ref}\n weight={weight}\n Component={Component}\n className={cn(styles['large-title'], className)}\n {...rest}\n />\n );\n}\n\nLargeTitle.displayName = 'LargeTitle';\n",".link {\n color: var(--tgui--link-strong);\n text-decoration: none;\n border-radius: 3px;\n outline-offset: var(--tgui--focus-ring-offset);\n}\n\n@media (hover: hover) and (pointer: fine) {\n .link:hover {\n text-decoration: underline;\n }\n}\n\n.link:focus-visible {\n outline: var(--tgui--focus-ring);\n}\n\n.icon {\n display: inline-block;\n width: 0.85em;\n height: 0.85em;\n margin-inline-start: 0.15em;\n vertical-align: -0.05em;\n}\n","import type { AnchorHTMLAttributes, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './Link.module.css';\n\nexport interface LinkProps extends AnchorHTMLAttributes<HTMLAnchorElement> {\n ref?: Ref<HTMLAnchorElement>;\n}\n\nexport function Link({ ref, target, rel, className, children, ...rest }: LinkProps) {\n const external = target === '_blank';\n return (\n <a\n ref={ref}\n target={target}\n rel={external ? (rel ?? 'noopener noreferrer') : rel}\n data-slot=\"link\"\n data-external={external || undefined}\n className={cn(styles.link, className)}\n {...rest}\n >\n {children}\n {external ? (\n <svg\n data-slot=\"link-icon\"\n className={styles.icon}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden\n >\n <path\n d=\"M6 3h7v7M13 3l-8 8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n ) : null}\n </a>\n );\n}\n\nLink.displayName = 'Link';\n",".list {\n box-sizing: border-box;\n /* grouped lists are inset from the screen edge, symmetrically, on both platforms */\n padding: var(--tgui--space-16) var(--tgui--page-margin);\n}\n\n.list > :not(:last-child) {\n margin-bottom: var(--tgui--space-32);\n}\n","'use client';\n\nimport type { ElementType, HTMLAttributes, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './List.module.css';\n\nexport interface ListProps extends HTMLAttributes<HTMLElement> {\n ref?: Ref<HTMLElement>;\n Component?: ElementType;\n}\n\nexport function List({ ref, Component = 'div', className, children, ...rest }: ListProps) {\n return (\n <Component ref={ref} data-slot=\"list\" className={cn(styles.list, className)} {...rest}>\n {children}\n </Component>\n );\n}\n\nList.displayName = 'List';\n",".nav {\n font-family: var(--tgui--font-family);\n}\n\n.list {\n display: flex;\n align-items: center;\n gap: 4px;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.page {\n min-width: 32px;\n height: 32px;\n padding: 0 8px;\n border: 0;\n border-radius: 8px;\n background: transparent;\n color: var(--tgui--label);\n font: inherit;\n font-size: 14px;\n cursor: pointer;\n}\n\n.page[aria-current=\"page\"] {\n color: var(--tgui--link-strong);\n font-weight: var(--tgui--weight-semibold);\n background: var(--tgui--accent-fill);\n}\n\n@media (hover: hover) and (pointer: fine) {\n .page:not([aria-current=\"page\"]):hover {\n background: var(--tgui--fill-tertiary);\n }\n}\n\n.page:focus-visible {\n outline: var(--tgui--focus-ring);\n outline-offset: var(--tgui--focus-ring-offset);\n}\n\n.dots {\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 32px;\n height: 32px;\n color: var(--tgui--label-secondary);\n}\n\n.dotList {\n display: flex;\n align-items: center;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.dot {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n padding: 0;\n border: 0;\n background: transparent;\n cursor: pointer;\n}\n\n.dot::after {\n content: \"\";\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background: var(--tgui--accent-fill);\n}\n\n.dot[data-active]::after {\n width: 8px;\n height: 8px;\n background: var(--tgui--accent-strong);\n}\n\n.dotGap {\n display: flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: 12px;\n height: 20px;\n}\n\n.dotGap::after {\n content: \"\";\n width: 3px;\n height: 3px;\n border-radius: 50%;\n background: var(--tgui--label-secondary);\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .dot::after {\n transition:\n width 0.15s ease,\n height 0.15s ease,\n background 0.15s ease;\n }\n}\n\n.dot:focus-visible {\n outline: var(--tgui--focus-ring);\n outline-offset: var(--tgui--focus-ring-offset);\n border-radius: 50%;\n}\n","export const DOTS = 'dots' as const;\n\nfunction range(start: number, end: number) {\n return Array.from({ length: end - start + 1 }, (_, index) => start + index);\n}\n\nexport function paginationRange(page: number, count: number, siblingCount: number) {\n const totalNumbers = siblingCount * 2 + 5;\n if (totalNumbers >= count) return range(1, count);\n\n const leftSibling = Math.max(page - siblingCount, 1);\n const rightSibling = Math.min(page + siblingCount, count);\n const showLeftDots = leftSibling > 2;\n const showRightDots = rightSibling < count - 1;\n\n if (!showLeftDots && showRightDots) {\n return [...range(1, 3 + siblingCount * 2), DOTS, count];\n }\n if (showLeftDots && !showRightDots) {\n return [1, DOTS, ...range(count - (3 + siblingCount * 2) + 1, count)];\n }\n return [1, DOTS, ...range(leftSibling, rightSibling), DOTS, count];\n}\n","'use client';\n\nimport type { HTMLAttributes, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './Pagination.module.css';\nimport { DOTS, paginationRange } from './paginationRange';\n\nexport interface CompactPaginationProps extends Omit<HTMLAttributes<HTMLElement>, 'onChange'> {\n ref?: Ref<HTMLElement>;\n page: number;\n count: number;\n onChange: (page: number) => void;\n siblingCount?: number;\n}\n\nexport function CompactPagination({\n ref,\n page,\n count,\n onChange,\n siblingCount = 1,\n className,\n ...rest\n}: CompactPaginationProps) {\n const items = paginationRange(page, count, siblingCount);\n\n return (\n <nav ref={ref} aria-label=\"Pagination\" className={cn(styles.nav, className)} {...rest}>\n <ul className={styles.dotList}>\n {items.map((item, index) =>\n item === DOTS ? (\n // biome-ignore lint/suspicious/noArrayIndexKey: ellipsis positions are stable per render\n <li key={`dots-${index}`} className={styles.dotGap} aria-hidden />\n ) : (\n <li key={item}>\n <button\n type=\"button\"\n className={styles.dot}\n data-active={item === page || undefined}\n aria-label={`Page ${item}`}\n aria-current={item === page ? 'page' : undefined}\n onClick={() => onChange(item)}\n />\n </li>\n ),\n )}\n </ul>\n </nav>\n );\n}\n\nCompactPagination.displayName = 'CompactPagination';\n","'use client';\n\nimport type { HTMLAttributes, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { IconButton } from '../IconButton';\nimport styles from './Pagination.module.css';\nimport { DOTS, paginationRange } from './paginationRange';\n\nexport interface PaginationProps extends Omit<HTMLAttributes<HTMLElement>, 'onChange'> {\n ref?: Ref<HTMLElement>;\n page: number;\n count: number;\n onChange: (page: number) => void;\n siblingCount?: number;\n}\n\nconst ArrowIcon = ({ direction }: { direction: 'prev' | 'next' }) => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 18 18\" fill=\"none\" aria-hidden>\n <path\n d={direction === 'prev' ? 'M11.25 4.5L6.75 9l4.5 4.5' : 'M6.75 4.5L11.25 9l-4.5 4.5'}\n stroke=\"currentColor\"\n strokeWidth=\"1.8\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nexport function Pagination({\n ref,\n page,\n count,\n onChange,\n siblingCount = 1,\n className,\n ...rest\n}: PaginationProps) {\n const items = paginationRange(page, count, siblingCount);\n\n return (\n <nav\n ref={ref}\n aria-label=\"Pagination\"\n data-slot=\"pagination\"\n className={cn(styles.nav, className)}\n {...rest}\n >\n <ul className={styles.list}>\n <li>\n <IconButton\n mode=\"gray\"\n size=\"s\"\n data-slot=\"pagination-previous\"\n aria-label=\"Previous page\"\n disabled={page <= 1}\n onClick={() => onChange(page - 1)}\n >\n <ArrowIcon direction=\"prev\" />\n </IconButton>\n </li>\n {items.map((item, index) =>\n item === DOTS ? (\n // biome-ignore lint/suspicious/noArrayIndexKey: ellipsis positions are stable per render\n <li key={`dots-${index}`} className={styles.dots} aria-hidden>\n …\n </li>\n ) : (\n <li key={item}>\n <button\n type=\"button\"\n data-slot=\"pagination-item\"\n className={styles.page}\n aria-current={item === page ? 'page' : undefined}\n onClick={() => onChange(item)}\n >\n {item}\n </button>\n </li>\n ),\n )}\n <li>\n <IconButton\n mode=\"gray\"\n size=\"s\"\n data-slot=\"pagination-next\"\n aria-label=\"Next page\"\n disabled={page >= count}\n onClick={() => onChange(page + 1)}\n >\n <ArrowIcon direction=\"next\" />\n </IconButton>\n </li>\n </ul>\n </nav>\n );\n}\n\nPagination.displayName = 'Pagination';\n",".pinInput {\n display: inline-flex;\n gap: 10px;\n}\n\n.cell {\n width: 44px;\n height: 52px;\n padding: 0;\n border: 0;\n border-radius: 12px;\n background: var(--tgui--fill);\n color: var(--tgui--label);\n font-family: var(--tgui--font-family);\n font-size: 24px;\n font-weight: var(--tgui--weight-semibold);\n text-align: center;\n caret-color: var(--tgui--link);\n box-shadow: inset 0 0 0 1.5px transparent;\n transition: box-shadow 0.12s ease;\n}\n\n.cell:focus {\n outline: none;\n box-shadow: inset 0 0 0 1.5px var(--tgui--link);\n}\n\n.cell:disabled {\n opacity: 0.4;\n}\n\n.pinInput[data-invalid] .cell {\n box-shadow: inset 0 0 0 1.5px var(--tgui--destructive);\n}\n","'use client';\n\nimport {\n type ClipboardEvent as ReactClipboardEvent,\n type KeyboardEvent as ReactKeyboardEvent,\n type Ref,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './PinInput.module.css';\n\nconst PATTERNS = {\n numeric: /[0-9]/,\n alphanumeric: /[a-z0-9]/i,\n};\n\nexport interface PinInputProps {\n ref?: Ref<HTMLDivElement>;\n length?: number;\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n onComplete?: (value: string) => void;\n type?: 'numeric' | 'alphanumeric';\n mask?: boolean;\n disabled?: boolean;\n invalid?: boolean;\n name?: string;\n 'aria-label'?: string;\n className?: string;\n}\n\nexport function PinInput({\n ref,\n length = 4,\n value: valueProp,\n defaultValue = '',\n onValueChange,\n onComplete,\n type = 'numeric',\n mask = false,\n disabled = false,\n invalid = false,\n name,\n 'aria-label': ariaLabel = 'Verification code',\n className,\n}: PinInputProps) {\n const [uncontrolled, setUncontrolled] = useState(defaultValue.slice(0, length));\n const raw = valueProp ?? uncontrolled;\n const chars = useMemo(() => {\n const next = raw.split('').slice(0, length);\n while (next.length < length) next.push('');\n return next;\n }, [raw, length]);\n\n const inputs = useRef<(HTMLInputElement | null)[]>([]);\n const pattern = PATTERNS[type];\n\n const commit = (next: string[]) => {\n const value = next.join('');\n if (valueProp == null) setUncontrolled(value);\n onValueChange?.(value);\n if (value.length === length && next.every(Boolean)) onComplete?.(value);\n };\n\n const focusCell = (index: number) => {\n const clamped = Math.max(0, Math.min(length - 1, index));\n inputs.current[clamped]?.focus();\n inputs.current[clamped]?.select();\n };\n\n const handleChange = (index: number, incoming: string) => {\n const char = incoming\n .split('')\n .reverse()\n .find((c) => pattern.test(c));\n if (!char) return;\n const next = [...chars];\n next[index] = char;\n commit(next);\n focusCell(index + 1);\n };\n\n const handleKeyDown = (index: number, event: ReactKeyboardEvent<HTMLInputElement>) => {\n if (event.key === 'Backspace') {\n event.preventDefault();\n const next = [...chars];\n if (next[index]) {\n next[index] = '';\n commit(next);\n } else if (index > 0) {\n next[index - 1] = '';\n commit(next);\n focusCell(index - 1);\n }\n } else if (event.key === 'ArrowLeft') {\n event.preventDefault();\n focusCell(index - 1);\n } else if (event.key === 'ArrowRight') {\n event.preventDefault();\n focusCell(index + 1);\n }\n };\n\n const handlePaste = (index: number, event: ReactClipboardEvent<HTMLInputElement>) => {\n event.preventDefault();\n const pasted = event.clipboardData\n .getData('text')\n .split('')\n .filter((c) => pattern.test(c));\n if (pasted.length === 0) return;\n const next = [...chars];\n for (let i = 0; i < pasted.length && index + i < length; i += 1) {\n next[index + i] = pasted[i];\n }\n commit(next);\n focusCell(index + pasted.length);\n };\n\n return (\n // biome-ignore lint/a11y/useSemanticElements: a labelled group of separate inputs; <fieldset> would add a border box and legend semantics we don't want\n <div\n ref={ref}\n data-slot=\"pin-input\"\n className={cn(styles.pinInput, className)}\n role=\"group\"\n aria-label={ariaLabel}\n data-invalid={invalid || undefined}\n >\n {chars.map((char, index) => (\n <input\n // biome-ignore lint/suspicious/noArrayIndexKey: fixed-length positional cells\n key={index}\n ref={(node) => {\n inputs.current[index] = node;\n }}\n data-slot=\"pin-input-cell\"\n className={styles.cell}\n aria-invalid={invalid || undefined}\n type={mask ? 'password' : 'text'}\n inputMode={type === 'numeric' ? 'numeric' : 'text'}\n autoComplete={index === 0 ? 'one-time-code' : 'off'}\n name={name ? `${name}-${index}` : undefined}\n aria-label={`${ariaLabel}, digit ${index + 1}`}\n maxLength={1}\n value={char}\n disabled={disabled}\n onChange={(event) => handleChange(index, event.target.value)}\n onKeyDown={(event) => handleKeyDown(index, event)}\n onPaste={(event) => handlePaste(index, event)}\n onFocus={(event) => event.target.select()}\n />\n ))}\n </div>\n );\n}\n\nPinInput.displayName = 'PinInput';\n",".level-1 {\n font-size: var(--tgui--font-title-1-size);\n line-height: var(--tgui--font-title-1-line);\n letter-spacing: var(--tgui--font-title-1-tracking);\n}\n\n.level-2 {\n font-size: var(--tgui--font-title-2-size);\n line-height: var(--tgui--font-title-2-line);\n letter-spacing: var(--tgui--font-title-2-tracking);\n}\n\n.level-3 {\n font-size: var(--tgui--font-title-3-size);\n line-height: var(--tgui--font-title-3-line);\n letter-spacing: var(--tgui--font-title-3-tracking);\n}\n","import type { ElementType } from 'react';\nimport type { TypographyProps } from '../Typography';\nimport styles from './Title.module.css';\n\nexport type TitleLevel = '1' | '2' | '3';\n\nexport const TITLE_LEVELS: Record<\n TitleLevel,\n { tag: ElementType; className: string; weight: NonNullable<TypographyProps['weight']> }\n> = {\n '1': { tag: 'h2', className: styles['level-1'], weight: '1' },\n '2': { tag: 'h3', className: styles['level-2'], weight: '1' },\n '3': { tag: 'h4', className: styles['level-3'], weight: '2' },\n};\n","import type { Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { Typography, type TypographyProps } from '../Typography';\nimport { TITLE_LEVELS, type TitleLevel } from './Title.variants';\n\nexport interface TitleProps extends TypographyProps {\n ref?: Ref<HTMLElement>;\n level?: TitleLevel;\n}\n\nexport function Title({ ref, level = '2', weight, Component, className, ...rest }: TitleProps) {\n const { tag, className: levelClass, weight: levelWeight } = TITLE_LEVELS[level];\n\n return (\n <Typography\n data-slot=\"title\"\n ref={ref}\n weight={weight ?? levelWeight}\n Component={Component ?? tag}\n className={cn(levelClass, className)}\n {...rest}\n />\n );\n}\n\nTitle.displayName = 'Title';\n",".placeholder {\n overflow: hidden;\n\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n\n gap: 24px;\n padding: 32px;\n}\n\n.fields {\n margin: 0;\n text-align: center;\n overflow-wrap: anywhere;\n}\n\n.description {\n color: var(--tgui--label-secondary);\n}\n\n.description:not(:first-child) {\n margin-top: 8px;\n}\n","import type { HTMLAttributes, ReactNode, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { Text } from '../Text';\nimport { Title } from '../Title';\nimport styles from './Placeholder.module.css';\n\nexport interface PlaceholderProps extends HTMLAttributes<HTMLElement> {\n ref?: Ref<HTMLElement>;\n children?: ReactNode;\n header?: ReactNode;\n description?: ReactNode;\n action?: ReactNode;\n}\n\nexport function Placeholder({\n ref,\n children,\n header,\n description,\n action,\n className,\n ...rest\n}: PlaceholderProps) {\n return (\n <section\n ref={ref}\n data-slot=\"placeholder\"\n className={cn(styles.placeholder, className)}\n {...rest}\n >\n {children}\n {header != null || description != null ? (\n <dl data-slot=\"placeholder-fields\" className={styles.fields}>\n {header != null ? (\n <Title Component=\"dt\" level=\"3\" weight=\"2\">\n {header}\n </Title>\n ) : null}\n {description != null ? (\n <Text Component=\"dd\" className={styles.description}>\n {description}\n </Text>\n ) : null}\n </dl>\n ) : null}\n {action}\n </section>\n );\n}\n\nPlaceholder.displayName = 'Placeholder';\n","import { createContext, type RefObject } from 'react';\n\nexport interface PopoverContextValue {\n open: boolean;\n setOpen: (open: boolean) => void;\n triggerRef: RefObject<HTMLElement | null>;\n contentId: string;\n}\n\nexport const PopoverContext = createContext<PopoverContextValue>({\n open: false,\n setOpen: () => {},\n triggerRef: { current: null },\n contentId: '',\n});\n\nPopoverContext.displayName = 'PopoverContext';\n",".content {\n position: fixed;\n top: 0;\n inset-inline-start: 0;\n z-index: var(--tgui--z-overlay);\n min-width: 160px;\n max-width: 320px;\n border-radius: var(--tgui--radius);\n background: var(--tgui--surface-bg);\n color: var(--tgui--label);\n box-shadow: var(--tgui--overlay-shadow);\n}\n\n.content[data-side=\"bottom\"] {\n transform-origin: top center;\n}\n\n.content[data-side=\"top\"] {\n transform-origin: bottom center;\n}\n\n.content[data-side=\"left\"] {\n transform-origin: right center;\n}\n\n.content[data-side=\"right\"] {\n transform-origin: left center;\n}\n\n/* the canonical overlay motion — every component that appears anchored to a\n trigger (tooltip, menus, dialog) uses these exact values */\n@media (prefers-reduced-motion: no-preference) {\n .content[data-state=\"open\"] {\n animation: popover-in var(--tgui--duration-overlay) var(--tgui--ease-spring);\n }\n\n .content[data-state=\"closed\"] {\n animation: popover-out var(--tgui--duration-overlay) var(--tgui--ease-in) forwards;\n }\n}\n\n@keyframes popover-in {\n from {\n opacity: 0;\n transform: scale(0.96);\n }\n}\n\n@keyframes popover-out {\n to {\n opacity: 0;\n transform: scale(0.96);\n }\n}\n","'use client';\n\nimport { DismissableLayer } from '@radix-ui/react-dismissable-layer';\nimport { FocusScope } from '@radix-ui/react-focus-scope';\nimport { Presence } from '@radix-ui/react-presence';\nimport {\n type HTMLAttributes,\n type Ref,\n useCallback,\n useContext,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport {\n computeFloatingPosition,\n type FloatingPlacement,\n type FloatingPosition,\n} from '../../shared/lib/floatingPosition';\nimport { Portal } from '../Portal';\nimport { PopoverContext } from './context';\nimport styles from './Popover.module.css';\n\nexport interface PopoverContentProps extends Omit<HTMLAttributes<HTMLDivElement>, 'className'> {\n ref?: Ref<HTMLDivElement>;\n placement?: FloatingPlacement;\n gap?: number;\n container?: Element | DocumentFragment | null;\n className?: string;\n}\n\nexport function PopoverContent({\n ref,\n placement = 'bottom-start',\n gap = 8,\n container,\n className,\n children,\n ...rest\n}: PopoverContentProps) {\n const { open, setOpen, triggerRef, contentId } = useContext(PopoverContext);\n const nodeRef = useRef<HTMLDivElement | null>(null);\n const [contentNode, setContentNode] = useState<HTMLDivElement | null>(null);\n const [position, setPosition] = useState<FloatingPosition | null>(null);\n\n const reposition = useCallback(() => {\n const trigger = triggerRef.current;\n const node = nodeRef.current;\n if (!trigger || !node) return;\n setPosition(\n computeFloatingPosition(\n trigger.getBoundingClientRect(),\n node.getBoundingClientRect(),\n placement,\n gap,\n node,\n ),\n );\n }, [placement, gap, triggerRef]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: contentNode re-runs this once Presence actually mounts the div, one render after `open` flips\n useLayoutEffect(() => {\n if (open) reposition();\n }, [open, reposition, contentNode]);\n\n useEffect(() => {\n if (!open) return;\n const onScrollOrResize = () => reposition();\n window.addEventListener('resize', onScrollOrResize);\n window.addEventListener('scroll', onScrollOrResize, true);\n return () => {\n window.removeEventListener('resize', onScrollOrResize);\n window.removeEventListener('scroll', onScrollOrResize, true);\n };\n }, [open, reposition]);\n\n return (\n <Portal container={container}>\n <Presence present={open}>\n <FocusScope\n asChild\n trapped\n loop\n onUnmountAutoFocus={(event) => {\n event.preventDefault();\n triggerRef.current?.focus();\n }}\n >\n <DismissableLayer\n asChild\n deferPointerDownOutside\n onEscapeKeyDown={() => setOpen(false)}\n onPointerDownOutside={() => setOpen(false)}\n onFocusOutside={() => setOpen(false)}\n >\n <div\n ref={(node) => {\n nodeRef.current = node;\n setContentNode(node);\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as { current: HTMLDivElement | null }).current = node;\n }}\n id={contentId}\n role=\"dialog\"\n data-slot=\"popover-content\"\n data-side={position?.side}\n data-state={position ? (open ? 'open' : 'closed') : undefined}\n className={cn(styles.content, className)}\n style={\n position\n ? { top: position.top, left: position.left }\n : { top: 0, left: 0, opacity: 0, pointerEvents: 'none' }\n }\n {...rest}\n >\n {children}\n </div>\n </DismissableLayer>\n </FocusScope>\n </Presence>\n </Portal>\n );\n}\n\nPopoverContent.displayName = 'PopoverContent';\n","'use client';\n\nimport { cloneElement, isValidElement, type ReactElement, useContext } from 'react';\nimport { PopoverContext } from './context';\n\nexport interface PopoverTriggerProps {\n children: ReactElement;\n}\n\nexport function PopoverTrigger({ children }: PopoverTriggerProps) {\n const { open, setOpen, triggerRef, contentId } = useContext(PopoverContext);\n\n if (!isValidElement(children)) return children;\n\n const child = children as ReactElement<Record<string, unknown>>;\n const childRef = (child.props as { ref?: unknown }).ref;\n const childOnClick = child.props.onClick as ((event: unknown) => void) | undefined;\n\n return cloneElement(child, {\n ref: (node: HTMLElement | null) => {\n triggerRef.current = node;\n if (typeof childRef === 'function') childRef(node);\n else if (childRef && typeof childRef === 'object')\n (childRef as { current: HTMLElement | null }).current = node;\n },\n onClick: (event: unknown) => {\n childOnClick?.(event);\n setOpen(!open);\n },\n 'aria-haspopup': 'dialog',\n 'aria-expanded': open,\n 'aria-controls': open ? contentId : undefined,\n 'data-slot': 'popover-trigger',\n 'data-state': open ? 'open' : 'closed',\n });\n}\n\nPopoverTrigger.displayName = 'PopoverTrigger';\n","'use client';\n\nimport { type ReactNode, useCallback, useId, useRef, useState } from 'react';\nimport { PopoverContext } from './context';\nimport { PopoverContent } from './PopoverContent';\nimport { PopoverTrigger } from './PopoverTrigger';\n\nexport interface PopoverProps {\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n children: ReactNode;\n}\n\nexport function Popover({\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n children,\n}: PopoverProps) {\n const [uncontrolled, setUncontrolled] = useState(defaultOpen);\n const open = openProp ?? uncontrolled;\n const triggerRef = useRef<HTMLElement | null>(null);\n const contentId = useId();\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (openProp == null) setUncontrolled(next);\n onOpenChange?.(next);\n },\n [openProp, onOpenChange],\n );\n\n return (\n <PopoverContext.Provider value={{ open, setOpen, triggerRef, contentId }}>\n {children}\n </PopoverContext.Provider>\n );\n}\n\nPopover.displayName = 'Popover';\nPopover.Trigger = PopoverTrigger;\nPopover.Content = PopoverContent;\n",".track {\n overflow: hidden;\n width: 100%;\n height: 4px;\n border-radius: 2px;\n background: var(--tgui--fill);\n}\n\n.bar {\n height: 100%;\n border-radius: inherit;\n background: var(--tgui--link);\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .bar {\n transition: width 0.25s ease;\n }\n}\n","import type { HTMLAttributes, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './Progress.module.css';\n\nexport interface ProgressProps extends HTMLAttributes<HTMLDivElement> {\n ref?: Ref<HTMLDivElement>;\n value?: number;\n}\n\nexport function Progress({\n ref,\n value = 0,\n className,\n 'aria-label': ariaLabel,\n ...rest\n}: ProgressProps) {\n const clamped = Math.max(0, Math.min(100, value));\n return (\n <div\n ref={ref}\n role=\"progressbar\"\n aria-label={ariaLabel ?? 'Progress'}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={Math.round(clamped)}\n data-slot=\"progress\"\n className={cn(styles.track, className)}\n {...rest}\n >\n <div data-slot=\"progress-indicator\" className={styles.bar} style={{ width: `${clamped}%` }} />\n </div>\n );\n}\n\nProgress.displayName = 'Progress';\n",".radio {\n position: relative;\n display: inline-flex;\n cursor: pointer;\n}\n\n.radio[data-disabled] {\n cursor: default;\n opacity: 0.3;\n}\n\n.input {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n margin: 0;\n opacity: 0;\n cursor: inherit;\n}\n\n.dot {\n position: relative;\n width: 20px;\n height: 20px;\n border-radius: 50%;\n box-shadow: inset 0 0 0 2px var(--tgui--separator);\n pointer-events: none;\n}\n\n.dot::after {\n content: \"\";\n position: absolute;\n inset: 5px;\n border-radius: 50%;\n background: var(--tgui--link);\n transform: scale(0);\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .dot {\n transition: box-shadow 0.15s ease-out;\n }\n\n .dot::after {\n transition: transform 0.15s ease-out;\n }\n}\n\n.input:checked + .dot {\n box-shadow: inset 0 0 0 2px var(--tgui--link);\n}\n\n.input:checked + .dot::after {\n transform: scale(1);\n}\n\n.input:focus-visible + .dot {\n box-shadow:\n inset 0 0 0 2px var(--tgui--separator),\n var(--tgui--focus-ring-shadow);\n}\n\n.input:checked:focus-visible + .dot {\n box-shadow:\n inset 0 0 0 2px var(--tgui--accent),\n var(--tgui--focus-ring-shadow);\n}\n","import type { ChangeEvent, InputHTMLAttributes, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { useHaptic } from '../TguiProvider';\nimport styles from './Radio.module.css';\n\nexport interface RadioProps extends InputHTMLAttributes<HTMLInputElement> {\n ref?: Ref<HTMLInputElement>;\n}\n\nexport function Radio({ ref, disabled, className, style, onChange, ...rest }: RadioProps) {\n const haptic = useHaptic();\n\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n haptic('select');\n onChange?.(event);\n };\n\n return (\n <span\n data-slot=\"radio\"\n className={cn(styles.radio, className)}\n style={style}\n data-disabled={disabled || undefined}\n >\n <input\n ref={ref}\n type=\"radio\"\n data-slot=\"radio-input\"\n className={styles.input}\n disabled={disabled}\n onChange={handleChange}\n {...rest}\n />\n <span className={styles.dot} data-slot=\"radio-indicator\" aria-hidden />\n </span>\n );\n}\n\nRadio.displayName = 'Radio';\n",".rating {\n position: relative;\n display: inline-flex;\n width: max-content;\n}\n\n.row {\n display: flex;\n gap: 2px;\n}\n\n.empty {\n color: color-mix(in srgb, var(--tgui--rating-color, #f5a623) 22%, transparent);\n}\n\n.fill {\n position: absolute;\n inset: 0;\n pointer-events: none;\n color: var(--tgui--rating-color, #f5a623);\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .fill {\n transition: clip-path 0.15s ease-out;\n }\n}\n\n.star {\n display: block;\n width: 1em;\n height: 1em;\n padding: 0;\n border: 0;\n background: transparent;\n color: inherit;\n font-size: 24px;\n line-height: 0;\n}\n\n.rating[data-interactive] .star {\n cursor: pointer;\n}\n\n.rating[data-interactive]:not([data-disabled]) .star:focus-visible {\n outline: var(--tgui--focus-ring);\n outline-offset: var(--tgui--focus-ring-offset);\n border-radius: 4px;\n}\n\n.star svg {\n display: block;\n width: 100%;\n height: 100%;\n}\n\n.rating[data-disabled] {\n opacity: 0.4;\n}\n","'use client';\n\nimport {\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n type Ref,\n useState,\n} from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { useHaptic } from '../TguiProvider';\nimport styles from './Rating.module.css';\n\nconst DefaultStar = (\n <svg viewBox=\"0 0 24 24\" fill=\"currentColor\" aria-hidden>\n <path d=\"M12 2l2.9 6.3 6.9.8-5.1 4.7 1.4 6.8L12 17.8 5.9 20.4l1.4-6.8L2.2 9.1l6.9-.8z\" />\n </svg>\n);\n\nexport interface RatingProps {\n ref?: Ref<HTMLDivElement>;\n value?: number;\n defaultValue?: number;\n onValueChange?: (value: number) => void;\n count?: number;\n readOnly?: boolean;\n disabled?: boolean;\n icon?: ReactNode;\n name?: string;\n 'aria-label'?: string;\n className?: string;\n}\n\nexport function Rating({\n ref,\n value: valueProp,\n defaultValue = 0,\n onValueChange,\n count = 5,\n readOnly = false,\n disabled = false,\n icon = DefaultStar,\n name,\n 'aria-label': ariaLabel = 'Rating',\n className,\n}: RatingProps) {\n const [uncontrolled, setUncontrolled] = useState(defaultValue);\n const value = valueProp ?? uncontrolled;\n const [hovered, setHovered] = useState<number | null>(null);\n\n const interactive = !readOnly && !disabled;\n const shown = hovered ?? value;\n const pct = Math.max(0, Math.min(1, shown / count)) * 100;\n const haptic = useHaptic();\n\n const set = (next: number) => {\n if (!interactive || next === value) return;\n haptic('select');\n if (valueProp == null) setUncontrolled(next);\n onValueChange?.(next);\n };\n\n const onKeyDown = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n if (!interactive) return;\n if (event.key === 'ArrowRight' || event.key === 'ArrowUp') {\n event.preventDefault();\n set(Math.min(count, Math.round(value) + 1));\n } else if (event.key === 'ArrowLeft' || event.key === 'ArrowDown') {\n event.preventDefault();\n set(Math.max(0, Math.round(value) - 1));\n }\n };\n\n const stars = Array.from({ length: count }, (_, i) => i + 1);\n\n const interactiveHandlers = interactive\n ? { onKeyDown, onMouseLeave: () => setHovered(null) }\n : {};\n\n const role = interactive ? 'radiogroup' : 'img';\n const label = interactive ? ariaLabel : `${ariaLabel}: ${value} out of ${count}`;\n\n return (\n // biome-ignore lint/a11y/useAriaPropsSupportedByRole: role is radiogroup or img, both support aria-label\n <div\n ref={ref}\n data-slot=\"rating\"\n data-interactive={interactive || undefined}\n className={cn(styles.rating, className)}\n data-disabled={disabled || undefined}\n role={role}\n aria-label={label}\n {...interactiveHandlers}\n >\n <div className={cn(styles.row, styles.empty)} aria-hidden={!interactive}>\n {stars.map((star) =>\n interactive ? (\n // biome-ignore lint/a11y/useSemanticElements: a button in a radiogroup is the rating ARIA pattern; a native radio can't hold the icon\n <button\n key={star}\n type=\"button\"\n role=\"radio\"\n aria-checked={Math.round(value) === star}\n aria-label={`${star}`}\n tabIndex={star === (Math.round(value) || 1) ? 0 : -1}\n name={name}\n data-slot=\"rating-star\"\n className={styles.star}\n onClick={() => set(star)}\n onMouseEnter={() => setHovered(star)}\n onFocus={() => setHovered(star)}\n onBlur={() => setHovered(null)}\n >\n {icon}\n </button>\n ) : (\n <span key={star} data-slot=\"rating-star\" className={styles.star}>\n {icon}\n </span>\n ),\n )}\n </div>\n <div className={styles.fill} style={{ clipPath: `inset(0 ${100 - pct}% 0 0)` }} aria-hidden>\n <div className={styles.row}>\n {stars.map((star) => (\n <span key={star} data-slot=\"rating-star\" className={styles.star}>\n {icon}\n </span>\n ))}\n </div>\n </div>\n </div>\n );\n}\n\nRating.displayName = 'Rating';\n",".bar {\n display: flex;\n align-items: center;\n gap: 8px;\n width: 100%;\n}\n\n.field {\n position: relative;\n display: flex;\n align-items: center;\n flex: 1;\n min-width: 0;\n height: var(--tgui--field-min-height);\n padding: 0 var(--tgui--field-padding-x);\n border-radius: var(--tgui--field-radius);\n background: var(--tgui--fill);\n}\n\n.icon {\n flex-shrink: 0;\n margin-inline-end: var(--tgui--field-gap);\n color: var(--tgui--label-secondary);\n}\n\n.input {\n flex: 1;\n min-width: 0;\n height: 100%;\n margin: 0;\n padding: 0;\n border: 0;\n outline: 0;\n background: transparent;\n color: var(--tgui--label);\n font-family: var(--tgui--font-family);\n font-size: 16px;\n}\n\n.input::placeholder {\n color: var(--tgui--label-tertiary);\n}\n\n.input::-webkit-search-cancel-button,\n.input::-webkit-search-decoration {\n appearance: none;\n}\n\n.clear {\n display: flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n margin-inline-start: 4px;\n padding: 0;\n border: 0;\n border-radius: 50%;\n color: var(--tgui--label-secondary);\n background: transparent;\n cursor: pointer;\n}\n\n.clear:focus-visible {\n outline: var(--tgui--focus-ring);\n outline-offset: var(--tgui--focus-ring-offset);\n}\n\n.cancel {\n flex-shrink: 0;\n overflow: hidden;\n max-width: 0;\n margin: 0;\n padding: 0;\n border: 0;\n background: transparent;\n color: var(--tgui--link-strong);\n font-family: var(--tgui--font-family);\n font-size: 16px;\n white-space: nowrap;\n cursor: pointer;\n opacity: 0;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .cancel {\n transition:\n opacity 0.2s ease,\n max-width 0.2s ease;\n }\n}\n\n.cancel:focus-visible {\n outline: var(--tgui--focus-ring);\n outline-offset: var(--tgui--focus-ring-offset);\n}\n\n.bar[data-focused] .cancel {\n max-width: 80px;\n opacity: 1;\n}\n","'use client';\n\nimport {\n type ChangeEvent,\n type HTMLAttributes,\n type MouseEvent,\n type Ref,\n useRef,\n useState,\n} from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './SearchBar.module.css';\n\nexport interface SearchBarProps extends Omit<HTMLAttributes<HTMLDivElement>, 'onChange'> {\n ref?: Ref<HTMLDivElement>;\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n onCancel?: () => void;\n label?: string;\n}\n\nconst preventFocusLoss = (event: MouseEvent<HTMLButtonElement>) => event.preventDefault();\n\nexport function SearchBar({\n ref,\n value,\n onChange,\n placeholder = 'Search',\n onCancel,\n label = 'Search',\n className,\n ...rest\n}: SearchBarProps) {\n const inputRef = useRef<HTMLInputElement | null>(null);\n const [focused, setFocused] = useState(false);\n\n const handleClear = () => {\n onChange('');\n inputRef.current?.focus();\n };\n\n const handleCancel = () => {\n onCancel?.();\n inputRef.current?.blur();\n };\n\n return (\n <div\n ref={ref}\n data-slot=\"search-bar\"\n data-focused={focused || undefined}\n className={cn(styles.bar, className)}\n {...rest}\n >\n <div data-slot=\"search-bar-field\" className={styles.field}>\n <svg\n data-slot=\"search-bar-icon\"\n className={styles.icon}\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n aria-hidden\n >\n <circle cx=\"7\" cy=\"7\" r=\"5.25\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path\n d=\"M11.5 11.5L14.5 14.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n />\n </svg>\n <input\n ref={inputRef}\n type=\"search\"\n data-slot=\"search-bar-input\"\n className={styles.input}\n value={value}\n placeholder={placeholder}\n aria-label={label}\n onChange={(event: ChangeEvent<HTMLInputElement>) => onChange(event.target.value)}\n onFocus={() => setFocused(true)}\n onBlur={() => setFocused(false)}\n />\n {value.length > 0 ? (\n <button\n type=\"button\"\n data-slot=\"search-bar-clear\"\n className={styles.clear}\n aria-label=\"Clear\"\n onMouseDown={preventFocusLoss}\n onClick={handleClear}\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" aria-hidden>\n <circle cx=\"7\" cy=\"7\" r=\"7\" fill=\"currentColor\" opacity=\"0.15\" />\n <path\n d=\"M4.5 4.5l5 5M9.5 4.5l-5 5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.4\"\n strokeLinecap=\"round\"\n />\n </svg>\n </button>\n ) : null}\n </div>\n {onCancel != null ? (\n <button\n type=\"button\"\n data-slot=\"search-bar-cancel\"\n className={styles.cancel}\n tabIndex={focused ? 0 : -1}\n onMouseDown={preventFocusLoss}\n onClick={handleCancel}\n >\n Cancel\n </button>\n ) : null}\n </div>\n );\n}\n\nSearchBar.displayName = 'SearchBar';\n",".body {\n display: flex;\n flex-direction: column;\n}\n\n/* row separators run the full card width – flush to the card edge, never inset to the content */\n.body > hr {\n margin-inline: 0;\n}\n\n.sectionBase .bodyWithHeader {\n background: var(--tgui--surface-bg);\n box-shadow: var(--tgui--shadow-sm);\n}\n\n.sectionIos .body {\n border-radius: var(--tgui--radius);\n background: var(--tgui--surface-bg);\n}\n\n.sectionIos .body > :first-child {\n border-radius: var(--tgui--radius) var(--tgui--radius) 0 0;\n}\n\n.sectionIos .body > :last-child {\n border-radius: 0 0 var(--tgui--radius) var(--tgui--radius);\n}\n\n.sectionIos .body > :only-child {\n border-radius: var(--tgui--radius);\n}\n\n.header {\n padding: 20px 24px 4px 22px;\n color: var(--tgui--label-secondary);\n}\n\n.headerLarge {\n padding-inline-start: 24px;\n color: var(--tgui--label);\n}\n\n.headerIos {\n padding: 16px 16px 8px;\n color: var(--tgui--label-secondary);\n}\n\n.headerIos.headerLarge {\n padding: 0 0 12px;\n color: var(--tgui--label);\n}\n\n.footer {\n padding: 12px 24px;\n}\n\n.footerIos {\n padding: 8px 16px 0;\n}\n\n.footerCentered {\n padding: 16px 24px 20px;\n text-align: center;\n}\n\n.footerIos.footerCentered {\n padding: 16px 16px 0;\n}\n\n.footerText {\n color: var(--tgui--label-secondary);\n}\n","'use client';\n\nimport type { HTMLAttributes, ReactNode, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { Caption } from '../Caption';\nimport { Subheadline } from '../Subheadline';\nimport { useTgui } from '../TguiProvider';\nimport styles from './Section.module.css';\n\nexport interface SectionFooterProps extends HTMLAttributes<HTMLElement> {\n ref?: Ref<HTMLElement>;\n centered?: boolean;\n}\n\nfunction FooterText({ ios, children }: { ios: boolean; children: ReactNode }) {\n return ios ? (\n <Caption Component=\"span\" className={styles.footerText}>\n {children}\n </Caption>\n ) : (\n <Subheadline Component=\"span\" level=\"2\" className={styles.footerText}>\n {children}\n </Subheadline>\n );\n}\n\nexport function SectionFooter({\n ref,\n centered = false,\n className,\n children,\n ...rest\n}: SectionFooterProps) {\n const { platform } = useTgui();\n const ios = platform === 'ios';\n\n return (\n <footer\n ref={ref}\n data-slot=\"section-footer\"\n className={cn(\n styles.footer,\n ios && styles.footerIos,\n centered && styles.footerCentered,\n className,\n )}\n {...rest}\n >\n <FooterText ios={ios}>{children}</FooterText>\n </footer>\n );\n}\n\nSectionFooter.displayName = 'SectionFooter';\n","'use client';\n\nimport type { HTMLAttributes, ReactNode, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { Caption } from '../Caption';\nimport { Subheadline } from '../Subheadline';\nimport { Text } from '../Text';\nimport { useTgui } from '../TguiProvider';\nimport styles from './Section.module.css';\n\nexport interface SectionHeaderProps extends HTMLAttributes<HTMLElement> {\n ref?: Ref<HTMLElement>;\n large?: boolean;\n}\n\nfunction HeaderText({\n ios,\n large,\n children,\n}: {\n ios: boolean;\n large: boolean;\n children: ReactNode;\n}) {\n if (large) {\n return ios ? (\n <Subheadline Component=\"h2\" level=\"1\" weight=\"2\">\n {children}\n </Subheadline>\n ) : (\n <Text Component=\"h2\" weight=\"2\">\n {children}\n </Text>\n );\n }\n return ios ? (\n <Caption Component=\"h2\" caps>\n {children}\n </Caption>\n ) : (\n <Subheadline Component=\"h2\" level=\"2\" weight=\"2\">\n {children}\n </Subheadline>\n );\n}\n\nexport function SectionHeader({\n ref,\n large = false,\n className,\n children,\n ...rest\n}: SectionHeaderProps) {\n const { platform } = useTgui();\n const ios = platform === 'ios';\n\n return (\n <header\n ref={ref}\n data-slot=\"section-header\"\n className={cn(styles.header, ios && styles.headerIos, large && styles.headerLarge, className)}\n {...rest}\n >\n <HeaderText ios={ios} large={large}>\n {children}\n </HeaderText>\n </header>\n );\n}\n\nSectionHeader.displayName = 'SectionHeader';\n","'use client';\n\nimport {\n Children,\n Fragment,\n type HTMLAttributes,\n isValidElement,\n type ReactNode,\n type Ref,\n} from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { Divider } from '../Divider';\nimport { useTgui } from '../TguiProvider';\nimport styles from './Section.module.css';\nimport { SectionFooter } from './SectionFooter';\nimport { SectionHeader } from './SectionHeader';\n\nexport interface SectionProps extends HTMLAttributes<HTMLElement> {\n ref?: Ref<HTMLElement>;\n header?: ReactNode;\n footer?: ReactNode;\n}\n\nconst isText = (node: ReactNode) => typeof node === 'string' || typeof node === 'number';\n\nexport function Section({ ref, header, footer, className, children, ...rest }: SectionProps) {\n const { platform } = useTgui();\n const rows = Children.toArray(children);\n\n return (\n <section\n ref={ref}\n data-slot=\"section\"\n className={cn(platform === 'ios' ? styles.sectionIos : styles.sectionBase, className)}\n {...rest}\n >\n <div className={styles.bodyWithHeader}>\n {isText(header) ? <SectionHeader>{header}</SectionHeader> : header}\n <div data-slot=\"section-body\" className={styles.body}>\n {rows.map((row, i) => (\n <Fragment key={isValidElement(row) ? row.key : i}>\n {row}\n {i < rows.length - 1 ? <Divider /> : null}\n </Fragment>\n ))}\n </div>\n </div>\n {isText(footer) ? <SectionFooter>{footer}</SectionFooter> : footer}\n </section>\n );\n}\n\nSection.displayName = 'Section';\nSection.Header = SectionHeader;\nSection.Footer = SectionFooter;\n","import { createContext } from 'react';\n\nexport interface SegmentedControlContextValue {\n value: string | undefined;\n select: (value: string) => void;\n}\n\nexport const SegmentedControlContext = createContext<SegmentedControlContextValue | null>(null);\n",".control {\n position: relative;\n display: flex;\n box-sizing: border-box;\n padding: 2px;\n border-radius: 9px;\n background: var(--tgui--accent-fill);\n}\n\n.pill {\n position: absolute;\n top: 2px;\n left: 0;\n bottom: 2px;\n border-radius: 7px;\n background: var(--tgui--surface-bg);\n box-shadow: 0 1px 3px rgb(0 0 0 / 0.12);\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .pill {\n transition:\n transform var(--tgui--duration-fast) var(--tgui--ease-spring),\n width var(--tgui--duration-fast) var(--tgui--ease-spring);\n }\n}\n\n.item {\n position: relative;\n z-index: var(--tgui--z-base, 1);\n flex: 1 1 0;\n min-width: 0;\n padding: 6px 12px;\n border: 0;\n border-radius: 7px;\n background: transparent;\n color: var(--tgui--label);\n font-family: var(--tgui--font-family);\n font-size: 14px;\n font-weight: var(--tgui--weight-semibold);\n line-height: 20px;\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n cursor: pointer;\n transition: color 0.15s ease;\n}\n\n.item:focus-visible {\n outline: var(--tgui--focus-ring);\n outline-offset: calc(-1 * var(--tgui--focus-ring-offset));\n}\n\n.item[data-selected] {\n cursor: default;\n}\n\n.item:disabled {\n opacity: 0.35;\n cursor: default;\n}\n\n@media (hover: hover) and (pointer: fine) {\n .item:not([data-selected]):not(:disabled):hover {\n color: var(--tgui--link-strong);\n }\n}\n","'use client';\n\nimport {\n type HTMLAttributes,\n type MutableRefObject,\n type KeyboardEvent as ReactKeyboardEvent,\n type Ref,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { useHaptic } from '../TguiProvider';\nimport { SegmentedControlContext } from './context';\nimport styles from './SegmentedControl.module.css';\n\nexport interface SegmentedControlProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'defaultValue'> {\n ref?: Ref<HTMLDivElement>;\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n}\n\nexport function SegmentedControl({\n ref,\n value: valueProp,\n defaultValue,\n onValueChange,\n className,\n children,\n onKeyDown,\n ...rest\n}: SegmentedControlProps) {\n const trackRef = useRef<HTMLDivElement | null>(null);\n const [pill, setPill] = useState<{ left: number; width: number } | null>(null);\n const [uncontrolled, setUncontrolled] = useState(defaultValue);\n const value = valueProp ?? uncontrolled;\n const haptic = useHaptic();\n\n const select = useCallback(\n (next: string) => {\n if (next === (valueProp ?? uncontrolled)) return;\n haptic('select');\n if (valueProp == null) setUncontrolled(next);\n onValueChange?.(next);\n },\n [valueProp, uncontrolled, onValueChange, haptic],\n );\n\n const context = useMemo(() => ({ value, select }), [value, select]);\n\n const measure = useCallback(() => {\n const track = trackRef.current;\n if (!track) return;\n const selected = track.querySelector<HTMLElement>('[role=\"radio\"][data-selected]');\n const next = selected ? { left: selected.offsetLeft, width: selected.offsetWidth } : null;\n setPill((prev) => {\n if (prev === next) return prev;\n if (prev && next && prev.left === next.left && prev.width === next.width) return prev;\n return next;\n });\n }, []);\n\n useLayoutEffect(measure);\n\n useEffect(() => {\n const track = trackRef.current;\n if (!track || typeof ResizeObserver === 'undefined') return;\n const observer = new ResizeObserver(measure);\n observer.observe(track);\n return () => observer.disconnect();\n }, [measure]);\n\n const setRef = useCallback(\n (node: HTMLDivElement | null) => {\n trackRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as MutableRefObject<HTMLDivElement | null>).current = node;\n },\n [ref],\n );\n\n const handleKeyDown = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n if (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight') return;\n const track = trackRef.current;\n if (!track) return;\n const radios = Array.from(\n track.querySelectorAll<HTMLButtonElement>('[role=\"radio\"]:not(:disabled)'),\n );\n const current = radios.indexOf(document.activeElement as HTMLButtonElement);\n if (current < 0) return;\n event.preventDefault();\n const delta = event.key === 'ArrowRight' ? 1 : -1;\n const next = radios[(current + delta + radios.length) % radios.length];\n next.focus();\n next.click();\n };\n\n return (\n <SegmentedControlContext.Provider value={context}>\n <div\n ref={setRef}\n role=\"radiogroup\"\n data-slot=\"segmented-control\"\n className={cn(styles.control, className)}\n onKeyDown={handleKeyDown}\n {...rest}\n >\n <div\n className={styles.pill}\n data-slot=\"segmented-control-indicator\"\n style={\n pill ? { transform: `translateX(${pill.left}px)`, width: pill.width } : { opacity: 0 }\n }\n aria-hidden\n />\n {children}\n </div>\n </SegmentedControlContext.Provider>\n );\n}\n\nSegmentedControl.displayName = 'SegmentedControl';\n","'use client';\n\nimport { type ButtonHTMLAttributes, type Ref, useContext } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { SegmentedControlContext } from './context';\nimport styles from './SegmentedControl.module.css';\n\nexport interface SegmentedControlItemProps\n extends Omit<ButtonHTMLAttributes<HTMLButtonElement>, 'value'> {\n ref?: Ref<HTMLButtonElement>;\n value?: string;\n selected?: boolean;\n}\n\nexport function SegmentedControlItem({\n ref,\n value,\n selected: selectedProp,\n className,\n onClick,\n ...rest\n}: SegmentedControlItemProps) {\n const ctx = useContext(SegmentedControlContext);\n const selected = selectedProp ?? (ctx != null && value != null && ctx.value === value);\n\n return (\n // biome-ignore lint/a11y/useSemanticElements: a button in a radiogroup is the segmented-control ARIA pattern; a native radio can't hold arbitrary content\n <button\n ref={ref}\n type=\"button\"\n role=\"radio\"\n aria-checked={selected}\n tabIndex={selected ? 0 : -1}\n data-slot=\"segmented-control-item\"\n data-selected={selected || undefined}\n data-state={selected ? 'active' : 'inactive'}\n className={cn(styles.item, className)}\n onClick={(event) => {\n onClick?.(event);\n if (value != null) ctx?.select(value);\n }}\n {...rest}\n />\n );\n}\n\nSegmentedControlItem.displayName = 'SegmentedControlItem';\n",".base {\n position: relative;\n padding: 20px 22px 16px;\n background: var(--tgui--bg);\n}\n\n.row {\n display: block;\n position: relative;\n box-sizing: border-box;\n border-radius: 14px;\n}\n\n.base .row {\n box-shadow: inset 0 0 0 1.5px var(--tgui--separator-opaque);\n}\n\n.ios .row {\n border-radius: 12px;\n background: var(--tgui--fill);\n}\n\n.select {\n appearance: none;\n display: block;\n width: 100%;\n min-height: 48px;\n margin: 0;\n padding: 12px 44px 12px 16px;\n border: 0;\n outline: 0;\n border-radius: inherit;\n background: transparent;\n color: var(--tgui--label);\n}\n\n.chevron {\n position: absolute;\n top: 50%;\n inset-inline-end: 18px;\n width: 8px;\n height: 8px;\n border: solid var(--tgui--label-tertiary);\n border-width: 0 2px 2px 0;\n transform: translateY(-75%) rotate(45deg);\n pointer-events: none;\n}\n\n.header {\n position: absolute;\n top: -7px;\n inset-inline-start: 10px;\n margin: 0;\n max-width: calc(100% - 20px);\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n padding: 0 6px;\n font-size: 13px;\n border-radius: 5px;\n color: var(--tgui--label-secondary);\n background: var(--tgui--bg);\n}\n\n/* iOS filled selects don't show a floating label – keep it for assistive tech */\n.ios .header {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n border: 0;\n}\n\n.base[data-state=\"focused\"] .row {\n box-shadow: inset 0 0 0 2px var(--tgui--link);\n}\n\n.base[data-state=\"focused\"] .header {\n color: var(--tgui--link-strong);\n}\n\n.base[data-state=\"error\"] .row {\n box-shadow: inset 0 0 0 2px var(--tgui--destructive);\n}\n\n.base[data-state=\"error\"] .header {\n color: var(--tgui--destructive-strong);\n}\n\n.ios[data-state=\"error\"] .row {\n box-shadow: inset 0 0 0 1.5px var(--tgui--destructive);\n}\n\n.base[data-disabled],\n.ios[data-disabled] {\n pointer-events: none;\n}\n\n.ios[data-disabled] {\n opacity: 0.35;\n}\n","'use client';\n\nimport {\n type FocusEvent,\n type ReactNode,\n type Ref,\n type SelectHTMLAttributes,\n useState,\n} from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport type { InputStatus } from '../Input';\nimport { Subheadline } from '../Subheadline';\nimport { Text } from '../Text';\nimport { useTgui } from '../TguiProvider';\nimport styles from './Select.module.css';\n\nexport interface SelectProps extends SelectHTMLAttributes<HTMLSelectElement> {\n ref?: Ref<HTMLSelectElement>;\n header?: ReactNode;\n status?: InputStatus;\n}\n\nexport function Select({\n ref,\n header,\n status,\n disabled,\n className,\n onFocus,\n onBlur,\n children,\n ...rest\n}: SelectProps) {\n const { platform } = useTgui();\n const ios = platform === 'ios';\n const [focused, setFocused] = useState(false);\n const state = status ?? (focused ? 'focused' : 'default');\n const Typography = ios ? Text : Subheadline;\n\n const handleFocus = (event: FocusEvent<HTMLSelectElement>) => {\n if (!disabled) setFocused(true);\n onFocus?.(event);\n };\n const handleBlur = (event: FocusEvent<HTMLSelectElement>) => {\n setFocused(false);\n onBlur?.(event);\n };\n\n return (\n <div\n data-slot=\"select\"\n data-state={state}\n data-disabled={disabled || undefined}\n className={cn(ios ? styles.ios : styles.base, className)}\n aria-disabled={disabled || undefined}\n >\n {/* biome-ignore lint/a11y/noLabelWithoutControl: the control is the select rendered below */}\n <label className={styles.row} data-slot=\"select-row\">\n <Typography\n ref={ref as Ref<HTMLElement>}\n Component=\"select\"\n data-slot=\"select-control\"\n className={styles.select}\n disabled={disabled}\n aria-invalid={state === 'error' || undefined}\n onFocus={handleFocus}\n onBlur={handleBlur}\n {...rest}\n >\n {children}\n </Typography>\n <span aria-hidden data-slot=\"select-chevron\" className={styles.chevron} />\n {/* names the select; visually hidden on iOS (see FormField) */}\n {header != null ? (\n <span className={styles.header} data-slot=\"select-label\">\n {header}\n </span>\n ) : null}\n </label>\n </div>\n );\n}\n\nSelect.displayName = 'Select';\n","import { useSyncExternalStore } from 'react';\n\nconst QUERY = '(prefers-reduced-motion: reduce)';\n\nfunction subscribe(callback: () => void) {\n if (typeof window === 'undefined' || !window.matchMedia) return () => {};\n const query = window.matchMedia(QUERY);\n query.addEventListener('change', callback);\n return () => query.removeEventListener('change', callback);\n}\n\nfunction getSnapshot() {\n if (typeof window === 'undefined' || !window.matchMedia) return false;\n return window.matchMedia(QUERY).matches;\n}\n\nexport function useReducedMotion() {\n return useSyncExternalStore(subscribe, getSnapshot, () => false);\n}\n",".backdrop {\n position: fixed;\n inset: 0;\n z-index: var(--tgui--z-overlay, 1000);\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n background: rgb(0 0 0 / 0.4);\n opacity: 0;\n}\n\n.backdrop--contained {\n position: absolute;\n}\n\n.backdrop[data-state=\"open\"] {\n opacity: 1;\n}\n\n.panel {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 100%;\n max-width: 512px;\n max-height: var(--tgui--sheet-max-height, 50%);\n margin: 0 auto;\n border-radius: 16px 16px 0 0;\n /* every surface that appears over the page shares one background */\n background: var(--tgui--surface-bg);\n color: var(--tgui--label);\n box-shadow:\n 0 -0.5px 0 var(--tgui--separator),\n 0 -8px 40px rgb(0 0 0 / 0.4);\n transform: translateY(100%);\n will-change: transform;\n contain: layout;\n}\n\n.panel[data-state=\"open\"] {\n transform: translateY(0);\n}\n\n/* a sheet is edge-anchored – it slides from the edge it lives on, but shares the\n kit's spring easing with every other surface that appears */\n@media (prefers-reduced-motion: no-preference) {\n .backdrop {\n transition: opacity var(--tgui--duration-slow) ease;\n }\n\n .panel {\n transition: transform var(--tgui--duration-slow) var(--tgui--ease-spring);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .backdrop {\n transition: opacity var(--tgui--duration-overlay) linear;\n }\n\n .panel {\n transform: none;\n opacity: 0;\n transition: opacity var(--tgui--duration-overlay) linear;\n }\n\n .panel[data-state=\"open\"] {\n opacity: 1;\n }\n}\n\n.grip {\n display: flex;\n flex-direction: column;\n flex-shrink: 0;\n padding-top: 8px;\n touch-action: none;\n cursor: grab;\n}\n\n.handle {\n align-self: center;\n width: 36px;\n height: 4px;\n border-radius: 2px;\n background: var(--tgui--fill-secondary, var(--tgui--fill));\n}\n\n.header {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 20px;\n font-family: var(--tgui--font-family);\n font-size: 20px;\n font-weight: var(--tgui--weight-bold);\n line-height: 1.2;\n}\n\n.title {\n flex: 1;\n min-width: 0;\n}\n\n.close {\n margin-inline-end: -7px;\n color: var(--tgui--label-secondary);\n}\n\n.body {\n flex: 1 1 auto;\n min-height: 0;\n overflow-y: auto;\n overscroll-behavior: contain;\n padding: 4px 20px\n calc(20px + var(--tgui--safe-area-bottom) + var(--tgui--content-safe-area-bottom));\n -webkit-overflow-scrolling: touch;\n}\n\n.grip + .body {\n padding-top: 0;\n}\n","'use client';\n\nimport {\n type KeyboardEvent as ReactKeyboardEvent,\n type ReactNode,\n type PointerEvent as ReactPointerEvent,\n type Ref,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { getTelegramWebApp } from '../../shared/lib/telegram';\nimport { useReducedMotion } from '../../shared/lib/useReducedMotion';\nimport { IconButton } from '../IconButton';\nimport { Portal } from '../Portal';\nimport styles from './Sheet.module.css';\n\nconst DURATION_MS = 340;\nconst DRAG_THRESHOLD = 6;\nconst DISMISS_DISTANCE = 96;\nconst DISMISS_VELOCITY = 0.5;\n\nexport interface SheetProps {\n ref?: Ref<HTMLDivElement>;\n open: boolean;\n onOpenChange: (open: boolean) => void;\n header?: ReactNode;\n children?: ReactNode;\n dismissable?: boolean;\n closeLabel?: string;\n className?: string;\n container?: Element | DocumentFragment | null;\n}\n\nfunction focusable(root: HTMLElement) {\n return Array.from(\n root.querySelectorAll<HTMLElement>(\n 'a[href],button:not([disabled]),textarea:not([disabled]),input:not([disabled]),select:not([disabled]),[tabindex]:not([tabindex=\"-1\"])',\n ),\n ).filter((el) => el.offsetParent !== null || el === document.activeElement);\n}\n\nexport function Sheet({\n ref,\n open,\n onOpenChange,\n header,\n children,\n dismissable = true,\n closeLabel = 'Close',\n className,\n container,\n}: SheetProps) {\n const reducedMotion = useReducedMotion();\n const contained = container != null;\n const [rendered, setRendered] = useState(open);\n const [visible, setVisible] = useState(false);\n\n const panelRef = useRef<HTMLDivElement | null>(null);\n const restoreFocusRef = useRef<HTMLElement | null>(null);\n const drag = useRef({ id: -1, active: false, startY: 0, lastY: 0, lastT: 0, velocity: 0 });\n\n useEffect(() => {\n if (open) {\n setRendered(true);\n return;\n }\n setVisible(false);\n if (reducedMotion) {\n setRendered(false);\n return;\n }\n const id = setTimeout(() => setRendered(false), DURATION_MS);\n return () => clearTimeout(id);\n }, [open, reducedMotion]);\n\n useEffect(() => {\n if (!rendered || !open) return;\n const panel = panelRef.current;\n if (!panel) return;\n // reflow so the browser registers the off-screen start before the class flips\n void panel.offsetHeight;\n setVisible(true);\n }, [rendered, open]);\n\n useEffect(() => {\n if (!rendered) return;\n restoreFocusRef.current = document.activeElement as HTMLElement | null;\n\n const { body, documentElement } = document;\n const previous = { overflow: body.style.overflow, paddingRight: body.style.paddingRight };\n if (!contained) {\n const scrollbar = window.innerWidth - documentElement.clientWidth;\n body.style.overflow = 'hidden';\n if (scrollbar > 0) body.style.paddingRight = `${scrollbar}px`;\n }\n\n const id = requestAnimationFrame(() => panelRef.current?.focus({ preventScroll: true }));\n return () => {\n cancelAnimationFrame(id);\n body.style.overflow = previous.overflow;\n body.style.paddingRight = previous.paddingRight;\n restoreFocusRef.current?.focus?.({ preventScroll: true });\n };\n }, [rendered, contained]);\n\n useEffect(() => {\n if (!rendered) return;\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && dismissable) {\n event.stopPropagation();\n onOpenChange(false);\n }\n };\n document.addEventListener('keydown', onKeyDown);\n return () => document.removeEventListener('keydown', onKeyDown);\n }, [rendered, dismissable, onOpenChange]);\n\n // stop Telegram's swipe-to-minimise from fighting the sheet's own drag-to-dismiss\n useEffect(() => {\n if (!rendered) return;\n const webApp = getTelegramWebApp();\n if (typeof webApp?.disableVerticalSwipes !== 'function') return;\n webApp.disableVerticalSwipes();\n return () => webApp.enableVerticalSwipes?.();\n }, [rendered]);\n\n const trapTab = useCallback((event: ReactKeyboardEvent<HTMLDivElement>) => {\n if (event.key !== 'Tab' || !panelRef.current) return;\n const items = focusable(panelRef.current);\n if (items.length === 0) {\n event.preventDefault();\n panelRef.current.focus();\n return;\n }\n const first = items[0];\n const last = items[items.length - 1];\n const active = document.activeElement;\n if (event.shiftKey && (active === first || active === panelRef.current)) {\n event.preventDefault();\n last.focus();\n } else if (!event.shiftKey && active === last) {\n event.preventDefault();\n first.focus();\n }\n }, []);\n\n const onPointerDown = (event: ReactPointerEvent<HTMLDivElement>) => {\n if (!dismissable || event.button !== 0 || reducedMotion) return;\n if ((event.target as HTMLElement).closest('button')) return;\n drag.current = {\n id: event.pointerId,\n active: false,\n startY: event.clientY,\n lastY: event.clientY,\n lastT: event.timeStamp,\n velocity: 0,\n };\n };\n\n const onPointerMove = (event: ReactPointerEvent<HTMLDivElement>) => {\n const state = drag.current;\n if (state.id !== event.pointerId) return;\n const delta = event.clientY - state.startY;\n if (!state.active) {\n if (delta < DRAG_THRESHOLD) return;\n state.active = true;\n event.currentTarget.setPointerCapture(event.pointerId);\n if (panelRef.current) panelRef.current.style.transition = 'none';\n }\n const dt = event.timeStamp - state.lastT;\n if (dt >= 1) {\n const instant = (event.clientY - state.lastY) / dt;\n state.velocity = state.velocity * 0.6 + instant * 0.4;\n state.lastY = event.clientY;\n state.lastT = event.timeStamp;\n }\n if (panelRef.current) {\n panelRef.current.style.transform = `translateY(${Math.max(0, delta)}px)`;\n }\n };\n\n const endDrag = (event: ReactPointerEvent<HTMLDivElement>) => {\n const state = drag.current;\n if (state.id !== event.pointerId) return;\n drag.current = { ...state, id: -1, active: false };\n if (!state.active) return;\n event.currentTarget.releasePointerCapture?.(event.pointerId);\n\n const panel = panelRef.current;\n const travelled = event.clientY - state.startY;\n const dismiss = travelled > DISMISS_DISTANCE || state.velocity > DISMISS_VELOCITY;\n\n if (panel) {\n panel.style.transition = '';\n panel.getBoundingClientRect();\n panel.style.transform = '';\n }\n if (dismiss) {\n setVisible(false);\n onOpenChange(false);\n }\n };\n\n if (!rendered) return null;\n\n const showPanel = visible && open;\n\n return (\n <Portal container={container}>\n <div\n ref={ref}\n data-slot=\"sheet-overlay\"\n data-state={showPanel ? 'open' : 'closed'}\n className={cn(styles.backdrop, contained && styles['backdrop--contained'])}\n onPointerDown={(event) => {\n if (event.target === event.currentTarget && dismissable) onOpenChange(false);\n }}\n >\n <div\n ref={panelRef}\n role=\"dialog\"\n aria-modal=\"true\"\n tabIndex={-1}\n data-slot=\"sheet-content\"\n data-state={showPanel ? 'open' : 'closed'}\n className={cn(styles.panel, className)}\n onKeyDown={trapTab}\n >\n <div\n data-slot=\"sheet-grip\"\n className={styles.grip}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={endDrag}\n onPointerCancel={endDrag}\n >\n {dismissable ? (\n <span data-slot=\"sheet-handle\" className={styles.handle} aria-hidden />\n ) : null}\n {header != null ? (\n <div data-slot=\"sheet-header\" className={styles.header}>\n <div data-slot=\"sheet-title\" className={styles.title}>\n {header}\n </div>\n {dismissable ? (\n <IconButton\n mode=\"gray\"\n size=\"s\"\n circle\n data-slot=\"sheet-close\"\n className={styles.close}\n aria-label={closeLabel}\n onClick={() => onOpenChange(false)}\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" aria-hidden>\n <path\n d=\"M4 4l8 8M12 4l-8 8\"\n stroke=\"currentColor\"\n strokeWidth=\"1.6\"\n strokeLinecap=\"round\"\n />\n </svg>\n </IconButton>\n ) : null}\n </div>\n ) : null}\n </div>\n <div data-slot=\"sheet-body\" className={styles.body}>\n {children}\n </div>\n </div>\n </div>\n </Portal>\n );\n}\n\nSheet.displayName = 'Sheet';\n",".skeleton {\n display: block;\n}\n\n.skeleton[data-state=\"loading\"] {\n position: relative;\n overflow: hidden;\n min-height: 1em;\n border-radius: 8px;\n background: var(--tgui--fill);\n color: transparent;\n pointer-events: none;\n}\n\n.skeleton[data-state=\"loading\"] * {\n visibility: hidden;\n}\n\n.skeleton[data-state=\"loading\"]::after {\n content: \"\";\n position: absolute;\n inset: 0;\n transform: translateX(-100%);\n background: linear-gradient(\n 90deg,\n transparent,\n color-mix(in srgb, var(--tgui--label) 5%, transparent),\n transparent\n );\n animation: tgui-skeleton 1.5s ease-in-out infinite;\n}\n\n@keyframes tgui-skeleton {\n to {\n transform: translateX(100%);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .skeleton[data-state=\"loading\"]::after {\n animation: none;\n }\n}\n\n@media (prefers-reduced-transparency: reduce) {\n .skeleton[data-state=\"loading\"] {\n background: var(--tgui--fill);\n }\n}\n","import type { HTMLAttributes, ReactNode, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './Skeleton.module.css';\n\nexport interface SkeletonProps extends HTMLAttributes<HTMLDivElement> {\n ref?: Ref<HTMLDivElement>;\n visible?: boolean;\n children?: ReactNode;\n}\n\nexport function Skeleton({ ref, visible = true, className, children, ...rest }: SkeletonProps) {\n return (\n <div\n ref={ref}\n data-slot=\"skeleton\"\n data-state={visible ? 'loading' : 'loaded'}\n aria-hidden={visible || undefined}\n className={cn(styles.skeleton, className)}\n {...rest}\n >\n {children}\n </div>\n );\n}\n\nSkeleton.displayName = 'Skeleton';\n",".slider {\n display: flex;\n align-items: center;\n gap: 12px;\n width: 100%;\n}\n\n.track {\n position: relative;\n flex: 1;\n height: 28px;\n display: flex;\n align-items: center;\n}\n\n.rail {\n position: absolute;\n left: 0;\n right: 0;\n height: 4px;\n border-radius: 2px;\n background: var(--tgui--accent-fill);\n}\n\n.fill {\n position: absolute;\n left: 0;\n height: 4px;\n border-radius: 2px;\n background: var(--tgui--link);\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .fill {\n transition: width 0.1s linear;\n }\n}\n\n.input {\n position: relative;\n z-index: 1;\n width: 100%;\n height: 28px;\n margin: 0;\n padding: 0;\n background: transparent;\n appearance: none;\n cursor: pointer;\n}\n\n.input:focus-visible {\n outline: none;\n}\n\n.input::-webkit-slider-thumb {\n appearance: none;\n width: 22px;\n height: 22px;\n border-radius: 50%;\n background: var(--tgui--white);\n box-shadow: 0 1px 4px rgb(0 0 0 / 0.25);\n cursor: grab;\n}\n\n.input:active::-webkit-slider-thumb {\n cursor: grabbing;\n}\n\n.input::-moz-range-thumb {\n width: 22px;\n height: 22px;\n border: 0;\n border-radius: 50%;\n background: var(--tgui--white);\n box-shadow: 0 1px 4px rgb(0 0 0 / 0.25);\n}\n\n.input:focus-visible::-webkit-slider-thumb {\n box-shadow:\n 0 1px 4px rgb(0 0 0 / 0.25),\n var(--tgui--focus-ring-shadow);\n}\n\n.input:focus-visible::-moz-range-thumb {\n box-shadow:\n 0 1px 4px rgb(0 0 0 / 0.25),\n var(--tgui--focus-ring-shadow);\n}\n\n.input:disabled {\n cursor: default;\n}\n\n.slider[data-disabled] {\n opacity: 0.4;\n}\n\n.side {\n flex-shrink: 0;\n color: var(--tgui--label-secondary);\n font-family: var(--tgui--font-family);\n font-size: 14px;\n}\n","'use client';\n\nimport {\n type ChangeEvent,\n type InputHTMLAttributes,\n type ReactNode,\n type Ref,\n useState,\n} from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { useHaptic } from '../TguiProvider';\nimport styles from './Slider.module.css';\n\nexport interface SliderProps\n extends Omit<InputHTMLAttributes<HTMLInputElement>, 'value' | 'defaultValue' | 'onChange'> {\n ref?: Ref<HTMLInputElement>;\n value?: number;\n defaultValue?: number;\n onValueChange?: (value: number) => void;\n min?: number;\n max?: number;\n step?: number;\n before?: ReactNode;\n after?: ReactNode;\n}\n\nexport function Slider({\n ref,\n value: valueProp,\n defaultValue,\n onValueChange,\n min = 0,\n max = 100,\n step = 1,\n before,\n after,\n disabled,\n className,\n ...rest\n}: SliderProps) {\n const [uncontrolled, setUncontrolled] = useState(defaultValue ?? min);\n const value = valueProp ?? uncontrolled;\n const percent = max > min ? ((value - min) / (max - min)) * 100 : 0;\n const haptic = useHaptic();\n\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n const next = Number(event.target.value);\n if (next !== value) haptic('select');\n if (valueProp == null) setUncontrolled(next);\n onValueChange?.(next);\n };\n\n return (\n <div\n data-slot=\"slider\"\n className={cn(styles.slider, className)}\n data-disabled={disabled || undefined}\n >\n {before != null ? (\n <span data-slot=\"slider-before\" className={styles.side}>\n {before}\n </span>\n ) : null}\n <span data-slot=\"slider-track\" className={styles.track}>\n <span data-slot=\"slider-rail\" className={styles.rail} />\n <span\n data-slot=\"slider-range\"\n className={styles.fill}\n style={{ width: `${Math.max(0, Math.min(100, percent))}%` }}\n />\n <input\n ref={ref}\n type=\"range\"\n data-slot=\"slider-input\"\n className={styles.input}\n min={min}\n max={max}\n step={step}\n value={value}\n disabled={disabled}\n onChange={handleChange}\n {...rest}\n />\n </span>\n {after != null ? (\n <span data-slot=\"slider-after\" className={styles.side}>\n {after}\n </span>\n ) : null}\n </div>\n );\n}\n\nSlider.displayName = 'Slider';\n","import type { ReactNode } from 'react';\nimport { createContext } from 'react';\n\nexport interface SnackbarOptions {\n message: ReactNode;\n description?: ReactNode;\n before?: ReactNode;\n action?: { label: string; onClick: () => void };\n duration?: number;\n}\n\nexport interface SnackbarApi {\n show: (options: SnackbarOptions) => string;\n dismiss: (id: string) => void;\n}\n\nexport const SnackbarContext = createContext<SnackbarApi | null>(null);\n\nSnackbarContext.displayName = 'SnackbarContext';\n",".viewport {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: var(--tgui--z-overlay, 1000);\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 8px;\n padding: 12px;\n padding-bottom: calc(12px + env(safe-area-inset-bottom, 0px));\n overflow: clip;\n overflow-clip-margin: 28px;\n pointer-events: none;\n}\n\n.snackbar {\n display: flex;\n align-items: center;\n gap: 12px;\n width: 100%;\n max-width: 440px;\n box-sizing: border-box;\n padding: 12px 16px;\n border-radius: 12px;\n /* every surface that appears over the page shares one background */\n background: var(--tgui--surface-bg);\n color: var(--tgui--label);\n box-shadow:\n 0 0 0 0.5px var(--tgui--separator),\n 0 6px 24px rgb(0 0 0 / 0.4);\n pointer-events: auto;\n touch-action: pan-y;\n opacity: 0;\n transform: translateY(16px);\n}\n\n.snackbar[data-state=\"open\"] {\n opacity: 1;\n transform: translateY(0);\n}\n\n/* a toast is edge-anchored – it slides up from the screen edge, sharing the\n kit's spring easing with every other surface that appears */\n@media (prefers-reduced-motion: no-preference) {\n .snackbar {\n transition:\n opacity var(--tgui--duration-fast) ease,\n transform var(--tgui--duration-fast) var(--tgui--ease-spring);\n }\n}\n\n.snackbar--dragging {\n transition: none;\n}\n\n.before {\n display: flex;\n flex-shrink: 0;\n color: var(--tgui--link-strong);\n}\n\n.body {\n display: flex;\n flex-direction: column;\n gap: 2px;\n flex: 1;\n min-width: 0;\n font-family: var(--tgui--font-family);\n}\n\n.message {\n font-size: 15px;\n line-height: 20px;\n}\n\n.description {\n font-size: 13px;\n line-height: 18px;\n color: var(--tgui--label-secondary);\n}\n\n.action {\n flex-shrink: 0;\n padding: 4px 8px;\n margin-inline-end: -8px;\n border: 0;\n border-radius: 8px;\n background: transparent;\n color: var(--tgui--link-strong);\n font-family: var(--tgui--font-family);\n font-size: 15px;\n font-weight: var(--tgui--weight-semibold);\n cursor: pointer;\n}\n\n.action:focus-visible {\n outline: var(--tgui--focus-ring);\n outline-offset: calc(-1 * var(--tgui--focus-ring-offset));\n}\n","'use client';\n\nimport {\n type ReactNode,\n type PointerEvent as ReactPointerEvent,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { useReducedMotion } from '../../shared/lib/useReducedMotion';\nimport { Portal } from '../Portal';\nimport { SnackbarContext, type SnackbarOptions } from './context';\nimport styles from './Snackbar.module.css';\n\nconst EXIT_MS = 240;\nconst SWIPE_DISMISS = 80;\n\ninterface SnackItem extends SnackbarOptions {\n id: string;\n}\n\nexport interface SnackbarProviderProps {\n children: ReactNode;\n duration?: number;\n max?: number;\n}\n\nexport function SnackbarProvider({ children, duration = 4000, max = 3 }: SnackbarProviderProps) {\n const [items, setItems] = useState<SnackItem[]>([]);\n const nextId = useRef(0);\n\n const dismiss = useCallback((id: string) => {\n setItems((current) => current.filter((item) => item.id !== id));\n }, []);\n\n const show = useCallback(\n (options: SnackbarOptions) => {\n const id = `snackbar-${nextId.current++}`;\n setItems((current) => [...current, { ...options, id }].slice(-max));\n return id;\n },\n [max],\n );\n\n const api = useMemo(() => ({ show, dismiss }), [show, dismiss]);\n\n return (\n <SnackbarContext.Provider value={api}>\n {children}\n {items.length > 0 ? (\n <Portal>\n <div data-slot=\"snackbar-viewport\" className={styles.viewport}>\n {items.map((item) => (\n <SnackbarItem\n key={item.id}\n item={item}\n defaultDuration={duration}\n onDismiss={() => dismiss(item.id)}\n />\n ))}\n </div>\n </Portal>\n ) : null}\n </SnackbarContext.Provider>\n );\n}\n\nSnackbarProvider.displayName = 'SnackbarProvider';\n\ninterface SnackbarItemProps {\n item: SnackItem;\n defaultDuration: number;\n onDismiss: () => void;\n}\n\nfunction SnackbarItem({ item, defaultDuration, onDismiss }: SnackbarItemProps) {\n const reducedMotion = useReducedMotion();\n const [visible, setVisible] = useState(false);\n const [leaving, setLeaving] = useState(false);\n const nodeRef = useRef<HTMLDivElement | null>(null);\n\n const duration = item.duration ?? defaultDuration;\n const remaining = useRef(duration);\n const startedAt = useRef(0);\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const drag = useRef({ id: -1, startX: 0, active: false });\n\n useLayoutEffect(() => {\n const node = nodeRef.current;\n if (node) void node.offsetHeight;\n setVisible(true);\n }, []);\n\n const close = useCallback(() => {\n setLeaving(true);\n setVisible(false);\n if (reducedMotion) {\n onDismiss();\n return;\n }\n const id = setTimeout(onDismiss, EXIT_MS);\n return () => clearTimeout(id);\n }, [reducedMotion, onDismiss]);\n\n const pause = useCallback(() => {\n if (!timer.current) return;\n clearTimeout(timer.current);\n timer.current = null;\n remaining.current -= Date.now() - startedAt.current;\n }, []);\n\n const resume = useCallback(() => {\n if (duration <= 0 || leaving || timer.current) return;\n startedAt.current = Date.now();\n timer.current = setTimeout(() => close(), Math.max(0, remaining.current));\n }, [duration, leaving, close]);\n\n useEffect(() => {\n resume();\n return pause;\n }, [resume, pause]);\n\n const onPointerDown = (event: ReactPointerEvent<HTMLDivElement>) => {\n if (event.button !== 0) return;\n drag.current = { id: event.pointerId, startX: event.clientX, active: false };\n pause();\n };\n\n const onPointerMove = (event: ReactPointerEvent<HTMLDivElement>) => {\n const state = drag.current;\n if (state.id !== event.pointerId) return;\n const dx = event.clientX - state.startX;\n if (!state.active) {\n if (Math.abs(dx) < 6) return;\n state.active = true;\n event.currentTarget.setPointerCapture(event.pointerId);\n nodeRef.current?.classList.add(styles['snackbar--dragging']);\n }\n if (nodeRef.current) {\n nodeRef.current.style.transform = `translateX(${dx}px)`;\n nodeRef.current.style.opacity = `${Math.max(0, 1 - Math.abs(dx) / 240)}`;\n }\n };\n\n const endDrag = (event: ReactPointerEvent<HTMLDivElement>) => {\n const state = drag.current;\n if (state.id !== event.pointerId) return;\n drag.current = { id: -1, startX: 0, active: false };\n const node = nodeRef.current;\n if (!node) return;\n node.classList.remove(styles['snackbar--dragging']);\n const dx = event.clientX - state.startX;\n if (state.active && Math.abs(dx) > SWIPE_DISMISS) {\n if (reducedMotion) {\n onDismiss();\n return;\n }\n node.style.transition = 'transform 0.2s ease-out, opacity 0.2s ease-out';\n node.style.transform = `translateX(${Math.sign(dx) * (window.innerWidth || 400)}px)`;\n node.style.opacity = '0';\n setTimeout(onDismiss, 190);\n return;\n }\n node.style.transform = '';\n node.style.opacity = '';\n resume();\n };\n\n return (\n <div\n ref={nodeRef}\n data-slot=\"snackbar\"\n data-state={visible && !leaving ? 'open' : 'closed'}\n className={styles.snackbar}\n role=\"status\"\n onMouseEnter={pause}\n onMouseLeave={resume}\n onFocus={pause}\n onBlur={resume}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={endDrag}\n onPointerCancel={endDrag}\n >\n {item.before != null ? (\n <span data-slot=\"snackbar-before\" className={styles.before}>\n {item.before}\n </span>\n ) : null}\n <div data-slot=\"snackbar-body\" className={styles.body}>\n <span data-slot=\"snackbar-message\" className={styles.message}>\n {item.message}\n </span>\n {item.description != null ? (\n <span data-slot=\"snackbar-description\" className={styles.description}>\n {item.description}\n </span>\n ) : null}\n </div>\n {item.action != null ? (\n <button\n type=\"button\"\n data-slot=\"snackbar-action\"\n className={styles.action}\n onClick={() => {\n item.action?.onClick();\n close();\n }}\n >\n {item.action.label}\n </button>\n ) : null}\n </div>\n );\n}\n","import { useContext } from 'react';\nimport { type SnackbarApi, SnackbarContext } from './context';\n\nexport function useSnackbar(): SnackbarApi {\n const api = useContext(SnackbarContext);\n if (!api) {\n throw new Error('useSnackbar must be used within a <SnackbarProvider>.');\n }\n return api;\n}\n","export interface Particle {\n x0: number;\n y0: number;\n vx: number;\n vy: number;\n life: number;\n respawn: number;\n phase: number;\n size: number;\n square: boolean;\n}\n\nconst TAU = Math.PI * 2;\nconst clamp01 = (value: number) => Math.max(0, Math.min(1, value));\nconst easeOutCubic = (t: number) => 1 - (1 - t) ** 3;\n\n// particle grows in over `up` seconds, holds, shrinks over `down` seconds\nfunction trapezoid(life: number, up: number, down: number, t: number) {\n const hold = Math.max(up, life - down);\n if (t < up) return Math.max(0, t / up);\n if (t > hold) return Math.max(0, 1 - (t - hold) / (life - hold));\n return 1;\n}\n\nexport function createParticles(w: number, h: number, density: number): Particle[] {\n const count = Math.round(Math.min(1800, Math.max(12, density * w * h)));\n const particles: Particle[] = [];\n for (let i = 0; i < count; i += 1) {\n const speed = 2 + Math.random() * 10;\n const angle = Math.random() * TAU;\n const life = 0.3 + Math.random() * 1.2;\n const respawn = Math.random();\n particles.push({\n x0: Math.random() * w,\n y0: Math.random() * h,\n vx: speed * Math.cos(angle),\n vy: speed * Math.sin(angle),\n life,\n respawn,\n phase: Math.random() * (life + respawn),\n size: 1 + Math.random() * 0.7,\n square: Math.random() > 0.5,\n });\n }\n return particles;\n}\n\n// paints one frame; `stop` is the loop time (s) at which the reveal began, or null\nexport function paintParticles(\n ctx: CanvasRenderingContext2D,\n pixelW: number,\n pixelH: number,\n dpr: number,\n particles: Particle[],\n color: readonly [number, number, number],\n time: number,\n stop: number | null,\n fade: number,\n) {\n ctx.clearRect(0, 0, pixelW, pixelH);\n const w = pixelW / dpr;\n const h = pixelH / dpr;\n const [r, g, b] = color;\n const n = particles.length;\n\n for (let i = 0; i < n; i += 1) {\n const p = particles[i];\n const period = p.life + p.respawn;\n\n if (stop != null) {\n const spawned = Math.floor((time + p.phase) / period);\n const lastAllowed = Math.floor((stop + p.phase) / period);\n if (spawned > lastAllowed) continue;\n }\n\n const local = (time + p.phase) % period;\n if (local >= p.life) continue;\n\n let x = (p.x0 + p.vx * local) % w;\n if (x < 0) x += w;\n let y = (p.y0 + p.vy * local) % h;\n if (y < 0) y += h;\n\n const visible = trapezoid(p.life, 0.15, 0.3, local);\n let alpha = visible * (0.45 + 0.55 * (1 - local / p.life));\n\n if (stop != null && fade > 0) {\n const fadeStart = stop + ((2 / 3) * fade * i) / n;\n const progress = clamp01((time - fadeStart) / ((1 / 3) * fade));\n alpha *= easeOutCubic(1 - progress);\n }\n\n if (alpha <= 0.01) continue;\n\n const size = Math.max(0.5, p.size * visible) * dpr;\n ctx.fillStyle = `rgba(${r}, ${g}, ${b}, ${alpha.toFixed(3)})`;\n ctx.beginPath();\n if (p.square) {\n ctx.rect(x * dpr, y * dpr, size, size);\n } else {\n ctx.arc(x * dpr, y * dpr, size / 2, 0, TAU);\n }\n ctx.fill();\n }\n}\n",".spoiler {\n --tgui--spoiler-p: 0;\n --tgui--spoiler-edge: 10px;\n --tgui--spoiler-edge-y: 3px;\n --tgui--spoiler-radius: 5px;\n position: relative;\n display: inline-block;\n max-width: 100%;\n border-radius: 4px;\n vertical-align: baseline;\n isolation: isolate;\n color: var(--tgui--label);\n}\n\n.spoiler[data-state=\"closed\"] {\n cursor: pointer;\n}\n\n.spoiler::before,\n.canvas {\n border-radius: var(--tgui--spoiler-radius);\n overflow: hidden;\n -webkit-mask-image:\n linear-gradient(\n to right,\n transparent,\n #000 var(--tgui--spoiler-edge),\n #000 calc(100% - var(--tgui--spoiler-edge)),\n transparent\n ),\n linear-gradient(\n to bottom,\n transparent,\n #000 var(--tgui--spoiler-edge-y),\n #000 calc(100% - var(--tgui--spoiler-edge-y)),\n transparent\n );\n -webkit-mask-composite: source-in;\n mask-image:\n linear-gradient(\n to right,\n transparent,\n #000 var(--tgui--spoiler-edge),\n #000 calc(100% - var(--tgui--spoiler-edge)),\n transparent\n ),\n linear-gradient(\n to bottom,\n transparent,\n #000 var(--tgui--spoiler-edge-y),\n #000 calc(100% - var(--tgui--spoiler-edge-y)),\n transparent\n );\n mask-composite: intersect;\n}\n\n.spoiler::before {\n content: \"\";\n position: absolute;\n inset: -1px -3px;\n z-index: 0;\n background: currentColor;\n opacity: calc((1 - var(--tgui--spoiler-p)) * 0.06);\n pointer-events: none;\n}\n\n.content {\n display: inline-block;\n position: relative;\n z-index: 2;\n opacity: var(--tgui--spoiler-p);\n}\n\n.spoiler[data-state=\"closed\"] .content {\n user-select: none;\n pointer-events: none;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .content,\n .spoiler::before {\n transition: opacity 0.4s ease;\n }\n}\n\n.canvas {\n position: absolute;\n inset: -1px -3px;\n z-index: 1;\n width: calc(100% + 6px);\n height: calc(100% + 2px);\n pointer-events: none;\n}\n\n.spoiler:focus-visible {\n outline: var(--tgui--focus-ring);\n outline-offset: var(--tgui--focus-ring-offset);\n}\n","'use client';\n\nimport {\n type CSSProperties,\n type HTMLAttributes,\n type KeyboardEvent as ReactKeyboardEvent,\n type Ref,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { useReducedMotion } from '../../shared/lib/useReducedMotion';\nimport { createParticles, type Particle, paintParticles } from './particles';\nimport styles from './Spoiler.module.css';\n\nconst FADE_S = 0.5;\n\nexport interface SpoilerProps extends HTMLAttributes<HTMLSpanElement> {\n ref?: Ref<HTMLSpanElement>;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n revealOn?: 'click' | 'hover';\n accentColor?: string;\n density?: number;\n fps?: number;\n revealLabel?: string;\n}\n\nfunction parseColor(value: string): [number, number, number] {\n const parts = value.match(/-?\\d*\\.?\\d+/g);\n if (!parts || parts.length < 3) return [128, 128, 128];\n return [Number(parts[0]), Number(parts[1]), Number(parts[2])];\n}\n\nexport function Spoiler({\n ref,\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n revealOn = 'click',\n accentColor,\n density = 0.1,\n fps = 40,\n revealLabel = 'Reveal hidden text',\n className,\n style,\n children,\n onClick,\n onKeyDown,\n onMouseEnter,\n onMouseLeave,\n ...rest\n}: SpoilerProps) {\n const [uncontrolled, setUncontrolled] = useState(defaultOpen);\n const revealed = openProp ?? uncontrolled;\n const reducedMotion = useReducedMotion();\n const isButton = revealOn === 'click';\n\n const rootRef = useRef<HTMLSpanElement | null>(null);\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n const particles = useRef<Particle[]>([]);\n const colorRef = useRef<[number, number, number]>([128, 128, 128]);\n const inView = useRef(true);\n const stopAt = useRef<number | null>(revealed ? 0 : null);\n const loopTime = useRef(0);\n\n const [painting, setPainting] = useState(!revealed);\n\n const setRevealed = (next: boolean) => {\n if (next) {\n stopAt.current = loopTime.current;\n } else {\n stopAt.current = null;\n setPainting(true);\n }\n if (openProp == null) setUncontrolled(next);\n onOpenChange?.(next);\n };\n\n useEffect(() => {\n if (!painting) return;\n const root = rootRef.current;\n const canvas = canvasRef.current;\n const ctx = canvas?.getContext('2d');\n if (!root || !canvas || !ctx) return;\n\n const dpr = Math.min(2, window.devicePixelRatio || 1);\n\n const sync = () => {\n const box = canvas.getBoundingClientRect();\n const w = Math.max(1, Math.round(box.width * dpr));\n const h = Math.max(1, Math.round(box.height * dpr));\n if (canvas.width !== w || canvas.height !== h) {\n canvas.width = w;\n canvas.height = h;\n particles.current = createParticles(w / dpr, h / dpr, density);\n }\n colorRef.current = parseColor(accentColor ?? getComputedStyle(root).color);\n };\n sync();\n\n if (reducedMotion) {\n paintParticles(\n ctx,\n canvas.width,\n canvas.height,\n dpr,\n particles.current,\n colorRef.current,\n 0.6,\n null,\n 0,\n );\n return;\n }\n\n let raf = 0;\n let start = 0;\n let last = -1;\n const frameGap = 1000 / Math.max(8, fps);\n\n const loop = (now: number) => {\n if (!start) start = now;\n const time = (now - start) / 1000;\n loopTime.current = time;\n const stop = stopAt.current;\n\n if (stop != null && time > stop + FADE_S + 0.06) {\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n setPainting(false);\n return;\n }\n\n raf = requestAnimationFrame(loop);\n if (!inView.current || now - last < frameGap) return;\n last = now;\n\n paintParticles(\n ctx,\n canvas.width,\n canvas.height,\n dpr,\n particles.current,\n colorRef.current,\n time,\n stop,\n FADE_S,\n );\n };\n\n raf = requestAnimationFrame(loop);\n\n const ro = typeof ResizeObserver !== 'undefined' ? new ResizeObserver(sync) : null;\n ro?.observe(root);\n const io =\n typeof IntersectionObserver !== 'undefined'\n ? new IntersectionObserver(([entry]) => {\n inView.current = entry.isIntersecting;\n })\n : null;\n io?.observe(root);\n\n return () => {\n cancelAnimationFrame(raf);\n ro?.disconnect();\n io?.disconnect();\n };\n }, [painting, reducedMotion, density, fps, accentColor]);\n\n const toggle = () => setRevealed(!revealed);\n\n return (\n // biome-ignore lint/a11y/useSemanticElements: a spoiler sits inline inside a sentence; a <button> would break the text flow and reset typography\n <span\n ref={(node) => {\n rootRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as { current: HTMLSpanElement | null }).current = node;\n }}\n data-slot=\"spoiler\"\n data-state={revealed ? 'open' : 'closed'}\n className={cn(styles.spoiler, className)}\n role=\"button\"\n tabIndex={0}\n aria-pressed={revealed}\n aria-label={revealed ? undefined : revealLabel}\n style={{ ...style, '--tgui--spoiler-p': revealed ? 1 : 0 } as CSSProperties}\n onClick={(event) => {\n onClick?.(event);\n if (isButton) toggle();\n }}\n onKeyDown={(event: ReactKeyboardEvent<HTMLSpanElement>) => {\n onKeyDown?.(event);\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n toggle();\n }\n }}\n onMouseEnter={(event) => {\n onMouseEnter?.(event);\n if (!isButton && !revealed) setRevealed(true);\n }}\n onMouseLeave={(event) => {\n onMouseLeave?.(event);\n if (!isButton && revealed) setRevealed(false);\n }}\n {...rest}\n >\n <span data-slot=\"spoiler-content\" className={styles.content} aria-hidden={!revealed}>\n {children}\n </span>\n {painting ? (\n <canvas ref={canvasRef} data-slot=\"spoiler-overlay\" className={styles.canvas} aria-hidden />\n ) : null}\n </span>\n );\n}\n\nSpoiler.displayName = 'Spoiler';\n",".stepper {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n}\n\n.value {\n width: 36px;\n margin: 0;\n padding: 0;\n border: 0;\n outline: 0;\n background: transparent;\n color: var(--tgui--label);\n font-family: var(--tgui--font-family);\n font-size: 16px;\n text-align: center;\n appearance: textfield;\n}\n\n.value::-webkit-outer-spin-button,\n.value::-webkit-inner-spin-button {\n margin: 0;\n appearance: none;\n}\n\n.value:disabled {\n color: var(--tgui--label-secondary);\n}\n\n.value:focus-visible {\n border-radius: 4px;\n outline: var(--tgui--focus-ring);\n outline-offset: var(--tgui--focus-ring-offset);\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .value[data-pulse=\"up\"] {\n animation: pulse-up 0.18s ease-out;\n }\n\n .value[data-pulse=\"down\"] {\n animation: pulse-down 0.18s ease-out;\n }\n}\n\n@keyframes pulse-up {\n from {\n transform: translateY(6px);\n opacity: 0.4;\n }\n}\n\n@keyframes pulse-down {\n from {\n transform: translateY(-6px);\n opacity: 0.4;\n }\n}\n","'use client';\n\nimport {\n type ChangeEvent,\n type HTMLAttributes,\n type KeyboardEvent,\n type Ref,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { useReducedMotion } from '../../shared/lib/useReducedMotion';\nimport { IconButton } from '../IconButton';\nimport styles from './Stepper.module.css';\n\nexport interface StepperProps\n extends Omit<HTMLAttributes<HTMLDivElement>, 'onChange' | 'defaultValue'> {\n ref?: Ref<HTMLDivElement>;\n value?: number;\n defaultValue?: number;\n onValueChange?: (value: number) => void;\n min?: number;\n max?: number;\n step?: number;\n disabled?: boolean;\n}\n\nconst clamp = (value: number, min: number, max: number) => Math.min(max, Math.max(min, value));\n\nconst MinusIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" aria-hidden>\n <path d=\"M2.5 7h9\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n </svg>\n);\n\nconst PlusIcon = () => (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" aria-hidden>\n <path d=\"M7 2.5v9M2.5 7h9\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" />\n </svg>\n);\n\nexport function Stepper({\n ref,\n value: valueProp,\n defaultValue,\n onValueChange,\n min = 0,\n max = Number.POSITIVE_INFINITY,\n step = 1,\n disabled = false,\n className,\n ...rest\n}: StepperProps) {\n const reducedMotion = useReducedMotion();\n const [uncontrolled, setUncontrolled] = useState(defaultValue ?? min);\n const value = valueProp ?? uncontrolled;\n const [text, setText] = useState(String(value));\n const [pulse, setPulse] = useState<'up' | 'down' | null>(null);\n const previousValue = useRef(value);\n\n const setValue = (next: number) => {\n if (valueProp == null) setUncontrolled(next);\n onValueChange?.(next);\n };\n\n useEffect(() => {\n setText(String(value));\n if (value !== previousValue.current) {\n if (!reducedMotion) setPulse(value > previousValue.current ? 'up' : 'down');\n previousValue.current = value;\n }\n }, [value, reducedMotion]);\n\n const commit = () => {\n const parsed = Number.parseFloat(text);\n const next = clamp(Number.isNaN(parsed) ? value : parsed, min, max);\n setValue(next);\n setText(String(next));\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n if (event.key !== 'Enter') return;\n commit();\n event.currentTarget.blur();\n };\n\n return (\n <div ref={ref} data-slot=\"stepper\" className={cn(styles.stepper, className)} {...rest}>\n <IconButton\n mode=\"gray\"\n size=\"s\"\n circle\n data-slot=\"stepper-decrement\"\n aria-label=\"Decrease\"\n disabled={disabled || value <= min}\n onClick={() => setValue(clamp(value - step, min, max))}\n >\n <MinusIcon />\n </IconButton>\n <input\n className={styles.value}\n data-slot=\"stepper-input\"\n type=\"number\"\n inputMode=\"numeric\"\n aria-label=\"Value\"\n value={text}\n disabled={disabled}\n data-pulse={pulse ?? undefined}\n onChange={(event: ChangeEvent<HTMLInputElement>) => setText(event.target.value)}\n onBlur={commit}\n onKeyDown={handleKeyDown}\n onAnimationEnd={() => setPulse(null)}\n />\n <IconButton\n mode=\"gray\"\n size=\"s\"\n circle\n data-slot=\"stepper-increment\"\n aria-label=\"Increase\"\n disabled={disabled || value >= max}\n onClick={() => setValue(clamp(value + step, min, max))}\n >\n <PlusIcon />\n </IconButton>\n </div>\n );\n}\n\nStepper.displayName = 'Stepper';\n",".steps {\n display: flex;\n align-items: center;\n gap: 4px;\n width: 100%;\n}\n\n.segment {\n flex: 1 1 0;\n overflow: hidden;\n height: 3px;\n border-radius: 2px;\n background: var(--tgui--accent-fill);\n}\n\n.fill {\n height: 100%;\n border-radius: inherit;\n background: var(--tgui--link);\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .fill {\n transition: width 0.2s ease;\n }\n}\n","import type { HTMLAttributes, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './Steps.module.css';\n\nexport interface StepsProps extends HTMLAttributes<HTMLDivElement> {\n ref?: Ref<HTMLDivElement>;\n count: number;\n progress: number;\n}\n\nconst clamp01 = (value: number) => Math.max(0, Math.min(1, value));\n\nexport function Steps({\n ref,\n count,\n progress,\n className,\n 'aria-label': ariaLabel,\n ...rest\n}: StepsProps) {\n return (\n <div\n ref={ref}\n role=\"progressbar\"\n aria-label={ariaLabel ?? 'Progress'}\n aria-valuemin={0}\n aria-valuemax={count}\n aria-valuenow={Math.max(0, Math.min(count, progress))}\n data-slot=\"steps\"\n className={cn(styles.steps, className)}\n {...rest}\n >\n {Array.from({ length: count }, (_, index) => (\n // biome-ignore lint/suspicious/noArrayIndexKey: fixed-length positional segments\n <div key={index} data-slot=\"steps-segment\" className={styles.segment}>\n <div\n data-slot=\"steps-fill\"\n className={styles.fill}\n style={{ width: `${clamp01(progress - index) * 100}%` }}\n />\n </div>\n ))}\n </div>\n );\n}\n\nSteps.displayName = 'Steps';\n",".switch {\n position: relative;\n overflow: hidden;\n display: inline-flex;\n align-items: center;\n width: 52px;\n height: 32px;\n border-radius: 16px;\n cursor: pointer;\n flex-shrink: 0;\n}\n\n.switch[data-disabled] {\n cursor: default;\n opacity: 0.4;\n}\n\n.input {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n margin: 0;\n opacity: 0;\n cursor: inherit;\n}\n\n.control::before {\n position: absolute;\n content: \"\";\n inset: 0;\n background: var(--tgui--bg-secondary);\n}\n\n.base .control::before {\n border-radius: 16px;\n border: 3px solid var(--tgui--label-tertiary);\n}\n\n.control::after {\n position: absolute;\n content: \"\";\n top: 50%;\n transform: translateY(-50%);\n border-radius: 50%;\n}\n\n.base .control::after {\n width: 16px;\n height: 16px;\n margin-inline-start: 8px;\n background: var(--tgui--label-tertiary);\n}\n\n.ios .control::before {\n background: rgba(120, 120, 128, 0.22);\n}\n\n.ios .control::after {\n width: 28px;\n height: 28px;\n margin-inline-start: 2px;\n background: var(--tgui--white);\n box-shadow:\n 0 3px 8px 0 rgba(0, 0, 0, 0.12),\n 0 1px 1px 0 rgba(0, 0, 0, 0.16);\n}\n\n.input:checked + .control::before {\n border-color: var(--tgui--link);\n background-color: var(--tgui--link);\n}\n\n.input:checked + .control::after {\n transform: translateX(20px) translateY(-50%);\n}\n\n.base .input:checked + .control::after {\n width: 24px;\n height: 24px;\n background: var(--tgui--white);\n transform: translateX(16px) translateY(-50%);\n}\n\n.input:focus-visible + .control::before {\n box-shadow: var(--tgui--focus-ring-shadow);\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .control::before {\n transition:\n background-color 0.2s ease,\n border-color 0.2s ease;\n }\n .control::after {\n transition: transform 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275);\n }\n .ios .control::after {\n transition: transform 0.2s cubic-bezier(0.36, -0.24, 0.26, 1.32);\n }\n}\n","'use client';\n\nimport type { ChangeEvent, InputHTMLAttributes, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { useHaptic, useTgui } from '../TguiProvider';\nimport styles from './Switch.module.css';\n\nexport interface SwitchProps extends InputHTMLAttributes<HTMLInputElement> {\n ref?: Ref<HTMLInputElement>;\n}\n\nexport function Switch({ ref, disabled, className, style, onChange, ...rest }: SwitchProps) {\n const { platform } = useTgui();\n const haptic = useHaptic();\n\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n haptic('select');\n onChange?.(event);\n };\n\n return (\n <label\n data-slot=\"switch\"\n className={cn(styles.switch, platform === 'ios' ? styles.ios : styles.base, className)}\n style={style}\n data-disabled={disabled || undefined}\n >\n <input\n ref={ref}\n type=\"checkbox\"\n data-slot=\"switch-input\"\n className={styles.input}\n disabled={disabled}\n onChange={handleChange}\n {...rest}\n />\n <span aria-hidden data-slot=\"switch-thumb\" className={styles.control} />\n </label>\n );\n}\n\nSwitch.displayName = 'Switch';\n",".bar {\n display: flex;\n align-items: stretch;\n padding: 0 16px;\n padding-bottom: calc(var(--tgui--safe-area-bottom) + var(--tgui--content-safe-area-bottom));\n background: var(--tgui--surface-bg);\n box-shadow: 0 -0.5px 0 var(--tgui--separator);\n}\n\n.barIos {\n padding: 0;\n padding-bottom: calc(6px + var(--tgui--safe-area-bottom) + var(--tgui--content-safe-area-bottom));\n}\n\n.item {\n flex: 1 0 0;\n min-inline-size: 0;\n max-inline-size: 100%;\n margin: 0;\n padding: 10px 16px 14px;\n border: none;\n background: transparent;\n\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 4px;\n\n /* inactive tab – iOS secondaryLabel grey; must stay a readable label */\n color: var(--tgui--label-secondary);\n}\n\n.itemIos {\n padding: 7px 12px 2px;\n gap: 3px;\n}\n\n.item[data-selected] {\n color: var(--tgui--link-strong);\n}\n\n.item:focus-visible {\n outline: var(--tgui--focus-ring);\n outline-offset: calc(-1 * var(--tgui--focus-ring-offset));\n}\n\n.icon {\n display: flex;\n align-items: center;\n justify-content: center;\n min-width: 64px;\n height: 32px;\n padding: 2px 10px;\n border-radius: 16px;\n}\n\n.itemIos .icon {\n min-width: 0;\n height: 28px;\n padding: 0;\n}\n\n.item[data-selected]:not(.itemIos) .icon {\n background: var(--tgui--accent-fill);\n}\n\n.text {\n max-inline-size: 100%;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .item {\n transition: color 0.15s ease-out;\n }\n\n .icon {\n transition: background 0.15s ease-out;\n }\n}\n","'use client';\n\nimport type { ButtonHTMLAttributes, ReactNode, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { Caption } from '../Caption';\nimport { Tappable } from '../Tappable';\nimport { useTgui } from '../TguiProvider';\nimport styles from './TabBar.module.css';\n\nexport interface TabBarItemProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n ref?: Ref<HTMLElement>;\n selected?: boolean;\n text?: string;\n children?: ReactNode;\n}\n\nexport function TabBarItem({ ref, selected, text, children, className, ...rest }: TabBarItemProps) {\n const { platform } = useTgui();\n const ios = platform === 'ios';\n\n return (\n <Tappable\n ref={ref}\n Component=\"button\"\n interactiveAnimation=\"opacity\"\n data-slot=\"tab-bar-item\"\n data-selected={selected || undefined}\n aria-current={selected ? 'page' : undefined}\n className={cn(styles.item, ios && styles.itemIos, className)}\n {...rest}\n >\n {children != null ? (\n <span data-slot=\"tab-bar-item-icon\" className={styles.icon}>\n {children}\n </span>\n ) : null}\n {text != null ? (\n <Caption\n data-slot=\"tab-bar-item-label\"\n className={styles.text}\n weight=\"2\"\n level={ios ? '2' : '1'}\n >\n {text}\n </Caption>\n ) : null}\n </Tappable>\n );\n}\n\nTabBarItem.displayName = 'TabBarItem';\n","'use client';\n\nimport type { HTMLAttributes, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { useTgui } from '../TguiProvider';\nimport styles from './TabBar.module.css';\nimport { TabBarItem } from './TabBarItem';\n\nexport interface TabBarProps extends HTMLAttributes<HTMLElement> {\n ref?: Ref<HTMLElement>;\n}\n\nexport function TabBar({ ref, className, children, ...rest }: TabBarProps) {\n const { platform } = useTgui();\n\n return (\n <nav\n ref={ref}\n data-slot=\"tab-bar\"\n className={cn(styles.bar, platform === 'ios' && styles.barIos, className)}\n {...rest}\n >\n {children}\n </nav>\n );\n}\n\nTabBar.displayName = 'TabBar';\nTabBar.Item = TabBarItem;\n",".field {\n display: block;\n width: 100%;\n margin: 0;\n padding: 0;\n border: 0;\n outline: 0;\n resize: none;\n background: transparent;\n color: var(--tgui--label);\n font-family: inherit;\n line-height: 1.4;\n overflow-y: auto;\n}\n\n.field::placeholder {\n color: var(--tgui--label-tertiary);\n}\n","'use client';\n\nimport {\n type ChangeEvent,\n type FocusEvent,\n type MutableRefObject,\n type ReactNode,\n type Ref,\n type TextareaHTMLAttributes,\n useCallback,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport { FormField } from '../FormField';\nimport { Subheadline } from '../Subheadline';\nimport { Text } from '../Text';\nimport { useTgui } from '../TguiProvider';\nimport styles from './Textarea.module.css';\n\nexport type TextareaStatus = 'default' | 'error' | 'focused';\n\nexport interface TextareaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {\n ref?: Ref<HTMLTextAreaElement>;\n header?: ReactNode;\n status?: TextareaStatus;\n autoGrow?: boolean;\n maxRows?: number;\n}\n\nexport function Textarea({\n ref,\n header,\n status,\n autoGrow = false,\n maxRows,\n rows = 3,\n disabled,\n className,\n value,\n defaultValue,\n onFocus,\n onBlur,\n onChange,\n ...rest\n}: TextareaProps) {\n const { platform } = useTgui();\n const ios = platform === 'ios';\n const [focused, setFocused] = useState(false);\n const state = status ?? (focused ? 'focused' : 'default');\n const Typography = ios ? Text : Subheadline;\n\n const innerRef = useRef<HTMLTextAreaElement>(null);\n const setRefs = useCallback(\n (node: HTMLTextAreaElement | null) => {\n innerRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as MutableRefObject<HTMLTextAreaElement | null>).current = node;\n },\n [ref],\n );\n\n const resize = useCallback(() => {\n const el = innerRef.current;\n if (!el || !autoGrow) return;\n el.style.height = 'auto';\n const cs = getComputedStyle(el);\n const lineHeight = Number.parseFloat(cs.lineHeight) || 20;\n const max = maxRows ? lineHeight * maxRows : Number.POSITIVE_INFINITY;\n el.style.height = `${Math.min(el.scrollHeight, max)}px`;\n el.style.overflowY = el.scrollHeight > max ? 'auto' : 'hidden';\n }, [autoGrow, maxRows]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: value drives the re-measure\n useEffect(resize, [resize, value, defaultValue]);\n\n const handleFocus = (event: FocusEvent<HTMLTextAreaElement>) => {\n if (!disabled) setFocused(true);\n onFocus?.(event);\n };\n const handleBlur = (event: FocusEvent<HTMLTextAreaElement>) => {\n setFocused(false);\n onBlur?.(event);\n };\n const handleChange = (event: ChangeEvent<HTMLTextAreaElement>) => {\n resize();\n onChange?.(event);\n };\n\n return (\n <FormField\n ios={ios}\n status={state}\n disabled={disabled}\n alignStart\n header={header}\n className={className}\n >\n <Typography\n ref={setRefs as Ref<HTMLElement>}\n Component=\"textarea\"\n data-slot=\"textarea\"\n className={styles.field}\n rows={rows}\n disabled={disabled}\n aria-invalid={state === 'error' || undefined}\n value={value}\n defaultValue={defaultValue}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onChange={handleChange}\n {...rest}\n />\n </FormField>\n );\n}\n\nTextarea.displayName = 'Textarea';\n",".timeline {\n display: flex;\n flex-direction: column;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.item {\n position: relative;\n display: flex;\n gap: 12px;\n padding-bottom: 20px;\n}\n\n.item:last-child {\n padding-bottom: 0;\n}\n\n.rail {\n position: relative;\n display: flex;\n flex-shrink: 0;\n justify-content: center;\n width: 10px;\n padding-top: 5px;\n}\n\n.connector {\n position: absolute;\n top: 10px;\n bottom: -30px;\n left: 50%;\n width: 1.5px;\n transform: translateX(-50%);\n background: var(--tgui--separator);\n}\n\n.item:last-child .connector {\n display: none;\n}\n\n.item:has(~ .item[data-active]) .connector {\n background: var(--tgui--link);\n}\n\n.dot {\n z-index: 1;\n flex-shrink: 0;\n width: 10px;\n height: 10px;\n border-radius: 50%;\n background: var(--tgui--label-tertiary);\n}\n\n.item:has(~ .item[data-active]) .dot {\n background: var(--tgui--link);\n}\n\n.item[data-active] .dot {\n background: var(--tgui--link);\n box-shadow: 0 0 0 3px var(--tgui--accent-fill);\n}\n\n@media (prefers-reduced-motion: no-preference) {\n .connector,\n .dot {\n transition:\n background 0.2s ease,\n box-shadow 0.2s ease;\n }\n}\n\n.content {\n flex: 1;\n min-width: 0;\n padding-top: 1px;\n}\n\n.heading {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: 8px;\n}\n\n.title {\n font-family: var(--tgui--font-family);\n font-size: 15px;\n font-weight: var(--tgui--weight-semibold);\n color: var(--tgui--label);\n}\n\n.time {\n flex-shrink: 0;\n font-family: var(--tgui--font-family);\n font-size: 13px;\n color: var(--tgui--label-secondary);\n}\n\n.description {\n margin-top: 2px;\n font-family: var(--tgui--font-family);\n font-size: 14px;\n line-height: 18px;\n color: var(--tgui--label-secondary);\n}\n\n.item[data-active] ~ .item .title {\n color: var(--tgui--label-secondary);\n}\n\n.item[data-active] ~ .item .description {\n color: var(--tgui--label-secondary);\n}\n\n.item[data-active] ~ .item .dot {\n background: color-mix(in srgb, var(--tgui--label-tertiary) 55%, var(--tgui--bg));\n}\n","import type { HTMLAttributes, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './Timeline.module.css';\n\nexport interface TimelineProps extends HTMLAttributes<HTMLOListElement> {\n ref?: Ref<HTMLOListElement>;\n}\n\nexport function Timeline({ ref, className, children, ...rest }: TimelineProps) {\n return (\n <ol ref={ref} data-slot=\"timeline\" className={cn(styles.timeline, className)} {...rest}>\n {children}\n </ol>\n );\n}\n\nTimeline.displayName = 'Timeline';\n","import type { HTMLAttributes, ReactNode, Ref } from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport styles from './Timeline.module.css';\n\nexport interface TimelineItemProps extends Omit<HTMLAttributes<HTMLLIElement>, 'title'> {\n ref?: Ref<HTMLLIElement>;\n title: ReactNode;\n description?: ReactNode;\n time?: ReactNode;\n active?: boolean;\n}\n\nexport function TimelineItem({\n ref,\n title,\n description,\n time,\n active = false,\n className,\n ...rest\n}: TimelineItemProps) {\n return (\n <li\n ref={ref}\n data-slot=\"timeline-item\"\n className={cn(styles.item, className)}\n data-active={active || undefined}\n {...rest}\n >\n <span data-slot=\"timeline-item-rail\" className={styles.rail} aria-hidden>\n <span className={styles.connector} />\n <span className={styles.dot} />\n </span>\n <div data-slot=\"timeline-item-content\" className={styles.content}>\n <div className={styles.heading}>\n <span data-slot=\"timeline-item-title\" className={styles.title}>\n {title}\n </span>\n {time != null ? (\n <span data-slot=\"timeline-item-time\" className={styles.time}>\n {time}\n </span>\n ) : null}\n </div>\n {description != null ? (\n <div data-slot=\"timeline-item-description\" className={styles.description}>\n {description}\n </div>\n ) : null}\n </div>\n </li>\n );\n}\n\nTimelineItem.displayName = 'TimelineItem';\n",".trigger {\n display: inline-flex;\n}\n\n.tooltip {\n position: fixed;\n top: 0;\n left: 0;\n z-index: var(--tgui--z-overlay, 1000);\n max-width: 260px;\n padding: 6px 10px;\n border-radius: var(--tgui--radius-sm);\n background: var(--tgui--surface-bg);\n color: var(--tgui--label);\n font-family: var(--tgui--font-family);\n font-size: 13px;\n line-height: 17px;\n box-shadow: var(--tgui--overlay-shadow);\n pointer-events: none;\n transform-origin: var(--tgui--tooltip-origin-x, 50%) var(--tgui--tooltip-origin-y, 50%);\n}\n\n/* visible at rest once positioned; the keyframes only ferry it in and out, and it\n stays hidden (inline opacity: 0) until the layout effect has placed it, so the\n entrance always plays from the final position – same as Popover */\n@media (prefers-reduced-motion: no-preference) {\n .tooltip[data-state=\"open\"] {\n animation: tooltip-in var(--tgui--duration-overlay) var(--tgui--ease-spring);\n }\n\n .tooltip[data-state=\"closed\"] {\n animation: tooltip-out var(--tgui--duration-overlay) var(--tgui--ease-in) forwards;\n }\n}\n\n@keyframes tooltip-in {\n from {\n opacity: 0;\n transform: scale(0.96);\n }\n}\n\n@keyframes tooltip-out {\n to {\n opacity: 0;\n transform: scale(0.96);\n }\n}\n\n.arrow {\n position: absolute;\n width: 8px;\n height: 8px;\n background: inherit;\n /* hairline on the two outer edges so the tip keeps the bubble's ring on a light surface */\n box-shadow: 0 0 0 0.5px var(--tgui--separator);\n transform: rotate(45deg);\n}\n","'use client';\n\nimport { Presence } from '@radix-ui/react-presence';\nimport {\n type CSSProperties,\n type ReactNode,\n type Ref,\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n} from 'react';\nimport { cn } from '../../shared/lib/cn';\nimport { getFixedOffset } from '../../shared/lib/floatingPosition';\nimport { Portal } from '../Portal';\nimport styles from './Tooltip.module.css';\n\nexport type TooltipPlacement = 'top' | 'bottom' | 'left' | 'right';\n\nexport interface TooltipProps {\n ref?: Ref<HTMLSpanElement>;\n children: ReactNode;\n content: ReactNode;\n placement?: TooltipPlacement;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n className?: string;\n}\n\nconst GAP = 8;\nconst MARGIN = 8;\nconst clamp = (value: number, min: number, max: number) => Math.max(min, Math.min(max, value));\n\ninterface Position {\n top: number;\n left: number;\n placement: TooltipPlacement;\n originX: number;\n originY: number;\n arrow: CSSProperties;\n}\n\nfunction compute(\n trigger: DOMRect,\n tip: DOMRect,\n want: TooltipPlacement,\n tipEl: Element | null,\n): Position {\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n let placement = want;\n if (placement === 'top' && trigger.top - tip.height - GAP < MARGIN) placement = 'bottom';\n else if (placement === 'bottom' && trigger.bottom + tip.height + GAP > vh - MARGIN)\n placement = 'top';\n else if (placement === 'left' && trigger.left - tip.width - GAP < MARGIN) placement = 'right';\n else if (placement === 'right' && trigger.right + tip.width + GAP > vw - MARGIN)\n placement = 'left';\n\n let top = 0;\n let left = 0;\n if (placement === 'top' || placement === 'bottom') {\n left = trigger.left + trigger.width / 2 - tip.width / 2;\n top = placement === 'top' ? trigger.top - tip.height - GAP : trigger.bottom + GAP;\n } else {\n top = trigger.top + trigger.height / 2 - tip.height / 2;\n left = placement === 'left' ? trigger.left - tip.width - GAP : trigger.right + GAP;\n }\n left = clamp(left, MARGIN, vw - tip.width - MARGIN);\n top = clamp(top, MARGIN, vh - tip.height - MARGIN);\n\n const centerX = trigger.left + trigger.width / 2 - left;\n const centerY = trigger.top + trigger.height / 2 - top;\n const arrow: CSSProperties = {};\n if (placement === 'top') {\n arrow.left = clamp(centerX, 10, tip.width - 10) - 4;\n arrow.bottom = -4;\n } else if (placement === 'bottom') {\n arrow.left = clamp(centerX, 10, tip.width - 10) - 4;\n arrow.top = -4;\n } else if (placement === 'left') {\n arrow.top = clamp(centerY, 10, tip.height - 10) - 4;\n arrow.right = -4;\n } else {\n arrow.top = clamp(centerY, 10, tip.height - 10) - 4;\n arrow.left = -4;\n }\n\n const offset = getFixedOffset(tipEl);\n return {\n top: (top - offset.y) / offset.scale,\n left: (left - offset.x) / offset.scale,\n placement,\n originX: clamp(centerX, 0, tip.width),\n originY: clamp(centerY, 0, tip.height),\n arrow,\n };\n}\n\nexport function Tooltip({\n ref,\n children,\n content,\n placement = 'top',\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n className,\n}: TooltipProps) {\n const [uncontrolled, setUncontrolled] = useState(defaultOpen);\n const open = openProp ?? uncontrolled;\n\n const triggerRef = useRef<HTMLSpanElement | null>(null);\n const tipRef = useRef<HTMLDivElement | null>(null);\n const pressTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const [tipNode, setTipNode] = useState<HTMLDivElement | null>(null);\n const [pos, setPos] = useState<Position | null>(null);\n const id = useId();\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (openProp == null) setUncontrolled(next);\n onOpenChange?.(next);\n },\n [openProp, onOpenChange],\n );\n\n const reposition = useCallback(() => {\n const trigger = triggerRef.current;\n const tip = tipRef.current;\n if (!trigger || !tip) return;\n setPos(compute(trigger.getBoundingClientRect(), tip.getBoundingClientRect(), placement, tip));\n }, [placement]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: tipNode re-runs this once Presence mounts the tip, a render after `open` flips\n useLayoutEffect(() => {\n if (open) reposition();\n }, [open, reposition, tipNode]);\n\n useEffect(() => {\n if (!open) return;\n const onScroll = () => setOpen(false);\n window.addEventListener('scroll', onScroll, true);\n window.addEventListener('resize', reposition);\n return () => {\n window.removeEventListener('scroll', onScroll, true);\n window.removeEventListener('resize', reposition);\n };\n }, [open, reposition, setOpen]);\n\n useEffect(() => {\n if (!open) return;\n const onKey = (event: KeyboardEvent) => {\n if (event.key === 'Escape') setOpen(false);\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [open, setOpen]);\n\n const clearPress = useCallback(() => {\n if (pressTimer.current) {\n clearTimeout(pressTimer.current);\n pressTimer.current = null;\n }\n }, []);\n\n useEffect(() => clearPress, [clearPress]);\n\n return (\n <>\n {/* biome-ignore lint/a11y/noStaticElementInteractions: this span only relays hover/focus to the described tooltip; the child is the real control */}\n <span\n ref={(node) => {\n triggerRef.current = node;\n if (typeof ref === 'function') ref(node);\n else if (ref) (ref as { current: HTMLSpanElement | null }).current = node;\n }}\n data-slot=\"tooltip-trigger\"\n className={cn(styles.trigger, className)}\n aria-describedby={open ? id : undefined}\n onPointerEnter={(event) => {\n if (event.pointerType !== 'touch') setOpen(true);\n }}\n onPointerLeave={(event) => {\n if (event.pointerType !== 'touch') setOpen(false);\n clearPress();\n }}\n onPointerDown={(event) => {\n if (event.pointerType === 'touch') {\n pressTimer.current = setTimeout(() => setOpen(true), 450);\n }\n }}\n onPointerUp={clearPress}\n onPointerCancel={clearPress}\n onFocus={() => setOpen(true)}\n onBlur={() => setOpen(false)}\n >\n {children}\n </span>\n <Portal>\n <Presence present={open}>\n <div\n ref={(node) => {\n tipRef.current = node;\n setTipNode(node);\n }}\n id={id}\n role=\"tooltip\"\n data-slot=\"tooltip-content\"\n data-state={pos ? (open ? 'open' : 'closed') : undefined}\n className={styles.tooltip}\n style={\n pos\n ? ({\n top: pos.top,\n left: pos.left,\n '--tgui--tooltip-origin-x': `${pos.originX}px`,\n '--tgui--tooltip-origin-y': `${pos.originY}px`,\n } as CSSProperties)\n : { top: 0, left: 0, opacity: 0, pointerEvents: 'none' }\n }\n data-placement={pos?.placement}\n >\n {content}\n {pos ? (\n <span\n data-slot=\"tooltip-arrow\"\n className={styles.arrow}\n style={pos.arrow}\n aria-hidden\n />\n ) : null}\n </div>\n </Presence>\n </Portal>\n </>\n );\n}\n\nTooltip.displayName = 'Tooltip';\n"],"x_google_ignoreList":[68,69,70,71,72,73,74,75,76],"mappings":"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"}