@nimblegiant/stilts 0.2.0-alpha.3 → 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,13 +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: "/products", label: "PRODUCTS" },
70
- { href: "/contact", label: "CONTACT" }
71
- ];
72
69
  const isActive = (href) => {
73
70
  if (href === "/") return currentPath === "/";
74
71
  return currentPath.startsWith(href);
@@ -170,7 +167,9 @@ function MainNav({ currentPath, isPortfolioPage = false }) {
170
167
  "li",
171
168
  {
172
169
  className: `transition-all duration-300 ${isMenuOpen ? "translate-x-0 opacity-100" : "translate-x-8 opacity-0"} `,
173
- style: { transitionDelay: isMenuOpen ? `${index * 50 + 100}ms` : "0ms" },
170
+ style: {
171
+ transitionDelay: isMenuOpen ? `${index * 50 + 100}ms` : "0ms"
172
+ },
174
173
  children: /* @__PURE__ */ jsxs(
175
174
  "a",
176
175
  {
@@ -296,6 +295,7 @@ function TopBanner() {
296
295
  // src/components/ui/index.ts
297
296
  var ui_exports = {};
298
297
  __export(ui_exports, {
298
+ AuthorMeta: () => AuthorMeta,
299
299
  Toast: () => ToastContainer
300
300
  });
301
301
  var icons = {
@@ -397,6 +397,30 @@ function ToastContainer() {
397
397
  }
398
398
  );
399
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
+ }
400
424
 
401
425
  // src/components/patterns/index.ts
402
426
  var patterns_exports = {};
@@ -406,6 +430,7 @@ __export(patterns_exports, {
406
430
  ContentPage: () => ContentPage,
407
431
  FeatureShowcase: () => FeatureShowcase,
408
432
  IndustryGrid: () => IndustryGrid,
433
+ ListCard: () => ListCard,
409
434
  PageHero: () => PageHero,
410
435
  ProcessSteps: () => ProcessSteps,
411
436
  ProductCard: () => ProductCard,
@@ -817,9 +842,14 @@ function IndustryGrid({ industries, title, cols = 3 }) {
817
842
  )) })
818
843
  ] }) });
819
844
  }
820
- function ContentPage({ title, subtitle, lastUpdated, children }) {
845
+ function ContentPage({
846
+ title,
847
+ subtitle,
848
+ lastUpdated,
849
+ children
850
+ }) {
821
851
  return /* @__PURE__ */ jsxs(Fragment, { children: [
822
- /* @__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: [
823
853
  /* @__PURE__ */ jsx("h1", { className: "mb-4 text-4xl font-bold text-[var(--color-text-primary)] md:text-5xl", children: title }),
824
854
  subtitle && /* @__PURE__ */ jsx("h2", { className: "mb-2 text-xl text-[var(--color-text-secondary)]", children: subtitle }),
825
855
  lastUpdated && /* @__PURE__ */ jsxs("p", { className: "text-[var(--color-text-muted)]", children: [
@@ -827,7 +857,7 @@ function ContentPage({ title, subtitle, lastUpdated, children }) {
827
857
  lastUpdated
828
858
  ] })
829
859
  ] }) }),
830
- /* @__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 }) }) })
831
861
  ] });
832
862
  }
833
863
  function useMultiLineTypewriter(lines, typingSpeed = 20, initialDelay = 800, isVisible = true) {
@@ -1361,6 +1391,87 @@ var FeatureShowcase = ({
1361
1391
  )) })
1362
1392
  ] }) });
1363
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
+ }
1364
1475
  function BeforeAfter({ data }) {
1365
1476
  const [sliderPosition, setSliderPosition] = useState(data.default_offset || 0.5);
1366
1477
  const [isDragging, setIsDragging] = useState(false);
@@ -3041,6 +3152,6 @@ var easings = {
3041
3152
  exit: "cubic-bezier(0.4, 0, 1, 1)"
3042
3153
  };
3043
3154
 
3044
- 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 };
3045
3156
  //# sourceMappingURL=index.js.map
3046
3157
  //# sourceMappingURL=index.js.map