banhaten 0.1.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/LICENSE +21 -0
- package/README.md +361 -0
- package/banhaten.config.example.json +13 -0
- package/package.json +59 -0
- package/registry/assets/activity-feed-avatar.png +0 -0
- package/registry/assets/avatars/avatar-01.jpg +0 -0
- package/registry/assets/avatars/avatar-02.jpg +0 -0
- package/registry/assets/avatars/avatar-03.jpg +0 -0
- package/registry/assets/avatars/avatar-04.jpg +0 -0
- package/registry/assets/avatars/avatar-05.jpg +0 -0
- package/registry/assets/avatars/avatar-06.jpg +0 -0
- package/registry/assets/avatars/avatar-07.jpg +0 -0
- package/registry/assets/avatars/avatar-08.jpg +0 -0
- package/registry/assets/avatars/avatar-09.jpg +0 -0
- package/registry/assets/avatars/avatar-10.jpg +0 -0
- package/registry/assets/avatars/avatar-11.jpg +0 -0
- package/registry/assets/avatars/avatar-12.jpg +0 -0
- package/registry/assets/avatars/avatar-13.jpg +0 -0
- package/registry/assets/avatars/avatar-14.jpg +0 -0
- package/registry/assets/avatars/avatar-15.jpg +0 -0
- package/registry/assets/avatars/avatar-16.jpg +0 -0
- package/registry/assets/avatars/avatar-17.jpg +0 -0
- package/registry/assets/avatars/avatar-18.jpg +0 -0
- package/registry/assets/avatars/avatar-19.jpg +0 -0
- package/registry/assets/avatars/avatar-20.jpg +0 -0
- package/registry/assets/avatars/avatar-21.jpg +0 -0
- package/registry/assets/avatars/avatar-22.jpg +0 -0
- package/registry/assets/avatars/avatar-23.jpg +0 -0
- package/registry/assets/avatars/avatar-24.jpg +0 -0
- package/registry/assets/avatars/avatar-25.jpg +0 -0
- package/registry/assets/avatars/avatar-26.jpg +0 -0
- package/registry/assets/avatars/avatar-27.jpg +0 -0
- package/registry/assets/avatars/avatar-28.jpg +0 -0
- package/registry/assets/avatars/avatar-29.jpg +0 -0
- package/registry/assets/avatars/avatar-30.jpg +0 -0
- package/registry/assets/avatars/avatar-31.jpg +0 -0
- package/registry/assets/avatars/avatar-32.jpg +0 -0
- package/registry/assets/avatars/avatar-33.jpg +0 -0
- package/registry/assets/avatars/avatar-34.jpg +0 -0
- package/registry/assets/avatars/avatar-35.jpg +0 -0
- package/registry/assets/image-assets.json +744 -0
- package/registry/assets/images/art-01.jpg +0 -0
- package/registry/assets/images/art-02.jpg +0 -0
- package/registry/assets/images/art-03.jpg +0 -0
- package/registry/assets/images/art-04.jpg +0 -0
- package/registry/assets/images/art-05.jpg +0 -0
- package/registry/assets/images/art-06.jpg +0 -0
- package/registry/assets/images/art-07.jpg +0 -0
- package/registry/assets/images/art-08.jpg +0 -0
- package/registry/assets/images/art-09.jpg +0 -0
- package/registry/assets/images/art-10.jpg +0 -0
- package/registry/assets/images/art-11.jpg +0 -0
- package/registry/assets/images/art-12.jpg +0 -0
- package/registry/assets/images/art-13.jpg +0 -0
- package/registry/assets/images/art-14.jpg +0 -0
- package/registry/assets/images/art-15.jpg +0 -0
- package/registry/assets/images/art-16.jpg +0 -0
- package/registry/assets/images/art-17.jpg +0 -0
- package/registry/assets/images/art-18.jpg +0 -0
- package/registry/assets/images/art-19.jpg +0 -0
- package/registry/assets/images/art-20.jpg +0 -0
- package/registry/assets/images/art-21.jpg +0 -0
- package/registry/assets/images/art-22.jpg +0 -0
- package/registry/assets/images/art-23.jpg +0 -0
- package/registry/assets/images/art-24.jpg +0 -0
- package/registry/assets/images/art-25.jpg +0 -0
- package/registry/assets/images/art-26.jpg +0 -0
- package/registry/assets/images/art-27.jpg +0 -0
- package/registry/assets/images/nature-01.jpg +0 -0
- package/registry/assets/images/nature-02.jpg +0 -0
- package/registry/assets/images/nature-03.jpg +0 -0
- package/registry/assets/images/nature-04.jpg +0 -0
- package/registry/assets/images/nature-05.jpg +0 -0
- package/registry/assets/images/nature-06.jpg +0 -0
- package/registry/assets/images/nature-07.jpg +0 -0
- package/registry/assets/images/nature-08.jpg +0 -0
- package/registry/assets/images/nature-09.jpg +0 -0
- package/registry/assets/images/nature-10.jpg +0 -0
- package/registry/assets/images/nature-11.jpg +0 -0
- package/registry/assets/images/nature-12.jpg +0 -0
- package/registry/assets/images/nature-13.jpg +0 -0
- package/registry/assets/images/nature-14.jpg +0 -0
- package/registry/assets/images/nature-15.jpg +0 -0
- package/registry/assets/images/nature-16.jpg +0 -0
- package/registry/assets/images/nature-17.jpg +0 -0
- package/registry/assets/images/nature-18.jpg +0 -0
- package/registry/assets/images/nature-19.jpg +0 -0
- package/registry/assets/images/nature-20.jpg +0 -0
- package/registry/components/accordion.tsx +119 -0
- package/registry/components/alert.tsx +282 -0
- package/registry/components/attribute.tsx +452 -0
- package/registry/components/avatar.tsx +142 -0
- package/registry/components/badge.tsx +567 -0
- package/registry/components/button-group.tsx +246 -0
- package/registry/components/button.tsx +102 -0
- package/registry/components/card.tsx +613 -0
- package/registry/components/checkbox.tsx +244 -0
- package/registry/components/date-picker.tsx +1143 -0
- package/registry/components/divider.tsx +82 -0
- package/registry/components/expanded/ActivityFeed.tsx +226 -0
- package/registry/components/expanded/Banner.tsx +145 -0
- package/registry/components/expanded/BannerBoard.tsx +225 -0
- package/registry/components/expanded/Breadcrumbs.tsx +156 -0
- package/registry/components/expanded/CatalogComponentsShowcase.tsx +211 -0
- package/registry/components/expanded/CatalogDivider.tsx +48 -0
- package/registry/components/expanded/CatalogTag.tsx +92 -0
- package/registry/components/expanded/CommandBar.tsx +406 -0
- package/registry/components/expanded/FileUpload.tsx +231 -0
- package/registry/components/expanded/IconExplorer.tsx +612 -0
- package/registry/components/expanded/OnboardingStepListItem.tsx +67 -0
- package/registry/components/expanded/PageHeader.tsx +184 -0
- package/registry/components/expanded/Slideout.tsx +514 -0
- package/registry/components/expanded/Steps.tsx +266 -0
- package/registry/components/expanded/Table.tsx +1014 -0
- package/registry/components/expanded/Tabs.tsx +86 -0
- package/registry/components/expanded/Timeline.tsx +235 -0
- package/registry/components/expanded/TimelineShowcase.tsx +158 -0
- package/registry/components/expanded/activityFeed.css +292 -0
- package/registry/components/expanded/banner.css +312 -0
- package/registry/components/expanded/breadcrumbs.css +140 -0
- package/registry/components/expanded/catalogComponentsShowcase.css +87 -0
- package/registry/components/expanded/commandBar.css +473 -0
- package/registry/components/expanded/divider.css +75 -0
- package/registry/components/expanded/fileUpload.css +228 -0
- package/registry/components/expanded/iconExplorer.css +764 -0
- package/registry/components/expanded/iconPacks.ts +866 -0
- package/registry/components/expanded/onboardingStepListItem.css +126 -0
- package/registry/components/expanded/pageHeader.css +287 -0
- package/registry/components/expanded/slideout.css +955 -0
- package/registry/components/expanded/steps.css +329 -0
- package/registry/components/expanded/table.css +607 -0
- package/registry/components/expanded/tabs.css +197 -0
- package/registry/components/expanded/tag.css +148 -0
- package/registry/components/expanded/timeline.css +282 -0
- package/registry/components/input-content.ts +106 -0
- package/registry/components/input.tsx +866 -0
- package/registry/components/menu.tsx +758 -0
- package/registry/components/modal.tsx +799 -0
- package/registry/components/pagination.tsx +543 -0
- package/registry/components/progress-slider.tsx +216 -0
- package/registry/components/progress.tsx +367 -0
- package/registry/components/radio-card.tsx +654 -0
- package/registry/components/radio-group.tsx +570 -0
- package/registry/components/select-content.tsx +313 -0
- package/registry/components/select.tsx +871 -0
- package/registry/components/slider.tsx +380 -0
- package/registry/components/social-button.tsx +360 -0
- package/registry/components/spinner.tsx +31 -0
- package/registry/components/tag.tsx +423 -0
- package/registry/components/textarea.tsx +625 -0
- package/registry/components/toggle.tsx +272 -0
- package/registry/components/toolbar.tsx +467 -0
- package/registry/components/tooltip.tsx +427 -0
- package/registry/examples/accordion-demo.tsx +34 -0
- package/registry/examples/alert-demo.tsx +14 -0
- package/registry/examples/attribute-demo.tsx +65 -0
- package/registry/examples/avatar-demo.tsx +74 -0
- package/registry/examples/badge-demo.tsx +53 -0
- package/registry/examples/button-demo.tsx +83 -0
- package/registry/examples/button-group-demo.tsx +42 -0
- package/registry/examples/card-demo.tsx +48 -0
- package/registry/examples/checkbox-demo.tsx +67 -0
- package/registry/examples/date-picker-demo.tsx +74 -0
- package/registry/examples/divider-demo.tsx +17 -0
- package/registry/examples/expanded/activity-feed-demo.tsx +22 -0
- package/registry/examples/expanded/banner-demo.tsx +23 -0
- package/registry/examples/expanded/catalog-components-demo.tsx +5 -0
- package/registry/examples/expanded/command-bar-demo.tsx +10 -0
- package/registry/examples/expanded/icons-demo.tsx +5 -0
- package/registry/examples/expanded/onboarding-step-demo.tsx +11 -0
- package/registry/examples/expanded/page-header-demo.tsx +19 -0
- package/registry/examples/expanded/slideout-demo.tsx +15 -0
- package/registry/examples/expanded/steps-demo.tsx +18 -0
- package/registry/examples/expanded/tabs-demo.tsx +13 -0
- package/registry/examples/expanded/timeline-demo.tsx +18 -0
- package/registry/examples/input-demo.tsx +87 -0
- package/registry/examples/menu-demo.tsx +109 -0
- package/registry/examples/modal-demo.tsx +16 -0
- package/registry/examples/pagination-demo.tsx +17 -0
- package/registry/examples/progress-demo.tsx +37 -0
- package/registry/examples/progress-slider-demo.tsx +29 -0
- package/registry/examples/radio-card-demo.tsx +51 -0
- package/registry/examples/radio-group-demo.tsx +62 -0
- package/registry/examples/select-demo.tsx +73 -0
- package/registry/examples/slider-demo.tsx +31 -0
- package/registry/examples/social-button-demo.tsx +51 -0
- package/registry/examples/tag-demo.tsx +29 -0
- package/registry/examples/textarea-demo.tsx +79 -0
- package/registry/examples/toggle-demo.tsx +59 -0
- package/registry/examples/toolbar-demo.tsx +80 -0
- package/registry/examples/tooltip-demo.tsx +115 -0
- package/registry/hooks/use-direction.ts +27 -0
- package/registry/index.json +1213 -0
- package/registry/styles/globals.css +4600 -0
- package/registry/utils/cn.ts +6 -0
- package/src/cli/index.js +826 -0
- package/tokens/Color mode.zip +0 -0
- package/tokens/Numbers.zip +0 -0
- package/tokens/Radius.zip +0 -0
- package/tokens/Theme.zip +0 -0
- package/tokens/banhaten.tokens.json +5525 -0
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Banner,
|
|
3
|
+
type BannerColor,
|
|
4
|
+
type BannerContent,
|
|
5
|
+
type BannerDirection,
|
|
6
|
+
type BannerSize,
|
|
7
|
+
type BannerType,
|
|
8
|
+
} from "./Banner";
|
|
9
|
+
|
|
10
|
+
type BannerSpec = {
|
|
11
|
+
id: string;
|
|
12
|
+
name: string;
|
|
13
|
+
x: number;
|
|
14
|
+
y: number;
|
|
15
|
+
width: number;
|
|
16
|
+
height: number;
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
type ParsedBannerSpec = BannerSpec & {
|
|
20
|
+
color: BannerColor;
|
|
21
|
+
content: BannerContent;
|
|
22
|
+
dir: BannerDirection;
|
|
23
|
+
size: BannerSize;
|
|
24
|
+
type: BannerType;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
const figmaTypeToProp: Record<string, BannerType> = {
|
|
28
|
+
Slim: "slim",
|
|
29
|
+
"Single action inline": "single-action-inline",
|
|
30
|
+
"Single action": "single-action",
|
|
31
|
+
Input: "input",
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
const figmaSizeToProp: Record<string, BannerSize> = {
|
|
35
|
+
Floating: "floating",
|
|
36
|
+
"Full width": "full-width",
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const figmaContentToProp: Record<string, BannerContent> = {
|
|
40
|
+
Title: "title",
|
|
41
|
+
"Title + Description": "title-description",
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
const figmaColorToProp: Record<string, BannerColor> = {
|
|
45
|
+
Brand: "brand",
|
|
46
|
+
Grey: "grey",
|
|
47
|
+
"Brand Light": "brand-light",
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
const bannerSpecs: BannerSpec[] = [
|
|
51
|
+
{ id: "237:39514", name: "type=Single action, Size=Full width, Content=Title, color=Brand, RTL=False", x: 1475, y: 377, width: 1440, height: 60 },
|
|
52
|
+
{ id: "237:39521", name: "type=Single action, Size=Full width, Content=Title, color=Grey, RTL=False", x: 1475, y: 1144.8330078125, width: 1440, height: 60 },
|
|
53
|
+
{ id: "237:39528", name: "type=Single action, Size=Full width, Content=Title, color=Brand Light, RTL=False", x: 1475, y: 1964.8330078125, width: 1440, height: 60 },
|
|
54
|
+
{ id: "237:39543", name: "type=Single action, Size=Full width, Content=Title + Description, color=Grey, RTL=False", x: 1475, y: 1228.8330078125, width: 1440, height: 60 },
|
|
55
|
+
{ id: "237:39553", name: "type=Single action, Size=Full width, Content=Title + Description, color=Brand Light, RTL=False", x: 1475, y: 2048.8330078125, width: 1440, height: 60 },
|
|
56
|
+
{ id: "237:39574", name: "type=Input, Size=Full width, Content=Title, color=Brand, RTL=False", x: 1475, y: 566, width: 1440, height: 60 },
|
|
57
|
+
{ id: "237:39583", name: "type=Input, Size=Full width, Content=Title + Description, color=Brand, RTL=False", x: 1475, y: 644, width: 1440, height: 60 },
|
|
58
|
+
{ id: "237:39595", name: "type=Input, Size=Full width, Content=Title, color=Grey, RTL=False", x: 1475, y: 1341.8330078125, width: 1440, height: 60 },
|
|
59
|
+
{ id: "237:39604", name: "type=Input, Size=Full width, Content=Title, color=Brand Light, RTL=False", x: 1475, y: 2161.8330078125, width: 1440, height: 60 },
|
|
60
|
+
{ id: "237:39623", name: "type=Input, Size=Full width, Content=Title + Description, color=Grey, RTL=False", x: 1475, y: 1416.999755859375, width: 1440, height: 60 },
|
|
61
|
+
{ id: "237:39635", name: "type=Input, Size=Full width, Content=Title + Description, color=Brand Light, RTL=False", x: 1475, y: 2236.999755859375, width: 1440, height: 60 },
|
|
62
|
+
{ id: "237:39660", name: "type=Slim, Size=Full width, Content=Title, color=Brand, RTL=False", x: 1475, y: 63, width: 1440, height: 48 },
|
|
63
|
+
{ id: "237:39666", name: "type=Slim, Size=Full width, Content=Title, color=Grey, RTL=False", x: 1475, y: 806.5, width: 1440, height: 48 },
|
|
64
|
+
{ id: "237:39672", name: "type=Slim, Size=Full width, Content=Title, color=Brand Light, RTL=False", x: 1475, y: 1617.3330078125, width: 1440, height: 48 },
|
|
65
|
+
{ id: "237:39685", name: "type=Slim, Size=Full width, Content=Title + Description, color=Grey, RTL=False", x: 1475, y: 884.5, width: 1440, height: 52 },
|
|
66
|
+
{ id: "237:39694", name: "type=Slim, Size=Full width, Content=Title + Description, color=Brand Light, RTL=False", x: 1475, y: 1695.3330078125, width: 1440, height: 52 },
|
|
67
|
+
{ id: "237:39713", name: "type=Single action, Size=Floating, Content=Title, color=Brand, RTL=False", x: 69, y: 377, width: 1217, height: 60 },
|
|
68
|
+
{ id: "237:39720", name: "type=Single action, Size=Floating, Content=Title + Description, color=Brand, RTL=False", x: 69, y: 458, width: 1217, height: 60 },
|
|
69
|
+
{ id: "237:39730", name: "type=Single action, Size=Full width, Content=Title + Description, color=Brand, RTL=False", x: 1475, y: 458, width: 1440, height: 60 },
|
|
70
|
+
{ id: "237:39740", name: "type=Single action, Size=Floating, Content=Title, color=Grey, RTL=False", x: 69, y: 1144.8330078125, width: 1217, height: 64 },
|
|
71
|
+
{ id: "237:39747", name: "type=Single action, Size=Floating, Content=Title, color=Brand Light, RTL=False", x: 69, y: 1964.8330078125, width: 1217, height: 60 },
|
|
72
|
+
{ id: "237:39762", name: "type=Single action, Size=Floating, Content=Title + Description, color=Grey, RTL=False", x: 69, y: 1228.8330078125, width: 1217, height: 64 },
|
|
73
|
+
{ id: "237:39772", name: "type=Single action, Size=Floating, Content=Title + Description, color=Brand Light, RTL=False", x: 69, y: 2048.8330078125, width: 1217, height: 60 },
|
|
74
|
+
{ id: "237:39793", name: "type=Slim, Size=Floating, Content=Title, color=Brand, RTL=False", x: 69, y: 63, width: 1217, height: 48 },
|
|
75
|
+
{ id: "237:39799", name: "type=Single action inline, Size=Floating, Content=Title, color=Brand, RTL=False", x: 69, y: 210, width: 1217, height: 60 },
|
|
76
|
+
{ id: "237:39805", name: "type=Single action inline, Size=Floating, Content=Title, color=Grey, RTL=False", x: 69, y: 973.41650390625, width: 1217, height: 60 },
|
|
77
|
+
{ id: "237:39811", name: "type=Single action inline, Size=Floating, Content=Title, color=Brand Light, RTL=False", x: 69, y: 1784.25, width: 1217, height: 60 },
|
|
78
|
+
{ id: "237:39824", name: "type=Single action inline, Size=Full width, Content=Title, color=Brand, RTL=False", x: 1475, y: 210, width: 1440, height: 60 },
|
|
79
|
+
{ id: "237:39830", name: "type=Single action inline, Size=Full width, Content=Title, color=Grey, RTL=False", x: 1475, y: 973.41650390625, width: 1440, height: 60 },
|
|
80
|
+
{ id: "237:39836", name: "type=Single action inline, Size=Full width, Content=Title, color=Brand Light, RTL=False", x: 1475, y: 1784.25, width: 1440, height: 60 },
|
|
81
|
+
{ id: "237:39849", name: "type=Single action inline, Size=Floating, Content=Title, color=Brand, RTL=True", x: 3119, y: 210, width: 1217, height: 60 },
|
|
82
|
+
{ id: "237:39855", name: "type=Single action inline, Size=Floating, Content=Title, color=Grey, RTL=True", x: 3119, y: 972.249755859375, width: 1217, height: 60 },
|
|
83
|
+
{ id: "237:39861", name: "type=Single action inline, Size=Floating, Content=Title, color=Brand Light, RTL=True", x: 3119, y: 1784.25, width: 1217, height: 60 },
|
|
84
|
+
{ id: "237:39874", name: "type=Single action inline, Size=Full width, Content=Title, color=Brand, RTL=True", x: 4525, y: 210, width: 1440, height: 60 },
|
|
85
|
+
{ id: "237:39880", name: "type=Single action inline, Size=Full width, Content=Title, color=Grey, RTL=True", x: 4525, y: 972.249755859375, width: 1440, height: 60 },
|
|
86
|
+
{ id: "237:39886", name: "type=Single action inline, Size=Full width, Content=Title, color=Brand Light, RTL=True", x: 4525, y: 1784.25, width: 1440, height: 60 },
|
|
87
|
+
{ id: "237:39899", name: "type=Slim, Size=Floating, Content=Title + Description, color=Brand, RTL=False", x: 69, y: 134, width: 1217, height: 52 },
|
|
88
|
+
{ id: "237:39908", name: "type=Single action inline, Size=Floating, Content=Title + Description, color=Brand, RTL=False", x: 69, y: 291, width: 1217, height: 60 },
|
|
89
|
+
{ id: "237:39917", name: "type=Single action inline, Size=Floating, Content=Title + Description, color=Grey, RTL=False", x: 69, y: 1054.41650390625, width: 1217, height: 60 },
|
|
90
|
+
{ id: "237:39926", name: "type=Single action inline, Size=Floating, Content=Title + Description, color=Brand Light, RTL=False", x: 69, y: 1865.25, width: 1217, height: 60 },
|
|
91
|
+
{ id: "237:39945", name: "type=Single action inline, Size=Full width, Content=Title + Description, color=Brand, RTL=False", x: 1475, y: 291, width: 1440, height: 60 },
|
|
92
|
+
{ id: "237:39954", name: "type=Single action inline, Size=Full width, Content=Title + Description, color=Grey, RTL=False", x: 1475, y: 1054.41650390625, width: 1440, height: 60 },
|
|
93
|
+
{ id: "237:39963", name: "type=Single action inline, Size=Full width, Content=Title + Description, color=Brand Light, RTL=False", x: 1475, y: 1865.25, width: 1440, height: 60 },
|
|
94
|
+
{ id: "237:39982", name: "type=Single action inline, Size=Floating, Content=Title + Description, color=Brand, RTL=True", x: 3119, y: 291, width: 1217, height: 60 },
|
|
95
|
+
{ id: "237:39991", name: "type=Single action inline, Size=Floating, Content=Title + Description, color=Grey, RTL=True", x: 3119, y: 1053.249755859375, width: 1217, height: 60 },
|
|
96
|
+
{ id: "237:40000", name: "type=Single action inline, Size=Floating, Content=Title + Description, color=Brand Light, RTL=True", x: 3119, y: 1865.25, width: 1217, height: 60 },
|
|
97
|
+
{ id: "237:40019", name: "type=Single action inline, Size=Full width, Content=Title + Description, color=Brand, RTL=True", x: 4525, y: 291, width: 1440, height: 60 },
|
|
98
|
+
{ id: "237:40028", name: "type=Single action inline, Size=Full width, Content=Title + Description, color=Grey, RTL=True", x: 4525, y: 1053.249755859375, width: 1440, height: 60 },
|
|
99
|
+
{ id: "237:40037", name: "type=Single action inline, Size=Full width, Content=Title + Description, color=Brand Light, RTL=True", x: 4525, y: 1865.25, width: 1440, height: 60 },
|
|
100
|
+
{ id: "237:40056", name: "type=Slim, Size=Floating, Content=Title + Description, color=Brand, RTL=True", x: 3119, y: 134, width: 1217, height: 52 },
|
|
101
|
+
{ id: "237:40065", name: "type=Slim, Size=Full width, Content=Title + Description, color=Brand, RTL=False", x: 1475, y: 134, width: 1440, height: 52 },
|
|
102
|
+
{ id: "237:40074", name: "type=Slim, Size=Full width, Content=Title + Description, color=Brand, RTL=True", x: 4525, y: 134, width: 1440, height: 52 },
|
|
103
|
+
{ id: "237:40083", name: "type=Slim, Size=Floating, Content=Title, color=Grey, RTL=False", x: 69, y: 820.5, width: 1217, height: 48 },
|
|
104
|
+
{ id: "237:40089", name: "type=Slim, Size=Floating, Content=Title, color=Brand Light, RTL=False", x: 69, y: 1631.3330078125, width: 1217, height: 48 },
|
|
105
|
+
{ id: "237:40103", name: "type=Slim, Size=Floating, Content=Title + Description, color=Grey, RTL=False", x: 69, y: 892.5, width: 1217, height: 52 },
|
|
106
|
+
{ id: "237:40112", name: "type=Slim, Size=Floating, Content=Title + Description, color=Brand Light, RTL=False", x: 69, y: 1703.3330078125, width: 1217, height: 52 },
|
|
107
|
+
{ id: "237:40132", name: "type=Input, Size=Floating, Content=Title, color=Brand, RTL=False", x: 69, y: 558, width: 1217, height: 60 },
|
|
108
|
+
{ id: "237:40141", name: "type=Input, Size=Floating, Content=Title + Description, color=Brand, RTL=False", x: 69, y: 639, width: 1217, height: 60 },
|
|
109
|
+
{ id: "237:40153", name: "type=Input, Size=Floating, Content=Title, color=Grey, RTL=False", x: 69, y: 1341.8330078125, width: 1217, height: 60 },
|
|
110
|
+
{ id: "237:40162", name: "type=Input, Size=Floating, Content=Title, color=Brand Light, RTL=False", x: 69, y: 2161.8330078125, width: 1217, height: 60 },
|
|
111
|
+
{ id: "237:40181", name: "type=Input, Size=Floating, Content=Title + Description, color=Grey, RTL=False", x: 69, y: 1422.8330078125, width: 1217, height: 60 },
|
|
112
|
+
{ id: "237:40193", name: "type=Input, Size=Floating, Content=Title + Description, color=Brand Light, RTL=False", x: 69, y: 2242.8330078125, width: 1217, height: 60 },
|
|
113
|
+
{ id: "237:40218", name: "type=Single action, Size=Full width, Content=Title, color=Brand, RTL=True", x: 4525, y: 369.1666259765625, width: 1440, height: 60 },
|
|
114
|
+
{ id: "237:40225", name: "type=Single action, Size=Full width, Content=Title + Description, color=Brand, RTL=True", x: 4525, y: 450.1666259765625, width: 1440, height: 60 },
|
|
115
|
+
{ id: "237:40235", name: "type=Single action, Size=Full width, Content=Title, color=Grey, RTL=True", x: 4525, y: 1141.8330078125, width: 1440, height: 60 },
|
|
116
|
+
{ id: "237:40242", name: "type=Single action, Size=Full width, Content=Title, color=Brand Light, RTL=True", x: 4525, y: 1961.8330078125, width: 1440, height: 60 },
|
|
117
|
+
{ id: "237:40257", name: "type=Single action, Size=Full width, Content=Title + Description, color=Grey, RTL=True", x: 4525, y: 1217.8330078125, width: 1440, height: 60 },
|
|
118
|
+
{ id: "237:40267", name: "type=Single action, Size=Full width, Content=Title + Description, color=Brand Light, RTL=True", x: 4525, y: 2037.8330078125, width: 1440, height: 60 },
|
|
119
|
+
{ id: "237:40288", name: "type=Input, Size=Full width, Content=Title, color=Brand, RTL=True", x: 4525, y: 550, width: 1440, height: 60 },
|
|
120
|
+
{ id: "237:40297", name: "type=Input, Size=Full width, Content=Title + Description, color=Brand, RTL=True", x: 4525, y: 628, width: 1440, height: 60 },
|
|
121
|
+
{ id: "237:40309", name: "type=Input, Size=Full width, Content=Title, color=Grey, RTL=True", x: 4525, y: 1340.8330078125, width: 1440, height: 60 },
|
|
122
|
+
{ id: "237:40318", name: "type=Input, Size=Full width, Content=Title, color=Brand Light, RTL=True", x: 4525, y: 2160.8330078125, width: 1440, height: 60 },
|
|
123
|
+
{ id: "237:40337", name: "type=Input, Size=Full width, Content=Title + Description, color=Grey, RTL=True", x: 4525, y: 1422.8330078125, width: 1440, height: 60 },
|
|
124
|
+
{ id: "237:40349", name: "type=Input, Size=Full width, Content=Title + Description, color=Brand Light, RTL=True", x: 4525, y: 2242.8330078125, width: 1440, height: 60 },
|
|
125
|
+
{ id: "237:40374", name: "type=Slim, Size=Full width, Content=Title, color=Brand, RTL=True", x: 4525, y: 63, width: 1440, height: 48 },
|
|
126
|
+
{ id: "237:40380", name: "type=Slim, Size=Full width, Content=Title, color=Grey, RTL=True", x: 4525, y: 786.5, width: 1440, height: 48 },
|
|
127
|
+
{ id: "237:40386", name: "type=Slim, Size=Full width, Content=Title, color=Brand Light, RTL=True", x: 4525, y: 1597.3330078125, width: 1440, height: 48 },
|
|
128
|
+
{ id: "237:40399", name: "type=Slim, Size=Full width, Content=Title + Description, color=Grey, RTL=True", x: 4525, y: 874.3330078125, width: 1440, height: 52 },
|
|
129
|
+
{ id: "237:40408", name: "type=Slim, Size=Full width, Content=Title + Description, color=Brand Light, RTL=True", x: 4525, y: 1685.166015625, width: 1440, height: 52 },
|
|
130
|
+
{ id: "237:40427", name: "type=Single action, Size=Floating, Content=Title, color=Brand, RTL=True", x: 3119, y: 369.1666259765625, width: 1217, height: 60 },
|
|
131
|
+
{ id: "237:40434", name: "type=Single action, Size=Floating, Content=Title + Description, color=Brand, RTL=True", x: 3119, y: 450.1666259765625, width: 1217, height: 60 },
|
|
132
|
+
{ id: "237:40444", name: "type=Single action, Size=Floating, Content=Title, color=Grey, RTL=True", x: 3119, y: 1142.8330078125, width: 1217, height: 60 },
|
|
133
|
+
{ id: "237:40451", name: "type=Single action, Size=Floating, Content=Title, color=Brand Light, RTL=True", x: 3119, y: 1962.8330078125, width: 1217, height: 60 },
|
|
134
|
+
{ id: "237:40466", name: "type=Single action, Size=Floating, Content=Title + Description, color=Grey, RTL=True", x: 3119, y: 1225.8330078125, width: 1217, height: 60 },
|
|
135
|
+
{ id: "237:40476", name: "type=Single action, Size=Floating, Content=Title + Description, color=Brand Light, RTL=True", x: 3119, y: 2045.8330078125, width: 1217, height: 60 },
|
|
136
|
+
{ id: "237:40497", name: "type=Slim, Size=Floating, Content=Title, color=Brand, RTL=True", x: 3119, y: 63, width: 1217, height: 48 },
|
|
137
|
+
{ id: "237:40503", name: "type=Slim, Size=Floating, Content=Title, color=Grey, RTL=True", x: 3119, y: 798.5, width: 1217, height: 48 },
|
|
138
|
+
{ id: "237:40509", name: "type=Slim, Size=Floating, Content=Title, color=Brand Light, RTL=True", x: 3119, y: 1609.3330078125, width: 1217, height: 48 },
|
|
139
|
+
{ id: "237:40523", name: "type=Slim, Size=Floating, Content=Title + Description, color=Grey, RTL=True", x: 3119, y: 874.5, width: 1217, height: 52 },
|
|
140
|
+
{ id: "237:40532", name: "type=Slim, Size=Floating, Content=Title + Description, color=Brand Light, RTL=True", x: 3119, y: 1685.3330078125, width: 1217, height: 52 },
|
|
141
|
+
{ id: "237:40552", name: "type=Input, Size=Floating, Content=Title, color=Brand, RTL=True", x: 3119, y: 560, width: 1217, height: 60 },
|
|
142
|
+
{ id: "237:40561", name: "type=Input, Size=Floating, Content=Title + Description, color=Brand, RTL=True", x: 3119, y: 636, width: 1217, height: 60 },
|
|
143
|
+
{ id: "237:40573", name: "type=Input, Size=Floating, Content=Title, color=Grey, RTL=True", x: 3119, y: 1337.8330078125, width: 1217, height: 60 },
|
|
144
|
+
{ id: "237:40582", name: "type=Input, Size=Floating, Content=Title, color=Brand Light, RTL=True", x: 3119, y: 2157.8330078125, width: 1217, height: 60 },
|
|
145
|
+
{ id: "237:40601", name: "type=Input, Size=Floating, Content=Title + Description, color=Grey, RTL=True", x: 3119, y: 1417, width: 1217, height: 60 },
|
|
146
|
+
{ id: "237:40613", name: "type=Input, Size=Floating, Content=Title + Description, color=Brand Light, RTL=True", x: 3119, y: 2237, width: 1217, height: 60 },
|
|
147
|
+
];
|
|
148
|
+
|
|
149
|
+
function getField(name: string, field: string) {
|
|
150
|
+
const match = name.match(new RegExp(`${field}=([^,]+)`));
|
|
151
|
+
if (!match) throw new Error(`Missing ${field} in ${name}`);
|
|
152
|
+
return match[1];
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
function parseBannerSpec(spec: BannerSpec): ParsedBannerSpec {
|
|
156
|
+
const type = figmaTypeToProp[getField(spec.name, "type")];
|
|
157
|
+
const size = figmaSizeToProp[getField(spec.name, "Size")];
|
|
158
|
+
const content = figmaContentToProp[getField(spec.name, "Content")];
|
|
159
|
+
const color = figmaColorToProp[getField(spec.name, "color")];
|
|
160
|
+
|
|
161
|
+
if (!type || !size || !content || !color) {
|
|
162
|
+
throw new Error(`Unsupported Banner variant: ${spec.name}`);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
return {
|
|
166
|
+
...spec,
|
|
167
|
+
color,
|
|
168
|
+
content,
|
|
169
|
+
dir: getField(spec.name, "RTL") === "True" ? "rtl" : "ltr",
|
|
170
|
+
size,
|
|
171
|
+
type,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
const parsedBannerSpecs = bannerSpecs.map(parseBannerSpec);
|
|
176
|
+
|
|
177
|
+
function getBannerDemoCopy(dir: BannerDirection) {
|
|
178
|
+
const rtl = dir === "rtl";
|
|
179
|
+
|
|
180
|
+
return {
|
|
181
|
+
actionLabel: rtl ? "\u062a\u0637\u0628\u064a\u0642" : "Button",
|
|
182
|
+
closeLabel: rtl ? "\u0625\u063a\u0644\u0627\u0642" : "Dismiss banner",
|
|
183
|
+
description: rtl
|
|
184
|
+
? "\u0627\u0643\u062a\u0634\u0641 \u0622\u062e\u0631 \u0627\u0644\u062a\u062d\u062f\u064a\u062b\u0627\u062a \u0641\u064a \u0625\u0635\u062f\u0627\u0631\u0646\u0627 \u0627\u0644\u062c\u062f\u064a\u062f"
|
|
185
|
+
: "Discover the Latest Updates in Our New Release",
|
|
186
|
+
inputAriaLabel: rtl ? "\u062d\u0642\u0644 \u0627\u0644\u0628\u0627\u0646\u0631" : "Banner input",
|
|
187
|
+
inputPlaceholder: rtl ? "\u0627\u0644\u0646\u0635" : "Placeholder",
|
|
188
|
+
linkLabel: rtl ? "\u0627\u0644\u0631\u0627\u0628\u0637" : "Link button",
|
|
189
|
+
title: rtl ? "\u0623\u062e\u0628\u0627\u0631 \u0645\u0647\u0645\u0629!" : "Big news!",
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
export function BannerBoard() {
|
|
194
|
+
return (
|
|
195
|
+
<section className="banner-page" aria-label="Design system banner implementation">
|
|
196
|
+
<div className="figma-banner-board" aria-label="Figma Banner component matrix">
|
|
197
|
+
{parsedBannerSpecs.map((spec) => (
|
|
198
|
+
<div
|
|
199
|
+
className="figma-board__item figma-board__item--banner"
|
|
200
|
+
data-figma-name={spec.name}
|
|
201
|
+
data-node-id={spec.id}
|
|
202
|
+
key={spec.id}
|
|
203
|
+
style={{
|
|
204
|
+
left: spec.x,
|
|
205
|
+
top: spec.y,
|
|
206
|
+
width: spec.width,
|
|
207
|
+
height: spec.height,
|
|
208
|
+
}}
|
|
209
|
+
>
|
|
210
|
+
<Banner
|
|
211
|
+
{...getBannerDemoCopy(spec.dir)}
|
|
212
|
+
ariaLabel={`${spec.dir.toUpperCase()} ${spec.color} ${spec.type} banner`}
|
|
213
|
+
color={spec.color}
|
|
214
|
+
content={spec.content}
|
|
215
|
+
dir={spec.dir}
|
|
216
|
+
showInlineAction={!(spec.type === "slim" && spec.color === "brand-light")}
|
|
217
|
+
size={spec.size}
|
|
218
|
+
type={spec.type}
|
|
219
|
+
/>
|
|
220
|
+
</div>
|
|
221
|
+
))}
|
|
222
|
+
</div>
|
|
223
|
+
</section>
|
|
224
|
+
);
|
|
225
|
+
}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import "./breadcrumbs.css";
|
|
3
|
+
|
|
4
|
+
export type BreadcrumbSeparator = "slash" | "chevron";
|
|
5
|
+
export type BreadcrumbStyle = "default" | "raised";
|
|
6
|
+
|
|
7
|
+
export type BreadcrumbItem = {
|
|
8
|
+
label: string;
|
|
9
|
+
href?: string;
|
|
10
|
+
icon?: ReactNode;
|
|
11
|
+
current?: boolean;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export type BreadcrumbsProps = {
|
|
15
|
+
"aria-label"?: string;
|
|
16
|
+
dir?: "ltr" | "rtl" | "auto";
|
|
17
|
+
iconOnly?: boolean;
|
|
18
|
+
items: BreadcrumbItem[];
|
|
19
|
+
maxItems?: number;
|
|
20
|
+
overflowLabel?: string;
|
|
21
|
+
separator?: BreadcrumbSeparator;
|
|
22
|
+
style?: BreadcrumbStyle;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
type VisibleBreadcrumbItem = BreadcrumbItem & { overflow?: boolean };
|
|
26
|
+
|
|
27
|
+
function cx(...classes: Array<string | false | undefined>) {
|
|
28
|
+
return classes.filter(Boolean).join(" ");
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function visibleItems(
|
|
32
|
+
items: BreadcrumbItem[],
|
|
33
|
+
maxItems?: number,
|
|
34
|
+
overflowLabel?: string,
|
|
35
|
+
): VisibleBreadcrumbItem[] {
|
|
36
|
+
if (!maxItems || maxItems < 3 || items.length <= maxItems) {
|
|
37
|
+
return items;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const tailCount = maxItems - 2;
|
|
41
|
+
return [items[0], { label: overflowLabel ?? "", overflow: true }, ...items.slice(-tailCount)];
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function Breadcrumbs({
|
|
45
|
+
"aria-label": ariaLabel,
|
|
46
|
+
dir = "ltr",
|
|
47
|
+
iconOnly = false,
|
|
48
|
+
items,
|
|
49
|
+
maxItems,
|
|
50
|
+
overflowLabel,
|
|
51
|
+
separator = "slash",
|
|
52
|
+
style: surfaceStyle = "default",
|
|
53
|
+
}: BreadcrumbsProps) {
|
|
54
|
+
const renderedItems = visibleItems(items, maxItems, overflowLabel);
|
|
55
|
+
|
|
56
|
+
return (
|
|
57
|
+
<nav
|
|
58
|
+
aria-label={ariaLabel}
|
|
59
|
+
className={cx(
|
|
60
|
+
"ds-breadcrumbs",
|
|
61
|
+
`ds-breadcrumbs--${surfaceStyle}`,
|
|
62
|
+
`ds-breadcrumbs--${separator}`,
|
|
63
|
+
iconOnly && "ds-breadcrumbs--icon-only",
|
|
64
|
+
)}
|
|
65
|
+
dir={dir}
|
|
66
|
+
>
|
|
67
|
+
<ol>
|
|
68
|
+
{renderedItems.map((item, index) => {
|
|
69
|
+
const isLast = index === renderedItems.length - 1;
|
|
70
|
+
const isCurrent = item.current || isLast;
|
|
71
|
+
const content = (
|
|
72
|
+
<>
|
|
73
|
+
<span className="ds-breadcrumbs__icon" aria-hidden={item.icon ? "true" : undefined}>
|
|
74
|
+
{item.overflow ? <OverflowIcon /> : item.icon}
|
|
75
|
+
</span>
|
|
76
|
+
<span className={cx("ds-breadcrumbs__label", iconOnly && "ds-breadcrumbs__label--hidden")}>
|
|
77
|
+
{item.label}
|
|
78
|
+
</span>
|
|
79
|
+
</>
|
|
80
|
+
);
|
|
81
|
+
|
|
82
|
+
return (
|
|
83
|
+
<li key={`${item.label}-${index}`}>
|
|
84
|
+
{index > 0 && <Separator separator={separator} />}
|
|
85
|
+
{item.href && !isCurrent && !item.overflow ? (
|
|
86
|
+
<a href={item.href}>{content}</a>
|
|
87
|
+
) : (
|
|
88
|
+
<span aria-current={isCurrent ? "page" : undefined} className={isCurrent ? "is-current" : undefined}>
|
|
89
|
+
{content}
|
|
90
|
+
</span>
|
|
91
|
+
)}
|
|
92
|
+
</li>
|
|
93
|
+
);
|
|
94
|
+
})}
|
|
95
|
+
</ol>
|
|
96
|
+
</nav>
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function Separator({ separator }: { separator: BreadcrumbSeparator }) {
|
|
101
|
+
return (
|
|
102
|
+
<span aria-hidden="true" className="ds-breadcrumbs__separator">
|
|
103
|
+
{separator === "slash" ? "/" : <ChevronIcon />}
|
|
104
|
+
</span>
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export function BreadcrumbHomeIcon() {
|
|
109
|
+
return (
|
|
110
|
+
<svg aria-hidden="true" viewBox="0 0 20 20">
|
|
111
|
+
<path
|
|
112
|
+
d="M3.5 8.7 10 3.4l6.5 5.3v7.1a.9.9 0 0 1-.9.9h-3.2v-4.9H7.6v4.9H4.4a.9.9 0 0 1-.9-.9V8.7Z"
|
|
113
|
+
fill="none"
|
|
114
|
+
stroke="currentColor"
|
|
115
|
+
strokeLinejoin="round"
|
|
116
|
+
strokeWidth="1.7"
|
|
117
|
+
/>
|
|
118
|
+
</svg>
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export function BreadcrumbFolderIcon() {
|
|
123
|
+
return (
|
|
124
|
+
<svg aria-hidden="true" viewBox="0 0 20 20">
|
|
125
|
+
<path
|
|
126
|
+
d="M2.8 5.7c0-.9.7-1.6 1.6-1.6h3.8l1.5 1.8h5.9c.9 0 1.6.7 1.6 1.6v6.8c0 .9-.7 1.6-1.6 1.6H4.4c-.9 0-1.6-.7-1.6-1.6V5.7Z"
|
|
127
|
+
fill="none"
|
|
128
|
+
stroke="currentColor"
|
|
129
|
+
strokeLinejoin="round"
|
|
130
|
+
strokeWidth="1.7"
|
|
131
|
+
/>
|
|
132
|
+
</svg>
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
function ChevronIcon() {
|
|
137
|
+
return (
|
|
138
|
+
<svg aria-hidden="true" viewBox="0 0 16 16">
|
|
139
|
+
<path d="m6 3.5 4 4.5-4 4.5" fill="none" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" strokeWidth="1.6" />
|
|
140
|
+
</svg>
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function OverflowIcon() {
|
|
145
|
+
return (
|
|
146
|
+
<svg aria-hidden="true" viewBox="0 0 20 20">
|
|
147
|
+
<path
|
|
148
|
+
d="M5.2 10h.1M10 10h.1M14.8 10h.1"
|
|
149
|
+
fill="none"
|
|
150
|
+
stroke="currentColor"
|
|
151
|
+
strokeLinecap="round"
|
|
152
|
+
strokeWidth="2.4"
|
|
153
|
+
/>
|
|
154
|
+
</svg>
|
|
155
|
+
);
|
|
156
|
+
}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { useState } from "react";
|
|
2
|
+
import {
|
|
3
|
+
BreadcrumbFolderIcon,
|
|
4
|
+
BreadcrumbHomeIcon,
|
|
5
|
+
Breadcrumbs,
|
|
6
|
+
type BreadcrumbItem,
|
|
7
|
+
} from "./Breadcrumbs";
|
|
8
|
+
import { CatalogContentDivider, CatalogDivider } from "./CatalogDivider";
|
|
9
|
+
import { FileUpload, type FileUploadFile } from "./FileUpload";
|
|
10
|
+
import { Table, type TableColumn, type TableRowBase } from "./Table";
|
|
11
|
+
import { CatalogTag, type CatalogTagState, type CatalogTagType } from "./CatalogTag";
|
|
12
|
+
import "./catalogComponentsShowcase.css";
|
|
13
|
+
|
|
14
|
+
type ProjectRow = TableRowBase & {
|
|
15
|
+
deadline: string;
|
|
16
|
+
leader: string;
|
|
17
|
+
name: string;
|
|
18
|
+
progress: number;
|
|
19
|
+
status: "On track" | "Review" | "Blocked";
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
const breadcrumbItems: BreadcrumbItem[] = [
|
|
23
|
+
{ label: "Home", href: "#", icon: <BreadcrumbHomeIcon /> },
|
|
24
|
+
{ label: "Design system", href: "#", icon: <BreadcrumbFolderIcon /> },
|
|
25
|
+
{ label: "Components", href: "#" },
|
|
26
|
+
{ label: "Playground", current: true },
|
|
27
|
+
];
|
|
28
|
+
|
|
29
|
+
const rtlBreadcrumbItems: BreadcrumbItem[] = [
|
|
30
|
+
{ label: "\u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629", href: "#", icon: <BreadcrumbHomeIcon /> },
|
|
31
|
+
{ label: "\u0627\u0644\u0646\u0638\u0627\u0645", href: "#", icon: <BreadcrumbFolderIcon /> },
|
|
32
|
+
{ label: "\u0627\u0644\u0645\u0643\u0648\u0646\u0627\u062a", current: true },
|
|
33
|
+
];
|
|
34
|
+
|
|
35
|
+
const breadcrumbAriaLabel = "Catalog breadcrumbs";
|
|
36
|
+
const rtlBreadcrumbAriaLabel = "\u0627\u0644\u0645\u0633\u0627\u0631";
|
|
37
|
+
|
|
38
|
+
const uploadFiles: FileUploadFile[] = [
|
|
39
|
+
{ id: "tokens", name: "semantic-tokens.json", sizeLabel: "4 MB", versionLabel: "v3.0", status: "uploaded" },
|
|
40
|
+
{ id: "components", name: "component-inventory.csv", sizeLabel: "18 MB", versionLabel: "v2.4", status: "uploading" },
|
|
41
|
+
{ id: "icons", name: "icons-shortlist.pdf", sizeLabel: "7 MB", status: "error", errorLabel: "Needs retry" },
|
|
42
|
+
];
|
|
43
|
+
|
|
44
|
+
const fileUploadCopy = {
|
|
45
|
+
browseLabel: "Browse",
|
|
46
|
+
helperText: "SVG, PNG, PDF, or CSV up to 50 MB",
|
|
47
|
+
prompt: "Drag and drop files here, or",
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
const projectRows: ProjectRow[] = [
|
|
51
|
+
{ id: "1", name: "Component audit", leader: "Maya Chen", progress: 84, status: "On track", deadline: "Jun 12" },
|
|
52
|
+
{ id: "2", name: "Icon decision", leader: "Ahmed Galal", progress: 64, status: "Review", deadline: "Jun 18" },
|
|
53
|
+
{ id: "3", name: "RTL matrix", leader: "Nora Ali", progress: 38, status: "Blocked", deadline: "Jun 20" },
|
|
54
|
+
{ id: "4", name: "Preset QA", leader: "Sam Rivera", progress: 92, status: "On track", deadline: "Jun 24", state: "disabled" },
|
|
55
|
+
];
|
|
56
|
+
|
|
57
|
+
const columns: TableColumn<ProjectRow>[] = [
|
|
58
|
+
{ id: "select", width: 42, kind: "selection" },
|
|
59
|
+
{
|
|
60
|
+
id: "project",
|
|
61
|
+
header: "Project Name",
|
|
62
|
+
width: "fill",
|
|
63
|
+
minWidth: 230,
|
|
64
|
+
sortable: true,
|
|
65
|
+
item: (row) => ({ type: "text", value: row.name, weight: "medium" }),
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
id: "leader",
|
|
69
|
+
header: "Project Leader",
|
|
70
|
+
width: 190,
|
|
71
|
+
sortable: true,
|
|
72
|
+
item: (row) => ({ type: "avatarText", name: row.leader, caption: "Design ops" }),
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
id: "status",
|
|
76
|
+
header: "Status",
|
|
77
|
+
width: 138,
|
|
78
|
+
sortable: true,
|
|
79
|
+
item: (row) => ({
|
|
80
|
+
type: "badges",
|
|
81
|
+
items: [
|
|
82
|
+
{
|
|
83
|
+
dot: true,
|
|
84
|
+
label: row.status,
|
|
85
|
+
tone: row.status === "On track" ? "success" : row.status === "Review" ? "amber" : "danger",
|
|
86
|
+
},
|
|
87
|
+
],
|
|
88
|
+
}),
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
id: "progress",
|
|
92
|
+
header: "Progress",
|
|
93
|
+
width: 160,
|
|
94
|
+
sortable: true,
|
|
95
|
+
item: (row) => ({ type: "progress", value: row.progress, label: `${row.progress}%` }),
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
id: "deadline",
|
|
99
|
+
header: "Deadline",
|
|
100
|
+
width: 120,
|
|
101
|
+
sortable: true,
|
|
102
|
+
item: (row) => ({ type: "text", value: row.deadline, tone: "subtle" }),
|
|
103
|
+
},
|
|
104
|
+
{ id: "actions", width: 44, kind: "actions", item: () => ({ type: "action", icon: "more", label: "Open row actions" }) },
|
|
105
|
+
];
|
|
106
|
+
|
|
107
|
+
const tagTypes: CatalogTagType[] = ["simple", "dot", "flag", "avatar", "icon"];
|
|
108
|
+
const tagStates: CatalogTagState[] = ["default", "active", "disabled"];
|
|
109
|
+
|
|
110
|
+
export function CatalogComponentsShowcase() {
|
|
111
|
+
const [selectedRows, setSelectedRows] = useState(["1", "2"]);
|
|
112
|
+
|
|
113
|
+
return (
|
|
114
|
+
<div className="catalog-showcase">
|
|
115
|
+
<ShowcaseCard title="Breadcrumbs" description="Default, raised, icon-only, separator, and RTL variants.">
|
|
116
|
+
<div className="catalog-showcase__stack">
|
|
117
|
+
<Breadcrumbs aria-label={breadcrumbAriaLabel} items={breadcrumbItems} overflowLabel="More" />
|
|
118
|
+
<Breadcrumbs aria-label={breadcrumbAriaLabel} items={breadcrumbItems} overflowLabel="More" separator="chevron" style="raised" />
|
|
119
|
+
<Breadcrumbs aria-label={breadcrumbAriaLabel} iconOnly items={breadcrumbItems} overflowLabel="More" separator="chevron" style="raised" />
|
|
120
|
+
<Breadcrumbs
|
|
121
|
+
aria-label={rtlBreadcrumbAriaLabel}
|
|
122
|
+
dir="rtl"
|
|
123
|
+
items={rtlBreadcrumbItems}
|
|
124
|
+
overflowLabel="\u0627\u0644\u0645\u0632\u064a\u062f"
|
|
125
|
+
separator="chevron"
|
|
126
|
+
style="raised"
|
|
127
|
+
/>
|
|
128
|
+
</div>
|
|
129
|
+
</ShowcaseCard>
|
|
130
|
+
|
|
131
|
+
<ShowcaseCard title="Dividers" description="Plain separators plus content dividers with label or action content.">
|
|
132
|
+
<div className="catalog-showcase__stack">
|
|
133
|
+
<CatalogDivider />
|
|
134
|
+
<CatalogDivider borderStyle="dotted" />
|
|
135
|
+
<CatalogContentDivider label="Text" />
|
|
136
|
+
<CatalogContentDivider actionLabel="Button" onAction={() => undefined} />
|
|
137
|
+
<CatalogContentDivider dir="rtl" label="\u0646\u0635" borderStyle="dotted" />
|
|
138
|
+
</div>
|
|
139
|
+
</ShowcaseCard>
|
|
140
|
+
|
|
141
|
+
<ShowcaseCard title="Tags" description="Type, state, size, close button, and RTL coverage.">
|
|
142
|
+
<div className="catalog-showcase__tag-grid">
|
|
143
|
+
{tagTypes.map((type) => (
|
|
144
|
+
<CatalogTag
|
|
145
|
+
closeLabel="Remove tag"
|
|
146
|
+
key={type}
|
|
147
|
+
showCloseButton={type === "simple"}
|
|
148
|
+
type={type}
|
|
149
|
+
avatar={type === "avatar" ? "A" : undefined}
|
|
150
|
+
>
|
|
151
|
+
{type}
|
|
152
|
+
</CatalogTag>
|
|
153
|
+
))}
|
|
154
|
+
{tagStates.map((state) => (
|
|
155
|
+
<CatalogTag key={state} state={state} type="dot">
|
|
156
|
+
{state}
|
|
157
|
+
</CatalogTag>
|
|
158
|
+
))}
|
|
159
|
+
<CatalogTag size="xs">xs</CatalogTag>
|
|
160
|
+
<CatalogTag size="md">md</CatalogTag>
|
|
161
|
+
<CatalogTag closeLabel="Remove tag" size="lg" showCloseButton>
|
|
162
|
+
large
|
|
163
|
+
</CatalogTag>
|
|
164
|
+
<CatalogTag
|
|
165
|
+
avatar="\u0645"
|
|
166
|
+
closeLabel="\u0625\u0632\u0627\u0644\u0629 \u0648\u0633\u0645"
|
|
167
|
+
dir="rtl"
|
|
168
|
+
type="avatar"
|
|
169
|
+
showCloseButton
|
|
170
|
+
>
|
|
171
|
+
\u0645\u0644\u0635\u0642
|
|
172
|
+
</CatalogTag>
|
|
173
|
+
</div>
|
|
174
|
+
</ShowcaseCard>
|
|
175
|
+
|
|
176
|
+
<ShowcaseCard title="File Upload" description="Large and small queued-file upload states.">
|
|
177
|
+
<div className="catalog-showcase__upload-grid">
|
|
178
|
+
<FileUpload {...fileUploadCopy} files={uploadFiles} multiple />
|
|
179
|
+
<FileUpload {...fileUploadCopy} files={uploadFiles.slice(0, 1)} size="sm" />
|
|
180
|
+
</div>
|
|
181
|
+
</ShowcaseCard>
|
|
182
|
+
|
|
183
|
+
<ShowcaseCard title="Table" description="Selection, sort headers, status badges, progress, row states, and RTL mirroring.">
|
|
184
|
+
<div className="catalog-showcase__stack">
|
|
185
|
+
<Table columns={columns} rows={projectRows} selectedRowIds={selectedRows} onSelectedRowIdsChange={setSelectedRows} />
|
|
186
|
+
<Table columns={columns} dir="rtl" rows={projectRows.slice(0, 3)} selectedRowIds={selectedRows} onSelectedRowIdsChange={setSelectedRows} />
|
|
187
|
+
</div>
|
|
188
|
+
</ShowcaseCard>
|
|
189
|
+
</div>
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
function ShowcaseCard({
|
|
194
|
+
children,
|
|
195
|
+
description,
|
|
196
|
+
title,
|
|
197
|
+
}: {
|
|
198
|
+
children: React.ReactNode;
|
|
199
|
+
description: string;
|
|
200
|
+
title: string;
|
|
201
|
+
}) {
|
|
202
|
+
return (
|
|
203
|
+
<article className="catalog-showcase__card">
|
|
204
|
+
<header className="catalog-showcase__card-header">
|
|
205
|
+
<h3>{title}</h3>
|
|
206
|
+
<p>{description}</p>
|
|
207
|
+
</header>
|
|
208
|
+
{children}
|
|
209
|
+
</article>
|
|
210
|
+
);
|
|
211
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import "./divider.css";
|
|
2
|
+
|
|
3
|
+
export type DividerBorderStyle = "solid" | "dotted";
|
|
4
|
+
export type DividerDirection = "horizontal";
|
|
5
|
+
|
|
6
|
+
export type CatalogDividerBorderStyle = DividerBorderStyle;
|
|
7
|
+
export type CatalogDividerDirection = DividerDirection;
|
|
8
|
+
|
|
9
|
+
export type CatalogDividerProps = {
|
|
10
|
+
borderStyle?: DividerBorderStyle;
|
|
11
|
+
direction?: DividerDirection;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export type CatalogContentDividerProps = {
|
|
15
|
+
actionLabel?: string;
|
|
16
|
+
borderStyle?: DividerBorderStyle;
|
|
17
|
+
dir?: "ltr" | "rtl" | "auto";
|
|
18
|
+
disabled?: boolean;
|
|
19
|
+
label?: string;
|
|
20
|
+
onAction?: () => void;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export function CatalogDivider({ borderStyle = "solid" }: CatalogDividerProps) {
|
|
24
|
+
return <hr className={`ds-divider ds-divider--${borderStyle}`} />;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function CatalogContentDivider({
|
|
28
|
+
actionLabel,
|
|
29
|
+
borderStyle = "solid",
|
|
30
|
+
dir = "ltr",
|
|
31
|
+
disabled = false,
|
|
32
|
+
label,
|
|
33
|
+
onAction,
|
|
34
|
+
}: CatalogContentDividerProps) {
|
|
35
|
+
return (
|
|
36
|
+
<div className={`ds-content-divider ds-content-divider--${borderStyle}`} dir={dir}>
|
|
37
|
+
<span aria-hidden="true" className="ds-content-divider__rule" />
|
|
38
|
+
{actionLabel && onAction ? (
|
|
39
|
+
<button className="ds-content-divider__button" disabled={disabled} onClick={onAction} type="button">
|
|
40
|
+
{actionLabel}
|
|
41
|
+
</button>
|
|
42
|
+
) : label ? (
|
|
43
|
+
<span className="ds-content-divider__label">{label}</span>
|
|
44
|
+
) : null}
|
|
45
|
+
<span aria-hidden="true" className="ds-content-divider__rule" />
|
|
46
|
+
</div>
|
|
47
|
+
);
|
|
48
|
+
}
|