}
+ {icon &&
{icon}
}
+
{title}
+
{description}
+
+ {variant==='accent' && core}
+
+
+ )
+}
diff --git a/pulse-libs/src/molecules/Footer.ts b/pulse-libs/src/molecules/Footer.ts
new file mode 100644
index 0000000..f99e4f2
--- /dev/null
+++ b/pulse-libs/src/molecules/Footer.ts
@@ -0,0 +1,11 @@
+interface FooterProps { brand?:string, year?:number, links:{label:string,href:string}[] }
+export function Footer({brand='Pulse 3D',year=__DATE__,links=[]}:FooterProps){
+ return (
+
+ )
+}
diff --git a/pulse-libs/src/molecules/Navbar.ts b/pulse-libs/src/molecules/Navbar.ts
new file mode 100644
index 0000000..84d9f17
--- /dev/null
+++ b/pulse-libs/src/molecules/Navbar.ts
@@ -0,0 +1,15 @@
+import { GradientText, Button } from '../atoms'
+interface NavProps { logo:string, links:{label:string,href:string}[], ctaLabel?:string, ctaHref?:string }
+export function Navbar({logo,links,ctaLabel,ctaHref='#'}:NavProps){
+ return (
+
+ )
+}
diff --git a/pulse-libs/src/molecules/index.ts b/pulse-libs/src/molecules/index.ts
new file mode 100644
index 0000000..8e1e9bd
--- /dev/null
+++ b/pulse-libs/src/molecules/index.ts
@@ -0,0 +1,3 @@
+export { FeatureCard } from './FeatureCard'
+export { Navbar } from './Navbar'
+export { Footer } from './Footer'
diff --git a/pulse-libs/src/organisms/CtaBlock.ts b/pulse-libs/src/organisms/CtaBlock.ts
new file mode 100644
index 0000000..053fee0
--- /dev/null
+++ b/pulse-libs/src/organisms/CtaBlock.ts
@@ -0,0 +1,16 @@
+import { Button, GradientText } from '../atoms'
+interface CtaProps { title:string, description:string, primary:{label:string,onClick():void}, secondary?:{label:string,onClick():void}, dark?:boolean }
+export function CtaBlock({title,description,primary,secondary,dark=false}:CtaProps){
+ const bg = dark ? 'rgba(5,5,16,.96)' : 'rgba(15,17,23,.5)'
+ return (
+
+ {title}
+ {description}
+
+
+ {secondary && }
+
+ {'\u2699'} @pulse-libs/ui — MIT — {new Date().getFullYear()}
+
+ )
+}
diff --git a/pulse-libs/src/organisms/FeaturesGrid.ts b/pulse-libs/src/organisms/FeaturesGrid.ts
new file mode 100644
index 0000000..5392f82
--- /dev/null
+++ b/pulse-libs/src/organisms/FeaturesGrid.ts
@@ -0,0 +1,14 @@
+import { Card } from '../atoms'
+interface Feature { icon:string, title:string, description:string }
+interface FeaturesProps { title?:string, features:Feature[], style?:React.CSSProperties }
+export function FeaturesGrid({title,features,style}:FeaturesProps){
+ return (
+
+ {title && {title}
}
+ Componentes que compõem o sistema — do átomo ao organismo.
+
+ {features.map((f,i)=>
{f.icon}
{f.title}
{f.description}
) }
+
+
+ )
+}
diff --git a/pulse-libs/src/organisms/HeroSection.ts b/pulse-libs/src/organisms/HeroSection.ts
new file mode 100644
index 0000000..080cf57
--- /dev/null
+++ b/pulse-libs/src/organisms/HeroSection.ts
@@ -0,0 +1,18 @@
+import { Card, Badge, GradientText, Button } from '../atoms'
+import type { JSX } from 'react'
+interface HeroProps { badge?:string, title:string, description:string, cta:{label:string,onClick():void}[], showScrollHint?:boolean, style?:React.CSSProperties }
+export function HeroSection({badge,title,description,cta=[],showScrollHint=true,style}:HeroProps){
+ return (
+
+ {badge && {badge}}
+
+ {title}
+
+ {description}
+
+ {cta.map((b,i)=>)}
+
+ {showScrollHint && }
+
+ )
+}
diff --git a/pulse-libs/src/organisms/StatsGrid.ts b/pulse-libs/src/organisms/StatsGrid.ts
new file mode 100644
index 0000000..4b39f60
--- /dev/null
+++ b/pulse-libs/src/organisms/StatsGrid.ts
@@ -0,0 +1,11 @@
+interface Stat { label:string, value:string|number, color?:string }
+export function StatsGrid({stats}:{stats:Stat[]}){
+ return (
+
+ {stats.map((s,i)=>
+
{s.value}
+
{s.label}
+
)}
+
+ )
+}
diff --git a/pulse-libs/src/organisms/index.ts b/pulse-libs/src/organisms/index.ts
new file mode 100644
index 0000000..094433f
--- /dev/null
+++ b/pulse-libs/src/organisms/index.ts
@@ -0,0 +1,4 @@
+export { HeroSection } from './HeroSection'
+export { FeaturesGrid } from './FeaturesGrid'
+export { CtaBlock } from './CtaBlock'
+export { StatsGrid } from './StatsGrid'
diff --git a/pulse-libs/src/pages/index.ts b/pulse-libs/src/pages/index.ts
new file mode 100644
index 0000000..c3c59d2
--- /dev/null
+++ b/pulse-libs/src/pages/index.ts
@@ -0,0 +1 @@
+// Pages: index.ts
\ No newline at end of file
diff --git a/pulse-libs/src/templates/MainLayout.ts b/pulse-libs/src/templates/MainLayout.ts
new file mode 100644
index 0000000..8c8f0cf
--- /dev/null
+++ b/pulse-libs/src/templates/MainLayout.ts
@@ -0,0 +1,12 @@
+import type { ReactNode } from 'react'
+import { Navbar, Footer, Divider } from '..'
+interface LayoutProps { children:ReactNode, nav:{logo:string,links:{label:string,href:string}[],cta?:{label:string,href:string}}, footer?:{brand:string,links:{label:string,href:string}[]} }
+export function MainLayout({children,nav,footer}:LayoutProps){
+ return (
+
+
+ {children}
+ {footer &&
+ )
+}
diff --git a/pulse-libs/src/templates/MinimalLayout.ts b/pulse-libs/src/templates/MinimalLayout.ts
new file mode 100644
index 0000000..fa73067
--- /dev/null
+++ b/pulse-libs/src/templates/MinimalLayout.ts
@@ -0,0 +1,4 @@
+interface MinimalProps { children:React.ReactNode, centered?:boolean }
+export function MinimalLayout({children,centered=true}:MinimalProps){
+ return
{children}
+}
diff --git a/pulse-libs/src/templates/PageWithSidebar.ts b/pulse-libs/src/templates/PageWithSidebar.ts
new file mode 100644
index 0000000..5a6195c
--- /dev/null
+++ b/pulse-libs/src/templates/PageWithSidebar.ts
@@ -0,0 +1 @@
+export { PageWithSidebar } from './PageWithSidebar'
\ No newline at end of file
diff --git a/pulse-libs/src/templates/index.ts b/pulse-libs/src/templates/index.ts
new file mode 100644
index 0000000..9e32296
--- /dev/null
+++ b/pulse-libs/src/templates/index.ts
@@ -0,0 +1,2 @@
+export { MainLayout } from './MainLayout'
+export { MinimalLayout } from './MinimalLayout'