@nori-ui/core 1.5.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 (228) hide show
  1. package/dist/Table.shared-BymRgTnY.d.cts +54 -0
  2. package/dist/Table.shared-BymRgTnY.d.ts +54 -0
  3. package/dist/{chunk-7UKRN73P.js → chunk-2XJCLPNH.js} +3 -3
  4. package/dist/{chunk-7UKRN73P.js.map → chunk-2XJCLPNH.js.map} +1 -1
  5. package/dist/{chunk-76FZF4GM.js → chunk-3B345SQU.js} +8 -125
  6. package/dist/chunk-3B345SQU.js.map +1 -0
  7. package/dist/{chunk-WOF67PKT.js → chunk-3CEJ5TB4.js} +3 -3
  8. package/dist/{chunk-WOF67PKT.js.map → chunk-3CEJ5TB4.js.map} +1 -1
  9. package/dist/{chunk-JSAG5YO7.js → chunk-3IIIHZHT.js} +3 -3
  10. package/dist/{chunk-JSAG5YO7.js.map → chunk-3IIIHZHT.js.map} +1 -1
  11. package/dist/{chunk-46OT4PA6.js → chunk-3W3XYULK.js} +3 -3
  12. package/dist/{chunk-46OT4PA6.js.map → chunk-3W3XYULK.js.map} +1 -1
  13. package/dist/{chunk-6PO2IWB3.js → chunk-4UFAZLSZ.js} +5 -3
  14. package/dist/chunk-4UFAZLSZ.js.map +1 -0
  15. package/dist/chunk-5YHT252H.js +145 -0
  16. package/dist/chunk-5YHT252H.js.map +1 -0
  17. package/dist/chunk-73CUV7MW.js +125 -0
  18. package/dist/chunk-73CUV7MW.js.map +1 -0
  19. package/dist/{chunk-ZMSIYLSI.js → chunk-7FSFJA33.js} +3 -3
  20. package/dist/{chunk-ZMSIYLSI.js.map → chunk-7FSFJA33.js.map} +1 -1
  21. package/dist/chunk-C32XGHWO.js +202 -0
  22. package/dist/chunk-C32XGHWO.js.map +1 -0
  23. package/dist/{chunk-UUXWRDWW.js → chunk-C5HQPXRI.js} +3 -3
  24. package/dist/{chunk-UUXWRDWW.js.map → chunk-C5HQPXRI.js.map} +1 -1
  25. package/dist/{chunk-2UXKXUX2.js → chunk-CPIKN4BX.js} +3 -3
  26. package/dist/{chunk-2UXKXUX2.js.map → chunk-CPIKN4BX.js.map} +1 -1
  27. package/dist/{chunk-GELLSU64.js → chunk-EN4CLDGZ.js} +3 -3
  28. package/dist/{chunk-GELLSU64.js.map → chunk-EN4CLDGZ.js.map} +1 -1
  29. package/dist/{chunk-WAKKQROH.js → chunk-F5UKI7XD.js} +3 -3
  30. package/dist/{chunk-WAKKQROH.js.map → chunk-F5UKI7XD.js.map} +1 -1
  31. package/dist/{chunk-MJ4AGXS7.js → chunk-GJMHNEQ3.js} +3 -3
  32. package/dist/{chunk-MJ4AGXS7.js.map → chunk-GJMHNEQ3.js.map} +1 -1
  33. package/dist/chunk-GTAXVTLF.js +43 -0
  34. package/dist/chunk-GTAXVTLF.js.map +1 -0
  35. package/dist/{chunk-WTNDPO2V.js → chunk-H2LHWJ52.js} +3 -3
  36. package/dist/{chunk-WTNDPO2V.js.map → chunk-H2LHWJ52.js.map} +1 -1
  37. package/dist/{chunk-L5X4SYJ4.js → chunk-HXCETKCC.js} +3 -3
  38. package/dist/{chunk-L5X4SYJ4.js.map → chunk-HXCETKCC.js.map} +1 -1
  39. package/dist/chunk-IGBXSBF7.js +71 -0
  40. package/dist/chunk-IGBXSBF7.js.map +1 -0
  41. package/dist/{chunk-O4NMS3KB.js → chunk-IIVTPN62.js} +3 -3
  42. package/dist/{chunk-O4NMS3KB.js.map → chunk-IIVTPN62.js.map} +1 -1
  43. package/dist/{chunk-RM5TSXVE.js → chunk-ISCJST4P.js} +3 -3
  44. package/dist/{chunk-RM5TSXVE.js.map → chunk-ISCJST4P.js.map} +1 -1
  45. package/dist/{chunk-UF5OENHV.js → chunk-IWM2XDXH.js} +3 -3
  46. package/dist/{chunk-UF5OENHV.js.map → chunk-IWM2XDXH.js.map} +1 -1
  47. package/dist/chunk-J5LK2XHE.js +118 -0
  48. package/dist/chunk-J5LK2XHE.js.map +1 -0
  49. package/dist/chunk-KFFGDET3.js +27 -0
  50. package/dist/chunk-KFFGDET3.js.map +1 -0
  51. package/dist/{chunk-AFQIK6JI.js → chunk-L6VYDM7S.js} +3 -3
  52. package/dist/{chunk-AFQIK6JI.js.map → chunk-L6VYDM7S.js.map} +1 -1
  53. package/dist/chunk-M4BI63P6.js +188 -0
  54. package/dist/chunk-M4BI63P6.js.map +1 -0
  55. package/dist/{chunk-H7MFAFV4.js → chunk-MK57AOTI.js} +4 -4
  56. package/dist/{chunk-H7MFAFV4.js.map → chunk-MK57AOTI.js.map} +1 -1
  57. package/dist/{chunk-FDBQOQMW.js → chunk-MOAIQHR7.js} +3 -3
  58. package/dist/{chunk-FDBQOQMW.js.map → chunk-MOAIQHR7.js.map} +1 -1
  59. package/dist/{chunk-LWQZ257T.js → chunk-MYBBBLYE.js} +3 -3
  60. package/dist/{chunk-LWQZ257T.js.map → chunk-MYBBBLYE.js.map} +1 -1
  61. package/dist/{chunk-F7G6R373.js → chunk-O6M3F7BZ.js} +5 -5
  62. package/dist/{chunk-F7G6R373.js.map → chunk-O6M3F7BZ.js.map} +1 -1
  63. package/dist/{chunk-XP55RZ3D.js → chunk-OELY6K44.js} +3 -3
  64. package/dist/{chunk-XP55RZ3D.js.map → chunk-OELY6K44.js.map} +1 -1
  65. package/dist/{chunk-GRDVE3IR.js → chunk-OIHX5B4R.js} +3 -3
  66. package/dist/{chunk-GRDVE3IR.js.map → chunk-OIHX5B4R.js.map} +1 -1
  67. package/dist/{chunk-4I37QSEM.js → chunk-PGYEIXCO.js} +5 -5
  68. package/dist/{chunk-4I37QSEM.js.map → chunk-PGYEIXCO.js.map} +1 -1
  69. package/dist/{chunk-UJ5KFRDE.js → chunk-PJTCO76H.js} +3 -3
  70. package/dist/{chunk-UJ5KFRDE.js.map → chunk-PJTCO76H.js.map} +1 -1
  71. package/dist/{chunk-6JVUVBZH.js → chunk-PJXVLE24.js} +5 -5
  72. package/dist/{chunk-6JVUVBZH.js.map → chunk-PJXVLE24.js.map} +1 -1
  73. package/dist/{chunk-IGLMPAWE.js → chunk-PLQPBMG2.js} +3 -3
  74. package/dist/{chunk-IGLMPAWE.js.map → chunk-PLQPBMG2.js.map} +1 -1
  75. package/dist/{chunk-HTF6FDB6.js → chunk-PQW5LKAI.js} +3 -3
  76. package/dist/{chunk-HTF6FDB6.js.map → chunk-PQW5LKAI.js.map} +1 -1
  77. package/dist/{chunk-VMAGFYHG.js → chunk-RI4Y2C5U.js} +3 -3
  78. package/dist/{chunk-VMAGFYHG.js.map → chunk-RI4Y2C5U.js.map} +1 -1
  79. package/dist/{chunk-BNDUQNG7.js → chunk-SF6WPUC5.js} +3 -3
  80. package/dist/{chunk-BNDUQNG7.js.map → chunk-SF6WPUC5.js.map} +1 -1
  81. package/dist/{chunk-SINLREQV.js → chunk-STX5UKYT.js} +3 -3
  82. package/dist/{chunk-SINLREQV.js.map → chunk-STX5UKYT.js.map} +1 -1
  83. package/dist/{chunk-KCLWPSV5.js → chunk-TSWPHJIU.js} +4 -4
  84. package/dist/{chunk-KCLWPSV5.js.map → chunk-TSWPHJIU.js.map} +1 -1
  85. package/dist/{chunk-5BM6H2CD.js → chunk-U2ZKY2CP.js} +3 -3
  86. package/dist/{chunk-5BM6H2CD.js.map → chunk-U2ZKY2CP.js.map} +1 -1
  87. package/dist/{chunk-C6TRLHMW.js → chunk-UKDDK42K.js} +3 -3
  88. package/dist/{chunk-C6TRLHMW.js.map → chunk-UKDDK42K.js.map} +1 -1
  89. package/dist/{chunk-UPVNZPFV.js → chunk-USFXANEU.js} +3 -3
  90. package/dist/{chunk-UPVNZPFV.js.map → chunk-USFXANEU.js.map} +1 -1
  91. package/dist/{chunk-Y4ZRSW35.js → chunk-V5QSMDZL.js} +3 -3
  92. package/dist/{chunk-Y4ZRSW35.js.map → chunk-V5QSMDZL.js.map} +1 -1
  93. package/dist/{chunk-EFK7726V.js → chunk-V75O7QQO.js} +3 -3
  94. package/dist/{chunk-EFK7726V.js.map → chunk-V75O7QQO.js.map} +1 -1
  95. package/dist/{chunk-CGQIVFCN.js → chunk-VL2WNGPF.js} +3 -3
  96. package/dist/{chunk-CGQIVFCN.js.map → chunk-VL2WNGPF.js.map} +1 -1
  97. package/dist/{chunk-VCJF75T2.js → chunk-VLZANXRZ.js} +3 -3
  98. package/dist/{chunk-VCJF75T2.js.map → chunk-VLZANXRZ.js.map} +1 -1
  99. package/dist/{chunk-ND7MRYW7.js → chunk-VOF3S5I4.js} +4 -4
  100. package/dist/{chunk-ND7MRYW7.js.map → chunk-VOF3S5I4.js.map} +1 -1
  101. package/dist/chunk-VP7DRJUZ.js +3 -0
  102. package/dist/chunk-VP7DRJUZ.js.map +1 -0
  103. package/dist/chunk-XQNVWHMN.js +60 -0
  104. package/dist/chunk-XQNVWHMN.js.map +1 -0
  105. package/dist/{chunk-W3HMOOON.js → chunk-ZGFXKYA5.js} +3 -3
  106. package/dist/{chunk-W3HMOOON.js.map → chunk-ZGFXKYA5.js.map} +1 -1
  107. package/dist/client.cjs +935 -156
  108. package/dist/client.cjs.map +1 -1
  109. package/dist/client.d.cts +9 -0
  110. package/dist/client.d.ts +9 -0
  111. package/dist/client.js +57 -47
  112. package/dist/client.js.map +1 -1
  113. package/dist/components/Accordion/index.js +2 -2
  114. package/dist/components/Alert/index.js +2 -2
  115. package/dist/components/AlertDialog/index.js +2 -2
  116. package/dist/components/AspectRatio/index.cjs +67 -0
  117. package/dist/components/AspectRatio/index.cjs.map +1 -0
  118. package/dist/components/AspectRatio/index.d.cts +30 -0
  119. package/dist/components/AspectRatio/index.d.ts +30 -0
  120. package/dist/components/AspectRatio/index.js +5 -0
  121. package/dist/components/AspectRatio/index.js.map +1 -0
  122. package/dist/components/Avatar/index.js +2 -2
  123. package/dist/components/Badge/index.js +2 -2
  124. package/dist/components/Box/index.js +4 -4
  125. package/dist/components/Breadcrumb/index.cjs +3 -1
  126. package/dist/components/Breadcrumb/index.cjs.map +1 -1
  127. package/dist/components/Breadcrumb/index.js +5 -5
  128. package/dist/components/Button/index.js +2 -2
  129. package/dist/components/ButtonGroup/index.cjs +83 -0
  130. package/dist/components/ButtonGroup/index.cjs.map +1 -0
  131. package/dist/components/ButtonGroup/index.d.cts +45 -0
  132. package/dist/components/ButtonGroup/index.d.ts +45 -0
  133. package/dist/components/ButtonGroup/index.js +5 -0
  134. package/dist/components/ButtonGroup/index.js.map +1 -0
  135. package/dist/components/Calendar/index.cjs +3 -1
  136. package/dist/components/Calendar/index.cjs.map +1 -1
  137. package/dist/components/Calendar/index.js +5 -5
  138. package/dist/components/Card/index.js +2 -2
  139. package/dist/components/Checkbox/index.js +2 -2
  140. package/dist/components/Collapsible/index.cjs +512 -0
  141. package/dist/components/Collapsible/index.cjs.map +1 -0
  142. package/dist/components/Collapsible/index.d.cts +50 -0
  143. package/dist/components/Collapsible/index.d.ts +50 -0
  144. package/dist/components/Collapsible/index.js +7 -0
  145. package/dist/components/Collapsible/index.js.map +1 -0
  146. package/dist/components/Combobox/index.js +3 -3
  147. package/dist/components/ContextMenu/index.js +4 -4
  148. package/dist/components/DataTable/index.cjs +770 -0
  149. package/dist/components/DataTable/index.cjs.map +1 -0
  150. package/dist/components/DataTable/index.d.cts +53 -0
  151. package/dist/components/DataTable/index.d.ts +53 -0
  152. package/dist/components/DataTable/index.js +8 -0
  153. package/dist/components/DataTable/index.js.map +1 -0
  154. package/dist/components/DatePicker/index.cjs +3 -1
  155. package/dist/components/DatePicker/index.cjs.map +1 -1
  156. package/dist/components/DatePicker/index.js +7 -7
  157. package/dist/components/Dialog/index.js +2 -2
  158. package/dist/components/DropdownMenu/index.js +3 -3
  159. package/dist/components/Empty/index.cjs +385 -0
  160. package/dist/components/Empty/index.cjs.map +1 -0
  161. package/dist/components/Empty/index.d.cts +32 -0
  162. package/dist/components/Empty/index.d.ts +32 -0
  163. package/dist/components/Empty/index.js +7 -0
  164. package/dist/components/Empty/index.js.map +1 -0
  165. package/dist/components/Field/index.cjs +3 -1
  166. package/dist/components/Field/index.cjs.map +1 -1
  167. package/dist/components/Field/index.d.cts +2 -2
  168. package/dist/components/Field/index.d.ts +2 -2
  169. package/dist/components/Field/index.js +3 -3
  170. package/dist/components/FloatButton/index.cjs +3 -1
  171. package/dist/components/FloatButton/index.cjs.map +1 -1
  172. package/dist/components/FloatButton/index.js +5 -5
  173. package/dist/components/HStack/index.js +4 -4
  174. package/dist/components/InputGroup/index.js +2 -2
  175. package/dist/components/Item/index.cjs +443 -0
  176. package/dist/components/Item/index.cjs.map +1 -0
  177. package/dist/components/Item/index.d.cts +40 -0
  178. package/dist/components/Item/index.d.ts +40 -0
  179. package/dist/components/Item/index.js +7 -0
  180. package/dist/components/Item/index.js.map +1 -0
  181. package/dist/components/Kbd/index.cjs +396 -0
  182. package/dist/components/Kbd/index.cjs.map +1 -0
  183. package/dist/components/Kbd/index.d.cts +22 -0
  184. package/dist/components/Kbd/index.d.ts +22 -0
  185. package/dist/components/Kbd/index.js +7 -0
  186. package/dist/components/Kbd/index.js.map +1 -0
  187. package/dist/components/Label/index.cjs +3 -1
  188. package/dist/components/Label/index.cjs.map +1 -1
  189. package/dist/components/Label/index.js +3 -3
  190. package/dist/components/Pagination/index.cjs +3 -1
  191. package/dist/components/Pagination/index.cjs.map +1 -1
  192. package/dist/components/Pagination/index.js +6 -5
  193. package/dist/components/Popover/index.js +2 -2
  194. package/dist/components/Progress/index.js +2 -2
  195. package/dist/components/Radio/index.js +2 -2
  196. package/dist/components/SegmentedControl/index.js +2 -2
  197. package/dist/components/Select/index.js +2 -2
  198. package/dist/components/Separator/index.js +2 -2
  199. package/dist/components/Sheet/index.js +2 -2
  200. package/dist/components/Skeleton/index.js +2 -2
  201. package/dist/components/Slider/index.js +2 -2
  202. package/dist/components/Switch/index.js +2 -2
  203. package/dist/components/Table/index.cjs +461 -0
  204. package/dist/components/Table/index.cjs.map +1 -0
  205. package/dist/components/Table/index.d.cts +16 -0
  206. package/dist/components/Table/index.d.ts +16 -0
  207. package/dist/components/Table/index.js +7 -0
  208. package/dist/components/Table/index.js.map +1 -0
  209. package/dist/components/Tabs/index.js +2 -2
  210. package/dist/components/Text/index.js +2 -2
  211. package/dist/components/TextArea/index.js +3 -3
  212. package/dist/components/TextInput/index.js +2 -2
  213. package/dist/components/Toggle/index.js +2 -2
  214. package/dist/components/Tooltip/index.js +2 -2
  215. package/dist/components/VStack/index.js +4 -4
  216. package/dist/i18n/index.cjs +3 -1
  217. package/dist/i18n/index.cjs.map +1 -1
  218. package/dist/i18n/index.js +1 -1
  219. package/dist/index.cjs +935 -156
  220. package/dist/index.cjs.map +1 -1
  221. package/dist/index.d.cts +9 -0
  222. package/dist/index.d.ts +9 -0
  223. package/dist/index.js +54 -44
  224. package/dist/slot/index.d.cts +2 -2
  225. package/dist/slot/index.d.ts +2 -2
  226. package/package.json +1 -1
  227. package/dist/chunk-6PO2IWB3.js.map +0 -1
  228. package/dist/chunk-76FZF4GM.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/InputGroup/InputGroup.tsx"],"names":["RNText","RNTextInput"],"mappings":"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","file":"chunk-UUXWRDWW.js","sourcesContent":["'use client';\n\nimport {\n Children,\n createContext,\n isValidElement,\n type ReactElement,\n type ReactNode,\n useCallback,\n useContext,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { TextInput as RNTextInputType, TextStyle, ViewStyle } from 'react-native';\nimport { Platform, Pressable, Text as RNText, TextInput as RNTextInput, View } from 'react-native';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\nimport type { TextInputProps } from '../TextInput/TextInput';\n\n// ─── Internal context ─────────────────────────────────────────────────────\n//\n// Lets the addons + input share focus, error, and disabled state so the\n// WHOLE group's border lights up on focus and dimming cascades visually\n// without consumers having to duplicate props on every child.\ntype InputGroupContextValue = {\n inputId: string;\n describeId: string;\n setFocused: (next: boolean) => void;\n hasError: boolean;\n disabled: boolean;\n inputRef: React.MutableRefObject<RNTextInputType | null>;\n focusInput: () => void;\n};\n\nconst InputGroupContext = createContext<InputGroupContextValue | null>(null);\n\nconst useInputGroupContext = (label: string): InputGroupContextValue => {\n const ctx = useContext(InputGroupContext);\n if (!ctx) {\n throw new Error(`<${label}> must be rendered inside an <InputGroup>.`);\n }\n return ctx;\n};\n\n// Marker symbols on the child component functions so we can split children\n// into [prefix, input, suffix] without forcing consumers to pass `position`\n// props or use named slots. Whatever sits before the InputGroupInput is a\n// prefix; whatever sits after is a suffix.\nconst ADDON_TYPE = Symbol.for('nori-ui.InputGroupAddon');\nconst INPUT_TYPE = Symbol.for('nori-ui.InputGroupInput');\n\nconst isAddon = (child: unknown): child is ReactElement =>\n isValidElement(child) && (child.type as { __noriType?: symbol })?.__noriType === ADDON_TYPE;\n\nconst isInput = (child: unknown): child is ReactElement<InputGroupInputProps> =>\n isValidElement(child) && (child.type as { __noriType?: symbol })?.__noriType === INPUT_TYPE;\n\n// ─── Container ────────────────────────────────────────────────────────────\n\n// Layout-only bases; theme-driven dimensions are merged inside the\n// component below.\nconst CONTAINER_LAYOUT_BASE: ViewStyle = { flexDirection: 'column' };\nconst FIELD_LAYOUT_BASE: ViewStyle = {\n flexDirection: 'row',\n alignItems: 'stretch',\n borderWidth: 1,\n overflow: 'hidden',\n};\n\nexport type InputGroupProps = {\n children: ReactNode;\n /** Mark the entire group as disabled — cascades visually to addons + input. */\n disabled?: boolean;\n /** Mark the entire group as errored — cascades visually to addons + input. */\n error?: boolean;\n className?: string;\n containerClassName?: string;\n testID?: string;\n};\n\n/**\n * Wrapper that visually fuses prefix and/or suffix addons with a TextInput\n * into a SINGLE rounded field — one border around the whole compound, not\n * three separate boxes. Inspired by Chakra's InputGroup and shadcn's input\n * addon pattern.\n *\n * @example\n * <InputGroup>\n * <InputGroupAddon>@</InputGroupAddon>\n * <InputGroupInput placeholder=\"username\" />\n * </InputGroup>\n *\n * @example with both prefix and suffix\n * <InputGroup>\n * <InputGroupAddon>https://</InputGroupAddon>\n * <InputGroupInput defaultValue=\"example\" />\n * <InputGroupAddon>.com</InputGroupAddon>\n * </InputGroup>\n */\nconst InputGroupRoot = ({\n children,\n disabled = false,\n error: groupErrorProp = false,\n className,\n containerClassName,\n testID,\n}: InputGroupProps) => {\n const colors = useThemeColors();\n const reactId = useId();\n const inputId = `nori-ui-input-${reactId}`;\n const describeId = `${inputId}-describe`;\n const [focused, setFocused] = useState(false);\n const inputRef = useRef<RNTextInputType | null>(null);\n\n // Stable identity (does not depend on render-cycle state) so the\n // useMemo below can leave it out of the dep array without lint noise.\n const focusInput = useCallback(() => {\n inputRef.current?.focus();\n }, []);\n\n // Walk children once, split into [prefix, input, suffix]. Anything that\n // isn't a recognised marker gets dropped — the API guarantees a single\n // integrated bar, not arbitrary slots.\n const childArray = Children.toArray(children);\n const inputIndex = childArray.findIndex(isInput);\n const inputElement = inputIndex >= 0 ? (childArray[inputIndex] as ReactElement<InputGroupInputProps>) : null;\n const prefixNodes = inputIndex >= 0 ? childArray.slice(0, inputIndex).filter(isAddon) : [];\n const suffixNodes = inputIndex >= 0 ? childArray.slice(inputIndex + 1).filter(isAddon) : [];\n\n // Lift label / helperText / error from the input element so the parent\n // can render them OUTSIDE the bordered field row (a normal field layout\n // wraps the box with label above and helper/error below).\n const inputProps = inputElement?.props ?? ({} as InputGroupInputProps);\n const label = inputProps.label;\n const helperText = inputProps.helperText;\n const inputError = inputProps.error;\n\n const hasError = Boolean(groupErrorProp) || Boolean(inputError);\n\n const ctx = useMemo<InputGroupContextValue>(\n () => ({\n inputId,\n describeId,\n setFocused,\n hasError,\n disabled,\n inputRef,\n focusInput,\n }),\n [inputId, describeId, hasError, disabled, focusInput]\n );\n\n const borderColor = hasError\n ? colors.color.danger\n : focused\n ? colors.semantic.interactive.primary\n : colors.semantic.border.default;\n\n const fieldStyle = [\n FIELD_LAYOUT_BASE,\n {\n borderRadius: px(colors.radius.md),\n backgroundColor: colors.semantic.background.elevated,\n borderColor,\n },\n disabled ? { opacity: 0.6 } : null,\n ];\n\n const labelStyle: TextStyle = {\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n fontWeight: colors.fontWeight.medium as '500',\n color: colors.semantic.text.default,\n };\n const helperStyle: TextStyle = {\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n color: colors.semantic.text.muted,\n };\n const errorStyle: TextStyle = {\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n color: colors.color.danger,\n };\n const containerStyle: ViewStyle = { ...CONTAINER_LAYOUT_BASE, gap: px(colors.spacing['1']) };\n\n return (\n <View\n {...(testID !== undefined ? { testID } : {})}\n className={cn('flex flex-col gap-1', containerClassName)}\n style={containerStyle}\n >\n {label !== undefined ? (\n // On web we render a real <label htmlFor> so clicking the\n // label focuses the input the standard a11y way (and so\n // jsdom-based tests can assert the label↔input\n // association via the `for` attribute).\n //\n // On native, raw <label> is not a valid host component\n // and RN crashes with \"View config getter callback for\n // component `label` must be a function\". The native\n // path renders an RNText instead — the underlying\n // RNTextInput still carries accessibilityLabel for\n // screen readers, so the visible text + the a11y name\n // remain in sync. Same web-only `<label>` story as\n // TextInput's earlier iteration; this branch is the\n // explicit native-safe fallback.\n Platform.OS === 'web' ? (\n <label\n htmlFor={inputId}\n className=\"text-sm font-medium text-semantic-text-default\"\n style={labelStyle as object}\n >\n {label}\n </label>\n ) : (\n <RNText\n nativeID={`${inputId}-label`}\n accessibilityRole=\"text\"\n className=\"text-sm font-medium text-semantic-text-default\"\n style={labelStyle}\n >\n {label}\n </RNText>\n )\n ) : null}\n <InputGroupContext.Provider value={ctx}>\n <View\n className={cn(\n 'flex-row items-stretch overflow-hidden rounded-md border focus-within:border-semantic-interactive-primary',\n hasError ? 'border-semantic-interactive-destructive' : 'border-semantic-border-default',\n disabled ? 'opacity-60' : undefined,\n className\n )}\n style={fieldStyle}\n >\n {prefixNodes.map((node, i) => {\n const key = (node as ReactElement & { key?: string | null }).key ?? `prefix-${i}`;\n return (\n <AddonSlot key={key} side=\"left\">\n {node}\n </AddonSlot>\n );\n })}\n {inputElement}\n {suffixNodes.map((node, i) => {\n const key = (node as ReactElement & { key?: string | null }).key ?? `suffix-${i}`;\n return (\n <AddonSlot key={key} side=\"right\">\n {node}\n </AddonSlot>\n );\n })}\n </View>\n </InputGroupContext.Provider>\n {inputError ? (\n <RNText\n nativeID={describeId}\n className=\"text-sm text-semantic-interactive-destructive\"\n style={errorStyle}\n >\n {inputError}\n </RNText>\n ) : helperText ? (\n <RNText nativeID={describeId} className=\"text-sm text-semantic-text-muted\" style={helperStyle}>\n {helperText}\n </RNText>\n ) : null}\n </View>\n );\n};\n\n// ─── Addon slot ───────────────────────────────────────────────────────────\n//\n// Internal wrapper that paints the muted background, draws the 1px vertical\n// separator on the input-facing side, and forwards a click to the input so\n// the addon reads as decorator, not as something interactive.\nconst AddonSlot = ({ children, side }: { children: ReactNode; side: 'left' | 'right' }) => {\n const colors = useThemeColors();\n const ctx = useContext(InputGroupContext);\n const dim = ctx?.disabled ? 0.85 : 1;\n\n const baseStyle: ViewStyle = {\n backgroundColor: colors.semantic.background.subtle,\n paddingHorizontal: px(colors.spacing['3']),\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n opacity: dim,\n };\n\n const separatorStyle: ViewStyle =\n side === 'left'\n ? { borderRightWidth: 1, borderRightColor: colors.semantic.border.default }\n : { borderLeftWidth: 1, borderLeftColor: colors.semantic.border.default };\n\n const handlePress = () => {\n ctx?.focusInput();\n };\n\n return (\n <Pressable\n // Pressing the addon focuses the input — addons are decorators,\n // never tab stops. RN's `accessibilityRole` doesn't accept \"presentation\"\n // (web-only), so we set the WAI-ARIA role via the web prop instead.\n onPress={handlePress}\n role=\"none\"\n // RN web maps `focusable={false}` to `tabIndex={-1}`.\n focusable={false}\n style={[baseStyle, separatorStyle]}\n className={cn(\n 'flex-row items-center justify-center px-3 bg-semantic-background-subtle',\n side === 'right' ? 'border-l border-semantic-border-default' : 'border-r border-semantic-border-default'\n )}\n >\n {children}\n </Pressable>\n );\n};\n\n// ─── Addon (public) ───────────────────────────────────────────────────────\n\nexport type InputGroupAddonProps = {\n children: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/**\n * Decorator slot inside an `<InputGroup>`. Renders a muted, non-interactive\n * box that visually fuses with the input. Place before `<InputGroupInput>`\n * for a prefix, after for a suffix. Accepts strings or `ReactNode` (icons).\n */\nexport const InputGroupAddon = ({ children, className, testID }: InputGroupAddonProps) => {\n const colors = useThemeColors();\n const textStyle: TextStyle = {\n color: colors.semantic.text.muted,\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n };\n\n // Wrap raw strings/numbers so consumers can pass `\"@\"` or `<MailIcon />`\n // and both render correctly without callers tripping over RN's \"text\n // outside of <Text>\" warning.\n if (typeof children === 'string' || typeof children === 'number') {\n return (\n <RNText\n {...(testID !== undefined ? { testID } : {})}\n className={cn('text-sm text-semantic-text-muted', className)}\n style={textStyle}\n >\n {children}\n </RNText>\n );\n }\n\n return (\n <View {...(testID !== undefined ? { testID } : {})} {...(className !== undefined ? { className } : {})}>\n {children}\n </View>\n );\n};\n\n// Brand the function so the parent can locate it via Children.toArray walk.\n(InputGroupAddon as unknown as { __noriType: symbol }).__noriType = ADDON_TYPE;\n\n// ─── Input (public) ───────────────────────────────────────────────────────\n\n// Layout-only base; theme-driven dimensions are merged inside InputGroupInput.\nconst INPUT_LAYOUT_BASE: TextStyle = {\n flex: 1,\n // RN web honours `outlineStyle: 'none'` to suppress the default browser\n // focus ring — the group's own focus-within border replaces it.\n outlineStyle: 'none' as unknown as TextStyle['outlineStyle'],\n};\n\nexport type InputGroupInputProps = TextInputProps & {\n /** Label rendered above the bordered field row by the parent InputGroup. */\n label?: string;\n /** Helper text rendered below the bordered field row by the parent InputGroup. */\n helperText?: string;\n /** Error message rendered below the bordered field row by the parent InputGroup. */\n error?: string;\n};\n\n/**\n * The text field inside an `<InputGroup>`. Extends the full `TextInput` API\n * (label, helperText, error, disabled, etc.) so consumers don't lose any\n * functionality when reaching for the integrated layout.\n *\n * Implementation note: this renders a bare RN `TextInput` because the\n * surrounding `<InputGroup>` already paints the border + label + helper —\n * those bits are lifted to the parent so they render OUTSIDE the bordered\n * field row, the way a normal field's label/helper sits above/below the box.\n */\nexport const InputGroupInput = ({\n label: _label,\n helperText: _helperText,\n error,\n disabled,\n onChangeText,\n onFocus,\n onBlur,\n multiline,\n numberOfLines,\n leading: _leading,\n trailing: _trailing,\n containerClassName: _containerClassName,\n className,\n testID,\n ...rest\n}: InputGroupInputProps) => {\n const colors = useThemeColors();\n const ctx = useInputGroupContext('InputGroupInput');\n const inputId = ctx.inputId;\n const describeId = ctx.describeId;\n const isDisabled = disabled || ctx.disabled;\n const hasError = Boolean(error) || ctx.hasError;\n\n const inputExtras: Record<string, unknown> = {};\n if (testID !== undefined) {\n inputExtras.testID = testID;\n }\n if (_label !== undefined) {\n inputExtras.accessibilityLabel = _label;\n }\n if (hasError) {\n inputExtras['aria-invalid'] = true;\n }\n if (error || _helperText) {\n inputExtras['aria-describedby'] = describeId;\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 ...INPUT_LAYOUT_BASE,\n paddingVertical: px(colors.spacing['2']),\n paddingHorizontal: px(colors.spacing['3']),\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.md),\n color: colors.semantic.text.default,\n };\n\n return (\n <RNTextInput\n ref={(node) => {\n ctx.inputRef.current = node;\n }}\n nativeID={inputId}\n editable={!isDisabled}\n className={cn('flex-1 py-2 px-3 text-md text-semantic-text-default outline-none bg-transparent', className)}\n placeholderTextColor={colors.semantic.text.muted}\n onFocus={(e) => {\n ctx.setFocused(true);\n onFocus?.(e);\n }}\n onBlur={(e) => {\n ctx.setFocused(false);\n onBlur?.(e);\n }}\n {...inputExtras}\n {...rest}\n style={[inputStyle, rest.style]}\n />\n );\n};\n\n(InputGroupInput as unknown as { __noriType: symbol }).__noriType = INPUT_TYPE;\n\n/**\n * Public `InputGroup` value — the root function plus its `.Addon` and `.Input`\n * static members. `Object.assign` produces a value whose inferred type carries\n * the static properties, so `.d.ts` consumers can write `<InputGroup.Addon>`\n * without a separate import.\n */\nexport const InputGroup = Object.assign(InputGroupRoot, {\n Addon: InputGroupAddon,\n Input: InputGroupInput,\n});\n"]}
1
+ {"version":3,"sources":["../src/components/InputGroup/InputGroup.tsx"],"names":["RNText","RNTextInput"],"mappings":"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","file":"chunk-C5HQPXRI.js","sourcesContent":["'use client';\n\nimport {\n Children,\n createContext,\n isValidElement,\n type ReactElement,\n type ReactNode,\n useCallback,\n useContext,\n useId,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { TextInput as RNTextInputType, TextStyle, ViewStyle } from 'react-native';\nimport { Platform, Pressable, Text as RNText, TextInput as RNTextInput, View } from 'react-native';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\nimport type { TextInputProps } from '../TextInput/TextInput';\n\n// ─── Internal context ─────────────────────────────────────────────────────\n//\n// Lets the addons + input share focus, error, and disabled state so the\n// WHOLE group's border lights up on focus and dimming cascades visually\n// without consumers having to duplicate props on every child.\ntype InputGroupContextValue = {\n inputId: string;\n describeId: string;\n setFocused: (next: boolean) => void;\n hasError: boolean;\n disabled: boolean;\n inputRef: React.MutableRefObject<RNTextInputType | null>;\n focusInput: () => void;\n};\n\nconst InputGroupContext = createContext<InputGroupContextValue | null>(null);\n\nconst useInputGroupContext = (label: string): InputGroupContextValue => {\n const ctx = useContext(InputGroupContext);\n if (!ctx) {\n throw new Error(`<${label}> must be rendered inside an <InputGroup>.`);\n }\n return ctx;\n};\n\n// Marker symbols on the child component functions so we can split children\n// into [prefix, input, suffix] without forcing consumers to pass `position`\n// props or use named slots. Whatever sits before the InputGroupInput is a\n// prefix; whatever sits after is a suffix.\nconst ADDON_TYPE = Symbol.for('nori-ui.InputGroupAddon');\nconst INPUT_TYPE = Symbol.for('nori-ui.InputGroupInput');\n\nconst isAddon = (child: unknown): child is ReactElement =>\n isValidElement(child) && (child.type as { __noriType?: symbol })?.__noriType === ADDON_TYPE;\n\nconst isInput = (child: unknown): child is ReactElement<InputGroupInputProps> =>\n isValidElement(child) && (child.type as { __noriType?: symbol })?.__noriType === INPUT_TYPE;\n\n// ─── Container ────────────────────────────────────────────────────────────\n\n// Layout-only bases; theme-driven dimensions are merged inside the\n// component below.\nconst CONTAINER_LAYOUT_BASE: ViewStyle = { flexDirection: 'column' };\nconst FIELD_LAYOUT_BASE: ViewStyle = {\n flexDirection: 'row',\n alignItems: 'stretch',\n borderWidth: 1,\n overflow: 'hidden',\n};\n\nexport type InputGroupProps = {\n children: ReactNode;\n /** Mark the entire group as disabled — cascades visually to addons + input. */\n disabled?: boolean;\n /** Mark the entire group as errored — cascades visually to addons + input. */\n error?: boolean;\n className?: string;\n containerClassName?: string;\n testID?: string;\n};\n\n/**\n * Wrapper that visually fuses prefix and/or suffix addons with a TextInput\n * into a SINGLE rounded field — one border around the whole compound, not\n * three separate boxes. Inspired by Chakra's InputGroup and shadcn's input\n * addon pattern.\n *\n * @example\n * <InputGroup>\n * <InputGroupAddon>@</InputGroupAddon>\n * <InputGroupInput placeholder=\"username\" />\n * </InputGroup>\n *\n * @example with both prefix and suffix\n * <InputGroup>\n * <InputGroupAddon>https://</InputGroupAddon>\n * <InputGroupInput defaultValue=\"example\" />\n * <InputGroupAddon>.com</InputGroupAddon>\n * </InputGroup>\n */\nconst InputGroupRoot = ({\n children,\n disabled = false,\n error: groupErrorProp = false,\n className,\n containerClassName,\n testID,\n}: InputGroupProps) => {\n const colors = useThemeColors();\n const reactId = useId();\n const inputId = `nori-ui-input-${reactId}`;\n const describeId = `${inputId}-describe`;\n const [focused, setFocused] = useState(false);\n const inputRef = useRef<RNTextInputType | null>(null);\n\n // Stable identity (does not depend on render-cycle state) so the\n // useMemo below can leave it out of the dep array without lint noise.\n const focusInput = useCallback(() => {\n inputRef.current?.focus();\n }, []);\n\n // Walk children once, split into [prefix, input, suffix]. Anything that\n // isn't a recognised marker gets dropped — the API guarantees a single\n // integrated bar, not arbitrary slots.\n const childArray = Children.toArray(children);\n const inputIndex = childArray.findIndex(isInput);\n const inputElement = inputIndex >= 0 ? (childArray[inputIndex] as ReactElement<InputGroupInputProps>) : null;\n const prefixNodes = inputIndex >= 0 ? childArray.slice(0, inputIndex).filter(isAddon) : [];\n const suffixNodes = inputIndex >= 0 ? childArray.slice(inputIndex + 1).filter(isAddon) : [];\n\n // Lift label / helperText / error from the input element so the parent\n // can render them OUTSIDE the bordered field row (a normal field layout\n // wraps the box with label above and helper/error below).\n const inputProps = inputElement?.props ?? ({} as InputGroupInputProps);\n const label = inputProps.label;\n const helperText = inputProps.helperText;\n const inputError = inputProps.error;\n\n const hasError = Boolean(groupErrorProp) || Boolean(inputError);\n\n const ctx = useMemo<InputGroupContextValue>(\n () => ({\n inputId,\n describeId,\n setFocused,\n hasError,\n disabled,\n inputRef,\n focusInput,\n }),\n [inputId, describeId, hasError, disabled, focusInput]\n );\n\n const borderColor = hasError\n ? colors.color.danger\n : focused\n ? colors.semantic.interactive.primary\n : colors.semantic.border.default;\n\n const fieldStyle = [\n FIELD_LAYOUT_BASE,\n {\n borderRadius: px(colors.radius.md),\n backgroundColor: colors.semantic.background.elevated,\n borderColor,\n },\n disabled ? { opacity: 0.6 } : null,\n ];\n\n const labelStyle: TextStyle = {\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n fontWeight: colors.fontWeight.medium as '500',\n color: colors.semantic.text.default,\n };\n const helperStyle: TextStyle = {\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n color: colors.semantic.text.muted,\n };\n const errorStyle: TextStyle = {\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n color: colors.color.danger,\n };\n const containerStyle: ViewStyle = { ...CONTAINER_LAYOUT_BASE, gap: px(colors.spacing['1']) };\n\n return (\n <View\n {...(testID !== undefined ? { testID } : {})}\n className={cn('flex flex-col gap-1', containerClassName)}\n style={containerStyle}\n >\n {label !== undefined ? (\n // On web we render a real <label htmlFor> so clicking the\n // label focuses the input the standard a11y way (and so\n // jsdom-based tests can assert the label↔input\n // association via the `for` attribute).\n //\n // On native, raw <label> is not a valid host component\n // and RN crashes with \"View config getter callback for\n // component `label` must be a function\". The native\n // path renders an RNText instead — the underlying\n // RNTextInput still carries accessibilityLabel for\n // screen readers, so the visible text + the a11y name\n // remain in sync. Same web-only `<label>` story as\n // TextInput's earlier iteration; this branch is the\n // explicit native-safe fallback.\n Platform.OS === 'web' ? (\n <label\n htmlFor={inputId}\n className=\"text-sm font-medium text-semantic-text-default\"\n style={labelStyle as object}\n >\n {label}\n </label>\n ) : (\n <RNText\n nativeID={`${inputId}-label`}\n accessibilityRole=\"text\"\n className=\"text-sm font-medium text-semantic-text-default\"\n style={labelStyle}\n >\n {label}\n </RNText>\n )\n ) : null}\n <InputGroupContext.Provider value={ctx}>\n <View\n className={cn(\n 'flex-row items-stretch overflow-hidden rounded-md border focus-within:border-semantic-interactive-primary',\n hasError ? 'border-semantic-interactive-destructive' : 'border-semantic-border-default',\n disabled ? 'opacity-60' : undefined,\n className\n )}\n style={fieldStyle}\n >\n {prefixNodes.map((node, i) => {\n const key = (node as ReactElement & { key?: string | null }).key ?? `prefix-${i}`;\n return (\n <AddonSlot key={key} side=\"left\">\n {node}\n </AddonSlot>\n );\n })}\n {inputElement}\n {suffixNodes.map((node, i) => {\n const key = (node as ReactElement & { key?: string | null }).key ?? `suffix-${i}`;\n return (\n <AddonSlot key={key} side=\"right\">\n {node}\n </AddonSlot>\n );\n })}\n </View>\n </InputGroupContext.Provider>\n {inputError ? (\n <RNText\n nativeID={describeId}\n className=\"text-sm text-semantic-interactive-destructive\"\n style={errorStyle}\n >\n {inputError}\n </RNText>\n ) : helperText ? (\n <RNText nativeID={describeId} className=\"text-sm text-semantic-text-muted\" style={helperStyle}>\n {helperText}\n </RNText>\n ) : null}\n </View>\n );\n};\n\n// ─── Addon slot ───────────────────────────────────────────────────────────\n//\n// Internal wrapper that paints the muted background, draws the 1px vertical\n// separator on the input-facing side, and forwards a click to the input so\n// the addon reads as decorator, not as something interactive.\nconst AddonSlot = ({ children, side }: { children: ReactNode; side: 'left' | 'right' }) => {\n const colors = useThemeColors();\n const ctx = useContext(InputGroupContext);\n const dim = ctx?.disabled ? 0.85 : 1;\n\n const baseStyle: ViewStyle = {\n backgroundColor: colors.semantic.background.subtle,\n paddingHorizontal: px(colors.spacing['3']),\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n opacity: dim,\n };\n\n const separatorStyle: ViewStyle =\n side === 'left'\n ? { borderRightWidth: 1, borderRightColor: colors.semantic.border.default }\n : { borderLeftWidth: 1, borderLeftColor: colors.semantic.border.default };\n\n const handlePress = () => {\n ctx?.focusInput();\n };\n\n return (\n <Pressable\n // Pressing the addon focuses the input — addons are decorators,\n // never tab stops. RN's `accessibilityRole` doesn't accept \"presentation\"\n // (web-only), so we set the WAI-ARIA role via the web prop instead.\n onPress={handlePress}\n role=\"none\"\n // RN web maps `focusable={false}` to `tabIndex={-1}`.\n focusable={false}\n style={[baseStyle, separatorStyle]}\n className={cn(\n 'flex-row items-center justify-center px-3 bg-semantic-background-subtle',\n side === 'right' ? 'border-l border-semantic-border-default' : 'border-r border-semantic-border-default'\n )}\n >\n {children}\n </Pressable>\n );\n};\n\n// ─── Addon (public) ───────────────────────────────────────────────────────\n\nexport type InputGroupAddonProps = {\n children: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/**\n * Decorator slot inside an `<InputGroup>`. Renders a muted, non-interactive\n * box that visually fuses with the input. Place before `<InputGroupInput>`\n * for a prefix, after for a suffix. Accepts strings or `ReactNode` (icons).\n */\nexport const InputGroupAddon = ({ children, className, testID }: InputGroupAddonProps) => {\n const colors = useThemeColors();\n const textStyle: TextStyle = {\n color: colors.semantic.text.muted,\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n };\n\n // Wrap raw strings/numbers so consumers can pass `\"@\"` or `<MailIcon />`\n // and both render correctly without callers tripping over RN's \"text\n // outside of <Text>\" warning.\n if (typeof children === 'string' || typeof children === 'number') {\n return (\n <RNText\n {...(testID !== undefined ? { testID } : {})}\n className={cn('text-sm text-semantic-text-muted', className)}\n style={textStyle}\n >\n {children}\n </RNText>\n );\n }\n\n return (\n <View {...(testID !== undefined ? { testID } : {})} {...(className !== undefined ? { className } : {})}>\n {children}\n </View>\n );\n};\n\n// Brand the function so the parent can locate it via Children.toArray walk.\n(InputGroupAddon as unknown as { __noriType: symbol }).__noriType = ADDON_TYPE;\n\n// ─── Input (public) ───────────────────────────────────────────────────────\n\n// Layout-only base; theme-driven dimensions are merged inside InputGroupInput.\nconst INPUT_LAYOUT_BASE: TextStyle = {\n flex: 1,\n // RN web honours `outlineStyle: 'none'` to suppress the default browser\n // focus ring — the group's own focus-within border replaces it.\n outlineStyle: 'none' as unknown as TextStyle['outlineStyle'],\n};\n\nexport type InputGroupInputProps = TextInputProps & {\n /** Label rendered above the bordered field row by the parent InputGroup. */\n label?: string;\n /** Helper text rendered below the bordered field row by the parent InputGroup. */\n helperText?: string;\n /** Error message rendered below the bordered field row by the parent InputGroup. */\n error?: string;\n};\n\n/**\n * The text field inside an `<InputGroup>`. Extends the full `TextInput` API\n * (label, helperText, error, disabled, etc.) so consumers don't lose any\n * functionality when reaching for the integrated layout.\n *\n * Implementation note: this renders a bare RN `TextInput` because the\n * surrounding `<InputGroup>` already paints the border + label + helper —\n * those bits are lifted to the parent so they render OUTSIDE the bordered\n * field row, the way a normal field's label/helper sits above/below the box.\n */\nexport const InputGroupInput = ({\n label: _label,\n helperText: _helperText,\n error,\n disabled,\n onChangeText,\n onFocus,\n onBlur,\n multiline,\n numberOfLines,\n leading: _leading,\n trailing: _trailing,\n containerClassName: _containerClassName,\n className,\n testID,\n ...rest\n}: InputGroupInputProps) => {\n const colors = useThemeColors();\n const ctx = useInputGroupContext('InputGroupInput');\n const inputId = ctx.inputId;\n const describeId = ctx.describeId;\n const isDisabled = disabled || ctx.disabled;\n const hasError = Boolean(error) || ctx.hasError;\n\n const inputExtras: Record<string, unknown> = {};\n if (testID !== undefined) {\n inputExtras.testID = testID;\n }\n if (_label !== undefined) {\n inputExtras.accessibilityLabel = _label;\n }\n if (hasError) {\n inputExtras['aria-invalid'] = true;\n }\n if (error || _helperText) {\n inputExtras['aria-describedby'] = describeId;\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 ...INPUT_LAYOUT_BASE,\n paddingVertical: px(colors.spacing['2']),\n paddingHorizontal: px(colors.spacing['3']),\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.md),\n color: colors.semantic.text.default,\n };\n\n return (\n <RNTextInput\n ref={(node) => {\n ctx.inputRef.current = node;\n }}\n nativeID={inputId}\n editable={!isDisabled}\n className={cn('flex-1 py-2 px-3 text-md text-semantic-text-default outline-none bg-transparent', className)}\n placeholderTextColor={colors.semantic.text.muted}\n onFocus={(e) => {\n ctx.setFocused(true);\n onFocus?.(e);\n }}\n onBlur={(e) => {\n ctx.setFocused(false);\n onBlur?.(e);\n }}\n {...inputExtras}\n {...rest}\n style={[inputStyle, rest.style]}\n />\n );\n};\n\n(InputGroupInput as unknown as { __noriType: symbol }).__noriType = INPUT_TYPE;\n\n/**\n * Public `InputGroup` value — the root function plus its `.Addon` and `.Input`\n * static members. `Object.assign` produces a value whose inferred type carries\n * the static properties, so `.d.ts` consumers can write `<InputGroup.Addon>`\n * without a separate import.\n */\nexport const InputGroup = Object.assign(InputGroupRoot, {\n Addon: InputGroupAddon,\n Input: InputGroupInput,\n});\n"]}
@@ -1,5 +1,5 @@
1
1
  import { Spinner } from './chunk-ACLHDHX3.js';
2
- import { useTranslation } from './chunk-MJ4AGXS7.js';
2
+ import { useTranslation } from './chunk-GJMHNEQ3.js';
3
3
  import { px } from './chunk-5A2QOOVN.js';
4
4
  import { useThemeColors } from './chunk-R5JMDDCB.js';
5
5
  import { __name } from './chunk-WCQVDF3K.js';
@@ -282,5 +282,5 @@ var Field = Object.assign(FieldRoot, {
282
282
  });
283
283
 
284
284
  export { Field };
285
- //# sourceMappingURL=chunk-2UXKXUX2.js.map
286
- //# sourceMappingURL=chunk-2UXKXUX2.js.map
285
+ //# sourceMappingURL=chunk-CPIKN4BX.js.map
286
+ //# sourceMappingURL=chunk-CPIKN4BX.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Field/Field.tsx"],"names":["RNText"],"mappings":"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","file":"chunk-2UXKXUX2.js","sourcesContent":["'use client';\n\nimport {\n Children,\n cloneElement,\n createContext,\n isValidElement,\n type ReactElement,\n type ReactNode,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n} from 'react';\nimport { Pressable, Text as RNText, View } from 'react-native';\nimport { useTranslation } from '../../i18n/use-translation';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { Spinner } from '../Spinner';\n\ntype FieldContextValue = {\n fieldId: string;\n labelId: string;\n descriptionId: string;\n errorId: string;\n hasError: boolean;\n hasDescription: boolean;\n describedBy: string | undefined;\n disabled: boolean;\n required: boolean;\n validating: boolean;\n name?: string;\n error?: string | null;\n isGroup: boolean;\n};\n\nconst FieldContext = createContext<FieldContextValue | null>(null);\n\nconst useFieldContextStrict = (caller: string): FieldContextValue => {\n const ctx = useContext(FieldContext);\n if (!ctx) {\n throw new Error(`[Field] ${caller} must be used inside <Field> or <Field.Group>.`);\n }\n return ctx;\n};\n\nconst childHasDisplayName = (child: ReactNode, name: string): boolean => {\n if (!isValidElement(child)) {\n return false;\n }\n const t = child.type as { displayName?: string } | string;\n return typeof t !== 'string' && t?.displayName === name;\n};\n\n/** Display names that mark a compound-mode child. */\nconst COMPOUND_DISPLAY_NAMES = ['Field.Label', 'Field.Description', 'Field.Error', 'Field.Control'];\n\nconst isCompoundChild = (child: ReactNode): boolean =>\n COMPOUND_DISPLAY_NAMES.some((name) => childHasDisplayName(child, name));\n\nexport type FieldProps = {\n // Shorthand slot props\n label?: ReactNode;\n description?: ReactNode;\n error?: ReactNode;\n\n // State flags\n name?: string;\n required?: boolean;\n disabled?: boolean;\n validating?: boolean;\n\n // Layout\n orientation?: 'vertical' | 'horizontal';\n id?: string;\n\n children: ReactNode;\n className?: string;\n testID?: string;\n};\n\ntype FieldRootInternalProps = FieldProps & { isGroup?: boolean };\n\nconst FieldRoot = ({\n name,\n required = false,\n disabled = false,\n error = null,\n label,\n description,\n validating = false,\n orientation = 'vertical',\n id,\n children,\n className,\n testID,\n isGroup = false,\n}: FieldRootInternalProps) => {\n const colors = useThemeColors();\n const reactId = useId();\n const fieldId = id ?? `nori-ui-field-${reactId}`;\n const labelId = `${fieldId}-label`;\n const descriptionId = `${fieldId}-desc`;\n const errorId = `${fieldId}-error`;\n\n // ---------- mode detection ----------\n const isCompoundMode = useMemo(() => {\n let found = false;\n Children.forEach(children, (child) => {\n if (isCompoundChild(child)) {\n found = true;\n }\n });\n return found;\n }, [children]);\n\n // ---------- derive hasDescription / hasError ----------\n const hasDescription = useMemo(() => {\n if (!isCompoundMode) {\n return description !== undefined && description !== null && description !== false && description !== '';\n }\n let found = false;\n Children.forEach(children, (child) => {\n if (childHasDisplayName(child, 'Field.Description')) {\n found = true;\n }\n });\n return found;\n }, [isCompoundMode, description, children]);\n\n const hasError = useMemo(() => {\n if (!isCompoundMode) {\n return Boolean(error);\n }\n // compound mode: scan for Field.Error child with truthy children\n let found = false;\n Children.forEach(children, (child) => {\n if (childHasDisplayName(child, 'Field.Error') && isValidElement(child)) {\n const el = child as ReactElement<{ children?: ReactNode }>;\n if (\n el.props.children !== undefined &&\n el.props.children !== null &&\n el.props.children !== false &&\n el.props.children !== ''\n ) {\n found = true;\n }\n }\n });\n // also check the legacy `error` prop usage in compound mode\n if (!found && error !== null && error !== undefined && error !== false && error !== '') {\n found = true;\n }\n return found;\n }, [isCompoundMode, error, children]);\n\n const describedBy = useMemo(() => {\n const ids: string[] = [];\n if (hasDescription) {\n ids.push(descriptionId);\n }\n if (hasError) {\n ids.push(errorId);\n }\n return ids.length === 0 ? undefined : ids.join(' ');\n }, [hasDescription, hasError, descriptionId, errorId]);\n\n const value: FieldContextValue = {\n fieldId,\n labelId,\n descriptionId,\n errorId,\n hasError,\n hasDescription,\n describedBy,\n disabled,\n required,\n validating,\n ...(name !== undefined ? { name } : {}),\n // In compound mode pass `error` (string) so Field.Error can fall back to it.\n // In shorthand mode the error prop may be ReactNode; only pass when it is a string/null.\n ...(error !== null && error !== undefined && typeof error === 'string' ? { error } : {}),\n isGroup,\n };\n\n // ---------- dev warning for mixed usage ----------\n const warnedRef = useRef(false);\n useEffect(() => {\n if (process.env.NODE_ENV === 'production' || warnedRef.current) {\n return;\n }\n const hasShorthand = label !== undefined || description !== undefined || error !== undefined;\n if (hasShorthand && isCompoundMode) {\n warnedRef.current = true;\n // biome-ignore lint/suspicious/noConsole: intentional dev-mode warning\n console.warn(\n '[Field] Mixing shorthand props (label/description/error) with compound children (Field.Label/Field.Description/Field.Error) is not supported. The compound children will win. To suppress this warning, use only one mode.'\n );\n }\n }, [label, description, error, isCompoundMode]);\n\n // ---------- layout ----------\n const containerStyle =\n orientation === 'horizontal'\n ? {\n flexDirection: 'row' as const,\n alignItems: 'flex-start' as const,\n gap: px(colors.spacing['3']),\n }\n : { flexDirection: 'column' as const, gap: px(colors.spacing['1']) };\n\n const containerExtra: Record<string, unknown> = {};\n if (testID !== undefined) {\n containerExtra.testID = testID;\n }\n containerExtra['data-orientation'] = orientation;\n if (isGroup) {\n containerExtra.role = 'group';\n containerExtra['aria-labelledby'] = labelId;\n containerExtra.accessibilityRole = 'none';\n }\n if (validating) {\n containerExtra['data-validating'] = '';\n containerExtra['aria-busy'] = true;\n }\n\n // ---------- shorthand mode rendering ----------\n const renderShorthand = () => {\n // Determine if there's exactly one non-Field.* child we can auto-wrap.\n const childArray = Children.toArray(children);\n const controlChild =\n childArray.length === 1 && isValidElement(childArray[0]) ? (childArray[0] as ReactElement) : null;\n\n return (\n <>\n {label !== undefined && label !== null && label !== false ? <FieldLabel>{label}</FieldLabel> : null}\n {description !== undefined && description !== null && description !== false && description !== '' ? (\n <FieldDescription>{description}</FieldDescription>\n ) : null}\n {controlChild !== null ? <FieldControl>{controlChild}</FieldControl> : children}\n {error !== undefined && error !== null && error !== false && error !== '' ? (\n <FieldError>{error}</FieldError>\n ) : null}\n </>\n );\n };\n\n return (\n <FieldContext.Provider value={value}>\n <View style={containerStyle} {...(className !== undefined ? { className } : {})} {...containerExtra}>\n {isCompoundMode ? children : renderShorthand()}\n {validating ? <Spinner size=\"sm\" /> : null}\n </View>\n </FieldContext.Provider>\n );\n};\n\nconst FieldLabel = ({ children }: { children: ReactNode }) => {\n const ctx = useFieldContextStrict('Field.Label');\n const colors = useThemeColors();\n const { t } = useTranslation();\n const requiredIndicator = t('field.requiredIndicator');\n const requiredLabel = t('field.requiredLabel');\n\n const focusInput = () => {\n if (typeof document !== 'undefined') {\n const el = document.getElementById(ctx.fieldId);\n if (el && typeof (el as HTMLElement).focus === 'function') {\n (el as HTMLElement).focus();\n }\n }\n };\n\n return (\n <Pressable onPress={focusInput} accessibilityRole=\"none\" disabled={ctx.disabled}>\n <RNText\n nativeID={ctx.labelId}\n {...({ id: ctx.labelId } as Record<string, unknown>)}\n accessibilityRole=\"text\"\n style={{\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n fontWeight: colors.fontWeight.medium as '500',\n color: ctx.disabled ? colors.semantic.text.muted : colors.semantic.text.default,\n }}\n >\n {children}\n {ctx.required ? (\n <RNText\n accessibilityLabel={requiredLabel}\n {...({ 'aria-label': requiredLabel } as Record<string, unknown>)}\n style={{ color: colors.color.danger }}\n >\n {` ${requiredIndicator}`}\n </RNText>\n ) : null}\n </RNText>\n </Pressable>\n );\n};\nFieldLabel.displayName = 'Field.Label';\n\nconst FieldControl = ({ children }: { children: ReactElement }) => {\n const ctx = useFieldContextStrict('Field.Control');\n if (Children.count(children) !== 1 || !isValidElement(children)) {\n throw new Error('[Field.Control] expects exactly one child element.');\n }\n const child = children as ReactElement<Record<string, unknown>>;\n const merged: Record<string, unknown> = {\n id: child.props.id ?? ctx.fieldId,\n accessibilityLabelledBy: ctx.labelId,\n 'aria-labelledby': ctx.labelId,\n };\n if (ctx.name !== undefined && child.props.name === undefined) {\n merged.name = ctx.name;\n }\n if (ctx.describedBy !== undefined) {\n merged['aria-describedby'] = ctx.describedBy;\n merged.accessibilityDescribedBy = ctx.describedBy;\n }\n if (ctx.hasError) {\n merged['aria-invalid'] = true;\n }\n if (ctx.required) {\n merged['aria-required'] = true;\n }\n if (ctx.disabled || child.props.disabled) {\n merged.disabled = true;\n }\n return cloneElement(child, merged);\n};\nFieldControl.displayName = 'Field.Control';\n\nconst FieldDescription = ({ children }: { children: ReactNode }) => {\n const ctx = useFieldContextStrict('Field.Description');\n const colors = useThemeColors();\n return (\n <RNText\n nativeID={ctx.descriptionId}\n {...({ id: ctx.descriptionId } as Record<string, unknown>)}\n style={{\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n color: colors.semantic.text.muted,\n }}\n >\n {children}\n </RNText>\n );\n};\nFieldDescription.displayName = 'Field.Description';\n\nconst FieldError = ({ children }: { children?: ReactNode }) => {\n const ctx = useFieldContextStrict('Field.Error');\n const colors = useThemeColors();\n const content = children ?? ctx.error;\n if (content === null || content === undefined || content === '' || content === false) {\n return null;\n }\n return (\n <RNText\n nativeID={ctx.errorId}\n {...({ id: ctx.errorId, role: 'alert' } as Record<string, unknown>)}\n accessibilityRole=\"text\"\n style={{\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n color: colors.color.danger,\n }}\n >\n {content}\n </RNText>\n );\n};\nFieldError.displayName = 'Field.Error';\n\nexport type FieldGroupProps = Omit<FieldProps, 'name'>;\n\nconst FieldGroup = (props: FieldGroupProps) => <FieldRoot {...(props as FieldProps)} isGroup />;\nFieldGroup.displayName = 'Field.Group';\n\nexport const Field = Object.assign(FieldRoot as (props: FieldProps) => ReactElement, {\n Label: FieldLabel,\n Description: FieldDescription,\n Control: FieldControl,\n Error: FieldError,\n Group: FieldGroup,\n});\n"]}
1
+ {"version":3,"sources":["../src/components/Field/Field.tsx"],"names":["RNText"],"mappings":"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","file":"chunk-CPIKN4BX.js","sourcesContent":["'use client';\n\nimport {\n Children,\n cloneElement,\n createContext,\n isValidElement,\n type ReactElement,\n type ReactNode,\n useContext,\n useEffect,\n useId,\n useMemo,\n useRef,\n} from 'react';\nimport { Pressable, Text as RNText, View } from 'react-native';\nimport { useTranslation } from '../../i18n/use-translation';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { Spinner } from '../Spinner';\n\ntype FieldContextValue = {\n fieldId: string;\n labelId: string;\n descriptionId: string;\n errorId: string;\n hasError: boolean;\n hasDescription: boolean;\n describedBy: string | undefined;\n disabled: boolean;\n required: boolean;\n validating: boolean;\n name?: string;\n error?: string | null;\n isGroup: boolean;\n};\n\nconst FieldContext = createContext<FieldContextValue | null>(null);\n\nconst useFieldContextStrict = (caller: string): FieldContextValue => {\n const ctx = useContext(FieldContext);\n if (!ctx) {\n throw new Error(`[Field] ${caller} must be used inside <Field> or <Field.Group>.`);\n }\n return ctx;\n};\n\nconst childHasDisplayName = (child: ReactNode, name: string): boolean => {\n if (!isValidElement(child)) {\n return false;\n }\n const t = child.type as { displayName?: string } | string;\n return typeof t !== 'string' && t?.displayName === name;\n};\n\n/** Display names that mark a compound-mode child. */\nconst COMPOUND_DISPLAY_NAMES = ['Field.Label', 'Field.Description', 'Field.Error', 'Field.Control'];\n\nconst isCompoundChild = (child: ReactNode): boolean =>\n COMPOUND_DISPLAY_NAMES.some((name) => childHasDisplayName(child, name));\n\nexport type FieldProps = {\n // Shorthand slot props\n label?: ReactNode;\n description?: ReactNode;\n error?: ReactNode;\n\n // State flags\n name?: string;\n required?: boolean;\n disabled?: boolean;\n validating?: boolean;\n\n // Layout\n orientation?: 'vertical' | 'horizontal';\n id?: string;\n\n children: ReactNode;\n className?: string;\n testID?: string;\n};\n\ntype FieldRootInternalProps = FieldProps & { isGroup?: boolean };\n\nconst FieldRoot = ({\n name,\n required = false,\n disabled = false,\n error = null,\n label,\n description,\n validating = false,\n orientation = 'vertical',\n id,\n children,\n className,\n testID,\n isGroup = false,\n}: FieldRootInternalProps) => {\n const colors = useThemeColors();\n const reactId = useId();\n const fieldId = id ?? `nori-ui-field-${reactId}`;\n const labelId = `${fieldId}-label`;\n const descriptionId = `${fieldId}-desc`;\n const errorId = `${fieldId}-error`;\n\n // ---------- mode detection ----------\n const isCompoundMode = useMemo(() => {\n let found = false;\n Children.forEach(children, (child) => {\n if (isCompoundChild(child)) {\n found = true;\n }\n });\n return found;\n }, [children]);\n\n // ---------- derive hasDescription / hasError ----------\n const hasDescription = useMemo(() => {\n if (!isCompoundMode) {\n return description !== undefined && description !== null && description !== false && description !== '';\n }\n let found = false;\n Children.forEach(children, (child) => {\n if (childHasDisplayName(child, 'Field.Description')) {\n found = true;\n }\n });\n return found;\n }, [isCompoundMode, description, children]);\n\n const hasError = useMemo(() => {\n if (!isCompoundMode) {\n return Boolean(error);\n }\n // compound mode: scan for Field.Error child with truthy children\n let found = false;\n Children.forEach(children, (child) => {\n if (childHasDisplayName(child, 'Field.Error') && isValidElement(child)) {\n const el = child as ReactElement<{ children?: ReactNode }>;\n if (\n el.props.children !== undefined &&\n el.props.children !== null &&\n el.props.children !== false &&\n el.props.children !== ''\n ) {\n found = true;\n }\n }\n });\n // also check the legacy `error` prop usage in compound mode\n if (!found && error !== null && error !== undefined && error !== false && error !== '') {\n found = true;\n }\n return found;\n }, [isCompoundMode, error, children]);\n\n const describedBy = useMemo(() => {\n const ids: string[] = [];\n if (hasDescription) {\n ids.push(descriptionId);\n }\n if (hasError) {\n ids.push(errorId);\n }\n return ids.length === 0 ? undefined : ids.join(' ');\n }, [hasDescription, hasError, descriptionId, errorId]);\n\n const value: FieldContextValue = {\n fieldId,\n labelId,\n descriptionId,\n errorId,\n hasError,\n hasDescription,\n describedBy,\n disabled,\n required,\n validating,\n ...(name !== undefined ? { name } : {}),\n // In compound mode pass `error` (string) so Field.Error can fall back to it.\n // In shorthand mode the error prop may be ReactNode; only pass when it is a string/null.\n ...(error !== null && error !== undefined && typeof error === 'string' ? { error } : {}),\n isGroup,\n };\n\n // ---------- dev warning for mixed usage ----------\n const warnedRef = useRef(false);\n useEffect(() => {\n if (process.env.NODE_ENV === 'production' || warnedRef.current) {\n return;\n }\n const hasShorthand = label !== undefined || description !== undefined || error !== undefined;\n if (hasShorthand && isCompoundMode) {\n warnedRef.current = true;\n // biome-ignore lint/suspicious/noConsole: intentional dev-mode warning\n console.warn(\n '[Field] Mixing shorthand props (label/description/error) with compound children (Field.Label/Field.Description/Field.Error) is not supported. The compound children will win. To suppress this warning, use only one mode.'\n );\n }\n }, [label, description, error, isCompoundMode]);\n\n // ---------- layout ----------\n const containerStyle =\n orientation === 'horizontal'\n ? {\n flexDirection: 'row' as const,\n alignItems: 'flex-start' as const,\n gap: px(colors.spacing['3']),\n }\n : { flexDirection: 'column' as const, gap: px(colors.spacing['1']) };\n\n const containerExtra: Record<string, unknown> = {};\n if (testID !== undefined) {\n containerExtra.testID = testID;\n }\n containerExtra['data-orientation'] = orientation;\n if (isGroup) {\n containerExtra.role = 'group';\n containerExtra['aria-labelledby'] = labelId;\n containerExtra.accessibilityRole = 'none';\n }\n if (validating) {\n containerExtra['data-validating'] = '';\n containerExtra['aria-busy'] = true;\n }\n\n // ---------- shorthand mode rendering ----------\n const renderShorthand = () => {\n // Determine if there's exactly one non-Field.* child we can auto-wrap.\n const childArray = Children.toArray(children);\n const controlChild =\n childArray.length === 1 && isValidElement(childArray[0]) ? (childArray[0] as ReactElement) : null;\n\n return (\n <>\n {label !== undefined && label !== null && label !== false ? <FieldLabel>{label}</FieldLabel> : null}\n {description !== undefined && description !== null && description !== false && description !== '' ? (\n <FieldDescription>{description}</FieldDescription>\n ) : null}\n {controlChild !== null ? <FieldControl>{controlChild}</FieldControl> : children}\n {error !== undefined && error !== null && error !== false && error !== '' ? (\n <FieldError>{error}</FieldError>\n ) : null}\n </>\n );\n };\n\n return (\n <FieldContext.Provider value={value}>\n <View style={containerStyle} {...(className !== undefined ? { className } : {})} {...containerExtra}>\n {isCompoundMode ? children : renderShorthand()}\n {validating ? <Spinner size=\"sm\" /> : null}\n </View>\n </FieldContext.Provider>\n );\n};\n\nconst FieldLabel = ({ children }: { children: ReactNode }) => {\n const ctx = useFieldContextStrict('Field.Label');\n const colors = useThemeColors();\n const { t } = useTranslation();\n const requiredIndicator = t('field.requiredIndicator');\n const requiredLabel = t('field.requiredLabel');\n\n const focusInput = () => {\n if (typeof document !== 'undefined') {\n const el = document.getElementById(ctx.fieldId);\n if (el && typeof (el as HTMLElement).focus === 'function') {\n (el as HTMLElement).focus();\n }\n }\n };\n\n return (\n <Pressable onPress={focusInput} accessibilityRole=\"none\" disabled={ctx.disabled}>\n <RNText\n nativeID={ctx.labelId}\n {...({ id: ctx.labelId } as Record<string, unknown>)}\n accessibilityRole=\"text\"\n style={{\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n fontWeight: colors.fontWeight.medium as '500',\n color: ctx.disabled ? colors.semantic.text.muted : colors.semantic.text.default,\n }}\n >\n {children}\n {ctx.required ? (\n <RNText\n accessibilityLabel={requiredLabel}\n {...({ 'aria-label': requiredLabel } as Record<string, unknown>)}\n style={{ color: colors.color.danger }}\n >\n {` ${requiredIndicator}`}\n </RNText>\n ) : null}\n </RNText>\n </Pressable>\n );\n};\nFieldLabel.displayName = 'Field.Label';\n\nconst FieldControl = ({ children }: { children: ReactElement }) => {\n const ctx = useFieldContextStrict('Field.Control');\n if (Children.count(children) !== 1 || !isValidElement(children)) {\n throw new Error('[Field.Control] expects exactly one child element.');\n }\n const child = children as ReactElement<Record<string, unknown>>;\n const merged: Record<string, unknown> = {\n id: child.props.id ?? ctx.fieldId,\n accessibilityLabelledBy: ctx.labelId,\n 'aria-labelledby': ctx.labelId,\n };\n if (ctx.name !== undefined && child.props.name === undefined) {\n merged.name = ctx.name;\n }\n if (ctx.describedBy !== undefined) {\n merged['aria-describedby'] = ctx.describedBy;\n merged.accessibilityDescribedBy = ctx.describedBy;\n }\n if (ctx.hasError) {\n merged['aria-invalid'] = true;\n }\n if (ctx.required) {\n merged['aria-required'] = true;\n }\n if (ctx.disabled || child.props.disabled) {\n merged.disabled = true;\n }\n return cloneElement(child, merged);\n};\nFieldControl.displayName = 'Field.Control';\n\nconst FieldDescription = ({ children }: { children: ReactNode }) => {\n const ctx = useFieldContextStrict('Field.Description');\n const colors = useThemeColors();\n return (\n <RNText\n nativeID={ctx.descriptionId}\n {...({ id: ctx.descriptionId } as Record<string, unknown>)}\n style={{\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n color: colors.semantic.text.muted,\n }}\n >\n {children}\n </RNText>\n );\n};\nFieldDescription.displayName = 'Field.Description';\n\nconst FieldError = ({ children }: { children?: ReactNode }) => {\n const ctx = useFieldContextStrict('Field.Error');\n const colors = useThemeColors();\n const content = children ?? ctx.error;\n if (content === null || content === undefined || content === '' || content === false) {\n return null;\n }\n return (\n <RNText\n nativeID={ctx.errorId}\n {...({ id: ctx.errorId, role: 'alert' } as Record<string, unknown>)}\n accessibilityRole=\"text\"\n style={{\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n color: colors.color.danger,\n }}\n >\n {content}\n </RNText>\n );\n};\nFieldError.displayName = 'Field.Error';\n\nexport type FieldGroupProps = Omit<FieldProps, 'name'>;\n\nconst FieldGroup = (props: FieldGroupProps) => <FieldRoot {...(props as FieldProps)} isGroup />;\nFieldGroup.displayName = 'Field.Group';\n\nexport const Field = Object.assign(FieldRoot as (props: FieldProps) => ReactElement, {\n Label: FieldLabel,\n Description: FieldDescription,\n Control: FieldControl,\n Error: FieldError,\n Group: FieldGroup,\n});\n"]}
@@ -1,6 +1,6 @@
1
- import { cn } from './chunk-CHXHRJNZ.js';
2
1
  import { px } from './chunk-5A2QOOVN.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 { createContext, useId, useState, useRef, useCallback, useMemo, useEffect, useContext } from 'react';
6
6
  import { View, Pressable, Text } from 'react-native';
@@ -302,5 +302,5 @@ var Tabs = Object.assign(TabsRoot, {
302
302
  });
303
303
 
304
304
  export { Tabs };
305
- //# sourceMappingURL=chunk-GELLSU64.js.map
306
- //# sourceMappingURL=chunk-GELLSU64.js.map
305
+ //# sourceMappingURL=chunk-EN4CLDGZ.js.map
306
+ //# sourceMappingURL=chunk-EN4CLDGZ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Tabs/Tabs.tsx"],"names":["RNText"],"mappings":"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","file":"chunk-GELLSU64.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 { ViewStyle } from 'react-native';\nimport { Pressable, Text as RNText, View } from 'react-native';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\n\nexport type TabsOrientation = 'horizontal' | 'vertical';\nexport type TabsActivation = 'automatic' | 'manual';\n\ntype TabsContextValue = {\n value: string | undefined;\n setValue: (next: string) => void;\n baseId: string;\n orientation: TabsOrientation;\n activation: TabsActivation;\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 TabsContext = createContext<TabsContextValue | null>(null);\n\nconst useTabsContext = (label: string): TabsContextValue => {\n const ctx = useContext(TabsContext);\n if (!ctx) {\n throw new Error(`<${label}> must be rendered inside a <Tabs>.`);\n }\n return ctx;\n};\n\nexport type TabsProps = {\n /** Controlled active tab value. */\n value?: string;\n /** Uncontrolled initial value. */\n defaultValue?: string;\n /** Fires with the new value when the active tab changes. */\n onChange?: (next: string) => void;\n /**\n * Layout direction of the tablist. Drives the keyboard-nav axis.\n * @defaultValue 'horizontal'\n */\n orientation?: TabsOrientation;\n /**\n * Whether arrow keys also activate the focused tab.\n * - `automatic` (default) — selection follows focus, matching most UIs.\n * - `manual` — arrow keys move focus only; the user presses Enter or\n * Space to activate. Use when activating a tab is expensive.\n * @defaultValue 'automatic'\n */\n activation?: TabsActivation;\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/**\n * Tab pattern with keyboard nav, roving tabindex, and content/trigger\n * association via shared `value`s. Compose:\n *\n * <Tabs defaultValue=\"overview\">\n * <TabsList>\n * <TabsTrigger value=\"overview\">Overview</TabsTrigger>\n * <TabsTrigger value=\"settings\">Settings</TabsTrigger>\n * </TabsList>\n * <TabsContent value=\"overview\">…</TabsContent>\n * <TabsContent value=\"settings\">…</TabsContent>\n * </Tabs>\n *\n * Follows the WAI-ARIA tablist pattern: `tablist` / `tab` / `tabpanel` roles,\n * arrow-key navigation that wraps, Home/End for first/last, and roving\n * tabindex so tabbing into the group lands on the active tab.\n */\nconst TabsRoot = ({\n value,\n defaultValue,\n onChange,\n orientation = 'horizontal',\n activation = 'automatic',\n children,\n className,\n testID,\n}: TabsProps) => {\n const baseId = useId();\n const [inner, setInner] = useState<string | undefined>(defaultValue);\n const isControlled = value !== undefined;\n const current = isControlled ? value : inner;\n\n const refs = useRef<Map<string, RefObject<HTMLElement | null>>>(new Map());\n const orderRef = useRef<string[]>([]);\n\n const setValue = useCallback(\n (next: string) => {\n if (!isControlled) {\n setInner(next);\n }\n onChange?.(next);\n },\n [isControlled, onChange]\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 focusValue = useCallback(\n (next: string) => {\n const ref = refs.current.get(next);\n ref?.current?.focus?.();\n if (activation === 'automatic') {\n setValue(next);\n }\n },\n [activation, setValue]\n );\n\n const moveFocus = useCallback(\n (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 focusValue(next);\n }\n },\n [focusValue]\n );\n\n const focusEdge = useCallback(\n (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 focusValue(target);\n }\n },\n [focusValue]\n );\n\n const ctxValue = useMemo<TabsContextValue>(\n () => ({\n value: current,\n setValue,\n baseId,\n orientation,\n activation,\n register,\n unregister,\n moveFocus,\n focusEdge,\n }),\n [current, setValue, baseId, orientation, activation, register, unregister, moveFocus, focusEdge]\n );\n\n return (\n <TabsContext.Provider value={ctxValue}>\n <TabsViewport\n orientation={orientation}\n {...(className !== undefined ? { className } : {})}\n {...(testID !== undefined ? { testID } : {})}\n >\n {children}\n </TabsViewport>\n </TabsContext.Provider>\n );\n};\n\n// Inner view so we can call useThemeColors() to source the orientation\n// gap from the spacing token scale.\nconst TabsViewport = ({\n orientation,\n className,\n testID,\n children,\n}: {\n orientation: TabsOrientation;\n className?: string;\n testID?: string;\n children?: ReactNode;\n}) => {\n const colors = useThemeColors();\n return (\n <View\n {...(testID !== undefined ? { testID } : {})}\n className={cn(orientation === 'vertical' ? 'flex-row gap-4' : 'flex-col gap-3', className)}\n style={\n orientation === 'vertical'\n ? { flexDirection: 'row', gap: px(colors.spacing['4']) }\n : { flexDirection: 'column', gap: px(colors.spacing['3']) }\n }\n >\n {children}\n </View>\n );\n};\n\nexport type TabsListProps = {\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n// Layout-only bases; theme-driven gap is merged inside TabsList.\nconst LIST_LAYOUT_BASE: ViewStyle = {\n flexDirection: 'row',\n alignItems: 'center',\n borderBottomWidth: 1,\n};\n\nconst LIST_VERTICAL_LAYOUT_BASE: ViewStyle = {\n flexDirection: 'column',\n alignItems: 'stretch',\n borderRightWidth: 1,\n};\n\n/** Container for `TabsTrigger`s. Renders the underline rule on the appropriate edge. */\nexport const TabsList = ({ children, className, testID }: TabsListProps) => {\n const ctx = useTabsContext('TabsList');\n const colors = useThemeColors();\n const gap = px(colors.spacing['1']);\n const listStyle: ViewStyle =\n ctx.orientation === 'vertical'\n ? { ...LIST_VERTICAL_LAYOUT_BASE, gap, borderRightColor: colors.semantic.border.default }\n : { ...LIST_LAYOUT_BASE, gap, borderBottomColor: colors.semantic.border.default };\n return (\n <View\n {...(testID !== undefined ? { testID } : {})}\n role=\"tablist\"\n accessibilityRole=\"tablist\"\n aria-orientation={ctx.orientation}\n className={cn(\n ctx.orientation === 'vertical'\n ? 'flex-col gap-1 border-r border-semantic-border-default'\n : 'flex-row items-center gap-1 border-b border-semantic-border-default',\n className\n )}\n style={listStyle}\n >\n {children}\n </View>\n );\n};\n\nexport type TabsTriggerProps = {\n /** Value linking this trigger to a `<TabsContent>`. */\n value: string;\n /** Disable just this trigger. */\n disabled?: boolean;\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n// Subtle 200ms ease on border + text color so the active tab indicator\n// fades in/out (and the trigger label colors smoothly between selected\n// and idle) instead of snapping. Web only — RN ignores the transition*\n// keys silently. We don't ship a true sliding magic-pill on either\n// platform yet; that would need react-native-reanimated and per-trigger\n// rect measurement, which is more complexity than this earns right now.\nconst TRIGGER_TRANSITION = {\n transitionProperty: 'border-color, color',\n transitionDuration: '200ms',\n transitionTimingFunction: 'ease',\n} as ViewStyle;\n\n// Layout / transition only; theme-driven padding is merged inside TabsTrigger.\nconst TRIGGER_LAYOUT_BASE: ViewStyle = {\n borderBottomWidth: 2,\n borderBottomColor: 'transparent',\n marginBottom: -1,\n ...TRIGGER_TRANSITION,\n};\n\nconst TRIGGER_LAYOUT_BASE_VERTICAL: ViewStyle = {\n borderRightWidth: 2,\n borderRightColor: 'transparent',\n marginRight: -1,\n ...TRIGGER_TRANSITION,\n};\n\n/** Clickable tab. Activating it shows the matching `TabsContent`. */\nexport const TabsTrigger = ({ value, disabled, children, className, testID }: TabsTriggerProps) => {\n const ctx = useTabsContext('TabsTrigger');\n const colors = useThemeColors();\n const ownRef = useRef<HTMLElement | null>(null);\n const selected = ctx.value === value;\n const isVertical = ctx.orientation === 'vertical';\n\n useEffect(() => {\n ctx.register(value, ownRef);\n return () => ctx.unregister(value);\n }, [ctx, value]);\n\n const onPress = useCallback(() => {\n if (disabled) {\n return;\n }\n ctx.setValue(value);\n }, [ctx, value, disabled]);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLElement>) => {\n const nextKey = isVertical ? 'ArrowDown' : 'ArrowRight';\n const prevKey = isVertical ? 'ArrowUp' : 'ArrowLeft';\n switch (event.key) {\n case nextKey:\n event.preventDefault();\n ctx.moveFocus(1, value);\n return;\n case prevKey:\n event.preventDefault();\n ctx.moveFocus(-1, 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 if (ctx.activation === 'manual') {\n event.preventDefault();\n if (!disabled) {\n ctx.setValue(value);\n }\n }\n return;\n }\n }\n },\n [ctx, value, disabled, isVertical]\n );\n\n const accentStyle = selected\n ? isVertical\n ? { borderRightColor: colors.semantic.interactive.primary }\n : { borderBottomColor: colors.semantic.interactive.primary }\n : null;\n\n const triggerProps: Record<string, unknown> = {\n ref: (node: HTMLElement | null) => {\n ownRef.current = node;\n },\n role: 'tab',\n accessibilityRole: 'tab',\n 'aria-selected': selected,\n 'aria-controls': `${ctx.baseId}-panel-${value}`,\n id: `${ctx.baseId}-tab-${value}`,\n tabIndex: selected ? 0 : -1,\n onPress,\n onKeyDown: handleKeyDown,\n ...(disabled ? { 'aria-disabled': true, disabled: true } : {}),\n ...(testID !== undefined ? { testID } : {}),\n };\n\n const triggerPadding: ViewStyle = {\n paddingHorizontal: px(colors.spacing['3']),\n paddingVertical: px(colors.spacing['2']),\n };\n const triggerStyle: ViewStyle = isVertical\n ? { ...TRIGGER_LAYOUT_BASE_VERTICAL, ...triggerPadding }\n : { ...TRIGGER_LAYOUT_BASE, ...triggerPadding };\n\n return (\n <Pressable\n {...triggerProps}\n className={cn(\n isVertical\n ? 'px-3 py-2 -mr-px border-r-2 border-r-transparent'\n : 'px-3 py-2 -mb-px border-b-2 border-b-transparent',\n selected ? 'border-r-semantic-interactive-primary' : '',\n disabled ? 'opacity-50' : 'opacity-100',\n className\n )}\n style={[triggerStyle, accentStyle, disabled ? { opacity: 0.5 } : null]}\n >\n {typeof children === 'string' ? (\n <RNText\n style={{\n color: selected ? colors.semantic.interactive.primary : colors.semantic.text.muted,\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n fontWeight: selected\n ? (colors.fontWeight.semibold as '600')\n : (colors.fontWeight.medium as '500'),\n }}\n >\n {children}\n </RNText>\n ) : (\n children\n )}\n </Pressable>\n );\n};\n\nexport type TabsContentProps = {\n /** Value of the trigger this panel pairs with. */\n value: string;\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/** Panel content shown when its `value` matches the active tab. */\nexport const TabsContent = ({ value, children, className, testID }: TabsContentProps) => {\n const ctx = useTabsContext('TabsContent');\n const active = ctx.value === value;\n if (!active) {\n return null;\n }\n return (\n <View\n {...(testID !== undefined ? { testID } : {})}\n role=\"tabpanel\"\n accessibilityRole=\"none\"\n id={`${ctx.baseId}-panel-${value}`}\n aria-labelledby={`${ctx.baseId}-tab-${value}`}\n tabIndex={0}\n className={cn('outline-none', className)}\n >\n {children}\n </View>\n );\n};\n\n/**\n * Public `Tabs` value — the root function plus its `.List`, `.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 * `<Tabs.List>` without a separate import.\n */\nexport const Tabs = Object.assign(TabsRoot, {\n List: TabsList,\n Trigger: TabsTrigger,\n Content: TabsContent,\n});\n"]}
1
+ {"version":3,"sources":["../src/components/Tabs/Tabs.tsx"],"names":["RNText"],"mappings":"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","file":"chunk-EN4CLDGZ.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 { ViewStyle } from 'react-native';\nimport { Pressable, Text as RNText, View } from 'react-native';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\n\nexport type TabsOrientation = 'horizontal' | 'vertical';\nexport type TabsActivation = 'automatic' | 'manual';\n\ntype TabsContextValue = {\n value: string | undefined;\n setValue: (next: string) => void;\n baseId: string;\n orientation: TabsOrientation;\n activation: TabsActivation;\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 TabsContext = createContext<TabsContextValue | null>(null);\n\nconst useTabsContext = (label: string): TabsContextValue => {\n const ctx = useContext(TabsContext);\n if (!ctx) {\n throw new Error(`<${label}> must be rendered inside a <Tabs>.`);\n }\n return ctx;\n};\n\nexport type TabsProps = {\n /** Controlled active tab value. */\n value?: string;\n /** Uncontrolled initial value. */\n defaultValue?: string;\n /** Fires with the new value when the active tab changes. */\n onChange?: (next: string) => void;\n /**\n * Layout direction of the tablist. Drives the keyboard-nav axis.\n * @defaultValue 'horizontal'\n */\n orientation?: TabsOrientation;\n /**\n * Whether arrow keys also activate the focused tab.\n * - `automatic` (default) — selection follows focus, matching most UIs.\n * - `manual` — arrow keys move focus only; the user presses Enter or\n * Space to activate. Use when activating a tab is expensive.\n * @defaultValue 'automatic'\n */\n activation?: TabsActivation;\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/**\n * Tab pattern with keyboard nav, roving tabindex, and content/trigger\n * association via shared `value`s. Compose:\n *\n * <Tabs defaultValue=\"overview\">\n * <TabsList>\n * <TabsTrigger value=\"overview\">Overview</TabsTrigger>\n * <TabsTrigger value=\"settings\">Settings</TabsTrigger>\n * </TabsList>\n * <TabsContent value=\"overview\">…</TabsContent>\n * <TabsContent value=\"settings\">…</TabsContent>\n * </Tabs>\n *\n * Follows the WAI-ARIA tablist pattern: `tablist` / `tab` / `tabpanel` roles,\n * arrow-key navigation that wraps, Home/End for first/last, and roving\n * tabindex so tabbing into the group lands on the active tab.\n */\nconst TabsRoot = ({\n value,\n defaultValue,\n onChange,\n orientation = 'horizontal',\n activation = 'automatic',\n children,\n className,\n testID,\n}: TabsProps) => {\n const baseId = useId();\n const [inner, setInner] = useState<string | undefined>(defaultValue);\n const isControlled = value !== undefined;\n const current = isControlled ? value : inner;\n\n const refs = useRef<Map<string, RefObject<HTMLElement | null>>>(new Map());\n const orderRef = useRef<string[]>([]);\n\n const setValue = useCallback(\n (next: string) => {\n if (!isControlled) {\n setInner(next);\n }\n onChange?.(next);\n },\n [isControlled, onChange]\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 focusValue = useCallback(\n (next: string) => {\n const ref = refs.current.get(next);\n ref?.current?.focus?.();\n if (activation === 'automatic') {\n setValue(next);\n }\n },\n [activation, setValue]\n );\n\n const moveFocus = useCallback(\n (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 focusValue(next);\n }\n },\n [focusValue]\n );\n\n const focusEdge = useCallback(\n (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 focusValue(target);\n }\n },\n [focusValue]\n );\n\n const ctxValue = useMemo<TabsContextValue>(\n () => ({\n value: current,\n setValue,\n baseId,\n orientation,\n activation,\n register,\n unregister,\n moveFocus,\n focusEdge,\n }),\n [current, setValue, baseId, orientation, activation, register, unregister, moveFocus, focusEdge]\n );\n\n return (\n <TabsContext.Provider value={ctxValue}>\n <TabsViewport\n orientation={orientation}\n {...(className !== undefined ? { className } : {})}\n {...(testID !== undefined ? { testID } : {})}\n >\n {children}\n </TabsViewport>\n </TabsContext.Provider>\n );\n};\n\n// Inner view so we can call useThemeColors() to source the orientation\n// gap from the spacing token scale.\nconst TabsViewport = ({\n orientation,\n className,\n testID,\n children,\n}: {\n orientation: TabsOrientation;\n className?: string;\n testID?: string;\n children?: ReactNode;\n}) => {\n const colors = useThemeColors();\n return (\n <View\n {...(testID !== undefined ? { testID } : {})}\n className={cn(orientation === 'vertical' ? 'flex-row gap-4' : 'flex-col gap-3', className)}\n style={\n orientation === 'vertical'\n ? { flexDirection: 'row', gap: px(colors.spacing['4']) }\n : { flexDirection: 'column', gap: px(colors.spacing['3']) }\n }\n >\n {children}\n </View>\n );\n};\n\nexport type TabsListProps = {\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n// Layout-only bases; theme-driven gap is merged inside TabsList.\nconst LIST_LAYOUT_BASE: ViewStyle = {\n flexDirection: 'row',\n alignItems: 'center',\n borderBottomWidth: 1,\n};\n\nconst LIST_VERTICAL_LAYOUT_BASE: ViewStyle = {\n flexDirection: 'column',\n alignItems: 'stretch',\n borderRightWidth: 1,\n};\n\n/** Container for `TabsTrigger`s. Renders the underline rule on the appropriate edge. */\nexport const TabsList = ({ children, className, testID }: TabsListProps) => {\n const ctx = useTabsContext('TabsList');\n const colors = useThemeColors();\n const gap = px(colors.spacing['1']);\n const listStyle: ViewStyle =\n ctx.orientation === 'vertical'\n ? { ...LIST_VERTICAL_LAYOUT_BASE, gap, borderRightColor: colors.semantic.border.default }\n : { ...LIST_LAYOUT_BASE, gap, borderBottomColor: colors.semantic.border.default };\n return (\n <View\n {...(testID !== undefined ? { testID } : {})}\n role=\"tablist\"\n accessibilityRole=\"tablist\"\n aria-orientation={ctx.orientation}\n className={cn(\n ctx.orientation === 'vertical'\n ? 'flex-col gap-1 border-r border-semantic-border-default'\n : 'flex-row items-center gap-1 border-b border-semantic-border-default',\n className\n )}\n style={listStyle}\n >\n {children}\n </View>\n );\n};\n\nexport type TabsTriggerProps = {\n /** Value linking this trigger to a `<TabsContent>`. */\n value: string;\n /** Disable just this trigger. */\n disabled?: boolean;\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n// Subtle 200ms ease on border + text color so the active tab indicator\n// fades in/out (and the trigger label colors smoothly between selected\n// and idle) instead of snapping. Web only — RN ignores the transition*\n// keys silently. We don't ship a true sliding magic-pill on either\n// platform yet; that would need react-native-reanimated and per-trigger\n// rect measurement, which is more complexity than this earns right now.\nconst TRIGGER_TRANSITION = {\n transitionProperty: 'border-color, color',\n transitionDuration: '200ms',\n transitionTimingFunction: 'ease',\n} as ViewStyle;\n\n// Layout / transition only; theme-driven padding is merged inside TabsTrigger.\nconst TRIGGER_LAYOUT_BASE: ViewStyle = {\n borderBottomWidth: 2,\n borderBottomColor: 'transparent',\n marginBottom: -1,\n ...TRIGGER_TRANSITION,\n};\n\nconst TRIGGER_LAYOUT_BASE_VERTICAL: ViewStyle = {\n borderRightWidth: 2,\n borderRightColor: 'transparent',\n marginRight: -1,\n ...TRIGGER_TRANSITION,\n};\n\n/** Clickable tab. Activating it shows the matching `TabsContent`. */\nexport const TabsTrigger = ({ value, disabled, children, className, testID }: TabsTriggerProps) => {\n const ctx = useTabsContext('TabsTrigger');\n const colors = useThemeColors();\n const ownRef = useRef<HTMLElement | null>(null);\n const selected = ctx.value === value;\n const isVertical = ctx.orientation === 'vertical';\n\n useEffect(() => {\n ctx.register(value, ownRef);\n return () => ctx.unregister(value);\n }, [ctx, value]);\n\n const onPress = useCallback(() => {\n if (disabled) {\n return;\n }\n ctx.setValue(value);\n }, [ctx, value, disabled]);\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLElement>) => {\n const nextKey = isVertical ? 'ArrowDown' : 'ArrowRight';\n const prevKey = isVertical ? 'ArrowUp' : 'ArrowLeft';\n switch (event.key) {\n case nextKey:\n event.preventDefault();\n ctx.moveFocus(1, value);\n return;\n case prevKey:\n event.preventDefault();\n ctx.moveFocus(-1, 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 if (ctx.activation === 'manual') {\n event.preventDefault();\n if (!disabled) {\n ctx.setValue(value);\n }\n }\n return;\n }\n }\n },\n [ctx, value, disabled, isVertical]\n );\n\n const accentStyle = selected\n ? isVertical\n ? { borderRightColor: colors.semantic.interactive.primary }\n : { borderBottomColor: colors.semantic.interactive.primary }\n : null;\n\n const triggerProps: Record<string, unknown> = {\n ref: (node: HTMLElement | null) => {\n ownRef.current = node;\n },\n role: 'tab',\n accessibilityRole: 'tab',\n 'aria-selected': selected,\n 'aria-controls': `${ctx.baseId}-panel-${value}`,\n id: `${ctx.baseId}-tab-${value}`,\n tabIndex: selected ? 0 : -1,\n onPress,\n onKeyDown: handleKeyDown,\n ...(disabled ? { 'aria-disabled': true, disabled: true } : {}),\n ...(testID !== undefined ? { testID } : {}),\n };\n\n const triggerPadding: ViewStyle = {\n paddingHorizontal: px(colors.spacing['3']),\n paddingVertical: px(colors.spacing['2']),\n };\n const triggerStyle: ViewStyle = isVertical\n ? { ...TRIGGER_LAYOUT_BASE_VERTICAL, ...triggerPadding }\n : { ...TRIGGER_LAYOUT_BASE, ...triggerPadding };\n\n return (\n <Pressable\n {...triggerProps}\n className={cn(\n isVertical\n ? 'px-3 py-2 -mr-px border-r-2 border-r-transparent'\n : 'px-3 py-2 -mb-px border-b-2 border-b-transparent',\n selected ? 'border-r-semantic-interactive-primary' : '',\n disabled ? 'opacity-50' : 'opacity-100',\n className\n )}\n style={[triggerStyle, accentStyle, disabled ? { opacity: 0.5 } : null]}\n >\n {typeof children === 'string' ? (\n <RNText\n style={{\n color: selected ? colors.semantic.interactive.primary : colors.semantic.text.muted,\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n fontWeight: selected\n ? (colors.fontWeight.semibold as '600')\n : (colors.fontWeight.medium as '500'),\n }}\n >\n {children}\n </RNText>\n ) : (\n children\n )}\n </Pressable>\n );\n};\n\nexport type TabsContentProps = {\n /** Value of the trigger this panel pairs with. */\n value: string;\n children?: ReactNode;\n className?: string;\n testID?: string;\n};\n\n/** Panel content shown when its `value` matches the active tab. */\nexport const TabsContent = ({ value, children, className, testID }: TabsContentProps) => {\n const ctx = useTabsContext('TabsContent');\n const active = ctx.value === value;\n if (!active) {\n return null;\n }\n return (\n <View\n {...(testID !== undefined ? { testID } : {})}\n role=\"tabpanel\"\n accessibilityRole=\"none\"\n id={`${ctx.baseId}-panel-${value}`}\n aria-labelledby={`${ctx.baseId}-tab-${value}`}\n tabIndex={0}\n className={cn('outline-none', className)}\n >\n {children}\n </View>\n );\n};\n\n/**\n * Public `Tabs` value — the root function plus its `.List`, `.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 * `<Tabs.List>` without a separate import.\n */\nexport const Tabs = Object.assign(TabsRoot, {\n List: TabsList,\n Trigger: TabsTrigger,\n Content: TabsContent,\n});\n"]}
@@ -1,6 +1,6 @@
1
- import { cn } from './chunk-CHXHRJNZ.js';
2
1
  import { px } from './chunk-5A2QOOVN.js';
3
2
  import { useThemeColors } from './chunk-R5JMDDCB.js';
3
+ import { cn } from './chunk-CHXHRJNZ.js';
4
4
  import { __name } from './chunk-WCQVDF3K.js';
5
5
  import { useState, useCallback } from 'react';
6
6
  import { View, Pressable, Text } from 'react-native';
@@ -174,5 +174,5 @@ var SegmentedControl = /* @__PURE__ */ __name(({
174
174
  }, "SegmentedControl");
175
175
 
176
176
  export { SegmentedControl };
177
- //# sourceMappingURL=chunk-WAKKQROH.js.map
178
- //# sourceMappingURL=chunk-WAKKQROH.js.map
177
+ //# sourceMappingURL=chunk-F5UKI7XD.js.map
178
+ //# sourceMappingURL=chunk-F5UKI7XD.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/SegmentedControl/SegmentedControl.tsx"],"names":["RNText"],"mappings":"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","file":"chunk-WAKKQROH.js","sourcesContent":["'use client';\n\nimport type { Theme } from '@nori-ui/tokens';\nimport { type KeyboardEvent, type ReactNode, useCallback, useState } from 'react';\nimport type { ViewStyle } from 'react-native';\nimport { Pressable, Text as RNText, View } from 'react-native';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\n\nexport type SegmentedControlSize = 'sm' | 'md';\n\nexport type SegmentedControlOption<T extends string = string> = {\n value: T;\n label: ReactNode;\n /** Disable just this option. */\n disabled?: boolean;\n};\n\nexport type SegmentedControlProps<T extends string = string> = {\n /** Controlled value. */\n value?: T;\n /** Uncontrolled initial value. Required if you don't pass `value`. */\n defaultValue?: T;\n /** Fires when the user selects a different segment. */\n onChange?: (next: T) => void;\n /** The set of selectable segments. */\n options: ReadonlyArray<SegmentedControlOption<T>>;\n /** Group-level disable. */\n disabled?: boolean;\n /**\n * Visual size. `sm` is denser for inline filters; `md` is the default\n * for top-of-view tab switchers.\n * @defaultValue 'md'\n */\n size?: SegmentedControlSize;\n /** Hide the visible labels — when set, segments must have `aria-label`. */\n label?: string;\n className?: string;\n testID?: string;\n};\n\n// Layout-only bases; theme-driven dimensions are merged inside the component.\nconst CONTAINER_LAYOUT_BASE: ViewStyle = {\n flexDirection: 'row',\n alignItems: 'stretch',\n};\n\nconst SEGMENT_LAYOUT_BASE: ViewStyle = {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n};\n\n// Token keys per size; resolved to px inside the component so theme\n// overrides take effect.\ntype SegmentSizeKeys = {\n paddingV: keyof Theme['spacing'];\n paddingH: keyof Theme['spacing'];\n font: keyof Theme['fontSize'];\n};\nconst SEGMENT_SIZE_KEYS: Record<SegmentedControlSize, SegmentSizeKeys> = {\n sm: { paddingV: '1', paddingH: '2', font: 'sm' }, // 4 / 8 / 14 — closest to legacy 4/10/13\n md: { paddingV: '2', paddingH: '3', font: 'sm' }, // 8 / 12 / 14 — closest to legacy 6/12/14\n};\n\nconst SEGMENT_SELECTED_BASE: ViewStyle = {\n // Subtle elevation that says \"this one is on\" without overshadowing\n // the unselected segments next to it. Web uses boxShadow (CSS-style);\n // native uses elevation. The legacy RN `shadow*` props were deprecated\n // by react-native-web in favor of `boxShadow`.\n ...({ boxShadow: '0 1px 2px rgba(0, 0, 0, 0.06)' } as ViewStyle),\n elevation: 1,\n};\n\n/**\n * Single-select segmented switcher — the \"beautiful UISegmentedControl\"\n * pattern. Use for binary or small (3–5 option) choices that fit inline\n * with their surrounding content. Reach for `Tabs` when each option owns\n * a distinct content region.\n *\n * Keyboard nav follows the WAI-ARIA radiogroup pattern: arrow keys move\n * between options (selection follows focus), `Home` / `End` jump to first\n * / last, with wrap-around at the edges.\n */\nexport const SegmentedControl = <T extends string>({\n value,\n defaultValue,\n onChange,\n options,\n disabled = false,\n size = 'md',\n label,\n className,\n testID,\n}: SegmentedControlProps<T>) => {\n const colors = useThemeColors();\n const [inner, setInner] = useState<T | undefined>(defaultValue);\n const isControlled = value !== undefined;\n const current = isControlled ? value : inner;\n\n const select = useCallback(\n (next: T) => {\n if (disabled) {\n return;\n }\n if (!isControlled) {\n setInner(next);\n }\n onChange?.(next);\n },\n [disabled, isControlled, onChange]\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n if (options.length === 0) {\n return;\n }\n const idx = options.findIndex((o) => o.value === current);\n const start = idx === -1 ? 0 : idx;\n const offset =\n event.key === 'ArrowRight' || event.key === 'ArrowDown'\n ? 1\n : event.key === 'ArrowLeft' || event.key === 'ArrowUp'\n ? -1\n : 0;\n if (offset === 0 && event.key !== 'Home' && event.key !== 'End') {\n return;\n }\n event.preventDefault();\n let nextIdx: number;\n if (event.key === 'Home') {\n nextIdx = 0;\n } else if (event.key === 'End') {\n nextIdx = options.length - 1;\n } else {\n nextIdx = (start + offset + options.length) % options.length;\n }\n // Skip past disabled options in the chosen direction.\n const direction = offset === 0 ? 1 : offset;\n for (let attempts = 0; attempts < options.length; attempts += 1) {\n const candidate = options[nextIdx];\n if (candidate && !candidate.disabled) {\n select(candidate.value);\n return;\n }\n nextIdx = (nextIdx + direction + options.length) % options.length;\n }\n },\n [current, options, select]\n );\n\n const sizeKeys = SEGMENT_SIZE_KEYS[size];\n const segmentPadV = px(colors.spacing[sizeKeys.paddingV]);\n const segmentPadH = px(colors.spacing[sizeKeys.paddingH]);\n const segmentFontSize = px(colors.fontSize[sizeKeys.font]);\n\n const groupProps: Record<string, unknown> = {\n role: 'radiogroup',\n accessibilityRole: 'radiogroup',\n onKeyDown: handleKeyDown,\n ...(label !== undefined ? { 'aria-label': label, accessibilityLabel: label } : {}),\n ...(disabled ? { 'aria-disabled': true } : {}),\n ...(testID !== undefined ? { testID } : {}),\n };\n\n const containerStyle: ViewStyle = {\n ...CONTAINER_LAYOUT_BASE,\n borderRadius: px(colors.radius.lg),\n padding: px(colors.spacing['1']),\n gap: px(colors.spacing['1']),\n backgroundColor: colors.semantic.background.subtle,\n };\n const segmentBaseStyle: ViewStyle = {\n ...SEGMENT_LAYOUT_BASE,\n borderRadius: px(colors.radius.md),\n };\n const segmentSelectedStyle: ViewStyle = {\n ...SEGMENT_SELECTED_BASE,\n backgroundColor: colors.semantic.background.elevated,\n };\n\n return (\n <View\n {...groupProps}\n className={cn(\n 'inline-flex flex-row items-stretch rounded-lg bg-neutral-100 dark:bg-neutral-800 p-1 gap-1',\n disabled ? 'opacity-60' : undefined,\n className\n )}\n style={[containerStyle, disabled ? { opacity: 0.6 } : null]}\n >\n {options.map((option) => {\n const selected = option.value === current;\n const isOptDisabled = disabled || option.disabled;\n return (\n <Pressable\n key={option.value}\n role=\"radio\"\n accessibilityRole=\"radio\"\n aria-checked={selected}\n accessibilityState={{ selected, disabled: Boolean(isOptDisabled) }}\n tabIndex={selected || (current === undefined && options[0]?.value === option.value) ? 0 : -1}\n onPress={() => {\n if (!isOptDisabled) {\n select(option.value);\n }\n }}\n {...(isOptDisabled ? { 'aria-disabled': true, disabled: true } : {})}\n className={cn(\n 'flex-1 items-center justify-center rounded-md',\n selected ? 'bg-semantic-background-elevated shadow-sm' : '',\n isOptDisabled ? 'opacity-50' : ''\n )}\n style={[\n segmentBaseStyle,\n { paddingVertical: segmentPadV, paddingHorizontal: segmentPadH },\n selected ? segmentSelectedStyle : null,\n isOptDisabled ? { opacity: 0.5 } : null,\n ]}\n >\n {typeof option.label === 'string' ? (\n <RNText\n style={{\n color: selected ? colors.semantic.text.default : colors.semantic.text.muted,\n fontFamily: colors.fontFamily.body,\n fontSize: segmentFontSize,\n fontWeight: selected\n ? (colors.fontWeight.semibold as '600')\n : (colors.fontWeight.medium as '500'),\n }}\n >\n {option.label}\n </RNText>\n ) : (\n option.label\n )}\n </Pressable>\n );\n })}\n </View>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/components/SegmentedControl/SegmentedControl.tsx"],"names":["RNText"],"mappings":"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","file":"chunk-F5UKI7XD.js","sourcesContent":["'use client';\n\nimport type { Theme } from '@nori-ui/tokens';\nimport { type KeyboardEvent, type ReactNode, useCallback, useState } from 'react';\nimport type { ViewStyle } from 'react-native';\nimport { Pressable, Text as RNText, View } from 'react-native';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\n\nexport type SegmentedControlSize = 'sm' | 'md';\n\nexport type SegmentedControlOption<T extends string = string> = {\n value: T;\n label: ReactNode;\n /** Disable just this option. */\n disabled?: boolean;\n};\n\nexport type SegmentedControlProps<T extends string = string> = {\n /** Controlled value. */\n value?: T;\n /** Uncontrolled initial value. Required if you don't pass `value`. */\n defaultValue?: T;\n /** Fires when the user selects a different segment. */\n onChange?: (next: T) => void;\n /** The set of selectable segments. */\n options: ReadonlyArray<SegmentedControlOption<T>>;\n /** Group-level disable. */\n disabled?: boolean;\n /**\n * Visual size. `sm` is denser for inline filters; `md` is the default\n * for top-of-view tab switchers.\n * @defaultValue 'md'\n */\n size?: SegmentedControlSize;\n /** Hide the visible labels — when set, segments must have `aria-label`. */\n label?: string;\n className?: string;\n testID?: string;\n};\n\n// Layout-only bases; theme-driven dimensions are merged inside the component.\nconst CONTAINER_LAYOUT_BASE: ViewStyle = {\n flexDirection: 'row',\n alignItems: 'stretch',\n};\n\nconst SEGMENT_LAYOUT_BASE: ViewStyle = {\n flex: 1,\n alignItems: 'center',\n justifyContent: 'center',\n};\n\n// Token keys per size; resolved to px inside the component so theme\n// overrides take effect.\ntype SegmentSizeKeys = {\n paddingV: keyof Theme['spacing'];\n paddingH: keyof Theme['spacing'];\n font: keyof Theme['fontSize'];\n};\nconst SEGMENT_SIZE_KEYS: Record<SegmentedControlSize, SegmentSizeKeys> = {\n sm: { paddingV: '1', paddingH: '2', font: 'sm' }, // 4 / 8 / 14 — closest to legacy 4/10/13\n md: { paddingV: '2', paddingH: '3', font: 'sm' }, // 8 / 12 / 14 — closest to legacy 6/12/14\n};\n\nconst SEGMENT_SELECTED_BASE: ViewStyle = {\n // Subtle elevation that says \"this one is on\" without overshadowing\n // the unselected segments next to it. Web uses boxShadow (CSS-style);\n // native uses elevation. The legacy RN `shadow*` props were deprecated\n // by react-native-web in favor of `boxShadow`.\n ...({ boxShadow: '0 1px 2px rgba(0, 0, 0, 0.06)' } as ViewStyle),\n elevation: 1,\n};\n\n/**\n * Single-select segmented switcher — the \"beautiful UISegmentedControl\"\n * pattern. Use for binary or small (3–5 option) choices that fit inline\n * with their surrounding content. Reach for `Tabs` when each option owns\n * a distinct content region.\n *\n * Keyboard nav follows the WAI-ARIA radiogroup pattern: arrow keys move\n * between options (selection follows focus), `Home` / `End` jump to first\n * / last, with wrap-around at the edges.\n */\nexport const SegmentedControl = <T extends string>({\n value,\n defaultValue,\n onChange,\n options,\n disabled = false,\n size = 'md',\n label,\n className,\n testID,\n}: SegmentedControlProps<T>) => {\n const colors = useThemeColors();\n const [inner, setInner] = useState<T | undefined>(defaultValue);\n const isControlled = value !== undefined;\n const current = isControlled ? value : inner;\n\n const select = useCallback(\n (next: T) => {\n if (disabled) {\n return;\n }\n if (!isControlled) {\n setInner(next);\n }\n onChange?.(next);\n },\n [disabled, isControlled, onChange]\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n if (options.length === 0) {\n return;\n }\n const idx = options.findIndex((o) => o.value === current);\n const start = idx === -1 ? 0 : idx;\n const offset =\n event.key === 'ArrowRight' || event.key === 'ArrowDown'\n ? 1\n : event.key === 'ArrowLeft' || event.key === 'ArrowUp'\n ? -1\n : 0;\n if (offset === 0 && event.key !== 'Home' && event.key !== 'End') {\n return;\n }\n event.preventDefault();\n let nextIdx: number;\n if (event.key === 'Home') {\n nextIdx = 0;\n } else if (event.key === 'End') {\n nextIdx = options.length - 1;\n } else {\n nextIdx = (start + offset + options.length) % options.length;\n }\n // Skip past disabled options in the chosen direction.\n const direction = offset === 0 ? 1 : offset;\n for (let attempts = 0; attempts < options.length; attempts += 1) {\n const candidate = options[nextIdx];\n if (candidate && !candidate.disabled) {\n select(candidate.value);\n return;\n }\n nextIdx = (nextIdx + direction + options.length) % options.length;\n }\n },\n [current, options, select]\n );\n\n const sizeKeys = SEGMENT_SIZE_KEYS[size];\n const segmentPadV = px(colors.spacing[sizeKeys.paddingV]);\n const segmentPadH = px(colors.spacing[sizeKeys.paddingH]);\n const segmentFontSize = px(colors.fontSize[sizeKeys.font]);\n\n const groupProps: Record<string, unknown> = {\n role: 'radiogroup',\n accessibilityRole: 'radiogroup',\n onKeyDown: handleKeyDown,\n ...(label !== undefined ? { 'aria-label': label, accessibilityLabel: label } : {}),\n ...(disabled ? { 'aria-disabled': true } : {}),\n ...(testID !== undefined ? { testID } : {}),\n };\n\n const containerStyle: ViewStyle = {\n ...CONTAINER_LAYOUT_BASE,\n borderRadius: px(colors.radius.lg),\n padding: px(colors.spacing['1']),\n gap: px(colors.spacing['1']),\n backgroundColor: colors.semantic.background.subtle,\n };\n const segmentBaseStyle: ViewStyle = {\n ...SEGMENT_LAYOUT_BASE,\n borderRadius: px(colors.radius.md),\n };\n const segmentSelectedStyle: ViewStyle = {\n ...SEGMENT_SELECTED_BASE,\n backgroundColor: colors.semantic.background.elevated,\n };\n\n return (\n <View\n {...groupProps}\n className={cn(\n 'inline-flex flex-row items-stretch rounded-lg bg-neutral-100 dark:bg-neutral-800 p-1 gap-1',\n disabled ? 'opacity-60' : undefined,\n className\n )}\n style={[containerStyle, disabled ? { opacity: 0.6 } : null]}\n >\n {options.map((option) => {\n const selected = option.value === current;\n const isOptDisabled = disabled || option.disabled;\n return (\n <Pressable\n key={option.value}\n role=\"radio\"\n accessibilityRole=\"radio\"\n aria-checked={selected}\n accessibilityState={{ selected, disabled: Boolean(isOptDisabled) }}\n tabIndex={selected || (current === undefined && options[0]?.value === option.value) ? 0 : -1}\n onPress={() => {\n if (!isOptDisabled) {\n select(option.value);\n }\n }}\n {...(isOptDisabled ? { 'aria-disabled': true, disabled: true } : {})}\n className={cn(\n 'flex-1 items-center justify-center rounded-md',\n selected ? 'bg-semantic-background-elevated shadow-sm' : '',\n isOptDisabled ? 'opacity-50' : ''\n )}\n style={[\n segmentBaseStyle,\n { paddingVertical: segmentPadV, paddingHorizontal: segmentPadH },\n selected ? segmentSelectedStyle : null,\n isOptDisabled ? { opacity: 0.5 } : null,\n ]}\n >\n {typeof option.label === 'string' ? (\n <RNText\n style={{\n color: selected ? colors.semantic.text.default : colors.semantic.text.muted,\n fontFamily: colors.fontFamily.body,\n fontSize: segmentFontSize,\n fontWeight: selected\n ? (colors.fontWeight.semibold as '600')\n : (colors.fontWeight.medium as '500'),\n }}\n >\n {option.label}\n </RNText>\n ) : (\n option.label\n )}\n </Pressable>\n );\n })}\n </View>\n );\n};\n"]}
@@ -1,4 +1,4 @@
1
- import { resolveI18n, defaultDictionary } from './chunk-6PO2IWB3.js';
1
+ import { resolveI18n, defaultDictionary } from './chunk-4UFAZLSZ.js';
2
2
  import { __name } from './chunk-WCQVDF3K.js';
3
3
  import { createContext, useMemo, useContext } from 'react';
4
4
  import { jsx } from 'nativewind/jsx-runtime';
@@ -19,5 +19,5 @@ function useTranslation() {
19
19
  __name(useTranslation, "useTranslation");
20
20
 
21
21
  export { I18nProvider, useTranslation };
22
- //# sourceMappingURL=chunk-MJ4AGXS7.js.map
23
- //# sourceMappingURL=chunk-MJ4AGXS7.js.map
22
+ //# sourceMappingURL=chunk-GJMHNEQ3.js.map
23
+ //# sourceMappingURL=chunk-GJMHNEQ3.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/i18n/context.tsx","../src/i18n/use-translation.ts"],"names":[],"mappings":";;;;;AAcA,IAAM,YAAA,GAAiC;AAAA,EACnC,CAAA,EAAG,WAAA,CAAY,MAAA,EAAW,iBAAiB;AAC/C,CAAA;AAEO,IAAM,WAAA,GAAc,cAAgC,YAAY,CAAA;AACvE,WAAA,CAAY,WAAA,GAAc,aAAA;AAOnB,SAAS,YAAA,CAAa,EAAE,IAAA,EAAM,QAAA,EAAS,EAAsB;AAChE,EAAA,MAAM,KAAA,GAAQ,OAAA,CAA0B,OAAO,EAAE,CAAA,EAAG,WAAA,CAAY,IAAA,EAAM,iBAAiB,CAAA,EAAE,CAAA,EAAI,CAAC,IAAI,CAAC,CAAA;AACnG,EAAA,uBAAO,GAAA,CAAC,WAAA,CAAY,QAAA,EAAZ,EAAqB,OAAe,QAAA,EAAS,CAAA;AACzD;AAHgB,MAAA,CAAA,YAAA,EAAA,cAAA,CAAA;ACrBT,SAAS,cAAA,GAAmC;AAC/C,EAAA,OAAO,WAAW,WAAW,CAAA;AACjC;AAFgB,MAAA,CAAA,cAAA,EAAA,gBAAA,CAAA","file":"chunk-MJ4AGXS7.js","sourcesContent":["'use client';\n\nimport type { ReactNode } from 'react';\nimport { createContext, useMemo } from 'react';\nimport { defaultDictionary } from './default-dictionary';\nimport { resolveI18n } from './resolve';\nimport type { I18nInput, TranslateFn } from './types';\n\nexport type I18nContextValue = {\n t: TranslateFn;\n};\n\n// Default context value uses the built-in English dictionary; consumers without\n// a provider still get a working t().\nconst defaultValue: I18nContextValue = {\n t: resolveI18n(undefined, defaultDictionary),\n};\n\nexport const I18nContext = createContext<I18nContextValue>(defaultValue);\nI18nContext.displayName = 'I18nContext';\n\nexport type I18nProviderProps = {\n i18n?: I18nInput;\n children?: ReactNode;\n};\n\nexport function I18nProvider({ i18n, children }: I18nProviderProps) {\n const value = useMemo<I18nContextValue>(() => ({ t: resolveI18n(i18n, defaultDictionary) }), [i18n]);\n return <I18nContext.Provider value={value}>{children}</I18nContext.Provider>;\n}\n","'use client';\n\nimport { useContext } from 'react';\nimport { I18nContext, type I18nContextValue } from './context';\n\nexport function useTranslation(): I18nContextValue {\n return useContext(I18nContext);\n}\n"]}
1
+ {"version":3,"sources":["../src/i18n/context.tsx","../src/i18n/use-translation.ts"],"names":[],"mappings":";;;;;AAcA,IAAM,YAAA,GAAiC;AAAA,EACnC,CAAA,EAAG,WAAA,CAAY,MAAA,EAAW,iBAAiB;AAC/C,CAAA;AAEO,IAAM,WAAA,GAAc,cAAgC,YAAY,CAAA;AACvE,WAAA,CAAY,WAAA,GAAc,aAAA;AAOnB,SAAS,YAAA,CAAa,EAAE,IAAA,EAAM,QAAA,EAAS,EAAsB;AAChE,EAAA,MAAM,KAAA,GAAQ,OAAA,CAA0B,OAAO,EAAE,CAAA,EAAG,WAAA,CAAY,IAAA,EAAM,iBAAiB,CAAA,EAAE,CAAA,EAAI,CAAC,IAAI,CAAC,CAAA;AACnG,EAAA,uBAAO,GAAA,CAAC,WAAA,CAAY,QAAA,EAAZ,EAAqB,OAAe,QAAA,EAAS,CAAA;AACzD;AAHgB,MAAA,CAAA,YAAA,EAAA,cAAA,CAAA;ACrBT,SAAS,cAAA,GAAmC;AAC/C,EAAA,OAAO,WAAW,WAAW,CAAA;AACjC;AAFgB,MAAA,CAAA,cAAA,EAAA,gBAAA,CAAA","file":"chunk-GJMHNEQ3.js","sourcesContent":["'use client';\n\nimport type { ReactNode } from 'react';\nimport { createContext, useMemo } from 'react';\nimport { defaultDictionary } from './default-dictionary';\nimport { resolveI18n } from './resolve';\nimport type { I18nInput, TranslateFn } from './types';\n\nexport type I18nContextValue = {\n t: TranslateFn;\n};\n\n// Default context value uses the built-in English dictionary; consumers without\n// a provider still get a working t().\nconst defaultValue: I18nContextValue = {\n t: resolveI18n(undefined, defaultDictionary),\n};\n\nexport const I18nContext = createContext<I18nContextValue>(defaultValue);\nI18nContext.displayName = 'I18nContext';\n\nexport type I18nProviderProps = {\n i18n?: I18nInput;\n children?: ReactNode;\n};\n\nexport function I18nProvider({ i18n, children }: I18nProviderProps) {\n const value = useMemo<I18nContextValue>(() => ({ t: resolveI18n(i18n, defaultDictionary) }), [i18n]);\n return <I18nContext.Provider value={value}>{children}</I18nContext.Provider>;\n}\n","'use client';\n\nimport { useContext } from 'react';\nimport { I18nContext, type I18nContextValue } from './context';\n\nexport function useTranslation(): I18nContextValue {\n return useContext(I18nContext);\n}\n"]}
@@ -0,0 +1,43 @@
1
+ import { cn } from './chunk-CHXHRJNZ.js';
2
+ import { __name } from './chunk-WCQVDF3K.js';
3
+ import { Children, isValidElement, cloneElement } from 'react';
4
+ import { View } from 'react-native';
5
+ import { jsx } from 'nativewind/jsx-runtime';
6
+
7
+ var ButtonGroup = /* @__PURE__ */ __name(({ children, orientation = "horizontal", size, className, testID }) => {
8
+ const isHorizontal = orientation === "horizontal";
9
+ const containerStyle = {
10
+ flexDirection: isHorizontal ? "row" : "column",
11
+ // gap: 0 so buttons touch; shared-border effect comes from CSS on web
12
+ // and from touching edges on native.
13
+ gap: 0,
14
+ alignSelf: "flex-start",
15
+ overflow: "hidden"
16
+ };
17
+ const childArray = Children.toArray(children).filter(isValidElement);
18
+ const total = childArray.length;
19
+ const clonedChildren = childArray.map((child, index) => {
20
+ const position = index === 0 ? "first" : index === total - 1 ? "last" : "middle";
21
+ const extraProps = {
22
+ "data-position": position,
23
+ "data-group-orientation": orientation
24
+ };
25
+ if (size !== void 0) {
26
+ extraProps["data-group-size"] = size;
27
+ }
28
+ return cloneElement(child, extraProps);
29
+ });
30
+ return /* @__PURE__ */ jsx(
31
+ View,
32
+ {
33
+ ...testID !== void 0 ? { testID } : {},
34
+ className: cn(isHorizontal ? "flex-row" : "flex-col", "self-start overflow-hidden", className),
35
+ style: containerStyle,
36
+ children: clonedChildren
37
+ }
38
+ );
39
+ }, "ButtonGroup");
40
+
41
+ export { ButtonGroup };
42
+ //# sourceMappingURL=chunk-GTAXVTLF.js.map
43
+ //# sourceMappingURL=chunk-GTAXVTLF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ButtonGroup/ButtonGroup.tsx"],"names":[],"mappings":";;;;;;AAgDO,IAAM,WAAA,2BAAe,EAAE,QAAA,EAAU,cAAc,YAAA,EAAc,IAAA,EAAM,SAAA,EAAW,MAAA,EAAO,KAAwB;AAChH,EAAA,MAAM,eAAe,WAAA,KAAgB,YAAA;AAErC,EAAA,MAAM,cAAA,GAA4B;AAAA,IAC9B,aAAA,EAAe,eAAe,KAAA,GAAQ,QAAA;AAAA;AAAA;AAAA,IAGtC,GAAA,EAAK,CAAA;AAAA,IACL,SAAA,EAAW,YAAA;AAAA,IACX,QAAA,EAAU;AAAA,GACd;AAIA,EAAA,MAAM,aAAa,QAAA,CAAS,OAAA,CAAQ,QAAQ,CAAA,CAAE,OAAO,cAAc,CAAA;AACnE,EAAA,MAAM,QAAQ,UAAA,CAAW,MAAA;AAEzB,EAAA,MAAM,cAAA,GAAiB,UAAA,CAAW,GAAA,CAAI,CAAC,OAAO,KAAA,KAAU;AACpD,IAAA,MAAM,WAAW,KAAA,KAAU,CAAA,GAAI,UAAU,KAAA,KAAU,KAAA,GAAQ,IAAI,MAAA,GAAS,QAAA;AACxE,IAAA,MAAM,UAAA,GAAsC;AAAA,MACxC,eAAA,EAAiB,QAAA;AAAA,MACjB,wBAAA,EAA0B;AAAA,KAC9B;AACA,IAAA,IAAI,SAAS,MAAA,EAAW;AACpB,MAAA,UAAA,CAAW,iBAAiB,CAAA,GAAI,IAAA;AAAA,IACpC;AAGA,IAAA,OAAO,YAAA,CAAa,OAAO,UAAU,CAAA;AAAA,EACzC,CAAC,CAAA;AAED,EAAA,uBACI,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACI,GAAI,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,KAAW,EAAC;AAAA,MAC1C,WAAW,EAAA,CAAG,YAAA,GAAe,UAAA,GAAa,UAAA,EAAY,8BAA8B,SAAS,CAAA;AAAA,MAC7F,KAAA,EAAO,cAAA;AAAA,MAEN,QAAA,EAAA;AAAA;AAAA,GACL;AAER,CAAA,EAxC2B,aAAA","file":"chunk-GTAXVTLF.js","sourcesContent":["'use client';\n\nimport { Children, cloneElement, isValidElement, type ReactNode } from 'react';\nimport type { ViewStyle } from 'react-native';\nimport { View } from 'react-native';\nimport { cn } from '../../utils/cn';\n\nexport type ButtonGroupOrientation = 'horizontal' | 'vertical';\nexport type ButtonGroupSize = 'sm' | 'md' | 'lg';\n\nexport type ButtonGroupProps = {\n children?: ReactNode;\n /** Flex direction for the group. @defaultValue 'horizontal' */\n orientation?: ButtonGroupOrientation;\n /**\n * Size hint passed to children via `data-group-size`. Buttons inside\n * the group can read this to self-size consistently. When omitted, each\n * Button retains its own `size` prop.\n */\n size?: ButtonGroupSize;\n className?: string;\n testID?: string;\n};\n\n/**\n * Joins multiple buttons in a visually connected row (or column). Middle\n * buttons lose outer edge radius; adjacent borders merge so the group looks\n * like a single segmented control.\n *\n * The radius treatment is implemented by injecting `data-position` attributes\n * (first / middle / last) onto each direct child. A companion CSS rule in the\n * nori preset (or a Tailwind variant) can target `[data-position=first]`,\n * `[data-position=middle]`, and `[data-position=last]` to strip the\n * appropriate border-radius corners. When using Button from `@nori-ui/core`,\n * no extra setup is needed — the tokens preset ships the rules.\n *\n * ```tsx\n * <ButtonGroup>\n * <Button variant=\"secondary\">Day</Button>\n * <Button variant=\"secondary\">Week</Button>\n * <Button variant=\"secondary\">Month</Button>\n * </ButtonGroup>\n * ```\n *\n * > **v2 note:** Corner-radius stripping is applied via CSS data-attribute\n * > selectors on web. On native, middle-button radius adjustment is a future\n * > enhancement (currently the group renders with standard per-button radius).\n */\nexport const ButtonGroup = ({ children, orientation = 'horizontal', size, className, testID }: ButtonGroupProps) => {\n const isHorizontal = orientation === 'horizontal';\n\n const containerStyle: ViewStyle = {\n flexDirection: isHorizontal ? 'row' : 'column',\n // gap: 0 so buttons touch; shared-border effect comes from CSS on web\n // and from touching edges on native.\n gap: 0,\n alignSelf: 'flex-start',\n overflow: 'hidden',\n };\n\n // Inject `data-position` on each valid child so CSS (web) or future\n // native logic can target first / middle / last positions.\n const childArray = Children.toArray(children).filter(isValidElement);\n const total = childArray.length;\n\n const clonedChildren = childArray.map((child, index) => {\n const position = index === 0 ? 'first' : index === total - 1 ? 'last' : 'middle';\n const extraProps: Record<string, unknown> = {\n 'data-position': position,\n 'data-group-orientation': orientation,\n };\n if (size !== undefined) {\n extraProps['data-group-size'] = size;\n }\n\n // Clone the child element with the injected data attributes.\n return cloneElement(child, extraProps);\n });\n\n return (\n <View\n {...(testID !== undefined ? { testID } : {})}\n className={cn(isHorizontal ? 'flex-row' : 'flex-col', 'self-start overflow-hidden', className)}\n style={containerStyle}\n >\n {clonedChildren}\n </View>\n );\n};\n"]}