banhaten 0.1.0 → 0.1.2
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/README.md +21 -9
- package/package.json +8 -2
- package/registry/components/accordion.tsx +37 -1
- package/registry/components/alert.tsx +14 -28
- package/registry/components/attribute.tsx +6 -10
- package/registry/components/autocomplete.tsx +637 -0
- package/registry/components/avatar.tsx +259 -24
- package/registry/components/badge.tsx +97 -35
- package/registry/components/button-group.tsx +1 -1
- package/registry/components/card.tsx +1 -1
- package/registry/components/checkbox.tsx +19 -16
- package/registry/components/date-picker-state.ts +253 -0
- package/registry/components/date-picker.tsx +115 -158
- package/registry/components/expanded/ActivityFeed.tsx +37 -23
- package/registry/components/expanded/Banner.tsx +54 -19
- package/registry/components/expanded/Breadcrumbs.tsx +10 -38
- package/registry/components/expanded/CatalogComponentsShowcase.tsx +11 -16
- package/registry/components/expanded/CatalogTag.tsx +4 -11
- package/registry/components/expanded/CommandBar.tsx +33 -53
- package/registry/components/expanded/EmptyState.tsx +155 -0
- package/registry/components/expanded/FileUpload.tsx +362 -59
- package/registry/components/expanded/OnboardingStepListItem.tsx +6 -10
- package/registry/components/expanded/PageHeader.tsx +2 -11
- package/registry/components/expanded/Slideout.tsx +12 -23
- package/registry/components/expanded/Steps.tsx +6 -8
- package/registry/components/expanded/Table.tsx +18 -40
- package/registry/components/expanded/Timeline.tsx +5 -24
- package/registry/components/expanded/activityFeed.css +10 -54
- package/registry/components/expanded/banner.css +8 -75
- package/registry/components/expanded/breadcrumbs.css +1 -1
- package/registry/components/expanded/commandBar.css +23 -26
- package/registry/components/expanded/divider.css +1 -1
- package/registry/components/expanded/emptyState.css +111 -0
- package/registry/components/expanded/fileUpload.css +304 -75
- package/registry/components/expanded/pageHeader.css +1 -1
- package/registry/components/expanded/slideout.css +1 -0
- package/registry/components/expanded/steps.css +15 -51
- package/registry/components/expanded/table.css +6 -1
- package/registry/components/expanded/timeline.css +18 -15
- package/registry/components/input-otp.tsx +574 -0
- package/registry/components/input.tsx +140 -59
- package/registry/components/menu.tsx +470 -80
- package/registry/components/pagination.tsx +6 -18
- package/registry/components/popover.tsx +840 -0
- package/registry/components/radio-card.tsx +25 -31
- package/registry/components/select-content.tsx +28 -123
- package/registry/components/select.tsx +13 -9
- package/registry/components/skeleton.css +57 -0
- package/registry/components/skeleton.tsx +482 -0
- package/registry/components/social-button.tsx +24 -90
- package/registry/components/spinner.tsx +91 -7
- package/registry/components/textarea.tsx +21 -36
- package/registry/components/toggle.tsx +7 -23
- package/registry/components/tooltip.tsx +8 -4
- package/registry/examples/attribute-demo.tsx +2 -2
- package/registry/examples/autocomplete-demo.tsx +109 -0
- package/registry/examples/avatar-demo.tsx +102 -47
- package/registry/examples/badge-demo.tsx +16 -0
- package/registry/examples/checkbox-demo.tsx +3 -8
- package/registry/examples/date-picker-demo.tsx +75 -22
- package/registry/examples/expanded/banner-demo.tsx +31 -6
- package/registry/examples/expanded/breadcrumbs-demo.tsx +59 -0
- package/registry/examples/expanded/command-bar-demo.tsx +236 -0
- package/registry/examples/expanded/empty-state-demo.tsx +39 -0
- package/registry/examples/expanded/file-upload-demo.tsx +60 -0
- package/registry/examples/expanded/steps-demo.tsx +11 -0
- package/registry/examples/expanded/table-demo.tsx +142 -0
- package/registry/examples/input-demo.tsx +1 -1
- package/registry/examples/input-otp-demo.tsx +72 -0
- package/registry/examples/menu-demo.tsx +101 -88
- package/registry/examples/popover-demo.tsx +546 -0
- package/registry/examples/progress-demo.tsx +2 -2
- package/registry/examples/select-demo.tsx +32 -18
- package/registry/examples/skeleton-demo.tsx +56 -0
- package/registry/examples/social-button-demo.tsx +33 -33
- package/registry/examples/spinner-demo.tsx +59 -0
- package/registry/examples/tag-demo.tsx +1 -1
- package/registry/examples/textarea-demo.tsx +1 -1
- package/registry/index.json +266 -20
- package/registry/styles/globals.css +93 -3
- package/src/cli/index.js +997 -62
package/registry/index.json
CHANGED
|
@@ -49,24 +49,31 @@
|
|
|
49
49
|
"examples": ["examples/accordion-demo.tsx"]
|
|
50
50
|
},
|
|
51
51
|
"avatar": {
|
|
52
|
-
"description": "
|
|
52
|
+
"description": "Figma-matched user avatar primitive with image, initials, icon fallback, circular and rounded forms, status dots, call-to-action overlays, stacked group count, size scale, and RTL-safe overlap.",
|
|
53
53
|
"dependencies": {
|
|
54
54
|
"@radix-ui/react-avatar": "^1.1.10",
|
|
55
|
-
"class-variance-authority": "^0.7.1"
|
|
55
|
+
"class-variance-authority": "^0.7.1",
|
|
56
|
+
"lucide-react": "^1.17.0"
|
|
56
57
|
},
|
|
57
58
|
"parts": [
|
|
58
59
|
"Avatar",
|
|
59
60
|
"AvatarImage",
|
|
60
61
|
"AvatarFallback",
|
|
62
|
+
"AvatarIcon",
|
|
61
63
|
"AvatarBadge",
|
|
64
|
+
"AvatarStatus",
|
|
65
|
+
"AvatarAction",
|
|
62
66
|
"AvatarGroup",
|
|
63
67
|
"AvatarGroupCount"
|
|
64
68
|
],
|
|
65
|
-
"sizes": ["sm", "
|
|
69
|
+
"sizes": ["2xs", "xs", "sm", "md", "lg", "xl", "2xl", "3xl", "4xl"],
|
|
70
|
+
"forms": ["circular", "rounded"],
|
|
71
|
+
"statusColors": ["offline", "busy", "blocked", "available", "away"],
|
|
72
|
+
"actions": ["custom", "edit", "verified", "remove"],
|
|
66
73
|
"rtl": {
|
|
67
74
|
"inheritsDirection": true,
|
|
68
75
|
"groupOverlap": "Uses logical -ms spacing so overlap reverses naturally in RTL.",
|
|
69
|
-
"badgePlacement": "
|
|
76
|
+
"badgePlacement": "Status dots use logical end/bottom positioning; avatar actions use logical end/top positioning."
|
|
70
77
|
},
|
|
71
78
|
"files": [
|
|
72
79
|
{
|
|
@@ -81,7 +88,7 @@
|
|
|
81
88
|
"examples": ["examples/avatar-demo.tsx"]
|
|
82
89
|
},
|
|
83
90
|
"badge": {
|
|
84
|
-
"description": "Figma Badge primitive with light, outline, and solid styles, semantic accent colors, dot, flag, icon, numeric, and RTL-safe composition.",
|
|
91
|
+
"description": "Figma Badge primitive with light, outline, and solid styles, semantic accent colors, dot, flag, icon, numeric, optional split trailing actions, and RTL-safe composition.",
|
|
85
92
|
"dependencies": {
|
|
86
93
|
"@radix-ui/react-slot": "^1.2.3",
|
|
87
94
|
"class-variance-authority": "^0.7.1"
|
|
@@ -101,10 +108,11 @@
|
|
|
101
108
|
"golden"
|
|
102
109
|
],
|
|
103
110
|
"types": ["default", "leading-icon", "trailing-icon", "dot", "flag"],
|
|
111
|
+
"options": ["splitAction"],
|
|
104
112
|
"sizes": ["sm", "lg"],
|
|
105
113
|
"rtl": {
|
|
106
114
|
"inheritsDirection": true,
|
|
107
|
-
"iconPlacement": "Set type=\"leading-icon\" or type=\"trailing-icon\" and use data-icon=\"inline-start\" or data-icon=\"inline-end\".",
|
|
115
|
+
"iconPlacement": "Set type=\"leading-icon\" or type=\"trailing-icon\" and use data-icon=\"inline-start\" or data-icon=\"inline-end\". Add splitAction to give a trailing icon its own token-sized compartment.",
|
|
108
116
|
"directionalIconFlip": "Use data-rtl-flip=\"true\" on arrows that should mirror.",
|
|
109
117
|
"textDirection": "Uses dir=\"auto\" by default for short Arabic and English labels.",
|
|
110
118
|
"legacyVariants": "The previous variant prop is still accepted as a compatibility shim."
|
|
@@ -200,10 +208,12 @@
|
|
|
200
208
|
"sm",
|
|
201
209
|
"default",
|
|
202
210
|
"lg",
|
|
211
|
+
"xl",
|
|
203
212
|
"icon-xs",
|
|
204
213
|
"icon-sm",
|
|
205
214
|
"icon",
|
|
206
|
-
"icon-lg"
|
|
215
|
+
"icon-lg",
|
|
216
|
+
"icon-xl"
|
|
207
217
|
],
|
|
208
218
|
"rtl": {
|
|
209
219
|
"inheritsDirection": true,
|
|
@@ -297,7 +307,7 @@
|
|
|
297
307
|
"examples": ["examples/toggle-demo.tsx"]
|
|
298
308
|
},
|
|
299
309
|
"menu": {
|
|
300
|
-
"description": "Radix DropdownMenu-backed, Figma-matched menu surface and composable menu item slots for default, multiline, call-to-action, progress, divider, button, label, caption, badge, switch, avatar, meta text, and RTL layouts.",
|
|
310
|
+
"description": "Radix DropdownMenu-backed, Figma-matched menu surface and composable menu item slots for default, multiline, call-to-action, progress, divider, button, label, caption, badge, switch, avatar, meta text, submenus, and RTL layouts.",
|
|
301
311
|
"dependencies": {
|
|
302
312
|
"@radix-ui/react-dropdown-menu": "^2.1.17",
|
|
303
313
|
"@radix-ui/react-slot": "^1.2.3",
|
|
@@ -309,6 +319,9 @@
|
|
|
309
319
|
"MenuTrigger",
|
|
310
320
|
"MenuContent",
|
|
311
321
|
"MenuPortal",
|
|
322
|
+
"MenuSub",
|
|
323
|
+
"MenuSubTrigger",
|
|
324
|
+
"MenuSubContent",
|
|
312
325
|
"MenuItem",
|
|
313
326
|
"MenuItemContent",
|
|
314
327
|
"MenuItemIcon",
|
|
@@ -386,6 +399,63 @@
|
|
|
386
399
|
],
|
|
387
400
|
"examples": ["examples/tooltip-demo.tsx"]
|
|
388
401
|
},
|
|
402
|
+
"popover": {
|
|
403
|
+
"description": "Token-built popover primitive with click, focus, and hover-capable triggers, positioned content, optional arrow, alignment and offset controls, close affordance, small to large surfaces, and RTL-safe composition.",
|
|
404
|
+
"dependencies": {
|
|
405
|
+
"@radix-ui/react-slot": "^1.2.3",
|
|
406
|
+
"class-variance-authority": "^0.7.1",
|
|
407
|
+
"lucide-react": "^1.17.0"
|
|
408
|
+
},
|
|
409
|
+
"registryDependencies": [
|
|
410
|
+
"badge",
|
|
411
|
+
"button",
|
|
412
|
+
"checkbox",
|
|
413
|
+
"input",
|
|
414
|
+
"menu",
|
|
415
|
+
"select",
|
|
416
|
+
"toggle"
|
|
417
|
+
],
|
|
418
|
+
"parts": [
|
|
419
|
+
"Popover",
|
|
420
|
+
"PopoverRoot",
|
|
421
|
+
"PopoverAnchor",
|
|
422
|
+
"PopoverTrigger",
|
|
423
|
+
"PopoverContent",
|
|
424
|
+
"PopoverHeader",
|
|
425
|
+
"PopoverTitle",
|
|
426
|
+
"PopoverDescription",
|
|
427
|
+
"PopoverBody",
|
|
428
|
+
"PopoverFooter",
|
|
429
|
+
"PopoverClose"
|
|
430
|
+
],
|
|
431
|
+
"sides": ["top", "right", "bottom", "left"],
|
|
432
|
+
"alignments": ["start", "center", "end"],
|
|
433
|
+
"sizes": ["sm", "md", "lg", "auto"],
|
|
434
|
+
"offsets": ["tight", "default", "loose"],
|
|
435
|
+
"features": [
|
|
436
|
+
"filter popover",
|
|
437
|
+
"settings popover",
|
|
438
|
+
"actions popover",
|
|
439
|
+
"focus trigger",
|
|
440
|
+
"text link trigger",
|
|
441
|
+
"icon button trigger",
|
|
442
|
+
"optional arrow",
|
|
443
|
+
"RTL"
|
|
444
|
+
],
|
|
445
|
+
"rtl": {
|
|
446
|
+
"inheritsDirection": true,
|
|
447
|
+
"alignment": "Top and bottom alignments use logical start/end so the panel edge and arrow align correctly in LTR and RTL.",
|
|
448
|
+
"spacing": "Uses logical layout and Banhaten spacing tokens for headers, bodies, footers, arrows, and trigger gaps.",
|
|
449
|
+
"textDirection": "Title and description slots use dir=\"auto\" while product content can inherit the nearest direction."
|
|
450
|
+
},
|
|
451
|
+
"files": [
|
|
452
|
+
{
|
|
453
|
+
"source": "components/popover.tsx",
|
|
454
|
+
"target": "{{ui}}/popover.tsx"
|
|
455
|
+
}
|
|
456
|
+
],
|
|
457
|
+
"examples": ["examples/popover-demo.tsx"]
|
|
458
|
+
},
|
|
389
459
|
"modal": {
|
|
390
460
|
"description": "Radix Dialog-backed modal primitive with Figma Small, Default, and Large sizes, tokenized raised surface, header/body/footer slots, ConfirmModal guardrails, Button actions, Checkbox opt-out, and RTL-safe layout.",
|
|
391
461
|
"dependencies": {
|
|
@@ -663,11 +733,45 @@
|
|
|
663
733
|
],
|
|
664
734
|
"examples": ["examples/input-demo.tsx"]
|
|
665
735
|
},
|
|
736
|
+
"input-otp": {
|
|
737
|
+
"description": "One-time passcode input composed from the Banhaten Input surface, control typography, labels, helper text, tokenized slot gaps, paste handling, grouped slots, masked values, and RTL-aware keyboard navigation.",
|
|
738
|
+
"dependencies": {
|
|
739
|
+
"class-variance-authority": "^0.7.1"
|
|
740
|
+
},
|
|
741
|
+
"registryDependencies": ["input"],
|
|
742
|
+
"parts": ["InputOTP", "InputOTPSeparator"],
|
|
743
|
+
"variants": ["default", "soft"],
|
|
744
|
+
"sizes": ["md", "lg"],
|
|
745
|
+
"states": ["default", "filled", "error", "disabled"],
|
|
746
|
+
"features": [
|
|
747
|
+
"controlled value",
|
|
748
|
+
"uncontrolled value",
|
|
749
|
+
"paste distribution",
|
|
750
|
+
"hidden form value",
|
|
751
|
+
"masked slots",
|
|
752
|
+
"custom length",
|
|
753
|
+
"custom grouping"
|
|
754
|
+
],
|
|
755
|
+
"rtl": {
|
|
756
|
+
"inheritsDirection": true,
|
|
757
|
+
"keyboard": "Arrow navigation mirrors for RTL: visual previous and next follow the inherited direction.",
|
|
758
|
+
"spacing": "Slot groups, separators, labels, and helper text use inherited direction plus Input spacing tokens.",
|
|
759
|
+
"composition": "Each slot reuses the Banhaten Input surface and control typography instead of a separate field style."
|
|
760
|
+
},
|
|
761
|
+
"files": [
|
|
762
|
+
{
|
|
763
|
+
"source": "components/input-otp.tsx",
|
|
764
|
+
"target": "{{ui}}/input-otp.tsx"
|
|
765
|
+
}
|
|
766
|
+
],
|
|
767
|
+
"examples": ["examples/input-otp-demo.tsx"]
|
|
768
|
+
},
|
|
666
769
|
"select": {
|
|
667
|
-
"description": "Radix Select-backed, Figma-matched select field and menu item primitives with default and soft trigger styles, lg/md sizes, error/filled/disabled states, menu surface, checkbox and check selection, and item media for text, icons, avatars,
|
|
770
|
+
"description": "Radix Select-backed, Figma-matched select field and menu item primitives with default and soft trigger styles, lg/md sizes, error/filled/disabled states, menu surface, checkbox and check selection, and item media for text, icons, avatars, company, payment, and status dots.",
|
|
668
771
|
"dependencies": {
|
|
669
772
|
"@radix-ui/react-select": "^2.3.0",
|
|
670
|
-
"class-variance-authority": "^0.7.1"
|
|
773
|
+
"class-variance-authority": "^0.7.1",
|
|
774
|
+
"lucide-react": "^1.17.0"
|
|
671
775
|
},
|
|
672
776
|
"parts": [
|
|
673
777
|
"Select",
|
|
@@ -679,7 +783,6 @@
|
|
|
679
783
|
"SelectMenuItem",
|
|
680
784
|
"SelectCheckboxIndicator",
|
|
681
785
|
"SelectItemAvatar",
|
|
682
|
-
"SelectItemFlag",
|
|
683
786
|
"SelectItemCompanyLogo",
|
|
684
787
|
"SelectItemPaymentIcon",
|
|
685
788
|
"SelectItemStatusDot"
|
|
@@ -691,7 +794,6 @@
|
|
|
691
794
|
"default",
|
|
692
795
|
"icon",
|
|
693
796
|
"avatar",
|
|
694
|
-
"flag",
|
|
695
797
|
"company",
|
|
696
798
|
"payment",
|
|
697
799
|
"dot"
|
|
@@ -714,6 +816,40 @@
|
|
|
714
816
|
],
|
|
715
817
|
"examples": ["examples/select-demo.tsx"]
|
|
716
818
|
},
|
|
819
|
+
"autocomplete": {
|
|
820
|
+
"description": "Composable autocomplete and combobox field built from Banhaten Input, Select menu items, and Tag selections with filtering, single or multiple selection, keyboard navigation, error/disabled states, and RTL-safe layout.",
|
|
821
|
+
"dependencies": {
|
|
822
|
+
"lucide-react": "^1.17.0"
|
|
823
|
+
},
|
|
824
|
+
"registryDependencies": ["input", "select", "tag"],
|
|
825
|
+
"parts": ["Autocomplete"],
|
|
826
|
+
"modes": ["single", "multiple"],
|
|
827
|
+
"states": ["default", "filled", "error", "disabled"],
|
|
828
|
+
"variants": ["default", "soft"],
|
|
829
|
+
"sizes": ["md", "lg"],
|
|
830
|
+
"features": [
|
|
831
|
+
"filtering",
|
|
832
|
+
"keyboard navigation",
|
|
833
|
+
"controlled value",
|
|
834
|
+
"controlled input value",
|
|
835
|
+
"controlled open state",
|
|
836
|
+
"selected tags",
|
|
837
|
+
"empty state"
|
|
838
|
+
],
|
|
839
|
+
"rtl": {
|
|
840
|
+
"inheritsDirection": true,
|
|
841
|
+
"composition": "Uses the existing Input field, Select menu and menu item rows, and Tag chips instead of introducing new visual primitives.",
|
|
842
|
+
"spacing": "Uses logical positioning, logical gaps, and inherited direction so the input, menu rows, checks, helper text, and selected tags mirror naturally.",
|
|
843
|
+
"textDirection": "Labels, option text, helper text, and tag labels use dir=\"auto\" through the composed primitives."
|
|
844
|
+
},
|
|
845
|
+
"files": [
|
|
846
|
+
{
|
|
847
|
+
"source": "components/autocomplete.tsx",
|
|
848
|
+
"target": "{{ui}}/autocomplete.tsx"
|
|
849
|
+
}
|
|
850
|
+
],
|
|
851
|
+
"examples": ["examples/autocomplete-demo.tsx"]
|
|
852
|
+
},
|
|
717
853
|
"date-picker": {
|
|
718
854
|
"description": "Figma-matched Calendar, Range Calendar, Date Picker, and Date Range Picker suite with single, month/year, double calendar, preset list, open/closed, time row, range selection, and RTL use cases.",
|
|
719
855
|
"dependencies": {
|
|
@@ -747,6 +883,10 @@
|
|
|
747
883
|
{
|
|
748
884
|
"source": "components/date-picker.tsx",
|
|
749
885
|
"target": "{{ui}}/date-picker.tsx"
|
|
886
|
+
},
|
|
887
|
+
{
|
|
888
|
+
"source": "components/date-picker-state.ts",
|
|
889
|
+
"target": "{{ui}}/date-picker-state.ts"
|
|
750
890
|
}
|
|
751
891
|
],
|
|
752
892
|
"examples": ["examples/date-picker-demo.tsx"]
|
|
@@ -865,19 +1005,79 @@
|
|
|
865
1005
|
],
|
|
866
1006
|
"examples": ["examples/textarea-demo.tsx"]
|
|
867
1007
|
},
|
|
1008
|
+
"skeleton": {
|
|
1009
|
+
"description": "Token-built loading placeholder primitive with text, avatar, button, input, card, list, table, and form compositions, shimmer motion, reduced-motion fallback, and RTL-safe direction.",
|
|
1010
|
+
"dependencies": {
|
|
1011
|
+
"class-variance-authority": "^0.7.1"
|
|
1012
|
+
},
|
|
1013
|
+
"parts": [
|
|
1014
|
+
"Skeleton",
|
|
1015
|
+
"SkeletonText",
|
|
1016
|
+
"SkeletonAvatar",
|
|
1017
|
+
"SkeletonButton",
|
|
1018
|
+
"SkeletonInput",
|
|
1019
|
+
"SkeletonCard",
|
|
1020
|
+
"SkeletonList",
|
|
1021
|
+
"SkeletonTable",
|
|
1022
|
+
"SkeletonForm"
|
|
1023
|
+
],
|
|
1024
|
+
"shapes": ["block", "text", "circle"],
|
|
1025
|
+
"sizes": ["xs", "sm", "md", "lg", "xl"],
|
|
1026
|
+
"tones": ["default", "subtle", "surface", "brand"],
|
|
1027
|
+
"features": [
|
|
1028
|
+
"shimmer animation",
|
|
1029
|
+
"reduced motion",
|
|
1030
|
+
"text lines",
|
|
1031
|
+
"avatar placeholders",
|
|
1032
|
+
"button placeholders",
|
|
1033
|
+
"input placeholders",
|
|
1034
|
+
"card placeholders",
|
|
1035
|
+
"list placeholders",
|
|
1036
|
+
"table placeholders",
|
|
1037
|
+
"form placeholders"
|
|
1038
|
+
],
|
|
1039
|
+
"rtl": {
|
|
1040
|
+
"inheritsDirection": true,
|
|
1041
|
+
"motion": "The shimmer direction mirrors inside RTL containers while preserving logical layout.",
|
|
1042
|
+
"composition": "Composed card, list, table, and form placeholders use logical gaps, inherited direction, and token-sized rows.",
|
|
1043
|
+
"accessibility": "Skeletons are decorative by default; set aria-busy on the loading region and pair with a status label when loading progress needs to be announced."
|
|
1044
|
+
},
|
|
1045
|
+
"files": [
|
|
1046
|
+
{
|
|
1047
|
+
"source": "components/skeleton.css",
|
|
1048
|
+
"target": "{{ui}}/skeleton.css"
|
|
1049
|
+
},
|
|
1050
|
+
{
|
|
1051
|
+
"source": "components/skeleton.tsx",
|
|
1052
|
+
"target": "{{ui}}/skeleton.tsx"
|
|
1053
|
+
}
|
|
1054
|
+
],
|
|
1055
|
+
"examples": ["examples/skeleton-demo.tsx"]
|
|
1056
|
+
},
|
|
868
1057
|
"spinner": {
|
|
869
|
-
"description": "Small composable loading
|
|
1058
|
+
"description": "Small composable loading indicators with a steady Spinner and a smoother variable-arc DynamicSpinner, both inheriting text color and CSS variable sizing.",
|
|
870
1059
|
"dependencies": {},
|
|
1060
|
+
"parts": ["Spinner", "DynamicSpinner"],
|
|
1061
|
+
"modes": ["steady", "dynamic"],
|
|
1062
|
+
"features": [
|
|
1063
|
+
"steady arc rotation",
|
|
1064
|
+
"dynamic arc length",
|
|
1065
|
+
"slower continuous rotation",
|
|
1066
|
+
"text color inheritance",
|
|
1067
|
+
"CSS variable sizing"
|
|
1068
|
+
],
|
|
871
1069
|
"files": [
|
|
872
1070
|
{
|
|
873
1071
|
"source": "components/spinner.tsx",
|
|
874
1072
|
"target": "{{ui}}/spinner.tsx"
|
|
875
1073
|
}
|
|
876
|
-
]
|
|
1074
|
+
],
|
|
1075
|
+
"examples": ["examples/spinner-demo.tsx"]
|
|
877
1076
|
},
|
|
878
1077
|
"activity-feed": {
|
|
879
1078
|
"description": "Expanded activity feed composition with avatar indicators, status dots, captions, action buttons, slot rows, timestamps, links, and RTL copy.",
|
|
880
1079
|
"status": "expanded",
|
|
1080
|
+
"registryDependencies": ["button"],
|
|
881
1081
|
"dependencies": {},
|
|
882
1082
|
"parts": ["ActivityFeed", "ActivityFeedItem"],
|
|
883
1083
|
"files": [
|
|
@@ -920,6 +1120,7 @@
|
|
|
920
1120
|
"description": "Expanded banner system with slim, inline action, single action, input, floating, full-width, brand, grey, brand-light, and RTL variants.",
|
|
921
1121
|
"status": "expanded",
|
|
922
1122
|
"dependencies": {},
|
|
1123
|
+
"registryDependencies": ["button", "input"],
|
|
923
1124
|
"parts": ["Banner", "BannerBoard"],
|
|
924
1125
|
"files": [
|
|
925
1126
|
{
|
|
@@ -940,7 +1141,10 @@
|
|
|
940
1141
|
"catalog-components": {
|
|
941
1142
|
"description": "Expanded catalog showcase with breadcrumbs, catalog-only content dividers, catalog tag previews, file upload states, and table previews.",
|
|
942
1143
|
"status": "expanded",
|
|
943
|
-
"dependencies": {
|
|
1144
|
+
"dependencies": {
|
|
1145
|
+
"lucide-react": "^1.17.0"
|
|
1146
|
+
},
|
|
1147
|
+
"registryDependencies": ["button"],
|
|
944
1148
|
"parts": [
|
|
945
1149
|
"Breadcrumbs",
|
|
946
1150
|
"CatalogContentDivider",
|
|
@@ -1017,12 +1221,15 @@
|
|
|
1017
1221
|
"target": "{{ui}}/expanded/Breadcrumbs.tsx"
|
|
1018
1222
|
}
|
|
1019
1223
|
],
|
|
1020
|
-
"examples": ["examples/expanded/
|
|
1224
|
+
"examples": ["examples/expanded/breadcrumbs-demo.tsx"]
|
|
1021
1225
|
},
|
|
1022
1226
|
"file-upload": {
|
|
1023
1227
|
"description": "Expanded file upload composition with drag-and-drop zones, file rows, upload states, disabled behavior, and RTL direction.",
|
|
1024
1228
|
"status": "expanded",
|
|
1025
|
-
"dependencies": {
|
|
1229
|
+
"dependencies": {
|
|
1230
|
+
"lucide-react": "^1.17.0"
|
|
1231
|
+
},
|
|
1232
|
+
"registryDependencies": ["button"],
|
|
1026
1233
|
"parts": ["FileUpload"],
|
|
1027
1234
|
"files": [
|
|
1028
1235
|
{
|
|
@@ -1034,7 +1241,7 @@
|
|
|
1034
1241
|
"target": "{{ui}}/expanded/FileUpload.tsx"
|
|
1035
1242
|
}
|
|
1036
1243
|
],
|
|
1037
|
-
"examples": ["examples/expanded/
|
|
1244
|
+
"examples": ["examples/expanded/file-upload-demo.tsx"]
|
|
1038
1245
|
},
|
|
1039
1246
|
"table": {
|
|
1040
1247
|
"description": "Expanded table and data table composition with selection, stateful sortable headers, search, filters, bulk actions, pagination, empty/loading/error states, status badges, progress cells, actions, row states, and RTL mirroring.",
|
|
@@ -1052,12 +1259,15 @@
|
|
|
1052
1259
|
"target": "{{ui}}/expanded/Table.tsx"
|
|
1053
1260
|
}
|
|
1054
1261
|
],
|
|
1055
|
-
"examples": ["examples/expanded/
|
|
1262
|
+
"examples": ["examples/expanded/table-demo.tsx"]
|
|
1056
1263
|
},
|
|
1057
1264
|
"command-bar": {
|
|
1058
1265
|
"description": "Expanded command bar composition for default, recent, results, and empty command-palette states across desktop, mobile, LTR, and RTL.",
|
|
1059
1266
|
"status": "expanded",
|
|
1060
|
-
"dependencies": {
|
|
1267
|
+
"dependencies": {
|
|
1268
|
+
"lucide-react": "^1.17.0"
|
|
1269
|
+
},
|
|
1270
|
+
"registryDependencies": ["button"],
|
|
1061
1271
|
"parts": ["CommandBar"],
|
|
1062
1272
|
"files": [
|
|
1063
1273
|
{
|
|
@@ -1071,6 +1281,41 @@
|
|
|
1071
1281
|
],
|
|
1072
1282
|
"examples": ["examples/expanded/command-bar-demo.tsx"]
|
|
1073
1283
|
},
|
|
1284
|
+
"empty-state": {
|
|
1285
|
+
"description": "Expanded empty and result state composition with neutral icon halo, title, supporting copy, optional Button actions, alignment, compact density, custom icons, and RTL-safe text.",
|
|
1286
|
+
"status": "expanded",
|
|
1287
|
+
"dependencies": {
|
|
1288
|
+
"lucide-react": "^1.17.0"
|
|
1289
|
+
},
|
|
1290
|
+
"registryDependencies": ["button"],
|
|
1291
|
+
"parts": ["EmptyState"],
|
|
1292
|
+
"sizes": ["default", "compact"],
|
|
1293
|
+
"alignments": ["center", "start"],
|
|
1294
|
+
"features": [
|
|
1295
|
+
"neutral icon halo",
|
|
1296
|
+
"title and description copy",
|
|
1297
|
+
"primary and secondary actions",
|
|
1298
|
+
"custom icon",
|
|
1299
|
+
"RTL"
|
|
1300
|
+
],
|
|
1301
|
+
"rtl": {
|
|
1302
|
+
"inheritsDirection": false,
|
|
1303
|
+
"textAlignment": "The root dir prop mirrors logical alignment and action flow while title and description use dir=\"auto\".",
|
|
1304
|
+
"spacing": "Uses grid, flex-wrap, gap, and logical margins so centered and start-aligned layouts work in LTR and RTL.",
|
|
1305
|
+
"actions": "Action buttons are rendered through the Banhaten Button primitive and preserve logical order."
|
|
1306
|
+
},
|
|
1307
|
+
"files": [
|
|
1308
|
+
{
|
|
1309
|
+
"source": "components/expanded/emptyState.css",
|
|
1310
|
+
"target": "{{ui}}/expanded/emptyState.css"
|
|
1311
|
+
},
|
|
1312
|
+
{
|
|
1313
|
+
"source": "components/expanded/EmptyState.tsx",
|
|
1314
|
+
"target": "{{ui}}/expanded/EmptyState.tsx"
|
|
1315
|
+
}
|
|
1316
|
+
],
|
|
1317
|
+
"examples": ["examples/expanded/empty-state-demo.tsx"]
|
|
1318
|
+
},
|
|
1074
1319
|
"icons": {
|
|
1075
1320
|
"description": "Expanded icon explorer for open-source icon pack review, semantic mapping, shortlist comparison, and Iconify catalog inspection.",
|
|
1076
1321
|
"status": "expanded",
|
|
@@ -1158,6 +1403,7 @@
|
|
|
1158
1403
|
"description": "Expanded steps composition with horizontal and vertical progress indicators, icon markers, number markers, item alignment, and RTL layouts.",
|
|
1159
1404
|
"status": "expanded",
|
|
1160
1405
|
"dependencies": {},
|
|
1406
|
+
"registryDependencies": ["button"],
|
|
1161
1407
|
"parts": ["HorizontalStepItem", "Steps", "VerticalStepItem"],
|
|
1162
1408
|
"files": [
|
|
1163
1409
|
{
|
|
@@ -479,6 +479,59 @@
|
|
|
479
479
|
--shadow-button-hover: var(--shadow-button-raised);
|
|
480
480
|
--shadow-button-active: var(--shadow-button-raised);
|
|
481
481
|
--shadow-avatar-badge: none;
|
|
482
|
+
--bh-avatar-size-2xs: var(--bh-space-3xl-16);
|
|
483
|
+
--bh-avatar-size-xs: var(--bh-space-4xl-20);
|
|
484
|
+
--bh-avatar-size-sm: var(--bh-space-5xl-24);
|
|
485
|
+
--bh-avatar-size-md: var(--bh-space-6xl-32);
|
|
486
|
+
--bh-avatar-size-lg: 36px;
|
|
487
|
+
--bh-avatar-size-xl: var(--bh-space-7xl-40);
|
|
488
|
+
--bh-avatar-size-2xl: var(--bh-space-8xl-48);
|
|
489
|
+
--bh-avatar-size-3xl: 56px;
|
|
490
|
+
--bh-avatar-size-4xl: var(--bh-space-9xl-64);
|
|
491
|
+
--bh-avatar-fallback-font-size-2xs: 9px;
|
|
492
|
+
--bh-avatar-fallback-font-size-xs: var(--bh-space-lg-10);
|
|
493
|
+
--bh-avatar-fallback-font-size-sm: var(--bh-text-body-2xs-semibold-font-size);
|
|
494
|
+
--bh-avatar-fallback-font-size-md: var(--bh-text-body-2xs-semibold-font-size);
|
|
495
|
+
--bh-avatar-fallback-font-size-lg: var(--bh-text-body-sm-semibold-font-size);
|
|
496
|
+
--bh-avatar-fallback-font-size-xl: var(--bh-text-body-sm-semibold-font-size);
|
|
497
|
+
--bh-avatar-fallback-font-size-2xl: var(--bh-text-body-sm-semibold-font-size);
|
|
498
|
+
--bh-avatar-fallback-font-size-3xl: var(--bh-text-body-md-semibold-font-size);
|
|
499
|
+
--bh-avatar-fallback-font-size-4xl: var(--bh-text-body-md-semibold-font-size);
|
|
500
|
+
--bh-avatar-icon-size-2xs: var(--bh-space-lg-10);
|
|
501
|
+
--bh-avatar-icon-size-xs: var(--bh-space-xl-12);
|
|
502
|
+
--bh-avatar-icon-size-sm: var(--bh-space-3xl-16);
|
|
503
|
+
--bh-avatar-icon-size-md: var(--bh-space-4xl-20);
|
|
504
|
+
--bh-avatar-icon-size-lg: var(--bh-space-4xl-20);
|
|
505
|
+
--bh-avatar-icon-size-xl: var(--bh-space-5xl-24);
|
|
506
|
+
--bh-avatar-icon-size-2xl: var(--bh-radius-6xl-28);
|
|
507
|
+
--bh-avatar-icon-size-3xl: var(--bh-space-6xl-32);
|
|
508
|
+
--bh-avatar-icon-size-4xl: 36px;
|
|
509
|
+
--bh-avatar-status-size-tiny: var(--bh-space-sm-6);
|
|
510
|
+
--bh-avatar-status-size-xsmall: var(--bh-space-md-8);
|
|
511
|
+
--bh-avatar-status-size-small: var(--bh-space-lg-10);
|
|
512
|
+
--bh-avatar-status-size-medium: var(--bh-space-2xl-14);
|
|
513
|
+
--bh-avatar-status-size-large: var(--bh-space-3xl-16);
|
|
514
|
+
--bh-avatar-status-size-xlarge: var(--bh-space-4xl-20);
|
|
515
|
+
--bh-avatar-status-ring-thin: var(--bh-space-xxxs-1);
|
|
516
|
+
--bh-avatar-status-ring-default: var(--bh-space-xxs-2);
|
|
517
|
+
--bh-avatar-action-size-tiny: var(--bh-space-lg-10);
|
|
518
|
+
--bh-avatar-action-size-xsmall: var(--bh-space-xl-12);
|
|
519
|
+
--bh-avatar-action-size-small: var(--bh-space-2xl-14);
|
|
520
|
+
--bh-avatar-action-size-medium: var(--bh-space-3xl-16);
|
|
521
|
+
--bh-avatar-action-size-large: 18px;
|
|
522
|
+
--bh-avatar-action-size-xlarge: var(--bh-space-4xl-20);
|
|
523
|
+
--bh-avatar-action-size-2xl: var(--bh-space-5xl-24);
|
|
524
|
+
--bh-avatar-action-size-3xl: var(--bh-space-6xl-32);
|
|
525
|
+
--bh-avatar-action-size-4xl: var(--bh-space-7xl-40);
|
|
526
|
+
--bh-avatar-action-icon-size-tiny: var(--bh-space-sm-6);
|
|
527
|
+
--bh-avatar-action-icon-size-xsmall: 7px;
|
|
528
|
+
--bh-avatar-action-icon-size-small: var(--bh-space-md-8);
|
|
529
|
+
--bh-avatar-action-icon-size-medium: 9px;
|
|
530
|
+
--bh-avatar-action-icon-size-large: var(--bh-space-lg-10);
|
|
531
|
+
--bh-avatar-action-icon-size-xlarge: var(--bh-space-xl-12);
|
|
532
|
+
--bh-avatar-action-icon-size-2xl: var(--bh-space-2xl-14);
|
|
533
|
+
--bh-avatar-action-icon-size-3xl: 18px;
|
|
534
|
+
--bh-avatar-action-icon-size-4xl: 22px;
|
|
482
535
|
--shadow-accordion-item: none;
|
|
483
536
|
--shadow-badge: none;
|
|
484
537
|
--shadow-social-button: inset 0px 0px 0px var(--bh-border-width-default) var(--bh-social-button-border, transparent), var(--shadow-component-default);
|
|
@@ -601,10 +654,10 @@
|
|
|
601
654
|
--bh-button-icon-size: var(--bh-space-4xl-20);
|
|
602
655
|
--bh-button-icon-offset: calc(var(--bh-space-xxs-2) * -1);
|
|
603
656
|
--bh-button-label-padding-x: var(--bh-space-xs-4);
|
|
604
|
-
--bh-badge-focus-ring-width:
|
|
657
|
+
--bh-badge-focus-ring-width: var(--bh-space-xs-4);
|
|
605
658
|
--bh-badge-outline-border-width: calc(var(--bh-border-width-default) + (var(--bh-border-width-default) / 2));
|
|
606
659
|
--bh-tag-focus-ring-inset: calc(var(--bh-space-xxxs-1) * -1);
|
|
607
|
-
--bh-tag-focus-ring-width:
|
|
660
|
+
--bh-tag-focus-ring-width: var(--bh-space-xs-4);
|
|
608
661
|
--bh-tag-active-border-width: calc(var(--bh-border-width-default) + (var(--bh-border-width-default) / 2));
|
|
609
662
|
--bh-alert-compact-width: 470px;
|
|
610
663
|
--bh-alert-compact-height: calc(var(--bh-space-8xl-48) + var(--bh-space-md-8));
|
|
@@ -953,7 +1006,7 @@
|
|
|
953
1006
|
--bh-file-upload-content-max-width: 343px;
|
|
954
1007
|
--bh-file-upload-root-max-width: 500px;
|
|
955
1008
|
--bh-focus-ring-offset: var(--bh-space-xxs-2);
|
|
956
|
-
--bh-focus-ring-width: var(--bh-space-
|
|
1009
|
+
--bh-focus-ring-width: var(--bh-space-xs-4);
|
|
957
1010
|
--bh-icon-explorer-canvas-max-width: 1280px;
|
|
958
1011
|
--bh-icon-explorer-detail-max-width: 760px;
|
|
959
1012
|
--bh-icon-explorer-detail-preview-size: 86px;
|
|
@@ -1065,6 +1118,40 @@
|
|
|
1065
1118
|
--bh-progress-slider-tick-bg: color-mix(in srgb, var(--bh-progress-slider-grip-bg) 34%, transparent);
|
|
1066
1119
|
--bh-slider-pill-track-bg: color-mix(in srgb, var(--bh-slider-range-bg) 12%, var(--bh-bg-default));
|
|
1067
1120
|
--bh-slider-tick-bg: color-mix(in srgb, var(--bh-slider-range-bg) 45%, transparent);
|
|
1121
|
+
--shadow-xs: 0px 1px 2px 0px rgb(15 17 20 / 0.06);
|
|
1122
|
+
--bh-input-otp-group-gap: var(--bh-space-md-8);
|
|
1123
|
+
--bh-input-otp-separator-height: var(--bh-border-width-strong);
|
|
1124
|
+
--bh-input-otp-separator-width: var(--bh-space-md-8);
|
|
1125
|
+
--bh-input-otp-slot-gap: var(--bh-space-xs-4);
|
|
1126
|
+
--bh-input-otp-slot-lg-width: var(--bh-input-lg-height);
|
|
1127
|
+
--bh-input-otp-slot-md-width: var(--bh-input-md-height);
|
|
1128
|
+
--bh-input-otp-width: max-content;
|
|
1129
|
+
--bh-popover-arrow-depth: var(--bh-space-md-8);
|
|
1130
|
+
--bh-popover-arrow-inline-offset: var(--bh-space-xl-12);
|
|
1131
|
+
--bh-popover-arrow-offset: calc(var(--bh-popover-arrow-depth) * -1);
|
|
1132
|
+
--bh-popover-arrow-overlap: var(--bh-border-width-default);
|
|
1133
|
+
--bh-popover-arrow-width: var(--bh-space-xl-12);
|
|
1134
|
+
--bh-popover-bg: var(--bh-bg-raised);
|
|
1135
|
+
--bh-popover-body-gap: var(--bh-space-md-8);
|
|
1136
|
+
--bh-popover-border: var(--bh-border-subtle);
|
|
1137
|
+
--bh-popover-close-icon-size: var(--bh-space-3xl-16);
|
|
1138
|
+
--bh-popover-close-size: var(--bh-space-5xl-24);
|
|
1139
|
+
--bh-popover-content-gap: var(--bh-space-lg-10);
|
|
1140
|
+
--bh-popover-footer-gap: var(--bh-space-md-8);
|
|
1141
|
+
--bh-popover-header-gap: var(--bh-space-md-8);
|
|
1142
|
+
--bh-popover-lg-width: var(--bh-space-19xl-384);
|
|
1143
|
+
--bh-popover-max-width: calc(100vw - var(--bh-space-6xl-32));
|
|
1144
|
+
--bh-popover-md-width: var(--bh-space-17xl-288);
|
|
1145
|
+
--bh-popover-offset: var(--bh-popover-offset-default);
|
|
1146
|
+
--bh-popover-offset-default: var(--bh-space-md-8);
|
|
1147
|
+
--bh-popover-offset-loose: var(--bh-space-3xl-16);
|
|
1148
|
+
--bh-popover-offset-tight: var(--bh-space-xs-4);
|
|
1149
|
+
--bh-popover-padding: var(--bh-space-xl-12);
|
|
1150
|
+
--bh-popover-radius: var(--bh-radius-xl-10);
|
|
1151
|
+
--bh-popover-sm-width: var(--bh-space-15xl-224);
|
|
1152
|
+
--bh-popover-trigger-gap: var(--bh-space-xs-4);
|
|
1153
|
+
--shadow-popover: inset 0px 0px 0px var(--bh-border-width-default) var(--bh-popover-border), var(--shadow-component-default);
|
|
1154
|
+
--bh-empty-state-icon-stroke-width: 2;
|
|
1068
1155
|
|
|
1069
1156
|
}
|
|
1070
1157
|
|
|
@@ -3026,6 +3113,7 @@
|
|
|
3026
3113
|
--bh-select-trigger-border-error: var(--bh-border-danger-strong);
|
|
3027
3114
|
--bh-select-trigger-border-focus: var(--bh-border-focus);
|
|
3028
3115
|
--bh-select-trigger-icon-color: var(--bh-content-muted);
|
|
3116
|
+
--shadow-xs: 0px 1px 2px 0px rgb(0 0 0 / 0.36);
|
|
3029
3117
|
|
|
3030
3118
|
}
|
|
3031
3119
|
|
|
@@ -4214,8 +4302,10 @@
|
|
|
4214
4302
|
font-family: var(--bh-font-family);
|
|
4215
4303
|
font-size: var(--bh-text-base-font-size);
|
|
4216
4304
|
font-weight: var(--bh-text-base-font-weight);
|
|
4305
|
+
-webkit-font-smoothing: antialiased;
|
|
4217
4306
|
letter-spacing: var(--bh-text-base-letter-spacing);
|
|
4218
4307
|
line-height: var(--bh-text-base-line-height);
|
|
4308
|
+
-moz-osx-font-smoothing: grayscale;
|
|
4219
4309
|
}
|
|
4220
4310
|
}
|
|
4221
4311
|
|