banhaten 0.5.0 → 0.6.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 (290) hide show
  1. package/CHANGELOG.md +177 -139
  2. package/CONTRIBUTING.md +46 -46
  3. package/README.md +192 -192
  4. package/SECURITY.md +15 -15
  5. package/banhaten.config.example.json +11 -11
  6. package/docs/design-spacing.md +13 -13
  7. package/docs/design-system/README.md +22 -22
  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 -245
  16. package/docs/design-system/component-quality-audit-2026-08-20.md +225 -225
  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 +91 -90
  20. package/docs/design-system/components/accordion.md +52 -52
  21. package/docs/design-system/components/activity-feed.md +93 -93
  22. package/docs/design-system/components/activity-heatmap.md +56 -56
  23. package/docs/design-system/components/alert-dialog.md +71 -71
  24. package/docs/design-system/components/alert.md +103 -97
  25. package/docs/design-system/components/app-header.md +97 -0
  26. package/docs/design-system/components/aspect-ratio.md +45 -45
  27. package/docs/design-system/components/attribute.md +101 -89
  28. package/docs/design-system/components/autocomplete.md +75 -75
  29. package/docs/design-system/components/avatar.md +53 -53
  30. package/docs/design-system/components/badge.md +55 -55
  31. package/docs/design-system/components/banner.md +86 -86
  32. package/docs/design-system/components/breadcrumbs.md +181 -177
  33. package/docs/design-system/components/button-group.md +97 -97
  34. package/docs/design-system/components/button.md +80 -80
  35. package/docs/design-system/components/card.md +102 -88
  36. package/docs/design-system/components/carousel.md +46 -46
  37. package/docs/design-system/components/catalog-components.md +46 -46
  38. package/docs/design-system/components/checkbox.md +53 -53
  39. package/docs/design-system/components/collapsible.md +63 -63
  40. package/docs/design-system/components/command.md +61 -61
  41. package/docs/design-system/components/context-menu.md +45 -45
  42. package/docs/design-system/components/date-picker.md +80 -80
  43. package/docs/design-system/components/divider.md +102 -102
  44. package/docs/design-system/components/empty-state.md +56 -56
  45. package/docs/design-system/components/field.md +70 -70
  46. package/docs/design-system/components/file-upload.md +186 -186
  47. package/docs/design-system/components/hover-card.md +47 -47
  48. package/docs/design-system/components/icons.md +48 -48
  49. package/docs/design-system/components/input-group.md +57 -57
  50. package/docs/design-system/components/input-otp.md +56 -56
  51. package/docs/design-system/components/input.md +111 -109
  52. package/docs/design-system/components/item.md +58 -58
  53. package/docs/design-system/components/kbd.md +49 -49
  54. package/docs/design-system/components/label.md +49 -49
  55. package/docs/design-system/components/menu.md +94 -73
  56. package/docs/design-system/components/menubar.md +46 -46
  57. package/docs/design-system/components/modal.md +104 -104
  58. package/docs/design-system/components/native-select.md +53 -53
  59. package/docs/design-system/components/navigation-menu.md +49 -49
  60. package/docs/design-system/components/onboarding-step-list-item.md +81 -81
  61. package/docs/design-system/components/page-header.md +127 -93
  62. package/docs/design-system/components/pagination.md +56 -56
  63. package/docs/design-system/components/popover.md +59 -59
  64. package/docs/design-system/components/progress-slider.md +49 -49
  65. package/docs/design-system/components/progress.md +76 -76
  66. package/docs/design-system/components/radio-card.md +50 -50
  67. package/docs/design-system/components/radio-group.md +56 -56
  68. package/docs/design-system/components/resizable.md +43 -43
  69. package/docs/design-system/components/scroll-area.md +50 -50
  70. package/docs/design-system/components/segmented-control.md +54 -54
  71. package/docs/design-system/components/select.md +68 -64
  72. package/docs/design-system/components/sheet.md +66 -66
  73. package/docs/design-system/components/sidebar.md +167 -111
  74. package/docs/design-system/components/skeleton.md +74 -74
  75. package/docs/design-system/components/slideout.md +64 -64
  76. package/docs/design-system/components/slider.md +62 -62
  77. package/docs/design-system/components/social-button.md +49 -49
  78. package/docs/design-system/components/spinner.md +62 -62
  79. package/docs/design-system/components/steps.md +65 -65
  80. package/docs/design-system/components/table.md +499 -422
  81. package/docs/design-system/components/tabs.md +74 -59
  82. package/docs/design-system/components/tag.md +79 -79
  83. package/docs/design-system/components/textarea.md +49 -49
  84. package/docs/design-system/components/timeline.md +82 -82
  85. package/docs/design-system/components/toast.md +57 -57
  86. package/docs/design-system/components/toggle.md +80 -80
  87. package/docs/design-system/components/toolbar.md +89 -89
  88. package/docs/design-system/components/tooltip.md +92 -92
  89. package/docs/design-system/components/typography.md +18 -18
  90. package/docs/design-system/density-and-elevation.md +65 -65
  91. package/docs/design-system/design-system-test-missing-items.md +368 -368
  92. package/docs/design-system/direction-and-localization.md +23 -23
  93. package/docs/design-system/form-recipes.md +73 -73
  94. package/docs/design-system/gap-promotion-policy.md +21 -21
  95. package/docs/design-system/icons.md +74 -74
  96. package/docs/design-system/installation.md +70 -70
  97. package/docs/design-system/launch-comparison-shadcn.md +98 -98
  98. package/docs/design-system/registry-and-cli.md +64 -64
  99. package/docs/design-system/release-policy.md +30 -30
  100. package/docs/design-system/roadmap.md +14 -14
  101. package/docs/design-system/support-matrix.md +23 -23
  102. package/docs/design-system/tabs.md +54 -54
  103. package/docs/design-system/template-gap-audit.md +32 -32
  104. package/docs/design-system/templates.md +59 -59
  105. package/docs/design-system/token-governance.md +72 -72
  106. package/package.json +98 -98
  107. package/registry/component-contract.json +40 -40
  108. package/registry/components/accordion.tsx +155 -155
  109. package/registry/components/alert-dialog.tsx +297 -297
  110. package/registry/components/alert.tsx +309 -293
  111. package/registry/components/app-header.tsx +151 -0
  112. package/registry/components/aspect-ratio.tsx +30 -30
  113. package/registry/components/attribute.tsx +489 -454
  114. package/registry/components/autocomplete.tsx +598 -598
  115. package/registry/components/avatar.tsx +385 -385
  116. package/registry/components/badge.tsx +630 -629
  117. package/registry/components/button-group.tsx +565 -565
  118. package/registry/components/button.tsx +128 -127
  119. package/registry/components/card.tsx +651 -638
  120. package/registry/components/carousel.tsx +296 -296
  121. package/registry/components/chart.tsx +203 -203
  122. package/registry/components/checkbox.tsx +247 -247
  123. package/registry/components/collapsible.tsx +109 -109
  124. package/registry/components/command.tsx +208 -208
  125. package/registry/components/context-menu.tsx +236 -236
  126. package/registry/components/date-picker.tsx +1289 -1289
  127. package/registry/components/expanded/ActivityFeed.tsx +227 -227
  128. package/registry/components/expanded/ActivityHeatmap.tsx +64 -64
  129. package/registry/components/expanded/Banner.tsx +179 -179
  130. package/registry/components/expanded/Breadcrumbs.tsx +135 -131
  131. package/registry/components/expanded/CatalogComponentsShowcase.tsx +205 -205
  132. package/registry/components/expanded/CatalogDivider.tsx +49 -49
  133. package/registry/components/expanded/EmptyState.tsx +155 -155
  134. package/registry/components/expanded/FileUpload.tsx +543 -543
  135. package/registry/components/expanded/OnboardingStepListItem.tsx +60 -60
  136. package/registry/components/expanded/PageHeader.tsx +209 -179
  137. package/registry/components/expanded/Slideout.tsx +108 -108
  138. package/registry/components/expanded/Steps.tsx +402 -402
  139. package/registry/components/expanded/Table.tsx +1109 -1092
  140. package/registry/components/expanded/Timeline.tsx +203 -203
  141. package/registry/components/expanded/activityFeed.css +248 -248
  142. package/registry/components/expanded/activityHeatmap.css +66 -66
  143. package/registry/components/expanded/banner.css +260 -260
  144. package/registry/components/expanded/breadcrumbs.css +157 -140
  145. package/registry/components/expanded/catalogComponentsShowcase.css +87 -87
  146. package/registry/components/expanded/divider.css +75 -75
  147. package/registry/components/expanded/emptyState.css +111 -111
  148. package/registry/components/expanded/fileUpload.css +457 -457
  149. package/registry/components/expanded/onboardingStepListItem.css +135 -135
  150. package/registry/components/expanded/pageHeader.css +284 -248
  151. package/registry/components/expanded/slideout.css +276 -276
  152. package/registry/components/expanded/steps.css +356 -356
  153. package/registry/components/expanded/table.css +655 -606
  154. package/registry/components/expanded/timeline.css +286 -286
  155. package/registry/components/field.tsx +283 -283
  156. package/registry/components/hover-card.tsx +48 -48
  157. package/registry/components/input-content.ts +107 -107
  158. package/registry/components/input-group.tsx +130 -130
  159. package/registry/components/input-otp.tsx +584 -584
  160. package/registry/components/input.tsx +992 -990
  161. package/registry/components/item.tsx +189 -189
  162. package/registry/components/kbd.tsx +246 -246
  163. package/registry/components/label.tsx +78 -78
  164. package/registry/components/menu.tsx +1091 -978
  165. package/registry/components/menubar.tsx +226 -226
  166. package/registry/components/modal.tsx +872 -872
  167. package/registry/components/native-select.tsx +205 -205
  168. package/registry/components/navigation-menu.tsx +171 -171
  169. package/registry/components/pagination.css +36 -36
  170. package/registry/components/pagination.tsx +560 -560
  171. package/registry/components/popover.tsx +338 -338
  172. package/registry/components/progress-slider.tsx +216 -216
  173. package/registry/components/radio-card.tsx +676 -676
  174. package/registry/components/radio-group.tsx +570 -570
  175. package/registry/components/resizable.tsx +108 -108
  176. package/registry/components/scroll-area.tsx +91 -91
  177. package/registry/components/segmented-control.tsx +87 -87
  178. package/registry/components/select-content.tsx +218 -218
  179. package/registry/components/select.tsx +937 -937
  180. package/registry/components/sheet.tsx +305 -305
  181. package/registry/components/sidebar.tsx +1535 -1433
  182. package/registry/components/skeleton.css +54 -54
  183. package/registry/components/skeleton.tsx +482 -482
  184. package/registry/components/slider.tsx +380 -380
  185. package/registry/components/social-button.tsx +387 -387
  186. package/registry/components/spinner.tsx +78 -78
  187. package/registry/components/table-elements.tsx +287 -128
  188. package/registry/components/tabs.css +246 -222
  189. package/registry/components/tabs.tsx +245 -241
  190. package/registry/components/tag.tsx +423 -423
  191. package/registry/components/textarea.tsx +610 -610
  192. package/registry/components/toast.tsx +136 -136
  193. package/registry/components/toggle.tsx +256 -256
  194. package/registry/components/toolbar.tsx +539 -539
  195. package/registry/components/tooltip.tsx +433 -433
  196. package/registry/examples/alert-demo.tsx +34 -34
  197. package/registry/examples/alert-dialog-demo.tsx +42 -42
  198. package/registry/examples/app-header-demo.tsx +40 -0
  199. package/registry/examples/aspect-ratio-demo.tsx +11 -11
  200. package/registry/examples/attribute-demo.tsx +65 -65
  201. package/registry/examples/autocomplete-demo.tsx +109 -109
  202. package/registry/examples/avatar-demo.tsx +132 -132
  203. package/registry/examples/badge-demo.tsx +69 -69
  204. package/registry/examples/button-demo.tsx +86 -86
  205. package/registry/examples/button-group-demo.tsx +63 -63
  206. package/registry/examples/card-demo.tsx +86 -86
  207. package/registry/examples/carousel-demo.tsx +43 -43
  208. package/registry/examples/chart-demo.tsx +18 -18
  209. package/registry/examples/checkbox-demo.tsx +62 -62
  210. package/registry/examples/collapsible-demo.tsx +16 -16
  211. package/registry/examples/collection-filter-bar-demo.tsx +135 -135
  212. package/registry/examples/command-demo.tsx +42 -42
  213. package/registry/examples/command-palette-demo.tsx +235 -235
  214. package/registry/examples/context-menu-demo.tsx +29 -29
  215. package/registry/examples/control-density-contract-demo.tsx +65 -65
  216. package/registry/examples/date-picker-demo.tsx +127 -127
  217. package/registry/examples/divider-demo.tsx +17 -17
  218. package/registry/examples/expanded/activity-heatmap-demo.tsx +29 -29
  219. package/registry/examples/expanded/banner-demo.tsx +48 -48
  220. package/registry/examples/expanded/breadcrumbs-demo.tsx +59 -59
  221. package/registry/examples/expanded/empty-state-demo.tsx +39 -39
  222. package/registry/examples/expanded/file-upload-demo.tsx +60 -60
  223. package/registry/examples/expanded/onboarding-step-demo.tsx +11 -11
  224. package/registry/examples/expanded/slideout-demo.tsx +15 -15
  225. package/registry/examples/expanded/steps-demo.tsx +29 -29
  226. package/registry/examples/expanded/tabs-demo.tsx +13 -13
  227. package/registry/examples/expanded/timeline-demo.tsx +18 -18
  228. package/registry/examples/field-demo.tsx +51 -51
  229. package/registry/examples/hover-card-demo.tsx +23 -23
  230. package/registry/examples/input-actions-demo.tsx +36 -36
  231. package/registry/examples/input-demo.tsx +87 -87
  232. package/registry/examples/input-group-demo.tsx +16 -16
  233. package/registry/examples/input-otp-demo.tsx +72 -72
  234. package/registry/examples/item-demo.tsx +46 -46
  235. package/registry/examples/kbd-demo.tsx +12 -12
  236. package/registry/examples/label-demo.tsx +20 -20
  237. package/registry/examples/menu-demo.tsx +122 -122
  238. package/registry/examples/menubar-demo.tsx +34 -34
  239. package/registry/examples/modal-demo.tsx +74 -74
  240. package/registry/examples/native-select-demo.tsx +16 -16
  241. package/registry/examples/navigation-menu-demo.tsx +29 -29
  242. package/registry/examples/pagination-demo.tsx +20 -20
  243. package/registry/examples/popover-demo.tsx +547 -547
  244. package/registry/examples/progress-demo.tsx +37 -37
  245. package/registry/examples/progress-slider-demo.tsx +29 -29
  246. package/registry/examples/radio-card-demo.tsx +51 -51
  247. package/registry/examples/radio-group-demo.tsx +62 -62
  248. package/registry/examples/resizable-demo.tsx +22 -22
  249. package/registry/examples/results-toolbar-demo.tsx +44 -44
  250. package/registry/examples/scroll-area-demo.tsx +15 -15
  251. package/registry/examples/segmented-control-demo.tsx +39 -39
  252. package/registry/examples/select-demo.tsx +87 -87
  253. package/registry/examples/sheet-demo.tsx +47 -47
  254. package/registry/examples/sidebar-demo.tsx +101 -101
  255. package/registry/examples/slider-demo.tsx +31 -31
  256. package/registry/examples/social-button-demo.tsx +61 -61
  257. package/registry/examples/spinner-demo.tsx +59 -59
  258. package/registry/examples/tabs-demo.tsx +13 -13
  259. package/registry/examples/tag-demo.tsx +29 -29
  260. package/registry/examples/textarea-demo.tsx +79 -79
  261. package/registry/examples/toast-demo.tsx +35 -35
  262. package/registry/examples/toggle-demo.tsx +59 -59
  263. package/registry/examples/tooltip-demo.tsx +115 -115
  264. package/registry/guidance/USAGE.md +27 -27
  265. package/registry/hooks/use-direction.ts +207 -207
  266. package/registry/index.json +387 -17
  267. package/registry/styles/globals.css +46 -0
  268. package/registry.json +24 -2
  269. package/schema/config.schema.json +51 -51
  270. package/schema/registry.schema.json +194 -194
  271. package/schema/tokens.schema.json +167 -167
  272. package/src/cli/command-line.js +194 -194
  273. package/src/cli/config-editors.js +9 -9
  274. package/src/cli/doctor.js +399 -399
  275. package/src/cli/file-transaction.js +302 -302
  276. package/src/cli/global-css.js +153 -153
  277. package/src/cli/index.js +1002 -1002
  278. package/src/cli/install-plan.js +592 -592
  279. package/src/cli/install-receipt.js +171 -171
  280. package/src/cli/jsonc.js +203 -203
  281. package/src/cli/package-install-state.js +254 -254
  282. package/src/cli/package-manager.js +238 -238
  283. package/src/cli/package-plan.js +185 -185
  284. package/src/cli/package-version.js +97 -97
  285. package/src/cli/registry-query.js +207 -207
  286. package/src/cli/reporting.js +55 -55
  287. package/src/cli/schema-validation.js +19 -19
  288. package/src/cli/source-scanner.js +686 -686
  289. package/src/cli/vite-config.js +478 -478
  290. package/tokens/banhaten.tokens.json +184 -0
@@ -1,107 +1,107 @@
1
- # Modal
2
-
3
- `Modal` presents a focused dialog surface for decisions and blocking workflows. `ConfirmModal` adds the constrained alert-dialog/confirm pattern for consequential actions.
4
-
5
- Figma reference: `Design system 3.0 Copy / Modal`, node `227:5480`.
6
-
7
- ## Variants
8
-
9
- The implementation covers the six-node Modal matrix from Figma:
10
-
11
- | Prop | Values |
12
- | --- | --- |
13
- | `size` | `sm`, `default`, `lg` |
14
- | `dir` | `ltr`, `rtl` |
15
-
16
- ## API
17
-
18
- ```tsx
19
- <Modal size="default" />
20
- <Modal dir="rtl" messages={arabicModalMessages} size="lg" />
21
- <ConfirmModal intent="danger" confirmLabel="Delete project" />
22
- ```
23
-
24
- | Prop | Default |
25
- | --- | --- |
26
- | `size` | `sm` |
27
- | `dir` | inherited |
28
- | `title` | English default; overrides `messages.title` |
29
- | `description` | English default; overrides `messages.description` |
30
- | `messages` | partial localized Modal message catalog |
31
- | `closeLabel` | overrides `messages.closeLabel` |
32
- | `showIcon` | `true` |
33
- | `showCloseButton` | `true` |
34
- | `showDivider` | `true` |
35
- | `showFooter` | `true` |
36
- | `showCheckbox` | `true` |
37
- | `footer` | none |
38
-
39
- `ConfirmModal` also accepts:
40
-
41
- | Prop | Default |
42
- | --- | --- |
43
- | `intent` | `danger` |
44
- | `messages` | partial localized ConfirmModal message catalog |
45
- | `confirmLabel` / `cancelLabel` | English; direct props override `messages` |
46
- | `confirmLoading` | `false` |
47
- | `confirmDisabled` | `false` |
48
- | `preventOutsideDismiss` | `true` |
49
- | `closeOnConfirm` / `closeOnCancel` | `true` |
50
- | `onConfirm` / `onCancel` | none |
51
-
52
- ## Pixel Rules
53
-
54
- - Small, Default, and Large modal widths are `440px`, `560px`, and `700px`.
55
- - The shell uses `--bh-radius-2xl-12`.
56
- - Header padding is `20px 20px 8px`, with logical end padding reserved for the close button.
57
- - Body padding is `10px 20px 20px`.
58
- - Footer padding is `16px 20px`, with a `10px` gap.
59
- - Actions reuse `Button` with `size="sm"`, `variant="soft"` for the secondary action, and the default variant for the primary action.
60
- - Confirm actions reuse `Button` with `variant="danger"`, `variant="warning"`, or `variant="default"` from the selected intent.
61
- - The opt-out control reuses `Checkbox`.
62
- - Loading confirm actions reuse the Banhaten `Spinner` component.
63
-
64
- ## Token Contract
65
-
66
- The component consumes existing Banhaten variables:
67
-
68
- - Surface: `--bh-bg-raised`, `--bh-bg-backdrop`, `--bh-bg-danger-subtle`, `--bh-bg-warning-subtle`
69
- - Border: `--bh-border-subtle`
70
- - Content: `--bh-content-default`, `--bh-content-subtle`, `--bh-content-danger-default`, `--bh-content-warning-default`
71
- - Shape: `--bh-radius-2xl-12`, `--bh-radius-full`
72
- - Space: `--bh-space-xs-4`, `--bh-space-sm-6`, `--bh-space-md-8`, `--bh-space-lg-10`, `--bh-space-3xl-16`, `--bh-space-4xl-20`, `--bh-space-5xl-24`, `--bh-space-6xl-32`, `--bh-space-8xl-48`, `--bh-space-9xl-64`
73
- - Type: `--bh-text-heading-sm-semibold-*`, `--bh-text-body-md-regular-*`
74
- - Elevation: `--elevation-component-default`, `--elevation-button-focus`, `--elevation-button-danger-focus`
75
-
76
- ## Accessibility
77
-
78
- - `ModalContent` is backed by Radix Dialog for focus trap, Escape, outside-click dismissal, and ARIA dialog semantics.
79
- - `ModalTitle` and `ModalDescription` map to Radix dialog title and description primitives.
80
- - The close affordance is a real button through `ModalCloseButton`.
81
- - `ConfirmModal` sets `role="alertdialog"`, focuses the cancel action first when present, disables outside-pointer dismissal by default, and can optionally prevent Escape dismissal.
82
- - `ModalSurface` is presentational and intended for static documentation or visual comparison, not live modal behavior.
83
- - Direction never selects modal copy. Choose `messages` from the product locale; direct title, description, action, and close-label props have highest precedence.
84
-
85
- ## Install
86
-
87
- ```bash
88
- npx banhaten add modal
89
- ```
90
-
91
- ## Examples
92
-
93
- Primary registry example: `examples/modal-demo.tsx`.
94
-
95
- Open the live component page or run `npx banhaten docs modal` to inspect source files, install command, and examples.
96
-
97
- ## RTL Rules
98
-
99
- - `inheritsDirection`: true
100
- - `closePlacement`: Close uses logical inline-end placement so it moves to the left side in RTL.
101
- - `footerOrder`: The checkbox and action cluster use inherited direction and logical gaps so their order mirrors naturally.
102
- - `messages`: Direction does not select language. Modal and ConfirmModal accept explicit message catalogs plus direct label overrides.
103
- - `textDirection`: Title, description, checkbox label, confirm labels, and actions use dir="auto" for Arabic and English copy.
104
-
1
+ # Modal
2
+
3
+ `Modal` presents a focused dialog surface for decisions and blocking workflows. `ConfirmModal` adds the constrained alert-dialog/confirm pattern for consequential actions.
4
+
5
+ Figma reference: `Design system 3.0 Copy / Modal`, node `227:5480`.
6
+
7
+ ## Variants
8
+
9
+ The implementation covers the six-node Modal matrix from Figma:
10
+
11
+ | Prop | Values |
12
+ | --- | --- |
13
+ | `size` | `sm`, `default`, `lg` |
14
+ | `dir` | `ltr`, `rtl` |
15
+
16
+ ## API
17
+
18
+ ```tsx
19
+ <Modal size="default" />
20
+ <Modal dir="rtl" messages={arabicModalMessages} size="lg" />
21
+ <ConfirmModal intent="danger" confirmLabel="Delete project" />
22
+ ```
23
+
24
+ | Prop | Default |
25
+ | --- | --- |
26
+ | `size` | `sm` |
27
+ | `dir` | inherited |
28
+ | `title` | English default; overrides `messages.title` |
29
+ | `description` | English default; overrides `messages.description` |
30
+ | `messages` | partial localized Modal message catalog |
31
+ | `closeLabel` | overrides `messages.closeLabel` |
32
+ | `showIcon` | `true` |
33
+ | `showCloseButton` | `true` |
34
+ | `showDivider` | `true` |
35
+ | `showFooter` | `true` |
36
+ | `showCheckbox` | `true` |
37
+ | `footer` | none |
38
+
39
+ `ConfirmModal` also accepts:
40
+
41
+ | Prop | Default |
42
+ | --- | --- |
43
+ | `intent` | `danger` |
44
+ | `messages` | partial localized ConfirmModal message catalog |
45
+ | `confirmLabel` / `cancelLabel` | English; direct props override `messages` |
46
+ | `confirmLoading` | `false` |
47
+ | `confirmDisabled` | `false` |
48
+ | `preventOutsideDismiss` | `true` |
49
+ | `closeOnConfirm` / `closeOnCancel` | `true` |
50
+ | `onConfirm` / `onCancel` | none |
51
+
52
+ ## Pixel Rules
53
+
54
+ - Small, Default, and Large modal widths are `440px`, `560px`, and `700px`.
55
+ - The shell uses `--bh-radius-2xl-12`.
56
+ - Header padding is `20px 20px 8px`, with logical end padding reserved for the close button.
57
+ - Body padding is `10px 20px 20px`.
58
+ - Footer padding is `16px 20px`, with a `10px` gap.
59
+ - Actions reuse `Button` with `size="sm"`, `variant="soft"` for the secondary action, and the default variant for the primary action.
60
+ - Confirm actions reuse `Button` with `variant="danger"`, `variant="warning"`, or `variant="default"` from the selected intent.
61
+ - The opt-out control reuses `Checkbox`.
62
+ - Loading confirm actions reuse the Banhaten `Spinner` component.
63
+
64
+ ## Token Contract
65
+
66
+ The component consumes existing Banhaten variables:
67
+
68
+ - Surface: `--bh-bg-raised`, `--bh-bg-backdrop`, `--bh-bg-danger-subtle`, `--bh-bg-warning-subtle`
69
+ - Border: `--bh-border-subtle`
70
+ - Content: `--bh-content-default`, `--bh-content-subtle`, `--bh-content-danger-default`, `--bh-content-warning-default`
71
+ - Shape: `--bh-radius-2xl-12`, `--bh-radius-full`
72
+ - Space: `--bh-space-xs-4`, `--bh-space-sm-6`, `--bh-space-md-8`, `--bh-space-lg-10`, `--bh-space-3xl-16`, `--bh-space-4xl-20`, `--bh-space-5xl-24`, `--bh-space-6xl-32`, `--bh-space-8xl-48`, `--bh-space-9xl-64`
73
+ - Type: `--bh-text-heading-sm-semibold-*`, `--bh-text-body-md-regular-*`
74
+ - Elevation: `--elevation-component-default`, `--elevation-button-focus`, `--elevation-button-danger-focus`
75
+
76
+ ## Accessibility
77
+
78
+ - `ModalContent` is backed by Radix Dialog for focus trap, Escape, outside-click dismissal, and ARIA dialog semantics.
79
+ - `ModalTitle` and `ModalDescription` map to Radix dialog title and description primitives.
80
+ - The close affordance is a real button through `ModalCloseButton`.
81
+ - `ConfirmModal` sets `role="alertdialog"`, focuses the cancel action first when present, disables outside-pointer dismissal by default, and can optionally prevent Escape dismissal.
82
+ - `ModalSurface` is presentational and intended for static documentation or visual comparison, not live modal behavior.
83
+ - Direction never selects modal copy. Choose `messages` from the product locale; direct title, description, action, and close-label props have highest precedence.
84
+
85
+ ## Install
86
+
87
+ ```bash
88
+ npx banhaten add modal
89
+ ```
90
+
91
+ ## Examples
92
+
93
+ Primary registry example: `examples/modal-demo.tsx`.
94
+
95
+ Open the live component page or run `npx banhaten docs modal` to inspect source files, install command, and examples.
96
+
97
+ ## RTL Rules
98
+
99
+ - `inheritsDirection`: true
100
+ - `closePlacement`: Close uses logical inline-end placement so it moves to the left side in RTL.
101
+ - `footerOrder`: The checkbox and action cluster use inherited direction and logical gaps so their order mirrors naturally.
102
+ - `messages`: Direction does not select language. Modal and ConfirmModal accept explicit message catalogs plus direct label overrides.
103
+ - `textDirection`: Title, description, checkbox label, confirm labels, and actions use dir="auto" for Arabic and English copy.
104
+
105
105
  <!-- registry-contract:start -->
106
106
  ## Registry Contract
107
107
 
@@ -1,56 +1,56 @@
1
- # Native Select
2
-
3
- Native Select is a tokenized native `<select>` field for platform forms, mobile fallback, and lightweight option sets.
4
-
5
- ## API
6
-
7
- ```tsx
8
- <NativeSelect
9
- label="Workspace"
10
- options={[
11
- { label: "Design", value: "design" },
12
- { label: "Engineering", value: "engineering" },
13
- ]}
14
- />
15
- ```
16
-
17
- | Prop | Values |
18
- | --- | --- |
19
- | `size` | `md`, `lg` |
20
- | `variant` | `default`, `soft` |
21
- | `state` | `default`, `filled`, `error`, `disabled` |
22
- | `options` | array of `{ label, value, disabled }` |
23
-
24
- ## Token Contract
25
-
26
- Native Select reuses Banhaten select width, label, helper, trigger, border, focus, icon, and validation tokens.
27
-
28
- ## RTL
29
-
30
- Native Select accepts `dir` and uses logical padding plus an inline-end chevron.
31
-
32
- ## Accessibility
33
-
34
- Prefer `label` or an external `<Label htmlFor>` and use helper or error copy for validation context.
35
-
36
- ## Install
37
-
38
- ```bash
39
- npx banhaten add native-select
40
- ```
41
-
42
- ## Examples
43
-
44
- Primary registry example: `examples/native-select-demo.tsx`.
45
-
46
- Open the live component page or run `npx banhaten docs native-select` to inspect source files, install command, and examples.
47
-
48
- ## RTL Rules
49
-
50
- - `inheritsDirection`: true
51
- - `spacing`: Uses logical padding and inline-end chevron placement.
52
- - `textDirection`: Label and helper copy use dir="auto" through Label and helper text.
53
-
1
+ # Native Select
2
+
3
+ Native Select is a tokenized native `<select>` field for platform forms, mobile fallback, and lightweight option sets.
4
+
5
+ ## API
6
+
7
+ ```tsx
8
+ <NativeSelect
9
+ label="Workspace"
10
+ options={[
11
+ { label: "Design", value: "design" },
12
+ { label: "Engineering", value: "engineering" },
13
+ ]}
14
+ />
15
+ ```
16
+
17
+ | Prop | Values |
18
+ | --- | --- |
19
+ | `size` | `md`, `lg` |
20
+ | `variant` | `default`, `soft` |
21
+ | `state` | `default`, `filled`, `error`, `disabled` |
22
+ | `options` | array of `{ label, value, disabled }` |
23
+
24
+ ## Token Contract
25
+
26
+ Native Select reuses Banhaten select width, label, helper, trigger, border, focus, icon, and validation tokens.
27
+
28
+ ## RTL
29
+
30
+ Native Select accepts `dir` and uses logical padding plus an inline-end chevron.
31
+
32
+ ## Accessibility
33
+
34
+ Prefer `label` or an external `<Label htmlFor>` and use helper or error copy for validation context.
35
+
36
+ ## Install
37
+
38
+ ```bash
39
+ npx banhaten add native-select
40
+ ```
41
+
42
+ ## Examples
43
+
44
+ Primary registry example: `examples/native-select-demo.tsx`.
45
+
46
+ Open the live component page or run `npx banhaten docs native-select` to inspect source files, install command, and examples.
47
+
48
+ ## RTL Rules
49
+
50
+ - `inheritsDirection`: true
51
+ - `spacing`: Uses logical padding and inline-end chevron placement.
52
+ - `textDirection`: Label and helper copy use dir="auto" through Label and helper text.
53
+
54
54
  <!-- registry-contract:start -->
55
55
  ## Registry Contract
56
56
 
@@ -1,52 +1,52 @@
1
- # Navigation Menu
2
-
3
- Navigation Menu wraps Radix NavigationMenu for top navigation with trigger, content, link, viewport, and indicator parts.
4
-
5
- ## API
6
-
7
- ```tsx
8
- <NavigationMenu>
9
- <NavigationMenuList>
10
- <NavigationMenuItem>
11
- <NavigationMenuTrigger>Product</NavigationMenuTrigger>
12
- <NavigationMenuContent>
13
- <NavigationMenuLink href="#">Components</NavigationMenuLink>
14
- </NavigationMenuContent>
15
- </NavigationMenuItem>
16
- </NavigationMenuList>
17
- <NavigationMenuViewport />
18
- </NavigationMenu>
19
- ```
20
-
21
- ## Token Contract
22
-
23
- Navigation Menu uses Banhaten ghost hover, soft active state, raised content, popover shadow, radius, and body typography tokens.
24
-
25
- ## RTL
26
-
27
- The list and content inherit direction. Links use logical text alignment.
28
-
29
- ## Accessibility
30
-
31
- Radix handles trigger relationships, viewport sizing, keyboard navigation, and focus.
32
-
33
- ## Install
34
-
35
- ```bash
36
- npx banhaten add navigation-menu
37
- ```
38
-
39
- ## Examples
40
-
41
- Primary registry example: `examples/navigation-menu-demo.tsx`.
42
-
43
- Open the live component page or run `npx banhaten docs navigation-menu` to inspect source files, install command, and examples.
44
-
45
- ## RTL Rules
46
-
47
- - `inheritsDirection`: true
48
- - `spacing`: Triggers, links, and content use logical layout and inherited direction.
49
-
1
+ # Navigation Menu
2
+
3
+ Navigation Menu wraps Radix NavigationMenu for top navigation with trigger, content, link, viewport, and indicator parts.
4
+
5
+ ## API
6
+
7
+ ```tsx
8
+ <NavigationMenu>
9
+ <NavigationMenuList>
10
+ <NavigationMenuItem>
11
+ <NavigationMenuTrigger>Product</NavigationMenuTrigger>
12
+ <NavigationMenuContent>
13
+ <NavigationMenuLink href="#">Components</NavigationMenuLink>
14
+ </NavigationMenuContent>
15
+ </NavigationMenuItem>
16
+ </NavigationMenuList>
17
+ <NavigationMenuViewport />
18
+ </NavigationMenu>
19
+ ```
20
+
21
+ ## Token Contract
22
+
23
+ Navigation Menu uses Banhaten ghost hover, soft active state, raised content, popover shadow, radius, and body typography tokens.
24
+
25
+ ## RTL
26
+
27
+ The list and content inherit direction. Links use logical text alignment.
28
+
29
+ ## Accessibility
30
+
31
+ Radix handles trigger relationships, viewport sizing, keyboard navigation, and focus.
32
+
33
+ ## Install
34
+
35
+ ```bash
36
+ npx banhaten add navigation-menu
37
+ ```
38
+
39
+ ## Examples
40
+
41
+ Primary registry example: `examples/navigation-menu-demo.tsx`.
42
+
43
+ Open the live component page or run `npx banhaten docs navigation-menu` to inspect source files, install command, and examples.
44
+
45
+ ## RTL Rules
46
+
47
+ - `inheritsDirection`: true
48
+ - `spacing`: Triggers, links, and content use logical layout and inherited direction.
49
+
50
50
  <!-- registry-contract:start -->
51
51
  ## Registry Contract
52
52
 
@@ -1,84 +1,84 @@
1
- # Onboarding Step List Item
2
-
3
- `OnboardingStepListItem` renders one vertical progress-list row for onboarding, setup, or guided task flows. It should be composed into a list by the parent flow, which controls line visibility for first and last items.
4
-
5
- Figma reference: `OnboardingStepListItem`, node `587:27227`.
6
-
7
- ## Variants
8
-
9
- The Figma component defines these variants:
10
-
11
- | State | Direction |
12
- | --- | --- |
13
- | `Finished` | LTR and RTL |
14
- | `Active` | LTR and RTL |
15
- | `inactive` | LTR and RTL |
16
-
17
- Code uses lowercase semantic state values: `finished`, `active`, and `inactive`.
18
-
19
- ## API
20
-
21
- ```tsx
22
- <OnboardingStepListItem
23
- state="finished"
24
- label="Label"
25
- dir="ltr"
26
- showLeadingLine
27
- showTrailingLine
28
- />
29
- ```
30
-
31
- | Prop | Values | Default |
32
- | --- | --- | --- |
33
- | `state` | `finished`, `active`, `inactive` | `finished` |
34
- | `label` | `string` | `Label` |
35
- | `dir` | `ltr`, `rtl` | `ltr` |
36
- | `showLeadingLine` | `boolean` | `true` |
37
- | `showTrailingLine` | `boolean` | `true` |
38
-
39
- ## Token Contract
40
-
41
- 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.
42
-
43
- - Backgrounds: `--bh-bg-raised`
44
- - Borders: `--bh-border-brand-strong`, `--bh-border-default`
45
- - Content: `--bh-content-brand-default`, `--bh-content-default`, `--bh-content-subtle`, `--bh-content-success-default`
46
- - Shape: `--bh-control-default`
47
- - Space: `--bh-space-lg-10`, `--bh-space-xl-12`
48
-
49
- ## Pixel Rules
50
-
51
- - The row is `280px` wide and `40px` tall.
52
- - Padding is `8px 12px` with a `10px` gap between the line wrap and label.
53
- - Text uses Inter Medium `15px / 24px` with zero letter spacing.
54
- - The line wrap is `24px` square.
55
- - Finished uses an `18px` success check-circle glyph in a `20px` slot with `2px` default connector lines.
56
- - Active uses a `2px x 20px` brand line, a default border, white raised fill, `8px` radius, and component shadow.
57
- - Inactive uses a `2px x 40px` default connector line and subtle content color.
58
- - RTL mirrors visual order through `dir="rtl"` and right-aligns the label.
59
-
60
- ## Accessibility
61
-
62
- - Connector lines and the finished icon are decorative in this primitive and are hidden from assistive technology.
63
- - Parent onboarding lists should expose the overall progress semantics, current step, and completion status.
64
- - Keep labels as real text and avoid using this row as the only status announcement.
65
-
66
- ## Install
67
-
68
- ```bash
69
- npx banhaten add onboarding-step
70
- ```
71
-
72
- ## Examples
73
-
74
- Primary registry example: `examples/expanded/onboarding-step-demo.tsx`.
75
-
76
- Open the live component page or run `npx banhaten docs onboarding-step` to inspect source files, install command, and examples.
77
-
78
- ## RTL Rules
79
-
80
- This component has no special RTL contract beyond inherited document direction and logical spacing.
81
-
1
+ # Onboarding Step List Item
2
+
3
+ `OnboardingStepListItem` renders one vertical progress-list row for onboarding, setup, or guided task flows. It should be composed into a list by the parent flow, which controls line visibility for first and last items.
4
+
5
+ Figma reference: `OnboardingStepListItem`, node `587:27227`.
6
+
7
+ ## Variants
8
+
9
+ The Figma component defines these variants:
10
+
11
+ | State | Direction |
12
+ | --- | --- |
13
+ | `Finished` | LTR and RTL |
14
+ | `Active` | LTR and RTL |
15
+ | `inactive` | LTR and RTL |
16
+
17
+ Code uses lowercase semantic state values: `finished`, `active`, and `inactive`.
18
+
19
+ ## API
20
+
21
+ ```tsx
22
+ <OnboardingStepListItem
23
+ state="finished"
24
+ label="Label"
25
+ dir="ltr"
26
+ showLeadingLine
27
+ showTrailingLine
28
+ />
29
+ ```
30
+
31
+ | Prop | Values | Default |
32
+ | --- | --- | --- |
33
+ | `state` | `finished`, `active`, `inactive` | `finished` |
34
+ | `label` | `string` | `Label` |
35
+ | `dir` | `ltr`, `rtl` | `ltr` |
36
+ | `showLeadingLine` | `boolean` | `true` |
37
+ | `showTrailingLine` | `boolean` | `true` |
38
+
39
+ ## Token Contract
40
+
41
+ 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.
42
+
43
+ - Backgrounds: `--bh-bg-raised`
44
+ - Borders: `--bh-border-brand-strong`, `--bh-border-default`
45
+ - Content: `--bh-content-brand-default`, `--bh-content-default`, `--bh-content-subtle`, `--bh-content-success-default`
46
+ - Shape: `--bh-control-default`
47
+ - Space: `--bh-space-lg-10`, `--bh-space-xl-12`
48
+
49
+ ## Pixel Rules
50
+
51
+ - The row is `280px` wide and `40px` tall.
52
+ - Padding is `8px 12px` with a `10px` gap between the line wrap and label.
53
+ - Text uses Inter Medium `15px / 24px` with zero letter spacing.
54
+ - The line wrap is `24px` square.
55
+ - Finished uses an `18px` success check-circle glyph in a `20px` slot with `2px` default connector lines.
56
+ - Active uses a `2px x 20px` brand line, a default border, white raised fill, `8px` radius, and component shadow.
57
+ - Inactive uses a `2px x 40px` default connector line and subtle content color.
58
+ - RTL mirrors visual order through `dir="rtl"` and right-aligns the label.
59
+
60
+ ## Accessibility
61
+
62
+ - Connector lines and the finished icon are decorative in this primitive and are hidden from assistive technology.
63
+ - Parent onboarding lists should expose the overall progress semantics, current step, and completion status.
64
+ - Keep labels as real text and avoid using this row as the only status announcement.
65
+
66
+ ## Install
67
+
68
+ ```bash
69
+ npx banhaten add onboarding-step
70
+ ```
71
+
72
+ ## Examples
73
+
74
+ Primary registry example: `examples/expanded/onboarding-step-demo.tsx`.
75
+
76
+ Open the live component page or run `npx banhaten docs onboarding-step` to inspect source files, install command, and examples.
77
+
78
+ ## RTL Rules
79
+
80
+ This component has no special RTL contract beyond inherited document direction and logical spacing.
81
+
82
82
  <!-- registry-contract:start -->
83
83
  ## Registry Contract
84
84