diff --git a/web/components/intro/render.v b/web/components/intro/render.v
new file mode 100644
index 0000000..179bb8d
--- /dev/null
+++ b/web/components/intro/render.v
@@ -0,0 +1,114 @@
+module intro
+
+import freeflowuniverse.crystallib.core.playbook
+
+pub struct Item {
+pub mut:
+ title string
+ subtitle string
+ description string
+ background_image string
+ button_primary Button
+ button_secondary Button
+}
+
+pub struct Button {
+pub mut:
+ text string
+ url string
+}
+
+pub struct Data {
+pub mut:
+ items []Item
+}
+
+
+const example_heroscript="
+
+ !!intro1.new name:'myintro'
+
+ !!intro1.myintro_add
+ title: 'Sepia'
+ description: '
+ Made for photographers, photo studios, design agencies.
+ Create your own unique and beautiful photography website!
+ '
+ subtitle: 'Photography Portfolio Theme'
+ background_image: 'assets/img/intro/intro-10.jpg'
+ button_primary_text: 'Buy It Now!'
+ button_primary_url: 'https://example.com/learn-more'
+ button_secondary_text: 'Discover More'
+ button_secondary_url: 'albums-grid-fluid-2.html'
+
+ !!intro1.myintro_add
+ title: 'Sepia 2'
+ description: 'Made for photographers 2, photo studios, design agencies.
Create your own unique and beautiful photography website!'
+ subtitle: 'Photography Portfolio Theme'
+ background_image: 'assets/img/intro/intro-10.jpg'
+ button_primary_text: 'Buy It Now!'
+ button_primary_url: 'https://example.com/learn-more'
+ button_secondary_text: 'Discover More'
+ button_secondary_url: 'albums-grid-fluid-2.html'
+"
+
+@[params]
+pub struct RenderArgs{
+pub mut:
+ text string
+ args map[string]string
+ defaults bool
+}
+
+//will have all the results, key is in this case intro1.${name}
+//this allows us to feed e.g. markdown to all renderers and then we get the data filled in what is found on page
+
+pub fn render(args_ RenderArgs) !map[string]string{
+ mut args:=args_
+
+ mut result:=map[string]string{}
+
+ if args.text =="" && args.defaults{
+ args.text = example_heroscript
+ }
+
+ mut plbook := playbook.new(text: args.text)!
+ mut data := Data{}
+
+ actions0 := plbook.find(filter: 'intro1.new')!
+ for action0 in actions0{
+ mut p0 := action0.params
+ name := p0.get_default('name','default')!
+ key:="intro1.${name}"
+
+ // Process add_item actions
+ actions := plbook.find(filter: 'intro1.${name}_add')!
+ for action in actions {
+ mut p := action.params
+
+ item := Item{
+ title: p.get('title')!
+ subtitle: p.get('subtitle')!
+ description: p.get('description')!.replace("\n","
")
+ background_image: p.get('background_image')!
+ button_primary: Button{
+ text: p.get('button_primary_text')!
+ url: p.get('button_primary_url')!
+ }
+ button_secondary: Button{
+ text: p.get('button_secondary_text')!
+ url: p.get('button_secondary_url')!
+ }
+ }
+
+ data.items << item
+ }
+
+ result[key]=$tmpl("templates/main.html")
+
+ }
+
+ return result
+
+
+}
\ No newline at end of file
diff --git a/web/components/intro/templates/main.html b/web/components/intro/templates/main.html
new file mode 100644
index 0000000..38094c9
--- /dev/null
+++ b/web/components/intro/templates/main.html
@@ -0,0 +1,85 @@
+
+
+
\ No newline at end of file
diff --git a/web/templates/index.html b/web/templates/index.html
index f89cf64..4f6d64f 100644
--- a/web/templates/index.html
+++ b/web/templates/index.html
@@ -1,226 +1,10 @@
-@include 'header'
+@include 'partials/header'
-