@cdx-ui/components 0.2.3 → 0.2.5

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 (296) hide show
  1. package/AGENTS.md +24 -0
  2. package/README.md +2 -0
  3. package/coverage.svg +1 -1
  4. package/docs/components/accordion/content.md +538 -0
  5. package/docs/components/alert/content.md +203 -0
  6. package/docs/components/alert-dialog/content.md +319 -0
  7. package/docs/components/avatar/content.md +368 -0
  8. package/docs/components/avatar/design.md +202 -0
  9. package/docs/components/badge/content.md +225 -0
  10. package/docs/components/bottom-sheet/content.md +353 -0
  11. package/docs/components/bottom-sheet/design.md +249 -0
  12. package/docs/components/box/content.md +141 -0
  13. package/docs/components/breadcrumbs/content.md +169 -0
  14. package/docs/components/button/content.md +398 -0
  15. package/docs/components/button/design.md +258 -0
  16. package/docs/components/calendar/content.md +137 -0
  17. package/docs/components/card/content.md +283 -0
  18. package/docs/components/carousel/content.md +417 -0
  19. package/docs/components/checkbox/content.md +236 -0
  20. package/docs/components/checkbox/design.md +214 -0
  21. package/docs/components/chip/content.md +439 -0
  22. package/docs/components/chip/design.md +418 -0
  23. package/docs/components/color-area/content.md +84 -0
  24. package/docs/components/color-field/content.md +132 -0
  25. package/docs/components/color-picker/content.md +209 -0
  26. package/docs/components/color-slider/content.md +118 -0
  27. package/docs/components/color-swatch/content.md +62 -0
  28. package/docs/components/color-swatch-picker/content.md +124 -0
  29. package/docs/components/content.md +98 -0
  30. package/docs/components/currency-input/content.md +205 -0
  31. package/docs/components/data-grid/content.md +521 -0
  32. package/docs/components/date-field/content.md +147 -0
  33. package/docs/components/date-picker/content.md +360 -0
  34. package/docs/components/date-range-picker/content.md +301 -0
  35. package/docs/components/date-time-field/content.md +157 -0
  36. package/docs/components/date-time-list/content.md +105 -0
  37. package/docs/components/date-time-picker/content.md +272 -0
  38. package/docs/components/dialog/content.md +436 -0
  39. package/docs/components/dialog/design.md +192 -0
  40. package/docs/components/divider/content.md +112 -0
  41. package/docs/components/drawer/content.md +428 -0
  42. package/docs/components/field/content.md +277 -0
  43. package/docs/components/form/content.md +62 -0
  44. package/docs/components/full-screen-dialog/content.md +881 -0
  45. package/docs/components/heading/content.md +55 -0
  46. package/docs/components/icon/content.md +190 -0
  47. package/docs/components/icon-button/content.md +200 -0
  48. package/docs/components/icon-button/design.md +165 -0
  49. package/docs/components/image/content.md +104 -0
  50. package/docs/components/input/content.md +346 -0
  51. package/docs/components/input/design.md +389 -0
  52. package/docs/components/insurance-disclosure/content.md +103 -0
  53. package/docs/components/link/content.md +180 -0
  54. package/docs/components/link/design.md +160 -0
  55. package/docs/components/list-item/content.md +695 -0
  56. package/docs/components/menu/content.md +1254 -0
  57. package/docs/components/month-calendar/content.md +84 -0
  58. package/docs/components/month-picker/content.md +273 -0
  59. package/docs/components/otp-input/content.md +327 -0
  60. package/docs/components/progress-bar/content.md +87 -0
  61. package/docs/components/progress-circle/content.md +176 -0
  62. package/docs/components/progress-segmented/content.md +119 -0
  63. package/docs/components/quick-action-button/content.md +154 -0
  64. package/docs/components/quick-action-button/design.md +170 -0
  65. package/docs/components/radio/content.md +224 -0
  66. package/docs/components/range-calendar/content.md +123 -0
  67. package/docs/components/reorderable-list/content.md +311 -0
  68. package/docs/components/scoped-theme/content.md +47 -0
  69. package/docs/components/scroll-shadow/content.md +693 -0
  70. package/docs/components/select/content.md +473 -0
  71. package/docs/components/select/design.md +301 -0
  72. package/docs/components/skeleton/content.md +104 -0
  73. package/docs/components/slider/content.md +423 -0
  74. package/docs/components/stack/content.md +161 -0
  75. package/docs/components/switch/content.md +150 -0
  76. package/docs/components/switch/design.md +208 -0
  77. package/docs/components/table/content.md +548 -0
  78. package/docs/components/table-pagination/content.md +177 -0
  79. package/docs/components/tabs/content.md +297 -0
  80. package/docs/components/text/content.md +142 -0
  81. package/docs/components/textarea/content.md +222 -0
  82. package/docs/components/tile/content.md +702 -0
  83. package/docs/components/toast/content.md +456 -0
  84. package/docs/components/toggle-button/content.md +505 -0
  85. package/docs/components/tooltip/content.md +350 -0
  86. package/docs/components/virtualized-list/content.md +250 -0
  87. package/docs/foundations/content.md +9 -0
  88. package/docs/foundations/expressions/icons/content.md +19 -0
  89. package/docs/foundations/styles/tokens/all-tokens/content.md +192 -0
  90. package/docs/foundations/styles/tokens/what-are-tokens/content.md +33 -0
  91. package/docs/foundations/styles/tokens/what-are-tokens/design.md +33 -0
  92. package/docs/getting-started/content.md +4 -0
  93. package/docs/getting-started/designers/content.md +13 -0
  94. package/docs/getting-started/designers/design.md +13 -0
  95. package/docs/getting-started/developers/accessibility/content.md +31 -0
  96. package/docs/getting-started/developers/content.md +612 -0
  97. package/docs/getting-started/developers/styling/content.md +195 -0
  98. package/docs/llms.txt +195 -0
  99. package/docs/patterns/account-management/content.md +75 -0
  100. package/docs/patterns/authentication/content.md +50 -0
  101. package/docs/patterns/content.md +10 -0
  102. package/docs/patterns/dashboard/content.md +34 -0
  103. package/docs/patterns/empty-states/content.md +32 -0
  104. package/docs/patterns/forms/content.md +108 -0
  105. package/docs/patterns/onboarding/content.md +69 -0
  106. package/docs/patterns/payments/content.md +35 -0
  107. package/docs/patterns/settings/content.md +72 -0
  108. package/docs/resources/content.md +9 -0
  109. package/docs/resources/figma-libraries/content.md +42 -0
  110. package/docs/resources/release-notes/0.0.1-beta.118/content.md +27 -0
  111. package/docs/resources/release-notes/0.0.1-beta.122/content.md +21 -0
  112. package/docs/resources/release-notes/0.0.1-beta.124/content.md +16 -0
  113. package/docs/resources/release-notes/0.0.1-beta.126/content.md +10 -0
  114. package/docs/resources/release-notes/0.0.1-beta.127/content.md +14 -0
  115. package/docs/resources/release-notes/0.0.1-beta.128/content.md +9 -0
  116. package/docs/resources/release-notes/0.0.1-beta.129/content.md +18 -0
  117. package/docs/resources/release-notes/0.0.1-beta.130/content.md +18 -0
  118. package/docs/resources/release-notes/0.0.1-beta.133/content.md +7 -0
  119. package/docs/resources/release-notes/0.0.1-beta.134/content.md +17 -0
  120. package/docs/resources/release-notes/0.0.1-beta.136/content.md +7 -0
  121. package/docs/resources/release-notes/0.0.1-beta.137/content.md +10 -0
  122. package/docs/resources/release-notes/0.0.1-beta.138/content.md +7 -0
  123. package/docs/resources/release-notes/0.0.1-beta.139/content.md +13 -0
  124. package/docs/resources/release-notes/0.0.1-beta.140/content.md +26 -0
  125. package/docs/resources/release-notes/0.0.1-beta.141/content.md +63 -0
  126. package/docs/resources/release-notes/0.0.1-beta.142/content.md +7 -0
  127. package/docs/resources/release-notes/0.0.1-beta.143/content.md +12 -0
  128. package/docs/resources/release-notes/0.0.1-beta.144/content.md +7 -0
  129. package/docs/resources/release-notes/0.0.1-beta.145/content.md +7 -0
  130. package/docs/resources/release-notes/0.0.1-beta.147/content.md +10 -0
  131. package/docs/resources/release-notes/0.0.1-beta.149/content.md +10 -0
  132. package/docs/resources/release-notes/0.0.1-beta.150/content.md +13 -0
  133. package/docs/resources/release-notes/0.0.1-beta.152/content.md +7 -0
  134. package/docs/resources/release-notes/0.0.1-beta.154/content.md +15 -0
  135. package/docs/resources/release-notes/0.0.1-beta.156/content.md +7 -0
  136. package/docs/resources/release-notes/0.0.1-beta.158/content.md +9 -0
  137. package/docs/resources/release-notes/0.0.1-beta.159/content.md +11 -0
  138. package/docs/resources/release-notes/0.0.1-beta.160/content.md +7 -0
  139. package/docs/resources/release-notes/0.0.1-beta.161/content.md +7 -0
  140. package/docs/resources/release-notes/0.0.1-beta.163/content.md +7 -0
  141. package/docs/resources/release-notes/0.0.1-beta.164/content.md +9 -0
  142. package/docs/resources/release-notes/0.0.1-beta.166/content.md +17 -0
  143. package/docs/resources/release-notes/0.0.1-beta.167/content.md +7 -0
  144. package/docs/resources/release-notes/0.0.1-beta.168/content.md +7 -0
  145. package/docs/resources/release-notes/0.0.1-beta.169/content.md +7 -0
  146. package/docs/resources/release-notes/0.0.1-beta.171/content.md +16 -0
  147. package/docs/resources/release-notes/0.0.1-beta.172/content.md +24 -0
  148. package/docs/resources/release-notes/0.0.1-beta.173/content.md +15 -0
  149. package/docs/resources/release-notes/0.0.1-beta.174/content.md +7 -0
  150. package/docs/resources/release-notes/0.0.1-beta.176/content.md +32 -0
  151. package/docs/resources/release-notes/0.0.1-beta.179/content.md +11 -0
  152. package/docs/resources/release-notes/0.0.1-beta.182/content.md +13 -0
  153. package/docs/resources/release-notes/0.0.1-beta.185/content.md +7 -0
  154. package/docs/resources/release-notes/0.0.1-beta.187/content.md +27 -0
  155. package/docs/resources/release-notes/0.1.1/content.md +23 -0
  156. package/docs/resources/release-notes/0.1.2/content.md +7 -0
  157. package/docs/resources/release-notes/0.1.4/content.md +19 -0
  158. package/docs/resources/release-notes/0.1.5/content.md +7 -0
  159. package/docs/resources/release-notes/0.1.6/content.md +7 -0
  160. package/docs/resources/release-notes/0.2.0/content.md +31 -0
  161. package/docs/resources/release-notes/0.2.1/content.md +17 -0
  162. package/docs/resources/release-notes/0.2.2/content.md +11 -0
  163. package/docs/resources/release-notes/0.2.3/content.md +15 -0
  164. package/docs/resources/release-notes/0.2.4/content.md +17 -0
  165. package/docs/resources/release-notes/content.md +65 -0
  166. package/lib/commonjs/components/Box/Box.js +9 -1
  167. package/lib/commonjs/components/Box/Box.js.map +1 -1
  168. package/lib/commonjs/components/Breadcrumbs/index.js +28 -3
  169. package/lib/commonjs/components/Breadcrumbs/index.js.map +1 -1
  170. package/lib/commonjs/components/Breadcrumbs/styles.js +27 -0
  171. package/lib/commonjs/components/Breadcrumbs/styles.js.map +1 -1
  172. package/lib/commonjs/components/DateTimeList/index.js +11 -26
  173. package/lib/commonjs/components/DateTimeList/index.js.map +1 -1
  174. package/lib/commonjs/components/DateTimeList/styles.js +2 -12
  175. package/lib/commonjs/components/DateTimeList/styles.js.map +1 -1
  176. package/lib/commonjs/components/ListItem/index.js.map +1 -1
  177. package/lib/commonjs/components/ListItem/styles.js +2 -1
  178. package/lib/commonjs/components/ListItem/styles.js.map +1 -1
  179. package/lib/commonjs/components/Menu/index.js +11 -5
  180. package/lib/commonjs/components/Menu/index.js.map +1 -1
  181. package/lib/commonjs/components/ScrollShadow/gradient.js +29 -0
  182. package/lib/commonjs/components/ScrollShadow/gradient.js.map +1 -0
  183. package/lib/commonjs/components/ScrollShadow/index.js +171 -44
  184. package/lib/commonjs/components/ScrollShadow/index.js.map +1 -1
  185. package/lib/commonjs/components/ScrollShadow/styles.js +58 -14
  186. package/lib/commonjs/components/ScrollShadow/styles.js.map +1 -1
  187. package/lib/commonjs/components/ScrollShadow/useComposedScrollHandler.js +63 -0
  188. package/lib/commonjs/components/ScrollShadow/useComposedScrollHandler.js.map +1 -0
  189. package/lib/commonjs/components/ScrollShadow/useScrollShadow.js +48 -8
  190. package/lib/commonjs/components/ScrollShadow/useScrollShadow.js.map +1 -1
  191. package/lib/commonjs/components/Stack/HStack.js +6 -2
  192. package/lib/commonjs/components/Stack/HStack.js.map +1 -1
  193. package/lib/commonjs/components/Stack/VStack.js +6 -2
  194. package/lib/commonjs/components/Stack/VStack.js.map +1 -1
  195. package/lib/commonjs/components/Tabs/index.js +16 -23
  196. package/lib/commonjs/components/Tabs/index.js.map +1 -1
  197. package/lib/commonjs/components/Tabs/styles.js +1 -10
  198. package/lib/commonjs/components/Tabs/styles.js.map +1 -1
  199. package/lib/commonjs/figma/ListItem.SectionHeader.figma.js +20 -5
  200. package/lib/commonjs/figma/ListItem.SectionHeader.figma.js.map +1 -1
  201. package/lib/commonjs/index.js +10 -10
  202. package/lib/commonjs/index.js.map +1 -1
  203. package/lib/module/components/Box/Box.js +9 -1
  204. package/lib/module/components/Box/Box.js.map +1 -1
  205. package/lib/module/components/Breadcrumbs/index.js +29 -4
  206. package/lib/module/components/Breadcrumbs/index.js.map +1 -1
  207. package/lib/module/components/Breadcrumbs/styles.js +26 -0
  208. package/lib/module/components/Breadcrumbs/styles.js.map +1 -1
  209. package/lib/module/components/DateTimeList/index.js +12 -27
  210. package/lib/module/components/DateTimeList/index.js.map +1 -1
  211. package/lib/module/components/DateTimeList/styles.js +1 -11
  212. package/lib/module/components/DateTimeList/styles.js.map +1 -1
  213. package/lib/module/components/ListItem/index.js.map +1 -1
  214. package/lib/module/components/ListItem/styles.js +2 -1
  215. package/lib/module/components/ListItem/styles.js.map +1 -1
  216. package/lib/module/components/Menu/index.js +11 -5
  217. package/lib/module/components/Menu/index.js.map +1 -1
  218. package/lib/module/components/ScrollShadow/gradient.js +24 -0
  219. package/lib/module/components/ScrollShadow/gradient.js.map +1 -0
  220. package/lib/module/components/ScrollShadow/index.js +170 -48
  221. package/lib/module/components/ScrollShadow/index.js.map +1 -1
  222. package/lib/module/components/ScrollShadow/styles.js +57 -13
  223. package/lib/module/components/ScrollShadow/styles.js.map +1 -1
  224. package/lib/module/components/ScrollShadow/useComposedScrollHandler.js +57 -0
  225. package/lib/module/components/ScrollShadow/useComposedScrollHandler.js.map +1 -0
  226. package/lib/module/components/ScrollShadow/useScrollShadow.js +46 -8
  227. package/lib/module/components/ScrollShadow/useScrollShadow.js.map +1 -1
  228. package/lib/module/components/Stack/HStack.js +6 -2
  229. package/lib/module/components/Stack/HStack.js.map +1 -1
  230. package/lib/module/components/Stack/VStack.js +6 -2
  231. package/lib/module/components/Stack/VStack.js.map +1 -1
  232. package/lib/module/components/Tabs/index.js +17 -24
  233. package/lib/module/components/Tabs/index.js.map +1 -1
  234. package/lib/module/components/Tabs/styles.js +0 -9
  235. package/lib/module/components/Tabs/styles.js.map +1 -1
  236. package/lib/module/figma/ListItem.SectionHeader.figma.js +20 -5
  237. package/lib/module/figma/ListItem.SectionHeader.figma.js.map +1 -1
  238. package/lib/module/index.js +6 -1
  239. package/lib/module/index.js.map +1 -1
  240. package/lib/typescript/animation/hooks/usePopupDialogContentAnimation.d.ts +2 -2
  241. package/lib/typescript/animation/hooks/usePopupOverlayAnimation.d.ts +2 -2
  242. package/lib/typescript/components/Box/Box.d.ts +4 -0
  243. package/lib/typescript/components/Box/Box.d.ts.map +1 -1
  244. package/lib/typescript/components/Breadcrumbs/index.d.ts +3 -1
  245. package/lib/typescript/components/Breadcrumbs/index.d.ts.map +1 -1
  246. package/lib/typescript/components/Breadcrumbs/styles.d.ts +2 -0
  247. package/lib/typescript/components/Breadcrumbs/styles.d.ts.map +1 -1
  248. package/lib/typescript/components/DateTimeList/index.d.ts.map +1 -1
  249. package/lib/typescript/components/DateTimeList/styles.d.ts +1 -4
  250. package/lib/typescript/components/DateTimeList/styles.d.ts.map +1 -1
  251. package/lib/typescript/components/ListItem/index.d.ts +5 -4
  252. package/lib/typescript/components/ListItem/index.d.ts.map +1 -1
  253. package/lib/typescript/components/ListItem/styles.d.ts +1 -1
  254. package/lib/typescript/components/ListItem/styles.d.ts.map +1 -1
  255. package/lib/typescript/components/Menu/index.d.ts.map +1 -1
  256. package/lib/typescript/components/ScrollShadow/gradient.d.ts +7 -0
  257. package/lib/typescript/components/ScrollShadow/gradient.d.ts.map +1 -0
  258. package/lib/typescript/components/ScrollShadow/index.d.ts +57 -15
  259. package/lib/typescript/components/ScrollShadow/index.d.ts.map +1 -1
  260. package/lib/typescript/components/ScrollShadow/styles.d.ts +8 -2
  261. package/lib/typescript/components/ScrollShadow/styles.d.ts.map +1 -1
  262. package/lib/typescript/components/ScrollShadow/useComposedScrollHandler.d.ts +13 -0
  263. package/lib/typescript/components/ScrollShadow/useComposedScrollHandler.d.ts.map +1 -0
  264. package/lib/typescript/components/ScrollShadow/useScrollShadow.d.ts +15 -2
  265. package/lib/typescript/components/ScrollShadow/useScrollShadow.d.ts.map +1 -1
  266. package/lib/typescript/components/Stack/HStack.d.ts +3 -2
  267. package/lib/typescript/components/Stack/HStack.d.ts.map +1 -1
  268. package/lib/typescript/components/Stack/VStack.d.ts +3 -2
  269. package/lib/typescript/components/Stack/VStack.d.ts.map +1 -1
  270. package/lib/typescript/components/Tabs/index.d.ts.map +1 -1
  271. package/lib/typescript/components/Tabs/styles.d.ts +0 -7
  272. package/lib/typescript/components/Tabs/styles.d.ts.map +1 -1
  273. package/lib/typescript/components/Toast/animation.d.ts +3 -3
  274. package/lib/typescript/components/Toast/animation.d.ts.map +1 -1
  275. package/lib/typescript/figma/ListItem.SectionHeader.figma.d.ts.map +1 -1
  276. package/lib/typescript/index.d.ts +6 -1
  277. package/lib/typescript/index.d.ts.map +1 -1
  278. package/package.json +11 -9
  279. package/src/components/Box/Box.tsx +18 -4
  280. package/src/components/Breadcrumbs/index.tsx +28 -4
  281. package/src/components/Breadcrumbs/styles.ts +30 -0
  282. package/src/components/DateTimeList/index.tsx +13 -26
  283. package/src/components/DateTimeList/styles.ts +1 -10
  284. package/src/components/ListItem/index.tsx +5 -4
  285. package/src/components/ListItem/styles.ts +1 -0
  286. package/src/components/Menu/index.tsx +11 -8
  287. package/src/components/ScrollShadow/gradient.ts +48 -0
  288. package/src/components/ScrollShadow/index.tsx +300 -69
  289. package/src/components/ScrollShadow/styles.ts +45 -28
  290. package/src/components/ScrollShadow/useComposedScrollHandler.ts +58 -0
  291. package/src/components/ScrollShadow/useScrollShadow.ts +72 -10
  292. package/src/components/Stack/HStack.tsx +8 -4
  293. package/src/components/Stack/VStack.tsx +8 -4
  294. package/src/components/Tabs/index.tsx +25 -35
  295. package/src/components/Tabs/styles.ts +0 -9
  296. package/src/index.ts +8 -1
@@ -1,29 +1,71 @@
1
- import { type ReactNode } from 'react';
2
- import { type ViewStyle } from 'react-native';
3
- import { type ScrollShadowVariantProps } from './styles';
1
+ import { type ReactElement } from 'react';
2
+ import { type StyleProp, type ViewStyle } from 'react-native';
3
+ import { type ScrollShadowSize, type ScrollShadowSurface, type ScrollShadowVariantProps } from './styles';
4
4
  import { type ScrollShadowCapability } from './useScrollShadow';
5
- export type { ScrollShadowCapability };
5
+ export type { ScrollShadowCapability, UseScrollShadowOptions, UseScrollShadowReturn, } from './useScrollShadow';
6
+ export { useScrollShadow } from './useScrollShadow';
7
+ export type ScrollShadowVisibility = 'auto' | 'both' | 'start' | 'end' | 'none';
6
8
  export interface ScrollShadowProps extends ScrollShadowVariantProps {
7
- children: ReactNode;
9
+ /**
10
+ * The scroll view to decorate: a `ScrollView`, `FlatList`, or `VirtualizedList`, passed as
11
+ * the direct child. With a forced `visibility`, any single view works.
12
+ */
13
+ children: ReactElement;
14
+ /** Classes for the wrapping view, for example `h-full` or `flex-1` to bound the scroller. */
8
15
  className?: string;
16
+ /** Style for the wrapping view. */
17
+ style?: StyleProp<ViewStyle>;
18
+ /**
19
+ * Scroll axis that gets fades.
20
+ * @default inferred from the child's `horizontal` prop, otherwise `'vertical'`
21
+ */
22
+ orientation?: 'horizontal' | 'vertical';
9
23
  /**
10
- * Tailwind `from-*` utility for edge overlays — match the surface behind the scroll area.
11
- * Pair with a low opacity (e.g. `from-surface-secondary/40`) for a light fade.
12
- * @default 'from-background/35'
24
+ * Theme surface the fade blends into. Match it to the background behind the scroller.
25
+ * @default 'background'
13
26
  */
14
- fadeFromClassName?: string;
27
+ surface?: ScrollShadowSurface;
15
28
  /**
16
- * Shadow fade size in pixels.
17
- * @default 64
29
+ * Fade depth along the scroll axis: `small` is 32px, `default` is 40px, `large` is 72px.
30
+ * @default 'default'
18
31
  */
19
- size?: number;
32
+ size?: ScrollShadowSize;
20
33
  /**
21
- * Scroll offset before showing edge shadows.
34
+ * Which edges show a fade. `auto` follows the scroll position; `both`, `start`, and `end`
35
+ * force those edges on; `none` hides them.
36
+ * @default 'auto'
37
+ */
38
+ visibility?: ScrollShadowVisibility;
39
+ /**
40
+ * Pixels of scroll slack before an edge counts as scrollable. Only used with `auto`.
22
41
  * @default 0
23
42
  */
24
43
  offset?: number;
44
+ /**
45
+ * Hides the child's scrollbar on web. On iOS and Android, set
46
+ * `showsVerticalScrollIndicator` or `showsHorizontalScrollIndicator` on the child instead.
47
+ * @default false
48
+ */
49
+ hideScrollBar?: boolean;
50
+ /**
51
+ * Width, opacity, or position overrides for the fade overlays, applied after `size`, for
52
+ * example `w-24` or `opacity-85`. Must not carry color classes; use `surface` or
53
+ * `colorClassName` instead.
54
+ */
55
+ edgeClassName?: string;
56
+ /**
57
+ * One-off fade color outside the `surface` options, as an `accent-*` class. Overrides
58
+ * `surface` on every platform and follows dark mode and `ScopedTheme`.
59
+ */
60
+ colorClassName?: string;
61
+ /**
62
+ * Called when either edge starts or stops being scrollable, with
63
+ * `{ canScrollBefore, canScrollAfter }`. Only fires with `visibility="auto"`.
64
+ */
25
65
  onCapabilityChange?: (capability: ScrollShadowCapability) => void;
26
- style?: ViewStyle;
27
66
  }
28
- export declare function ScrollShadow({ children, className, fadeFromClassName, hideScrollBar, orientation, offset, onCapabilityChange, size, style, }: ScrollShadowProps): import("react/jsx-runtime").JSX.Element;
67
+ export declare function ScrollShadow({ children, className, style, surface, size, visibility, hideScrollBar, orientation, offset, edgeClassName, colorClassName, onCapabilityChange, }: ScrollShadowProps): import("react/jsx-runtime").JSX.Element;
68
+ export declare namespace ScrollShadow {
69
+ var displayName: string;
70
+ }
29
71
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/ScrollShadow/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA0C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC/E,OAAO,EAAoB,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAEhE,OAAO,EAIL,KAAK,wBAAwB,EAC9B,MAAM,UAAU,CAAC;AAClB,OAAO,EAAmB,KAAK,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAEjF,YAAY,EAAE,sBAAsB,EAAE,CAAC;AAEvC,MAAM,WAAW,iBAAkB,SAAQ,wBAAwB;IACjE,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE,sBAAsB,KAAK,IAAI,CAAC;IAClE,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAWD,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,SAAS,EACT,iBAAwC,EACxC,aAAqB,EACrB,WAA0B,EAC1B,MAAU,EACV,kBAAkB,EAClB,IAAS,EACT,KAAK,GACN,EAAE,iBAAiB,2CA+DnB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/ScrollShadow/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,YAAY,EAClB,MAAM,OAAO,CAAC;AACf,OAAO,EAAwC,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAKpG,OAAO,EAML,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC9B,MAAM,UAAU,CAAC;AAMlB,OAAO,EAEL,KAAK,sBAAsB,EAG5B,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EACV,sBAAsB,EACtB,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;AAEhF,MAAM,WAAW,iBAAkB,SAAQ,wBAAwB;IACjE;;;OAGG;IACH,QAAQ,EAAE,YAAY,CAAC;IACvB,6FAA6F;IAC7F,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mCAAmC;IACnC,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B;;;OAGG;IACH,WAAW,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC;IACxC;;;OAGG;IACH,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B;;;OAGG;IACH,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB;;;;OAIG;IACH,UAAU,CAAC,EAAE,sBAAsB,CAAC;IACpC;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE,sBAAsB,KAAK,IAAI,CAAC;CACnE;AAwID,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,SAAS,EACT,KAAK,EACL,OAAsB,EACtB,IAAgB,EAChB,UAAmB,EACnB,aAAqB,EACrB,WAAW,EACX,MAAU,EACV,aAAa,EACb,cAAc,EACd,kBAAkB,GACnB,EAAE,iBAAiB,2CAgGnB;yBA7Ge,YAAY"}
@@ -1,12 +1,18 @@
1
1
  import { type VariantProps } from '@cdx-ui/utils';
2
+ export type ScrollShadowSurface = 'background' | 'primary' | 'secondary';
3
+ export type ScrollShadowSize = 'small' | 'default' | 'large';
4
+ export declare const SCROLL_SHADOW_SURFACE_CSS_VARS: Record<ScrollShadowSurface, string>;
5
+ export declare const SCROLL_SHADOW_SIZE_PX: Record<ScrollShadowSize, number>;
6
+ export declare const SCROLL_SHADOW_SURFACE_FROM_CLASS: Record<ScrollShadowSurface, string>;
2
7
  export declare const scrollShadowVariants: (props?: ({
3
- orientation?: "vertical" | "horizontal" | null | undefined;
4
8
  hideScrollBar?: boolean | null | undefined;
5
9
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
6
10
  export declare const scrollShadowContainerVariants: (props?: import("class-variance-authority/types").ClassProp | undefined) => string;
7
- export declare const scrollShadowOverlayVariants: (props?: ({
11
+ export declare const scrollShadowEdgeVariants: (props?: ({
8
12
  orientation?: "vertical" | "horizontal" | null | undefined;
9
13
  edge?: "end" | "start" | null | undefined;
14
+ size?: "small" | "default" | "large" | null | undefined;
10
15
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
11
16
  export type ScrollShadowVariantProps = VariantProps<typeof scrollShadowVariants>;
17
+ export type ScrollShadowEdgeVariantProps = VariantProps<typeof scrollShadowEdgeVariants>;
12
18
  //# sourceMappingURL=styles.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../../src/components/ScrollShadow/styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAEvD,eAAO,MAAM,oBAAoB;;;8EAe/B,CAAC;AAEH,eAAO,MAAM,6BAA6B,oFAAiC,CAAC;AAE5E,eAAO,MAAM,2BAA2B;;;8EAiCtC,CAAC;AAEH,MAAM,MAAM,wBAAwB,GAAG,YAAY,CAAC,OAAO,oBAAoB,CAAC,CAAC"}
1
+ {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../../src/components/ScrollShadow/styles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAEvD,MAAM,MAAM,mBAAmB,GAAG,YAAY,GAAG,SAAS,GAAG,WAAW,CAAC;AACzE,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC;AAE7D,eAAO,MAAM,8BAA8B,EAAE,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAI9E,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAIlE,CAAC;AAEF,eAAO,MAAM,gCAAgC,EAAE,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAIhF,CAAC;AAEF,eAAO,MAAM,oBAAoB;;8EAU/B,CAAC;AAEH,eAAO,MAAM,6BAA6B,oFAAiC,CAAC;AAE5E,eAAO,MAAM,wBAAwB;;;;8EAiCnC,CAAC;AAEH,MAAM,MAAM,wBAAwB,GAAG,YAAY,CAAC,OAAO,oBAAoB,CAAC,CAAC;AACjF,MAAM,MAAM,4BAA4B,GAAG,YAAY,CAAC,OAAO,wBAAwB,CAAC,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { NativeScrollEvent, NativeSyntheticEvent } from 'react-native';
2
+ type ScrollHandler = (event: NativeSyntheticEvent<NativeScrollEvent>) => void;
3
+ export declare function isReanimatedScrollHandler(handler: unknown): boolean;
4
+ export declare function composeScrollHandler(internalHandler: ScrollHandler, externalHandler: unknown): ScrollHandler;
5
+ /**
6
+ * Only call this when the child already passed a Reanimated scroll handler.
7
+ * `useAnimatedScrollHandler` requires a Babel worklet, and the published
8
+ * package is not transformed by that plugin, so the plain ScrollView path
9
+ * must not mount this hook.
10
+ */
11
+ export declare function useReanimatedComposedScrollHandler(internalHandler: ScrollHandler, externalHandler: unknown): unknown;
12
+ export {};
13
+ //# sourceMappingURL=useComposedScrollHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useComposedScrollHandler.d.ts","sourceRoot":"","sources":["../../../../src/components/ScrollShadow/useComposedScrollHandler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAK5E,KAAK,aAAa,GAAG,CAAC,KAAK,EAAE,oBAAoB,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;AAE9E,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAEnE;AAED,wBAAgB,oBAAoB,CAClC,eAAe,EAAE,aAAa,EAC9B,eAAe,EAAE,OAAO,GACvB,aAAa,CAMf;AAED;;;;;GAKG;AACH,wBAAgB,kCAAkC,CAChD,eAAe,EAAE,aAAa,EAC9B,eAAe,EAAE,OAAO,GACvB,OAAO,CAyBT"}
@@ -1,3 +1,4 @@
1
+ import { Platform } from 'react-native';
1
2
  import type { LayoutChangeEvent, NativeScrollEvent, NativeSyntheticEvent } from 'react-native';
2
3
  export interface ScrollShadowCapability {
3
4
  canScrollBefore: boolean;
@@ -6,12 +7,24 @@ export interface ScrollShadowCapability {
6
7
  export interface UseScrollShadowOptions {
7
8
  orientation?: 'horizontal' | 'vertical';
8
9
  offset?: number;
10
+ enabled?: boolean;
9
11
  onCapabilityChange?: (capability: ScrollShadowCapability) => void;
10
12
  }
11
- export declare function useScrollShadow({ orientation, offset, onCapabilityChange, }?: UseScrollShadowOptions): {
13
+ export interface UseScrollShadowReturn {
12
14
  capability: ScrollShadowCapability;
13
15
  handleLayout: (event: LayoutChangeEvent) => void;
14
16
  handleContentSizeChange: (width: number, height: number) => void;
15
17
  handleScroll: (event: NativeSyntheticEvent<NativeScrollEvent>) => void;
16
- };
18
+ }
19
+ export interface ScrollShadowDistance {
20
+ before: number;
21
+ after: number;
22
+ }
23
+ interface ScrollShadowTrackerOptions extends UseScrollShadowOptions {
24
+ onDistanceChange?: (distance: ScrollShadowDistance) => void;
25
+ }
26
+ export declare function normalizeAxisScrollOffset(rawOffset: number, orientation: 'horizontal' | 'vertical', maxOffset: number, platform?: typeof Platform.OS): number;
27
+ export declare function useScrollShadow(options?: UseScrollShadowOptions): UseScrollShadowReturn;
28
+ export declare function useScrollShadowTracker({ orientation, offset, enabled, onCapabilityChange, onDistanceChange, }?: ScrollShadowTrackerOptions): UseScrollShadowReturn;
29
+ export {};
17
30
  //# sourceMappingURL=useScrollShadow.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useScrollShadow.d.ts","sourceRoot":"","sources":["../../../../src/components/ScrollShadow/useScrollShadow.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAE/F,MAAM,WAAW,sBAAsB;IACrC,eAAe,EAAE,OAAO,CAAC;IACzB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,sBAAsB;IACrC,WAAW,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE,sBAAsB,KAAK,IAAI,CAAC;CACnE;AA2BD,wBAAgB,eAAe,CAAC,EAC9B,WAA0B,EAC1B,MAAU,EACV,kBAAkB,GACnB,GAAE,sBAA2B;;0BA4BlB,iBAAiB;qCASjB,MAAM,UAAU,MAAM;0BAQtB,oBAAoB,CAAC,iBAAiB,CAAC;EAqBlD"}
1
+ {"version":3,"file":"useScrollShadow.d.ts","sourceRoot":"","sources":["../../../../src/components/ScrollShadow/useScrollShadow.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAE/F,MAAM,WAAW,sBAAsB;IACrC,eAAe,EAAE,OAAO,CAAC;IACzB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,sBAAsB;IACrC,WAAW,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE,sBAAsB,KAAK,IAAI,CAAC;CACnE;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,sBAAsB,CAAC;IACnC,YAAY,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACjD,uBAAuB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACjE,YAAY,EAAE,CAAC,KAAK,EAAE,oBAAoB,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;CACxE;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,0BAA2B,SAAQ,sBAAsB;IACjE,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,oBAAoB,KAAK,IAAI,CAAC;CAC7D;AAcD,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,YAAY,GAAG,UAAU,EACtC,SAAS,EAAE,MAAM,EACjB,QAAQ,GAAE,OAAO,QAAQ,CAAC,EAAgB,GACzC,MAAM,CAOR;AA4BD,wBAAgB,eAAe,CAAC,OAAO,GAAE,sBAA2B,GAAG,qBAAqB,CAE3F;AAED,wBAAgB,sBAAsB,CAAC,EACrC,WAAwB,EACxB,MAAU,EACV,OAAc,EACd,kBAAkB,EAClB,gBAAgB,GACjB,GAAE,0BAA+B,GAAG,qBAAqB,CA6EzD"}
@@ -1,6 +1,7 @@
1
- import { View, type ViewProps } from 'react-native';
1
+ import type { View } from 'react-native';
2
+ import { type BoxProps } from '../Box';
2
3
  import { type StackSpace } from './styles';
3
- export interface HStackProps extends ViewProps {
4
+ export interface HStackProps extends Omit<BoxProps, 'asChild'> {
4
5
  className?: string;
5
6
  /** Token-based gap between children. */
6
7
  space?: StackSpace;
@@ -1 +1 @@
1
- {"version":3,"file":"HStack.d.ts","sourceRoot":"","sources":["../../../../src/components/Stack/HStack.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAEpD,OAAO,EAAsB,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAE/D,MAAM,WAAW,WAAY,SAAQ,SAAS;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wCAAwC;IACxC,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,eAAO,MAAM,MAAM,8FAgBlB,CAAC"}
1
+ {"version":3,"file":"HStack.d.ts","sourceRoot":"","sources":["../../../../src/components/Stack/HStack.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAGzC,OAAO,EAAO,KAAK,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAC5C,OAAO,EAAsB,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAE/D,MAAM,WAAW,WAAY,SAAQ,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wCAAwC;IACxC,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,eAAO,MAAM,MAAM,8FAkBlB,CAAC"}
@@ -1,6 +1,7 @@
1
- import { View, type ViewProps } from 'react-native';
1
+ import type { View } from 'react-native';
2
+ import { type BoxProps } from '../Box';
2
3
  import { type StackSpace } from './styles';
3
- export interface VStackProps extends ViewProps {
4
+ export interface VStackProps extends Omit<BoxProps, 'asChild'> {
4
5
  className?: string;
5
6
  /** Token-based gap between children. */
6
7
  space?: StackSpace;
@@ -1 +1 @@
1
- {"version":3,"file":"VStack.d.ts","sourceRoot":"","sources":["../../../../src/components/Stack/VStack.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAEpD,OAAO,EAAsB,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAE/D,MAAM,WAAW,WAAY,SAAQ,SAAS;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wCAAwC;IACxC,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,eAAO,MAAM,MAAM,8FAgBlB,CAAC"}
1
+ {"version":3,"file":"VStack.d.ts","sourceRoot":"","sources":["../../../../src/components/Stack/VStack.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAGzC,OAAO,EAAO,KAAK,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAC5C,OAAO,EAAsB,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAE/D,MAAM,WAAW,WAAY,SAAQ,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wCAAwC;IACxC,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,eAAO,MAAM,MAAM,8FAkBlB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/Tabs/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EASL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,EAKL,IAAI,EACJ,IAAI,EAEJ,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;AAGtB,OAAO,EAUL,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,UAAU,EAChB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EAqBL,KAAK,WAAW,EACjB,MAAM,UAAU,CAAC;AAElB,YAAY,EAAE,WAAW,EAAE,CAAC;AAqD5B,MAAM,WAAW,SAAU,SAAQ,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,UAAU;IACxE,iKAAiK;IACjK,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,QAAA,MAAM,QAAQ,4FAkBb,CAAC;AAQF,MAAM,WAAW,aAAc,SAAQ,cAAc;IACnD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,8BAA8B,CAAC,EAAE,OAAO,CAAC;CAC1C;AAED,QAAA,MAAM,QAAQ,gGA2Yb,CAAC;AAQF,MAAM,WAAW,YAAa,SAAQ,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC;IAC/D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,QAAA,MAAM,OAAO,+FAyCZ,CAAC;AAQF,MAAM,WAAW,iBAAkB,SAAQ,SAAS;IAClD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,QAAA,MAAM,YAAY,oGAoBjB,CAAC;AAQF,MAAM,WAAW,cAAe,SAAQ,cAAc;IACpD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,QAAA,MAAM,SAAS,iGAiBd,CAAC;AAQF,KAAK,qBAAqB,GAAG,OAAO,QAAQ,GAAG;IAC7C,IAAI,EAAE,OAAO,QAAQ,CAAC;IACtB,GAAG,EAAE,OAAO,OAAO,CAAC;IACpB,QAAQ,EAAE,OAAO,YAAY,CAAC;IAC9B,KAAK,EAAE,OAAO,SAAS,CAAC;CACzB,CAAC;AAEF,eAAO,MAAM,IAAI,EAKX,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/components/Tabs/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EASL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,EAKL,IAAI,EACJ,IAAI,EAEJ,KAAK,SAAS,EACd,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;AAGtB,OAAO,EAUL,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,cAAc,EACnB,KAAK,UAAU,EAChB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EAmBL,KAAK,WAAW,EACjB,MAAM,UAAU,CAAC;AAElB,YAAY,EAAE,WAAW,EAAE,CAAC;AAqD5B,MAAM,WAAW,SAAU,SAAQ,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,UAAU;IACxE,iKAAiK;IACjK,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,QAAA,MAAM,QAAQ,4FAkBb,CAAC;AAQF,MAAM,WAAW,aAAc,SAAQ,cAAc;IACnD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,8BAA8B,CAAC,EAAE,OAAO,CAAC;CAC1C;AAED,QAAA,MAAM,QAAQ,gGAmYb,CAAC;AAQF,MAAM,WAAW,YAAa,SAAQ,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC;IAC/D,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,QAAA,MAAM,OAAO,+FAyCZ,CAAC;AAQF,MAAM,WAAW,iBAAkB,SAAQ,SAAS;IAClD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,QAAA,MAAM,YAAY,oGAoBjB,CAAC;AAQF,MAAM,WAAW,cAAe,SAAQ,cAAc;IACpD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,QAAA,MAAM,SAAS,iGAiBd,CAAC;AAQF,KAAK,qBAAqB,GAAG,OAAO,QAAQ,GAAG;IAC7C,IAAI,EAAE,OAAO,QAAQ,CAAC;IACtB,GAAG,EAAE,OAAO,OAAO,CAAC;IACpB,QAAQ,EAAE,OAAO,YAAY,CAAC;IAC9B,KAAK,EAAE,OAAO,SAAS,CAAC;CACzB,CAAC;AAEF,eAAO,MAAM,IAAI,EAKX,qBAAqB,CAAC"}
@@ -8,13 +8,6 @@ export declare const OUTLINE_INDICATOR_THICKNESS = 2;
8
8
  * ahead of a still-sliding solid/outline indicator. Change both together.
9
9
  */
10
10
  export declare const TABS_INDICATOR_TRANSITION_MS = 150;
11
- /** Outline horizontal scroll — narrow fade reads cleanly against the page background. */
12
- export declare const TABS_SCROLL_FADE_SIZE = 32;
13
- /**
14
- * Solid horizontal scroll — wider fade so tabs dissolve smoothly into the track (and under the
15
- * overlay chevron) instead of ending in a hard clip at the scroll viewport edge.
16
- */
17
- export declare const TABS_SOLID_SCROLL_FADE_SIZE = 40;
18
11
  /**
19
12
  * Numeric styles that can't be expressed as static Uniwind utility classes — solid track radius
20
13
  * and outline indicator offset (`bottom-px` / `left-px` don't apply on Reanimated host views).
@@ -1 +1 @@
1
- {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../../src/components/Tabs/styles.ts"],"names":[],"mappings":"AACA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAKvD,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC;AAuB9C,kGAAkG;AAClG,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAE7C;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAEhD,yFAAyF;AACzF,eAAO,MAAM,qBAAqB,KAAK,CAAC;AAExC;;;GAGG;AACH,eAAO,MAAM,2BAA2B,KAAK,CAAC;AAqB9C;;;GAGG;AACH,eAAO,MAAM,UAAU;;;;IAIrB,kGAAkG;;;;IAIlG,sGAAsG;;;;;;;;;;;;;;;;;;;;;;;;IAwBtG,6GAA6G;;;;;CAK7G,CAAC;AAEH,eAAO,MAAM,gBAAgB;;8EAQ3B,CAAC;AAEH,eAAO,MAAM,gBAAgB,oFAA4B,CAAC;AAE1D,mEAAmE;AACnE,eAAO,MAAM,qBAAqB;;;;8EAkChC,CAAC;AAEH;;;;;;;;GAQG;AACH,eAAO,MAAM,0BAA0B,oFAErC,CAAC;AAEH,eAAO,MAAM,4BAA4B,oFAAiD,CAAC;AAE3F,eAAO,MAAM,0BAA0B,oFAA6B,CAAC;AAErE,eAAO,MAAM,+BAA+B,oFAAmC,CAAC;AAGhF,eAAO,MAAM,4BAA4B,oFAOvC,CAAC;AAIH,eAAO,MAAM,iCAAiC,oFAO5C,CAAC;AAEH,eAAO,MAAM,qCAAqC;;8EAUjD,CAAC;AAIF,eAAO,MAAM,wBAAwB;;8EAQnC,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;8EA0BhC,CAAC;AAEH,eAAO,MAAM,eAAe;;;8EAuD3B,CAAC;AAEF,eAAO,MAAM,iBAAiB;;8EAQ5B,CAAC;AAEH,eAAO,MAAM,oBAAoB;;8EAiB/B,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,YAAY,CAAC,OAAO,eAAe,CAAC,CAAC;AACvE,MAAM,MAAM,yBAAyB,GAAG,YAAY,CAAC,OAAO,qBAAqB,CAAC,CAAC"}
1
+ {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../../src/components/Tabs/styles.ts"],"names":[],"mappings":"AACA,OAAO,EAAO,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAKvD,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,OAAO,CAAC;AAuB9C,kGAAkG;AAClG,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAE7C;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,MAAM,CAAC;AAqBhD;;;GAGG;AACH,eAAO,MAAM,UAAU;;;;IAIrB,kGAAkG;;;;IAIlG,sGAAsG;;;;;;;;;;;;;;;;;;;;;;;;IAwBtG,6GAA6G;;;;;CAK7G,CAAC;AAEH,eAAO,MAAM,gBAAgB;;8EAQ3B,CAAC;AAEH,eAAO,MAAM,gBAAgB,oFAA4B,CAAC;AAE1D,mEAAmE;AACnE,eAAO,MAAM,qBAAqB;;;;8EAkChC,CAAC;AAEH;;;;;;;;GAQG;AACH,eAAO,MAAM,0BAA0B,oFAErC,CAAC;AAEH,eAAO,MAAM,4BAA4B,oFAAiD,CAAC;AAE3F,eAAO,MAAM,0BAA0B,oFAA6B,CAAC;AAErE,eAAO,MAAM,+BAA+B,oFAAmC,CAAC;AAGhF,eAAO,MAAM,4BAA4B,oFAOvC,CAAC;AAIH,eAAO,MAAM,iCAAiC,oFAO5C,CAAC;AAEH,eAAO,MAAM,qCAAqC;;8EAUjD,CAAC;AAIF,eAAO,MAAM,wBAAwB;;8EAQnC,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;8EA0BhC,CAAC;AAEH,eAAO,MAAM,eAAe;;;8EAuD3B,CAAC;AAEF,eAAO,MAAM,iBAAiB;;8EAQ5B,CAAC;AAEH,eAAO,MAAM,oBAAoB;;8EAiB/B,CAAC;AAEH,MAAM,MAAM,mBAAmB,GAAG,YAAY,CAAC,OAAO,eAAe,CAAC,CAAC;AACvE,MAAM,MAAM,yBAAyB,GAAG,YAAY,CAAC,OAAO,qBAAqB,CAAC,CAAC"}
@@ -1,9 +1,9 @@
1
1
  import { Gesture } from 'react-native-gesture-handler';
2
- import { EntryOrExitLayoutType, useAnimatedStyle } from 'react-native-reanimated';
2
+ import { EntryOrExitLayoutType, FadeInDown, FadeInUp, useAnimatedStyle } from 'react-native-reanimated';
3
3
  import type { UseToastRootAnimationOptions } from './types';
4
- export declare const enteringTop: import("react-native-reanimated").ComplexAnimationBuilder;
4
+ export declare const enteringTop: FadeInUp;
5
5
  export declare const exitingTop: import("react-native-reanimated").ReanimatedKeyframe;
6
- export declare const enteringBottom: import("react-native-reanimated").ComplexAnimationBuilder;
6
+ export declare const enteringBottom: FadeInDown;
7
7
  export declare const exitingBottom: import("react-native-reanimated").ReanimatedKeyframe;
8
8
  export interface UseToastRootAnimationResult {
9
9
  rContainerStyle: ReturnType<typeof useAnimatedStyle>;
@@ -1 +1 @@
1
- {"version":3,"file":"animation.d.ts","sourceRoot":"","sources":["../../../../src/components/Toast/animation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAC;AACvD,OAAO,EAEL,qBAAqB,EAMrB,gBAAgB,EAKjB,MAAM,yBAAyB,CAAC;AASjC,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,SAAS,CAAC;AAI5D,eAAO,MAAM,WAAW,2DAKd,CAAC;AAEX,eAAO,MAAM,UAAU,sDAUP,CAAC;AAEjB,eAAO,MAAM,cAAc,2DAKjB,CAAC;AAEX,eAAO,MAAM,aAAa,sDAUV,CAAC;AAEjB,MAAM,WAAW,2BAA2B;IAC1C,eAAe,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;IACrD,uBAAuB,EAAE,OAAO,CAAC;IACjC,QAAQ,EAAE,qBAAqB,GAAG,SAAS,CAAC;IAC5C,OAAO,EAAE,qBAAqB,GAAG,SAAS,CAAC;IAC3C,UAAU,EAAE,UAAU,CAAC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC;CAC5C;AAID;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,4BAA4B,GACpC,2BAA2B,CAiU7B"}
1
+ {"version":3,"file":"animation.d.ts","sourceRoot":"","sources":["../../../../src/components/Toast/animation.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAC;AACvD,OAAO,EAEL,qBAAqB,EAErB,UAAU,EACV,QAAQ,EAGR,gBAAgB,EAKjB,MAAM,yBAAyB,CAAC;AASjC,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,SAAS,CAAC;AAI5D,eAAO,MAAM,WAAW,UAKd,CAAC;AAEX,eAAO,MAAM,UAAU,sDAUP,CAAC;AAEjB,eAAO,MAAM,cAAc,YAKjB,CAAC;AAEX,eAAO,MAAM,aAAa,sDAUV,CAAC;AAEjB,MAAM,WAAW,2BAA2B;IAC1C,eAAe,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;IACrD,uBAAuB,EAAE,OAAO,CAAC;IACjC,QAAQ,EAAE,qBAAqB,GAAG,SAAS,CAAC;IAC5C,OAAO,EAAE,qBAAqB,GAAG,SAAS,CAAC;IAC3C,UAAU,EAAE,UAAU,CAAC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC;CAC5C;AAID;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,4BAA4B,GACpC,2BAA2B,CAiU7B"}
@@ -1 +1 @@
1
- {"version":3,"file":"ListItem.SectionHeader.figma.d.ts","sourceRoot":"","sources":["../../../src/figma/ListItem.SectionHeader.figma.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,OAAO,CAAC;;;;;;AAa1B,wBAIE"}
1
+ {"version":3,"file":"ListItem.SectionHeader.figma.d.ts","sourceRoot":"","sources":["../../../src/figma/ListItem.SectionHeader.figma.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,OAAO,CAAC;;;;;;AA6B1B,wBAIE"}
@@ -1,4 +1,5 @@
1
1
  /// <reference types="uniwind/types" preserve="true" />
2
+ import { View as RNView } from 'react-native';
2
3
  export * from './components';
3
4
  export * from './hooks';
4
5
  export * from './navigation';
@@ -6,6 +7,10 @@ export { ToastProvider, useToast } from './providers/toast';
6
7
  export type * from './providers/toast';
7
8
  export { ForgeDesignProvider } from './providers/forge-design';
8
9
  export type { ForgeDesignConfig, ForgeDesignProviderProps } from './providers/forge-design';
9
- export { View, ScrollView, KeyboardAvoidingView } from 'react-native';
10
+ export { ScrollView, KeyboardAvoidingView } from 'react-native';
10
11
  export { SafeAreaView, useSafeAreaInsets } from 'react-native-safe-area-context';
12
+ /** @deprecated Use `Box` instead. */
13
+ export declare const View: typeof RNView;
14
+ /** @deprecated Use `BoxRef` for refs and `BoxProps` for props instead. */
15
+ export type View = RNView;
11
16
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AACA,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC5D,mBAAmB,mBAAmB,CAAC;AACvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,YAAY,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAC5F,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,IAAI,IAAI,MAAM,EAAE,MAAM,cAAc,CAAC;AAE9C,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC;AACxB,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC5D,mBAAmB,mBAAmB,CAAC;AACvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,YAAY,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AAC5F,OAAO,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAEjF,qCAAqC;AACrC,eAAO,MAAM,IAAI,eAAS,CAAC;AAC3B,0EAA0E;AAC1E,MAAM,MAAM,IAAI,GAAG,MAAM,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cdx-ui/components",
3
- "version": "0.2.3",
3
+ "version": "0.2.5",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -33,7 +33,9 @@
33
33
  "lib",
34
34
  "src",
35
35
  "!src/figma",
36
- "coverage.svg"
36
+ "coverage.svg",
37
+ "docs",
38
+ "AGENTS.md"
37
39
  ],
38
40
  "react-native-builder-bob": {
39
41
  "source": "src",
@@ -104,20 +106,20 @@
104
106
  "@marceloterreiro/flash-calendar": "2.0.0",
105
107
  "react-native-reanimated-carousel": "5.0.0-beta.5",
106
108
  "uniwind": "1.10.0",
107
- "@cdx-ui/formatters": "0.2.3",
108
- "@cdx-ui/utils": "0.2.3",
109
- "@cdx-ui/icons": "0.2.3",
110
- "@cdx-ui/primitives": "0.2.3"
109
+ "@cdx-ui/icons": "0.2.5",
110
+ "@cdx-ui/utils": "0.2.5",
111
+ "@cdx-ui/primitives": "0.2.5",
112
+ "@cdx-ui/formatters": "0.2.5"
111
113
  },
112
114
  "devDependencies": {
113
115
  "@dnd-kit/core": "6.3.1",
114
116
  "@dnd-kit/sortable": "10.0.0",
115
117
  "@dnd-kit/utilities": "3.2.2",
116
118
  "@react-navigation/bottom-tabs": "*",
117
- "@types/react": "19.1.17",
119
+ "@types/react": "19.2.14",
118
120
  "@types/react-dom": "*",
119
- "react": "19.1.0",
120
- "react-dom": "19.1.0",
121
+ "react": "19.2.3",
122
+ "react-dom": "19.2.3",
121
123
  "react-native": "*",
122
124
  "react-native-builder-bob": "*",
123
125
  "react-native-screens": "*",
@@ -1,16 +1,30 @@
1
1
  import { type ForwardedRef, forwardRef } from 'react';
2
2
  import { View, type ViewProps } from 'react-native';
3
+ import { Slot, dataAttributes, mergeDataAttributes } from '@cdx-ui/primitives';
3
4
 
4
5
  export interface BoxProps extends ViewProps {
5
6
  className?: string;
7
+ /** Renders the child element in place of the default `View`, merging Box's props onto it. */
8
+ asChild?: boolean;
6
9
  }
7
10
 
8
- export const Box = forwardRef<View, BoxProps>(
9
- ({ children, ...restProps }, ref: ForwardedRef<View>) => {
11
+ /** The instance type of a `Box` ref, e.g. `useRef<BoxRef>(null)`. */
12
+ export type BoxRef = View;
13
+
14
+ export const Box = forwardRef<BoxRef, BoxProps>(
15
+ ({ asChild, children, ...restProps }, ref: ForwardedRef<BoxRef>) => {
16
+ const Comp = asChild ? Slot : View;
17
+
10
18
  return (
11
- <View ref={ref} {...restProps}>
19
+ <Comp
20
+ ref={ref}
21
+ {...restProps}
22
+ // Caller-supplied data attributes win so components composed on Box
23
+ // (HStack, VStack and their consumers) can replace the default slot.
24
+ {...mergeDataAttributes(dataAttributes({ slot: 'box' }), restProps)}
25
+ >
12
26
  {children}
13
- </View>
27
+ </Comp>
14
28
  );
15
29
  },
16
30
  );
@@ -19,7 +19,10 @@ import {
19
19
  type ILinkProps,
20
20
  } from '@cdx-ui/primitives';
21
21
  import { cn } from '@cdx-ui/utils';
22
+ import { Icon } from '../Icon';
23
+ import { Text as ForgeText } from '../Text';
22
24
  import {
25
+ breadcrumbContentColor,
23
26
  breadcrumbItemVariants,
24
27
  breadcrumbDisabledCursor,
25
28
  breadcrumbItemRootVariants,
@@ -35,7 +38,8 @@ type BreadcrumbItemState = 'current' | 'ancestor' | 'disabled';
35
38
  export interface BreadcrumbsProps extends IBreadcrumbsProps {
36
39
  className?: string;
37
40
  /**
38
- * Separator rendered between breadcrumb items.
41
+ * Separator rendered between breadcrumb items. A direct `Icon` or `Text` child takes the
42
+ * separator color unless it sets `color`.
39
43
  * @default `/`
40
44
  */
41
45
  separator?: ReactNode;
@@ -48,6 +52,7 @@ interface BreadcrumbItemInternalProps {
48
52
 
49
53
  export interface BreadcrumbsItemProps extends Omit<ILinkProps, 'children' | 'disabled'> {
50
54
  className?: string;
55
+ /** Item content. A direct `Icon` or `Text` child takes the item's state color unless it sets `color`. */
51
56
  children?: ReactNode;
52
57
  }
53
58
 
@@ -65,6 +70,23 @@ function isTextOnlyChild(children: ReactNode): children is string | number {
65
70
  return typeof children === 'string' || typeof children === 'number';
66
71
  }
67
72
 
73
+ // `Icon` and `Text` default to `text-content-primary` and native has no color cascade, so
74
+ // direct children that leave `color` unset take the content color through `className`.
75
+ function withContentColor(children: ReactNode, colorClassName: string): ReactNode {
76
+ return Children.map(children, (child) => {
77
+ if (!isValidElement<{ className?: string; color?: unknown }>(child)) {
78
+ return child;
79
+ }
80
+ if (child.type !== Icon && child.type !== ForgeText) {
81
+ return child;
82
+ }
83
+ if (child.props.color !== undefined) {
84
+ return child;
85
+ }
86
+ return cloneElement(child, { className: cn(colorClassName, child.props.className) });
87
+ });
88
+ }
89
+
68
90
  function BreadcrumbItemContent({
69
91
  children,
70
92
  className,
@@ -74,6 +96,8 @@ function BreadcrumbItemContent({
74
96
  className: string;
75
97
  state: BreadcrumbItemState;
76
98
  }) {
99
+ const { color } = useBreadcrumbsContext();
100
+
77
101
  if (isTextOnlyChild(children)) {
78
102
  return (
79
103
  <Text className={className} {...dataAttributes({ state })}>
@@ -84,13 +108,13 @@ function BreadcrumbItemContent({
84
108
 
85
109
  return (
86
110
  <View className={cn('flex-row items-center gap-1', className)} {...dataAttributes({ state })}>
87
- {children}
111
+ {withContentColor(children, breadcrumbContentColor(state, color))}
88
112
  </View>
89
113
  );
90
114
  }
91
115
 
92
116
  function BreadcrumbsSeparator({ separator }: { separator: ReactNode }) {
93
- const { isDisabled } = useBreadcrumbsContext();
117
+ const { isDisabled, color } = useBreadcrumbsContext();
94
118
  const disabledClassName = isDisabled ? breadcrumbDisabledCursor : undefined;
95
119
  const slotProps = mergeDataAttributes({}, dataAttributes({ slot: 'breadcrumbs-separator' }));
96
120
  const a11yProps = {
@@ -121,7 +145,7 @@ function BreadcrumbsSeparator({ separator }: { separator: ReactNode }) {
121
145
  {...a11yProps}
122
146
  {...slotProps}
123
147
  >
124
- {separator}
148
+ {withContentColor(separator, breadcrumbContentColor('separator', color))}
125
149
  </View>
126
150
  );
127
151
  }
@@ -13,6 +13,36 @@ export const breadcrumbDisabledCursor = 'web:cursor-not-allowed';
13
13
 
14
14
  export const breadcrumbSeparatorVariants = cva(['body-md text-content-tertiary select-none px-1']);
15
15
 
16
+ const breadcrumbAncestorContentColor = {
17
+ neutral: 'text-content-secondary',
18
+ action: 'text-content-action',
19
+ danger: 'text-content-danger',
20
+ warning: 'text-content-warning',
21
+ success: 'text-content-success',
22
+ info: 'text-content-info',
23
+ } satisfies Record<BreadcrumbColor, string>;
24
+
25
+ // Color for an `Icon` or `Text` placed directly in item or separator content. Web inherits
26
+ // the CSS color of the content element, so hover follows it; native has no color cascade,
27
+ // so it resolves the state's token.
28
+ export function breadcrumbContentColor(
29
+ state: 'current' | 'ancestor' | 'disabled' | 'separator',
30
+ color: BreadcrumbColor,
31
+ ): string {
32
+ if (Platform.OS === 'web') {
33
+ return 'text-inherit';
34
+ }
35
+ switch (state) {
36
+ case 'current':
37
+ return 'text-content-primary';
38
+ case 'ancestor':
39
+ return breadcrumbAncestorContentColor[color];
40
+ case 'disabled':
41
+ case 'separator':
42
+ return 'text-content-tertiary';
43
+ }
44
+ }
45
+
16
46
  export const breadcrumbItemRootVariants = cva([
17
47
  'self-start',
18
48
  'web:outline-none web:focus:outline-none web:focus-visible:outline-none',
@@ -1,6 +1,5 @@
1
1
  import { forwardRef, type ReactNode } from 'react';
2
2
  import { Pressable, Text, View, type ViewProps } from 'react-native';
3
- import { useCSSVariable } from 'uniwind';
4
3
  import {
5
4
  dataAttributes,
6
5
  DATE_TIME_LIST_HEIGHT,
@@ -15,10 +14,11 @@ import {
15
14
  } from '@cdx-ui/primitives';
16
15
  import { getDateTimeSegmentVisibility } from '@cdx-ui/formatters';
17
16
  import { cn } from '@cdx-ui/utils';
17
+ import { ScrollShadow } from '../ScrollShadow';
18
18
  import {
19
19
  dateTimeListColumnsVariants,
20
20
  dateTimeListColumnVariants,
21
- dateTimeListEdgeFadeVariants,
21
+ dateTimeListFadeLayerVariants,
22
22
  dateTimeListHighlightVariants,
23
23
  dateTimeListOptionTextVariants,
24
24
  dateTimeListOptionVariants,
@@ -50,24 +50,6 @@ function DateTimeListDefaultBody() {
50
50
  );
51
51
  }
52
52
 
53
- /** Cross-platform edge fade (Uniwind gradients are unreliable on native). */
54
- function EdgeFade({ edge }: { edge: 'top' | 'bottom' }) {
55
- const surface = useCSSVariable('--color-surface-primary') || 'transparent';
56
- const isTop = edge === 'top';
57
- return (
58
- <View
59
- pointerEvents="none"
60
- className={dateTimeListEdgeFadeVariants({ edge })}
61
- style={{
62
- height: DATE_TIME_LIST_ITEM_HEIGHT * 1.75,
63
- experimental_backgroundImage: isTop
64
- ? `linear-gradient(to bottom, ${surface as string}, transparent)`
65
- : `linear-gradient(to top, ${surface as string}, transparent)`,
66
- }}
67
- />
68
- );
69
- }
70
-
71
53
  const DateTimeListRoot = forwardRef<View, DateTimeListProps>(
72
54
  ({ className, children, style, ...props }, ref) => (
73
55
  <DateTimeListRootPrimitive
@@ -86,12 +68,17 @@ const DateTimeListRoot = forwardRef<View, DateTimeListProps>(
86
68
  }}
87
69
  />
88
70
 
89
- <View className={dateTimeListColumnsVariants()}>
90
- {children ?? <DateTimeListDefaultBody />}
91
- </View>
92
-
93
- <EdgeFade edge="top" />
94
- <EdgeFade edge="bottom" />
71
+ <ScrollShadow
72
+ className={dateTimeListFadeLayerVariants()}
73
+ orientation="vertical"
74
+ size="large"
75
+ surface="primary"
76
+ visibility="both"
77
+ >
78
+ <View className={dateTimeListColumnsVariants()}>
79
+ {children ?? <DateTimeListDefaultBody />}
80
+ </View>
81
+ </ScrollShadow>
95
82
  </DateTimeListRootPrimitive>
96
83
  ),
97
84
  );
@@ -45,15 +45,6 @@ export const dateTimeListOptionTextVariants = cva('body-md tabular-nums', {
45
45
  defaultVariants: { selected: false },
46
46
  });
47
47
 
48
- export const dateTimeListEdgeFadeVariants = cva(['absolute left-0 right-0', LAYER_EDGE_FADE], {
49
- variants: {
50
- edge: {
51
- top: 'top-0',
52
- bottom: 'bottom-0',
53
- },
54
- },
55
- defaultVariants: { edge: 'top' },
56
- });
48
+ export const dateTimeListFadeLayerVariants = cva(['h-full', LAYER_EDGE_FADE]);
57
49
 
58
50
  export type DateTimeListColumnVariantProps = VariantProps<typeof dateTimeListColumnVariants>;
59
- export type DateTimeListEdgeFadeVariantProps = VariantProps<typeof dateTimeListEdgeFadeVariants>;
@@ -522,11 +522,12 @@ export interface ListItemSectionHeaderProps extends ViewProps {
522
522
  trailing?: ReactNode;
523
523
  /**
524
524
  * Background treatment. `ghost` has no fill and a bottom border; `subtle` adds a neutral fill
525
- * (matching `subtle` on Avatar, Chip, and IconButton) and drops the bottom border.
526
- * Label typography is the same for both.
525
+ * (matching `subtle` on Avatar, Chip, and IconButton) and drops the bottom border. `gradient`
526
+ * fades from the primary surface into a brand tint, left to right, and keeps the bottom border.
527
+ * Label typography is the same for all three.
527
528
  * @default 'ghost'
528
- * @remarks `'ghost' | 'subtle'`
529
- * @fumadocsType `'ghost' | 'subtle'`
529
+ * @remarks `'ghost' | 'subtle' | 'gradient'`
530
+ * @fumadocsType `'ghost' | 'subtle' | 'gradient'`
530
531
  */
531
532
  variant?: ListItemSectionHeaderVariant;
532
533
  /**
@@ -154,6 +154,7 @@ export const listItemSectionHeaderVariants = cva(
154
154
  ghost: [],
155
155
  // The fill separates the header from its rows, so the bottom border is dropped.
156
156
  subtle: 'bg-surface-neutral-subtle border-b-0',
157
+ gradient: 'bg-gradient-to-r from-surface-primary to-surface-brand-tint',
157
158
  },
158
159
  showDivider: {
159
160
  true: ['border-t-4 border-solid border-t-surface-brand-strong/40', 'border-x-0'],