@nori-ui/core 1.6.0 → 1.7.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.
Files changed (179) hide show
  1. package/dist/{chunk-7UKRN73P.js → chunk-2XJCLPNH.js} +3 -3
  2. package/dist/{chunk-7UKRN73P.js.map → chunk-2XJCLPNH.js.map} +1 -1
  3. package/dist/{chunk-5PSC5HT4.js → chunk-3B345SQU.js} +5 -5
  4. package/dist/{chunk-5PSC5HT4.js.map → chunk-3B345SQU.js.map} +1 -1
  5. package/dist/{chunk-JSAG5YO7.js → chunk-3IIIHZHT.js} +3 -3
  6. package/dist/{chunk-JSAG5YO7.js.map → chunk-3IIIHZHT.js.map} +1 -1
  7. package/dist/{chunk-DDGMLLS3.js → chunk-3W3XYULK.js} +3 -3
  8. package/dist/{chunk-DDGMLLS3.js.map → chunk-3W3XYULK.js.map} +1 -1
  9. package/dist/{chunk-WYPGQVDV.js → chunk-5YHT252H.js} +3 -3
  10. package/dist/{chunk-WYPGQVDV.js.map → chunk-5YHT252H.js.map} +1 -1
  11. package/dist/{chunk-ZMSIYLSI.js → chunk-7FSFJA33.js} +3 -3
  12. package/dist/{chunk-ZMSIYLSI.js.map → chunk-7FSFJA33.js.map} +1 -1
  13. package/dist/{chunk-YZ27OS2R.js → chunk-C32XGHWO.js} +3 -3
  14. package/dist/{chunk-YZ27OS2R.js.map → chunk-C32XGHWO.js.map} +1 -1
  15. package/dist/{chunk-UJWCEGQY.js → chunk-C5HQPXRI.js} +3 -3
  16. package/dist/{chunk-UJWCEGQY.js.map → chunk-C5HQPXRI.js.map} +1 -1
  17. package/dist/{chunk-XALU6LOT.js → chunk-EN4CLDGZ.js} +3 -3
  18. package/dist/{chunk-XALU6LOT.js.map → chunk-EN4CLDGZ.js.map} +1 -1
  19. package/dist/{chunk-6AD6KCVB.js → chunk-F5UKI7XD.js} +3 -3
  20. package/dist/{chunk-6AD6KCVB.js.map → chunk-F5UKI7XD.js.map} +1 -1
  21. package/dist/chunk-GTAXVTLF.js +43 -0
  22. package/dist/chunk-GTAXVTLF.js.map +1 -0
  23. package/dist/{chunk-NNFJKRXZ.js → chunk-H2LHWJ52.js} +3 -3
  24. package/dist/{chunk-NNFJKRXZ.js.map → chunk-H2LHWJ52.js.map} +1 -1
  25. package/dist/{chunk-PZS4A4VQ.js → chunk-HXCETKCC.js} +3 -3
  26. package/dist/{chunk-PZS4A4VQ.js.map → chunk-HXCETKCC.js.map} +1 -1
  27. package/dist/chunk-IGBXSBF7.js +71 -0
  28. package/dist/chunk-IGBXSBF7.js.map +1 -0
  29. package/dist/{chunk-JXLEMBDB.js → chunk-IIVTPN62.js} +3 -3
  30. package/dist/{chunk-JXLEMBDB.js.map → chunk-IIVTPN62.js.map} +1 -1
  31. package/dist/{chunk-PNP7L4TA.js → chunk-ISCJST4P.js} +3 -3
  32. package/dist/{chunk-PNP7L4TA.js.map → chunk-ISCJST4P.js.map} +1 -1
  33. package/dist/{chunk-TLS54G6Y.js → chunk-IWM2XDXH.js} +3 -3
  34. package/dist/{chunk-TLS54G6Y.js.map → chunk-IWM2XDXH.js.map} +1 -1
  35. package/dist/chunk-J5LK2XHE.js +118 -0
  36. package/dist/chunk-J5LK2XHE.js.map +1 -0
  37. package/dist/chunk-KFFGDET3.js +27 -0
  38. package/dist/chunk-KFFGDET3.js.map +1 -0
  39. package/dist/{chunk-MRJWPRCX.js → chunk-L6VYDM7S.js} +3 -3
  40. package/dist/{chunk-MRJWPRCX.js.map → chunk-L6VYDM7S.js.map} +1 -1
  41. package/dist/chunk-M4BI63P6.js +188 -0
  42. package/dist/chunk-M4BI63P6.js.map +1 -0
  43. package/dist/{chunk-RUWD35UI.js → chunk-MK57AOTI.js} +4 -4
  44. package/dist/{chunk-RUWD35UI.js.map → chunk-MK57AOTI.js.map} +1 -1
  45. package/dist/{chunk-3BDDPFCI.js → chunk-MOAIQHR7.js} +3 -3
  46. package/dist/{chunk-3BDDPFCI.js.map → chunk-MOAIQHR7.js.map} +1 -1
  47. package/dist/{chunk-5XEGZFG5.js → chunk-MYBBBLYE.js} +3 -3
  48. package/dist/{chunk-5XEGZFG5.js.map → chunk-MYBBBLYE.js.map} +1 -1
  49. package/dist/{chunk-WP2Z2ATO.js → chunk-O6M3F7BZ.js} +5 -5
  50. package/dist/{chunk-WP2Z2ATO.js.map → chunk-O6M3F7BZ.js.map} +1 -1
  51. package/dist/{chunk-FEPTH5RV.js → chunk-OELY6K44.js} +3 -3
  52. package/dist/{chunk-FEPTH5RV.js.map → chunk-OELY6K44.js.map} +1 -1
  53. package/dist/{chunk-BZLT6R62.js → chunk-OIHX5B4R.js} +3 -3
  54. package/dist/{chunk-BZLT6R62.js.map → chunk-OIHX5B4R.js.map} +1 -1
  55. package/dist/{chunk-QJVS2VXS.js → chunk-PGYEIXCO.js} +4 -4
  56. package/dist/{chunk-QJVS2VXS.js.map → chunk-PGYEIXCO.js.map} +1 -1
  57. package/dist/{chunk-UZD77M3J.js → chunk-PJTCO76H.js} +3 -3
  58. package/dist/{chunk-UZD77M3J.js.map → chunk-PJTCO76H.js.map} +1 -1
  59. package/dist/{chunk-4PUPKWEP.js → chunk-PJXVLE24.js} +4 -4
  60. package/dist/{chunk-4PUPKWEP.js.map → chunk-PJXVLE24.js.map} +1 -1
  61. package/dist/{chunk-WGT345SV.js → chunk-PLQPBMG2.js} +3 -3
  62. package/dist/{chunk-WGT345SV.js.map → chunk-PLQPBMG2.js.map} +1 -1
  63. package/dist/{chunk-OMU4R4Y5.js → chunk-PQW5LKAI.js} +3 -3
  64. package/dist/{chunk-OMU4R4Y5.js.map → chunk-PQW5LKAI.js.map} +1 -1
  65. package/dist/{chunk-Y5TJ7CAX.js → chunk-RI4Y2C5U.js} +3 -3
  66. package/dist/{chunk-Y5TJ7CAX.js.map → chunk-RI4Y2C5U.js.map} +1 -1
  67. package/dist/{chunk-3OIWAS2P.js → chunk-SF6WPUC5.js} +3 -3
  68. package/dist/{chunk-3OIWAS2P.js.map → chunk-SF6WPUC5.js.map} +1 -1
  69. package/dist/{chunk-MKSDYRWQ.js → chunk-STX5UKYT.js} +3 -3
  70. package/dist/{chunk-MKSDYRWQ.js.map → chunk-STX5UKYT.js.map} +1 -1
  71. package/dist/{chunk-2RL6WCFC.js → chunk-TSWPHJIU.js} +4 -4
  72. package/dist/{chunk-2RL6WCFC.js.map → chunk-TSWPHJIU.js.map} +1 -1
  73. package/dist/{chunk-SFNDR6DI.js → chunk-U2ZKY2CP.js} +3 -3
  74. package/dist/{chunk-SFNDR6DI.js.map → chunk-U2ZKY2CP.js.map} +1 -1
  75. package/dist/{chunk-PABG3IJ6.js → chunk-UKDDK42K.js} +3 -3
  76. package/dist/{chunk-PABG3IJ6.js.map → chunk-UKDDK42K.js.map} +1 -1
  77. package/dist/{chunk-VYRJ7OE5.js → chunk-USFXANEU.js} +3 -3
  78. package/dist/{chunk-VYRJ7OE5.js.map → chunk-USFXANEU.js.map} +1 -1
  79. package/dist/{chunk-CCUXO2HN.js → chunk-V5QSMDZL.js} +3 -3
  80. package/dist/{chunk-CCUXO2HN.js.map → chunk-V5QSMDZL.js.map} +1 -1
  81. package/dist/{chunk-NF7XG2FG.js → chunk-V75O7QQO.js} +3 -3
  82. package/dist/{chunk-NF7XG2FG.js.map → chunk-V75O7QQO.js.map} +1 -1
  83. package/dist/{chunk-NRYWNOG5.js → chunk-VL2WNGPF.js} +3 -3
  84. package/dist/{chunk-NRYWNOG5.js.map → chunk-VL2WNGPF.js.map} +1 -1
  85. package/dist/{chunk-JQQ3FBN7.js → chunk-VLZANXRZ.js} +3 -3
  86. package/dist/{chunk-JQQ3FBN7.js.map → chunk-VLZANXRZ.js.map} +1 -1
  87. package/dist/{chunk-2HMQDJ22.js → chunk-VOF3S5I4.js} +3 -3
  88. package/dist/{chunk-2HMQDJ22.js.map → chunk-VOF3S5I4.js.map} +1 -1
  89. package/dist/chunk-XQNVWHMN.js +60 -0
  90. package/dist/chunk-XQNVWHMN.js.map +1 -0
  91. package/dist/{chunk-JZ774T7U.js → chunk-ZGFXKYA5.js} +3 -3
  92. package/dist/{chunk-JZ774T7U.js.map → chunk-ZGFXKYA5.js.map} +1 -1
  93. package/dist/client.cjs +451 -2
  94. package/dist/client.cjs.map +1 -1
  95. package/dist/client.d.cts +6 -0
  96. package/dist/client.d.ts +6 -0
  97. package/dist/client.js +52 -46
  98. package/dist/client.js.map +1 -1
  99. package/dist/components/Accordion/index.js +2 -2
  100. package/dist/components/Alert/index.js +2 -2
  101. package/dist/components/AlertDialog/index.js +2 -2
  102. package/dist/components/AspectRatio/index.cjs +67 -0
  103. package/dist/components/AspectRatio/index.cjs.map +1 -0
  104. package/dist/components/AspectRatio/index.d.cts +30 -0
  105. package/dist/components/AspectRatio/index.d.ts +30 -0
  106. package/dist/components/AspectRatio/index.js +5 -0
  107. package/dist/components/AspectRatio/index.js.map +1 -0
  108. package/dist/components/Avatar/index.js +2 -2
  109. package/dist/components/Badge/index.js +2 -2
  110. package/dist/components/Box/index.js +4 -4
  111. package/dist/components/Breadcrumb/index.js +3 -3
  112. package/dist/components/Button/index.js +2 -2
  113. package/dist/components/ButtonGroup/index.cjs +83 -0
  114. package/dist/components/ButtonGroup/index.cjs.map +1 -0
  115. package/dist/components/ButtonGroup/index.d.cts +45 -0
  116. package/dist/components/ButtonGroup/index.d.ts +45 -0
  117. package/dist/components/ButtonGroup/index.js +5 -0
  118. package/dist/components/ButtonGroup/index.js.map +1 -0
  119. package/dist/components/Calendar/index.js +3 -3
  120. package/dist/components/Card/index.js +2 -2
  121. package/dist/components/Checkbox/index.js +2 -2
  122. package/dist/components/Collapsible/index.cjs +512 -0
  123. package/dist/components/Collapsible/index.cjs.map +1 -0
  124. package/dist/components/Collapsible/index.d.cts +50 -0
  125. package/dist/components/Collapsible/index.d.ts +50 -0
  126. package/dist/components/Collapsible/index.js +7 -0
  127. package/dist/components/Collapsible/index.js.map +1 -0
  128. package/dist/components/Combobox/index.js +3 -3
  129. package/dist/components/ContextMenu/index.js +4 -4
  130. package/dist/components/DataTable/index.js +3 -3
  131. package/dist/components/DatePicker/index.js +5 -5
  132. package/dist/components/Dialog/index.js +2 -2
  133. package/dist/components/DropdownMenu/index.js +3 -3
  134. package/dist/components/Empty/index.cjs +385 -0
  135. package/dist/components/Empty/index.cjs.map +1 -0
  136. package/dist/components/Empty/index.d.cts +32 -0
  137. package/dist/components/Empty/index.d.ts +32 -0
  138. package/dist/components/Empty/index.js +7 -0
  139. package/dist/components/Empty/index.js.map +1 -0
  140. package/dist/components/FloatButton/index.js +3 -3
  141. package/dist/components/HStack/index.js +4 -4
  142. package/dist/components/InputGroup/index.js +2 -2
  143. package/dist/components/Item/index.cjs +443 -0
  144. package/dist/components/Item/index.cjs.map +1 -0
  145. package/dist/components/Item/index.d.cts +40 -0
  146. package/dist/components/Item/index.d.ts +40 -0
  147. package/dist/components/Item/index.js +7 -0
  148. package/dist/components/Item/index.js.map +1 -0
  149. package/dist/components/Kbd/index.cjs +396 -0
  150. package/dist/components/Kbd/index.cjs.map +1 -0
  151. package/dist/components/Kbd/index.d.cts +22 -0
  152. package/dist/components/Kbd/index.d.ts +22 -0
  153. package/dist/components/Kbd/index.js +7 -0
  154. package/dist/components/Kbd/index.js.map +1 -0
  155. package/dist/components/Pagination/index.js +4 -4
  156. package/dist/components/Popover/index.js +2 -2
  157. package/dist/components/Progress/index.js +2 -2
  158. package/dist/components/Radio/index.js +2 -2
  159. package/dist/components/SegmentedControl/index.js +2 -2
  160. package/dist/components/Select/index.js +2 -2
  161. package/dist/components/Separator/index.js +2 -2
  162. package/dist/components/Sheet/index.js +2 -2
  163. package/dist/components/Skeleton/index.js +2 -2
  164. package/dist/components/Slider/index.js +2 -2
  165. package/dist/components/Switch/index.js +2 -2
  166. package/dist/components/Table/index.js +2 -2
  167. package/dist/components/Tabs/index.js +2 -2
  168. package/dist/components/Text/index.js +2 -2
  169. package/dist/components/TextArea/index.js +3 -3
  170. package/dist/components/TextInput/index.js +2 -2
  171. package/dist/components/Toggle/index.js +2 -2
  172. package/dist/components/Tooltip/index.js +2 -2
  173. package/dist/components/VStack/index.js +4 -4
  174. package/dist/index.cjs +451 -2
  175. package/dist/index.cjs.map +1 -1
  176. package/dist/index.d.cts +6 -0
  177. package/dist/index.d.ts +6 -0
  178. package/dist/index.js +50 -44
  179. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Popover/Popover.tsx"],"names":["RNText","content"],"mappings":"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","file":"chunk-PZS4A4VQ.js","sourcesContent":["'use client';\n\nimport {\n createContext,\n isValidElement,\n type ReactElement,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react';\nimport type { ViewStyle } from 'react-native';\nimport { Dimensions, Modal, Platform, Pressable, Text as RNText, View } from 'react-native';\nimport { Slot } from '../../slot';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\n\nexport type PopoverSide = 'top' | 'right' | 'bottom' | 'left';\nexport type PopoverAlign = 'start' | 'center' | 'end';\n\ntype TriggerRect = { top: number; left: number; width: number; height: number };\n\ntype PopoverContextValue = {\n open: boolean;\n setOpen: (next: boolean) => void;\n contentId: string;\n triggerRef: { current: HTMLElement | null };\n contentRef: { current: HTMLDivElement | null };\n triggerRect: TriggerRect | null;\n measureTrigger: () => void;\n};\n\nconst PopoverContext = createContext<PopoverContextValue | null>(null);\n\nconst usePopoverContext = (label: string): PopoverContextValue => {\n const ctx = useContext(PopoverContext);\n if (!ctx) {\n throw new Error(`<${label}> must be rendered inside a <Popover>.`);\n }\n return ctx;\n};\n\n/**\n * @internal — exposes the Popover context so higher-level overlay components\n * (DropdownMenu, ContextMenu) can interact with trigger measurement and open\n * state without going through PopoverTrigger.\n */\nexport { usePopoverContext };\n\nexport type PopoverProps = {\n /** Controlled open state. */\n open?: boolean;\n /** Uncontrolled initial open state. @defaultValue false */\n defaultOpen?: boolean;\n /** Fires with the new open state. */\n onOpenChange?: (open: boolean) => void;\n children?: ReactNode;\n};\n\n/**\n * Non-modal floating panel anchored to a trigger element. Use for help\n * tooltips with rich content, color pickers, or profile previews.\n *\n * Composition: `Popover` (root, owns open state), `PopoverTrigger`\n * (forwards events to its child via Slot when `asChild`), `PopoverContent`\n * (the floating surface).\n *\n * Differences from `Dialog`: non-modal — does NOT trap focus or lock\n * scroll. Tab moves outside as normal. Differences from `Tooltip`: can\n * contain interactive content (buttons, inputs, links) and dismisses on\n * outside-click + Escape rather than mouse-leave.\n *\n * Behavior:\n * - Trigger click toggles open/close.\n * - Click outside the content (and outside the trigger) closes.\n * - Escape closes.\n *\n * Cross-platform: uses RN `<Modal>` as the visibility/portal primitive on\n * native (transparent backdrop, tap-outside-to-close). On web, the content\n * uses `position: fixed` + a measured trigger rect so it escapes any\n * ancestor `overflow: hidden`.\n */\nconst PopoverRoot = ({ open, defaultOpen = false, onOpenChange, children }: PopoverProps) => {\n const [inner, setInner] = useState<boolean>(defaultOpen);\n const isControlled = open !== undefined;\n const current = isControlled ? open : inner;\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) {\n setInner(next);\n }\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange]\n );\n\n const baseId = useId();\n const triggerRef = useRef<HTMLElement | null>(null);\n const contentRef = useRef<HTMLDivElement | null>(null);\n\n // Measure the trigger so the content can render with `position: fixed` +\n // computed coords. position:fixed escapes any ancestor's overflow:hidden\n // (e.g. fumadocs Tabs panes, our Preview frame), which is the single\n // biggest source of \"the popup got cut off\" bugs.\n const [triggerRect, setTriggerRect] = useState<TriggerRect | null>(null);\n const measureTrigger = useCallback(() => {\n const node = triggerRef.current;\n if (!node || typeof node.getBoundingClientRect !== 'function') {\n return;\n }\n const rect = node.getBoundingClientRect();\n setTriggerRect({ top: rect.top, left: rect.left, width: rect.width, height: rect.height });\n }, []);\n\n const ctxValue: PopoverContextValue = {\n open: current,\n setOpen,\n contentId: `${baseId}-content`,\n triggerRef,\n contentRef,\n triggerRect,\n measureTrigger,\n };\n\n return <PopoverContext.Provider value={ctxValue}>{children}</PopoverContext.Provider>;\n};\n\nexport type PopoverTriggerProps = {\n /** Render the child as the trigger (Slot pattern). Default true — pass `false` for an inline pressable. */\n asChild?: boolean;\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/**\n * Element that toggles the popover. Uses `asChild` by default so any\n * element (Button, Link, custom Pressable) becomes the trigger.\n *\n * The trigger element gets `aria-haspopup=\"dialog\"` and `aria-expanded`\n * so assistive tech announces the relationship.\n */\nexport const PopoverTrigger = ({ asChild = true, children, className, testID }: PopoverTriggerProps) => {\n const ctx = usePopoverContext('PopoverTrigger');\n const onPress = useCallback(() => {\n ctx.measureTrigger();\n ctx.setOpen(!ctx.open);\n }, [ctx]);\n\n if (asChild && isValidElement(children)) {\n const child = children as ReactElement<Record<string, unknown>>;\n // Pass both onClick (web HTML buttons) AND onPress (RN Pressable /\n // our own Button) so the trigger fires regardless of which event\n // model the wrapped child speaks. The child's existing handler\n // runs first, then we toggle.\n const fire = (existing: ((e: unknown) => void) | undefined) => (event: unknown) => {\n existing?.(event);\n ctx.measureTrigger();\n ctx.setOpen(!ctx.open);\n };\n return (\n <Slot\n ref={(node: HTMLElement | null) => {\n ctx.triggerRef.current = node;\n }}\n onClick={fire(child.props.onClick as ((e: unknown) => void) | undefined)}\n onPress={fire(child.props.onPress as ((e: unknown) => void) | undefined)}\n aria-haspopup=\"dialog\"\n aria-expanded={ctx.open}\n aria-controls={ctx.contentId}\n {...(testID !== undefined ? { 'data-testid': testID } : {})}\n {...(className !== undefined ? { className } : {})}\n >\n {child}\n </Slot>\n );\n }\n\n return (\n <Pressable\n ref={(node) => {\n ctx.triggerRef.current = node as unknown as HTMLElement | null;\n }}\n onPress={onPress}\n {...({\n 'aria-haspopup': 'dialog',\n 'aria-expanded': ctx.open,\n 'aria-controls': ctx.contentId,\n } as Record<string, unknown>)}\n {...(testID !== undefined ? { testID } : {})}\n {...(className !== undefined ? { className } : {})}\n >\n {wrapStringChildren(children)}\n </Pressable>\n );\n};\n\n// On native, raw strings rendered as children of a non-Text component\n// throw \"Text strings must be rendered within a <Text> component\". On\n// web, react-native-web silently tolerates it. Wrap any string/number\n// children in an RNText so the same JSX renders cleanly on both\n// platforms. Non-string children are passed through unchanged.\nfunction wrapStringChildren(children: ReactNode): ReactNode {\n if (typeof children === 'string' || typeof children === 'number') {\n return <RNText>{children}</RNText>;\n }\n return children;\n}\n\nconst GAP = 4; // visual gap between trigger and content\nconst MIN_WIDTH = 200;\n// Margin reserved on each side so the popover never butts against the\n// viewport edge. Matches the 8px safe-area we use for native modal pads.\nconst VIEWPORT_MARGIN = 8;\n\nfunction computePosition(\n rect: TriggerRect,\n side: PopoverSide,\n align: PopoverAlign,\n contentSize: { width: number; height: number } | null\n): { top: number; left: number } {\n const cw = contentSize?.width ?? MIN_WIDTH;\n const ch = contentSize?.height ?? 0;\n\n let top = 0;\n let left = 0;\n\n switch (side) {\n case 'top':\n top = rect.top - GAP - ch;\n break;\n case 'bottom':\n top = rect.top + rect.height + GAP;\n break;\n case 'left':\n left = rect.left - GAP - cw;\n break;\n case 'right':\n left = rect.left + rect.width + GAP;\n break;\n }\n\n if (side === 'top' || side === 'bottom') {\n switch (align) {\n case 'start':\n left = rect.left;\n break;\n case 'center':\n left = rect.left + rect.width / 2 - cw / 2;\n break;\n case 'end':\n left = rect.left + rect.width - cw;\n break;\n }\n } else {\n switch (align) {\n case 'start':\n top = rect.top;\n break;\n case 'center':\n top = rect.top + rect.height / 2 - ch / 2;\n break;\n case 'end':\n top = rect.top + rect.height - ch;\n break;\n }\n }\n\n return { top, left };\n}\n\nexport type PopoverContentProps = {\n /** Side of the trigger to anchor on. @defaultValue 'bottom' */\n side?: PopoverSide;\n /** Alignment along the trigger edge. @defaultValue 'center' */\n align?: PopoverAlign;\n children?: ReactNode;\n className?: string;\n testID?: string;\n /** Accessible label when no visible heading is present. */\n 'aria-label'?: string;\n};\n\n/**\n * The floating popover surface. Renders only while open. On web uses\n * `position: fixed` with a measured trigger rect so it escapes any\n * ancestor `overflow: hidden`. Non-modal: focus is NOT trapped inside —\n * the user can tab back out as normal.\n *\n * ARIA: `role=\"dialog\"` (without `aria-modal`) so assistive tech\n * announces it as a grouping but doesn't suppress the rest of the page.\n */\nexport const PopoverContent = ({\n side = 'bottom',\n align = 'center',\n children,\n className,\n testID,\n ...rest\n}: PopoverContentProps) => {\n const ctx = usePopoverContext('PopoverContent');\n const colors = useThemeColors();\n const ariaLabel = rest['aria-label'];\n\n // Measure content size after first paint so we can anchor `top`-style\n // popups (which need to know content height to render above the trigger).\n const [contentSize, setContentSize] = useState<{ width: number; height: number } | null>(null);\n\n // Web-only side effects: outside-click close, Escape close, re-measure\n // on resize. RN Modal handles its own dismissal on native (tap-outside\n // is the transparent overlay's onPress).\n useEffect(() => {\n if (!ctx.open) {\n return;\n }\n if (Platform.OS !== 'web') {\n return;\n }\n if (typeof document === 'undefined') {\n return;\n }\n\n ctx.measureTrigger();\n\n const onDocMouseDown = (event: MouseEvent) => {\n const target = event.target as Node;\n const trigger = ctx.triggerRef.current;\n const content = ctx.contentRef.current;\n if (trigger?.contains(target)) {\n return;\n }\n if (content?.contains(target)) {\n return;\n }\n ctx.setOpen(false);\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.preventDefault();\n ctx.setOpen(false);\n }\n };\n const onResize = () => ctx.measureTrigger();\n const onScroll = () => ctx.measureTrigger();\n\n document.addEventListener('mousedown', onDocMouseDown);\n document.addEventListener('keydown', onKeyDown);\n window.addEventListener('resize', onResize);\n window.addEventListener('scroll', onScroll, true);\n return () => {\n document.removeEventListener('mousedown', onDocMouseDown);\n document.removeEventListener('keydown', onKeyDown);\n window.removeEventListener('resize', onResize);\n window.removeEventListener('scroll', onScroll, true);\n };\n // ctx is the provider's stable identity; we only care about open transitions.\n }, [ctx.open, ctx.measureTrigger, ctx.setOpen, ctx.triggerRef, ctx.contentRef]);\n\n // Reset measured size when popover closes so reopening re-measures fresh.\n useEffect(() => {\n if (!ctx.open) {\n setContentSize(null);\n }\n }, [ctx.open]);\n\n if (!ctx.open) {\n return null;\n }\n\n const position = ctx.triggerRect ? computePosition(ctx.triggerRect, side, align, contentSize) : null;\n\n // Viewport-aware max width. Web uses Dimensions.get('window') which\n // react-native-web maps to window.innerWidth; native uses the same API\n // for the device window. Subtract margin on both sides so content\n // doesn't kiss the screen edge.\n const viewportWidth = Dimensions.get('window').width;\n const maxContentWidth = Math.max(MIN_WIDTH, viewportWidth - VIEWPORT_MARGIN * 2);\n\n const contentBaseStyle: ViewStyle = {\n minWidth: MIN_WIDTH,\n maxWidth: maxContentWidth,\n borderRadius: px(colors.radius.lg),\n borderWidth: 1,\n borderColor: colors.semantic.border.default,\n backgroundColor: colors.semantic.background.elevated,\n padding: px(colors.spacing['4']),\n ...(Platform.OS === 'web'\n ? ({\n boxShadow: '0 10px 15px -3px rgba(0,0,0,0.1), 0 4px 6px -4px rgba(0,0,0,0.1)',\n // Subtle scale-in. Skipped on native (do nothing fancy there).\n transition: 'opacity 120ms ease-out, transform 120ms ease-out',\n transform: 'scale(1)',\n opacity: 1,\n } as ViewStyle)\n : { elevation: 8 }),\n };\n\n // Clamp `left` so the popover stays within the viewport even when the\n // trigger sits near the right edge. First-paint fallback uses\n // `maxContentWidth` (the cap we apply via maxWidth above) — content\n // is allowed to grow up to that size, so assuming worst-case avoids\n // a one-frame overflow before measurement settles.\n const measuredWidth = contentSize?.width ?? maxContentWidth;\n const clampedLeft = position\n ? Math.min(\n Math.max(VIEWPORT_MARGIN, position.left),\n Math.max(VIEWPORT_MARGIN, viewportWidth - measuredWidth - VIEWPORT_MARGIN)\n )\n : 0;\n\n const positionedStyle: ViewStyle =\n Platform.OS === 'web'\n ? position\n ? ({\n position: 'fixed' as unknown as 'absolute',\n top: position.top,\n left: clampedLeft,\n zIndex: 50,\n } as ViewStyle)\n : ({\n // Trigger not yet measured — render off-screen for a\n // frame to avoid a flash at (0,0).\n position: 'fixed' as unknown as 'absolute',\n top: -9999,\n left: -9999,\n zIndex: 50,\n } as ViewStyle)\n : {};\n\n const content = (\n <View\n ref={(node) => {\n ctx.contentRef.current = node as unknown as HTMLDivElement | null;\n if (Platform.OS !== 'web') {\n return;\n }\n if (!node) {\n return;\n }\n if (typeof (node as unknown as HTMLDivElement).getBoundingClientRect !== 'function') {\n return;\n }\n const rect = (node as unknown as HTMLDivElement).getBoundingClientRect();\n if (!contentSize || contentSize.width !== rect.width || contentSize.height !== rect.height) {\n setContentSize({ width: rect.width, height: rect.height });\n }\n }}\n {...({\n role: 'dialog',\n id: ctx.contentId,\n ...(ariaLabel !== undefined ? { 'aria-label': ariaLabel, accessibilityLabel: ariaLabel } : {}),\n } as Record<string, unknown>)}\n {...(testID !== undefined ? { testID } : {})}\n className={cn(\n 'rounded-lg border border-semantic-border-default bg-semantic-background-elevated',\n className\n )}\n style={[contentBaseStyle, positionedStyle]}\n >\n {children}\n </View>\n );\n\n if (Platform.OS === 'web') {\n return content;\n }\n\n // Native: use Modal as the floating layer with a transparent backdrop.\n // Tap on the backdrop closes the popover.\n return (\n <Modal visible={ctx.open} transparent animationType=\"fade\" onRequestClose={() => ctx.setOpen(false)}>\n <Pressable\n accessibilityRole=\"none\"\n aria-hidden={true}\n onPress={() => ctx.setOpen(false)}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: 'transparent',\n }}\n >\n <Pressable\n onPress={(event) => event.stopPropagation?.()}\n style={{\n position: 'absolute',\n top: ctx.triggerRect\n ? side === 'top'\n ? Math.max(VIEWPORT_MARGIN, ctx.triggerRect.top - GAP - 80)\n : ctx.triggerRect.top + ctx.triggerRect.height + GAP\n : 80,\n // Clamp horizontally so a wide popover near the\n // right edge can still grow leftward without\n // overflowing the screen.\n left: ctx.triggerRect\n ? Math.min(\n Math.max(VIEWPORT_MARGIN, ctx.triggerRect.left),\n Math.max(VIEWPORT_MARGIN, viewportWidth - measuredWidth - VIEWPORT_MARGIN)\n )\n : VIEWPORT_MARGIN * 2,\n }}\n >\n {content}\n </Pressable>\n </Pressable>\n </Modal>\n );\n};\n\n/**\n * Public `Popover` value — the root function plus its `.Trigger` and `.Content`\n * static members. `Object.assign` produces a value whose inferred type carries\n * the static properties, so `.d.ts` consumers can write `<Popover.Trigger>`\n * without a separate import.\n */\nexport const Popover = Object.assign(PopoverRoot, {\n Trigger: PopoverTrigger,\n Content: PopoverContent,\n});\n"]}
1
+ {"version":3,"sources":["../src/components/Popover/Popover.tsx"],"names":["RNText","content"],"mappings":";;;;;;;;;AAoCA,IAAM,cAAA,GAAiB,cAA0C,IAAI,CAAA;AAErE,IAAM,iBAAA,2BAAqB,KAAA,KAAuC;AAC9D,EAAA,MAAM,GAAA,GAAM,WAAW,cAAc,CAAA;AACrC,EAAA,IAAI,CAAC,GAAA,EAAK;AACN,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,CAAA,EAAI,KAAK,CAAA,sCAAA,CAAwC,CAAA;AAAA,EACrE;AACA,EAAA,OAAO,GAAA;AACX,CAAA,EAN0B,mBAAA;AAgD1B,IAAM,WAAA,2BAAe,EAAE,IAAA,EAAM,cAAc,KAAA,EAAO,YAAA,EAAc,UAAS,KAAoB;AACzF,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAkB,WAAW,CAAA;AACvD,EAAA,MAAM,eAAe,IAAA,KAAS,MAAA;AAC9B,EAAA,MAAM,OAAA,GAAU,eAAe,IAAA,GAAO,KAAA;AAEtC,EAAA,MAAM,OAAA,GAAU,WAAA;AAAA,IACZ,CAAC,IAAA,KAAkB;AACf,MAAA,IAAI,CAAC,YAAA,EAAc;AACf,QAAA,QAAA,CAAS,IAAI,CAAA;AAAA,MACjB;AACA,MAAA,YAAA,GAAe,IAAI,CAAA;AAAA,IACvB,CAAA;AAAA,IACA,CAAC,cAAc,YAAY;AAAA,GAC/B;AAEA,EAAA,MAAM,SAAS,KAAA,EAAM;AACrB,EAAA,MAAM,UAAA,GAAa,OAA2B,IAAI,CAAA;AAClD,EAAA,MAAM,UAAA,GAAa,OAA8B,IAAI,CAAA;AAMrD,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAA6B,IAAI,CAAA;AACvE,EAAA,MAAM,cAAA,GAAiB,YAAY,MAAM;AACrC,IAAA,MAAM,OAAO,UAAA,CAAW,OAAA;AACxB,IAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,CAAK,0BAA0B,UAAA,EAAY;AAC3D,MAAA;AAAA,IACJ;AACA,IAAA,MAAM,IAAA,GAAO,KAAK,qBAAA,EAAsB;AACxC,IAAA,cAAA,CAAe,EAAE,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,IAAA,EAAM,IAAA,CAAK,IAAA,EAAM,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AAAA,EAC7F,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,QAAA,GAAgC;AAAA,IAClC,IAAA,EAAM,OAAA;AAAA,IACN,OAAA;AAAA,IACA,SAAA,EAAW,GAAG,MAAM,CAAA,QAAA,CAAA;AAAA,IACpB,UAAA;AAAA,IACA,UAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACJ;AAEA,EAAA,2BAAQ,cAAA,CAAe,QAAA,EAAf,EAAwB,KAAA,EAAO,UAAW,QAAA,EAAS,CAAA;AAC/D,CAAA,EA5CoB,aAAA,CAAA;AA6Db,IAAM,cAAA,2BAAkB,EAAE,OAAA,GAAU,MAAM,QAAA,EAAU,SAAA,EAAW,QAAO,KAA2B;AACpG,EAAA,MAAM,GAAA,GAAM,kBAAkB,gBAAgB,CAAA;AAC9C,EAAA,MAAM,OAAA,GAAU,YAAY,MAAM;AAC9B,IAAA,GAAA,CAAI,cAAA,EAAe;AACnB,IAAA,GAAA,CAAI,OAAA,CAAQ,CAAC,GAAA,CAAI,IAAI,CAAA;AAAA,EACzB,CAAA,EAAG,CAAC,GAAG,CAAC,CAAA;AAER,EAAA,IAAI,OAAA,IAAW,cAAA,CAAe,QAAQ,CAAA,EAAG;AACrC,IAAA,MAAM,KAAA,GAAQ,QAAA;AAKd,IAAA,MAAM,IAAA,mBAAO,MAAA,CAAA,CAAC,QAAA,KAAiD,CAAC,KAAA,KAAmB;AAC/E,MAAA,QAAA,GAAW,KAAK,CAAA;AAChB,MAAA,GAAA,CAAI,cAAA,EAAe;AACnB,MAAA,GAAA,CAAI,OAAA,CAAQ,CAAC,GAAA,CAAI,IAAI,CAAA;AAAA,IACzB,CAAA,EAJa,MAAA,CAAA;AAKb,IAAA,uBACI,GAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACG,GAAA,EAAK,CAAC,IAAA,KAA6B;AAC/B,UAAA,GAAA,CAAI,WAAW,OAAA,GAAU,IAAA;AAAA,QAC7B,CAAA;AAAA,QACA,OAAA,EAAS,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,OAA6C,CAAA;AAAA,QACvE,OAAA,EAAS,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,OAA6C,CAAA;AAAA,QACvE,eAAA,EAAc,QAAA;AAAA,QACd,iBAAe,GAAA,CAAI,IAAA;AAAA,QACnB,iBAAe,GAAA,CAAI,SAAA;AAAA,QAClB,GAAI,MAAA,KAAW,MAAA,GAAY,EAAE,aAAA,EAAe,MAAA,KAAW,EAAC;AAAA,QACxD,GAAI,SAAA,KAAc,MAAA,GAAY,EAAE,SAAA,KAAc,EAAC;AAAA,QAE/C,QAAA,EAAA;AAAA;AAAA,KACL;AAAA,EAER;AAEA,EAAA,uBACI,GAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACG,GAAA,EAAK,CAAC,IAAA,KAAS;AACX,QAAA,GAAA,CAAI,WAAW,OAAA,GAAU,IAAA;AAAA,MAC7B,CAAA;AAAA,MACA,OAAA;AAAA,MACC,GAAI;AAAA,QACD,eAAA,EAAiB,QAAA;AAAA,QACjB,iBAAiB,GAAA,CAAI,IAAA;AAAA,QACrB,iBAAiB,GAAA,CAAI;AAAA,OACzB;AAAA,MACC,GAAI,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,KAAW,EAAC;AAAA,MACzC,GAAI,SAAA,KAAc,MAAA,GAAY,EAAE,SAAA,KAAc,EAAC;AAAA,MAE/C,6BAAmB,QAAQ;AAAA;AAAA,GAChC;AAER,CAAA,EArD8B,gBAAA,CAAA;AA4D9B,SAAS,mBAAmB,QAAA,EAAgC;AACxD,EAAA,IAAI,OAAO,QAAA,KAAa,QAAA,IAAY,OAAO,aAAa,QAAA,EAAU;AAC9D,IAAA,uBAAO,GAAA,CAACA,QAAQ,QAAA,EAAS,CAAA;AAAA,EAC7B;AACA,EAAA,OAAO,QAAA;AACX;AALS,MAAA,CAAA,kBAAA,EAAA,oBAAA,CAAA;AAOT,IAAM,GAAA,GAAM,CAAA;AACZ,IAAM,SAAA,GAAY,GAAA;AAGlB,IAAM,eAAA,GAAkB,CAAA;AAExB,SAAS,eAAA,CACL,IAAA,EACA,IAAA,EACA,KAAA,EACA,WAAA,EAC6B;AAC7B,EAAA,MAAM,EAAA,GAAK,aAAa,KAAA,IAAS,SAAA;AACjC,EAAA,MAAM,EAAA,GAAK,aAAa,MAAA,IAAU,CAAA;AAElC,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,IAAI,IAAA,GAAO,CAAA;AAEX,EAAA,QAAQ,IAAA;AAAM,IACV,KAAK,KAAA;AACD,MAAA,GAAA,GAAM,IAAA,CAAK,MAAM,GAAA,GAAM,EAAA;AACvB,MAAA;AAAA,IACJ,KAAK,QAAA;AACD,MAAA,GAAA,GAAM,IAAA,CAAK,GAAA,GAAM,IAAA,CAAK,MAAA,GAAS,GAAA;AAC/B,MAAA;AAAA,IACJ,KAAK,MAAA;AACD,MAAA,IAAA,GAAO,IAAA,CAAK,OAAO,GAAA,GAAM,EAAA;AACzB,MAAA;AAAA,IACJ,KAAK,OAAA;AACD,MAAA,IAAA,GAAO,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,KAAA,GAAQ,GAAA;AAChC,MAAA;AAAA;AAGR,EAAA,IAAI,IAAA,KAAS,KAAA,IAAS,IAAA,KAAS,QAAA,EAAU;AACrC,IAAA,QAAQ,KAAA;AAAO,MACX,KAAK,OAAA;AACD,QAAA,IAAA,GAAO,IAAA,CAAK,IAAA;AACZ,QAAA;AAAA,MACJ,KAAK,QAAA;AACD,QAAA,IAAA,GAAO,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,KAAA,GAAQ,IAAI,EAAA,GAAK,CAAA;AACzC,QAAA;AAAA,MACJ,KAAK,KAAA;AACD,QAAA,IAAA,GAAO,IAAA,CAAK,IAAA,GAAO,IAAA,CAAK,KAAA,GAAQ,EAAA;AAChC,QAAA;AAAA;AACR,EACJ,CAAA,MAAO;AACH,IAAA,QAAQ,KAAA;AAAO,MACX,KAAK,OAAA;AACD,QAAA,GAAA,GAAM,IAAA,CAAK,GAAA;AACX,QAAA;AAAA,MACJ,KAAK,QAAA;AACD,QAAA,GAAA,GAAM,IAAA,CAAK,GAAA,GAAM,IAAA,CAAK,MAAA,GAAS,IAAI,EAAA,GAAK,CAAA;AACxC,QAAA;AAAA,MACJ,KAAK,KAAA;AACD,QAAA,GAAA,GAAM,IAAA,CAAK,GAAA,GAAM,IAAA,CAAK,MAAA,GAAS,EAAA;AAC/B,QAAA;AAAA;AACR,EACJ;AAEA,EAAA,OAAO,EAAE,KAAK,IAAA,EAAK;AACvB;AAtDS,MAAA,CAAA,eAAA,EAAA,iBAAA,CAAA;AA6EF,IAAM,iCAAiB,MAAA,CAAA,CAAC;AAAA,EAC3B,IAAA,GAAO,QAAA;AAAA,EACP,KAAA,GAAQ,QAAA;AAAA,EACR,QAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA,GAAG;AACP,CAAA,KAA2B;AACvB,EAAA,MAAM,GAAA,GAAM,kBAAkB,gBAAgB,CAAA;AAC9C,EAAA,MAAM,SAAS,cAAA,EAAe;AAC9B,EAAA,MAAM,SAAA,GAAY,KAAK,YAAY,CAAA;AAInC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAmD,IAAI,CAAA;AAK7F,EAAA,SAAA,CAAU,MAAM;AACZ,IAAA,IAAI,CAAC,IAAI,IAAA,EAAM;AACX,MAAA;AAAA,IACJ;AACA,IAAA,IAAI,QAAA,CAAS,OAAO,KAAA,EAAO;AACvB,MAAA;AAAA,IACJ;AACA,IAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACjC,MAAA;AAAA,IACJ;AAEA,IAAA,GAAA,CAAI,cAAA,EAAe;AAEnB,IAAA,MAAM,cAAA,2BAAkB,KAAA,KAAsB;AAC1C,MAAA,MAAM,SAAS,KAAA,CAAM,MAAA;AACrB,MAAA,MAAM,OAAA,GAAU,IAAI,UAAA,CAAW,OAAA;AAC/B,MAAA,MAAMC,QAAAA,GAAU,IAAI,UAAA,CAAW,OAAA;AAC/B,MAAA,IAAI,OAAA,EAAS,QAAA,CAAS,MAAM,CAAA,EAAG;AAC3B,QAAA;AAAA,MACJ;AACA,MAAA,IAAIA,QAAAA,EAAS,QAAA,CAAS,MAAM,CAAA,EAAG;AAC3B,QAAA;AAAA,MACJ;AACA,MAAA,GAAA,CAAI,QAAQ,KAAK,CAAA;AAAA,IACrB,CAAA,EAXuB,gBAAA,CAAA;AAYvB,IAAA,MAAM,SAAA,2BAAa,KAAA,KAAyB;AACxC,MAAA,IAAI,KAAA,CAAM,QAAQ,QAAA,EAAU;AACxB,QAAA,KAAA,CAAM,cAAA,EAAe;AACrB,QAAA,GAAA,CAAI,QAAQ,KAAK,CAAA;AAAA,MACrB;AAAA,IACJ,CAAA,EALkB,WAAA,CAAA;AAMlB,IAAA,MAAM,QAAA,mBAAW,MAAA,CAAA,MAAM,GAAA,CAAI,cAAA,EAAe,EAAzB,UAAA,CAAA;AACjB,IAAA,MAAM,QAAA,mBAAW,MAAA,CAAA,MAAM,GAAA,CAAI,cAAA,EAAe,EAAzB,UAAA,CAAA;AAEjB,IAAA,QAAA,CAAS,gBAAA,CAAiB,aAAa,cAAc,CAAA;AACrD,IAAA,QAAA,CAAS,gBAAA,CAAiB,WAAW,SAAS,CAAA;AAC9C,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,QAAQ,CAAA;AAC1C,IAAA,MAAA,CAAO,gBAAA,CAAiB,QAAA,EAAU,QAAA,EAAU,IAAI,CAAA;AAChD,IAAA,OAAO,MAAM;AACT,MAAA,QAAA,CAAS,mBAAA,CAAoB,aAAa,cAAc,CAAA;AACxD,MAAA,QAAA,CAAS,mBAAA,CAAoB,WAAW,SAAS,CAAA;AACjD,MAAA,MAAA,CAAO,mBAAA,CAAoB,UAAU,QAAQ,CAAA;AAC7C,MAAA,MAAA,CAAO,mBAAA,CAAoB,QAAA,EAAU,QAAA,EAAU,IAAI,CAAA;AAAA,IACvD,CAAA;AAAA,EAEJ,CAAA,EAAG,CAAC,GAAA,CAAI,IAAA,EAAM,GAAA,CAAI,cAAA,EAAgB,GAAA,CAAI,OAAA,EAAS,GAAA,CAAI,UAAA,EAAY,GAAA,CAAI,UAAU,CAAC,CAAA;AAG9E,EAAA,SAAA,CAAU,MAAM;AACZ,IAAA,IAAI,CAAC,IAAI,IAAA,EAAM;AACX,MAAA,cAAA,CAAe,IAAI,CAAA;AAAA,IACvB;AAAA,EACJ,CAAA,EAAG,CAAC,GAAA,CAAI,IAAI,CAAC,CAAA;AAEb,EAAA,IAAI,CAAC,IAAI,IAAA,EAAM;AACX,IAAA,OAAO,IAAA;AAAA,EACX;AAEA,EAAA,MAAM,QAAA,GAAW,IAAI,WAAA,GAAc,eAAA,CAAgB,IAAI,WAAA,EAAa,IAAA,EAAM,KAAA,EAAO,WAAW,CAAA,GAAI,IAAA;AAMhG,EAAA,MAAM,aAAA,GAAgB,UAAA,CAAW,GAAA,CAAI,QAAQ,CAAA,CAAE,KAAA;AAC/C,EAAA,MAAM,kBAAkB,IAAA,CAAK,GAAA,CAAI,SAAA,EAAW,aAAA,GAAgB,kBAAkB,CAAC,CAAA;AAE/E,EAAA,MAAM,gBAAA,GAA8B;AAAA,IAChC,QAAA,EAAU,SAAA;AAAA,IACV,QAAA,EAAU,eAAA;AAAA,IACV,YAAA,EAAc,EAAA,CAAG,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA;AAAA,IACjC,WAAA,EAAa,CAAA;AAAA,IACb,WAAA,EAAa,MAAA,CAAO,QAAA,CAAS,MAAA,CAAO,OAAA;AAAA,IACpC,eAAA,EAAiB,MAAA,CAAO,QAAA,CAAS,UAAA,CAAW,QAAA;AAAA,IAC5C,OAAA,EAAS,EAAA,CAAG,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA,IAC/B,GAAI,QAAA,CAAS,EAAA,KAAO,KAAA,GACb;AAAA,MACG,SAAA,EAAW,kEAAA;AAAA;AAAA,MAEX,UAAA,EAAY,kDAAA;AAAA,MACZ,SAAA,EAAW,UAAA;AAAA,MACX,OAAA,EAAS;AAAA,KACb,GACA,EAAE,SAAA,EAAW,CAAA;AAAE,GACzB;AAOA,EAAA,MAAM,aAAA,GAAgB,aAAa,KAAA,IAAS,eAAA;AAC5C,EAAA,MAAM,WAAA,GAAc,WACd,IAAA,CAAK,GAAA;AAAA,IACD,IAAA,CAAK,GAAA,CAAI,eAAA,EAAiB,QAAA,CAAS,IAAI,CAAA;AAAA,IACvC,IAAA,CAAK,GAAA,CAAI,eAAA,EAAiB,aAAA,GAAgB,gBAAgB,eAAe;AAAA,GAC7E,GACA,CAAA;AAEN,EAAA,MAAM,eAAA,GACF,QAAA,CAAS,EAAA,KAAO,KAAA,GACV,QAAA,GACK;AAAA,IACG,QAAA,EAAU,OAAA;AAAA,IACV,KAAK,QAAA,CAAS,GAAA;AAAA,IACd,IAAA,EAAM,WAAA;AAAA,IACN,MAAA,EAAQ;AAAA,GACZ,GACC;AAAA;AAAA;AAAA,IAGG,QAAA,EAAU,OAAA;AAAA,IACV,GAAA,EAAK,KAAA;AAAA,IACL,IAAA,EAAM,KAAA;AAAA,IACN,MAAA,EAAQ;AAAA,MAEhB,EAAC;AAEX,EAAA,MAAM,OAAA,mBACF,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACG,GAAA,EAAK,CAAC,IAAA,KAAS;AACX,QAAA,GAAA,CAAI,WAAW,OAAA,GAAU,IAAA;AACzB,QAAA,IAAI,QAAA,CAAS,OAAO,KAAA,EAAO;AACvB,UAAA;AAAA,QACJ;AACA,QAAA,IAAI,CAAC,IAAA,EAAM;AACP,UAAA;AAAA,QACJ;AACA,QAAA,IAAI,OAAQ,IAAA,CAAmC,qBAAA,KAA0B,UAAA,EAAY;AACjF,UAAA;AAAA,QACJ;AACA,QAAA,MAAM,IAAA,GAAQ,KAAmC,qBAAA,EAAsB;AACvE,QAAA,IAAI,CAAC,eAAe,WAAA,CAAY,KAAA,KAAU,KAAK,KAAA,IAAS,WAAA,CAAY,MAAA,KAAW,IAAA,CAAK,MAAA,EAAQ;AACxF,UAAA,cAAA,CAAe,EAAE,KAAA,EAAO,IAAA,CAAK,OAAO,MAAA,EAAQ,IAAA,CAAK,QAAQ,CAAA;AAAA,QAC7D;AAAA,MACJ,CAAA;AAAA,MACC,GAAI;AAAA,QACD,IAAA,EAAM,QAAA;AAAA,QACN,IAAI,GAAA,CAAI,SAAA;AAAA,QACR,GAAI,cAAc,MAAA,GAAY,EAAE,cAAc,SAAA,EAAW,kBAAA,EAAoB,SAAA,EAAU,GAAI;AAAC,OAChG;AAAA,MACC,GAAI,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,KAAW,EAAC;AAAA,MAC1C,SAAA,EAAW,EAAA;AAAA,QACP,kFAAA;AAAA,QACA;AAAA,OACJ;AAAA,MACA,KAAA,EAAO,CAAC,gBAAA,EAAkB,eAAe,CAAA;AAAA,MAExC;AAAA;AAAA,GACL;AAGJ,EAAA,IAAI,QAAA,CAAS,OAAO,KAAA,EAAO;AACvB,IAAA,OAAO,OAAA;AAAA,EACX;AAIA,EAAA,uBACI,GAAA,CAAC,KAAA,EAAA,EAAM,OAAA,EAAS,GAAA,CAAI,MAAM,WAAA,EAAW,IAAA,EAAC,aAAA,EAAc,MAAA,EAAO,cAAA,EAAgB,MAAM,GAAA,CAAI,OAAA,CAAQ,KAAK,CAAA,EAC9F,QAAA,kBAAA,GAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACG,iBAAA,EAAkB,MAAA;AAAA,MAClB,aAAA,EAAa,IAAA;AAAA,MACb,OAAA,EAAS,MAAM,GAAA,CAAI,OAAA,CAAQ,KAAK,CAAA;AAAA,MAChC,KAAA,EAAO;AAAA,QACH,QAAA,EAAU,UAAA;AAAA,QACV,GAAA,EAAK,CAAA;AAAA,QACL,IAAA,EAAM,CAAA;AAAA,QACN,KAAA,EAAO,CAAA;AAAA,QACP,MAAA,EAAQ,CAAA;AAAA,QACR,eAAA,EAAiB;AAAA,OACrB;AAAA,MAEA,QAAA,kBAAA,GAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACG,OAAA,EAAS,CAAC,KAAA,KAAU,KAAA,CAAM,eAAA,IAAkB;AAAA,UAC5C,KAAA,EAAO;AAAA,YACH,QAAA,EAAU,UAAA;AAAA,YACV,GAAA,EAAK,IAAI,WAAA,GACH,IAAA,KAAS,QACL,IAAA,CAAK,GAAA,CAAI,iBAAiB,GAAA,CAAI,WAAA,CAAY,MAAM,GAAA,GAAM,EAAE,IACxD,GAAA,CAAI,WAAA,CAAY,MAAM,GAAA,CAAI,WAAA,CAAY,SAAS,GAAA,GACnD,EAAA;AAAA;AAAA;AAAA;AAAA,YAIN,IAAA,EAAM,GAAA,CAAI,WAAA,GACJ,IAAA,CAAK,GAAA;AAAA,cACD,IAAA,CAAK,GAAA,CAAI,eAAA,EAAiB,GAAA,CAAI,YAAY,IAAI,CAAA;AAAA,cAC9C,IAAA,CAAK,GAAA,CAAI,eAAA,EAAiB,aAAA,GAAgB,gBAAgB,eAAe;AAAA,gBAE7E,eAAA,GAAkB;AAAA,WAC5B;AAAA,UAEC,QAAA,EAAA;AAAA;AAAA;AACL;AAAA,GACJ,EACJ,CAAA;AAER,CAAA,EAzN8B,gBAAA,CAAA;AAiOvB,IAAM,OAAA,GAAU,MAAA,CAAO,MAAA,CAAO,WAAA,EAAa;AAAA,EAC9C,OAAA,EAAS,cAAA;AAAA,EACT,OAAA,EAAS;AACb,CAAC","file":"chunk-HXCETKCC.js","sourcesContent":["'use client';\n\nimport {\n createContext,\n isValidElement,\n type ReactElement,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useId,\n useRef,\n useState,\n} from 'react';\nimport type { ViewStyle } from 'react-native';\nimport { Dimensions, Modal, Platform, Pressable, Text as RNText, View } from 'react-native';\nimport { Slot } from '../../slot';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\n\nexport type PopoverSide = 'top' | 'right' | 'bottom' | 'left';\nexport type PopoverAlign = 'start' | 'center' | 'end';\n\ntype TriggerRect = { top: number; left: number; width: number; height: number };\n\ntype PopoverContextValue = {\n open: boolean;\n setOpen: (next: boolean) => void;\n contentId: string;\n triggerRef: { current: HTMLElement | null };\n contentRef: { current: HTMLDivElement | null };\n triggerRect: TriggerRect | null;\n measureTrigger: () => void;\n};\n\nconst PopoverContext = createContext<PopoverContextValue | null>(null);\n\nconst usePopoverContext = (label: string): PopoverContextValue => {\n const ctx = useContext(PopoverContext);\n if (!ctx) {\n throw new Error(`<${label}> must be rendered inside a <Popover>.`);\n }\n return ctx;\n};\n\n/**\n * @internal — exposes the Popover context so higher-level overlay components\n * (DropdownMenu, ContextMenu) can interact with trigger measurement and open\n * state without going through PopoverTrigger.\n */\nexport { usePopoverContext };\n\nexport type PopoverProps = {\n /** Controlled open state. */\n open?: boolean;\n /** Uncontrolled initial open state. @defaultValue false */\n defaultOpen?: boolean;\n /** Fires with the new open state. */\n onOpenChange?: (open: boolean) => void;\n children?: ReactNode;\n};\n\n/**\n * Non-modal floating panel anchored to a trigger element. Use for help\n * tooltips with rich content, color pickers, or profile previews.\n *\n * Composition: `Popover` (root, owns open state), `PopoverTrigger`\n * (forwards events to its child via Slot when `asChild`), `PopoverContent`\n * (the floating surface).\n *\n * Differences from `Dialog`: non-modal — does NOT trap focus or lock\n * scroll. Tab moves outside as normal. Differences from `Tooltip`: can\n * contain interactive content (buttons, inputs, links) and dismisses on\n * outside-click + Escape rather than mouse-leave.\n *\n * Behavior:\n * - Trigger click toggles open/close.\n * - Click outside the content (and outside the trigger) closes.\n * - Escape closes.\n *\n * Cross-platform: uses RN `<Modal>` as the visibility/portal primitive on\n * native (transparent backdrop, tap-outside-to-close). On web, the content\n * uses `position: fixed` + a measured trigger rect so it escapes any\n * ancestor `overflow: hidden`.\n */\nconst PopoverRoot = ({ open, defaultOpen = false, onOpenChange, children }: PopoverProps) => {\n const [inner, setInner] = useState<boolean>(defaultOpen);\n const isControlled = open !== undefined;\n const current = isControlled ? open : inner;\n\n const setOpen = useCallback(\n (next: boolean) => {\n if (!isControlled) {\n setInner(next);\n }\n onOpenChange?.(next);\n },\n [isControlled, onOpenChange]\n );\n\n const baseId = useId();\n const triggerRef = useRef<HTMLElement | null>(null);\n const contentRef = useRef<HTMLDivElement | null>(null);\n\n // Measure the trigger so the content can render with `position: fixed` +\n // computed coords. position:fixed escapes any ancestor's overflow:hidden\n // (e.g. fumadocs Tabs panes, our Preview frame), which is the single\n // biggest source of \"the popup got cut off\" bugs.\n const [triggerRect, setTriggerRect] = useState<TriggerRect | null>(null);\n const measureTrigger = useCallback(() => {\n const node = triggerRef.current;\n if (!node || typeof node.getBoundingClientRect !== 'function') {\n return;\n }\n const rect = node.getBoundingClientRect();\n setTriggerRect({ top: rect.top, left: rect.left, width: rect.width, height: rect.height });\n }, []);\n\n const ctxValue: PopoverContextValue = {\n open: current,\n setOpen,\n contentId: `${baseId}-content`,\n triggerRef,\n contentRef,\n triggerRect,\n measureTrigger,\n };\n\n return <PopoverContext.Provider value={ctxValue}>{children}</PopoverContext.Provider>;\n};\n\nexport type PopoverTriggerProps = {\n /** Render the child as the trigger (Slot pattern). Default true — pass `false` for an inline pressable. */\n asChild?: boolean;\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/**\n * Element that toggles the popover. Uses `asChild` by default so any\n * element (Button, Link, custom Pressable) becomes the trigger.\n *\n * The trigger element gets `aria-haspopup=\"dialog\"` and `aria-expanded`\n * so assistive tech announces the relationship.\n */\nexport const PopoverTrigger = ({ asChild = true, children, className, testID }: PopoverTriggerProps) => {\n const ctx = usePopoverContext('PopoverTrigger');\n const onPress = useCallback(() => {\n ctx.measureTrigger();\n ctx.setOpen(!ctx.open);\n }, [ctx]);\n\n if (asChild && isValidElement(children)) {\n const child = children as ReactElement<Record<string, unknown>>;\n // Pass both onClick (web HTML buttons) AND onPress (RN Pressable /\n // our own Button) so the trigger fires regardless of which event\n // model the wrapped child speaks. The child's existing handler\n // runs first, then we toggle.\n const fire = (existing: ((e: unknown) => void) | undefined) => (event: unknown) => {\n existing?.(event);\n ctx.measureTrigger();\n ctx.setOpen(!ctx.open);\n };\n return (\n <Slot\n ref={(node: HTMLElement | null) => {\n ctx.triggerRef.current = node;\n }}\n onClick={fire(child.props.onClick as ((e: unknown) => void) | undefined)}\n onPress={fire(child.props.onPress as ((e: unknown) => void) | undefined)}\n aria-haspopup=\"dialog\"\n aria-expanded={ctx.open}\n aria-controls={ctx.contentId}\n {...(testID !== undefined ? { 'data-testid': testID } : {})}\n {...(className !== undefined ? { className } : {})}\n >\n {child}\n </Slot>\n );\n }\n\n return (\n <Pressable\n ref={(node) => {\n ctx.triggerRef.current = node as unknown as HTMLElement | null;\n }}\n onPress={onPress}\n {...({\n 'aria-haspopup': 'dialog',\n 'aria-expanded': ctx.open,\n 'aria-controls': ctx.contentId,\n } as Record<string, unknown>)}\n {...(testID !== undefined ? { testID } : {})}\n {...(className !== undefined ? { className } : {})}\n >\n {wrapStringChildren(children)}\n </Pressable>\n );\n};\n\n// On native, raw strings rendered as children of a non-Text component\n// throw \"Text strings must be rendered within a <Text> component\". On\n// web, react-native-web silently tolerates it. Wrap any string/number\n// children in an RNText so the same JSX renders cleanly on both\n// platforms. Non-string children are passed through unchanged.\nfunction wrapStringChildren(children: ReactNode): ReactNode {\n if (typeof children === 'string' || typeof children === 'number') {\n return <RNText>{children}</RNText>;\n }\n return children;\n}\n\nconst GAP = 4; // visual gap between trigger and content\nconst MIN_WIDTH = 200;\n// Margin reserved on each side so the popover never butts against the\n// viewport edge. Matches the 8px safe-area we use for native modal pads.\nconst VIEWPORT_MARGIN = 8;\n\nfunction computePosition(\n rect: TriggerRect,\n side: PopoverSide,\n align: PopoverAlign,\n contentSize: { width: number; height: number } | null\n): { top: number; left: number } {\n const cw = contentSize?.width ?? MIN_WIDTH;\n const ch = contentSize?.height ?? 0;\n\n let top = 0;\n let left = 0;\n\n switch (side) {\n case 'top':\n top = rect.top - GAP - ch;\n break;\n case 'bottom':\n top = rect.top + rect.height + GAP;\n break;\n case 'left':\n left = rect.left - GAP - cw;\n break;\n case 'right':\n left = rect.left + rect.width + GAP;\n break;\n }\n\n if (side === 'top' || side === 'bottom') {\n switch (align) {\n case 'start':\n left = rect.left;\n break;\n case 'center':\n left = rect.left + rect.width / 2 - cw / 2;\n break;\n case 'end':\n left = rect.left + rect.width - cw;\n break;\n }\n } else {\n switch (align) {\n case 'start':\n top = rect.top;\n break;\n case 'center':\n top = rect.top + rect.height / 2 - ch / 2;\n break;\n case 'end':\n top = rect.top + rect.height - ch;\n break;\n }\n }\n\n return { top, left };\n}\n\nexport type PopoverContentProps = {\n /** Side of the trigger to anchor on. @defaultValue 'bottom' */\n side?: PopoverSide;\n /** Alignment along the trigger edge. @defaultValue 'center' */\n align?: PopoverAlign;\n children?: ReactNode;\n className?: string;\n testID?: string;\n /** Accessible label when no visible heading is present. */\n 'aria-label'?: string;\n};\n\n/**\n * The floating popover surface. Renders only while open. On web uses\n * `position: fixed` with a measured trigger rect so it escapes any\n * ancestor `overflow: hidden`. Non-modal: focus is NOT trapped inside —\n * the user can tab back out as normal.\n *\n * ARIA: `role=\"dialog\"` (without `aria-modal`) so assistive tech\n * announces it as a grouping but doesn't suppress the rest of the page.\n */\nexport const PopoverContent = ({\n side = 'bottom',\n align = 'center',\n children,\n className,\n testID,\n ...rest\n}: PopoverContentProps) => {\n const ctx = usePopoverContext('PopoverContent');\n const colors = useThemeColors();\n const ariaLabel = rest['aria-label'];\n\n // Measure content size after first paint so we can anchor `top`-style\n // popups (which need to know content height to render above the trigger).\n const [contentSize, setContentSize] = useState<{ width: number; height: number } | null>(null);\n\n // Web-only side effects: outside-click close, Escape close, re-measure\n // on resize. RN Modal handles its own dismissal on native (tap-outside\n // is the transparent overlay's onPress).\n useEffect(() => {\n if (!ctx.open) {\n return;\n }\n if (Platform.OS !== 'web') {\n return;\n }\n if (typeof document === 'undefined') {\n return;\n }\n\n ctx.measureTrigger();\n\n const onDocMouseDown = (event: MouseEvent) => {\n const target = event.target as Node;\n const trigger = ctx.triggerRef.current;\n const content = ctx.contentRef.current;\n if (trigger?.contains(target)) {\n return;\n }\n if (content?.contains(target)) {\n return;\n }\n ctx.setOpen(false);\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.preventDefault();\n ctx.setOpen(false);\n }\n };\n const onResize = () => ctx.measureTrigger();\n const onScroll = () => ctx.measureTrigger();\n\n document.addEventListener('mousedown', onDocMouseDown);\n document.addEventListener('keydown', onKeyDown);\n window.addEventListener('resize', onResize);\n window.addEventListener('scroll', onScroll, true);\n return () => {\n document.removeEventListener('mousedown', onDocMouseDown);\n document.removeEventListener('keydown', onKeyDown);\n window.removeEventListener('resize', onResize);\n window.removeEventListener('scroll', onScroll, true);\n };\n // ctx is the provider's stable identity; we only care about open transitions.\n }, [ctx.open, ctx.measureTrigger, ctx.setOpen, ctx.triggerRef, ctx.contentRef]);\n\n // Reset measured size when popover closes so reopening re-measures fresh.\n useEffect(() => {\n if (!ctx.open) {\n setContentSize(null);\n }\n }, [ctx.open]);\n\n if (!ctx.open) {\n return null;\n }\n\n const position = ctx.triggerRect ? computePosition(ctx.triggerRect, side, align, contentSize) : null;\n\n // Viewport-aware max width. Web uses Dimensions.get('window') which\n // react-native-web maps to window.innerWidth; native uses the same API\n // for the device window. Subtract margin on both sides so content\n // doesn't kiss the screen edge.\n const viewportWidth = Dimensions.get('window').width;\n const maxContentWidth = Math.max(MIN_WIDTH, viewportWidth - VIEWPORT_MARGIN * 2);\n\n const contentBaseStyle: ViewStyle = {\n minWidth: MIN_WIDTH,\n maxWidth: maxContentWidth,\n borderRadius: px(colors.radius.lg),\n borderWidth: 1,\n borderColor: colors.semantic.border.default,\n backgroundColor: colors.semantic.background.elevated,\n padding: px(colors.spacing['4']),\n ...(Platform.OS === 'web'\n ? ({\n boxShadow: '0 10px 15px -3px rgba(0,0,0,0.1), 0 4px 6px -4px rgba(0,0,0,0.1)',\n // Subtle scale-in. Skipped on native (do nothing fancy there).\n transition: 'opacity 120ms ease-out, transform 120ms ease-out',\n transform: 'scale(1)',\n opacity: 1,\n } as ViewStyle)\n : { elevation: 8 }),\n };\n\n // Clamp `left` so the popover stays within the viewport even when the\n // trigger sits near the right edge. First-paint fallback uses\n // `maxContentWidth` (the cap we apply via maxWidth above) — content\n // is allowed to grow up to that size, so assuming worst-case avoids\n // a one-frame overflow before measurement settles.\n const measuredWidth = contentSize?.width ?? maxContentWidth;\n const clampedLeft = position\n ? Math.min(\n Math.max(VIEWPORT_MARGIN, position.left),\n Math.max(VIEWPORT_MARGIN, viewportWidth - measuredWidth - VIEWPORT_MARGIN)\n )\n : 0;\n\n const positionedStyle: ViewStyle =\n Platform.OS === 'web'\n ? position\n ? ({\n position: 'fixed' as unknown as 'absolute',\n top: position.top,\n left: clampedLeft,\n zIndex: 50,\n } as ViewStyle)\n : ({\n // Trigger not yet measured — render off-screen for a\n // frame to avoid a flash at (0,0).\n position: 'fixed' as unknown as 'absolute',\n top: -9999,\n left: -9999,\n zIndex: 50,\n } as ViewStyle)\n : {};\n\n const content = (\n <View\n ref={(node) => {\n ctx.contentRef.current = node as unknown as HTMLDivElement | null;\n if (Platform.OS !== 'web') {\n return;\n }\n if (!node) {\n return;\n }\n if (typeof (node as unknown as HTMLDivElement).getBoundingClientRect !== 'function') {\n return;\n }\n const rect = (node as unknown as HTMLDivElement).getBoundingClientRect();\n if (!contentSize || contentSize.width !== rect.width || contentSize.height !== rect.height) {\n setContentSize({ width: rect.width, height: rect.height });\n }\n }}\n {...({\n role: 'dialog',\n id: ctx.contentId,\n ...(ariaLabel !== undefined ? { 'aria-label': ariaLabel, accessibilityLabel: ariaLabel } : {}),\n } as Record<string, unknown>)}\n {...(testID !== undefined ? { testID } : {})}\n className={cn(\n 'rounded-lg border border-semantic-border-default bg-semantic-background-elevated',\n className\n )}\n style={[contentBaseStyle, positionedStyle]}\n >\n {children}\n </View>\n );\n\n if (Platform.OS === 'web') {\n return content;\n }\n\n // Native: use Modal as the floating layer with a transparent backdrop.\n // Tap on the backdrop closes the popover.\n return (\n <Modal visible={ctx.open} transparent animationType=\"fade\" onRequestClose={() => ctx.setOpen(false)}>\n <Pressable\n accessibilityRole=\"none\"\n aria-hidden={true}\n onPress={() => ctx.setOpen(false)}\n style={{\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: 'transparent',\n }}\n >\n <Pressable\n onPress={(event) => event.stopPropagation?.()}\n style={{\n position: 'absolute',\n top: ctx.triggerRect\n ? side === 'top'\n ? Math.max(VIEWPORT_MARGIN, ctx.triggerRect.top - GAP - 80)\n : ctx.triggerRect.top + ctx.triggerRect.height + GAP\n : 80,\n // Clamp horizontally so a wide popover near the\n // right edge can still grow leftward without\n // overflowing the screen.\n left: ctx.triggerRect\n ? Math.min(\n Math.max(VIEWPORT_MARGIN, ctx.triggerRect.left),\n Math.max(VIEWPORT_MARGIN, viewportWidth - measuredWidth - VIEWPORT_MARGIN)\n )\n : VIEWPORT_MARGIN * 2,\n }}\n >\n {content}\n </Pressable>\n </Pressable>\n </Modal>\n );\n};\n\n/**\n * Public `Popover` value — the root function plus its `.Trigger` and `.Content`\n * static members. `Object.assign` produces a value whose inferred type carries\n * the static properties, so `.d.ts` consumers can write `<Popover.Trigger>`\n * without a separate import.\n */\nexport const Popover = Object.assign(PopoverRoot, {\n Trigger: PopoverTrigger,\n Content: PopoverContent,\n});\n"]}
@@ -0,0 +1,71 @@
1
+ import { px } from './chunk-5A2QOOVN.js';
2
+ import { useThemeColors, useColorScheme } from './chunk-R5JMDDCB.js';
3
+ import { cn } from './chunk-CHXHRJNZ.js';
4
+ import { __name } from './chunk-WCQVDF3K.js';
5
+ import { Platform, View, Text } from 'react-native';
6
+ import { jsx } from 'nativewind/jsx-runtime';
7
+
8
+ var Kbd = /* @__PURE__ */ __name(({ children, className }) => {
9
+ const colors = useThemeColors();
10
+ const isDark = useColorScheme() === "dark";
11
+ const bgColor = isDark ? colors.color.neutral["800"] : colors.color.neutral["100"];
12
+ const borderColor = isDark ? colors.color.neutral["600"] : colors.color.neutral["300"];
13
+ const textColor = isDark ? colors.color.neutral["200"] : colors.color.neutral["700"];
14
+ const containerStyle = {
15
+ display: "flex",
16
+ flexDirection: "row",
17
+ alignItems: "center",
18
+ justifyContent: "center",
19
+ alignSelf: "center",
20
+ backgroundColor: bgColor,
21
+ borderWidth: 1,
22
+ borderColor,
23
+ borderRadius: px(colors.radius.sm),
24
+ paddingHorizontal: px(colors.spacing["1"]),
25
+ paddingVertical: 2,
26
+ // Subtle bottom shadow gives the classic key look.
27
+ ...Platform.OS === "web" ? {
28
+ boxShadow: `0 1px 0 ${borderColor}`,
29
+ display: "inline-flex"
30
+ } : {}
31
+ };
32
+ const textStyle = {
33
+ color: textColor,
34
+ // Monospace font for key labels.
35
+ fontFamily: colors.fontFamily.mono ?? "monospace",
36
+ fontSize: px(colors.fontSize.xs),
37
+ fontWeight: colors.fontWeight.medium,
38
+ lineHeight: px(colors.fontSize.xs) * Number(colors.lineHeight.normal)
39
+ };
40
+ const extraWebProps = Platform.OS === "web" ? {
41
+ // rn-web: 'none' skips the role attribute so the outer
42
+ // View is just a plain <div>; we rely on the inner
43
+ // <span> with data-kbd for semantic annotation.
44
+ accessibilityRole: "none"
45
+ } : {};
46
+ return /* @__PURE__ */ jsx(
47
+ View,
48
+ {
49
+ ...extraWebProps,
50
+ className: cn(
51
+ "inline-flex flex-row items-center rounded-sm border px-1 py-0.5",
52
+ isDark ? "bg-neutral-800 border-neutral-600 text-neutral-200" : "bg-neutral-100 border-neutral-300 text-neutral-700",
53
+ className
54
+ ),
55
+ style: containerStyle,
56
+ children: /* @__PURE__ */ jsx(
57
+ Text,
58
+ {
59
+ ...Platform.OS === "web" ? { "data-kbd": "" } : {},
60
+ accessibilityRole: "none",
61
+ style: textStyle,
62
+ children
63
+ }
64
+ )
65
+ }
66
+ );
67
+ }, "Kbd");
68
+
69
+ export { Kbd };
70
+ //# sourceMappingURL=chunk-IGBXSBF7.js.map
71
+ //# sourceMappingURL=chunk-IGBXSBF7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Kbd/Kbd.tsx"],"names":["RNText"],"mappings":";;;;;;;AA2BO,IAAM,GAAA,mBAAM,MAAA,CAAA,CAAC,EAAE,QAAA,EAAU,WAAU,KAAgB;AACtD,EAAA,MAAM,SAAS,cAAA,EAAe;AAC9B,EAAA,MAAM,MAAA,GAAS,gBAAe,KAAM,MAAA;AAEpC,EAAA,MAAM,OAAA,GAAU,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA;AACjF,EAAA,MAAM,WAAA,GAAc,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA;AACrF,EAAA,MAAM,SAAA,GAAY,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA;AAEnF,EAAA,MAAM,cAAA,GAA4B;AAAA,IAC9B,OAAA,EAAS,MAAA;AAAA,IACT,aAAA,EAAe,KAAA;AAAA,IACf,UAAA,EAAY,QAAA;AAAA,IACZ,cAAA,EAAgB,QAAA;AAAA,IAChB,SAAA,EAAW,QAAA;AAAA,IACX,eAAA,EAAiB,OAAA;AAAA,IACjB,WAAA,EAAa,CAAA;AAAA,IACb,WAAA;AAAA,IACA,YAAA,EAAc,EAAA,CAAG,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA;AAAA,IACjC,iBAAA,EAAmB,EAAA,CAAG,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA,IACzC,eAAA,EAAiB,CAAA;AAAA;AAAA,IAEjB,GAAI,QAAA,CAAS,EAAA,KAAO,KAAA,GACb;AAAA,MACG,SAAA,EAAW,WAAW,WAAW,CAAA,CAAA;AAAA,MACjC,OAAA,EAAS;AAAA,QAEb;AAAC,GACX;AAEA,EAAA,MAAM,SAAA,GAAuB;AAAA,IACzB,KAAA,EAAO,SAAA;AAAA;AAAA,IAEP,UAAA,EAAY,MAAA,CAAO,UAAA,CAAW,IAAA,IAAQ,WAAA;AAAA,IACtC,QAAA,EAAU,EAAA,CAAG,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AAAA,IAC/B,UAAA,EAAY,OAAO,UAAA,CAAW,MAAA;AAAA,IAC9B,UAAA,EAAY,GAAG,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA,GAAI,MAAA,CAAO,MAAA,CAAO,UAAA,CAAW,MAAM;AAAA,GACxE;AAOA,EAAA,MAAM,aAAA,GACF,QAAA,CAAS,EAAA,KAAO,KAAA,GACT;AAAA;AAAA;AAAA;AAAA,IAIG,iBAAA,EAAmB;AAAA,MAEvB,EAAC;AAEX,EAAA,uBACI,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACI,GAAG,aAAA;AAAA,MACJ,SAAA,EAAW,EAAA;AAAA,QACP,iEAAA;AAAA,QACA,SACM,oDAAA,GACA,oDAAA;AAAA,QACN;AAAA,OACJ;AAAA,MACA,KAAA,EAAO,cAAA;AAAA,MAIP,QAAA,kBAAA,GAAA;AAAA,QAACA,IAAA;AAAA,QAAA;AAAA,UACI,GAAI,SAAS,EAAA,KAAO,KAAA,GAAS,EAAE,UAAA,EAAY,EAAA,KAAkB,EAAC;AAAA,UAC/D,iBAAA,EAAkB,MAAA;AAAA,UAClB,KAAA,EAAO,SAAA;AAAA,UAEN;AAAA;AAAA;AACL;AAAA,GACJ;AAER,CAAA,EA5EmB,KAAA","file":"chunk-IGBXSBF7.js","sourcesContent":["'use client';\n\nimport type { ReactNode } from 'react';\nimport type { TextStyle, ViewStyle } from 'react-native';\nimport { Platform, Text as RNText, View } from 'react-native';\nimport { px } from '../../theme/px';\nimport { useColorScheme } from '../../theme/use-color-scheme';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\n\nexport type KbdProps = {\n children?: ReactNode;\n className?: string;\n};\n\n/**\n * Inline keyboard key hint. Use inside prose or UI labels to indicate a\n * keyboard shortcut.\n *\n * ```tsx\n * <Text>Press <Kbd>⌘K</Kbd> to open the command palette.</Text>\n * ```\n *\n * On web it renders a semantic `<kbd>` element (via rn-web's `accessibilityRole`\n * mapping). On native it renders a styled `<Text>`. The visual treatment is\n * identical: small monospace text in a pill with a subtle border.\n */\nexport const Kbd = ({ children, className }: KbdProps) => {\n const colors = useThemeColors();\n const isDark = useColorScheme() === 'dark';\n\n const bgColor = isDark ? colors.color.neutral['800'] : colors.color.neutral['100'];\n const borderColor = isDark ? colors.color.neutral['600'] : colors.color.neutral['300'];\n const textColor = isDark ? colors.color.neutral['200'] : colors.color.neutral['700'];\n\n const containerStyle: ViewStyle = {\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n alignSelf: 'center',\n backgroundColor: bgColor,\n borderWidth: 1,\n borderColor,\n borderRadius: px(colors.radius.sm),\n paddingHorizontal: px(colors.spacing['1']),\n paddingVertical: 2,\n // Subtle bottom shadow gives the classic key look.\n ...(Platform.OS === 'web'\n ? ({\n boxShadow: `0 1px 0 ${borderColor}`,\n display: 'inline-flex',\n } as object)\n : {}),\n };\n\n const textStyle: TextStyle = {\n color: textColor,\n // Monospace font for key labels.\n fontFamily: colors.fontFamily.mono ?? 'monospace',\n fontSize: px(colors.fontSize.xs),\n fontWeight: colors.fontWeight.medium as '500',\n lineHeight: px(colors.fontSize.xs) * Number(colors.lineHeight.normal),\n };\n\n // On web, map to the semantic <kbd> element via accessibilityRole.\n // react-native-web renders role=\"term\" as <dfn> and doesn't have a\n // dedicated kbd mapping, so we use a raw className + aria approach.\n // The 'none' role avoids a superfluous ARIA landmark while keeping\n // the native <kbd> tag in the DOM (set via `aria-label` / class).\n const extraWebProps =\n Platform.OS === 'web'\n ? ({\n // rn-web: 'none' skips the role attribute so the outer\n // View is just a plain <div>; we rely on the inner\n // <span> with data-kbd for semantic annotation.\n accessibilityRole: 'none' as const,\n } as object)\n : {};\n\n return (\n <View\n {...extraWebProps}\n className={cn(\n 'inline-flex flex-row items-center rounded-sm border px-1 py-0.5',\n isDark\n ? 'bg-neutral-800 border-neutral-600 text-neutral-200'\n : 'bg-neutral-100 border-neutral-300 text-neutral-700',\n className\n )}\n style={containerStyle}\n >\n {/* On web, data-kbd is used for CSS targeting / semantics.\n On native this attribute is silently ignored. */}\n <RNText\n {...(Platform.OS === 'web' ? ({ 'data-kbd': '' } as object) : {})}\n accessibilityRole=\"none\"\n style={textStyle}\n >\n {children}\n </RNText>\n </View>\n );\n};\n"]}
@@ -1,4 +1,4 @@
1
- import { Select } from './chunk-UZD77M3J.js';
1
+ import { Select } from './chunk-PJTCO76H.js';
2
2
  import { __name } from './chunk-WCQVDF3K.js';
3
3
  import { jsx } from 'nativewind/jsx-runtime';
4
4
 
@@ -7,5 +7,5 @@ var Combobox = /* @__PURE__ */ __name((props) => {
7
7
  }, "Combobox");
8
8
 
9
9
  export { Combobox };
10
- //# sourceMappingURL=chunk-JXLEMBDB.js.map
11
- //# sourceMappingURL=chunk-JXLEMBDB.js.map
10
+ //# sourceMappingURL=chunk-IIVTPN62.js.map
11
+ //# sourceMappingURL=chunk-IIVTPN62.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Combobox/Combobox.tsx"],"names":[],"mappings":";;;;AAcO,IAAM,QAAA,2BAAyB,KAAA,KAA0B;AAC5D,EAAA,uBAAO,GAAA,CAAC,MAAA,EAAA,EAAO,UAAA,EAAU,IAAA,EAAE,GAAG,KAAA,EAAO,CAAA;AACzC,CAAA,EAFwB,UAAA","file":"chunk-JXLEMBDB.js","sourcesContent":["'use client';\n\nimport { Select, type SelectProps } from '../Select';\n\n/**\n * Combobox — a Select with search defaulted on.\n *\n * Use Combobox for long lists or async options where users benefit from\n * typeahead filtering. Use Select directly for short static lists where\n * clicking is enough.\n *\n * Every prop, behavior, and type is identical to Select; this is purely a\n * default + naming convenience.\n */\nexport const Combobox = <T = unknown>(props: SelectProps<T>) => {\n return <Select searchable {...props} />;\n};\n"]}
1
+ {"version":3,"sources":["../src/components/Combobox/Combobox.tsx"],"names":[],"mappings":";;;;AAcO,IAAM,QAAA,2BAAyB,KAAA,KAA0B;AAC5D,EAAA,uBAAO,GAAA,CAAC,MAAA,EAAA,EAAO,UAAA,EAAU,IAAA,EAAE,GAAG,KAAA,EAAO,CAAA;AACzC,CAAA,EAFwB,UAAA","file":"chunk-IIVTPN62.js","sourcesContent":["'use client';\n\nimport { Select, type SelectProps } from '../Select';\n\n/**\n * Combobox — a Select with search defaulted on.\n *\n * Use Combobox for long lists or async options where users benefit from\n * typeahead filtering. Use Select directly for short static lists where\n * clicking is enough.\n *\n * Every prop, behavior, and type is identical to Select; this is purely a\n * default + naming convenience.\n */\nexport const Combobox = <T = unknown>(props: SelectProps<T>) => {\n return <Select searchable {...props} />;\n};\n"]}
@@ -1,6 +1,6 @@
1
1
  import { px } from './chunk-5A2QOOVN.js';
2
- import { cn } from './chunk-CHXHRJNZ.js';
3
2
  import { useThemeColors } from './chunk-R5JMDDCB.js';
3
+ import { cn } from './chunk-CHXHRJNZ.js';
4
4
  import { __name } from './chunk-WCQVDF3K.js';
5
5
  import { useState } from 'react';
6
6
  import { View, Image, Text } from 'react-native';
@@ -99,5 +99,5 @@ var Avatar = /* @__PURE__ */ __name(({ src, name, size = "md", fallback, classNa
99
99
  }, "Avatar");
100
100
 
101
101
  export { Avatar };
102
- //# sourceMappingURL=chunk-PNP7L4TA.js.map
103
- //# sourceMappingURL=chunk-PNP7L4TA.js.map
102
+ //# sourceMappingURL=chunk-ISCJST4P.js.map
103
+ //# sourceMappingURL=chunk-ISCJST4P.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Avatar/Avatar.tsx"],"names":["RNImage","RNText"],"mappings":"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","file":"chunk-PNP7L4TA.js","sourcesContent":["'use client';\n\nimport type { ReactNode } from 'react';\nimport { useState } from 'react';\nimport type { ImageStyle, ViewStyle } from 'react-native';\nimport { Image as RNImage, Text as RNText, View } from 'react-native';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\n\nexport type AvatarSize = 'sm' | 'md' | 'lg' | 'xl';\n\nexport type AvatarProps = {\n /** Image URL. When omitted or the load fails, the fallback renders instead. */\n src?: string;\n /**\n * Person/entity name. Used to derive initials for the fallback (first\n * letter of the first word + first letter of the last word, up to 2\n * characters). Also becomes the `alt` text on the image — set this\n * even when `src` loads cleanly.\n */\n name?: string;\n /**\n * Visual size. Maps to a fixed pixel diameter.\n * @defaultValue 'md'\n */\n size?: AvatarSize;\n /**\n * Custom fallback content shown when no `src` is provided or the image\n * fails to load. When omitted, initials derived from `name` render; if\n * `name` is also missing, a neutral placeholder shows.\n */\n fallback?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n// Diameter for each size — component-density literals — not from theme\n// (avatars have a tight visual ramp that doesn't tie to the spacing scale).\nconst SIZE_PX: Record<AvatarSize, number> = {\n sm: 32,\n md: 40,\n lg: 56,\n xl: 72,\n};\n\n// Maps each avatar size to the closest fontSize token key. Resolved to px\n// inside the component so theme overrides take effect.\nconst FALLBACK_FONT_KEY: Record<AvatarSize, 'xs' | 'sm' | 'lg' | 'xl'> = {\n sm: 'xs', // 12\n md: 'sm', // 14\n lg: 'lg', // 18\n xl: 'xl', // 20 (closest to legacy 22)\n};\n\nconst initialsFromName = (name: string | undefined): string => {\n if (!name) {\n return '';\n }\n const trimmed = name.trim();\n if (!trimmed) {\n return '';\n }\n const parts = trimmed.split(/\\s+/);\n const first = parts[0]?.[0] ?? '';\n const last = parts.length > 1 ? (parts[parts.length - 1]?.[0] ?? '') : '';\n return (first + last).toUpperCase();\n};\n\n/**\n * Circular profile picture with graceful fallback. Renders the image when\n * `src` is provided and loads cleanly; otherwise renders the supplied\n * `fallback`, derived initials from `name`, or a neutral placeholder.\n *\n * Why a single component instead of compound (`AvatarImage` + `AvatarFallback`):\n * the common case is a one-liner — `<Avatar src name />` — and the fallback\n * decision is internal state, not consumer-driven layout.\n */\nexport const Avatar = ({ src, name, size = 'md', fallback, className, testID }: AvatarProps) => {\n const colors = useThemeColors();\n const [imageFailed, setImageFailed] = useState(false);\n const dim = SIZE_PX[size];\n const showImage = src !== undefined && src.length > 0 && !imageFailed;\n\n const containerStyle: ViewStyle = {\n width: dim,\n height: dim,\n borderRadius: dim / 2,\n backgroundColor: colors.semantic.background.subtle,\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'hidden',\n };\n\n const imageStyle: ImageStyle = {\n width: dim,\n height: dim,\n };\n\n const initials = initialsFromName(name);\n const accessibilityLabel = name ?? 'Avatar';\n\n return (\n <View\n {...(testID !== undefined ? { testID } : {})}\n accessibilityRole=\"image\"\n accessibilityLabel={accessibilityLabel}\n aria-label={accessibilityLabel}\n className={cn('rounded-full overflow-hidden bg-neutral-200 items-center justify-center', className)}\n style={containerStyle}\n >\n {showImage ? (\n <RNImage\n source={{ uri: src }}\n style={imageStyle}\n accessibilityLabel={accessibilityLabel}\n onError={() => setImageFailed(true)}\n />\n ) : fallback !== undefined ? (\n fallback\n ) : initials.length > 0 ? (\n <RNText\n style={{\n color: colors.semantic.text.muted,\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize[FALLBACK_FONT_KEY[size]]),\n fontWeight: colors.fontWeight.medium as '500',\n }}\n >\n {initials}\n </RNText>\n ) : (\n <View\n style={{\n width: dim * 0.45,\n height: dim * 0.45,\n borderRadius: dim,\n backgroundColor: colors.semantic.text.muted,\n }}\n />\n )}\n </View>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/components/Avatar/Avatar.tsx"],"names":["RNImage","RNText"],"mappings":"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","file":"chunk-ISCJST4P.js","sourcesContent":["'use client';\n\nimport type { ReactNode } from 'react';\nimport { useState } from 'react';\nimport type { ImageStyle, ViewStyle } from 'react-native';\nimport { Image as RNImage, Text as RNText, View } from 'react-native';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\n\nexport type AvatarSize = 'sm' | 'md' | 'lg' | 'xl';\n\nexport type AvatarProps = {\n /** Image URL. When omitted or the load fails, the fallback renders instead. */\n src?: string;\n /**\n * Person/entity name. Used to derive initials for the fallback (first\n * letter of the first word + first letter of the last word, up to 2\n * characters). Also becomes the `alt` text on the image — set this\n * even when `src` loads cleanly.\n */\n name?: string;\n /**\n * Visual size. Maps to a fixed pixel diameter.\n * @defaultValue 'md'\n */\n size?: AvatarSize;\n /**\n * Custom fallback content shown when no `src` is provided or the image\n * fails to load. When omitted, initials derived from `name` render; if\n * `name` is also missing, a neutral placeholder shows.\n */\n fallback?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n// Diameter for each size — component-density literals — not from theme\n// (avatars have a tight visual ramp that doesn't tie to the spacing scale).\nconst SIZE_PX: Record<AvatarSize, number> = {\n sm: 32,\n md: 40,\n lg: 56,\n xl: 72,\n};\n\n// Maps each avatar size to the closest fontSize token key. Resolved to px\n// inside the component so theme overrides take effect.\nconst FALLBACK_FONT_KEY: Record<AvatarSize, 'xs' | 'sm' | 'lg' | 'xl'> = {\n sm: 'xs', // 12\n md: 'sm', // 14\n lg: 'lg', // 18\n xl: 'xl', // 20 (closest to legacy 22)\n};\n\nconst initialsFromName = (name: string | undefined): string => {\n if (!name) {\n return '';\n }\n const trimmed = name.trim();\n if (!trimmed) {\n return '';\n }\n const parts = trimmed.split(/\\s+/);\n const first = parts[0]?.[0] ?? '';\n const last = parts.length > 1 ? (parts[parts.length - 1]?.[0] ?? '') : '';\n return (first + last).toUpperCase();\n};\n\n/**\n * Circular profile picture with graceful fallback. Renders the image when\n * `src` is provided and loads cleanly; otherwise renders the supplied\n * `fallback`, derived initials from `name`, or a neutral placeholder.\n *\n * Why a single component instead of compound (`AvatarImage` + `AvatarFallback`):\n * the common case is a one-liner — `<Avatar src name />` — and the fallback\n * decision is internal state, not consumer-driven layout.\n */\nexport const Avatar = ({ src, name, size = 'md', fallback, className, testID }: AvatarProps) => {\n const colors = useThemeColors();\n const [imageFailed, setImageFailed] = useState(false);\n const dim = SIZE_PX[size];\n const showImage = src !== undefined && src.length > 0 && !imageFailed;\n\n const containerStyle: ViewStyle = {\n width: dim,\n height: dim,\n borderRadius: dim / 2,\n backgroundColor: colors.semantic.background.subtle,\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'hidden',\n };\n\n const imageStyle: ImageStyle = {\n width: dim,\n height: dim,\n };\n\n const initials = initialsFromName(name);\n const accessibilityLabel = name ?? 'Avatar';\n\n return (\n <View\n {...(testID !== undefined ? { testID } : {})}\n accessibilityRole=\"image\"\n accessibilityLabel={accessibilityLabel}\n aria-label={accessibilityLabel}\n className={cn('rounded-full overflow-hidden bg-neutral-200 items-center justify-center', className)}\n style={containerStyle}\n >\n {showImage ? (\n <RNImage\n source={{ uri: src }}\n style={imageStyle}\n accessibilityLabel={accessibilityLabel}\n onError={() => setImageFailed(true)}\n />\n ) : fallback !== undefined ? (\n fallback\n ) : initials.length > 0 ? (\n <RNText\n style={{\n color: colors.semantic.text.muted,\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize[FALLBACK_FONT_KEY[size]]),\n fontWeight: colors.fontWeight.medium as '500',\n }}\n >\n {initials}\n </RNText>\n ) : (\n <View\n style={{\n width: dim * 0.45,\n height: dim * 0.45,\n borderRadius: dim,\n backgroundColor: colors.semantic.text.muted,\n }}\n />\n )}\n </View>\n );\n};\n"]}
@@ -1,4 +1,4 @@
1
- import { wrapStringChildren } from './chunk-JQQ3FBN7.js';
1
+ import { wrapStringChildren } from './chunk-VLZANXRZ.js';
2
2
  import { cn } from './chunk-CHXHRJNZ.js';
3
3
  import { __name } from './chunk-WCQVDF3K.js';
4
4
  import { View } from 'react-native';
@@ -11,5 +11,5 @@ var Box = /* @__PURE__ */ __name(({ className, children, flex, style, ...rest })
11
11
  }, "Box");
12
12
 
13
13
  export { Box };
14
- //# sourceMappingURL=chunk-TLS54G6Y.js.map
15
- //# sourceMappingURL=chunk-TLS54G6Y.js.map
14
+ //# sourceMappingURL=chunk-IWM2XDXH.js.map
15
+ //# sourceMappingURL=chunk-IWM2XDXH.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Box/Box.tsx"],"names":[],"mappings":";;;;;;AAwBO,IAAM,GAAA,2BAAO,EAAE,SAAA,EAAW,UAAU,IAAA,EAAM,KAAA,EAAO,GAAG,IAAA,EAAK,KAAgB;AAC5E,EAAA,MAAM,SAAA,GAAmC,IAAA,KAAS,MAAA,GAAY,MAAA,GAAY,EAAE,IAAA,EAAK;AACjF,EAAA,MAAM,MAAA,GAAS,cAAc,MAAA,GAAY,KAAA,GAAQ,UAAU,MAAA,GAAY,SAAA,GAAY,CAAC,SAAA,EAAW,KAAK,CAAA;AACpG,EAAA,uBACI,GAAA,CAAC,IAAA,EAAA,EAAM,GAAG,IAAA,EAAM,SAAA,EAAW,EAAA,CAAG,SAAS,CAAA,EAAG,KAAA,EAAO,MAAA,EAC5C,QAAA,EAAA,kBAAA,CAAmB,QAAQ,CAAA,EAChC,CAAA;AAER,CAAA,EARmB,KAAA","file":"chunk-TLS54G6Y.js","sourcesContent":["import type { ViewProps, ViewStyle } from 'react-native';\nimport { View } from 'react-native';\nimport { cn } from '../../utils/cn';\nimport { wrapStringChildren } from '../../utils/wrap-string-children';\n\nexport type BoxProps = ViewProps & {\n className?: string;\n testID?: string;\n /**\n * Flex grow factor for proportional layouts inside HStack / VStack.\n *\n * In an HStack with three children of `flex={1}`, each takes one third\n * of the available width. For a 20/60/20 split: `flex={1}`, `flex={3}`,\n * `flex={1}` — the values are ratios, not percentages.\n *\n * Maps directly to React Native / web flexbox `flex` style.\n */\n flex?: number;\n};\n\n/**\n * Generic layout primitive. Wraps react-native's `<View>` with className\n * support and a `flex` prop for proportional layouts. RSC-safe.\n */\nexport const Box = ({ className, children, flex, style, ...rest }: BoxProps) => {\n const flexStyle: ViewStyle | undefined = flex === undefined ? undefined : { flex };\n const merged = flexStyle === undefined ? style : style === undefined ? flexStyle : [flexStyle, style];\n return (\n <View {...rest} className={cn(className)} style={merged}>\n {wrapStringChildren(children)}\n </View>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/components/Box/Box.tsx"],"names":[],"mappings":";;;;;;AAwBO,IAAM,GAAA,2BAAO,EAAE,SAAA,EAAW,UAAU,IAAA,EAAM,KAAA,EAAO,GAAG,IAAA,EAAK,KAAgB;AAC5E,EAAA,MAAM,SAAA,GAAmC,IAAA,KAAS,MAAA,GAAY,MAAA,GAAY,EAAE,IAAA,EAAK;AACjF,EAAA,MAAM,MAAA,GAAS,cAAc,MAAA,GAAY,KAAA,GAAQ,UAAU,MAAA,GAAY,SAAA,GAAY,CAAC,SAAA,EAAW,KAAK,CAAA;AACpG,EAAA,uBACI,GAAA,CAAC,IAAA,EAAA,EAAM,GAAG,IAAA,EAAM,SAAA,EAAW,EAAA,CAAG,SAAS,CAAA,EAAG,KAAA,EAAO,MAAA,EAC5C,QAAA,EAAA,kBAAA,CAAmB,QAAQ,CAAA,EAChC,CAAA;AAER,CAAA,EARmB,KAAA","file":"chunk-IWM2XDXH.js","sourcesContent":["import type { ViewProps, ViewStyle } from 'react-native';\nimport { View } from 'react-native';\nimport { cn } from '../../utils/cn';\nimport { wrapStringChildren } from '../../utils/wrap-string-children';\n\nexport type BoxProps = ViewProps & {\n className?: string;\n testID?: string;\n /**\n * Flex grow factor for proportional layouts inside HStack / VStack.\n *\n * In an HStack with three children of `flex={1}`, each takes one third\n * of the available width. For a 20/60/20 split: `flex={1}`, `flex={3}`,\n * `flex={1}` — the values are ratios, not percentages.\n *\n * Maps directly to React Native / web flexbox `flex` style.\n */\n flex?: number;\n};\n\n/**\n * Generic layout primitive. Wraps react-native's `<View>` with className\n * support and a `flex` prop for proportional layouts. RSC-safe.\n */\nexport const Box = ({ className, children, flex, style, ...rest }: BoxProps) => {\n const flexStyle: ViewStyle | undefined = flex === undefined ? undefined : { flex };\n const merged = flexStyle === undefined ? style : style === undefined ? flexStyle : [flexStyle, style];\n return (\n <View {...rest} className={cn(className)} style={merged}>\n {wrapStringChildren(children)}\n </View>\n );\n};\n"]}
@@ -0,0 +1,118 @@
1
+ import { px } from './chunk-5A2QOOVN.js';
2
+ import { useThemeColors } from './chunk-R5JMDDCB.js';
3
+ import { cn } from './chunk-CHXHRJNZ.js';
4
+ import { __name } from './chunk-WCQVDF3K.js';
5
+ import { View, Text, Pressable } from 'react-native';
6
+ import { jsxs, Fragment, jsx } from 'nativewind/jsx-runtime';
7
+
8
+ var Item = /* @__PURE__ */ __name(({
9
+ leading,
10
+ title,
11
+ description,
12
+ trailing,
13
+ chevron = false,
14
+ onPress,
15
+ disabled = false,
16
+ className,
17
+ testID
18
+ }) => {
19
+ const colors = useThemeColors();
20
+ const isTappable = onPress !== void 0;
21
+ const rowStyle = {
22
+ flexDirection: "row",
23
+ alignItems: "center",
24
+ gap: px(colors.spacing["3"]),
25
+ paddingVertical: px(colors.spacing["3"]),
26
+ paddingHorizontal: px(colors.spacing["4"]),
27
+ minHeight: 52,
28
+ opacity: disabled ? 0.5 : 1
29
+ };
30
+ const content = /* @__PURE__ */ jsxs(Fragment, { children: [
31
+ leading != null ? /* @__PURE__ */ jsx(View, { style: { flexShrink: 0 }, children: leading }) : null,
32
+ /* @__PURE__ */ jsxs(View, { style: { flex: 1, flexDirection: "column", gap: 2 }, children: [
33
+ typeof title === "string" ? /* @__PURE__ */ jsx(
34
+ Text,
35
+ {
36
+ style: {
37
+ color: colors.semantic.text.default,
38
+ fontFamily: colors.fontFamily.body,
39
+ fontSize: px(colors.fontSize.sm),
40
+ fontWeight: colors.fontWeight.medium
41
+ },
42
+ numberOfLines: 1,
43
+ children: title
44
+ }
45
+ ) : title,
46
+ description != null ? typeof description === "string" ? /* @__PURE__ */ jsx(
47
+ Text,
48
+ {
49
+ style: {
50
+ color: colors.semantic.text.muted,
51
+ fontFamily: colors.fontFamily.body,
52
+ fontSize: px(colors.fontSize.xs)
53
+ },
54
+ numberOfLines: 1,
55
+ children: description
56
+ }
57
+ ) : description : null
58
+ ] }),
59
+ trailing != null ? /* @__PURE__ */ jsx(View, { style: { flexShrink: 0 }, children: trailing }) : null,
60
+ chevron ? /* @__PURE__ */ jsx(
61
+ View,
62
+ {
63
+ style: { flexShrink: 0 },
64
+ "aria-hidden": true,
65
+ testID: testID != null ? `${testID}-chevron` : void 0,
66
+ children: /* @__PURE__ */ jsx(
67
+ Text,
68
+ {
69
+ accessibilityElementsHidden: true,
70
+ importantForAccessibility: "no-hide-descendants",
71
+ style: {
72
+ fontSize: 14,
73
+ lineHeight: 16,
74
+ color: colors.semantic.text.muted,
75
+ // On web rn-web passes style through — transform
76
+ // with a rotate is the lightest-weight approach
77
+ // that avoids importing the full SVG icon set.
78
+ transform: [{ rotate: "-90deg" }]
79
+ },
80
+ children: "\u2304"
81
+ }
82
+ )
83
+ }
84
+ ) : null
85
+ ] });
86
+ if (isTappable) {
87
+ return /* @__PURE__ */ jsx(
88
+ Pressable,
89
+ {
90
+ ...testID !== void 0 ? { testID } : {},
91
+ role: "button",
92
+ accessibilityRole: "button",
93
+ disabled,
94
+ onPress: disabled ? void 0 : onPress,
95
+ className: cn(
96
+ "flex-row items-center",
97
+ disabled ? "opacity-50" : "hover:bg-semantic-background-subtle active:bg-semantic-border-default",
98
+ className
99
+ ),
100
+ style: rowStyle,
101
+ children: content
102
+ }
103
+ );
104
+ }
105
+ return /* @__PURE__ */ jsx(
106
+ View,
107
+ {
108
+ ...testID !== void 0 ? { testID } : {},
109
+ className: cn("flex-row items-center", className),
110
+ style: rowStyle,
111
+ children: content
112
+ }
113
+ );
114
+ }, "Item");
115
+
116
+ export { Item };
117
+ //# sourceMappingURL=chunk-J5LK2XHE.js.map
118
+ //# sourceMappingURL=chunk-J5LK2XHE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Item/Item.tsx"],"names":["RNText"],"mappings":"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","file":"chunk-J5LK2XHE.js","sourcesContent":["'use client';\n\nimport type { ReactNode } from 'react';\nimport type { ViewStyle } from 'react-native';\nimport { Pressable, Text as RNText, View } from 'react-native';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\n\nexport type ItemProps = {\n /** Leading slot — typically an Icon, Avatar, or image. */\n leading?: ReactNode;\n /** Primary label. Accepts a string or any ReactNode. */\n title: ReactNode;\n /** Secondary label rendered below the title. */\n description?: ReactNode;\n /** Trailing slot — value text, badge, icon, etc. */\n trailing?: ReactNode;\n /** Show a chevron-right arrow at the far end. Useful for navigation rows. */\n chevron?: boolean;\n /** Makes the row tappable. */\n onPress?: () => void;\n disabled?: boolean;\n className?: string;\n testID?: string;\n};\n\n/**\n * A generic list row primitive. Composes four horizontal zones:\n * `leading | title + description (stacked) | trailing | chevron`.\n *\n * All zones except `title` are optional. The row becomes tappable\n * when `onPress` is provided.\n *\n * ```tsx\n * <Item\n * leading={<Avatar src={user.avatar} />}\n * title={user.name}\n * description={user.email}\n * chevron\n * onPress={() => navigate(`/users/${user.id}`)}\n * />\n * ```\n */\nexport const Item = ({\n leading,\n title,\n description,\n trailing,\n chevron = false,\n onPress,\n disabled = false,\n className,\n testID,\n}: ItemProps) => {\n const colors = useThemeColors();\n const isTappable = onPress !== undefined;\n\n const rowStyle: ViewStyle = {\n flexDirection: 'row',\n alignItems: 'center',\n gap: px(colors.spacing['3']),\n paddingVertical: px(colors.spacing['3']),\n paddingHorizontal: px(colors.spacing['4']),\n minHeight: 52,\n opacity: disabled ? 0.5 : 1,\n };\n\n const content = (\n <>\n {leading != null ? <View style={{ flexShrink: 0 }}>{leading}</View> : null}\n\n <View style={{ flex: 1, flexDirection: 'column', gap: 2 }}>\n {typeof title === 'string' ? (\n <RNText\n style={{\n color: colors.semantic.text.default,\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n fontWeight: colors.fontWeight.medium as '500',\n }}\n numberOfLines={1}\n >\n {title}\n </RNText>\n ) : (\n title\n )}\n\n {description != null ? (\n typeof description === 'string' ? (\n <RNText\n style={{\n color: colors.semantic.text.muted,\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.xs),\n }}\n numberOfLines={1}\n >\n {description}\n </RNText>\n ) : (\n description\n )\n ) : null}\n </View>\n\n {trailing != null ? <View style={{ flexShrink: 0 }}>{trailing}</View> : null}\n\n {chevron ? (\n <View\n style={{ flexShrink: 0 }}\n aria-hidden={true}\n testID={testID != null ? `${testID}-chevron` : undefined}\n >\n {/* chevronRight: rotate chevronDown 90° CCW */}\n <RNText\n accessibilityElementsHidden\n importantForAccessibility=\"no-hide-descendants\"\n style={{\n fontSize: 14,\n lineHeight: 16,\n color: colors.semantic.text.muted,\n // On web rn-web passes style through — transform\n // with a rotate is the lightest-weight approach\n // that avoids importing the full SVG icon set.\n transform: [{ rotate: '-90deg' }],\n }}\n >\n ⌄\n </RNText>\n </View>\n ) : null}\n </>\n );\n\n if (isTappable) {\n return (\n <Pressable\n {...(testID !== undefined ? { testID } : {})}\n role=\"button\"\n accessibilityRole=\"button\"\n disabled={disabled}\n onPress={disabled ? undefined : onPress}\n className={cn(\n 'flex-row items-center',\n disabled ? 'opacity-50' : 'hover:bg-semantic-background-subtle active:bg-semantic-border-default',\n className\n )}\n style={rowStyle}\n >\n {content}\n </Pressable>\n );\n }\n\n return (\n <View\n {...(testID !== undefined ? { testID } : {})}\n className={cn('flex-row items-center', className)}\n style={rowStyle}\n >\n {content}\n </View>\n );\n};\n"]}
@@ -0,0 +1,27 @@
1
+ import { cn } from './chunk-CHXHRJNZ.js';
2
+ import { __name } from './chunk-WCQVDF3K.js';
3
+ import { View } from 'react-native';
4
+ import { jsx } from 'nativewind/jsx-runtime';
5
+
6
+ var BASE_STYLE = {
7
+ overflow: "hidden"
8
+ };
9
+ var AspectRatio = /* @__PURE__ */ __name(({ ratio, children, className, testID }) => {
10
+ const containerStyle = {
11
+ ...BASE_STYLE,
12
+ aspectRatio: ratio
13
+ };
14
+ return /* @__PURE__ */ jsx(
15
+ View,
16
+ {
17
+ ...testID !== void 0 ? { testID } : {},
18
+ className: cn("overflow-hidden", className),
19
+ style: containerStyle,
20
+ children
21
+ }
22
+ );
23
+ }, "AspectRatio");
24
+
25
+ export { AspectRatio };
26
+ //# sourceMappingURL=chunk-KFFGDET3.js.map
27
+ //# sourceMappingURL=chunk-KFFGDET3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/AspectRatio/AspectRatio.tsx"],"names":[],"mappings":";;;;;AAqBA,IAAM,UAAA,GAAwB;AAAA,EAC1B,QAAA,EAAU;AACd,CAAA;AAaO,IAAM,8BAAc,MAAA,CAAA,CAAC,EAAE,OAAO,QAAA,EAAU,SAAA,EAAW,QAAO,KAAwB;AACrF,EAAA,MAAM,cAAA,GAA4B;AAAA,IAC9B,GAAG,UAAA;AAAA,IACH,WAAA,EAAa;AAAA,GACjB;AAEA,EAAA,uBACI,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACI,GAAI,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,KAAW,EAAC;AAAA,MAC1C,SAAA,EAAW,EAAA,CAAG,iBAAA,EAAmB,SAAS,CAAA;AAAA,MAC1C,KAAA,EAAO,cAAA;AAAA,MAEN;AAAA;AAAA,GACL;AAER,CAAA,EAf2B,aAAA","file":"chunk-KFFGDET3.js","sourcesContent":["'use client';\n\nimport type { ReactNode } from 'react';\nimport type { ViewStyle } from 'react-native';\nimport { View } from 'react-native';\nimport { cn } from '../../utils/cn';\n\nexport type AspectRatioProps = {\n /**\n * The ratio expressed as width / height. Common values:\n * - `16 / 9` (1.777…) — widescreen video\n * - `4 / 3` (1.333…) — classic photo\n * - `1` — square\n * - `2 / 3` (0.666…) — portrait\n */\n ratio: number;\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\nconst BASE_STYLE: ViewStyle = {\n overflow: 'hidden',\n};\n\n/**\n * Wraps children in a container that maintains a fixed width-to-height ratio.\n * Works identically on web and native — React Native's `aspectRatio` style\n * property maps to the CSS `aspect-ratio` property via react-native-web.\n *\n * ```tsx\n * <AspectRatio ratio={16 / 9}>\n * <Image source={src} style={{ width: '100%', height: '100%' }} />\n * </AspectRatio>\n * ```\n */\nexport const AspectRatio = ({ ratio, children, className, testID }: AspectRatioProps) => {\n const containerStyle: ViewStyle = {\n ...BASE_STYLE,\n aspectRatio: ratio,\n };\n\n return (\n <View\n {...(testID !== undefined ? { testID } : {})}\n className={cn('overflow-hidden', className)}\n style={containerStyle}\n >\n {children}\n </View>\n );\n};\n"]}
@@ -1,4 +1,4 @@
1
- import { wrapStringChildren } from './chunk-JQQ3FBN7.js';
1
+ import { wrapStringChildren } from './chunk-VLZANXRZ.js';
2
2
  import { cn } from './chunk-CHXHRJNZ.js';
3
3
  import { __name } from './chunk-WCQVDF3K.js';
4
4
  import { View } from 'react-native';
@@ -76,5 +76,5 @@ var VStack = /* @__PURE__ */ __name(({ gap, align, justify, className, children,
76
76
  }, "VStack");
77
77
 
78
78
  export { VStack };
79
- //# sourceMappingURL=chunk-MRJWPRCX.js.map
80
- //# sourceMappingURL=chunk-MRJWPRCX.js.map
79
+ //# sourceMappingURL=chunk-L6VYDM7S.js.map
80
+ //# sourceMappingURL=chunk-L6VYDM7S.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/VStack/VStack.tsx"],"names":[],"mappings":";;;;;;AAcA,IAAM,WAAA,GAA0C;AAAA,EAC5C,KAAA,EAAO,aAAA;AAAA,EACP,MAAA,EAAQ,cAAA;AAAA,EACR,GAAA,EAAK,WAAA;AAAA,EACL,OAAA,EAAS,eAAA;AAAA,EACT,QAAA,EAAU;AACd,CAAA;AAEA,IAAM,aAAA,GAA8C;AAAA,EAChD,KAAA,EAAO,eAAA;AAAA,EACP,MAAA,EAAQ,gBAAA;AAAA,EACR,GAAA,EAAK,aAAA;AAAA,EACL,OAAA,EAAS,iBAAA;AAAA,EACT,MAAA,EAAQ,gBAAA;AAAA,EACR,MAAA,EAAQ;AACZ,CAAA;AAEA,IAAM,WAAA,GAA2D;AAAA,EAC7D,KAAA,EAAO,YAAA;AAAA,EACP,MAAA,EAAQ,QAAA;AAAA,EACR,GAAA,EAAK,UAAA;AAAA,EACL,OAAA,EAAS,SAAA;AAAA,EACT,QAAA,EAAU;AACd,CAAA;AAEA,IAAM,aAAA,GAAmE;AAAA,EACrE,KAAA,EAAO,YAAA;AAAA,EACP,MAAA,EAAQ,QAAA;AAAA,EACR,GAAA,EAAK,UAAA;AAAA,EACL,OAAA,EAAS,eAAA;AAAA,EACT,MAAA,EAAQ,cAAA;AAAA,EACR,MAAA,EAAQ;AACZ,CAAA;AAEA,IAAM,MAAA,GAAmC;AAAA,EACrC,CAAA,EAAG,CAAA;AAAA,EACH,CAAA,EAAG,CAAA;AAAA,EACH,CAAA,EAAG,CAAA;AAAA,EACH,CAAA,EAAG,EAAA;AAAA,EACH,CAAA,EAAG,EAAA;AAAA,EACH,CAAA,EAAG,EAAA;AAAA,EACH,CAAA,EAAG,EAAA;AAAA,EACH,CAAA,EAAG,EAAA;AAAA,EACH,EAAA,EAAI,EAAA;AAAA,EACJ,EAAA,EAAI;AACR,CAAA;AAOO,IAAM,MAAA,mBAAS,MAAA,CAAA,CAAC,EAAE,GAAA,EAAK,KAAA,EAAO,OAAA,EAAS,SAAA,EAAW,QAAA,EAAU,KAAA,EAAO,GAAG,IAAA,EAAK,KAAmB;AACjG,EAAA,MAAM,MAAA,GAAoB,EAAE,aAAA,EAAe,QAAA,EAAS;AACpD,EAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,GAAA,KAAQ,CAAA,EAAG;AAChC,IAAA,MAAA,CAAO,GAAA,GAAM,OAAO,GAAG,CAAA;AAAA,EAC3B;AACA,EAAA,IAAI,UAAU,MAAA,EAAW;AACrB,IAAA,MAAA,CAAO,UAAA,GAAa,YAAY,KAAK,CAAA;AAAA,EACzC;AACA,EAAA,IAAI,YAAY,MAAA,EAAW;AACvB,IAAA,MAAA,CAAO,cAAA,GAAiB,cAAc,OAAO,CAAA;AAAA,EACjD;AACA,EAAA,MAAM,SAAS,KAAA,KAAU,MAAA,GAAY,MAAA,GAAU,CAAC,QAAQ,KAAK,CAAA;AAC7D,EAAA,uBACI,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACI,GAAG,IAAA;AAAA,MACJ,KAAA,EAAO,MAAA;AAAA,MACP,SAAA,EAAW,EAAA;AAAA,QACP,UAAA;AAAA,QACA,QAAQ,MAAA,IAAa,GAAA,KAAQ,CAAA,GAAI,CAAA,IAAA,EAAO,GAAG,CAAA,CAAA,GAAK,MAAA;AAAA,QAChD,KAAA,KAAU,MAAA,GAAY,WAAA,CAAY,KAAK,CAAA,GAAI,MAAA;AAAA,QAC3C,OAAA,KAAY,MAAA,GAAY,aAAA,CAAc,OAAO,CAAA,GAAI,MAAA;AAAA,QACjD;AAAA,OACJ;AAAA,MAEC,6BAAmB,QAAQ;AAAA;AAAA,GAChC;AAER,CAAA,EA3BsB,QAAA","file":"chunk-MRJWPRCX.js","sourcesContent":["import type { ViewProps, ViewStyle } from 'react-native';\nimport { View } from 'react-native';\nimport { cn } from '../../utils/cn';\nimport { wrapStringChildren } from '../../utils/wrap-string-children';\nimport type { StackAlign, StackGap, StackJustify } from '../HStack/HStack';\n\nexport type VStackProps = ViewProps & {\n gap?: StackGap;\n align?: StackAlign;\n justify?: StackJustify;\n className?: string;\n testID?: string;\n};\n\nconst ALIGN_CLASS: Record<StackAlign, string> = {\n start: 'items-start',\n center: 'items-center',\n end: 'items-end',\n stretch: 'items-stretch',\n baseline: 'items-baseline',\n};\n\nconst JUSTIFY_CLASS: Record<StackJustify, string> = {\n start: 'justify-start',\n center: 'justify-center',\n end: 'justify-end',\n between: 'justify-between',\n around: 'justify-around',\n evenly: 'justify-evenly',\n};\n\nconst ALIGN_STYLE: Record<StackAlign, ViewStyle['alignItems']> = {\n start: 'flex-start',\n center: 'center',\n end: 'flex-end',\n stretch: 'stretch',\n baseline: 'baseline',\n};\n\nconst JUSTIFY_STYLE: Record<StackJustify, ViewStyle['justifyContent']> = {\n start: 'flex-start',\n center: 'center',\n end: 'flex-end',\n between: 'space-between',\n around: 'space-around',\n evenly: 'space-evenly',\n};\n\nconst GAP_PX: Record<StackGap, number> = {\n 0: 0,\n 1: 4,\n 2: 8,\n 3: 12,\n 4: 16,\n 5: 20,\n 6: 24,\n 8: 32,\n 10: 40,\n 12: 48,\n};\n\n/**\n * Vertical flex layout primitive. RSC-safe.\n *\n * Layout is driven by inline style; see HStack for the rationale.\n */\nexport const VStack = ({ gap, align, justify, className, children, style, ...rest }: VStackProps) => {\n const inline: ViewStyle = { flexDirection: 'column' };\n if (gap !== undefined && gap !== 0) {\n inline.gap = GAP_PX[gap];\n }\n if (align !== undefined) {\n inline.alignItems = ALIGN_STYLE[align];\n }\n if (justify !== undefined) {\n inline.justifyContent = JUSTIFY_STYLE[justify];\n }\n const merged = style === undefined ? inline : ([inline, style] as ViewStyle[]);\n return (\n <View\n {...rest}\n style={merged}\n className={cn(\n 'flex-col',\n gap !== undefined && gap !== 0 ? `gap-${gap}` : undefined,\n align !== undefined ? ALIGN_CLASS[align] : undefined,\n justify !== undefined ? JUSTIFY_CLASS[justify] : undefined,\n className\n )}\n >\n {wrapStringChildren(children)}\n </View>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/components/VStack/VStack.tsx"],"names":[],"mappings":";;;;;;AAcA,IAAM,WAAA,GAA0C;AAAA,EAC5C,KAAA,EAAO,aAAA;AAAA,EACP,MAAA,EAAQ,cAAA;AAAA,EACR,GAAA,EAAK,WAAA;AAAA,EACL,OAAA,EAAS,eAAA;AAAA,EACT,QAAA,EAAU;AACd,CAAA;AAEA,IAAM,aAAA,GAA8C;AAAA,EAChD,KAAA,EAAO,eAAA;AAAA,EACP,MAAA,EAAQ,gBAAA;AAAA,EACR,GAAA,EAAK,aAAA;AAAA,EACL,OAAA,EAAS,iBAAA;AAAA,EACT,MAAA,EAAQ,gBAAA;AAAA,EACR,MAAA,EAAQ;AACZ,CAAA;AAEA,IAAM,WAAA,GAA2D;AAAA,EAC7D,KAAA,EAAO,YAAA;AAAA,EACP,MAAA,EAAQ,QAAA;AAAA,EACR,GAAA,EAAK,UAAA;AAAA,EACL,OAAA,EAAS,SAAA;AAAA,EACT,QAAA,EAAU;AACd,CAAA;AAEA,IAAM,aAAA,GAAmE;AAAA,EACrE,KAAA,EAAO,YAAA;AAAA,EACP,MAAA,EAAQ,QAAA;AAAA,EACR,GAAA,EAAK,UAAA;AAAA,EACL,OAAA,EAAS,eAAA;AAAA,EACT,MAAA,EAAQ,cAAA;AAAA,EACR,MAAA,EAAQ;AACZ,CAAA;AAEA,IAAM,MAAA,GAAmC;AAAA,EACrC,CAAA,EAAG,CAAA;AAAA,EACH,CAAA,EAAG,CAAA;AAAA,EACH,CAAA,EAAG,CAAA;AAAA,EACH,CAAA,EAAG,EAAA;AAAA,EACH,CAAA,EAAG,EAAA;AAAA,EACH,CAAA,EAAG,EAAA;AAAA,EACH,CAAA,EAAG,EAAA;AAAA,EACH,CAAA,EAAG,EAAA;AAAA,EACH,EAAA,EAAI,EAAA;AAAA,EACJ,EAAA,EAAI;AACR,CAAA;AAOO,IAAM,MAAA,mBAAS,MAAA,CAAA,CAAC,EAAE,GAAA,EAAK,KAAA,EAAO,OAAA,EAAS,SAAA,EAAW,QAAA,EAAU,KAAA,EAAO,GAAG,IAAA,EAAK,KAAmB;AACjG,EAAA,MAAM,MAAA,GAAoB,EAAE,aAAA,EAAe,QAAA,EAAS;AACpD,EAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,GAAA,KAAQ,CAAA,EAAG;AAChC,IAAA,MAAA,CAAO,GAAA,GAAM,OAAO,GAAG,CAAA;AAAA,EAC3B;AACA,EAAA,IAAI,UAAU,MAAA,EAAW;AACrB,IAAA,MAAA,CAAO,UAAA,GAAa,YAAY,KAAK,CAAA;AAAA,EACzC;AACA,EAAA,IAAI,YAAY,MAAA,EAAW;AACvB,IAAA,MAAA,CAAO,cAAA,GAAiB,cAAc,OAAO,CAAA;AAAA,EACjD;AACA,EAAA,MAAM,SAAS,KAAA,KAAU,MAAA,GAAY,MAAA,GAAU,CAAC,QAAQ,KAAK,CAAA;AAC7D,EAAA,uBACI,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACI,GAAG,IAAA;AAAA,MACJ,KAAA,EAAO,MAAA;AAAA,MACP,SAAA,EAAW,EAAA;AAAA,QACP,UAAA;AAAA,QACA,QAAQ,MAAA,IAAa,GAAA,KAAQ,CAAA,GAAI,CAAA,IAAA,EAAO,GAAG,CAAA,CAAA,GAAK,MAAA;AAAA,QAChD,KAAA,KAAU,MAAA,GAAY,WAAA,CAAY,KAAK,CAAA,GAAI,MAAA;AAAA,QAC3C,OAAA,KAAY,MAAA,GAAY,aAAA,CAAc,OAAO,CAAA,GAAI,MAAA;AAAA,QACjD;AAAA,OACJ;AAAA,MAEC,6BAAmB,QAAQ;AAAA;AAAA,GAChC;AAER,CAAA,EA3BsB,QAAA","file":"chunk-L6VYDM7S.js","sourcesContent":["import type { ViewProps, ViewStyle } from 'react-native';\nimport { View } from 'react-native';\nimport { cn } from '../../utils/cn';\nimport { wrapStringChildren } from '../../utils/wrap-string-children';\nimport type { StackAlign, StackGap, StackJustify } from '../HStack/HStack';\n\nexport type VStackProps = ViewProps & {\n gap?: StackGap;\n align?: StackAlign;\n justify?: StackJustify;\n className?: string;\n testID?: string;\n};\n\nconst ALIGN_CLASS: Record<StackAlign, string> = {\n start: 'items-start',\n center: 'items-center',\n end: 'items-end',\n stretch: 'items-stretch',\n baseline: 'items-baseline',\n};\n\nconst JUSTIFY_CLASS: Record<StackJustify, string> = {\n start: 'justify-start',\n center: 'justify-center',\n end: 'justify-end',\n between: 'justify-between',\n around: 'justify-around',\n evenly: 'justify-evenly',\n};\n\nconst ALIGN_STYLE: Record<StackAlign, ViewStyle['alignItems']> = {\n start: 'flex-start',\n center: 'center',\n end: 'flex-end',\n stretch: 'stretch',\n baseline: 'baseline',\n};\n\nconst JUSTIFY_STYLE: Record<StackJustify, ViewStyle['justifyContent']> = {\n start: 'flex-start',\n center: 'center',\n end: 'flex-end',\n between: 'space-between',\n around: 'space-around',\n evenly: 'space-evenly',\n};\n\nconst GAP_PX: Record<StackGap, number> = {\n 0: 0,\n 1: 4,\n 2: 8,\n 3: 12,\n 4: 16,\n 5: 20,\n 6: 24,\n 8: 32,\n 10: 40,\n 12: 48,\n};\n\n/**\n * Vertical flex layout primitive. RSC-safe.\n *\n * Layout is driven by inline style; see HStack for the rationale.\n */\nexport const VStack = ({ gap, align, justify, className, children, style, ...rest }: VStackProps) => {\n const inline: ViewStyle = { flexDirection: 'column' };\n if (gap !== undefined && gap !== 0) {\n inline.gap = GAP_PX[gap];\n }\n if (align !== undefined) {\n inline.alignItems = ALIGN_STYLE[align];\n }\n if (justify !== undefined) {\n inline.justifyContent = JUSTIFY_STYLE[justify];\n }\n const merged = style === undefined ? inline : ([inline, style] as ViewStyle[]);\n return (\n <View\n {...rest}\n style={merged}\n className={cn(\n 'flex-col',\n gap !== undefined && gap !== 0 ? `gap-${gap}` : undefined,\n align !== undefined ? ALIGN_CLASS[align] : undefined,\n justify !== undefined ? JUSTIFY_CLASS[justify] : undefined,\n className\n )}\n >\n {wrapStringChildren(children)}\n </View>\n );\n};\n"]}