@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/Accordion/Accordion.tsx"],"names":["RNText"],"mappings":"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","file":"chunk-CCUXO2HN.js","sourcesContent":["'use client';\n\nimport {\n createContext,\n type KeyboardEvent,\n type ReactNode,\n type RefObject,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { LayoutChangeEvent, ViewStyle } from 'react-native';\nimport { Platform, Pressable, Text as RNText, View } from 'react-native';\nimport { AnimatedView } from '../../animation/animated-view';\nimport { useAnimatedNumber } from '../../animation/use-animated-number';\nimport { defaultSemanticIcons } from '../../icons/default-semantic-icons';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\n\nexport type AccordionType = 'single' | 'multiple';\n\ntype SingleProps = {\n /** One-at-a-time mode. */\n type: 'single';\n /** Controlled open value. Pass `null` (with `collapsible`) for \"nothing open\". */\n value?: string | null;\n /** Uncontrolled initial open value. */\n defaultValue?: string;\n /** Fires when the open value changes. Receives the new value (string), or `null` if collapsed. */\n onChange?: (next: string | null) => void;\n /** Allow closing the open item by clicking it again. @defaultValue false */\n collapsible?: boolean;\n};\n\ntype MultipleProps = {\n /** Any combination open. */\n type: 'multiple';\n /** Controlled list of open values. */\n value?: string[];\n /** Uncontrolled initial list of open values. */\n defaultValue?: string[];\n /** Fires when the open list changes. Receives the new list. */\n onChange?: (next: string[]) => void;\n /** No-op in `multiple` mode (items are always individually collapsible). */\n collapsible?: never;\n};\n\ntype CommonProps = {\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\nexport type AccordionProps = (SingleProps | MultipleProps) & CommonProps;\n\ntype AccordionContextValue = {\n baseId: string;\n isOpen: (value: string) => boolean;\n toggle: (value: string) => void;\n register: (value: string, ref: RefObject<HTMLElement | null>) => void;\n unregister: (value: string) => void;\n moveFocus: (offset: 1 | -1, fromValue: string) => void;\n focusEdge: (edge: 'first' | 'last') => void;\n};\n\nconst AccordionContext = createContext<AccordionContextValue | null>(null);\n\nconst useAccordionContext = (label: string): AccordionContextValue => {\n const ctx = useContext(AccordionContext);\n if (!ctx) {\n throw new Error(`<${label}> must be rendered inside an <Accordion>.`);\n }\n return ctx;\n};\n\ntype AccordionItemContextValue = {\n value: string;\n open: boolean;\n disabled: boolean;\n triggerId: string;\n contentId: string;\n};\n\nconst AccordionItemContext = createContext<AccordionItemContextValue | null>(null);\n\nconst useAccordionItemContext = (label: string): AccordionItemContextValue => {\n const ctx = useContext(AccordionItemContext);\n if (!ctx) {\n throw new Error(`<${label}> must be rendered inside an <Accordion.Item>.`);\n }\n return ctx;\n};\n\n/**\n * Vertically stacked, individually expandable sections. Compose:\n *\n * <Accordion type=\"single\" defaultValue=\"overview\" collapsible>\n * <Accordion.Item value=\"overview\">\n * <Accordion.Trigger>Overview</Accordion.Trigger>\n * <Accordion.Content>...</Accordion.Content>\n * </Accordion.Item>\n * </Accordion>\n *\n * Modes:\n * - `single` — at most one item open. Pass `collapsible` to allow closing the\n * open item.\n * - `multiple` — any combination open. `value` / `defaultValue` are arrays.\n *\n * Controlled (`value` + `onChange`) and uncontrolled (`defaultValue`) both\n * supported. Triggers are real `<button>`s with full keyboard nav: ArrowDown /\n * ArrowUp move focus, Home / End jump to first / last, Enter / Space toggle.\n */\nconst AccordionRoot = (props: AccordionProps) => {\n const baseId = useId();\n const refs = useRef<Map<string, RefObject<HTMLElement | null>>>(new Map());\n const orderRef = useRef<string[]>([]);\n\n // Pull out the props we always need; the discriminated union handlers below\n // narrow on `type` for the actual state logic.\n const { type, children, className, testID } = props;\n\n // Single-mode internal state. We always allocate both state slots so the\n // hook order stays stable across re-renders regardless of `type`.\n const [singleInner, setSingleInner] = useState<string | null>(\n type === 'single' ? (props.defaultValue ?? null) : null\n );\n const [multipleInner, setMultipleInner] = useState<string[]>(type === 'multiple' ? (props.defaultValue ?? []) : []);\n\n const singleControlled = type === 'single' && props.value !== undefined;\n const multipleControlled = type === 'multiple' && props.value !== undefined;\n\n const singleCurrent = type === 'single' ? (singleControlled ? (props.value ?? null) : singleInner) : null;\n const multipleCurrent = type === 'multiple' ? (multipleControlled ? (props.value ?? []) : multipleInner) : [];\n\n const isOpen = useCallback(\n (v: string) => {\n if (type === 'single') {\n return singleCurrent === v;\n }\n return multipleCurrent.includes(v);\n },\n [type, singleCurrent, multipleCurrent]\n );\n\n const toggle = useCallback(\n (v: string) => {\n if (type === 'single') {\n const next = singleCurrent === v ? (props.collapsible ? null : singleCurrent) : v;\n if (next === singleCurrent) {\n return;\n }\n if (!singleControlled) {\n setSingleInner(next);\n }\n props.onChange?.(next);\n } else {\n const has = multipleCurrent.includes(v);\n const next = has ? multipleCurrent.filter((x) => x !== v) : [...multipleCurrent, v];\n if (!multipleControlled) {\n setMultipleInner(next);\n }\n props.onChange?.(next);\n }\n },\n // The handler needs the latest snapshot of every prop — `props` is a\n // discriminated union so spreading it into the deps is the cleanest\n // way to keep both branches honest.\n [type, singleCurrent, multipleCurrent, singleControlled, multipleControlled, props]\n );\n\n const register = useCallback((v: string, ref: RefObject<HTMLElement | null>) => {\n refs.current.set(v, ref);\n if (!orderRef.current.includes(v)) {\n orderRef.current.push(v);\n }\n }, []);\n\n const unregister = useCallback((v: string) => {\n refs.current.delete(v);\n orderRef.current = orderRef.current.filter((x) => x !== v);\n }, []);\n\n const moveFocus = useCallback((offset: 1 | -1, fromValue: string) => {\n const order = orderRef.current;\n if (order.length === 0) {\n return;\n }\n const idx = order.indexOf(fromValue);\n const start = idx === -1 ? 0 : idx;\n const len = order.length;\n const next = order[(start + offset + len) % len];\n if (!next) {\n return;\n }\n refs.current.get(next)?.current?.focus?.();\n }, []);\n\n const focusEdge = useCallback((edge: 'first' | 'last') => {\n const order = orderRef.current;\n if (order.length === 0) {\n return;\n }\n const target = edge === 'first' ? order[0] : order[order.length - 1];\n if (!target) {\n return;\n }\n refs.current.get(target)?.current?.focus?.();\n }, []);\n\n const ctxValue = useMemo<AccordionContextValue>(\n () => ({ baseId, isOpen, toggle, register, unregister, moveFocus, focusEdge }),\n [baseId, isOpen, toggle, register, unregister, moveFocus, focusEdge]\n );\n\n return (\n <AccordionContext.Provider value={ctxValue}>\n <View\n {...(testID !== undefined ? { testID } : {})}\n className={cn('flex-col w-full', className)}\n style={{ flexDirection: 'column', width: '100%' }}\n >\n {children}\n </View>\n </AccordionContext.Provider>\n );\n};\n\nexport type AccordionItemProps = {\n /** Stable identifier — links the item to `value` / `defaultValue` on the parent. */\n value: string;\n /** Disable expansion of this item. The trigger remains focusable for nav consistency. */\n disabled?: boolean;\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\nconst ITEM_BASE: ViewStyle = {\n borderBottomWidth: 1,\n flexDirection: 'column',\n};\n\n// Layout-only constants for the trigger / content; theme-driven sizes are\n// merged in inside the component below.\nconst TRIGGER_LAYOUT_BASE: ViewStyle = {\n minHeight: 44, // component-density literal — not from theme\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n};\n\nconst CONTENT_INNER_LAYOUT_BASE: ViewStyle = {\n // Padding values come from theme inside AccordionContent.\n};\n\n/** A single expandable section. Wraps an `Accordion.Trigger` and `Accordion.Content`. */\nexport const AccordionItem = ({ value, disabled = false, children, className, testID }: AccordionItemProps) => {\n const ctx = useAccordionContext('Accordion.Item');\n const colors = useThemeColors();\n const open = ctx.isOpen(value);\n\n const itemCtx = useMemo<AccordionItemContextValue>(\n () => ({\n value,\n open,\n disabled,\n triggerId: `${ctx.baseId}-trigger-${value}`,\n contentId: `${ctx.baseId}-content-${value}`,\n }),\n [value, open, disabled, ctx.baseId]\n );\n\n return (\n <AccordionItemContext.Provider value={itemCtx}>\n <View\n {...(testID !== undefined ? { testID } : {})}\n className={cn('flex-col border-b border-semantic-border-default', className)}\n style={[ITEM_BASE, { borderBottomColor: colors.semantic.border.default }]}\n >\n {children}\n </View>\n </AccordionItemContext.Provider>\n );\n};\n\nexport type AccordionTriggerProps = {\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/**\n * The clickable row that toggles its item open / closed. Renders a real\n * `<button>` (via Pressable) and wires `aria-expanded` + `aria-controls` to\n * the matching `Accordion.Content`.\n */\nexport const AccordionTrigger = ({ children, className, testID }: AccordionTriggerProps) => {\n const ctx = useAccordionContext('Accordion.Trigger');\n const item = useAccordionItemContext('Accordion.Trigger');\n const colors = useThemeColors();\n const ownRef = useRef<HTMLElement | null>(null);\n const triggerStyle: ViewStyle = {\n ...TRIGGER_LAYOUT_BASE,\n paddingHorizontal: px(colors.spacing['4']),\n paddingVertical: px(colors.spacing['3']),\n gap: px(colors.spacing['3']),\n };\n\n useEffect(() => {\n ctx.register(item.value, ownRef);\n return () => ctx.unregister(item.value);\n }, [ctx, item.value]);\n\n const onPress = useCallback(() => {\n if (item.disabled) {\n return;\n }\n ctx.toggle(item.value);\n }, [ctx, item.value, item.disabled]);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLElement>) => {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n ctx.moveFocus(1, item.value);\n return;\n case 'ArrowUp':\n event.preventDefault();\n ctx.moveFocus(-1, item.value);\n return;\n case 'Home':\n event.preventDefault();\n ctx.focusEdge('first');\n return;\n case 'End':\n event.preventDefault();\n ctx.focusEdge('last');\n return;\n case 'Enter':\n case ' ': {\n event.preventDefault();\n if (!item.disabled) {\n ctx.toggle(item.value);\n }\n return;\n }\n }\n },\n [ctx, item.value, item.disabled]\n );\n\n // CSS transition for the chevron rotation on web. On native, RN expects\n // an array of transform objects (`[{ rotate: '180deg' }]`), so we branch\n // by platform to keep both ends rendering correctly. The web branch also\n // adds a CSS transition for a smooth rotation; native snaps (consumers\n // who want a spring can compose their own).\n const chevronStyle =\n Platform.OS === 'web'\n ? ({\n transition: 'transform 200ms ease',\n transform: `rotate(${item.open ? 180 : 0}deg)`,\n } as unknown as ViewStyle)\n : ({ transform: [{ rotate: item.open ? '180deg' : '0deg' }] } as ViewStyle);\n\n const triggerProps: Record<string, unknown> = {\n ref: (node: HTMLElement | null) => {\n ownRef.current = node;\n },\n role: 'button',\n accessibilityRole: 'button',\n 'aria-expanded': item.open,\n 'aria-controls': item.contentId,\n 'aria-disabled': item.disabled || undefined,\n id: item.triggerId,\n // Every trigger sits in the tab order — pressing Tab moves through\n // the accordion sequentially, then arrow keys take over once focused.\n tabIndex: 0,\n onPress,\n onKeyDown: handleKeyDown,\n ...(item.disabled ? { disabled: true } : {}),\n ...(testID !== undefined ? { testID } : {}),\n };\n\n return (\n <Pressable\n {...triggerProps}\n className={cn(\n 'flex-row items-center justify-between gap-3 px-4 py-3 min-h-[44px] hover:bg-semantic-background-subtle',\n item.disabled ? 'opacity-50' : 'opacity-100',\n className\n )}\n style={[triggerStyle, item.disabled ? { opacity: 0.5 } : null]}\n >\n {typeof children === '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 flexShrink: 1,\n }}\n >\n {children}\n </RNText>\n ) : (\n children\n )}\n <View aria-hidden={true} style={chevronStyle}>\n <defaultSemanticIcons.chevronDown size={18} color={colors.semantic.text.muted} />\n </View>\n </Pressable>\n );\n};\n\nexport type AccordionContentProps = {\n children?: ReactNode;\n className?: string;\n testID?: string;\n /**\n * Keep the content mounted even when collapsed. Useful for forms that\n * shouldn't lose state, or content that's expensive to mount.\n * @defaultValue false\n */\n forceMount?: boolean;\n};\n\n// Animation timing — mirrors the Switch slide and the web CSS\n// transition exactly so the accordion feels identical on web and native.\nconst ACCORDION_ANIM_DURATION_MS = 200;\n\n/**\n * The collapsible body. On web it always mounts but slides open / closed\n * via an animated max-height + opacity transition (200ms ease). On native\n * it mounts in a measure-pass on first render to capture the natural\n * content height, then animates `height` + `opacity` via the shared\n * `useAnimatedNumber` primitive (200ms, cubic-bezier(0.16, 1, 0.3, 1) —\n * matches the Switch thumb slide).\n *\n * Implementation note: the web-side height + transition styles are pushed\n * onto the outer wrapper's DOM node via a ref + useEffect rather than\n * through the View's `style` prop. Reason: rn-web's style filter drops\n * keys it doesn't recognise as RN style props (`transition`, `maxHeight`\n * shorthand, etc.), taking the whole fragment with them. Direct DOM\n * mutation bypasses that filter — same trick used by Dialog's backdrop\n * blur.\n */\nexport const AccordionContent = ({\n children,\n className,\n testID,\n forceMount: _forceMount = false,\n}: AccordionContentProps) => {\n const item = useAccordionItemContext('Accordion.Content');\n const colors = useThemeColors();\n const wrapperRef = useRef<HTMLElement | null>(null);\n const innerRef = useRef<HTMLElement | null>(null);\n // Natural (open-state) height of the content, captured on first\n // layout. Re-captured if the layout reports a different size while\n // open (e.g. dynamic content).\n const [measuredHeight, setMeasuredHeight] = useState<number | null>(null);\n const innerStyle: ViewStyle = {\n ...CONTENT_INNER_LAYOUT_BASE,\n paddingHorizontal: px(colors.spacing['4']),\n paddingTop: px(colors.spacing['1']),\n paddingBottom: px(colors.spacing['3']),\n };\n\n // Slide open/close on web. We measure the natural height of the inner\n // content each time the open state flips, then animate the wrapper's\n // maxHeight to/from 0. Setting maxHeight: 'none' after the transition\n // would let the content grow if it later changes — but for the v0\n // accordion we expect static content, so we leave maxHeight at the\n // measured value (good enough; resize observer can come later).\n useEffect(() => {\n if (Platform.OS !== 'web') {\n return;\n }\n const wrapper = wrapperRef.current;\n const inner = innerRef.current;\n if (!wrapper || !inner) {\n return;\n }\n\n // First-render shortcut: skip the animation when an item starts\n // already open (avoids the \"all items open then animate closed\"\n // flash on mount).\n const isFirstPaint = wrapper.dataset.noriPainted !== '1';\n wrapper.dataset.noriPainted = '1';\n\n wrapper.style.overflow = 'hidden';\n wrapper.style.transitionProperty = 'max-height, opacity';\n wrapper.style.transitionDuration = `${ACCORDION_ANIM_DURATION_MS}ms`;\n wrapper.style.transitionTimingFunction = 'cubic-bezier(0.16, 1, 0.3, 1)';\n\n if (item.open) {\n const target = inner.scrollHeight;\n if (isFirstPaint) {\n wrapper.style.maxHeight = `${target}px`;\n wrapper.style.opacity = '1';\n return;\n }\n // Animate from current measured 0px to the target height.\n wrapper.style.maxHeight = '0px';\n wrapper.style.opacity = '0';\n // Force a reflow so the start state actually applies before\n // we set the end state — otherwise the browser collapses\n // both into a single repaint and skips the animation.\n void wrapper.offsetHeight;\n requestAnimationFrame(() => {\n wrapper.style.maxHeight = `${target}px`;\n wrapper.style.opacity = '1';\n });\n } else {\n // Going from open → closed. Set the explicit current height\n // first so we have something to transition FROM (auto/none\n // doesn't transition).\n const current = inner.scrollHeight;\n wrapper.style.maxHeight = `${current}px`;\n wrapper.style.opacity = '1';\n void wrapper.offsetHeight;\n requestAnimationFrame(() => {\n wrapper.style.maxHeight = '0px';\n wrapper.style.opacity = '0';\n });\n }\n }, [item.open]);\n\n // Native height + opacity animation. Driven by `useAnimatedNumber`,\n // which dispatches per-property to a static-key reanimated worklet\n // (the plugin can't serialize closures over computed keys, so each\n // property gets its own static-key useAnimatedStyle inside the hook).\n //\n // Target values are derived from open + measured size. Before\n // measurement we still call the hooks (hook order must stay\n // stable); they animate to/from 0 which becomes a no-op until the\n // first onLayout fires.\n const targetHeight = item.open ? (measuredHeight ?? 0) : 0;\n const targetOpacity = item.open ? 1 : 0;\n const heightAnim = useAnimatedNumber('height', targetHeight, {\n duration: ACCORDION_ANIM_DURATION_MS,\n });\n const opacityAnim = useAnimatedNumber('opacity', targetOpacity, {\n duration: ACCORDION_ANIM_DURATION_MS,\n });\n\n const onInnerLayout = useCallback(\n (e: LayoutChangeEvent) => {\n if (Platform.OS === 'web') {\n return;\n }\n const next = e.nativeEvent.layout.height;\n if (next > 0 && next !== measuredHeight) {\n setMeasuredHeight(next);\n }\n },\n [measuredHeight]\n );\n\n // Native path: always mount the inner so we can measure its natural\n // height once. Before measurement, we render with `position:\n // absolute, opacity: 0` so the layout pass runs off-screen and\n // doesn't affect the surrounding flow (avoids the \"flash of fully-\n // open content\" on first paint of an initially-closed item).\n // After measurement, the outer Animated.View drives height +\n // opacity together.\n if (Platform.OS !== 'web') {\n const animatedWrapperStyle: ViewStyle = {\n overflow: 'hidden',\n };\n // Pre-measurement: render the inner off-screen for one layout\n // pass. The wrapper claims 0 height in the flow so the next\n // sibling is positioned correctly until we know the real size.\n if (measuredHeight === null) {\n return (\n <AnimatedView\n {...(testID !== undefined ? { testID } : {})}\n accessibilityRole=\"none\"\n aria-labelledby={item.triggerId}\n aria-hidden={!item.open}\n style={[animatedWrapperStyle, { height: 0 }]}\n className={cn('overflow-hidden', className)}\n >\n <View\n onLayout={onInnerLayout}\n className={cn('px-4 pt-1 pb-3')}\n // Absolute + left/right:0 stretches the measurement\n // pass to the parent's full width, so wrapping text\n // measures at its REAL natural height. Without\n // left/right, Yoga gives an absolute child width 0\n // and the measurement collapses to a few pixels.\n style={[innerStyle, { position: 'absolute', left: 0, right: 0, opacity: 0 }]}\n >\n {typeof children === 'string' ? (\n <RNText\n style={{\n color: colors.semantic.text.muted,\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n lineHeight: px(colors.fontSize.sm) * Number(colors.lineHeight.normal),\n }}\n >\n {children}\n </RNText>\n ) : (\n children\n )}\n </View>\n </AnimatedView>\n );\n }\n return (\n <AnimatedView\n {...(testID !== undefined ? { testID } : {})}\n accessibilityRole=\"none\"\n aria-labelledby={item.triggerId}\n aria-hidden={!item.open}\n style={[animatedWrapperStyle, heightAnim as object]}\n className={cn('overflow-hidden', className)}\n >\n <AnimatedView style={opacityAnim as object}>\n {/* No `onLayout` on this inner — once we've captured\n the natural height in the measurement pass above,\n re-measuring here during the animation would see\n the CLIPPED height (the parent is mid-transition\n between 0 and the target) and clobber\n `measuredHeight` with that smaller value, freezing\n the open state at one line. Single-shot measurement\n is fine for static content; remeasuring on content\n change is a follow-up. */}\n <View className={cn('px-4 pt-1 pb-3')} style={innerStyle}>\n {typeof children === 'string' ? (\n <RNText\n style={{\n color: colors.semantic.text.muted,\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n lineHeight: px(colors.fontSize.sm) * Number(colors.lineHeight.normal),\n }}\n >\n {children}\n </RNText>\n ) : (\n children\n )}\n </View>\n </AnimatedView>\n </AnimatedView>\n );\n }\n\n return (\n <View\n ref={(node: unknown) => {\n wrapperRef.current = node as HTMLElement | null;\n }}\n {...(testID !== undefined ? { testID } : {})}\n role=\"region\"\n accessibilityRole=\"none\"\n id={item.contentId}\n aria-labelledby={item.triggerId}\n aria-hidden={!item.open}\n className={cn('overflow-hidden', className)}\n >\n <View\n ref={(node: unknown) => {\n innerRef.current = node as HTMLElement | null;\n }}\n className={cn('px-4 pt-1 pb-3')}\n style={innerStyle}\n >\n {typeof children === 'string' ? (\n <RNText\n style={{\n color: colors.semantic.text.muted,\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n lineHeight: px(colors.fontSize.sm) * Number(colors.lineHeight.normal),\n }}\n >\n {children}\n </RNText>\n ) : (\n children\n )}\n </View>\n </View>\n );\n};\n\n/**\n * Public `Accordion` value — the root function plus its `.Item`, `.Trigger`,\n * and `.Content` static members. `Object.assign` produces a value whose\n * inferred type carries the static properties, so `.d.ts` consumers can\n * write `<Accordion.Item>` without a separate import.\n */\nexport const Accordion = Object.assign(AccordionRoot, {\n Item: AccordionItem,\n Trigger: AccordionTrigger,\n Content: AccordionContent,\n});\n"]}
1
+ {"version":3,"sources":["../src/components/Accordion/Accordion.tsx"],"names":["RNText"],"mappings":"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","file":"chunk-V5QSMDZL.js","sourcesContent":["'use client';\n\nimport {\n createContext,\n type KeyboardEvent,\n type ReactNode,\n type RefObject,\n useCallback,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { LayoutChangeEvent, ViewStyle } from 'react-native';\nimport { Platform, Pressable, Text as RNText, View } from 'react-native';\nimport { AnimatedView } from '../../animation/animated-view';\nimport { useAnimatedNumber } from '../../animation/use-animated-number';\nimport { defaultSemanticIcons } from '../../icons/default-semantic-icons';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\n\nexport type AccordionType = 'single' | 'multiple';\n\ntype SingleProps = {\n /** One-at-a-time mode. */\n type: 'single';\n /** Controlled open value. Pass `null` (with `collapsible`) for \"nothing open\". */\n value?: string | null;\n /** Uncontrolled initial open value. */\n defaultValue?: string;\n /** Fires when the open value changes. Receives the new value (string), or `null` if collapsed. */\n onChange?: (next: string | null) => void;\n /** Allow closing the open item by clicking it again. @defaultValue false */\n collapsible?: boolean;\n};\n\ntype MultipleProps = {\n /** Any combination open. */\n type: 'multiple';\n /** Controlled list of open values. */\n value?: string[];\n /** Uncontrolled initial list of open values. */\n defaultValue?: string[];\n /** Fires when the open list changes. Receives the new list. */\n onChange?: (next: string[]) => void;\n /** No-op in `multiple` mode (items are always individually collapsible). */\n collapsible?: never;\n};\n\ntype CommonProps = {\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\nexport type AccordionProps = (SingleProps | MultipleProps) & CommonProps;\n\ntype AccordionContextValue = {\n baseId: string;\n isOpen: (value: string) => boolean;\n toggle: (value: string) => void;\n register: (value: string, ref: RefObject<HTMLElement | null>) => void;\n unregister: (value: string) => void;\n moveFocus: (offset: 1 | -1, fromValue: string) => void;\n focusEdge: (edge: 'first' | 'last') => void;\n};\n\nconst AccordionContext = createContext<AccordionContextValue | null>(null);\n\nconst useAccordionContext = (label: string): AccordionContextValue => {\n const ctx = useContext(AccordionContext);\n if (!ctx) {\n throw new Error(`<${label}> must be rendered inside an <Accordion>.`);\n }\n return ctx;\n};\n\ntype AccordionItemContextValue = {\n value: string;\n open: boolean;\n disabled: boolean;\n triggerId: string;\n contentId: string;\n};\n\nconst AccordionItemContext = createContext<AccordionItemContextValue | null>(null);\n\nconst useAccordionItemContext = (label: string): AccordionItemContextValue => {\n const ctx = useContext(AccordionItemContext);\n if (!ctx) {\n throw new Error(`<${label}> must be rendered inside an <Accordion.Item>.`);\n }\n return ctx;\n};\n\n/**\n * Vertically stacked, individually expandable sections. Compose:\n *\n * <Accordion type=\"single\" defaultValue=\"overview\" collapsible>\n * <Accordion.Item value=\"overview\">\n * <Accordion.Trigger>Overview</Accordion.Trigger>\n * <Accordion.Content>...</Accordion.Content>\n * </Accordion.Item>\n * </Accordion>\n *\n * Modes:\n * - `single` — at most one item open. Pass `collapsible` to allow closing the\n * open item.\n * - `multiple` — any combination open. `value` / `defaultValue` are arrays.\n *\n * Controlled (`value` + `onChange`) and uncontrolled (`defaultValue`) both\n * supported. Triggers are real `<button>`s with full keyboard nav: ArrowDown /\n * ArrowUp move focus, Home / End jump to first / last, Enter / Space toggle.\n */\nconst AccordionRoot = (props: AccordionProps) => {\n const baseId = useId();\n const refs = useRef<Map<string, RefObject<HTMLElement | null>>>(new Map());\n const orderRef = useRef<string[]>([]);\n\n // Pull out the props we always need; the discriminated union handlers below\n // narrow on `type` for the actual state logic.\n const { type, children, className, testID } = props;\n\n // Single-mode internal state. We always allocate both state slots so the\n // hook order stays stable across re-renders regardless of `type`.\n const [singleInner, setSingleInner] = useState<string | null>(\n type === 'single' ? (props.defaultValue ?? null) : null\n );\n const [multipleInner, setMultipleInner] = useState<string[]>(type === 'multiple' ? (props.defaultValue ?? []) : []);\n\n const singleControlled = type === 'single' && props.value !== undefined;\n const multipleControlled = type === 'multiple' && props.value !== undefined;\n\n const singleCurrent = type === 'single' ? (singleControlled ? (props.value ?? null) : singleInner) : null;\n const multipleCurrent = type === 'multiple' ? (multipleControlled ? (props.value ?? []) : multipleInner) : [];\n\n const isOpen = useCallback(\n (v: string) => {\n if (type === 'single') {\n return singleCurrent === v;\n }\n return multipleCurrent.includes(v);\n },\n [type, singleCurrent, multipleCurrent]\n );\n\n const toggle = useCallback(\n (v: string) => {\n if (type === 'single') {\n const next = singleCurrent === v ? (props.collapsible ? null : singleCurrent) : v;\n if (next === singleCurrent) {\n return;\n }\n if (!singleControlled) {\n setSingleInner(next);\n }\n props.onChange?.(next);\n } else {\n const has = multipleCurrent.includes(v);\n const next = has ? multipleCurrent.filter((x) => x !== v) : [...multipleCurrent, v];\n if (!multipleControlled) {\n setMultipleInner(next);\n }\n props.onChange?.(next);\n }\n },\n // The handler needs the latest snapshot of every prop — `props` is a\n // discriminated union so spreading it into the deps is the cleanest\n // way to keep both branches honest.\n [type, singleCurrent, multipleCurrent, singleControlled, multipleControlled, props]\n );\n\n const register = useCallback((v: string, ref: RefObject<HTMLElement | null>) => {\n refs.current.set(v, ref);\n if (!orderRef.current.includes(v)) {\n orderRef.current.push(v);\n }\n }, []);\n\n const unregister = useCallback((v: string) => {\n refs.current.delete(v);\n orderRef.current = orderRef.current.filter((x) => x !== v);\n }, []);\n\n const moveFocus = useCallback((offset: 1 | -1, fromValue: string) => {\n const order = orderRef.current;\n if (order.length === 0) {\n return;\n }\n const idx = order.indexOf(fromValue);\n const start = idx === -1 ? 0 : idx;\n const len = order.length;\n const next = order[(start + offset + len) % len];\n if (!next) {\n return;\n }\n refs.current.get(next)?.current?.focus?.();\n }, []);\n\n const focusEdge = useCallback((edge: 'first' | 'last') => {\n const order = orderRef.current;\n if (order.length === 0) {\n return;\n }\n const target = edge === 'first' ? order[0] : order[order.length - 1];\n if (!target) {\n return;\n }\n refs.current.get(target)?.current?.focus?.();\n }, []);\n\n const ctxValue = useMemo<AccordionContextValue>(\n () => ({ baseId, isOpen, toggle, register, unregister, moveFocus, focusEdge }),\n [baseId, isOpen, toggle, register, unregister, moveFocus, focusEdge]\n );\n\n return (\n <AccordionContext.Provider value={ctxValue}>\n <View\n {...(testID !== undefined ? { testID } : {})}\n className={cn('flex-col w-full', className)}\n style={{ flexDirection: 'column', width: '100%' }}\n >\n {children}\n </View>\n </AccordionContext.Provider>\n );\n};\n\nexport type AccordionItemProps = {\n /** Stable identifier — links the item to `value` / `defaultValue` on the parent. */\n value: string;\n /** Disable expansion of this item. The trigger remains focusable for nav consistency. */\n disabled?: boolean;\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\nconst ITEM_BASE: ViewStyle = {\n borderBottomWidth: 1,\n flexDirection: 'column',\n};\n\n// Layout-only constants for the trigger / content; theme-driven sizes are\n// merged in inside the component below.\nconst TRIGGER_LAYOUT_BASE: ViewStyle = {\n minHeight: 44, // component-density literal — not from theme\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n};\n\nconst CONTENT_INNER_LAYOUT_BASE: ViewStyle = {\n // Padding values come from theme inside AccordionContent.\n};\n\n/** A single expandable section. Wraps an `Accordion.Trigger` and `Accordion.Content`. */\nexport const AccordionItem = ({ value, disabled = false, children, className, testID }: AccordionItemProps) => {\n const ctx = useAccordionContext('Accordion.Item');\n const colors = useThemeColors();\n const open = ctx.isOpen(value);\n\n const itemCtx = useMemo<AccordionItemContextValue>(\n () => ({\n value,\n open,\n disabled,\n triggerId: `${ctx.baseId}-trigger-${value}`,\n contentId: `${ctx.baseId}-content-${value}`,\n }),\n [value, open, disabled, ctx.baseId]\n );\n\n return (\n <AccordionItemContext.Provider value={itemCtx}>\n <View\n {...(testID !== undefined ? { testID } : {})}\n className={cn('flex-col border-b border-semantic-border-default', className)}\n style={[ITEM_BASE, { borderBottomColor: colors.semantic.border.default }]}\n >\n {children}\n </View>\n </AccordionItemContext.Provider>\n );\n};\n\nexport type AccordionTriggerProps = {\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/**\n * The clickable row that toggles its item open / closed. Renders a real\n * `<button>` (via Pressable) and wires `aria-expanded` + `aria-controls` to\n * the matching `Accordion.Content`.\n */\nexport const AccordionTrigger = ({ children, className, testID }: AccordionTriggerProps) => {\n const ctx = useAccordionContext('Accordion.Trigger');\n const item = useAccordionItemContext('Accordion.Trigger');\n const colors = useThemeColors();\n const ownRef = useRef<HTMLElement | null>(null);\n const triggerStyle: ViewStyle = {\n ...TRIGGER_LAYOUT_BASE,\n paddingHorizontal: px(colors.spacing['4']),\n paddingVertical: px(colors.spacing['3']),\n gap: px(colors.spacing['3']),\n };\n\n useEffect(() => {\n ctx.register(item.value, ownRef);\n return () => ctx.unregister(item.value);\n }, [ctx, item.value]);\n\n const onPress = useCallback(() => {\n if (item.disabled) {\n return;\n }\n ctx.toggle(item.value);\n }, [ctx, item.value, item.disabled]);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLElement>) => {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n ctx.moveFocus(1, item.value);\n return;\n case 'ArrowUp':\n event.preventDefault();\n ctx.moveFocus(-1, item.value);\n return;\n case 'Home':\n event.preventDefault();\n ctx.focusEdge('first');\n return;\n case 'End':\n event.preventDefault();\n ctx.focusEdge('last');\n return;\n case 'Enter':\n case ' ': {\n event.preventDefault();\n if (!item.disabled) {\n ctx.toggle(item.value);\n }\n return;\n }\n }\n },\n [ctx, item.value, item.disabled]\n );\n\n // CSS transition for the chevron rotation on web. On native, RN expects\n // an array of transform objects (`[{ rotate: '180deg' }]`), so we branch\n // by platform to keep both ends rendering correctly. The web branch also\n // adds a CSS transition for a smooth rotation; native snaps (consumers\n // who want a spring can compose their own).\n const chevronStyle =\n Platform.OS === 'web'\n ? ({\n transition: 'transform 200ms ease',\n transform: `rotate(${item.open ? 180 : 0}deg)`,\n } as unknown as ViewStyle)\n : ({ transform: [{ rotate: item.open ? '180deg' : '0deg' }] } as ViewStyle);\n\n const triggerProps: Record<string, unknown> = {\n ref: (node: HTMLElement | null) => {\n ownRef.current = node;\n },\n role: 'button',\n accessibilityRole: 'button',\n 'aria-expanded': item.open,\n 'aria-controls': item.contentId,\n 'aria-disabled': item.disabled || undefined,\n id: item.triggerId,\n // Every trigger sits in the tab order — pressing Tab moves through\n // the accordion sequentially, then arrow keys take over once focused.\n tabIndex: 0,\n onPress,\n onKeyDown: handleKeyDown,\n ...(item.disabled ? { disabled: true } : {}),\n ...(testID !== undefined ? { testID } : {}),\n };\n\n return (\n <Pressable\n {...triggerProps}\n className={cn(\n 'flex-row items-center justify-between gap-3 px-4 py-3 min-h-[44px] hover:bg-semantic-background-subtle',\n item.disabled ? 'opacity-50' : 'opacity-100',\n className\n )}\n style={[triggerStyle, item.disabled ? { opacity: 0.5 } : null]}\n >\n {typeof children === '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 flexShrink: 1,\n }}\n >\n {children}\n </RNText>\n ) : (\n children\n )}\n <View aria-hidden={true} style={chevronStyle}>\n <defaultSemanticIcons.chevronDown size={18} color={colors.semantic.text.muted} />\n </View>\n </Pressable>\n );\n};\n\nexport type AccordionContentProps = {\n children?: ReactNode;\n className?: string;\n testID?: string;\n /**\n * Keep the content mounted even when collapsed. Useful for forms that\n * shouldn't lose state, or content that's expensive to mount.\n * @defaultValue false\n */\n forceMount?: boolean;\n};\n\n// Animation timing — mirrors the Switch slide and the web CSS\n// transition exactly so the accordion feels identical on web and native.\nconst ACCORDION_ANIM_DURATION_MS = 200;\n\n/**\n * The collapsible body. On web it always mounts but slides open / closed\n * via an animated max-height + opacity transition (200ms ease). On native\n * it mounts in a measure-pass on first render to capture the natural\n * content height, then animates `height` + `opacity` via the shared\n * `useAnimatedNumber` primitive (200ms, cubic-bezier(0.16, 1, 0.3, 1) —\n * matches the Switch thumb slide).\n *\n * Implementation note: the web-side height + transition styles are pushed\n * onto the outer wrapper's DOM node via a ref + useEffect rather than\n * through the View's `style` prop. Reason: rn-web's style filter drops\n * keys it doesn't recognise as RN style props (`transition`, `maxHeight`\n * shorthand, etc.), taking the whole fragment with them. Direct DOM\n * mutation bypasses that filter — same trick used by Dialog's backdrop\n * blur.\n */\nexport const AccordionContent = ({\n children,\n className,\n testID,\n forceMount: _forceMount = false,\n}: AccordionContentProps) => {\n const item = useAccordionItemContext('Accordion.Content');\n const colors = useThemeColors();\n const wrapperRef = useRef<HTMLElement | null>(null);\n const innerRef = useRef<HTMLElement | null>(null);\n // Natural (open-state) height of the content, captured on first\n // layout. Re-captured if the layout reports a different size while\n // open (e.g. dynamic content).\n const [measuredHeight, setMeasuredHeight] = useState<number | null>(null);\n const innerStyle: ViewStyle = {\n ...CONTENT_INNER_LAYOUT_BASE,\n paddingHorizontal: px(colors.spacing['4']),\n paddingTop: px(colors.spacing['1']),\n paddingBottom: px(colors.spacing['3']),\n };\n\n // Slide open/close on web. We measure the natural height of the inner\n // content each time the open state flips, then animate the wrapper's\n // maxHeight to/from 0. Setting maxHeight: 'none' after the transition\n // would let the content grow if it later changes — but for the v0\n // accordion we expect static content, so we leave maxHeight at the\n // measured value (good enough; resize observer can come later).\n useEffect(() => {\n if (Platform.OS !== 'web') {\n return;\n }\n const wrapper = wrapperRef.current;\n const inner = innerRef.current;\n if (!wrapper || !inner) {\n return;\n }\n\n // First-render shortcut: skip the animation when an item starts\n // already open (avoids the \"all items open then animate closed\"\n // flash on mount).\n const isFirstPaint = wrapper.dataset.noriPainted !== '1';\n wrapper.dataset.noriPainted = '1';\n\n wrapper.style.overflow = 'hidden';\n wrapper.style.transitionProperty = 'max-height, opacity';\n wrapper.style.transitionDuration = `${ACCORDION_ANIM_DURATION_MS}ms`;\n wrapper.style.transitionTimingFunction = 'cubic-bezier(0.16, 1, 0.3, 1)';\n\n if (item.open) {\n const target = inner.scrollHeight;\n if (isFirstPaint) {\n wrapper.style.maxHeight = `${target}px`;\n wrapper.style.opacity = '1';\n return;\n }\n // Animate from current measured 0px to the target height.\n wrapper.style.maxHeight = '0px';\n wrapper.style.opacity = '0';\n // Force a reflow so the start state actually applies before\n // we set the end state — otherwise the browser collapses\n // both into a single repaint and skips the animation.\n void wrapper.offsetHeight;\n requestAnimationFrame(() => {\n wrapper.style.maxHeight = `${target}px`;\n wrapper.style.opacity = '1';\n });\n } else {\n // Going from open → closed. Set the explicit current height\n // first so we have something to transition FROM (auto/none\n // doesn't transition).\n const current = inner.scrollHeight;\n wrapper.style.maxHeight = `${current}px`;\n wrapper.style.opacity = '1';\n void wrapper.offsetHeight;\n requestAnimationFrame(() => {\n wrapper.style.maxHeight = '0px';\n wrapper.style.opacity = '0';\n });\n }\n }, [item.open]);\n\n // Native height + opacity animation. Driven by `useAnimatedNumber`,\n // which dispatches per-property to a static-key reanimated worklet\n // (the plugin can't serialize closures over computed keys, so each\n // property gets its own static-key useAnimatedStyle inside the hook).\n //\n // Target values are derived from open + measured size. Before\n // measurement we still call the hooks (hook order must stay\n // stable); they animate to/from 0 which becomes a no-op until the\n // first onLayout fires.\n const targetHeight = item.open ? (measuredHeight ?? 0) : 0;\n const targetOpacity = item.open ? 1 : 0;\n const heightAnim = useAnimatedNumber('height', targetHeight, {\n duration: ACCORDION_ANIM_DURATION_MS,\n });\n const opacityAnim = useAnimatedNumber('opacity', targetOpacity, {\n duration: ACCORDION_ANIM_DURATION_MS,\n });\n\n const onInnerLayout = useCallback(\n (e: LayoutChangeEvent) => {\n if (Platform.OS === 'web') {\n return;\n }\n const next = e.nativeEvent.layout.height;\n if (next > 0 && next !== measuredHeight) {\n setMeasuredHeight(next);\n }\n },\n [measuredHeight]\n );\n\n // Native path: always mount the inner so we can measure its natural\n // height once. Before measurement, we render with `position:\n // absolute, opacity: 0` so the layout pass runs off-screen and\n // doesn't affect the surrounding flow (avoids the \"flash of fully-\n // open content\" on first paint of an initially-closed item).\n // After measurement, the outer Animated.View drives height +\n // opacity together.\n if (Platform.OS !== 'web') {\n const animatedWrapperStyle: ViewStyle = {\n overflow: 'hidden',\n };\n // Pre-measurement: render the inner off-screen for one layout\n // pass. The wrapper claims 0 height in the flow so the next\n // sibling is positioned correctly until we know the real size.\n if (measuredHeight === null) {\n return (\n <AnimatedView\n {...(testID !== undefined ? { testID } : {})}\n accessibilityRole=\"none\"\n aria-labelledby={item.triggerId}\n aria-hidden={!item.open}\n style={[animatedWrapperStyle, { height: 0 }]}\n className={cn('overflow-hidden', className)}\n >\n <View\n onLayout={onInnerLayout}\n className={cn('px-4 pt-1 pb-3')}\n // Absolute + left/right:0 stretches the measurement\n // pass to the parent's full width, so wrapping text\n // measures at its REAL natural height. Without\n // left/right, Yoga gives an absolute child width 0\n // and the measurement collapses to a few pixels.\n style={[innerStyle, { position: 'absolute', left: 0, right: 0, opacity: 0 }]}\n >\n {typeof children === 'string' ? (\n <RNText\n style={{\n color: colors.semantic.text.muted,\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n lineHeight: px(colors.fontSize.sm) * Number(colors.lineHeight.normal),\n }}\n >\n {children}\n </RNText>\n ) : (\n children\n )}\n </View>\n </AnimatedView>\n );\n }\n return (\n <AnimatedView\n {...(testID !== undefined ? { testID } : {})}\n accessibilityRole=\"none\"\n aria-labelledby={item.triggerId}\n aria-hidden={!item.open}\n style={[animatedWrapperStyle, heightAnim as object]}\n className={cn('overflow-hidden', className)}\n >\n <AnimatedView style={opacityAnim as object}>\n {/* No `onLayout` on this inner — once we've captured\n the natural height in the measurement pass above,\n re-measuring here during the animation would see\n the CLIPPED height (the parent is mid-transition\n between 0 and the target) and clobber\n `measuredHeight` with that smaller value, freezing\n the open state at one line. Single-shot measurement\n is fine for static content; remeasuring on content\n change is a follow-up. */}\n <View className={cn('px-4 pt-1 pb-3')} style={innerStyle}>\n {typeof children === 'string' ? (\n <RNText\n style={{\n color: colors.semantic.text.muted,\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n lineHeight: px(colors.fontSize.sm) * Number(colors.lineHeight.normal),\n }}\n >\n {children}\n </RNText>\n ) : (\n children\n )}\n </View>\n </AnimatedView>\n </AnimatedView>\n );\n }\n\n return (\n <View\n ref={(node: unknown) => {\n wrapperRef.current = node as HTMLElement | null;\n }}\n {...(testID !== undefined ? { testID } : {})}\n role=\"region\"\n accessibilityRole=\"none\"\n id={item.contentId}\n aria-labelledby={item.triggerId}\n aria-hidden={!item.open}\n className={cn('overflow-hidden', className)}\n >\n <View\n ref={(node: unknown) => {\n innerRef.current = node as HTMLElement | null;\n }}\n className={cn('px-4 pt-1 pb-3')}\n style={innerStyle}\n >\n {typeof children === 'string' ? (\n <RNText\n style={{\n color: colors.semantic.text.muted,\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n lineHeight: px(colors.fontSize.sm) * Number(colors.lineHeight.normal),\n }}\n >\n {children}\n </RNText>\n ) : (\n children\n )}\n </View>\n </View>\n );\n};\n\n/**\n * Public `Accordion` value — the root function plus its `.Item`, `.Trigger`,\n * and `.Content` static members. `Object.assign` produces a value whose\n * inferred type carries the static properties, so `.d.ts` consumers can\n * write `<Accordion.Item>` without a separate import.\n */\nexport const Accordion = Object.assign(AccordionRoot, {\n Item: AccordionItem,\n Trigger: AccordionTrigger,\n Content: AccordionContent,\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 { useRef } from 'react';
6
6
  import { View, TextInput as TextInput$1 } from 'react-native';
@@ -100,5 +100,5 @@ var TextInput = /* @__PURE__ */ __name(({
100
100
  }, "TextInput");
101
101
 
102
102
  export { TextInput };
103
- //# sourceMappingURL=chunk-NF7XG2FG.js.map
104
- //# sourceMappingURL=chunk-NF7XG2FG.js.map
103
+ //# sourceMappingURL=chunk-V75O7QQO.js.map
104
+ //# sourceMappingURL=chunk-V75O7QQO.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/TextInput/TextInput.tsx"],"names":["RNTextInput"],"mappings":"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","file":"chunk-NF7XG2FG.js","sourcesContent":["'use client';\n\nimport type { ReactNode } from 'react';\nimport { useRef } from 'react';\nimport type { TextInputProps as RNTextInputProps, TextStyle, ViewStyle } from 'react-native';\nimport { TextInput as RNTextInput, View } from 'react-native';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\n\nexport type TextInputProps = Omit<RNTextInputProps, 'editable'> & {\n disabled?: boolean;\n leading?: ReactNode;\n trailing?: ReactNode;\n /** Pass through a custom wrapper className */\n containerClassName?: string;\n className?: string;\n testID?: string;\n id?: string;\n name?: string;\n /** Controlled text handler. Optional so uncontrolled usage works too. */\n onChangeText?: (text: string) => void;\n /** Multi-line mode — flipped by TextArea. Default false. */\n multiline?: boolean;\n numberOfLines?: number;\n};\n\n// Layout-only bases; theme-driven dimensions are merged inside the component.\nconst FIELD_LAYOUT_BASE: ViewStyle = {\n flexDirection: 'row',\n alignItems: 'center',\n borderWidth: 1,\n // Clip the textarea's browser-drawn resize grippy inside the rounded\n // border. Without this, the grippy escapes the corner and looks like\n // it belongs to the page, not the input.\n overflow: 'hidden',\n};\n\n/**\n * Single-line text input with leading/trailing slots.\n *\n * Wrap in <Field> + <Field.Control> to get label, description, error, and\n * full a11y wiring (aria-labelledby, aria-describedby, aria-invalid).\n *\n * Color flips with the active scheme — the field surface, border, and\n * placeholder all read from the resolved palette via `useThemeColors`.\n */\nexport const TextInput = ({\n disabled,\n leading,\n trailing,\n containerClassName,\n className,\n testID,\n id,\n name,\n onChangeText,\n multiline,\n numberOfLines,\n ...rest\n}: TextInputProps) => {\n const colors = useThemeColors();\n const inputRef = useRef<RNTextInput | null>(null);\n\n const restAny = rest as Record<string, unknown>;\n const hasError = restAny['aria-invalid'] === true || restAny['aria-invalid'] === 'true';\n\n const inputExtras: Record<string, unknown> = {};\n if (testID !== undefined) {\n inputExtras.testID = testID;\n }\n if (id !== undefined) {\n inputExtras.id = id;\n inputExtras.nativeID = id;\n }\n if (name !== undefined) {\n inputExtras.name = name;\n }\n if (multiline !== undefined) {\n inputExtras.multiline = multiline;\n }\n if (numberOfLines !== undefined) {\n inputExtras.numberOfLines = numberOfLines;\n }\n if (onChangeText !== undefined) {\n inputExtras.onChangeText = onChangeText;\n }\n\n const inputStyle: TextStyle = {\n flex: 1,\n paddingVertical: px(colors.spacing['2']),\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.md),\n color: colors.semantic.text.default,\n };\n\n const fieldStyle = [\n FIELD_LAYOUT_BASE,\n {\n borderRadius: px(colors.radius.md),\n paddingHorizontal: px(colors.spacing['3']),\n backgroundColor: colors.semantic.background.elevated,\n borderColor: hasError ? colors.color.danger : colors.semantic.border.default,\n },\n disabled ? { opacity: 0.6 } : null,\n ];\n\n return (\n <View className={cn(containerClassName)} style={{ flexDirection: 'column' }}>\n <View\n className={cn(\n 'flex-row items-center rounded-md border px-3',\n hasError ? 'border-semantic-interactive-destructive' : 'border-semantic-border-default',\n disabled ? 'opacity-60' : undefined\n )}\n style={fieldStyle}\n >\n {leading ? (\n <View className=\"mr-2\" style={{ marginRight: px(colors.spacing['2']) }}>\n {leading}\n </View>\n ) : null}\n <RNTextInput\n ref={inputRef}\n editable={!disabled}\n className={cn('flex-1 py-2 text-md text-semantic-text-default outline-none', className)}\n placeholderTextColor={colors.semantic.text.muted}\n {...inputExtras}\n {...rest}\n // Spread `rest` first so callers can extend the input style without\n // losing inputStyle — RN merges array styles in order, last wins.\n style={[inputStyle, rest.style]}\n />\n {trailing ? (\n <View className=\"ml-2\" style={{ marginLeft: px(colors.spacing['2']) }}>\n {trailing}\n </View>\n ) : null}\n </View>\n </View>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/components/TextInput/TextInput.tsx"],"names":["RNTextInput"],"mappings":"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","file":"chunk-V75O7QQO.js","sourcesContent":["'use client';\n\nimport type { ReactNode } from 'react';\nimport { useRef } from 'react';\nimport type { TextInputProps as RNTextInputProps, TextStyle, ViewStyle } from 'react-native';\nimport { TextInput as RNTextInput, View } from 'react-native';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\n\nexport type TextInputProps = Omit<RNTextInputProps, 'editable'> & {\n disabled?: boolean;\n leading?: ReactNode;\n trailing?: ReactNode;\n /** Pass through a custom wrapper className */\n containerClassName?: string;\n className?: string;\n testID?: string;\n id?: string;\n name?: string;\n /** Controlled text handler. Optional so uncontrolled usage works too. */\n onChangeText?: (text: string) => void;\n /** Multi-line mode — flipped by TextArea. Default false. */\n multiline?: boolean;\n numberOfLines?: number;\n};\n\n// Layout-only bases; theme-driven dimensions are merged inside the component.\nconst FIELD_LAYOUT_BASE: ViewStyle = {\n flexDirection: 'row',\n alignItems: 'center',\n borderWidth: 1,\n // Clip the textarea's browser-drawn resize grippy inside the rounded\n // border. Without this, the grippy escapes the corner and looks like\n // it belongs to the page, not the input.\n overflow: 'hidden',\n};\n\n/**\n * Single-line text input with leading/trailing slots.\n *\n * Wrap in <Field> + <Field.Control> to get label, description, error, and\n * full a11y wiring (aria-labelledby, aria-describedby, aria-invalid).\n *\n * Color flips with the active scheme — the field surface, border, and\n * placeholder all read from the resolved palette via `useThemeColors`.\n */\nexport const TextInput = ({\n disabled,\n leading,\n trailing,\n containerClassName,\n className,\n testID,\n id,\n name,\n onChangeText,\n multiline,\n numberOfLines,\n ...rest\n}: TextInputProps) => {\n const colors = useThemeColors();\n const inputRef = useRef<RNTextInput | null>(null);\n\n const restAny = rest as Record<string, unknown>;\n const hasError = restAny['aria-invalid'] === true || restAny['aria-invalid'] === 'true';\n\n const inputExtras: Record<string, unknown> = {};\n if (testID !== undefined) {\n inputExtras.testID = testID;\n }\n if (id !== undefined) {\n inputExtras.id = id;\n inputExtras.nativeID = id;\n }\n if (name !== undefined) {\n inputExtras.name = name;\n }\n if (multiline !== undefined) {\n inputExtras.multiline = multiline;\n }\n if (numberOfLines !== undefined) {\n inputExtras.numberOfLines = numberOfLines;\n }\n if (onChangeText !== undefined) {\n inputExtras.onChangeText = onChangeText;\n }\n\n const inputStyle: TextStyle = {\n flex: 1,\n paddingVertical: px(colors.spacing['2']),\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.md),\n color: colors.semantic.text.default,\n };\n\n const fieldStyle = [\n FIELD_LAYOUT_BASE,\n {\n borderRadius: px(colors.radius.md),\n paddingHorizontal: px(colors.spacing['3']),\n backgroundColor: colors.semantic.background.elevated,\n borderColor: hasError ? colors.color.danger : colors.semantic.border.default,\n },\n disabled ? { opacity: 0.6 } : null,\n ];\n\n return (\n <View className={cn(containerClassName)} style={{ flexDirection: 'column' }}>\n <View\n className={cn(\n 'flex-row items-center rounded-md border px-3',\n hasError ? 'border-semantic-interactive-destructive' : 'border-semantic-border-default',\n disabled ? 'opacity-60' : undefined\n )}\n style={fieldStyle}\n >\n {leading ? (\n <View className=\"mr-2\" style={{ marginRight: px(colors.spacing['2']) }}>\n {leading}\n </View>\n ) : null}\n <RNTextInput\n ref={inputRef}\n editable={!disabled}\n className={cn('flex-1 py-2 text-md text-semantic-text-default outline-none', className)}\n placeholderTextColor={colors.semantic.text.muted}\n {...inputExtras}\n {...rest}\n // Spread `rest` first so callers can extend the input style without\n // losing inputStyle — RN merges array styles in order, last wins.\n style={[inputStyle, rest.style]}\n />\n {trailing ? (\n <View className=\"ml-2\" style={{ marginLeft: px(colors.spacing['2']) }}>\n {trailing}\n </View>\n ) : null}\n </View>\n </View>\n );\n};\n"]}
@@ -1,7 +1,7 @@
1
1
  import { Slot } from './chunk-ZIBNLXIV.js';
2
2
  import { px } from './chunk-5A2QOOVN.js';
3
- import { cn } from './chunk-CHXHRJNZ.js';
4
3
  import { useThemeColors } from './chunk-R5JMDDCB.js';
4
+ import { cn } from './chunk-CHXHRJNZ.js';
5
5
  import { __name } from './chunk-WCQVDF3K.js';
6
6
  import { createContext, useState, useCallback, useRef, useEffect, useId, isValidElement, useContext } from 'react';
7
7
  import { Text, Platform, View, Pressable } from 'react-native';
@@ -406,5 +406,5 @@ var Tooltip = Object.assign(TooltipRoot, {
406
406
  });
407
407
 
408
408
  export { Tooltip };
409
- //# sourceMappingURL=chunk-NRYWNOG5.js.map
410
- //# sourceMappingURL=chunk-NRYWNOG5.js.map
409
+ //# sourceMappingURL=chunk-VL2WNGPF.js.map
410
+ //# sourceMappingURL=chunk-VL2WNGPF.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Tooltip/Tooltip.tsx"],"names":["RNText"],"mappings":"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","file":"chunk-NRYWNOG5.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 { 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 TooltipSide = 'top' | 'right' | 'bottom' | 'left';\nexport type TooltipAlign = 'start' | 'center' | 'end';\n\ntype TriggerRect = { top: number; left: number; width: number; height: number };\n\ntype TooltipContextValue = {\n open: boolean;\n setOpen: (next: boolean) => void;\n /** Open after `delayMs` if still hovered/focused. */\n requestOpen: () => void;\n /** Close after `closeDelayMs`; cancellable. */\n requestClose: () => void;\n /** Cancel any pending open/close timers (e.g. when re-entering). */\n cancelTimers: () => void;\n contentId: string;\n triggerRef: { current: HTMLElement | null };\n contentRef: { current: HTMLDivElement | null };\n triggerRect: TriggerRect | null;\n measureTrigger: () => void;\n};\n\nconst TooltipContext = createContext<TooltipContextValue | null>(null);\n\nconst useTooltipContext = (label: string): TooltipContextValue => {\n const ctx = useContext(TooltipContext);\n if (!ctx) {\n throw new Error(`<${label}> must be rendered inside a <Tooltip>.`);\n }\n return ctx;\n};\n\nconst DEFAULT_OPEN_DELAY_MS = 500;\nconst DEFAULT_CLOSE_DELAY_MS = 0;\n/** Long-press duration on native — matches platform defaults (iOS ~500ms). */\nconst LONG_PRESS_MS = 500;\n\nexport type TooltipProps = {\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 /**\n * Delay before the tooltip opens after hover/focus.\n * @defaultValue 500\n */\n delayMs?: number;\n /**\n * Delay before the tooltip closes after hover-out / blur. Useful for\n * giving users time to move into the tooltip if it ever becomes\n * interactive (it shouldn't — use Popover for that — but the knob is\n * here so the API matches Radix).\n * @defaultValue 0\n */\n closeDelayMs?: number;\n children?: ReactNode;\n};\n\n/**\n * Small floating label triggered by hover (web) or long-press (native).\n * Use for short contextual hints — most often on icon-only buttons. NOT\n * for rich interactive content; reach for `Popover` when the surface\n * needs to hold buttons, inputs, or links.\n *\n * Composition: `Tooltip` (root, owns open state and timers),\n * `TooltipTrigger` (forwards events to its child via Slot when\n * `asChild`), `TooltipContent` (the floating label).\n *\n * Accessibility: the trigger gets `aria-describedby` pointing at the\n * content id — tooltips augment the trigger's accessible name, they do\n * NOT replace it. The icon-only button still needs an `aria-label`.\n *\n * Behavior:\n * - Open on hover (web mouseover) or focus, after `delayMs`.\n * - Close on hover-out, blur, or Escape.\n * - Native: long-press the trigger (500ms) to reveal; tap-anywhere or\n * re-press to dismiss.\n *\n * Cross-platform: web renders the content inline with `position: fixed`\n * + a measured trigger rect so it escapes any ancestor `overflow:\n * hidden`. Native renders inline with `position: absolute` — the parent\n * needs to allow overflow for the chip to peek out.\n */\nconst TooltipRoot = ({\n open,\n defaultOpen = false,\n onOpenChange,\n delayMs = DEFAULT_OPEN_DELAY_MS,\n closeDelayMs = DEFAULT_CLOSE_DELAY_MS,\n children,\n}: TooltipProps) => {\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 // Open / close timers. Both are cleared on unmount and on every new\n // request — so rapid hover-in / hover-out doesn't leave a stale timer\n // about to flip state after the user has moved on.\n const openTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const closeTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const cancelTimers = useCallback(() => {\n if (openTimer.current) {\n clearTimeout(openTimer.current);\n openTimer.current = null;\n }\n if (closeTimer.current) {\n clearTimeout(closeTimer.current);\n closeTimer.current = null;\n }\n }, []);\n\n const requestOpen = useCallback(() => {\n if (closeTimer.current) {\n clearTimeout(closeTimer.current);\n closeTimer.current = null;\n }\n if (openTimer.current) {\n return;\n }\n if (delayMs <= 0) {\n setOpen(true);\n return;\n }\n openTimer.current = setTimeout(() => {\n openTimer.current = null;\n setOpen(true);\n }, delayMs);\n }, [delayMs, setOpen]);\n\n const requestClose = useCallback(() => {\n if (openTimer.current) {\n clearTimeout(openTimer.current);\n openTimer.current = null;\n }\n if (closeTimer.current) {\n return;\n }\n if (closeDelayMs <= 0) {\n setOpen(false);\n return;\n }\n closeTimer.current = setTimeout(() => {\n closeTimer.current = null;\n setOpen(false);\n }, closeDelayMs);\n }, [closeDelayMs, setOpen]);\n\n useEffect(() => () => cancelTimers(), [cancelTimers]);\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 tooltip 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: TooltipContextValue = {\n open: current,\n setOpen,\n requestOpen,\n requestClose,\n cancelTimers,\n contentId: `${baseId}-content`,\n triggerRef,\n contentRef,\n triggerRect,\n measureTrigger,\n };\n\n return <TooltipContext.Provider value={ctxValue}>{children}</TooltipContext.Provider>;\n};\n\nexport type TooltipTriggerProps = {\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 reveals the tooltip. Uses `asChild` by default so any\n * element (Button, IconButton, custom Pressable) becomes the trigger.\n *\n * Wires `aria-describedby` to the content's id — assistive tech reads\n * the tooltip text in addition to the trigger's own accessible name.\n *\n * Web: opens on `mouseEnter` and `focus`; closes on `mouseLeave` and\n * `blur`, both honoring the configured delays. Native: opens on\n * `onLongPress` (500ms hold) and closes on the next press anywhere.\n */\nexport const TooltipTrigger = ({ asChild = true, children, className, testID }: TooltipTriggerProps) => {\n const ctx = useTooltipContext('TooltipTrigger');\n\n const handleMouseEnter = useCallback(() => {\n ctx.measureTrigger();\n ctx.requestOpen();\n }, [ctx]);\n const handleMouseLeave = useCallback(() => {\n ctx.requestClose();\n }, [ctx]);\n const handleFocus = useCallback(() => {\n ctx.measureTrigger();\n ctx.requestOpen();\n }, [ctx]);\n const handleBlur = useCallback(() => {\n ctx.requestClose();\n }, [ctx]);\n const handleLongPress = useCallback(() => {\n ctx.measureTrigger();\n ctx.setOpen(true);\n }, [ctx]);\n const handlePress = useCallback(() => {\n // Native: tap (after a long-press has revealed it) dismisses.\n if (Platform.OS !== 'web' && ctx.open) {\n ctx.setOpen(false);\n }\n }, [ctx]);\n\n if (asChild && isValidElement(children)) {\n const child = children as ReactElement<Record<string, unknown>>;\n // Compose the wrapped child's existing handlers with ours so any\n // app-level onClick / onFocus / onPress still fires. The tooltip\n // event runs AFTER the child's so consumer code wins on conflict.\n const compose =\n <T,>(existing: ((e: T) => void) | undefined, next: (e: T) => void) =>\n (event: T) => {\n existing?.(event);\n next(event);\n };\n return (\n <Slot\n ref={(node: HTMLElement | null) => {\n ctx.triggerRef.current = node;\n }}\n onMouseEnter={compose(child.props.onMouseEnter as ((e: unknown) => void) | undefined, handleMouseEnter)}\n onMouseLeave={compose(child.props.onMouseLeave as ((e: unknown) => void) | undefined, handleMouseLeave)}\n onFocus={compose(child.props.onFocus as ((e: unknown) => void) | undefined, handleFocus)}\n onBlur={compose(child.props.onBlur as ((e: unknown) => void) | undefined, handleBlur)}\n {...(Platform.OS !== 'web'\n ? {\n onLongPress: compose(\n child.props.onLongPress as ((e: unknown) => void) | undefined,\n handleLongPress\n ),\n onPress: compose(child.props.onPress as ((e: unknown) => void) | undefined, handlePress),\n delayLongPress: LONG_PRESS_MS,\n }\n : {})}\n aria-describedby={ctx.open ? ctx.contentId : undefined}\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 {...(Platform.OS !== 'web'\n ? { onLongPress: handleLongPress, onPress: handlePress, delayLongPress: LONG_PRESS_MS }\n : {})}\n {...({\n onMouseEnter: handleMouseEnter,\n onMouseLeave: handleMouseLeave,\n onFocus: handleFocus,\n onBlur: handleBlur,\n 'aria-describedby': ctx.open ? ctx.contentId : undefined,\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 = 0; // tooltips hug their text — no enforced minimum\n\nfunction computePosition(\n rect: TriggerRect,\n side: TooltipSide,\n align: TooltipAlign,\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 TooltipContentProps = {\n /** Side of the trigger to anchor on. @defaultValue 'top' */\n side?: TooltipSide;\n /** Alignment along the trigger edge. @defaultValue 'center' */\n align?: TooltipAlign;\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/**\n * The floating tooltip surface. Renders only while open. On web uses\n * `position: fixed` with a measured trigger rect so it escapes any\n * ancestor `overflow: hidden`.\n *\n * ARIA: `role=\"tooltip\"` plus a unique id that the trigger's\n * `aria-describedby` points at.\n */\nexport const TooltipContent = ({\n side = 'top',\n align = 'center',\n children,\n className,\n testID,\n}: TooltipContentProps) => {\n const ctx = useTooltipContext('TooltipContent');\n const colors = useThemeColors();\n\n // Measure content size after first paint so we can anchor `top`-side\n // tooltips (which need to know content height to render above the trigger).\n const [contentSize, setContentSize] = useState<{ width: number; height: number } | null>(null);\n\n // Direct DOM ref for the entrance animation. We poke `transform`,\n // `opacity`, and `transition` straight onto node.style instead of\n // passing them through `<View style>`, because rn-web's style filter\n // drops keys it doesn't recognize as RN style props (`transitionProperty`,\n // `transitionDuration`, etc.) — so any style fragment containing them\n // gets discarded entirely. Same pattern as the Dialog backdrop-blur fix.\n const domRef = useRef<HTMLDivElement | null>(null);\n const [entered, setEntered] = useState(false);\n\n // Web-only: Escape closes. Re-measure trigger on resize/scroll so the\n // chip stays anchored during page motion.\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 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('keydown', onKeyDown);\n window.addEventListener('resize', onResize);\n window.addEventListener('scroll', onScroll, true);\n return () => {\n document.removeEventListener('keydown', onKeyDown);\n window.removeEventListener('resize', onResize);\n window.removeEventListener('scroll', onScroll, true);\n };\n }, [ctx.open, ctx.measureTrigger, ctx.setOpen]);\n\n // Reset measured size and entrance flag when tooltip closes so a\n // reopen re-measures and re-animates fresh.\n useEffect(() => {\n if (!ctx.open) {\n setContentSize(null);\n setEntered(false);\n }\n }, [ctx.open]);\n\n // Entrance animation. On the first paint we render at scale(0.95) +\n // opacity 0; the next frame we flip the styles to scale(1) + opacity\n // 1, and the CSS transition handles the in-between. Web only —\n // native renders without animation (an animated mount on RN would\n // require Reanimated for negligible visual gain on a hint chip).\n useEffect(() => {\n if (Platform.OS !== 'web') {\n return;\n }\n if (!ctx.open) {\n return;\n }\n const node = domRef.current;\n if (!node) {\n return;\n }\n // Initial values — explicitly set so the first frame is at the\n // pre-entrance state regardless of inherited styles.\n node.style.transformOrigin = 'center';\n node.style.transitionProperty = 'opacity, transform';\n node.style.transitionDuration = '100ms';\n node.style.transitionTimingFunction = 'ease-out';\n node.style.opacity = entered ? '1' : '0';\n node.style.transform = entered ? 'scale(1)' : 'scale(0.95)';\n }, [ctx.open, entered]);\n\n // Kick off the transition on the next frame after mount.\n useEffect(() => {\n if (Platform.OS !== 'web') {\n return;\n }\n if (!ctx.open) {\n return;\n }\n const id = requestAnimationFrame(() => setEntered(true));\n return () => cancelAnimationFrame(id);\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 const contentBaseStyle: ViewStyle = {\n borderRadius: px(colors.radius.md),\n backgroundColor: colors.semantic.text.default,\n paddingVertical: px(colors.spacing['2']) - 2, // closest theme-rooted approximation of legacy 6\n paddingHorizontal: px(colors.spacing['2']),\n ...(Platform.OS === 'web'\n ? ({\n boxShadow: '0 4px 6px -2px rgba(0,0,0,0.1), 0 2px 4px -2px rgba(0,0,0,0.06)',\n } as ViewStyle)\n : { elevation: 4 }),\n };\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: position.left,\n zIndex: 60,\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: 60,\n } as ViewStyle)\n : ({\n // Native: rely on the parent allowing overflow. We anchor\n // by absolute positioning relative to wherever the\n // tooltip is mounted in the tree (typically right next\n // to the trigger).\n position: 'absolute',\n top: position?.top ?? 0,\n left: position?.left ?? 0,\n } as ViewStyle);\n\n return (\n <View\n ref={(node) => {\n ctx.contentRef.current = node as unknown as HTMLDivElement | null;\n domRef.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: 'tooltip',\n id: ctx.contentId,\n // Don't soak up pointer events — hovering the tooltip\n // itself should NOT block the trigger's mouse-leave from\n // firing. Tooltips are presentational; if you need\n // interactivity, reach for Popover.\n pointerEvents: 'none',\n } as Record<string, unknown>)}\n {...(testID !== undefined ? { testID } : {})}\n className={cn('rounded-md', className)}\n style={[contentBaseStyle, positionedStyle]}\n >\n <RNText\n className=\"text-xs\"\n style={{\n color: colors.semantic.text.inverted,\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n lineHeight: px(colors.fontSize.sm) * Number(colors.lineHeight.tight),\n }}\n >\n {children}\n </RNText>\n </View>\n );\n};\n\n/**\n * Public `Tooltip` value — the root function plus its `.Trigger` and\n * `.Content` static members. `Object.assign` produces a value whose inferred\n * type carries the static properties, so `.d.ts` consumers can write\n * `<Tooltip.Trigger>` without a separate import.\n */\nexport const Tooltip = Object.assign(TooltipRoot, {\n Trigger: TooltipTrigger,\n Content: TooltipContent,\n});\n"]}
1
+ {"version":3,"sources":["../src/components/Tooltip/Tooltip.tsx"],"names":["RNText"],"mappings":"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","file":"chunk-VL2WNGPF.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 { 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 TooltipSide = 'top' | 'right' | 'bottom' | 'left';\nexport type TooltipAlign = 'start' | 'center' | 'end';\n\ntype TriggerRect = { top: number; left: number; width: number; height: number };\n\ntype TooltipContextValue = {\n open: boolean;\n setOpen: (next: boolean) => void;\n /** Open after `delayMs` if still hovered/focused. */\n requestOpen: () => void;\n /** Close after `closeDelayMs`; cancellable. */\n requestClose: () => void;\n /** Cancel any pending open/close timers (e.g. when re-entering). */\n cancelTimers: () => void;\n contentId: string;\n triggerRef: { current: HTMLElement | null };\n contentRef: { current: HTMLDivElement | null };\n triggerRect: TriggerRect | null;\n measureTrigger: () => void;\n};\n\nconst TooltipContext = createContext<TooltipContextValue | null>(null);\n\nconst useTooltipContext = (label: string): TooltipContextValue => {\n const ctx = useContext(TooltipContext);\n if (!ctx) {\n throw new Error(`<${label}> must be rendered inside a <Tooltip>.`);\n }\n return ctx;\n};\n\nconst DEFAULT_OPEN_DELAY_MS = 500;\nconst DEFAULT_CLOSE_DELAY_MS = 0;\n/** Long-press duration on native — matches platform defaults (iOS ~500ms). */\nconst LONG_PRESS_MS = 500;\n\nexport type TooltipProps = {\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 /**\n * Delay before the tooltip opens after hover/focus.\n * @defaultValue 500\n */\n delayMs?: number;\n /**\n * Delay before the tooltip closes after hover-out / blur. Useful for\n * giving users time to move into the tooltip if it ever becomes\n * interactive (it shouldn't — use Popover for that — but the knob is\n * here so the API matches Radix).\n * @defaultValue 0\n */\n closeDelayMs?: number;\n children?: ReactNode;\n};\n\n/**\n * Small floating label triggered by hover (web) or long-press (native).\n * Use for short contextual hints — most often on icon-only buttons. NOT\n * for rich interactive content; reach for `Popover` when the surface\n * needs to hold buttons, inputs, or links.\n *\n * Composition: `Tooltip` (root, owns open state and timers),\n * `TooltipTrigger` (forwards events to its child via Slot when\n * `asChild`), `TooltipContent` (the floating label).\n *\n * Accessibility: the trigger gets `aria-describedby` pointing at the\n * content id — tooltips augment the trigger's accessible name, they do\n * NOT replace it. The icon-only button still needs an `aria-label`.\n *\n * Behavior:\n * - Open on hover (web mouseover) or focus, after `delayMs`.\n * - Close on hover-out, blur, or Escape.\n * - Native: long-press the trigger (500ms) to reveal; tap-anywhere or\n * re-press to dismiss.\n *\n * Cross-platform: web renders the content inline with `position: fixed`\n * + a measured trigger rect so it escapes any ancestor `overflow:\n * hidden`. Native renders inline with `position: absolute` — the parent\n * needs to allow overflow for the chip to peek out.\n */\nconst TooltipRoot = ({\n open,\n defaultOpen = false,\n onOpenChange,\n delayMs = DEFAULT_OPEN_DELAY_MS,\n closeDelayMs = DEFAULT_CLOSE_DELAY_MS,\n children,\n}: TooltipProps) => {\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 // Open / close timers. Both are cleared on unmount and on every new\n // request — so rapid hover-in / hover-out doesn't leave a stale timer\n // about to flip state after the user has moved on.\n const openTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n const closeTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const cancelTimers = useCallback(() => {\n if (openTimer.current) {\n clearTimeout(openTimer.current);\n openTimer.current = null;\n }\n if (closeTimer.current) {\n clearTimeout(closeTimer.current);\n closeTimer.current = null;\n }\n }, []);\n\n const requestOpen = useCallback(() => {\n if (closeTimer.current) {\n clearTimeout(closeTimer.current);\n closeTimer.current = null;\n }\n if (openTimer.current) {\n return;\n }\n if (delayMs <= 0) {\n setOpen(true);\n return;\n }\n openTimer.current = setTimeout(() => {\n openTimer.current = null;\n setOpen(true);\n }, delayMs);\n }, [delayMs, setOpen]);\n\n const requestClose = useCallback(() => {\n if (openTimer.current) {\n clearTimeout(openTimer.current);\n openTimer.current = null;\n }\n if (closeTimer.current) {\n return;\n }\n if (closeDelayMs <= 0) {\n setOpen(false);\n return;\n }\n closeTimer.current = setTimeout(() => {\n closeTimer.current = null;\n setOpen(false);\n }, closeDelayMs);\n }, [closeDelayMs, setOpen]);\n\n useEffect(() => () => cancelTimers(), [cancelTimers]);\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 tooltip 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: TooltipContextValue = {\n open: current,\n setOpen,\n requestOpen,\n requestClose,\n cancelTimers,\n contentId: `${baseId}-content`,\n triggerRef,\n contentRef,\n triggerRect,\n measureTrigger,\n };\n\n return <TooltipContext.Provider value={ctxValue}>{children}</TooltipContext.Provider>;\n};\n\nexport type TooltipTriggerProps = {\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 reveals the tooltip. Uses `asChild` by default so any\n * element (Button, IconButton, custom Pressable) becomes the trigger.\n *\n * Wires `aria-describedby` to the content's id — assistive tech reads\n * the tooltip text in addition to the trigger's own accessible name.\n *\n * Web: opens on `mouseEnter` and `focus`; closes on `mouseLeave` and\n * `blur`, both honoring the configured delays. Native: opens on\n * `onLongPress` (500ms hold) and closes on the next press anywhere.\n */\nexport const TooltipTrigger = ({ asChild = true, children, className, testID }: TooltipTriggerProps) => {\n const ctx = useTooltipContext('TooltipTrigger');\n\n const handleMouseEnter = useCallback(() => {\n ctx.measureTrigger();\n ctx.requestOpen();\n }, [ctx]);\n const handleMouseLeave = useCallback(() => {\n ctx.requestClose();\n }, [ctx]);\n const handleFocus = useCallback(() => {\n ctx.measureTrigger();\n ctx.requestOpen();\n }, [ctx]);\n const handleBlur = useCallback(() => {\n ctx.requestClose();\n }, [ctx]);\n const handleLongPress = useCallback(() => {\n ctx.measureTrigger();\n ctx.setOpen(true);\n }, [ctx]);\n const handlePress = useCallback(() => {\n // Native: tap (after a long-press has revealed it) dismisses.\n if (Platform.OS !== 'web' && ctx.open) {\n ctx.setOpen(false);\n }\n }, [ctx]);\n\n if (asChild && isValidElement(children)) {\n const child = children as ReactElement<Record<string, unknown>>;\n // Compose the wrapped child's existing handlers with ours so any\n // app-level onClick / onFocus / onPress still fires. The tooltip\n // event runs AFTER the child's so consumer code wins on conflict.\n const compose =\n <T,>(existing: ((e: T) => void) | undefined, next: (e: T) => void) =>\n (event: T) => {\n existing?.(event);\n next(event);\n };\n return (\n <Slot\n ref={(node: HTMLElement | null) => {\n ctx.triggerRef.current = node;\n }}\n onMouseEnter={compose(child.props.onMouseEnter as ((e: unknown) => void) | undefined, handleMouseEnter)}\n onMouseLeave={compose(child.props.onMouseLeave as ((e: unknown) => void) | undefined, handleMouseLeave)}\n onFocus={compose(child.props.onFocus as ((e: unknown) => void) | undefined, handleFocus)}\n onBlur={compose(child.props.onBlur as ((e: unknown) => void) | undefined, handleBlur)}\n {...(Platform.OS !== 'web'\n ? {\n onLongPress: compose(\n child.props.onLongPress as ((e: unknown) => void) | undefined,\n handleLongPress\n ),\n onPress: compose(child.props.onPress as ((e: unknown) => void) | undefined, handlePress),\n delayLongPress: LONG_PRESS_MS,\n }\n : {})}\n aria-describedby={ctx.open ? ctx.contentId : undefined}\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 {...(Platform.OS !== 'web'\n ? { onLongPress: handleLongPress, onPress: handlePress, delayLongPress: LONG_PRESS_MS }\n : {})}\n {...({\n onMouseEnter: handleMouseEnter,\n onMouseLeave: handleMouseLeave,\n onFocus: handleFocus,\n onBlur: handleBlur,\n 'aria-describedby': ctx.open ? ctx.contentId : undefined,\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 = 0; // tooltips hug their text — no enforced minimum\n\nfunction computePosition(\n rect: TriggerRect,\n side: TooltipSide,\n align: TooltipAlign,\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 TooltipContentProps = {\n /** Side of the trigger to anchor on. @defaultValue 'top' */\n side?: TooltipSide;\n /** Alignment along the trigger edge. @defaultValue 'center' */\n align?: TooltipAlign;\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/**\n * The floating tooltip surface. Renders only while open. On web uses\n * `position: fixed` with a measured trigger rect so it escapes any\n * ancestor `overflow: hidden`.\n *\n * ARIA: `role=\"tooltip\"` plus a unique id that the trigger's\n * `aria-describedby` points at.\n */\nexport const TooltipContent = ({\n side = 'top',\n align = 'center',\n children,\n className,\n testID,\n}: TooltipContentProps) => {\n const ctx = useTooltipContext('TooltipContent');\n const colors = useThemeColors();\n\n // Measure content size after first paint so we can anchor `top`-side\n // tooltips (which need to know content height to render above the trigger).\n const [contentSize, setContentSize] = useState<{ width: number; height: number } | null>(null);\n\n // Direct DOM ref for the entrance animation. We poke `transform`,\n // `opacity`, and `transition` straight onto node.style instead of\n // passing them through `<View style>`, because rn-web's style filter\n // drops keys it doesn't recognize as RN style props (`transitionProperty`,\n // `transitionDuration`, etc.) — so any style fragment containing them\n // gets discarded entirely. Same pattern as the Dialog backdrop-blur fix.\n const domRef = useRef<HTMLDivElement | null>(null);\n const [entered, setEntered] = useState(false);\n\n // Web-only: Escape closes. Re-measure trigger on resize/scroll so the\n // chip stays anchored during page motion.\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 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('keydown', onKeyDown);\n window.addEventListener('resize', onResize);\n window.addEventListener('scroll', onScroll, true);\n return () => {\n document.removeEventListener('keydown', onKeyDown);\n window.removeEventListener('resize', onResize);\n window.removeEventListener('scroll', onScroll, true);\n };\n }, [ctx.open, ctx.measureTrigger, ctx.setOpen]);\n\n // Reset measured size and entrance flag when tooltip closes so a\n // reopen re-measures and re-animates fresh.\n useEffect(() => {\n if (!ctx.open) {\n setContentSize(null);\n setEntered(false);\n }\n }, [ctx.open]);\n\n // Entrance animation. On the first paint we render at scale(0.95) +\n // opacity 0; the next frame we flip the styles to scale(1) + opacity\n // 1, and the CSS transition handles the in-between. Web only —\n // native renders without animation (an animated mount on RN would\n // require Reanimated for negligible visual gain on a hint chip).\n useEffect(() => {\n if (Platform.OS !== 'web') {\n return;\n }\n if (!ctx.open) {\n return;\n }\n const node = domRef.current;\n if (!node) {\n return;\n }\n // Initial values — explicitly set so the first frame is at the\n // pre-entrance state regardless of inherited styles.\n node.style.transformOrigin = 'center';\n node.style.transitionProperty = 'opacity, transform';\n node.style.transitionDuration = '100ms';\n node.style.transitionTimingFunction = 'ease-out';\n node.style.opacity = entered ? '1' : '0';\n node.style.transform = entered ? 'scale(1)' : 'scale(0.95)';\n }, [ctx.open, entered]);\n\n // Kick off the transition on the next frame after mount.\n useEffect(() => {\n if (Platform.OS !== 'web') {\n return;\n }\n if (!ctx.open) {\n return;\n }\n const id = requestAnimationFrame(() => setEntered(true));\n return () => cancelAnimationFrame(id);\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 const contentBaseStyle: ViewStyle = {\n borderRadius: px(colors.radius.md),\n backgroundColor: colors.semantic.text.default,\n paddingVertical: px(colors.spacing['2']) - 2, // closest theme-rooted approximation of legacy 6\n paddingHorizontal: px(colors.spacing['2']),\n ...(Platform.OS === 'web'\n ? ({\n boxShadow: '0 4px 6px -2px rgba(0,0,0,0.1), 0 2px 4px -2px rgba(0,0,0,0.06)',\n } as ViewStyle)\n : { elevation: 4 }),\n };\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: position.left,\n zIndex: 60,\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: 60,\n } as ViewStyle)\n : ({\n // Native: rely on the parent allowing overflow. We anchor\n // by absolute positioning relative to wherever the\n // tooltip is mounted in the tree (typically right next\n // to the trigger).\n position: 'absolute',\n top: position?.top ?? 0,\n left: position?.left ?? 0,\n } as ViewStyle);\n\n return (\n <View\n ref={(node) => {\n ctx.contentRef.current = node as unknown as HTMLDivElement | null;\n domRef.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: 'tooltip',\n id: ctx.contentId,\n // Don't soak up pointer events — hovering the tooltip\n // itself should NOT block the trigger's mouse-leave from\n // firing. Tooltips are presentational; if you need\n // interactivity, reach for Popover.\n pointerEvents: 'none',\n } as Record<string, unknown>)}\n {...(testID !== undefined ? { testID } : {})}\n className={cn('rounded-md', className)}\n style={[contentBaseStyle, positionedStyle]}\n >\n <RNText\n className=\"text-xs\"\n style={{\n color: colors.semantic.text.inverted,\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n lineHeight: px(colors.fontSize.sm) * Number(colors.lineHeight.tight),\n }}\n >\n {children}\n </RNText>\n </View>\n );\n};\n\n/**\n * Public `Tooltip` value — the root function plus its `.Trigger` and\n * `.Content` static members. `Object.assign` produces a value whose inferred\n * type carries the static properties, so `.d.ts` consumers can write\n * `<Tooltip.Trigger>` without a separate import.\n */\nexport const Tooltip = Object.assign(TooltipRoot, {\n Trigger: TooltipTrigger,\n Content: TooltipContent,\n});\n"]}
@@ -1,4 +1,4 @@
1
- import { Text } from './chunk-JZ774T7U.js';
1
+ import { Text } from './chunk-ZGFXKYA5.js';
2
2
  import { __name } from './chunk-WCQVDF3K.js';
3
3
  import { Children } from 'react';
4
4
  import { jsx } from 'nativewind/jsx-runtime';
@@ -14,5 +14,5 @@ function wrapStringChildren(children) {
14
14
  __name(wrapStringChildren, "wrapStringChildren");
15
15
 
16
16
  export { wrapStringChildren };
17
- //# sourceMappingURL=chunk-JQQ3FBN7.js.map
18
- //# sourceMappingURL=chunk-JQQ3FBN7.js.map
17
+ //# sourceMappingURL=chunk-VLZANXRZ.js.map
18
+ //# sourceMappingURL=chunk-VLZANXRZ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/wrap-string-children.tsx"],"names":[],"mappings":";;;;;AAyBO,SAAS,mBAAmB,QAAA,EAAgC;AAC/D,EAAA,OAAO,QAAA,CAAS,GAAA,CAAI,QAAA,EAAU,CAAC,KAAA,KAAU;AACrC,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,UAAU,QAAA,EAAU;AACxD,MAAA,uBAAO,GAAA,CAAC,QAAM,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IACxB;AACA,IAAA,OAAO,KAAA;AAAA,EACX,CAAC,CAAA;AACL;AAPgB,MAAA,CAAA,kBAAA,EAAA,oBAAA,CAAA","file":"chunk-JQQ3FBN7.js","sourcesContent":["import { Children, type ReactNode } from 'react';\nimport { Text } from '../components/Text';\n\n/**\n * Walks a `ReactNode` (single, array, or fragment) and wraps every\n * string/number child in a themed `<Text>` so the same JSX renders\n * cleanly on web AND native. Non-string children are passed through\n * unchanged.\n *\n * On native, raw strings as children of any non-Text component throw\n * \"Text strings must be rendered within a <Text> component\". On web,\n * react-native-web silently tolerates them — but the rendered string\n * inherits no theme color, so dark mode never flips.\n *\n * Both bugs collapse to the same fix: wrap. Layout primitives\n * (`<HStack>`, `<VStack>`, `<Box>`) use this so consumers can write\n * `<HStack>Hello</HStack>` and have it Just Work on both platforms\n * and across light/dark mode.\n *\n * The wrapper is the lib's own `<Text>`, which reads from\n * `useThemeColors()` — so the wrapped string flips with the active\n * scheme. Importing a `'use client'` component from an RSC-safe file\n * is allowed; React's RSC model lets server components contain client\n * children.\n */\nexport function wrapStringChildren(children: ReactNode): ReactNode {\n return Children.map(children, (child) => {\n if (typeof child === 'string' || typeof child === 'number') {\n return <Text>{child}</Text>;\n }\n return child;\n });\n}\n"]}
1
+ {"version":3,"sources":["../src/utils/wrap-string-children.tsx"],"names":[],"mappings":";;;;;AAyBO,SAAS,mBAAmB,QAAA,EAAgC;AAC/D,EAAA,OAAO,QAAA,CAAS,GAAA,CAAI,QAAA,EAAU,CAAC,KAAA,KAAU;AACrC,IAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,UAAU,QAAA,EAAU;AACxD,MAAA,uBAAO,GAAA,CAAC,QAAM,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,IACxB;AACA,IAAA,OAAO,KAAA;AAAA,EACX,CAAC,CAAA;AACL;AAPgB,MAAA,CAAA,kBAAA,EAAA,oBAAA,CAAA","file":"chunk-VLZANXRZ.js","sourcesContent":["import { Children, type ReactNode } from 'react';\nimport { Text } from '../components/Text';\n\n/**\n * Walks a `ReactNode` (single, array, or fragment) and wraps every\n * string/number child in a themed `<Text>` so the same JSX renders\n * cleanly on web AND native. Non-string children are passed through\n * unchanged.\n *\n * On native, raw strings as children of any non-Text component throw\n * \"Text strings must be rendered within a <Text> component\". On web,\n * react-native-web silently tolerates them — but the rendered string\n * inherits no theme color, so dark mode never flips.\n *\n * Both bugs collapse to the same fix: wrap. Layout primitives\n * (`<HStack>`, `<VStack>`, `<Box>`) use this so consumers can write\n * `<HStack>Hello</HStack>` and have it Just Work on both platforms\n * and across light/dark mode.\n *\n * The wrapper is the lib's own `<Text>`, which reads from\n * `useThemeColors()` — so the wrapped string flips with the active\n * scheme. Importing a `'use client'` component from an RSC-safe file\n * is allowed; React's RSC model lets server components contain client\n * children.\n */\nexport function wrapStringChildren(children: ReactNode): ReactNode {\n return Children.map(children, (child) => {\n if (typeof child === 'string' || typeof child === 'number') {\n return <Text>{child}</Text>;\n }\n return child;\n });\n}\n"]}
@@ -1,5 +1,5 @@
1
+ import { Select } from './chunk-PJTCO76H.js';
1
2
  import { useTranslation } from './chunk-GJMHNEQ3.js';
2
- import { Select } from './chunk-UZD77M3J.js';
3
3
  import { useThemeColors } from './chunk-R5JMDDCB.js';
4
4
  import { __name } from './chunk-WCQVDF3K.js';
5
5
  import { today, getLocalTimeZone, CalendarDate, startOfMonth } from '@internationalized/date';
@@ -1682,5 +1682,5 @@ var Calendar = CalendarRoot;
1682
1682
  Calendar.Caption = CalendarCaption;
1683
1683
 
1684
1684
  export { Calendar, LocaleProvider, detectLocale, useCalendarCaption, useLocale };
1685
- //# sourceMappingURL=chunk-2HMQDJ22.js.map
1686
- //# sourceMappingURL=chunk-2HMQDJ22.js.map
1685
+ //# sourceMappingURL=chunk-VOF3S5I4.js.map
1686
+ //# sourceMappingURL=chunk-VOF3S5I4.js.map