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,179 +1,182 @@
1
- # Breadcrumbs
2
-
3
- Breadcrumbs show a user's location in a hierarchy and provide a quick path back to parent pages. Use `Breadcrumbs` for page-level navigation, not for step progress, tabs, or filters.
4
-
5
- Figma reference: `Breadcrumbs`, node `238:7987`.
6
-
7
- ## Variants
8
-
9
- The Figma component defines these variants:
10
-
11
- | Type | Style | Separator type | Direction |
12
- | --- | --- | --- | --- |
13
- | `Default` | `Default` | `Slash` | LTR and RTL |
14
- | `Default` | `Default` | `Chevron` | LTR and RTL |
15
- | `Default` | `Raised` | `Slash` | LTR and RTL |
16
- | `Default` | `Raised` | `Chevron` | LTR and RTL |
17
- | `Only Icon` | `Default` | `Slash` | LTR and RTL |
18
- | `Only Icon` | `Default` | `Chevron` | LTR and RTL |
19
- | `Only Icon` | `Raised` | `Slash` | LTR and RTL |
20
- | `Only Icon` | `Raised` | `Chevron` | LTR and RTL |
21
-
22
- The Figma source supports up to six visible breadcrumb items. Code should model this as an `items` collection instead of positional booleans such as `showBreadcrumb01`.
23
-
24
- ## API
25
-
26
- Use semantic names in code even if the Figma variant labels are title-cased.
27
-
28
- ```ts
29
- type BreadcrumbSeparator = "slash" | "chevron";
30
- type BreadcrumbStyle = "default" | "raised";
31
-
32
- type BreadcrumbItem = {
33
- label: string;
34
- href?: string;
35
- icon?: React.ReactNode;
36
- current?: boolean;
37
- };
38
-
39
- type BreadcrumbsProps = {
40
- items: BreadcrumbItem[];
41
- separator?: BreadcrumbSeparator;
42
- style?: BreadcrumbStyle;
43
- iconOnly?: boolean;
44
- dir?: "ltr" | "rtl" | "auto";
45
- maxItems?: number;
46
- "aria-label"?: string;
47
- };
48
- ```
49
-
50
- `items` should be ordered from root to current page in logical reading order. RTL rendering should mirror the visual order through layout direction, not by reversing the source data.
51
-
52
- ## Layout
53
-
54
- - The root is a horizontal flex row with centered alignment.
55
- - The default style has no container background and uses a compact inline gap.
56
- - The raised style adds a surface fill, a 1px border, 12px padding, and an 8px radius in the Figma source.
57
- - Text items use `Body/body-md (base)/medium` with a 15px size and 24px line height.
58
- - Item glyphs are 18px square inside 20px slots.
59
- - Slash and chevron separators are 16px square and should be decorative.
60
- - LTR chevrons point right; RTL chevrons point left.
61
- - Each label resolves its own content direction, so an opposing script truncates at its actual end while the trail keeps the inherited layout direction.
62
- - The icon-only type keeps the same item and separator rhythm but hides visible labels.
63
- - Do not allow wrapping inside individual breadcrumb labels unless the component has a deliberate collapsed or overflow mode.
64
-
65
- ## Tokens
66
-
67
- Breadcrumbs should consume existing semantic tokens:
68
-
69
- ```ts
70
- export const breadcrumbsTokens = {
71
- itemColor: "content.subtle",
72
- currentItemColor: "content.default",
73
- iconColor: "content.subtle",
74
- separatorColor: "content.subtle",
75
- raisedBackground: "background.card",
76
- raisedBorder: "border.subtle",
77
- raisedRadius: "shape.control",
78
- inlineGap: "space.xs-4",
79
- raisedGap: "space.md-8",
80
- raisedPadding: "space.xl-12",
81
- };
82
- ```
83
-
84
- Do not hard-code Figma fallback values in component code. The current Figma fallbacks include `content/subtle` as `#4e596e`, `bg/raised` as white, `border/subtle` as `rgba(55, 83, 122, 0.13)`, and `radius/lg-8` as 8px. Implementations should resolve those through semantic tokens.
85
-
86
- If the design system later adds a dedicated `background.raised` token, the raised style can map to it. Until then, use the closest raised surface token such as `background.card`.
87
-
88
- ## Accessibility
89
-
90
- - Render the component as navigation, usually `<nav aria-label="Breadcrumb">`.
91
- - Use an ordered list so the hierarchy is exposed to assistive technology.
92
- - Render linked ancestors as anchors.
93
- - Mark the current page with `aria-current="page"` and do not require it to be a link.
94
- - Hide separators from assistive technology with `aria-hidden="true"`.
95
- - Icon-only breadcrumbs must provide an accessible label for every item, even when visible text is hidden.
96
- - Preserve logical item order for screen readers in RTL contexts.
97
- - Provide keyboard focus treatment through the link or action primitive, not on decorative separators.
98
-
99
- ## Usage
100
-
101
- ```tsx
102
- <Breadcrumbs
103
- items={[
104
- { label: "Home", href: "/", icon: <HomeIcon /> },
105
- { label: "Products", href: "/products" },
106
- { label: "Analytics", current: true },
107
- ]}
108
- />
109
-
110
- <Breadcrumbs
111
- separator="chevron"
112
- style="raised"
113
- items={[
114
- { label: "Home", href: "/", icon: <HomeIcon /> },
115
- { label: "Reports", href: "/reports" },
116
- { label: "Monthly", current: true },
117
- ]}
118
- />
119
-
120
- <Breadcrumbs
121
- iconOnly
122
- aria-label="Breadcrumb"
123
- items={[
124
- { label: "Home", href: "/", icon: <HomeIcon /> },
125
- { label: "Settings", href: "/settings", icon: <SettingsIcon /> },
126
- { label: "Profile", current: true, icon: <UserIcon /> },
127
- ]}
128
- />
129
-
130
- <Breadcrumbs
131
- dir="rtl"
132
- separator="chevron"
133
- items={[
134
- { label: "Home", href: "/", icon: <HomeIcon /> },
135
- { label: "Account", href: "/account" },
136
- { label: "Security", current: true },
137
- ]}
138
- />
139
- ```
140
-
141
- ## Preset Impact
142
-
143
- - `default`: inline breadcrumbs remain quiet, and raised breadcrumbs use a modest surface radius with subtle border separation.
144
- - `rounded`: raised breadcrumbs can use the softer control radius and slightly more relaxed spacing.
145
- - `sharp`: raised breadcrumbs should use square or near-square corners and tighter horizontal rhythm.
146
-
147
- ## Implementation Notes
148
-
149
- - Use the design system's icon primitive for home and chevron icons. The Figma source uses Remix Icon `home-5-line`, `arrow-right-s-line`, and `arrow-left-s-line`.
150
- - Generate separators between items instead of requiring callers to include separator items.
151
- - Keep overflow behavior explicit. If the trail is too long, collapse middle items behind an overflow control instead of silently hiding the current page.
152
- - Prefer `dir` or logical CSS properties for RTL behavior rather than maintaining separate RTL item arrays.
153
- - The raised style is a navigation surface, not a card. Keep elevation at `elevation.none` unless a consuming product places it inside an overlay.
154
-
155
- ## Install
156
-
157
- ```bash
158
- npx banhaten add breadcrumbs
159
- ```
160
-
161
- ## Examples
162
-
163
- Primary registry example: `examples/expanded/breadcrumbs-demo.tsx`.
164
-
165
- Open the live component page or run `npx banhaten docs breadcrumbs` to inspect source files, install command, and examples.
166
-
167
- ## Token Contract
168
-
169
- Component styles must resolve through Banhaten semantic tokens, component aliases, or documented exception-ledger values.
170
- Do not add raw colors, pixel values, opacity utilities, z-index values, durations, or shadow literals directly to component source.
171
- Covered source files: `components/expanded/breadcrumbs.css`, `components/expanded/Breadcrumbs.tsx`.
172
-
173
- ## RTL Rules
174
-
175
- The ordered trail inherits document direction and uses logical spacing. Each independently truncated label uses `dir="auto"`, preserving the identifying start of Latin content in an RTL trail (and Arabic content in an LTR trail) without changing item order, icon placement, or separator mirroring.
176
-
1
+ # Breadcrumbs
2
+
3
+ Breadcrumbs show a user's location in a hierarchy and provide a quick path back to parent pages. Use `Breadcrumbs` for page-level navigation, not for step progress, tabs, or filters.
4
+
5
+ Figma reference: `Breadcrumbs`, node `238:7987`.
6
+
7
+ ## Variants
8
+
9
+ The Figma component defines these variants:
10
+
11
+ | Type | Style | Separator type | Direction |
12
+ | --- | --- | --- | --- |
13
+ | `Default` | `Default` | `Slash` | LTR and RTL |
14
+ | `Default` | `Default` | `Chevron` | LTR and RTL |
15
+ | `Default` | `Raised` | `Slash` | LTR and RTL |
16
+ | `Default` | `Raised` | `Chevron` | LTR and RTL |
17
+ | `Only Icon` | `Default` | `Slash` | LTR and RTL |
18
+ | `Only Icon` | `Default` | `Chevron` | LTR and RTL |
19
+ | `Only Icon` | `Raised` | `Slash` | LTR and RTL |
20
+ | `Only Icon` | `Raised` | `Chevron` | LTR and RTL |
21
+
22
+ The Figma source supports up to six visible breadcrumb items. Code should model this as an `items` collection instead of positional booleans such as `showBreadcrumb01`.
23
+
24
+ ## API
25
+
26
+ Use semantic names in code even if the Figma variant labels are title-cased.
27
+
28
+ ```ts
29
+ type BreadcrumbSeparator = "slash" | "chevron";
30
+ type BreadcrumbStyle = "default" | "raised";
31
+ type BreadcrumbSize = "md" | "sm";
32
+
33
+ type BreadcrumbItem = {
34
+ label: string;
35
+ href?: string;
36
+ icon?: React.ReactNode;
37
+ current?: boolean;
38
+ };
39
+
40
+ type BreadcrumbsProps = {
41
+ items: BreadcrumbItem[];
42
+ separator?: BreadcrumbSeparator;
43
+ style?: BreadcrumbStyle;
44
+ size?: BreadcrumbSize;
45
+ iconOnly?: boolean;
46
+ dir?: "ltr" | "rtl" | "auto";
47
+ maxItems?: number;
48
+ "aria-label"?: string;
49
+ };
50
+ ```
51
+
52
+ `items` should be ordered from root to current page in logical reading order. RTL rendering should mirror the visual order through layout direction, not by reversing the source data.
53
+
54
+ ## Layout
55
+
56
+ - The root is a horizontal flex row with centered alignment.
57
+ - The default style has no container background and uses a compact inline gap.
58
+ - The raised style adds a surface fill, a 1px border, 12px padding, and an 8px radius in the Figma source.
59
+ - Text items use `Body/body-md (base)/medium` with a 15px size and 24px line height.
60
+ - `size="sm"` uses `Body/body-sm/medium` with a 14px size, a 20px line height, and a 12px separator, so labels sit 20px apart, as in a 14px trail written with two spaces on each side of the slash.
61
+ - Item glyphs are 18px square inside 20px slots.
62
+ - Slash and chevron separators are 16px square and should be decorative.
63
+ - LTR chevrons point right; RTL chevrons point left.
64
+ - Each label resolves its own content direction, so an opposing script truncates at its actual end while the trail keeps the inherited layout direction.
65
+ - The icon-only type keeps the same item and separator rhythm but hides visible labels.
66
+ - Do not allow wrapping inside individual breadcrumb labels unless the component has a deliberate collapsed or overflow mode.
67
+
68
+ ## Tokens
69
+
70
+ Breadcrumbs should consume existing semantic tokens:
71
+
72
+ ```ts
73
+ export const breadcrumbsTokens = {
74
+ itemColor: "content.subtle",
75
+ currentItemColor: "content.default", // --bh-breadcrumbs-current-content
76
+ iconColor: "content.subtle",
77
+ separatorColor: "content.subtle",
78
+ raisedBackground: "background.card",
79
+ raisedBorder: "border.subtle",
80
+ raisedRadius: "shape.control",
81
+ inlineGap: "space.xs-4",
82
+ raisedGap: "space.md-8",
83
+ raisedPadding: "space.xl-12",
84
+ };
85
+ ```
86
+
87
+ Do not hard-code Figma fallback values in component code. The current Figma fallbacks include `content/subtle` as `#4e596e`, `bg/raised` as white, `border/subtle` as `rgba(55, 83, 122, 0.13)`, and `radius/lg-8` as 8px. Implementations should resolve those through semantic tokens.
88
+
89
+ If the design system later adds a dedicated `background.raised` token, the raised style can map to it. Until then, use the closest raised surface token such as `background.card`.
90
+
91
+ ## Accessibility
92
+
93
+ - Render the component as navigation, usually `<nav aria-label="Breadcrumb">`.
94
+ - Use an ordered list so the hierarchy is exposed to assistive technology.
95
+ - Render linked ancestors as anchors.
96
+ - Mark the current page with `aria-current="page"` and do not require it to be a link.
97
+ - Hide separators from assistive technology with `aria-hidden="true"`.
98
+ - Icon-only breadcrumbs must provide an accessible label for every item, even when visible text is hidden.
99
+ - Preserve logical item order for screen readers in RTL contexts.
100
+ - Provide keyboard focus treatment through the link or action primitive, not on decorative separators.
101
+
102
+ ## Usage
103
+
104
+ ```tsx
105
+ <Breadcrumbs
106
+ items={[
107
+ { label: "Home", href: "/", icon: <HomeIcon /> },
108
+ { label: "Products", href: "/products" },
109
+ { label: "Analytics", current: true },
110
+ ]}
111
+ />
112
+
113
+ <Breadcrumbs
114
+ separator="chevron"
115
+ style="raised"
116
+ items={[
117
+ { label: "Home", href: "/", icon: <HomeIcon /> },
118
+ { label: "Reports", href: "/reports" },
119
+ { label: "Monthly", current: true },
120
+ ]}
121
+ />
122
+
123
+ <Breadcrumbs
124
+ iconOnly
125
+ aria-label="Breadcrumb"
126
+ items={[
127
+ { label: "Home", href: "/", icon: <HomeIcon /> },
128
+ { label: "Settings", href: "/settings", icon: <SettingsIcon /> },
129
+ { label: "Profile", current: true, icon: <UserIcon /> },
130
+ ]}
131
+ />
132
+
133
+ <Breadcrumbs
134
+ dir="rtl"
135
+ separator="chevron"
136
+ items={[
137
+ { label: "Home", href: "/", icon: <HomeIcon /> },
138
+ { label: "Account", href: "/account" },
139
+ { label: "Security", current: true },
140
+ ]}
141
+ />
142
+ ```
143
+
144
+ ## Preset Impact
145
+
146
+ - `default`: inline breadcrumbs remain quiet, and raised breadcrumbs use a modest surface radius with subtle border separation.
147
+ - `rounded`: raised breadcrumbs can use the softer control radius and slightly more relaxed spacing.
148
+ - `sharp`: raised breadcrumbs should use square or near-square corners and tighter horizontal rhythm.
149
+
150
+ ## Implementation Notes
151
+
152
+ - Use the design system's icon primitive for home and chevron icons. The Figma source uses Remix Icon `home-5-line`, `arrow-right-s-line`, and `arrow-left-s-line`.
153
+ - Generate separators between items instead of requiring callers to include separator items.
154
+ - Keep overflow behavior explicit. If the trail is too long, collapse middle items behind an overflow control instead of silently hiding the current page.
155
+ - Prefer `dir` or logical CSS properties for RTL behavior rather than maintaining separate RTL item arrays.
156
+ - The raised style is a navigation surface, not a card. Keep elevation at `elevation.none` unless a consuming product places it inside an overlay.
157
+
158
+ ## Install
159
+
160
+ ```bash
161
+ npx banhaten add breadcrumbs
162
+ ```
163
+
164
+ ## Examples
165
+
166
+ Primary registry example: `examples/expanded/breadcrumbs-demo.tsx`.
167
+
168
+ Open the live component page or run `npx banhaten docs breadcrumbs` to inspect source files, install command, and examples.
169
+
170
+ ## Token Contract
171
+
172
+ Component styles must resolve through Banhaten semantic tokens, component aliases, or documented exception-ledger values.
173
+ Do not add raw colors, pixel values, opacity utilities, z-index values, durations, or shadow literals directly to component source.
174
+ Covered source files: `components/expanded/breadcrumbs.css`, `components/expanded/Breadcrumbs.tsx`.
175
+
176
+ ## RTL Rules
177
+
178
+ The ordered trail inherits document direction and uses logical spacing. Each independently truncated label uses `dir="auto"`, preserving the identifying start of Latin content in an RTL trail (and Arabic content in an LTR trail) without changing item order, icon placement, or separator mirroring.
179
+
177
180
  <!-- registry-contract:start -->
178
181
  ## Registry Contract
179
182
 
@@ -186,7 +189,8 @@ This table is generated from `registry/index.json`; edit the component-owned sou
186
189
  | `parts` | `Breadcrumbs` |
187
190
  | `registryDependencies` | None |
188
191
  | `modes` | `text`, `icon-only`, `slash`, `chevron` |
192
+ | `sizes` | `md`, `sm` |
189
193
  | `states` | `link`, `current`, `overflow` |
190
- | `tokens` | `--bh-bg-raised`, `--bh-border-focus`, `--bh-border-subtle`, `--bh-content-default`, `--bh-content-subtle`, `--bh-focus-ring-width`, `--bh-font-family`, `--bh-font-weight-medium`, `--bh-icon-size-default`, `--bh-icon-slot-size-default`, `--bh-icon-stroke-190`, `--bh-icon-stroke-200`, `--bh-icon-stroke-225`, `--bh-interactive-ghost-hover`, `--bh-radius-lg-8`, `--bh-radius-sm-4`, `--bh-space-3xl-16`, `--bh-space-6xl-32`, `--bh-space-md-8`, `--bh-space-xl-12`, `--bh-space-xs-4`, `--bh-space-xxs-2`, `--bh-space-xxxs-1`, `--bh-text-base-letter-spacing`, `--bh-text-body-2xs-regular-line-height`, `--bh-text-body-md-font-size`, `--bh-text-body-md-line-height` |
194
+ | `tokens` | `--bh-bg-raised`, `--bh-border-focus`, `--bh-border-subtle`, `--bh-breadcrumbs-current-content`, `--bh-content-default`, `--bh-content-subtle`, `--bh-focus-ring-width`, `--bh-font-family`, `--bh-font-weight-medium`, `--bh-icon-size-default`, `--bh-icon-slot-size-default`, `--bh-icon-stroke-190`, `--bh-icon-stroke-200`, `--bh-icon-stroke-225`, `--bh-interactive-ghost-hover`, `--bh-radius-lg-8`, `--bh-radius-sm-4`, `--bh-space-3xl-16`, `--bh-space-6xl-32`, `--bh-space-md-8`, `--bh-space-xl-12`, `--bh-space-xs-4`, `--bh-space-xxs-2`, `--bh-space-xxxs-1`, `--bh-text-base-letter-spacing`, `--bh-text-body-2xs-regular-line-height`, `--bh-text-body-md-font-size`, `--bh-text-body-md-line-height`, `--bh-text-body-sm-medium-font-size`, `--bh-text-body-sm-medium-font-weight`, `--bh-text-body-sm-medium-letter-spacing`, `--bh-text-body-sm-medium-line-height` |
191
195
  | `variants` | `default`, `raised` |
192
196
  <!-- registry-contract:end -->
@@ -1,100 +1,100 @@
1
- # Button Group
2
-
3
- Button Group is a connected set of related button actions. It supports text buttons and icon-only buttons, three sizes, inherited LTR/RTL direction, logical dividers, and tokenized interaction states.
4
-
5
- The implementation follows the Figma component at `Design system 3.0 Copy / Button Group Item 1.2` (`390:12399`).
6
-
7
- ## API
8
-
9
- Use `ButtonGroup` as the connected container and `ButtonGroupItem` for each action.
10
-
11
- ```tsx
12
- <ButtonGroup aria-label="View options" size="md">
13
- <ButtonGroupItem>
14
- <PlusIcon data-icon="inline-start" />
15
- Button
16
- <PlusIcon data-icon="inline-end" />
17
- </ButtonGroupItem>
18
- <ButtonGroupItem aria-pressed>
19
- <PlusIcon data-icon="inline-start" />
20
- Active
21
- <PlusIcon data-icon="inline-end" />
22
- </ButtonGroupItem>
23
- </ButtonGroup>
24
- ```
25
-
26
- Use `ToggleGroup` when the connected controls own a single or multiple pressed-value model. It includes controlled and uncontrolled state plus Home, End, and direction-aware arrow-key focus movement.
27
-
28
- ```tsx
29
- <ToggleGroup aria-label="Text alignment" defaultValue="start">
30
- <ToggleGroupItem value="start">Start</ToggleGroupItem>
31
- <ToggleGroupItem value="center">Center</ToggleGroupItem>
32
- <ToggleGroupItem value="end">End</ToggleGroupItem>
33
- </ToggleGroup>
34
- ```
35
-
36
- ## Variants
37
-
38
- | Prop | Values |
39
- | --- | --- |
40
- | `size` | `md`, `sm`, `xs` |
41
- | `mode` | `default`, `iconOnly` |
42
- | `ButtonGroupItem aria-pressed` | `true`, `false` |
43
- | `ButtonGroupItem disabled` | `boolean` |
44
- | `ToggleGroup type` | `single`, `multiple` |
45
- | `ToggleGroup value`, `defaultValue` | `string`, `string[]` |
46
- | `ToggleGroupItem value` | `string` |
47
-
48
- Interaction styling is applied through native CSS pseudo states: `:hover`, `:active`, `:focus-visible`, `:disabled`, and `aria-pressed="true"`.
49
-
50
- ## States
51
-
52
- | State | Background | Content |
53
- | --- | --- | --- |
54
- | Default | `--bh-button-group-item-bg` | `--bh-button-group-content-default` |
55
- | Hover | `--bh-button-group-item-hover-bg` | `--bh-button-group-content-default` |
56
- | Pressed | `--bh-button-group-item-pressed-bg` | `--bh-button-group-content-default` |
57
- | Active | `--bh-button-group-item-active-bg` | `--bh-button-group-content-active` |
58
- | Disabled | `--bh-button-group-item-disabled-bg` | `--bh-button-group-content-disabled` |
59
-
60
- ## Dimensions
61
-
62
- | Size | Height | LTR text item | RTL text item | Icon-only item |
63
- | --- | ---: | ---: | ---: | ---: |
64
- | `md` | 40px | 128px | 124px | 40px |
65
- | `sm` | 36px | 120px | 116px | 36px |
66
- | `xs` | 32px | 112px | 108px | 32px |
67
-
68
- Text buttons use the design-system button typography tokens. Default glyphs are 18px inside preserved 20px slots. Icon-only buttons require an accessible label.
69
-
70
- ## Install
71
-
72
- ```bash
73
- npx banhaten add button-group
74
- ```
75
-
76
- ## Examples
77
-
78
- Primary registry example: `examples/button-group-demo.tsx`.
79
-
80
- Open the live component page or run `npx banhaten docs button-group` to inspect source files, install command, and examples.
81
-
82
- ## Token Contract
83
-
84
- Component styles must resolve through Banhaten semantic tokens, component aliases, or documented exception-ledger values.
85
- Do not add raw colors, pixel values, opacity utilities, z-index values, durations, or shadow literals directly to component source.
86
- Covered source files: `components/button-group.tsx`.
87
-
88
- ## RTL Rules
89
-
90
- - `inheritsDirection`: true
91
- - `itemSizing`: LTR and RTL default items keep their fixed Figma matrix widths. Icon-only groups keep the same square dimensions.
92
- - `spacing`: Uses logical dividers and inherited flex direction so item order, icon order, padding, and separators follow LTR or RTL.
93
-
94
- ## Accessibility
95
-
96
- 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.
97
-
1
+ # Button Group
2
+
3
+ Button Group is a connected set of related button actions. It supports text buttons and icon-only buttons, three sizes, inherited LTR/RTL direction, logical dividers, and tokenized interaction states.
4
+
5
+ The implementation follows the Figma component at `Design system 3.0 Copy / Button Group Item 1.2` (`390:12399`).
6
+
7
+ ## API
8
+
9
+ Use `ButtonGroup` as the connected container and `ButtonGroupItem` for each action.
10
+
11
+ ```tsx
12
+ <ButtonGroup aria-label="View options" size="md">
13
+ <ButtonGroupItem>
14
+ <PlusIcon data-icon="inline-start" />
15
+ Button
16
+ <PlusIcon data-icon="inline-end" />
17
+ </ButtonGroupItem>
18
+ <ButtonGroupItem aria-pressed>
19
+ <PlusIcon data-icon="inline-start" />
20
+ Active
21
+ <PlusIcon data-icon="inline-end" />
22
+ </ButtonGroupItem>
23
+ </ButtonGroup>
24
+ ```
25
+
26
+ Use `ToggleGroup` when the connected controls own a single or multiple pressed-value model. It includes controlled and uncontrolled state plus Home, End, and direction-aware arrow-key focus movement.
27
+
28
+ ```tsx
29
+ <ToggleGroup aria-label="Text alignment" defaultValue="start">
30
+ <ToggleGroupItem value="start">Start</ToggleGroupItem>
31
+ <ToggleGroupItem value="center">Center</ToggleGroupItem>
32
+ <ToggleGroupItem value="end">End</ToggleGroupItem>
33
+ </ToggleGroup>
34
+ ```
35
+
36
+ ## Variants
37
+
38
+ | Prop | Values |
39
+ | --- | --- |
40
+ | `size` | `md`, `sm`, `xs` |
41
+ | `mode` | `default`, `iconOnly` |
42
+ | `ButtonGroupItem aria-pressed` | `true`, `false` |
43
+ | `ButtonGroupItem disabled` | `boolean` |
44
+ | `ToggleGroup type` | `single`, `multiple` |
45
+ | `ToggleGroup value`, `defaultValue` | `string`, `string[]` |
46
+ | `ToggleGroupItem value` | `string` |
47
+
48
+ Interaction styling is applied through native CSS pseudo states: `:hover`, `:active`, `:focus-visible`, `:disabled`, and `aria-pressed="true"`.
49
+
50
+ ## States
51
+
52
+ | State | Background | Content |
53
+ | --- | --- | --- |
54
+ | Default | `--bh-button-group-item-bg` | `--bh-button-group-content-default` |
55
+ | Hover | `--bh-button-group-item-hover-bg` | `--bh-button-group-content-default` |
56
+ | Pressed | `--bh-button-group-item-pressed-bg` | `--bh-button-group-content-default` |
57
+ | Active | `--bh-button-group-item-active-bg` | `--bh-button-group-content-active` |
58
+ | Disabled | `--bh-button-group-item-disabled-bg` | `--bh-button-group-content-disabled` |
59
+
60
+ ## Dimensions
61
+
62
+ | Size | Height | LTR text item | RTL text item | Icon-only item |
63
+ | --- | ---: | ---: | ---: | ---: |
64
+ | `md` | 40px | 128px | 124px | 40px |
65
+ | `sm` | 36px | 120px | 116px | 36px |
66
+ | `xs` | 32px | 112px | 108px | 32px |
67
+
68
+ Text buttons use the design-system button typography tokens. Default glyphs are 18px inside preserved 20px slots. Icon-only buttons require an accessible label.
69
+
70
+ ## Install
71
+
72
+ ```bash
73
+ npx banhaten add button-group
74
+ ```
75
+
76
+ ## Examples
77
+
78
+ Primary registry example: `examples/button-group-demo.tsx`.
79
+
80
+ Open the live component page or run `npx banhaten docs button-group` to inspect source files, install command, and examples.
81
+
82
+ ## Token Contract
83
+
84
+ Component styles must resolve through Banhaten semantic tokens, component aliases, or documented exception-ledger values.
85
+ Do not add raw colors, pixel values, opacity utilities, z-index values, durations, or shadow literals directly to component source.
86
+ Covered source files: `components/button-group.tsx`.
87
+
88
+ ## RTL Rules
89
+
90
+ - `inheritsDirection`: true
91
+ - `itemSizing`: LTR and RTL default items keep their fixed Figma matrix widths. Icon-only groups keep the same square dimensions.
92
+ - `spacing`: Uses logical dividers and inherited flex direction so item order, icon order, padding, and separators follow LTR or RTL.
93
+
94
+ ## Accessibility
95
+
96
+ 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.
97
+
98
98
  <!-- registry-contract:start -->
99
99
  ## Registry Contract
100
100