@delacour/react-native-ui 0.1.0-alpha.4 → 0.2.0-alpha.20261010061731

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 (493) hide show
  1. package/README.md +10 -6
  2. package/package.json +49 -5
  3. package/src/components/accordion/AGENTS.md +21 -9
  4. package/src/components/accordion/accordion-content.tsx +7 -4
  5. package/src/components/accordion/accordion-item.tsx +15 -13
  6. package/src/components/accordion/accordion.context.tsx +11 -5
  7. package/src/components/accordion/accordion.variants.test.ts +64 -3
  8. package/src/components/accordion/accordion.variants.ts +33 -9
  9. package/src/components/alert/AGENTS.md +102 -0
  10. package/src/components/alert/alert-action.tsx +17 -0
  11. package/src/components/alert/alert-close-button.tsx +50 -0
  12. package/src/components/alert/alert-content.tsx +15 -0
  13. package/src/components/alert/alert-description.tsx +16 -0
  14. package/src/components/alert/alert-glyphs.ts +25 -0
  15. package/src/components/alert/alert-indicator.tsx +40 -0
  16. package/src/components/alert/alert-title.tsx +18 -0
  17. package/src/components/alert/alert.context.tsx +69 -0
  18. package/src/components/alert/alert.tsx +160 -0
  19. package/src/components/alert/alert.types.ts +10 -0
  20. package/src/components/alert/alert.variants.test.ts +218 -0
  21. package/src/components/alert/alert.variants.ts +180 -0
  22. package/src/components/alert/index.ts +23 -0
  23. package/src/components/avatar/AGENTS.md +106 -0
  24. package/src/components/avatar/avatar-badge.tsx +51 -0
  25. package/src/components/avatar/avatar-group.tsx +139 -0
  26. package/src/components/avatar/avatar.context.tsx +93 -0
  27. package/src/components/avatar/avatar.tsx +201 -0
  28. package/src/components/avatar/avatar.utils.test.ts +174 -0
  29. package/src/components/avatar/avatar.utils.ts +141 -0
  30. package/src/components/avatar/avatar.variants.test.ts +251 -0
  31. package/src/components/avatar/avatar.variants.ts +270 -0
  32. package/src/components/avatar/index.ts +39 -0
  33. package/src/components/badge/AGENTS.md +10 -0
  34. package/src/components/badge/badge-close-button.tsx +2 -2
  35. package/src/components/badge/badge.context.tsx +2 -1
  36. package/src/components/badge/badge.tsx +13 -4
  37. package/src/components/badge/badge.variants.test.ts +26 -0
  38. package/src/components/badge/badge.variants.ts +21 -0
  39. package/src/components/bottom-sheet/AGENTS.md +186 -231
  40. package/src/components/bottom-sheet/bottom-sheet-background.tsx +31 -22
  41. package/src/components/bottom-sheet/bottom-sheet-close.tsx +23 -30
  42. package/src/components/bottom-sheet/bottom-sheet-container.tsx +54 -208
  43. package/src/components/bottom-sheet/bottom-sheet-content.tsx +25 -48
  44. package/src/components/bottom-sheet/bottom-sheet-description.tsx +8 -2
  45. package/src/components/bottom-sheet/bottom-sheet-flat-list.tsx +65 -0
  46. package/src/components/bottom-sheet/bottom-sheet-footer.tsx +53 -122
  47. package/src/components/bottom-sheet/bottom-sheet-handle.tsx +31 -26
  48. package/src/components/bottom-sheet/bottom-sheet-legend-list.tsx +69 -0
  49. package/src/components/bottom-sheet/bottom-sheet-overlay.tsx +25 -147
  50. package/src/components/bottom-sheet/bottom-sheet-provider.tsx +42 -0
  51. package/src/components/bottom-sheet/bottom-sheet-scroll-view.tsx +38 -62
  52. package/src/components/bottom-sheet/bottom-sheet-section-list.tsx +58 -0
  53. package/src/components/bottom-sheet/bottom-sheet-steps.tsx +88 -0
  54. package/src/components/bottom-sheet/bottom-sheet-text-input.tsx +44 -0
  55. package/src/components/bottom-sheet/bottom-sheet-title.tsx +12 -8
  56. package/src/components/bottom-sheet/bottom-sheet-trigger.tsx +19 -37
  57. package/src/components/bottom-sheet/bottom-sheet.tsx +113 -60
  58. package/src/components/bottom-sheet/bottom-sheet.variants.test.ts +47 -87
  59. package/src/components/bottom-sheet/bottom-sheet.variants.ts +50 -126
  60. package/src/components/bottom-sheet/index.ts +39 -17
  61. package/src/components/bottom-sheet/use-bottom-sheet-input.ts +16 -115
  62. package/src/components/button/AGENTS.md +51 -11
  63. package/src/components/button/button-group.tsx +44 -8
  64. package/src/components/button/button.context.tsx +10 -0
  65. package/src/components/button/button.tsx +7 -1
  66. package/src/components/button/button.variants.test.ts +190 -0
  67. package/src/components/button/button.variants.ts +87 -6
  68. package/src/components/button/index.ts +2 -0
  69. package/src/components/calendar/AGENTS.md +142 -0
  70. package/src/components/calendar/calendar-caption.tsx +116 -0
  71. package/src/components/calendar/calendar-day.tsx +103 -0
  72. package/src/components/calendar/calendar-grid.tsx +183 -0
  73. package/src/components/calendar/calendar-header.tsx +34 -0
  74. package/src/components/calendar/calendar-nav.tsx +51 -0
  75. package/src/components/calendar/calendar-picker.tsx +128 -0
  76. package/src/components/calendar/calendar-weekdays.tsx +48 -0
  77. package/src/components/calendar/calendar.context.tsx +108 -0
  78. package/src/components/calendar/calendar.date.test.ts +456 -0
  79. package/src/components/calendar/calendar.date.ts +584 -0
  80. package/src/components/calendar/calendar.tsx +389 -0
  81. package/src/components/calendar/calendar.types.ts +87 -0
  82. package/src/components/calendar/calendar.variants.test.ts +363 -0
  83. package/src/components/calendar/calendar.variants.ts +426 -0
  84. package/src/components/calendar/index.ts +96 -0
  85. package/src/components/card/AGENTS.md +92 -0
  86. package/src/components/card/card-action.tsx +16 -0
  87. package/src/components/card/card-content.tsx +12 -0
  88. package/src/components/card/card-description.tsx +12 -0
  89. package/src/components/card/card-footer.tsx +30 -0
  90. package/src/components/card/card-header.tsx +45 -0
  91. package/src/components/card/card-title.tsx +25 -0
  92. package/src/components/card/card.context.tsx +64 -0
  93. package/src/components/card/card.tsx +100 -0
  94. package/src/components/card/card.types.ts +13 -0
  95. package/src/components/card/card.variants.test.ts +240 -0
  96. package/src/components/card/card.variants.ts +177 -0
  97. package/src/components/card/index.ts +15 -0
  98. package/src/components/chart/AGENTS.md +8 -0
  99. package/src/components/chart/chart.tsx +8 -1
  100. package/src/components/chip/AGENTS.md +113 -0
  101. package/src/components/chip/chip-close-button.tsx +48 -0
  102. package/src/components/chip/chip-end-content.tsx +15 -0
  103. package/src/components/chip/chip-label.tsx +21 -0
  104. package/src/components/chip/chip-start-content.tsx +16 -0
  105. package/src/components/chip/chip.context.tsx +66 -0
  106. package/src/components/chip/chip.tsx +268 -0
  107. package/src/components/chip/chip.types.ts +10 -0
  108. package/src/components/chip/chip.variants.test.ts +335 -0
  109. package/src/components/chip/chip.variants.ts +321 -0
  110. package/src/components/chip/index.ts +24 -0
  111. package/src/components/collapsible/AGENTS.md +97 -0
  112. package/src/components/collapsible/collapsible-content.tsx +97 -0
  113. package/src/components/collapsible/collapsible-description.tsx +17 -0
  114. package/src/components/collapsible/collapsible-indicator.tsx +92 -0
  115. package/src/components/collapsible/collapsible-title.tsx +17 -0
  116. package/src/components/collapsible/collapsible-trigger.tsx +133 -0
  117. package/src/components/collapsible/collapsible.context.tsx +91 -0
  118. package/src/components/collapsible/collapsible.tsx +167 -0
  119. package/src/components/collapsible/collapsible.types.ts +9 -0
  120. package/src/components/collapsible/collapsible.variants.test.ts +338 -0
  121. package/src/components/collapsible/collapsible.variants.ts +228 -0
  122. package/src/components/collapsible/index.ts +32 -0
  123. package/src/components/context-menu/AGENTS.md +103 -0
  124. package/src/components/context-menu/context-menu-content.tsx +64 -0
  125. package/src/components/context-menu/context-menu-item.tsx +22 -0
  126. package/src/components/context-menu/context-menu-preview.tsx +60 -0
  127. package/src/components/context-menu/context-menu-trigger.tsx +160 -0
  128. package/src/components/context-menu/context-menu.context.tsx +91 -0
  129. package/src/components/context-menu/context-menu.tsx +90 -0
  130. package/src/components/context-menu/context-menu.variants.test.ts +266 -0
  131. package/src/components/context-menu/context-menu.variants.ts +147 -0
  132. package/src/components/context-menu/index.ts +18 -0
  133. package/src/components/dialog/AGENTS.md +97 -0
  134. package/src/components/dialog/dialog-body.tsx +21 -0
  135. package/src/components/dialog/dialog-close.tsx +82 -0
  136. package/src/components/dialog/dialog-content.tsx +153 -0
  137. package/src/components/dialog/dialog-description.tsx +23 -0
  138. package/src/components/dialog/dialog-footer.tsx +32 -0
  139. package/src/components/dialog/dialog-header.tsx +20 -0
  140. package/src/components/dialog/dialog-title.tsx +42 -0
  141. package/src/components/dialog/dialog-trigger.tsx +54 -0
  142. package/src/components/dialog/dialog.context.tsx +90 -0
  143. package/src/components/dialog/dialog.tsx +119 -0
  144. package/src/components/dialog/dialog.variants.test.ts +224 -0
  145. package/src/components/dialog/dialog.variants.ts +173 -0
  146. package/src/components/dialog/index.ts +30 -0
  147. package/src/components/drawer/AGENTS.md +123 -0
  148. package/src/components/drawer/drawer-body.tsx +46 -0
  149. package/src/components/drawer/drawer-close.tsx +76 -0
  150. package/src/components/drawer/drawer-content.tsx +186 -0
  151. package/src/components/drawer/drawer-description.tsx +23 -0
  152. package/src/components/drawer/drawer-footer.tsx +21 -0
  153. package/src/components/drawer/drawer-header.tsx +42 -0
  154. package/src/components/drawer/drawer-title.tsx +35 -0
  155. package/src/components/drawer/drawer-trigger.tsx +54 -0
  156. package/src/components/drawer/drawer.context.tsx +114 -0
  157. package/src/components/drawer/drawer.tsx +119 -0
  158. package/src/components/drawer/drawer.variants.test.ts +392 -0
  159. package/src/components/drawer/drawer.variants.ts +244 -0
  160. package/src/components/drawer/index.ts +41 -0
  161. package/src/components/drawer/use-drawer-pan.ts +108 -0
  162. package/src/components/empty-state/AGENTS.md +90 -0
  163. package/src/components/empty-state/empty-state-content.tsx +17 -0
  164. package/src/components/empty-state/empty-state-description.tsx +12 -0
  165. package/src/components/empty-state/empty-state-header.tsx +17 -0
  166. package/src/components/empty-state/empty-state-media.tsx +56 -0
  167. package/src/components/empty-state/empty-state-title.tsx +18 -0
  168. package/src/components/empty-state/empty-state.context.tsx +65 -0
  169. package/src/components/empty-state/empty-state.tsx +84 -0
  170. package/src/components/empty-state/empty-state.types.ts +14 -0
  171. package/src/components/empty-state/empty-state.variants.test.ts +245 -0
  172. package/src/components/empty-state/empty-state.variants.ts +132 -0
  173. package/src/components/empty-state/index.ts +20 -0
  174. package/src/components/fab/AGENTS.md +119 -0
  175. package/src/components/fab/fab-action.tsx +118 -0
  176. package/src/components/fab/fab-group.tsx +214 -0
  177. package/src/components/fab/fab-label.tsx +18 -0
  178. package/src/components/fab/fab.context.tsx +125 -0
  179. package/src/components/fab/fab.tsx +156 -0
  180. package/src/components/fab/fab.types.ts +17 -0
  181. package/src/components/fab/fab.variants.test.ts +274 -0
  182. package/src/components/fab/fab.variants.ts +234 -0
  183. package/src/components/fab/index.ts +37 -0
  184. package/src/components/feedback/AGENTS.md +95 -0
  185. package/src/components/feedback/feedback-action.tsx +16 -0
  186. package/src/components/feedback/feedback-cancel.tsx +34 -0
  187. package/src/components/feedback/feedback-close.tsx +21 -0
  188. package/src/components/feedback/feedback-content.tsx +24 -0
  189. package/src/components/feedback/feedback-field.tsx +70 -0
  190. package/src/components/feedback/feedback-footer.tsx +21 -0
  191. package/src/components/feedback/feedback-panel.tsx +54 -0
  192. package/src/components/feedback/feedback-submit.tsx +74 -0
  193. package/src/components/feedback/feedback-title.tsx +34 -0
  194. package/src/components/feedback/feedback-trigger.tsx +20 -0
  195. package/src/components/feedback/feedback.context.tsx +73 -0
  196. package/src/components/feedback/feedback.tsx +135 -0
  197. package/src/components/feedback/feedback.variants.test.ts +185 -0
  198. package/src/components/feedback/feedback.variants.ts +128 -0
  199. package/src/components/feedback/index.ts +24 -0
  200. package/src/components/field/AGENTS.md +19 -0
  201. package/src/components/field/field-label.tsx +19 -5
  202. package/src/components/field/field.context.tsx +17 -0
  203. package/src/components/field/field.tsx +15 -2
  204. package/src/components/field/field.variants.test.ts +24 -0
  205. package/src/components/field/field.variants.ts +20 -0
  206. package/src/components/field/index.ts +1 -0
  207. package/src/components/input/AGENTS.md +5 -0
  208. package/src/components/input/input.variants.test.ts +32 -0
  209. package/src/components/input/input.variants.ts +13 -1
  210. package/src/components/item/AGENTS.md +92 -0
  211. package/src/components/item/index.ts +25 -0
  212. package/src/components/item/item-actions.tsx +28 -0
  213. package/src/components/item/item-content.tsx +15 -0
  214. package/src/components/item/item-description.tsx +12 -0
  215. package/src/components/item/item-footer.tsx +13 -0
  216. package/src/components/item/item-group.tsx +32 -0
  217. package/src/components/item/item-header.tsx +13 -0
  218. package/src/components/item/item-media.tsx +37 -0
  219. package/src/components/item/item-separator.tsx +13 -0
  220. package/src/components/item/item-title.tsx +17 -0
  221. package/src/components/item/item.context.tsx +66 -0
  222. package/src/components/item/item.tsx +218 -0
  223. package/src/components/item/item.types.ts +12 -0
  224. package/src/components/item/item.variants.test.ts +263 -0
  225. package/src/components/item/item.variants.ts +200 -0
  226. package/src/components/kpi/AGENTS.md +125 -0
  227. package/src/components/kpi/index.ts +45 -0
  228. package/src/components/kpi/kpi-action.tsx +12 -0
  229. package/src/components/kpi/kpi-content.tsx +35 -0
  230. package/src/components/kpi/kpi-footer.tsx +52 -0
  231. package/src/components/kpi/kpi-group.tsx +70 -0
  232. package/src/components/kpi/kpi-header.tsx +25 -0
  233. package/src/components/kpi/kpi-icon.tsx +28 -0
  234. package/src/components/kpi/kpi-sparkline.tsx +145 -0
  235. package/src/components/kpi/kpi-stat.tsx +20 -0
  236. package/src/components/kpi/kpi-title.tsx +19 -0
  237. package/src/components/kpi/kpi-trend.tsx +105 -0
  238. package/src/components/kpi/kpi-value.tsx +32 -0
  239. package/src/components/kpi/kpi.context.tsx +111 -0
  240. package/src/components/kpi/kpi.tsx +154 -0
  241. package/src/components/kpi/kpi.types.ts +9 -0
  242. package/src/components/kpi/kpi.variants.test.ts +428 -0
  243. package/src/components/kpi/kpi.variants.ts +347 -0
  244. package/src/components/label/AGENTS.md +89 -0
  245. package/src/components/label/index.ts +10 -0
  246. package/src/components/label/label.tsx +97 -0
  247. package/src/components/label/label.variants.test.ts +176 -0
  248. package/src/components/label/label.variants.ts +123 -0
  249. package/src/components/menu/AGENTS.md +176 -0
  250. package/src/components/menu/index.ts +44 -0
  251. package/src/components/menu/menu-background.tsx +17 -0
  252. package/src/components/menu/menu-checkbox-item.tsx +57 -0
  253. package/src/components/menu/menu-content.tsx +303 -0
  254. package/src/components/menu/menu-item.tsx +162 -0
  255. package/src/components/menu/menu-label.tsx +14 -0
  256. package/src/components/menu/menu-radio-group.tsx +50 -0
  257. package/src/components/menu/menu-radio-item.tsx +57 -0
  258. package/src/components/menu/menu-separator.tsx +11 -0
  259. package/src/components/menu/menu-sub-content.tsx +72 -0
  260. package/src/components/menu/menu-sub-trigger.tsx +50 -0
  261. package/src/components/menu/menu-sub.tsx +75 -0
  262. package/src/components/menu/menu-trigger.tsx +57 -0
  263. package/src/components/menu/menu.context.tsx +214 -0
  264. package/src/components/menu/menu.tsx +88 -0
  265. package/src/components/menu/menu.types.ts +33 -0
  266. package/src/components/menu/menu.variants.test.ts +400 -0
  267. package/src/components/menu/menu.variants.ts +353 -0
  268. package/src/components/meter/AGENTS.md +135 -0
  269. package/src/components/meter/index.ts +43 -0
  270. package/src/components/meter/meter-fill.tsx +19 -0
  271. package/src/components/meter/meter-header.tsx +17 -0
  272. package/src/components/meter/meter-label.tsx +18 -0
  273. package/src/components/meter/meter-output.tsx +42 -0
  274. package/src/components/meter/meter-segments.tsx +83 -0
  275. package/src/components/meter/meter-track.tsx +16 -0
  276. package/src/components/meter/meter.context.tsx +62 -0
  277. package/src/components/meter/meter.tsx +286 -0
  278. package/src/components/meter/meter.types.ts +30 -0
  279. package/src/components/meter/meter.variants.test.ts +430 -0
  280. package/src/components/meter/meter.variants.ts +347 -0
  281. package/src/components/overlay/AGENTS.md +89 -0
  282. package/src/components/overlay/index.ts +27 -0
  283. package/src/components/overlay/overlay-portal.tsx +84 -0
  284. package/src/components/overlay/overlay-presence.test.ts +46 -0
  285. package/src/components/overlay/overlay-presence.ts +49 -0
  286. package/src/components/overlay/overlay-registry.test.ts +96 -0
  287. package/src/components/overlay/overlay-registry.ts +99 -0
  288. package/src/components/overlay/overlay-scrim.tsx +49 -0
  289. package/src/components/overlay/overlay.context.tsx +48 -0
  290. package/src/components/overlay/overlay.tsx +118 -0
  291. package/src/components/overlay/overlay.variants.test.ts +37 -0
  292. package/src/components/overlay/overlay.variants.ts +33 -0
  293. package/src/components/overlay/use-overlay-back-handler.ts +34 -0
  294. package/src/components/overlay/use-overlay-presence.ts +87 -0
  295. package/src/components/popover/AGENTS.md +138 -0
  296. package/src/components/popover/index.ts +48 -0
  297. package/src/components/popover/popover-anchor.tsx +49 -0
  298. package/src/components/popover/popover-arrow.tsx +89 -0
  299. package/src/components/popover/popover-close.tsx +73 -0
  300. package/src/components/popover/popover-content.tsx +235 -0
  301. package/src/components/popover/popover-description.tsx +18 -0
  302. package/src/components/popover/popover-title.tsx +33 -0
  303. package/src/components/popover/popover-trigger.tsx +56 -0
  304. package/src/components/popover/popover.context.tsx +71 -0
  305. package/src/components/popover/popover.position.test.ts +354 -0
  306. package/src/components/popover/popover.position.ts +286 -0
  307. package/src/components/popover/popover.tsx +123 -0
  308. package/src/components/popover/popover.variants.test.ts +135 -0
  309. package/src/components/popover/popover.variants.ts +85 -0
  310. package/src/components/popover/use-anchor-measure.ts +76 -0
  311. package/src/components/popover/use-anchored-content.ts +219 -0
  312. package/src/components/pressable/AGENTS.md +11 -1
  313. package/src/components/pressable/pressable.tsx +7 -2
  314. package/src/components/pressable/pressable.variants.test.ts +29 -0
  315. package/src/components/pressable/pressable.variants.ts +17 -0
  316. package/src/components/progress/AGENTS.md +120 -0
  317. package/src/components/progress/index.ts +40 -0
  318. package/src/components/progress/progress-fill.tsx +152 -0
  319. package/src/components/progress/progress-header.tsx +19 -0
  320. package/src/components/progress/progress-label.tsx +27 -0
  321. package/src/components/progress/progress-output.tsx +47 -0
  322. package/src/components/progress/progress-track.tsx +38 -0
  323. package/src/components/progress/progress.context.tsx +79 -0
  324. package/src/components/progress/progress.tsx +171 -0
  325. package/src/components/progress/progress.types.ts +23 -0
  326. package/src/components/progress/progress.variants.test.ts +335 -0
  327. package/src/components/progress/progress.variants.ts +284 -0
  328. package/src/components/progress-button/AGENTS.md +116 -0
  329. package/src/components/progress-button/index.ts +36 -0
  330. package/src/components/progress-button/progress-button-done.tsx +33 -0
  331. package/src/components/progress-button/progress-button-label.tsx +27 -0
  332. package/src/components/progress-button/progress-button.context.tsx +93 -0
  333. package/src/components/progress-button/progress-button.tsx +414 -0
  334. package/src/components/progress-button/progress-button.variants.test.ts +314 -0
  335. package/src/components/progress-button/progress-button.variants.ts +236 -0
  336. package/src/components/provider/AGENTS.md +38 -25
  337. package/src/components/provider/provider.tsx +38 -11
  338. package/src/components/radio/AGENTS.md +8 -10
  339. package/src/components/radio/radio.variants.test.ts +5 -6
  340. package/src/components/radio/radio.variants.ts +6 -7
  341. package/src/components/rating/AGENTS.md +143 -0
  342. package/src/components/rating/index.ts +43 -0
  343. package/src/components/rating/rating-output.tsx +39 -0
  344. package/src/components/rating/rating-star.tsx +70 -0
  345. package/src/components/rating/rating-stars.tsx +219 -0
  346. package/src/components/rating/rating.context.tsx +79 -0
  347. package/src/components/rating/rating.tsx +163 -0
  348. package/src/components/rating/rating.variants.test.ts +347 -0
  349. package/src/components/rating/rating.variants.ts +354 -0
  350. package/src/components/selection-mode/AGENTS.md +155 -0
  351. package/src/components/selection-mode/index.ts +43 -0
  352. package/src/components/selection-mode/selection-mode-action.tsx +65 -0
  353. package/src/components/selection-mode/selection-mode-bar.tsx +79 -0
  354. package/src/components/selection-mode/selection-mode-group.tsx +123 -0
  355. package/src/components/selection-mode/selection-mode-header.tsx +85 -0
  356. package/src/components/selection-mode/selection-mode-indicator.tsx +118 -0
  357. package/src/components/selection-mode/selection-mode-item.tsx +182 -0
  358. package/src/components/selection-mode/selection-mode.context.tsx +89 -0
  359. package/src/components/selection-mode/selection-mode.tsx +207 -0
  360. package/src/components/selection-mode/selection-mode.types.ts +36 -0
  361. package/src/components/selection-mode/selection-mode.variants.test.ts +292 -0
  362. package/src/components/selection-mode/selection-mode.variants.ts +329 -0
  363. package/src/components/skeleton/AGENTS.md +120 -0
  364. package/src/components/skeleton/index.ts +15 -0
  365. package/src/components/skeleton/skeleton-clock.ts +48 -0
  366. package/src/components/skeleton/skeleton-group.tsx +64 -0
  367. package/src/components/skeleton/skeleton-shimmer.tsx +80 -0
  368. package/src/components/skeleton/skeleton.context.tsx +45 -0
  369. package/src/components/skeleton/skeleton.tsx +227 -0
  370. package/src/components/skeleton/skeleton.variants.test.ts +245 -0
  371. package/src/components/skeleton/skeleton.variants.ts +222 -0
  372. package/src/components/slide-button/AGENTS.md +122 -0
  373. package/src/components/slide-button/index.ts +43 -0
  374. package/src/components/slide-button/slide-button-label.tsx +70 -0
  375. package/src/components/slide-button/slide-button-thumb.tsx +93 -0
  376. package/src/components/slide-button/slide-button.context.tsx +76 -0
  377. package/src/components/slide-button/slide-button.tsx +457 -0
  378. package/src/components/slide-button/slide-button.variants.test.ts +288 -0
  379. package/src/components/slide-button/slide-button.variants.ts +324 -0
  380. package/src/components/slider/index.ts +2 -0
  381. package/src/components/slider/slider-thumb.tsx +33 -1
  382. package/src/components/slider/slider.variants.test.ts +52 -0
  383. package/src/components/slider/slider.variants.ts +56 -2
  384. package/src/components/stack-card/AGENTS.md +169 -0
  385. package/src/components/stack-card/index.ts +37 -0
  386. package/src/components/stack-card/stack-card-action.tsx +66 -0
  387. package/src/components/stack-card/stack-card-actions.tsx +18 -0
  388. package/src/components/stack-card/stack-card-card.tsx +71 -0
  389. package/src/components/stack-card/stack-card-empty.tsx +30 -0
  390. package/src/components/stack-card/stack-card-slot.tsx +90 -0
  391. package/src/components/stack-card/stack-card-stamp.tsx +76 -0
  392. package/src/components/stack-card/stack-card.context.tsx +117 -0
  393. package/src/components/stack-card/stack-card.tsx +557 -0
  394. package/src/components/stack-card/stack-card.types.ts +26 -0
  395. package/src/components/stack-card/stack-card.variants.test.ts +355 -0
  396. package/src/components/stack-card/stack-card.variants.ts +360 -0
  397. package/src/components/steps/AGENTS.md +153 -0
  398. package/src/components/steps/index.ts +45 -0
  399. package/src/components/steps/steps-connector.tsx +31 -0
  400. package/src/components/steps/steps-description.tsx +26 -0
  401. package/src/components/steps/steps-indicator.tsx +106 -0
  402. package/src/components/steps/steps-item.tsx +225 -0
  403. package/src/components/steps/steps-panel.tsx +41 -0
  404. package/src/components/steps/steps-title.tsx +32 -0
  405. package/src/components/steps/steps-track.tsx +59 -0
  406. package/src/components/steps/steps.context.tsx +123 -0
  407. package/src/components/steps/steps.tsx +166 -0
  408. package/src/components/steps/steps.variants.test.ts +388 -0
  409. package/src/components/steps/steps.variants.ts +468 -0
  410. package/src/components/surface/AGENTS.md +82 -0
  411. package/src/components/surface/index.ts +15 -0
  412. package/src/components/surface/surface.context.tsx +56 -0
  413. package/src/components/surface/surface.tsx +87 -0
  414. package/src/components/surface/surface.variants.test.ts +227 -0
  415. package/src/components/surface/surface.variants.ts +165 -0
  416. package/src/components/swipe/AGENTS.md +140 -0
  417. package/src/components/swipe/index.ts +31 -0
  418. package/src/components/swipe/swipe-action.tsx +99 -0
  419. package/src/components/swipe/swipe-end.tsx +14 -0
  420. package/src/components/swipe/swipe-group.tsx +55 -0
  421. package/src/components/swipe/swipe-panel.tsx +55 -0
  422. package/src/components/swipe/swipe-start.tsx +15 -0
  423. package/src/components/swipe/swipe.context.tsx +135 -0
  424. package/src/components/swipe/swipe.tsx +393 -0
  425. package/src/components/swipe/swipe.types.ts +7 -0
  426. package/src/components/swipe/swipe.variants.test.ts +337 -0
  427. package/src/components/swipe/swipe.variants.ts +290 -0
  428. package/src/components/switch/switch.variants.ts +2 -2
  429. package/src/components/tabs/AGENTS.md +4 -3
  430. package/src/components/tabs/tabs.variants.test.ts +1 -1
  431. package/src/components/tabs/tabs.variants.ts +4 -6
  432. package/src/components/text/AGENTS.md +8 -2
  433. package/src/components/text/text.tsx +7 -0
  434. package/src/components/text/text.variants.test.ts +24 -1
  435. package/src/components/text/text.variants.ts +5 -0
  436. package/src/components/textarea/AGENTS.md +89 -0
  437. package/src/components/textarea/index.ts +16 -0
  438. package/src/components/textarea/textarea.tsx +157 -0
  439. package/src/components/textarea/textarea.variants.test.ts +219 -0
  440. package/src/components/textarea/textarea.variants.ts +171 -0
  441. package/src/components/toast/AGENTS.md +140 -0
  442. package/src/components/toast/index.ts +74 -0
  443. package/src/components/toast/toast-action.tsx +59 -0
  444. package/src/components/toast/toast-api.ts +32 -0
  445. package/src/components/toast/toast-close.tsx +44 -0
  446. package/src/components/toast/toast-content.tsx +11 -0
  447. package/src/components/toast/toast-description.tsx +11 -0
  448. package/src/components/toast/toast-indicator.tsx +34 -0
  449. package/src/components/toast/toast-item.tsx +308 -0
  450. package/src/components/toast/toast-title.tsx +13 -0
  451. package/src/components/toast/toast-viewport.tsx +135 -0
  452. package/src/components/toast/toast.context.tsx +69 -0
  453. package/src/components/toast/toast.store.test.ts +259 -0
  454. package/src/components/toast/toast.store.ts +338 -0
  455. package/src/components/toast/toast.timer.test.ts +64 -0
  456. package/src/components/toast/toast.timer.ts +51 -0
  457. package/src/components/toast/toast.tsx +132 -0
  458. package/src/components/toast/toast.variants.test.ts +393 -0
  459. package/src/components/toast/toast.variants.ts +304 -0
  460. package/src/components/toggle-button/AGENTS.md +106 -0
  461. package/src/components/toggle-button/index.ts +30 -0
  462. package/src/components/toggle-button/toggle-button-group.tsx +156 -0
  463. package/src/components/toggle-button/toggle-button-label.tsx +19 -0
  464. package/src/components/toggle-button/toggle-button.context.tsx +130 -0
  465. package/src/components/toggle-button/toggle-button.tsx +172 -0
  466. package/src/components/toggle-button/toggle-button.variants.test.ts +189 -0
  467. package/src/components/toggle-button/toggle-button.variants.ts +160 -0
  468. package/src/components/tooltip/AGENTS.md +133 -0
  469. package/src/components/tooltip/index.ts +28 -0
  470. package/src/components/tooltip/tooltip-arrow.tsx +40 -0
  471. package/src/components/tooltip/tooltip-content.tsx +179 -0
  472. package/src/components/tooltip/tooltip-description.tsx +19 -0
  473. package/src/components/tooltip/tooltip-text.tsx +21 -0
  474. package/src/components/tooltip/tooltip-title.tsx +20 -0
  475. package/src/components/tooltip/tooltip-trigger.tsx +103 -0
  476. package/src/components/tooltip/tooltip.context.tsx +68 -0
  477. package/src/components/tooltip/tooltip.tsx +213 -0
  478. package/src/components/tooltip/tooltip.variants.test.ts +231 -0
  479. package/src/components/tooltip/tooltip.variants.ts +177 -0
  480. package/src/hooks/use-calm-motion.tsx +31 -0
  481. package/src/lib/calm-motion.test.ts +17 -0
  482. package/src/lib/calm-motion.ts +23 -0
  483. package/src/lib/cn.parity.test.ts +62 -0
  484. package/src/lib/cn.test.ts +14 -0
  485. package/src/lib/cn.ts +11 -6
  486. package/src/no-gorhom.test.ts +54 -0
  487. package/src/styles/geometry.test.ts +1 -0
  488. package/src/styles/theme.css +4 -0
  489. package/src/styles/tokens.css +44 -0
  490. package/src/styles/tokens.test.ts +56 -0
  491. package/src/styles/tokens.ts +29 -1
  492. package/src/components/bottom-sheet/bottom-sheet-portal.tsx +0 -72
  493. package/src/components/bottom-sheet/bottom-sheet.context.tsx +0 -135
@@ -0,0 +1,116 @@
1
+ # ProgressButton
2
+
3
+ A button that has to be **held**, not tapped. A fill grows from the leading edge for
4
+ `holdDuration`, and the action fires when it reaches the end. Compound root plus
5
+ `ProgressButton.Label` and `ProgressButton.Done`. For an irreversible action that would
6
+ otherwise need a confirmation dialog — erasing, paying. Two taps in a row are a rhythm a hand
7
+ falls into; a two-second hold cannot be done by accident or by habit.
8
+
9
+ `import { ProgressButton } from "@delacour/react-native-ui/progress-button";`
10
+
11
+ ## Files
12
+
13
+ | File | What it holds |
14
+ | --- | --- |
15
+ | `index.ts` | → `@delacour/react-native-ui/progress-button` |
16
+ | `progress-button.tsx` | Root + the `Object.assign` compound surface: the gesture, the fill, the two label layers, the done mark |
17
+ | `progress-button-label.tsx` | `ProgressButton.Label`, coloured by the layer it renders in |
18
+ | `progress-button-done.tsx` | `ProgressButton.Done`, the default tick or the caller's content |
19
+ | `progress-button.context.tsx` | `ProgressButtonContext`, the layer context, `useProgressButton()` |
20
+ | `progress-button.variants.ts` | Pure `tv()` slots, colour tables, and the hold, playback, stepping and reset resolvers |
21
+ | `progress-button.variants.test.ts` | |
22
+
23
+ ## Design
24
+
25
+ - **Variants**: `primary`, `secondary`, `destructive`, `success`. **Sizes**: `sm`, `md`, `lg`.
26
+ **Shapes**: `pill` (default), `rounded`. There is no square `icon-*` size: a hold has to
27
+ say what it does, and a glyph alone cannot carry "hold to erase".
28
+ - **The box is the button's box.** `h-button-*`, the button's `px-*`, `text-button-*`,
29
+ `size-icon-*` and, as a pill, `rounded-button-*` — the tokens `buttonVariants` reads, and a
30
+ test pins them equal to the button's own, so the two sit level in a row and a retune moves
31
+ both. `rounded` is the card corner, `rounded-lg`, so the button sits square with a
32
+ `Button` given the same class beside it. No token is minted.
33
+ - **Every variant rests on `bg-secondary` and carries its colour in the label and the fill.**
34
+ A resting button that is already solid red has nothing left to say when the fill arrives.
35
+ `secondary` fills with `foreground` and draws its inner label on `background`, because a
36
+ `secondary` fill on a `secondary` surface would not be seen and `secondary-foreground` on a
37
+ `foreground` fill is the same colour twice. The three colour tables are exported and a test
38
+ checks every token in them exists in both themes.
39
+ - **The label is drawn twice.** Once on the surface in the variant colour, once inside the
40
+ clipped fill in the variant's foreground, laid out at the button's **measured** width
41
+ (`onLayout`), so both copies wrap identically and the wipe's edge cuts through a glyph. A
42
+ single label under a translucent wash goes muddy exactly at the boundary, which is where
43
+ the eye is. A test asserts the two label slots differ in colour and nothing else.
44
+ `ProgressButton.Label` reads which copy it is from a layer context rather than a prop the
45
+ caller would have to repeat; a composed `Icon` takes the layer's colour through
46
+ `IconDefaultsProvider`, the same mechanism `Button` uses.
47
+ - **The fill's copy and the done mark are hidden from assistive technology.** The root is the
48
+ one accessible element; announcing the label twice would be the fill's bookkeeping leaking
49
+ into a screen reader.
50
+ - **Bare strings are wrapped in a `ProgressButton.Label`**, consecutive ones collapsing into
51
+ one, for the reason `Button` gives: React Native crashes on text outside a `<Text>`.
52
+ - **`ProgressButton.Done` is lifted out of the children by type** and drawn over the full fill.
53
+ With none written the root draws one, which is a full-size `IconCheckmark2` at `size-icon-*` (the `Small` glyph, alone on a button, read as a speck) in
54
+ the fill's foreground. A caller's `Done` replaces it whole.
55
+
56
+ ## Behaviour
57
+
58
+ - **The gesture is a pan with no minimum distance**, `onBegin` to `onFinalize`. A long-press
59
+ gesture fires once and cannot tell "still holding" from "held long enough".
60
+ `shouldCancelWhenOutside(false)`, and a finger may drift 16pt
61
+ (`PROGRESS_BUTTON_MAX_DRIFT`) before the hold lets go, because a hand resting on a control for
62
+ two seconds moves.
63
+ - **Pressing runs the fill toward 1 over what is left** — `holdDuration × (1 − p)` — so a second
64
+ attempt resumes rather than restarting. **Releasing runs it back over what is filled** —
65
+ `holdDuration × p` — the same rate, played backwards, never a snap to empty.
66
+ `resolveRemainingDuration` is the tested copy; the worklets restate it inline because a
67
+ worklet body must be self-contained.
68
+ - **Completion is read from the animation**, in the timing's finish callback (`finished` at 1),
69
+ then crosses to JS with `scheduleOnRN`. Never a JS `setTimeout` running alongside: two clocks
70
+ disagree under load, and the one the user can see is the fill. There is no tolerance near the
71
+ end — released at 99%, nothing fires.
72
+ - **Completed, it is locked.** A shared `isLocked` flag makes the gesture ignore further presses
73
+ and stops a release from draining a finished fill, until a reset: `isAutoReset` after
74
+ `autoResetDelay` (a timer is fine here — it schedules the reset, not the completion), or a
75
+ controlled `isCompleted` going `false`. **A reset travels** back over
76
+ `PROGRESS_BUTTON_TRAVEL_MS` scaled by how full the fill is; it is never set to 0. A completion
77
+ set from outside travels forward the same way.
78
+ - **Controlled, the caller has to accept a hold in the same update.** A completed hold calls
79
+ `onCompletedChange(true)` and `onComplete`. If `isCompleted` is still `false` once those have
80
+ run, the fill travels back — the caller declined. The alternative, sitting full and locked
81
+ until the prop changes, leaves a caller who declines with no prop change to make, so the
82
+ button would be stuck. A caller with async work accepts at once (`isCompleted` true) and shows
83
+ progress in a custom `Done`, then sets `false` to rewind on failure; the `controlled` demo does
84
+ exactly that.
85
+ - **Haptics are off by default.** `haptic` plays when the hold takes, and a `success` knock
86
+ follows on completion, both from the UI thread through `playHaptic`.
87
+ - **`isDisabled`** fades the button (`opacity-50`) and turns the gesture off, so the fill never
88
+ starts. A hold in progress when it flips is cancelled and plays back.
89
+
90
+ ## Reduced motion
91
+
92
+ - **The fill steps in fifths instead of sweeping.** `Math.floor(p × 5) / 5`, applied in the
93
+ animated style, rounding **down** so it never shows more than the hold has earned. It stays an
94
+ indicator, because a control that asks you to wait and shows nothing is broken.
95
+ `resolveSteppedProgress` is the tested copy.
96
+ - **Every timing opts out of the reduce-motion policy** (`ReduceMotion.Never`). Under the default
97
+ policy Reanimated completes a timing instantly when the setting is on — so a two-second hold
98
+ would complete on touch-down, which is the one thing this component exists to prevent. The
99
+ stepping is what reduces the motion; the clock underneath has to keep real time.
100
+ - **The done mark fades without scaling** under reduced motion.
101
+
102
+ ## Accessibility
103
+
104
+ - `accessibilityRole="button"`, `accessibilityHint` (default: "Press and hold to confirm"), and
105
+ `accessibilityState={{ disabled, checked: isCompleted }}`.
106
+ - **Decision: activate completes.** The root declares an `activate` accessibility action, and a
107
+ screen reader's activate completes the button outright. A screen reader cannot hold, the hint
108
+ has already announced what the button does, and refusing would leave the action unreachable
109
+ for anyone using one. The slide-to-confirm control makes the same call.
110
+
111
+ ## Out of scope
112
+
113
+ - An `icon-*` square size, and a loading state of its own — a caller shows work in a custom
114
+ `Done`.
115
+ - Progress that is not time-based (a fill driven by an upload). That is `Progress`.
116
+ - Cancelling a completed hold from inside the button. Reset is `isAutoReset` or the caller's.
@@ -0,0 +1,36 @@
1
+ export { ProgressButton, type ProgressButtonProps } from "./progress-button";
2
+ export {
3
+ type ProgressButtonContextValue,
4
+ type ProgressButtonLayer,
5
+ ProgressButtonProvider,
6
+ useProgressButton,
7
+ useProgressButtonContext,
8
+ } from "./progress-button.context";
9
+ export {
10
+ PROGRESS_BUTTON_CROSSFADE_MS,
11
+ PROGRESS_BUTTON_DEFAULT_AUTO_RESET_MS,
12
+ PROGRESS_BUTTON_DEFAULT_HINT,
13
+ PROGRESS_BUTTON_DEFAULT_HOLD_MS,
14
+ PROGRESS_BUTTON_FILL_FOREGROUND_TOKEN,
15
+ PROGRESS_BUTTON_FILL_TOKEN,
16
+ PROGRESS_BUTTON_LABEL_TOKEN,
17
+ PROGRESS_BUTTON_MAX_DRIFT,
18
+ PROGRESS_BUTTON_MIN_HOLD_MS,
19
+ PROGRESS_BUTTON_REDUCED_MOTION_STEPS,
20
+ PROGRESS_BUTTON_SHAPES,
21
+ PROGRESS_BUTTON_SIZES,
22
+ PROGRESS_BUTTON_TRAVEL_MS,
23
+ PROGRESS_BUTTON_VARIANTS,
24
+ type ProgressButtonShape,
25
+ type ProgressButtonSize,
26
+ type ProgressButtonVariant,
27
+ type ProgressButtonVariantProps,
28
+ progressButtonVariants,
29
+ resolveAutoResetDelay,
30
+ resolveHoldDuration,
31
+ resolveProgressButtonAccessibilityState,
32
+ resolveRemainingDuration,
33
+ resolveSteppedProgress,
34
+ } from "./progress-button.variants";
35
+ export type { ProgressButtonDoneProps } from "./progress-button-done";
36
+ export type { ProgressButtonLabelProps } from "./progress-button-label";
@@ -0,0 +1,33 @@
1
+ import type { ReactElement, ReactNode } from "react";
2
+ import { View, type ViewProps } from "react-native";
3
+ import { IconCheckmark2 } from "../../icons/central";
4
+ import { cn } from "../../lib/cn";
5
+ import { Icon } from "../icon";
6
+ import { useProgressButtonPart } from "./progress-button.context";
7
+
8
+ export type ProgressButtonDoneProps = ViewProps & {
9
+ /** Replaces the default tick. A bare `Icon` inherits the fill's foreground and the button's icon size. */
10
+ children?: ReactNode;
11
+ className?: string;
12
+ };
13
+
14
+ /**
15
+ * What the button shows once the hold completes.
16
+ *
17
+ * The root lifts this part out of its children by type and draws it over the
18
+ * full fill, fading and scaling it in as the labels fade out. With no children
19
+ * it draws a tick; the root draws one of these by itself when the caller writes
20
+ * none, so the tick is there by default.
21
+ *
22
+ * Size and colour come from the `IconDefaultsProvider` the root wraps it in, so
23
+ * a composed `Icon` matches the default tick with nothing said at the call site.
24
+ */
25
+ export function ProgressButtonDone({ children, className, ...props }: ProgressButtonDoneProps): ReactElement {
26
+ useProgressButtonPart("ProgressButton.Done");
27
+ return (
28
+ <View className={cn("flex-row items-center justify-center gap-2", className)} {...props}>
29
+ {children ?? <Icon icon={IconCheckmark2} />}
30
+ </View>
31
+ );
32
+ }
33
+ ProgressButtonDone.displayName = "DelacourUI.ProgressButton.Done";
@@ -0,0 +1,27 @@
1
+ import type { ReactElement, ReactNode } from "react";
2
+ import type { TextProps } from "react-native";
3
+ import { Text } from "../text";
4
+ import { useProgressButtonLayer, useProgressButtonPart } from "./progress-button.context";
5
+ import { progressButtonVariants } from "./progress-button.variants";
6
+
7
+ export type ProgressButtonLabelProps = Omit<TextProps, "children"> & {
8
+ children: ReactNode;
9
+ className?: string;
10
+ };
11
+
12
+ /**
13
+ * The button's text.
14
+ *
15
+ * Rendered twice by the root, once per layer, and picks its colour from the
16
+ * layer it is in: the variant colour on the resting surface, the variant's
17
+ * foreground inside the fill. The two copies share every other class, so they
18
+ * wrap the same and the wipe's edge falls inside a glyph.
19
+ */
20
+ export function ProgressButtonLabel({ className, ...props }: ProgressButtonLabelProps): ReactElement {
21
+ const { variant, size } = useProgressButtonPart("ProgressButton.Label");
22
+ const layer = useProgressButtonLayer();
23
+ const slots = progressButtonVariants({ size, variant });
24
+ const resolved = layer === "fill" ? slots.fillLabel({ className }) : slots.label({ className });
25
+ return <Text className={resolved} {...props} />;
26
+ }
27
+ ProgressButtonLabel.displayName = "DelacourUI.ProgressButton.Label";
@@ -0,0 +1,93 @@
1
+ import { createContext, type ReactElement, type ReactNode, use } from "react";
2
+ import type { SharedValue } from "react-native-reanimated";
3
+ import type { ProgressButtonSize, ProgressButtonVariant } from "./progress-button.variants";
4
+
5
+ export type ProgressButtonContextValue = {
6
+ variant: ProgressButtonVariant;
7
+ size: ProgressButtonSize;
8
+ /** Whether the hold has completed and not yet been reset. */
9
+ isCompleted: boolean;
10
+ isDisabled: boolean;
11
+ /** How far the fill has got, 0 to 1, on the UI thread. */
12
+ progress: SharedValue<number>;
13
+ };
14
+
15
+ /**
16
+ * Which copy of the children a part is rendering in.
17
+ *
18
+ * The children are drawn twice — once on the resting surface and once inside
19
+ * the fill — and a `ProgressButton.Label` picks its colour from this rather
20
+ * than from a prop the caller would have to repeat.
21
+ */
22
+ export type ProgressButtonLayer = "surface" | "fill";
23
+
24
+ const ProgressButtonContext = createContext<ProgressButtonContextValue | null>(null);
25
+ const ProgressButtonLayerContext = createContext<ProgressButtonLayer>("surface");
26
+
27
+ /**
28
+ * Supplies the enclosing button's state to its subtree.
29
+ *
30
+ * In a leaf of its own, importing nothing but types, so a part can read it
31
+ * without importing `./progress-button` and closing a cycle (package AGENTS.md
32
+ * rule 3).
33
+ */
34
+ export function ProgressButtonProvider({
35
+ value,
36
+ children,
37
+ }: {
38
+ value: ProgressButtonContextValue;
39
+ children: ReactNode;
40
+ }): ReactElement {
41
+ return <ProgressButtonContext value={value}>{children}</ProgressButtonContext>;
42
+ }
43
+ ProgressButtonProvider.displayName = "DelacourUI.ProgressButton.Provider";
44
+
45
+ /** Marks which copy of the children — surface or fill — its subtree is. */
46
+ export function ProgressButtonLayerProvider({
47
+ value,
48
+ children,
49
+ }: {
50
+ value: ProgressButtonLayer;
51
+ children: ReactNode;
52
+ }): ReactElement {
53
+ return <ProgressButtonLayerContext value={value}>{children}</ProgressButtonLayerContext>;
54
+ }
55
+ ProgressButtonLayerProvider.displayName = "DelacourUI.ProgressButton.LayerProvider";
56
+
57
+ /** The enclosing button's state, or null outside a `<ProgressButton>`. */
58
+ export function useProgressButtonContext(): ProgressButtonContextValue | null {
59
+ return use(ProgressButtonContext);
60
+ }
61
+
62
+ /**
63
+ * Reads the enclosing button's state.
64
+ *
65
+ * For a custom child that changes with the hold — `progress` is a shared value,
66
+ * so a child can drive an animated style off it without a render per frame.
67
+ * Throws outside a `<ProgressButton>`.
68
+ */
69
+ export function useProgressButton(): ProgressButtonContextValue {
70
+ const context = useProgressButtonContext();
71
+ if (!context) {
72
+ throw new Error("useProgressButton must be called inside a <ProgressButton>.");
73
+ }
74
+ return context;
75
+ }
76
+
77
+ /**
78
+ * The enclosing button's state, for a compound part that cannot work without it.
79
+ *
80
+ * Internal: deliberately not re-exported from `index.ts`.
81
+ */
82
+ export function useProgressButtonPart(component: string): ProgressButtonContextValue {
83
+ const context = useProgressButtonContext();
84
+ if (!context) {
85
+ throw new Error(`${component} must be rendered inside a <ProgressButton>.`);
86
+ }
87
+ return context;
88
+ }
89
+
90
+ /** Which copy of the children this part is in. `surface` outside a button. */
91
+ export function useProgressButtonLayer(): ProgressButtonLayer {
92
+ return use(ProgressButtonLayerContext);
93
+ }