banhaten 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (348) hide show
  1. package/CHANGELOG.md +139 -73
  2. package/CONTRIBUTING.md +46 -44
  3. package/README.md +192 -190
  4. package/SECURITY.md +15 -15
  5. package/banhaten.config.example.json +11 -11
  6. package/docs/design-spacing.md +13 -0
  7. package/docs/design-system/README.md +22 -20
  8. package/docs/design-system/adoption-quality-remediation.md +87 -87
  9. package/docs/design-system/agent-usage.md +13 -13
  10. package/docs/design-system/appearance-presets.md +189 -189
  11. package/docs/design-system/appearances/default.md +94 -94
  12. package/docs/design-system/appearances/rounded.md +95 -95
  13. package/docs/design-system/appearances/sharp.md +95 -95
  14. package/docs/design-system/component-docs-pattern.md +81 -81
  15. package/docs/design-system/component-implementation-ownership-audit.md +245 -244
  16. package/docs/design-system/component-quality-audit-2026-08-20.md +225 -223
  17. package/docs/design-system/component-showcase-consistency-report.md +219 -219
  18. package/docs/design-system/component-token-consistency-audit.md +173 -173
  19. package/docs/design-system/components/README.md +90 -76
  20. package/docs/design-system/components/accordion.md +53 -53
  21. package/docs/design-system/components/activity-feed.md +94 -94
  22. package/docs/design-system/components/activity-heatmap.md +57 -57
  23. package/docs/design-system/components/agent-input.md +85 -0
  24. package/docs/design-system/components/alert-dialog.md +72 -72
  25. package/docs/design-system/components/alert.md +98 -98
  26. package/docs/design-system/components/approval-card.md +134 -0
  27. package/docs/design-system/components/aspect-ratio.md +45 -45
  28. package/docs/design-system/components/attribute.md +89 -89
  29. package/docs/design-system/components/autocomplete.md +75 -75
  30. package/docs/design-system/components/avatar.md +54 -54
  31. package/docs/design-system/components/badge.md +54 -54
  32. package/docs/design-system/components/banner.md +87 -87
  33. package/docs/design-system/components/breadcrumbs.md +177 -176
  34. package/docs/design-system/components/button-group.md +98 -98
  35. package/docs/design-system/components/button.md +83 -80
  36. package/docs/design-system/components/card.md +88 -88
  37. package/docs/design-system/components/carousel.md +46 -46
  38. package/docs/design-system/components/catalog-components.md +47 -47
  39. package/docs/design-system/components/chart.md +95 -24
  40. package/docs/design-system/components/checkbox.md +54 -54
  41. package/docs/design-system/components/collapsible.md +67 -53
  42. package/docs/design-system/components/command.md +62 -62
  43. package/docs/design-system/components/context-menu.md +46 -46
  44. package/docs/design-system/components/date-picker.md +81 -79
  45. package/docs/design-system/components/divider.md +102 -102
  46. package/docs/design-system/components/empty-state.md +56 -56
  47. package/docs/design-system/components/field.md +70 -70
  48. package/docs/design-system/components/file-upload.md +187 -187
  49. package/docs/design-system/components/hover-card.md +48 -48
  50. package/docs/design-system/components/icons.md +48 -48
  51. package/docs/design-system/components/inline-citations.md +93 -0
  52. package/docs/design-system/components/input-group.md +58 -58
  53. package/docs/design-system/components/input-otp.md +56 -56
  54. package/docs/design-system/components/input.md +117 -61
  55. package/docs/design-system/components/item.md +59 -57
  56. package/docs/design-system/components/kbd.md +54 -49
  57. package/docs/design-system/components/label.md +49 -49
  58. package/docs/design-system/components/menu.md +71 -61
  59. package/docs/design-system/components/menubar.md +47 -47
  60. package/docs/design-system/components/modal.md +105 -105
  61. package/docs/design-system/components/native-select.md +54 -54
  62. package/docs/design-system/components/navigation-menu.md +50 -50
  63. package/docs/design-system/components/onboarding-step-list-item.md +82 -82
  64. package/docs/design-system/components/page-header.md +93 -86
  65. package/docs/design-system/components/pagination.md +57 -57
  66. package/docs/design-system/components/popover.md +60 -60
  67. package/docs/design-system/components/progress-slider.md +50 -50
  68. package/docs/design-system/components/progress.md +76 -76
  69. package/docs/design-system/components/radio-card.md +51 -51
  70. package/docs/design-system/components/radio-group.md +57 -57
  71. package/docs/design-system/components/resizable.md +44 -44
  72. package/docs/design-system/components/rolling-count.md +61 -0
  73. package/docs/design-system/components/scroll-area.md +51 -51
  74. package/docs/design-system/components/segmented-control.md +54 -54
  75. package/docs/design-system/components/select.md +68 -62
  76. package/docs/design-system/components/sheet.md +67 -67
  77. package/docs/design-system/components/shimmer-text.md +67 -0
  78. package/docs/design-system/components/sidebar.md +127 -76
  79. package/docs/design-system/components/skeleton.md +75 -75
  80. package/docs/design-system/components/slideout.md +65 -65
  81. package/docs/design-system/components/slider.md +63 -63
  82. package/docs/design-system/components/social-button.md +50 -50
  83. package/docs/design-system/components/spinner.md +62 -62
  84. package/docs/design-system/components/steps.md +65 -65
  85. package/docs/design-system/components/streaming-text.md +82 -0
  86. package/docs/design-system/components/table.md +419 -414
  87. package/docs/design-system/components/tabs.md +59 -55
  88. package/docs/design-system/components/tag.md +80 -80
  89. package/docs/design-system/components/task-list.md +95 -0
  90. package/docs/design-system/components/textarea.md +50 -50
  91. package/docs/design-system/components/thinking-reasoning.md +72 -0
  92. package/docs/design-system/components/thinking-state.md +67 -0
  93. package/docs/design-system/components/timeline.md +83 -83
  94. package/docs/design-system/components/toast.md +58 -58
  95. package/docs/design-system/components/toggle.md +81 -81
  96. package/docs/design-system/components/toolbar.md +92 -87
  97. package/docs/design-system/components/tooltip.md +94 -92
  98. package/docs/design-system/components/typography.md +18 -18
  99. package/docs/design-system/density-and-elevation.md +65 -61
  100. package/docs/design-system/design-system-test-missing-items.md +368 -368
  101. package/docs/design-system/direction-and-localization.md +23 -23
  102. package/docs/design-system/form-recipes.md +73 -73
  103. package/docs/design-system/gap-promotion-policy.md +21 -21
  104. package/docs/design-system/icons.md +74 -69
  105. package/docs/design-system/installation.md +70 -68
  106. package/docs/design-system/launch-comparison-shadcn.md +98 -98
  107. package/docs/design-system/registry-and-cli.md +64 -64
  108. package/docs/design-system/release-policy.md +30 -30
  109. package/docs/design-system/roadmap.md +14 -14
  110. package/docs/design-system/support-matrix.md +23 -23
  111. package/docs/design-system/tabs.md +54 -53
  112. package/docs/design-system/template-gap-audit.md +32 -0
  113. package/docs/design-system/templates.md +59 -0
  114. package/docs/design-system/token-governance.md +72 -60
  115. package/package.json +98 -98
  116. package/registry/component-contract.json +40 -40
  117. package/registry/components/accordion.tsx +155 -155
  118. package/registry/components/agent-input-parts.tsx +552 -0
  119. package/registry/components/agent-input-state.ts +156 -0
  120. package/registry/components/agent-input.css +307 -0
  121. package/registry/components/agent-input.tsx +382 -0
  122. package/registry/components/alert-dialog.tsx +297 -297
  123. package/registry/components/alert.tsx +293 -293
  124. package/registry/components/approval-card.css +409 -0
  125. package/registry/components/approval-card.tsx +401 -0
  126. package/registry/components/approval-frame.tsx +108 -0
  127. package/registry/components/approval-questions.tsx +559 -0
  128. package/registry/components/aspect-ratio.tsx +30 -30
  129. package/registry/components/attribute.tsx +454 -448
  130. package/registry/components/autocomplete.tsx +598 -651
  131. package/registry/components/avatar.tsx +385 -381
  132. package/registry/components/badge.tsx +629 -629
  133. package/registry/components/button-group.tsx +565 -565
  134. package/registry/components/button.tsx +127 -123
  135. package/registry/components/card.tsx +638 -638
  136. package/registry/components/carousel.tsx +296 -296
  137. package/registry/components/chart-block-data.ts +177 -0
  138. package/registry/components/chart-block.css +171 -0
  139. package/registry/components/chart-block.tsx +260 -0
  140. package/registry/components/chart-interactions.ts +123 -0
  141. package/registry/components/chart-options.cartesian.ts +162 -0
  142. package/registry/components/chart-options.paint.ts +99 -0
  143. package/registry/components/chart-options.parts.ts +72 -0
  144. package/registry/components/chart-options.radial.ts +109 -0
  145. package/registry/components/chart-options.ts +44 -0
  146. package/registry/components/chart-options.types.ts +67 -0
  147. package/registry/components/chart.tsx +203 -203
  148. package/registry/components/checkbox.tsx +247 -247
  149. package/registry/components/collapsible.tsx +109 -69
  150. package/registry/components/command.tsx +208 -208
  151. package/registry/components/context-menu.tsx +236 -236
  152. package/registry/components/data-chart.tsx +40 -0
  153. package/registry/components/date-picker.tsx +1289 -1277
  154. package/registry/components/echart-theme.ts +246 -0
  155. package/registry/components/echart.css +49 -0
  156. package/registry/components/echart.tsx +178 -0
  157. package/registry/components/expanded/ActivityFeed.tsx +227 -227
  158. package/registry/components/expanded/ActivityHeatmap.tsx +64 -64
  159. package/registry/components/expanded/Banner.tsx +179 -179
  160. package/registry/components/expanded/Breadcrumbs.tsx +131 -131
  161. package/registry/components/expanded/CatalogComponentsShowcase.tsx +205 -205
  162. package/registry/components/expanded/CatalogDivider.tsx +49 -49
  163. package/registry/components/expanded/EmptyState.tsx +155 -155
  164. package/registry/components/expanded/FileUpload.tsx +543 -543
  165. package/registry/components/expanded/OnboardingStepListItem.tsx +60 -59
  166. package/registry/components/expanded/PageHeader.tsx +179 -166
  167. package/registry/components/expanded/Slideout.tsx +108 -108
  168. package/registry/components/expanded/Steps.tsx +402 -402
  169. package/registry/components/expanded/Table.tsx +1092 -1071
  170. package/registry/components/expanded/Timeline.tsx +203 -203
  171. package/registry/components/expanded/activityFeed.css +248 -248
  172. package/registry/components/expanded/activityHeatmap.css +66 -66
  173. package/registry/components/expanded/banner.css +260 -255
  174. package/registry/components/expanded/breadcrumbs.css +140 -140
  175. package/registry/components/expanded/catalogComponentsShowcase.css +87 -87
  176. package/registry/components/expanded/divider.css +75 -75
  177. package/registry/components/expanded/emptyState.css +111 -111
  178. package/registry/components/expanded/fileUpload.css +457 -457
  179. package/registry/components/expanded/onboardingStepListItem.css +135 -126
  180. package/registry/components/expanded/pageHeader.css +248 -290
  181. package/registry/components/expanded/slideout.css +276 -276
  182. package/registry/components/expanded/steps.css +356 -356
  183. package/registry/components/expanded/table.css +606 -603
  184. package/registry/components/expanded/timeline.css +286 -286
  185. package/registry/components/field.tsx +283 -283
  186. package/registry/components/hover-card.tsx +48 -48
  187. package/registry/components/inline-citations.css +126 -0
  188. package/registry/components/inline-citations.tsx +292 -0
  189. package/registry/components/input-content.ts +107 -107
  190. package/registry/components/input-group.tsx +130 -130
  191. package/registry/components/input-otp.tsx +584 -584
  192. package/registry/components/input.tsx +990 -972
  193. package/registry/components/item.tsx +189 -189
  194. package/registry/components/kbd.tsx +246 -151
  195. package/registry/components/label.tsx +78 -78
  196. package/registry/components/menu.tsx +978 -986
  197. package/registry/components/menubar.tsx +226 -226
  198. package/registry/components/modal.tsx +872 -872
  199. package/registry/components/native-select.tsx +205 -205
  200. package/registry/components/navigation-menu.tsx +171 -171
  201. package/registry/components/pagination.css +36 -36
  202. package/registry/components/pagination.tsx +560 -555
  203. package/registry/components/popover.tsx +338 -338
  204. package/registry/components/progress-slider.tsx +216 -216
  205. package/registry/components/radio-card.tsx +676 -677
  206. package/registry/components/radio-group.tsx +570 -570
  207. package/registry/components/resizable.tsx +108 -108
  208. package/registry/components/rolling-count.css +37 -0
  209. package/registry/components/rolling-count.tsx +110 -0
  210. package/registry/components/scroll-area.tsx +91 -91
  211. package/registry/components/segmented-control.tsx +87 -87
  212. package/registry/components/select-content.tsx +218 -218
  213. package/registry/components/select.tsx +937 -932
  214. package/registry/components/sheet.tsx +305 -305
  215. package/registry/components/shimmer-text.css +69 -0
  216. package/registry/components/shimmer-text.tsx +43 -0
  217. package/registry/components/sidebar.tsx +1433 -358
  218. package/registry/components/skeleton.css +54 -54
  219. package/registry/components/skeleton.tsx +482 -482
  220. package/registry/components/slider.tsx +380 -380
  221. package/registry/components/social-button.tsx +387 -387
  222. package/registry/components/spinner.tsx +78 -78
  223. package/registry/components/streaming-text.css +45 -0
  224. package/registry/components/streaming-text.tsx +165 -0
  225. package/registry/components/table-elements.tsx +128 -128
  226. package/registry/components/tabs.css +222 -218
  227. package/registry/components/tabs.tsx +241 -241
  228. package/registry/components/tag.tsx +423 -423
  229. package/registry/components/task-list.css +328 -0
  230. package/registry/components/task-list.tsx +429 -0
  231. package/registry/components/textarea.tsx +610 -610
  232. package/registry/components/thinking-reasoning.css +178 -0
  233. package/registry/components/thinking-reasoning.tsx +253 -0
  234. package/registry/components/thinking-state.css +8 -0
  235. package/registry/components/thinking-state.tsx +46 -0
  236. package/registry/components/toast.tsx +136 -136
  237. package/registry/components/toggle.tsx +256 -256
  238. package/registry/components/toolbar.tsx +539 -539
  239. package/registry/components/tooltip.tsx +433 -431
  240. package/registry/examples/agent-input-demo.tsx +90 -0
  241. package/registry/examples/alert-demo.tsx +34 -34
  242. package/registry/examples/alert-dialog-demo.tsx +42 -42
  243. package/registry/examples/approval-card-demo.tsx +83 -0
  244. package/registry/examples/aspect-ratio-demo.tsx +11 -11
  245. package/registry/examples/attribute-demo.tsx +65 -65
  246. package/registry/examples/autocomplete-demo.tsx +109 -109
  247. package/registry/examples/avatar-demo.tsx +132 -132
  248. package/registry/examples/badge-demo.tsx +69 -69
  249. package/registry/examples/button-demo.tsx +86 -83
  250. package/registry/examples/button-group-demo.tsx +63 -63
  251. package/registry/examples/card-demo.tsx +86 -86
  252. package/registry/examples/carousel-demo.tsx +43 -43
  253. package/registry/examples/chart-block-demo.tsx +5 -0
  254. package/registry/examples/chart-demo.tsx +18 -33
  255. package/registry/examples/checkbox-demo.tsx +62 -62
  256. package/registry/examples/collapsible-demo.tsx +16 -16
  257. package/registry/examples/collection-filter-bar-demo.tsx +135 -135
  258. package/registry/examples/command-demo.tsx +42 -42
  259. package/registry/examples/command-palette-demo.tsx +235 -236
  260. package/registry/examples/context-menu-demo.tsx +29 -29
  261. package/registry/examples/control-density-contract-demo.tsx +65 -61
  262. package/registry/examples/date-picker-demo.tsx +127 -127
  263. package/registry/examples/divider-demo.tsx +17 -17
  264. package/registry/examples/expanded/activity-heatmap-demo.tsx +29 -29
  265. package/registry/examples/expanded/banner-demo.tsx +48 -48
  266. package/registry/examples/expanded/breadcrumbs-demo.tsx +59 -59
  267. package/registry/examples/expanded/empty-state-demo.tsx +39 -39
  268. package/registry/examples/expanded/file-upload-demo.tsx +60 -60
  269. package/registry/examples/expanded/onboarding-step-demo.tsx +11 -11
  270. package/registry/examples/expanded/slideout-demo.tsx +15 -15
  271. package/registry/examples/expanded/steps-demo.tsx +29 -29
  272. package/registry/examples/expanded/tabs-demo.tsx +13 -13
  273. package/registry/examples/expanded/timeline-demo.tsx +18 -18
  274. package/registry/examples/field-demo.tsx +51 -51
  275. package/registry/examples/hover-card-demo.tsx +23 -23
  276. package/registry/examples/inline-citations-demo.tsx +31 -0
  277. package/registry/examples/input-actions-demo.tsx +36 -0
  278. package/registry/examples/input-demo.tsx +87 -87
  279. package/registry/examples/input-group-demo.tsx +16 -16
  280. package/registry/examples/input-otp-demo.tsx +72 -72
  281. package/registry/examples/item-demo.tsx +46 -46
  282. package/registry/examples/kbd-demo.tsx +12 -11
  283. package/registry/examples/label-demo.tsx +20 -20
  284. package/registry/examples/menu-demo.tsx +122 -122
  285. package/registry/examples/menubar-demo.tsx +34 -34
  286. package/registry/examples/modal-demo.tsx +74 -74
  287. package/registry/examples/native-select-demo.tsx +16 -16
  288. package/registry/examples/navigation-menu-demo.tsx +29 -29
  289. package/registry/examples/pagination-demo.tsx +20 -20
  290. package/registry/examples/popover-demo.tsx +547 -546
  291. package/registry/examples/progress-demo.tsx +37 -37
  292. package/registry/examples/progress-slider-demo.tsx +29 -29
  293. package/registry/examples/radio-card-demo.tsx +51 -51
  294. package/registry/examples/radio-group-demo.tsx +62 -62
  295. package/registry/examples/resizable-demo.tsx +22 -22
  296. package/registry/examples/results-toolbar-demo.tsx +44 -44
  297. package/registry/examples/rolling-count-demo.tsx +39 -0
  298. package/registry/examples/scroll-area-demo.tsx +15 -15
  299. package/registry/examples/segmented-control-demo.tsx +39 -39
  300. package/registry/examples/select-demo.tsx +87 -87
  301. package/registry/examples/sheet-demo.tsx +47 -47
  302. package/registry/examples/shimmer-text-demo.tsx +20 -0
  303. package/registry/examples/sidebar-demo.tsx +101 -57
  304. package/registry/examples/slider-demo.tsx +31 -31
  305. package/registry/examples/social-button-demo.tsx +61 -61
  306. package/registry/examples/spinner-demo.tsx +59 -59
  307. package/registry/examples/streaming-text-demo.tsx +28 -0
  308. package/registry/examples/tabs-demo.tsx +13 -13
  309. package/registry/examples/tag-demo.tsx +29 -29
  310. package/registry/examples/task-list-demo.tsx +74 -0
  311. package/registry/examples/textarea-demo.tsx +79 -79
  312. package/registry/examples/thinking-reasoning-demo.tsx +74 -0
  313. package/registry/examples/thinking-state-demo.tsx +13 -0
  314. package/registry/examples/toast-demo.tsx +35 -35
  315. package/registry/examples/toggle-demo.tsx +59 -59
  316. package/registry/examples/tooltip-demo.tsx +115 -115
  317. package/registry/guidance/USAGE.md +27 -27
  318. package/registry/guidance/charts.LICENSE.txt +24 -0
  319. package/registry/hooks/use-controllable-state.ts +33 -0
  320. package/registry/hooks/use-direction.ts +207 -207
  321. package/registry/hooks/use-listbox-navigation.ts +73 -0
  322. package/registry/hooks/use-motion-end.ts +55 -0
  323. package/registry/hooks/use-reduced-motion.ts +28 -0
  324. package/registry/index.json +1634 -184
  325. package/registry/styles/globals.css +1462 -1570
  326. package/registry.json +364 -10
  327. package/schema/config.schema.json +51 -51
  328. package/schema/registry.schema.json +194 -190
  329. package/schema/tokens.schema.json +167 -163
  330. package/src/cli/command-line.js +194 -194
  331. package/src/cli/config-editors.js +9 -9
  332. package/src/cli/doctor.js +399 -399
  333. package/src/cli/file-transaction.js +302 -295
  334. package/src/cli/global-css.js +153 -153
  335. package/src/cli/index.js +1002 -1009
  336. package/src/cli/install-plan.js +592 -592
  337. package/src/cli/install-receipt.js +171 -171
  338. package/src/cli/jsonc.js +203 -203
  339. package/src/cli/package-install-state.js +254 -254
  340. package/src/cli/package-manager.js +238 -238
  341. package/src/cli/package-plan.js +185 -185
  342. package/src/cli/package-version.js +97 -97
  343. package/src/cli/registry-query.js +207 -207
  344. package/src/cli/reporting.js +55 -55
  345. package/src/cli/schema-validation.js +19 -19
  346. package/src/cli/source-scanner.js +686 -686
  347. package/src/cli/vite-config.js +478 -478
  348. package/tokens/banhaten.tokens.json +458 -224
@@ -1,74 +1,74 @@
1
- # Alert Dialog
2
-
3
- Alert Dialog is the destructive or consequential confirmation primitive. It is backed by Radix AlertDialog so focus, Escape behavior, outside interaction, and alert-dialog semantics are handled by the correct primitive.
4
-
5
- ## API
6
-
7
- ```tsx
8
- <AlertDialog>
9
- <AlertDialogTrigger asChild>
10
- <Button variant="danger">Delete project</Button>
11
- </AlertDialogTrigger>
12
- <AlertDialogContent>
13
- <AlertDialogHeader>
14
- <AlertDialogIcon intent="danger" />
15
- <AlertDialogTitle>Delete project?</AlertDialogTitle>
16
- </AlertDialogHeader>
17
- <AlertDialogBody>
18
- <AlertDialogDescription>This cannot be undone.</AlertDialogDescription>
19
- </AlertDialogBody>
20
- <AlertDialogFooter>
21
- <AlertDialogCancel>Cancel</AlertDialogCancel>
22
- <AlertDialogAction>Delete project</AlertDialogAction>
23
- </AlertDialogFooter>
24
- </AlertDialogContent>
25
- </AlertDialog>
26
- ```
27
-
28
- | Part | Purpose |
29
- | --- | --- |
30
- | `AlertDialog`, `AlertDialogTrigger`, `AlertDialogPortal` | Radix AlertDialog shell |
31
- | `AlertDialogOverlay`, `AlertDialogContent` | modal alert surface |
32
- | `AlertDialogHeader`, `AlertDialogBody`, `AlertDialogFooter` | layout regions |
33
- | `AlertDialogTitle`, `AlertDialogDescription`, `AlertDialogIcon` | accessible warning copy |
34
- | `AlertDialogCancel`, `AlertDialogAction` | safe cancel and confirm actions |
35
-
36
- | Prop | Values |
37
- | --- | --- |
38
- | `size` | `sm`, `default`, `lg` |
39
- | `intent` | `default`, `warning`, `danger` |
40
-
41
- ## Token Contract
42
-
43
- Alert Dialog uses Banhaten raised surface, backdrop, border, radius, shadow, semantic intent, body typography, focus, and button tokens.
44
-
45
- ## RTL
46
-
47
- The surface inherits direction. Title and description use `dir="auto"` and action layout uses logical flex order.
48
-
49
- ## Accessibility
50
-
51
- Use Alert Dialog for destructive or irreversible choices. Focus should land on the cancel action by default when you build higher-level confirmations. `ConfirmModal` is wired on top of this alert-dialog primitive for the constrained confirmation pattern.
52
-
53
- ## Install
54
-
55
- ```bash
56
- npx banhaten add alert-dialog
57
- ```
58
-
59
- ## Examples
60
-
61
- Primary registry example: `examples/alert-dialog-demo.tsx`.
62
-
63
- Open the live component page or run `npx banhaten docs alert-dialog` to inspect source files, install command, and examples.
64
-
65
- ## RTL Rules
66
-
67
- - `inheritsDirection`: true
68
- - `textDirection`: Title and description use dir="auto" for Arabic and English copy.
69
- - `spacing`: Header, body, and footer use logical layout and Banhaten spacing tokens so action order and copy mirror naturally.
70
- - `semantics`: Radix AlertDialog provides the modal alert role, focus trap, and safe cancellation behavior.
71
-
1
+ # Alert Dialog
2
+
3
+ Alert Dialog is the destructive or consequential confirmation primitive. It is backed by Radix AlertDialog so focus, Escape behavior, outside interaction, and alert-dialog semantics are handled by the correct primitive.
4
+
5
+ ## API
6
+
7
+ ```tsx
8
+ <AlertDialog>
9
+ <AlertDialogTrigger asChild>
10
+ <Button variant="danger">Delete project</Button>
11
+ </AlertDialogTrigger>
12
+ <AlertDialogContent>
13
+ <AlertDialogHeader>
14
+ <AlertDialogIcon intent="danger" />
15
+ <AlertDialogTitle>Delete project?</AlertDialogTitle>
16
+ </AlertDialogHeader>
17
+ <AlertDialogBody>
18
+ <AlertDialogDescription>This cannot be undone.</AlertDialogDescription>
19
+ </AlertDialogBody>
20
+ <AlertDialogFooter>
21
+ <AlertDialogCancel>Cancel</AlertDialogCancel>
22
+ <AlertDialogAction>Delete project</AlertDialogAction>
23
+ </AlertDialogFooter>
24
+ </AlertDialogContent>
25
+ </AlertDialog>
26
+ ```
27
+
28
+ | Part | Purpose |
29
+ | --- | --- |
30
+ | `AlertDialog`, `AlertDialogTrigger`, `AlertDialogPortal` | Radix AlertDialog shell |
31
+ | `AlertDialogOverlay`, `AlertDialogContent` | modal alert surface |
32
+ | `AlertDialogHeader`, `AlertDialogBody`, `AlertDialogFooter` | layout regions |
33
+ | `AlertDialogTitle`, `AlertDialogDescription`, `AlertDialogIcon` | accessible warning copy |
34
+ | `AlertDialogCancel`, `AlertDialogAction` | safe cancel and confirm actions |
35
+
36
+ | Prop | Values |
37
+ | --- | --- |
38
+ | `size` | `sm`, `default`, `lg` |
39
+ | `intent` | `default`, `warning`, `danger` |
40
+
41
+ ## Token Contract
42
+
43
+ Alert Dialog uses Banhaten raised surface, backdrop, border, radius, shadow, semantic intent, body typography, focus, and button tokens.
44
+
45
+ ## RTL
46
+
47
+ The surface inherits direction. Title and description use `dir="auto"` and action layout uses logical flex order.
48
+
49
+ ## Accessibility
50
+
51
+ Use Alert Dialog for destructive or irreversible choices. Focus should land on the cancel action by default when you build higher-level confirmations. `ConfirmModal` is wired on top of this alert-dialog primitive for the constrained confirmation pattern.
52
+
53
+ ## Install
54
+
55
+ ```bash
56
+ npx banhaten add alert-dialog
57
+ ```
58
+
59
+ ## Examples
60
+
61
+ Primary registry example: `examples/alert-dialog-demo.tsx`.
62
+
63
+ Open the live component page or run `npx banhaten docs alert-dialog` to inspect source files, install command, and examples.
64
+
65
+ ## RTL Rules
66
+
67
+ - `inheritsDirection`: true
68
+ - `textDirection`: Title and description use dir="auto" for Arabic and English copy.
69
+ - `spacing`: Header, body, and footer use logical layout and Banhaten spacing tokens so action order and copy mirror naturally.
70
+ - `semantics`: Radix AlertDialog provides the modal alert role, focus trap, and safe cancellation behavior.
71
+
72
72
  <!-- registry-contract:start -->
73
73
  ## Registry Contract
74
74
 
@@ -83,5 +83,5 @@ This table is generated from `registry/index.json`; edit the component-owned sou
83
83
  | `features` | `alert-dialog semantics`, `cancel focus pattern`, `safe cancel action`, `destructive action`, `semantic intent icon` |
84
84
  | `intents` | `default`, `warning`, `danger` |
85
85
  | `sizes` | `sm`, `default`, `lg` |
86
- | `tokens` | `--bh-alert-dialog-border`, `--bh-alert-dialog-width`, `--bh-bg-backdrop`, `--bh-bg-danger-subtle`, `--bh-bg-neutral-subtle`, `--bh-bg-raised`, `--bh-bg-warning-subtle`, `--bh-border-subtle`, `--bh-border-width-default`, `--bh-content-danger-default`, `--bh-content-default`, `--bh-content-subtle`, `--bh-content-warning-default`, `--bh-icon-stroke-200`, `--bh-radius-2xl-12`, `--bh-radius-full`, `--bh-space-12xl-128`, `--bh-space-16xl-256`, `--bh-space-19xl-384`, `--bh-space-3xl-16`, `--bh-space-4xl-20`, `--bh-space-5xl-24`, `--bh-space-8xl-48`, `--bh-space-9xl-64`, `--bh-space-lg-10`, `--bh-space-md-8`, `--bh-space-sm-6`, `--bh-space-xs-4`, `--bh-text-body-md-regular-font-size`, `--bh-text-body-md-regular-font-weight`, `--bh-text-body-md-regular-letter-spacing`, `--bh-text-body-md-regular-line-height`, `--bh-text-heading-sm-semibold-font-size`, `--bh-text-heading-sm-semibold-font-weight`, `--bh-text-heading-sm-semibold-letter-spacing`, `--bh-text-heading-sm-semibold-line-height`, `--bh-z-overlay`, `--shadow-lg`, `--shadow-modal` |
86
+ | `tokens` | `--bh-alert-dialog-border`, `--bh-alert-dialog-width`, `--bh-bg-backdrop`, `--bh-bg-danger-subtle`, `--bh-bg-neutral-subtle`, `--bh-bg-raised`, `--bh-bg-warning-subtle`, `--bh-border-subtle`, `--bh-border-width-default`, `--bh-content-danger-default`, `--bh-content-default`, `--bh-content-subtle`, `--bh-content-warning-default`, `--bh-icon-stroke-200`, `--bh-radius-2xl-12`, `--bh-radius-full`, `--bh-space-12xl-128`, `--bh-space-16xl-256`, `--bh-space-19xl-384`, `--bh-space-3xl-16`, `--bh-space-4xl-20`, `--bh-space-5xl-24`, `--bh-space-8xl-48`, `--bh-space-9xl-64`, `--bh-space-lg-10`, `--bh-space-md-8`, `--bh-space-sm-6`, `--bh-space-xs-4`, `--bh-text-body-md-regular-font-size`, `--bh-text-body-md-regular-font-weight`, `--bh-text-body-md-regular-letter-spacing`, `--bh-text-body-md-regular-line-height`, `--bh-text-heading-sm-semibold-font-size`, `--bh-text-heading-sm-semibold-font-weight`, `--bh-text-heading-sm-semibold-letter-spacing`, `--bh-text-heading-sm-semibold-line-height`, `--bh-z-overlay`, `--elevation-06`, `--elevation-modal` |
87
87
  <!-- registry-contract:end -->
@@ -1,100 +1,100 @@
1
- # Alert
2
-
3
- `Alert` presents contextual feedback with compact and expandable layouts.
4
-
5
- Figma reference: `Design system 3.0 Copy / Alert`, node `158:4645`.
6
-
7
- ## Variants
8
-
9
- The implementation covers the Alert matrix from Figma:
10
-
11
- | Prop | Values |
12
- | --- | --- |
13
- | `status` | `danger`, `success`, `warning`, `info`, `neutral` |
14
- | `isExpandable` | `false`, `true` |
15
- | `dir` | `ltr`, `rtl` |
16
-
17
- ## API
18
-
19
- ```tsx
20
- <Alert status="danger" title="Unable to save" />
21
- <Alert
22
- actions={[{ label: "عرض التفاصيل", onClick: openDetails }]}
23
- status="success"
24
- isExpandable
25
- dir="rtl"
26
- title="تم الحفظ"
27
- />
28
- ```
29
-
30
- | Prop | Default |
31
- | --- | --- |
32
- | `status` | `neutral` |
33
- | `isExpandable` | `false`; requires at least one visible action |
34
- | `dir` | inherited |
35
- | `title` | none |
36
- | `description` | none |
37
- | `messages` | English close-button message; accepts partial localized overrides |
38
- | `closeLabel` | overrides `messages.close` |
39
- | `actions` | none |
40
- | `showActions` | auto when actions exist |
41
- | `showCloseButton` | auto when `onClose` exists |
42
- | `onClose` | none |
43
-
44
- ## Pixel Rules
45
-
46
- - Compact alerts are `470px` wide and `56px` tall with `16px` padding.
47
- - Expandable alerts are `500px` wide, content-sized, and use `20px 16px` padding.
48
- - `isExpandable` falls back to the compact layout when no action is visible.
49
- - Compact rows use `8px` radius; expandable rows use `10px` radius.
50
- - Status icons and close controls are `20px`; the close glyph is `16px`.
51
- - Compact content uses `8px` between icon and title.
52
- - Expanded titles align to the block-start edge of the status icon.
53
- - Expandable content uses `12px` between icon, copy, close, and action rows.
54
- - The description-to-actions gap remains exactly `12px` as copy wraps.
55
- - Expanded action rows retain `20px` of block-end padding.
56
- - Expanded height grows with title and description content; direction does not select a height.
57
- - Titles use `15px / 24px` medium text.
58
- - Descriptions use `14px / 20px` regular text at `80%` opacity.
59
-
60
- ## Token Contract
61
-
62
- The component consumes Banhaten semantic tokens and component aliases. Do not hard-code Figma fallback literals in component source; promote any Figma value into its owned `tokens/source/` fragment as a `--bh-*` token or alias first.
63
-
64
- - Backgrounds: `--bh-bg-danger-subtle`, `--bh-bg-success-subtle`, `--bh-bg-warning-subtle`, `--bh-bg-info-subtle`, `--bh-bg-neutral-subtle`
65
- - Borders: `--bh-border-danger-subtle`, `--bh-border-success-subtle`, `--bh-border-warning-subtle`, `--bh-border-info-subtle`, `--bh-border-subtle`, `--bh-border-default`
66
- - Content: `--bh-content-danger-strong`, `--bh-content-success-strong`, `--bh-content-warning-strong`, `--bh-content-brand-strong`, `--bh-content-default`
67
- - Shape: `--bh-radius-lg-8`, `--bh-radius-xl-10`, `--bh-radius-full`
68
- - Space: `--bh-space-md-8`, `--bh-space-xl-12`, `--bh-space-3xl-16`, `--bh-space-4xl-20`
69
-
70
- ## Accessibility
71
-
72
- - The close affordance is a real button.
73
- - Action links are rendered as real buttons to support product actions.
74
- - Warning and danger use `role="alert"`; other statuses use `role="status"` unless overridden.
75
- - `dir` inherits by default and controls visual and reading direction only.
76
- - The close button keeps its English default under RTL. Pass `closeLabel` or `messages` for localized accessibility copy.
77
- - Product copy and action behavior are always explicit; the component does not ship demo text or no-op controls.
78
-
79
- ## Install
80
-
81
- ```bash
82
- npx banhaten add alert
83
- ```
84
-
85
- ## Examples
86
-
87
- Primary registry example: `examples/alert-demo.tsx`.
88
-
89
- Open the live component page or run `npx banhaten docs alert` to inspect source files, install command, and examples.
90
-
91
- ## RTL Rules
92
-
93
- - `inheritsDirection`: true
94
- - `messages`: Direction does not select the close-button language. Pass closeLabel or messages explicitly.
95
- - `textAlignment`: Uses dir="auto" on title and description while the root dir prop mirrors icon, action, and close placement.
96
- - `spacing`: Uses flexbox, gap, and logical direction so compact and expandable RTL layouts match the Figma matrix.
97
-
1
+ # Alert
2
+
3
+ `Alert` presents contextual feedback with compact and expandable layouts.
4
+
5
+ Figma reference: `Design system 3.0 Copy / Alert`, node `158:4645`.
6
+
7
+ ## Variants
8
+
9
+ The implementation covers the Alert matrix from Figma:
10
+
11
+ | Prop | Values |
12
+ | --- | --- |
13
+ | `status` | `danger`, `success`, `warning`, `info`, `neutral` |
14
+ | `isExpandable` | `false`, `true` |
15
+ | `dir` | `ltr`, `rtl` |
16
+
17
+ ## API
18
+
19
+ ```tsx
20
+ <Alert status="danger" title="Unable to save" />
21
+ <Alert
22
+ actions={[{ label: "عرض التفاصيل", onClick: openDetails }]}
23
+ status="success"
24
+ isExpandable
25
+ dir="rtl"
26
+ title="تم الحفظ"
27
+ />
28
+ ```
29
+
30
+ | Prop | Default |
31
+ | --- | --- |
32
+ | `status` | `neutral` |
33
+ | `isExpandable` | `false`; requires at least one visible action |
34
+ | `dir` | inherited |
35
+ | `title` | none |
36
+ | `description` | none |
37
+ | `messages` | English close-button message; accepts partial localized overrides |
38
+ | `closeLabel` | overrides `messages.close` |
39
+ | `actions` | none |
40
+ | `showActions` | auto when actions exist |
41
+ | `showCloseButton` | auto when `onClose` exists |
42
+ | `onClose` | none |
43
+
44
+ ## Pixel Rules
45
+
46
+ - Compact alerts are `470px` wide and `56px` tall with `16px` padding.
47
+ - Expandable alerts are `500px` wide, content-sized, and use `20px 16px` padding.
48
+ - `isExpandable` falls back to the compact layout when no action is visible.
49
+ - Compact rows use `8px` radius; expandable rows use `10px` radius.
50
+ - Status glyphs are `18px` in `20px` slots; close controls are `20px` with a `16px` close glyph.
51
+ - Compact content uses `8px` between icon and title.
52
+ - Expanded titles align to the block-start edge of the status icon.
53
+ - Expandable content uses `12px` between icon, copy, close, and action rows.
54
+ - The description-to-actions gap remains exactly `12px` as copy wraps.
55
+ - Expanded action rows retain `20px` of block-end padding.
56
+ - Expanded height grows with title and description content; direction does not select a height.
57
+ - Titles use `15px / 24px` medium text.
58
+ - Descriptions use `14px / 20px` regular text at `80%` opacity.
59
+
60
+ ## Token Contract
61
+
62
+ The component consumes Banhaten semantic tokens and component aliases. Do not hard-code Figma fallback literals in component source; promote any Figma value into its owned `tokens/source/` fragment as a `--bh-*` token or alias first.
63
+
64
+ - Backgrounds: `--bh-bg-danger-subtle`, `--bh-bg-success-subtle`, `--bh-bg-warning-subtle`, `--bh-bg-info-subtle`, `--bh-bg-neutral-subtle`
65
+ - Borders: `--bh-border-danger-subtle`, `--bh-border-success-subtle`, `--bh-border-warning-subtle`, `--bh-border-info-subtle`, `--bh-border-subtle`, `--bh-border-default`
66
+ - Content: `--bh-content-danger-strong`, `--bh-content-success-strong`, `--bh-content-warning-strong`, `--bh-content-brand-strong`, `--bh-content-default`
67
+ - Shape: `--bh-radius-lg-8`, `--bh-radius-xl-10`, `--bh-radius-full`
68
+ - Space: `--bh-space-md-8`, `--bh-space-xl-12`, `--bh-space-3xl-16`, `--bh-space-4xl-20`
69
+
70
+ ## Accessibility
71
+
72
+ - The close affordance is a real button.
73
+ - Action links are rendered as real buttons to support product actions.
74
+ - Warning and danger use `role="alert"`; other statuses use `role="status"` unless overridden.
75
+ - `dir` inherits by default and controls visual and reading direction only.
76
+ - The close button keeps its English default under RTL. Pass `closeLabel` or `messages` for localized accessibility copy.
77
+ - Product copy and action behavior are always explicit; the component does not ship demo text or no-op controls.
78
+
79
+ ## Install
80
+
81
+ ```bash
82
+ npx banhaten add alert
83
+ ```
84
+
85
+ ## Examples
86
+
87
+ Primary registry example: `examples/alert-demo.tsx`.
88
+
89
+ Open the live component page or run `npx banhaten docs alert` to inspect source files, install command, and examples.
90
+
91
+ ## RTL Rules
92
+
93
+ - `inheritsDirection`: true
94
+ - `messages`: Direction does not select the close-button language. Pass closeLabel or messages explicitly.
95
+ - `textAlignment`: Uses dir="auto" on title and description while the root dir prop mirrors icon, action, and close placement.
96
+ - `spacing`: Uses flexbox, gap, and logical direction so compact and expandable RTL layouts match the Figma matrix.
97
+
98
98
  <!-- registry-contract:start -->
99
99
  ## Registry Contract
100
100
 
@@ -106,6 +106,6 @@ This table is generated from `registry/index.json`; edit the component-owned sou
106
106
  | `supportedExports` | `components/alert.tsx: Alert, alertVariants, arabicAlertMessages` |
107
107
  | `parts` | `Alert` |
108
108
  | `registryDependencies` | `button` |
109
- | `tokens` | `--bh-alert-compact-height`, `--bh-alert-compact-padding`, `--bh-alert-compact-radius`, `--bh-alert-compact-width`, `--bh-alert-expanded-padding-x`, `--bh-alert-expanded-padding-y`, `--bh-alert-expanded-radius`, `--bh-alert-expanded-width`, `--bh-alert-icon-size`, `--bh-bg-danger-subtle`, `--bh-bg-info-subtle`, `--bh-bg-neutral-subtle`, `--bh-bg-success-subtle`, `--bh-bg-warning-subtle`, `--bh-border-danger-subtle`, `--bh-border-default`, `--bh-border-info-subtle`, `--bh-border-subtle`, `--bh-border-success-subtle`, `--bh-border-warning-subtle`, `--bh-border-width-default`, `--bh-content-brand-default`, `--bh-content-brand-strong`, `--bh-content-danger-default`, `--bh-content-danger-strong`, `--bh-content-default`, `--bh-content-subtle`, `--bh-content-success-default`, `--bh-content-success-strong`, `--bh-content-warning-default`, `--bh-content-warning-strong`, `--bh-font-family`, `--bh-font-weight-medium`, `--bh-font-weight-regular`, `--bh-icon-stroke-225`, `--bh-radius-full`, `--bh-space-3xl-16`, `--bh-space-md-8`, `--bh-space-xl-12`, `--bh-space-xs-4`, `--bh-space-xxs-2`, `--bh-text-base-letter-spacing`, `--bh-text-body-md-medium-font-size`, `--bh-text-body-md-medium-letter-spacing`, `--bh-text-body-md-medium-line-height`, `--bh-text-body-md-underline-font-size`, `--bh-text-body-md-underline-font-weight`, `--bh-text-body-md-underline-letter-spacing`, `--bh-text-body-md-underline-line-height`, `--bh-text-body-sm-regular-font-size`, `--bh-text-body-sm-regular-letter-spacing`, `--bh-text-body-sm-regular-line-height` |
109
+ | `tokens` | `--bh-alert-compact-height`, `--bh-alert-compact-padding`, `--bh-alert-compact-radius`, `--bh-alert-compact-width`, `--bh-alert-expanded-padding-x`, `--bh-alert-expanded-padding-y`, `--bh-alert-expanded-radius`, `--bh-alert-expanded-width`, `--bh-alert-icon-size`, `--bh-alert-icon-slot-size`, `--bh-bg-danger-subtle`, `--bh-bg-info-subtle`, `--bh-bg-neutral-subtle`, `--bh-bg-success-subtle`, `--bh-bg-warning-subtle`, `--bh-border-danger-subtle`, `--bh-border-default`, `--bh-border-info-subtle`, `--bh-border-subtle`, `--bh-border-success-subtle`, `--bh-border-warning-subtle`, `--bh-border-width-default`, `--bh-content-brand-default`, `--bh-content-brand-strong`, `--bh-content-danger-default`, `--bh-content-danger-strong`, `--bh-content-default`, `--bh-content-subtle`, `--bh-content-success-default`, `--bh-content-success-strong`, `--bh-content-warning-default`, `--bh-content-warning-strong`, `--bh-font-family`, `--bh-font-weight-medium`, `--bh-font-weight-regular`, `--bh-icon-stroke-225`, `--bh-radius-full`, `--bh-space-3xl-16`, `--bh-space-md-8`, `--bh-space-xl-12`, `--bh-space-xs-4`, `--bh-space-xxs-2`, `--bh-text-base-letter-spacing`, `--bh-text-body-md-medium-font-size`, `--bh-text-body-md-medium-letter-spacing`, `--bh-text-body-md-medium-line-height`, `--bh-text-body-md-underline-font-size`, `--bh-text-body-md-underline-font-weight`, `--bh-text-body-md-underline-letter-spacing`, `--bh-text-body-md-underline-line-height`, `--bh-text-body-sm-regular-font-size`, `--bh-text-body-sm-regular-letter-spacing`, `--bh-text-body-sm-regular-line-height` |
110
110
  | `variants` | `danger`, `success`, `warning`, `info`, `neutral` |
111
111
  <!-- registry-contract:end -->
@@ -0,0 +1,134 @@
1
+ # Approval Card
2
+
3
+ Approval cards pause the agent for a human decision. `ApprovalQuestions` walks through up to a few single-choice questions with a free-text "Something else" option, `ApprovalCommand` asks to run a shell command, and `ApprovalPlan` presents a short plan as a pending to-do list with an optional auto-approve countdown. All three compose `ApprovalFrame`, the shared shell: a tinted icon header, the body, and an action row. Compose it yourself for another kind of decision.
4
+
5
+ Questions slide vertically inside a viewport sized to the active one, step badges and countdown seconds roll their digits, and the plan composes Task List parts: a well root, a static header with the step count, and a preview fold.
6
+
7
+ ## API
8
+
9
+ ```tsx
10
+ import {
11
+ ApprovalCommand,
12
+ ApprovalPlan,
13
+ ApprovalQuestions,
14
+ } from "@/components/ui/approval-card"
15
+
16
+ <ApprovalQuestions
17
+ onApprove={({ answers }) => submit(answers)}
18
+ onReject={skip}
19
+ questions={questions}
20
+ />
21
+
22
+ <ApprovalCommand command="pnpm db:migrate && pnpm build" cwd="~/acme" onApprove={run} onReject={skip} />
23
+
24
+ <ApprovalPlan onApprove={({ source }) => approve(source)} onViewPlan={openPlan} plan={plan} planTitle="Session auth migration" />
25
+ ```
26
+
27
+ Every card also takes `title` and `approveLabel`, each with its own default, plus native `div` props.
28
+
29
+ ### ApprovalQuestions
30
+
31
+ | Prop | Type | Default | Description |
32
+ | --- | --- | --- | --- |
33
+ | `questions` | `readonly ApprovalQuestion[]` | – | `{ id, prompt, options }` answered one at a time. |
34
+ | `onApprove` | `(payload: { answers }) => void` | – | Fires once every question has an answer. |
35
+ | `onReject` / `rejectLabel` | `() => void` / `string` | – / `"Skip"` | The skip action. |
36
+ | `labels` | `Partial<ApprovalQuestionsLabels>` | English | Navigation and free-text copy. |
37
+
38
+ ### ApprovalCommand
39
+
40
+ | Prop | Type | Default | Description |
41
+ | --- | --- | --- | --- |
42
+ | `command` / `cwd` | `string` | – | Command block content and the working directory above it. |
43
+ | `onApprove` / `onReject` | `() => void` | – | Run and Skip actions. |
44
+ | `rejectLabel` | `string` | `"Skip"` | Skip action copy. |
45
+
46
+ ### ApprovalPlan
47
+
48
+ | Prop | Type | Default | Description |
49
+ | --- | --- | --- | --- |
50
+ | `plan` | `readonly ApprovalPlanStep[]` | – | Steps as `{ id, title }`, shown as pending to-do rows. Keep step details for the full plan that `onViewPlan` opens. |
51
+ | `planTitle` / `planSummary` | `React.ReactNode` | – | Intro copy above the steps. |
52
+ | `planPreviewCount` | `number` | `3` | Steps shown before the "more" fold. |
53
+ | `autoApproveSeconds` | `number` | `0` | Opt-in countdown. At zero `onApprove` fires with `source: "timeout"`; choosing either action cancels it, and a new value restarts it. |
54
+ | `onApprove` | `(payload: { source }) => void` | – | `source` is `"user"` for a click or `"timeout"` for the countdown. |
55
+ | `onViewPlan` / `viewPlanLabel` | `() => void` / `string` | – / `"View plan"` | Secondary action that opens the full plan. |
56
+ | `onDownload` / `onExpand` | `() => void` | – | Adds header actions. |
57
+ | `labels` | `Partial<ApprovalPlanLabels>` | English | Countdown, fold, and header action copy. |
58
+
59
+ ### ApprovalFrame
60
+
61
+ ```tsx
62
+ import { ApprovalFrame } from "@/components/ui/approval-card"
63
+
64
+ <ApprovalFrame
65
+ approveLabel="Apply"
66
+ icon={<GitCompareIcon />}
67
+ onApprove={apply}
68
+ onSecondary={review}
69
+ secondaryLabel="Review"
70
+ title="Apply this change?"
71
+ tone="warning"
72
+ >
73
+ <DiffSummary files={files} />
74
+ </ApprovalFrame>
75
+ ```
76
+
77
+ | Prop | Type | Default | Description |
78
+ | --- | --- | --- | --- |
79
+ | `icon` / `tone` | `React.ReactNode` / `"info" \| "warning" \| "success"` | – | Header glyph in a tile tinted by `tone`; the tile sets the glyph's size and stroke. The ready-made cards use info for questions, warning for commands, and success for plans. |
80
+ | `title` | `React.ReactNode` | – | Header copy. |
81
+ | `approveLabel` / `onApprove` / `approveDisabled` | `string` / `() => void` / `boolean` | – / – / `false` | Primary action, disabled until the decision is complete. |
82
+ | `secondaryLabel` / `onSecondary` | `string` / `() => void` | – | Secondary action. |
83
+ | `headerActions` / `footerStart` | `React.ReactNode` | – | Controls at the end of the header, and content at the start of the action row. |
84
+
85
+ ## Install
86
+
87
+ ```bash
88
+ npx banhaten add approval-card
89
+ ```
90
+
91
+ ## Examples
92
+
93
+ Primary registry example: `examples/approval-card-demo.tsx`.
94
+
95
+ ## Token Contract
96
+
97
+ The card uses `--bh-bg-raised`, `--bh-radius-2xl-12`, `--elevation-02`, and `--bh-space-xl-12` padding. Icon tiles map the info, warning, and success tones to `--bh-bg-info-subtle`, `--bh-bg-warning-subtle`, and `--bh-bg-success-subtle` with the matching content tokens, and stroke their glyph with `--bh-icon-stroke-200`. Options use `--bh-border-subtle`, `--bh-radius-lg-8`, and lift to `--elevation-02` when selected while their Kbd fills with `--bh-bg-inverse`. The command block uses `--bh-font-family-mono` on `--bh-bg-subtle`. Slides and fades use the `--bh-duration-slow` and `--bh-duration-moderate` foundation tokens with `--bh-easing-emphasized`. The countdown ring drains linearly over each one-second tick, and the countdown unmounts when its fade ends.
98
+
99
+ Covered source files: `components/approval-card.tsx`, the internal `components/approval-frame.tsx` and `components/approval-questions.tsx`, `components/approval-card.css`, and the `button`, `kbd`, `rolling-count`, `task-list`, and `tooltip` registry dependencies.
100
+
101
+ ## RTL Rules
102
+
103
+ - Header, options, and actions inherit direction and use logical alignment.
104
+ - The command block and working directory stay LTR; the submit arrow mirrors.
105
+
106
+ ## Accessibility
107
+
108
+ In `ApprovalQuestions`, each question is a group of native radio inputs labelled by its prompt: Tab reaches the group once, arrow keys move the choice without skipping ahead, the letter shown on each option picks it, and Enter confirms the answer. "Something else" is its own radio next to the text field, and Enter in the field commits the typed answer unless it is confirming an IME composition; inactive questions are hidden from assistive technology and removed from the tab order. Enter on the last answered question approves. The previous and next controls form a group named by `questionOf`, such as "Question 2 of 3". The countdown is a polite live region whose ring is also a labelled cancel button with a Tooltip. Slides, rolls, and fades collapse to instant changes under `prefers-reduced-motion`.
109
+
110
+ <!-- registry-contract:start -->
111
+ ## Registry Contract
112
+
113
+ This table is generated from `registry/index.json`; edit the component-owned source under `registry/catalog/components/`, not this table or the compiled index.
114
+ `supportedExports` is the exhaustive runtime import contract grouped by source module. `parts` is an ordered, non-exhaustive anatomy list.
115
+
116
+ | Field | Values |
117
+ | --- | --- |
118
+ | `supportedExports` | `components/approval-card.tsx: ApprovalCommand, ApprovalFrame, ApprovalPlan, ApprovalQuestions` |
119
+ | `parts` | `ApprovalQuestions`, `ApprovalCommand`, `ApprovalPlan`, `ApprovalFrame` |
120
+ | `registryDependencies` | `button`, `kbd`, `rolling-count`, `task-list`, `tooltip` |
121
+ | `props.questions` | `readonly ApprovalQuestion[]; default null; ApprovalQuestions: single-choice questions, each with a free-text Something else option.` |
122
+ | `props.command` | `string; default null; ApprovalCommand: shell command shown in the mono block.` |
123
+ | `props.cwd` | `string; default null; ApprovalCommand: working directory shown above the command.` |
124
+ | `props.plan` | `readonly ApprovalPlanStep[]; default null; ApprovalPlan: steps with an id and a title, rendered as a pending to-do list. Step details belong in the full plan.` |
125
+ | `props.planPreviewCount` | `number; default "3"; ApprovalPlan: steps shown before the more fold.` |
126
+ | `props.autoApproveSeconds` | `number; default "0"; ApprovalPlan: opt-in countdown; at zero onApprove fires with source timeout. Either action cancels it. A new value restarts it.` |
127
+ | `props.icon` | `React.ReactNode; default null; ApprovalFrame: header glyph, sized and stroked by the tinted icon tile.` |
128
+ | `props.tone` | `"info" \| "warning" \| "success"; default null; ApprovalFrame: tint of the icon tile. Questions use info, commands warning, and plans success.` |
129
+ | `props.onApprove` | `callback; default null; Primary action. ApprovalQuestions passes { answers }, ApprovalPlan passes { source: user \| timeout }, and ApprovalCommand passes nothing.` |
130
+ | `props.onReject` | `() => void; default null; Skip action on ApprovalQuestions and ApprovalCommand.` |
131
+ | `props.onViewPlan` | `() => void; default null; ApprovalPlan secondary action that opens the full plan; it also stops the countdown.` |
132
+ | `props.labels` | `Partial<ApprovalQuestionsLabels> \| Partial<ApprovalPlanLabels>; default "English"; Localized navigation, countdown, and helper copy for the card that uses them.` |
133
+ | `tokens` | `--bh-bg-info-subtle`, `--bh-bg-inverse`, `--bh-bg-raised`, `--bh-bg-subtle`, `--bh-bg-success-subtle`, `--bh-bg-warning-subtle`, `--bh-border-subtle`, `--bh-border-success-subtle`, `--bh-border-width-default`, `--bh-content-default`, `--bh-content-information-default`, `--bh-content-inverse`, `--bh-content-muted`, `--bh-content-subtle`, `--bh-content-success-default`, `--bh-content-warning-default`, `--bh-duration-default`, `--bh-duration-fast`, `--bh-duration-moderate`, `--bh-duration-slow`, `--bh-easing-emphasized`, `--bh-easing-standard`, `--bh-font-family`, `--bh-font-family-mono`, `--bh-icon-stroke-180`, `--bh-icon-stroke-200`, `--bh-icon-stroke-250`, `--bh-opacity-0`, `--bh-opacity-100`, `--bh-radius-2xl-12`, `--bh-radius-full`, `--bh-radius-lg-8`, `--bh-radius-md-6`, `--bh-space-2xl-14`, `--bh-space-3xl-16`, `--bh-space-5xl-24`, `--bh-space-6xl-32`, `--bh-space-lg-10`, `--bh-space-md-8`, `--bh-space-sm-6`, `--bh-space-xl-12`, `--bh-space-xs-4`, `--bh-space-xxs-2`, `--bh-space-xxxs-1`, `--bh-text-body-2xs-medium-font-size`, `--bh-text-body-2xs-medium-font-weight`, `--bh-text-body-2xs-regular-font-size`, `--bh-text-body-2xs-regular-line-height`, `--bh-text-body-3xs-regular-font-size`, `--bh-text-body-3xs-regular-line-height`, `--bh-text-body-md-medium-font-size`, `--bh-text-body-md-medium-font-weight`, `--bh-text-body-md-medium-letter-spacing`, `--bh-text-body-md-medium-line-height`, `--bh-text-body-xs-medium-font-weight`, `--bh-text-body-xs-regular-font-size`, `--bh-text-body-xs-regular-font-weight`, `--bh-text-body-xs-regular-letter-spacing`, `--bh-text-body-xs-regular-line-height`, `--elevation-02`, `--elevation-component-focus-ring` |
134
+ <!-- registry-contract:end -->
@@ -1,48 +1,48 @@
1
- # Aspect Ratio
2
-
3
- Aspect Ratio wraps Radix AspectRatio for fixed-format media, screenshots, and preview surfaces.
4
-
5
- ## API
6
-
7
- ```tsx
8
- <AspectRatio ratio={16 / 9}>
9
- <img src="/preview.png" alt="Preview" />
10
- </AspectRatio>
11
- ```
12
-
13
- | Prop | Values |
14
- | --- | --- |
15
- | `ratio` | any positive number |
16
-
17
- ## Token Contract
18
-
19
- Aspect Ratio uses Banhaten neutral background and radius tokens by default.
20
-
21
- ## RTL
22
-
23
- Aspect Ratio is direction-neutral.
24
-
25
- ## Accessibility
26
-
27
- Provide accessible names for media rendered inside the ratio box.
28
-
29
- ## Install
30
-
31
- ```bash
32
- npx banhaten add aspect-ratio
33
- ```
34
-
35
- ## Examples
36
-
37
- Primary registry example: `examples/aspect-ratio-demo.tsx`.
38
-
39
- Open the live component page or run `npx banhaten docs aspect-ratio` to inspect source files, install command, and examples.
40
-
41
- ## RTL Rules
42
-
43
- - `inheritsDirection`: false
44
- - `geometry`: Aspect Ratio controls media geometry and does not alter text direction.
45
-
1
+ # Aspect Ratio
2
+
3
+ Aspect Ratio wraps Radix AspectRatio for fixed-format media, screenshots, and preview surfaces.
4
+
5
+ ## API
6
+
7
+ ```tsx
8
+ <AspectRatio ratio={16 / 9}>
9
+ <img src="/preview.png" alt="Preview" />
10
+ </AspectRatio>
11
+ ```
12
+
13
+ | Prop | Values |
14
+ | --- | --- |
15
+ | `ratio` | any positive number |
16
+
17
+ ## Token Contract
18
+
19
+ Aspect Ratio uses Banhaten neutral background and radius tokens by default.
20
+
21
+ ## RTL
22
+
23
+ Aspect Ratio is direction-neutral.
24
+
25
+ ## Accessibility
26
+
27
+ Provide accessible names for media rendered inside the ratio box.
28
+
29
+ ## Install
30
+
31
+ ```bash
32
+ npx banhaten add aspect-ratio
33
+ ```
34
+
35
+ ## Examples
36
+
37
+ Primary registry example: `examples/aspect-ratio-demo.tsx`.
38
+
39
+ Open the live component page or run `npx banhaten docs aspect-ratio` to inspect source files, install command, and examples.
40
+
41
+ ## RTL Rules
42
+
43
+ - `inheritsDirection`: false
44
+ - `geometry`: Aspect Ratio controls media geometry and does not alter text direction.
45
+
46
46
  <!-- registry-contract:start -->
47
47
  ## Registry Contract
48
48