tio-design-make-experiments 0.0.1
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/ATTRIBUTIONS.md +3 -0
- package/README.md +11 -0
- package/guidelines/Guidelines.md +61 -0
- package/index.html +15 -0
- package/package.json +91 -0
- package/postcss.config.mjs +15 -0
- package/src/app/App.tsx +6 -0
- package/src/app/components/design-system/Buttons.tsx +623 -0
- package/src/app/components/design-system/Cards.tsx +123 -0
- package/src/app/components/design-system/Charts.tsx +135 -0
- package/src/app/components/design-system/ColorPalette.tsx +86 -0
- package/src/app/components/design-system/CopyButton.tsx +102 -0
- package/src/app/components/design-system/Forms.tsx +409 -0
- package/src/app/components/design-system/Icons.tsx +140 -0
- package/src/app/components/design-system/ListItems.tsx +234 -0
- package/src/app/components/design-system/Navigation.tsx +344 -0
- package/src/app/components/design-system/Patterns.tsx +235 -0
- package/src/app/components/design-system/PopoverMenu.tsx +81 -0
- package/src/app/components/design-system/SectionHeader.tsx +22 -0
- package/src/app/components/design-system/Spacing.tsx +109 -0
- package/src/app/components/design-system/StatusIndicators.tsx +194 -0
- package/src/app/components/design-system/Typography.tsx +88 -0
- package/src/app/components/figma/ImageWithFallback.tsx +27 -0
- package/src/app/components/ui/accordion.tsx +66 -0
- package/src/app/components/ui/alert-dialog.tsx +157 -0
- package/src/app/components/ui/alert.tsx +66 -0
- package/src/app/components/ui/aspect-ratio.tsx +11 -0
- package/src/app/components/ui/avatar.tsx +53 -0
- package/src/app/components/ui/badge.tsx +46 -0
- package/src/app/components/ui/breadcrumb.tsx +109 -0
- package/src/app/components/ui/button.tsx +58 -0
- package/src/app/components/ui/calendar.tsx +75 -0
- package/src/app/components/ui/card.tsx +92 -0
- package/src/app/components/ui/carousel.tsx +241 -0
- package/src/app/components/ui/chart.tsx +353 -0
- package/src/app/components/ui/checkbox.tsx +32 -0
- package/src/app/components/ui/collapsible.tsx +33 -0
- package/src/app/components/ui/command.tsx +177 -0
- package/src/app/components/ui/context-menu.tsx +252 -0
- package/src/app/components/ui/dialog.tsx +135 -0
- package/src/app/components/ui/drawer.tsx +132 -0
- package/src/app/components/ui/dropdown-menu.tsx +257 -0
- package/src/app/components/ui/form.tsx +168 -0
- package/src/app/components/ui/hover-card.tsx +44 -0
- package/src/app/components/ui/input-otp.tsx +77 -0
- package/src/app/components/ui/input.tsx +21 -0
- package/src/app/components/ui/label.tsx +24 -0
- package/src/app/components/ui/menubar.tsx +276 -0
- package/src/app/components/ui/navigation-menu.tsx +168 -0
- package/src/app/components/ui/pagination.tsx +127 -0
- package/src/app/components/ui/popover.tsx +48 -0
- package/src/app/components/ui/progress.tsx +31 -0
- package/src/app/components/ui/radio-group.tsx +45 -0
- package/src/app/components/ui/resizable.tsx +56 -0
- package/src/app/components/ui/scroll-area.tsx +58 -0
- package/src/app/components/ui/select.tsx +189 -0
- package/src/app/components/ui/separator.tsx +28 -0
- package/src/app/components/ui/sheet.tsx +139 -0
- package/src/app/components/ui/sidebar.tsx +726 -0
- package/src/app/components/ui/skeleton.tsx +13 -0
- package/src/app/components/ui/slider.tsx +63 -0
- package/src/app/components/ui/sonner.tsx +25 -0
- package/src/app/components/ui/switch.tsx +31 -0
- package/src/app/components/ui/table.tsx +116 -0
- package/src/app/components/ui/tabs.tsx +66 -0
- package/src/app/components/ui/textarea.tsx +18 -0
- package/src/app/components/ui/toggle-group.tsx +73 -0
- package/src/app/components/ui/toggle.tsx +47 -0
- package/src/app/components/ui/tooltip.tsx +61 -0
- package/src/app/components/ui/use-mobile.ts +21 -0
- package/src/app/components/ui/utils.ts +6 -0
- package/src/app/pages/DesignSystem.tsx +189 -0
- package/src/app/pages/Team.tsx +168 -0
- package/src/app/routes.tsx +14 -0
- package/src/assets/6276cd19433d265f363bddc7f52f4937da9b1dd4.png +0 -0
- package/src/assets/9d7a018c9a6938d439d9059f82753d232ce63804.png +0 -0
- package/src/imports/Buttons-3-409.tsx +46 -0
- package/src/imports/Buttons-3-962.tsx +155 -0
- package/src/imports/ButtonsAndActions.tsx +139 -0
- package/src/imports/Dashboard.tsx +1914 -0
- package/src/imports/DesignSystem.tsx +6008 -0
- package/src/imports/Forms.tsx +1088 -0
- package/src/imports/Navigation-17-3259.tsx +564 -0
- package/src/imports/Navigation-18-957.tsx +873 -0
- package/src/imports/Wireframe.tsx +112 -0
- package/src/imports/svg-1ifosis1tx.ts +3 -0
- package/src/imports/svg-5spfd.tsx +1 -0
- package/src/imports/svg-6180by7m37.ts +3 -0
- package/src/imports/svg-guy0p.tsx +1 -0
- package/src/imports/svg-hm2n0.tsx +2 -0
- package/src/imports/svg-j8o95ccqq7.ts +26 -0
- package/src/imports/svg-liuy2nykz3.ts +10 -0
- package/src/imports/svg-pp9c3.tsx +1 -0
- package/src/imports/svg-pr0k9194w9.ts +33 -0
- package/src/imports/svg-umftvfphsk.ts +48 -0
- package/src/imports/svg-vbi95q76mb.ts +23 -0
- package/src/imports/svg-vxjpl.tsx +1 -0
- package/src/imports/svg-wl30wxxv53.ts +3 -0
- package/src/main.tsx +7 -0
- package/src/styles/fonts.css +1 -0
- package/src/styles/forms.css +181 -0
- package/src/styles/header.css +48 -0
- package/src/styles/index.css +7 -0
- package/src/styles/navlinks.css +112 -0
- package/src/styles/popover.css +48 -0
- package/src/styles/tailwind.css +4 -0
- package/src/styles/theme.css +312 -0
- package/vite.config.ts +38 -0
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import svgPaths from "../../../imports/svg-liuy2nykz3";
|
|
3
|
+
import { SectionHeader } from "./SectionHeader";
|
|
4
|
+
import { CopyButton } from "./CopyButton";
|
|
5
|
+
|
|
6
|
+
/* ─── Shared icon helpers ─── */
|
|
7
|
+
function CaretDownIcon({ className = "fill-primary" }: { className?: string }) {
|
|
8
|
+
return (
|
|
9
|
+
<svg width="9" height="20" viewBox="0 0 9.02104 20" fill="none" className="shrink-0">
|
|
10
|
+
<path d={svgPaths.p2e3d1e00} className={className} />
|
|
11
|
+
</svg>
|
|
12
|
+
);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function CrossThickIcon() {
|
|
16
|
+
return (
|
|
17
|
+
<svg width="10" height="16" viewBox="0 0 10 16" fill="none" className="shrink-0">
|
|
18
|
+
<path d={svgPaths.paa65200} fill="#236A84" />
|
|
19
|
+
</svg>
|
|
20
|
+
);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function ComputerWindowsIcon() {
|
|
24
|
+
return (
|
|
25
|
+
<svg width="57" height="40" viewBox="0 0 57 40" fill="none" className="shrink-0">
|
|
26
|
+
<g clipPath="url(#clip_cw)">
|
|
27
|
+
<path d="M11 7H4V9H11V7Z" fill="white" />
|
|
28
|
+
<path d="M30 38H25V40H30V38Z" fill="white" />
|
|
29
|
+
<path d={svgPaths.p187e61c0} fill="white" />
|
|
30
|
+
<path d={svgPaths.p3716d780} fill="white" />
|
|
31
|
+
<path d={svgPaths.p3215c000} fill="white" />
|
|
32
|
+
</g>
|
|
33
|
+
<defs>
|
|
34
|
+
<clipPath id="clip_cw"><rect fill="white" width="57" height="40" /></clipPath>
|
|
35
|
+
</defs>
|
|
36
|
+
</svg>
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function ChromeIcon() {
|
|
41
|
+
return (
|
|
42
|
+
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" className="shrink-0 size-5">
|
|
43
|
+
<g clipPath="url(#clip_chr)">
|
|
44
|
+
<path d={svgPaths.p347a1500} fill="white" />
|
|
45
|
+
</g>
|
|
46
|
+
<defs>
|
|
47
|
+
<clipPath id="clip_chr"><rect fill="white" width="20" height="20" /></clipPath>
|
|
48
|
+
</defs>
|
|
49
|
+
</svg>
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function EdgeChromiumIcon() {
|
|
54
|
+
return (
|
|
55
|
+
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" className="shrink-0 size-5">
|
|
56
|
+
<g clipPath="url(#clip_ec)">
|
|
57
|
+
<path d={svgPaths.p3075cdf0} fill="white" />
|
|
58
|
+
</g>
|
|
59
|
+
<defs>
|
|
60
|
+
<clipPath id="clip_ec"><rect fill="white" width="20" height="20" /></clipPath>
|
|
61
|
+
</defs>
|
|
62
|
+
</svg>
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function EdgeIcon() {
|
|
67
|
+
return (
|
|
68
|
+
<svg width="19" height="20" viewBox="0 0 19 20" fill="none" className="shrink-0">
|
|
69
|
+
<g clipPath="url(#clip_edge)">
|
|
70
|
+
<path d={svgPaths.p5758100} fill="white" />
|
|
71
|
+
</g>
|
|
72
|
+
<defs>
|
|
73
|
+
<clipPath id="clip_edge"><rect fill="white" width="19" height="20" /></clipPath>
|
|
74
|
+
</defs>
|
|
75
|
+
</svg>
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/* ─── Sub-section label ─── */
|
|
80
|
+
function SubLabel({ children }: { children: React.ReactNode }) {
|
|
81
|
+
return (
|
|
82
|
+
<p className="font-['Source_Sans_3',sans-serif] text-foreground mb-5">
|
|
83
|
+
{children}
|
|
84
|
+
</p>
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/* ─── Section title (lighter weight, larger) ─── */
|
|
89
|
+
function SectionTitle({ children }: { children: React.ReactNode }) {
|
|
90
|
+
return (
|
|
91
|
+
<p className="font-['Source_Sans_Pro',sans-serif] text-foreground mb-2.5" style={{ fontWeight: 300, fontSize: 25, lineHeight: "28px" }}>
|
|
92
|
+
{children}
|
|
93
|
+
</p>
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/* ─── Removable tag pill ─── */
|
|
98
|
+
function Tag() {
|
|
99
|
+
return (
|
|
100
|
+
<div className="form-tag">
|
|
101
|
+
<span className="form-tag-content">Tag removable</span>
|
|
102
|
+
<div className="form-tag-remove">
|
|
103
|
+
<CrossThickIcon />
|
|
104
|
+
</div>
|
|
105
|
+
</div>
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/* ─── Select dropdown button ─── */
|
|
110
|
+
function SelectBtn({ hover = false }: { hover?: boolean }) {
|
|
111
|
+
return (
|
|
112
|
+
<div className={`form-select-btn relative ${hover ? "bg-link-hover" : ""}`}>
|
|
113
|
+
<div className="form-select-btn-border" aria-hidden="true" />
|
|
114
|
+
<CaretDownIcon className={hover ? "fill-foreground" : "fill-primary"} />
|
|
115
|
+
</div>
|
|
116
|
+
);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/* ─── Device info block (used inside device selects) ─── */
|
|
120
|
+
function DeviceInfo() {
|
|
121
|
+
return (
|
|
122
|
+
<div className="flex flex-col items-start py-[5px] shrink-0 w-[205px] z-[2]">
|
|
123
|
+
<div className="flex gap-2.5 items-start w-full">
|
|
124
|
+
<div className="shrink-0"><ComputerWindowsIcon /></div>
|
|
125
|
+
<div className="flex flex-col gap-0.5 items-start shrink-0">
|
|
126
|
+
<p className="font-['Source_Sans_Pro',sans-serif] text-foreground" style={{ fontSize: 14, lineHeight: "16px" }}>
|
|
127
|
+
Computer | Windows 11
|
|
128
|
+
</p>
|
|
129
|
+
<div className="flex gap-[5px] items-start shrink-0">
|
|
130
|
+
<ChromeIcon />
|
|
131
|
+
<EdgeChromiumIcon />
|
|
132
|
+
<EdgeIcon />
|
|
133
|
+
</div>
|
|
134
|
+
</div>
|
|
135
|
+
</div>
|
|
136
|
+
</div>
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/* ════════════════════════════════════════════════════
|
|
141
|
+
Main export
|
|
142
|
+
════════════════════════════════════════════════════ */
|
|
143
|
+
export function Forms() {
|
|
144
|
+
return (
|
|
145
|
+
<section>
|
|
146
|
+
<SectionHeader
|
|
147
|
+
title="Forms"
|
|
148
|
+
description="Form groups, labels, input fields, selects, device selectors, and multi-select tags — extracted as CSS component classes in forms.css"
|
|
149
|
+
/>
|
|
150
|
+
|
|
151
|
+
{/* ═══════════ FORM GROUPS ═══════════ */}
|
|
152
|
+
<div className="mb-12 max-w-[730px]">
|
|
153
|
+
<SectionTitle>Form groups</SectionTitle>
|
|
154
|
+
<SubLabel>Horizonal form groups</SubLabel>
|
|
155
|
+
|
|
156
|
+
<div className="group/item relative">
|
|
157
|
+
<div className="form-grid">
|
|
158
|
+
<div className="form-grid-label">
|
|
159
|
+
<span className="form-label">Form label</span>
|
|
160
|
+
</div>
|
|
161
|
+
<div className="form-input">
|
|
162
|
+
<div className="form-input-border" aria-hidden="true" />
|
|
163
|
+
<div className="flex items-center size-full">
|
|
164
|
+
<div className="form-input-inner">
|
|
165
|
+
<span className="form-input-text">Input field</span>
|
|
166
|
+
</div>
|
|
167
|
+
</div>
|
|
168
|
+
</div>
|
|
169
|
+
</div>
|
|
170
|
+
<div className="absolute top-0 right-0 opacity-0 group-hover/item:opacity-100 transition-opacity">
|
|
171
|
+
<CopyButton token=".form-grid + .form-label + .form-input" />
|
|
172
|
+
</div>
|
|
173
|
+
</div>
|
|
174
|
+
</div>
|
|
175
|
+
|
|
176
|
+
{/* ═══════════ FORM LABEL ═══════════ */}
|
|
177
|
+
<div className="mb-12 max-w-[730px]">
|
|
178
|
+
<SectionTitle>Form label</SectionTitle>
|
|
179
|
+
<SubLabel>Label for form groups and elements</SubLabel>
|
|
180
|
+
|
|
181
|
+
<div className="group/item relative inline-block">
|
|
182
|
+
<span className="form-label">Form label</span>
|
|
183
|
+
<div className="absolute -top-1 -right-6 opacity-0 group-hover/item:opacity-100 transition-opacity">
|
|
184
|
+
<CopyButton token=".form-label" />
|
|
185
|
+
</div>
|
|
186
|
+
</div>
|
|
187
|
+
</div>
|
|
188
|
+
|
|
189
|
+
{/* ═══════════ INPUT FIELDS ═══════════ */}
|
|
190
|
+
<div className="mb-12 max-w-[730px]">
|
|
191
|
+
<SectionTitle>Input fields</SectionTitle>
|
|
192
|
+
<SubLabel>Input field in different states</SubLabel>
|
|
193
|
+
|
|
194
|
+
<div className="flex flex-col gap-[15px]">
|
|
195
|
+
{/* Placeholder */}
|
|
196
|
+
<div className="group/item relative">
|
|
197
|
+
<div className="form-input">
|
|
198
|
+
<div className="form-input-border" aria-hidden="true" />
|
|
199
|
+
<div className="flex items-center size-full">
|
|
200
|
+
<div className="form-input-inner">
|
|
201
|
+
<span className="form-input-placeholder">Placeholder</span>
|
|
202
|
+
</div>
|
|
203
|
+
</div>
|
|
204
|
+
</div>
|
|
205
|
+
<div className="absolute top-2 right-2 opacity-0 group-hover/item:opacity-100 transition-opacity">
|
|
206
|
+
<CopyButton token=".form-input (placeholder)" />
|
|
207
|
+
</div>
|
|
208
|
+
</div>
|
|
209
|
+
|
|
210
|
+
{/* Filled */}
|
|
211
|
+
<div className="group/item relative">
|
|
212
|
+
<div className="form-input">
|
|
213
|
+
<div className="form-input-border" aria-hidden="true" />
|
|
214
|
+
<div className="flex items-center size-full">
|
|
215
|
+
<div className="form-input-inner">
|
|
216
|
+
<span className="form-input-text">Filled input</span>
|
|
217
|
+
</div>
|
|
218
|
+
</div>
|
|
219
|
+
</div>
|
|
220
|
+
<div className="absolute top-2 right-2 opacity-0 group-hover/item:opacity-100 transition-opacity">
|
|
221
|
+
<CopyButton token=".form-input (filled)" />
|
|
222
|
+
</div>
|
|
223
|
+
</div>
|
|
224
|
+
|
|
225
|
+
{/* Error */}
|
|
226
|
+
<div className="group/item relative">
|
|
227
|
+
<div className="form-input form-input-error">
|
|
228
|
+
<div className="form-input-border" aria-hidden="true" />
|
|
229
|
+
<div className="flex items-center size-full">
|
|
230
|
+
<div className="form-input-inner">
|
|
231
|
+
<span className="form-input-text">Input with error</span>
|
|
232
|
+
</div>
|
|
233
|
+
</div>
|
|
234
|
+
</div>
|
|
235
|
+
<div className="absolute top-2 right-2 opacity-0 group-hover/item:opacity-100 transition-opacity">
|
|
236
|
+
<CopyButton token=".form-input-error" />
|
|
237
|
+
</div>
|
|
238
|
+
</div>
|
|
239
|
+
|
|
240
|
+
{/* Readonly */}
|
|
241
|
+
<div className="group/item relative">
|
|
242
|
+
<div className="form-input-readonly">
|
|
243
|
+
<div className="flex items-center size-full">
|
|
244
|
+
<div className="form-input-inner">
|
|
245
|
+
<span className="form-input-text">Readonly field</span>
|
|
246
|
+
</div>
|
|
247
|
+
</div>
|
|
248
|
+
</div>
|
|
249
|
+
<div className="absolute top-2 right-2 opacity-0 group-hover/item:opacity-100 transition-opacity">
|
|
250
|
+
<CopyButton token=".form-input-readonly" />
|
|
251
|
+
</div>
|
|
252
|
+
</div>
|
|
253
|
+
</div>
|
|
254
|
+
</div>
|
|
255
|
+
|
|
256
|
+
{/* ═══════════ SELECTS ═══════════ */}
|
|
257
|
+
<div className="max-w-[730px]">
|
|
258
|
+
<SectionTitle>Selects</SectionTitle>
|
|
259
|
+
|
|
260
|
+
{/* ── Select states ── */}
|
|
261
|
+
<SubLabel>Select elements in different states</SubLabel>
|
|
262
|
+
<div className="flex flex-col gap-[15px] mb-8">
|
|
263
|
+
{/* Placeholder */}
|
|
264
|
+
<div className="group/item relative">
|
|
265
|
+
<div className="form-select">
|
|
266
|
+
<div className="form-select-bordered" aria-hidden="true" />
|
|
267
|
+
<div className="flex items-center size-full">
|
|
268
|
+
<div className="form-select-inner">
|
|
269
|
+
<span className="form-select-placeholder">Please select</span>
|
|
270
|
+
<SelectBtn />
|
|
271
|
+
</div>
|
|
272
|
+
</div>
|
|
273
|
+
</div>
|
|
274
|
+
<div className="absolute top-2 right-12 opacity-0 group-hover/item:opacity-100 transition-opacity">
|
|
275
|
+
<CopyButton token=".form-select (placeholder)" />
|
|
276
|
+
</div>
|
|
277
|
+
</div>
|
|
278
|
+
|
|
279
|
+
{/* Hover */}
|
|
280
|
+
<div className="group/item relative">
|
|
281
|
+
<div className="form-select-hover">
|
|
282
|
+
<div className="flex items-center size-full">
|
|
283
|
+
<div className="form-select-inner">
|
|
284
|
+
<span className="form-select-placeholder !text-foreground">Hover</span>
|
|
285
|
+
<SelectBtn hover />
|
|
286
|
+
</div>
|
|
287
|
+
</div>
|
|
288
|
+
</div>
|
|
289
|
+
<div className="absolute top-2 right-12 opacity-0 group-hover/item:opacity-100 transition-opacity">
|
|
290
|
+
<CopyButton token=".form-select-hover" />
|
|
291
|
+
</div>
|
|
292
|
+
</div>
|
|
293
|
+
|
|
294
|
+
{/* Option selected */}
|
|
295
|
+
<div className="group/item relative">
|
|
296
|
+
<div className="form-select">
|
|
297
|
+
<div className="form-select-bordered" aria-hidden="true" />
|
|
298
|
+
<div className="flex items-center size-full">
|
|
299
|
+
<div className="form-select-inner">
|
|
300
|
+
<span className="form-select-text">Option selected</span>
|
|
301
|
+
<SelectBtn />
|
|
302
|
+
</div>
|
|
303
|
+
</div>
|
|
304
|
+
</div>
|
|
305
|
+
<div className="absolute top-2 right-12 opacity-0 group-hover/item:opacity-100 transition-opacity">
|
|
306
|
+
<CopyButton token=".form-select (selected)" />
|
|
307
|
+
</div>
|
|
308
|
+
</div>
|
|
309
|
+
|
|
310
|
+
{/* Option selected hover */}
|
|
311
|
+
<div className="group/item relative">
|
|
312
|
+
<div className="form-select-hover">
|
|
313
|
+
<div className="flex items-center size-full">
|
|
314
|
+
<div className="form-select-inner">
|
|
315
|
+
<span className="form-select-text">Option selected hover</span>
|
|
316
|
+
<SelectBtn hover />
|
|
317
|
+
</div>
|
|
318
|
+
</div>
|
|
319
|
+
</div>
|
|
320
|
+
<div className="absolute top-2 right-12 opacity-0 group-hover/item:opacity-100 transition-opacity">
|
|
321
|
+
<CopyButton token=".form-select-hover (selected)" />
|
|
322
|
+
</div>
|
|
323
|
+
</div>
|
|
324
|
+
</div>
|
|
325
|
+
|
|
326
|
+
{/* ── Device selector ── */}
|
|
327
|
+
<SubLabel>Component for selecting devices</SubLabel>
|
|
328
|
+
<div className="flex flex-col gap-[15px] mb-8">
|
|
329
|
+
{/* Normal */}
|
|
330
|
+
<div className="group/item relative">
|
|
331
|
+
<div className="form-select-device">
|
|
332
|
+
<div className="flex items-center size-full">
|
|
333
|
+
<div className="form-select-inner">
|
|
334
|
+
<DeviceInfo />
|
|
335
|
+
<div className="form-select-btn relative" style={{ height: 70 }}>
|
|
336
|
+
<div className="form-select-btn-border" aria-hidden="true" />
|
|
337
|
+
<CaretDownIcon className="fill-primary" />
|
|
338
|
+
</div>
|
|
339
|
+
</div>
|
|
340
|
+
</div>
|
|
341
|
+
</div>
|
|
342
|
+
<div className="absolute top-2 right-12 opacity-0 group-hover/item:opacity-100 transition-opacity">
|
|
343
|
+
<CopyButton token=".form-select-device" />
|
|
344
|
+
</div>
|
|
345
|
+
</div>
|
|
346
|
+
|
|
347
|
+
{/* Hover */}
|
|
348
|
+
<div className="group/item relative">
|
|
349
|
+
<div className="form-select-device-hover">
|
|
350
|
+
<div className="flex items-center size-full">
|
|
351
|
+
<div className="form-select-inner">
|
|
352
|
+
<DeviceInfo />
|
|
353
|
+
<div className="form-select-btn bg-link-hover relative" style={{ height: 70 }}>
|
|
354
|
+
<div className="form-select-btn-border" aria-hidden="true" />
|
|
355
|
+
<CaretDownIcon className="fill-foreground" />
|
|
356
|
+
</div>
|
|
357
|
+
</div>
|
|
358
|
+
</div>
|
|
359
|
+
</div>
|
|
360
|
+
<div className="absolute top-2 right-12 opacity-0 group-hover/item:opacity-100 transition-opacity">
|
|
361
|
+
<CopyButton token=".form-select-device-hover" />
|
|
362
|
+
</div>
|
|
363
|
+
</div>
|
|
364
|
+
</div>
|
|
365
|
+
|
|
366
|
+
{/* ── Multi select ── */}
|
|
367
|
+
<SubLabel>Multi select</SubLabel>
|
|
368
|
+
<div className="flex flex-col gap-[15px]">
|
|
369
|
+
{/* Normal */}
|
|
370
|
+
<div className="group/item relative">
|
|
371
|
+
<div className="form-select">
|
|
372
|
+
<div className="form-select-bordered" aria-hidden="true" />
|
|
373
|
+
<div className="flex items-center size-full">
|
|
374
|
+
<div className="form-select-inner">
|
|
375
|
+
<div className="flex gap-[5px] items-center shrink-0 z-[3]">
|
|
376
|
+
<Tag />
|
|
377
|
+
<Tag />
|
|
378
|
+
</div>
|
|
379
|
+
<SelectBtn />
|
|
380
|
+
</div>
|
|
381
|
+
</div>
|
|
382
|
+
</div>
|
|
383
|
+
<div className="absolute top-2 right-12 opacity-0 group-hover/item:opacity-100 transition-opacity">
|
|
384
|
+
<CopyButton token=".form-select + .form-tag" />
|
|
385
|
+
</div>
|
|
386
|
+
</div>
|
|
387
|
+
|
|
388
|
+
{/* Hover */}
|
|
389
|
+
<div className="group/item relative">
|
|
390
|
+
<div className="form-select-hover">
|
|
391
|
+
<div className="flex items-center size-full">
|
|
392
|
+
<div className="form-select-inner">
|
|
393
|
+
<div className="flex gap-[5px] items-center shrink-0 z-[3]">
|
|
394
|
+
<Tag />
|
|
395
|
+
<Tag />
|
|
396
|
+
</div>
|
|
397
|
+
<SelectBtn hover />
|
|
398
|
+
</div>
|
|
399
|
+
</div>
|
|
400
|
+
</div>
|
|
401
|
+
<div className="absolute top-2 right-12 opacity-0 group-hover/item:opacity-100 transition-opacity">
|
|
402
|
+
<CopyButton token=".form-select-hover + .form-tag" />
|
|
403
|
+
</div>
|
|
404
|
+
</div>
|
|
405
|
+
</div>
|
|
406
|
+
</div>
|
|
407
|
+
</section>
|
|
408
|
+
);
|
|
409
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import svgPaths from "../../../imports/svg-umftvfphsk";
|
|
3
|
+
import { SectionHeader } from "./SectionHeader";
|
|
4
|
+
import { CopyButton } from "./CopyButton";
|
|
5
|
+
|
|
6
|
+
function IconDisplay({ name, children, size = 20, token }: { name: string; children: React.ReactNode; size?: number; token?: string }) {
|
|
7
|
+
return (
|
|
8
|
+
<div className="flex flex-col items-center gap-3">
|
|
9
|
+
<div className="group/icon bg-secondary rounded-lg p-4 flex items-center justify-center relative" style={{ width: size + 32, height: size + 32 }}>
|
|
10
|
+
{children}
|
|
11
|
+
{token && (
|
|
12
|
+
<div className="absolute -top-1 -right-1 opacity-0 group-hover/icon:opacity-100 transition-opacity">
|
|
13
|
+
<CopyButton token={token} />
|
|
14
|
+
</div>
|
|
15
|
+
)}
|
|
16
|
+
</div>
|
|
17
|
+
<p className="font-['Source_Sans_3',sans-serif] text-xs text-muted-foreground text-center">
|
|
18
|
+
{name}
|
|
19
|
+
</p>
|
|
20
|
+
</div>
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function Icons() {
|
|
25
|
+
return (
|
|
26
|
+
<section>
|
|
27
|
+
<SectionHeader
|
|
28
|
+
title="Icons"
|
|
29
|
+
description="Status icons, navigation icons, and action icons"
|
|
30
|
+
/>
|
|
31
|
+
|
|
32
|
+
{/* Status Icons */}
|
|
33
|
+
<div className="mb-8">
|
|
34
|
+
<p className="font-['Source_Sans_3',sans-serif] text-[14px] text-[#888] uppercase tracking-wider mb-4">
|
|
35
|
+
Status Icons
|
|
36
|
+
</p>
|
|
37
|
+
<div className="flex flex-wrap gap-6">
|
|
38
|
+
<IconDisplay name="Check (Passed)" size={20} token="svgPaths.p30b87920 | fill: #33BA9E">
|
|
39
|
+
<svg width="20" height="20" viewBox="0 0 20 20" fill="none">
|
|
40
|
+
<path d={svgPaths.p30b87920} fill="#33BA9E" />
|
|
41
|
+
</svg>
|
|
42
|
+
</IconDisplay>
|
|
43
|
+
<IconDisplay name="Cross (Failed)" size={20} token="svgPaths.p30bab400 | fill: #FF3131">
|
|
44
|
+
<svg width="20" height="20" viewBox="0 0 20 20" fill="none">
|
|
45
|
+
<path d={svgPaths.p30bab400} fill="#FF3131" />
|
|
46
|
+
</svg>
|
|
47
|
+
</IconDisplay>
|
|
48
|
+
<IconDisplay name="Blocked" size={20} token="svgPaths.p13555100 | fill: #F48D21">
|
|
49
|
+
<svg width="20" height="20" viewBox="0 0 20 20" fill="none">
|
|
50
|
+
<path d={svgPaths.p13555100} fill="#F48D21" />
|
|
51
|
+
</svg>
|
|
52
|
+
</IconDisplay>
|
|
53
|
+
<IconDisplay name="Sync" size={20} token="svgPaths.p3ed72680 | fill: #888888">
|
|
54
|
+
<svg width="20" height="20" viewBox="0 0 20 20" fill="none">
|
|
55
|
+
<path d={svgPaths.p3ed72680} fill="#888888" />
|
|
56
|
+
</svg>
|
|
57
|
+
</IconDisplay>
|
|
58
|
+
<IconDisplay name="Check Thick" size={10} token="svgPaths.p2b4f4400 | fill: #888888">
|
|
59
|
+
<svg width="11" height="10" viewBox="0 0 11.1504 10.1504" fill="none">
|
|
60
|
+
<path d={svgPaths.p2b4f4400} fill="#888888" />
|
|
61
|
+
</svg>
|
|
62
|
+
</IconDisplay>
|
|
63
|
+
</div>
|
|
64
|
+
</div>
|
|
65
|
+
|
|
66
|
+
{/* Navigation Icons */}
|
|
67
|
+
<div className="mb-8">
|
|
68
|
+
<p className="font-['Source_Sans_3',sans-serif] text-[14px] text-[#888] uppercase tracking-wider mb-4">
|
|
69
|
+
Navigation & UI Icons
|
|
70
|
+
</p>
|
|
71
|
+
<div className="flex flex-wrap gap-6">
|
|
72
|
+
<IconDisplay name="Triangle Down" size={20} token='d="M10 15L4 5H16L10 15Z" | fill: #888888'>
|
|
73
|
+
<svg width="20" height="20" viewBox="0 0 20 20" fill="none">
|
|
74
|
+
<path d="M10 15L4 5H16L10 15Z" fill="#888888" />
|
|
75
|
+
</svg>
|
|
76
|
+
</IconDisplay>
|
|
77
|
+
<IconDisplay name="Triangle Right" size={20} token='d="M15 10L5 16V4L15 10Z" | fill: #888888'>
|
|
78
|
+
<svg width="20" height="20" viewBox="0 0 20 20" fill="none">
|
|
79
|
+
<path d="M15 10L5 16V4L15 10Z" fill="#888888" />
|
|
80
|
+
</svg>
|
|
81
|
+
</IconDisplay>
|
|
82
|
+
<IconDisplay name="Triangle Left" size={20} token='d="M15 16L5 10L15 4V16Z" | fill: #888888'>
|
|
83
|
+
<svg width="20" height="20" viewBox="0 0 20 20" fill="none">
|
|
84
|
+
<path d="M15 16L5 10L15 4V16Z" fill="#888888" />
|
|
85
|
+
</svg>
|
|
86
|
+
</IconDisplay>
|
|
87
|
+
<IconDisplay name="Plus" size={20} token="svgPaths.p185c8f80 | fill: white">
|
|
88
|
+
<svg width="20" height="20" viewBox="0 0 20 20" fill="none">
|
|
89
|
+
<path d={svgPaths.p185c8f80} fill="white" />
|
|
90
|
+
</svg>
|
|
91
|
+
</IconDisplay>
|
|
92
|
+
<IconDisplay name="More" size={20} token="svgPaths.p5e64f80 | fill: #888888">
|
|
93
|
+
<svg width="20" height="20" viewBox="0 0 20 20" fill="none">
|
|
94
|
+
<path d={svgPaths.p5e64f80} fill="#888888" />
|
|
95
|
+
</svg>
|
|
96
|
+
</IconDisplay>
|
|
97
|
+
</div>
|
|
98
|
+
</div>
|
|
99
|
+
|
|
100
|
+
{/* Large Icons */}
|
|
101
|
+
<div>
|
|
102
|
+
<p className="font-['Source_Sans_3',sans-serif] text-[14px] text-[#888] uppercase tracking-wider mb-4">
|
|
103
|
+
Large Icons (60px)
|
|
104
|
+
</p>
|
|
105
|
+
<div className="flex flex-wrap gap-6">
|
|
106
|
+
<IconDisplay name="Plus XL" size={60} token="svgPaths.p2455100 | fill: #78EAC1 | 60x60">
|
|
107
|
+
<svg width="60" height="60" viewBox="0 0 60 60" fill="none">
|
|
108
|
+
<g clipPath="url(#clip_plus_xl)">
|
|
109
|
+
<path d={svgPaths.p2455100} fill="#78EAC1" />
|
|
110
|
+
</g>
|
|
111
|
+
<defs>
|
|
112
|
+
<clipPath id="clip_plus_xl"><rect fill="white" height="60" width="60" /></clipPath>
|
|
113
|
+
</defs>
|
|
114
|
+
</svg>
|
|
115
|
+
</IconDisplay>
|
|
116
|
+
<IconDisplay name="Test Running" size={60} token="svgPaths.p2af2dd00 | fill: #888888 | 60x60">
|
|
117
|
+
<svg width="60" height="60" viewBox="0 0 60 60" fill="none">
|
|
118
|
+
<g clipPath="url(#clip_test_run)">
|
|
119
|
+
<path d={svgPaths.p2af2dd00} fill="#888888" />
|
|
120
|
+
</g>
|
|
121
|
+
<defs>
|
|
122
|
+
<clipPath id="clip_test_run"><rect fill="white" height="60" width="60" /></clipPath>
|
|
123
|
+
</defs>
|
|
124
|
+
</svg>
|
|
125
|
+
</IconDisplay>
|
|
126
|
+
<IconDisplay name="Review" size={60} token="svgPaths.p1981c800 | fill: #595959 | 48x60">
|
|
127
|
+
<svg width="48" height="60" viewBox="0 0 48 60" fill="none">
|
|
128
|
+
<g clipPath="url(#clip_review)">
|
|
129
|
+
<path d={svgPaths.p1981c800} fill="#595959" />
|
|
130
|
+
</g>
|
|
131
|
+
<defs>
|
|
132
|
+
<clipPath id="clip_review"><rect fill="white" height="60" width="48" /></clipPath>
|
|
133
|
+
</defs>
|
|
134
|
+
</svg>
|
|
135
|
+
</IconDisplay>
|
|
136
|
+
</div>
|
|
137
|
+
</div>
|
|
138
|
+
</section>
|
|
139
|
+
);
|
|
140
|
+
}
|