banhaten 0.2.0 → 0.4.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 (120) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/README.md +5 -5
  3. package/docs/design-system/component-implementation-ownership-audit.md +245 -0
  4. package/docs/design-system/component-quality-audit-2026-08-20.md +225 -0
  5. package/docs/design-system/component-showcase-consistency-report.md +2 -0
  6. package/docs/design-system/components/README.md +1 -0
  7. package/docs/design-system/components/activity-feed.md +2 -0
  8. package/docs/design-system/components/activity-heatmap.md +73 -0
  9. package/docs/design-system/components/alert-dialog.md +1 -1
  10. package/docs/design-system/components/alert.md +3 -3
  11. package/docs/design-system/components/attribute.md +1 -1
  12. package/docs/design-system/components/avatar.md +2 -2
  13. package/docs/design-system/components/badge.md +1 -1
  14. package/docs/design-system/components/banner.md +6 -2
  15. package/docs/design-system/components/breadcrumbs.md +5 -2
  16. package/docs/design-system/components/button-group.md +3 -2
  17. package/docs/design-system/components/button.md +2 -2
  18. package/docs/design-system/components/card.md +11 -3
  19. package/docs/design-system/components/catalog-components.md +3 -0
  20. package/docs/design-system/components/date-picker.md +3 -1
  21. package/docs/design-system/components/file-upload.md +5 -1
  22. package/docs/design-system/components/input.md +8 -6
  23. package/docs/design-system/components/item.md +3 -1
  24. package/docs/design-system/components/kbd.md +11 -8
  25. package/docs/design-system/components/menu.md +2 -2
  26. package/docs/design-system/components/modal.md +1 -1
  27. package/docs/design-system/components/navigation-menu.md +1 -1
  28. package/docs/design-system/components/onboarding-step-list-item.md +3 -2
  29. package/docs/design-system/components/page-header.md +3 -1
  30. package/docs/design-system/components/pagination.md +3 -2
  31. package/docs/design-system/components/radio-card.md +1 -1
  32. package/docs/design-system/components/resizable.md +1 -1
  33. package/docs/design-system/components/scroll-area.md +7 -3
  34. package/docs/design-system/components/select.md +1 -1
  35. package/docs/design-system/components/sidebar.md +60 -18
  36. package/docs/design-system/components/slideout.md +4 -1
  37. package/docs/design-system/components/steps.md +7 -2
  38. package/docs/design-system/components/table.md +25 -7
  39. package/docs/design-system/components/tag.md +3 -3
  40. package/docs/design-system/components/timeline.md +4 -1
  41. package/docs/design-system/components/toggle.md +1 -1
  42. package/docs/design-system/components/toolbar.md +1 -1
  43. package/docs/design-system/components/tooltip.md +1 -1
  44. package/docs/design-system/density-and-elevation.md +23 -2
  45. package/docs/design-system/gap-promotion-report.md +1 -67
  46. package/docs/design-system/icons.md +6 -1
  47. package/docs/design-system/installation.md +1 -1
  48. package/docs/design-system/launch-comparison-shadcn.md +10 -10
  49. package/docs/design-system/token-governance.md +7 -8
  50. package/package.json +3 -2
  51. package/registry/components/alert-dialog.tsx +1 -1
  52. package/registry/components/alert.tsx +17 -13
  53. package/registry/components/attribute.tsx +8 -2
  54. package/registry/components/avatar.tsx +28 -20
  55. package/registry/components/badge.tsx +17 -17
  56. package/registry/components/button-group.tsx +4 -2
  57. package/registry/components/button.tsx +3 -3
  58. package/registry/components/card.tsx +19 -3
  59. package/registry/components/carousel.tsx +14 -0
  60. package/registry/components/command.tsx +37 -3
  61. package/registry/components/date-picker.tsx +83 -35
  62. package/registry/components/expanded/ActivityFeed.tsx +3 -7
  63. package/registry/components/expanded/ActivityHeatmap.tsx +64 -0
  64. package/registry/components/expanded/Banner.tsx +0 -1
  65. package/registry/components/expanded/Breadcrumbs.tsx +3 -0
  66. package/registry/components/expanded/CatalogComponentsShowcase.tsx +3 -4
  67. package/registry/components/expanded/CatalogDivider.tsx +3 -2
  68. package/registry/components/expanded/FileUpload.tsx +7 -5
  69. package/registry/components/expanded/OnboardingStepListItem.tsx +6 -7
  70. package/registry/components/expanded/PageHeader.tsx +35 -44
  71. package/registry/components/expanded/Slideout.tsx +18 -13
  72. package/registry/components/expanded/Steps.tsx +147 -9
  73. package/registry/components/expanded/Table.tsx +50 -18
  74. package/registry/components/expanded/Timeline.tsx +11 -24
  75. package/registry/components/expanded/activityFeed.css +8 -8
  76. package/registry/components/expanded/activityHeatmap.css +66 -0
  77. package/registry/components/expanded/banner.css +30 -15
  78. package/registry/components/expanded/breadcrumbs.css +5 -5
  79. package/registry/components/expanded/fileUpload.css +4 -4
  80. package/registry/components/expanded/onboardingStepListItem.css +16 -7
  81. package/registry/components/expanded/pageHeader.css +14 -11
  82. package/registry/components/expanded/slideout.css +3 -7
  83. package/registry/components/expanded/steps.css +75 -12
  84. package/registry/components/expanded/table.css +63 -69
  85. package/registry/components/expanded/timeline.css +17 -16
  86. package/registry/components/field.tsx +61 -8
  87. package/registry/components/input.tsx +12 -5
  88. package/registry/components/item.tsx +1 -1
  89. package/registry/components/kbd.tsx +109 -15
  90. package/registry/components/menu.tsx +57 -7
  91. package/registry/components/modal.tsx +1 -1
  92. package/registry/components/navigation-menu.tsx +1 -1
  93. package/registry/components/pagination.css +36 -0
  94. package/registry/components/pagination.tsx +20 -13
  95. package/registry/components/progress-slider.tsx +1 -1
  96. package/registry/components/radio-card.tsx +1 -2
  97. package/registry/components/resizable.tsx +36 -2
  98. package/registry/components/scroll-area.tsx +30 -6
  99. package/registry/components/select.tsx +35 -12
  100. package/registry/components/sidebar.tsx +940 -62
  101. package/registry/components/social-button.tsx +12 -5
  102. package/registry/components/table-elements.tsx +128 -0
  103. package/registry/components/tabs.tsx +5 -10
  104. package/registry/components/tag.tsx +2 -2
  105. package/registry/components/toggle.tsx +2 -2
  106. package/registry/components/toolbar.tsx +6 -6
  107. package/registry/components/tooltip.tsx +1 -1
  108. package/registry/examples/attribute-demo.tsx +1 -1
  109. package/registry/examples/avatar-demo.tsx +7 -4
  110. package/registry/examples/command-palette-demo.tsx +0 -1
  111. package/registry/examples/expanded/activity-heatmap-demo.tsx +29 -0
  112. package/registry/examples/expanded/breadcrumbs-demo.tsx +3 -3
  113. package/registry/examples/kbd-demo.tsx +2 -1
  114. package/registry/examples/pagination-demo.tsx +5 -5
  115. package/registry/examples/sidebar-demo.tsx +59 -13
  116. package/registry/guidance/USAGE.md +1 -1
  117. package/registry/index.json +621 -60
  118. package/registry/styles/globals.css +211 -151
  119. package/registry.json +44 -6
  120. package/tokens/banhaten.tokens.json +325 -95
@@ -224,6 +224,9 @@ const Select = React.forwardRef<HTMLDivElement, SelectProps>(function Select({
224
224
  const shouldRenderMenu = React.Children.count(children) > 0
225
225
  const selectId = triggerId || generatedId
226
226
  const helperId = `${selectId}-helper`
227
+ const triggerAccessibleLabel = shouldRenderLabel
228
+ ? undefined
229
+ : getAccessibleText(selectedValue) ?? getAccessibleText(selectedPlaceholder)
227
230
  const rootOpenProps =
228
231
  open === undefined ? { onOpenChange } : { open, onOpenChange }
229
232
 
@@ -261,8 +264,8 @@ const Select = React.forwardRef<HTMLDivElement, SelectProps>(function Select({
261
264
  <div data-slot="select-control" className="relative w-full">
262
265
  <SelectPrimitive.Trigger asChild>
263
266
  <SelectTrigger
267
+ aria-label={triggerAccessibleLabel}
264
268
  aria-describedby={shouldRenderHelperText ? helperId : undefined}
265
- aria-expanded={open || undefined}
266
269
  aria-haspopup="listbox"
267
270
  aria-invalid={isError || undefined}
268
271
  expandIcon={expandIcon}
@@ -436,6 +439,12 @@ function hasRenderableContent(content: React.ReactNode) {
436
439
  )
437
440
  }
438
441
 
442
+ function getAccessibleText(content: React.ReactNode) {
443
+ return typeof content === "string" || typeof content === "number"
444
+ ? String(content)
445
+ : undefined
446
+ }
447
+
439
448
  type SelectHelperTextProps = React.ComponentProps<"p"> & {
440
449
  hasIcon?: boolean
441
450
  type?: "default" | "error"
@@ -592,7 +601,14 @@ SelectTrigger.displayName = "SelectTrigger"
592
601
  type SelectMenuProps = React.ComponentProps<"div">
593
602
 
594
603
  const SelectMenu = React.forwardRef<HTMLDivElement, SelectMenuProps>(function SelectMenu(
595
- { children, className, onKeyDown, role, ...props },
604
+ {
605
+ "aria-label": ariaLabel = "Options",
606
+ children,
607
+ className,
608
+ onKeyDown,
609
+ role,
610
+ ...props
611
+ },
596
612
  ref
597
613
  ) {
598
614
  const handleKeyDown = React.useCallback(
@@ -638,6 +654,7 @@ const SelectMenu = React.forwardRef<HTMLDivElement, SelectMenuProps>(function Se
638
654
 
639
655
  return (
640
656
  <div
657
+ aria-label={ariaLabel}
641
658
  data-slot="select-menu"
642
659
  onKeyDown={handleKeyDown}
643
660
  ref={ref}
@@ -645,7 +662,11 @@ const SelectMenu = React.forwardRef<HTMLDivElement, SelectMenuProps>(function Se
645
662
  className={cn(selectMenu(), className)}
646
663
  {...props}
647
664
  >
648
- <div data-slot="select-menu-list" className={selectMenuList()}>
665
+ <div
666
+ data-slot="select-menu-list"
667
+ role="presentation"
668
+ className={selectMenuList()}
669
+ >
649
670
  {children}
650
671
  </div>
651
672
  </div>
@@ -689,6 +710,8 @@ type SelectMenuItemProps = SelectMenuItemBaseProps &
689
710
 
690
711
  const SelectMenuItem = React.forwardRef<HTMLButtonElement, SelectMenuItemProps>(function SelectMenuItem({
691
712
  addonText,
713
+ "aria-checked": ariaChecked,
714
+ "aria-selected": ariaSelected,
692
715
  children,
693
716
  className,
694
717
  disabled,
@@ -706,8 +729,12 @@ const SelectMenuItem = React.forwardRef<HTMLButtonElement, SelectMenuItemProps>(
706
729
  const generatedValue = React.useId()
707
730
  const isDisabled = disabled
708
731
  const selectedWithEndCheck = selected && selectionType === "default"
709
- const resolvedRole =
710
- role || (selectionType === "checkbox" ? "menuitemcheckbox" : "option")
732
+ const resolvedRole = role || "option"
733
+ const usesCheckedState =
734
+ resolvedRole === "checkbox" ||
735
+ resolvedRole === "menuitemcheckbox" ||
736
+ resolvedRole === "radio" ||
737
+ resolvedRole === "menuitemradio"
711
738
  const selectedMedia =
712
739
  media === false ? null : media ?? getDefaultSelectItemMedia(itemType)
713
740
  const content = label ?? children
@@ -723,13 +750,9 @@ const SelectMenuItem = React.forwardRef<HTMLButtonElement, SelectMenuItemProps>(
723
750
 
724
751
  const item = (
725
752
  <button
726
- aria-checked={
727
- selectionType === "checkbox" ? Boolean(selected) : undefined
728
- }
753
+ aria-checked={usesCheckedState ? (ariaChecked ?? Boolean(selected)) : undefined}
729
754
  aria-disabled={isDisabled || undefined}
730
- aria-selected={
731
- selectionType === "default" ? Boolean(selected) : undefined
732
- }
755
+ aria-selected={resolvedRole === "option" ? (ariaSelected ?? Boolean(selected)) : undefined}
733
756
  data-disabled={isDisabled ? "true" : undefined}
734
757
  data-item-type={itemType}
735
758
  data-selected={selected ? "true" : "false"}
@@ -760,7 +783,7 @@ const SelectMenuItem = React.forwardRef<HTMLButtonElement, SelectMenuItemProps>(
760
783
  {selectedMedia ? (
761
784
  <span
762
785
  data-slot="select-menu-item-media"
763
- className="flex shrink-0 items-center ps-[var(--bh-select-media-inset)] text-[var(--bh-content-subtle)] group-data-[disabled=true]/select-menu-item:text-[var(--bh-content-disabled)] group-data-[disabled=true]/select-menu-item:opacity-[var(--bh-opacity-60)] [&_svg:not([class*='size-'])]:size-[var(--bh-select-icon-slot-size)]"
786
+ className="flex shrink-0 items-center ps-[var(--bh-select-media-inset)] text-[var(--bh-content-subtle)] group-data-[disabled=true]/select-menu-item:text-[var(--bh-content-disabled)] group-data-[disabled=true]/select-menu-item:opacity-[var(--bh-opacity-60)] [&_svg:not([class*='size-'])]:size-[var(--bh-icon-size-default)]"
764
787
  >
765
788
  {selectedMedia}
766
789
  </span>