@cdx-ui/components 0.2.2 → 0.2.4

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 (373) hide show
  1. package/AGENTS.md +24 -0
  2. package/README.md +6 -2
  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 +235 -0
  10. package/docs/components/bottom-sheet/content.md +351 -0
  11. package/docs/components/bottom-sheet/design.md +249 -0
  12. package/docs/components/breadcrumbs/content.md +169 -0
  13. package/docs/components/button/content.md +398 -0
  14. package/docs/components/button/design.md +258 -0
  15. package/docs/components/calendar/content.md +137 -0
  16. package/docs/components/card/content.md +283 -0
  17. package/docs/components/carousel/content.md +416 -0
  18. package/docs/components/checkbox/content.md +236 -0
  19. package/docs/components/checkbox/design.md +214 -0
  20. package/docs/components/chip/content.md +439 -0
  21. package/docs/components/chip/design.md +418 -0
  22. package/docs/components/color-area/content.md +86 -0
  23. package/docs/components/color-field/content.md +134 -0
  24. package/docs/components/color-picker/content.md +208 -0
  25. package/docs/components/color-slider/content.md +120 -0
  26. package/docs/components/color-swatch/content.md +64 -0
  27. package/docs/components/color-swatch-picker/content.md +126 -0
  28. package/docs/components/content.md +97 -0
  29. package/docs/components/currency-input/content.md +205 -0
  30. package/docs/components/data-grid/content.md +522 -0
  31. package/docs/components/date-field/content.md +147 -0
  32. package/docs/components/date-picker/content.md +360 -0
  33. package/docs/components/date-range-picker/content.md +301 -0
  34. package/docs/components/date-time-field/content.md +157 -0
  35. package/docs/components/date-time-list/content.md +105 -0
  36. package/docs/components/date-time-picker/content.md +272 -0
  37. package/docs/components/dialog/content.md +436 -0
  38. package/docs/components/dialog/design.md +192 -0
  39. package/docs/components/divider/content.md +112 -0
  40. package/docs/components/drawer/content.md +436 -0
  41. package/docs/components/field/content.md +277 -0
  42. package/docs/components/form/content.md +62 -0
  43. package/docs/components/full-screen-dialog/content.md +881 -0
  44. package/docs/components/heading/content.md +55 -0
  45. package/docs/components/icon/content.md +190 -0
  46. package/docs/components/icon-button/content.md +200 -0
  47. package/docs/components/icon-button/design.md +165 -0
  48. package/docs/components/image/content.md +104 -0
  49. package/docs/components/input/content.md +281 -0
  50. package/docs/components/input/design.md +389 -0
  51. package/docs/components/insurance-disclosure/content.md +103 -0
  52. package/docs/components/link/content.md +180 -0
  53. package/docs/components/link/design.md +160 -0
  54. package/docs/components/list-item/content.md +695 -0
  55. package/docs/components/menu/content.md +1247 -0
  56. package/docs/components/month-calendar/content.md +84 -0
  57. package/docs/components/month-picker/content.md +273 -0
  58. package/docs/components/otp-input/content.md +327 -0
  59. package/docs/components/progress-bar/content.md +87 -0
  60. package/docs/components/progress-circle/content.md +176 -0
  61. package/docs/components/progress-segmented/content.md +119 -0
  62. package/docs/components/quick-action-button/content.md +154 -0
  63. package/docs/components/quick-action-button/design.md +170 -0
  64. package/docs/components/radio/content.md +224 -0
  65. package/docs/components/range-calendar/content.md +123 -0
  66. package/docs/components/reorderable-list/content.md +309 -0
  67. package/docs/components/scoped-theme/content.md +47 -0
  68. package/docs/components/scroll-shadow/content.md +686 -0
  69. package/docs/components/select/content.md +400 -0
  70. package/docs/components/select/design.md +301 -0
  71. package/docs/components/skeleton/content.md +103 -0
  72. package/docs/components/slider/content.md +423 -0
  73. package/docs/components/stack/content.md +161 -0
  74. package/docs/components/switch/content.md +150 -0
  75. package/docs/components/switch/design.md +208 -0
  76. package/docs/components/table/content.md +548 -0
  77. package/docs/components/table-pagination/content.md +177 -0
  78. package/docs/components/tabs/content.md +292 -0
  79. package/docs/components/text/content.md +142 -0
  80. package/docs/components/textarea/content.md +222 -0
  81. package/docs/components/tile/content.md +703 -0
  82. package/docs/components/toast/content.md +456 -0
  83. package/docs/components/toggle-button/content.md +505 -0
  84. package/docs/components/tooltip/content.md +350 -0
  85. package/docs/components/virtualized-list/content.md +250 -0
  86. package/docs/foundations/content.md +9 -0
  87. package/docs/foundations/expressions/icons/content.md +19 -0
  88. package/docs/foundations/styles/tokens/all-tokens/content.md +192 -0
  89. package/docs/foundations/styles/tokens/what-are-tokens/content.md +33 -0
  90. package/docs/foundations/styles/tokens/what-are-tokens/design.md +33 -0
  91. package/docs/getting-started/content.md +4 -0
  92. package/docs/getting-started/designers/content.md +13 -0
  93. package/docs/getting-started/designers/design.md +13 -0
  94. package/docs/getting-started/developers/accessibility/content.md +31 -0
  95. package/docs/getting-started/developers/content.md +612 -0
  96. package/docs/getting-started/developers/styling/content.md +193 -0
  97. package/docs/llms.txt +193 -0
  98. package/docs/patterns/account-management/content.md +75 -0
  99. package/docs/patterns/authentication/content.md +52 -0
  100. package/docs/patterns/content.md +10 -0
  101. package/docs/patterns/dashboard/content.md +39 -0
  102. package/docs/patterns/empty-states/content.md +31 -0
  103. package/docs/patterns/forms/content.md +109 -0
  104. package/docs/patterns/onboarding/content.md +69 -0
  105. package/docs/patterns/payments/content.md +35 -0
  106. package/docs/patterns/settings/content.md +72 -0
  107. package/docs/resources/content.md +9 -0
  108. package/docs/resources/figma-libraries/content.md +42 -0
  109. package/docs/resources/release-notes/0.0.1-beta.118/content.md +27 -0
  110. package/docs/resources/release-notes/0.0.1-beta.122/content.md +21 -0
  111. package/docs/resources/release-notes/0.0.1-beta.124/content.md +16 -0
  112. package/docs/resources/release-notes/0.0.1-beta.126/content.md +10 -0
  113. package/docs/resources/release-notes/0.0.1-beta.127/content.md +14 -0
  114. package/docs/resources/release-notes/0.0.1-beta.128/content.md +9 -0
  115. package/docs/resources/release-notes/0.0.1-beta.129/content.md +18 -0
  116. package/docs/resources/release-notes/0.0.1-beta.130/content.md +18 -0
  117. package/docs/resources/release-notes/0.0.1-beta.133/content.md +7 -0
  118. package/docs/resources/release-notes/0.0.1-beta.134/content.md +17 -0
  119. package/docs/resources/release-notes/0.0.1-beta.136/content.md +7 -0
  120. package/docs/resources/release-notes/0.0.1-beta.137/content.md +10 -0
  121. package/docs/resources/release-notes/0.0.1-beta.138/content.md +7 -0
  122. package/docs/resources/release-notes/0.0.1-beta.139/content.md +13 -0
  123. package/docs/resources/release-notes/0.0.1-beta.140/content.md +26 -0
  124. package/docs/resources/release-notes/0.0.1-beta.141/content.md +63 -0
  125. package/docs/resources/release-notes/0.0.1-beta.142/content.md +7 -0
  126. package/docs/resources/release-notes/0.0.1-beta.143/content.md +12 -0
  127. package/docs/resources/release-notes/0.0.1-beta.144/content.md +7 -0
  128. package/docs/resources/release-notes/0.0.1-beta.145/content.md +7 -0
  129. package/docs/resources/release-notes/0.0.1-beta.147/content.md +10 -0
  130. package/docs/resources/release-notes/0.0.1-beta.149/content.md +10 -0
  131. package/docs/resources/release-notes/0.0.1-beta.150/content.md +13 -0
  132. package/docs/resources/release-notes/0.0.1-beta.152/content.md +7 -0
  133. package/docs/resources/release-notes/0.0.1-beta.154/content.md +15 -0
  134. package/docs/resources/release-notes/0.0.1-beta.156/content.md +7 -0
  135. package/docs/resources/release-notes/0.0.1-beta.158/content.md +9 -0
  136. package/docs/resources/release-notes/0.0.1-beta.159/content.md +11 -0
  137. package/docs/resources/release-notes/0.0.1-beta.160/content.md +7 -0
  138. package/docs/resources/release-notes/0.0.1-beta.161/content.md +7 -0
  139. package/docs/resources/release-notes/0.0.1-beta.163/content.md +7 -0
  140. package/docs/resources/release-notes/0.0.1-beta.164/content.md +9 -0
  141. package/docs/resources/release-notes/0.0.1-beta.166/content.md +17 -0
  142. package/docs/resources/release-notes/0.0.1-beta.167/content.md +7 -0
  143. package/docs/resources/release-notes/0.0.1-beta.168/content.md +7 -0
  144. package/docs/resources/release-notes/0.0.1-beta.169/content.md +7 -0
  145. package/docs/resources/release-notes/0.0.1-beta.171/content.md +16 -0
  146. package/docs/resources/release-notes/0.0.1-beta.172/content.md +24 -0
  147. package/docs/resources/release-notes/0.0.1-beta.173/content.md +15 -0
  148. package/docs/resources/release-notes/0.0.1-beta.174/content.md +7 -0
  149. package/docs/resources/release-notes/0.0.1-beta.176/content.md +32 -0
  150. package/docs/resources/release-notes/0.0.1-beta.179/content.md +11 -0
  151. package/docs/resources/release-notes/0.0.1-beta.182/content.md +13 -0
  152. package/docs/resources/release-notes/0.0.1-beta.185/content.md +7 -0
  153. package/docs/resources/release-notes/0.0.1-beta.187/content.md +27 -0
  154. package/docs/resources/release-notes/0.1.1/content.md +23 -0
  155. package/docs/resources/release-notes/0.1.2/content.md +7 -0
  156. package/docs/resources/release-notes/0.1.4/content.md +19 -0
  157. package/docs/resources/release-notes/0.1.5/content.md +7 -0
  158. package/docs/resources/release-notes/0.1.6/content.md +7 -0
  159. package/docs/resources/release-notes/0.2.0/content.md +31 -0
  160. package/docs/resources/release-notes/0.2.1/content.md +17 -0
  161. package/docs/resources/release-notes/0.2.2/content.md +11 -0
  162. package/docs/resources/release-notes/0.2.3/content.md +15 -0
  163. package/docs/resources/release-notes/content.md +64 -0
  164. package/lib/commonjs/components/Checkbox/index.js.map +1 -1
  165. package/lib/commonjs/components/DateTimeList/index.js +11 -26
  166. package/lib/commonjs/components/DateTimeList/index.js.map +1 -1
  167. package/lib/commonjs/components/DateTimeList/styles.js +2 -12
  168. package/lib/commonjs/components/DateTimeList/styles.js.map +1 -1
  169. package/lib/commonjs/components/Heading/index.js.map +1 -1
  170. package/lib/commonjs/components/Icon/index.js.map +1 -1
  171. package/lib/commonjs/components/ListItem/index.js +170 -9
  172. package/lib/commonjs/components/ListItem/index.js.map +1 -1
  173. package/lib/commonjs/components/ListItem/styles.js +38 -2
  174. package/lib/commonjs/components/ListItem/styles.js.map +1 -1
  175. package/lib/commonjs/components/Menu/index.js +11 -5
  176. package/lib/commonjs/components/Menu/index.js.map +1 -1
  177. package/lib/commonjs/components/RangeCalendar/index.js.map +1 -1
  178. package/lib/commonjs/components/ReorderableList/ReorderableListShared.js +91 -0
  179. package/lib/commonjs/components/ReorderableList/ReorderableListShared.js.map +1 -0
  180. package/lib/commonjs/components/ReorderableList/index.js +135 -0
  181. package/lib/commonjs/components/ReorderableList/index.js.map +1 -0
  182. package/lib/commonjs/components/ReorderableList/index.web.js +233 -0
  183. package/lib/commonjs/components/ReorderableList/index.web.js.map +1 -0
  184. package/lib/commonjs/components/ReorderableList/labels.js +47 -0
  185. package/lib/commonjs/components/ReorderableList/labels.js.map +1 -0
  186. package/lib/commonjs/components/ReorderableList/reorderItems.js +16 -0
  187. package/lib/commonjs/components/ReorderableList/reorderItems.js.map +1 -0
  188. package/lib/commonjs/components/ReorderableList/rowContext.js +42 -0
  189. package/lib/commonjs/components/ReorderableList/rowContext.js.map +1 -0
  190. package/lib/commonjs/components/ReorderableList/types.js +6 -0
  191. package/lib/commonjs/components/ReorderableList/types.js.map +1 -0
  192. package/lib/commonjs/components/ReorderableList/useReorder.js +131 -0
  193. package/lib/commonjs/components/ReorderableList/useReorder.js.map +1 -0
  194. package/lib/commonjs/components/ReorderableList/webDnd.js +64 -0
  195. package/lib/commonjs/components/ReorderableList/webDnd.js.map +1 -0
  196. package/lib/commonjs/components/ScopedTheme/index.js.map +1 -1
  197. package/lib/commonjs/components/ScrollShadow/gradient.js +29 -0
  198. package/lib/commonjs/components/ScrollShadow/gradient.js.map +1 -0
  199. package/lib/commonjs/components/ScrollShadow/index.js +171 -44
  200. package/lib/commonjs/components/ScrollShadow/index.js.map +1 -1
  201. package/lib/commonjs/components/ScrollShadow/styles.js +58 -14
  202. package/lib/commonjs/components/ScrollShadow/styles.js.map +1 -1
  203. package/lib/commonjs/components/ScrollShadow/useComposedScrollHandler.js +63 -0
  204. package/lib/commonjs/components/ScrollShadow/useComposedScrollHandler.js.map +1 -0
  205. package/lib/commonjs/components/ScrollShadow/useScrollShadow.js +48 -8
  206. package/lib/commonjs/components/ScrollShadow/useScrollShadow.js.map +1 -1
  207. package/lib/commonjs/components/Skeleton/index.js.map +1 -1
  208. package/lib/commonjs/components/TablePagination/index.js.map +1 -1
  209. package/lib/commonjs/components/Tabs/index.js +16 -23
  210. package/lib/commonjs/components/Tabs/index.js.map +1 -1
  211. package/lib/commonjs/components/Tabs/styles.js +1 -10
  212. package/lib/commonjs/components/Tabs/styles.js.map +1 -1
  213. package/lib/commonjs/components/Text/index.js.map +1 -1
  214. package/lib/commonjs/components/Tile/styles.js +1 -1
  215. package/lib/commonjs/components/Tile/styles.js.map +1 -1
  216. package/lib/commonjs/components/index.js.map +1 -1
  217. package/lib/commonjs/figma/ListItem.SectionHeader.figma.js +20 -5
  218. package/lib/commonjs/figma/ListItem.SectionHeader.figma.js.map +1 -1
  219. package/lib/commonjs/reorderable-list.js +17 -0
  220. package/lib/commonjs/reorderable-list.js.map +1 -0
  221. package/lib/module/components/Checkbox/index.js.map +1 -1
  222. package/lib/module/components/DateTimeList/index.js +12 -27
  223. package/lib/module/components/DateTimeList/index.js.map +1 -1
  224. package/lib/module/components/DateTimeList/styles.js +1 -11
  225. package/lib/module/components/DateTimeList/styles.js.map +1 -1
  226. package/lib/module/components/Heading/index.js.map +1 -1
  227. package/lib/module/components/Icon/index.js.map +1 -1
  228. package/lib/module/components/ListItem/index.js +163 -14
  229. package/lib/module/components/ListItem/index.js.map +1 -1
  230. package/lib/module/components/ListItem/styles.js +37 -1
  231. package/lib/module/components/ListItem/styles.js.map +1 -1
  232. package/lib/module/components/Menu/index.js +11 -5
  233. package/lib/module/components/Menu/index.js.map +1 -1
  234. package/lib/module/components/RangeCalendar/index.js.map +1 -1
  235. package/lib/module/components/ReorderableList/ReorderableListShared.js +86 -0
  236. package/lib/module/components/ReorderableList/ReorderableListShared.js.map +1 -0
  237. package/lib/module/components/ReorderableList/index.js +130 -0
  238. package/lib/module/components/ReorderableList/index.js.map +1 -0
  239. package/lib/module/components/ReorderableList/index.web.js +229 -0
  240. package/lib/module/components/ReorderableList/index.web.js.map +1 -0
  241. package/lib/module/components/ReorderableList/labels.js +41 -0
  242. package/lib/module/components/ReorderableList/labels.js.map +1 -0
  243. package/lib/module/components/ReorderableList/reorderItems.js +12 -0
  244. package/lib/module/components/ReorderableList/reorderItems.js.map +1 -0
  245. package/lib/module/components/ReorderableList/rowContext.js +38 -0
  246. package/lib/module/components/ReorderableList/rowContext.js.map +1 -0
  247. package/lib/module/components/ReorderableList/types.js +4 -0
  248. package/lib/module/components/ReorderableList/types.js.map +1 -0
  249. package/lib/module/components/ReorderableList/useReorder.js +123 -0
  250. package/lib/module/components/ReorderableList/useReorder.js.map +1 -0
  251. package/lib/module/components/ReorderableList/webDnd.js +59 -0
  252. package/lib/module/components/ReorderableList/webDnd.js.map +1 -0
  253. package/lib/module/components/ScopedTheme/index.js.map +1 -1
  254. package/lib/module/components/ScrollShadow/gradient.js +24 -0
  255. package/lib/module/components/ScrollShadow/gradient.js.map +1 -0
  256. package/lib/module/components/ScrollShadow/index.js +170 -48
  257. package/lib/module/components/ScrollShadow/index.js.map +1 -1
  258. package/lib/module/components/ScrollShadow/styles.js +57 -13
  259. package/lib/module/components/ScrollShadow/styles.js.map +1 -1
  260. package/lib/module/components/ScrollShadow/useComposedScrollHandler.js +57 -0
  261. package/lib/module/components/ScrollShadow/useComposedScrollHandler.js.map +1 -0
  262. package/lib/module/components/ScrollShadow/useScrollShadow.js +46 -8
  263. package/lib/module/components/ScrollShadow/useScrollShadow.js.map +1 -1
  264. package/lib/module/components/Skeleton/index.js.map +1 -1
  265. package/lib/module/components/TablePagination/index.js.map +1 -1
  266. package/lib/module/components/Tabs/index.js +17 -24
  267. package/lib/module/components/Tabs/index.js.map +1 -1
  268. package/lib/module/components/Tabs/styles.js +0 -9
  269. package/lib/module/components/Tabs/styles.js.map +1 -1
  270. package/lib/module/components/Text/index.js.map +1 -1
  271. package/lib/module/components/Tile/styles.js +1 -1
  272. package/lib/module/components/Tile/styles.js.map +1 -1
  273. package/lib/module/components/index.js.map +1 -1
  274. package/lib/module/figma/ListItem.SectionHeader.figma.js +20 -5
  275. package/lib/module/figma/ListItem.SectionHeader.figma.js.map +1 -1
  276. package/lib/module/reorderable-list.js +4 -0
  277. package/lib/module/reorderable-list.js.map +1 -0
  278. package/lib/typescript/components/Checkbox/index.d.ts +22 -0
  279. package/lib/typescript/components/Checkbox/index.d.ts.map +1 -1
  280. package/lib/typescript/components/DateTimeList/index.d.ts.map +1 -1
  281. package/lib/typescript/components/DateTimeList/styles.d.ts +1 -4
  282. package/lib/typescript/components/DateTimeList/styles.d.ts.map +1 -1
  283. package/lib/typescript/components/Heading/index.d.ts +20 -2
  284. package/lib/typescript/components/Heading/index.d.ts.map +1 -1
  285. package/lib/typescript/components/Icon/index.d.ts +2 -0
  286. package/lib/typescript/components/Icon/index.d.ts.map +1 -1
  287. package/lib/typescript/components/ListItem/index.d.ts +28 -5
  288. package/lib/typescript/components/ListItem/index.d.ts.map +1 -1
  289. package/lib/typescript/components/ListItem/styles.d.ts +6 -1
  290. package/lib/typescript/components/ListItem/styles.d.ts.map +1 -1
  291. package/lib/typescript/components/Menu/index.d.ts +116 -4
  292. package/lib/typescript/components/Menu/index.d.ts.map +1 -1
  293. package/lib/typescript/components/RangeCalendar/index.d.ts +2 -0
  294. package/lib/typescript/components/RangeCalendar/index.d.ts.map +1 -1
  295. package/lib/typescript/components/ReorderableList/ReorderableListShared.d.ts +31 -0
  296. package/lib/typescript/components/ReorderableList/ReorderableListShared.d.ts.map +1 -0
  297. package/lib/typescript/components/ReorderableList/index.d.ts +8 -0
  298. package/lib/typescript/components/ReorderableList/index.d.ts.map +1 -0
  299. package/lib/typescript/components/ReorderableList/index.web.d.ts +8 -0
  300. package/lib/typescript/components/ReorderableList/index.web.d.ts.map +1 -0
  301. package/lib/typescript/components/ReorderableList/labels.d.ts +16 -0
  302. package/lib/typescript/components/ReorderableList/labels.d.ts.map +1 -0
  303. package/lib/typescript/components/ReorderableList/reorderItems.d.ts +3 -0
  304. package/lib/typescript/components/ReorderableList/reorderItems.d.ts.map +1 -0
  305. package/lib/typescript/components/ReorderableList/rowContext.d.ts +57 -0
  306. package/lib/typescript/components/ReorderableList/rowContext.d.ts.map +1 -0
  307. package/lib/typescript/components/ReorderableList/types.d.ts +75 -0
  308. package/lib/typescript/components/ReorderableList/types.d.ts.map +1 -0
  309. package/lib/typescript/components/ReorderableList/useReorder.d.ts +31 -0
  310. package/lib/typescript/components/ReorderableList/useReorder.d.ts.map +1 -0
  311. package/lib/typescript/components/ReorderableList/webDnd.d.ts +27 -0
  312. package/lib/typescript/components/ReorderableList/webDnd.d.ts.map +1 -0
  313. package/lib/typescript/components/ScopedTheme/index.d.ts +6 -1
  314. package/lib/typescript/components/ScopedTheme/index.d.ts.map +1 -1
  315. package/lib/typescript/components/ScrollShadow/gradient.d.ts +7 -0
  316. package/lib/typescript/components/ScrollShadow/gradient.d.ts.map +1 -0
  317. package/lib/typescript/components/ScrollShadow/index.d.ts +57 -15
  318. package/lib/typescript/components/ScrollShadow/index.d.ts.map +1 -1
  319. package/lib/typescript/components/ScrollShadow/styles.d.ts +8 -2
  320. package/lib/typescript/components/ScrollShadow/styles.d.ts.map +1 -1
  321. package/lib/typescript/components/ScrollShadow/useComposedScrollHandler.d.ts +13 -0
  322. package/lib/typescript/components/ScrollShadow/useComposedScrollHandler.d.ts.map +1 -0
  323. package/lib/typescript/components/ScrollShadow/useScrollShadow.d.ts +15 -2
  324. package/lib/typescript/components/ScrollShadow/useScrollShadow.d.ts.map +1 -1
  325. package/lib/typescript/components/Skeleton/index.d.ts +3 -0
  326. package/lib/typescript/components/Skeleton/index.d.ts.map +1 -1
  327. package/lib/typescript/components/TablePagination/index.d.ts +54 -0
  328. package/lib/typescript/components/TablePagination/index.d.ts.map +1 -1
  329. package/lib/typescript/components/Tabs/index.d.ts.map +1 -1
  330. package/lib/typescript/components/Tabs/styles.d.ts +0 -7
  331. package/lib/typescript/components/Tabs/styles.d.ts.map +1 -1
  332. package/lib/typescript/components/Text/index.d.ts +12 -2
  333. package/lib/typescript/components/Text/index.d.ts.map +1 -1
  334. package/lib/typescript/components/Tile/styles.d.ts.map +1 -1
  335. package/lib/typescript/components/ToggleButton/styles.d.ts +1 -1
  336. package/lib/typescript/components/index.d.ts +1 -0
  337. package/lib/typescript/components/index.d.ts.map +1 -1
  338. package/lib/typescript/figma/ListItem.SectionHeader.figma.d.ts.map +1 -1
  339. package/lib/typescript/reorderable-list.d.ts +2 -0
  340. package/lib/typescript/reorderable-list.d.ts.map +1 -0
  341. package/package.json +37 -8
  342. package/src/components/Checkbox/index.tsx +22 -0
  343. package/src/components/DateTimeList/index.tsx +13 -26
  344. package/src/components/DateTimeList/styles.ts +1 -10
  345. package/src/components/Heading/index.tsx +10 -1
  346. package/src/components/Icon/index.tsx +2 -0
  347. package/src/components/ListItem/index.tsx +232 -15
  348. package/src/components/ListItem/styles.ts +41 -0
  349. package/src/components/Menu/index.tsx +128 -12
  350. package/src/components/RangeCalendar/index.tsx +2 -0
  351. package/src/components/ReorderableList/ReorderableListShared.tsx +113 -0
  352. package/src/components/ReorderableList/index.tsx +162 -0
  353. package/src/components/ReorderableList/index.web.tsx +254 -0
  354. package/src/components/ReorderableList/labels.ts +52 -0
  355. package/src/components/ReorderableList/reorderItems.ts +16 -0
  356. package/src/components/ReorderableList/rowContext.tsx +72 -0
  357. package/src/components/ReorderableList/types.ts +80 -0
  358. package/src/components/ReorderableList/useReorder.ts +159 -0
  359. package/src/components/ReorderableList/webDnd.ts +60 -0
  360. package/src/components/ScopedTheme/index.tsx +6 -1
  361. package/src/components/ScrollShadow/gradient.ts +48 -0
  362. package/src/components/ScrollShadow/index.tsx +300 -69
  363. package/src/components/ScrollShadow/styles.ts +45 -28
  364. package/src/components/ScrollShadow/useComposedScrollHandler.ts +58 -0
  365. package/src/components/ScrollShadow/useScrollShadow.ts +72 -10
  366. package/src/components/Skeleton/index.tsx +3 -0
  367. package/src/components/TablePagination/index.tsx +54 -0
  368. package/src/components/Tabs/index.tsx +25 -35
  369. package/src/components/Tabs/styles.ts +0 -9
  370. package/src/components/Text/index.tsx +6 -1
  371. package/src/components/Tile/styles.ts +4 -1
  372. package/src/components/index.ts +5 -0
  373. package/src/reorderable-list.ts +1 -0
@@ -1,5 +1,16 @@
1
- import { forwardRef, useMemo, type ReactNode } from 'react';
2
- import { Text, View, type TextProps, type ViewProps } from 'react-native';
1
+ import {
2
+ Children,
3
+ createContext,
4
+ forwardRef,
5
+ isValidElement,
6
+ useContext,
7
+ useEffect,
8
+ useMemo,
9
+ type ReactElement,
10
+ type ReactNode,
11
+ } from 'react';
12
+ import { Platform, Text, View, type TextProps, type ViewProps } from 'react-native';
13
+ import { DragIndicator } from '@cdx-ui/icons';
3
14
  import {
4
15
  ListItemRoot as ListItemRootPrimitive,
5
16
  Slot,
@@ -8,12 +19,23 @@ import {
8
19
  type IListItemProps,
9
20
  type ListItemCrossAlign,
10
21
  } from '@cdx-ui/primitives';
11
- import { cn, ParentContext, useParentContext, useStyleContext } from '@cdx-ui/utils';
22
+ import {
23
+ cn,
24
+ composeEventHandlers,
25
+ mergeRefs,
26
+ ParentContext,
27
+ useParentContext,
28
+ useStyleContext,
29
+ } from '@cdx-ui/utils';
30
+ import { Icon } from '../Icon';
31
+ import { useReorderableRow } from '../ReorderableList/rowContext';
12
32
  import {
13
33
  listItemContentVariants,
14
34
  listItemDescriptionVariants,
35
+ listItemDragHandleVariants,
15
36
  listItemLeadingSlotVariants,
16
37
  listItemMetaVariants,
38
+ listItemPressableRegionVariants,
17
39
  listItemRootVariants,
18
40
  listItemSectionHeaderLabelVariants,
19
41
  listItemSectionHeaderVariants,
@@ -34,6 +56,40 @@ const useListItemStyleContext = (): Pick<ListItemVariantProps, 'crossAlign'> =>
34
56
  // ROOT
35
57
  // =============================================================================
36
58
 
59
+ /**
60
+ * `true` inside a pressable row's interactive element. `ListItem.DragHandle` reads it to warn when it
61
+ * is nested there instead of being a direct child of the row.
62
+ */
63
+ const ListItemPressableContext = createContext(false);
64
+
65
+ interface DragHandlePartition {
66
+ handle: ReactElement;
67
+ position: 'start' | 'end';
68
+ rest: ReactNode[];
69
+ misplaced: boolean;
70
+ extra: boolean;
71
+ }
72
+
73
+ /** Finds a direct-child `ListItem.DragHandle` (matched by identity) of a pressable row. */
74
+ function partitionDragHandle(children: ReactNode): DragHandlePartition | undefined {
75
+ const items = Children.toArray(children);
76
+ const handleIndexes: number[] = [];
77
+ items.forEach((child, index) => {
78
+ if (isValidElement(child) && child.type === ListItemDragHandle) handleIndexes.push(index);
79
+ });
80
+ if (handleIndexes.length === 0) return undefined;
81
+ const [first] = handleIndexes;
82
+ return {
83
+ handle: items[first] as ReactElement,
84
+ position: first === 0 ? 'start' : 'end',
85
+ rest: items.filter((_, index) => !handleIndexes.includes(index)),
86
+ misplaced: first !== 0 && first !== items.length - 1,
87
+ extra: handleIndexes.length > 1,
88
+ };
89
+ }
90
+
91
+ let hasWarnedDragHandlePlacement = false;
92
+
37
93
  export interface ListItemProps extends Omit<IListItemProps, 'crossAlign'>, ListItemVariantProps {
38
94
  /**
39
95
  * Vertical density. `compact` reduces padding and min-height; typography stays the same.
@@ -60,6 +116,13 @@ export interface ListItemProps extends Omit<IListItemProps, 'crossAlign'>, ListI
60
116
  className?: string;
61
117
  }
62
118
 
119
+ /**
120
+ * A pressable row (`onPress`, or `asChild`) with a `ListItem.DragHandle` as its first or last
121
+ * direct child renders the handle beside the pressable element instead of inside it. The handle
122
+ * is matched by identity, so a `memo()` or wrapper component around it is not recognized. Under
123
+ * `asChild`, pass the handle and the single interactive element as siblings:
124
+ * `<ListItem asChild><ListItem.DragHandle /><Link>…</Link></ListItem>`.
125
+ */
63
126
  const ListItemRoot = forwardRef<View, ListItemProps>(
64
127
  (
65
128
  {
@@ -68,6 +131,7 @@ const ListItemRoot = forwardRef<View, ListItemProps>(
68
131
  crossAlign: crossAlignProp = 'center',
69
132
  className,
70
133
  style,
134
+ children,
71
135
  ...props
72
136
  },
73
137
  ref,
@@ -75,22 +139,60 @@ const ListItemRoot = forwardRef<View, ListItemProps>(
75
139
  const crossAlign: ListItemCrossAlign = crossAlignProp ?? 'center';
76
140
  const parent = useParentContext();
77
141
  const ctx = useMemo(() => ({ ...parent, [SCOPE]: { crossAlign } }), [parent, crossAlign]);
142
+ const isDragging = useReorderableRow()?.isDragging ?? false;
143
+ const isPressable = props.onPress != null || !!props.asChild;
144
+ const partition = isPressable ? partitionDragHandle(children) : undefined;
145
+ const misplacedHandle = !!partition && (partition.misplaced || partition.extra);
146
+
147
+ useEffect(() => {
148
+ if (__DEV__ && misplacedHandle && !hasWarnedDragHandlePlacement) {
149
+ hasWarnedDragHandlePlacement = true;
150
+ console.warn(
151
+ '[ListItem] Place one ListItem.DragHandle as the first or last child of a pressable ListItem. A handle elsewhere is moved to the end, and extra handles are dropped.',
152
+ );
153
+ }
154
+ }, [misplacedHandle]);
78
155
 
79
156
  const computedClassName = cn(
80
157
  listItemRootVariants({ size, showSeparator, crossAlign }),
81
158
  className,
82
159
  );
83
160
 
161
+ const splitProps = partition && {
162
+ accessory: (
163
+ <ListItemPressableContext.Provider value={false}>
164
+ {partition.handle}
165
+ </ListItemPressableContext.Provider>
166
+ ),
167
+ accessoryPosition: partition.position,
168
+ pressableClassName: listItemPressableRegionVariants({
169
+ size: size ?? 'default',
170
+ handlePosition: partition.position,
171
+ }),
172
+ };
173
+ const regionChildren =
174
+ partition && props.asChild && partition.rest.length === 1
175
+ ? partition.rest[0]
176
+ : partition?.rest;
177
+
84
178
  return (
85
179
  <ParentContext.Provider value={ctx}>
86
- <ListItemRootPrimitive
87
- ref={ref}
88
- className={computedClassName}
89
- crossAlign={crossAlign}
90
- style={style}
91
- {...props}
92
- {...mergeDataAttributes(props, dataAttributes({ slot: 'list-item' }))}
93
- />
180
+ <ListItemPressableContext.Provider value={isPressable}>
181
+ <ListItemRootPrimitive
182
+ ref={ref}
183
+ className={computedClassName}
184
+ crossAlign={crossAlign}
185
+ style={style}
186
+ {...props}
187
+ {...splitProps}
188
+ {...mergeDataAttributes(
189
+ props,
190
+ dataAttributes({ slot: 'list-item', dragging: isDragging }),
191
+ )}
192
+ >
193
+ {partition ? regionChildren : children}
194
+ </ListItemRootPrimitive>
195
+ </ListItemPressableContext.Provider>
94
196
  </ParentContext.Provider>
95
197
  );
96
198
  },
@@ -263,6 +365,116 @@ const ListItemTrailingSlot = forwardRef<View, ListItemTrailingSlotProps>(
263
365
 
264
366
  ListItemTrailingSlot.displayName = 'ListItem.TrailingSlot';
265
367
 
368
+ function DefaultDragHandleGrip() {
369
+ return <Icon as={DragIndicator} className="size-5 text-content-secondary" />;
370
+ }
371
+
372
+ /**
373
+ * Screen reader hint for the default handle. Web omits it: react-native-web drops
374
+ * `accessibilityHint`, and dnd-kit describes the keyboard controls through `aria-describedby`.
375
+ */
376
+ const DEFAULT_DRAG_HANDLE_HINT = Platform.select<string | undefined>({
377
+ ios: 'Drag to reorder, or swipe up or down to choose a move action.',
378
+ android: 'Drag to reorder, or open the actions menu to move this item.',
379
+ default: undefined,
380
+ });
381
+
382
+ const dragHandleOuterStyle = { flexShrink: 0 as const };
383
+
384
+ let hasWarnedDragHandleOutsideList = false;
385
+ let hasWarnedNestedDragHandle = false;
386
+
387
+ export interface ListItemDragHandleProps extends ViewProps {
388
+ /**
389
+ * Merges the handle onto the consumer's single child (for example an `IconButton`) so that
390
+ * element is the one focusable handle.
391
+ */
392
+ asChild?: boolean;
393
+ className?: string;
394
+ }
395
+
396
+ /**
397
+ * Drag activator for a row rendered by `ReorderableList`. Renders `null` outside a list. On a
398
+ * pressable `ListItem`, place it as the first or last direct child so it sits beside the row's
399
+ * pressable element rather than inside it.
400
+ */
401
+ const ListItemDragHandle = forwardRef<View, ListItemDragHandleProps>(
402
+ (
403
+ {
404
+ asChild,
405
+ className,
406
+ style,
407
+ children,
408
+ accessibilityLabel = 'Reorder',
409
+ accessibilityHint,
410
+ accessibilityActions,
411
+ onAccessibilityAction,
412
+ ...props
413
+ },
414
+ ref,
415
+ ) => {
416
+ const row = useReorderableRow();
417
+ const insidePressable = useContext(ListItemPressableContext);
418
+ const isOutsideList = row === null;
419
+
420
+ useEffect(() => {
421
+ if (!__DEV__) return;
422
+ if (isOutsideList && !hasWarnedDragHandleOutsideList) {
423
+ hasWarnedDragHandleOutsideList = true;
424
+ console.warn(
425
+ '[ListItem.DragHandle] Rendered outside a ReorderableList row, so it renders nothing. Use it inside ReorderableList renderItem.',
426
+ );
427
+ }
428
+ if (insidePressable && !hasWarnedNestedDragHandle) {
429
+ hasWarnedNestedDragHandle = true;
430
+ console.warn(
431
+ "[ListItem.DragHandle] Nested inside a pressable ListItem, so it is part of the row's pressable element. Make it the first or last direct child of ListItem so it renders beside it.",
432
+ );
433
+ }
434
+ }, [isOutsideList, insidePressable]);
435
+
436
+ const handleRef = row?.handle.ref;
437
+ const hostRef = useMemo(() => mergeRefs(ref, handleRef), [ref, handleRef]);
438
+
439
+ if (!row) return null;
440
+
441
+ const { handle } = row;
442
+ const handleProps = {
443
+ ...handle.props,
444
+ accessible: true,
445
+ accessibilityRole: 'button' as const,
446
+ accessibilityLabel,
447
+ accessibilityHint:
448
+ accessibilityHint ??
449
+ (row.accessibilityActions.length > 0 ? DEFAULT_DRAG_HANDLE_HINT : undefined),
450
+ accessibilityActions: [...row.accessibilityActions, ...(accessibilityActions ?? [])],
451
+ onAccessibilityAction: composeEventHandlers(onAccessibilityAction, row.onAccessibilityAction),
452
+ className: cn(listItemDragHandleVariants(), className),
453
+ ...props,
454
+ ...mergeDataAttributes(props, dataAttributes({ slot: 'list-item-drag-handle' })),
455
+ style: [handle.props.style, style],
456
+ };
457
+
458
+ if (asChild) {
459
+ return handle.wrap(
460
+ <Slot ref={hostRef} {...handleProps}>
461
+ {children}
462
+ </Slot>,
463
+ dragHandleOuterStyle,
464
+ );
465
+ }
466
+
467
+ return handle.wrap(
468
+ <View ref={hostRef} {...handleProps}>
469
+ {children ?? <DefaultDragHandleGrip />}
470
+ </View>,
471
+ dragHandleOuterStyle,
472
+ );
473
+ },
474
+ );
475
+
476
+ ListItemDragHandle.displayName = 'ListItem.DragHandle';
477
+
266
478
  const wrapSectionHeaderLabel = (children: ReactNode): ReactNode => {
267
479
  if (typeof children === 'string' || typeof children === 'number') {
268
480
  return <Text className={cn(listItemSectionHeaderLabelVariants())}>{children}</Text>;
@@ -310,11 +522,12 @@ export interface ListItemSectionHeaderProps extends ViewProps {
310
522
  trailing?: ReactNode;
311
523
  /**
312
524
  * Background treatment. `ghost` has no fill and a bottom border; `subtle` adds a neutral fill
313
- * (matching `subtle` on Avatar, Chip, and IconButton) and drops the bottom border.
314
- * 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.
315
528
  * @default 'ghost'
316
- * @remarks `'ghost' | 'subtle'`
317
- * @fumadocsType `'ghost' | 'subtle'`
529
+ * @remarks `'ghost' | 'subtle' | 'gradient'`
530
+ * @fumadocsType `'ghost' | 'subtle' | 'gradient'`
318
531
  */
319
532
  variant?: ListItemSectionHeaderVariant;
320
533
  /**
@@ -367,6 +580,7 @@ ListItemSectionHeader.displayName = 'ListItem.SectionHeader';
367
580
 
368
581
  type ListItemCompound = typeof ListItemRoot & {
369
582
  LeadingSlot: typeof ListItemLeadingSlot;
583
+ DragHandle: typeof ListItemDragHandle;
370
584
  Content: typeof ListItemContent;
371
585
  Title: typeof ListItemTitle;
372
586
  Description: typeof ListItemDescription;
@@ -377,6 +591,7 @@ type ListItemCompound = typeof ListItemRoot & {
377
591
 
378
592
  export const ListItem = Object.assign(ListItemRoot, {
379
593
  LeadingSlot: ListItemLeadingSlot,
594
+ DragHandle: ListItemDragHandle,
380
595
  Content: ListItemContent,
381
596
  Title: ListItemTitle,
382
597
  Description: ListItemDescription,
@@ -389,8 +604,10 @@ export type { ListItemCrossAlign, ListItemSectionHeaderVariantProps, ListItemVar
389
604
  export {
390
605
  listItemContentVariants,
391
606
  listItemDescriptionVariants,
607
+ listItemDragHandleVariants,
392
608
  listItemLeadingSlotVariants,
393
609
  listItemMetaVariants,
610
+ listItemPressableRegionVariants,
394
611
  listItemRootVariants,
395
612
  listItemSectionHeaderLabelVariants,
396
613
  listItemSectionHeaderVariants,
@@ -31,6 +31,10 @@ export const listItemRootVariants = cva(
31
31
  ].join(' '),
32
32
  default: 'data-[active=true]:bg-surface-primary-hover',
33
33
  }),
34
+ 'data-[dragging=true]:bg-surface-secondary',
35
+ // Native: changing the dragged row's zIndex mid-drag cancels the handle's pan on Fabric iOS;
36
+ // the drag engine stacks the active row itself.
37
+ Platform.select({ web: 'data-[dragging=true]:z-20', default: '' }),
34
38
  ],
35
39
  {
36
40
  variants: {
@@ -58,6 +62,37 @@ export const listItemRootVariants = cva(
58
62
  },
59
63
  );
60
64
 
65
+ // ── Pressable region (pressable row with a direct-child DragHandle) ─────────
66
+ //
67
+ // The root becomes a non-interactive container and keeps every visual above: the primitive
68
+ // mirrors the region's hover/active/focus state onto it, so the overlay, focus ring, and native
69
+ // tint still span the whole row. The region itself is transparent; negative margins extend it
70
+ // over the container's padding (and the gap beside the handle) so the hit area matches a row
71
+ // without a handle. A consumer `className` that changes the row's padding is not mirrored here.
72
+
73
+ export const listItemPressableRegionVariants = cva(
74
+ [
75
+ 'relative flex-1 min-w-0 flex-row self-stretch gap-3 bg-transparent',
76
+ Platform.select({ web: 'outline-none', default: '' }),
77
+ ],
78
+ {
79
+ variants: {
80
+ size: {
81
+ default: '-my-3 py-3',
82
+ compact: '-my-2 py-2',
83
+ },
84
+ handlePosition: {
85
+ start: '-ms-3 ps-3 -me-5 pe-5',
86
+ end: '-ms-5 ps-5 -me-3 pe-3',
87
+ },
88
+ },
89
+ defaultVariants: {
90
+ size: 'default',
91
+ handlePosition: 'start',
92
+ },
93
+ },
94
+ );
95
+
61
96
  // ── Leading / trailing slots ─────────────────────────────────────────────────
62
97
 
63
98
  export const listItemLeadingSlotVariants = cva([
@@ -79,6 +114,11 @@ export const listItemTrailingSlotVariants = cva(
79
114
  },
80
115
  );
81
116
 
117
+ export const listItemDragHandleVariants = cva([
118
+ 'relative z-10 flex shrink-0 self-stretch items-center justify-center',
119
+ 'web:cursor-grab web:active:cursor-grabbing',
120
+ ]);
121
+
82
122
  // ── Content stack (title / description / meta) ───────────────────────────────
83
123
 
84
124
  export const listItemContentVariants = cva('relative z-10 flex min-w-0 flex-1 flex-col gap-1', {
@@ -114,6 +154,7 @@ export const listItemSectionHeaderVariants = cva(
114
154
  ghost: [],
115
155
  // The fill separates the header from its rows, so the bottom border is dropped.
116
156
  subtle: 'bg-surface-neutral-subtle border-b-0',
157
+ gradient: 'bg-gradient-to-r from-surface-primary to-surface-brand-tint',
117
158
  },
118
159
  showDivider: {
119
160
  true: ['border-t-4 border-solid border-t-surface-brand-strong/40', 'border-x-0'],