aura-ui-library 1.0.11 → 1.0.13

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 (3) hide show
  1. package/dist/index.js +916 -28
  2. package/dist/index.mjs +946 -47
  3. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -31,7 +31,10 @@ var index_exports = {};
31
31
  __export(index_exports, {
32
32
  Button: () => Button,
33
33
  Carousel: () => Carousel,
34
+ Footer: () => Footer,
35
+ Grid: () => Grid,
34
36
  Image: () => Image,
37
+ ImageEffectScrolling: () => ImageEffectScrolling,
35
38
  Navbar: () => Navbar,
36
39
  PinterestGrid: () => PinterestGrid,
37
40
  ProductCard: () => ProductCard,
@@ -39,6 +42,7 @@ __export(index_exports, {
39
42
  SideBar: () => SideBar,
40
43
  Skills: () => Skills,
41
44
  Spotlight: () => Spotlight,
45
+ Testimonials: () => Testimonials,
42
46
  TextImage: () => TextImage,
43
47
  TextWriting: () => TextWriting
44
48
  });
@@ -69,7 +73,14 @@ var Button = ({
69
73
  const buttonRef = (0, import_react.useRef)(null);
70
74
  const textRef = (0, import_react.useRef)(null);
71
75
  const iconRef = (0, import_react.useRef)(null);
72
- const navigate = (0, import_react_router_dom.useNavigate)();
76
+ const inRouter = (0, import_react_router_dom.useInRouterContext)();
77
+ const navigate = inRouter ? (0, import_react_router_dom.useNavigate)() : null;
78
+ const handleNavigate = (path) => {
79
+ if (path) {
80
+ if (navigate) navigate(path);
81
+ else window.location.assign(path);
82
+ }
83
+ };
73
84
  (0, import_react.useEffect)(() => {
74
85
  const ctx = import_gsap.gsap.context(() => {
75
86
  import_gsap.gsap.from(buttonRef.current, {
@@ -128,7 +139,7 @@ var Button = ({
128
139
  filter: "brightness(1.1)",
129
140
  duration: 0.1
130
141
  });
131
- if (to) navigate(to);
142
+ if (to) handleNavigate(to);
132
143
  if (onClick) onClick(e);
133
144
  };
134
145
  const Icon = IconName ? FiIcons[IconName] : null;
@@ -2756,6 +2767,7 @@ var TextImage = ({
2756
2767
  textColor = "#ffffff",
2757
2768
  fontSize = "clamp(48px, 8vw, 120px)",
2758
2769
  fontWeight = "900",
2770
+ imageHeight = "1em",
2759
2771
  animationDuration = 1.2,
2760
2772
  easing = "power4.out"
2761
2773
  }) => {
@@ -2838,52 +2850,927 @@ var TextImage = ({
2838
2850
  display: "inline-block",
2839
2851
  willChange: "transform, opacity"
2840
2852
  },
2841
- imageWrap: (shape) => ({
2842
- display: "inline-block",
2843
- height: "0.8em",
2844
- aspectRatio: shape === "pill" ? "2/1" : "1/1",
2845
- margin: "0 0.1em",
2846
- borderRadius: shape === "circle" ? "50%" : shape === "pill" ? "100px" : "24px",
2847
- overflow: "hidden",
2848
- border: `2px solid rgba(255,255,255,0.1)`,
2849
- cursor: "pointer",
2850
- willChange: "transform, opacity",
2851
- verticalAlign: "middle"
2852
- }),
2853
+ imageWrap: (shape, size, radius) => {
2854
+ const h = size || imageHeight;
2855
+ let br = radius;
2856
+ if (!br) {
2857
+ if (shape === "circle") br = "50%";
2858
+ else if (shape === "pill") br = "100px";
2859
+ else if (shape === "rounded") br = "24px";
2860
+ else if (shape === "square") br = "8px";
2861
+ else br = "0px";
2862
+ }
2863
+ let clipPath = "none";
2864
+ if (shape === "diamond") clipPath = "polygon(50% 0%, 100% 50%, 50% 100%, 0% 50%)";
2865
+ if (shape === "hexagon") clipPath = "polygon(25% 0%, 75% 0%, 100% 50%, 75% 100%, 25% 100%, 0% 50%)";
2866
+ return {
2867
+ display: "inline-block",
2868
+ height: h,
2869
+ aspectRatio: shape === "pill" ? "2/1" : "1/1",
2870
+ margin: "0 0.1em",
2871
+ borderRadius: br,
2872
+ clipPath,
2873
+ overflow: "hidden",
2874
+ border: `2px solid rgba(255,255,255,0.1)`,
2875
+ cursor: "pointer",
2876
+ willChange: "transform, opacity",
2877
+ verticalAlign: "middle"
2878
+ };
2879
+ },
2853
2880
  image: {
2854
2881
  width: "100%",
2855
2882
  height: "100%",
2856
2883
  objectFit: "cover"
2857
2884
  }
2858
2885
  };
2859
- return /* @__PURE__ */ import_react12.default.createElement("div", { ref: containerRef, style: styles.container }, segments.map(
2860
- (seg, i) => seg.type === "text" ? /* @__PURE__ */ import_react12.default.createElement(
2861
- "span",
2862
- {
2863
- key: i,
2864
- ref: (el) => segmentRefs.current[i] = el,
2865
- style: styles.text
2866
- },
2867
- seg.value
2868
- ) : /* @__PURE__ */ import_react12.default.createElement(
2886
+ return /* @__PURE__ */ import_react12.default.createElement("div", { ref: containerRef, style: styles.container }, segments.map((seg, i) => {
2887
+ const isString = typeof seg === "string";
2888
+ const type = isString ? "text" : seg.type || (seg.image ? "image" : "text");
2889
+ const value = isString ? seg : seg.value || seg.text || seg.image;
2890
+ if (type === "text") {
2891
+ return /* @__PURE__ */ import_react12.default.createElement(
2892
+ "span",
2893
+ {
2894
+ key: i,
2895
+ ref: (el) => segmentRefs.current[i] = el,
2896
+ style: styles.text
2897
+ },
2898
+ value
2899
+ );
2900
+ }
2901
+ return /* @__PURE__ */ import_react12.default.createElement(
2869
2902
  "div",
2870
2903
  {
2871
2904
  key: i,
2872
2905
  ref: (el) => segmentRefs.current[i] = el,
2873
- style: styles.imageWrap(seg.shape),
2906
+ style: styles.imageWrap(seg.shape, seg.size, seg.radius),
2874
2907
  onMouseEnter: (e) => handleImageHover(e, i),
2875
2908
  onMouseLeave: () => handleImageLeave(i),
2876
2909
  onClick: () => handleNavigate(seg.path)
2877
2910
  },
2878
- /* @__PURE__ */ import_react12.default.createElement("img", { src: seg.value, alt: "accent", style: styles.image })
2879
- )
2880
- ));
2911
+ /* @__PURE__ */ import_react12.default.createElement("img", { src: value, alt: "accent", style: styles.image })
2912
+ );
2913
+ }));
2914
+ };
2915
+
2916
+ // src/components/Grid/Grid.jsx
2917
+ var import_react13 = __toESM(require("react"));
2918
+ var import_react_router_dom11 = require("react-router-dom");
2919
+ var import_gsap13 = require("gsap");
2920
+ var import_fi12 = require("react-icons/fi");
2921
+ var Grid = ({
2922
+ items = [
2923
+ { id: 1, title: "Architecture", description: "Deep neural networks for vision.", icon: /* @__PURE__ */ import_react13.default.createElement(import_fi12.FiLayers, null), span: "row-2", color: "#6366f1", image: "https://images.unsplash.com/photo-1620641788421-7a1c342ea42e?auto=format&fit=crop&q=80&w=800" },
2924
+ { id: 2, title: "Design", description: "Editorial interfaces.", icon: /* @__PURE__ */ import_react13.default.createElement(import_fi12.FiLayout, null), span: "col-2", color: "#f43f5e", image: "https://images.unsplash.com/photo-1635070041078-e363dbe005cb?auto=format&fit=crop&q=80&w=800" },
2925
+ { id: 3, title: "Speed", description: "Optimized for 120fps.", icon: /* @__PURE__ */ import_react13.default.createElement(import_fi12.FiZap, null), span: "normal", color: "#10b981" },
2926
+ { id: 4, title: "Structure", description: "Bento-style layouts.", icon: /* @__PURE__ */ import_react13.default.createElement(import_fi12.FiGrid, null), span: "normal", color: "#fb7185" },
2927
+ { id: 5, title: "Future", description: "Next-gen interactions.", icon: /* @__PURE__ */ import_react13.default.createElement(import_fi12.FiBox, null), span: "col-2", color: "#8b5cf6", image: "https://images.unsplash.com/photo-1618005182384-a83a8bd57fbe?auto=format&fit=crop&q=80&w=800" }
2928
+ ],
2929
+ accentColor = "#6366f1",
2930
+ gap = "24px",
2931
+ columns = "repeat(3, 1fr)",
2932
+ animationDuration = 1.2,
2933
+ easing = "power4.out"
2934
+ }) => {
2935
+ const containerRef = (0, import_react13.useRef)(null);
2936
+ const cardRefs = (0, import_react13.useRef)([]);
2937
+ const inRouter = (0, import_react_router_dom11.useInRouterContext)();
2938
+ const navigate = inRouter ? (0, import_react_router_dom11.useNavigate)() : null;
2939
+ const handleNavigate = (path) => {
2940
+ if (path) {
2941
+ if (navigate) navigate(path);
2942
+ else window.location.assign(path);
2943
+ }
2944
+ };
2945
+ (0, import_react13.useEffect)(() => {
2946
+ const ctx = import_gsap13.gsap.context(() => {
2947
+ import_gsap13.gsap.fromTo(
2948
+ cardRefs.current,
2949
+ {
2950
+ opacity: 0,
2951
+ y: 40,
2952
+ scale: 0.95,
2953
+ filter: "blur(10px)"
2954
+ },
2955
+ {
2956
+ opacity: 1,
2957
+ y: 0,
2958
+ scale: 1,
2959
+ filter: "blur(0px)",
2960
+ stagger: 0.1,
2961
+ duration: animationDuration,
2962
+ ease: easing,
2963
+ clearProps: "filter"
2964
+ }
2965
+ );
2966
+ }, containerRef);
2967
+ return () => ctx.revert();
2968
+ }, [items, animationDuration, easing]);
2969
+ const handleMouseMove = (e, index) => {
2970
+ const card = cardRefs.current[index];
2971
+ const { left, top, width, height } = card.getBoundingClientRect();
2972
+ const x = (e.clientX - (left + width / 2)) / (width / 2);
2973
+ const y = (e.clientY - (top + height / 2)) / (height / 2);
2974
+ import_gsap13.gsap.to(card, {
2975
+ rotateY: x * 8,
2976
+ rotateX: -y * 8,
2977
+ transformPerspective: 1e3,
2978
+ duration: 0.4,
2979
+ ease: "power2.out"
2980
+ });
2981
+ const glow = card.querySelector(".glow");
2982
+ if (glow) {
2983
+ import_gsap13.gsap.to(glow, {
2984
+ opacity: 0.4,
2985
+ x: x * 50,
2986
+ y: y * 50,
2987
+ duration: 0.3
2988
+ });
2989
+ }
2990
+ };
2991
+ const handleMouseLeave = (index) => {
2992
+ import_gsap13.gsap.to(cardRefs.current[index], {
2993
+ rotateY: 0,
2994
+ rotateX: 0,
2995
+ duration: 0.6,
2996
+ ease: "power3.out"
2997
+ });
2998
+ const glow = cardRefs.current[index].querySelector(".glow");
2999
+ if (glow) {
3000
+ import_gsap13.gsap.to(glow, { opacity: 0, duration: 0.5 });
3001
+ }
3002
+ };
3003
+ const styles = {
3004
+ gridContainer: {
3005
+ display: "grid",
3006
+ gridTemplateColumns: columns,
3007
+ gap,
3008
+ width: "100%",
3009
+ padding: "40px",
3010
+ boxSizing: "border-box",
3011
+ backgroundColor: "transparent",
3012
+ fontFamily: '"Inter", sans-serif'
3013
+ },
3014
+ card: (item) => {
3015
+ var _a, _b;
3016
+ return {
3017
+ position: "relative",
3018
+ gridColumn: ((_a = item.span) == null ? void 0 : _a.includes("col-2")) ? "span 2" : "span 1",
3019
+ gridRow: ((_b = item.span) == null ? void 0 : _b.includes("row-2")) ? "span 2" : "span 1",
3020
+ minHeight: "240px",
3021
+ backgroundColor: "rgba(20, 20, 20, 0.4)",
3022
+ borderRadius: "32px",
3023
+ overflow: "hidden",
3024
+ border: "1px solid rgba(255, 255, 255, 0.05)",
3025
+ backdropFilter: "blur(16px)",
3026
+ WebkitBackdropFilter: "blur(16px)",
3027
+ cursor: "pointer",
3028
+ display: "flex",
3029
+ flexDirection: "column",
3030
+ justifyContent: "flex-end",
3031
+ padding: "32px",
3032
+ transition: "border-color 0.3s ease",
3033
+ willChange: "transform, opacity"
3034
+ };
3035
+ },
3036
+ glow: (color) => ({
3037
+ position: "absolute",
3038
+ top: "50%",
3039
+ left: "50%",
3040
+ width: "150%",
3041
+ height: "150%",
3042
+ background: `radial-gradient(circle at center, ${color || accentColor}22 0%, transparent 70%)`,
3043
+ transform: "translate(-50%, -50%)",
3044
+ pointerEvents: "none",
3045
+ opacity: 0,
3046
+ zIndex: 1
3047
+ }),
3048
+ image: {
3049
+ position: "absolute",
3050
+ inset: 0,
3051
+ width: "100%",
3052
+ height: "100%",
3053
+ objectFit: "cover",
3054
+ opacity: 0.4,
3055
+ zIndex: 0,
3056
+ transition: "transform 0.5s ease"
3057
+ },
3058
+ content: {
3059
+ position: "relative",
3060
+ zIndex: 2
3061
+ },
3062
+ icon: (color) => ({
3063
+ width: "48px",
3064
+ height: "48px",
3065
+ borderRadius: "14px",
3066
+ backgroundColor: `${color || accentColor}22`,
3067
+ color: color || accentColor,
3068
+ display: "flex",
3069
+ alignItems: "center",
3070
+ justifyContent: "center",
3071
+ fontSize: "24px",
3072
+ marginBottom: "20px"
3073
+ }),
3074
+ title: {
3075
+ fontSize: "24px",
3076
+ fontWeight: "800",
3077
+ color: "#fff",
3078
+ margin: "0 0 8px 0",
3079
+ letterSpacing: "-0.5px"
3080
+ },
3081
+ description: {
3082
+ fontSize: "15px",
3083
+ color: "rgba(255, 255, 255, 0.5)",
3084
+ margin: 0,
3085
+ lineHeight: "1.5"
3086
+ },
3087
+ arrow: {
3088
+ position: "absolute",
3089
+ top: "32px",
3090
+ right: "32px",
3091
+ color: "rgba(255, 255, 255, 0.2)",
3092
+ fontSize: "20px",
3093
+ transition: "all 0.3s ease"
3094
+ }
3095
+ };
3096
+ return /* @__PURE__ */ import_react13.default.createElement("div", { ref: containerRef, style: styles.gridContainer }, items.map((item, i) => /* @__PURE__ */ import_react13.default.createElement(
3097
+ "div",
3098
+ {
3099
+ key: item.id,
3100
+ ref: (el) => cardRefs.current[i] = el,
3101
+ style: styles.card(item),
3102
+ onMouseMove: (e) => handleMouseMove(e, i),
3103
+ onMouseLeave: () => handleMouseLeave(i),
3104
+ onClick: () => handleNavigate(item.path),
3105
+ onMouseEnter: (e) => {
3106
+ const arrow = e.currentTarget.querySelector(".arrow");
3107
+ if (arrow) import_gsap13.gsap.to(arrow, { x: 5, y: -5, color: item.color || accentColor });
3108
+ const img = e.currentTarget.querySelector("img");
3109
+ if (img) import_gsap13.gsap.to(img, { scale: 1.1, opacity: 0.6 });
3110
+ }
3111
+ },
3112
+ /* @__PURE__ */ import_react13.default.createElement("div", { className: "glow", style: styles.glow(item.color) }),
3113
+ item.image && /* @__PURE__ */ import_react13.default.createElement("img", { src: item.image, alt: item.title, style: styles.image }),
3114
+ /* @__PURE__ */ import_react13.default.createElement("div", { className: "arrow", style: styles.arrow }, /* @__PURE__ */ import_react13.default.createElement(import_fi12.FiArrowUpRight, null)),
3115
+ /* @__PURE__ */ import_react13.default.createElement("div", { style: styles.content }, /* @__PURE__ */ import_react13.default.createElement("div", { style: styles.icon(item.color) }, item.icon), /* @__PURE__ */ import_react13.default.createElement("h3", { style: styles.title }, item.title), /* @__PURE__ */ import_react13.default.createElement("p", { style: styles.description }, item.description))
3116
+ )));
3117
+ };
3118
+
3119
+ // src/components/ImageEffect/ImageEffect.jsx
3120
+ var import_react14 = __toESM(require("react"));
3121
+ var import_react_router_dom12 = require("react-router-dom");
3122
+ var import_gsap14 = require("gsap");
3123
+ var import_ScrollTrigger = require("gsap/ScrollTrigger");
3124
+ var import_fi13 = require("react-icons/fi");
3125
+ import_gsap14.gsap.registerPlugin(import_ScrollTrigger.ScrollTrigger);
3126
+ var ImageEffectScrolling = ({
3127
+ images = [
3128
+ { id: 1, src: "https://images.unsplash.com/photo-1618005182384-a83a8bd57fbe?auto=format&fit=crop&q=80&w=800", title: "Aether Flow" },
3129
+ { id: 2, src: "https://images.unsplash.com/photo-1635070041078-e363dbe005cb?auto=format&fit=crop&q=80&w=800", title: "Neural Nexus" },
3130
+ { id: 3, src: "https://images.unsplash.com/photo-1620641788421-7a1c342ea42e?auto=format&fit=crop&q=80&w=800", title: "Neon Gradients" },
3131
+ { id: 4, src: "https://images.unsplash.com/photo-1550684848-fac1c5b4e853?auto=format&fit=crop&q=80&w=800", title: "Geometry Labs" },
3132
+ { id: 5, src: "https://images.unsplash.com/photo-1614850523296-d8c1af93d400?auto=format&fit=crop&q=80&w=800", title: "Liquid Void" },
3133
+ { id: 6, src: "https://images.unsplash.com/photo-1634017839464-5c339ebe3cb4?auto=format&fit=crop&q=80&w=800", title: "Digital Ether" }
3134
+ ],
3135
+ accentColor = "#6366f1",
3136
+ textColor = "#ffffff",
3137
+ waveIntensity = 15,
3138
+ scrollSpeed = 1,
3139
+ animationDuration = 1.5,
3140
+ easing = "power4.out"
3141
+ }) => {
3142
+ const sectionRef = (0, import_react14.useRef)(null);
3143
+ const containerRef = (0, import_react14.useRef)(null);
3144
+ const imageRefs = (0, import_react14.useRef)([]);
3145
+ const contentRef = (0, import_react14.useRef)(null);
3146
+ const inRouter = (0, import_react_router_dom12.useInRouterContext)();
3147
+ const navigate = inRouter ? (0, import_react_router_dom12.useNavigate)() : null;
3148
+ const handleNavigate = (path) => {
3149
+ if (path) {
3150
+ if (navigate) navigate(path);
3151
+ else window.location.assign(path);
3152
+ }
3153
+ };
3154
+ (0, import_react14.useEffect)(() => {
3155
+ const ctx = import_gsap14.gsap.context(() => {
3156
+ const sections = imageRefs.current;
3157
+ const totalWidth = containerRef.current.scrollWidth;
3158
+ import_gsap14.gsap.to(containerRef.current, {
3159
+ x: () => -(totalWidth - window.innerWidth),
3160
+ ease: "none",
3161
+ scrollTrigger: {
3162
+ trigger: sectionRef.current,
3163
+ pin: true,
3164
+ scrub: 1,
3165
+ start: "top top",
3166
+ end: () => `+=${totalWidth}`,
3167
+ anticipatePin: 1,
3168
+ onUpdate: (self) => {
3169
+ const velocity = self.getVelocity();
3170
+ const skew = velocity / 500 * waveIntensity;
3171
+ sections.forEach((img) => {
3172
+ import_gsap14.gsap.to(img, {
3173
+ skewX: skew,
3174
+ duration: 0.5,
3175
+ ease: "power2.out",
3176
+ overwrite: "auto"
3177
+ });
3178
+ });
3179
+ }
3180
+ }
3181
+ });
3182
+ import_gsap14.gsap.fromTo(
3183
+ imageRefs.current,
3184
+ { opacity: 0, y: 100, scale: 0.8 },
3185
+ {
3186
+ opacity: 1,
3187
+ y: 0,
3188
+ scale: 1,
3189
+ stagger: 0.1,
3190
+ duration: animationDuration,
3191
+ ease: easing
3192
+ }
3193
+ );
3194
+ sections.forEach((img) => {
3195
+ const innerImg = img.querySelector("img");
3196
+ import_gsap14.gsap.to(innerImg, {
3197
+ x: -100,
3198
+ ease: "none",
3199
+ scrollTrigger: {
3200
+ trigger: img,
3201
+ containerAnimation: import_gsap14.gsap.getProperty(containerRef.current, "gsap"),
3202
+ // This is tricky for scrub
3203
+ scrub: true,
3204
+ horizontal: true
3205
+ }
3206
+ });
3207
+ });
3208
+ }, sectionRef);
3209
+ return () => ctx.revert();
3210
+ }, [images, waveIntensity, animationDuration, easing]);
3211
+ const handleMouseEnter = (e) => {
3212
+ import_gsap14.gsap.to(e.currentTarget, {
3213
+ scale: 1.05,
3214
+ zIndex: 10,
3215
+ duration: 0.6,
3216
+ ease: "expo.out"
3217
+ });
3218
+ const overlay = e.currentTarget.querySelector(".overlay");
3219
+ import_gsap14.gsap.to(overlay, { opacity: 1, duration: 0.4 });
3220
+ };
3221
+ const handleMouseLeave = (e) => {
3222
+ import_gsap14.gsap.to(e.currentTarget, {
3223
+ scale: 1,
3224
+ zIndex: 1,
3225
+ duration: 0.6,
3226
+ ease: "expo.out"
3227
+ });
3228
+ const overlay = e.currentTarget.querySelector(".overlay");
3229
+ import_gsap14.gsap.to(overlay, { opacity: 0, duration: 0.4 });
3230
+ };
3231
+ const styles = {
3232
+ section: {
3233
+ position: "relative",
3234
+ width: "100%",
3235
+ height: "100vh",
3236
+ overflow: "hidden",
3237
+ backgroundColor: "#050505",
3238
+ display: "flex",
3239
+ alignItems: "center"
3240
+ },
3241
+ container: {
3242
+ display: "flex",
3243
+ paddingLeft: "10vw",
3244
+ paddingRight: "10vw",
3245
+ gap: "50px",
3246
+ alignItems: "center",
3247
+ willChange: "transform"
3248
+ },
3249
+ imageItem: {
3250
+ position: "relative",
3251
+ flex: "0 0 45vh",
3252
+ height: "60vh",
3253
+ borderRadius: "24px",
3254
+ overflow: "hidden",
3255
+ cursor: "pointer",
3256
+ backgroundColor: "#111",
3257
+ willChange: "transform, skewX",
3258
+ transformStyle: "preserve-3d"
3259
+ },
3260
+ image: {
3261
+ width: "120%",
3262
+ // Wider for parallax gap
3263
+ height: "100%",
3264
+ objectFit: "cover",
3265
+ pointerEvents: "none",
3266
+ transform: "translateX(0)"
3267
+ },
3268
+ overlay: {
3269
+ position: "absolute",
3270
+ inset: 0,
3271
+ background: "linear-gradient(to top, rgba(0,0,0,0.8) 0%, transparent 60%)",
3272
+ opacity: 0,
3273
+ display: "flex",
3274
+ flexDirection: "column",
3275
+ justifyContent: "flex-end",
3276
+ padding: "30px",
3277
+ color: "#fff",
3278
+ zIndex: 2,
3279
+ pointerEvents: "none"
3280
+ },
3281
+ title: {
3282
+ fontSize: "24px",
3283
+ fontWeight: "800",
3284
+ marginBottom: "8px",
3285
+ fontFamily: '"Inter", sans-serif',
3286
+ textTransform: "uppercase",
3287
+ letterSpacing: "2px"
3288
+ },
3289
+ subtitle: {
3290
+ fontSize: "12px",
3291
+ opacity: 0.6,
3292
+ textTransform: "uppercase",
3293
+ letterSpacing: "4px"
3294
+ },
3295
+ navIndicator: {
3296
+ position: "absolute",
3297
+ bottom: "10vh",
3298
+ left: "50%",
3299
+ transform: "translateX(-50%)",
3300
+ color: "rgba(255,255,255,0.2)",
3301
+ fontSize: "12px",
3302
+ textTransform: "uppercase",
3303
+ letterSpacing: "5px",
3304
+ zIndex: 10
3305
+ }
3306
+ };
3307
+ return /* @__PURE__ */ import_react14.default.createElement("div", { ref: sectionRef, style: styles.section }, /* @__PURE__ */ import_react14.default.createElement("div", { style: styles.navIndicator }, "Scroll To Explore"), /* @__PURE__ */ import_react14.default.createElement("div", { ref: containerRef, style: styles.container }, images.map((img, i) => /* @__PURE__ */ import_react14.default.createElement(
3308
+ "div",
3309
+ {
3310
+ key: img.id,
3311
+ ref: (el) => imageRefs.current[i] = el,
3312
+ style: styles.imageItem,
3313
+ onMouseEnter: handleMouseEnter,
3314
+ onMouseLeave: handleMouseLeave,
3315
+ onClick: () => handleNavigate(img.path)
3316
+ },
3317
+ /* @__PURE__ */ import_react14.default.createElement("div", { className: "overlay", style: styles.overlay }, /* @__PURE__ */ import_react14.default.createElement("span", { style: styles.subtitle }, "Gallery Item 0", i + 1), /* @__PURE__ */ import_react14.default.createElement("h3", { style: styles.title }, img.title), /* @__PURE__ */ import_react14.default.createElement("div", { style: { display: "flex", alignItems: "center", gap: "8px", color: accentColor } }, "View Project ", /* @__PURE__ */ import_react14.default.createElement(import_fi13.FiArrowRight, null))),
3318
+ /* @__PURE__ */ import_react14.default.createElement("img", { src: img.src, alt: img.title, style: styles.image })
3319
+ ))));
3320
+ };
3321
+
3322
+ // src/components/Testimonial/Testimonial.jsx
3323
+ var import_react15 = __toESM(require("react"));
3324
+ var import_gsap15 = require("gsap");
3325
+ var import_fi14 = require("react-icons/fi");
3326
+ var import_hi = require("react-icons/hi");
3327
+ var Testimonials = ({
3328
+ items = [
3329
+ {
3330
+ id: 1,
3331
+ name: "Alex Rivera",
3332
+ role: "Director of Product",
3333
+ company: "Linear",
3334
+ content: "The attention to detail in Aura's design system is unprecedented. It transformed our workflow in weeks.",
3335
+ rating: 5,
3336
+ avatar: "https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?auto=format&fit=crop&q=80&w=150"
3337
+ },
3338
+ {
3339
+ id: 2,
3340
+ name: "Sarah Chen",
3341
+ role: "Lead Designer",
3342
+ company: "Stripe",
3343
+ content: "Fluidity and performance are at the core of these components. The GSAP integrations are truly world-class.",
3344
+ rating: 5,
3345
+ avatar: "https://images.unsplash.com/photo-1438761681033-6461ffad8d80?auto=format&fit=crop&q=80&w=150"
3346
+ },
3347
+ {
3348
+ id: 3,
3349
+ name: "Marcus Thorne",
3350
+ role: "Founding Engineer",
3351
+ company: "Vercel",
3352
+ content: "Clean, performant, and absolutely stunning. Aura is the benchmark for modern React components.",
3353
+ rating: 5,
3354
+ avatar: "https://images.unsplash.com/photo-1500648767791-00dcc994a43e?auto=format&fit=crop&q=80&w=150"
3355
+ }
3356
+ ],
3357
+ accentColor = "#6366f1",
3358
+ bgColor = "rgba(255, 255, 255, 0.03)",
3359
+ textColor = "#ffffff",
3360
+ animationDuration = 1.2,
3361
+ easing = "power4.out"
3362
+ }) => {
3363
+ const containerRef = (0, import_react15.useRef)(null);
3364
+ const cardRefs = (0, import_react15.useRef)([]);
3365
+ const titleRef = (0, import_react15.useRef)(null);
3366
+ (0, import_react15.useEffect)(() => {
3367
+ const ctx = import_gsap15.gsap.context(() => {
3368
+ const tl = import_gsap15.gsap.timeline({ defaults: { ease: easing, duration: animationDuration } });
3369
+ tl.fromTo(
3370
+ titleRef.current,
3371
+ { opacity: 0, y: 30 },
3372
+ { opacity: 1, y: 0 }
3373
+ ).fromTo(
3374
+ cardRefs.current,
3375
+ {
3376
+ opacity: 0,
3377
+ y: 50,
3378
+ scale: 0.95,
3379
+ filter: "blur(10px)"
3380
+ },
3381
+ {
3382
+ opacity: 1,
3383
+ y: 0,
3384
+ scale: 1,
3385
+ filter: "blur(0px)",
3386
+ stagger: 0.15,
3387
+ clearProps: "filter"
3388
+ },
3389
+ "-=0.8"
3390
+ );
3391
+ }, containerRef);
3392
+ return () => ctx.revert();
3393
+ }, [items, animationDuration, easing]);
3394
+ const handleCardHover = (e, index) => {
3395
+ import_gsap15.gsap.to(cardRefs.current[index], {
3396
+ y: -12,
3397
+ scale: 1.02,
3398
+ backgroundColor: "rgba(255, 255, 255, 0.06)",
3399
+ borderColor: accentColor,
3400
+ duration: 0.4,
3401
+ ease: "power2.out"
3402
+ });
3403
+ const icon = cardRefs.current[index].querySelector(".quote-icon");
3404
+ import_gsap15.gsap.to(icon, {
3405
+ scale: 1.2,
3406
+ rotate: 15,
3407
+ color: accentColor,
3408
+ duration: 0.4
3409
+ });
3410
+ };
3411
+ const handleCardLeave = (index) => {
3412
+ import_gsap15.gsap.to(cardRefs.current[index], {
3413
+ y: 0,
3414
+ scale: 1,
3415
+ backgroundColor: bgColor,
3416
+ borderColor: "rgba(255, 255, 255, 0.05)",
3417
+ duration: 0.5,
3418
+ ease: "power2.inOut"
3419
+ });
3420
+ const icon = cardRefs.current[index].querySelector(".quote-icon");
3421
+ import_gsap15.gsap.to(icon, {
3422
+ scale: 1,
3423
+ rotate: 0,
3424
+ color: "rgba(255, 255, 255, 0.2)",
3425
+ duration: 0.5
3426
+ });
3427
+ };
3428
+ const styles = {
3429
+ section: {
3430
+ padding: "120px 5%",
3431
+ backgroundColor: "transparent",
3432
+ fontFamily: '"Inter", -apple-system, sans-serif',
3433
+ color: textColor,
3434
+ width: "100%",
3435
+ boxSizing: "border-box"
3436
+ },
3437
+ header: {
3438
+ textAlign: "center",
3439
+ marginBottom: "80px"
3440
+ },
3441
+ title: {
3442
+ fontSize: "clamp(32px, 5vw, 64px)",
3443
+ fontWeight: "900",
3444
+ letterSpacing: "-2px",
3445
+ marginBottom: "16px"
3446
+ },
3447
+ subtitle: {
3448
+ fontSize: "16px",
3449
+ opacity: 0.5,
3450
+ letterSpacing: "2px",
3451
+ textTransform: "uppercase"
3452
+ },
3453
+ grid: {
3454
+ display: "grid",
3455
+ gridTemplateColumns: "repeat(auto-fit, minmax(320px, 1fr))",
3456
+ gap: "32px",
3457
+ maxWidth: "1200px",
3458
+ margin: "0 auto"
3459
+ },
3460
+ card: {
3461
+ position: "relative",
3462
+ padding: "48px",
3463
+ backgroundColor: bgColor,
3464
+ borderRadius: "32px",
3465
+ border: "1px solid rgba(255, 255, 255, 0.05)",
3466
+ backdropFilter: "blur(16px)",
3467
+ WebkitBackdropFilter: "blur(16px)",
3468
+ cursor: "pointer",
3469
+ willChange: "transform, opacity",
3470
+ transition: "border-color 0.3s ease"
3471
+ },
3472
+ quoteIcon: {
3473
+ position: "absolute",
3474
+ top: "32px",
3475
+ right: "40px",
3476
+ fontSize: "32px",
3477
+ color: "rgba(255, 255, 255, 0.1)",
3478
+ willChange: "transform"
3479
+ },
3480
+ content: {
3481
+ fontSize: "18px",
3482
+ lineHeight: "1.6",
3483
+ marginBottom: "32px",
3484
+ position: "relative",
3485
+ fontWeight: "500"
3486
+ },
3487
+ footer: {
3488
+ display: "flex",
3489
+ alignItems: "center",
3490
+ gap: "16px"
3491
+ },
3492
+ avatar: {
3493
+ width: "56px",
3494
+ height: "56px",
3495
+ borderRadius: "16px",
3496
+ objectFit: "cover",
3497
+ border: `2px solid ${accentColor}33`
3498
+ },
3499
+ info: {
3500
+ display: "flex",
3501
+ flexDirection: "column"
3502
+ },
3503
+ name: {
3504
+ fontSize: "16px",
3505
+ fontWeight: "700"
3506
+ },
3507
+ role: {
3508
+ fontSize: "13px",
3509
+ opacity: 0.5
3510
+ },
3511
+ stars: {
3512
+ display: "flex",
3513
+ gap: "2px",
3514
+ color: "#fbbf24",
3515
+ marginBottom: "16px"
3516
+ }
3517
+ };
3518
+ return /* @__PURE__ */ import_react15.default.createElement("section", { ref: containerRef, style: styles.section }, /* @__PURE__ */ import_react15.default.createElement("div", { style: styles.header }, /* @__PURE__ */ import_react15.default.createElement("span", { style: styles.subtitle }, "Testimonials"), /* @__PURE__ */ import_react15.default.createElement("h2", { ref: titleRef, style: styles.title }, "Trusted by Visionaries")), /* @__PURE__ */ import_react15.default.createElement("div", { style: styles.grid }, items.map((item, i) => /* @__PURE__ */ import_react15.default.createElement(
3519
+ "div",
3520
+ {
3521
+ key: item.id,
3522
+ ref: (el) => cardRefs.current[i] = el,
3523
+ style: styles.card,
3524
+ onMouseEnter: (e) => handleCardHover(e, i),
3525
+ onMouseLeave: () => handleCardLeave(i)
3526
+ },
3527
+ /* @__PURE__ */ import_react15.default.createElement("div", { className: "quote-icon", style: styles.quoteIcon }, /* @__PURE__ */ import_react15.default.createElement(import_hi.HiQuoteLeft, null)),
3528
+ /* @__PURE__ */ import_react15.default.createElement("div", { style: styles.stars }, [...Array(item.rating)].map((_, i2) => /* @__PURE__ */ import_react15.default.createElement(import_fi14.FiStar, { key: i2 }))),
3529
+ /* @__PURE__ */ import_react15.default.createElement("p", { style: styles.content }, '"', item.content, '"'),
3530
+ /* @__PURE__ */ import_react15.default.createElement("div", { style: styles.footer }, /* @__PURE__ */ import_react15.default.createElement("img", { src: item.avatar, alt: item.name, style: styles.avatar }), /* @__PURE__ */ import_react15.default.createElement("div", { style: styles.info }, /* @__PURE__ */ import_react15.default.createElement("span", { style: styles.name }, item.name), /* @__PURE__ */ import_react15.default.createElement("span", { style: styles.role }, item.role, " @ ", item.company)))
3531
+ ))));
3532
+ };
3533
+
3534
+ // src/components/Footer/Footer.jsx
3535
+ var import_react16 = __toESM(require("react"));
3536
+ var import_react_router_dom13 = require("react-router-dom");
3537
+ var import_gsap16 = require("gsap");
3538
+ var import_fi15 = require("react-icons/fi");
3539
+ var Footer = ({
3540
+ brandName = "AURA",
3541
+ accentColor = "#6366f1",
3542
+ bgColor = "#0a0a0a",
3543
+ textColor = "#ffffff",
3544
+ navLinks = [
3545
+ { label: "Home", path: "/" },
3546
+ { label: "Components", path: "/components" },
3547
+ { label: "Showcase", path: "/showcase" },
3548
+ { label: "Documentation", path: "/docs" }
3549
+ ],
3550
+ socialLinks = [
3551
+ { icon: /* @__PURE__ */ import_react16.default.createElement(import_fi15.FiGithub, null), url: "https://github.com" },
3552
+ { icon: /* @__PURE__ */ import_react16.default.createElement(import_fi15.FiTwitter, null), url: "https://twitter.com" },
3553
+ { icon: /* @__PURE__ */ import_react16.default.createElement(import_fi15.FiLinkedin, null), url: "https://linkedin.com" },
3554
+ { icon: /* @__PURE__ */ import_react16.default.createElement(import_fi15.FiInstagram, null), url: "https://instagram.com" }
3555
+ ],
3556
+ animationDuration = 1.2,
3557
+ easing = "power4.out"
3558
+ }) => {
3559
+ const footerRef = (0, import_react16.useRef)(null);
3560
+ const topBtnRef = (0, import_react16.useRef)(null);
3561
+ const columnRefs = (0, import_react16.useRef)([]);
3562
+ const socialRefs = (0, import_react16.useRef)([]);
3563
+ const inRouter = (0, import_react_router_dom13.useInRouterContext)();
3564
+ const navigate = inRouter ? (0, import_react_router_dom13.useNavigate)() : null;
3565
+ const handleNavigate = (path) => {
3566
+ if (path) {
3567
+ if (navigate) navigate(path);
3568
+ else window.location.assign(path);
3569
+ }
3570
+ };
3571
+ const scrollToTop = () => {
3572
+ window.scrollTo({ top: 0, behavior: "smooth" });
3573
+ };
3574
+ (0, import_react16.useEffect)(() => {
3575
+ const ctx = import_gsap16.gsap.context(() => {
3576
+ const tl = import_gsap16.gsap.timeline({
3577
+ scrollTrigger: {
3578
+ trigger: footerRef.current,
3579
+ start: "top bottom-=100px"
3580
+ }
3581
+ });
3582
+ tl.fromTo(
3583
+ columnRefs.current,
3584
+ { opacity: 0, y: 30 },
3585
+ {
3586
+ opacity: 1,
3587
+ y: 0,
3588
+ stagger: 0.1,
3589
+ duration: animationDuration,
3590
+ ease: easing
3591
+ }
3592
+ ).fromTo(
3593
+ socialRefs.current,
3594
+ { opacity: 0, scale: 0.8 },
3595
+ {
3596
+ opacity: 1,
3597
+ scale: 1,
3598
+ stagger: 0.1,
3599
+ duration: 0.8,
3600
+ ease: "back.out(2)"
3601
+ },
3602
+ "-=0.5"
3603
+ );
3604
+ }, footerRef);
3605
+ return () => ctx.revert();
3606
+ }, [animationDuration, easing]);
3607
+ const handleSocialMove = (e, index) => {
3608
+ const { clientX, clientY, currentTarget } = e;
3609
+ const { left, top, width, height } = currentTarget.getBoundingClientRect();
3610
+ const x = (clientX - (left + width / 2)) * 0.4;
3611
+ const y = (clientY - (top + height / 2)) * 0.4;
3612
+ import_gsap16.gsap.to(currentTarget, {
3613
+ x,
3614
+ y,
3615
+ duration: 0.3,
3616
+ ease: "power2.out"
3617
+ });
3618
+ };
3619
+ const handleSocialLeave = (index) => {
3620
+ import_gsap16.gsap.to(socialRefs.current[index], {
3621
+ x: 0,
3622
+ y: 0,
3623
+ duration: 0.6,
3624
+ ease: "elastic.out(1, 0.3)"
3625
+ });
3626
+ };
3627
+ const styles = {
3628
+ footer: {
3629
+ position: "relative",
3630
+ width: "100%",
3631
+ backgroundColor: bgColor,
3632
+ color: textColor,
3633
+ padding: "80px 5% 40px",
3634
+ fontFamily: '"Inter", sans-serif',
3635
+ boxSizing: "border-box",
3636
+ overflow: "hidden"
3637
+ },
3638
+ grid: {
3639
+ display: "grid",
3640
+ gridTemplateColumns: "repeat(auto-fit, minmax(200px, 1fr))",
3641
+ gap: "40px",
3642
+ marginBottom: "60px"
3643
+ },
3644
+ brandColumn: {
3645
+ gridColumn: "span 1"
3646
+ },
3647
+ brandTitle: {
3648
+ fontSize: "32px",
3649
+ fontWeight: "900",
3650
+ letterSpacing: "-1.5px",
3651
+ marginBottom: "20px",
3652
+ color: accentColor
3653
+ },
3654
+ brandDesc: {
3655
+ fontSize: "14px",
3656
+ lineHeight: "1.6",
3657
+ opacity: 0.5,
3658
+ maxWidth: "240px"
3659
+ },
3660
+ colTitle: {
3661
+ fontSize: "16px",
3662
+ fontWeight: "700",
3663
+ marginBottom: "24px",
3664
+ textTransform: "uppercase",
3665
+ letterSpacing: "1px"
3666
+ },
3667
+ link: {
3668
+ display: "block",
3669
+ fontSize: "14px",
3670
+ color: textColor,
3671
+ textDecoration: "none",
3672
+ marginBottom: "12px",
3673
+ opacity: 0.5,
3674
+ transition: "opacity 0.3s ease, color 0.3s ease",
3675
+ cursor: "pointer"
3676
+ },
3677
+ socialContainer: {
3678
+ display: "flex",
3679
+ gap: "16px",
3680
+ marginTop: "20px"
3681
+ },
3682
+ socialIcon: {
3683
+ width: "40px",
3684
+ height: "40px",
3685
+ borderRadius: "12px",
3686
+ backgroundColor: "rgba(255, 255, 255, 0.05)",
3687
+ display: "flex",
3688
+ alignItems: "center",
3689
+ justifyContent: "center",
3690
+ fontSize: "20px",
3691
+ color: textColor,
3692
+ cursor: "pointer",
3693
+ transition: "background-color 0.3s ease",
3694
+ willChange: "transform"
3695
+ },
3696
+ bottom: {
3697
+ display: "flex",
3698
+ justifyContent: "space-between",
3699
+ alignItems: "center",
3700
+ paddingTop: "40px",
3701
+ borderTop: "1px solid rgba(255, 255, 255, 0.05)",
3702
+ fontSize: "12px",
3703
+ opacity: 0.3
3704
+ },
3705
+ topBtn: {
3706
+ position: "absolute",
3707
+ top: "40px",
3708
+ right: "5%",
3709
+ width: "50px",
3710
+ height: "50px",
3711
+ borderRadius: "15px",
3712
+ backgroundColor: accentColor,
3713
+ color: "#fff",
3714
+ display: "flex",
3715
+ alignItems: "center",
3716
+ justifyContent: "center",
3717
+ fontSize: "20px",
3718
+ cursor: "pointer",
3719
+ border: "none",
3720
+ boxShadow: `0 10px 20px ${accentColor}33`,
3721
+ willChange: "transform"
3722
+ }
3723
+ };
3724
+ return /* @__PURE__ */ import_react16.default.createElement("footer", { ref: footerRef, style: styles.footer }, /* @__PURE__ */ import_react16.default.createElement(
3725
+ "button",
3726
+ {
3727
+ ref: topBtnRef,
3728
+ style: styles.topBtn,
3729
+ onClick: scrollToTop,
3730
+ onMouseEnter: (e) => import_gsap16.gsap.to(e.currentTarget, { scale: 1.1, y: -5, duration: 0.3 }),
3731
+ onMouseLeave: (e) => import_gsap16.gsap.to(e.currentTarget, { scale: 1, y: 0, duration: 0.3 })
3732
+ },
3733
+ /* @__PURE__ */ import_react16.default.createElement(import_fi15.FiArrowUp, null)
3734
+ ), /* @__PURE__ */ import_react16.default.createElement("div", { style: styles.grid }, /* @__PURE__ */ import_react16.default.createElement("div", { ref: (el) => columnRefs.current[0] = el, style: styles.brandColumn }, /* @__PURE__ */ import_react16.default.createElement("div", { style: styles.brandTitle }, brandName), /* @__PURE__ */ import_react16.default.createElement("p", { style: styles.brandDesc }, "Elevating digital experiences with cinematic design systems and high-performance React components."), /* @__PURE__ */ import_react16.default.createElement("div", { style: styles.socialContainer }, socialLinks.map((social, i) => /* @__PURE__ */ import_react16.default.createElement(
3735
+ "a",
3736
+ {
3737
+ key: i,
3738
+ href: social.url,
3739
+ target: "_blank",
3740
+ rel: "noopener noreferrer",
3741
+ ref: (el) => socialRefs.current[i] = el,
3742
+ style: styles.socialIcon,
3743
+ onMouseMove: (e) => handleSocialMove(e, i),
3744
+ onMouseLeave: () => handleSocialLeave(i),
3745
+ onMouseEnter: (e) => e.currentTarget.style.backgroundColor = accentColor
3746
+ },
3747
+ social.icon
3748
+ )))), /* @__PURE__ */ import_react16.default.createElement("div", { ref: (el) => columnRefs.current[1] = el }, /* @__PURE__ */ import_react16.default.createElement("div", { style: styles.colTitle }, "Navigation"), navLinks.map((link, i) => /* @__PURE__ */ import_react16.default.createElement(
3749
+ "span",
3750
+ {
3751
+ key: i,
3752
+ style: styles.link,
3753
+ onClick: () => handleNavigate(link.path),
3754
+ onMouseEnter: (e) => {
3755
+ e.currentTarget.style.opacity = 1;
3756
+ e.currentTarget.style.color = accentColor;
3757
+ },
3758
+ onMouseLeave: (e) => {
3759
+ e.currentTarget.style.opacity = 0.5;
3760
+ e.currentTarget.style.color = textColor;
3761
+ }
3762
+ },
3763
+ link.label
3764
+ ))), /* @__PURE__ */ import_react16.default.createElement("div", { ref: (el) => columnRefs.current[2] = el }, /* @__PURE__ */ import_react16.default.createElement("div", { style: styles.colTitle }, "Support"), /* @__PURE__ */ import_react16.default.createElement("a", { href: "mailto:hello@aura-ui.com", style: styles.link, onMouseEnter: (e) => e.currentTarget.style.opacity = 1, onMouseLeave: (e) => e.currentTarget.style.opacity = 0.5 }, "Help Center"), /* @__PURE__ */ import_react16.default.createElement("a", { href: "#", style: styles.link, onMouseEnter: (e) => e.currentTarget.style.opacity = 1, onMouseLeave: (e) => e.currentTarget.style.opacity = 0.5 }, "Changelog"), /* @__PURE__ */ import_react16.default.createElement("a", { href: "#", style: styles.link, onMouseEnter: (e) => e.currentTarget.style.opacity = 1, onMouseLeave: (e) => e.currentTarget.style.opacity = 0.5 }, "Terms"), /* @__PURE__ */ import_react16.default.createElement("a", { href: "#", style: styles.link, onMouseEnter: (e) => e.currentTarget.style.opacity = 1, onMouseLeave: (e) => e.currentTarget.style.opacity = 0.5 }, "Privacy")), /* @__PURE__ */ import_react16.default.createElement("div", { ref: (el) => columnRefs.current[3] = el }, /* @__PURE__ */ import_react16.default.createElement("div", { style: styles.colTitle }, "Contact"), /* @__PURE__ */ import_react16.default.createElement("div", { style: { ...styles.link, display: "flex", alignItems: "center", gap: "8px" } }, /* @__PURE__ */ import_react16.default.createElement(import_fi15.FiMail, null), " hello@aura-ui.com"), /* @__PURE__ */ import_react16.default.createElement("div", { style: { ...styles.link, display: "flex", alignItems: "center", gap: "8px" } }, /* @__PURE__ */ import_react16.default.createElement(import_fi15.FiMapPin, null), " San Francisco, CA"))), /* @__PURE__ */ import_react16.default.createElement("div", { style: styles.bottom }, /* @__PURE__ */ import_react16.default.createElement("div", null, "\xA9 ", (/* @__PURE__ */ new Date()).getFullYear(), " ", brandName, " UI Library. All rights reserved."), /* @__PURE__ */ import_react16.default.createElement("div", { style: { display: "flex", gap: "20px" } }, /* @__PURE__ */ import_react16.default.createElement("span", null, "Version 1.2.0"), /* @__PURE__ */ import_react16.default.createElement("span", null, "Open Source"))));
2881
3765
  };
2882
3766
  // Annotate the CommonJS export names for ESM import in node:
2883
3767
  0 && (module.exports = {
2884
3768
  Button,
2885
3769
  Carousel,
3770
+ Footer,
3771
+ Grid,
2886
3772
  Image,
3773
+ ImageEffectScrolling,
2887
3774
  Navbar,
2888
3775
  PinterestGrid,
2889
3776
  ProductCard,
@@ -2891,6 +3778,7 @@ var TextImage = ({
2891
3778
  SideBar,
2892
3779
  Skills,
2893
3780
  Spotlight,
3781
+ Testimonials,
2894
3782
  TextImage,
2895
3783
  TextWriting
2896
3784
  });