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,184 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import { Tabs, type TabsProps } from "./Tabs";
|
|
3
|
+
import "./pageHeader.css";
|
|
4
|
+
|
|
5
|
+
export type PageHeaderBreadcrumb = {
|
|
6
|
+
label: string;
|
|
7
|
+
href?: string;
|
|
8
|
+
current?: boolean;
|
|
9
|
+
icon?: ReactNode;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export type PageHeaderAction = {
|
|
13
|
+
label: string;
|
|
14
|
+
ariaLabel?: string;
|
|
15
|
+
disabled?: boolean;
|
|
16
|
+
href?: string;
|
|
17
|
+
onClick?: () => void;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export type PageHeaderTabs = Pick<
|
|
21
|
+
TabsProps,
|
|
22
|
+
"activeIndex" | "ariaLabel" | "defaultActiveIndex" | "items" | "onActiveIndexChange"
|
|
23
|
+
>;
|
|
24
|
+
|
|
25
|
+
export type PageHeaderProps = {
|
|
26
|
+
actions?: PageHeaderAction[] | false;
|
|
27
|
+
breadcrumbLabel?: string;
|
|
28
|
+
breadcrumbs?: PageHeaderBreadcrumb[] | false;
|
|
29
|
+
className?: string;
|
|
30
|
+
description?: string;
|
|
31
|
+
dir?: "ltr" | "rtl";
|
|
32
|
+
icon?: ReactNode | false;
|
|
33
|
+
metaInfo?: string;
|
|
34
|
+
tabs?: PageHeaderTabs | false;
|
|
35
|
+
title?: string;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
function classes(...names: Array<string | false | undefined>) {
|
|
39
|
+
return names.filter(Boolean).join(" ");
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function HomeIcon() {
|
|
43
|
+
return (
|
|
44
|
+
<svg aria-hidden="true" className="ds-page-header__home-icon" fill="none" viewBox="0 0 24 24">
|
|
45
|
+
<path
|
|
46
|
+
d="M3.75 10.5 12 3.75l8.25 6.75v8.25a1.5 1.5 0 0 1-1.5 1.5H15v-6h-6v6H5.25a1.5 1.5 0 0 1-1.5-1.5V10.5Z"
|
|
47
|
+
stroke="currentColor"
|
|
48
|
+
strokeLinecap="round"
|
|
49
|
+
strokeLinejoin="round"
|
|
50
|
+
strokeWidth="1.8"
|
|
51
|
+
/>
|
|
52
|
+
</svg>
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function Breadcrumbs({ items, label }: { items: PageHeaderBreadcrumb[]; label?: string }) {
|
|
57
|
+
return (
|
|
58
|
+
<nav aria-label={label} className="ds-page-header__breadcrumbs" data-node-id="1134:39921">
|
|
59
|
+
<ol>
|
|
60
|
+
{items.map((item, index) => {
|
|
61
|
+
const isLast = index === items.length - 1;
|
|
62
|
+
const isCurrent = item.current === true;
|
|
63
|
+
const content = (
|
|
64
|
+
<>
|
|
65
|
+
{item.icon && <span className="ds-page-header__breadcrumb-icon">{item.icon}</span>}
|
|
66
|
+
<span className="ds-page-header__breadcrumb-label">{item.label}</span>
|
|
67
|
+
</>
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
return (
|
|
71
|
+
<li key={`${item.label}-${index}`}>
|
|
72
|
+
{item.href && !isCurrent ? (
|
|
73
|
+
<a href={item.href}>{content}</a>
|
|
74
|
+
) : (
|
|
75
|
+
<span aria-current={isCurrent ? "page" : undefined} className={isCurrent ? "is-current" : undefined}>
|
|
76
|
+
{content}
|
|
77
|
+
</span>
|
|
78
|
+
)}
|
|
79
|
+
{!isLast && (
|
|
80
|
+
<span aria-hidden="true" className="ds-page-header__breadcrumb-separator">
|
|
81
|
+
/
|
|
82
|
+
</span>
|
|
83
|
+
)}
|
|
84
|
+
</li>
|
|
85
|
+
);
|
|
86
|
+
})}
|
|
87
|
+
</ol>
|
|
88
|
+
</nav>
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
function Action({ action }: { action: PageHeaderAction }) {
|
|
93
|
+
const className = "ds-page-header__action";
|
|
94
|
+
const label = <span>{action.label}</span>;
|
|
95
|
+
|
|
96
|
+
if (action.href) {
|
|
97
|
+
return (
|
|
98
|
+
<a aria-label={action.ariaLabel} className={className} href={action.href}>
|
|
99
|
+
{label}
|
|
100
|
+
</a>
|
|
101
|
+
);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
return (
|
|
105
|
+
<button
|
|
106
|
+
aria-label={action.ariaLabel}
|
|
107
|
+
className={className}
|
|
108
|
+
disabled={action.disabled}
|
|
109
|
+
onClick={action.onClick}
|
|
110
|
+
type="button"
|
|
111
|
+
>
|
|
112
|
+
{label}
|
|
113
|
+
</button>
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export function PageHeader({
|
|
118
|
+
actions = [],
|
|
119
|
+
breadcrumbLabel,
|
|
120
|
+
breadcrumbs = [],
|
|
121
|
+
className,
|
|
122
|
+
description,
|
|
123
|
+
dir = "ltr",
|
|
124
|
+
icon,
|
|
125
|
+
metaInfo,
|
|
126
|
+
tabs = {},
|
|
127
|
+
title,
|
|
128
|
+
}: PageHeaderProps) {
|
|
129
|
+
const breadcrumbItems = breadcrumbs === false ? [] : breadcrumbs;
|
|
130
|
+
const actionItems = actions === false ? [] : actions;
|
|
131
|
+
const showIcon = icon !== false;
|
|
132
|
+
|
|
133
|
+
return (
|
|
134
|
+
<header className={classes("ds-page-header", className)} data-node-id="1154:2816" dir={dir}>
|
|
135
|
+
{breadcrumbItems.length > 0 && <Breadcrumbs items={breadcrumbItems} label={breadcrumbLabel} />}
|
|
136
|
+
|
|
137
|
+
<div className="ds-page-header__section" data-node-id="1134:40171">
|
|
138
|
+
<div className="ds-page-header__topline" data-node-id="1134:40048">
|
|
139
|
+
<div className="ds-page-header__copy" data-node-id="1134:40046">
|
|
140
|
+
<div className="ds-page-header__heading-row" data-node-id="1136:40843">
|
|
141
|
+
<div className="ds-page-header__heading-main" data-node-id="1157:13000">
|
|
142
|
+
{showIcon && <span className="ds-page-header__icon">{icon ?? <HomeIcon />}</span>}
|
|
143
|
+
{title && <h1 data-node-id="1134:39780">{title}</h1>}
|
|
144
|
+
</div>
|
|
145
|
+
{metaInfo && (
|
|
146
|
+
<span className="ds-page-header__meta" data-node-id="1134:40045">
|
|
147
|
+
{metaInfo}
|
|
148
|
+
</span>
|
|
149
|
+
)}
|
|
150
|
+
</div>
|
|
151
|
+
{description && (
|
|
152
|
+
<p className="ds-page-header__description" data-node-id="1136:40842">
|
|
153
|
+
{description}
|
|
154
|
+
</p>
|
|
155
|
+
)}
|
|
156
|
+
</div>
|
|
157
|
+
|
|
158
|
+
{actionItems.length > 0 && (
|
|
159
|
+
<div className="ds-page-header__actions" data-node-id="1156:2489">
|
|
160
|
+
{actionItems.map((action, index) => (
|
|
161
|
+
<Action action={action} key={`${action.label}-${index}`} />
|
|
162
|
+
))}
|
|
163
|
+
</div>
|
|
164
|
+
)}
|
|
165
|
+
</div>
|
|
166
|
+
|
|
167
|
+
{tabs !== false && (
|
|
168
|
+
<Tabs
|
|
169
|
+
ariaLabel={tabs.ariaLabel}
|
|
170
|
+
className="ds-page-header__tabs"
|
|
171
|
+
fullWidth
|
|
172
|
+
items={tabs.items}
|
|
173
|
+
activeIndex={tabs.activeIndex}
|
|
174
|
+
defaultActiveIndex={tabs.defaultActiveIndex}
|
|
175
|
+
onActiveIndexChange={tabs.onActiveIndexChange}
|
|
176
|
+
size="md"
|
|
177
|
+
variant="underline"
|
|
178
|
+
dir={dir}
|
|
179
|
+
/>
|
|
180
|
+
)}
|
|
181
|
+
</div>
|
|
182
|
+
</header>
|
|
183
|
+
);
|
|
184
|
+
}
|
|
@@ -0,0 +1,514 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import "./slideout.css";
|
|
3
|
+
|
|
4
|
+
export type SlideoutSize = "small" | "medium" | "large";
|
|
5
|
+
export type SlideoutBreakpoint = "desktop" | "mobile";
|
|
6
|
+
|
|
7
|
+
export type SlideoutProps = {
|
|
8
|
+
actionLabel?: string;
|
|
9
|
+
breakpoint?: SlideoutBreakpoint;
|
|
10
|
+
children?: ReactNode;
|
|
11
|
+
className?: string;
|
|
12
|
+
closeLabel?: string;
|
|
13
|
+
dir?: "ltr" | "rtl";
|
|
14
|
+
footer?: boolean;
|
|
15
|
+
headerAction?: boolean;
|
|
16
|
+
primaryActionLabel?: string;
|
|
17
|
+
secondaryAction?: boolean;
|
|
18
|
+
secondaryActionLabel?: string;
|
|
19
|
+
size?: SlideoutSize;
|
|
20
|
+
title?: string;
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
type SlideoutSlotExampleProps = {
|
|
24
|
+
dir?: "ltr" | "rtl";
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
function cx(...classes: Array<string | false | null | undefined>) {
|
|
28
|
+
return classes.filter(Boolean).join(" ");
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function Slideout({
|
|
32
|
+
actionLabel,
|
|
33
|
+
breakpoint = "desktop",
|
|
34
|
+
children,
|
|
35
|
+
className = "",
|
|
36
|
+
closeLabel,
|
|
37
|
+
dir = "ltr",
|
|
38
|
+
footer = true,
|
|
39
|
+
headerAction = true,
|
|
40
|
+
primaryActionLabel,
|
|
41
|
+
secondaryAction = true,
|
|
42
|
+
secondaryActionLabel,
|
|
43
|
+
size = "small",
|
|
44
|
+
title,
|
|
45
|
+
}: SlideoutProps) {
|
|
46
|
+
const rtl = dir === "rtl";
|
|
47
|
+
const hasFooterActions = Boolean(primaryActionLabel || (secondaryAction && secondaryActionLabel));
|
|
48
|
+
|
|
49
|
+
return (
|
|
50
|
+
<aside
|
|
51
|
+
className={cx(
|
|
52
|
+
"ds-slideout",
|
|
53
|
+
`ds-slideout--${size}`,
|
|
54
|
+
`ds-slideout--${breakpoint}`,
|
|
55
|
+
rtl && "ds-slideout--rtl",
|
|
56
|
+
className,
|
|
57
|
+
)}
|
|
58
|
+
data-node-id="256:19065"
|
|
59
|
+
dir={dir}
|
|
60
|
+
>
|
|
61
|
+
<section aria-label={title} className="ds-slideout__panel" role="dialog">
|
|
62
|
+
<header className="ds-slideout__header">
|
|
63
|
+
<div className="ds-slideout__heading-wrap">
|
|
64
|
+
<h2 className="ds-slideout__title">{title}</h2>
|
|
65
|
+
{headerAction && actionLabel && (
|
|
66
|
+
<button className="ds-slideout__text-button" type="button">
|
|
67
|
+
{actionLabel}
|
|
68
|
+
</button>
|
|
69
|
+
)}
|
|
70
|
+
</div>
|
|
71
|
+
{closeLabel && (
|
|
72
|
+
<button aria-label={closeLabel} className="ds-slideout__close" type="button">
|
|
73
|
+
<CloseIcon />
|
|
74
|
+
</button>
|
|
75
|
+
)}
|
|
76
|
+
</header>
|
|
77
|
+
<div className="ds-slideout__body">{children}</div>
|
|
78
|
+
{footer && hasFooterActions && (
|
|
79
|
+
<footer className="ds-slideout__footer">
|
|
80
|
+
{primaryActionLabel && (
|
|
81
|
+
<button className="ds-slideout__button ds-slideout__button--primary" type="button">
|
|
82
|
+
{primaryActionLabel}
|
|
83
|
+
</button>
|
|
84
|
+
)}
|
|
85
|
+
{secondaryAction && secondaryActionLabel && (
|
|
86
|
+
<button className="ds-slideout__button ds-slideout__button--secondary" type="button">
|
|
87
|
+
{secondaryActionLabel}
|
|
88
|
+
</button>
|
|
89
|
+
)}
|
|
90
|
+
</footer>
|
|
91
|
+
)}
|
|
92
|
+
</section>
|
|
93
|
+
</aside>
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export function SlideoutFiltersExample({ dir = "ltr" }: SlideoutSlotExampleProps) {
|
|
98
|
+
const rtl = dir === "rtl";
|
|
99
|
+
const text = rtl
|
|
100
|
+
? {
|
|
101
|
+
assigned: "مخصصة لـ",
|
|
102
|
+
date: "التاريخ",
|
|
103
|
+
label: "التسمية",
|
|
104
|
+
names: ["أحمد جلال", "عمر مهدي", "هاني هشام", "عمر ماهر"],
|
|
105
|
+
priority: "الأولوية",
|
|
106
|
+
status: "الحالة",
|
|
107
|
+
}
|
|
108
|
+
: {
|
|
109
|
+
assigned: "Assigned to",
|
|
110
|
+
date: "Date",
|
|
111
|
+
label: "Label",
|
|
112
|
+
names: ["Ahmed Galal", "Amr Mahdy", "Hany Hisham", "Omar Maher"],
|
|
113
|
+
priority: "Priority",
|
|
114
|
+
status: "Status",
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
return (
|
|
118
|
+
<div className="ds-slideout-slot ds-slideout-filters" data-node-id="256:18779">
|
|
119
|
+
<FilterSection title={text.status}>
|
|
120
|
+
<ChoiceRow kind="checkbox" label={text.label} />
|
|
121
|
+
<ChoiceRow checked kind="checkbox" label={text.label} />
|
|
122
|
+
<ChoiceRow kind="checkbox" label={text.label} />
|
|
123
|
+
</FilterSection>
|
|
124
|
+
<Divider />
|
|
125
|
+
<FilterSection title={text.date}>
|
|
126
|
+
<ChoiceRow kind="radio" label={text.label} />
|
|
127
|
+
<ChoiceRow kind="radio" label={text.label} />
|
|
128
|
+
<ChoiceRow checked kind="radio" label={text.label} />
|
|
129
|
+
<ChoiceRow kind="radio" label={text.label} />
|
|
130
|
+
</FilterSection>
|
|
131
|
+
<Divider />
|
|
132
|
+
<FilterSection title={text.priority}>
|
|
133
|
+
<ChoiceRow kind="checkbox" label={text.label} />
|
|
134
|
+
<ChoiceRow checked kind="checkbox" label={text.label} />
|
|
135
|
+
<ChoiceRow kind="checkbox" label={text.label} />
|
|
136
|
+
</FilterSection>
|
|
137
|
+
<Divider />
|
|
138
|
+
<FilterSection title={text.assigned}>
|
|
139
|
+
{text.names.map((name, index) => (
|
|
140
|
+
<UserChoice key={name} name={name} selected={index === 0 || index === 2} muted={index === 1 || index === 3} />
|
|
141
|
+
))}
|
|
142
|
+
</FilterSection>
|
|
143
|
+
</div>
|
|
144
|
+
);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
export function SlideoutUserProfileExample({ dir = "ltr" }: SlideoutSlotExampleProps) {
|
|
148
|
+
const rtl = dir === "rtl";
|
|
149
|
+
const text = rtl
|
|
150
|
+
? {
|
|
151
|
+
badgeTabs: ["عنصر القائمة", "عنصر القائمة", "عنصر القائمة", "عنصر القائمة"],
|
|
152
|
+
comments: [
|
|
153
|
+
"Lorem ipsum dolor sit amet consectetur @username. Cras in morbi volutpat porttitor se...",
|
|
154
|
+
"",
|
|
155
|
+
"Lorem ipsum dolor sit amet consectetur. Cras in morbi volutpat porttitor semper. Mattis bibendum...",
|
|
156
|
+
"اسم الملف.pdf",
|
|
157
|
+
],
|
|
158
|
+
name: "أحمد جلال",
|
|
159
|
+
role: "مصمم المنتجات",
|
|
160
|
+
time: "اليوم الساعة 5:20 مساءً",
|
|
161
|
+
titleParts: ["أحمد", "تمت إضافة تعليق جديد في", "#اسم المشروع"],
|
|
162
|
+
}
|
|
163
|
+
: {
|
|
164
|
+
badgeTabs: ["Activity", "Calendar", "My Work", "Asigned"],
|
|
165
|
+
comments: [
|
|
166
|
+
"Lorem ipsum dolor sit amet consectetur @username. Cras in morbi volutpat porttitor se...",
|
|
167
|
+
"",
|
|
168
|
+
"Lorem ipsum dolor sit amet consectetur. Cras in morbi volutpat porttitor semper. Mattis bibendum...",
|
|
169
|
+
"file-name.pdf",
|
|
170
|
+
],
|
|
171
|
+
name: "Ahmed Galal",
|
|
172
|
+
role: "Product designer",
|
|
173
|
+
time: "Today, 5:20 pm",
|
|
174
|
+
titleParts: ["Ahmed", "added a new comment in", "#project name"],
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
return (
|
|
178
|
+
<div className="ds-slideout-slot ds-slideout-profile" data-node-id="256:18872">
|
|
179
|
+
<div className="ds-slideout-profile__header">
|
|
180
|
+
<Avatar name={text.name} online size="large" />
|
|
181
|
+
<div className="ds-slideout-profile__identity">
|
|
182
|
+
<p className="ds-slideout-profile__name">{text.name}</p>
|
|
183
|
+
<p className="ds-slideout-profile__role">{text.role}</p>
|
|
184
|
+
</div>
|
|
185
|
+
</div>
|
|
186
|
+
<div aria-label={rtl ? "علامات تبويب الملف الشخصي" : "Profile tabs"} className="ds-slideout-profile__tabs" role="tablist">
|
|
187
|
+
{text.badgeTabs.map((tab, index) => (
|
|
188
|
+
<button aria-selected={index === 0 || (rtl && index === 3)} className="ds-slideout-profile__tab" key={`${tab}-${index}`} role="tab" type="button">
|
|
189
|
+
<span>{tab}</span>
|
|
190
|
+
{(index === 2 || index === 3) && !rtl && <span className="ds-slideout-profile__badge">{index === 2 ? "2" : "4"}</span>}
|
|
191
|
+
</button>
|
|
192
|
+
))}
|
|
193
|
+
</div>
|
|
194
|
+
<div className="ds-slideout-feed">
|
|
195
|
+
{text.comments.map((comment, index) => (
|
|
196
|
+
<FeedItem comment={comment} index={index} key={`${comment}-${index}`} rtl={rtl} time={text.time} titleParts={text.titleParts} />
|
|
197
|
+
))}
|
|
198
|
+
</div>
|
|
199
|
+
</div>
|
|
200
|
+
);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
export function SlideoutPaymentDetailExample({ dir = "ltr" }: SlideoutSlotExampleProps) {
|
|
204
|
+
const rtl = dir === "rtl";
|
|
205
|
+
const text = rtl
|
|
206
|
+
? {
|
|
207
|
+
amount: "9,453,50 دولار",
|
|
208
|
+
copy: "نسخة",
|
|
209
|
+
date: "24 مايو، 2050، 10:23 صباحًا",
|
|
210
|
+
details: "التفاصيل",
|
|
211
|
+
id: "معرف المعاملة",
|
|
212
|
+
name: "جاكوب جونز",
|
|
213
|
+
rows: [
|
|
214
|
+
["المبلغ", "9,553,50 دولار"],
|
|
215
|
+
["الرسوم", "$100 دولار"],
|
|
216
|
+
["الإجمالي", "9,453,50 دولار"],
|
|
217
|
+
],
|
|
218
|
+
showStory: "عرض القصة",
|
|
219
|
+
}
|
|
220
|
+
: {
|
|
221
|
+
amount: "$9,453,50",
|
|
222
|
+
copy: "Copy",
|
|
223
|
+
date: "24 May, 2050, 10:23 AM",
|
|
224
|
+
details: "Details",
|
|
225
|
+
id: "Transaction ID",
|
|
226
|
+
name: "Jacob Jones",
|
|
227
|
+
rows: [
|
|
228
|
+
["Amount", "$9,553,50"],
|
|
229
|
+
["Fee", "$100"],
|
|
230
|
+
["Total", "$9,453,50"],
|
|
231
|
+
],
|
|
232
|
+
showStory: "Show story",
|
|
233
|
+
};
|
|
234
|
+
|
|
235
|
+
return (
|
|
236
|
+
<div className="ds-slideout-slot ds-payment-detail" data-node-id="256:18901">
|
|
237
|
+
<section className="ds-payment-detail__hero">
|
|
238
|
+
<div className="ds-payment-detail__user">
|
|
239
|
+
<Avatar name={text.name} size="medium" />
|
|
240
|
+
<div>
|
|
241
|
+
<p className="ds-payment-detail__name">{text.name}</p>
|
|
242
|
+
<p className="ds-payment-detail__muted">useraccount@gmail.com</p>
|
|
243
|
+
</div>
|
|
244
|
+
</div>
|
|
245
|
+
<div>
|
|
246
|
+
<p className="ds-payment-detail__amount">{text.amount}</p>
|
|
247
|
+
<p className="ds-payment-detail__date">{text.date}</p>
|
|
248
|
+
</div>
|
|
249
|
+
</section>
|
|
250
|
+
<section className="ds-payment-card">
|
|
251
|
+
<h3>{text.details}</h3>
|
|
252
|
+
<div className="ds-payment-detail__rows">
|
|
253
|
+
{text.rows.map(([label, value]) => (
|
|
254
|
+
<div className="ds-payment-detail__row" key={label}>
|
|
255
|
+
<span>{label}</span>
|
|
256
|
+
<strong>{value}</strong>
|
|
257
|
+
</div>
|
|
258
|
+
))}
|
|
259
|
+
</div>
|
|
260
|
+
</section>
|
|
261
|
+
<section className="ds-payment-card">
|
|
262
|
+
<h3>{text.id}</h3>
|
|
263
|
+
<div className="ds-payment-detail__transaction">
|
|
264
|
+
<span>45FWGERT54GSGY54WRE</span>
|
|
265
|
+
<button className="ds-slideout__button ds-slideout__button--secondary ds-payment-detail__copy" type="button">
|
|
266
|
+
{text.copy}
|
|
267
|
+
</button>
|
|
268
|
+
</div>
|
|
269
|
+
</section>
|
|
270
|
+
<button className="ds-payment-detail__story" type="button">
|
|
271
|
+
{text.showStory}
|
|
272
|
+
</button>
|
|
273
|
+
</div>
|
|
274
|
+
);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
export function SlideoutPaymentFormExample({ dir = "ltr" }: SlideoutSlotExampleProps) {
|
|
278
|
+
const rtl = dir === "rtl";
|
|
279
|
+
const text = rtl
|
|
280
|
+
? {
|
|
281
|
+
amount: "8,425.32 دولار",
|
|
282
|
+
category: "الفئة",
|
|
283
|
+
date: "31 مايو 2023 الساعة 09:42 صباحًا",
|
|
284
|
+
export: "تصدير",
|
|
285
|
+
fields: [
|
|
286
|
+
["BIC", "سيتيكسكس2X"],
|
|
287
|
+
["رقم الحساب المصرفي الدولي", "**** **** 4356 29"],
|
|
288
|
+
["باعث", "الشريط"],
|
|
289
|
+
["المرجع", "الشريط"],
|
|
290
|
+
["التاريخ", "31/05/2050"],
|
|
291
|
+
["العلامة", "الشريط"],
|
|
292
|
+
["التاريخ", "8,425.32 دولار"],
|
|
293
|
+
["الحالة", "البدء"],
|
|
294
|
+
],
|
|
295
|
+
receipts: "الإيصالات",
|
|
296
|
+
select: "السحب الآلي",
|
|
297
|
+
uploadHelp: "نقبل ملفات PDF وJPG وPNG بحجم يصل إلى 10 ميجابايت",
|
|
298
|
+
uploadTitle: "انقر لتحديد الملفات أو إسقاطها",
|
|
299
|
+
}
|
|
300
|
+
: {
|
|
301
|
+
amount: "$8,425.32",
|
|
302
|
+
category: "Category",
|
|
303
|
+
date: "31 May, 2023, 09:42 AM",
|
|
304
|
+
export: "Export",
|
|
305
|
+
fields: [
|
|
306
|
+
["IBAN", "**** **** 4356 29"],
|
|
307
|
+
["BIC", "CITIXX2X"],
|
|
308
|
+
["Reference", "STRIPE"],
|
|
309
|
+
["Emitter", "Stripe"],
|
|
310
|
+
["Tag", "Stripe"],
|
|
311
|
+
["Date", "05/31/2050"],
|
|
312
|
+
["Status", "Initiated"],
|
|
313
|
+
["Date", "$8,425.32"],
|
|
314
|
+
],
|
|
315
|
+
receipts: "Receipts",
|
|
316
|
+
select: "Automated Cashout",
|
|
317
|
+
uploadHelp: "We accept PDF, JPG and PNG files up to 10MB",
|
|
318
|
+
uploadTitle: "Click to select or drop files",
|
|
319
|
+
};
|
|
320
|
+
|
|
321
|
+
return (
|
|
322
|
+
<div className="ds-slideout-slot ds-payment-form" data-node-id="256:18964">
|
|
323
|
+
<section className="ds-payment-form__amount">
|
|
324
|
+
<CompanyIcon />
|
|
325
|
+
<div className="ds-payment-form__amount-copy">
|
|
326
|
+
<p className="ds-payment-form__value">{text.amount}</p>
|
|
327
|
+
<p className="ds-payment-form__date">{text.date}</p>
|
|
328
|
+
</div>
|
|
329
|
+
<button className="ds-slideout__button ds-slideout__button--secondary ds-payment-form__export" type="button">
|
|
330
|
+
{text.export}
|
|
331
|
+
</button>
|
|
332
|
+
</section>
|
|
333
|
+
<section className="ds-payment-card ds-payment-form__grid">
|
|
334
|
+
{text.fields.map(([label, value], index) => (
|
|
335
|
+
<div className="ds-payment-form__field" key={`${label}-${index}`}>
|
|
336
|
+
<span>{label}</span>
|
|
337
|
+
<strong>{value}</strong>
|
|
338
|
+
</div>
|
|
339
|
+
))}
|
|
340
|
+
</section>
|
|
341
|
+
<section className="ds-payment-card ds-payment-form__section">
|
|
342
|
+
<h3>{text.category}</h3>
|
|
343
|
+
<button className="ds-payment-form__select" type="button">
|
|
344
|
+
<span>{text.select}</span>
|
|
345
|
+
<ChevronDownIcon />
|
|
346
|
+
</button>
|
|
347
|
+
</section>
|
|
348
|
+
<section className="ds-payment-card ds-payment-form__section">
|
|
349
|
+
<h3>{text.receipts}</h3>
|
|
350
|
+
<div className="ds-payment-form__upload">
|
|
351
|
+
<span className="ds-payment-form__upload-icon">
|
|
352
|
+
<UploadCloudIcon />
|
|
353
|
+
</span>
|
|
354
|
+
<span className="ds-payment-form__upload-copy">
|
|
355
|
+
<strong>{text.uploadTitle}</strong>
|
|
356
|
+
<span>{text.uploadHelp}</span>
|
|
357
|
+
</span>
|
|
358
|
+
</div>
|
|
359
|
+
</section>
|
|
360
|
+
</div>
|
|
361
|
+
);
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
function FilterSection({ children, title }: { children: ReactNode; title: string }) {
|
|
365
|
+
return (
|
|
366
|
+
<section className="ds-filter-section">
|
|
367
|
+
<h3>{title}</h3>
|
|
368
|
+
<div className="ds-filter-section__content">{children}</div>
|
|
369
|
+
</section>
|
|
370
|
+
);
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
function ChoiceRow({ checked = false, kind, label }: { checked?: boolean; kind: "checkbox" | "radio"; label: string }) {
|
|
374
|
+
return (
|
|
375
|
+
<div className="ds-choice-row">
|
|
376
|
+
<span aria-hidden="true" className={cx("ds-choice-row__control", `ds-choice-row__control--${kind}`, checked && "is-checked")}>
|
|
377
|
+
{checked && kind === "checkbox" && <CheckIcon />}
|
|
378
|
+
{checked && kind === "radio" && <span className="ds-choice-row__dot" />}
|
|
379
|
+
</span>
|
|
380
|
+
<span className="ds-choice-row__label">{label}</span>
|
|
381
|
+
</div>
|
|
382
|
+
);
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
function UserChoice({ muted = false, name, selected = false }: { muted?: boolean; name: string; selected?: boolean }) {
|
|
386
|
+
return (
|
|
387
|
+
<div className="ds-user-choice">
|
|
388
|
+
<div className="ds-user-choice__person">
|
|
389
|
+
<Avatar name={name} size="small" />
|
|
390
|
+
<span className={cx(muted && "is-muted")}>{name}</span>
|
|
391
|
+
</div>
|
|
392
|
+
{selected && <CheckIcon className="ds-user-choice__check" />}
|
|
393
|
+
</div>
|
|
394
|
+
);
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
function FeedItem({
|
|
398
|
+
comment,
|
|
399
|
+
index,
|
|
400
|
+
rtl,
|
|
401
|
+
time,
|
|
402
|
+
titleParts,
|
|
403
|
+
}: {
|
|
404
|
+
comment: string;
|
|
405
|
+
index: number;
|
|
406
|
+
rtl: boolean;
|
|
407
|
+
time: string;
|
|
408
|
+
titleParts: string[];
|
|
409
|
+
}) {
|
|
410
|
+
return (
|
|
411
|
+
<article className="ds-feed-item">
|
|
412
|
+
<div className="ds-feed-item__heading">
|
|
413
|
+
<div className="ds-feed-item__copy">
|
|
414
|
+
<p>
|
|
415
|
+
<strong>{titleParts[0]}</strong> <span>{titleParts[1]}</span> <a href="#top">{titleParts[2]}</a>
|
|
416
|
+
</p>
|
|
417
|
+
<time>{time}</time>
|
|
418
|
+
</div>
|
|
419
|
+
<span aria-hidden="true" className="ds-feed-item__indicator" />
|
|
420
|
+
</div>
|
|
421
|
+
{index === 1 ? (
|
|
422
|
+
<div className="ds-feed-item__images">
|
|
423
|
+
<span className="ds-feed-item__image ds-feed-item__image--one" />
|
|
424
|
+
<span className="ds-feed-item__image ds-feed-item__image--two" />
|
|
425
|
+
</div>
|
|
426
|
+
) : index === 3 ? (
|
|
427
|
+
<div className="ds-feed-item__files">
|
|
428
|
+
<FileRow label={comment} rtl={rtl} />
|
|
429
|
+
<FileRow label={rtl ? "اسم الملف الثاني.pdf" : "Second file-name.pdf"} rtl={rtl} />
|
|
430
|
+
</div>
|
|
431
|
+
) : (
|
|
432
|
+
<p className="ds-feed-item__comment">{comment}</p>
|
|
433
|
+
)}
|
|
434
|
+
</article>
|
|
435
|
+
);
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
function FileRow({ label, rtl }: { label: string; rtl: boolean }) {
|
|
439
|
+
return (
|
|
440
|
+
<div className="ds-file-row">
|
|
441
|
+
<PaperclipIcon />
|
|
442
|
+
<span>{label}</span>
|
|
443
|
+
<button type="button">{rtl ? "تنزيل" : "Download"}</button>
|
|
444
|
+
</div>
|
|
445
|
+
);
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
function Avatar({ name, online = false, size = "small" }: { name: string; online?: boolean; size?: "small" | "medium" | "large" }) {
|
|
449
|
+
const initials = name
|
|
450
|
+
.split(" ")
|
|
451
|
+
.filter(Boolean)
|
|
452
|
+
.slice(0, 2)
|
|
453
|
+
.map((part) => part[0])
|
|
454
|
+
.join("");
|
|
455
|
+
|
|
456
|
+
return (
|
|
457
|
+
<span className={cx("ds-avatar", `ds-avatar--${size}`)} aria-label={name} role="img">
|
|
458
|
+
<span>{initials}</span>
|
|
459
|
+
{online && <span aria-hidden="true" className="ds-avatar__status" />}
|
|
460
|
+
</span>
|
|
461
|
+
);
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
function CompanyIcon() {
|
|
465
|
+
return (
|
|
466
|
+
<span aria-hidden="true" className="ds-company-icon">
|
|
467
|
+
<span />
|
|
468
|
+
</span>
|
|
469
|
+
);
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
function Divider() {
|
|
473
|
+
return <span aria-hidden="true" className="ds-slideout-divider" />;
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
function CloseIcon() {
|
|
477
|
+
return (
|
|
478
|
+
<svg aria-hidden="true" fill="none" height="20" viewBox="0 0 20 20" width="20">
|
|
479
|
+
<path d="m5.25 5.25 9.5 9.5m0-9.5-9.5 9.5" stroke="currentColor" strokeLinecap="round" strokeWidth="1.8" />
|
|
480
|
+
</svg>
|
|
481
|
+
);
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
function CheckIcon({ className = "" }: { className?: string }) {
|
|
485
|
+
return (
|
|
486
|
+
<svg aria-hidden="true" className={className} fill="none" height="14" viewBox="0 0 14 14" width="14">
|
|
487
|
+
<path d="m3 7.1 2.4 2.4L10.6 4.5" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" strokeWidth="1.8" />
|
|
488
|
+
</svg>
|
|
489
|
+
);
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
function ChevronDownIcon() {
|
|
493
|
+
return (
|
|
494
|
+
<svg aria-hidden="true" fill="none" height="20" viewBox="0 0 20 20" width="20">
|
|
495
|
+
<path d="m5.5 7.5 4.5 4.5 4.5-4.5" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" strokeWidth="1.7" />
|
|
496
|
+
</svg>
|
|
497
|
+
);
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
function PaperclipIcon() {
|
|
501
|
+
return (
|
|
502
|
+
<svg aria-hidden="true" fill="none" height="20" viewBox="0 0 20 20" width="20">
|
|
503
|
+
<path d="m7.4 10.9 4.5-4.5a2.6 2.6 0 1 1 3.7 3.7l-6.2 6.2a4 4 0 0 1-5.7-5.7l6.3-6.3" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" strokeWidth="1.6" />
|
|
504
|
+
</svg>
|
|
505
|
+
);
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
function UploadCloudIcon() {
|
|
509
|
+
return (
|
|
510
|
+
<svg aria-hidden="true" fill="none" height="20" viewBox="0 0 20 20" width="20">
|
|
511
|
+
<path d="M7 13.5H5.8a3.3 3.3 0 0 1-.6-6.5 4.6 4.6 0 0 1 8.6-1.8 3.7 3.7 0 0 1 .6 7.3H13M10 8v7m0-7-2.4 2.4M10 8l2.4 2.4" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" strokeWidth="1.5" />
|
|
512
|
+
</svg>
|
|
513
|
+
);
|
|
514
|
+
}
|