@nori-ui/core 1.5.0 → 1.6.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 (171) 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-ND7MRYW7.js → chunk-2HMQDJ22.js} +4 -4
  4. package/dist/{chunk-ND7MRYW7.js.map → chunk-2HMQDJ22.js.map} +1 -1
  5. package/dist/{chunk-KCLWPSV5.js → chunk-2RL6WCFC.js} +4 -4
  6. package/dist/{chunk-KCLWPSV5.js.map → chunk-2RL6WCFC.js.map} +1 -1
  7. package/dist/{chunk-FDBQOQMW.js → chunk-3BDDPFCI.js} +3 -3
  8. package/dist/{chunk-FDBQOQMW.js.map → chunk-3BDDPFCI.js.map} +1 -1
  9. package/dist/{chunk-WOF67PKT.js → chunk-3CEJ5TB4.js} +3 -3
  10. package/dist/{chunk-WOF67PKT.js.map → chunk-3CEJ5TB4.js.map} +1 -1
  11. package/dist/{chunk-BNDUQNG7.js → chunk-3OIWAS2P.js} +3 -3
  12. package/dist/{chunk-BNDUQNG7.js.map → chunk-3OIWAS2P.js.map} +1 -1
  13. package/dist/{chunk-6JVUVBZH.js → chunk-4PUPKWEP.js} +5 -5
  14. package/dist/{chunk-6JVUVBZH.js.map → chunk-4PUPKWEP.js.map} +1 -1
  15. package/dist/{chunk-6PO2IWB3.js → chunk-4UFAZLSZ.js} +5 -3
  16. package/dist/chunk-4UFAZLSZ.js.map +1 -0
  17. package/dist/{chunk-76FZF4GM.js → chunk-5PSC5HT4.js} +8 -125
  18. package/dist/chunk-5PSC5HT4.js.map +1 -0
  19. package/dist/{chunk-LWQZ257T.js → chunk-5XEGZFG5.js} +3 -3
  20. package/dist/{chunk-LWQZ257T.js.map → chunk-5XEGZFG5.js.map} +1 -1
  21. package/dist/{chunk-WAKKQROH.js → chunk-6AD6KCVB.js} +3 -3
  22. package/dist/{chunk-WAKKQROH.js.map → chunk-6AD6KCVB.js.map} +1 -1
  23. package/dist/chunk-73CUV7MW.js +125 -0
  24. package/dist/chunk-73CUV7MW.js.map +1 -0
  25. package/dist/{chunk-GRDVE3IR.js → chunk-BZLT6R62.js} +3 -3
  26. package/dist/{chunk-GRDVE3IR.js.map → chunk-BZLT6R62.js.map} +1 -1
  27. package/dist/{chunk-Y4ZRSW35.js → chunk-CCUXO2HN.js} +3 -3
  28. package/dist/{chunk-Y4ZRSW35.js.map → chunk-CCUXO2HN.js.map} +1 -1
  29. package/dist/{chunk-2UXKXUX2.js → chunk-CPIKN4BX.js} +3 -3
  30. package/dist/{chunk-2UXKXUX2.js.map → chunk-CPIKN4BX.js.map} +1 -1
  31. package/dist/{chunk-46OT4PA6.js → chunk-DDGMLLS3.js} +3 -3
  32. package/dist/{chunk-46OT4PA6.js.map → chunk-DDGMLLS3.js.map} +1 -1
  33. package/dist/{chunk-XP55RZ3D.js → chunk-FEPTH5RV.js} +3 -3
  34. package/dist/{chunk-XP55RZ3D.js.map → chunk-FEPTH5RV.js.map} +1 -1
  35. package/dist/{chunk-MJ4AGXS7.js → chunk-GJMHNEQ3.js} +3 -3
  36. package/dist/{chunk-MJ4AGXS7.js.map → chunk-GJMHNEQ3.js.map} +1 -1
  37. package/dist/{chunk-VCJF75T2.js → chunk-JQQ3FBN7.js} +3 -3
  38. package/dist/{chunk-VCJF75T2.js.map → chunk-JQQ3FBN7.js.map} +1 -1
  39. package/dist/{chunk-O4NMS3KB.js → chunk-JXLEMBDB.js} +3 -3
  40. package/dist/{chunk-O4NMS3KB.js.map → chunk-JXLEMBDB.js.map} +1 -1
  41. package/dist/{chunk-W3HMOOON.js → chunk-JZ774T7U.js} +3 -3
  42. package/dist/{chunk-W3HMOOON.js.map → chunk-JZ774T7U.js.map} +1 -1
  43. package/dist/{chunk-SINLREQV.js → chunk-MKSDYRWQ.js} +3 -3
  44. package/dist/{chunk-SINLREQV.js.map → chunk-MKSDYRWQ.js.map} +1 -1
  45. package/dist/{chunk-AFQIK6JI.js → chunk-MRJWPRCX.js} +3 -3
  46. package/dist/{chunk-AFQIK6JI.js.map → chunk-MRJWPRCX.js.map} +1 -1
  47. package/dist/{chunk-EFK7726V.js → chunk-NF7XG2FG.js} +3 -3
  48. package/dist/{chunk-EFK7726V.js.map → chunk-NF7XG2FG.js.map} +1 -1
  49. package/dist/{chunk-WTNDPO2V.js → chunk-NNFJKRXZ.js} +3 -3
  50. package/dist/{chunk-WTNDPO2V.js.map → chunk-NNFJKRXZ.js.map} +1 -1
  51. package/dist/{chunk-CGQIVFCN.js → chunk-NRYWNOG5.js} +3 -3
  52. package/dist/{chunk-CGQIVFCN.js.map → chunk-NRYWNOG5.js.map} +1 -1
  53. package/dist/{chunk-HTF6FDB6.js → chunk-OMU4R4Y5.js} +3 -3
  54. package/dist/{chunk-HTF6FDB6.js.map → chunk-OMU4R4Y5.js.map} +1 -1
  55. package/dist/{chunk-C6TRLHMW.js → chunk-PABG3IJ6.js} +3 -3
  56. package/dist/{chunk-C6TRLHMW.js.map → chunk-PABG3IJ6.js.map} +1 -1
  57. package/dist/{chunk-RM5TSXVE.js → chunk-PNP7L4TA.js} +3 -3
  58. package/dist/{chunk-RM5TSXVE.js.map → chunk-PNP7L4TA.js.map} +1 -1
  59. package/dist/{chunk-L5X4SYJ4.js → chunk-PZS4A4VQ.js} +3 -3
  60. package/dist/{chunk-L5X4SYJ4.js.map → chunk-PZS4A4VQ.js.map} +1 -1
  61. package/dist/{chunk-4I37QSEM.js → chunk-QJVS2VXS.js} +5 -5
  62. package/dist/{chunk-4I37QSEM.js.map → chunk-QJVS2VXS.js.map} +1 -1
  63. package/dist/{chunk-H7MFAFV4.js → chunk-RUWD35UI.js} +4 -4
  64. package/dist/{chunk-H7MFAFV4.js.map → chunk-RUWD35UI.js.map} +1 -1
  65. package/dist/{chunk-5BM6H2CD.js → chunk-SFNDR6DI.js} +3 -3
  66. package/dist/{chunk-5BM6H2CD.js.map → chunk-SFNDR6DI.js.map} +1 -1
  67. package/dist/{chunk-UF5OENHV.js → chunk-TLS54G6Y.js} +3 -3
  68. package/dist/{chunk-UF5OENHV.js.map → chunk-TLS54G6Y.js.map} +1 -1
  69. package/dist/{chunk-UUXWRDWW.js → chunk-UJWCEGQY.js} +3 -3
  70. package/dist/{chunk-UUXWRDWW.js.map → chunk-UJWCEGQY.js.map} +1 -1
  71. package/dist/{chunk-UJ5KFRDE.js → chunk-UZD77M3J.js} +3 -3
  72. package/dist/{chunk-UJ5KFRDE.js.map → chunk-UZD77M3J.js.map} +1 -1
  73. package/dist/chunk-VP7DRJUZ.js +3 -0
  74. package/dist/chunk-VP7DRJUZ.js.map +1 -0
  75. package/dist/{chunk-UPVNZPFV.js → chunk-VYRJ7OE5.js} +3 -3
  76. package/dist/{chunk-UPVNZPFV.js.map → chunk-VYRJ7OE5.js.map} +1 -1
  77. package/dist/{chunk-IGLMPAWE.js → chunk-WGT345SV.js} +3 -3
  78. package/dist/{chunk-IGLMPAWE.js.map → chunk-WGT345SV.js.map} +1 -1
  79. package/dist/{chunk-F7G6R373.js → chunk-WP2Z2ATO.js} +5 -5
  80. package/dist/{chunk-F7G6R373.js.map → chunk-WP2Z2ATO.js.map} +1 -1
  81. package/dist/chunk-WYPGQVDV.js +145 -0
  82. package/dist/chunk-WYPGQVDV.js.map +1 -0
  83. package/dist/{chunk-GELLSU64.js → chunk-XALU6LOT.js} +3 -3
  84. package/dist/{chunk-GELLSU64.js.map → chunk-XALU6LOT.js.map} +1 -1
  85. package/dist/{chunk-VMAGFYHG.js → chunk-Y5TJ7CAX.js} +3 -3
  86. package/dist/{chunk-VMAGFYHG.js.map → chunk-Y5TJ7CAX.js.map} +1 -1
  87. package/dist/chunk-YZ27OS2R.js +202 -0
  88. package/dist/chunk-YZ27OS2R.js.map +1 -0
  89. package/dist/client.cjs +449 -119
  90. package/dist/client.cjs.map +1 -1
  91. package/dist/client.d.cts +3 -0
  92. package/dist/client.d.ts +3 -0
  93. package/dist/client.js +50 -46
  94. package/dist/client.js.map +1 -1
  95. package/dist/components/Accordion/index.js +2 -2
  96. package/dist/components/Alert/index.js +2 -2
  97. package/dist/components/AlertDialog/index.js +2 -2
  98. package/dist/components/Avatar/index.js +2 -2
  99. package/dist/components/Badge/index.js +2 -2
  100. package/dist/components/Box/index.js +4 -4
  101. package/dist/components/Breadcrumb/index.cjs +3 -1
  102. package/dist/components/Breadcrumb/index.cjs.map +1 -1
  103. package/dist/components/Breadcrumb/index.js +5 -5
  104. package/dist/components/Button/index.js +2 -2
  105. package/dist/components/Calendar/index.cjs +3 -1
  106. package/dist/components/Calendar/index.cjs.map +1 -1
  107. package/dist/components/Calendar/index.js +5 -5
  108. package/dist/components/Card/index.js +2 -2
  109. package/dist/components/Checkbox/index.js +2 -2
  110. package/dist/components/Combobox/index.js +3 -3
  111. package/dist/components/ContextMenu/index.js +4 -4
  112. package/dist/components/DataTable/index.cjs +770 -0
  113. package/dist/components/DataTable/index.cjs.map +1 -0
  114. package/dist/components/DataTable/index.d.cts +53 -0
  115. package/dist/components/DataTable/index.d.ts +53 -0
  116. package/dist/components/DataTable/index.js +8 -0
  117. package/dist/components/DataTable/index.js.map +1 -0
  118. package/dist/components/DatePicker/index.cjs +3 -1
  119. package/dist/components/DatePicker/index.cjs.map +1 -1
  120. package/dist/components/DatePicker/index.js +7 -7
  121. package/dist/components/Dialog/index.js +2 -2
  122. package/dist/components/DropdownMenu/index.js +3 -3
  123. package/dist/components/Field/index.cjs +3 -1
  124. package/dist/components/Field/index.cjs.map +1 -1
  125. package/dist/components/Field/index.d.cts +2 -2
  126. package/dist/components/Field/index.d.ts +2 -2
  127. package/dist/components/Field/index.js +3 -3
  128. package/dist/components/FloatButton/index.cjs +3 -1
  129. package/dist/components/FloatButton/index.cjs.map +1 -1
  130. package/dist/components/FloatButton/index.js +5 -5
  131. package/dist/components/HStack/index.js +4 -4
  132. package/dist/components/InputGroup/index.js +2 -2
  133. package/dist/components/Label/index.cjs +3 -1
  134. package/dist/components/Label/index.cjs.map +1 -1
  135. package/dist/components/Label/index.js +3 -3
  136. package/dist/components/Pagination/index.cjs +3 -1
  137. package/dist/components/Pagination/index.cjs.map +1 -1
  138. package/dist/components/Pagination/index.js +6 -5
  139. package/dist/components/Popover/index.js +2 -2
  140. package/dist/components/Progress/index.js +2 -2
  141. package/dist/components/Radio/index.js +2 -2
  142. package/dist/components/SegmentedControl/index.js +2 -2
  143. package/dist/components/Select/index.js +2 -2
  144. package/dist/components/Sheet/index.js +2 -2
  145. package/dist/components/Switch/index.js +2 -2
  146. package/dist/components/Table/index.cjs +461 -0
  147. package/dist/components/Table/index.cjs.map +1 -0
  148. package/dist/components/Table/index.d.cts +16 -0
  149. package/dist/components/Table/index.d.ts +16 -0
  150. package/dist/components/Table/index.js +7 -0
  151. package/dist/components/Table/index.js.map +1 -0
  152. package/dist/components/Tabs/index.js +2 -2
  153. package/dist/components/Text/index.js +2 -2
  154. package/dist/components/TextArea/index.js +3 -3
  155. package/dist/components/TextInput/index.js +2 -2
  156. package/dist/components/Toggle/index.js +2 -2
  157. package/dist/components/Tooltip/index.js +2 -2
  158. package/dist/components/VStack/index.js +4 -4
  159. package/dist/i18n/index.cjs +3 -1
  160. package/dist/i18n/index.cjs.map +1 -1
  161. package/dist/i18n/index.js +1 -1
  162. package/dist/index.cjs +449 -119
  163. package/dist/index.cjs.map +1 -1
  164. package/dist/index.d.cts +3 -0
  165. package/dist/index.d.ts +3 -0
  166. package/dist/index.js +47 -43
  167. package/dist/slot/index.d.cts +2 -2
  168. package/dist/slot/index.d.ts +2 -2
  169. package/package.json +1 -1
  170. package/dist/chunk-6PO2IWB3.js.map +0 -1
  171. package/dist/chunk-76FZF4GM.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Pagination/Pagination.tsx"],"names":["RNText","RNTextInput"],"mappings":"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","file":"chunk-5PSC5HT4.js","sourcesContent":["'use client';\n\nimport {\n type ComponentProps,\n createContext,\n type FC,\n type KeyboardEvent,\n type ReactElement,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport type { ViewStyle } from 'react-native';\nimport { Platform, Pressable, Text as RNText, TextInput as RNTextInput, useWindowDimensions, View } from 'react-native';\nimport { useTranslation } from '../../i18n/use-translation';\nimport { Slot } from '../../slot';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\nimport { Select, type SelectOption } from '../Select';\nimport { type PaginationItemDescriptor, type PaginationItemType, usePagination } from './use-pagination';\n\n// =============================================================================\n// Public types\n// =============================================================================\n\nexport { type UsePaginationArgs, type UsePaginationReturn, usePagination } from './use-pagination';\nexport type { PaginationItemDescriptor, PaginationItemType };\n\nexport type PaginationVariant = 'auto' | 'numbered' | 'compact';\n\nexport type PaginationRenderItemArgs = {\n type: PaginationItemType;\n page?: number;\n selected: boolean;\n disabled: boolean;\n ariaLabel: string;\n ariaCurrent?: 'page';\n children: ReactNode;\n onPress: () => void;\n};\n\nexport type PaginationOnPageChange = (page: number, meta?: { pageSize?: number }) => void;\n\nexport type PaginationProps = {\n /** Controlled current page (1-indexed). */\n page?: number;\n /** Initial page when uncontrolled (1-indexed). @defaultValue 1 */\n defaultPage?: number;\n /** Total number of pages. Required. */\n pageCount: number;\n /** Pages on each side of the current page. @defaultValue 1 */\n siblingCount?: number;\n /** Pages always visible at start/end. @defaultValue 1 */\n boundaryCount?: number;\n /** Show first/last buttons. @defaultValue false */\n showFirstLast?: boolean;\n /** Hide the entire component when `pageCount <= 1`. @defaultValue true */\n hideOnSinglePage?: boolean;\n /**\n * Force a UI variant. `auto` swaps to `compact` on viewports under\n * `PAGINATION_COMPACT_BREAKPOINT` px wide.\n * @defaultValue 'auto'\n */\n variant?: PaginationVariant;\n /** Render the \"Showing X–Y of Z\" range automatically. @defaultValue false */\n showRange?: boolean;\n /** Total item count — needed by `Pagination.Range` and `Pagination.PageSize`. */\n itemCount?: number;\n /** Items per page — needed by `Pagination.Range` and `Pagination.PageSize`. */\n pageSize?: number;\n /** Fired on every page (or page-size) change. */\n onPageChange?: PaginationOnPageChange;\n /** Render-prop slot for each item. Same signature on web + native. */\n renderItem?: (args: PaginationRenderItemArgs) => ReactNode;\n /** RTL override. @defaultValue 'ltr' */\n dir?: 'ltr' | 'rtl';\n /** Override individual labels (otherwise sourced from `useTranslation`). */\n previousLabel?: string;\n nextLabel?: string;\n firstLabel?: string;\n lastLabel?: string;\n /** Override the nav landmark label. */\n ariaLabel?: string;\n className?: string;\n testID?: string;\n /** Provide compound children to opt out of the items-array shorthand. */\n children?: ReactNode;\n};\n\n/** Viewport width below which `variant=\"auto\"` switches to `compact`. */\nexport const PAGINATION_COMPACT_BREAKPOINT = 480;\n\n// =============================================================================\n// Context (used by both compound parts and the shorthand's internal layout)\n// =============================================================================\n\ntype PaginationContextValue = {\n page: number;\n pageCount: number;\n pageSize: number | undefined;\n itemCount: number | undefined;\n siblingCount: number;\n boundaryCount: number;\n showFirstLast: boolean;\n dir: 'ltr' | 'rtl';\n labels: {\n prev: string;\n next: string;\n first: string;\n last: string;\n gotoPage: (page: number) => string;\n ellipsis: string;\n currentPage: string;\n rangeFmt: (from: number, to: number, total: number) => string;\n pageOfFmt: (page: number, total: number) => string;\n pageSize: string;\n jumperLabel: string;\n jumperPlaceholder: string;\n };\n renderItem?: (args: PaginationRenderItemArgs) => ReactNode;\n goToPage: (page: number) => void;\n setPageSize: (next: number) => void;\n};\n\nconst PaginationContext = createContext<PaginationContextValue | null>(null);\n\nconst usePaginationContext = (label: string): PaginationContextValue => {\n const ctx = useContext(PaginationContext);\n if (!ctx) {\n throw new Error(`<${label}> must be rendered inside a <Pagination> or <Pagination.Root>.`);\n }\n return ctx;\n};\n\n// =============================================================================\n// Default item button (used when `renderItem` is not provided)\n// =============================================================================\n\ntype ItemButtonProps = {\n type: PaginationItemType;\n page?: number;\n selected: boolean;\n disabled: boolean;\n ariaLabel: string;\n ariaCurrent?: 'page';\n label: ReactNode;\n onPress: () => void;\n testID?: string;\n};\n\nconst ItemButton = ({ type, selected, disabled, ariaLabel, ariaCurrent, label, onPress, testID }: ItemButtonProps) => {\n const colors = useThemeColors();\n const isChevron = type === 'prev' || type === 'next' || type === 'first' || type === 'last';\n const isInteractive = !disabled && type !== 'ellipsis';\n const size = px(colors.spacing['8']); // 32px — minimum touch target\n\n if (type === 'ellipsis') {\n // Ellipsis is presentational; no button chrome, no padding — just a\n // balanced spacer that keeps the row's rhythm intact.\n return (\n <View\n aria-hidden\n accessibilityElementsHidden\n importantForAccessibility=\"no-hide-descendants\"\n style={{\n minWidth: size,\n minHeight: size,\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <RNText\n style={{\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n color: colors.semantic.text.muted,\n // Optical adjust so the dots sit on the row baseline.\n marginTop: -2,\n letterSpacing: 1,\n }}\n >\n {label}\n </RNText>\n </View>\n );\n }\n\n // Pre-compute the static style so the Pressable's function form only has\n // to overlay press/hover deltas. This is more robust on native, where\n // some renderers were observed to drop properties from the function-form\n // result intermittently — especially the selected pill's `backgroundColor`,\n // producing white text on a white background.\n const baseStyle: ViewStyle = {\n minWidth: size,\n height: size,\n paddingHorizontal: px(colors.spacing['2']),\n alignItems: 'center',\n justifyContent: 'center',\n borderRadius: px(colors.radius.md),\n // Selected: filled pill in primary. Default: transparent. Press/hover\n // deltas overlay this in the style fn below.\n backgroundColor: selected ? colors.semantic.interactive.primary : 'transparent',\n // A 1px transparent border is reserved on every item so the layout\n // stays stable when the selected one shows its accent border.\n borderWidth: 1,\n borderColor: selected ? colors.semantic.interactive.primary : 'transparent',\n opacity: disabled ? 0.35 : 1,\n };\n\n // Web-only CSS transitions; merged into the static base on web.\n const webExtras =\n Platform.OS === 'web'\n ? ({\n transitionProperty: 'background-color, color, border-color',\n transitionDuration: '120ms',\n transitionTimingFunction: 'cubic-bezier(0.2, 0, 0, 1)',\n } as unknown as ViewStyle)\n : null;\n const staticStyle: ViewStyle = { ...baseStyle, ...(webExtras ?? {}) };\n\n return (\n <Pressable\n {...(testID !== undefined ? { testID } : {})}\n role=\"button\"\n accessibilityRole=\"button\"\n accessibilityLabel={ariaLabel}\n aria-label={ariaLabel}\n {...(ariaCurrent ? { 'aria-current': ariaCurrent } : {})}\n disabled={disabled}\n aria-disabled={disabled || undefined}\n onPress={isInteractive ? onPress : undefined}\n // Use a function form ONLY on web so Pressable can read `hovered`.\n // On native the function form was observed to occasionally drop\n // its returned style block on iOS — so we pass a plain object,\n // which renders reliably.\n style={\n Platform.OS === 'web'\n ? (state) => {\n const { pressed, hovered } = state as { pressed: boolean; hovered?: boolean };\n const interactive =\n !selected && (pressed || hovered)\n ? colors.semantic.background.subtle\n : staticStyle.backgroundColor;\n return { ...staticStyle, backgroundColor: interactive };\n }\n : staticStyle\n }\n >\n <RNText\n style={{\n fontFamily: colors.fontFamily.body,\n fontSize: isChevron ? px(colors.fontSize.md) : px(colors.fontSize.sm),\n lineHeight: px(colors.fontSize.md),\n color: selected\n ? colors.semantic.text.inverted\n : disabled\n ? colors.semantic.text.muted\n : colors.semantic.text.default,\n fontWeight: selected ? (colors.fontWeight.semibold as '600') : (colors.fontWeight.medium as '500'),\n fontVariant: ['tabular-nums'],\n // Chevron glyphs sit a hair high in most fonts.\n marginTop: isChevron ? -1 : 0,\n }}\n >\n {label}\n </RNText>\n </Pressable>\n );\n};\n\n// =============================================================================\n// Live region for screen readers (web only — RN announces via accessibilityLiveRegion)\n// =============================================================================\n\nconst LiveRegion = ({ message }: { message: string }) => {\n if (Platform.OS === 'web') {\n return (\n <View\n style={{\n position: 'absolute',\n width: 1,\n height: 1,\n overflow: 'hidden',\n opacity: 0,\n }}\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic\n >\n <RNText accessibilityLiveRegion=\"polite\">{message}</RNText>\n </View>\n );\n }\n return (\n <View accessibilityLiveRegion=\"polite\" style={{ width: 0, height: 0 }}>\n <RNText>{message}</RNText>\n </View>\n );\n};\n\n// =============================================================================\n// Items renderer (the shorthand UI)\n// =============================================================================\n\ntype ItemsRendererProps = {\n items: ReadonlyArray<PaginationItemDescriptor>;\n onItemPress: (item: PaginationItemDescriptor) => void;\n};\n\nconst ItemsRenderer = ({ items, onItemPress }: ItemsRendererProps) => {\n const { labels, renderItem, dir } = usePaginationContext('Pagination.Items');\n\n const elements = items.map((item, idx) => {\n const key = `${item.type}-${item.page ?? idx}-${idx}`;\n const ariaLabel = ariaLabelFor(item, labels);\n const ariaCurrent = item.selected ? ('page' as const) : undefined;\n const display = displayLabelFor(item, labels, dir);\n const onPress = () => onItemPress(item);\n\n if (renderItem && item.type !== 'ellipsis') {\n return (\n <View key={key}>\n {renderItem({\n type: item.type,\n ...(item.page !== undefined ? { page: item.page } : {}),\n selected: item.selected ?? false,\n disabled: item.disabled ?? false,\n ariaLabel,\n ...(ariaCurrent ? { ariaCurrent } : {}),\n children: display,\n onPress,\n })}\n </View>\n );\n }\n\n return (\n <ItemButton\n key={key}\n type={item.type}\n {...(item.page !== undefined ? { page: item.page } : {})}\n selected={item.selected ?? false}\n disabled={item.disabled ?? false}\n ariaLabel={ariaLabel}\n {...(ariaCurrent ? { ariaCurrent } : {})}\n label={display}\n onPress={onPress}\n />\n );\n });\n\n return <>{elements}</>;\n};\n\nfunction ariaLabelFor(item: PaginationItemDescriptor, labels: PaginationContextValue['labels']): string {\n switch (item.type) {\n case 'first':\n return labels.first;\n case 'prev':\n return labels.prev;\n case 'next':\n return labels.next;\n case 'last':\n return labels.last;\n case 'ellipsis':\n return labels.ellipsis;\n case 'page':\n return item.selected ? labels.currentPage : labels.gotoPage(item.page ?? 0);\n }\n}\n\nfunction displayLabelFor(\n item: PaginationItemDescriptor,\n labels: PaginationContextValue['labels'],\n dir: 'ltr' | 'rtl'\n): ReactNode {\n const flip = dir === 'rtl';\n switch (item.type) {\n case 'first':\n return flip ? '»' : '«';\n case 'last':\n return flip ? '«' : '»';\n case 'prev':\n return flip ? '›' : '‹';\n case 'next':\n return flip ? '‹' : '›';\n case 'ellipsis':\n return '…';\n case 'page':\n return String(item.page ?? '');\n }\n}\n\n// =============================================================================\n// Compact variant\n// =============================================================================\n\nconst CompactView = ({\n onPrev,\n onNext,\n canPrev,\n canNext,\n pageLabel,\n}: {\n onPrev: () => void;\n onNext: () => void;\n canPrev: boolean;\n canNext: boolean;\n pageLabel: string;\n}) => {\n const colors = useThemeColors();\n const { labels, dir } = usePaginationContext('Pagination(compact)');\n const flip = dir === 'rtl';\n\n return (\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'space-between',\n gap: px(colors.spacing['1']),\n flexGrow: 1,\n }}\n >\n <ItemButton\n type=\"prev\"\n selected={false}\n disabled={!canPrev}\n ariaLabel={labels.prev}\n label={flip ? '›' : '‹'}\n onPress={onPrev}\n />\n <View\n style={{\n flexGrow: 1,\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: px(colors.spacing['3']),\n }}\n >\n <RNText\n style={{\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n color: colors.semantic.text.default,\n fontWeight: colors.fontWeight.medium as '500',\n fontVariant: ['tabular-nums'],\n }}\n >\n {pageLabel}\n </RNText>\n </View>\n <ItemButton\n type=\"next\"\n selected={false}\n disabled={!canNext}\n ariaLabel={labels.next}\n label={flip ? '‹' : '›'}\n onPress={onNext}\n />\n </View>\n );\n};\n\n// =============================================================================\n// Root (the `<Pagination>` symbol — also serves as the shorthand)\n// =============================================================================\n\nconst ANNOUNCE_DEBOUNCE_MS = 150;\n\nconst PaginationRoot = (props: PaginationProps) => {\n const {\n page: controlledPage,\n defaultPage = 1,\n pageCount,\n siblingCount = 1,\n boundaryCount = 1,\n showFirstLast = false,\n hideOnSinglePage = true,\n variant = 'auto',\n showRange = false,\n itemCount,\n pageSize: pageSizeProp,\n onPageChange,\n renderItem,\n dir = 'ltr',\n previousLabel,\n nextLabel,\n firstLabel,\n lastLabel,\n ariaLabel,\n className,\n testID,\n children,\n } = props;\n\n const { t } = useTranslation();\n const colors = useThemeColors();\n const { width } = useWindowDimensions();\n\n const [internalPageSize, setInternalPageSize] = useState<number | undefined>(pageSizeProp);\n useEffect(() => {\n setInternalPageSize(pageSizeProp);\n }, [pageSizeProp]);\n const effectivePageSize = pageSizeProp ?? internalPageSize;\n\n const labels = useMemo<PaginationContextValue['labels']>(\n () => ({\n prev: previousLabel ?? t('pagination.previous', { defaultValue: 'Previous page' }),\n next: nextLabel ?? t('pagination.next', { defaultValue: 'Next page' }),\n first: firstLabel ?? t('pagination.first', { defaultValue: 'First page' }),\n last: lastLabel ?? t('pagination.last', { defaultValue: 'Last page' }),\n ellipsis: t('pagination.ellipsis', { defaultValue: 'More pages' }),\n currentPage: t('pagination.currentPage', { defaultValue: 'Current page' }),\n gotoPage: (n) => t('pagination.gotoPage', { page: n, defaultValue: `Go to page ${n}` }),\n rangeFmt: (from, to, total) =>\n t('pagination.range', {\n from,\n to,\n total,\n defaultValue: `Showing ${from}–${to} of ${total}`,\n }),\n pageOfFmt: (p, total) => t('pagination.pageOf', { page: p, total, defaultValue: `Page ${p} of ${total}` }),\n pageSize: t('pagination.pageSizeLabel', { defaultValue: 'Items per page' }),\n jumperLabel: t('pagination.jumperLabel', { defaultValue: 'Go to page' }),\n jumperPlaceholder: t('pagination.jumperPlaceholder', { defaultValue: '#' }),\n }),\n [t, previousLabel, nextLabel, firstLabel, lastLabel]\n );\n\n // Live-region message — debounced so rapid clicks don't spam SR.\n const [announcement, setAnnouncement] = useState('');\n const announceTimer = useRef<ReturnType<typeof setTimeout> | null>(null);\n useEffect(() => {\n return () => {\n if (announceTimer.current) {\n clearTimeout(announceTimer.current);\n }\n };\n }, []);\n\n const handlePageChange = useCallback(\n (next: number) => {\n onPageChange?.(next, effectivePageSize !== undefined ? { pageSize: effectivePageSize } : undefined);\n if (announceTimer.current) {\n clearTimeout(announceTimer.current);\n }\n announceTimer.current = setTimeout(() => {\n setAnnouncement(labels.pageOfFmt(next, Math.max(1, pageCount)));\n }, ANNOUNCE_DEBOUNCE_MS);\n },\n [onPageChange, effectivePageSize, labels, pageCount]\n );\n\n const setPageSize = useCallback(\n (next: number) => {\n if (pageSizeProp === undefined) {\n setInternalPageSize(next);\n }\n onPageChange?.(1, { pageSize: next });\n },\n [onPageChange, pageSizeProp]\n );\n\n const pagination = usePagination({\n ...(controlledPage !== undefined ? { page: controlledPage } : {}),\n defaultPage,\n pageCount,\n siblingCount,\n boundaryCount,\n showFirstLast,\n onPageChange: handlePageChange,\n });\n\n if (hideOnSinglePage && Math.max(1, pageCount) <= 1) {\n return null;\n }\n\n const ctxValue: PaginationContextValue = {\n page: pagination.page,\n pageCount: Math.max(1, pageCount),\n pageSize: effectivePageSize,\n itemCount,\n siblingCount,\n boundaryCount,\n showFirstLast,\n dir,\n labels,\n ...(renderItem ? { renderItem } : {}),\n goToPage: pagination.goToPage,\n setPageSize,\n };\n\n // Compound mode — caller supplies the layout. We still wrap children in\n // a flex-row that wraps on overflow so a long compound chain\n // (Items + Range + PageSize + Jumper) doesn't blow off the right edge\n // of a phone-width container.\n if (children !== undefined) {\n return (\n <PaginationContext.Provider value={ctxValue}>\n <View\n {...(testID !== undefined ? { testID } : {})}\n role=\"navigation\"\n aria-label={ariaLabel ?? t('pagination.ariaLabel', { defaultValue: 'Pagination' })}\n accessibilityLabel={ariaLabel ?? t('pagination.ariaLabel', { defaultValue: 'Pagination' })}\n accessible\n className={cn('flex-row items-center flex-wrap', className)}\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n flexWrap: 'wrap',\n rowGap: px(colors.spacing['2']),\n columnGap: px(colors.spacing['1']),\n direction: dir as ViewStyle['direction'],\n }}\n >\n {children}\n </View>\n <LiveRegion message={announcement} />\n </PaginationContext.Provider>\n );\n }\n\n // Shorthand mode — pick variant + render the items row.\n const isCompact =\n variant === 'compact' || (variant === 'auto' && width > 0 && width < PAGINATION_COMPACT_BREAKPOINT);\n\n const onItemPress = (item: PaginationItemDescriptor) => {\n if (item.disabled) {\n return;\n }\n switch (item.type) {\n case 'first':\n pagination.first();\n return;\n case 'prev':\n pagination.prev();\n return;\n case 'next':\n pagination.next();\n return;\n case 'last':\n pagination.last();\n return;\n case 'page':\n if (item.page !== undefined) {\n pagination.goToPage(item.page);\n }\n return;\n case 'ellipsis':\n return;\n }\n };\n\n const showRangeBlock = showRange && itemCount !== undefined && effectivePageSize !== undefined;\n\n return (\n <PaginationContext.Provider value={ctxValue}>\n <View\n {...(testID !== undefined ? { testID } : {})}\n role=\"navigation\"\n aria-label={ariaLabel ?? t('pagination.ariaLabel', { defaultValue: 'Pagination' })}\n accessibilityLabel={ariaLabel ?? t('pagination.ariaLabel', { defaultValue: 'Pagination' })}\n accessible\n className={cn(isCompact ? 'flex-col items-stretch' : 'flex-row items-center flex-wrap', className)}\n style={{\n // Compact mode lays out as a column so the Range/PageSize\n // block falls below the controls instead of overflowing\n // a phone-width row. Numbered mode wraps on overflow.\n flexDirection: isCompact ? 'column' : 'row',\n alignItems: isCompact ? 'stretch' : 'center',\n flexWrap: isCompact ? 'nowrap' : 'wrap',\n rowGap: px(colors.spacing['2']),\n columnGap: px(colors.spacing['1']),\n direction: dir as ViewStyle['direction'],\n }}\n >\n {isCompact ? (\n <CompactView\n onPrev={pagination.prev}\n onNext={pagination.next}\n canPrev={pagination.canPrev}\n canNext={pagination.canNext}\n pageLabel={labels.pageOfFmt(pagination.page, Math.max(1, pageCount))}\n />\n ) : (\n <ItemsRenderer items={pagination.pages} onItemPress={onItemPress} />\n )}\n {showRangeBlock ? <PaginationRange /> : null}\n </View>\n <LiveRegion message={announcement} />\n </PaginationContext.Provider>\n );\n};\n\n// =============================================================================\n// Compound parts\n// =============================================================================\n\ntype CompoundButtonProps = {\n asChild?: boolean;\n children?: ReactNode;\n testID?: string;\n};\n\nconst CompoundActionButton = ({\n actionType,\n asChild,\n children,\n testID,\n}: CompoundButtonProps & { actionType: 'prev' | 'next' | 'first' | 'last' }) => {\n const ctx = usePaginationContext(`Pagination.${actionType[0]!.toUpperCase() + actionType.slice(1)}`);\n const disabled = actionType === 'prev' || actionType === 'first' ? ctx.page <= 1 : ctx.page >= ctx.pageCount;\n const onPress = () => {\n if (disabled) {\n return;\n }\n switch (actionType) {\n case 'first':\n ctx.goToPage(1);\n return;\n case 'prev':\n ctx.goToPage(ctx.page - 1);\n return;\n case 'next':\n ctx.goToPage(ctx.page + 1);\n return;\n case 'last':\n ctx.goToPage(ctx.pageCount);\n return;\n }\n };\n const ariaLabel =\n actionType === 'prev'\n ? ctx.labels.prev\n : actionType === 'next'\n ? ctx.labels.next\n : actionType === 'first'\n ? ctx.labels.first\n : ctx.labels.last;\n\n if (asChild) {\n return (\n <Slot\n aria-label={ariaLabel}\n aria-disabled={disabled || undefined}\n onPress={onPress}\n onClick={onPress as unknown as ComponentProps<'button'>['onClick']}\n >\n {children}\n </Slot>\n );\n }\n const fallbackGlyph =\n actionType === 'prev' ? '‹' : actionType === 'next' ? '›' : actionType === 'first' ? '«' : '»';\n return (\n <ItemButton\n type={actionType}\n selected={false}\n disabled={disabled}\n ariaLabel={ariaLabel}\n label={children ?? fallbackGlyph}\n onPress={onPress}\n {...(testID !== undefined ? { testID } : {})}\n />\n );\n};\n\nconst PaginationPrev: FC<CompoundButtonProps> = ({ asChild, children, testID }) =>\n CompoundActionButton({\n actionType: 'prev',\n ...(asChild !== undefined ? { asChild } : {}),\n ...(children !== undefined ? { children } : {}),\n ...(testID !== undefined ? { testID } : {}),\n });\nconst PaginationNext: FC<CompoundButtonProps> = ({ asChild, children, testID }) =>\n CompoundActionButton({\n actionType: 'next',\n ...(asChild !== undefined ? { asChild } : {}),\n ...(children !== undefined ? { children } : {}),\n ...(testID !== undefined ? { testID } : {}),\n });\nconst PaginationFirst: FC<CompoundButtonProps> = ({ asChild, children, testID }) =>\n CompoundActionButton({\n actionType: 'first',\n ...(asChild !== undefined ? { asChild } : {}),\n ...(children !== undefined ? { children } : {}),\n ...(testID !== undefined ? { testID } : {}),\n });\nconst PaginationLast: FC<CompoundButtonProps> = ({ asChild, children, testID }) =>\n CompoundActionButton({\n actionType: 'last',\n ...(asChild !== undefined ? { asChild } : {}),\n ...(children !== undefined ? { children } : {}),\n ...(testID !== undefined ? { testID } : {}),\n });\n\nconst PaginationItem: FC<{ page: number; asChild?: boolean; children?: ReactNode; testID?: string }> = ({\n page,\n asChild,\n children,\n testID,\n}) => {\n const ctx = usePaginationContext('Pagination.Item');\n const selected = page === ctx.page;\n const onPress = () => ctx.goToPage(page);\n const ariaLabel = selected ? ctx.labels.currentPage : ctx.labels.gotoPage(page);\n\n if (asChild) {\n return (\n <Slot\n aria-label={ariaLabel}\n {...(selected ? { 'aria-current': 'page' as const } : {})}\n onPress={onPress}\n onClick={onPress as unknown as ComponentProps<'button'>['onClick']}\n >\n {children}\n </Slot>\n );\n }\n return (\n <ItemButton\n type=\"page\"\n page={page}\n selected={selected}\n disabled={false}\n ariaLabel={ariaLabel}\n {...(selected ? { ariaCurrent: 'page' as const } : {})}\n label={children ?? String(page)}\n onPress={onPress}\n {...(testID !== undefined ? { testID } : {})}\n />\n );\n};\n\nconst PaginationItems: FC<{ children?: ReactNode }> = ({ children }) => {\n const ctx = usePaginationContext('Pagination.Items');\n // Always run the hook so React's call order is stable across renders;\n // the result is discarded when explicit `children` were supplied.\n const result = usePagination({\n page: ctx.page,\n pageCount: ctx.pageCount,\n siblingCount: ctx.siblingCount,\n boundaryCount: ctx.boundaryCount,\n showFirstLast: false,\n showPrevNext: false,\n });\n if (children !== undefined) {\n return <>{children}</>;\n }\n return (\n <ItemsRenderer\n items={result.pages}\n onItemPress={(item) => {\n if (item.type === 'page' && item.page !== undefined) {\n ctx.goToPage(item.page);\n }\n }}\n />\n );\n};\n\nconst PaginationEllipsis: FC<{ children?: ReactNode }> = ({ children }) => {\n const ctx = usePaginationContext('Pagination.Ellipsis');\n return (\n <ItemButton\n type=\"ellipsis\"\n selected={false}\n disabled\n label={children ?? '…'}\n ariaLabel={ctx.labels.ellipsis}\n onPress={() => {}}\n />\n );\n};\n\nconst PaginationRange: FC = () => {\n const ctx = usePaginationContext('Pagination.Range');\n const colors = useThemeColors();\n if (ctx.itemCount === undefined || ctx.pageSize === undefined) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn('<Pagination.Range> requires both `itemCount` and `pageSize` on <Pagination>.');\n }\n return null;\n }\n const from = (ctx.page - 1) * ctx.pageSize + 1;\n const to = Math.min(ctx.itemCount, ctx.page * ctx.pageSize);\n const message = ctx.labels.rangeFmt(from, to, ctx.itemCount);\n return (\n <RNText\n role=\"status\"\n aria-live=\"polite\"\n style={{\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n color: colors.semantic.text.muted,\n fontVariant: ['tabular-nums'],\n paddingHorizontal: px(colors.spacing['2']),\n // Sits on the same baseline as the 32px buttons.\n lineHeight: px(colors.spacing['8']),\n }}\n >\n {message}\n </RNText>\n );\n};\n\nconst PaginationPageSize: FC<{ options: ReadonlyArray<number>; testID?: string }> = ({ options, testID }) => {\n const ctx = usePaginationContext('Pagination.PageSize');\n const colors = useThemeColors();\n const value = ctx.pageSize !== undefined ? String(ctx.pageSize) : '';\n const selectOptions = useMemo<SelectOption[]>(\n () => options.map((n) => ({ value: String(n), label: String(n) })),\n [options]\n );\n return (\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n gap: px(colors.spacing['2']),\n }}\n >\n <RNText\n style={{\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n color: colors.semantic.text.muted,\n }}\n >\n {ctx.labels.pageSize}\n </RNText>\n <Select\n {...(testID !== undefined ? { testID } : {})}\n aria-label={ctx.labels.pageSize}\n options={selectOptions}\n value={value}\n onChange={(v) => {\n const n = Number(v);\n if (Number.isFinite(n) && n > 0) {\n ctx.setPageSize(n);\n }\n }}\n />\n </View>\n );\n};\n\ntype PaginationJumperProps = {\n /** Show a separate visible \"Go to page\" label before the input. The aria-label is always set regardless. @defaultValue false */\n showLabel?: boolean;\n /** Override the visible label / accessible name. */\n label?: string;\n /** Override the input placeholder. @defaultValue the localized \"Go to\" hint */\n placeholder?: string;\n /** Width of the input in px. @defaultValue 56 */\n inputWidth?: number;\n testID?: string;\n};\n\n/**\n * Compact, purpose-built jumper. Built directly from RN's `TextInput`\n * primitive so we can render the exact 32px-tall borderless-then-focused\n * treatment that fits in a pagination row, instead of inheriting the full\n * form-field chrome (label, helper text, error slot) of `<TextInput>`.\n */\nconst PaginationJumper: FC<PaginationJumperProps> = ({\n showLabel = false,\n label,\n placeholder,\n inputWidth = 56,\n testID,\n}) => {\n const ctx = usePaginationContext('Pagination.Jumper');\n const colors = useThemeColors();\n const [draft, setDraft] = useState('');\n const [focused, setFocused] = useState(false);\n const [hovered, setHovered] = useState(false);\n const visibleLabel = label ?? ctx.labels.jumperLabel;\n const placeholderText = placeholder ?? ctx.labels.jumperPlaceholder;\n\n const submit = () => {\n const trimmed = draft.trim();\n if (trimmed === '') {\n return;\n }\n const n = Number(trimmed);\n if (!Number.isFinite(n) || n < 1) {\n setDraft('');\n return;\n }\n const clamped = Math.min(Math.max(1, Math.floor(n)), ctx.pageCount);\n ctx.goToPage(clamped);\n setDraft('');\n };\n\n const borderColor = focused\n ? colors.semantic.interactive.primary\n : hovered\n ? colors.semantic.border.strong\n : colors.semantic.border.default;\n\n return (\n <View\n style={{\n flexDirection: 'row',\n alignItems: 'center',\n gap: px(colors.spacing['2']),\n }}\n >\n {showLabel ? (\n <RNText\n style={{\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n color: colors.semantic.text.muted,\n }}\n >\n {visibleLabel}\n </RNText>\n ) : null}\n <View\n // The wrapper carries the visual chrome so the bare TextInput\n // can stay completely unstyled — it's just text + caret.\n onPointerEnter={Platform.OS === 'web' ? () => setHovered(true) : undefined}\n onPointerLeave={Platform.OS === 'web' ? () => setHovered(false) : undefined}\n style={\n {\n width: inputWidth,\n height: px(colors.spacing['8']),\n borderWidth: 1,\n borderColor,\n borderRadius: px(colors.radius.md),\n backgroundColor: colors.semantic.background.elevated,\n paddingHorizontal: px(colors.spacing['2']),\n justifyContent: 'center',\n // Web-only properties (silently dropped on native).\n ...(focused\n ? {\n boxShadow: `0 0 0 3px ${withAlpha(colors.semantic.interactive.primary, 0.15)}`,\n }\n : null),\n transitionProperty: 'border-color, box-shadow',\n transitionDuration: '120ms',\n transitionTimingFunction: 'cubic-bezier(0.2, 0, 0, 1)',\n } as unknown as ViewStyle\n }\n >\n <RNTextInput\n {...(testID !== undefined ? { testID } : {})}\n value={draft}\n onChangeText={setDraft}\n onSubmitEditing={submit}\n onBlur={() => {\n setFocused(false);\n submit();\n }}\n onFocus={() => setFocused(true)}\n keyboardType=\"number-pad\"\n inputMode=\"numeric\"\n placeholder={placeholderText}\n placeholderTextColor={colors.semantic.text.muted}\n aria-label={visibleLabel}\n accessibilityLabel={visibleLabel}\n returnKeyType=\"go\"\n selectTextOnFocus\n style={{\n fontFamily: colors.fontFamily.body,\n fontSize: px(colors.fontSize.sm),\n color: colors.semantic.text.default,\n fontVariant: ['tabular-nums'],\n textAlign: 'center',\n // Strip the browser's default outline — we draw our own\n // focus ring on the wrapper.\n ...(Platform.OS === 'web' ? ({ outline: 'none' } as object) : null),\n }}\n />\n </View>\n </View>\n );\n};\n\n/**\n * Apply an alpha channel to any of our token color strings (hex / rgb / hsl).\n * Cheap, zero-dep helper just for the focus glow.\n */\nfunction withAlpha(color: string, alpha: number): string {\n if (color.startsWith('#') && (color.length === 7 || color.length === 4)) {\n const expanded =\n color.length === 4 ? `#${color[1]}${color[1]}${color[2]}${color[2]}${color[3]}${color[3]}` : color;\n const r = Number.parseInt(expanded.slice(1, 3), 16);\n const g = Number.parseInt(expanded.slice(3, 5), 16);\n const b = Number.parseInt(expanded.slice(5, 7), 16);\n return `rgba(${r}, ${g}, ${b}, ${alpha})`;\n }\n return color;\n}\n\nexport type { PaginationJumperProps };\n\n// =============================================================================\n// Public symbol — Pagination + compound parts\n// =============================================================================\n\nexport const Pagination = Object.assign(PaginationRoot, {\n Items: PaginationItems,\n Item: PaginationItem,\n Prev: PaginationPrev,\n Next: PaginationNext,\n First: PaginationFirst,\n Last: PaginationLast,\n Ellipsis: PaginationEllipsis,\n Range: PaginationRange,\n PageSize: PaginationPageSize,\n Jumper: PaginationJumper,\n});\n\n// Suppress unused — ReactElement / KeyboardEvent are reserved for future kbd-nav extension.\ntype _Unused = ReactElement | KeyboardEvent;\n"]}
@@ -1,7 +1,7 @@
1
1
  import { Spinner } from './chunk-ACLHDHX3.js';
2
2
  import { Slot } from './chunk-ZIBNLXIV.js';
3
- import { cn } from './chunk-CHXHRJNZ.js';
4
3
  import { px } from './chunk-5A2QOOVN.js';
4
+ import { cn } from './chunk-CHXHRJNZ.js';
5
5
  import { useThemeColors } from './chunk-R5JMDDCB.js';
6
6
  import { __name } from './chunk-WCQVDF3K.js';
7
7
  import { useState, useCallback } from 'react';
@@ -204,5 +204,5 @@ var Button = /* @__PURE__ */ __name(({
204
204
  }, "Button");
205
205
 
206
206
  export { Button };
207
- //# sourceMappingURL=chunk-LWQZ257T.js.map
208
- //# sourceMappingURL=chunk-LWQZ257T.js.map
207
+ //# sourceMappingURL=chunk-5XEGZFG5.js.map
208
+ //# sourceMappingURL=chunk-5XEGZFG5.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/Button/Button.tsx"],"names":["RNText"],"mappings":"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","file":"chunk-LWQZ257T.js","sourcesContent":["'use client';\n\nimport type { Theme } from '@nori-ui/tokens';\nimport type { ComponentType, ReactNode, Ref } from 'react';\nimport { useCallback, useState } from 'react';\nimport type { PressableProps, StyleProp, View, ViewStyle } from 'react-native';\nimport { Pressable, Text as RNText } from 'react-native';\nimport { Slot } from '../../slot';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\nimport { Spinner } from '../Spinner';\n\nexport type ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'destructive';\nexport type ButtonSize = 'sm' | 'md' | 'lg';\n\ntype IconSlot = ComponentType<{ size?: number; color?: string }>;\n\nexport type ButtonProps = Omit<PressableProps, 'disabled' | 'children'> & {\n children?: ReactNode;\n variant?: ButtonVariant;\n size?: ButtonSize;\n disabled?: boolean;\n loading?: boolean;\n leadingIcon?: IconSlot;\n trailingIcon?: IconSlot;\n /** If true, the single child becomes the interactive element (Slot pattern). */\n asChild?: boolean;\n className?: string;\n testID?: string;\n ref?: Ref<View>;\n};\n\n// NativeWind classes — the `dark:` variants flip colors when <html> carries\n// the `dark` class (or `data-theme=\"dark\"`); see the tokens Tailwind preset.\n//\n// These act as the no-NativeWind fallback (e.g. raw JSX in Expo Snack\n// without a compile step) and the dark-mode bridge. The dimensional\n// utilities (`rounded-md`, `h-10`, `px-4`, `gap-2`, `text-*`) are kept\n// because the inline `style` array always overrides them — so when a\n// `<ThemeProvider>` widens spacing/radius/fontSize, the inline values\n// win on CSS specificity and the Tailwind class is harmless.\nconst VARIANT_CLASSES: Record<ButtonVariant, string> = {\n primary:\n 'bg-semantic-interactive-primary hover:bg-semantic-interactive-primaryHover active:bg-semantic-interactive-primaryPressed',\n secondary:\n 'bg-neutral-100 hover:bg-neutral-200 active:bg-neutral-300 dark:bg-neutral-800 dark:hover:bg-neutral-700 dark:active:bg-neutral-600',\n ghost: 'bg-transparent hover:bg-neutral-100 active:bg-neutral-200 dark:hover:bg-neutral-800 dark:active:bg-neutral-700',\n destructive: 'bg-semantic-interactive-destructive hover:opacity-90 active:opacity-80',\n};\n\nconst SIZE_CLASSES: Record<ButtonSize, string> = {\n sm: 'h-8 px-3 text-sm',\n md: 'h-10 px-4 text-md',\n lg: 'h-12 px-5 text-lg',\n};\n\nconst ICON_SIZE: Record<ButtonSize, number> = { sm: 14, md: 16, lg: 20 };\n\nconst BASE_CLASSES = 'inline-flex flex-row items-center justify-center gap-2 rounded-md select-none';\n\n// Heights are intentionally hardcoded — they're tightly coupled to the\n// button's overall density (a 48px target on lg, 32px on sm). Padding and\n// fontSize are pulled from the active theme so a custom theme that scales\n// the spacing/fontSize ramps also scales the button. If you want a\n// genuinely smaller / taller button, override `theme.spacing` /\n// `theme.fontSize` rather than reach for new size literals here.\nconst HEIGHT_BY_SIZE: Record<ButtonSize, number> = {\n sm: 32,\n md: 40,\n lg: 48,\n};\ntype SizeKeys = { padX: keyof Theme['spacing']; font: keyof Theme['fontSize'] };\nconst SIZE_KEYS: Record<ButtonSize, SizeKeys> = {\n sm: { padX: '3', font: 'sm' },\n md: { padX: '4', font: 'md' },\n lg: { padX: '5', font: 'lg' },\n};\n\n// gap and borderRadius come from the theme inside the component.\nconst BASE_STYLE: ViewStyle = {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n};\n\nexport const Button = ({\n children,\n variant = 'primary',\n size = 'md',\n disabled,\n loading,\n leadingIcon: LeadingIcon,\n trailingIcon: TrailingIcon,\n asChild,\n className,\n onPress,\n testID,\n style,\n ref,\n ...rest\n}: ButtonProps) => {\n const colors = useThemeColors();\n const isInoperative = Boolean(disabled) || Boolean(loading);\n // rn-web's `Pressable` does not reliably apply a `style` callback's\n // returned values to the rendered DOM (the static portions get\n // dropped). We track hover/press via state and pass `style` as a\n // plain array — that path produces an inline `style=\"…\"` attribute\n // on the button, which beats the dimensional Tailwind utilities on\n // CSS specificity and lets a custom `<ThemeProvider>` flow padding,\n // radius, fontSize, fontFamily, and fontWeight all the way through.\n const [hovered, setHovered] = useState(false);\n const [pressed, setPressed] = useState(false);\n const handleHoverIn = useCallback(() => setHovered(true), []);\n const handleHoverOut = useCallback(() => {\n setHovered(false);\n setPressed(false);\n }, []);\n const handlePressIn = useCallback(() => setPressed(true), []);\n const handlePressOut = useCallback(() => setPressed(false), []);\n // When disabled, drop the variant's hover/active class fragments and\n // append `pointer-events-none cursor-not-allowed` so the className\n // path matches the inline-style path: no hover tint, no press tint,\n // and the cursor signals the control is inert. We still keep the\n // base variant bg class so the resting color is right.\n const variantClasses = isInoperative\n ? VARIANT_CLASSES[variant]\n .split(' ')\n .filter((cls) => !cls.startsWith('hover:') && !cls.startsWith('active:'))\n .join(' ')\n : VARIANT_CLASSES[variant];\n const classes = cn(\n BASE_CLASSES,\n variantClasses,\n SIZE_CLASSES[size],\n isInoperative ? 'opacity-60 pointer-events-none cursor-not-allowed' : undefined,\n className\n );\n\n // Inline-style palette per (variant × interaction state). The hook is the\n // source of truth — dark mode and theme overrides flow through it.\n //\n // Why inline (not className): a class-based `:hover { background-color }`\n // can never beat an inline `style={{ backgroundColor }}` — inline wins\n // by CSS specificity. So if we want hover to actually flip the surface\n // color, hover has to be applied inline too. We use Pressable's `style`\n // callback (`{ hovered, pressed }`) which on web is wired up by\n // react-native-web and on native exposes only `pressed`. The className\n // path keeps the same Tailwind variants for the no-NativeWind fallback\n // case (Expo Snack rendering raw JSX without compilation).\n const variantStateColors: Record<ButtonVariant, { rest: string; hover: string; pressed: string }> = {\n primary: {\n rest: colors.semantic.interactive.primary,\n hover: colors.semantic.interactive.primaryHover,\n pressed: colors.semantic.interactive.primaryPressed,\n },\n secondary: {\n rest: colors.semantic.background.subtle,\n // hover / pressed must be theme-aware. The previous version\n // pulled directly from `color.neutral.{200,300}`, which are\n // raw tokens that DON'T flip per scheme — in dark mode the\n // hovered state ended up light-gray on dark, ruining contrast.\n // `border.default` / `border.strong` invert correctly: in\n // light they read as light-gray washes (next step from\n // `background.subtle`); in dark they read as the darker grays\n // expected for hover/pressed on a dark surface.\n hover: colors.semantic.border.default,\n pressed: colors.semantic.border.strong,\n },\n ghost: {\n rest: 'transparent',\n hover: colors.semantic.background.subtle,\n pressed: colors.semantic.border.default,\n },\n destructive: {\n rest: colors.semantic.interactive.destructive,\n // No darker tone token for destructive yet — fall back to a 90% /\n // 80% opacity wash by mixing through rgba. Matches the className\n // hover:opacity-90 / active:opacity-80 fallback.\n hover: colors.semantic.interactive.destructive,\n pressed: colors.semantic.interactive.destructive,\n },\n };\n const variantTextColor: Record<ButtonVariant, string> = {\n primary: colors.semantic.text.inverted,\n secondary: colors.semantic.text.default,\n ghost: colors.semantic.text.default,\n destructive: colors.semantic.text.inverted,\n };\n\n const stateColors = variantStateColors[variant];\n // When disabled (or loading), force the rest state — disabled means\n // disabled. The control should NOT visually respond to hover/press,\n // even though the OS still fires those events. Pressable also gets\n // `disabled={true}` on the Pressable below which blocks onPress, but\n // the visual treatment is owned here.\n const stateBg = isInoperative\n ? stateColors.rest\n : pressed\n ? stateColors.pressed\n : hovered\n ? stateColors.hover\n : stateColors.rest;\n // Destructive uses opacity dim instead of a separate color (matches\n // existing className behavior; keeps the red recognisable on press).\n // Same disabled rule as bg: hover/press dim is suppressed when\n // disabled — the static 0.6 opacity below handles the disabled look.\n const stateInteractionOpacity = isInoperative || variant !== 'destructive' ? 1 : pressed ? 0.8 : hovered ? 0.9 : 1;\n\n // Resolve all dimensional + typographic values from the active theme\n // so a custom theme that scales spacing / fontSize / radius / fontWeight\n // also reshapes every Button on the page.\n const sizeKeys = SIZE_KEYS[size];\n const sizeContainer: ViewStyle = {\n height: HEIGHT_BY_SIZE[size],\n paddingHorizontal: px(colors.spacing[sizeKeys.padX]),\n gap: px(colors.spacing['2']),\n borderRadius: px(colors.radius.md),\n };\n const sizeFontSize = px(colors.fontSize[sizeKeys.font]);\n\n const inlineBase: ViewStyle[] = [\n BASE_STYLE,\n { backgroundColor: stateBg },\n sizeContainer,\n { opacity: isInoperative ? 0.6 : stateInteractionOpacity },\n ];\n // Resolve the consumer's `style` against the same hover/press state\n // we just computed — this preserves the historical contract where a\n // callback `style` receives the live interaction flags. The RN\n // upstream type only declares `pressed`; rn-web also passes\n // `hovered`. Cast through `unknown` to ship both without a type\n // assertion battle.\n const consumerStyle: StyleProp<ViewStyle> =\n typeof style === 'function' ? style({ pressed, ...({ hovered } as Record<string, unknown>) } as never) : style;\n const pressableStyle: StyleProp<ViewStyle> = [...inlineBase, consumerStyle];\n const slotStyle: StyleProp<ViewStyle> = [...inlineBase, consumerStyle];\n\n const textColor = variantTextColor[variant];\n const textStyle = {\n color: textColor,\n fontFamily: colors.fontFamily.body,\n fontSize: sizeFontSize,\n fontWeight: colors.fontWeight.medium as '500',\n };\n\n const handlePress: NonNullable<PressableProps['onPress']> = (ev) => {\n if (isInoperative) {\n return;\n }\n onPress?.(ev);\n };\n\n if (asChild) {\n const slotProps: Record<string, unknown> = {\n ref,\n className: classes,\n style: slotStyle,\n onClick: handlePress as unknown as (...args: unknown[]) => unknown,\n ...rest,\n };\n if (isInoperative) {\n slotProps['aria-disabled'] = true;\n }\n if (loading) {\n slotProps['aria-busy'] = true;\n }\n if (testID !== undefined) {\n slotProps['data-testid'] = testID;\n }\n return <Slot {...slotProps}>{children}</Slot>;\n }\n\n const pressableExtra: Record<string, unknown> = {};\n if (isInoperative) {\n pressableExtra['aria-disabled'] = true;\n }\n if (loading) {\n pressableExtra['aria-busy'] = true;\n }\n\n return (\n <Pressable\n ref={ref}\n {...(testID !== undefined ? { testID } : {})}\n role=\"button\"\n accessibilityRole=\"button\"\n accessibilityState={{ disabled: isInoperative, busy: Boolean(loading) }}\n disabled={isInoperative}\n onPress={handlePress}\n onHoverIn={handleHoverIn}\n onHoverOut={handleHoverOut}\n onPressIn={handlePressIn}\n onPressOut={handlePressOut}\n className={classes}\n style={pressableStyle}\n {...pressableExtra}\n {...rest}\n >\n {loading ? (\n <Spinner size={ICON_SIZE[size]} label=\"Loading\" color={textColor} />\n ) : LeadingIcon ? (\n <LeadingIcon size={ICON_SIZE[size]} color={textColor} />\n ) : null}\n <RNText\n className={cn('font-medium', SIZE_CLASSES[size].includes('text-') ? undefined : 'text-md')}\n style={textStyle}\n >\n {children}\n </RNText>\n {TrailingIcon ? <TrailingIcon size={ICON_SIZE[size]} color={textColor} /> : null}\n </Pressable>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/components/Button/Button.tsx"],"names":["RNText"],"mappings":"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","file":"chunk-5XEGZFG5.js","sourcesContent":["'use client';\n\nimport type { Theme } from '@nori-ui/tokens';\nimport type { ComponentType, ReactNode, Ref } from 'react';\nimport { useCallback, useState } from 'react';\nimport type { PressableProps, StyleProp, View, ViewStyle } from 'react-native';\nimport { Pressable, Text as RNText } from 'react-native';\nimport { Slot } from '../../slot';\nimport { px } from '../../theme/px';\nimport { useThemeColors } from '../../theme/use-theme-colors';\nimport { cn } from '../../utils/cn';\nimport { Spinner } from '../Spinner';\n\nexport type ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'destructive';\nexport type ButtonSize = 'sm' | 'md' | 'lg';\n\ntype IconSlot = ComponentType<{ size?: number; color?: string }>;\n\nexport type ButtonProps = Omit<PressableProps, 'disabled' | 'children'> & {\n children?: ReactNode;\n variant?: ButtonVariant;\n size?: ButtonSize;\n disabled?: boolean;\n loading?: boolean;\n leadingIcon?: IconSlot;\n trailingIcon?: IconSlot;\n /** If true, the single child becomes the interactive element (Slot pattern). */\n asChild?: boolean;\n className?: string;\n testID?: string;\n ref?: Ref<View>;\n};\n\n// NativeWind classes — the `dark:` variants flip colors when <html> carries\n// the `dark` class (or `data-theme=\"dark\"`); see the tokens Tailwind preset.\n//\n// These act as the no-NativeWind fallback (e.g. raw JSX in Expo Snack\n// without a compile step) and the dark-mode bridge. The dimensional\n// utilities (`rounded-md`, `h-10`, `px-4`, `gap-2`, `text-*`) are kept\n// because the inline `style` array always overrides them — so when a\n// `<ThemeProvider>` widens spacing/radius/fontSize, the inline values\n// win on CSS specificity and the Tailwind class is harmless.\nconst VARIANT_CLASSES: Record<ButtonVariant, string> = {\n primary:\n 'bg-semantic-interactive-primary hover:bg-semantic-interactive-primaryHover active:bg-semantic-interactive-primaryPressed',\n secondary:\n 'bg-neutral-100 hover:bg-neutral-200 active:bg-neutral-300 dark:bg-neutral-800 dark:hover:bg-neutral-700 dark:active:bg-neutral-600',\n ghost: 'bg-transparent hover:bg-neutral-100 active:bg-neutral-200 dark:hover:bg-neutral-800 dark:active:bg-neutral-700',\n destructive: 'bg-semantic-interactive-destructive hover:opacity-90 active:opacity-80',\n};\n\nconst SIZE_CLASSES: Record<ButtonSize, string> = {\n sm: 'h-8 px-3 text-sm',\n md: 'h-10 px-4 text-md',\n lg: 'h-12 px-5 text-lg',\n};\n\nconst ICON_SIZE: Record<ButtonSize, number> = { sm: 14, md: 16, lg: 20 };\n\nconst BASE_CLASSES = 'inline-flex flex-row items-center justify-center gap-2 rounded-md select-none';\n\n// Heights are intentionally hardcoded — they're tightly coupled to the\n// button's overall density (a 48px target on lg, 32px on sm). Padding and\n// fontSize are pulled from the active theme so a custom theme that scales\n// the spacing/fontSize ramps also scales the button. If you want a\n// genuinely smaller / taller button, override `theme.spacing` /\n// `theme.fontSize` rather than reach for new size literals here.\nconst HEIGHT_BY_SIZE: Record<ButtonSize, number> = {\n sm: 32,\n md: 40,\n lg: 48,\n};\ntype SizeKeys = { padX: keyof Theme['spacing']; font: keyof Theme['fontSize'] };\nconst SIZE_KEYS: Record<ButtonSize, SizeKeys> = {\n sm: { padX: '3', font: 'sm' },\n md: { padX: '4', font: 'md' },\n lg: { padX: '5', font: 'lg' },\n};\n\n// gap and borderRadius come from the theme inside the component.\nconst BASE_STYLE: ViewStyle = {\n flexDirection: 'row',\n alignItems: 'center',\n justifyContent: 'center',\n};\n\nexport const Button = ({\n children,\n variant = 'primary',\n size = 'md',\n disabled,\n loading,\n leadingIcon: LeadingIcon,\n trailingIcon: TrailingIcon,\n asChild,\n className,\n onPress,\n testID,\n style,\n ref,\n ...rest\n}: ButtonProps) => {\n const colors = useThemeColors();\n const isInoperative = Boolean(disabled) || Boolean(loading);\n // rn-web's `Pressable` does not reliably apply a `style` callback's\n // returned values to the rendered DOM (the static portions get\n // dropped). We track hover/press via state and pass `style` as a\n // plain array — that path produces an inline `style=\"…\"` attribute\n // on the button, which beats the dimensional Tailwind utilities on\n // CSS specificity and lets a custom `<ThemeProvider>` flow padding,\n // radius, fontSize, fontFamily, and fontWeight all the way through.\n const [hovered, setHovered] = useState(false);\n const [pressed, setPressed] = useState(false);\n const handleHoverIn = useCallback(() => setHovered(true), []);\n const handleHoverOut = useCallback(() => {\n setHovered(false);\n setPressed(false);\n }, []);\n const handlePressIn = useCallback(() => setPressed(true), []);\n const handlePressOut = useCallback(() => setPressed(false), []);\n // When disabled, drop the variant's hover/active class fragments and\n // append `pointer-events-none cursor-not-allowed` so the className\n // path matches the inline-style path: no hover tint, no press tint,\n // and the cursor signals the control is inert. We still keep the\n // base variant bg class so the resting color is right.\n const variantClasses = isInoperative\n ? VARIANT_CLASSES[variant]\n .split(' ')\n .filter((cls) => !cls.startsWith('hover:') && !cls.startsWith('active:'))\n .join(' ')\n : VARIANT_CLASSES[variant];\n const classes = cn(\n BASE_CLASSES,\n variantClasses,\n SIZE_CLASSES[size],\n isInoperative ? 'opacity-60 pointer-events-none cursor-not-allowed' : undefined,\n className\n );\n\n // Inline-style palette per (variant × interaction state). The hook is the\n // source of truth — dark mode and theme overrides flow through it.\n //\n // Why inline (not className): a class-based `:hover { background-color }`\n // can never beat an inline `style={{ backgroundColor }}` — inline wins\n // by CSS specificity. So if we want hover to actually flip the surface\n // color, hover has to be applied inline too. We use Pressable's `style`\n // callback (`{ hovered, pressed }`) which on web is wired up by\n // react-native-web and on native exposes only `pressed`. The className\n // path keeps the same Tailwind variants for the no-NativeWind fallback\n // case (Expo Snack rendering raw JSX without compilation).\n const variantStateColors: Record<ButtonVariant, { rest: string; hover: string; pressed: string }> = {\n primary: {\n rest: colors.semantic.interactive.primary,\n hover: colors.semantic.interactive.primaryHover,\n pressed: colors.semantic.interactive.primaryPressed,\n },\n secondary: {\n rest: colors.semantic.background.subtle,\n // hover / pressed must be theme-aware. The previous version\n // pulled directly from `color.neutral.{200,300}`, which are\n // raw tokens that DON'T flip per scheme — in dark mode the\n // hovered state ended up light-gray on dark, ruining contrast.\n // `border.default` / `border.strong` invert correctly: in\n // light they read as light-gray washes (next step from\n // `background.subtle`); in dark they read as the darker grays\n // expected for hover/pressed on a dark surface.\n hover: colors.semantic.border.default,\n pressed: colors.semantic.border.strong,\n },\n ghost: {\n rest: 'transparent',\n hover: colors.semantic.background.subtle,\n pressed: colors.semantic.border.default,\n },\n destructive: {\n rest: colors.semantic.interactive.destructive,\n // No darker tone token for destructive yet — fall back to a 90% /\n // 80% opacity wash by mixing through rgba. Matches the className\n // hover:opacity-90 / active:opacity-80 fallback.\n hover: colors.semantic.interactive.destructive,\n pressed: colors.semantic.interactive.destructive,\n },\n };\n const variantTextColor: Record<ButtonVariant, string> = {\n primary: colors.semantic.text.inverted,\n secondary: colors.semantic.text.default,\n ghost: colors.semantic.text.default,\n destructive: colors.semantic.text.inverted,\n };\n\n const stateColors = variantStateColors[variant];\n // When disabled (or loading), force the rest state — disabled means\n // disabled. The control should NOT visually respond to hover/press,\n // even though the OS still fires those events. Pressable also gets\n // `disabled={true}` on the Pressable below which blocks onPress, but\n // the visual treatment is owned here.\n const stateBg = isInoperative\n ? stateColors.rest\n : pressed\n ? stateColors.pressed\n : hovered\n ? stateColors.hover\n : stateColors.rest;\n // Destructive uses opacity dim instead of a separate color (matches\n // existing className behavior; keeps the red recognisable on press).\n // Same disabled rule as bg: hover/press dim is suppressed when\n // disabled — the static 0.6 opacity below handles the disabled look.\n const stateInteractionOpacity = isInoperative || variant !== 'destructive' ? 1 : pressed ? 0.8 : hovered ? 0.9 : 1;\n\n // Resolve all dimensional + typographic values from the active theme\n // so a custom theme that scales spacing / fontSize / radius / fontWeight\n // also reshapes every Button on the page.\n const sizeKeys = SIZE_KEYS[size];\n const sizeContainer: ViewStyle = {\n height: HEIGHT_BY_SIZE[size],\n paddingHorizontal: px(colors.spacing[sizeKeys.padX]),\n gap: px(colors.spacing['2']),\n borderRadius: px(colors.radius.md),\n };\n const sizeFontSize = px(colors.fontSize[sizeKeys.font]);\n\n const inlineBase: ViewStyle[] = [\n BASE_STYLE,\n { backgroundColor: stateBg },\n sizeContainer,\n { opacity: isInoperative ? 0.6 : stateInteractionOpacity },\n ];\n // Resolve the consumer's `style` against the same hover/press state\n // we just computed — this preserves the historical contract where a\n // callback `style` receives the live interaction flags. The RN\n // upstream type only declares `pressed`; rn-web also passes\n // `hovered`. Cast through `unknown` to ship both without a type\n // assertion battle.\n const consumerStyle: StyleProp<ViewStyle> =\n typeof style === 'function' ? style({ pressed, ...({ hovered } as Record<string, unknown>) } as never) : style;\n const pressableStyle: StyleProp<ViewStyle> = [...inlineBase, consumerStyle];\n const slotStyle: StyleProp<ViewStyle> = [...inlineBase, consumerStyle];\n\n const textColor = variantTextColor[variant];\n const textStyle = {\n color: textColor,\n fontFamily: colors.fontFamily.body,\n fontSize: sizeFontSize,\n fontWeight: colors.fontWeight.medium as '500',\n };\n\n const handlePress: NonNullable<PressableProps['onPress']> = (ev) => {\n if (isInoperative) {\n return;\n }\n onPress?.(ev);\n };\n\n if (asChild) {\n const slotProps: Record<string, unknown> = {\n ref,\n className: classes,\n style: slotStyle,\n onClick: handlePress as unknown as (...args: unknown[]) => unknown,\n ...rest,\n };\n if (isInoperative) {\n slotProps['aria-disabled'] = true;\n }\n if (loading) {\n slotProps['aria-busy'] = true;\n }\n if (testID !== undefined) {\n slotProps['data-testid'] = testID;\n }\n return <Slot {...slotProps}>{children}</Slot>;\n }\n\n const pressableExtra: Record<string, unknown> = {};\n if (isInoperative) {\n pressableExtra['aria-disabled'] = true;\n }\n if (loading) {\n pressableExtra['aria-busy'] = true;\n }\n\n return (\n <Pressable\n ref={ref}\n {...(testID !== undefined ? { testID } : {})}\n role=\"button\"\n accessibilityRole=\"button\"\n accessibilityState={{ disabled: isInoperative, busy: Boolean(loading) }}\n disabled={isInoperative}\n onPress={handlePress}\n onHoverIn={handleHoverIn}\n onHoverOut={handleHoverOut}\n onPressIn={handlePressIn}\n onPressOut={handlePressOut}\n className={classes}\n style={pressableStyle}\n {...pressableExtra}\n {...rest}\n >\n {loading ? (\n <Spinner size={ICON_SIZE[size]} label=\"Loading\" color={textColor} />\n ) : LeadingIcon ? (\n <LeadingIcon size={ICON_SIZE[size]} color={textColor} />\n ) : null}\n <RNText\n className={cn('font-medium', SIZE_CLASSES[size].includes('text-') ? undefined : 'text-md')}\n style={textStyle}\n >\n {children}\n </RNText>\n {TrailingIcon ? <TrailingIcon size={ICON_SIZE[size]} color={textColor} /> : null}\n </Pressable>\n );\n};\n"]}
@@ -1,5 +1,5 @@
1
- import { cn } from './chunk-CHXHRJNZ.js';
2
1
  import { px } from './chunk-5A2QOOVN.js';
2
+ import { cn } from './chunk-CHXHRJNZ.js';
3
3
  import { useThemeColors } from './chunk-R5JMDDCB.js';
4
4
  import { __name } from './chunk-WCQVDF3K.js';
5
5
  import { useState, useCallback } from 'react';
@@ -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-6AD6KCVB.js.map
178
+ //# sourceMappingURL=chunk-6AD6KCVB.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":";;;;;;;;AA2CA,IAAM,qBAAA,GAAmC;AAAA,EACrC,aAAA,EAAe,KAAA;AAAA,EACf,UAAA,EAAY;AAChB,CAAA;AAEA,IAAM,mBAAA,GAAiC;AAAA,EACnC,IAAA,EAAM,CAAA;AAAA,EACN,UAAA,EAAY,QAAA;AAAA,EACZ,cAAA,EAAgB;AACpB,CAAA;AASA,IAAM,iBAAA,GAAmE;AAAA,EACrE,IAAI,EAAE,QAAA,EAAU,KAAK,QAAA,EAAU,GAAA,EAAK,MAAM,IAAA,EAAK;AAAA;AAAA,EAC/C,IAAI,EAAE,QAAA,EAAU,KAAK,QAAA,EAAU,GAAA,EAAK,MAAM,IAAA;AAAK;AACnD,CAAA;AAEA,IAAM,qBAAA,GAAmC;AAAA;AAAA;AAAA;AAAA;AAAA,EAKrC,GAAI,EAAE,SAAA,EAAW,+BAAA,EAAgC;AAAA,EACjD,SAAA,EAAW;AACf,CAAA;AAYO,IAAM,mCAAmB,MAAA,CAAA,CAAmB;AAAA,EAC/C,KAAA;AAAA,EACA,YAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,IAAA,GAAO,IAAA;AAAA,EACP,KAAA;AAAA,EACA,SAAA;AAAA,EACA;AACJ,CAAA,KAAgC;AAC5B,EAAA,MAAM,SAAS,cAAA,EAAe;AAC9B,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAwB,YAAY,CAAA;AAC9D,EAAA,MAAM,eAAe,KAAA,KAAU,MAAA;AAC/B,EAAA,MAAM,OAAA,GAAU,eAAe,KAAA,GAAQ,KAAA;AAEvC,EAAA,MAAM,MAAA,GAAS,WAAA;AAAA,IACX,CAAC,IAAA,KAAY;AACT,MAAA,IAAI,QAAA,EAAU;AACV,QAAA;AAAA,MACJ;AACA,MAAA,IAAI,CAAC,YAAA,EAAc;AACf,QAAA,QAAA,CAAS,IAAI,CAAA;AAAA,MACjB;AACA,MAAA,QAAA,GAAW,IAAI,CAAA;AAAA,IACnB,CAAA;AAAA,IACA,CAAC,QAAA,EAAU,YAAA,EAAc,QAAQ;AAAA,GACrC;AAEA,EAAA,MAAM,aAAA,GAAgB,WAAA;AAAA,IAClB,CAAC,KAAA,KAAyC;AACtC,MAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACtB,QAAA;AAAA,MACJ;AACA,MAAA,MAAM,MAAM,OAAA,CAAQ,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,UAAU,OAAO,CAAA;AACxD,MAAA,MAAM,KAAA,GAAQ,GAAA,KAAQ,EAAA,GAAK,CAAA,GAAI,GAAA;AAC/B,MAAA,MAAM,MAAA,GACF,KAAA,CAAM,GAAA,KAAQ,YAAA,IAAgB,MAAM,GAAA,KAAQ,WAAA,GACtC,CAAA,GACA,KAAA,CAAM,GAAA,KAAQ,WAAA,IAAe,KAAA,CAAM,GAAA,KAAQ,YACzC,EAAA,GACA,CAAA;AACZ,MAAA,IAAI,WAAW,CAAA,IAAK,KAAA,CAAM,QAAQ,MAAA,IAAU,KAAA,CAAM,QAAQ,KAAA,EAAO;AAC7D,QAAA;AAAA,MACJ;AACA,MAAA,KAAA,CAAM,cAAA,EAAe;AACrB,MAAA,IAAI,OAAA;AACJ,MAAA,IAAI,KAAA,CAAM,QAAQ,MAAA,EAAQ;AACtB,QAAA,OAAA,GAAU,CAAA;AAAA,MACd,CAAA,MAAA,IAAW,KAAA,CAAM,GAAA,KAAQ,KAAA,EAAO;AAC5B,QAAA,OAAA,GAAU,QAAQ,MAAA,GAAS,CAAA;AAAA,MAC/B,CAAA,MAAO;AACH,QAAA,OAAA,GAAA,CAAW,KAAA,GAAQ,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,MAAA;AAAA,MAC1D;AAEA,MAAA,MAAM,SAAA,GAAY,MAAA,KAAW,CAAA,GAAI,CAAA,GAAI,MAAA;AACrC,MAAA,KAAA,IAAS,WAAW,CAAA,EAAG,QAAA,GAAW,OAAA,CAAQ,MAAA,EAAQ,YAAY,CAAA,EAAG;AAC7D,QAAA,MAAM,SAAA,GAAY,QAAQ,OAAO,CAAA;AACjC,QAAA,IAAI,SAAA,IAAa,CAAC,SAAA,CAAU,QAAA,EAAU;AAClC,UAAA,MAAA,CAAO,UAAU,KAAK,CAAA;AACtB,UAAA;AAAA,QACJ;AACA,QAAA,OAAA,GAAA,CAAW,OAAA,GAAU,SAAA,GAAY,OAAA,CAAQ,MAAA,IAAU,OAAA,CAAQ,MAAA;AAAA,MAC/D;AAAA,IACJ,CAAA;AAAA,IACA,CAAC,OAAA,EAAS,OAAA,EAAS,MAAM;AAAA,GAC7B;AAEA,EAAA,MAAM,QAAA,GAAW,kBAAkB,IAAI,CAAA;AACvC,EAAA,MAAM,cAAc,EAAA,CAAG,MAAA,CAAO,OAAA,CAAQ,QAAA,CAAS,QAAQ,CAAC,CAAA;AACxD,EAAA,MAAM,cAAc,EAAA,CAAG,MAAA,CAAO,OAAA,CAAQ,QAAA,CAAS,QAAQ,CAAC,CAAA;AACxD,EAAA,MAAM,kBAAkB,EAAA,CAAG,MAAA,CAAO,QAAA,CAAS,QAAA,CAAS,IAAI,CAAC,CAAA;AAEzD,EAAA,MAAM,UAAA,GAAsC;AAAA,IACxC,IAAA,EAAM,YAAA;AAAA,IACN,iBAAA,EAAmB,YAAA;AAAA,IACnB,SAAA,EAAW,aAAA;AAAA,IACX,GAAI,UAAU,MAAA,GAAY,EAAE,cAAc,KAAA,EAAO,kBAAA,EAAoB,KAAA,EAAM,GAAI,EAAC;AAAA,IAChF,GAAI,QAAA,GAAW,EAAE,eAAA,EAAiB,IAAA,KAAS,EAAC;AAAA,IAC5C,GAAI,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,KAAW;AAAC,GAC7C;AAEA,EAAA,MAAM,cAAA,GAA4B;AAAA,IAC9B,GAAG,qBAAA;AAAA,IACH,YAAA,EAAc,EAAA,CAAG,MAAA,CAAO,MAAA,CAAO,EAAE,CAAA;AAAA,IACjC,OAAA,EAAS,EAAA,CAAG,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA,IAC/B,GAAA,EAAK,EAAA,CAAG,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAC,CAAA;AAAA,IAC3B,eAAA,EAAiB,MAAA,CAAO,QAAA,CAAS,UAAA,CAAW;AAAA,GAChD;AACA,EAAA,MAAM,gBAAA,GAA8B;AAAA,IAChC,GAAG,mBAAA;AAAA,IACH,YAAA,EAAc,EAAA,CAAG,MAAA,CAAO,MAAA,CAAO,EAAE;AAAA,GACrC;AACA,EAAA,MAAM,oBAAA,GAAkC;AAAA,IACpC,GAAG,qBAAA;AAAA,IACH,eAAA,EAAiB,MAAA,CAAO,QAAA,CAAS,UAAA,CAAW;AAAA,GAChD;AAEA,EAAA,uBACI,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACI,GAAG,UAAA;AAAA,MACJ,SAAA,EAAW,EAAA;AAAA,QACP,4FAAA;AAAA,QACA,WAAW,YAAA,GAAe,MAAA;AAAA,QAC1B;AAAA,OACJ;AAAA,MACA,KAAA,EAAO,CAAC,cAAA,EAAgB,QAAA,GAAW,EAAE,OAAA,EAAS,GAAA,KAAQ,IAAI,CAAA;AAAA,MAEzD,QAAA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW;AACrB,QAAA,MAAM,QAAA,GAAW,OAAO,KAAA,KAAU,OAAA;AAClC,QAAA,MAAM,aAAA,GAAgB,YAAY,MAAA,CAAO,QAAA;AACzC,QAAA,uBACI,GAAA;AAAA,UAAC,SAAA;AAAA,UAAA;AAAA,YAEG,IAAA,EAAK,OAAA;AAAA,YACL,iBAAA,EAAkB,OAAA;AAAA,YAClB,cAAA,EAAc,QAAA;AAAA,YACd,oBAAoB,EAAE,QAAA,EAAU,QAAA,EAAU,OAAA,CAAQ,aAAa,CAAA,EAAE;AAAA,YACjE,QAAA,EAAU,QAAA,IAAa,OAAA,KAAY,MAAA,IAAa,OAAA,CAAQ,CAAC,CAAA,EAAG,KAAA,KAAU,MAAA,CAAO,KAAA,GAAS,CAAA,GAAI,EAAA;AAAA,YAC1F,SAAS,MAAM;AACX,cAAA,IAAI,CAAC,aAAA,EAAe;AAChB,gBAAA,MAAA,CAAO,OAAO,KAAK,CAAA;AAAA,cACvB;AAAA,YACJ,CAAA;AAAA,YACC,GAAI,gBAAgB,EAAE,eAAA,EAAiB,MAAM,QAAA,EAAU,IAAA,KAAS,EAAC;AAAA,YAClE,SAAA,EAAW,EAAA;AAAA,cACP,+CAAA;AAAA,cACA,WAAW,2CAAA,GAA8C,EAAA;AAAA,cACzD,gBAAgB,YAAA,GAAe;AAAA,aACnC;AAAA,YACA,KAAA,EAAO;AAAA,cACH,gBAAA;AAAA,cACA,EAAE,eAAA,EAAiB,WAAA,EAAa,iBAAA,EAAmB,WAAA,EAAY;AAAA,cAC/D,WAAW,oBAAA,GAAuB,IAAA;AAAA,cAClC,aAAA,GAAgB,EAAE,OAAA,EAAS,GAAA,EAAI,GAAI;AAAA,aACvC;AAAA,YAEC,QAAA,EAAA,OAAO,MAAA,CAAO,KAAA,KAAU,QAAA,mBACrB,GAAA;AAAA,cAACA,IAAA;AAAA,cAAA;AAAA,gBACG,KAAA,EAAO;AAAA,kBACH,KAAA,EAAO,WAAW,MAAA,CAAO,QAAA,CAAS,KAAK,OAAA,GAAU,MAAA,CAAO,SAAS,IAAA,CAAK,KAAA;AAAA,kBACtE,UAAA,EAAY,OAAO,UAAA,CAAW,IAAA;AAAA,kBAC9B,QAAA,EAAU,eAAA;AAAA,kBACV,YAAY,QAAA,GACL,MAAA,CAAO,UAAA,CAAW,QAAA,GAClB,OAAO,UAAA,CAAW;AAAA,iBAC7B;AAAA,gBAEC,QAAA,EAAA,MAAA,CAAO;AAAA;AAAA,gBAGZ,MAAA,CAAO;AAAA,WAAA;AAAA,UAtCN,MAAA,CAAO;AAAA,SAwChB;AAAA,MAER,CAAC;AAAA;AAAA,GACL;AAER,CAAA,EA9JgC,kBAAA","file":"chunk-6AD6KCVB.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"]}
@@ -0,0 +1,125 @@
1
+ import { __name } from './chunk-WCQVDF3K.js';
2
+ import { useState, useRef, useCallback, useMemo } from 'react';
3
+
4
+ var range = /* @__PURE__ */ __name((from, to) => {
5
+ if (to < from) {
6
+ return [];
7
+ }
8
+ const out = new Array(to - from + 1);
9
+ for (let i = 0; i < out.length; i += 1) {
10
+ out[i] = from + i;
11
+ }
12
+ return out;
13
+ }, "range");
14
+ function usePagination(args) {
15
+ const {
16
+ page: controlledPage,
17
+ defaultPage = 1,
18
+ pageCount,
19
+ siblingCount = 1,
20
+ boundaryCount = 1,
21
+ showFirstLast = false,
22
+ showPrevNext = true,
23
+ onPageChange
24
+ } = args;
25
+ const isControlled = controlledPage !== void 0;
26
+ const [uncontrolledPage, setUncontrolledPage] = useState(defaultPage);
27
+ const onChangeRef = useRef(onPageChange);
28
+ onChangeRef.current = onPageChange;
29
+ const safePageCount = Math.max(1, Math.floor(pageCount));
30
+ const rawPage = isControlled ? controlledPage : uncontrolledPage;
31
+ const currentPage = Math.min(Math.max(1, Math.floor(rawPage)), safePageCount);
32
+ const goToPage = useCallback(
33
+ (next2) => {
34
+ const clamped = Math.min(Math.max(1, Math.floor(next2)), Math.max(1, Math.floor(pageCount)));
35
+ if (!isControlled) {
36
+ setUncontrolledPage(clamped);
37
+ }
38
+ onChangeRef.current?.(clamped);
39
+ },
40
+ [isControlled, pageCount]
41
+ );
42
+ const prev = useCallback(() => goToPage(currentPage - 1), [goToPage, currentPage]);
43
+ const next = useCallback(() => goToPage(currentPage + 1), [goToPage, currentPage]);
44
+ const first = useCallback(() => goToPage(1), [goToPage]);
45
+ const last = useCallback(() => goToPage(safePageCount), [goToPage, safePageCount]);
46
+ const pages = useMemo(() => {
47
+ const items = [];
48
+ const safeSibling = Math.max(0, Math.floor(siblingCount));
49
+ const safeBoundary = Math.max(0, Math.floor(boundaryCount));
50
+ if (showFirstLast) {
51
+ items.push({ type: "first", disabled: currentPage <= 1 });
52
+ }
53
+ if (showPrevNext) {
54
+ items.push({ type: "prev", disabled: currentPage <= 1 });
55
+ }
56
+ const startPages = range(1, Math.min(safeBoundary, safePageCount));
57
+ const endPages = range(Math.max(safePageCount - safeBoundary + 1, safeBoundary + 1), safePageCount);
58
+ const siblingsStart = Math.max(
59
+ Math.min(currentPage - safeSibling, safePageCount - safeBoundary - safeSibling * 2 - 1),
60
+ safeBoundary + 2
61
+ );
62
+ const siblingsEnd = Math.min(
63
+ Math.max(currentPage + safeSibling, safeBoundary + safeSibling * 2 + 2),
64
+ endPages.length > 0 ? endPages[0] - 2 : safePageCount - 1
65
+ );
66
+ const middle = [];
67
+ if (siblingsStart > safeBoundary + 2) {
68
+ middle.push("ellipsis");
69
+ } else if (safeBoundary + 1 < safePageCount - safeBoundary) {
70
+ middle.push(safeBoundary + 1);
71
+ }
72
+ for (const p of range(siblingsStart, siblingsEnd)) {
73
+ middle.push(p);
74
+ }
75
+ if (siblingsEnd < safePageCount - safeBoundary - 1) {
76
+ middle.push("ellipsis");
77
+ } else if (safePageCount - safeBoundary > safeBoundary) {
78
+ middle.push(safePageCount - safeBoundary);
79
+ }
80
+ const seen = /* @__PURE__ */ new Set();
81
+ const pushPage = /* @__PURE__ */ __name((n) => {
82
+ if (n < 1 || n > safePageCount || seen.has(n)) {
83
+ return;
84
+ }
85
+ seen.add(n);
86
+ items.push({ type: "page", page: n, selected: n === currentPage });
87
+ }, "pushPage");
88
+ for (const n of startPages) {
89
+ pushPage(n);
90
+ }
91
+ for (const m of middle) {
92
+ if (m === "ellipsis") {
93
+ items.push({ type: "ellipsis" });
94
+ } else {
95
+ pushPage(m);
96
+ }
97
+ }
98
+ for (const n of endPages) {
99
+ pushPage(n);
100
+ }
101
+ if (showPrevNext) {
102
+ items.push({ type: "next", disabled: currentPage >= safePageCount });
103
+ }
104
+ if (showFirstLast) {
105
+ items.push({ type: "last", disabled: currentPage >= safePageCount });
106
+ }
107
+ return items;
108
+ }, [currentPage, safePageCount, siblingCount, boundaryCount, showFirstLast, showPrevNext]);
109
+ return {
110
+ page: currentPage,
111
+ pages,
112
+ canPrev: currentPage > 1,
113
+ canNext: currentPage < safePageCount,
114
+ goToPage,
115
+ prev,
116
+ next,
117
+ first,
118
+ last
119
+ };
120
+ }
121
+ __name(usePagination, "usePagination");
122
+
123
+ export { usePagination };
124
+ //# sourceMappingURL=chunk-73CUV7MW.js.map
125
+ //# sourceMappingURL=chunk-73CUV7MW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/Pagination/use-pagination.ts"],"names":["next"],"mappings":"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","file":"chunk-73CUV7MW.js","sourcesContent":["'use client';\n\nimport { useCallback, useMemo, useRef, useState } from 'react';\n\nexport type PaginationItemType = 'page' | 'prev' | 'next' | 'first' | 'last' | 'ellipsis';\n\n/**\n * One slot in the rendered pagination row, as produced by `usePagination`.\n * `page` is set on `'page'` items only; ellipsis carries no number.\n */\nexport type PaginationItemDescriptor = {\n type: PaginationItemType;\n page?: number;\n selected?: boolean;\n disabled?: boolean;\n};\n\nexport type UsePaginationArgs = {\n /** Controlled current page (1-indexed). Omit for uncontrolled. */\n page?: number;\n /** Initial page when uncontrolled (1-indexed). @defaultValue 1 */\n defaultPage?: number;\n /** Total number of pages. */\n pageCount: number;\n /** Pages on each side of the current page. @defaultValue 1 */\n siblingCount?: number;\n /** Pages always visible at start/end. @defaultValue 1 */\n boundaryCount?: number;\n /** Include first/last items in the `pages` list. @defaultValue false */\n showFirstLast?: boolean;\n /** Include prev/next items in the `pages` list. @defaultValue true */\n showPrevNext?: boolean;\n /** Fired on every page change. */\n onPageChange?: (page: number) => void;\n};\n\nexport type UsePaginationReturn = {\n /** Current page (1-indexed), clamped to [1, max(1, pageCount)]. */\n page: number;\n /** Item descriptors in render order. */\n pages: ReadonlyArray<PaginationItemDescriptor>;\n canPrev: boolean;\n canNext: boolean;\n goToPage: (page: number) => void;\n prev: () => void;\n next: () => void;\n first: () => void;\n last: () => void;\n};\n\nconst range = (from: number, to: number): number[] => {\n if (to < from) {\n return [];\n }\n const out = new Array<number>(to - from + 1);\n for (let i = 0; i < out.length; i += 1) {\n out[i] = from + i;\n }\n return out;\n};\n\n/**\n * Headless pagination math + state. Returns the items to render and the\n * actions that drive them — without a single DOM/RN element. Use this\n * directly for fully custom paginators, or let `<Pagination>` use it\n * internally.\n *\n * The math mirrors MUI's `usePagination` algorithm so its behavior is\n * predictable for anyone who has used the React ecosystem before.\n *\n * @example\n * const p = usePagination({ pageCount: 12, defaultPage: 3 });\n * p.pages.map((item) => …);\n */\nexport function usePagination(args: UsePaginationArgs): UsePaginationReturn {\n const {\n page: controlledPage,\n defaultPage = 1,\n pageCount,\n siblingCount = 1,\n boundaryCount = 1,\n showFirstLast = false,\n showPrevNext = true,\n onPageChange,\n } = args;\n\n const isControlled = controlledPage !== undefined;\n const [uncontrolledPage, setUncontrolledPage] = useState(defaultPage);\n\n // Latest-callback ref so `goToPage` can stay referentially stable.\n const onChangeRef = useRef(onPageChange);\n onChangeRef.current = onPageChange;\n\n const safePageCount = Math.max(1, Math.floor(pageCount));\n const rawPage = isControlled ? (controlledPage as number) : uncontrolledPage;\n const currentPage = Math.min(Math.max(1, Math.floor(rawPage)), safePageCount);\n\n const goToPage = useCallback(\n (next: number) => {\n const clamped = Math.min(Math.max(1, Math.floor(next)), Math.max(1, Math.floor(pageCount)));\n if (!isControlled) {\n setUncontrolledPage(clamped);\n }\n onChangeRef.current?.(clamped);\n },\n [isControlled, pageCount]\n );\n\n const prev = useCallback(() => goToPage(currentPage - 1), [goToPage, currentPage]);\n const next = useCallback(() => goToPage(currentPage + 1), [goToPage, currentPage]);\n const first = useCallback(() => goToPage(1), [goToPage]);\n const last = useCallback(() => goToPage(safePageCount), [goToPage, safePageCount]);\n\n const pages = useMemo<ReadonlyArray<PaginationItemDescriptor>>(() => {\n const items: PaginationItemDescriptor[] = [];\n const safeSibling = Math.max(0, Math.floor(siblingCount));\n const safeBoundary = Math.max(0, Math.floor(boundaryCount));\n\n // First / Prev\n if (showFirstLast) {\n items.push({ type: 'first', disabled: currentPage <= 1 });\n }\n if (showPrevNext) {\n items.push({ type: 'prev', disabled: currentPage <= 1 });\n }\n\n // Page numbers + ellipses\n const startPages = range(1, Math.min(safeBoundary, safePageCount));\n const endPages = range(Math.max(safePageCount - safeBoundary + 1, safeBoundary + 1), safePageCount);\n\n const siblingsStart = Math.max(\n Math.min(currentPage - safeSibling, safePageCount - safeBoundary - safeSibling * 2 - 1),\n safeBoundary + 2\n );\n const siblingsEnd = Math.min(\n Math.max(currentPage + safeSibling, safeBoundary + safeSibling * 2 + 2),\n endPages.length > 0 ? endPages[0]! - 2 : safePageCount - 1\n );\n\n const middle: Array<number | 'ellipsis'> = [];\n // Start ellipsis\n if (siblingsStart > safeBoundary + 2) {\n middle.push('ellipsis');\n } else if (safeBoundary + 1 < safePageCount - safeBoundary) {\n middle.push(safeBoundary + 1);\n }\n // Middle pages\n for (const p of range(siblingsStart, siblingsEnd)) {\n middle.push(p);\n }\n // End ellipsis\n if (siblingsEnd < safePageCount - safeBoundary - 1) {\n middle.push('ellipsis');\n } else if (safePageCount - safeBoundary > safeBoundary) {\n middle.push(safePageCount - safeBoundary);\n }\n\n const seen = new Set<number>();\n const pushPage = (n: number) => {\n if (n < 1 || n > safePageCount || seen.has(n)) {\n return;\n }\n seen.add(n);\n items.push({ type: 'page', page: n, selected: n === currentPage });\n };\n\n for (const n of startPages) {\n pushPage(n);\n }\n for (const m of middle) {\n if (m === 'ellipsis') {\n items.push({ type: 'ellipsis' });\n } else {\n pushPage(m);\n }\n }\n for (const n of endPages) {\n pushPage(n);\n }\n\n // Next / Last\n if (showPrevNext) {\n items.push({ type: 'next', disabled: currentPage >= safePageCount });\n }\n if (showFirstLast) {\n items.push({ type: 'last', disabled: currentPage >= safePageCount });\n }\n\n return items;\n }, [currentPage, safePageCount, siblingCount, boundaryCount, showFirstLast, showPrevNext]);\n\n return {\n page: currentPage,\n pages,\n canPrev: currentPage > 1,\n canNext: currentPage < safePageCount,\n goToPage,\n prev,\n next,\n first,\n last,\n };\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { wrapStringChildren } from './chunk-VCJF75T2.js';
1
+ import { wrapStringChildren } from './chunk-JQQ3FBN7.js';
2
2
  import { cn } from './chunk-CHXHRJNZ.js';
3
3
  import { __name } from './chunk-WCQVDF3K.js';
4
4
  import { View } from 'react-native';
@@ -76,5 +76,5 @@ var HStack = /* @__PURE__ */ __name(({ gap, align, justify, className, children,
76
76
  }, "HStack");
77
77
 
78
78
  export { HStack };
79
- //# sourceMappingURL=chunk-GRDVE3IR.js.map
80
- //# sourceMappingURL=chunk-GRDVE3IR.js.map
79
+ //# sourceMappingURL=chunk-BZLT6R62.js.map
80
+ //# sourceMappingURL=chunk-BZLT6R62.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/HStack/HStack.tsx"],"names":[],"mappings":";;;;;;AAiBA,IAAM,WAAA,GAA0C;AAAA,EAC5C,KAAA,EAAO,aAAA;AAAA,EACP,MAAA,EAAQ,cAAA;AAAA,EACR,GAAA,EAAK,WAAA;AAAA,EACL,OAAA,EAAS,eAAA;AAAA,EACT,QAAA,EAAU;AACd,CAAA;AAEA,IAAM,aAAA,GAA8C;AAAA,EAChD,KAAA,EAAO,eAAA;AAAA,EACP,MAAA,EAAQ,gBAAA;AAAA,EACR,GAAA,EAAK,aAAA;AAAA,EACL,OAAA,EAAS,iBAAA;AAAA,EACT,MAAA,EAAQ,gBAAA;AAAA,EACR,MAAA,EAAQ;AACZ,CAAA;AAEA,IAAM,WAAA,GAA2D;AAAA,EAC7D,KAAA,EAAO,YAAA;AAAA,EACP,MAAA,EAAQ,QAAA;AAAA,EACR,GAAA,EAAK,UAAA;AAAA,EACL,OAAA,EAAS,SAAA;AAAA,EACT,QAAA,EAAU;AACd,CAAA;AAEA,IAAM,aAAA,GAAmE;AAAA,EACrE,KAAA,EAAO,YAAA;AAAA,EACP,MAAA,EAAQ,QAAA;AAAA,EACR,GAAA,EAAK,UAAA;AAAA,EACL,OAAA,EAAS,eAAA;AAAA,EACT,MAAA,EAAQ,cAAA;AAAA,EACR,MAAA,EAAQ;AACZ,CAAA;AAOA,IAAM,MAAA,GAAmC;AAAA,EACrC,CAAA,EAAG,CAAA;AAAA,EACH,CAAA,EAAG,CAAA;AAAA,EACH,CAAA,EAAG,CAAA;AAAA,EACH,CAAA,EAAG,EAAA;AAAA,EACH,CAAA,EAAG,EAAA;AAAA,EACH,CAAA,EAAG,EAAA;AAAA,EACH,CAAA,EAAG,EAAA;AAAA,EACH,CAAA,EAAG,EAAA;AAAA,EACH,EAAA,EAAI,EAAA;AAAA,EACJ,EAAA,EAAI;AACR,CAAA;AAUO,IAAM,MAAA,mBAAS,MAAA,CAAA,CAAC,EAAE,GAAA,EAAK,KAAA,EAAO,OAAA,EAAS,SAAA,EAAW,QAAA,EAAU,KAAA,EAAO,GAAG,IAAA,EAAK,KAAmB;AACjG,EAAA,MAAM,MAAA,GAAoB,EAAE,aAAA,EAAe,KAAA,EAAM;AACjD,EAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,GAAA,KAAQ,CAAA,EAAG;AAChC,IAAA,MAAA,CAAO,GAAA,GAAM,OAAO,GAAG,CAAA;AAAA,EAC3B;AACA,EAAA,IAAI,UAAU,MAAA,EAAW;AACrB,IAAA,MAAA,CAAO,UAAA,GAAa,YAAY,KAAK,CAAA;AAAA,EACzC;AACA,EAAA,IAAI,YAAY,MAAA,EAAW;AACvB,IAAA,MAAA,CAAO,cAAA,GAAiB,cAAc,OAAO,CAAA;AAAA,EACjD;AACA,EAAA,MAAM,SAAS,KAAA,KAAU,MAAA,GAAY,MAAA,GAAU,CAAC,QAAQ,KAAK,CAAA;AAC7D,EAAA,uBACI,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACI,GAAG,IAAA;AAAA,MACJ,KAAA,EAAO,MAAA;AAAA,MACP,SAAA,EAAW,EAAA;AAAA,QACP,UAAA;AAAA,QACA,QAAQ,MAAA,IAAa,GAAA,KAAQ,CAAA,GAAI,CAAA,IAAA,EAAO,GAAG,CAAA,CAAA,GAAK,MAAA;AAAA,QAChD,KAAA,KAAU,MAAA,GAAY,WAAA,CAAY,KAAK,CAAA,GAAI,MAAA;AAAA,QAC3C,OAAA,KAAY,MAAA,GAAY,aAAA,CAAc,OAAO,CAAA,GAAI,MAAA;AAAA,QACjD;AAAA,OACJ;AAAA,MAEC,6BAAmB,QAAQ;AAAA;AAAA,GAChC;AAER,CAAA,EA3BsB,QAAA","file":"chunk-GRDVE3IR.js","sourcesContent":["import type { ViewProps, ViewStyle } from 'react-native';\nimport { View } from 'react-native';\nimport { cn } from '../../utils/cn';\nimport { wrapStringChildren } from '../../utils/wrap-string-children';\n\nexport type StackGap = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 8 | 10 | 12;\nexport type StackAlign = 'start' | 'center' | 'end' | 'stretch' | 'baseline';\nexport type StackJustify = 'start' | 'center' | 'end' | 'between' | 'around' | 'evenly';\n\nexport type HStackProps = ViewProps & {\n gap?: StackGap;\n align?: StackAlign;\n justify?: StackJustify;\n className?: string;\n testID?: string;\n};\n\nconst ALIGN_CLASS: Record<StackAlign, string> = {\n start: 'items-start',\n center: 'items-center',\n end: 'items-end',\n stretch: 'items-stretch',\n baseline: 'items-baseline',\n};\n\nconst JUSTIFY_CLASS: Record<StackJustify, string> = {\n start: 'justify-start',\n center: 'justify-center',\n end: 'justify-end',\n between: 'justify-between',\n around: 'justify-around',\n evenly: 'justify-evenly',\n};\n\nconst ALIGN_STYLE: Record<StackAlign, ViewStyle['alignItems']> = {\n start: 'flex-start',\n center: 'center',\n end: 'flex-end',\n stretch: 'stretch',\n baseline: 'baseline',\n};\n\nconst JUSTIFY_STYLE: Record<StackJustify, ViewStyle['justifyContent']> = {\n start: 'flex-start',\n center: 'center',\n end: 'flex-end',\n between: 'space-between',\n around: 'space-around',\n evenly: 'space-evenly',\n};\n\n// Tailwind spacing scale → RN px. Mirrors the `gap-{n}` class output but\n// drives RN's native `gap` style, which Yoga supports directly. Inline\n// `gap` is more reliable than NativeWind's className path on native —\n// css-interop sometimes fails to apply gap classes through the static\n// extraction pipeline, leaving stacks with zero spacing.\nconst GAP_PX: Record<StackGap, number> = {\n 0: 0,\n 1: 4,\n 2: 8,\n 3: 12,\n 4: 16,\n 5: 20,\n 6: 24,\n 8: 32,\n 10: 40,\n 12: 48,\n};\n\n/**\n * Horizontal flex layout primitive. RSC-safe.\n *\n * Layout (`flexDirection`, `gap`, `alignItems`, `justifyContent`) is set\n * via inline style — NativeWind's className path doesn't reliably apply\n * these on native. The matching Tailwind classes are still emitted so\n * web tooling and consumers extending the className keep working.\n */\nexport const HStack = ({ gap, align, justify, className, children, style, ...rest }: HStackProps) => {\n const inline: ViewStyle = { flexDirection: 'row' };\n if (gap !== undefined && gap !== 0) {\n inline.gap = GAP_PX[gap];\n }\n if (align !== undefined) {\n inline.alignItems = ALIGN_STYLE[align];\n }\n if (justify !== undefined) {\n inline.justifyContent = JUSTIFY_STYLE[justify];\n }\n const merged = style === undefined ? inline : ([inline, style] as ViewStyle[]);\n return (\n <View\n {...rest}\n style={merged}\n className={cn(\n 'flex-row',\n gap !== undefined && gap !== 0 ? `gap-${gap}` : undefined,\n align !== undefined ? ALIGN_CLASS[align] : undefined,\n justify !== undefined ? JUSTIFY_CLASS[justify] : undefined,\n className\n )}\n >\n {wrapStringChildren(children)}\n </View>\n );\n};\n"]}
1
+ {"version":3,"sources":["../src/components/HStack/HStack.tsx"],"names":[],"mappings":";;;;;;AAiBA,IAAM,WAAA,GAA0C;AAAA,EAC5C,KAAA,EAAO,aAAA;AAAA,EACP,MAAA,EAAQ,cAAA;AAAA,EACR,GAAA,EAAK,WAAA;AAAA,EACL,OAAA,EAAS,eAAA;AAAA,EACT,QAAA,EAAU;AACd,CAAA;AAEA,IAAM,aAAA,GAA8C;AAAA,EAChD,KAAA,EAAO,eAAA;AAAA,EACP,MAAA,EAAQ,gBAAA;AAAA,EACR,GAAA,EAAK,aAAA;AAAA,EACL,OAAA,EAAS,iBAAA;AAAA,EACT,MAAA,EAAQ,gBAAA;AAAA,EACR,MAAA,EAAQ;AACZ,CAAA;AAEA,IAAM,WAAA,GAA2D;AAAA,EAC7D,KAAA,EAAO,YAAA;AAAA,EACP,MAAA,EAAQ,QAAA;AAAA,EACR,GAAA,EAAK,UAAA;AAAA,EACL,OAAA,EAAS,SAAA;AAAA,EACT,QAAA,EAAU;AACd,CAAA;AAEA,IAAM,aAAA,GAAmE;AAAA,EACrE,KAAA,EAAO,YAAA;AAAA,EACP,MAAA,EAAQ,QAAA;AAAA,EACR,GAAA,EAAK,UAAA;AAAA,EACL,OAAA,EAAS,eAAA;AAAA,EACT,MAAA,EAAQ,cAAA;AAAA,EACR,MAAA,EAAQ;AACZ,CAAA;AAOA,IAAM,MAAA,GAAmC;AAAA,EACrC,CAAA,EAAG,CAAA;AAAA,EACH,CAAA,EAAG,CAAA;AAAA,EACH,CAAA,EAAG,CAAA;AAAA,EACH,CAAA,EAAG,EAAA;AAAA,EACH,CAAA,EAAG,EAAA;AAAA,EACH,CAAA,EAAG,EAAA;AAAA,EACH,CAAA,EAAG,EAAA;AAAA,EACH,CAAA,EAAG,EAAA;AAAA,EACH,EAAA,EAAI,EAAA;AAAA,EACJ,EAAA,EAAI;AACR,CAAA;AAUO,IAAM,MAAA,mBAAS,MAAA,CAAA,CAAC,EAAE,GAAA,EAAK,KAAA,EAAO,OAAA,EAAS,SAAA,EAAW,QAAA,EAAU,KAAA,EAAO,GAAG,IAAA,EAAK,KAAmB;AACjG,EAAA,MAAM,MAAA,GAAoB,EAAE,aAAA,EAAe,KAAA,EAAM;AACjD,EAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,GAAA,KAAQ,CAAA,EAAG;AAChC,IAAA,MAAA,CAAO,GAAA,GAAM,OAAO,GAAG,CAAA;AAAA,EAC3B;AACA,EAAA,IAAI,UAAU,MAAA,EAAW;AACrB,IAAA,MAAA,CAAO,UAAA,GAAa,YAAY,KAAK,CAAA;AAAA,EACzC;AACA,EAAA,IAAI,YAAY,MAAA,EAAW;AACvB,IAAA,MAAA,CAAO,cAAA,GAAiB,cAAc,OAAO,CAAA;AAAA,EACjD;AACA,EAAA,MAAM,SAAS,KAAA,KAAU,MAAA,GAAY,MAAA,GAAU,CAAC,QAAQ,KAAK,CAAA;AAC7D,EAAA,uBACI,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACI,GAAG,IAAA;AAAA,MACJ,KAAA,EAAO,MAAA;AAAA,MACP,SAAA,EAAW,EAAA;AAAA,QACP,UAAA;AAAA,QACA,QAAQ,MAAA,IAAa,GAAA,KAAQ,CAAA,GAAI,CAAA,IAAA,EAAO,GAAG,CAAA,CAAA,GAAK,MAAA;AAAA,QAChD,KAAA,KAAU,MAAA,GAAY,WAAA,CAAY,KAAK,CAAA,GAAI,MAAA;AAAA,QAC3C,OAAA,KAAY,MAAA,GAAY,aAAA,CAAc,OAAO,CAAA,GAAI,MAAA;AAAA,QACjD;AAAA,OACJ;AAAA,MAEC,6BAAmB,QAAQ;AAAA;AAAA,GAChC;AAER,CAAA,EA3BsB,QAAA","file":"chunk-BZLT6R62.js","sourcesContent":["import type { ViewProps, ViewStyle } from 'react-native';\nimport { View } from 'react-native';\nimport { cn } from '../../utils/cn';\nimport { wrapStringChildren } from '../../utils/wrap-string-children';\n\nexport type StackGap = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 8 | 10 | 12;\nexport type StackAlign = 'start' | 'center' | 'end' | 'stretch' | 'baseline';\nexport type StackJustify = 'start' | 'center' | 'end' | 'between' | 'around' | 'evenly';\n\nexport type HStackProps = ViewProps & {\n gap?: StackGap;\n align?: StackAlign;\n justify?: StackJustify;\n className?: string;\n testID?: string;\n};\n\nconst ALIGN_CLASS: Record<StackAlign, string> = {\n start: 'items-start',\n center: 'items-center',\n end: 'items-end',\n stretch: 'items-stretch',\n baseline: 'items-baseline',\n};\n\nconst JUSTIFY_CLASS: Record<StackJustify, string> = {\n start: 'justify-start',\n center: 'justify-center',\n end: 'justify-end',\n between: 'justify-between',\n around: 'justify-around',\n evenly: 'justify-evenly',\n};\n\nconst ALIGN_STYLE: Record<StackAlign, ViewStyle['alignItems']> = {\n start: 'flex-start',\n center: 'center',\n end: 'flex-end',\n stretch: 'stretch',\n baseline: 'baseline',\n};\n\nconst JUSTIFY_STYLE: Record<StackJustify, ViewStyle['justifyContent']> = {\n start: 'flex-start',\n center: 'center',\n end: 'flex-end',\n between: 'space-between',\n around: 'space-around',\n evenly: 'space-evenly',\n};\n\n// Tailwind spacing scale → RN px. Mirrors the `gap-{n}` class output but\n// drives RN's native `gap` style, which Yoga supports directly. Inline\n// `gap` is more reliable than NativeWind's className path on native —\n// css-interop sometimes fails to apply gap classes through the static\n// extraction pipeline, leaving stacks with zero spacing.\nconst GAP_PX: Record<StackGap, number> = {\n 0: 0,\n 1: 4,\n 2: 8,\n 3: 12,\n 4: 16,\n 5: 20,\n 6: 24,\n 8: 32,\n 10: 40,\n 12: 48,\n};\n\n/**\n * Horizontal flex layout primitive. RSC-safe.\n *\n * Layout (`flexDirection`, `gap`, `alignItems`, `justifyContent`) is set\n * via inline style — NativeWind's className path doesn't reliably apply\n * these on native. The matching Tailwind classes are still emitted so\n * web tooling and consumers extending the className keep working.\n */\nexport const HStack = ({ gap, align, justify, className, children, style, ...rest }: HStackProps) => {\n const inline: ViewStyle = { flexDirection: 'row' };\n if (gap !== undefined && gap !== 0) {\n inline.gap = GAP_PX[gap];\n }\n if (align !== undefined) {\n inline.alignItems = ALIGN_STYLE[align];\n }\n if (justify !== undefined) {\n inline.justifyContent = JUSTIFY_STYLE[justify];\n }\n const merged = style === undefined ? inline : ([inline, style] as ViewStyle[]);\n return (\n <View\n {...rest}\n style={merged}\n className={cn(\n 'flex-row',\n gap !== undefined && gap !== 0 ? `gap-${gap}` : undefined,\n align !== undefined ? ALIGN_CLASS[align] : undefined,\n justify !== undefined ? JUSTIFY_CLASS[justify] : undefined,\n className\n )}\n >\n {wrapStringChildren(children)}\n </View>\n );\n};\n"]}
@@ -1,8 +1,8 @@
1
1
  import { useAnimatedNumber } from './chunk-RB3YBWQ4.js';
2
2
  import { AnimatedView } from './chunk-RGJ3NBKE.js';
3
3
  import { defaultSemanticIcons } from './chunk-7Z4NMNX6.js';
4
- import { cn } from './chunk-CHXHRJNZ.js';
5
4
  import { px } from './chunk-5A2QOOVN.js';
5
+ import { cn } from './chunk-CHXHRJNZ.js';
6
6
  import { useThemeColors } from './chunk-R5JMDDCB.js';
7
7
  import { __name } from './chunk-WCQVDF3K.js';
8
8
  import { createContext, useId, useRef, useState, useCallback, useMemo, useEffect, useContext } from 'react';
@@ -446,5 +446,5 @@ var Accordion = Object.assign(AccordionRoot, {
446
446
  });
447
447
 
448
448
  export { Accordion };
449
- //# sourceMappingURL=chunk-Y4ZRSW35.js.map
450
- //# sourceMappingURL=chunk-Y4ZRSW35.js.map
449
+ //# sourceMappingURL=chunk-CCUXO2HN.js.map
450
+ //# sourceMappingURL=chunk-CCUXO2HN.js.map