@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
@@ -0,0 +1,112 @@
1
+ # Divider (https://design.candescent.com/docs/components/divider)
2
+
3
+ Resources: [Figma](https://www.figma.com/design/0lEVMVlLj8ZS4fgItr3pmd/%E2%AD%90-Forge-DS--Components?node-id=6771-8895), [Storybook](https://victorious-wave-0daadf00f.6.azurestaticapps.net/?path=/story/layout-divider--default)
4
+
5
+ `Divider` visually separates related groups of content.
6
+
7
+ ```tsx
8
+ import { Divider } from '@cdx-ui/components';
9
+ ```
10
+
11
+ ## Basic
12
+
13
+ Use a horizontal divider to separate stacked sections.
14
+
15
+ ```tsx
16
+ import { Divider, VStack } from '@cdx-ui/components';
17
+
18
+ export default function DividerBasicDemo() {
19
+ return (
20
+ <VStack space="xl" className="w-full">
21
+ <Divider />
22
+ <Divider />
23
+ <Divider />
24
+ </VStack>
25
+ );
26
+ }
27
+ ```
28
+
29
+ ## With label
30
+
31
+ Add `Divider.Label` to place text between two line segments. Labeled dividers must use this sub-component so the label receives the correct typography and accessibility treatment.
32
+
33
+ ```tsx
34
+ import { Divider, VStack } from '@cdx-ui/components';
35
+
36
+ export default function DividerWithLabelDemo() {
37
+ return (
38
+ <VStack space="xl" className="w-full">
39
+ <Divider>
40
+ <Divider.Label>or</Divider.Label>
41
+ </Divider>
42
+ <Divider>
43
+ <Divider.Label>More options</Divider.Label>
44
+ </Divider>
45
+ </VStack>
46
+ );
47
+ }
48
+ ```
49
+
50
+ ## Vertical
51
+
52
+ Set `vertical` to separate content arranged side by side. The parent must provide an explicit height so the divider can stretch.
53
+
54
+ ```tsx
55
+ import { Box, Divider, HStack, Text } from '@cdx-ui/components';
56
+
57
+ export default function DividerVerticalDemo() {
58
+ return (
59
+ <HStack className="h-40 w-full items-stretch">
60
+ <Box className="flex-1 items-center justify-center">
61
+ <Text>Checking</Text>
62
+ </Box>
63
+ <Divider vertical>
64
+ <Divider.Label>or</Divider.Label>
65
+ </Divider>
66
+ <Box className="flex-1 items-center justify-center">
67
+ <Text>Savings</Text>
68
+ </Box>
69
+ </HStack>
70
+ );
71
+ }
72
+ ```
73
+
74
+ ## API
75
+
76
+ ### Divider
77
+
78
+ | Prop | Type | Default | Description |
79
+ | --- | --- | --- | --- |
80
+ | `className?` | `string` | — | — |
81
+ | `children?` | `ReactNode` | — | When present, splits the divider into line, content, line. Use `Divider.Label` so the label receives the correct typography and accessibility treatment. |
82
+ | `vertical?` | `boolean` | — | Renders a vertical divider instead of the default horizontal orientation. |
83
+
84
+ Inherits all [`ViewProps`](https://reactnative.dev/docs/view#props). The default orientation is horizontal.
85
+
86
+ ## Sub-components
87
+
88
+ ### Divider.Label
89
+
90
+ Text displayed between the divider's two line segments.
91
+
92
+ | Prop | Type | Default | Description |
93
+ | --- | --- | --- | --- |
94
+ | `className?` | `string` | — | Additional Uniwind/Tailwind classes, merged after the text's own styles. |
95
+ | `children?` | `ReactNode` | — | Text content, which may include nested `Text` elements. |
96
+ | `asChild?` | `boolean` | — | Renders the consumer's child element in place of the default `Text` host. |
97
+
98
+ Inherits all [`TextProps`](https://reactnative.dev/docs/text#props).
99
+
100
+ ## Accessibility
101
+
102
+ An unlabeled divider is decorative and hidden from the accessibility tree. For a labeled divider, the line segments are hidden while the label remains available to screen readers.
103
+
104
+ `Divider` does not define a semantic section boundary. Use a heading or landmark role when content needs programmatic grouping.
105
+
106
+ ## When to use
107
+
108
+ | Component | Use for |
109
+ | -------------------------- | ------------------------------------------------------------ |
110
+ | `Divider` | Section breaks, login "or" separators, toolbar groups |
111
+ | `ListItem` `showSeparator` | Bottom border between list rows |
112
+ | `ListItem.SectionHeader` | Dated or grouped list section headings with an accent border |
@@ -0,0 +1,436 @@
1
+ # Drawer (https://design.candescent.com/docs/components/drawer)
2
+
3
+ Resources: [Figma](https://www.figma.com/design/0lEVMVlLj8ZS4fgItr3pmd/%E2%AD%90-Forge-DS--Components?node-id=9956-15204), [Storybook](https://victorious-wave-0daadf00f.6.azurestaticapps.net/?path=/story/overlays-drawer--default)
4
+
5
+ A compound panel with permanent and modal presentations. Both share the same header, content, and
6
+ footer anatomy. `variant` only changes how the panel appears on the page. Both variants attach to
7
+ an edge through `placement` (`left`, `right`, `top`, `bottom`); the default is `right`.
8
+
9
+ ```tsx
10
+ import { Drawer } from '@cdx-ui/components';
11
+ ```
12
+
13
+ > [!NOTE]
14
+ >
15
+ > **Portal host**
16
+ >
17
+ > Modal drawers portal `Drawer.Header`, `Drawer.Content`, and `Drawer.Footer` automatically.
18
+ > `ForgeDesignProvider` mounts the shared portal host; otherwise mount one `PortalHost` from
19
+ > `@cdx-ui/primitives` near your app root.
20
+
21
+ ## Basic
22
+
23
+ Modal drawers overlay the page from the chosen edge with a backdrop. Clicking the backdrop, the
24
+ header close control, or pressing Escape closes the drawer. Open them with `isOpen` /
25
+ `onOpenChange` — there is no trigger slot in Figma.
26
+
27
+ ```tsx
28
+ import { useState } from 'react';
29
+ import { Button, Drawer, Text } from '@cdx-ui/components';
30
+
31
+ export default function DrawerBasicDemo() {
32
+ const [open, setOpen] = useState(false);
33
+
34
+ return (
35
+ <>
36
+ <Button onPress={() => setOpen(true)}>
37
+ <Button.Label>Open drawer</Button.Label>
38
+ </Button>
39
+ <Drawer variant="modal" isOpen={open} onOpenChange={setOpen} size="default">
40
+ <Drawer.Header>
41
+ <Drawer.Title>Filter accounts</Drawer.Title>
42
+ <Drawer.Description>Choose which accounts appear in this view.</Drawer.Description>
43
+ </Drawer.Header>
44
+ <Drawer.Content>
45
+ <Text>Drawer body content stays scrollable when it exceeds the panel height.</Text>
46
+ </Drawer.Content>
47
+ <Drawer.Footer>
48
+ <Button variant="ghost" onPress={() => setOpen(false)}>
49
+ <Button.Label>Cancel</Button.Label>
50
+ </Button>
51
+ <Button onPress={() => setOpen(false)}>
52
+ <Button.Label>Apply</Button.Label>
53
+ </Button>
54
+ </Drawer.Footer>
55
+ </Drawer>
56
+ </>
57
+ );
58
+ }
59
+ ```
60
+
61
+ ## Permanent rail
62
+
63
+ Use `variant="permanent"` for an in-layout rail that pushes sibling content aside. Place a
64
+ left or right drawer next to a `flex-1` main region in a horizontal row (drawer after the main
65
+ region for `right`, before it for `left`). Place a top or bottom drawer in a vertical column.
66
+ There is no overlay; the header close control still dismisses the rail.
67
+
68
+ ```tsx
69
+ import { Box, Button, Drawer, Text } from '@cdx-ui/components';
70
+
71
+ export default function DrawerPermanentDemo() {
72
+ return (
73
+ <Box className="h-[360px] flex-row border border-stroke-secondary">
74
+ <Box className="flex-1 items-center justify-center gap-4 p-4">
75
+ <Text>Main content area</Text>
76
+ <Button variant="outline">
77
+ <Button.Label>Primary action</Button.Label>
78
+ </Button>
79
+ </Box>
80
+ <Drawer variant="permanent" size="small">
81
+ <Drawer.Header showSeparator={false}>
82
+ <Drawer.Title>Accounts</Drawer.Title>
83
+ </Drawer.Header>
84
+ <Drawer.Content>
85
+ <Text size="sm" color="secondary">
86
+ Checking
87
+ </Text>
88
+ <Text size="sm" color="secondary">
89
+ Savings
90
+ </Text>
91
+ <Text size="sm" color="secondary">
92
+ Credit card
93
+ </Text>
94
+ </Drawer.Content>
95
+ </Drawer>
96
+ </Box>
97
+ );
98
+ }
99
+ ```
100
+
101
+ ## Sizes
102
+
103
+ Panel width follows the `size` variant on left and right: `small` (240px), `default` (360px), and
104
+ `large` (480px), capped at the viewport. On top and bottom the same tokens map to height.
105
+
106
+ ```tsx
107
+ import { Box, Drawer, Text } from '@cdx-ui/components';
108
+
109
+ const sizeLabels = {
110
+ small: '240px',
111
+ default: '360px',
112
+ large: '480px',
113
+ } as const;
114
+
115
+ export default function DrawerSizesDemo() {
116
+ return (
117
+ <Box className="gap-4">
118
+ {(Object.keys(sizeLabels) as (keyof typeof sizeLabels)[]).map((size) => (
119
+ <Drawer key={size} variant="permanent" size={size} className="h-[120px]">
120
+ <Drawer.Header showSeparator={false}>
121
+ <Drawer.Title>{size}</Drawer.Title>
122
+ </Drawer.Header>
123
+ <Drawer.Content>
124
+ <Text size="sm" color="secondary">
125
+ {sizeLabels[size]}
126
+ </Text>
127
+ </Drawer.Content>
128
+ </Drawer>
129
+ ))}
130
+ </Box>
131
+ );
132
+ }
133
+ ```
134
+
135
+ ## Placement
136
+
137
+ Set `placement` to open the panel from `left`, `right`, `top`, or `bottom`. The most common case is
138
+ `right`, which is the default.
139
+
140
+ ```tsx
141
+ import { useState } from 'react';
142
+ import { Box, Button, Drawer, Text, type DrawerPlacement } from '@cdx-ui/components';
143
+
144
+ const placements: DrawerPlacement[] = ['left', 'right', 'top', 'bottom'];
145
+
146
+ export default function DrawerSidesDemo() {
147
+ const [open, setOpen] = useState(false);
148
+ const [placement, setPlacement] = useState<DrawerPlacement>('right');
149
+
150
+ return (
151
+ <>
152
+ <Box className="flex-row flex-wrap gap-2">
153
+ {placements.map((value) => (
154
+ <Button
155
+ key={value}
156
+ variant="outline"
157
+ onPress={() => {
158
+ setPlacement(value);
159
+ setOpen(true);
160
+ }}
161
+ >
162
+ <Button.Label>{value}</Button.Label>
163
+ </Button>
164
+ ))}
165
+ </Box>
166
+ <Drawer
167
+ variant="modal"
168
+ isOpen={open}
169
+ onOpenChange={setOpen}
170
+ placement={placement}
171
+ size="default"
172
+ >
173
+ <Drawer.Header>
174
+ <Drawer.Title>{placement} drawer</Drawer.Title>
175
+ <Drawer.Description>The panel attaches to this edge of the viewport.</Drawer.Description>
176
+ </Drawer.Header>
177
+ <Drawer.Content>
178
+ <Text>Default is right. Size maps to width on left/right and height on top/bottom.</Text>
179
+ </Drawer.Content>
180
+ <Drawer.Footer>
181
+ <Button variant="ghost" onPress={() => setOpen(false)}>
182
+ <Button.Label>Close</Button.Label>
183
+ </Button>
184
+ </Drawer.Footer>
185
+ </Drawer>
186
+ </>
187
+ );
188
+ }
189
+ ```
190
+
191
+ ## Full bleed content
192
+
193
+ Set `fullBleed` on `Drawer.Content` to remove horizontal padding for edge-to-edge lists, dividers, or imagery.
194
+
195
+ ```tsx
196
+ import { Box, Drawer, Text } from '@cdx-ui/components';
197
+
198
+ export default function DrawerFullBleedDemo() {
199
+ return (
200
+ <Box className="h-[280px] flex-row border border-stroke-secondary">
201
+ <Drawer variant="permanent" size="default">
202
+ <Drawer.Header>
203
+ <Drawer.Title>Recent activity</Drawer.Title>
204
+ </Drawer.Header>
205
+ <Drawer.Content fullBleed>
206
+ <Box className="border-b border-stroke-secondary px-4 py-3">
207
+ <Text size="sm">Coffee shop</Text>
208
+ </Box>
209
+ <Box className="border-b border-stroke-secondary px-4 py-3">
210
+ <Text size="sm">Direct deposit</Text>
211
+ </Box>
212
+ <Box className="px-4 py-3">
213
+ <Text size="sm">Transfer to savings</Text>
214
+ </Box>
215
+ </Drawer.Content>
216
+ </Drawer>
217
+ </Box>
218
+ );
219
+ }
220
+ ```
221
+
222
+ ## Header variants
223
+
224
+ Compose `Drawer.LeadingSlot`, `Drawer.Title`, and `Drawer.Description` directly inside
225
+ `Drawer.Header`. The header places the leading slot first, stacks the title and description, and
226
+ adds a close control at the end. Set `close={null}` to remove it.
227
+
228
+ ```tsx
229
+ import { FilterList } from '@cdx-ui/icons';
230
+ import { Box, Drawer, Icon, Text } from '@cdx-ui/components';
231
+
232
+ export default function DrawerHeaderVariantsDemo() {
233
+ return (
234
+ <Box className="gap-4">
235
+ <Drawer variant="permanent" size="default" className="h-[160px]">
236
+ <Drawer.Header>
237
+ <Drawer.LeadingSlot>
238
+ <Icon as={FilterList} size={24} />
239
+ </Drawer.LeadingSlot>
240
+ <Drawer.Title>Filter accounts</Drawer.Title>
241
+ <Drawer.Description>Choose which accounts appear in this view.</Drawer.Description>
242
+ </Drawer.Header>
243
+ <Drawer.Content>
244
+ <Text size="sm" color="secondary">
245
+ Leading slot, text column, and the default close control.
246
+ </Text>
247
+ </Drawer.Content>
248
+ </Drawer>
249
+ <Drawer variant="permanent" size="default" className="h-[120px]">
250
+ <Drawer.Header close={null}>
251
+ <Drawer.Title>Accounts</Drawer.Title>
252
+ </Drawer.Header>
253
+ <Drawer.Content>
254
+ <Text size="sm" color="secondary">
255
+ No close control.
256
+ </Text>
257
+ </Drawer.Content>
258
+ </Drawer>
259
+ </Box>
260
+ );
261
+ }
262
+ ```
263
+
264
+ ## API
265
+
266
+ ### Drawer
267
+
268
+ Controls open state, dismissal behavior, size, and variant for the compound component.
269
+
270
+ | Prop | Type | Default | Description |
271
+ | --- | --- | --- | --- |
272
+ | `className?` | `string` | — | — |
273
+ | `children` | `ReactNode` | — | — |
274
+ | `size?` | `'small' \| 'default' \| 'large' \| null` | — | — |
275
+ | `variant?` | `'permanent' \| 'modal' \| null` | — | — |
276
+ | `placement?` | `'left' \| 'right' \| 'top' \| 'bottom'` | `'right'` | Edge the panel attaches to. Applies to both `modal` and `permanent`. |
277
+ | `fullBleed?` | `boolean` | — | — |
278
+ | `animation?` | `'disable-all'` | — | — |
279
+ | `zIndex?` | `number` | — | Stacking order for the modal overlay layer (backdrop + panel). Defaults to {@link MODAL_OVERLAY_Z_INDEX} (10000). |
280
+ | `isOpen?` | `boolean` | — | Controlled open state. Use `defaultOpen` for the uncontrolled variant. |
281
+ | `onOpenChange?` | `((open: boolean) => void)` | — | — |
282
+ | `defaultOpen?` | `boolean` | — | — |
283
+ | `closeOnBackdropPress?` | `boolean` | — | — |
284
+ | `closeOnEscKey?` | `boolean` | — | — |
285
+
286
+ Inherits all [`ViewProps`](https://reactnative.dev/docs/view#props), except `children` and `role`.
287
+
288
+ | Attribute | Value | Description |
289
+ | ----------- | -------- | ------------ |
290
+ | `data-slot` | `drawer` | Root element |
291
+
292
+ ## Sub-components
293
+
294
+ ### Drawer.Header
295
+
296
+ Fixed top region. Place `Drawer.LeadingSlot`, `Drawer.Title`, and `Drawer.Description` as direct
297
+ children. Whatever the JSX order, the header renders the first leading slot, then a column holding
298
+ every other child, then the close control. It renders a default `Drawer.Close` unless you compose
299
+ one yourself. Pass a node to `close` to replace it, or `close={null}` to remove it. `asChild`
300
+ renders the child unchanged, with no close control.
301
+
302
+ `Drawer.LeadingSlot` and `Drawer.Close` are matched by component identity. Wrapping either in
303
+ `memo()`, an HOC, or a custom component moves it into the text column. Extra leading slots or close
304
+ controls are not rendered.
305
+
306
+ | Prop | Type | Default | Description |
307
+ | --- | --- | --- | --- |
308
+ | `className?` | `string` | — | — |
309
+ | `children?` | `ReactNode` | — | — |
310
+ | `showSeparator?` | `boolean \| null` | — | — |
311
+ | `asChild?` | `boolean` | — | Substitute the header element with the single child. The child is rendered unchanged: no row partition and no close control are applied, and `close` is ignored. |
312
+ | `close?` | `ReactNode` | — | Close control rendered at the end of the row. - omitted: renders a composed `Drawer.Close` child if present, otherwise a default `<Drawer.Close />` - `null`: renders no close control - a node: rendered in place of the default and any `Drawer.Close` child |
313
+
314
+ Inherits all [`ViewProps`](https://reactnative.dev/docs/view#props).
315
+
316
+ ### Drawer.LeadingSlot
317
+
318
+ Optional leading region in the header (icon or custom content). Place it as a direct child of
319
+ `Drawer.Header`. Hidden from the accessibility tree by default.
320
+
321
+ | Prop | Type | Default | Description |
322
+ | --- | --- | --- | --- |
323
+ | `className?` | `string` | — | — |
324
+ | `children?` | `ReactNode` | — | — |
325
+ | `asChild?` | `boolean` | — | — |
326
+
327
+ Inherits all [`ViewProps`](https://reactnative.dev/docs/view#props).
328
+
329
+ ### Drawer.Close
330
+
331
+ Dismiss control. `Drawer.Header` renders one by default. Compose it yourself to change its props,
332
+ such as a more specific `accessibilityLabel` (default `"Close"`) or custom children in place of the
333
+ close icon. Closes modal and permanent drawers through `onOpenChange(false)`. Modal drawers also
334
+ close when the backdrop is pressed (`closeOnBackdropPress`, default `true`).
335
+
336
+ | Prop | Type | Default | Description |
337
+ | --- | --- | --- | --- |
338
+ | `className?` | `string` | — | — |
339
+ | `children?` | `ReactNode` | — | Replaces the default close glyph. |
340
+ | `accessibilityLabel?` | `string` | — | Overrides the text that's read by the screen reader when the user interacts with the element. By default, the label is constructed by traversing all the children and accumulating all the Text nodes separated by space. |
341
+ | `asChild?` | `boolean` | — | — |
342
+
343
+ Inherits all [`PressableProps`](https://reactnative.dev/docs/pressable#props).
344
+
345
+ ### Drawer.Title
346
+
347
+ Heading announced when the modal drawer opens.
348
+
349
+ | Prop | Type | Default | Description |
350
+ | --- | --- | --- | --- |
351
+ | `className?` | `string` | — | — |
352
+ | `children?` | `ReactNode` | — | — |
353
+ | `asChild?` | `boolean` | — | — |
354
+
355
+ Inherits all [`TextProps`](https://reactnative.dev/docs/text#props).
356
+
357
+ ### Drawer.Description
358
+
359
+ Secondary text linked to the panel through `aria-describedby` on modal drawers.
360
+
361
+ | Prop | Type | Default | Description |
362
+ | --- | --- | --- | --- |
363
+ | `className?` | `string` | — | — |
364
+ | `children?` | `ReactNode` | — | — |
365
+ | `asChild?` | `boolean` | — | — |
366
+
367
+ Inherits all [`TextProps`](https://reactnative.dev/docs/text#props).
368
+
369
+ ### Drawer.Content
370
+
371
+ Scrollable content region between the header and footer. Matches the Figma `Drawer.Content` slot. Set `fullBleed` to remove horizontal padding.
372
+
373
+ | Prop | Type | Default | Description |
374
+ | --- | --- | --- | --- |
375
+ | `className?` | `string` | — | — |
376
+ | `children?` | `ReactNode` | — | — |
377
+ | `contentClassName?` | `string` | — | — |
378
+ | `fullBleed?` | `boolean` | — | — |
379
+
380
+ Inherits all [`ScrollViewProps`](https://reactnative.dev/docs/scrollview#props).
381
+
382
+ ### Drawer.Footer
383
+
384
+ Action row below the content. Layout stacks vertically below 600px viewport width and aligns horizontally on wider viewports unless `layout` is set.
385
+
386
+ | Prop | Type | Default | Description |
387
+ | --- | --- | --- | --- |
388
+ | `className?` | `string` | — | — |
389
+ | `children?` | `ReactNode` | — | — |
390
+ | `showSeparator?` | `boolean \| null` | — | — |
391
+ | `direction?` | `'row' \| 'column'` | — | — |
392
+ | `asChild?` | `boolean` | — | — |
393
+
394
+ Inherits all [`ViewProps`](https://reactnative.dev/docs/view#props).
395
+
396
+ ## Hook
397
+
398
+ ### useDrawer
399
+
400
+ Returns the nearest modal drawer's state and dismissal configuration:
401
+
402
+ ```tsx
403
+ const { open, onOpenChange } = useDrawer();
404
+ ```
405
+
406
+ ## Anatomy
407
+
408
+ | `data-slot` | Element |
409
+ | -------------------- | ------------------------------------- |
410
+ | `drawer` | Root panel (permanent) or modal shell |
411
+ | `drawer-overlay` | Modal backdrop scrim |
412
+ | `drawer-header` | Header region |
413
+ | `drawer-leading` | Optional header leading slot |
414
+ | `drawer-title` | Title text |
415
+ | `drawer-description` | Description text |
416
+ | `drawer-close` | Header dismiss control |
417
+ | `drawer-content` | Scrollable body region |
418
+ | `drawer-footer` | Footer actions |
419
+
420
+ ## Accessibility
421
+
422
+ - Modal drawers receive `aria-modal`, `aria-labelledby`, and `aria-describedby` relationships automatically.
423
+ - Focus moves into the panel, remains trapped while open, and returns to the previously focused element after close.
424
+ - Escape closes the modal drawer on web when `closeOnEscKey` is enabled.
425
+ - Android's hardware back button closes the modal drawer.
426
+ - Permanent drawers stay in layout, do not trap focus, and do not render an overlay.
427
+
428
+ ## Constraints
429
+
430
+ - A shared `PortalHost` must be mounted once near the app root. `ForgeDesignProvider` includes one.
431
+ - Modal drawers portal Figma slots automatically. Do not wrap them in `Dialog.Popup` or a custom portal.
432
+ - Modal drawers slide in from `placement` using transform only.
433
+ - Permanent left/right drawers sit in a horizontal flex row next to a `flex-1` sibling. Permanent
434
+ top/bottom drawers sit in a vertical flex column next to a `flex-1` sibling.
435
+ - Permanent drawers are for wide layouts (desktop, tablet, landscape). On a phone they consume
436
+ most of the viewport (`small` is 240px). Use `variant="modal"` on small screens.