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,189 +1,189 @@
1
- # File Upload
2
-
3
- `FileUpload` lets people drag files into a drop zone, browse for files, and review queued upload items. Use it when the workflow supports one or more files and the user needs clear per-file status feedback.
4
-
5
- Figma reference: `File upload`, node `254:3195`.
6
-
7
- ## Variants
8
-
9
- The Figma component defines these top-level variants:
10
-
11
- | Size | Direction |
12
- | --- | --- |
13
- | `lg` | LTR |
14
- | `sm` | LTR |
15
- | `lg` | RTL |
16
- | `sm` | RTL |
17
-
18
- Queued file rows define these states:
19
-
20
- | State | Meaning |
21
- | --- | --- |
22
- | `uploaded` | The file finished uploading successfully. |
23
- | `uploading` | The file is uploading and progress is unknown. |
24
- | `uploading-progress` | The file is uploading and exposes a progress bar. |
25
- | `error` | The file failed and needs a retry or removal action. |
26
-
27
- ## API
28
-
29
- Use semantic names in code and let the implementation map them to the current appearance preset.
30
-
31
- ```ts
32
- type FileUploadSize = "lg" | "sm";
33
- type FileUploadVariant = "default" | "button";
34
- type FileUploadDropzoneState = "default" | "hover";
35
- type FileUploadItemStatus = "uploaded" | "uploading" | "uploading-progress" | "error";
36
-
37
- type FileUploadFile = {
38
- id: string;
39
- name: string;
40
- sizeLabel: string;
41
- versionLabel?: string;
42
- progress?: number;
43
- progressLabel?: string;
44
- extensionLabel?: string;
45
- status: FileUploadItemStatus;
46
- errorLabel?: string;
47
- uploadedLabel?: string;
48
- uploadLabel?: string;
49
- };
50
-
51
- type FileUploadProps = {
52
- size?: FileUploadSize;
53
- variant?: FileUploadVariant;
54
- dropzoneState?: FileUploadDropzoneState;
55
- dir?: "ltr" | "rtl" | "auto";
56
- files?: FileUploadFile[];
57
- title?: string;
58
- prompt?: string;
59
- browseLabel?: string;
60
- helperText?: string;
61
- disabled?: boolean;
62
- accept?: string;
63
- multiple?: boolean;
64
- onBrowse?: () => void;
65
- onDrop?: (files: FileList) => void;
66
- onMore?: (fileId: string) => void;
67
- onCancel?: (fileId: string) => void;
68
- onRemove?: (fileId: string) => void;
69
- onRetry?: (fileId: string) => void;
70
- };
71
- ```
72
-
73
- `files` controls whether the queued file list renders. Do not expose a separate `hasFilesQueued` prop in production code; the rendered state should follow from the file array.
74
-
75
- ## Layout
76
-
77
- - The root stacks the drop zone and queued file list vertically.
78
- - Large width is 500px in the Figma source; small width is 343px. Implementations may use `width: 100%` with those values as max-widths.
79
- - The default drop zone is 500px by 180px; the title-plus-button variant is 500px by 256px.
80
- - The drop zone is centered, uses a 2px dashed border, and hover strengthens the border without changing the surface.
81
- - The upload icon container is 48px square with a subtle border and the current control radius.
82
- - Large file rows use 16px padding, a 40px file icon, and 12px gaps.
83
- - Small file rows use 12px padding, a 32px file icon, and 8px gaps.
84
- - Row actions are icon-only: more, close/cancel, and trash.
85
- - The queued list uses a 12px vertical gap.
86
- - RTL mode mirrors visual order and aligns file metadata to the end while preserving logical reading order.
87
-
88
- ## Tokens
89
-
90
- The Figma source uses design tokens such as `bg/raised`, `interactive/secondary/default`, `border/subtle`, `border/danger/strong`, `space/*`, and `radius/*`. Implementations should map those to the design system's semantic token contract.
91
-
92
- ```ts
93
- export const fileUploadTokens = {
94
- dropzoneBackground: "background.subtle",
95
- dropzoneBorder: "border.default",
96
- dropzoneIconBackground: "background.default",
97
- dropzoneIconBorder: "border.subtle",
98
- rowBackground: "background.card",
99
- rowBorder: "border.subtle",
100
- rowErrorBorder: "border.danger",
101
- rowElevation: "elevation.card",
102
- textColor: "content.default",
103
- helperTextColor: "content.subtle",
104
- linkColor: "content.link",
105
- successColor: "content.success",
106
- dangerColor: "content.danger",
107
- rowRadiusLarge: "shape.card",
108
- rowRadiusSmall: "shape.control",
109
- };
110
- ```
111
-
112
- Do not hard-code the Figma fallback values in component code. For example, the error state should resolve through `border.danger` and `content.danger`, not through the Figma fallback hex values.
113
-
114
- ## Behavior
115
-
116
- - Clicking the browse text or drop zone should open the platform file picker.
117
- - Dragging files over the drop zone should show the same target without changing the component API.
118
- - `uploading` rows should expose a close/cancel action.
119
- - `uploading-progress` rows should expose a real progress bar and percent label.
120
- - `uploaded` rows should expose remove and overflow actions when the product has secondary file actions.
121
- - `error` rows should expose remove and retry actions.
122
- - The component should support both single-file and multi-file use through the `multiple` prop or equivalent platform API.
123
-
124
- ## Accessibility
125
-
126
- - Use a real file input or a button connected to a file input.
127
- - Preserve keyboard access for browse, cancel, remove, retry, and overflow actions.
128
- - Announce upload status changes through an accessible live region when status changes after initial render.
129
- - Keep file names as real text and avoid icon-only status communication.
130
- - Icon-only actions need accessible labels such as `Cancel upload`, `Remove file`, `Retry upload`, and `More file actions`.
131
- - The drop zone should not be the only way to select files.
132
-
133
- ## Usage
134
-
135
- ```tsx
136
- <FileUpload
137
- files={[
138
- { id: "1", name: "file-name.pdf", sizeLabel: "32mb", versionLabel: "v1.2.2", status: "uploaded" },
139
- { id: "2", name: "file-name.pdf", sizeLabel: "32mb", versionLabel: "v1.2.2", status: "uploading" },
140
- { id: "3", name: "file-name.pdf", sizeLabel: "32 KB", progress: 40, status: "uploading-progress" },
141
- { id: "4", name: "file-name.pdf", sizeLabel: "32mb", versionLabel: "v1.2.2", status: "error" },
142
- ]}
143
- multiple
144
- />
145
-
146
- <FileUpload size="sm" files={[{ id: "1", name: "file-name.pdf", sizeLabel: "32 KB", status: "uploaded" }]} />
147
-
148
- <FileUpload dir="rtl" size="lg" />
149
- ```
150
-
151
- ## Preset Impact
152
-
153
- - `default`: white rows on a subtle drop-zone background, modest radius, quiet shadow, and balanced spacing.
154
- - `rounded`: softer drop-zone and row corners, slightly more padding, and gentler borders.
155
- - `sharp`: square or near-square row treatment, denser spacing, stronger borders, and minimal row elevation.
156
-
157
- ## Implementation Notes
158
-
159
- - Keep the drop zone and file row primitives separate so rows can be reused in compact upload summaries.
160
- - Prefer existing icon components for upload, file type, success, loading, close, more, trash, and warning actions.
161
- - Use a real progress indicator when the product can report upload progress; use the `uploading` label when progress is unknown.
162
- - Truncate long file names in the middle or end, but keep the full file name available to assistive technology and tooltips.
163
- - Avoid coupling RTL behavior to translated strings. Direction should come from `dir` or document context.
164
-
165
- ## Install
166
-
167
- ```bash
168
- npx banhaten add file-upload
169
- ```
170
-
171
- ## Examples
172
-
173
- Primary registry example: `examples/expanded/file-upload-demo.tsx`.
174
-
175
- Open the live component page or run `npx banhaten docs file-upload` to inspect source files, install command, and examples.
176
-
177
- ## Token Contract
178
-
179
- Component styles must resolve through Banhaten semantic tokens, component aliases, or documented exception-ledger values.
180
- Do not add raw colors, pixel values, opacity utilities, z-index values, durations, or shadow literals directly to component source.
181
- Covered source files: `components/expanded/fileUpload.css`, `components/expanded/FileUpload.tsx`.
182
-
183
- ## RTL Rules
184
-
185
- This component has no special RTL contract beyond inherited document direction and logical spacing.
186
-
1
+ # File Upload
2
+
3
+ `FileUpload` lets people drag files into a drop zone, browse for files, and review queued upload items. Use it when the workflow supports one or more files and the user needs clear per-file status feedback.
4
+
5
+ Figma reference: `File upload`, node `254:3195`.
6
+
7
+ ## Variants
8
+
9
+ The Figma component defines these top-level variants:
10
+
11
+ | Size | Direction |
12
+ | --- | --- |
13
+ | `lg` | LTR |
14
+ | `sm` | LTR |
15
+ | `lg` | RTL |
16
+ | `sm` | RTL |
17
+
18
+ Queued file rows define these states:
19
+
20
+ | State | Meaning |
21
+ | --- | --- |
22
+ | `uploaded` | The file finished uploading successfully. |
23
+ | `uploading` | The file is uploading and progress is unknown. |
24
+ | `uploading-progress` | The file is uploading and exposes a progress bar. |
25
+ | `error` | The file failed and needs a retry or removal action. |
26
+
27
+ ## API
28
+
29
+ Use semantic names in code and let the implementation map them to the current appearance preset.
30
+
31
+ ```ts
32
+ type FileUploadSize = "lg" | "sm";
33
+ type FileUploadVariant = "default" | "button";
34
+ type FileUploadDropzoneState = "default" | "hover";
35
+ type FileUploadItemStatus = "uploaded" | "uploading" | "uploading-progress" | "error";
36
+
37
+ type FileUploadFile = {
38
+ id: string;
39
+ name: string;
40
+ sizeLabel: string;
41
+ versionLabel?: string;
42
+ progress?: number;
43
+ progressLabel?: string;
44
+ extensionLabel?: string;
45
+ status: FileUploadItemStatus;
46
+ errorLabel?: string;
47
+ uploadedLabel?: string;
48
+ uploadLabel?: string;
49
+ };
50
+
51
+ type FileUploadProps = {
52
+ size?: FileUploadSize;
53
+ variant?: FileUploadVariant;
54
+ dropzoneState?: FileUploadDropzoneState;
55
+ dir?: "ltr" | "rtl" | "auto";
56
+ files?: FileUploadFile[];
57
+ title?: string;
58
+ prompt?: string;
59
+ browseLabel?: string;
60
+ helperText?: string;
61
+ disabled?: boolean;
62
+ accept?: string;
63
+ multiple?: boolean;
64
+ onBrowse?: () => void;
65
+ onDrop?: (files: FileList) => void;
66
+ onMore?: (fileId: string) => void;
67
+ onCancel?: (fileId: string) => void;
68
+ onRemove?: (fileId: string) => void;
69
+ onRetry?: (fileId: string) => void;
70
+ };
71
+ ```
72
+
73
+ `files` controls whether the queued file list renders. Do not expose a separate `hasFilesQueued` prop in production code; the rendered state should follow from the file array.
74
+
75
+ ## Layout
76
+
77
+ - The root stacks the drop zone and queued file list vertically.
78
+ - Large width is 500px in the Figma source; small width is 343px. Implementations may use `width: 100%` with those values as max-widths.
79
+ - The default drop zone is 500px by 180px; the title-plus-button variant is 500px by 256px.
80
+ - The drop zone is centered, uses a 2px dashed border, and hover strengthens the border without changing the surface.
81
+ - The upload icon container is 48px square with a subtle border and the current control radius.
82
+ - Large file rows use 16px padding, a 40px file icon, and 12px gaps.
83
+ - Small file rows use 12px padding, a 32px file icon, and 8px gaps.
84
+ - Row actions are icon-only: more, close/cancel, and trash.
85
+ - The queued list uses a 12px vertical gap.
86
+ - RTL mode mirrors visual order and aligns file metadata to the end while preserving logical reading order.
87
+
88
+ ## Tokens
89
+
90
+ The Figma source uses design tokens such as `bg/raised`, `interactive/secondary/default`, `border/subtle`, `border/danger/strong`, `space/*`, and `radius/*`. Implementations should map those to the design system's semantic token contract.
91
+
92
+ ```ts
93
+ export const fileUploadTokens = {
94
+ dropzoneBackground: "background.subtle",
95
+ dropzoneBorder: "border.default",
96
+ dropzoneIconBackground: "background.default",
97
+ dropzoneIconBorder: "border.subtle",
98
+ rowBackground: "background.card",
99
+ rowBorder: "border.subtle",
100
+ rowErrorBorder: "border.danger",
101
+ rowElevation: "elevation.card",
102
+ textColor: "content.default",
103
+ helperTextColor: "content.subtle",
104
+ linkColor: "content.link",
105
+ successColor: "content.success",
106
+ dangerColor: "content.danger",
107
+ rowRadiusLarge: "shape.card",
108
+ rowRadiusSmall: "shape.control",
109
+ };
110
+ ```
111
+
112
+ Do not hard-code the Figma fallback values in component code. For example, the error state should resolve through `border.danger` and `content.danger`, not through the Figma fallback hex values.
113
+
114
+ ## Behavior
115
+
116
+ - Clicking the browse text or drop zone should open the platform file picker.
117
+ - Dragging files over the drop zone should show the same target without changing the component API.
118
+ - `uploading` rows should expose a close/cancel action.
119
+ - `uploading-progress` rows should expose a real progress bar and percent label.
120
+ - `uploaded` rows should expose remove and overflow actions when the product has secondary file actions.
121
+ - `error` rows should expose remove and retry actions.
122
+ - The component should support both single-file and multi-file use through the `multiple` prop or equivalent platform API.
123
+
124
+ ## Accessibility
125
+
126
+ - Use a real file input or a button connected to a file input.
127
+ - Preserve keyboard access for browse, cancel, remove, retry, and overflow actions.
128
+ - Announce upload status changes through an accessible live region when status changes after initial render.
129
+ - Keep file names as real text and avoid icon-only status communication.
130
+ - Icon-only actions need accessible labels such as `Cancel upload`, `Remove file`, `Retry upload`, and `More file actions`.
131
+ - The drop zone should not be the only way to select files.
132
+
133
+ ## Usage
134
+
135
+ ```tsx
136
+ <FileUpload
137
+ files={[
138
+ { id: "1", name: "file-name.pdf", sizeLabel: "32mb", versionLabel: "v1.2.2", status: "uploaded" },
139
+ { id: "2", name: "file-name.pdf", sizeLabel: "32mb", versionLabel: "v1.2.2", status: "uploading" },
140
+ { id: "3", name: "file-name.pdf", sizeLabel: "32 KB", progress: 40, status: "uploading-progress" },
141
+ { id: "4", name: "file-name.pdf", sizeLabel: "32mb", versionLabel: "v1.2.2", status: "error" },
142
+ ]}
143
+ multiple
144
+ />
145
+
146
+ <FileUpload size="sm" files={[{ id: "1", name: "file-name.pdf", sizeLabel: "32 KB", status: "uploaded" }]} />
147
+
148
+ <FileUpload dir="rtl" size="lg" />
149
+ ```
150
+
151
+ ## Preset Impact
152
+
153
+ - `default`: white rows on a subtle drop-zone background, modest radius, quiet shadow, and balanced spacing.
154
+ - `rounded`: softer drop-zone and row corners, slightly more padding, and gentler borders.
155
+ - `sharp`: square or near-square row treatment, denser spacing, stronger borders, and minimal row elevation.
156
+
157
+ ## Implementation Notes
158
+
159
+ - Keep the drop zone and file row primitives separate so rows can be reused in compact upload summaries.
160
+ - Prefer existing icon components for upload, file type, success, loading, close, more, trash, and warning actions.
161
+ - Use a real progress indicator when the product can report upload progress; use the `uploading` label when progress is unknown.
162
+ - Truncate long file names in the middle or end, but keep the full file name available to assistive technology and tooltips.
163
+ - Avoid coupling RTL behavior to translated strings. Direction should come from `dir` or document context.
164
+
165
+ ## Install
166
+
167
+ ```bash
168
+ npx banhaten add file-upload
169
+ ```
170
+
171
+ ## Examples
172
+
173
+ Primary registry example: `examples/expanded/file-upload-demo.tsx`.
174
+
175
+ Open the live component page or run `npx banhaten docs file-upload` to inspect source files, install command, and examples.
176
+
177
+ ## Token Contract
178
+
179
+ Component styles must resolve through Banhaten semantic tokens, component aliases, or documented exception-ledger values.
180
+ Do not add raw colors, pixel values, opacity utilities, z-index values, durations, or shadow literals directly to component source.
181
+ Covered source files: `components/expanded/fileUpload.css`, `components/expanded/FileUpload.tsx`.
182
+
183
+ ## RTL Rules
184
+
185
+ This component has no special RTL contract beyond inherited document direction and logical spacing.
186
+
187
187
  <!-- registry-contract:start -->
188
188
  ## Registry Contract
189
189
 
@@ -1,50 +1,50 @@
1
- # Hover Card
2
-
3
- Hover Card wraps Radix HoverCard for rich preview content on hover and focus.
4
-
5
- ## API
6
-
7
- ```tsx
8
- <HoverCard>
9
- <HoverCardTrigger>Workspace profile</HoverCardTrigger>
10
- <HoverCardContent>Preview content</HoverCardContent>
11
- </HoverCard>
12
- ```
13
-
14
- | Part | Purpose |
15
- | --- | --- |
16
- | `HoverCard`, `HoverCardTrigger`, `HoverCardPortal` | Radix shell |
17
- | `HoverCardContent` | tokenized preview surface |
18
-
19
- ## Token Contract
20
-
21
- Hover Card uses Banhaten raised background, popover shadow, radius, spacing, and content tokens.
22
-
23
- ## RTL
24
-
25
- Content inherits direction and uses logical text alignment.
26
-
27
- ## Accessibility
28
-
29
- Radix manages hover/focus timing and content relationships.
30
-
31
- ## Install
32
-
33
- ```bash
34
- npx banhaten add hover-card
35
- ```
36
-
37
- ## Examples
38
-
39
- Primary registry example: `examples/hover-card-demo.tsx`.
40
-
41
- Open the live component page or run `npx banhaten docs hover-card` to inspect source files, install command, and examples.
42
-
43
- ## RTL Rules
44
-
45
- - `inheritsDirection`: true
46
- - `textDirection`: Content inherits direction and uses logical text alignment.
47
-
1
+ # Hover Card
2
+
3
+ Hover Card wraps Radix HoverCard for rich preview content on hover and focus.
4
+
5
+ ## API
6
+
7
+ ```tsx
8
+ <HoverCard>
9
+ <HoverCardTrigger>Workspace profile</HoverCardTrigger>
10
+ <HoverCardContent>Preview content</HoverCardContent>
11
+ </HoverCard>
12
+ ```
13
+
14
+ | Part | Purpose |
15
+ | --- | --- |
16
+ | `HoverCard`, `HoverCardTrigger`, `HoverCardPortal` | Radix shell |
17
+ | `HoverCardContent` | tokenized preview surface |
18
+
19
+ ## Token Contract
20
+
21
+ Hover Card uses Banhaten raised background, popover shadow, radius, spacing, and content tokens.
22
+
23
+ ## RTL
24
+
25
+ Content inherits direction and uses logical text alignment.
26
+
27
+ ## Accessibility
28
+
29
+ Radix manages hover/focus timing and content relationships.
30
+
31
+ ## Install
32
+
33
+ ```bash
34
+ npx banhaten add hover-card
35
+ ```
36
+
37
+ ## Examples
38
+
39
+ Primary registry example: `examples/hover-card-demo.tsx`.
40
+
41
+ Open the live component page or run `npx banhaten docs hover-card` to inspect source files, install command, and examples.
42
+
43
+ ## RTL Rules
44
+
45
+ - `inheritsDirection`: true
46
+ - `textDirection`: Content inherits direction and uses logical text alignment.
47
+
48
48
  <!-- registry-contract:start -->
49
49
  ## Registry Contract
50
50
 
@@ -1,48 +1,48 @@
1
- # Icons
2
-
3
- Icons is an expanded-tier explorer for reviewing open-source icon packs, semantic mappings, shortlist comparisons, and Iconify catalog options.
4
-
5
- ## API
6
-
7
- ```tsx
8
- <IconExplorer />
9
- ```
10
-
11
- | Feature | Notes |
12
- | --- | --- |
13
- | Icon pack review | compares candidate open-source packs |
14
- | Semantic mapping | maps product concepts to icon candidates |
15
- | Shortlist comparison | supports side-by-side review |
16
- | Iconify inspection | loads Iconify catalog data at runtime |
17
-
18
- ## Runtime
19
-
20
- The explorer may load `https://code.iconify.design/iconify-icon/3.0.0/iconify-icon.min.js` and query `https://api.iconify.design`.
21
-
22
- ## Token Contract
23
-
24
- The explorer uses expanded-tier CSS plus Banhaten surface, typography, border, spacing, focus, and content tokens. Product components should still use their local icon contracts instead of depending on this explorer.
25
-
26
- ## RTL
27
-
28
- Explorer layout should inherit page direction for navigation, labels, and comparison rows. Icon glyphs themselves should only mirror when they are directional.
29
-
30
- ## Accessibility
31
-
32
- Icon candidates must be reviewed for accessible usage. Decorative icons should be hidden with `aria-hidden`; actionable icon-only controls need clear accessible names.
33
-
34
- ## Install
35
-
36
- ```bash
37
- npx banhaten add icons
38
- ```
39
-
40
- ## Examples
41
-
42
- Primary registry example: `examples/expanded/icons-demo.tsx`.
43
-
44
- Open the live component page or run `npx banhaten docs icons` to inspect source files, install command, and examples.
45
-
46
- ## RTL Rules
47
-
48
- This component has no special RTL contract beyond inherited document direction and logical spacing.
1
+ # Icons
2
+
3
+ Icons is an expanded-tier explorer for reviewing open-source icon packs, semantic mappings, shortlist comparisons, and Iconify catalog options.
4
+
5
+ ## API
6
+
7
+ ```tsx
8
+ <IconExplorer />
9
+ ```
10
+
11
+ | Feature | Notes |
12
+ | --- | --- |
13
+ | Icon pack review | compares candidate open-source packs |
14
+ | Semantic mapping | maps product concepts to icon candidates |
15
+ | Shortlist comparison | supports side-by-side review |
16
+ | Iconify inspection | loads Iconify catalog data at runtime |
17
+
18
+ ## Runtime
19
+
20
+ The explorer may load `https://code.iconify.design/iconify-icon/3.0.0/iconify-icon.min.js` and query `https://api.iconify.design`.
21
+
22
+ ## Token Contract
23
+
24
+ The explorer uses expanded-tier CSS plus Banhaten surface, typography, border, spacing, focus, and content tokens. Product components should still use their local icon contracts instead of depending on this explorer.
25
+
26
+ ## RTL
27
+
28
+ Explorer layout should inherit page direction for navigation, labels, and comparison rows. Icon glyphs themselves should only mirror when they are directional.
29
+
30
+ ## Accessibility
31
+
32
+ Icon candidates must be reviewed for accessible usage. Decorative icons should be hidden with `aria-hidden`; actionable icon-only controls need clear accessible names.
33
+
34
+ ## Install
35
+
36
+ ```bash
37
+ npx banhaten add icons
38
+ ```
39
+
40
+ ## Examples
41
+
42
+ Primary registry example: `examples/expanded/icons-demo.tsx`.
43
+
44
+ Open the live component page or run `npx banhaten docs icons` to inspect source files, install command, and examples.
45
+
46
+ ## RTL Rules
47
+
48
+ This component has no special RTL contract beyond inherited document direction and logical spacing.