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.
- package/CHANGELOG.md +55 -0
- package/README.md +5 -5
- package/docs/design-system/component-implementation-ownership-audit.md +245 -0
- package/docs/design-system/component-quality-audit-2026-08-20.md +225 -0
- package/docs/design-system/component-showcase-consistency-report.md +2 -0
- package/docs/design-system/components/README.md +1 -0
- package/docs/design-system/components/activity-feed.md +2 -0
- package/docs/design-system/components/activity-heatmap.md +73 -0
- package/docs/design-system/components/alert-dialog.md +1 -1
- package/docs/design-system/components/alert.md +3 -3
- package/docs/design-system/components/attribute.md +1 -1
- package/docs/design-system/components/avatar.md +2 -2
- package/docs/design-system/components/badge.md +1 -1
- package/docs/design-system/components/banner.md +6 -2
- package/docs/design-system/components/breadcrumbs.md +5 -2
- package/docs/design-system/components/button-group.md +3 -2
- package/docs/design-system/components/button.md +2 -2
- package/docs/design-system/components/card.md +11 -3
- package/docs/design-system/components/catalog-components.md +3 -0
- package/docs/design-system/components/date-picker.md +3 -1
- package/docs/design-system/components/file-upload.md +5 -1
- package/docs/design-system/components/input.md +8 -6
- package/docs/design-system/components/item.md +3 -1
- package/docs/design-system/components/kbd.md +11 -8
- package/docs/design-system/components/menu.md +2 -2
- package/docs/design-system/components/modal.md +1 -1
- package/docs/design-system/components/navigation-menu.md +1 -1
- package/docs/design-system/components/onboarding-step-list-item.md +3 -2
- package/docs/design-system/components/page-header.md +3 -1
- package/docs/design-system/components/pagination.md +3 -2
- package/docs/design-system/components/radio-card.md +1 -1
- package/docs/design-system/components/resizable.md +1 -1
- package/docs/design-system/components/scroll-area.md +7 -3
- package/docs/design-system/components/select.md +1 -1
- package/docs/design-system/components/sidebar.md +60 -18
- package/docs/design-system/components/slideout.md +4 -1
- package/docs/design-system/components/steps.md +7 -2
- package/docs/design-system/components/table.md +25 -7
- package/docs/design-system/components/tag.md +3 -3
- package/docs/design-system/components/timeline.md +4 -1
- package/docs/design-system/components/toggle.md +1 -1
- package/docs/design-system/components/toolbar.md +1 -1
- package/docs/design-system/components/tooltip.md +1 -1
- package/docs/design-system/density-and-elevation.md +23 -2
- package/docs/design-system/gap-promotion-report.md +1 -67
- package/docs/design-system/icons.md +6 -1
- package/docs/design-system/installation.md +1 -1
- package/docs/design-system/launch-comparison-shadcn.md +10 -10
- package/docs/design-system/token-governance.md +7 -8
- package/package.json +3 -2
- package/registry/components/alert-dialog.tsx +1 -1
- package/registry/components/alert.tsx +17 -13
- package/registry/components/attribute.tsx +8 -2
- package/registry/components/avatar.tsx +28 -20
- package/registry/components/badge.tsx +17 -17
- package/registry/components/button-group.tsx +4 -2
- package/registry/components/button.tsx +3 -3
- package/registry/components/card.tsx +19 -3
- package/registry/components/carousel.tsx +14 -0
- package/registry/components/command.tsx +37 -3
- package/registry/components/date-picker.tsx +83 -35
- package/registry/components/expanded/ActivityFeed.tsx +3 -7
- package/registry/components/expanded/ActivityHeatmap.tsx +64 -0
- package/registry/components/expanded/Banner.tsx +0 -1
- package/registry/components/expanded/Breadcrumbs.tsx +3 -0
- package/registry/components/expanded/CatalogComponentsShowcase.tsx +3 -4
- package/registry/components/expanded/CatalogDivider.tsx +3 -2
- package/registry/components/expanded/FileUpload.tsx +7 -5
- package/registry/components/expanded/OnboardingStepListItem.tsx +6 -7
- package/registry/components/expanded/PageHeader.tsx +35 -44
- package/registry/components/expanded/Slideout.tsx +18 -13
- package/registry/components/expanded/Steps.tsx +147 -9
- package/registry/components/expanded/Table.tsx +50 -18
- package/registry/components/expanded/Timeline.tsx +11 -24
- package/registry/components/expanded/activityFeed.css +8 -8
- package/registry/components/expanded/activityHeatmap.css +66 -0
- package/registry/components/expanded/banner.css +30 -15
- package/registry/components/expanded/breadcrumbs.css +5 -5
- package/registry/components/expanded/fileUpload.css +4 -4
- package/registry/components/expanded/onboardingStepListItem.css +16 -7
- package/registry/components/expanded/pageHeader.css +14 -11
- package/registry/components/expanded/slideout.css +3 -7
- package/registry/components/expanded/steps.css +75 -12
- package/registry/components/expanded/table.css +63 -69
- package/registry/components/expanded/timeline.css +17 -16
- package/registry/components/field.tsx +61 -8
- package/registry/components/input.tsx +12 -5
- package/registry/components/item.tsx +1 -1
- package/registry/components/kbd.tsx +109 -15
- package/registry/components/menu.tsx +57 -7
- package/registry/components/modal.tsx +1 -1
- package/registry/components/navigation-menu.tsx +1 -1
- package/registry/components/pagination.css +36 -0
- package/registry/components/pagination.tsx +20 -13
- package/registry/components/progress-slider.tsx +1 -1
- package/registry/components/radio-card.tsx +1 -2
- package/registry/components/resizable.tsx +36 -2
- package/registry/components/scroll-area.tsx +30 -6
- package/registry/components/select.tsx +35 -12
- package/registry/components/sidebar.tsx +940 -62
- package/registry/components/social-button.tsx +12 -5
- package/registry/components/table-elements.tsx +128 -0
- package/registry/components/tabs.tsx +5 -10
- package/registry/components/tag.tsx +2 -2
- package/registry/components/toggle.tsx +2 -2
- package/registry/components/toolbar.tsx +6 -6
- package/registry/components/tooltip.tsx +1 -1
- package/registry/examples/attribute-demo.tsx +1 -1
- package/registry/examples/avatar-demo.tsx +7 -4
- package/registry/examples/command-palette-demo.tsx +0 -1
- package/registry/examples/expanded/activity-heatmap-demo.tsx +29 -0
- package/registry/examples/expanded/breadcrumbs-demo.tsx +3 -3
- package/registry/examples/kbd-demo.tsx +2 -1
- package/registry/examples/pagination-demo.tsx +5 -5
- package/registry/examples/sidebar-demo.tsx +59 -13
- package/registry/guidance/USAGE.md +1 -1
- package/registry/index.json +621 -60
- package/registry/styles/globals.css +211 -151
- package/registry.json +44 -6
- 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
|
-
{
|
|
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
|
|
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
|
-
|
|
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-
|
|
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>
|