@lobehub/ui 5.48.2 → 5.49.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.
Files changed (203) hide show
  1. package/es/Highlighter/FullFeatured.mjs +1 -1
  2. package/es/Highlighter/FullFeatured.mjs.map +1 -1
  3. package/es/Highlighter/LangSelect.mjs +1 -1
  4. package/es/Highlighter/LangSelect.mjs.map +1 -1
  5. package/es/Highlighter/style.mjs +14 -11
  6. package/es/Highlighter/style.mjs.map +1 -1
  7. package/es/Mermaid/FullFeatured.mjs +1 -1
  8. package/es/Mermaid/FullFeatured.mjs.map +1 -1
  9. package/es/ThemeProvider/ThemeProvider.mjs +2 -2
  10. package/es/ThemeProvider/ThemeProvider.mjs.map +1 -1
  11. package/es/awesome/AgentSkillCard/AgentSkillCard.d.mts +6 -0
  12. package/es/awesome/AgentSkillCard/AgentSkillCard.mjs +83 -0
  13. package/es/awesome/AgentSkillCard/AgentSkillCard.mjs.map +1 -0
  14. package/es/awesome/AgentSkillCard/agents.d.mts +6 -0
  15. package/es/awesome/AgentSkillCard/agents.mjs +40 -0
  16. package/es/awesome/AgentSkillCard/agents.mjs.map +1 -0
  17. package/es/awesome/AgentSkillCard/index.d.mts +4 -0
  18. package/es/awesome/AgentSkillCard/style.mjs +85 -0
  19. package/es/awesome/AgentSkillCard/style.mjs.map +1 -0
  20. package/es/awesome/AgentSkillCard/type.d.mts +41 -0
  21. package/es/awesome/BentoGrid/BentoCard.d.mts +6 -0
  22. package/es/awesome/BentoGrid/BentoCard.mjs +39 -0
  23. package/es/awesome/BentoGrid/BentoCard.mjs.map +1 -0
  24. package/es/awesome/BentoGrid/BentoGrid.d.mts +6 -0
  25. package/es/awesome/BentoGrid/BentoGrid.mjs +20 -0
  26. package/es/awesome/BentoGrid/BentoGrid.mjs.map +1 -0
  27. package/es/awesome/BentoGrid/index.d.mts +4 -0
  28. package/es/awesome/BentoGrid/style.mjs +102 -0
  29. package/es/awesome/BentoGrid/style.mjs.map +1 -0
  30. package/es/awesome/BentoGrid/type.d.mts +40 -0
  31. package/es/awesome/CodeShowcase/CodeShowcase.d.mts +6 -0
  32. package/es/awesome/CodeShowcase/CodeShowcase.mjs +51 -0
  33. package/es/awesome/CodeShowcase/CodeShowcase.mjs.map +1 -0
  34. package/es/awesome/CodeShowcase/index.d.mts +3 -0
  35. package/es/awesome/CodeShowcase/style.mjs +50 -0
  36. package/es/awesome/CodeShowcase/style.mjs.map +1 -0
  37. package/es/awesome/CodeShowcase/type.d.mts +27 -0
  38. package/es/awesome/FeatureGrid/FeatureGrid.d.mts +6 -0
  39. package/es/awesome/FeatureGrid/FeatureGrid.mjs +48 -0
  40. package/es/awesome/FeatureGrid/FeatureGrid.mjs.map +1 -0
  41. package/es/awesome/FeatureGrid/index.d.mts +3 -0
  42. package/es/awesome/FeatureGrid/style.mjs +75 -0
  43. package/es/awesome/FeatureGrid/style.mjs.map +1 -0
  44. package/es/awesome/FeatureGrid/type.d.mts +25 -0
  45. package/es/awesome/FluidGradient/FluidGradient.d.mts +6 -0
  46. package/es/awesome/FluidGradient/FluidGradient.mjs +293 -0
  47. package/es/awesome/FluidGradient/FluidGradient.mjs.map +1 -0
  48. package/es/awesome/FluidGradient/index.d.mts +3 -0
  49. package/es/awesome/FluidGradient/style.mjs +52 -0
  50. package/es/awesome/FluidGradient/style.mjs.map +1 -0
  51. package/es/awesome/FluidGradient/type.d.mts +22 -0
  52. package/es/awesome/InstallBanner/InstallBanner.d.mts +6 -0
  53. package/es/awesome/InstallBanner/InstallBanner.mjs +35 -0
  54. package/es/awesome/InstallBanner/InstallBanner.mjs.map +1 -0
  55. package/es/awesome/InstallBanner/index.d.mts +3 -0
  56. package/es/awesome/InstallBanner/style.mjs +46 -0
  57. package/es/awesome/InstallBanner/style.mjs.map +1 -0
  58. package/es/awesome/InstallBanner/type.d.mts +18 -0
  59. package/es/awesome/LandingHero/LandingHero.d.mts +6 -0
  60. package/es/awesome/LandingHero/LandingHero.mjs +55 -0
  61. package/es/awesome/LandingHero/LandingHero.mjs.map +1 -0
  62. package/es/awesome/LandingHero/index.d.mts +3 -0
  63. package/es/awesome/LandingHero/style.mjs +155 -0
  64. package/es/awesome/LandingHero/style.mjs.map +1 -0
  65. package/es/awesome/LandingHero/type.d.mts +29 -0
  66. package/es/awesome/LandingSection/LandingSection.d.mts +6 -0
  67. package/es/awesome/LandingSection/LandingSection.mjs +61 -0
  68. package/es/awesome/LandingSection/LandingSection.mjs.map +1 -0
  69. package/es/awesome/LandingSection/index.d.mts +3 -0
  70. package/es/awesome/LandingSection/style.mjs +88 -0
  71. package/es/awesome/LandingSection/style.mjs.map +1 -0
  72. package/es/awesome/LandingSection/type.d.mts +40 -0
  73. package/es/awesome/LogoMarquee/LogoMarquee.d.mts +6 -0
  74. package/es/awesome/LogoMarquee/LogoMarquee.mjs +52 -0
  75. package/es/awesome/LogoMarquee/LogoMarquee.mjs.map +1 -0
  76. package/es/awesome/LogoMarquee/index.d.mts +3 -0
  77. package/es/awesome/LogoMarquee/style.mjs +70 -0
  78. package/es/awesome/LogoMarquee/style.mjs.map +1 -0
  79. package/es/awesome/LogoMarquee/type.d.mts +40 -0
  80. package/es/awesome/index.d.mts +33 -1
  81. package/es/awesome/index.mjs +13 -1
  82. package/es/awesome/landingActions.d.mts +20 -0
  83. package/es/awesome/landingActions.mjs +123 -0
  84. package/es/awesome/landingActions.mjs.map +1 -0
  85. package/es/awesome/landingIcon.mjs +13 -0
  86. package/es/awesome/landingIcon.mjs.map +1 -0
  87. package/es/awesome/landingLink.d.mts +12 -0
  88. package/es/awesome/landingLink.mjs +23 -0
  89. package/es/awesome/landingLink.mjs.map +1 -0
  90. package/es/awesome/landingTokens.d.mts +10 -0
  91. package/es/awesome/landingTokens.mjs +19 -0
  92. package/es/awesome/landingTokens.mjs.map +1 -0
  93. package/es/base-ui/Input/style.d.mts +1 -1
  94. package/es/base-ui/Segmented/atoms.mjs +1 -0
  95. package/es/base-ui/Segmented/atoms.mjs.map +1 -1
  96. package/es/base-ui/Segmented/style.mjs +127 -125
  97. package/es/base-ui/Segmented/style.mjs.map +1 -1
  98. package/es/base-ui/index.mjs +4 -4
  99. package/es/dashboard/AuthLayout/AuthLayout.d.mts +9 -0
  100. package/es/dashboard/AuthLayout/AuthLayout.mjs +54 -0
  101. package/es/dashboard/AuthLayout/AuthLayout.mjs.map +1 -0
  102. package/es/dashboard/AuthLayout/index.d.mts +3 -0
  103. package/es/dashboard/AuthLayout/style.mjs +120 -0
  104. package/es/dashboard/AuthLayout/style.mjs.map +1 -0
  105. package/es/dashboard/AuthLayout/type.d.mts +16 -0
  106. package/es/dashboard/Breadcrumb/Breadcrumb.d.mts +9 -0
  107. package/es/dashboard/Breadcrumb/Breadcrumb.mjs +55 -0
  108. package/es/dashboard/Breadcrumb/Breadcrumb.mjs.map +1 -0
  109. package/es/dashboard/Breadcrumb/index.d.mts +3 -0
  110. package/es/dashboard/Breadcrumb/style.mjs +66 -0
  111. package/es/dashboard/Breadcrumb/style.mjs.map +1 -0
  112. package/es/dashboard/Breadcrumb/type.d.mts +25 -0
  113. package/es/dashboard/ConsoleNav/ConsoleNav.d.mts +9 -0
  114. package/es/dashboard/ConsoleNav/ConsoleNav.mjs +275 -0
  115. package/es/dashboard/ConsoleNav/ConsoleNav.mjs.map +1 -0
  116. package/es/dashboard/ConsoleNav/active.d.mts +7 -0
  117. package/es/dashboard/ConsoleNav/active.mjs +29 -0
  118. package/es/dashboard/ConsoleNav/active.mjs.map +1 -0
  119. package/es/dashboard/ConsoleNav/index.d.mts +4 -0
  120. package/es/dashboard/ConsoleNav/style.mjs +283 -0
  121. package/es/dashboard/ConsoleNav/style.mjs.map +1 -0
  122. package/es/dashboard/ConsoleNav/type.d.mts +71 -0
  123. package/es/dashboard/ConsoleShell/ConsoleBrand.d.mts +9 -0
  124. package/es/dashboard/ConsoleShell/ConsoleBrand.mjs +37 -0
  125. package/es/dashboard/ConsoleShell/ConsoleBrand.mjs.map +1 -0
  126. package/es/dashboard/ConsoleShell/ConsoleShell.d.mts +9 -0
  127. package/es/dashboard/ConsoleShell/ConsoleShell.mjs +149 -0
  128. package/es/dashboard/ConsoleShell/ConsoleShell.mjs.map +1 -0
  129. package/es/dashboard/ConsoleShell/context.d.mts +6 -0
  130. package/es/dashboard/ConsoleShell/context.mjs +16 -0
  131. package/es/dashboard/ConsoleShell/context.mjs.map +1 -0
  132. package/es/dashboard/ConsoleShell/index.d.mts +5 -0
  133. package/es/dashboard/ConsoleShell/style.mjs +209 -0
  134. package/es/dashboard/ConsoleShell/style.mjs.map +1 -0
  135. package/es/dashboard/ConsoleShell/type.d.mts +67 -0
  136. package/es/dashboard/FilterSidebar/FilterSidebar.d.mts +17 -0
  137. package/es/dashboard/FilterSidebar/FilterSidebar.mjs +151 -0
  138. package/es/dashboard/FilterSidebar/FilterSidebar.mjs.map +1 -0
  139. package/es/dashboard/FilterSidebar/context.d.mts +7 -0
  140. package/es/dashboard/FilterSidebar/context.mjs +19 -0
  141. package/es/dashboard/FilterSidebar/context.mjs.map +1 -0
  142. package/es/dashboard/FilterSidebar/index.d.mts +4 -0
  143. package/es/dashboard/FilterSidebar/style.mjs +155 -0
  144. package/es/dashboard/FilterSidebar/style.mjs.map +1 -0
  145. package/es/dashboard/FilterSidebar/type.d.mts +44 -0
  146. package/es/dashboard/FilterSidebar/width.mjs +18 -0
  147. package/es/dashboard/FilterSidebar/width.mjs.map +1 -0
  148. package/es/dashboard/PageHeader/PageHeader.d.mts +9 -0
  149. package/es/dashboard/PageHeader/PageHeader.mjs +37 -0
  150. package/es/dashboard/PageHeader/PageHeader.mjs.map +1 -0
  151. package/es/dashboard/PageHeader/index.d.mts +3 -0
  152. package/es/dashboard/PageHeader/style.mjs +47 -0
  153. package/es/dashboard/PageHeader/style.mjs.map +1 -0
  154. package/es/dashboard/PageHeader/type.d.mts +14 -0
  155. package/es/dashboard/PageSkeleton/PageSkeleton.d.mts +25 -0
  156. package/es/dashboard/PageSkeleton/PageSkeleton.mjs +136 -0
  157. package/es/dashboard/PageSkeleton/PageSkeleton.mjs.map +1 -0
  158. package/es/dashboard/PageSkeleton/style.mjs +122 -0
  159. package/es/dashboard/PageSkeleton/style.mjs.map +1 -0
  160. package/es/dashboard/PageSkeleton/type.d.mts +22 -0
  161. package/es/dashboard/PageTabs/PageTabs.d.mts +9 -0
  162. package/es/dashboard/PageTabs/PageTabs.mjs +37 -0
  163. package/es/dashboard/PageTabs/PageTabs.mjs.map +1 -0
  164. package/es/dashboard/PageTabs/index.d.mts +3 -0
  165. package/es/dashboard/PageTabs/style.mjs +57 -0
  166. package/es/dashboard/PageTabs/style.mjs.map +1 -0
  167. package/es/dashboard/PageTabs/type.d.mts +17 -0
  168. package/es/dashboard/RouteProgress/RouteProgress.d.mts +9 -0
  169. package/es/dashboard/RouteProgress/RouteProgress.mjs +44 -0
  170. package/es/dashboard/RouteProgress/RouteProgress.mjs.map +1 -0
  171. package/es/dashboard/RouteProgress/style.mjs +19 -0
  172. package/es/dashboard/RouteProgress/style.mjs.map +1 -0
  173. package/es/dashboard/RouteProgress/type.d.mts +8 -0
  174. package/es/dashboard/StatCard/StatCard.d.mts +9 -0
  175. package/es/dashboard/StatCard/StatCard.mjs +84 -0
  176. package/es/dashboard/StatCard/StatCard.mjs.map +1 -0
  177. package/es/dashboard/StatCard/index.d.mts +3 -0
  178. package/es/dashboard/StatCard/style.mjs +135 -0
  179. package/es/dashboard/StatCard/style.mjs.map +1 -0
  180. package/es/dashboard/StatCard/type.d.mts +26 -0
  181. package/es/dashboard/Surface/Surface.d.mts +13 -0
  182. package/es/dashboard/Surface/Surface.mjs +20 -0
  183. package/es/dashboard/Surface/Surface.mjs.map +1 -0
  184. package/es/dashboard/Surface/index.d.mts +4 -0
  185. package/es/dashboard/Surface/style.d.mts +14 -0
  186. package/es/dashboard/Surface/style.mjs +22 -0
  187. package/es/dashboard/Surface/style.mjs.map +1 -0
  188. package/es/dashboard/Surface/type.d.mts +8 -0
  189. package/es/dashboard/hooks.mjs +49 -0
  190. package/es/dashboard/hooks.mjs.map +1 -0
  191. package/es/dashboard/index.d.mts +37 -0
  192. package/es/dashboard/index.d.ts +1 -0
  193. package/es/dashboard/index.js +1 -0
  194. package/es/dashboard/index.mjs +17 -0
  195. package/es/static-css/registry.mjs +2 -2
  196. package/es/static-css/registry.mjs.map +1 -1
  197. package/es/storybook/StoryBook/index.mjs +4 -0
  198. package/es/storybook/StoryBook/index.mjs.map +1 -1
  199. package/es/storybook/StoryBook/style.mjs +7 -2
  200. package/es/storybook/StoryBook/style.mjs.map +1 -1
  201. package/es/styles/theme/token/base.mjs +2 -2
  202. package/es/styles/theme/token/base.mjs.map +1 -1
  203. package/package.json +6 -2
@@ -0,0 +1,293 @@
1
+ "use client";
2
+ import { LANDING_PALETTE_DARK, LANDING_PALETTE_LIGHT } from "../landingTokens.mjs";
3
+ import { styles } from "./style.mjs";
4
+ import { memo, useEffect, useRef, useState } from "react";
5
+ import { jsx } from "react/jsx-runtime";
6
+ import { cx, useThemeMode } from "antd-style";
7
+ //#region src/awesome/FluidGradient/FluidGradient.tsx
8
+ const VERTEX_SHADER = `#version 300 es
9
+ in vec2 aPos;
10
+ void main() {
11
+ gl_Position = vec4(aPos, 0.0, 1.0);
12
+ }`;
13
+ const FRAGMENT_SHADER = `#version 300 es
14
+ precision highp float;
15
+
16
+ uniform vec2 uRes;
17
+ uniform float uTime;
18
+ uniform vec3 uStopA;
19
+ uniform vec3 uStopB;
20
+ uniform vec3 uStopC;
21
+ uniform float uIntensity;
22
+
23
+ out vec4 fragColor;
24
+
25
+ float hash(vec2 p) {
26
+ p = fract(p * vec2(234.34, 435.345));
27
+ p += dot(p, p + 34.23);
28
+ return fract(p.x * p.y);
29
+ }
30
+
31
+ float noise(vec2 p) {
32
+ vec2 i = floor(p);
33
+ vec2 f = fract(p);
34
+ vec2 u = f * f * (3.0 - 2.0 * f);
35
+ float a = hash(i);
36
+ float b = hash(i + vec2(1.0, 0.0));
37
+ float c = hash(i + vec2(0.0, 1.0));
38
+ float d = hash(i + vec2(1.0, 1.0));
39
+ return mix(mix(a, b, u.x), mix(c, d, u.x), u.y);
40
+ }
41
+
42
+ float fbm(vec2 p) {
43
+ float value = 0.0;
44
+ float amplitude = 0.5;
45
+ for (int i = 0; i < 4; i++) {
46
+ value += amplitude * noise(p);
47
+ p = mat2(0.8, 0.6, -0.6, 0.8) * p * 2.0 + vec2(3.7, 1.3);
48
+ amplitude *= 0.5;
49
+ }
50
+ return value;
51
+ }
52
+
53
+ void main() {
54
+ vec2 uv = gl_FragCoord.xy / uRes;
55
+ vec2 p = vec2(uv.x * uRes.x / uRes.y, uv.y);
56
+
57
+ float t = uTime * 0.05;
58
+
59
+ vec2 q = vec2(fbm(p * 1.4 + t * 0.35), fbm(p * 1.4 - t * 0.28 + 5.2));
60
+ vec2 r = vec2(
61
+ fbm(p * 1.4 + 2.6 * q + vec2(1.7, 9.2) + t * 0.18),
62
+ fbm(p * 1.4 + 2.6 * q + vec2(8.3, 2.8) - t * 0.12)
63
+ );
64
+ float field = fbm(p * 1.4 + 2.6 * r);
65
+
66
+ vec3 color = mix(uStopA, uStopB, clamp(field * field * 2.4, 0.0, 1.0));
67
+ color = mix(color, uStopC, clamp(dot(q, vec2(0.7)) - 0.25, 0.0, 1.0));
68
+
69
+ float fade = smoothstep(0.02, 0.85, uv.y);
70
+ float alpha = fade * fade * uIntensity * smoothstep(0.14, 0.66, field);
71
+
72
+ fragColor = vec4(color * alpha, alpha);
73
+ }`;
74
+ const hexToRgb = (hex) => {
75
+ const value = hex.replace("#", "");
76
+ const full = value.length === 3 ? value.split("").map((char) => char + char).join("") : value.slice(0, 6);
77
+ const channel = (offset) => Number.parseInt(full.slice(offset, offset + 2), 16) / 255;
78
+ return [
79
+ channel(0),
80
+ channel(2),
81
+ channel(4)
82
+ ];
83
+ };
84
+ const FluidGradient = memo(({ className, colors, intensity = .45, speed = 1, style, ...rest }) => {
85
+ const { isDarkMode } = useThemeMode();
86
+ const canvasRef = useRef(null);
87
+ const [ready, setReady] = useState(false);
88
+ const [canvasEpoch, setCanvasEpoch] = useState(0);
89
+ const palette = colors ?? (isDarkMode ? LANDING_PALETTE_DARK : LANDING_PALETTE_LIGHT);
90
+ const paletteRef = useRef({
91
+ colors: palette,
92
+ intensity
93
+ });
94
+ const speedRef = useRef(speed);
95
+ const repaintRef = useRef(void 0);
96
+ useEffect(() => {
97
+ paletteRef.current = {
98
+ colors: palette,
99
+ intensity
100
+ };
101
+ speedRef.current = speed;
102
+ repaintRef.current?.();
103
+ }, [
104
+ palette[0],
105
+ palette[1],
106
+ palette[2],
107
+ intensity,
108
+ speed
109
+ ]);
110
+ useEffect(() => {
111
+ const canvas = canvasRef.current;
112
+ if (!canvas) return void 0;
113
+ const reducedMotion = window.matchMedia("(prefers-reduced-motion: reduce)");
114
+ let frameId = 0;
115
+ let inView = true;
116
+ let readySent = false;
117
+ let drawFrame = null;
118
+ let refreshPalette = null;
119
+ let sizeAndDraw = null;
120
+ let destroyResources = null;
121
+ const buildResources = () => {
122
+ const gl = canvas.getContext("webgl2", {
123
+ alpha: true,
124
+ antialias: false,
125
+ depth: false,
126
+ stencil: false,
127
+ powerPreference: "low-power"
128
+ });
129
+ if (!gl) return false;
130
+ const compileShader = (type, source) => {
131
+ const shader = gl.createShader(type);
132
+ if (!shader) return null;
133
+ gl.shaderSource(shader, source);
134
+ gl.compileShader(shader);
135
+ if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
136
+ gl.deleteShader(shader);
137
+ return null;
138
+ }
139
+ return shader;
140
+ };
141
+ const vertexShader = compileShader(gl.VERTEX_SHADER, VERTEX_SHADER);
142
+ const fragmentShader = compileShader(gl.FRAGMENT_SHADER, FRAGMENT_SHADER);
143
+ if (!vertexShader || !fragmentShader) return false;
144
+ const program = gl.createProgram();
145
+ if (!program) return false;
146
+ gl.attachShader(program, vertexShader);
147
+ gl.attachShader(program, fragmentShader);
148
+ gl.linkProgram(program);
149
+ gl.deleteShader(vertexShader);
150
+ gl.deleteShader(fragmentShader);
151
+ if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
152
+ gl.deleteProgram(program);
153
+ return false;
154
+ }
155
+ gl.useProgram(program);
156
+ const buffer = gl.createBuffer();
157
+ gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
158
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
159
+ -1,
160
+ -1,
161
+ 3,
162
+ -1,
163
+ -1,
164
+ 3
165
+ ]), gl.STATIC_DRAW);
166
+ const position = gl.getAttribLocation(program, "aPos");
167
+ gl.enableVertexAttribArray(position);
168
+ gl.vertexAttribPointer(position, 2, gl.FLOAT, false, 0, 0);
169
+ const timeLocation = gl.getUniformLocation(program, "uTime");
170
+ const stopLocations = [
171
+ "uStopA",
172
+ "uStopB",
173
+ "uStopC"
174
+ ].map((name) => gl.getUniformLocation(program, name));
175
+ const intensityLocation = gl.getUniformLocation(program, "uIntensity");
176
+ refreshPalette = () => {
177
+ const { colors: stops, intensity: peak } = paletteRef.current;
178
+ stops.map(hexToRgb).forEach((stop, index) => {
179
+ const location = stopLocations[index];
180
+ if (location) gl.uniform3f(location, stop[0], stop[1], stop[2]);
181
+ });
182
+ gl.uniform1f(intensityLocation, peak);
183
+ };
184
+ refreshPalette();
185
+ drawFrame = (seconds) => {
186
+ gl.uniform1f(timeLocation, seconds * speedRef.current);
187
+ gl.drawArrays(gl.TRIANGLES, 0, 3);
188
+ if (!readySent) {
189
+ readySent = true;
190
+ setReady(true);
191
+ }
192
+ };
193
+ sizeAndDraw = () => {
194
+ const dpr = Math.min(window.devicePixelRatio || 1, 1.5);
195
+ const width = Math.max(1, Math.round(canvas.clientWidth * dpr));
196
+ const height = Math.max(1, Math.round(canvas.clientHeight * dpr));
197
+ if (canvas.width !== width || canvas.height !== height) {
198
+ canvas.width = width;
199
+ canvas.height = height;
200
+ gl.viewport(0, 0, width, height);
201
+ }
202
+ return canvas.clientWidth > 0 && drawFrame !== null;
203
+ };
204
+ destroyResources = (lose) => {
205
+ gl.deleteBuffer(buffer);
206
+ gl.deleteProgram(program);
207
+ drawFrame = null;
208
+ refreshPalette = null;
209
+ sizeAndDraw = null;
210
+ destroyResources = null;
211
+ if (lose) gl.getExtension("WEBGL_lose_context")?.loseContext();
212
+ };
213
+ return true;
214
+ };
215
+ if (!buildResources()) return void 0;
216
+ const renderOnce = () => {
217
+ if (!sizeAndDraw?.()) return;
218
+ drawFrame?.(performance.now() / 1e3);
219
+ };
220
+ const syncLoop = (milliseconds) => {
221
+ frameId = requestAnimationFrame(syncLoop);
222
+ if (sizeAndDraw?.()) drawFrame?.(milliseconds / 1e3);
223
+ };
224
+ const updateLoop = () => {
225
+ if (inView && !document.hidden && !reducedMotion.matches && drawFrame !== null) {
226
+ if (frameId === 0) frameId = requestAnimationFrame(syncLoop);
227
+ return;
228
+ }
229
+ if (frameId !== 0) {
230
+ cancelAnimationFrame(frameId);
231
+ frameId = 0;
232
+ }
233
+ if (!document.hidden) renderOnce();
234
+ };
235
+ const resizeObserver = new ResizeObserver(() => {
236
+ if (frameId === 0) renderOnce();
237
+ });
238
+ resizeObserver.observe(canvas);
239
+ const intersectionObserver = new IntersectionObserver(([entry]) => {
240
+ inView = entry.isIntersecting;
241
+ updateLoop();
242
+ });
243
+ intersectionObserver.observe(canvas);
244
+ const handleVisibilityChange = () => updateLoop();
245
+ document.addEventListener("visibilitychange", handleVisibilityChange);
246
+ const handleMotionPreferenceChange = () => updateLoop();
247
+ reducedMotion.addEventListener("change", handleMotionPreferenceChange);
248
+ repaintRef.current = () => {
249
+ refreshPalette?.();
250
+ if (frameId === 0) renderOnce();
251
+ };
252
+ const handleContextLost = (event) => {
253
+ event.preventDefault();
254
+ if (frameId !== 0) {
255
+ cancelAnimationFrame(frameId);
256
+ frameId = 0;
257
+ }
258
+ setCanvasEpoch((value) => value + 1);
259
+ };
260
+ canvas.addEventListener("webglcontextlost", handleContextLost);
261
+ updateLoop();
262
+ return () => {
263
+ if (frameId !== 0) cancelAnimationFrame(frameId);
264
+ frameId = 0;
265
+ resizeObserver.disconnect();
266
+ intersectionObserver.disconnect();
267
+ repaintRef.current = void 0;
268
+ document.removeEventListener("visibilitychange", handleVisibilityChange);
269
+ reducedMotion.removeEventListener("change", handleMotionPreferenceChange);
270
+ canvas.removeEventListener("webglcontextlost", handleContextLost);
271
+ if (!canvas.isConnected) destroyResources?.(true);
272
+ else destroyResources?.(false);
273
+ };
274
+ }, [canvasEpoch]);
275
+ return /* @__PURE__ */ jsx("div", {
276
+ "aria-hidden": true,
277
+ className: cx(styles.root, className),
278
+ "data-ready": ready ? "" : void 0,
279
+ style: {
280
+ "--fluid-stop-a": palette[0],
281
+ "--fluid-stop-b": palette[1],
282
+ "--fluid-stop-c": palette[2],
283
+ ...style
284
+ },
285
+ ...rest,
286
+ children: /* @__PURE__ */ jsx("canvas", { ref: canvasRef }, canvasEpoch)
287
+ });
288
+ });
289
+ FluidGradient.displayName = "FluidGradient";
290
+ //#endregion
291
+ export { FluidGradient as default };
292
+
293
+ //# sourceMappingURL=FluidGradient.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FluidGradient.mjs","names":[],"sources":["../../../src/awesome/FluidGradient/FluidGradient.tsx"],"sourcesContent":["'use client';\n\nimport { cx, useThemeMode } from 'antd-style';\nimport { type CSSProperties, memo, useEffect, useRef, useState } from 'react';\n\nimport { LANDING_PALETTE_DARK, LANDING_PALETTE_LIGHT } from '@/awesome/landingTokens';\n\nimport { styles } from './style';\nimport type { FluidGradientProps } from './type';\n\nconst VERTEX_SHADER = `#version 300 es\nin vec2 aPos;\nvoid main() {\n gl_Position = vec4(aPos, 0.0, 1.0);\n}`;\n\nconst FRAGMENT_SHADER = `#version 300 es\nprecision highp float;\n\nuniform vec2 uRes;\nuniform float uTime;\nuniform vec3 uStopA;\nuniform vec3 uStopB;\nuniform vec3 uStopC;\nuniform float uIntensity;\n\nout vec4 fragColor;\n\nfloat hash(vec2 p) {\n p = fract(p * vec2(234.34, 435.345));\n p += dot(p, p + 34.23);\n return fract(p.x * p.y);\n}\n\nfloat noise(vec2 p) {\n vec2 i = floor(p);\n vec2 f = fract(p);\n vec2 u = f * f * (3.0 - 2.0 * f);\n float a = hash(i);\n float b = hash(i + vec2(1.0, 0.0));\n float c = hash(i + vec2(0.0, 1.0));\n float d = hash(i + vec2(1.0, 1.0));\n return mix(mix(a, b, u.x), mix(c, d, u.x), u.y);\n}\n\nfloat fbm(vec2 p) {\n float value = 0.0;\n float amplitude = 0.5;\n for (int i = 0; i < 4; i++) {\n value += amplitude * noise(p);\n p = mat2(0.8, 0.6, -0.6, 0.8) * p * 2.0 + vec2(3.7, 1.3);\n amplitude *= 0.5;\n }\n return value;\n}\n\nvoid main() {\n vec2 uv = gl_FragCoord.xy / uRes;\n vec2 p = vec2(uv.x * uRes.x / uRes.y, uv.y);\n\n float t = uTime * 0.05;\n\n vec2 q = vec2(fbm(p * 1.4 + t * 0.35), fbm(p * 1.4 - t * 0.28 + 5.2));\n vec2 r = vec2(\n fbm(p * 1.4 + 2.6 * q + vec2(1.7, 9.2) + t * 0.18),\n fbm(p * 1.4 + 2.6 * q + vec2(8.3, 2.8) - t * 0.12)\n );\n float field = fbm(p * 1.4 + 2.6 * r);\n\n vec3 color = mix(uStopA, uStopB, clamp(field * field * 2.4, 0.0, 1.0));\n color = mix(color, uStopC, clamp(dot(q, vec2(0.7)) - 0.25, 0.0, 1.0));\n\n float fade = smoothstep(0.02, 0.85, uv.y);\n float alpha = fade * fade * uIntensity * smoothstep(0.14, 0.66, field);\n\n fragColor = vec4(color * alpha, alpha);\n}`;\n\nconst hexToRgb = (hex: string): [number, number, number] => {\n const value = hex.replace('#', '');\n const full =\n value.length === 3\n ? value\n .split('')\n .map((char) => char + char)\n .join('')\n : value.slice(0, 6);\n const channel = (offset: number) => Number.parseInt(full.slice(offset, offset + 2), 16) / 255;\n return [channel(0), channel(2), channel(4)];\n};\n\nconst FluidGradient = memo<FluidGradientProps>(\n ({ className, colors, intensity = 0.45, speed = 1, style, ...rest }) => {\n const { isDarkMode } = useThemeMode();\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const [ready, setReady] = useState(false);\n const [canvasEpoch, setCanvasEpoch] = useState(0);\n const palette = colors ?? (isDarkMode ? LANDING_PALETTE_DARK : LANDING_PALETTE_LIGHT);\n const paletteRef = useRef({ colors: palette, intensity });\n const speedRef = useRef(speed);\n const repaintRef = useRef<(() => void) | undefined>(undefined);\n\n useEffect(() => {\n paletteRef.current = { colors: palette, intensity };\n speedRef.current = speed;\n repaintRef.current?.();\n }, [palette[0], palette[1], palette[2], intensity, speed]);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return undefined;\n\n const reducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)');\n\n let frameId = 0;\n let inView = true;\n let readySent = false;\n let drawFrame: ((seconds: number) => void) | null = null;\n let refreshPalette: (() => void) | null = null;\n let sizeAndDraw: (() => boolean) | null = null;\n let destroyResources: ((lose: boolean) => void) | null = null;\n\n const buildResources = () => {\n const gl = canvas.getContext('webgl2', {\n alpha: true,\n antialias: false,\n depth: false,\n stencil: false,\n powerPreference: 'low-power',\n });\n if (!gl) return false;\n\n const compileShader = (type: number, source: string) => {\n const shader = gl.createShader(type);\n if (!shader) return null;\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {\n gl.deleteShader(shader);\n return null;\n }\n return shader;\n };\n\n const vertexShader = compileShader(gl.VERTEX_SHADER, VERTEX_SHADER);\n const fragmentShader = compileShader(gl.FRAGMENT_SHADER, FRAGMENT_SHADER);\n if (!vertexShader || !fragmentShader) return false;\n\n const program = gl.createProgram();\n if (!program) return false;\n gl.attachShader(program, vertexShader);\n gl.attachShader(program, fragmentShader);\n gl.linkProgram(program);\n gl.deleteShader(vertexShader);\n gl.deleteShader(fragmentShader);\n if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {\n gl.deleteProgram(program);\n return false;\n }\n gl.useProgram(program);\n\n const buffer = gl.createBuffer();\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, 3, -1, -1, 3]), gl.STATIC_DRAW);\n const position = gl.getAttribLocation(program, 'aPos');\n gl.enableVertexAttribArray(position);\n gl.vertexAttribPointer(position, 2, gl.FLOAT, false, 0, 0);\n\n const timeLocation = gl.getUniformLocation(program, 'uTime');\n const stopLocations = ['uStopA', 'uStopB', 'uStopC'].map((name) =>\n gl.getUniformLocation(program, name),\n );\n\n const intensityLocation = gl.getUniformLocation(program, 'uIntensity');\n\n refreshPalette = () => {\n const { colors: stops, intensity: peak } = paletteRef.current;\n stops.map(hexToRgb).forEach((stop, index) => {\n const location = stopLocations[index];\n if (location) gl.uniform3f(location, stop[0], stop[1], stop[2]);\n });\n gl.uniform1f(intensityLocation, peak);\n };\n refreshPalette();\n\n drawFrame = (seconds: number) => {\n gl.uniform1f(timeLocation, seconds * speedRef.current);\n gl.drawArrays(gl.TRIANGLES, 0, 3);\n if (!readySent) {\n readySent = true;\n setReady(true);\n }\n };\n\n sizeAndDraw = () => {\n const dpr = Math.min(window.devicePixelRatio || 1, 1.5);\n const width = Math.max(1, Math.round(canvas.clientWidth * dpr));\n const height = Math.max(1, Math.round(canvas.clientHeight * dpr));\n if (canvas.width !== width || canvas.height !== height) {\n canvas.width = width;\n canvas.height = height;\n gl.viewport(0, 0, width, height);\n }\n return canvas.clientWidth > 0 && drawFrame !== null;\n };\n\n destroyResources = (lose: boolean) => {\n gl.deleteBuffer(buffer);\n gl.deleteProgram(program);\n drawFrame = null;\n refreshPalette = null;\n sizeAndDraw = null;\n destroyResources = null;\n if (lose) gl.getExtension('WEBGL_lose_context')?.loseContext();\n };\n\n return true;\n };\n\n if (!buildResources()) return undefined;\n\n const renderOnce = () => {\n if (!sizeAndDraw?.()) return;\n drawFrame?.(performance.now() / 1000);\n };\n\n const syncLoop = (milliseconds: number) => {\n frameId = requestAnimationFrame(syncLoop);\n if (sizeAndDraw?.()) drawFrame?.(milliseconds / 1000);\n };\n\n const updateLoop = () => {\n const shouldAnimate =\n inView && !document.hidden && !reducedMotion.matches && drawFrame !== null;\n\n if (shouldAnimate) {\n if (frameId === 0) frameId = requestAnimationFrame(syncLoop);\n return;\n }\n\n if (frameId !== 0) {\n cancelAnimationFrame(frameId);\n frameId = 0;\n }\n\n if (!document.hidden) renderOnce();\n };\n\n const resizeObserver = new ResizeObserver(() => {\n if (frameId === 0) renderOnce();\n });\n resizeObserver.observe(canvas);\n\n const intersectionObserver = new IntersectionObserver(([entry]) => {\n inView = entry.isIntersecting;\n updateLoop();\n });\n intersectionObserver.observe(canvas);\n\n const handleVisibilityChange = () => updateLoop();\n document.addEventListener('visibilitychange', handleVisibilityChange);\n\n const handleMotionPreferenceChange = () => updateLoop();\n reducedMotion.addEventListener('change', handleMotionPreferenceChange);\n\n repaintRef.current = () => {\n refreshPalette?.();\n if (frameId === 0) renderOnce();\n };\n\n const handleContextLost = (event: Event) => {\n event.preventDefault();\n if (frameId !== 0) {\n cancelAnimationFrame(frameId);\n frameId = 0;\n }\n setCanvasEpoch((value) => value + 1);\n };\n canvas.addEventListener('webglcontextlost', handleContextLost);\n\n updateLoop();\n\n return () => {\n if (frameId !== 0) cancelAnimationFrame(frameId);\n frameId = 0;\n resizeObserver.disconnect();\n intersectionObserver.disconnect();\n repaintRef.current = undefined;\n document.removeEventListener('visibilitychange', handleVisibilityChange);\n reducedMotion.removeEventListener('change', handleMotionPreferenceChange);\n canvas.removeEventListener('webglcontextlost', handleContextLost);\n if (!canvas.isConnected) destroyResources?.(true);\n else destroyResources?.(false);\n };\n }, [canvasEpoch]);\n\n return (\n <div\n aria-hidden\n className={cx(styles.root, className)}\n data-ready={ready ? '' : undefined}\n style={\n {\n '--fluid-stop-a': palette[0],\n '--fluid-stop-b': palette[1],\n '--fluid-stop-c': palette[2],\n ...style,\n } as CSSProperties\n }\n {...rest}\n >\n <canvas key={canvasEpoch} ref={canvasRef} />\n </div>\n );\n },\n);\n\nFluidGradient.displayName = 'FluidGradient';\n\nexport default FluidGradient;\n"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { FluidGradientProps } from "./type.mjs";
2
+ import FluidGradient from "./FluidGradient.mjs";
3
+ export { type FluidGradientProps, FluidGradient as default };
@@ -0,0 +1,52 @@
1
+ import { createStaticStyles } from "antd-style";
2
+ //#region src/awesome/FluidGradient/style.ts
3
+ const styles = createStaticStyles(({ css }) => ({ root: css`
4
+ pointer-events: none;
5
+
6
+ position: absolute;
7
+ z-index: 0;
8
+ inset: 0;
9
+
10
+ /* Soft CSS fallback so the hero never flashes empty white while WebGL boots. */
11
+ background:
12
+ radial-gradient(
13
+ ellipse 80% 55% at 50% 0%,
14
+ color-mix(in srgb, var(--fluid-stop-a, #7c5cff) 28%, transparent),
15
+ transparent 70%
16
+ ),
17
+ radial-gradient(
18
+ ellipse 60% 45% at 85% 20%,
19
+ color-mix(in srgb, var(--fluid-stop-b, #d6549e) 22%, transparent),
20
+ transparent 65%
21
+ ),
22
+ radial-gradient(
23
+ ellipse 55% 40% at 15% 30%,
24
+ color-mix(in srgb, var(--fluid-stop-c, #f0885f) 18%, transparent),
25
+ transparent 60%
26
+ );
27
+
28
+ canvas {
29
+ display: block;
30
+
31
+ inline-size: 100%;
32
+ block-size: 100%;
33
+
34
+ opacity: 0;
35
+
36
+ transition: opacity 700ms ease;
37
+ }
38
+
39
+ &[data-ready] canvas {
40
+ opacity: 1;
41
+ }
42
+
43
+ @media (prefers-reduced-motion: reduce) {
44
+ canvas {
45
+ transition-duration: 0.01ms;
46
+ }
47
+ }
48
+ ` }));
49
+ //#endregion
50
+ export { styles };
51
+
52
+ //# sourceMappingURL=style.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.mjs","names":[],"sources":["../../../src/awesome/FluidGradient/style.ts"],"sourcesContent":["import { createStaticStyles } from 'antd-style';\n\nexport const styles = createStaticStyles(({ css }) => ({\n root: css`\n pointer-events: none;\n\n position: absolute;\n z-index: 0;\n inset: 0;\n\n /* Soft CSS fallback so the hero never flashes empty white while WebGL boots. */\n background:\n radial-gradient(\n ellipse 80% 55% at 50% 0%,\n color-mix(in srgb, var(--fluid-stop-a, #7c5cff) 28%, transparent),\n transparent 70%\n ),\n radial-gradient(\n ellipse 60% 45% at 85% 20%,\n color-mix(in srgb, var(--fluid-stop-b, #d6549e) 22%, transparent),\n transparent 65%\n ),\n radial-gradient(\n ellipse 55% 40% at 15% 30%,\n color-mix(in srgb, var(--fluid-stop-c, #f0885f) 18%, transparent),\n transparent 60%\n );\n\n canvas {\n display: block;\n\n inline-size: 100%;\n block-size: 100%;\n\n opacity: 0;\n\n transition: opacity 700ms ease;\n }\n\n &[data-ready] canvas {\n opacity: 1;\n }\n\n @media (prefers-reduced-motion: reduce) {\n canvas {\n transition-duration: 0.01ms;\n }\n }\n `,\n}));\n"],"mappings":";;AAEA,MAAa,SAAS,oBAAoB,EAAE,WAAW,EACrD,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA8CX,EAAE"}
@@ -0,0 +1,22 @@
1
+ import { DivProps } from "../../types/index.mjs";
2
+ import { LandingPalette } from "../landingTokens.mjs";
3
+ //#region src/awesome/FluidGradient/type.d.ts
4
+ interface FluidGradientProps extends DivProps {
5
+ /**
6
+ * Three color stops blended by the shader. Defaults to the landing palette for the current theme.
7
+ */
8
+ colors?: LandingPalette;
9
+ /**
10
+ * Peak opacity of the texture, from 0 to 1.
11
+ * @default 0.45
12
+ */
13
+ intensity?: number;
14
+ /**
15
+ * Animation speed multiplier. The texture renders a still frame when reduced motion is preferred.
16
+ * @default 1
17
+ */
18
+ speed?: number;
19
+ }
20
+ //#endregion
21
+ export { FluidGradientProps };
22
+ //# sourceMappingURL=type.d.mts.map
@@ -0,0 +1,6 @@
1
+ import { InstallBannerProps } from "./type.mjs";
2
+ //#region src/awesome/InstallBanner/InstallBanner.d.ts
3
+ declare const InstallBanner: import("react").NamedExoticComponent<InstallBannerProps>;
4
+ //#endregion
5
+ export { InstallBanner as default };
6
+ //# sourceMappingURL=InstallBanner.d.mts.map
@@ -0,0 +1,35 @@
1
+ "use client";
2
+ import Snippet from "../../Snippet/Snippet.mjs";
3
+ import { styles } from "./style.mjs";
4
+ import { memo } from "react";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ import { cx } from "antd-style";
7
+ //#region src/awesome/InstallBanner/InstallBanner.tsx
8
+ const InstallBanner = memo(({ className, command, footnote, prefix = "$", title, ...rest }) => /* @__PURE__ */ jsx("section", {
9
+ className: cx(styles.root, className),
10
+ ...rest,
11
+ children: /* @__PURE__ */ jsxs("div", {
12
+ className: styles.content,
13
+ children: [
14
+ title && /* @__PURE__ */ jsx("h2", {
15
+ className: styles.title,
16
+ children: title
17
+ }),
18
+ /* @__PURE__ */ jsx(Snippet, {
19
+ className: styles.snippet,
20
+ language: "bash",
21
+ prefix,
22
+ children: command
23
+ }),
24
+ footnote && /* @__PURE__ */ jsx("p", {
25
+ className: styles.footnote,
26
+ children: footnote
27
+ })
28
+ ]
29
+ })
30
+ }));
31
+ InstallBanner.displayName = "InstallBanner";
32
+ //#endregion
33
+ export { InstallBanner as default };
34
+
35
+ //# sourceMappingURL=InstallBanner.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InstallBanner.mjs","names":[],"sources":["../../../src/awesome/InstallBanner/InstallBanner.tsx"],"sourcesContent":["'use client';\n\nimport { cx } from 'antd-style';\nimport { memo } from 'react';\n\nimport Snippet from '@/Snippet';\n\nimport { styles } from './style';\nimport type { InstallBannerProps } from './type';\n\nconst InstallBanner = memo<InstallBannerProps>(\n ({ className, command, footnote, prefix = '$', title, ...rest }) => (\n <section className={cx(styles.root, className)} {...rest}>\n <div className={styles.content}>\n {title && <h2 className={styles.title}>{title}</h2>}\n <Snippet className={styles.snippet} language={'bash'} prefix={prefix}>\n {command}\n </Snippet>\n {footnote && <p className={styles.footnote}>{footnote}</p>}\n </div>\n </section>\n ),\n);\n\nInstallBanner.displayName = 'InstallBanner';\n\nexport default InstallBanner;\n"],"mappings":";;;;;;;AAUA,MAAM,gBAAgB,MACnB,EAAE,WAAW,SAAS,UAAU,SAAS,KAAK,OAAO,GAAG,WACvD,oBAAC,WAAD;CAAS,WAAW,GAAG,OAAO,MAAM,SAAS;CAAG,GAAI;CAClD,UAAA,qBAAC,OAAD;EAAK,WAAW,OAAO;EAAvB,UAAA;GACG,SAAS,oBAAC,MAAD;IAAI,WAAW,OAAO;IAAQ,UAAA;GAAU,CAAA;GAClD,oBAAC,SAAD;IAAS,WAAW,OAAO;IAAS,UAAU;IAAgB;IAC3D,UAAA;GACM,CAAA;GACR,YAAY,oBAAC,KAAD;IAAG,WAAW,OAAO;IAAW,UAAA;GAAY,CAAA;EACtD;;AACE,CAAA,CAEb;AAEA,cAAc,cAAc"}
@@ -0,0 +1,3 @@
1
+ import { InstallBannerProps } from "./type.mjs";
2
+ import InstallBanner from "./InstallBanner.mjs";
3
+ export { type InstallBannerProps, InstallBanner as default };
@@ -0,0 +1,46 @@
1
+ import { createStaticStyles } from "antd-style";
2
+ //#region src/awesome/InstallBanner/style.ts
3
+ const styles = createStaticStyles(({ css, cssVar }) => ({
4
+ footnote: css`
5
+ margin: 0;
6
+ font-size: ${cssVar.fontSizeSM};
7
+ color: ${cssVar.colorTextTertiary};
8
+
9
+ a {
10
+ color: ${cssVar.colorPrimary};
11
+ text-decoration: none;
12
+ }
13
+
14
+ a:hover {
15
+ text-decoration: underline;
16
+ }
17
+ `,
18
+ content: css`
19
+ display: flex;
20
+ flex-direction: column;
21
+ gap: 20px;
22
+ align-items: center;
23
+ `,
24
+ root: css`
25
+ overflow: hidden;
26
+ padding-block: clamp(56px, 9vh, 88px);
27
+ border-block-start: 1px solid ${cssVar.colorBorderSecondary};
28
+ text-align: center;
29
+ `,
30
+ snippet: css`
31
+ border-radius: 999px;
32
+ `,
33
+ title: css`
34
+ margin: 0;
35
+
36
+ font-size: clamp(22px, 3vw, 28px);
37
+ font-weight: 650;
38
+ color: ${cssVar.colorText};
39
+ text-wrap: balance;
40
+ letter-spacing: -0.02em;
41
+ `
42
+ }));
43
+ //#endregion
44
+ export { styles };
45
+
46
+ //# sourceMappingURL=style.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"style.mjs","names":[],"sources":["../../../src/awesome/InstallBanner/style.ts"],"sourcesContent":["import { createStaticStyles } from 'antd-style';\n\nexport const styles = createStaticStyles(({ css, cssVar }) => ({\n footnote: css`\n margin: 0;\n font-size: ${cssVar.fontSizeSM};\n color: ${cssVar.colorTextTertiary};\n\n a {\n color: ${cssVar.colorPrimary};\n text-decoration: none;\n }\n\n a:hover {\n text-decoration: underline;\n }\n `,\n content: css`\n display: flex;\n flex-direction: column;\n gap: 20px;\n align-items: center;\n `,\n root: css`\n overflow: hidden;\n padding-block: clamp(56px, 9vh, 88px);\n border-block-start: 1px solid ${cssVar.colorBorderSecondary};\n text-align: center;\n `,\n snippet: css`\n border-radius: 999px;\n `,\n title: css`\n margin: 0;\n\n font-size: clamp(22px, 3vw, 28px);\n font-weight: 650;\n color: ${cssVar.colorText};\n text-wrap: balance;\n letter-spacing: -0.02em;\n `,\n}));\n"],"mappings":";;AAEA,MAAa,SAAS,oBAAoB,EAAE,KAAK,cAAc;CAC7D,UAAU,GAAG;;iBAEE,OAAO,WAAW;aACtB,OAAO,kBAAkB;;;eAGvB,OAAO,aAAa;;;;;;;;CAQjC,SAAS,GAAG;;;;;;CAMZ,MAAM,GAAG;;;oCAGyB,OAAO,qBAAqB;;;CAG9D,SAAS,GAAG;;;CAGZ,OAAO,GAAG;;;;;aAKC,OAAO,UAAU;;;;AAI9B,EAAE"}
@@ -0,0 +1,18 @@
1
+ import { DivProps } from "../../types/index.mjs";
2
+ import { ReactNode } from "react";
3
+ //#region src/awesome/InstallBanner/type.d.ts
4
+ interface InstallBannerProps extends Omit<DivProps, 'title'> {
5
+ /** The shell command users copy, e.g. `pnpm add @lobehub/ui`. */
6
+ command: string;
7
+ /** Muted line under the command, e.g. license and a docs link. */
8
+ footnote?: ReactNode;
9
+ /**
10
+ * Shell prompt shown before the command.
11
+ * @default '$'
12
+ */
13
+ prefix?: string;
14
+ title?: ReactNode;
15
+ }
16
+ //#endregion
17
+ export { InstallBannerProps };
18
+ //# sourceMappingURL=type.d.mts.map
@@ -0,0 +1,6 @@
1
+ import { LandingHeroProps } from "./type.mjs";
2
+ //#region src/awesome/LandingHero/LandingHero.d.ts
3
+ declare const LandingHero: import("react").NamedExoticComponent<LandingHeroProps>;
4
+ //#endregion
5
+ export { LandingHero as default };
6
+ //# sourceMappingURL=LandingHero.d.mts.map
@@ -0,0 +1,55 @@
1
+ "use client";
2
+ import { LandingActions } from "../landingActions.mjs";
3
+ import { styles } from "./style.mjs";
4
+ import { memo } from "react";
5
+ import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
6
+ import { cx } from "antd-style";
7
+ //#region src/awesome/LandingHero/LandingHero.tsx
8
+ const LandingHero = memo(({ accent, actions, aside, badge, children, className, description, onNavigate, renderLink, title, ...rest }) => /* @__PURE__ */ jsx("section", {
9
+ className: cx(styles.root, className),
10
+ "data-layout": aside ? "split" : "center",
11
+ ...rest,
12
+ children: /* @__PURE__ */ jsxs("div", {
13
+ className: styles.content,
14
+ children: [/* @__PURE__ */ jsxs("div", {
15
+ className: styles.main,
16
+ children: [/* @__PURE__ */ jsxs("div", {
17
+ className: styles.intro,
18
+ children: [
19
+ badge && /* @__PURE__ */ jsx("div", {
20
+ className: styles.badge,
21
+ children: badge
22
+ }),
23
+ /* @__PURE__ */ jsxs("h1", {
24
+ className: styles.title,
25
+ children: [title, accent && /* @__PURE__ */ jsxs(Fragment$1, { children: [" ", /* @__PURE__ */ jsx("span", {
26
+ className: styles.accent,
27
+ children: accent
28
+ })] })]
29
+ }),
30
+ description && /* @__PURE__ */ jsx("p", {
31
+ className: styles.description,
32
+ children: description
33
+ }),
34
+ actions && actions.length > 0 && /* @__PURE__ */ jsx(LandingActions, {
35
+ actions,
36
+ className: styles.actions,
37
+ renderLink,
38
+ onNavigate
39
+ })
40
+ ]
41
+ }), aside && /* @__PURE__ */ jsx("div", {
42
+ className: styles.aside,
43
+ children: aside
44
+ })]
45
+ }), children && /* @__PURE__ */ jsx("div", {
46
+ className: styles.extra,
47
+ children
48
+ })]
49
+ })
50
+ }));
51
+ LandingHero.displayName = "LandingHero";
52
+ //#endregion
53
+ export { LandingHero as default };
54
+
55
+ //# sourceMappingURL=LandingHero.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LandingHero.mjs","names":[],"sources":["../../../src/awesome/LandingHero/LandingHero.tsx"],"sourcesContent":["'use client';\n\nimport { cx } from 'antd-style';\nimport { memo } from 'react';\n\nimport { LandingActions } from '@/awesome/landingActions';\n\nimport { styles } from './style';\nimport type { LandingHeroProps } from './type';\n\nconst LandingHero = memo<LandingHeroProps>(\n ({\n accent,\n actions,\n aside,\n badge,\n children,\n className,\n description,\n onNavigate,\n renderLink,\n title,\n ...rest\n }) => (\n <section\n className={cx(styles.root, className)}\n data-layout={aside ? 'split' : 'center'}\n {...rest}\n >\n <div className={styles.content}>\n <div className={styles.main}>\n <div className={styles.intro}>\n {badge && <div className={styles.badge}>{badge}</div>}\n <h1 className={styles.title}>\n {title}\n {accent && (\n <>\n {' '}\n <span className={styles.accent}>{accent}</span>\n </>\n )}\n </h1>\n {description && <p className={styles.description}>{description}</p>}\n {actions && actions.length > 0 && (\n <LandingActions\n actions={actions}\n className={styles.actions}\n renderLink={renderLink}\n onNavigate={onNavigate}\n />\n )}\n </div>\n {aside && <div className={styles.aside}>{aside}</div>}\n </div>\n {children && <div className={styles.extra}>{children}</div>}\n </div>\n </section>\n ),\n);\n\nLandingHero.displayName = 'LandingHero';\n\nexport default LandingHero;\n"],"mappings":";;;;;;;AAUA,MAAM,cAAc,MACjB,EACC,QACA,SACA,OACA,OACA,UACA,WACA,aACA,YACA,YACA,OACA,GAAG,WAEH,oBAAC,WAAD;CACE,WAAW,GAAG,OAAO,MAAM,SAAS;CACpC,eAAa,QAAQ,UAAU;CAC/B,GAAI;CAEJ,UAAA,qBAAC,OAAD;EAAK,WAAW,OAAO;EAAvB,UAAA,CACE,qBAAC,OAAD;GAAK,WAAW,OAAO;GAAvB,UAAA,CACE,qBAAC,OAAD;IAAK,WAAW,OAAO;IAAvB,UAAA;KACG,SAAS,oBAAC,OAAD;MAAK,WAAW,OAAO;MAAQ,UAAA;KAAW,CAAA;KACpD,qBAAC,MAAD;MAAI,WAAW,OAAO;MAAtB,UAAA,CACG,OACA,UACC,qBAAA,YAAA,EAAA,UAAA,CACG,KACD,oBAAC,QAAD;OAAM,WAAW,OAAO;OAAS,UAAA;MAAa,CAAA,CAC9C,EAAA,CAAA,CAEF;;KACH,eAAe,oBAAC,KAAD;MAAG,WAAW,OAAO;MAAc,UAAA;KAAe,CAAA;KACjE,WAAW,QAAQ,SAAS,KAC3B,oBAAC,gBAAD;MACW;MACT,WAAW,OAAO;MACN;MACA;KACb,CAAA;IAEA;GACJ,CAAA,GAAA,SAAS,oBAAC,OAAD;IAAK,WAAW,OAAO;IAAQ,UAAA;GAAW,CAAA,CACjD;EACJ,CAAA,GAAA,YAAY,oBAAC,OAAD;GAAK,WAAW,OAAO;GAAQ;EAAc,CAAA,CACvD;;AACE,CAAA,CAEb;AAEA,YAAY,cAAc"}
@@ -0,0 +1,3 @@
1
+ import { LandingHeroAction, LandingHeroProps } from "./type.mjs";
2
+ import LandingHero from "./LandingHero.mjs";
3
+ export { type LandingHeroAction, type LandingHeroProps, LandingHero as default };