banhaten 0.2.0 → 0.3.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 +28 -0
- package/README.md +1 -1
- package/docs/design-system/component-implementation-ownership-audit.md +244 -0
- package/docs/design-system/component-quality-audit-2026-08-20.md +223 -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 +2 -2
- package/docs/design-system/components/avatar.md +1 -1
- package/docs/design-system/components/badge.md +1 -1
- package/docs/design-system/components/banner.md +5 -1
- package/docs/design-system/components/breadcrumbs.md +3 -0
- package/docs/design-system/components/button-group.md +1 -0
- package/docs/design-system/components/button.md +1 -1
- 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 +1 -1
- package/docs/design-system/components/file-upload.md +4 -0
- 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 +1 -0
- package/docs/design-system/components/page-header.md +3 -1
- package/docs/design-system/components/pagination.md +1 -0
- package/docs/design-system/components/resizable.md +1 -1
- package/docs/design-system/components/scroll-area.md +7 -3
- package/docs/design-system/components/sidebar.md +3 -1
- 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 +1 -1
- 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 +18 -1
- package/docs/design-system/gap-promotion-report.md +1 -67
- package/docs/design-system/launch-comparison-shadcn.md +10 -10
- package/package.json +3 -2
- package/registry/components/alert-dialog.tsx +1 -1
- package/registry/components/alert.tsx +15 -11
- package/registry/components/avatar.tsx +7 -3
- package/registry/components/badge.tsx +17 -17
- package/registry/components/button-group.tsx +3 -1
- package/registry/components/button.tsx +2 -2
- 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 +67 -31
- 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 +0 -2
- 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 +21 -11
- package/registry/components/expanded/breadcrumbs.css +1 -1
- package/registry/components/expanded/fileUpload.css +1 -1
- package/registry/components/expanded/onboardingStepListItem.css +2 -2
- 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 +58 -67
- package/registry/components/expanded/timeline.css +17 -16
- package/registry/components/field.tsx +61 -8
- package/registry/components/menu.tsx +56 -6
- 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 +8 -6
- package/registry/components/progress-slider.tsx +1 -1
- package/registry/components/resizable.tsx +36 -2
- package/registry/components/scroll-area.tsx +30 -6
- package/registry/components/select.tsx +34 -11
- package/registry/components/sidebar.tsx +11 -5
- 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 +1 -1
- package/registry/components/toggle.tsx +2 -2
- package/registry/components/toolbar.tsx +5 -5
- package/registry/components/tooltip.tsx +1 -1
- package/registry/examples/avatar-demo.tsx +7 -4
- package/registry/examples/expanded/activity-heatmap-demo.tsx +29 -0
- package/registry/examples/expanded/breadcrumbs-demo.tsx +3 -3
- package/registry/examples/pagination-demo.tsx +5 -5
- package/registry/examples/sidebar-demo.tsx +4 -2
- package/registry/index.json +392 -33
- package/registry/styles/globals.css +68 -42
- package/registry.json +40 -3
- package/tokens/banhaten.tokens.json +165 -55
|
@@ -116,7 +116,7 @@ const arabicSocialButtonMessages: SocialButtonMessages = {
|
|
|
116
116
|
}
|
|
117
117
|
|
|
118
118
|
const socialButtonVariants = cva(
|
|
119
|
-
"group/social-button relative inline-flex items-center justify-center whitespace-nowrap rounded-[var(--bh-social-button-radius)] bg-[var(--bh-social-button-bg)] text-[var(--bh-social-button-fg)] shadow-[var(--shadow-social-button)] outline-none transition-[background-color,box-shadow,color] [--bh-social-button-current-border:var(--bh-social-button-border)] [--shadow-social-button:inset_0px_0px_0px_var(--bh-border-width-default)_var(--bh-social-button-current-border,var(--bh-social-button-border,transparent)),var(--shadow-component-default)]
|
|
119
|
+
"group/social-button relative inline-flex max-w-full min-w-0 items-center justify-center whitespace-nowrap rounded-[var(--bh-social-button-radius)] bg-[var(--bh-social-button-bg)] text-[var(--bh-social-button-fg)] shadow-[var(--shadow-social-button)] outline-none transition-[background-color,box-shadow,color] [--bh-social-button-current-border:var(--bh-social-button-border)] [--shadow-social-button:inset_0px_0px_0px_var(--bh-border-width-default)_var(--bh-social-button-current-border,var(--bh-social-button-border,transparent)),var(--shadow-component-default)] hover:bg-[var(--bh-social-button-bg-hover)] focus-visible:[--bh-social-button-current-border:var(--bh-social-button-focus-border)] focus-visible:shadow-[var(--shadow-social-button-focus)] disabled:pointer-events-none disabled:opacity-[var(--bh-opacity-50)] [&_svg]:pointer-events-none [&_svg]:shrink-0",
|
|
120
120
|
{
|
|
121
121
|
variants: {
|
|
122
122
|
variant: {
|
|
@@ -184,7 +184,12 @@ const SocialButton = React.forwardRef<HTMLButtonElement, SocialButtonProps>(func
|
|
|
184
184
|
? String(visibleLabel)
|
|
185
185
|
: defaultLabel
|
|
186
186
|
const Comp = asChild ? Slot : "button"
|
|
187
|
-
const cssVars = getSocialButtonVars(
|
|
187
|
+
const cssVars = getSocialButtonVars(
|
|
188
|
+
config,
|
|
189
|
+
selectedVariant,
|
|
190
|
+
isIcon,
|
|
191
|
+
resolvedDirection
|
|
192
|
+
)
|
|
188
193
|
const content = (
|
|
189
194
|
<>
|
|
190
195
|
<SocialButtonIcon platform={platform} />
|
|
@@ -192,7 +197,8 @@ const SocialButton = React.forwardRef<HTMLButtonElement, SocialButtonProps>(func
|
|
|
192
197
|
<span
|
|
193
198
|
data-slot="social-button-label"
|
|
194
199
|
dir="auto"
|
|
195
|
-
|
|
200
|
+
title={typeof visibleLabel === "string" ? visibleLabel : undefined}
|
|
201
|
+
className="min-w-0 overflow-hidden text-ellipsis pe-[var(--bh-social-button-label-padding-inline-end)]"
|
|
196
202
|
>
|
|
197
203
|
{visibleLabel}
|
|
198
204
|
</span>
|
|
@@ -238,7 +244,8 @@ function isSimpleLabel(
|
|
|
238
244
|
function getSocialButtonVars(
|
|
239
245
|
config: SocialPlatformConfig,
|
|
240
246
|
variant: SocialButtonVariant,
|
|
241
|
-
isIcon: boolean
|
|
247
|
+
isIcon: boolean,
|
|
248
|
+
direction: "ltr" | "rtl"
|
|
242
249
|
) {
|
|
243
250
|
const isSolid = variant === "solid"
|
|
244
251
|
const border = isSolid
|
|
@@ -262,7 +269,7 @@ function getSocialButtonVars(
|
|
|
262
269
|
"--bh-social-button-icon": isSolid ? config.solidIcon : config.outlineIcon,
|
|
263
270
|
"--bh-social-button-width": isIcon
|
|
264
271
|
? "var(--bh-social-button-height)"
|
|
265
|
-
: config.width
|
|
272
|
+
: config.width[direction],
|
|
266
273
|
"--bh-social-button-width-rtl": isIcon
|
|
267
274
|
? "var(--bh-social-button-height)"
|
|
268
275
|
: config.width.rtl,
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use client"
|
|
2
|
+
|
|
3
|
+
import * as React from "react"
|
|
4
|
+
|
|
5
|
+
import { cn } from "@/lib/utils"
|
|
6
|
+
|
|
7
|
+
type TableRootProps = React.ComponentPropsWithoutRef<"table">
|
|
8
|
+
type TableSectionProps = React.ComponentPropsWithoutRef<"thead">
|
|
9
|
+
type TableBodyProps = React.ComponentPropsWithoutRef<"tbody">
|
|
10
|
+
type TableRowElementProps = React.ComponentPropsWithoutRef<"tr">
|
|
11
|
+
type TableHeadProps = React.ComponentPropsWithoutRef<"th">
|
|
12
|
+
type TableCellProps = React.ComponentPropsWithoutRef<"td">
|
|
13
|
+
type DataTableSurfaceProps = React.ComponentPropsWithoutRef<"div">
|
|
14
|
+
|
|
15
|
+
const DataTableSurface = React.forwardRef<
|
|
16
|
+
HTMLDivElement,
|
|
17
|
+
DataTableSurfaceProps
|
|
18
|
+
>(function DataTableSurface({ className, role = "table", ...props }, ref) {
|
|
19
|
+
return (
|
|
20
|
+
<div
|
|
21
|
+
data-slot="data-table-surface"
|
|
22
|
+
ref={ref}
|
|
23
|
+
role={role}
|
|
24
|
+
className={cn("min-w-0", className)}
|
|
25
|
+
{...props}
|
|
26
|
+
/>
|
|
27
|
+
)
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
const TableRoot = React.forwardRef<HTMLTableElement, TableRootProps>(
|
|
31
|
+
function TableRoot({ className, ...props }, ref) {
|
|
32
|
+
return (
|
|
33
|
+
<table
|
|
34
|
+
data-slot="table-root"
|
|
35
|
+
ref={ref}
|
|
36
|
+
className={cn("w-full border-collapse text-start", className)}
|
|
37
|
+
{...props}
|
|
38
|
+
/>
|
|
39
|
+
)
|
|
40
|
+
}
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
const TableHeader = React.forwardRef<
|
|
44
|
+
HTMLTableSectionElement,
|
|
45
|
+
TableSectionProps
|
|
46
|
+
>(function TableHeader({ className, ...props }, ref) {
|
|
47
|
+
return (
|
|
48
|
+
<thead
|
|
49
|
+
data-slot="table-header"
|
|
50
|
+
ref={ref}
|
|
51
|
+
className={cn("text-start", className)}
|
|
52
|
+
{...props}
|
|
53
|
+
/>
|
|
54
|
+
)
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
const TableBody = React.forwardRef<HTMLTableSectionElement, TableBodyProps>(
|
|
58
|
+
function TableBody({ className, ...props }, ref) {
|
|
59
|
+
return (
|
|
60
|
+
<tbody
|
|
61
|
+
data-slot="table-body"
|
|
62
|
+
ref={ref}
|
|
63
|
+
className={className}
|
|
64
|
+
{...props}
|
|
65
|
+
/>
|
|
66
|
+
)
|
|
67
|
+
}
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
const TableRowElement = React.forwardRef<
|
|
71
|
+
HTMLTableRowElement,
|
|
72
|
+
TableRowElementProps
|
|
73
|
+
>(function TableRowElement({ className, ...props }, ref) {
|
|
74
|
+
return (
|
|
75
|
+
<tr
|
|
76
|
+
data-slot="table-row"
|
|
77
|
+
ref={ref}
|
|
78
|
+
className={className}
|
|
79
|
+
{...props}
|
|
80
|
+
/>
|
|
81
|
+
)
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
const TableHead = React.forwardRef<HTMLTableCellElement, TableHeadProps>(
|
|
85
|
+
function TableHead({ className, scope = "col", ...props }, ref) {
|
|
86
|
+
return (
|
|
87
|
+
<th
|
|
88
|
+
data-slot="table-head"
|
|
89
|
+
ref={ref}
|
|
90
|
+
className={cn("text-start", className)}
|
|
91
|
+
scope={scope}
|
|
92
|
+
{...props}
|
|
93
|
+
/>
|
|
94
|
+
)
|
|
95
|
+
}
|
|
96
|
+
)
|
|
97
|
+
|
|
98
|
+
const TableCell = React.forwardRef<HTMLTableCellElement, TableCellProps>(
|
|
99
|
+
function TableCell({ className, ...props }, ref) {
|
|
100
|
+
return (
|
|
101
|
+
<td
|
|
102
|
+
data-slot="table-cell"
|
|
103
|
+
ref={ref}
|
|
104
|
+
className={className}
|
|
105
|
+
{...props}
|
|
106
|
+
/>
|
|
107
|
+
)
|
|
108
|
+
}
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
export {
|
|
112
|
+
DataTableSurface,
|
|
113
|
+
TableBody,
|
|
114
|
+
TableCell,
|
|
115
|
+
TableHead,
|
|
116
|
+
TableHeader,
|
|
117
|
+
TableRoot,
|
|
118
|
+
TableRowElement,
|
|
119
|
+
}
|
|
120
|
+
export type {
|
|
121
|
+
DataTableSurfaceProps,
|
|
122
|
+
TableBodyProps,
|
|
123
|
+
TableCellProps,
|
|
124
|
+
TableHeadProps,
|
|
125
|
+
TableRootProps,
|
|
126
|
+
TableRowElementProps,
|
|
127
|
+
TableSectionProps,
|
|
128
|
+
}
|
|
@@ -154,7 +154,6 @@ function Tabs({
|
|
|
154
154
|
defaultValue ??
|
|
155
155
|
normalizedItems[defaultActiveIndex]?.value ??
|
|
156
156
|
normalizedItems[0]?.value
|
|
157
|
-
const hasPanels = normalizedItems.some((item) => item.content !== undefined)
|
|
158
157
|
|
|
159
158
|
function handleValueChange(nextValue: string) {
|
|
160
159
|
onValueChange?.(nextValue)
|
|
@@ -194,15 +193,11 @@ function Tabs({
|
|
|
194
193
|
</TabsTrigger>
|
|
195
194
|
))}
|
|
196
195
|
</TabsList>
|
|
197
|
-
{
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
</TabsContent>
|
|
203
|
-
)
|
|
204
|
-
)
|
|
205
|
-
: null}
|
|
196
|
+
{normalizedItems.map((item) => (
|
|
197
|
+
<TabsContent key={`${item.value}-panel`} value={item.value}>
|
|
198
|
+
{item.content ?? null}
|
|
199
|
+
</TabsContent>
|
|
200
|
+
))}
|
|
206
201
|
{children}
|
|
207
202
|
</TabsRoot>
|
|
208
203
|
)
|
|
@@ -348,7 +348,7 @@ function TagAvatar({
|
|
|
348
348
|
<span
|
|
349
349
|
data-slot="tag-avatar"
|
|
350
350
|
className={cn(
|
|
351
|
-
"flex size-[var(--bh-space-4xl-20)] shrink-0 items-center justify-center overflow-hidden rounded-[var(--bh-radius-full)] border border-[var(--bh-border-subtle)] bg-[var(--bh-bg-neutral-
|
|
351
|
+
"flex size-[var(--bh-space-4xl-20)] shrink-0 items-center justify-center overflow-hidden rounded-[var(--bh-radius-full)] border border-[var(--bh-border-subtle)] bg-[var(--bh-bg-neutral-bold)] text-[length:var(--bh-text-body-3xs-semibold-font-size)] font-[var(--bh-text-body-3xs-semibold-font-weight)] leading-[var(--bh-text-body-3xs-semibold-line-height)] text-[var(--bh-content-on-neutral)]",
|
|
352
352
|
className
|
|
353
353
|
)}
|
|
354
354
|
{...props}
|
|
@@ -78,7 +78,7 @@ const Toggle = React.forwardRef<
|
|
|
78
78
|
>
|
|
79
79
|
<SwitchPrimitive.Thumb
|
|
80
80
|
data-slot="toggle-thumb"
|
|
81
|
-
className="pointer-events-none flex size-[var(--bh-toggle-handle-size)] translate-x-0 items-center justify-center rounded-[var(--bh-radius-full)] bg-[var(--bh-interactive-switch-handle)] text-[var(--bh-content-on-light)] shadow-[var(--shadow-
|
|
81
|
+
className="pointer-events-none flex size-[var(--bh-toggle-handle-size)] translate-x-0 items-center justify-center rounded-[var(--bh-radius-full)] bg-[var(--bh-interactive-switch-handle)] text-[var(--bh-content-on-light)] shadow-[var(--shadow-md)] transition-[background-color,transform] group-data-[disabled]/toggle:bg-[var(--bh-interactive-switch-handle-disabled)] group-data-[state=checked]/toggle:translate-x-[var(--bh-toggle-offset)] rtl:group-data-[state=checked]/toggle:-translate-x-[var(--bh-toggle-offset)]"
|
|
82
82
|
>
|
|
83
83
|
{showIcon ? (
|
|
84
84
|
<span
|
|
@@ -190,7 +190,7 @@ const ToggleField = React.forwardRef<HTMLDivElement, ToggleFieldProps>(
|
|
|
190
190
|
data-slot="toggle-field-description"
|
|
191
191
|
dir="auto"
|
|
192
192
|
id={descriptionId}
|
|
193
|
-
className="w-full min-w-0 break-words text-[length:var(--bh-text-body-xs-regular-font-size)] font-[var(--bh-text-body-xs-regular-font-weight)] leading-[var(--bh-text-body-xs-regular-line-height)] tracking-[var(--bh-text-body-xs-regular-letter-spacing)] text-[var(--bh-content-subtle)]
|
|
193
|
+
className="w-full min-w-0 break-words text-[length:var(--bh-text-body-xs-regular-font-size)] font-[var(--bh-text-body-xs-regular-font-weight)] leading-[var(--bh-text-body-xs-regular-line-height)] tracking-[var(--bh-text-body-xs-regular-letter-spacing)] text-[var(--bh-content-subtle)]"
|
|
194
194
|
>
|
|
195
195
|
{description}
|
|
196
196
|
</span>
|
|
@@ -39,7 +39,7 @@ const toolbarVariants = cva(
|
|
|
39
39
|
)
|
|
40
40
|
|
|
41
41
|
const toolbarSectionVariants = cva(
|
|
42
|
-
"flex min-w-0 items-center gap-[var(--bh-space-xl-12)]",
|
|
42
|
+
"flex max-w-full min-w-0 items-center gap-[var(--bh-space-xl-12)]",
|
|
43
43
|
{
|
|
44
44
|
variants: {
|
|
45
45
|
align: {
|
|
@@ -49,8 +49,8 @@ const toolbarSectionVariants = cva(
|
|
|
49
49
|
between: "justify-between",
|
|
50
50
|
},
|
|
51
51
|
grow: {
|
|
52
|
-
true: "flex-
|
|
53
|
-
false: "
|
|
52
|
+
true: "flex-[1_1_var(--bh-space-19xl-384)]",
|
|
53
|
+
false: "flex-[0_1_auto]",
|
|
54
54
|
},
|
|
55
55
|
stack: {
|
|
56
56
|
true: "flex-col items-stretch",
|
|
@@ -58,14 +58,14 @@ const toolbarSectionVariants = cva(
|
|
|
58
58
|
},
|
|
59
59
|
wrap: {
|
|
60
60
|
true: "flex-wrap",
|
|
61
|
-
false: "",
|
|
61
|
+
false: "overflow-x-auto",
|
|
62
62
|
},
|
|
63
63
|
},
|
|
64
64
|
defaultVariants: {
|
|
65
65
|
align: "start",
|
|
66
66
|
grow: false,
|
|
67
67
|
stack: false,
|
|
68
|
-
wrap:
|
|
68
|
+
wrap: true,
|
|
69
69
|
},
|
|
70
70
|
}
|
|
71
71
|
)
|
|
@@ -38,7 +38,7 @@ const tooltipContentVariants = cva(
|
|
|
38
38
|
dark:
|
|
39
39
|
"[--bh-tooltip-bg:var(--bh-bg-always-dark)] [--bh-tooltip-border:transparent] [--bh-tooltip-close-fg:var(--bh-content-on-color)] [--bh-tooltip-fg:var(--bh-content-on-color)] [--bh-tooltip-shadow:none] [--bh-tooltip-shortcut-bg:var(--bh-bg-neutral-soft)] [--bh-tooltip-shortcut-border:var(--bh-border-inverse-subtle)]",
|
|
40
40
|
default:
|
|
41
|
-
"[--bh-tooltip-bg:var(--bh-bg-raised)] [--bh-tooltip-border:var(--bh-border-subtle)] [--bh-tooltip-close-fg:var(--bh-content-subtle)] [--bh-tooltip-fg:var(--bh-content-default)] [--bh-tooltip-shadow:inset_0px_0px_0px_var(--bh-border-width-default)_var(--bh-tooltip-border),var(--shadow-
|
|
41
|
+
"[--bh-tooltip-bg:var(--bh-bg-raised)] [--bh-tooltip-border:var(--bh-border-subtle)] [--bh-tooltip-close-fg:var(--bh-content-subtle)] [--bh-tooltip-fg:var(--bh-content-default)] [--bh-tooltip-shadow:inset_0px_0px_0px_var(--bh-border-width-default)_var(--bh-tooltip-border),var(--shadow-lg)] [--bh-tooltip-shortcut-bg:var(--bh-bg-neutral-subtle)] [--bh-tooltip-shortcut-border:var(--bh-border-subtle)]",
|
|
42
42
|
},
|
|
43
43
|
size: {
|
|
44
44
|
sm:
|
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
AvatarImage,
|
|
9
9
|
AvatarStatus,
|
|
10
10
|
} from "@/components/ui/avatar"
|
|
11
|
+
import { Button } from "@/components/ui/button"
|
|
11
12
|
import { PlusIcon } from "lucide-react"
|
|
12
13
|
|
|
13
14
|
const avatarUrl = new URL("../assets/avatars/avatar-01.jpg", import.meta.url).href
|
|
@@ -84,13 +85,15 @@ export function AvatarDemo() {
|
|
|
84
85
|
))}
|
|
85
86
|
<AvatarGroupCount size="md">+10</AvatarGroupCount>
|
|
86
87
|
</AvatarGroup>
|
|
87
|
-
<
|
|
88
|
+
<Button
|
|
88
89
|
aria-label="Add member"
|
|
89
|
-
className="
|
|
90
|
-
size="
|
|
90
|
+
className="size-[var(--bh-avatar-size-md)] rounded-[var(--bh-radius-full)] border-dashed"
|
|
91
|
+
size="icon-sm"
|
|
92
|
+
type="button"
|
|
93
|
+
variant="outline"
|
|
91
94
|
>
|
|
92
95
|
<PlusIcon aria-hidden="true" className="size-[var(--bh-space-3xl-16)]" />
|
|
93
|
-
</
|
|
96
|
+
</Button>
|
|
94
97
|
</div>
|
|
95
98
|
|
|
96
99
|
<div className="flex items-center gap-[var(--bh-space-xl-12)]">
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ActivityHeatmap,
|
|
3
|
+
type ActivityHeatmapItem,
|
|
4
|
+
type ActivityHeatmapLevel,
|
|
5
|
+
} from "@/components/ui/expanded/ActivityHeatmap"
|
|
6
|
+
|
|
7
|
+
const activityItems: ActivityHeatmapItem[] = Array.from(
|
|
8
|
+
{ length: 39 * 7 },
|
|
9
|
+
(_, index) => {
|
|
10
|
+
const column = Math.floor(index / 7)
|
|
11
|
+
const row = index % 7
|
|
12
|
+
const level = ((column * 11 + row * 7 + column * row * 3) % 5) as ActivityHeatmapLevel
|
|
13
|
+
|
|
14
|
+
return {
|
|
15
|
+
id: `activity-${index}`,
|
|
16
|
+
label: `Activity level ${level} of 4`,
|
|
17
|
+
level,
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
export function ActivityHeatmapDemo() {
|
|
23
|
+
return (
|
|
24
|
+
<ActivityHeatmap
|
|
25
|
+
ariaLabel="Weekly activity over the last 39 weeks"
|
|
26
|
+
items={activityItems}
|
|
27
|
+
/>
|
|
28
|
+
)
|
|
29
|
+
}
|
|
@@ -30,16 +30,16 @@ const rtlBreadcrumbItems: BreadcrumbItem[] = [
|
|
|
30
30
|
export function BreadcrumbsDemo() {
|
|
31
31
|
return (
|
|
32
32
|
<div className="grid gap-[var(--bh-space-3xl-16)]">
|
|
33
|
-
<Breadcrumbs aria-label="
|
|
33
|
+
<Breadcrumbs aria-label="Default breadcrumb" items={breadcrumbItems} overflowLabel="More" />
|
|
34
34
|
<Breadcrumbs
|
|
35
|
-
aria-label="
|
|
35
|
+
aria-label="Raised breadcrumb"
|
|
36
36
|
items={breadcrumbItems}
|
|
37
37
|
overflowLabel="More"
|
|
38
38
|
separator="chevron"
|
|
39
39
|
style="raised"
|
|
40
40
|
/>
|
|
41
41
|
<Breadcrumbs
|
|
42
|
-
aria-label="
|
|
42
|
+
aria-label="Collapsed breadcrumb"
|
|
43
43
|
items={longBreadcrumbItems}
|
|
44
44
|
maxItems={4}
|
|
45
45
|
overflowLabel="More"
|
|
@@ -6,14 +6,14 @@ import {
|
|
|
6
6
|
export function PaginationDemo() {
|
|
7
7
|
return (
|
|
8
8
|
<div className="grid gap-[var(--bh-space-5xl-24)]">
|
|
9
|
-
<Pagination />
|
|
10
|
-
<Pagination variant="ghost" />
|
|
9
|
+
<Pagination aria-label="Soft numeric pagination" />
|
|
10
|
+
<Pagination aria-label="Ghost numeric pagination" variant="ghost" />
|
|
11
11
|
|
|
12
|
-
<Pagination type="simple" />
|
|
13
|
-
<Pagination type="summary" />
|
|
12
|
+
<Pagination aria-label="Simple pagination" type="simple" />
|
|
13
|
+
<Pagination aria-label="Summary pagination" type="summary" />
|
|
14
14
|
|
|
15
15
|
<div dir="rtl">
|
|
16
|
-
<Pagination dir="rtl" messages={arabicPaginationMessages} />
|
|
16
|
+
<Pagination aria-label="ترقيم الصفحات العربية" dir="rtl" messages={arabicPaginationMessages} />
|
|
17
17
|
</div>
|
|
18
18
|
</div>
|
|
19
19
|
)
|
|
@@ -47,8 +47,10 @@ export function SidebarDemo() {
|
|
|
47
47
|
<SidebarMenuButton icon={<SettingsIcon />}>Admin</SidebarMenuButton>
|
|
48
48
|
</SidebarFooter>
|
|
49
49
|
</Sidebar>
|
|
50
|
-
<SidebarInset
|
|
51
|
-
|
|
50
|
+
<SidebarInset asChild>
|
|
51
|
+
<div className="grid min-w-0 flex-1 place-items-center bg-[var(--bh-bg-subtle)] p-[var(--bh-space-4xl-20)] text-sm text-[var(--bh-content-subtle)]">
|
|
52
|
+
App content
|
|
53
|
+
</div>
|
|
52
54
|
</SidebarInset>
|
|
53
55
|
</SidebarProvider>
|
|
54
56
|
)
|