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,60 +1,75 @@
1
- # Tabs
2
-
3
- Tabs is a Radix-backed local navigation primitive with underline, segmented, and rounded treatments across size, full-width behavior, controlled state, LTR, and RTL.
4
-
5
- ## API
6
-
7
- ```tsx
8
- <Tabs
9
- ariaLabel="Project sections"
10
- items={["Overview", "Activity", "Settings"]}
11
- variant="underline"
12
- />
13
- ```
14
-
15
- | Prop | Values |
16
- | --- | --- |
17
- | `variant` | `underline`, `segment`, `rounded` |
18
- | `size` | `md`, `sm`, `xs` |
19
- | `fullWidth` | `boolean`; default `false`. Equal shares while labels fit; content-safe scrolling under pressure. |
20
- | `activeIndex`, `defaultActiveIndex` | controlled or uncontrolled index |
21
- | `onActiveIndexChange` | selected-index callback |
22
-
23
- ## Token Contract
24
-
25
- Tabs uses Banhaten tab CSS variables for sizes, spacing, border, radius, active indicators, surfaces, and content states.
26
-
27
- ## RTL
28
-
29
- Tabs accepts `dir="rtl"` and mirrors layout through inherited direction. Trigger labels stay complete in both directions: content-hug tabs keep their intrinsic width, while full-width tabs keep equal shares until a label's intrinsic width requires horizontal overflow.
30
-
31
- ## Overflow
32
-
33
- Tab labels stay on one line and are never painted outside their trigger. When all triggers cannot fit, the tab list owns horizontal scrolling. `fullWidth` changes how spare inline space is distributed; it does not enable truncation or unsafe shrinking.
34
-
35
- ## Accessibility
36
-
37
- Tabs uses Radix Tabs so keyboard behavior, roving focus, activation mode, trigger state, and panel relationships come from the primitive.
38
-
39
- ## Install
40
-
41
- ```bash
42
- npx banhaten add tabs
43
- ```
44
-
45
- ## Examples
46
-
47
- Primary registry example: `examples/tabs-demo.tsx`.
48
-
49
- Open the live component page or run `npx banhaten docs tabs` to inspect source files, install command, and examples.
50
-
51
- ## RTL Rules
52
-
53
- - `inheritsDirection`: true
54
- - `keyboard`: Radix receives dir so arrow-key navigation follows the document direction.
55
- - `textDirection`: Trigger labels use dir="auto" by default for Arabic and English tab labels.
56
- - `spacing`: Uses inherited direction and logical inline spacing so underline, segmented, and rounded treatments mirror naturally.
57
-
1
+ # Tabs
2
+
3
+ Tabs is a Radix-backed local navigation primitive with underline, segmented, and rounded treatments across size, full-width behavior, controlled state, LTR, and RTL.
4
+
5
+ ## API
6
+
7
+ ```tsx
8
+ <Tabs
9
+ ariaLabel="Project sections"
10
+ items={["Overview", "Activity", "Settings"]}
11
+ variant="underline"
12
+ />
13
+ ```
14
+
15
+ | Prop | Values |
16
+ | --- | --- |
17
+ | `variant` | `underline`, `segment`, `rounded` |
18
+ | `size` | `md`, `sm`, `xs`, `comfortable` |
19
+ | `fullWidth` | `boolean`; default `false`. Equal shares while labels fit; content-safe scrolling under pressure. |
20
+ | `activeIndex`, `defaultActiveIndex` | controlled or uncontrolled index |
21
+ | `onActiveIndexChange` | selected-index callback |
22
+
23
+ ### Comfortable size
24
+
25
+ `size="comfortable"` is the view navigation in an app page: the `View navigation` row in the ATS360 product frames.
26
+
27
+ - Underline tabs are `48px` tall with a `36px` content row and `2px` label padding.
28
+ - Tabs sit `8px` apart, with no divider under the row.
29
+ - The active tab's `2px` brand indicator is an inset shadow, so the label stays centred in the full tab height.
30
+ - Active labels are body-md medium in `content/default`; the others are body-md regular in `content/subtle`.
31
+
32
+ The library `Tabs` frame keeps `16px` gaps and a `1px` divider; the other sizes still follow it. Segment and rounded tabs render `comfortable` like `md`.
33
+
34
+ ```tsx
35
+ <Tabs ariaLabel="Requisition views" items={["All requests", "Needs my approval", "Drafts"]} size="comfortable" />
36
+ ```
37
+
38
+ ## Token Contract
39
+
40
+ Tabs uses Banhaten tab CSS variables for sizes, spacing, border, radius, active indicators, surfaces, and content states.
41
+
42
+ ## RTL
43
+
44
+ Tabs accepts `dir="rtl"` and mirrors layout through inherited direction. Trigger labels stay complete in both directions: content-hug tabs keep their intrinsic width, while full-width tabs keep equal shares until a label's intrinsic width requires horizontal overflow.
45
+
46
+ ## Overflow
47
+
48
+ Tab labels stay on one line and are never painted outside their trigger. When all triggers cannot fit, the tab list owns horizontal scrolling. `fullWidth` changes how spare inline space is distributed; it does not enable truncation or unsafe shrinking.
49
+
50
+ ## Accessibility
51
+
52
+ Tabs uses Radix Tabs so keyboard behavior, roving focus, activation mode, trigger state, and panel relationships come from the primitive.
53
+
54
+ ## Install
55
+
56
+ ```bash
57
+ npx banhaten add tabs
58
+ ```
59
+
60
+ ## Examples
61
+
62
+ Primary registry example: `examples/tabs-demo.tsx`.
63
+
64
+ Open the live component page or run `npx banhaten docs tabs` to inspect source files, install command, and examples.
65
+
66
+ ## RTL Rules
67
+
68
+ - `inheritsDirection`: true
69
+ - `keyboard`: Radix receives dir so arrow-key navigation follows the document direction.
70
+ - `textDirection`: Trigger labels use dir="auto" by default for Arabic and English tab labels.
71
+ - `spacing`: Uses inherited direction and logical inline spacing so underline, segmented, and rounded treatments mirror naturally.
72
+
58
73
  <!-- registry-contract:start -->
59
74
  ## Registry Contract
60
75
 
@@ -66,8 +81,8 @@ This table is generated from `registry/index.json`; edit the component-owned sou
66
81
  | `supportedExports` | `components/tabs.tsx: Tabs, TabsContent, TabsList, TabsRoot, TabsTrigger` |
67
82
  | `parts` | `Tabs`, `TabsRoot`, `TabsList`, `TabsTrigger`, `TabsContent` |
68
83
  | `registryDependencies` | None |
69
- | `features` | `Radix keyboard behavior`, `controlled active index`, `controlled value`, `optional panels`, `content-hug tabs`, `content-safe full-width tabs`, `horizontal overflow without label overlap` |
70
- | `sizes` | `md`, `sm`, `xs` |
84
+ | `features` | `Radix keyboard behavior`, `controlled active index`, `controlled value`, `optional panels`, `content-hug tabs`, `content-safe full-width tabs`, `horizontal overflow without label overlap`, `comfortable view-navigation size: 48px underline tabs 8px apart, inset indicator, no divider` |
85
+ | `sizes` | `md`, `sm`, `xs`, `comfortable` |
71
86
  | `tokens` | `--bh-bg-default`, `--bh-bg-neutral-subtle`, `--bh-border-default`, `--bh-content-brand-default`, `--bh-content-default`, `--bh-content-subtle`, `--bh-font-family`, `--bh-font-weight-medium`, `--bh-opacity-60`, `--bh-radius-full`, `--bh-radius-lg-8`, `--bh-radius-md-6`, `--bh-space-3xl-16`, `--bh-space-6xl-32`, `--bh-space-7xl-40`, `--bh-space-8xl-48`, `--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-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`, `--elevation-button-soft` |
72
87
  | `variants` | `underline`, `segment`, `rounded` |
73
88
  <!-- registry-contract:end -->
@@ -1,82 +1,82 @@
1
- # Tag
2
-
3
- Tags identify compact metadata, filters, or removable selections.
4
-
5
- The implementation follows the Figma component at `Design system 3.0 Copy / Tag` (`188:64712`). It supports every variant in the matrix: `simple`, `dot`, `flag`, `avatar`, and `icon`; `default`, `active`, and `disabled` states with native hover and focus-visible styling; `xs`, `md`, and `lg` sizes; optional close button; LTR and RTL.
6
-
7
- ## API
8
-
9
- ```tsx
10
- <Tag
11
- type="simple"
12
- size="md"
13
- state="default"
14
- showCloseButton={false}
15
- dir="ltr"
16
- >
17
- Label
18
- </Tag>
19
- ```
20
-
21
- | Prop | Values | Default |
22
- | --- | --- | --- |
23
- | `type` | `simple`, `dot`, `flag`, `avatar`, `icon` | `simple` |
24
- | `size` | `xs`, `md`, `lg` | `md` |
25
- | `state` | `default`, `active`, `disabled` | `default` |
26
- | `showCloseButton` | `boolean` | `false` |
27
- | `disabled` | `boolean` | `false` |
28
- | `dir` | `ltr`, `rtl`, `auto` | `auto` |
29
- | `avatar` | `ReactNode` | initials placeholder |
30
- | `flag` | `ReactNode` | token-colored placeholder |
31
- | `icon` | `ReactNode` | plus icon |
32
- | `onClose` | close-button click handler | none |
33
-
34
- ## Token Contract
35
-
36
- The component consumes semantic design-system tokens only:
37
-
38
- - Text and icons: `content.default`, `content.disabled`, `content.primary`, `content.onColor`, `content.muted`
39
- - Backgrounds: `background.default`, `background.hover`, `background.pressed`, `background.disabled`, `background.selected`, `background.danger`
40
- - Borders: `border.default`, `border.disabled`, `border.brand`, `border.focus`, `border.subtle`
41
- - Shape: `shape.control`, `shape.badge`, `shape.avatar`
42
- - Density: `density.controlHeight`, `density.controlPaddingX`
43
-
44
- ## Pixel Rules
45
-
46
- - `xs` tags are `24px` tall and use body-xs medium text.
47
- - `md` tags are `28px` tall and use body-sm medium text.
48
- - `lg` tags are `36px` tall and use body-md medium text.
49
- - Simple tags use centered text and no leading slot.
50
- - Dot, flag, avatar, and icon tags use a `20px` leading slot; the default icon glyph is `18px`.
51
- - Close buttons are `16px` with a `12px` icon.
52
- - Focused tags use a brand border plus a solid outside focus ring.
53
- - Active tags use selected/brand treatment and a stronger brand border.
54
- - Disabled tags use disabled background, border, and content tokens.
55
- - RTL uses logical inline padding and inherited direction so leading media, label, and close button mirror naturally.
56
-
57
- ## Install
58
-
59
- ```bash
60
- npx banhaten add tag
61
- ```
62
-
63
- ## Examples
64
-
65
- Primary registry example: `examples/tag-demo.tsx`.
66
-
67
- Open the live component page or run `npx banhaten docs tag` to inspect source files, install command, and examples.
68
-
69
- ## RTL Rules
70
-
71
- - `inheritsDirection`: true
72
- - `spacing`: Uses logical inline padding and inherited flex direction so the leading media, label, and close button mirror naturally.
73
- - `textDirection`: Text labels use dir="auto" for short Arabic and English tag labels.
74
- - `closeButton`: The close affordance is a 16px token-sized icon button using currentColor and the tag disabled state.
75
-
76
- ## Accessibility
77
-
78
- This component relies on `@radix-ui/react-slot` for its base accessibility behavior. Keep required labels, titles, descriptions, and focusable trigger/content relationships intact when composing it.
79
-
1
+ # Tag
2
+
3
+ Tags identify compact metadata, filters, or removable selections.
4
+
5
+ The implementation follows the Figma component at `Design system 3.0 Copy / Tag` (`188:64712`). It supports every variant in the matrix: `simple`, `dot`, `flag`, `avatar`, and `icon`; `default`, `active`, and `disabled` states with native hover and focus-visible styling; `xs`, `md`, and `lg` sizes; optional close button; LTR and RTL.
6
+
7
+ ## API
8
+
9
+ ```tsx
10
+ <Tag
11
+ type="simple"
12
+ size="md"
13
+ state="default"
14
+ showCloseButton={false}
15
+ dir="ltr"
16
+ >
17
+ Label
18
+ </Tag>
19
+ ```
20
+
21
+ | Prop | Values | Default |
22
+ | --- | --- | --- |
23
+ | `type` | `simple`, `dot`, `flag`, `avatar`, `icon` | `simple` |
24
+ | `size` | `xs`, `md`, `lg` | `md` |
25
+ | `state` | `default`, `active`, `disabled` | `default` |
26
+ | `showCloseButton` | `boolean` | `false` |
27
+ | `disabled` | `boolean` | `false` |
28
+ | `dir` | `ltr`, `rtl`, `auto` | `auto` |
29
+ | `avatar` | `ReactNode` | initials placeholder |
30
+ | `flag` | `ReactNode` | token-colored placeholder |
31
+ | `icon` | `ReactNode` | plus icon |
32
+ | `onClose` | close-button click handler | none |
33
+
34
+ ## Token Contract
35
+
36
+ The component consumes semantic design-system tokens only:
37
+
38
+ - Text and icons: `content.default`, `content.disabled`, `content.primary`, `content.onColor`, `content.muted`
39
+ - Backgrounds: `background.default`, `background.hover`, `background.pressed`, `background.disabled`, `background.selected`, `background.danger`
40
+ - Borders: `border.default`, `border.disabled`, `border.brand`, `border.focus`, `border.subtle`
41
+ - Shape: `shape.control`, `shape.badge`, `shape.avatar`
42
+ - Density: `density.controlHeight`, `density.controlPaddingX`
43
+
44
+ ## Pixel Rules
45
+
46
+ - `xs` tags are `24px` tall and use body-xs medium text.
47
+ - `md` tags are `28px` tall and use body-sm medium text.
48
+ - `lg` tags are `36px` tall and use body-md medium text.
49
+ - Simple tags use centered text and no leading slot.
50
+ - Dot, flag, avatar, and icon tags use a `20px` leading slot; the default icon glyph is `18px`.
51
+ - Close buttons are `16px` with a `12px` icon.
52
+ - Focused tags use a brand border plus a solid outside focus ring.
53
+ - Active tags use selected/brand treatment and a stronger brand border.
54
+ - Disabled tags use disabled background, border, and content tokens.
55
+ - RTL uses logical inline padding and inherited direction so leading media, label, and close button mirror naturally.
56
+
57
+ ## Install
58
+
59
+ ```bash
60
+ npx banhaten add tag
61
+ ```
62
+
63
+ ## Examples
64
+
65
+ Primary registry example: `examples/tag-demo.tsx`.
66
+
67
+ Open the live component page or run `npx banhaten docs tag` to inspect source files, install command, and examples.
68
+
69
+ ## RTL Rules
70
+
71
+ - `inheritsDirection`: true
72
+ - `spacing`: Uses logical inline padding and inherited flex direction so the leading media, label, and close button mirror naturally.
73
+ - `textDirection`: Text labels use dir="auto" for short Arabic and English tag labels.
74
+ - `closeButton`: The close affordance is a 16px token-sized icon button using currentColor and the tag disabled state.
75
+
76
+ ## Accessibility
77
+
78
+ This component relies on `@radix-ui/react-slot` for its base accessibility behavior. Keep required labels, titles, descriptions, and focusable trigger/content relationships intact when composing it.
79
+
80
80
  <!-- registry-contract:start -->
81
81
  ## Registry Contract
82
82
 
@@ -1,52 +1,52 @@
1
- # Textarea
2
-
3
- Textarea is the multiline field primitive for comments, notes, descriptions, and tag-style text entry. It supports label, helper and error text, default and tags modes, placeholder, filled, disabled, and RTL states.
4
-
5
- ## API
6
-
7
- ```tsx
8
- <Textarea label="Comments" placeholder="Add context..." />
9
- <Textarea mode="tags" label="Tags" defaultValue="Design, System" />
10
- ```
11
-
12
- | Prop | Values |
13
- | --- | --- |
14
- | `mode` | `default`, `tags` |
15
- | `state` | `placeholder`, `filled`, `disabled` |
16
- | `hasError` | `boolean` |
17
- | `label`, `helperText` | `ReactNode` |
18
- | `dir` | `ltr`, `rtl` |
19
-
20
- ## Token Contract
21
-
22
- Textarea uses Banhaten field surface, text, label, helper, error, tag, spacing, border, radius, disabled, and focus tokens.
23
-
24
- ## RTL
25
-
26
- Textarea uses `text-start`, inherited direction, and logical field layout. Labels, helper text, and tag chips mirror without physical left/right styling.
27
-
28
- ## Accessibility
29
-
30
- Connect labels and helper/error text through component props. Use visible error text with `hasError` rather than color alone.
31
-
32
- ## Install
33
-
34
- ```bash
35
- npx banhaten add textarea
36
- ```
37
-
38
- ## Examples
39
-
40
- Primary registry example: `examples/textarea-demo.tsx`.
41
-
42
- Open the live component page or run `npx banhaten docs textarea` to inspect source files, install command, and examples.
43
-
44
- ## RTL Rules
45
-
46
- - `inheritsDirection`: true
47
- - `textAlignment`: Uses text-start and dir="auto" so Arabic and English content align naturally.
48
- - `spacing`: Uses inherited direction and flex order so labels, helper icons, and tag chips mirror without physical left/right rules.
49
-
1
+ # Textarea
2
+
3
+ Textarea is the multiline field primitive for comments, notes, descriptions, and tag-style text entry. It supports label, helper and error text, default and tags modes, placeholder, filled, disabled, and RTL states.
4
+
5
+ ## API
6
+
7
+ ```tsx
8
+ <Textarea label="Comments" placeholder="Add context..." />
9
+ <Textarea mode="tags" label="Tags" defaultValue="Design, System" />
10
+ ```
11
+
12
+ | Prop | Values |
13
+ | --- | --- |
14
+ | `mode` | `default`, `tags` |
15
+ | `state` | `placeholder`, `filled`, `disabled` |
16
+ | `hasError` | `boolean` |
17
+ | `label`, `helperText` | `ReactNode` |
18
+ | `dir` | `ltr`, `rtl` |
19
+
20
+ ## Token Contract
21
+
22
+ Textarea uses Banhaten field surface, text, label, helper, error, tag, spacing, border, radius, disabled, and focus tokens.
23
+
24
+ ## RTL
25
+
26
+ Textarea uses `text-start`, inherited direction, and logical field layout. Labels, helper text, and tag chips mirror without physical left/right styling.
27
+
28
+ ## Accessibility
29
+
30
+ Connect labels and helper/error text through component props. Use visible error text with `hasError` rather than color alone.
31
+
32
+ ## Install
33
+
34
+ ```bash
35
+ npx banhaten add textarea
36
+ ```
37
+
38
+ ## Examples
39
+
40
+ Primary registry example: `examples/textarea-demo.tsx`.
41
+
42
+ Open the live component page or run `npx banhaten docs textarea` to inspect source files, install command, and examples.
43
+
44
+ ## RTL Rules
45
+
46
+ - `inheritsDirection`: true
47
+ - `textAlignment`: Uses text-start and dir="auto" so Arabic and English content align naturally.
48
+ - `spacing`: Uses inherited direction and flex order so labels, helper icons, and tag chips mirror without physical left/right rules.
49
+
50
50
  <!-- registry-contract:start -->
51
51
  ## Registry Contract
52
52
 
@@ -1,85 +1,85 @@
1
- # Timeline
2
-
3
- Timelines show ordered progress or dated events. Use `Timeline` for a complete sequence and `TimelineItem` when a consumer needs to compose a custom layout.
4
-
5
- Figma references:
6
-
7
- - `TimelineVetical`, node `572:6768`
8
- - `TimeLineHorizontal`, node `584:4501`
9
- - `TimelineVerticalItem`, node `572:6444`
10
- - `TimelineHorizontalItem`, node `582:4214`
11
-
12
- ## Variants
13
-
14
- | Prop | Values |
15
- | --- | --- |
16
- | `orientation` | `vertical`, `horizontal` |
17
- | `variant` | `default`, `icon` |
18
- | `state` | `finished`, `active`, `inactive` |
19
- | `dir` | `ltr`, `rtl` |
20
-
21
- The Figma source includes vertical timelines with seven steps and horizontal timelines with six steps. Code accepts any `steps` array.
22
-
23
- ## API
24
-
25
- ```tsx
26
- <Timeline
27
- orientation="vertical"
28
- variant="default"
29
- dir="ltr"
30
- steps={[
31
- { label: "Label", caption: "Caption", date: "Mar 15. 2050", state: "finished" },
32
- { label: "Label", caption: "Caption", date: "Mar 15. 2050", state: "active" },
33
- { label: "Label", caption: "Caption", date: "Mar 15. 2050", state: "inactive" },
34
- ]}
35
- />
36
- ```
37
-
38
- `TimelineStep` supports `label`, `caption`, `date`, `topDate`, `bottomDate`, `state`, `icon`, and visibility flags for leading/top/bottom dates, caption, connector line, and bottom padding.
39
-
40
- ## Token Contract
41
-
42
- - `--bg-brand-default`: filled icon marker
43
- - `--bg-default`: default marker center
44
- - `--bg-muted`: inactive icon marker
45
- - `--border-brand-strong`: finished connector line
46
- - `--border-default`: active and inactive connector line
47
- - `--content-default`: labels and inactive check
48
- - `--content-subtle`: dates and captions
49
- - `--radius-full`: marker and line radius
50
-
51
- ## Pixel Rules
52
-
53
- - Dates are `12px / 16px`, regular.
54
- - Labels are `15px / 24px`, semibold.
55
- - Captions are `14px / 20px`, regular.
56
- - Default markers reserve a `20px` box with a small circular ring.
57
- - Icon markers are `28px` circles with an 18px check glyph.
58
- - Vertical item gaps use `12px`; horizontal item body spacing uses `10px`.
59
- - Finished connector lines use the brand border color.
60
- - Active and inactive connector lines use the default border color.
61
- - RTL mirrors the date/content placement while preserving source step order.
62
-
63
- ## Install
64
-
65
- ```bash
66
- npx banhaten add timeline
67
- ```
68
-
69
- ## Examples
70
-
71
- Primary registry example: `examples/expanded/timeline-demo.tsx`.
72
-
73
- Open the live component page or run `npx banhaten docs timeline` to inspect source files, install command, and examples.
74
-
75
- ## RTL Rules
76
-
77
- This component has no special RTL contract beyond inherited document direction and logical spacing.
78
-
79
- ## Accessibility
80
-
81
- Keep native semantics, accessible names, keyboard reachability, focus-visible treatment, and status/error announcements intact when composing this component.
82
-
1
+ # Timeline
2
+
3
+ Timelines show ordered progress or dated events. Use `Timeline` for a complete sequence and `TimelineItem` when a consumer needs to compose a custom layout.
4
+
5
+ Figma references:
6
+
7
+ - `TimelineVetical`, node `572:6768`
8
+ - `TimeLineHorizontal`, node `584:4501`
9
+ - `TimelineVerticalItem`, node `572:6444`
10
+ - `TimelineHorizontalItem`, node `582:4214`
11
+
12
+ ## Variants
13
+
14
+ | Prop | Values |
15
+ | --- | --- |
16
+ | `orientation` | `vertical`, `horizontal` |
17
+ | `variant` | `default`, `icon` |
18
+ | `state` | `finished`, `active`, `inactive` |
19
+ | `dir` | `ltr`, `rtl` |
20
+
21
+ The Figma source includes vertical timelines with seven steps and horizontal timelines with six steps. Code accepts any `steps` array.
22
+
23
+ ## API
24
+
25
+ ```tsx
26
+ <Timeline
27
+ orientation="vertical"
28
+ variant="default"
29
+ dir="ltr"
30
+ steps={[
31
+ { label: "Label", caption: "Caption", date: "Mar 15. 2050", state: "finished" },
32
+ { label: "Label", caption: "Caption", date: "Mar 15. 2050", state: "active" },
33
+ { label: "Label", caption: "Caption", date: "Mar 15. 2050", state: "inactive" },
34
+ ]}
35
+ />
36
+ ```
37
+
38
+ `TimelineStep` supports `label`, `caption`, `date`, `topDate`, `bottomDate`, `state`, `icon`, and visibility flags for leading/top/bottom dates, caption, connector line, and bottom padding.
39
+
40
+ ## Token Contract
41
+
42
+ - `--bg-brand-default`: filled icon marker
43
+ - `--bg-default`: default marker center
44
+ - `--bg-muted`: inactive icon marker
45
+ - `--border-brand-strong`: finished connector line
46
+ - `--border-default`: active and inactive connector line
47
+ - `--content-default`: labels and inactive check
48
+ - `--content-subtle`: dates and captions
49
+ - `--radius-full`: marker and line radius
50
+
51
+ ## Pixel Rules
52
+
53
+ - Dates are `12px / 16px`, regular.
54
+ - Labels are `15px / 24px`, semibold.
55
+ - Captions are `14px / 20px`, regular.
56
+ - Default markers reserve a `20px` box with a small circular ring.
57
+ - Icon markers are `28px` circles with an 18px check glyph.
58
+ - Vertical item gaps use `12px`; horizontal item body spacing uses `10px`.
59
+ - Finished connector lines use the brand border color.
60
+ - Active and inactive connector lines use the default border color.
61
+ - RTL mirrors the date/content placement while preserving source step order.
62
+
63
+ ## Install
64
+
65
+ ```bash
66
+ npx banhaten add timeline
67
+ ```
68
+
69
+ ## Examples
70
+
71
+ Primary registry example: `examples/expanded/timeline-demo.tsx`.
72
+
73
+ Open the live component page or run `npx banhaten docs timeline` to inspect source files, install command, and examples.
74
+
75
+ ## RTL Rules
76
+
77
+ This component has no special RTL contract beyond inherited document direction and logical spacing.
78
+
79
+ ## Accessibility
80
+
81
+ Keep native semantics, accessible names, keyboard reachability, focus-visible treatment, and status/error announcements intact when composing this component.
82
+
83
83
  <!-- registry-contract:start -->
84
84
  ## Registry Contract
85
85