@nimblegiant/stilts 0.2.0-alpha.1 → 0.2.0-alpha.4

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/index.d.cts CHANGED
@@ -4,8 +4,12 @@ import React$1, { ReactNode, ElementType } from 'react';
4
4
  interface MainNavProps {
5
5
  currentPath: string;
6
6
  isPortfolioPage?: boolean;
7
+ navLinks?: {
8
+ href: string;
9
+ label: string;
10
+ }[];
7
11
  }
8
- declare function MainNav({ currentPath, isPortfolioPage }: MainNavProps): react_jsx_runtime.JSX.Element;
12
+ declare function MainNav({ currentPath, isPortfolioPage, navLinks, }: MainNavProps): react_jsx_runtime.JSX.Element;
9
13
 
10
14
  /**
11
15
  * TopBanner Component
@@ -36,12 +40,30 @@ declare global {
36
40
  }
37
41
  declare function ToastContainer(): react_jsx_runtime.JSX.Element;
38
42
 
43
+ interface Author {
44
+ name: string;
45
+ url?: string;
46
+ avatar?: string;
47
+ }
48
+ interface AuthorMetaProps {
49
+ author: Author;
50
+ linkable?: boolean;
51
+ }
52
+ /**
53
+ * AuthorMeta Component
54
+ * Displays author information with optional avatar
55
+ */
56
+ declare function AuthorMeta({ author, linkable }: AuthorMetaProps): react_jsx_runtime.JSX.Element;
57
+
39
58
  /**
40
59
  * UI Components
41
60
  */
42
61
 
62
+ type index$1_Author = Author;
63
+ declare const index$1_AuthorMeta: typeof AuthorMeta;
64
+ type index$1_AuthorMetaProps = AuthorMetaProps;
43
65
  declare namespace index$1 {
44
- export { ToastContainer as Toast };
66
+ export { type index$1_Author as Author, index$1_AuthorMeta as AuthorMeta, type index$1_AuthorMetaProps as AuthorMetaProps, ToastContainer as Toast };
45
67
  }
46
68
 
47
69
  /**
@@ -188,7 +210,7 @@ interface ContentPageProps {
188
210
  lastUpdated?: string;
189
211
  children: React.ReactNode;
190
212
  }
191
- declare function ContentPage({ title, subtitle, lastUpdated, children }: ContentPageProps): react_jsx_runtime.JSX.Element;
213
+ declare function ContentPage({ title, subtitle, lastUpdated, children, }: ContentPageProps): react_jsx_runtime.JSX.Element;
192
214
 
193
215
  type TerminalLine = {
194
216
  text: string;
@@ -305,6 +327,33 @@ interface FeatureShowcaseProps {
305
327
  }
306
328
  declare const FeatureShowcase: React$1.FC<FeatureShowcaseProps>;
307
329
 
330
+ interface ListCardProps {
331
+ href: string;
332
+ title: string;
333
+ description: string;
334
+ tagline?: string;
335
+ thumbnail?: string;
336
+ tags?: string[];
337
+ meta?: {
338
+ date?: string;
339
+ author?: Author;
340
+ };
341
+ imageAlt?: string;
342
+ animationDelay?: number;
343
+ specialImageComponent?: boolean;
344
+ imageBgClass?: string;
345
+ imageDark?: string;
346
+ imageLight?: string;
347
+ children?: ReactNode;
348
+ footerSlot?: ReactNode;
349
+ }
350
+ /**
351
+ * ListCard Component
352
+ * Displays a card with optional image, title, description, meta, and tags
353
+ * Used for products, blog posts, and other list items
354
+ */
355
+ declare function ListCard({ href, title, description, tagline, thumbnail, tags, meta, imageAlt, animationDelay, specialImageComponent, imageBgClass, children, imageDark, imageLight, footerSlot, }: ListCardProps): react_jsx_runtime.JSX.Element;
356
+
308
357
  /**
309
358
  * Pattern Components
310
359
  */
@@ -318,6 +367,8 @@ type index_Feature = Feature;
318
367
  declare const index_FeatureShowcase: typeof FeatureShowcase;
319
368
  type index_FeatureShowcaseProps = FeatureShowcaseProps;
320
369
  declare const index_IndustryGrid: typeof IndustryGrid;
370
+ declare const index_ListCard: typeof ListCard;
371
+ type index_ListCardProps = ListCardProps;
321
372
  declare const index_PageHero: typeof PageHero;
322
373
  declare const index_ProcessSteps: typeof ProcessSteps;
323
374
  declare const index_ProductCard: typeof ProductCard;
@@ -334,7 +385,7 @@ declare const index_TerminalWindow: typeof TerminalWindow;
334
385
  type index_TerminalWindowProps = TerminalWindowProps;
335
386
  declare const index_VideoHero: typeof VideoHero;
336
387
  declare namespace index {
337
- export { index_CTAButton as CTAButton, type index_CTAButtonProps as CTAButtonProps, index_CodeBlock as CodeBlock, type index_CodeBlockProps as CodeBlockProps, index_ContentPage as ContentPage, type index_Feature as Feature, index_FeatureShowcase as FeatureShowcase, type index_FeatureShowcaseProps as FeatureShowcaseProps, index_IndustryGrid as IndustryGrid, index_PageHero as PageHero, index_ProcessSteps as ProcessSteps, index_ProductCard as ProductCard, type index_ProductCardProps as ProductCardProps, index_ServiceSection as ServiceSection, index_StatBar as StatBar, index_TeamGrid as TeamGrid, index_TerminalChrome as TerminalChrome, type index_TerminalChromeProps as TerminalChromeProps, index_TerminalHero as TerminalHero, type index_TerminalHeroProps as TerminalHeroProps, type index_TerminalLine as TerminalLine, index_TerminalWindow as TerminalWindow, type index_TerminalWindowProps as TerminalWindowProps, index_VideoHero as VideoHero };
388
+ export { index_CTAButton as CTAButton, type index_CTAButtonProps as CTAButtonProps, index_CodeBlock as CodeBlock, type index_CodeBlockProps as CodeBlockProps, index_ContentPage as ContentPage, type index_Feature as Feature, index_FeatureShowcase as FeatureShowcase, type index_FeatureShowcaseProps as FeatureShowcaseProps, index_IndustryGrid as IndustryGrid, index_ListCard as ListCard, type index_ListCardProps as ListCardProps, index_PageHero as PageHero, index_ProcessSteps as ProcessSteps, index_ProductCard as ProductCard, type index_ProductCardProps as ProductCardProps, index_ServiceSection as ServiceSection, index_StatBar as StatBar, index_TeamGrid as TeamGrid, index_TerminalChrome as TerminalChrome, type index_TerminalChromeProps as TerminalChromeProps, index_TerminalHero as TerminalHero, type index_TerminalHeroProps as TerminalHeroProps, type index_TerminalLine as TerminalLine, index_TerminalWindow as TerminalWindow, type index_TerminalWindowProps as TerminalWindowProps, index_VideoHero as VideoHero };
338
389
  }
339
390
 
340
391
  /**
@@ -842,4 +893,4 @@ type Theme = 'light' | 'dark';
842
893
  type Alignment = 'left' | 'center' | 'right';
843
894
  type GridCols = 2 | 3 | 4;
844
895
 
845
- export { type Alignment, type BaseComponentProps, BeforeAfter, CTAButton, type CTAButtonProps, CaseStudyBreakdown, CodeBlock, type CodeBlockProps, type ColorToken, CompactContactForm, ContactForm, ContentPage, type DurationToken, type EasingToken, type Feature, FeatureShowcase, type FeatureShowcaseProps, FullWidthImage, type GridCols, ImageGrid, ImageGridModal, IndustryGrid, index$2 as Layout, type LinkLike, MainNav, PageHero, index as Patterns, ProblemStatement, ProcessSteps, ProcessTimeline, ProductCard, type ProductCardProps, RelatedProjects, type SectionPaddingToken, ServiceSection, SolutionSummary, type SpacingToken, StatBar, TeamCredits, TeamGrid, TerminalChrome, type TerminalChromeProps, TerminalHero, type TerminalHeroProps, type TerminalLine, TerminalWindow, type TerminalWindowProps, Testimonial, TextBlock, type Theme, ToastContainer as Toast, TopBanner, index$1 as UI, VideoHero, VideoSection, colors, durations, easings, sectionPadding, spacing };
896
+ export { type Alignment, type Author, AuthorMeta, type AuthorMetaProps, type BaseComponentProps, BeforeAfter, CTAButton, type CTAButtonProps, CaseStudyBreakdown, CodeBlock, type CodeBlockProps, type ColorToken, CompactContactForm, ContactForm, ContentPage, type DurationToken, type EasingToken, type Feature, FeatureShowcase, type FeatureShowcaseProps, FullWidthImage, type GridCols, ImageGrid, ImageGridModal, IndustryGrid, index$2 as Layout, type LinkLike, ListCard, type ListCardProps, MainNav, PageHero, index as Patterns, ProblemStatement, ProcessSteps, ProcessTimeline, ProductCard, type ProductCardProps, RelatedProjects, type SectionPaddingToken, ServiceSection, SolutionSummary, type SpacingToken, StatBar, TeamCredits, TeamGrid, TerminalChrome, type TerminalChromeProps, TerminalHero, type TerminalHeroProps, type TerminalLine, TerminalWindow, type TerminalWindowProps, Testimonial, TextBlock, type Theme, ToastContainer as Toast, TopBanner, index$1 as UI, VideoHero, VideoSection, colors, durations, easings, sectionPadding, spacing };
package/dist/index.d.ts CHANGED
@@ -4,8 +4,12 @@ import React$1, { ReactNode, ElementType } from 'react';
4
4
  interface MainNavProps {
5
5
  currentPath: string;
6
6
  isPortfolioPage?: boolean;
7
+ navLinks?: {
8
+ href: string;
9
+ label: string;
10
+ }[];
7
11
  }
8
- declare function MainNav({ currentPath, isPortfolioPage }: MainNavProps): react_jsx_runtime.JSX.Element;
12
+ declare function MainNav({ currentPath, isPortfolioPage, navLinks, }: MainNavProps): react_jsx_runtime.JSX.Element;
9
13
 
10
14
  /**
11
15
  * TopBanner Component
@@ -36,12 +40,30 @@ declare global {
36
40
  }
37
41
  declare function ToastContainer(): react_jsx_runtime.JSX.Element;
38
42
 
43
+ interface Author {
44
+ name: string;
45
+ url?: string;
46
+ avatar?: string;
47
+ }
48
+ interface AuthorMetaProps {
49
+ author: Author;
50
+ linkable?: boolean;
51
+ }
52
+ /**
53
+ * AuthorMeta Component
54
+ * Displays author information with optional avatar
55
+ */
56
+ declare function AuthorMeta({ author, linkable }: AuthorMetaProps): react_jsx_runtime.JSX.Element;
57
+
39
58
  /**
40
59
  * UI Components
41
60
  */
42
61
 
62
+ type index$1_Author = Author;
63
+ declare const index$1_AuthorMeta: typeof AuthorMeta;
64
+ type index$1_AuthorMetaProps = AuthorMetaProps;
43
65
  declare namespace index$1 {
44
- export { ToastContainer as Toast };
66
+ export { type index$1_Author as Author, index$1_AuthorMeta as AuthorMeta, type index$1_AuthorMetaProps as AuthorMetaProps, ToastContainer as Toast };
45
67
  }
46
68
 
47
69
  /**
@@ -188,7 +210,7 @@ interface ContentPageProps {
188
210
  lastUpdated?: string;
189
211
  children: React.ReactNode;
190
212
  }
191
- declare function ContentPage({ title, subtitle, lastUpdated, children }: ContentPageProps): react_jsx_runtime.JSX.Element;
213
+ declare function ContentPage({ title, subtitle, lastUpdated, children, }: ContentPageProps): react_jsx_runtime.JSX.Element;
192
214
 
193
215
  type TerminalLine = {
194
216
  text: string;
@@ -305,6 +327,33 @@ interface FeatureShowcaseProps {
305
327
  }
306
328
  declare const FeatureShowcase: React$1.FC<FeatureShowcaseProps>;
307
329
 
330
+ interface ListCardProps {
331
+ href: string;
332
+ title: string;
333
+ description: string;
334
+ tagline?: string;
335
+ thumbnail?: string;
336
+ tags?: string[];
337
+ meta?: {
338
+ date?: string;
339
+ author?: Author;
340
+ };
341
+ imageAlt?: string;
342
+ animationDelay?: number;
343
+ specialImageComponent?: boolean;
344
+ imageBgClass?: string;
345
+ imageDark?: string;
346
+ imageLight?: string;
347
+ children?: ReactNode;
348
+ footerSlot?: ReactNode;
349
+ }
350
+ /**
351
+ * ListCard Component
352
+ * Displays a card with optional image, title, description, meta, and tags
353
+ * Used for products, blog posts, and other list items
354
+ */
355
+ declare function ListCard({ href, title, description, tagline, thumbnail, tags, meta, imageAlt, animationDelay, specialImageComponent, imageBgClass, children, imageDark, imageLight, footerSlot, }: ListCardProps): react_jsx_runtime.JSX.Element;
356
+
308
357
  /**
309
358
  * Pattern Components
310
359
  */
@@ -318,6 +367,8 @@ type index_Feature = Feature;
318
367
  declare const index_FeatureShowcase: typeof FeatureShowcase;
319
368
  type index_FeatureShowcaseProps = FeatureShowcaseProps;
320
369
  declare const index_IndustryGrid: typeof IndustryGrid;
370
+ declare const index_ListCard: typeof ListCard;
371
+ type index_ListCardProps = ListCardProps;
321
372
  declare const index_PageHero: typeof PageHero;
322
373
  declare const index_ProcessSteps: typeof ProcessSteps;
323
374
  declare const index_ProductCard: typeof ProductCard;
@@ -334,7 +385,7 @@ declare const index_TerminalWindow: typeof TerminalWindow;
334
385
  type index_TerminalWindowProps = TerminalWindowProps;
335
386
  declare const index_VideoHero: typeof VideoHero;
336
387
  declare namespace index {
337
- export { index_CTAButton as CTAButton, type index_CTAButtonProps as CTAButtonProps, index_CodeBlock as CodeBlock, type index_CodeBlockProps as CodeBlockProps, index_ContentPage as ContentPage, type index_Feature as Feature, index_FeatureShowcase as FeatureShowcase, type index_FeatureShowcaseProps as FeatureShowcaseProps, index_IndustryGrid as IndustryGrid, index_PageHero as PageHero, index_ProcessSteps as ProcessSteps, index_ProductCard as ProductCard, type index_ProductCardProps as ProductCardProps, index_ServiceSection as ServiceSection, index_StatBar as StatBar, index_TeamGrid as TeamGrid, index_TerminalChrome as TerminalChrome, type index_TerminalChromeProps as TerminalChromeProps, index_TerminalHero as TerminalHero, type index_TerminalHeroProps as TerminalHeroProps, type index_TerminalLine as TerminalLine, index_TerminalWindow as TerminalWindow, type index_TerminalWindowProps as TerminalWindowProps, index_VideoHero as VideoHero };
388
+ export { index_CTAButton as CTAButton, type index_CTAButtonProps as CTAButtonProps, index_CodeBlock as CodeBlock, type index_CodeBlockProps as CodeBlockProps, index_ContentPage as ContentPage, type index_Feature as Feature, index_FeatureShowcase as FeatureShowcase, type index_FeatureShowcaseProps as FeatureShowcaseProps, index_IndustryGrid as IndustryGrid, index_ListCard as ListCard, type index_ListCardProps as ListCardProps, index_PageHero as PageHero, index_ProcessSteps as ProcessSteps, index_ProductCard as ProductCard, type index_ProductCardProps as ProductCardProps, index_ServiceSection as ServiceSection, index_StatBar as StatBar, index_TeamGrid as TeamGrid, index_TerminalChrome as TerminalChrome, type index_TerminalChromeProps as TerminalChromeProps, index_TerminalHero as TerminalHero, type index_TerminalHeroProps as TerminalHeroProps, type index_TerminalLine as TerminalLine, index_TerminalWindow as TerminalWindow, type index_TerminalWindowProps as TerminalWindowProps, index_VideoHero as VideoHero };
338
389
  }
339
390
 
340
391
  /**
@@ -842,4 +893,4 @@ type Theme = 'light' | 'dark';
842
893
  type Alignment = 'left' | 'center' | 'right';
843
894
  type GridCols = 2 | 3 | 4;
844
895
 
845
- export { type Alignment, type BaseComponentProps, BeforeAfter, CTAButton, type CTAButtonProps, CaseStudyBreakdown, CodeBlock, type CodeBlockProps, type ColorToken, CompactContactForm, ContactForm, ContentPage, type DurationToken, type EasingToken, type Feature, FeatureShowcase, type FeatureShowcaseProps, FullWidthImage, type GridCols, ImageGrid, ImageGridModal, IndustryGrid, index$2 as Layout, type LinkLike, MainNav, PageHero, index as Patterns, ProblemStatement, ProcessSteps, ProcessTimeline, ProductCard, type ProductCardProps, RelatedProjects, type SectionPaddingToken, ServiceSection, SolutionSummary, type SpacingToken, StatBar, TeamCredits, TeamGrid, TerminalChrome, type TerminalChromeProps, TerminalHero, type TerminalHeroProps, type TerminalLine, TerminalWindow, type TerminalWindowProps, Testimonial, TextBlock, type Theme, ToastContainer as Toast, TopBanner, index$1 as UI, VideoHero, VideoSection, colors, durations, easings, sectionPadding, spacing };
896
+ export { type Alignment, type Author, AuthorMeta, type AuthorMetaProps, type BaseComponentProps, BeforeAfter, CTAButton, type CTAButtonProps, CaseStudyBreakdown, CodeBlock, type CodeBlockProps, type ColorToken, CompactContactForm, ContactForm, ContentPage, type DurationToken, type EasingToken, type Feature, FeatureShowcase, type FeatureShowcaseProps, FullWidthImage, type GridCols, ImageGrid, ImageGridModal, IndustryGrid, index$2 as Layout, type LinkLike, ListCard, type ListCardProps, MainNav, PageHero, index as Patterns, ProblemStatement, ProcessSteps, ProcessTimeline, ProductCard, type ProductCardProps, RelatedProjects, type SectionPaddingToken, ServiceSection, SolutionSummary, type SpacingToken, StatBar, TeamCredits, TeamGrid, TerminalChrome, type TerminalChromeProps, TerminalHero, type TerminalHeroProps, type TerminalLine, TerminalWindow, type TerminalWindowProps, Testimonial, TextBlock, type Theme, ToastContainer as Toast, TopBanner, index$1 as UI, VideoHero, VideoSection, colors, durations, easings, sectionPadding, spacing };
package/dist/index.js CHANGED
@@ -14,7 +14,11 @@ __export(layout_exports, {
14
14
  MainNav: () => MainNav,
15
15
  TopBanner: () => TopBanner
16
16
  });
17
- function MainNav({ currentPath, isPortfolioPage = false }) {
17
+ function MainNav({
18
+ currentPath,
19
+ isPortfolioPage = false,
20
+ navLinks = []
21
+ }) {
18
22
  const [theme, setTheme] = useState(() => {
19
23
  if (typeof document !== "undefined") {
20
24
  return document.documentElement.getAttribute("data-theme") || "light";
@@ -62,12 +66,6 @@ function MainNav({ currentPath, isPortfolioPage = false }) {
62
66
  document.documentElement.setAttribute("data-theme", newTheme);
63
67
  localStorage.setItem("theme", newTheme);
64
68
  }, [theme]);
65
- const navLinks = [
66
- { href: "/", label: "HOME" },
67
- { href: "/about", label: "ABOUT" },
68
- { href: "/services", label: "SERVICES" },
69
- { href: "/contact", label: "CONTACT" }
70
- ];
71
69
  const isActive = (href) => {
72
70
  if (href === "/") return currentPath === "/";
73
71
  return currentPath.startsWith(href);
@@ -169,7 +167,9 @@ function MainNav({ currentPath, isPortfolioPage = false }) {
169
167
  "li",
170
168
  {
171
169
  className: `transition-all duration-300 ${isMenuOpen ? "translate-x-0 opacity-100" : "translate-x-8 opacity-0"} `,
172
- style: { transitionDelay: isMenuOpen ? `${index * 50 + 100}ms` : "0ms" },
170
+ style: {
171
+ transitionDelay: isMenuOpen ? `${index * 50 + 100}ms` : "0ms"
172
+ },
173
173
  children: /* @__PURE__ */ jsxs(
174
174
  "a",
175
175
  {
@@ -295,6 +295,7 @@ function TopBanner() {
295
295
  // src/components/ui/index.ts
296
296
  var ui_exports = {};
297
297
  __export(ui_exports, {
298
+ AuthorMeta: () => AuthorMeta,
298
299
  Toast: () => ToastContainer
299
300
  });
300
301
  var icons = {
@@ -396,6 +397,30 @@ function ToastContainer() {
396
397
  }
397
398
  );
398
399
  }
400
+ function AuthorMeta({ author, linkable = false }) {
401
+ const content = /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1", children: [
402
+ author.avatar && /* @__PURE__ */ jsx(
403
+ "img",
404
+ {
405
+ src: author.avatar,
406
+ alt: author.name,
407
+ className: "h-4 w-4 rounded-full object-cover"
408
+ }
409
+ ),
410
+ /* @__PURE__ */ jsx("span", { children: author.name })
411
+ ] });
412
+ if (linkable && author.url) {
413
+ return /* @__PURE__ */ jsx(
414
+ "a",
415
+ {
416
+ href: author.url,
417
+ className: "flex items-center gap-1 transition-colors hover:text-[var(--color-primary)]",
418
+ children: content
419
+ }
420
+ );
421
+ }
422
+ return content;
423
+ }
399
424
 
400
425
  // src/components/patterns/index.ts
401
426
  var patterns_exports = {};
@@ -405,6 +430,7 @@ __export(patterns_exports, {
405
430
  ContentPage: () => ContentPage,
406
431
  FeatureShowcase: () => FeatureShowcase,
407
432
  IndustryGrid: () => IndustryGrid,
433
+ ListCard: () => ListCard,
408
434
  PageHero: () => PageHero,
409
435
  ProcessSteps: () => ProcessSteps,
410
436
  ProductCard: () => ProductCard,
@@ -816,9 +842,14 @@ function IndustryGrid({ industries, title, cols = 3 }) {
816
842
  )) })
817
843
  ] }) });
818
844
  }
819
- function ContentPage({ title, subtitle, lastUpdated, children }) {
845
+ function ContentPage({
846
+ title,
847
+ subtitle,
848
+ lastUpdated,
849
+ children
850
+ }) {
820
851
  return /* @__PURE__ */ jsxs(Fragment, { children: [
821
- /* @__PURE__ */ jsx("section", { className: "pt-32 pb-12", children: /* @__PURE__ */ jsxs("div", { className: "container-xl container", children: [
852
+ /* @__PURE__ */ jsx("section", { className: "pt-32 pb-12", children: /* @__PURE__ */ jsxs("div", { className: "container-md container", children: [
822
853
  /* @__PURE__ */ jsx("h1", { className: "mb-4 text-4xl font-bold text-[var(--color-text-primary)] md:text-5xl", children: title }),
823
854
  subtitle && /* @__PURE__ */ jsx("h2", { className: "mb-2 text-xl text-[var(--color-text-secondary)]", children: subtitle }),
824
855
  lastUpdated && /* @__PURE__ */ jsxs("p", { className: "text-[var(--color-text-muted)]", children: [
@@ -826,7 +857,7 @@ function ContentPage({ title, subtitle, lastUpdated, children }) {
826
857
  lastUpdated
827
858
  ] })
828
859
  ] }) }),
829
- /* @__PURE__ */ jsx("section", { className: "py-12", children: /* @__PURE__ */ jsx("div", { className: "container-xl container", children: /* @__PURE__ */ jsx("div", { className: "prose prose-lg lg:max-w-3/4", children }) }) })
860
+ /* @__PURE__ */ jsx("section", { className: "py-12", children: /* @__PURE__ */ jsx("div", { className: "container-md container", children: /* @__PURE__ */ jsx("div", { className: "prose max-w-full", children }) }) })
830
861
  ] });
831
862
  }
832
863
  function useMultiLineTypewriter(lines, typingSpeed = 20, initialDelay = 800, isVisible = true) {
@@ -1360,6 +1391,87 @@ var FeatureShowcase = ({
1360
1391
  )) })
1361
1392
  ] }) });
1362
1393
  };
1394
+ function ListCard({
1395
+ href,
1396
+ title,
1397
+ description,
1398
+ tagline,
1399
+ thumbnail,
1400
+ tags,
1401
+ meta,
1402
+ imageAlt = "Card image",
1403
+ animationDelay,
1404
+ specialImageComponent = false,
1405
+ imageBgClass = "bg-[var(--color-surface-muted)]",
1406
+ children,
1407
+ imageDark,
1408
+ imageLight,
1409
+ footerSlot
1410
+ }) {
1411
+ const animationStyle = animationDelay ? { animationDelay: `${animationDelay}s` } : void 0;
1412
+ return /* @__PURE__ */ jsxs(
1413
+ "a",
1414
+ {
1415
+ href,
1416
+ className: "hero-animate group flex flex-col overflow-hidden rounded-lg border border-[var(--color-border)] bg-[var(--color-surface)] opacity-0 shadow-sm transition-all duration-300 hover:border-[var(--color-primary)] hover:shadow-lg",
1417
+ style: animationStyle,
1418
+ children: [
1419
+ thumbnail && !specialImageComponent && /* @__PURE__ */ jsx(
1420
+ "div",
1421
+ {
1422
+ className: `relative aspect-video w-full overflow-hidden rounded-t-lg ${imageBgClass}`,
1423
+ children: /* @__PURE__ */ jsx(
1424
+ "img",
1425
+ {
1426
+ src: thumbnail,
1427
+ alt: imageAlt,
1428
+ className: "h-full w-full object-cover transition-transform duration-300 group-hover:scale-105"
1429
+ }
1430
+ )
1431
+ }
1432
+ ),
1433
+ /* @__PURE__ */ jsxs("div", { className: "relative flex aspect-video w-full items-center justify-center overflow-hidden rounded-t-lg bg-gradient-to-br from-[var(--color-dot-magenta)] via-[var(--color-dot-purple)] to-[var(--color-dot-turquoise)] p-12", children: [
1434
+ /* @__PURE__ */ jsx(
1435
+ "img",
1436
+ {
1437
+ src: imageDark,
1438
+ alt: title,
1439
+ className: "dark-mode-hidden h-full w-full object-contain transition-transform duration-300 group-hover:scale-105"
1440
+ }
1441
+ ),
1442
+ /* @__PURE__ */ jsx(
1443
+ "img",
1444
+ {
1445
+ src: imageLight,
1446
+ alt: title,
1447
+ className: "dark-mode-visible h-full w-full object-contain transition-transform duration-300 group-hover:scale-105"
1448
+ }
1449
+ )
1450
+ ] }),
1451
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-1 flex-col p-6", children: [
1452
+ meta && /* @__PURE__ */ jsxs("div", { className: "mb-2 flex items-center gap-2 text-xs text-[var(--color-text-muted)]", children: [
1453
+ meta.author && /* @__PURE__ */ jsx(AuthorMeta, { author: meta.author }),
1454
+ meta.date && meta.author && /* @__PURE__ */ jsx("span", { children: "\u2022" }),
1455
+ meta.date && /* @__PURE__ */ jsx("span", { children: meta.date })
1456
+ ] }),
1457
+ /* @__PURE__ */ jsx("h3", { className: "font-heading mb-2 text-xl font-semibold text-[var(--color-text-primary)]", children: title }),
1458
+ tagline && /* @__PURE__ */ jsx("p", { className: "mb-3 text-sm font-medium text-[var(--color-primary)]", children: tagline }),
1459
+ /* @__PURE__ */ jsx("p", { className: "mb-4 flex-1 text-sm leading-relaxed text-[var(--color-text-secondary)]", children: description }),
1460
+ tags && tags.length > 0 && /* @__PURE__ */ jsx("div", { className: "mt-auto flex flex-wrap gap-2 pt-4", children: tags.map((tag) => /* @__PURE__ */ jsx(
1461
+ "span",
1462
+ {
1463
+ className: "rounded-full border border-[var(--color-border)] bg-[var(--color-surface-muted)] px-3 py-1 text-xs font-medium text-[var(--color-text-secondary)]",
1464
+ children: tag
1465
+ },
1466
+ tag
1467
+ )) }),
1468
+ children
1469
+ ] }),
1470
+ footerSlot
1471
+ ]
1472
+ }
1473
+ );
1474
+ }
1363
1475
  function BeforeAfter({ data }) {
1364
1476
  const [sliderPosition, setSliderPosition] = useState(data.default_offset || 0.5);
1365
1477
  const [isDragging, setIsDragging] = useState(false);
@@ -3040,6 +3152,6 @@ var easings = {
3040
3152
  exit: "cubic-bezier(0.4, 0, 1, 1)"
3041
3153
  };
3042
3154
 
3043
- export { BeforeAfter, CTAButton, CaseStudyBreakdown, CodeBlock, CompactContactForm, ContactForm, ContentPage, FeatureShowcase, FullWidthImage, ImageGrid, ImageGridModal, IndustryGrid, layout_exports as Layout, MainNav, PageHero, patterns_exports as Patterns, ProblemStatement, ProcessSteps, ProcessTimeline, ProductCard, RelatedProjects, ServiceSection, SolutionSummary, StatBar, TeamCredits, TeamGrid, TerminalChrome, TerminalHero, TerminalWindow, Testimonial, TextBlock, ToastContainer as Toast, TopBanner, ui_exports as UI, VideoHero, VideoSection, colors, durations, easings, sectionPadding, spacing };
3155
+ export { AuthorMeta, BeforeAfter, CTAButton, CaseStudyBreakdown, CodeBlock, CompactContactForm, ContactForm, ContentPage, FeatureShowcase, FullWidthImage, ImageGrid, ImageGridModal, IndustryGrid, layout_exports as Layout, ListCard, MainNav, PageHero, patterns_exports as Patterns, ProblemStatement, ProcessSteps, ProcessTimeline, ProductCard, RelatedProjects, ServiceSection, SolutionSummary, StatBar, TeamCredits, TeamGrid, TerminalChrome, TerminalHero, TerminalWindow, Testimonial, TextBlock, ToastContainer as Toast, TopBanner, ui_exports as UI, VideoHero, VideoSection, colors, durations, easings, sectionPadding, spacing };
3044
3156
  //# sourceMappingURL=index.js.map
3045
3157
  //# sourceMappingURL=index.js.map