@lindle/linoardo 1.0.20 → 1.0.22
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/dist/button.cjs +32 -16
- package/dist/button.cjs.map +1 -1
- package/dist/button.d.cts +17 -7
- package/dist/button.d.ts +17 -7
- package/dist/button.js +1 -1
- package/dist/card.cjs +2 -2
- package/dist/card.cjs.map +1 -1
- package/dist/card.js +1 -1
- package/dist/chip.cjs +8 -9
- package/dist/chip.cjs.map +1 -1
- package/dist/chip.d.cts +4 -4
- package/dist/chip.d.ts +4 -4
- package/dist/chip.js +1 -1
- package/dist/{chunk-B5FW33K3.js → chunk-2UL3S6KC.js} +4 -4
- package/dist/chunk-2UL3S6KC.js.map +1 -0
- package/dist/chunk-67USTSXI.js +214 -0
- package/dist/chunk-67USTSXI.js.map +1 -0
- package/dist/{chunk-5PBPURGP.js → chunk-DSZ3EOQB.js} +10 -11
- package/dist/chunk-DSZ3EOQB.js.map +1 -0
- package/dist/{chunk-SZU6OYLS.js → chunk-F2G2JRKA.js} +33 -18
- package/dist/chunk-F2G2JRKA.js.map +1 -0
- package/dist/{chunk-MFLH36XK.js → chunk-JGEXEDKS.js} +3 -3
- package/dist/{chunk-MFLH36XK.js.map → chunk-JGEXEDKS.js.map} +1 -1
- package/dist/chunk-NEYVJE67.js +170 -0
- package/dist/chunk-NEYVJE67.js.map +1 -0
- package/dist/{chunk-36T6I3XH.js → chunk-SAGQYMS3.js} +14 -14
- package/dist/chunk-SAGQYMS3.js.map +1 -0
- package/dist/chunk-VPF7M2PB.js +141 -0
- package/dist/chunk-VPF7M2PB.js.map +1 -0
- package/dist/chunk-Z5A2OIDI.js +312 -0
- package/dist/chunk-Z5A2OIDI.js.map +1 -0
- package/dist/hero.cjs +143 -0
- package/dist/hero.cjs.map +1 -0
- package/dist/hero.d.cts +34 -0
- package/dist/hero.d.ts +34 -0
- package/dist/hero.js +3 -0
- package/dist/hero.js.map +1 -0
- package/dist/index.cjs +741 -58
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +26 -55
- package/dist/index.d.ts +26 -55
- package/dist/index.js +126 -260
- package/dist/index.js.map +1 -1
- package/dist/input.cjs +1 -1
- package/dist/input.cjs.map +1 -1
- package/dist/input.js +1 -1
- package/dist/notification.cjs +236 -0
- package/dist/notification.cjs.map +1 -0
- package/dist/notification.d.cts +34 -0
- package/dist/notification.d.ts +34 -0
- package/dist/notification.js +3 -0
- package/dist/notification.js.map +1 -0
- package/dist/profileCard.cjs +392 -0
- package/dist/profileCard.cjs.map +1 -0
- package/dist/profileCard.d.cts +29 -0
- package/dist/profileCard.d.ts +29 -0
- package/dist/profileCard.js +5 -0
- package/dist/profileCard.js.map +1 -0
- package/dist/progress.cjs +314 -0
- package/dist/progress.cjs.map +1 -0
- package/dist/progress.d.cts +30 -0
- package/dist/progress.d.ts +30 -0
- package/dist/progress.js +3 -0
- package/dist/progress.js.map +1 -0
- package/dist/select.cjs +12 -12
- package/dist/select.cjs.map +1 -1
- package/dist/select.js +1 -1
- package/dist/styles.css +381 -6
- package/dist/switch.d.cts +1 -1
- package/dist/switch.d.ts +1 -1
- package/package.json +12 -1
- package/dist/chunk-36T6I3XH.js.map +0 -1
- package/dist/chunk-5PBPURGP.js.map +0 -1
- package/dist/chunk-B5FW33K3.js.map +0 -1
- package/dist/chunk-SZU6OYLS.js.map +0 -1
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
import { twMerge } from 'tailwind-merge';
|
|
2
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
3
|
+
|
|
4
|
+
// src/Feedback/Progress/index.tsx
|
|
5
|
+
var clampPercent = (value) => {
|
|
6
|
+
if (value === void 0 || value === null || Number.isNaN(value)) {
|
|
7
|
+
return 0;
|
|
8
|
+
}
|
|
9
|
+
return Math.min(100, Math.max(0, value));
|
|
10
|
+
};
|
|
11
|
+
var statusIconMap = {
|
|
12
|
+
success: "mdi mdi-check",
|
|
13
|
+
exception: "mdi mdi-alert"
|
|
14
|
+
};
|
|
15
|
+
var strokeColorByStatus = {
|
|
16
|
+
normal: "rgb(99 102 241)",
|
|
17
|
+
active: "rgb(99 102 241)",
|
|
18
|
+
success: "rgb(16 185 129)",
|
|
19
|
+
exception: "rgb(239 68 68)"
|
|
20
|
+
};
|
|
21
|
+
var trailColorDefault = "rgb(229 231 235)";
|
|
22
|
+
var resolveStroke = (status, strokeColor, gradientId) => {
|
|
23
|
+
if (!strokeColor) {
|
|
24
|
+
return { color: strokeColorByStatus[status] };
|
|
25
|
+
}
|
|
26
|
+
if (typeof strokeColor === "string") {
|
|
27
|
+
return { color: strokeColor };
|
|
28
|
+
}
|
|
29
|
+
const id = gradientId ?? `progress-gradient-${Math.random().toString(16).slice(2)}`;
|
|
30
|
+
return {
|
|
31
|
+
color: `url(#${id})`,
|
|
32
|
+
gradient: { id, from: strokeColor.from, to: strokeColor.to },
|
|
33
|
+
cssGradient: `linear-gradient(90deg, ${strokeColor.from}, ${strokeColor.to})`
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
var resolveRotation = (gapPosition) => {
|
|
37
|
+
switch (gapPosition) {
|
|
38
|
+
case "bottom":
|
|
39
|
+
return 90;
|
|
40
|
+
case "left":
|
|
41
|
+
return 180;
|
|
42
|
+
case "right":
|
|
43
|
+
return 0;
|
|
44
|
+
case "top":
|
|
45
|
+
default:
|
|
46
|
+
return -90;
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
var buildGradientId = (strokeColor) => {
|
|
50
|
+
if (strokeColor && typeof strokeColor !== "string") {
|
|
51
|
+
const from = strokeColor.from.replace(/\W+/g, "");
|
|
52
|
+
const to = strokeColor.to.replace(/\W+/g, "");
|
|
53
|
+
return `progress-gradient-${from}-${to}`;
|
|
54
|
+
}
|
|
55
|
+
return void 0;
|
|
56
|
+
};
|
|
57
|
+
var InfoNode = ({ status, percent, successPercent, format }) => {
|
|
58
|
+
const iconClass = status === "success" || status === "exception" ? statusIconMap[status] : void 0;
|
|
59
|
+
const content = typeof format === "function" ? format(percent, successPercent) : iconClass ? /* @__PURE__ */ jsx("i", { className: iconClass, "aria-hidden": true }) : `${Math.round(percent)}%`;
|
|
60
|
+
return /* @__PURE__ */ jsx("span", { className: "text-sm font-medium text-gray-700 dark:text-gray-200", children: content });
|
|
61
|
+
};
|
|
62
|
+
var renderSteps = (percent, steps, status, strokeStyle, trailColor, height) => {
|
|
63
|
+
const filled = Math.round(percent / 100 * steps);
|
|
64
|
+
const stepStyle = height ? { height } : {};
|
|
65
|
+
return /* @__PURE__ */ jsx("div", { className: "flex w-full items-center gap-1", style: stepStyle, children: Array.from({ length: steps }).map((_, idx) => {
|
|
66
|
+
const isFilled = idx < filled;
|
|
67
|
+
const resolvedStyle = {
|
|
68
|
+
...isFilled ? strokeStyle : { backgroundColor: trailColor ?? trailColorDefault },
|
|
69
|
+
height
|
|
70
|
+
};
|
|
71
|
+
return /* @__PURE__ */ jsx(
|
|
72
|
+
"span",
|
|
73
|
+
{
|
|
74
|
+
className: twMerge(
|
|
75
|
+
"flex-1 rounded-full",
|
|
76
|
+
isFilled ? void 0 : "bg-gray-200 dark:bg-gray-800",
|
|
77
|
+
status === "active" && isFilled ? "animate-pulse" : void 0
|
|
78
|
+
),
|
|
79
|
+
style: resolvedStyle
|
|
80
|
+
},
|
|
81
|
+
idx
|
|
82
|
+
);
|
|
83
|
+
}) });
|
|
84
|
+
};
|
|
85
|
+
var LineProgress = ({
|
|
86
|
+
percent,
|
|
87
|
+
status,
|
|
88
|
+
successPercent,
|
|
89
|
+
format,
|
|
90
|
+
showInfo = true,
|
|
91
|
+
strokeWidth,
|
|
92
|
+
trailColor,
|
|
93
|
+
strokeColor,
|
|
94
|
+
success,
|
|
95
|
+
size = "default",
|
|
96
|
+
steps,
|
|
97
|
+
className,
|
|
98
|
+
style,
|
|
99
|
+
...rest
|
|
100
|
+
}) => {
|
|
101
|
+
const height = strokeWidth ?? (size === "small" ? 6 : size === "large" ? 12 : 8);
|
|
102
|
+
const gradientId = buildGradientId(strokeColor);
|
|
103
|
+
const { color, gradient, cssGradient } = resolveStroke(status, strokeColor, gradientId);
|
|
104
|
+
const stepStrokeStyle = gradient ? { backgroundImage: cssGradient } : { backgroundColor: color };
|
|
105
|
+
const lineStyle = {
|
|
106
|
+
height,
|
|
107
|
+
backgroundColor: trailColor ?? trailColorDefault
|
|
108
|
+
};
|
|
109
|
+
const barStyle = {
|
|
110
|
+
width: `${percent}%`,
|
|
111
|
+
height,
|
|
112
|
+
backgroundColor: color,
|
|
113
|
+
background: gradient ? cssGradient : color
|
|
114
|
+
};
|
|
115
|
+
const successWidth = successPercent ? Math.min(successPercent, percent) : 0;
|
|
116
|
+
const successColor = success?.strokeColor ?? "rgb(16 185 129)";
|
|
117
|
+
return /* @__PURE__ */ jsxs("div", { className: twMerge("flex w-full items-center gap-3", className), style, ...rest, children: [
|
|
118
|
+
/* @__PURE__ */ jsx("div", { className: "relative w-full overflow-hidden rounded-full", style: lineStyle, children: typeof steps === "number" && steps > 1 ? renderSteps(percent, steps, status, stepStrokeStyle, trailColor, height) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
119
|
+
/* @__PURE__ */ jsx(
|
|
120
|
+
"div",
|
|
121
|
+
{
|
|
122
|
+
className: twMerge(
|
|
123
|
+
"h-full rounded-full transition-[width] duration-300 ease-out",
|
|
124
|
+
status === "active" ? "animate-pulse" : void 0
|
|
125
|
+
),
|
|
126
|
+
style: barStyle
|
|
127
|
+
}
|
|
128
|
+
),
|
|
129
|
+
successWidth > 0 ? /* @__PURE__ */ jsx(
|
|
130
|
+
"div",
|
|
131
|
+
{
|
|
132
|
+
className: "absolute inset-y-0 left-0 rounded-full transition-[width] duration-300 ease-out",
|
|
133
|
+
style: { width: `${successWidth}%`, height, backgroundColor: successColor }
|
|
134
|
+
}
|
|
135
|
+
) : null
|
|
136
|
+
] }) }),
|
|
137
|
+
showInfo ? /* @__PURE__ */ jsx(InfoNode, { status, percent, successPercent, format }) : null
|
|
138
|
+
] });
|
|
139
|
+
};
|
|
140
|
+
var CircleProgress = ({
|
|
141
|
+
percent,
|
|
142
|
+
status,
|
|
143
|
+
successPercent,
|
|
144
|
+
format,
|
|
145
|
+
showInfo = true,
|
|
146
|
+
strokeWidth,
|
|
147
|
+
trailColor,
|
|
148
|
+
strokeColor,
|
|
149
|
+
success,
|
|
150
|
+
width = 120,
|
|
151
|
+
type,
|
|
152
|
+
gapDegree,
|
|
153
|
+
gapPosition = "top",
|
|
154
|
+
className,
|
|
155
|
+
style,
|
|
156
|
+
...rest
|
|
157
|
+
}) => {
|
|
158
|
+
const stroke = strokeWidth ?? 10;
|
|
159
|
+
const radius = (width - stroke) / 2;
|
|
160
|
+
const circumference = 2 * Math.PI * radius;
|
|
161
|
+
const gap = type === "dashboard" ? gapDegree ?? 75 : gapDegree ?? 0;
|
|
162
|
+
const perimeter = circumference - gap / 360 * circumference;
|
|
163
|
+
const dashOffsetBase = gap / 360 * circumference / 2;
|
|
164
|
+
const dashArray = `${perimeter} ${circumference}`;
|
|
165
|
+
const gradientId = buildGradientId(strokeColor);
|
|
166
|
+
const { color, gradient } = resolveStroke(status, strokeColor, gradientId);
|
|
167
|
+
const rotation = resolveRotation(gapPosition);
|
|
168
|
+
const successColor = success?.strokeColor ?? "rgb(16 185 129)";
|
|
169
|
+
const progressDashOffset = (100 - percent) / 100 * perimeter + dashOffsetBase;
|
|
170
|
+
const successDashOffset = (100 - successPercent) / 100 * perimeter + dashOffsetBase;
|
|
171
|
+
return /* @__PURE__ */ jsx("div", { className: twMerge("inline-flex flex-col items-center justify-center", className), style, ...rest, children: /* @__PURE__ */ jsxs("div", { className: "relative flex items-center justify-center", style: { width, height: width }, children: [
|
|
172
|
+
/* @__PURE__ */ jsxs(
|
|
173
|
+
"svg",
|
|
174
|
+
{
|
|
175
|
+
width,
|
|
176
|
+
height: width,
|
|
177
|
+
viewBox: `0 0 ${width} ${width}`,
|
|
178
|
+
className: "absolute inset-0 overflow-visible",
|
|
179
|
+
style: { transform: `rotate(${rotation}deg)` },
|
|
180
|
+
children: [
|
|
181
|
+
gradient ? /* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsxs("linearGradient", { id: gradient.id, x1: "0%", y1: "0%", x2: "100%", y2: "0%", children: [
|
|
182
|
+
/* @__PURE__ */ jsx("stop", { offset: "0%", stopColor: gradient.from }),
|
|
183
|
+
/* @__PURE__ */ jsx("stop", { offset: "100%", stopColor: gradient.to })
|
|
184
|
+
] }) }) : null,
|
|
185
|
+
/* @__PURE__ */ jsx(
|
|
186
|
+
"circle",
|
|
187
|
+
{
|
|
188
|
+
cx: width / 2,
|
|
189
|
+
cy: width / 2,
|
|
190
|
+
r: radius,
|
|
191
|
+
strokeWidth: stroke,
|
|
192
|
+
stroke: trailColor ?? trailColorDefault,
|
|
193
|
+
fill: "none",
|
|
194
|
+
strokeDasharray: dashArray,
|
|
195
|
+
strokeDashoffset: dashOffsetBase,
|
|
196
|
+
strokeLinecap: "round"
|
|
197
|
+
}
|
|
198
|
+
),
|
|
199
|
+
/* @__PURE__ */ jsx(
|
|
200
|
+
"circle",
|
|
201
|
+
{
|
|
202
|
+
cx: width / 2,
|
|
203
|
+
cy: width / 2,
|
|
204
|
+
r: radius,
|
|
205
|
+
strokeWidth: stroke,
|
|
206
|
+
stroke: color,
|
|
207
|
+
fill: "none",
|
|
208
|
+
strokeDasharray: dashArray,
|
|
209
|
+
strokeDashoffset: progressDashOffset,
|
|
210
|
+
strokeLinecap: "round",
|
|
211
|
+
className: twMerge(status === "active" ? "animate-[spin_3s_linear_infinite]" : void 0)
|
|
212
|
+
}
|
|
213
|
+
),
|
|
214
|
+
successPercent > 0 ? /* @__PURE__ */ jsx(
|
|
215
|
+
"circle",
|
|
216
|
+
{
|
|
217
|
+
cx: width / 2,
|
|
218
|
+
cy: width / 2,
|
|
219
|
+
r: radius,
|
|
220
|
+
strokeWidth: stroke,
|
|
221
|
+
stroke: successColor,
|
|
222
|
+
fill: "none",
|
|
223
|
+
strokeDasharray: dashArray,
|
|
224
|
+
strokeDashoffset: successDashOffset,
|
|
225
|
+
strokeLinecap: "round"
|
|
226
|
+
}
|
|
227
|
+
) : null
|
|
228
|
+
]
|
|
229
|
+
}
|
|
230
|
+
),
|
|
231
|
+
showInfo ? /* @__PURE__ */ jsx("div", { className: "absolute inset-0 flex items-center justify-center", children: /* @__PURE__ */ jsx("div", { className: "text-sm font-semibold text-gray-800 dark:text-gray-100", children: /* @__PURE__ */ jsx(InfoNode, { status, percent, successPercent, format }) }) }) : null
|
|
232
|
+
] }) });
|
|
233
|
+
};
|
|
234
|
+
var Progress = (props) => {
|
|
235
|
+
const toNumber = (value) => {
|
|
236
|
+
if (typeof value === "string") {
|
|
237
|
+
const parsed = Number.parseFloat(value);
|
|
238
|
+
return Number.isFinite(parsed) ? parsed : void 0;
|
|
239
|
+
}
|
|
240
|
+
return value;
|
|
241
|
+
};
|
|
242
|
+
const {
|
|
243
|
+
percent: rawPercent = 0,
|
|
244
|
+
success,
|
|
245
|
+
status: providedStatus,
|
|
246
|
+
type = "line",
|
|
247
|
+
showInfo = true,
|
|
248
|
+
format,
|
|
249
|
+
strokeWidth,
|
|
250
|
+
trailColor,
|
|
251
|
+
strokeColor,
|
|
252
|
+
width,
|
|
253
|
+
size,
|
|
254
|
+
steps,
|
|
255
|
+
gapDegree,
|
|
256
|
+
gapPosition,
|
|
257
|
+
className,
|
|
258
|
+
style,
|
|
259
|
+
...restProps
|
|
260
|
+
} = props;
|
|
261
|
+
const percent = clampPercent(toNumber(rawPercent));
|
|
262
|
+
const successPercent = clampPercent(toNumber(success?.percent));
|
|
263
|
+
const status = providedStatus ?? (percent >= 100 ? "success" : "normal");
|
|
264
|
+
const resolvedClassName = twMerge("min-w-[200px]", className);
|
|
265
|
+
if (type === "circle" || type === "dashboard") {
|
|
266
|
+
return /* @__PURE__ */ jsx(
|
|
267
|
+
CircleProgress,
|
|
268
|
+
{
|
|
269
|
+
...restProps,
|
|
270
|
+
type,
|
|
271
|
+
percent,
|
|
272
|
+
successPercent,
|
|
273
|
+
success,
|
|
274
|
+
status,
|
|
275
|
+
showInfo,
|
|
276
|
+
className: resolvedClassName,
|
|
277
|
+
format,
|
|
278
|
+
strokeWidth,
|
|
279
|
+
trailColor,
|
|
280
|
+
strokeColor,
|
|
281
|
+
width,
|
|
282
|
+
gapDegree,
|
|
283
|
+
gapPosition,
|
|
284
|
+
style
|
|
285
|
+
}
|
|
286
|
+
);
|
|
287
|
+
}
|
|
288
|
+
return /* @__PURE__ */ jsx(
|
|
289
|
+
LineProgress,
|
|
290
|
+
{
|
|
291
|
+
percent,
|
|
292
|
+
successPercent,
|
|
293
|
+
success,
|
|
294
|
+
status,
|
|
295
|
+
showInfo,
|
|
296
|
+
className: resolvedClassName,
|
|
297
|
+
format,
|
|
298
|
+
strokeWidth,
|
|
299
|
+
trailColor,
|
|
300
|
+
strokeColor,
|
|
301
|
+
size,
|
|
302
|
+
steps,
|
|
303
|
+
style,
|
|
304
|
+
...restProps
|
|
305
|
+
}
|
|
306
|
+
);
|
|
307
|
+
};
|
|
308
|
+
var Progress_default = Progress;
|
|
309
|
+
|
|
310
|
+
export { Progress_default };
|
|
311
|
+
//# sourceMappingURL=chunk-Z5A2OIDI.js.map
|
|
312
|
+
//# sourceMappingURL=chunk-Z5A2OIDI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/Feedback/Progress/index.tsx"],"names":[],"mappings":"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","file":"chunk-Z5A2OIDI.js","sourcesContent":["import * as React from 'react';\nimport { twMerge } from 'tailwind-merge';\nimport type { ProgressProps, ProgressStatus, ProgressType } from './types.progress';\n\nconst clampPercent = (value?: number) => {\n if (value === undefined || value === null || Number.isNaN(value)) {\n return 0;\n }\n return Math.min(100, Math.max(0, value));\n};\n\nconst statusIconMap: Record<Exclude<ProgressStatus, 'normal' | 'active'>, string> = {\n success: 'mdi mdi-check',\n exception: 'mdi mdi-alert'\n};\n\nconst strokeColorByStatus: Record<ProgressStatus, string> = {\n normal: 'rgb(99 102 241)',\n active: 'rgb(99 102 241)',\n success: 'rgb(16 185 129)',\n exception: 'rgb(239 68 68)'\n};\n\nconst trailColorDefault = 'rgb(229 231 235)';\n\nconst resolveStroke = (\n status: ProgressStatus,\n strokeColor?: ProgressProps['strokeColor'],\n gradientId?: string\n): { color: string; gradient?: { id: string; from: string; to: string }; cssGradient?: string } => {\n if (!strokeColor) {\n return { color: strokeColorByStatus[status] };\n }\n if (typeof strokeColor === 'string') {\n return { color: strokeColor };\n }\n const id = gradientId ?? `progress-gradient-${Math.random().toString(16).slice(2)}`;\n return {\n color: `url(#${id})`,\n gradient: { id, from: strokeColor.from, to: strokeColor.to },\n cssGradient: `linear-gradient(90deg, ${strokeColor.from}, ${strokeColor.to})`\n };\n};\n\nconst resolveRotation = (gapPosition: NonNullable<ProgressProps['gapPosition']>) => {\n switch (gapPosition) {\n case 'bottom':\n return 90;\n case 'left':\n return 180;\n case 'right':\n return 0;\n case 'top':\n default:\n return -90;\n }\n};\n\nconst buildGradientId = (strokeColor?: ProgressProps['strokeColor']) => {\n if (strokeColor && typeof strokeColor !== 'string') {\n const from = strokeColor.from.replace(/\\W+/g, '');\n const to = strokeColor.to.replace(/\\W+/g, '');\n return `progress-gradient-${from}-${to}`;\n }\n return undefined;\n};\n\nconst InfoNode: React.FC<{\n status: ProgressStatus;\n percent: number;\n successPercent: number;\n format?: ProgressProps['format'];\n}> = ({ status, percent, successPercent, format }) => {\n const iconClass =\n status === 'success' || status === 'exception' ? statusIconMap[status] : undefined;\n\n const content =\n typeof format === 'function'\n ? format(percent, successPercent)\n : iconClass\n ? <i className={iconClass} aria-hidden />\n : `${Math.round(percent)}%`;\n\n return <span className='text-sm font-medium text-gray-700 dark:text-gray-200'>{content}</span>;\n};\n\nconst renderSteps = (\n percent: number,\n steps: number,\n status: ProgressStatus,\n strokeStyle: { backgroundColor?: string; backgroundImage?: string },\n trailColor?: string,\n height?: number\n) => {\n const filled = Math.round((percent / 100) * steps);\n const stepStyle: React.CSSProperties = height ? { height } : {};\n\n return (\n <div className='flex w-full items-center gap-1' style={stepStyle}>\n {Array.from({ length: steps }).map((_, idx) => {\n const isFilled = idx < filled;\n const resolvedStyle: React.CSSProperties = {\n ...(isFilled ? strokeStyle : { backgroundColor: trailColor ?? trailColorDefault }),\n height\n };\n return (\n <span\n key={idx}\n className={twMerge(\n 'flex-1 rounded-full',\n isFilled ? undefined : 'bg-gray-200 dark:bg-gray-800',\n status === 'active' && isFilled ? 'animate-pulse' : undefined\n )}\n style={resolvedStyle}\n />\n );\n })}\n </div>\n );\n};\n\nconst LineProgress: React.FC<ProgressProps & { percent: number; status: ProgressStatus; successPercent: number }> = ({\n percent,\n status,\n successPercent,\n format,\n showInfo = true,\n strokeWidth,\n trailColor,\n strokeColor,\n success,\n size = 'default',\n steps,\n className,\n style,\n ...rest\n}) => {\n const height = strokeWidth ?? (size === 'small' ? 6 : size === 'large' ? 12 : 8);\n const gradientId = buildGradientId(strokeColor);\n const { color, gradient, cssGradient } = resolveStroke(status, strokeColor, gradientId);\n const stepStrokeStyle = gradient ? { backgroundImage: cssGradient } : { backgroundColor: color };\n const lineStyle: React.CSSProperties = {\n height,\n backgroundColor: trailColor ?? trailColorDefault\n };\n const barStyle: React.CSSProperties = {\n width: `${percent}%`,\n height,\n backgroundColor: color,\n background: gradient ? cssGradient : color\n };\n\n const successWidth = successPercent ? Math.min(successPercent, percent) : 0;\n const successColor = success?.strokeColor ?? 'rgb(16 185 129)';\n\n return (\n <div className={twMerge('flex w-full items-center gap-3', className)} style={style} {...rest}>\n <div className='relative w-full overflow-hidden rounded-full' style={lineStyle}>\n {typeof steps === 'number' && steps > 1\n ? renderSteps(percent, steps, status, stepStrokeStyle, trailColor, height)\n : (\n <>\n <div\n className={twMerge(\n 'h-full rounded-full transition-[width] duration-300 ease-out',\n status === 'active' ? 'animate-pulse' : undefined\n )}\n style={barStyle}\n />\n {successWidth > 0 ? (\n <div\n className='absolute inset-y-0 left-0 rounded-full transition-[width] duration-300 ease-out'\n style={{ width: `${successWidth}%`, height, backgroundColor: successColor }}\n />\n ) : null}\n </>\n )}\n </div>\n {showInfo ? <InfoNode status={status} percent={percent} successPercent={successPercent} format={format} /> : null}\n </div>\n );\n};\n\nconst CircleProgress: React.FC<ProgressProps & { percent: number; status: ProgressStatus; successPercent: number }> = ({\n percent,\n status,\n successPercent,\n format,\n showInfo = true,\n strokeWidth,\n trailColor,\n strokeColor,\n success,\n width = 120,\n type,\n gapDegree,\n gapPosition = 'top',\n className,\n style,\n ...rest\n}) => {\n const stroke = strokeWidth ?? 10;\n const radius = (width - stroke) / 2;\n const circumference = 2 * Math.PI * radius;\n const gap = type === 'dashboard' ? gapDegree ?? 75 : gapDegree ?? 0;\n const perimeter = circumference - (gap / 360) * circumference;\n const dashOffsetBase = (gap / 360) * circumference / 2;\n const dashArray = `${perimeter} ${circumference}`;\n const gradientId = buildGradientId(strokeColor);\n const { color, gradient } = resolveStroke(status, strokeColor, gradientId);\n const rotation = resolveRotation(gapPosition);\n const successColor = success?.strokeColor ?? 'rgb(16 185 129)';\n\n const progressDashOffset = ((100 - percent) / 100) * perimeter + dashOffsetBase;\n const successDashOffset = ((100 - successPercent) / 100) * perimeter + dashOffsetBase;\n\n return (\n <div className={twMerge('inline-flex flex-col items-center justify-center', className)} style={style} {...rest}>\n <div className='relative flex items-center justify-center' style={{ width, height: width }}>\n <svg\n width={width}\n height={width}\n viewBox={`0 0 ${width} ${width}`}\n className='absolute inset-0 overflow-visible'\n style={{ transform: `rotate(${rotation}deg)` }}\n >\n {gradient ? (\n <defs>\n <linearGradient id={gradient.id} x1='0%' y1='0%' x2='100%' y2='0%'>\n <stop offset='0%' stopColor={gradient.from} />\n <stop offset='100%' stopColor={gradient.to} />\n </linearGradient>\n </defs>\n ) : null}\n <circle\n cx={width / 2}\n cy={width / 2}\n r={radius}\n strokeWidth={stroke}\n stroke={trailColor ?? trailColorDefault}\n fill='none'\n strokeDasharray={dashArray}\n strokeDashoffset={dashOffsetBase}\n strokeLinecap='round'\n />\n <circle\n cx={width / 2}\n cy={width / 2}\n r={radius}\n strokeWidth={stroke}\n stroke={color}\n fill='none'\n strokeDasharray={dashArray}\n strokeDashoffset={progressDashOffset}\n strokeLinecap='round'\n className={twMerge(status === 'active' ? 'animate-[spin_3s_linear_infinite]' : undefined)}\n />\n {successPercent > 0 ? (\n <circle\n cx={width / 2}\n cy={width / 2}\n r={radius}\n strokeWidth={stroke}\n stroke={successColor}\n fill='none'\n strokeDasharray={dashArray}\n strokeDashoffset={successDashOffset}\n strokeLinecap='round'\n />\n ) : null}\n </svg>\n {showInfo ? (\n <div className='absolute inset-0 flex items-center justify-center'>\n <div className='text-sm font-semibold text-gray-800 dark:text-gray-100'>\n <InfoNode status={status} percent={percent} successPercent={successPercent} format={format} />\n </div>\n </div>\n ) : null}\n </div>\n </div>\n );\n};\n\nconst Progress: React.FC<ProgressProps> = props => {\n const toNumber = (value?: number | string) => {\n if (typeof value === 'string') {\n const parsed = Number.parseFloat(value);\n return Number.isFinite(parsed) ? parsed : undefined;\n }\n return value;\n };\n\n const {\n percent: rawPercent = 0,\n success,\n status: providedStatus,\n type = 'line',\n showInfo = true,\n format,\n strokeWidth,\n trailColor,\n strokeColor,\n width,\n size,\n steps,\n gapDegree,\n gapPosition,\n className,\n style,\n ...restProps\n } = props;\n\n const percent = clampPercent(toNumber(rawPercent));\n const successPercent = clampPercent(toNumber(success?.percent));\n const status: ProgressStatus = providedStatus ?? (percent >= 100 ? 'success' : 'normal');\n const resolvedClassName = twMerge('min-w-[200px]', className);\n\n if (type === 'circle' || type === 'dashboard') {\n return (\n <CircleProgress\n {...restProps}\n type={type}\n percent={percent}\n successPercent={successPercent}\n success={success}\n status={status}\n showInfo={showInfo}\n className={resolvedClassName}\n format={format}\n strokeWidth={strokeWidth}\n trailColor={trailColor}\n strokeColor={strokeColor}\n width={width}\n gapDegree={gapDegree}\n gapPosition={gapPosition}\n style={style}\n />\n );\n }\n\n return (\n <LineProgress\n percent={percent}\n successPercent={successPercent}\n success={success}\n status={status}\n showInfo={showInfo}\n className={resolvedClassName}\n format={format}\n strokeWidth={strokeWidth}\n trailColor={trailColor}\n strokeColor={strokeColor}\n size={size}\n steps={steps}\n style={style}\n {...restProps}\n />\n );\n};\n\nexport type { ProgressProps, ProgressStatus, ProgressType } from './types.progress';\nexport default Progress;\n"]}
|
package/dist/hero.cjs
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var tailwindMerge = require('tailwind-merge');
|
|
4
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
5
|
+
|
|
6
|
+
// src/Blocks/Hero/index.tsx
|
|
7
|
+
var containerVariants = {
|
|
8
|
+
solid: "bg-gradient-to-br from-primary via-primary/90 to-indigo-600 text-white shadow-2xl shadow-primary/30",
|
|
9
|
+
outline: "border border-gray-200 bg-white text-gray-900",
|
|
10
|
+
text: "bg-transparent text-gray-900",
|
|
11
|
+
ghost: "bg-primary/5 text-gray-900 border border-primary/10",
|
|
12
|
+
filled: "bg-slate-900 text-white shadow-2xl shadow-slate-900/40",
|
|
13
|
+
underlined: "border-b-4 border-primary/70 bg-white text-gray-900",
|
|
14
|
+
rounded: "rounded-3xl border border-gray-100 bg-white text-gray-900 shadow-xl",
|
|
15
|
+
sharp: "rounded-none border border-gray-200 bg-white text-gray-900 shadow"
|
|
16
|
+
};
|
|
17
|
+
var frameRadii = {
|
|
18
|
+
solid: "rounded-3xl",
|
|
19
|
+
outline: "rounded-2xl",
|
|
20
|
+
text: "rounded-2xl",
|
|
21
|
+
ghost: "rounded-2xl",
|
|
22
|
+
filled: "rounded-3xl",
|
|
23
|
+
underlined: "rounded-2xl",
|
|
24
|
+
rounded: "rounded-3xl",
|
|
25
|
+
sharp: "rounded-none"
|
|
26
|
+
};
|
|
27
|
+
var badgeVariants = {
|
|
28
|
+
solid: "bg-white/10 text-white border border-white/20",
|
|
29
|
+
outline: "bg-primary/10 text-primary border border-primary/20",
|
|
30
|
+
text: "bg-primary/10 text-primary border border-primary/20",
|
|
31
|
+
ghost: "bg-primary/15 text-primary border border-primary/25",
|
|
32
|
+
filled: "bg-white/10 text-white border border-white/20",
|
|
33
|
+
underlined: "bg-primary/10 text-primary border border-primary/20",
|
|
34
|
+
rounded: "bg-primary/10 text-primary border border-primary/20",
|
|
35
|
+
sharp: "bg-primary/10 text-primary border border-primary/20"
|
|
36
|
+
};
|
|
37
|
+
var Hero = ({
|
|
38
|
+
title,
|
|
39
|
+
description,
|
|
40
|
+
eyebrow,
|
|
41
|
+
actions = [],
|
|
42
|
+
stats = [],
|
|
43
|
+
logos = [],
|
|
44
|
+
image,
|
|
45
|
+
variant = "solid",
|
|
46
|
+
className,
|
|
47
|
+
...rest
|
|
48
|
+
}) => {
|
|
49
|
+
const containerClass = tailwindMerge.twMerge(
|
|
50
|
+
"hero-block relative isolate overflow-hidden",
|
|
51
|
+
containerVariants[variant] ?? containerVariants.solid,
|
|
52
|
+
className
|
|
53
|
+
);
|
|
54
|
+
const badgeClass = tailwindMerge.twMerge(
|
|
55
|
+
"inline-flex items-center gap-2 rounded-full px-3 py-1 text-xs font-semibold uppercase tracking-wide",
|
|
56
|
+
badgeVariants[variant] ?? badgeVariants.solid
|
|
57
|
+
);
|
|
58
|
+
const isDark = variant === "solid" || variant === "filled";
|
|
59
|
+
const subdued = isDark ? "text-white/80" : "text-gray-600";
|
|
60
|
+
const statMuted = isDark ? "text-white/70" : "text-gray-500";
|
|
61
|
+
const actionPrimary = isDark ? "bg-white text-gray-900 hover:bg-white/90 focus-visible:outline-white/70" : "bg-primary text-white hover:bg-primary/90 focus-visible:outline-primary/50";
|
|
62
|
+
const actionSecondary = isDark ? "border border-white/40 text-white hover:bg-white/10 focus-visible:outline-white/60" : "border border-gray-300 text-gray-900 hover:border-primary/60 hover:text-primary focus-visible:outline-primary/50";
|
|
63
|
+
const frameRadius = frameRadii[variant] ?? "rounded-2xl";
|
|
64
|
+
const frameDecoration = isDark ? "border-white/10 bg-white/10 shadow-2xl shadow-black/20" : "border-gray-200 bg-white shadow-2xl shadow-gray-200/60";
|
|
65
|
+
const renderAction = (action, index) => {
|
|
66
|
+
const { href, label, onClick, variant: actionVariant = "primary" } = action;
|
|
67
|
+
const Component = href ? "a" : "button";
|
|
68
|
+
const resolvedClass = actionVariant === "secondary" ? tailwindMerge.twMerge("bg-white/70", actionSecondary) : tailwindMerge.twMerge("shadow-lg shadow-primary/25", actionPrimary);
|
|
69
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
70
|
+
Component,
|
|
71
|
+
{
|
|
72
|
+
href,
|
|
73
|
+
onClick,
|
|
74
|
+
className: tailwindMerge.twMerge(
|
|
75
|
+
"inline-flex items-center gap-2 rounded-xl px-4 py-3 text-sm font-semibold transition focus-visible:outline focus-visible:outline-offset-2",
|
|
76
|
+
resolvedClass
|
|
77
|
+
),
|
|
78
|
+
children: label
|
|
79
|
+
},
|
|
80
|
+
`${label}-${index}`
|
|
81
|
+
);
|
|
82
|
+
};
|
|
83
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("section", { ...rest, className: containerClass, children: [
|
|
84
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "pointer-events-none absolute inset-0 overflow-hidden", children: [
|
|
85
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute left-24 top-10 h-64 w-64 rounded-full bg-primary/15 blur-3xl" }),
|
|
86
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute -right-16 -bottom-10 h-80 w-80 rounded-full bg-primary/20 blur-3xl" })
|
|
87
|
+
] }),
|
|
88
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mx-auto flex max-w-6xl flex-col gap-12 px-6 py-16 lg:px-10 lg:py-24", children: [
|
|
89
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid items-center gap-12 lg:grid-cols-2", children: [
|
|
90
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-6", children: [
|
|
91
|
+
eyebrow && /* @__PURE__ */ jsxRuntime.jsx("span", { className: badgeClass, children: eyebrow }),
|
|
92
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
93
|
+
"h1",
|
|
94
|
+
{
|
|
95
|
+
className: tailwindMerge.twMerge(
|
|
96
|
+
"text-4xl font-semibold leading-tight sm:text-5xl",
|
|
97
|
+
isDark ? "text-white" : "text-gray-900"
|
|
98
|
+
),
|
|
99
|
+
children: title
|
|
100
|
+
}
|
|
101
|
+
),
|
|
102
|
+
description && /* @__PURE__ */ jsxRuntime.jsx("p", { className: tailwindMerge.twMerge("text-lg leading-relaxed", subdued), children: description }),
|
|
103
|
+
actions.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-3", children: actions.map(renderAction) }),
|
|
104
|
+
stats.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("dl", { className: "grid gap-6 sm:grid-cols-3", children: stats.map((stat) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-1", children: [
|
|
105
|
+
/* @__PURE__ */ jsxRuntime.jsx("dd", { className: tailwindMerge.twMerge("text-3xl font-semibold", isDark ? "text-white" : "text-gray-900"), children: stat.value }),
|
|
106
|
+
/* @__PURE__ */ jsxRuntime.jsx("dt", { className: tailwindMerge.twMerge("text-sm font-medium", statMuted), children: stat.label })
|
|
107
|
+
] }, stat.label)) })
|
|
108
|
+
] }),
|
|
109
|
+
image && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "relative", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: tailwindMerge.twMerge("relative overflow-hidden backdrop-blur", frameDecoration, frameRadius), children: [
|
|
110
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
111
|
+
"img",
|
|
112
|
+
{
|
|
113
|
+
src: image.src,
|
|
114
|
+
alt: image.alt ?? "",
|
|
115
|
+
className: tailwindMerge.twMerge("h-full w-full object-cover", frameRadius),
|
|
116
|
+
loading: "lazy"
|
|
117
|
+
}
|
|
118
|
+
),
|
|
119
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "pointer-events-none absolute inset-0 bg-linear-to-t from-black/30 via-transparent to-transparent" })
|
|
120
|
+
] }) })
|
|
121
|
+
] }),
|
|
122
|
+
logos.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-6 lg:items-center lg:gap-10", children: [
|
|
123
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: tailwindMerge.twMerge("text-sm font-semibold tracking-wide", subdued), children: "Duveruji nam" }),
|
|
124
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap items-center gap-4 opacity-80", children: logos.map((logo) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
125
|
+
"img",
|
|
126
|
+
{
|
|
127
|
+
src: logo.src,
|
|
128
|
+
alt: logo.alt ?? "",
|
|
129
|
+
className: "h-8 w-auto grayscale transition hover:grayscale-0",
|
|
130
|
+
loading: "lazy"
|
|
131
|
+
},
|
|
132
|
+
logo.src
|
|
133
|
+
)) })
|
|
134
|
+
] })
|
|
135
|
+
] })
|
|
136
|
+
] });
|
|
137
|
+
};
|
|
138
|
+
Hero.displayName = "Hero";
|
|
139
|
+
var Hero_default = Hero;
|
|
140
|
+
|
|
141
|
+
module.exports = Hero_default;
|
|
142
|
+
//# sourceMappingURL=hero.cjs.map
|
|
143
|
+
//# sourceMappingURL=hero.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/Blocks/Hero/index.tsx"],"names":["twMerge","jsx","jsxs"],"mappings":"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","file":"hero.cjs","sourcesContent":["import type { GlobalVariant } from '@lindle/linoardo/global.types';\nimport * as React from 'react';\nimport { twMerge } from 'tailwind-merge';\n\ntype HeroAction = {\n label: string;\n href?: string;\n variant?: 'primary' | 'secondary';\n onClick?: React.MouseEventHandler<HTMLButtonElement | HTMLAnchorElement>;\n};\n\ntype HeroStat = {\n value: string;\n label: string;\n};\n\ntype HeroLogo = {\n src: string;\n alt?: string;\n};\n\ntype HeroImage = {\n src: string;\n alt?: string;\n};\n\nexport type HeroProps = React.HTMLAttributes<HTMLElement> & {\n title: React.ReactNode;\n description?: React.ReactNode;\n eyebrow?: string;\n actions?: HeroAction[];\n stats?: HeroStat[];\n logos?: HeroLogo[];\n image?: HeroImage;\n variant?: GlobalVariant;\n};\n\nconst containerVariants: Record<GlobalVariant, string> = {\n solid: 'bg-gradient-to-br from-primary via-primary/90 to-indigo-600 text-white shadow-2xl shadow-primary/30',\n outline: 'border border-gray-200 bg-white text-gray-900',\n text: 'bg-transparent text-gray-900',\n ghost: 'bg-primary/5 text-gray-900 border border-primary/10',\n filled: 'bg-slate-900 text-white shadow-2xl shadow-slate-900/40',\n underlined: 'border-b-4 border-primary/70 bg-white text-gray-900',\n rounded: 'rounded-3xl border border-gray-100 bg-white text-gray-900 shadow-xl',\n sharp: 'rounded-none border border-gray-200 bg-white text-gray-900 shadow'\n};\n\nconst frameRadii: Record<GlobalVariant, string> = {\n solid: 'rounded-3xl',\n outline: 'rounded-2xl',\n text: 'rounded-2xl',\n ghost: 'rounded-2xl',\n filled: 'rounded-3xl',\n underlined: 'rounded-2xl',\n rounded: 'rounded-3xl',\n sharp: 'rounded-none'\n};\n\nconst badgeVariants: Record<GlobalVariant, string> = {\n solid: 'bg-white/10 text-white border border-white/20',\n outline: 'bg-primary/10 text-primary border border-primary/20',\n text: 'bg-primary/10 text-primary border border-primary/20',\n ghost: 'bg-primary/15 text-primary border border-primary/25',\n filled: 'bg-white/10 text-white border border-white/20',\n underlined: 'bg-primary/10 text-primary border border-primary/20',\n rounded: 'bg-primary/10 text-primary border border-primary/20',\n sharp: 'bg-primary/10 text-primary border border-primary/20'\n};\n\nconst Hero: React.FC<HeroProps> = ({\n title,\n description,\n eyebrow,\n actions = [],\n stats = [],\n logos = [],\n image,\n variant = 'solid',\n className,\n ...rest\n}) => {\n const containerClass = twMerge(\n 'hero-block relative isolate overflow-hidden',\n containerVariants[variant] ?? containerVariants.solid,\n className\n );\n const badgeClass = twMerge(\n 'inline-flex items-center gap-2 rounded-full px-3 py-1 text-xs font-semibold uppercase tracking-wide',\n badgeVariants[variant] ?? badgeVariants.solid\n );\n const isDark = variant === 'solid' || variant === 'filled';\n const subdued = isDark ? 'text-white/80' : 'text-gray-600';\n const statMuted = isDark ? 'text-white/70' : 'text-gray-500';\n const actionPrimary = isDark\n ? 'bg-white text-gray-900 hover:bg-white/90 focus-visible:outline-white/70'\n : 'bg-primary text-white hover:bg-primary/90 focus-visible:outline-primary/50';\n const actionSecondary = isDark\n ? 'border border-white/40 text-white hover:bg-white/10 focus-visible:outline-white/60'\n : 'border border-gray-300 text-gray-900 hover:border-primary/60 hover:text-primary focus-visible:outline-primary/50';\n const frameRadius = frameRadii[variant] ?? 'rounded-2xl';\n const frameDecoration = isDark\n ? 'border-white/10 bg-white/10 shadow-2xl shadow-black/20'\n : 'border-gray-200 bg-white shadow-2xl shadow-gray-200/60';\n\n const renderAction = (action: HeroAction, index: number) => {\n const { href, label, onClick, variant: actionVariant = 'primary' } = action;\n const Component = href ? 'a' : 'button';\n const resolvedClass =\n actionVariant === 'secondary'\n ? twMerge('bg-white/70', actionSecondary)\n : twMerge('shadow-lg shadow-primary/25', actionPrimary);\n\n return (\n <Component\n key={`${label}-${index}`}\n href={href}\n onClick={onClick as never}\n className={twMerge(\n 'inline-flex items-center gap-2 rounded-xl px-4 py-3 text-sm font-semibold transition focus-visible:outline focus-visible:outline-offset-2',\n resolvedClass\n )}\n >\n {label}\n </Component>\n );\n };\n\n return (\n <section {...rest} className={containerClass}>\n <div className='pointer-events-none absolute inset-0 overflow-hidden'>\n <div className='absolute left-24 top-10 h-64 w-64 rounded-full bg-primary/15 blur-3xl' />\n <div className='absolute -right-16 -bottom-10 h-80 w-80 rounded-full bg-primary/20 blur-3xl' />\n </div>\n <div className='mx-auto flex max-w-6xl flex-col gap-12 px-6 py-16 lg:px-10 lg:py-24'>\n <div className='grid items-center gap-12 lg:grid-cols-2'>\n <div className='space-y-6'>\n {eyebrow && <span className={badgeClass}>{eyebrow}</span>}\n <h1\n className={twMerge(\n 'text-4xl font-semibold leading-tight sm:text-5xl',\n isDark ? 'text-white' : 'text-gray-900'\n )}\n >\n {title}\n </h1>\n {description && <p className={twMerge('text-lg leading-relaxed', subdued)}>{description}</p>}\n {actions.length > 0 && <div className='flex flex-wrap gap-3'>{actions.map(renderAction)}</div>}\n {stats.length > 0 && (\n <dl className='grid gap-6 sm:grid-cols-3'>\n {stats.map(stat => (\n <div key={stat.label} className='space-y-1'>\n <dd className={twMerge('text-3xl font-semibold', isDark ? 'text-white' : 'text-gray-900')}>\n {stat.value}\n </dd>\n <dt className={twMerge('text-sm font-medium', statMuted)}>{stat.label}</dt>\n </div>\n ))}\n </dl>\n )}\n </div>\n {image && (\n <div className='relative'>\n <div className={twMerge('relative overflow-hidden backdrop-blur', frameDecoration, frameRadius)}>\n <img\n src={image.src}\n alt={image.alt ?? ''}\n className={twMerge('h-full w-full object-cover', frameRadius)}\n loading='lazy'\n />\n <div className='pointer-events-none absolute inset-0 bg-linear-to-t from-black/30 via-transparent to-transparent' />\n </div>\n </div>\n )}\n </div>\n {logos.length > 0 && (\n <div className='flex flex-wrap items-center gap-6 lg:items-center lg:gap-10'>\n <span className={twMerge('text-sm font-semibold tracking-wide', subdued)}>Duveruji nam</span>\n <div className='flex flex-wrap items-center gap-4 opacity-80'>\n {logos.map(logo => (\n <img\n key={logo.src}\n src={logo.src}\n alt={logo.alt ?? ''}\n className='h-8 w-auto grayscale transition hover:grayscale-0'\n loading='lazy'\n />\n ))}\n </div>\n </div>\n )}\n </div>\n </section>\n );\n};\n\nHero.displayName = 'Hero';\n\nexport default Hero;\n"]}
|
package/dist/hero.d.cts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { G as GlobalVariant } from './global.types-E2uVLemv.cjs';
|
|
2
|
+
import * as react from 'react';
|
|
3
|
+
|
|
4
|
+
type HeroAction = {
|
|
5
|
+
label: string;
|
|
6
|
+
href?: string;
|
|
7
|
+
variant?: 'primary' | 'secondary';
|
|
8
|
+
onClick?: react.MouseEventHandler<HTMLButtonElement | HTMLAnchorElement>;
|
|
9
|
+
};
|
|
10
|
+
type HeroStat = {
|
|
11
|
+
value: string;
|
|
12
|
+
label: string;
|
|
13
|
+
};
|
|
14
|
+
type HeroLogo = {
|
|
15
|
+
src: string;
|
|
16
|
+
alt?: string;
|
|
17
|
+
};
|
|
18
|
+
type HeroImage = {
|
|
19
|
+
src: string;
|
|
20
|
+
alt?: string;
|
|
21
|
+
};
|
|
22
|
+
type HeroProps = react.HTMLAttributes<HTMLElement> & {
|
|
23
|
+
title: react.ReactNode;
|
|
24
|
+
description?: react.ReactNode;
|
|
25
|
+
eyebrow?: string;
|
|
26
|
+
actions?: HeroAction[];
|
|
27
|
+
stats?: HeroStat[];
|
|
28
|
+
logos?: HeroLogo[];
|
|
29
|
+
image?: HeroImage;
|
|
30
|
+
variant?: GlobalVariant;
|
|
31
|
+
};
|
|
32
|
+
declare const Hero: react.FC<HeroProps>;
|
|
33
|
+
|
|
34
|
+
export { type HeroProps, Hero as default };
|
package/dist/hero.d.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { G as GlobalVariant } from './global.types-E2uVLemv.js';
|
|
2
|
+
import * as react from 'react';
|
|
3
|
+
|
|
4
|
+
type HeroAction = {
|
|
5
|
+
label: string;
|
|
6
|
+
href?: string;
|
|
7
|
+
variant?: 'primary' | 'secondary';
|
|
8
|
+
onClick?: react.MouseEventHandler<HTMLButtonElement | HTMLAnchorElement>;
|
|
9
|
+
};
|
|
10
|
+
type HeroStat = {
|
|
11
|
+
value: string;
|
|
12
|
+
label: string;
|
|
13
|
+
};
|
|
14
|
+
type HeroLogo = {
|
|
15
|
+
src: string;
|
|
16
|
+
alt?: string;
|
|
17
|
+
};
|
|
18
|
+
type HeroImage = {
|
|
19
|
+
src: string;
|
|
20
|
+
alt?: string;
|
|
21
|
+
};
|
|
22
|
+
type HeroProps = react.HTMLAttributes<HTMLElement> & {
|
|
23
|
+
title: react.ReactNode;
|
|
24
|
+
description?: react.ReactNode;
|
|
25
|
+
eyebrow?: string;
|
|
26
|
+
actions?: HeroAction[];
|
|
27
|
+
stats?: HeroStat[];
|
|
28
|
+
logos?: HeroLogo[];
|
|
29
|
+
image?: HeroImage;
|
|
30
|
+
variant?: GlobalVariant;
|
|
31
|
+
};
|
|
32
|
+
declare const Hero: react.FC<HeroProps>;
|
|
33
|
+
|
|
34
|
+
export { type HeroProps, Hero as default };
|
package/dist/hero.js
ADDED
package/dist/hero.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"hero.js"}
|