@ug666/ui-react 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/blocks/index.cjs +238 -0
- package/dist/blocks/index.cjs.map +1 -0
- package/dist/blocks/index.d.cts +86 -0
- package/dist/blocks/index.d.ts +86 -0
- package/dist/blocks/index.js +153 -0
- package/dist/blocks/index.js.map +1 -0
- package/dist/button-CaLZig8j.d.cts +22 -0
- package/dist/button-CaLZig8j.d.ts +22 -0
- package/dist/chunk-2IVRUJKO.js +377 -0
- package/dist/chunk-2IVRUJKO.js.map +1 -0
- package/dist/chunk-73WQAE3E.js +3003 -0
- package/dist/chunk-73WQAE3E.js.map +1 -0
- package/dist/chunk-RUDEZA5Q.js +62 -0
- package/dist/chunk-RUDEZA5Q.js.map +1 -0
- package/dist/chunk-S45GP6IB.js +254 -0
- package/dist/chunk-S45GP6IB.js.map +1 -0
- package/dist/components/index.cjs +3993 -0
- package/dist/components/index.cjs.map +1 -0
- package/dist/components/index.d.cts +1097 -0
- package/dist/components/index.d.ts +1097 -0
- package/dist/components/index.js +330 -0
- package/dist/components/index.js.map +1 -0
- package/dist/hooks/index.cjs +1 -0
- package/dist/hooks/index.cjs.map +1 -1
- package/dist/hooks/index.js +1 -0
- package/dist/index.cjs +1410 -710
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +274 -1340
- package/dist/index.d.ts +274 -1340
- package/dist/index.js +385 -3229
- package/dist/index.js.map +1 -1
- package/dist/labs/index.cjs +34 -0
- package/dist/labs/index.cjs.map +1 -0
- package/dist/labs/index.d.cts +12 -0
- package/dist/labs/index.d.ts +12 -0
- package/dist/labs/index.js +9 -0
- package/dist/labs/index.js.map +1 -0
- package/dist/patterns/index.cjs +758 -0
- package/dist/patterns/index.cjs.map +1 -0
- package/dist/patterns/index.d.cts +158 -0
- package/dist/patterns/index.d.ts +158 -0
- package/dist/patterns/index.js +320 -0
- package/dist/patterns/index.js.map +1 -0
- package/dist/primitives/index.cjs +384 -0
- package/dist/primitives/index.cjs.map +1 -0
- package/dist/primitives/index.d.cts +137 -0
- package/dist/primitives/index.d.ts +137 -0
- package/dist/primitives/index.js +56 -0
- package/dist/primitives/index.js.map +1 -0
- package/dist/sidebar-vl00Z2o-.d.cts +93 -0
- package/dist/sidebar-vl00Z2o-.d.ts +93 -0
- package/dist/styles.css +2499 -0
- package/dist/tokens.css +86 -9
- package/package.json +36 -6
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/blocks/index.ts
|
|
21
|
+
var blocks_exports = {};
|
|
22
|
+
__export(blocks_exports, {
|
|
23
|
+
FeatureGrid: () => FeatureGrid,
|
|
24
|
+
LandingHero: () => LandingHero,
|
|
25
|
+
UGFeatureGrid: () => FeatureGrid,
|
|
26
|
+
UGLandingHero: () => LandingHero
|
|
27
|
+
});
|
|
28
|
+
module.exports = __toCommonJS(blocks_exports);
|
|
29
|
+
|
|
30
|
+
// src/blocks/feature-grid.tsx
|
|
31
|
+
var import_react = require("react");
|
|
32
|
+
var import_lucide_react = require("lucide-react");
|
|
33
|
+
|
|
34
|
+
// src/internal/cn.ts
|
|
35
|
+
var import_clsx = require("clsx");
|
|
36
|
+
var import_tailwind_merge = require("tailwind-merge");
|
|
37
|
+
function cn(...inputs) {
|
|
38
|
+
return (0, import_tailwind_merge.twMerge)((0, import_clsx.clsx)(inputs));
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// src/blocks/feature-grid.tsx
|
|
42
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
43
|
+
var columnClasses = {
|
|
44
|
+
2: "lg:grid-cols-2",
|
|
45
|
+
3: "lg:grid-cols-3",
|
|
46
|
+
4: "lg:grid-cols-4"
|
|
47
|
+
};
|
|
48
|
+
var FeatureGrid = (0, import_react.forwardRef)(
|
|
49
|
+
({ title, description, features, columns = 3, className, ...props }, ref) => {
|
|
50
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
51
|
+
"section",
|
|
52
|
+
{
|
|
53
|
+
ref,
|
|
54
|
+
className: cn("bg-surface-0 px-4 py-16 sm:px-6 lg:px-8", className),
|
|
55
|
+
...props,
|
|
56
|
+
children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "mx-auto w-full max-w-7xl space-y-8", children: [
|
|
57
|
+
title || description ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "max-w-3xl space-y-3", children: [
|
|
58
|
+
title ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", { className: "break-words text-3xl font-bold leading-tight text-text-primary", children: title }) : null,
|
|
59
|
+
description ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm leading-6 text-text-secondary", children: description }) : null
|
|
60
|
+
] }) : null,
|
|
61
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { className: cn("grid gap-4 md:grid-cols-2", columnClasses[columns]), children: features.map((feature, index) => {
|
|
62
|
+
const Icon = feature.icon;
|
|
63
|
+
const content = /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
|
|
64
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "flex min-w-0 items-start justify-between gap-3", children: [
|
|
65
|
+
Icon ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "flex h-10 w-10 shrink-0 items-center justify-center rounded-md bg-primary-soft text-primary-soft-fg", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Icon, { size: 20, "aria-hidden": "true" }) }) : null,
|
|
66
|
+
feature.meta ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { className: "shrink-0 text-xs font-medium text-text-tertiary", children: feature.meta }) : null
|
|
67
|
+
] }),
|
|
68
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", { className: "min-w-0 space-y-2", children: [
|
|
69
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("h3", { className: "break-words text-base font-semibold text-text-primary", children: feature.title }),
|
|
70
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { className: "text-sm leading-6 text-text-secondary", children: feature.description })
|
|
71
|
+
] }),
|
|
72
|
+
feature.href ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", { className: "inline-flex items-center gap-1 text-sm font-medium text-primary", children: [
|
|
73
|
+
"\u67E5\u770B\u8BE6\u60C5",
|
|
74
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_lucide_react.ArrowRight, { size: 14, "aria-hidden": "true" })
|
|
75
|
+
] }) : null
|
|
76
|
+
] });
|
|
77
|
+
if (feature.href) {
|
|
78
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
79
|
+
"a",
|
|
80
|
+
{
|
|
81
|
+
href: feature.href,
|
|
82
|
+
className: "flex min-w-0 flex-col gap-5 rounded-lg border border-border-base bg-surface-1 p-5 transition-colors hover:border-primary/35 hover:bg-surface-2",
|
|
83
|
+
children: content
|
|
84
|
+
},
|
|
85
|
+
index
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
89
|
+
"article",
|
|
90
|
+
{
|
|
91
|
+
className: "flex min-w-0 flex-col gap-5 rounded-lg border border-border-base bg-surface-1 p-5",
|
|
92
|
+
children: content
|
|
93
|
+
},
|
|
94
|
+
index
|
|
95
|
+
);
|
|
96
|
+
}) })
|
|
97
|
+
] })
|
|
98
|
+
}
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
);
|
|
102
|
+
FeatureGrid.displayName = "FeatureGrid";
|
|
103
|
+
|
|
104
|
+
// src/blocks/landing-hero.tsx
|
|
105
|
+
var import_react3 = require("react");
|
|
106
|
+
var import_lucide_react3 = require("lucide-react");
|
|
107
|
+
|
|
108
|
+
// src/components/button.tsx
|
|
109
|
+
var import_react2 = require("react");
|
|
110
|
+
var import_lucide_react2 = require("lucide-react");
|
|
111
|
+
var import_class_variance_authority = require("class-variance-authority");
|
|
112
|
+
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
113
|
+
var buttonVariants = (0, import_class_variance_authority.cva)(
|
|
114
|
+
"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-lg text-sm font-medium transition-[background,border-color,color,box-shadow,transform] duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
|
|
115
|
+
{
|
|
116
|
+
variants: {
|
|
117
|
+
variant: {
|
|
118
|
+
default: "bg-primary text-primary-fg shadow-sm hover:bg-primary-hover hover:shadow-md focus-visible:ring-ring",
|
|
119
|
+
destructive: "bg-danger text-danger-fg shadow-sm hover:bg-danger-hover hover:shadow-md focus-visible:ring-danger",
|
|
120
|
+
outline: "border border-border-strong bg-surface-1 text-text-primary shadow-sm hover:border-primary/55 hover:bg-surface-2 focus-visible:ring-ring/30",
|
|
121
|
+
secondary: "border border-border-base bg-surface-2 text-text-primary shadow-sm hover:bg-surface-3 focus-visible:ring-ring/30",
|
|
122
|
+
ghost: "text-text-primary hover:bg-surface-2 focus-visible:ring-ring/30",
|
|
123
|
+
link: "text-text-primary underline-offset-4 hover:underline focus-visible:ring-ring/30"
|
|
124
|
+
},
|
|
125
|
+
size: {
|
|
126
|
+
default: "h-9 px-4 py-2",
|
|
127
|
+
sm: "h-8 px-3 text-xs",
|
|
128
|
+
lg: "h-11 px-5 text-base",
|
|
129
|
+
icon: "h-9 w-9"
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
defaultVariants: {
|
|
133
|
+
variant: "default",
|
|
134
|
+
size: "default"
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
);
|
|
138
|
+
var Button = (0, import_react2.forwardRef)(
|
|
139
|
+
({ className, variant, size, loading = false, disabled, children, ...props }, ref) => {
|
|
140
|
+
return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
|
|
141
|
+
"button",
|
|
142
|
+
{
|
|
143
|
+
ref,
|
|
144
|
+
className: cn(buttonVariants({ variant, size }), className),
|
|
145
|
+
disabled: disabled || loading,
|
|
146
|
+
...props,
|
|
147
|
+
children: [
|
|
148
|
+
loading && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_lucide_react2.Loader2, { className: "animate-spin", size: 16 }),
|
|
149
|
+
children
|
|
150
|
+
]
|
|
151
|
+
}
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
);
|
|
155
|
+
Button.displayName = "Button";
|
|
156
|
+
|
|
157
|
+
// src/blocks/landing-hero.tsx
|
|
158
|
+
var import_jsx_runtime3 = require("react/jsx-runtime");
|
|
159
|
+
function HeroAction({ label, href, icon: Icon = import_lucide_react3.ArrowRight, variant = "default", className, ...props }) {
|
|
160
|
+
if (href) {
|
|
161
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
162
|
+
"a",
|
|
163
|
+
{
|
|
164
|
+
href,
|
|
165
|
+
className: cn(
|
|
166
|
+
"inline-flex h-10 items-center justify-center gap-2 rounded-md px-4 text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
167
|
+
variant === "outline" ? "border border-border-strong bg-surface-1 text-text-primary hover:bg-surface-2" : "bg-primary text-primary-fg hover:bg-primary-hover",
|
|
168
|
+
className
|
|
169
|
+
),
|
|
170
|
+
children: [
|
|
171
|
+
label,
|
|
172
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Icon, { size: 16, "aria-hidden": "true" })
|
|
173
|
+
]
|
|
174
|
+
}
|
|
175
|
+
);
|
|
176
|
+
}
|
|
177
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(Button, { variant, className, ...props, children: [
|
|
178
|
+
label,
|
|
179
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)(Icon, { size: 16, "aria-hidden": "true" })
|
|
180
|
+
] });
|
|
181
|
+
}
|
|
182
|
+
var LandingHero = (0, import_react3.forwardRef)(
|
|
183
|
+
({
|
|
184
|
+
eyebrow,
|
|
185
|
+
title,
|
|
186
|
+
description,
|
|
187
|
+
media,
|
|
188
|
+
primaryAction,
|
|
189
|
+
secondaryAction,
|
|
190
|
+
stats,
|
|
191
|
+
children,
|
|
192
|
+
className,
|
|
193
|
+
...props
|
|
194
|
+
}, ref) => {
|
|
195
|
+
return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
|
|
196
|
+
"section",
|
|
197
|
+
{
|
|
198
|
+
ref,
|
|
199
|
+
className: cn(
|
|
200
|
+
"relative isolate overflow-hidden border-b border-border-base bg-surface-0",
|
|
201
|
+
className
|
|
202
|
+
),
|
|
203
|
+
...props,
|
|
204
|
+
children: [
|
|
205
|
+
media ? /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(import_jsx_runtime3.Fragment, { children: [
|
|
206
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "absolute inset-0 -z-20 overflow-hidden", children: media }),
|
|
207
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "absolute inset-0 -z-10 bg-surface-0/78", "aria-hidden": "true" })
|
|
208
|
+
] }) : null,
|
|
209
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "mx-auto flex min-h-[520px] w-full max-w-7xl flex-col justify-center px-4 py-20 sm:px-6 lg:px-8", children: /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "max-w-4xl space-y-7", children: [
|
|
210
|
+
eyebrow ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "inline-flex rounded-md border border-primary/25 bg-primary-soft px-3 py-1 text-xs font-semibold text-primary-soft-fg", children: eyebrow }) : null,
|
|
211
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "space-y-4", children: [
|
|
212
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("h1", { className: "max-w-4xl break-words text-4xl font-bold leading-tight text-text-primary sm:text-5xl lg:text-6xl", children: title }),
|
|
213
|
+
description ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("p", { className: "max-w-2xl text-base leading-7 text-text-secondary sm:text-lg", children: description }) : null
|
|
214
|
+
] }),
|
|
215
|
+
primaryAction || secondaryAction ? /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "flex flex-wrap items-center gap-3", children: [
|
|
216
|
+
primaryAction ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(HeroAction, { ...primaryAction }) : null,
|
|
217
|
+
secondaryAction ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(HeroAction, { variant: "outline", ...secondaryAction }) : null
|
|
218
|
+
] }) : null,
|
|
219
|
+
stats?.length ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("dl", { className: "grid max-w-2xl gap-4 sm:grid-cols-3", children: stats.map((stat, index) => /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)("div", { className: "border-l border-border-base pl-4", children: [
|
|
220
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("dt", { className: "text-xs font-medium text-text-tertiary", children: stat.label }),
|
|
221
|
+
/* @__PURE__ */ (0, import_jsx_runtime3.jsx)("dd", { className: "mt-1 text-2xl font-bold text-text-primary", children: stat.value })
|
|
222
|
+
] }, index)) }) : null,
|
|
223
|
+
children ? /* @__PURE__ */ (0, import_jsx_runtime3.jsx)("div", { className: "min-w-0", children }) : null
|
|
224
|
+
] }) })
|
|
225
|
+
]
|
|
226
|
+
}
|
|
227
|
+
);
|
|
228
|
+
}
|
|
229
|
+
);
|
|
230
|
+
LandingHero.displayName = "LandingHero";
|
|
231
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
232
|
+
0 && (module.exports = {
|
|
233
|
+
FeatureGrid,
|
|
234
|
+
LandingHero,
|
|
235
|
+
UGFeatureGrid,
|
|
236
|
+
UGLandingHero
|
|
237
|
+
});
|
|
238
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/blocks/index.ts","../../src/blocks/feature-grid.tsx","../../src/internal/cn.ts","../../src/blocks/landing-hero.tsx","../../src/components/button.tsx"],"sourcesContent":["/**\n * @description: React blocks 子入口 — 展示页、产品页和营销页区块\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-05-30\n */\n\nexport {\n FeatureGrid,\n FeatureGrid as UGFeatureGrid,\n type FeatureGridItem,\n type FeatureGridItem as UGFeatureGridItem,\n type FeatureGridProps,\n type FeatureGridProps as UGFeatureGridProps,\n} from './feature-grid'\nexport {\n LandingHero,\n LandingHero as UGLandingHero,\n type LandingHeroAction,\n type LandingHeroAction as UGLandingHeroAction,\n type LandingHeroProps,\n type LandingHeroProps as UGLandingHeroProps,\n type LandingHeroStat,\n type LandingHeroStat as UGLandingHeroStat,\n} from './landing-hero'\n","/**\n * @description: FeatureGrid 特性网格区块 — 用于产品能力、服务优势和功能模块展示\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-05-30\n */\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react'\nimport { ArrowRight, type LucideIcon } from 'lucide-react'\nimport { cn } from '../internal/cn'\n\nexport interface FeatureGridItem {\n /** 标题 */\n title: ReactNode\n /** 描述 */\n description: ReactNode\n /** 图标 */\n icon?: LucideIcon\n /** 角标或状态 */\n meta?: ReactNode\n /** 链接地址 */\n href?: string\n}\n\nexport interface FeatureGridProps extends Omit<HTMLAttributes<HTMLElement>, 'title'> {\n /** 区块标题 */\n title?: ReactNode\n /** 区块说明 */\n description?: ReactNode\n /** 特性列表 */\n features: FeatureGridItem[]\n /** 列数,默认三列 */\n columns?: 2 | 3 | 4\n}\n\nconst columnClasses: Record<NonNullable<FeatureGridProps['columns']>, string> = {\n 2: 'lg:grid-cols-2',\n 3: 'lg:grid-cols-3',\n 4: 'lg:grid-cols-4',\n}\n\n/**\n * 特性网格区块\n * @example\n * <FeatureGrid\n * title=\"平台能力\"\n * features={[{ title: '认证中心', description: '统一登录与授权。' }]}\n * />\n */\nconst FeatureGrid = forwardRef<HTMLElement, FeatureGridProps>(\n ({ title, description, features, columns = 3, className, ...props }, ref) => {\n return (\n <section\n ref={ref}\n className={cn('bg-surface-0 px-4 py-16 sm:px-6 lg:px-8', className)}\n {...props}\n >\n <div className=\"mx-auto w-full max-w-7xl space-y-8\">\n {(title || description) ? (\n <div className=\"max-w-3xl space-y-3\">\n {title ? (\n <h2 className=\"break-words text-3xl font-bold leading-tight text-text-primary\">{title}</h2>\n ) : null}\n {description ? (\n <p className=\"text-sm leading-6 text-text-secondary\">{description}</p>\n ) : null}\n </div>\n ) : null}\n\n <div className={cn('grid gap-4 md:grid-cols-2', columnClasses[columns])}>\n {features.map((feature, index) => {\n const Icon = feature.icon\n const content = (\n <>\n <div className=\"flex min-w-0 items-start justify-between gap-3\">\n {Icon ? (\n <span className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-md bg-primary-soft text-primary-soft-fg\">\n <Icon size={20} aria-hidden=\"true\" />\n </span>\n ) : null}\n {feature.meta ? (\n <span className=\"shrink-0 text-xs font-medium text-text-tertiary\">{feature.meta}</span>\n ) : null}\n </div>\n <div className=\"min-w-0 space-y-2\">\n <h3 className=\"break-words text-base font-semibold text-text-primary\">{feature.title}</h3>\n <p className=\"text-sm leading-6 text-text-secondary\">{feature.description}</p>\n </div>\n {feature.href ? (\n <span className=\"inline-flex items-center gap-1 text-sm font-medium text-primary\">\n 查看详情\n <ArrowRight size={14} aria-hidden=\"true\" />\n </span>\n ) : null}\n </>\n )\n\n if (feature.href) {\n return (\n <a\n key={index}\n href={feature.href}\n className=\"flex min-w-0 flex-col gap-5 rounded-lg border border-border-base bg-surface-1 p-5 transition-colors hover:border-primary/35 hover:bg-surface-2\"\n >\n {content}\n </a>\n )\n }\n\n return (\n <article\n key={index}\n className=\"flex min-w-0 flex-col gap-5 rounded-lg border border-border-base bg-surface-1 p-5\"\n >\n {content}\n </article>\n )\n })}\n </div>\n </div>\n </section>\n )\n },\n)\n\nFeatureGrid.displayName = 'FeatureGrid'\n\nexport { FeatureGrid }\n","/**\n * @description: React 包内部类名合并工具\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-05-27\n */\nimport { type ClassValue, clsx } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs))\n}\n","/**\n * @description: LandingHero 展示页首屏区块 — 支持背景媒体、行动按钮和关键指标\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-05-30\n */\nimport { forwardRef, type ButtonHTMLAttributes, type HTMLAttributes, type ReactNode } from 'react'\nimport { ArrowRight, type LucideIcon } from 'lucide-react'\nimport { Button, type ButtonProps } from '../components/button'\nimport { cn } from '../internal/cn'\n\nexport interface LandingHeroAction extends ButtonHTMLAttributes<HTMLButtonElement> {\n /** 按钮文案 */\n label: ReactNode\n /** href 存在时渲染为链接 */\n href?: string\n /** 按钮图标 */\n icon?: LucideIcon\n /** 按钮视觉风格 */\n variant?: ButtonProps['variant']\n}\n\nexport interface LandingHeroStat {\n /** 指标值 */\n value: ReactNode\n /** 指标说明 */\n label: ReactNode\n}\n\nexport interface LandingHeroProps extends Omit<HTMLAttributes<HTMLElement>, 'title'> {\n /** 顶部短标签 */\n eyebrow?: ReactNode\n /** 主标题 */\n title: ReactNode\n /** 描述文案 */\n description?: ReactNode\n /** 背景媒体,建议传真实图片或视频容器 */\n media?: ReactNode\n /** 主行动 */\n primaryAction?: LandingHeroAction\n /** 次行动 */\n secondaryAction?: LandingHeroAction\n /** 关键指标 */\n stats?: LandingHeroStat[]\n /** 底部扩展区域 */\n children?: ReactNode\n}\n\nfunction HeroAction({ label, href, icon: Icon = ArrowRight, variant = 'default', className, ...props }: LandingHeroAction) {\n if (href) {\n return (\n <a\n href={href}\n className={cn(\n 'inline-flex h-10 items-center justify-center gap-2 rounded-md px-4 text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n variant === 'outline'\n ? 'border border-border-strong bg-surface-1 text-text-primary hover:bg-surface-2'\n : 'bg-primary text-primary-fg hover:bg-primary-hover',\n className,\n )}\n >\n {label}\n <Icon size={16} aria-hidden=\"true\" />\n </a>\n )\n }\n\n return (\n <Button variant={variant} className={className} {...props}>\n {label}\n <Icon size={16} aria-hidden=\"true\" />\n </Button>\n )\n}\n\n/**\n * 展示页首屏区块\n * @example\n * <LandingHero\n * eyebrow=\"UG Storage\"\n * title=\"统一管理文件与外链\"\n * description=\"把文件存储、分享链接和业务展示组合成稳定的产品入口。\"\n * primaryAction={{ label: '开始使用', href: '/dashboard' }}\n * />\n */\nconst LandingHero = forwardRef<HTMLElement, LandingHeroProps>(\n (\n {\n eyebrow,\n title,\n description,\n media,\n primaryAction,\n secondaryAction,\n stats,\n children,\n className,\n ...props\n },\n ref,\n ) => {\n return (\n <section\n ref={ref}\n className={cn(\n 'relative isolate overflow-hidden border-b border-border-base bg-surface-0',\n className,\n )}\n {...props}\n >\n {media ? (\n <>\n <div className=\"absolute inset-0 -z-20 overflow-hidden\">{media}</div>\n <div className=\"absolute inset-0 -z-10 bg-surface-0/78\" aria-hidden=\"true\" />\n </>\n ) : null}\n\n <div className=\"mx-auto flex min-h-[520px] w-full max-w-7xl flex-col justify-center px-4 py-20 sm:px-6 lg:px-8\">\n <div className=\"max-w-4xl space-y-7\">\n {eyebrow ? (\n <div className=\"inline-flex rounded-md border border-primary/25 bg-primary-soft px-3 py-1 text-xs font-semibold text-primary-soft-fg\">\n {eyebrow}\n </div>\n ) : null}\n\n <div className=\"space-y-4\">\n <h1 className=\"max-w-4xl break-words text-4xl font-bold leading-tight text-text-primary sm:text-5xl lg:text-6xl\">\n {title}\n </h1>\n {description ? (\n <p className=\"max-w-2xl text-base leading-7 text-text-secondary sm:text-lg\">\n {description}\n </p>\n ) : null}\n </div>\n\n {(primaryAction || secondaryAction) ? (\n <div className=\"flex flex-wrap items-center gap-3\">\n {primaryAction ? <HeroAction {...primaryAction} /> : null}\n {secondaryAction ? <HeroAction variant=\"outline\" {...secondaryAction} /> : null}\n </div>\n ) : null}\n\n {stats?.length ? (\n <dl className=\"grid max-w-2xl gap-4 sm:grid-cols-3\">\n {stats.map((stat, index) => (\n <div key={index} className=\"border-l border-border-base pl-4\">\n <dt className=\"text-xs font-medium text-text-tertiary\">{stat.label}</dt>\n <dd className=\"mt-1 text-2xl font-bold text-text-primary\">{stat.value}</dd>\n </div>\n ))}\n </dl>\n ) : null}\n\n {children ? <div className=\"min-w-0\">{children}</div> : null}\n </div>\n </div>\n </section>\n )\n },\n)\n\nLandingHero.displayName = 'LandingHero'\n\nexport { LandingHero }\n","/**\n * @description: Button 按钮组件 — 基于 CVA 管理变体,支持 loading/disabled 状态\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-04-15\n */\nimport { forwardRef } from 'react'\nimport { Loader2 } from 'lucide-react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { cn } from '../internal/cn'\n\nconst buttonVariants = cva(\n 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-lg text-sm font-medium transition-[background,border-color,color,box-shadow,transform] duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50',\n {\n variants: {\n variant: {\n default:\n 'bg-primary text-primary-fg shadow-sm hover:bg-primary-hover hover:shadow-md focus-visible:ring-ring',\n destructive:\n 'bg-danger text-danger-fg shadow-sm hover:bg-danger-hover hover:shadow-md focus-visible:ring-danger',\n outline:\n 'border border-border-strong bg-surface-1 text-text-primary shadow-sm hover:border-primary/55 hover:bg-surface-2 focus-visible:ring-ring/30',\n secondary:\n 'border border-border-base bg-surface-2 text-text-primary shadow-sm hover:bg-surface-3 focus-visible:ring-ring/30',\n ghost:\n 'text-text-primary hover:bg-surface-2 focus-visible:ring-ring/30',\n link: 'text-text-primary underline-offset-4 hover:underline focus-visible:ring-ring/30',\n },\n size: {\n default: 'h-9 px-4 py-2',\n sm: 'h-8 px-3 text-xs',\n lg: 'h-11 px-5 text-base',\n icon: 'h-9 w-9',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n /** 是否处于加载状态,加载时显示旋转图标并禁用点击 */\n loading?: boolean\n}\n\n/**\n * 通用按钮组件\n * @example\n * <Button variant=\"default\" size=\"lg\" onClick={handleClick}>确认</Button>\n * <Button variant=\"destructive\" loading>删除中...</Button>\n * <Button variant=\"outline\" size=\"sm\">取消</Button>\n */\nconst Button = forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, loading = false, disabled, children, ...props }, ref) => {\n return (\n <button\n ref={ref}\n className={cn(buttonVariants({ variant, size }), className)}\n disabled={disabled || loading}\n {...props}\n >\n {loading && <Loader2 className=\"animate-spin\" size={16} />}\n {children}\n </button>\n )\n }\n)\n\nButton.displayName = 'Button'\n\nexport { Button, buttonVariants }\n"],"mappings":"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","names":["import_react","import_lucide_react","import_react","import_lucide_react","import_jsx_runtime","import_jsx_runtime"]}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { HTMLAttributes, ReactNode, ButtonHTMLAttributes } from 'react';
|
|
3
|
+
import { LucideIcon } from 'lucide-react';
|
|
4
|
+
import { B as ButtonProps } from '../button-CaLZig8j.cjs';
|
|
5
|
+
import 'class-variance-authority/types';
|
|
6
|
+
import 'class-variance-authority';
|
|
7
|
+
|
|
8
|
+
interface FeatureGridItem {
|
|
9
|
+
/** 标题 */
|
|
10
|
+
title: ReactNode;
|
|
11
|
+
/** 描述 */
|
|
12
|
+
description: ReactNode;
|
|
13
|
+
/** 图标 */
|
|
14
|
+
icon?: LucideIcon;
|
|
15
|
+
/** 角标或状态 */
|
|
16
|
+
meta?: ReactNode;
|
|
17
|
+
/** 链接地址 */
|
|
18
|
+
href?: string;
|
|
19
|
+
}
|
|
20
|
+
interface FeatureGridProps extends Omit<HTMLAttributes<HTMLElement>, 'title'> {
|
|
21
|
+
/** 区块标题 */
|
|
22
|
+
title?: ReactNode;
|
|
23
|
+
/** 区块说明 */
|
|
24
|
+
description?: ReactNode;
|
|
25
|
+
/** 特性列表 */
|
|
26
|
+
features: FeatureGridItem[];
|
|
27
|
+
/** 列数,默认三列 */
|
|
28
|
+
columns?: 2 | 3 | 4;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 特性网格区块
|
|
32
|
+
* @example
|
|
33
|
+
* <FeatureGrid
|
|
34
|
+
* title="平台能力"
|
|
35
|
+
* features={[{ title: '认证中心', description: '统一登录与授权。' }]}
|
|
36
|
+
* />
|
|
37
|
+
*/
|
|
38
|
+
declare const FeatureGrid: react.ForwardRefExoticComponent<FeatureGridProps & react.RefAttributes<HTMLElement>>;
|
|
39
|
+
|
|
40
|
+
interface LandingHeroAction extends ButtonHTMLAttributes<HTMLButtonElement> {
|
|
41
|
+
/** 按钮文案 */
|
|
42
|
+
label: ReactNode;
|
|
43
|
+
/** href 存在时渲染为链接 */
|
|
44
|
+
href?: string;
|
|
45
|
+
/** 按钮图标 */
|
|
46
|
+
icon?: LucideIcon;
|
|
47
|
+
/** 按钮视觉风格 */
|
|
48
|
+
variant?: ButtonProps['variant'];
|
|
49
|
+
}
|
|
50
|
+
interface LandingHeroStat {
|
|
51
|
+
/** 指标值 */
|
|
52
|
+
value: ReactNode;
|
|
53
|
+
/** 指标说明 */
|
|
54
|
+
label: ReactNode;
|
|
55
|
+
}
|
|
56
|
+
interface LandingHeroProps extends Omit<HTMLAttributes<HTMLElement>, 'title'> {
|
|
57
|
+
/** 顶部短标签 */
|
|
58
|
+
eyebrow?: ReactNode;
|
|
59
|
+
/** 主标题 */
|
|
60
|
+
title: ReactNode;
|
|
61
|
+
/** 描述文案 */
|
|
62
|
+
description?: ReactNode;
|
|
63
|
+
/** 背景媒体,建议传真实图片或视频容器 */
|
|
64
|
+
media?: ReactNode;
|
|
65
|
+
/** 主行动 */
|
|
66
|
+
primaryAction?: LandingHeroAction;
|
|
67
|
+
/** 次行动 */
|
|
68
|
+
secondaryAction?: LandingHeroAction;
|
|
69
|
+
/** 关键指标 */
|
|
70
|
+
stats?: LandingHeroStat[];
|
|
71
|
+
/** 底部扩展区域 */
|
|
72
|
+
children?: ReactNode;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* 展示页首屏区块
|
|
76
|
+
* @example
|
|
77
|
+
* <LandingHero
|
|
78
|
+
* eyebrow="UG Storage"
|
|
79
|
+
* title="统一管理文件与外链"
|
|
80
|
+
* description="把文件存储、分享链接和业务展示组合成稳定的产品入口。"
|
|
81
|
+
* primaryAction={{ label: '开始使用', href: '/dashboard' }}
|
|
82
|
+
* />
|
|
83
|
+
*/
|
|
84
|
+
declare const LandingHero: react.ForwardRefExoticComponent<LandingHeroProps & react.RefAttributes<HTMLElement>>;
|
|
85
|
+
|
|
86
|
+
export { FeatureGrid, type FeatureGridItem, type FeatureGridProps, LandingHero, type LandingHeroAction, type LandingHeroProps, type LandingHeroStat, FeatureGrid as UGFeatureGrid, type FeatureGridItem as UGFeatureGridItem, type FeatureGridProps as UGFeatureGridProps, LandingHero as UGLandingHero, type LandingHeroAction as UGLandingHeroAction, type LandingHeroProps as UGLandingHeroProps, type LandingHeroStat as UGLandingHeroStat };
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { HTMLAttributes, ReactNode, ButtonHTMLAttributes } from 'react';
|
|
3
|
+
import { LucideIcon } from 'lucide-react';
|
|
4
|
+
import { B as ButtonProps } from '../button-CaLZig8j.js';
|
|
5
|
+
import 'class-variance-authority/types';
|
|
6
|
+
import 'class-variance-authority';
|
|
7
|
+
|
|
8
|
+
interface FeatureGridItem {
|
|
9
|
+
/** 标题 */
|
|
10
|
+
title: ReactNode;
|
|
11
|
+
/** 描述 */
|
|
12
|
+
description: ReactNode;
|
|
13
|
+
/** 图标 */
|
|
14
|
+
icon?: LucideIcon;
|
|
15
|
+
/** 角标或状态 */
|
|
16
|
+
meta?: ReactNode;
|
|
17
|
+
/** 链接地址 */
|
|
18
|
+
href?: string;
|
|
19
|
+
}
|
|
20
|
+
interface FeatureGridProps extends Omit<HTMLAttributes<HTMLElement>, 'title'> {
|
|
21
|
+
/** 区块标题 */
|
|
22
|
+
title?: ReactNode;
|
|
23
|
+
/** 区块说明 */
|
|
24
|
+
description?: ReactNode;
|
|
25
|
+
/** 特性列表 */
|
|
26
|
+
features: FeatureGridItem[];
|
|
27
|
+
/** 列数,默认三列 */
|
|
28
|
+
columns?: 2 | 3 | 4;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 特性网格区块
|
|
32
|
+
* @example
|
|
33
|
+
* <FeatureGrid
|
|
34
|
+
* title="平台能力"
|
|
35
|
+
* features={[{ title: '认证中心', description: '统一登录与授权。' }]}
|
|
36
|
+
* />
|
|
37
|
+
*/
|
|
38
|
+
declare const FeatureGrid: react.ForwardRefExoticComponent<FeatureGridProps & react.RefAttributes<HTMLElement>>;
|
|
39
|
+
|
|
40
|
+
interface LandingHeroAction extends ButtonHTMLAttributes<HTMLButtonElement> {
|
|
41
|
+
/** 按钮文案 */
|
|
42
|
+
label: ReactNode;
|
|
43
|
+
/** href 存在时渲染为链接 */
|
|
44
|
+
href?: string;
|
|
45
|
+
/** 按钮图标 */
|
|
46
|
+
icon?: LucideIcon;
|
|
47
|
+
/** 按钮视觉风格 */
|
|
48
|
+
variant?: ButtonProps['variant'];
|
|
49
|
+
}
|
|
50
|
+
interface LandingHeroStat {
|
|
51
|
+
/** 指标值 */
|
|
52
|
+
value: ReactNode;
|
|
53
|
+
/** 指标说明 */
|
|
54
|
+
label: ReactNode;
|
|
55
|
+
}
|
|
56
|
+
interface LandingHeroProps extends Omit<HTMLAttributes<HTMLElement>, 'title'> {
|
|
57
|
+
/** 顶部短标签 */
|
|
58
|
+
eyebrow?: ReactNode;
|
|
59
|
+
/** 主标题 */
|
|
60
|
+
title: ReactNode;
|
|
61
|
+
/** 描述文案 */
|
|
62
|
+
description?: ReactNode;
|
|
63
|
+
/** 背景媒体,建议传真实图片或视频容器 */
|
|
64
|
+
media?: ReactNode;
|
|
65
|
+
/** 主行动 */
|
|
66
|
+
primaryAction?: LandingHeroAction;
|
|
67
|
+
/** 次行动 */
|
|
68
|
+
secondaryAction?: LandingHeroAction;
|
|
69
|
+
/** 关键指标 */
|
|
70
|
+
stats?: LandingHeroStat[];
|
|
71
|
+
/** 底部扩展区域 */
|
|
72
|
+
children?: ReactNode;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* 展示页首屏区块
|
|
76
|
+
* @example
|
|
77
|
+
* <LandingHero
|
|
78
|
+
* eyebrow="UG Storage"
|
|
79
|
+
* title="统一管理文件与外链"
|
|
80
|
+
* description="把文件存储、分享链接和业务展示组合成稳定的产品入口。"
|
|
81
|
+
* primaryAction={{ label: '开始使用', href: '/dashboard' }}
|
|
82
|
+
* />
|
|
83
|
+
*/
|
|
84
|
+
declare const LandingHero: react.ForwardRefExoticComponent<LandingHeroProps & react.RefAttributes<HTMLElement>>;
|
|
85
|
+
|
|
86
|
+
export { FeatureGrid, type FeatureGridItem, type FeatureGridProps, LandingHero, type LandingHeroAction, type LandingHeroProps, type LandingHeroStat, FeatureGrid as UGFeatureGrid, type FeatureGridItem as UGFeatureGridItem, type FeatureGridProps as UGFeatureGridProps, LandingHero as UGLandingHero, type LandingHeroAction as UGLandingHeroAction, type LandingHeroProps as UGLandingHeroProps, type LandingHeroStat as UGLandingHeroStat };
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Button,
|
|
3
|
+
cn
|
|
4
|
+
} from "../chunk-RUDEZA5Q.js";
|
|
5
|
+
|
|
6
|
+
// src/blocks/feature-grid.tsx
|
|
7
|
+
import { forwardRef } from "react";
|
|
8
|
+
import { ArrowRight } from "lucide-react";
|
|
9
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
10
|
+
var columnClasses = {
|
|
11
|
+
2: "lg:grid-cols-2",
|
|
12
|
+
3: "lg:grid-cols-3",
|
|
13
|
+
4: "lg:grid-cols-4"
|
|
14
|
+
};
|
|
15
|
+
var FeatureGrid = forwardRef(
|
|
16
|
+
({ title, description, features, columns = 3, className, ...props }, ref) => {
|
|
17
|
+
return /* @__PURE__ */ jsx(
|
|
18
|
+
"section",
|
|
19
|
+
{
|
|
20
|
+
ref,
|
|
21
|
+
className: cn("bg-surface-0 px-4 py-16 sm:px-6 lg:px-8", className),
|
|
22
|
+
...props,
|
|
23
|
+
children: /* @__PURE__ */ jsxs("div", { className: "mx-auto w-full max-w-7xl space-y-8", children: [
|
|
24
|
+
title || description ? /* @__PURE__ */ jsxs("div", { className: "max-w-3xl space-y-3", children: [
|
|
25
|
+
title ? /* @__PURE__ */ jsx("h2", { className: "break-words text-3xl font-bold leading-tight text-text-primary", children: title }) : null,
|
|
26
|
+
description ? /* @__PURE__ */ jsx("p", { className: "text-sm leading-6 text-text-secondary", children: description }) : null
|
|
27
|
+
] }) : null,
|
|
28
|
+
/* @__PURE__ */ jsx("div", { className: cn("grid gap-4 md:grid-cols-2", columnClasses[columns]), children: features.map((feature, index) => {
|
|
29
|
+
const Icon = feature.icon;
|
|
30
|
+
const content = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
31
|
+
/* @__PURE__ */ jsxs("div", { className: "flex min-w-0 items-start justify-between gap-3", children: [
|
|
32
|
+
Icon ? /* @__PURE__ */ jsx("span", { className: "flex h-10 w-10 shrink-0 items-center justify-center rounded-md bg-primary-soft text-primary-soft-fg", children: /* @__PURE__ */ jsx(Icon, { size: 20, "aria-hidden": "true" }) }) : null,
|
|
33
|
+
feature.meta ? /* @__PURE__ */ jsx("span", { className: "shrink-0 text-xs font-medium text-text-tertiary", children: feature.meta }) : null
|
|
34
|
+
] }),
|
|
35
|
+
/* @__PURE__ */ jsxs("div", { className: "min-w-0 space-y-2", children: [
|
|
36
|
+
/* @__PURE__ */ jsx("h3", { className: "break-words text-base font-semibold text-text-primary", children: feature.title }),
|
|
37
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm leading-6 text-text-secondary", children: feature.description })
|
|
38
|
+
] }),
|
|
39
|
+
feature.href ? /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1 text-sm font-medium text-primary", children: [
|
|
40
|
+
"\u67E5\u770B\u8BE6\u60C5",
|
|
41
|
+
/* @__PURE__ */ jsx(ArrowRight, { size: 14, "aria-hidden": "true" })
|
|
42
|
+
] }) : null
|
|
43
|
+
] });
|
|
44
|
+
if (feature.href) {
|
|
45
|
+
return /* @__PURE__ */ jsx(
|
|
46
|
+
"a",
|
|
47
|
+
{
|
|
48
|
+
href: feature.href,
|
|
49
|
+
className: "flex min-w-0 flex-col gap-5 rounded-lg border border-border-base bg-surface-1 p-5 transition-colors hover:border-primary/35 hover:bg-surface-2",
|
|
50
|
+
children: content
|
|
51
|
+
},
|
|
52
|
+
index
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
return /* @__PURE__ */ jsx(
|
|
56
|
+
"article",
|
|
57
|
+
{
|
|
58
|
+
className: "flex min-w-0 flex-col gap-5 rounded-lg border border-border-base bg-surface-1 p-5",
|
|
59
|
+
children: content
|
|
60
|
+
},
|
|
61
|
+
index
|
|
62
|
+
);
|
|
63
|
+
}) })
|
|
64
|
+
] })
|
|
65
|
+
}
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
);
|
|
69
|
+
FeatureGrid.displayName = "FeatureGrid";
|
|
70
|
+
|
|
71
|
+
// src/blocks/landing-hero.tsx
|
|
72
|
+
import { forwardRef as forwardRef2 } from "react";
|
|
73
|
+
import { ArrowRight as ArrowRight2 } from "lucide-react";
|
|
74
|
+
import { Fragment as Fragment2, jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
75
|
+
function HeroAction({ label, href, icon: Icon = ArrowRight2, variant = "default", className, ...props }) {
|
|
76
|
+
if (href) {
|
|
77
|
+
return /* @__PURE__ */ jsxs2(
|
|
78
|
+
"a",
|
|
79
|
+
{
|
|
80
|
+
href,
|
|
81
|
+
className: cn(
|
|
82
|
+
"inline-flex h-10 items-center justify-center gap-2 rounded-md px-4 text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
83
|
+
variant === "outline" ? "border border-border-strong bg-surface-1 text-text-primary hover:bg-surface-2" : "bg-primary text-primary-fg hover:bg-primary-hover",
|
|
84
|
+
className
|
|
85
|
+
),
|
|
86
|
+
children: [
|
|
87
|
+
label,
|
|
88
|
+
/* @__PURE__ */ jsx2(Icon, { size: 16, "aria-hidden": "true" })
|
|
89
|
+
]
|
|
90
|
+
}
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
return /* @__PURE__ */ jsxs2(Button, { variant, className, ...props, children: [
|
|
94
|
+
label,
|
|
95
|
+
/* @__PURE__ */ jsx2(Icon, { size: 16, "aria-hidden": "true" })
|
|
96
|
+
] });
|
|
97
|
+
}
|
|
98
|
+
var LandingHero = forwardRef2(
|
|
99
|
+
({
|
|
100
|
+
eyebrow,
|
|
101
|
+
title,
|
|
102
|
+
description,
|
|
103
|
+
media,
|
|
104
|
+
primaryAction,
|
|
105
|
+
secondaryAction,
|
|
106
|
+
stats,
|
|
107
|
+
children,
|
|
108
|
+
className,
|
|
109
|
+
...props
|
|
110
|
+
}, ref) => {
|
|
111
|
+
return /* @__PURE__ */ jsxs2(
|
|
112
|
+
"section",
|
|
113
|
+
{
|
|
114
|
+
ref,
|
|
115
|
+
className: cn(
|
|
116
|
+
"relative isolate overflow-hidden border-b border-border-base bg-surface-0",
|
|
117
|
+
className
|
|
118
|
+
),
|
|
119
|
+
...props,
|
|
120
|
+
children: [
|
|
121
|
+
media ? /* @__PURE__ */ jsxs2(Fragment2, { children: [
|
|
122
|
+
/* @__PURE__ */ jsx2("div", { className: "absolute inset-0 -z-20 overflow-hidden", children: media }),
|
|
123
|
+
/* @__PURE__ */ jsx2("div", { className: "absolute inset-0 -z-10 bg-surface-0/78", "aria-hidden": "true" })
|
|
124
|
+
] }) : null,
|
|
125
|
+
/* @__PURE__ */ jsx2("div", { className: "mx-auto flex min-h-[520px] w-full max-w-7xl flex-col justify-center px-4 py-20 sm:px-6 lg:px-8", children: /* @__PURE__ */ jsxs2("div", { className: "max-w-4xl space-y-7", children: [
|
|
126
|
+
eyebrow ? /* @__PURE__ */ jsx2("div", { className: "inline-flex rounded-md border border-primary/25 bg-primary-soft px-3 py-1 text-xs font-semibold text-primary-soft-fg", children: eyebrow }) : null,
|
|
127
|
+
/* @__PURE__ */ jsxs2("div", { className: "space-y-4", children: [
|
|
128
|
+
/* @__PURE__ */ jsx2("h1", { className: "max-w-4xl break-words text-4xl font-bold leading-tight text-text-primary sm:text-5xl lg:text-6xl", children: title }),
|
|
129
|
+
description ? /* @__PURE__ */ jsx2("p", { className: "max-w-2xl text-base leading-7 text-text-secondary sm:text-lg", children: description }) : null
|
|
130
|
+
] }),
|
|
131
|
+
primaryAction || secondaryAction ? /* @__PURE__ */ jsxs2("div", { className: "flex flex-wrap items-center gap-3", children: [
|
|
132
|
+
primaryAction ? /* @__PURE__ */ jsx2(HeroAction, { ...primaryAction }) : null,
|
|
133
|
+
secondaryAction ? /* @__PURE__ */ jsx2(HeroAction, { variant: "outline", ...secondaryAction }) : null
|
|
134
|
+
] }) : null,
|
|
135
|
+
stats?.length ? /* @__PURE__ */ jsx2("dl", { className: "grid max-w-2xl gap-4 sm:grid-cols-3", children: stats.map((stat, index) => /* @__PURE__ */ jsxs2("div", { className: "border-l border-border-base pl-4", children: [
|
|
136
|
+
/* @__PURE__ */ jsx2("dt", { className: "text-xs font-medium text-text-tertiary", children: stat.label }),
|
|
137
|
+
/* @__PURE__ */ jsx2("dd", { className: "mt-1 text-2xl font-bold text-text-primary", children: stat.value })
|
|
138
|
+
] }, index)) }) : null,
|
|
139
|
+
children ? /* @__PURE__ */ jsx2("div", { className: "min-w-0", children }) : null
|
|
140
|
+
] }) })
|
|
141
|
+
]
|
|
142
|
+
}
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
);
|
|
146
|
+
LandingHero.displayName = "LandingHero";
|
|
147
|
+
export {
|
|
148
|
+
FeatureGrid,
|
|
149
|
+
LandingHero,
|
|
150
|
+
FeatureGrid as UGFeatureGrid,
|
|
151
|
+
LandingHero as UGLandingHero
|
|
152
|
+
};
|
|
153
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/blocks/feature-grid.tsx","../../src/blocks/landing-hero.tsx"],"sourcesContent":["/**\n * @description: FeatureGrid 特性网格区块 — 用于产品能力、服务优势和功能模块展示\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-05-30\n */\nimport { forwardRef, type HTMLAttributes, type ReactNode } from 'react'\nimport { ArrowRight, type LucideIcon } from 'lucide-react'\nimport { cn } from '../internal/cn'\n\nexport interface FeatureGridItem {\n /** 标题 */\n title: ReactNode\n /** 描述 */\n description: ReactNode\n /** 图标 */\n icon?: LucideIcon\n /** 角标或状态 */\n meta?: ReactNode\n /** 链接地址 */\n href?: string\n}\n\nexport interface FeatureGridProps extends Omit<HTMLAttributes<HTMLElement>, 'title'> {\n /** 区块标题 */\n title?: ReactNode\n /** 区块说明 */\n description?: ReactNode\n /** 特性列表 */\n features: FeatureGridItem[]\n /** 列数,默认三列 */\n columns?: 2 | 3 | 4\n}\n\nconst columnClasses: Record<NonNullable<FeatureGridProps['columns']>, string> = {\n 2: 'lg:grid-cols-2',\n 3: 'lg:grid-cols-3',\n 4: 'lg:grid-cols-4',\n}\n\n/**\n * 特性网格区块\n * @example\n * <FeatureGrid\n * title=\"平台能力\"\n * features={[{ title: '认证中心', description: '统一登录与授权。' }]}\n * />\n */\nconst FeatureGrid = forwardRef<HTMLElement, FeatureGridProps>(\n ({ title, description, features, columns = 3, className, ...props }, ref) => {\n return (\n <section\n ref={ref}\n className={cn('bg-surface-0 px-4 py-16 sm:px-6 lg:px-8', className)}\n {...props}\n >\n <div className=\"mx-auto w-full max-w-7xl space-y-8\">\n {(title || description) ? (\n <div className=\"max-w-3xl space-y-3\">\n {title ? (\n <h2 className=\"break-words text-3xl font-bold leading-tight text-text-primary\">{title}</h2>\n ) : null}\n {description ? (\n <p className=\"text-sm leading-6 text-text-secondary\">{description}</p>\n ) : null}\n </div>\n ) : null}\n\n <div className={cn('grid gap-4 md:grid-cols-2', columnClasses[columns])}>\n {features.map((feature, index) => {\n const Icon = feature.icon\n const content = (\n <>\n <div className=\"flex min-w-0 items-start justify-between gap-3\">\n {Icon ? (\n <span className=\"flex h-10 w-10 shrink-0 items-center justify-center rounded-md bg-primary-soft text-primary-soft-fg\">\n <Icon size={20} aria-hidden=\"true\" />\n </span>\n ) : null}\n {feature.meta ? (\n <span className=\"shrink-0 text-xs font-medium text-text-tertiary\">{feature.meta}</span>\n ) : null}\n </div>\n <div className=\"min-w-0 space-y-2\">\n <h3 className=\"break-words text-base font-semibold text-text-primary\">{feature.title}</h3>\n <p className=\"text-sm leading-6 text-text-secondary\">{feature.description}</p>\n </div>\n {feature.href ? (\n <span className=\"inline-flex items-center gap-1 text-sm font-medium text-primary\">\n 查看详情\n <ArrowRight size={14} aria-hidden=\"true\" />\n </span>\n ) : null}\n </>\n )\n\n if (feature.href) {\n return (\n <a\n key={index}\n href={feature.href}\n className=\"flex min-w-0 flex-col gap-5 rounded-lg border border-border-base bg-surface-1 p-5 transition-colors hover:border-primary/35 hover:bg-surface-2\"\n >\n {content}\n </a>\n )\n }\n\n return (\n <article\n key={index}\n className=\"flex min-w-0 flex-col gap-5 rounded-lg border border-border-base bg-surface-1 p-5\"\n >\n {content}\n </article>\n )\n })}\n </div>\n </div>\n </section>\n )\n },\n)\n\nFeatureGrid.displayName = 'FeatureGrid'\n\nexport { FeatureGrid }\n","/**\n * @description: LandingHero 展示页首屏区块 — 支持背景媒体、行动按钮和关键指标\n * @author: UG - 一个斗码大陆苦逼的三段码之气的少年,并没有神秘戒指中码老的帮助,但总有一天,我会成为斗码大陆中码帝一样的存在。三十年河东,三十年河西,莫欺少年穷。\n * @date: 2026-05-30\n */\nimport { forwardRef, type ButtonHTMLAttributes, type HTMLAttributes, type ReactNode } from 'react'\nimport { ArrowRight, type LucideIcon } from 'lucide-react'\nimport { Button, type ButtonProps } from '../components/button'\nimport { cn } from '../internal/cn'\n\nexport interface LandingHeroAction extends ButtonHTMLAttributes<HTMLButtonElement> {\n /** 按钮文案 */\n label: ReactNode\n /** href 存在时渲染为链接 */\n href?: string\n /** 按钮图标 */\n icon?: LucideIcon\n /** 按钮视觉风格 */\n variant?: ButtonProps['variant']\n}\n\nexport interface LandingHeroStat {\n /** 指标值 */\n value: ReactNode\n /** 指标说明 */\n label: ReactNode\n}\n\nexport interface LandingHeroProps extends Omit<HTMLAttributes<HTMLElement>, 'title'> {\n /** 顶部短标签 */\n eyebrow?: ReactNode\n /** 主标题 */\n title: ReactNode\n /** 描述文案 */\n description?: ReactNode\n /** 背景媒体,建议传真实图片或视频容器 */\n media?: ReactNode\n /** 主行动 */\n primaryAction?: LandingHeroAction\n /** 次行动 */\n secondaryAction?: LandingHeroAction\n /** 关键指标 */\n stats?: LandingHeroStat[]\n /** 底部扩展区域 */\n children?: ReactNode\n}\n\nfunction HeroAction({ label, href, icon: Icon = ArrowRight, variant = 'default', className, ...props }: LandingHeroAction) {\n if (href) {\n return (\n <a\n href={href}\n className={cn(\n 'inline-flex h-10 items-center justify-center gap-2 rounded-md px-4 text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n variant === 'outline'\n ? 'border border-border-strong bg-surface-1 text-text-primary hover:bg-surface-2'\n : 'bg-primary text-primary-fg hover:bg-primary-hover',\n className,\n )}\n >\n {label}\n <Icon size={16} aria-hidden=\"true\" />\n </a>\n )\n }\n\n return (\n <Button variant={variant} className={className} {...props}>\n {label}\n <Icon size={16} aria-hidden=\"true\" />\n </Button>\n )\n}\n\n/**\n * 展示页首屏区块\n * @example\n * <LandingHero\n * eyebrow=\"UG Storage\"\n * title=\"统一管理文件与外链\"\n * description=\"把文件存储、分享链接和业务展示组合成稳定的产品入口。\"\n * primaryAction={{ label: '开始使用', href: '/dashboard' }}\n * />\n */\nconst LandingHero = forwardRef<HTMLElement, LandingHeroProps>(\n (\n {\n eyebrow,\n title,\n description,\n media,\n primaryAction,\n secondaryAction,\n stats,\n children,\n className,\n ...props\n },\n ref,\n ) => {\n return (\n <section\n ref={ref}\n className={cn(\n 'relative isolate overflow-hidden border-b border-border-base bg-surface-0',\n className,\n )}\n {...props}\n >\n {media ? (\n <>\n <div className=\"absolute inset-0 -z-20 overflow-hidden\">{media}</div>\n <div className=\"absolute inset-0 -z-10 bg-surface-0/78\" aria-hidden=\"true\" />\n </>\n ) : null}\n\n <div className=\"mx-auto flex min-h-[520px] w-full max-w-7xl flex-col justify-center px-4 py-20 sm:px-6 lg:px-8\">\n <div className=\"max-w-4xl space-y-7\">\n {eyebrow ? (\n <div className=\"inline-flex rounded-md border border-primary/25 bg-primary-soft px-3 py-1 text-xs font-semibold text-primary-soft-fg\">\n {eyebrow}\n </div>\n ) : null}\n\n <div className=\"space-y-4\">\n <h1 className=\"max-w-4xl break-words text-4xl font-bold leading-tight text-text-primary sm:text-5xl lg:text-6xl\">\n {title}\n </h1>\n {description ? (\n <p className=\"max-w-2xl text-base leading-7 text-text-secondary sm:text-lg\">\n {description}\n </p>\n ) : null}\n </div>\n\n {(primaryAction || secondaryAction) ? (\n <div className=\"flex flex-wrap items-center gap-3\">\n {primaryAction ? <HeroAction {...primaryAction} /> : null}\n {secondaryAction ? <HeroAction variant=\"outline\" {...secondaryAction} /> : null}\n </div>\n ) : null}\n\n {stats?.length ? (\n <dl className=\"grid max-w-2xl gap-4 sm:grid-cols-3\">\n {stats.map((stat, index) => (\n <div key={index} className=\"border-l border-border-base pl-4\">\n <dt className=\"text-xs font-medium text-text-tertiary\">{stat.label}</dt>\n <dd className=\"mt-1 text-2xl font-bold text-text-primary\">{stat.value}</dd>\n </div>\n ))}\n </dl>\n ) : null}\n\n {children ? <div className=\"min-w-0\">{children}</div> : null}\n </div>\n </div>\n </section>\n )\n },\n)\n\nLandingHero.displayName = 'LandingHero'\n\nexport { LandingHero }\n"],"mappings":"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","names":["forwardRef","ArrowRight","Fragment","jsx","jsxs","ArrowRight","forwardRef"]}
|