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,235 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import svgPaths from "../../../imports/svg-umftvfphsk";
|
|
3
|
+
import imgBot1 from "figma:asset/9d7a018c9a6938d439d9059f82753d232ce63804.png";
|
|
4
|
+
import { imgGroup } from "../../../imports/svg-hm2n0";
|
|
5
|
+
import { SectionHeader } from "./SectionHeader";
|
|
6
|
+
import { CopyButton } from "./CopyButton";
|
|
7
|
+
|
|
8
|
+
export function Patterns() {
|
|
9
|
+
return (
|
|
10
|
+
<section>
|
|
11
|
+
<SectionHeader
|
|
12
|
+
title="Composite Patterns"
|
|
13
|
+
description="Commonly used component compositions and layout patterns"
|
|
14
|
+
/>
|
|
15
|
+
|
|
16
|
+
{/* Status Stepper */}
|
|
17
|
+
<div className="mb-8">
|
|
18
|
+
<p className="font-['Source_Sans_3',sans-serif] text-[14px] text-[#888] uppercase tracking-wider mb-4">
|
|
19
|
+
Status Stepper / Wizard
|
|
20
|
+
</p>
|
|
21
|
+
<div className="max-w-3xl space-y-4">
|
|
22
|
+
{/* Pending start */}
|
|
23
|
+
<div className="group/step bg-[#262626] h-[60px] rounded-[10px] relative">
|
|
24
|
+
<div className="flex items-center gap-2.5 pl-[50px] pr-5 py-2.5 h-full">
|
|
25
|
+
<div className="bg-[#2e2e2e] flex-1 h-[40px] flex items-center justify-center rounded-[12px]">
|
|
26
|
+
<span className="font-['Source_Sans_3',sans-serif] text-[14px] text-white">pending start</span>
|
|
27
|
+
</div>
|
|
28
|
+
<div className="bg-[#1d1d1d] h-[40px] flex items-center justify-center px-5 rounded-[10px]">
|
|
29
|
+
<span className="font-['Source_Sans_3',sans-serif] text-[14px] text-[#888]">+ 6 to do</span>
|
|
30
|
+
</div>
|
|
31
|
+
</div>
|
|
32
|
+
<div className="absolute top-1 right-1 opacity-0 group-hover/step:opacity-100 transition-opacity z-10">
|
|
33
|
+
<CopyButton token="bg-[#262626] h-[60px] rounded-[10px] | inner: bg-[#2e2e2e] rounded-[12px] | badge: bg-[#1d1d1d] rounded-[10px]" />
|
|
34
|
+
</div>
|
|
35
|
+
</div>
|
|
36
|
+
|
|
37
|
+
{/* Running with progress */}
|
|
38
|
+
<div className="group/step bg-[#262626] h-[60px] rounded-[10px] relative">
|
|
39
|
+
<div className="flex items-center gap-2.5 pl-[50px] pr-5 py-2.5 h-full">
|
|
40
|
+
<div className="bg-[#1d1d1d] h-[40px] flex items-center justify-center gap-3.5 px-5 rounded-[10px] shrink-0">
|
|
41
|
+
<svg width="11" height="10" viewBox="0 0 11.1504 10.1504" fill="none">
|
|
42
|
+
<path d={svgPaths.p2b4f4400} fill="#888888" />
|
|
43
|
+
</svg>
|
|
44
|
+
<span className="font-['Source_Sans_3',sans-serif] text-[14px] text-[#888]">3 done</span>
|
|
45
|
+
</div>
|
|
46
|
+
<div className="bg-[#2e2e2e] flex-1 h-[40px] flex items-center justify-center gap-4 rounded-[12px]">
|
|
47
|
+
<svg width="20" height="20" viewBox="0 0 20 20" fill="none">
|
|
48
|
+
<path d={svgPaths.p3ed72680} fill="#888888" />
|
|
49
|
+
</svg>
|
|
50
|
+
<span className="font-['Source_Sans_3',sans-serif] text-[14px] text-white">Executing checks</span>
|
|
51
|
+
</div>
|
|
52
|
+
<div className="bg-[#1d1d1d] h-[40px] flex items-center justify-center gap-3.5 px-5 rounded-[10px] shrink-0">
|
|
53
|
+
<span className="font-['Source_Sans_3',sans-serif] text-[14px] text-[#888]">+ 3 to do</span>
|
|
54
|
+
</div>
|
|
55
|
+
</div>
|
|
56
|
+
<div className="absolute top-1 right-1 opacity-0 group-hover/step:opacity-100 transition-opacity z-10">
|
|
57
|
+
<CopyButton token="bg-[#262626] h-[60px] rounded-[10px] | progress: bg-[#2e2e2e] rounded-[12px] | badge: bg-[#1d1d1d] rounded-[10px]" />
|
|
58
|
+
</div>
|
|
59
|
+
</div>
|
|
60
|
+
|
|
61
|
+
{/* Queue progress */}
|
|
62
|
+
<div className="group/step flex gap-2.5 relative">
|
|
63
|
+
{[
|
|
64
|
+
{ count: "22", label: "Pages in queue" },
|
|
65
|
+
{ count: "227", label: "Executing checks" },
|
|
66
|
+
{ count: "2", label: "Pages completed" },
|
|
67
|
+
].map((step) => (
|
|
68
|
+
<div key={step.label} className="bg-[#222] flex-1 h-[40px] flex items-center justify-center gap-4 rounded-[12px]">
|
|
69
|
+
<span className="font-['Source_Sans_3',sans-serif] text-[22px] text-[#888]" style={{ fontWeight: 700 }}>{step.count}</span>
|
|
70
|
+
<span className="font-['Source_Sans_3',sans-serif] text-[14px] text-white">{step.label}</span>
|
|
71
|
+
</div>
|
|
72
|
+
))}
|
|
73
|
+
<div className="absolute top-1 right-1 opacity-0 group-hover/step:opacity-100 transition-opacity z-10">
|
|
74
|
+
<CopyButton token="flex gap-2.5 | item: bg-[#222] h-[40px] rounded-[12px] | counter: text-[22px] weight-700" />
|
|
75
|
+
</div>
|
|
76
|
+
</div>
|
|
77
|
+
</div>
|
|
78
|
+
</div>
|
|
79
|
+
|
|
80
|
+
{/* Chat / Message Pattern */}
|
|
81
|
+
<div className="mb-8">
|
|
82
|
+
<p className="font-['Source_Sans_3',sans-serif] text-[14px] text-[#888] uppercase tracking-wider mb-4">
|
|
83
|
+
Chat Messages
|
|
84
|
+
</p>
|
|
85
|
+
<div className="max-w-2xl space-y-5">
|
|
86
|
+
{/* Bot message with failure */}
|
|
87
|
+
<div className="group/msg flex gap-5 items-start relative">
|
|
88
|
+
{/* Avatar */}
|
|
89
|
+
<div className="relative overflow-clip rounded-full shrink-0 size-[40px]">
|
|
90
|
+
<svg width="40" height="40" viewBox="0 0 40 40" fill="none">
|
|
91
|
+
<circle cx="20" cy="20" r="20" fill="#7954FF" />
|
|
92
|
+
</svg>
|
|
93
|
+
<div className="absolute left-1/2 -translate-x-1/2 top-[8px] w-[34px] h-[53px]">
|
|
94
|
+
<img alt="" className="absolute h-full left-0 top-0 w-full object-cover" src={imgBot1} />
|
|
95
|
+
</div>
|
|
96
|
+
</div>
|
|
97
|
+
{/* Message */}
|
|
98
|
+
<div className="bg-[#262626] flex-1 rounded-[15px] px-4 py-2.5">
|
|
99
|
+
<div className="flex items-center gap-2.5">
|
|
100
|
+
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" className="shrink-0">
|
|
101
|
+
<path d={svgPaths.p30bab400} fill="#FF3131" />
|
|
102
|
+
</svg>
|
|
103
|
+
<span className="font-['Source_Sans_3',sans-serif] text-[16px] text-white flex-1">The check failed</span>
|
|
104
|
+
<span className="font-['Source_Sans_3',sans-serif] text-[12px] text-[#888] uppercase" style={{ fontWeight: 600 }}>5 mins ago</span>
|
|
105
|
+
</div>
|
|
106
|
+
</div>
|
|
107
|
+
<div className="absolute top-0 right-0 opacity-0 group-hover/msg:opacity-100 transition-opacity z-10">
|
|
108
|
+
<CopyButton token="avatar: size-[40px] bg-[#7954FF] rounded-full | bubble: bg-[#262626] rounded-[15px] px-4 py-2.5" />
|
|
109
|
+
</div>
|
|
110
|
+
</div>
|
|
111
|
+
|
|
112
|
+
{/* Bot message with justification */}
|
|
113
|
+
<div className="group/msg flex gap-5 items-start relative">
|
|
114
|
+
<div className="relative overflow-clip rounded-full shrink-0 size-[40px]">
|
|
115
|
+
<svg width="40" height="40" viewBox="0 0 40 40" fill="none">
|
|
116
|
+
<circle cx="20" cy="20" r="20" fill="#7954FF" />
|
|
117
|
+
</svg>
|
|
118
|
+
<div className="absolute left-1/2 -translate-x-1/2 top-[8px] w-[34px] h-[53px]">
|
|
119
|
+
<img alt="" className="absolute h-full left-0 top-0 w-full object-cover" src={imgBot1} />
|
|
120
|
+
</div>
|
|
121
|
+
</div>
|
|
122
|
+
<div className="bg-[#262626] rounded-[15px] px-4 py-2.5 max-w-xl">
|
|
123
|
+
<div className="flex items-start pb-2.5 text-[#888]">
|
|
124
|
+
<span className="font-['Source_Sans_3',sans-serif] text-[12px] uppercase flex-1" style={{ fontWeight: 600 }}>Justification</span>
|
|
125
|
+
<span className="font-['Source_Sans_3',sans-serif] text-[12px] uppercase text-right" style={{ fontWeight: 600 }}>5 mins ago</span>
|
|
126
|
+
</div>
|
|
127
|
+
<p className="font-['Source_Sans_3',sans-serif] text-[16px] text-white">
|
|
128
|
+
The contact information is clearly visible at the bottom of the page. This satisfies the check requirement.
|
|
129
|
+
</p>
|
|
130
|
+
</div>
|
|
131
|
+
<div className="absolute top-0 right-0 opacity-0 group-hover/msg:opacity-100 transition-opacity z-10">
|
|
132
|
+
<CopyButton token="bubble: bg-[#262626] rounded-[15px] px-4 py-2.5 | label: text-[12px] uppercase weight-600 text-[#888]" />
|
|
133
|
+
</div>
|
|
134
|
+
</div>
|
|
135
|
+
|
|
136
|
+
{/* Action buttons */}
|
|
137
|
+
<div className="pl-[60px] flex gap-2.5">
|
|
138
|
+
<button className="bg-[#78eac1] flex items-center h-[40px] px-5 rounded-[50px] cursor-pointer">
|
|
139
|
+
<span className="font-['Source_Sans_3',sans-serif] text-[16px] text-[#1d1d1d] uppercase leading-[14px]">Re-run check</span>
|
|
140
|
+
</button>
|
|
141
|
+
<button className="relative flex items-center h-[40px] px-5 rounded-[50px] cursor-pointer">
|
|
142
|
+
<div className="absolute inset-0 border border-[#78eac1] rounded-[50px] pointer-events-none" />
|
|
143
|
+
<span className="font-['Source_Sans_3',sans-serif] text-[16px] text-[#78eac1] uppercase">Update check</span>
|
|
144
|
+
</button>
|
|
145
|
+
</div>
|
|
146
|
+
</div>
|
|
147
|
+
</div>
|
|
148
|
+
|
|
149
|
+
{/* Meta Info */}
|
|
150
|
+
<div className="mb-8">
|
|
151
|
+
<p className="font-['Source_Sans_3',sans-serif] text-[14px] text-[#888] uppercase tracking-wider mb-4">
|
|
152
|
+
Meta Info / Key-Value Pairs
|
|
153
|
+
</p>
|
|
154
|
+
<div className="group/meta bg-[#1d1d1d] rounded-[15px] p-6 space-y-3 max-w-3xl relative">
|
|
155
|
+
<div className="absolute top-2 right-2 opacity-0 group-hover/meta:opacity-100 transition-opacity z-10">
|
|
156
|
+
<CopyButton token="label: text-[12px] uppercase weight-600 w-24 | value: text-[16px] | gap-5" />
|
|
157
|
+
</div>
|
|
158
|
+
{[
|
|
159
|
+
{ label: "Created on:", value: "2025-07-23 19:11" },
|
|
160
|
+
{ label: "Last test:", value: "2025-07-23 19:11" },
|
|
161
|
+
{ label: "ID:", value: "321456987" },
|
|
162
|
+
{ label: "Test Suite:", value: "Test Suite name" },
|
|
163
|
+
{ label: "Status:", value: "running", icon: true },
|
|
164
|
+
{ label: "URL:", value: "https://akademija.by/" },
|
|
165
|
+
{ label: "Execution ID:", value: "fc02997b-8a59-439c-b0ab-32f3b2429ab9" },
|
|
166
|
+
].map((item) => (
|
|
167
|
+
<div key={item.label} className="flex gap-5 items-center text-[#888]">
|
|
168
|
+
<span className="font-['Source_Sans_3',sans-serif] text-[12px] uppercase w-24 shrink-0" style={{ fontWeight: 600 }}>{item.label}</span>
|
|
169
|
+
{item.icon ? (
|
|
170
|
+
<div className="flex items-center gap-2.5">
|
|
171
|
+
<svg width="20" height="20" viewBox="0 0 20 20" fill="none">
|
|
172
|
+
<path d={svgPaths.p3ed72680} fill="#888888" />
|
|
173
|
+
</svg>
|
|
174
|
+
<span className="font-['Source_Sans_3',sans-serif] text-[16px] text-white">{item.value}</span>
|
|
175
|
+
</div>
|
|
176
|
+
) : (
|
|
177
|
+
<span className="font-['Source_Sans_3',sans-serif] text-[16px]">{item.value}</span>
|
|
178
|
+
)}
|
|
179
|
+
</div>
|
|
180
|
+
))}
|
|
181
|
+
</div>
|
|
182
|
+
</div>
|
|
183
|
+
|
|
184
|
+
{/* Empty State */}
|
|
185
|
+
<div className="mb-8">
|
|
186
|
+
<p className="font-['Source_Sans_3',sans-serif] text-[14px] text-[#888] uppercase tracking-wider mb-4">
|
|
187
|
+
Empty State
|
|
188
|
+
</p>
|
|
189
|
+
<div className="group/empty bg-[#1d1d1d] rounded-[15px] p-12 flex items-center justify-center max-w-xl relative">
|
|
190
|
+
<div className="absolute top-2 right-2 opacity-0 group-hover/empty:opacity-100 transition-opacity z-10">
|
|
191
|
+
<CopyButton token="bg-[#1d1d1d] rounded-[15px] p-12 | icon: 60x60 #888 | text: text-[14px] text-[#888]" />
|
|
192
|
+
</div>
|
|
193
|
+
<div className="flex items-center gap-5">
|
|
194
|
+
<div className="overflow-clip relative size-[60px] shrink-0">
|
|
195
|
+
<div className="absolute inset-0 mask-alpha mask-intersect mask-no-clip mask-no-repeat mask-position-[0.001px_0px] mask-size-[60px_60px]" style={{ maskImage: `url('${imgGroup}')` }}>
|
|
196
|
+
<svg className="block size-full" fill="none" preserveAspectRatio="none" viewBox="0 0 60.0008 60">
|
|
197
|
+
<path d={svgPaths.pf5d0c00} fill="#888888" />
|
|
198
|
+
<path d={svgPaths.p1059d340} fill="#888888" />
|
|
199
|
+
<path d={svgPaths.pa1ccc00} fill="#888888" />
|
|
200
|
+
<path d={svgPaths.p2055340} fill="#888888" />
|
|
201
|
+
<path clipRule="evenodd" d={svgPaths.pda7a680} fill="#888888" fillRule="evenodd" />
|
|
202
|
+
<path clipRule="evenodd" d={svgPaths.pe04fd80} fill="#888888" fillRule="evenodd" />
|
|
203
|
+
<path d={svgPaths.p18546240} fill="#888888" />
|
|
204
|
+
<path clipRule="evenodd" d={svgPaths.pcc49e30} fill="#888888" fillRule="evenodd" />
|
|
205
|
+
</svg>
|
|
206
|
+
</div>
|
|
207
|
+
</div>
|
|
208
|
+
<p className="font-['Source_Sans_3',sans-serif] text-[14px] text-[#888]">
|
|
209
|
+
Please select an item from the list
|
|
210
|
+
<br />
|
|
211
|
+
to view its details
|
|
212
|
+
</p>
|
|
213
|
+
</div>
|
|
214
|
+
</div>
|
|
215
|
+
</div>
|
|
216
|
+
|
|
217
|
+
{/* Dividers */}
|
|
218
|
+
<div>
|
|
219
|
+
<p className="font-['Source_Sans_3',sans-serif] text-[14px] text-[#888] uppercase tracking-wider mb-4">
|
|
220
|
+
Dividers
|
|
221
|
+
</p>
|
|
222
|
+
<div className="group/divs bg-[#1d1d1d] rounded-[15px] p-6 space-y-4 max-w-xl relative">
|
|
223
|
+
<div className="absolute top-2 right-2 opacity-0 group-hover/divs:opacity-100 transition-opacity z-10">
|
|
224
|
+
<CopyButton token="divider: bg-[#2e2e2e] h-px | subtle: bg-[#181818] h-px" />
|
|
225
|
+
</div>
|
|
226
|
+
<p className="font-['Source_Sans_3',sans-serif] text-[14px] text-white">Content above divider</p>
|
|
227
|
+
<div className="bg-[#2e2e2e] h-px w-full" />
|
|
228
|
+
<p className="font-['Source_Sans_3',sans-serif] text-[14px] text-white">Divider (#2E2E2E, 1px)</p>
|
|
229
|
+
<div className="bg-[#181818] h-px w-full" />
|
|
230
|
+
<p className="font-['Source_Sans_3',sans-serif] text-[14px] text-white">Subtle divider (#181818, 1px)</p>
|
|
231
|
+
</div>
|
|
232
|
+
</div>
|
|
233
|
+
</section>
|
|
234
|
+
);
|
|
235
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { SectionHeader } from "./SectionHeader";
|
|
3
|
+
import { CopyButton } from "./CopyButton";
|
|
4
|
+
|
|
5
|
+
/* ─── Sub-section label ─── */
|
|
6
|
+
function SubLabel({ children }: { children: React.ReactNode }) {
|
|
7
|
+
return (
|
|
8
|
+
<p className="font-['Source_Sans_3',sans-serif] text-foreground mb-5">
|
|
9
|
+
{children}
|
|
10
|
+
</p>
|
|
11
|
+
);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/* ════════════════════════════════════════════════════
|
|
15
|
+
Main export
|
|
16
|
+
════════════════════════════════════════════════════ */
|
|
17
|
+
export function PopoverMenu() {
|
|
18
|
+
return (
|
|
19
|
+
<section>
|
|
20
|
+
<SectionHeader
|
|
21
|
+
title="Popover Menu"
|
|
22
|
+
description="Dropdown/popover menus and their action items — extracted as CSS component classes in popover.css"
|
|
23
|
+
/>
|
|
24
|
+
|
|
25
|
+
{/* ── Popover dropdown example ── */}
|
|
26
|
+
<SubLabel>A popover/dropdown menu for additional actions and links</SubLabel>
|
|
27
|
+
|
|
28
|
+
<div className="group/item relative inline-block mb-8">
|
|
29
|
+
<div className="popover-menu">
|
|
30
|
+
<div className="popover-btn">
|
|
31
|
+
<div className="popover-btn-inner">
|
|
32
|
+
<span className="popover-btn-text">Popover button</span>
|
|
33
|
+
</div>
|
|
34
|
+
</div>
|
|
35
|
+
<div className="popover-btn-last">
|
|
36
|
+
<div className="popover-btn-inner" style={{ paddingTop: 8 }}>
|
|
37
|
+
<span className="popover-btn-text">Edit</span>
|
|
38
|
+
</div>
|
|
39
|
+
</div>
|
|
40
|
+
<div className="popover-btn">
|
|
41
|
+
<div className="popover-btn-inner">
|
|
42
|
+
<span className="popover-btn-text">Delete</span>
|
|
43
|
+
</div>
|
|
44
|
+
</div>
|
|
45
|
+
</div>
|
|
46
|
+
<div className="absolute top-1 right-1 opacity-0 group-hover/item:opacity-100 transition-opacity">
|
|
47
|
+
<CopyButton token=".popover-menu" />
|
|
48
|
+
</div>
|
|
49
|
+
</div>
|
|
50
|
+
|
|
51
|
+
{/* ── Popover buttons with states ── */}
|
|
52
|
+
<SubLabel>Popover buttons</SubLabel>
|
|
53
|
+
|
|
54
|
+
<div className="flex flex-col gap-2.5 w-[240px]">
|
|
55
|
+
{/* Default */}
|
|
56
|
+
<div className="group/btn relative">
|
|
57
|
+
<div className="popover-btn">
|
|
58
|
+
<div className="popover-btn-inner">
|
|
59
|
+
<span className="popover-btn-text">Popover button</span>
|
|
60
|
+
</div>
|
|
61
|
+
</div>
|
|
62
|
+
<div className="absolute top-1 right-1 opacity-0 group-hover/btn:opacity-100 transition-opacity">
|
|
63
|
+
<CopyButton token=".popover-btn" />
|
|
64
|
+
</div>
|
|
65
|
+
</div>
|
|
66
|
+
|
|
67
|
+
{/* Hover (static display) */}
|
|
68
|
+
<div className="group/btn relative">
|
|
69
|
+
<div className="popover-btn !bg-link-hover !text-link-hover-foreground">
|
|
70
|
+
<div className="popover-btn-inner">
|
|
71
|
+
<span className="popover-btn-text">Hover</span>
|
|
72
|
+
</div>
|
|
73
|
+
</div>
|
|
74
|
+
<div className="absolute top-1 right-1 opacity-0 group-hover/btn:opacity-100 transition-opacity">
|
|
75
|
+
<CopyButton token=".popover-btn (hover state)" />
|
|
76
|
+
</div>
|
|
77
|
+
</div>
|
|
78
|
+
</div>
|
|
79
|
+
</section>
|
|
80
|
+
);
|
|
81
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
|
|
3
|
+
interface SectionHeaderProps {
|
|
4
|
+
title: string;
|
|
5
|
+
description?: string;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export function SectionHeader({ title, description }: SectionHeaderProps) {
|
|
9
|
+
return (
|
|
10
|
+
<div className="mb-8">
|
|
11
|
+
<h2 className="font-['Source_Sans_3',sans-serif] text-[25px] text-foreground uppercase tracking-wide">
|
|
12
|
+
{title}
|
|
13
|
+
</h2>
|
|
14
|
+
{description && (
|
|
15
|
+
<p className="font-['Source_Sans_3',sans-serif] text-[14px] text-muted-foreground mt-1">
|
|
16
|
+
{description}
|
|
17
|
+
</p>
|
|
18
|
+
)}
|
|
19
|
+
<div className="h-px bg-border mt-4" />
|
|
20
|
+
</div>
|
|
21
|
+
);
|
|
22
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { SectionHeader } from "./SectionHeader";
|
|
3
|
+
import { CopyButton } from "./CopyButton";
|
|
4
|
+
|
|
5
|
+
export function Spacing() {
|
|
6
|
+
return (
|
|
7
|
+
<section>
|
|
8
|
+
<SectionHeader
|
|
9
|
+
title="Spacing & Layout"
|
|
10
|
+
description="Spacing scale, border radii, and grid system"
|
|
11
|
+
/>
|
|
12
|
+
|
|
13
|
+
{/* Spacing Scale */}
|
|
14
|
+
<div className="mb-8">
|
|
15
|
+
<p className="font-['Source_Sans_3',sans-serif] text-[14px] text-[#888] uppercase tracking-wider mb-4">
|
|
16
|
+
Spacing Scale
|
|
17
|
+
</p>
|
|
18
|
+
<div className="bg-[#1d1d1d] rounded-[15px] p-6 space-y-3">
|
|
19
|
+
{[
|
|
20
|
+
{ px: 5, label: "xs" },
|
|
21
|
+
{ px: 10, label: "sm" },
|
|
22
|
+
{ px: 15, label: "md" },
|
|
23
|
+
{ px: 20, label: "lg" },
|
|
24
|
+
{ px: 30, label: "xl" },
|
|
25
|
+
{ px: 40, label: "2xl" },
|
|
26
|
+
{ px: 50, label: "3xl" },
|
|
27
|
+
].map((item) => (
|
|
28
|
+
<div key={item.px} className="group/space flex items-center gap-4">
|
|
29
|
+
<span className="font-['Source_Sans_3',sans-serif] text-[12px] text-[#888] w-8 text-right font-mono">{item.px}</span>
|
|
30
|
+
<div className="bg-[#78eac1] h-3 rounded-sm" style={{ width: item.px * 3 }} />
|
|
31
|
+
<span className="font-['Source_Sans_3',sans-serif] text-[13px] text-[#888] flex-1">
|
|
32
|
+
{item.label} — {item.px}px
|
|
33
|
+
</span>
|
|
34
|
+
<div className="opacity-0 group-hover/space:opacity-100 transition-opacity">
|
|
35
|
+
<CopyButton token={`${item.px}px`} />
|
|
36
|
+
</div>
|
|
37
|
+
</div>
|
|
38
|
+
))}
|
|
39
|
+
</div>
|
|
40
|
+
</div>
|
|
41
|
+
|
|
42
|
+
{/* Border Radii */}
|
|
43
|
+
<div className="mb-8">
|
|
44
|
+
<p className="font-['Source_Sans_3',sans-serif] text-[14px] text-[#888] uppercase tracking-wider mb-4">
|
|
45
|
+
Border Radius
|
|
46
|
+
</p>
|
|
47
|
+
<div className="flex flex-wrap gap-6">
|
|
48
|
+
{[
|
|
49
|
+
{ radius: 5, label: "5px — List items" },
|
|
50
|
+
{ radius: 10, label: "10px — Buttons, Steps" },
|
|
51
|
+
{ radius: 12, label: "12px — Wizard steps" },
|
|
52
|
+
{ radius: 15, label: "15px — Cards" },
|
|
53
|
+
{ radius: 30, label: "30px — Nav links, Tabs" },
|
|
54
|
+
{ radius: 50, label: "50px — Pill buttons" },
|
|
55
|
+
{ radius: 100, label: "Full — Avatars" },
|
|
56
|
+
].map((item) => (
|
|
57
|
+
<div key={item.radius} className="group/rad flex flex-col items-center gap-2 relative">
|
|
58
|
+
<div
|
|
59
|
+
className="bg-[#262626] border border-[#78eac1]/30 size-16 flex items-center justify-center"
|
|
60
|
+
style={{ borderRadius: item.radius }}
|
|
61
|
+
>
|
|
62
|
+
<span className="font-['Source_Sans_3',sans-serif] text-[12px] text-[#78eac1] font-mono">{item.radius}</span>
|
|
63
|
+
</div>
|
|
64
|
+
<span className="font-['Source_Sans_3',sans-serif] text-[11px] text-[#888] text-center max-w-[100px]">
|
|
65
|
+
{item.label}
|
|
66
|
+
</span>
|
|
67
|
+
<div className="absolute -top-1 -right-1 opacity-0 group-hover/rad:opacity-100 transition-opacity">
|
|
68
|
+
<CopyButton token={`border-radius: ${item.radius}px`} />
|
|
69
|
+
</div>
|
|
70
|
+
</div>
|
|
71
|
+
))}
|
|
72
|
+
</div>
|
|
73
|
+
</div>
|
|
74
|
+
|
|
75
|
+
{/* Grid System */}
|
|
76
|
+
<div>
|
|
77
|
+
<p className="font-['Source_Sans_3',sans-serif] text-[14px] text-[#888] uppercase tracking-wider mb-4">
|
|
78
|
+
Grid System
|
|
79
|
+
</p>
|
|
80
|
+
<div className="group/grid bg-[#1d1d1d] rounded-[15px] p-6 space-y-4 relative">
|
|
81
|
+
<div className="absolute top-2 right-2 opacity-0 group-hover/grid:opacity-100 transition-opacity z-10">
|
|
82
|
+
<CopyButton token="grid grid-cols-5 gap-[40px] | span-4 + span-1 layout" />
|
|
83
|
+
</div>
|
|
84
|
+
<p className="font-['Source_Sans_3',sans-serif] text-[12px] text-[#888]">
|
|
85
|
+
5-column grid with 40px gap — used for session header layouts
|
|
86
|
+
</p>
|
|
87
|
+
<div className="grid grid-cols-5 gap-[40px]">
|
|
88
|
+
{[1, 2, 3, 4, 5].map((col) => (
|
|
89
|
+
<div key={col} className="bg-[#262626] h-12 rounded-[10px] flex items-center justify-center">
|
|
90
|
+
<span className="font-['Source_Sans_3',sans-serif] text-[12px] text-[#888]">Col {col}</span>
|
|
91
|
+
</div>
|
|
92
|
+
))}
|
|
93
|
+
</div>
|
|
94
|
+
<p className="font-['Source_Sans_3',sans-serif] text-[12px] text-[#888] mt-4">
|
|
95
|
+
Spans: Cards typically span 3-4 columns, action columns span 1
|
|
96
|
+
</p>
|
|
97
|
+
<div className="grid grid-cols-5 gap-[40px]">
|
|
98
|
+
<div className="bg-[#262626] h-12 rounded-[10px] flex items-center justify-center col-span-4">
|
|
99
|
+
<span className="font-['Source_Sans_3',sans-serif] text-[12px] text-[#888]">Card (span 4)</span>
|
|
100
|
+
</div>
|
|
101
|
+
<div className="bg-[#78eac1]/20 h-12 rounded-[10px] flex items-center justify-center border border-[#78eac1]/30">
|
|
102
|
+
<span className="font-['Source_Sans_3',sans-serif] text-[12px] text-[#78eac1]">Action (1)</span>
|
|
103
|
+
</div>
|
|
104
|
+
</div>
|
|
105
|
+
</div>
|
|
106
|
+
</div>
|
|
107
|
+
</section>
|
|
108
|
+
);
|
|
109
|
+
}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import svgPaths from "../../../imports/svg-umftvfphsk";
|
|
3
|
+
import { SectionHeader } from "./SectionHeader";
|
|
4
|
+
import { CopyButton } from "./CopyButton";
|
|
5
|
+
|
|
6
|
+
export function StatusIndicators() {
|
|
7
|
+
return (
|
|
8
|
+
<section>
|
|
9
|
+
<SectionHeader
|
|
10
|
+
title="Status Indicators"
|
|
11
|
+
description="Status icons, tags, counters, legends, and markers"
|
|
12
|
+
/>
|
|
13
|
+
|
|
14
|
+
{/* Status Counters */}
|
|
15
|
+
<div className="mb-8">
|
|
16
|
+
<p className="font-['Source_Sans_3',sans-serif] text-sm text-muted-foreground uppercase tracking-wider mb-4">
|
|
17
|
+
Status Counter Items
|
|
18
|
+
</p>
|
|
19
|
+
<div className="bg-card rounded-xl p-6">
|
|
20
|
+
<div className="flex flex-wrap gap-8 items-center">
|
|
21
|
+
{/* Passed */}
|
|
22
|
+
<div className="group/item flex items-center gap-2.5 relative">
|
|
23
|
+
<svg width="20" height="20" viewBox="0 0 20 20" fill="none">
|
|
24
|
+
<path d={svgPaths.p30b87920} fill="var(--chart-1)" />
|
|
25
|
+
</svg>
|
|
26
|
+
<span className="font-['Source_Sans_3',sans-serif] text-sm text-foreground">50</span>
|
|
27
|
+
<div className="opacity-0 group-hover/item:opacity-100 transition-opacity">
|
|
28
|
+
<CopyButton token="icon: p30b87920 var(--chart-1) | text-sm text-foreground" />
|
|
29
|
+
</div>
|
|
30
|
+
</div>
|
|
31
|
+
{/* Failed */}
|
|
32
|
+
<div className="group/item flex items-center gap-2.5 relative">
|
|
33
|
+
<svg width="20" height="20" viewBox="0 0 20 20" fill="none">
|
|
34
|
+
<path d={svgPaths.p30bab400} fill="var(--chart-2)" />
|
|
35
|
+
</svg>
|
|
36
|
+
<span className="font-['Source_Sans_3',sans-serif] text-sm text-foreground">10</span>
|
|
37
|
+
<div className="opacity-0 group-hover/item:opacity-100 transition-opacity">
|
|
38
|
+
<CopyButton token="icon: p30bab400 var(--chart-2) | text-sm text-foreground" />
|
|
39
|
+
</div>
|
|
40
|
+
</div>
|
|
41
|
+
{/* Blocked */}
|
|
42
|
+
<div className="group/item flex items-center gap-2.5 relative">
|
|
43
|
+
<svg width="20" height="20" viewBox="0 0 20 20" fill="none">
|
|
44
|
+
<path d={svgPaths.p13555100} fill="var(--chart-3)" />
|
|
45
|
+
</svg>
|
|
46
|
+
<span className="font-['Source_Sans_3',sans-serif] text-sm text-foreground">1</span>
|
|
47
|
+
<div className="opacity-0 group-hover/item:opacity-100 transition-opacity">
|
|
48
|
+
<CopyButton token="icon: p13555100 var(--chart-3) | text-sm text-foreground" />
|
|
49
|
+
</div>
|
|
50
|
+
</div>
|
|
51
|
+
{/* Total */}
|
|
52
|
+
<span className="font-['Source_Sans_3',sans-serif] text-sm text-foreground text-right">
|
|
53
|
+
99 checks total
|
|
54
|
+
</span>
|
|
55
|
+
</div>
|
|
56
|
+
</div>
|
|
57
|
+
</div>
|
|
58
|
+
|
|
59
|
+
{/* Tags */}
|
|
60
|
+
<div className="mb-8">
|
|
61
|
+
<p className="font-['Source_Sans_3',sans-serif] text-sm text-muted-foreground uppercase tracking-wider mb-4">
|
|
62
|
+
Tags
|
|
63
|
+
</p>
|
|
64
|
+
<div className="flex flex-wrap gap-4">
|
|
65
|
+
<div className="group/tag bg-destructive flex items-center gap-1 h-8 px-4 py-1 rounded-lg relative">
|
|
66
|
+
<svg width="20" height="20" viewBox="0 0 20 20" fill="none">
|
|
67
|
+
<path d={svgPaths.p30bab400} fill="white" />
|
|
68
|
+
</svg>
|
|
69
|
+
<span className="font-['Source_Sans_3',sans-serif] text-base text-destructive-foreground">failed</span>
|
|
70
|
+
<div className="opacity-0 group-hover/tag:opacity-100 transition-opacity ml-1">
|
|
71
|
+
<CopyButton token="bg-destructive h-8 px-4 rounded-lg text-destructive-foreground" />
|
|
72
|
+
</div>
|
|
73
|
+
</div>
|
|
74
|
+
<div className="group/tag flex items-center gap-1 h-8 px-4 py-1 rounded-lg relative" style={{ backgroundColor: 'var(--chart-1)' }}>
|
|
75
|
+
<svg width="20" height="20" viewBox="0 0 20 20" fill="none">
|
|
76
|
+
<path d={svgPaths.p30b87920} fill="white" />
|
|
77
|
+
</svg>
|
|
78
|
+
<span className="font-['Source_Sans_3',sans-serif] text-base text-white">passed</span>
|
|
79
|
+
<div className="opacity-0 group-hover/tag:opacity-100 transition-opacity ml-1">
|
|
80
|
+
<CopyButton token="bg-[var(--chart-1)] h-8 px-4 rounded-lg text-white" />
|
|
81
|
+
</div>
|
|
82
|
+
</div>
|
|
83
|
+
<div className="group/tag flex items-center gap-1 h-8 px-4 py-1 rounded-lg relative" style={{ backgroundColor: 'var(--chart-3)' }}>
|
|
84
|
+
<svg width="20" height="20" viewBox="0 0 20 20" fill="none">
|
|
85
|
+
<path d={svgPaths.p13555100} fill="white" />
|
|
86
|
+
</svg>
|
|
87
|
+
<span className="font-['Source_Sans_3',sans-serif] text-base text-white">blocked</span>
|
|
88
|
+
<div className="opacity-0 group-hover/tag:opacity-100 transition-opacity ml-1">
|
|
89
|
+
<CopyButton token="bg-[var(--chart-3)] h-8 px-4 rounded-lg text-white" />
|
|
90
|
+
</div>
|
|
91
|
+
</div>
|
|
92
|
+
</div>
|
|
93
|
+
</div>
|
|
94
|
+
|
|
95
|
+
{/* Legends */}
|
|
96
|
+
<div className="mb-8">
|
|
97
|
+
<p className="font-['Source_Sans_3',sans-serif] text-sm text-muted-foreground uppercase tracking-wider mb-4">
|
|
98
|
+
Chart Legends
|
|
99
|
+
</p>
|
|
100
|
+
<div className="bg-card rounded-xl p-6">
|
|
101
|
+
<div className="flex flex-wrap gap-6 items-center">
|
|
102
|
+
{/* Dot Legend */}
|
|
103
|
+
<p className="font-['Source_Sans_3',sans-serif] text-xs text-muted-foreground uppercase mr-2">Dot Style:</p>
|
|
104
|
+
{[
|
|
105
|
+
{ color: "var(--chart-1)", label: "12 passed" },
|
|
106
|
+
{ color: "var(--chart-2)", label: "12 failed" },
|
|
107
|
+
{ color: "var(--chart-3)", label: "12 blocked" },
|
|
108
|
+
].map((item) => (
|
|
109
|
+
<div key={item.label} className="flex items-center gap-1.5">
|
|
110
|
+
<svg width="5" height="5" viewBox="0 0 5 5" fill="none">
|
|
111
|
+
<circle cx="2.5" cy="2.5" r="2.5" fill={item.color} />
|
|
112
|
+
</svg>
|
|
113
|
+
<span className="font-['Source_Sans_3',sans-serif] text-xs text-muted-foreground">{item.label}</span>
|
|
114
|
+
</div>
|
|
115
|
+
))}
|
|
116
|
+
</div>
|
|
117
|
+
|
|
118
|
+
<div className="h-px bg-secondary my-4" />
|
|
119
|
+
|
|
120
|
+
<div className="flex flex-wrap gap-6 items-center">
|
|
121
|
+
{/* Icon Legend */}
|
|
122
|
+
<p className="font-['Source_Sans_3',sans-serif] text-xs text-muted-foreground uppercase mr-2">Icon Style:</p>
|
|
123
|
+
<div className="flex items-center gap-2.5">
|
|
124
|
+
<svg width="16" height="16" viewBox="0 0 16.0002 16.0002" fill="none">
|
|
125
|
+
<path d={svgPaths.p1c7818a0} fill="var(--chart-1)" />
|
|
126
|
+
</svg>
|
|
127
|
+
<span className="font-['Source_Sans_3',sans-serif] text-xs text-muted-foreground">passed</span>
|
|
128
|
+
</div>
|
|
129
|
+
<div className="flex items-center gap-2.5">
|
|
130
|
+
<svg width="16" height="16" viewBox="0 0 16.0002 16.0002" fill="none">
|
|
131
|
+
<path d={svgPaths.p35ef7800} fill="var(--chart-2)" />
|
|
132
|
+
</svg>
|
|
133
|
+
<span className="font-['Source_Sans_3',sans-serif] text-xs text-muted-foreground">failed</span>
|
|
134
|
+
</div>
|
|
135
|
+
<div className="flex items-center gap-2.5">
|
|
136
|
+
<svg width="16" height="16" viewBox="0 0 16 16" fill="none">
|
|
137
|
+
<path d={svgPaths.p3e1c0930} fill="var(--chart-3)" />
|
|
138
|
+
</svg>
|
|
139
|
+
<span className="font-['Source_Sans_3',sans-serif] text-xs text-muted-foreground">blocked</span>
|
|
140
|
+
</div>
|
|
141
|
+
</div>
|
|
142
|
+
</div>
|
|
143
|
+
</div>
|
|
144
|
+
|
|
145
|
+
{/* Markers & Badges */}
|
|
146
|
+
<div>
|
|
147
|
+
<p className="font-['Source_Sans_3',sans-serif] text-sm text-muted-foreground uppercase tracking-wider mb-4">
|
|
148
|
+
Markers & Badges
|
|
149
|
+
</p>
|
|
150
|
+
<div className="flex flex-wrap gap-8 items-center">
|
|
151
|
+
{/* New marker */}
|
|
152
|
+
<div className="flex items-center gap-3">
|
|
153
|
+
<svg width="5" height="5" viewBox="0 0 5 5" fill="none">
|
|
154
|
+
<circle cx="2.5" cy="2.5" r="2.5" fill="var(--accent)" />
|
|
155
|
+
</svg>
|
|
156
|
+
<span className="font-['Source_Sans_3',sans-serif] text-xs text-muted-foreground">New Marker (purple dot)</span>
|
|
157
|
+
</div>
|
|
158
|
+
|
|
159
|
+
{/* Numbered badge */}
|
|
160
|
+
<div className="flex items-center gap-3">
|
|
161
|
+
<div className="bg-muted flex items-center justify-center rounded-lg size-10">
|
|
162
|
+
<span className="font-['Source_Sans_3',sans-serif] text-lg text-foreground" style={{ fontWeight: 800 }}>1</span>
|
|
163
|
+
</div>
|
|
164
|
+
<span className="font-['Source_Sans_3',sans-serif] text-xs text-muted-foreground">Numbered Badge</span>
|
|
165
|
+
</div>
|
|
166
|
+
|
|
167
|
+
{/* Donut chart mini */}
|
|
168
|
+
<div className="flex items-center gap-3">
|
|
169
|
+
<svg width="20" height="20" viewBox="0 0 20 20" fill="none">
|
|
170
|
+
<circle cx="10" cy="10" r="8" stroke="var(--border)" strokeWidth="4" />
|
|
171
|
+
</svg>
|
|
172
|
+
<span className="font-['Source_Sans_3',sans-serif] text-xs text-muted-foreground">Donut Mini (empty)</span>
|
|
173
|
+
</div>
|
|
174
|
+
|
|
175
|
+
{/* Donut chart mini with data */}
|
|
176
|
+
<div className="flex items-center gap-3">
|
|
177
|
+
<svg width="20" height="20" viewBox="0 0 20 20" fill="none">
|
|
178
|
+
<circle cx="10" cy="10" r="8" stroke="var(--border)" strokeWidth="4" />
|
|
179
|
+
<mask height="20" id="mask_demo" maskUnits="userSpaceOnUse" style={{ maskType: "alpha" }} width="20" x="0" y="0">
|
|
180
|
+
<path d={svgPaths.p191a7b00} stroke="var(--secondary)" strokeWidth="4" />
|
|
181
|
+
</mask>
|
|
182
|
+
<g mask="url(#mask_demo)">
|
|
183
|
+
<rect fill="var(--chart-2)" height="10" width="10" x="9.88867" />
|
|
184
|
+
<rect fill="var(--chart-3)" height="10" width="10" x="10" y="10" />
|
|
185
|
+
<rect fill="var(--chart-1)" height="10" width="10" y="10" />
|
|
186
|
+
</g>
|
|
187
|
+
</svg>
|
|
188
|
+
<span className="font-['Source_Sans_3',sans-serif] text-xs text-muted-foreground">Donut Mini (with data)</span>
|
|
189
|
+
</div>
|
|
190
|
+
</div>
|
|
191
|
+
</div>
|
|
192
|
+
</section>
|
|
193
|
+
);
|
|
194
|
+
}
|