diff --git a/Database/factories/.gitkeep b/Database/Factories_/.gitkeep
similarity index 100%
rename from Database/factories/.gitkeep
rename to Database/Factories_/.gitkeep
diff --git a/Database/Migrations/2023_07_05_150102_create_menus_table.php b/Database/Migrations/2023_07_05_150102_create_menus_table.php
new file mode 100644
index 00000000..e72b5977
--- /dev/null
+++ b/Database/Migrations/2023_07_05_150102_create_menus_table.php
@@ -0,0 +1,38 @@
+tableCreate(
+ static function (Blueprint $table): void {
+ $table->id();
+
+ $table->string('name');
+ $table->text('items')->nullable();
+ // $table->timestamps();
+ }
+ );
+ // -- UPDATE --
+ $this->tableUpdate(
+ function (Blueprint $table): void {
+ // if (! $this->hasColumn('order_column')) {
+ // $table->integer('order_column')->nullable();
+ // }
+ $this->updateTimestamps(table: $table, hasSoftDeletes: false);
+ }
+ );
+ }
+}
diff --git a/Models/Menu.php b/Models/Menu.php
new file mode 100644
index 00000000..e8267209
--- /dev/null
+++ b/Models/Menu.php
@@ -0,0 +1,19 @@
+ 'array',
+ ];
+}
diff --git a/Resources/views/components/menu/v1.blade.php b/Resources/views/components/menu/v1.blade.php
new file mode 100644
index 00000000..77cc39cc
--- /dev/null
+++ b/Resources/views/components/menu/v1.blade.php
@@ -0,0 +1,12 @@
+
diff --git a/Resources/views/components/std/banner.blade.php b/Resources/views/components/std/banner.blade.php
new file mode 100644
index 00000000..88cda241
--- /dev/null
+++ b/Resources/views/components/std/banner.blade.php
@@ -0,0 +1,18 @@
+@props(['image' => ''])
+
+@php
+ $background = $image ? 'bg-black' : 'bg-gray-100';
+@endphp
+
+
+ @if ($image)
+
+ @endif
+
+
+ {!! $slot !!}
+
+
diff --git a/Resources/views/components/std/button.blade.php b/Resources/views/components/std/button.blade.php
new file mode 100644
index 00000000..0b0452b1
--- /dev/null
+++ b/Resources/views/components/std/button.blade.php
@@ -0,0 +1,9 @@
+@props(['label'])
+
+
diff --git a/Resources/views/components/std/card.blade.php b/Resources/views/components/std/card.blade.php
new file mode 100644
index 00000000..9076ca9c
--- /dev/null
+++ b/Resources/views/components/std/card.blade.php
@@ -0,0 +1,16 @@
+@props(['post'])
+
+
diff --git a/Resources/views/components/std/container.blade.php b/Resources/views/components/std/container.blade.php
new file mode 100644
index 00000000..f4a9b533
--- /dev/null
+++ b/Resources/views/components/std/container.blade.php
@@ -0,0 +1,3 @@
+merge(['class' => 'max-w-wide mx-auto p-2']) }}>
+ {!! $slot !!}
+
diff --git a/Resources/views/components/std/input.blade.php b/Resources/views/components/std/input.blade.php
new file mode 100644
index 00000000..eb16ce80
--- /dev/null
+++ b/Resources/views/components/std/input.blade.php
@@ -0,0 +1,26 @@
+@props([
+ 'name',
+ 'label',
+ 'id' => '',
+ 'type' => 'text',
+])
+
+@php
+ $id = $id ?: "{$name}_input";
+@endphp
+
+
+
+
+
+
+ @error($name)
+
{{ $message }}
+ @enderror
+
diff --git a/Resources/views/components/std/menu.blade.php b/Resources/views/components/std/menu.blade.php
new file mode 100644
index 00000000..465a74f2
--- /dev/null
+++ b/Resources/views/components/std/menu.blade.php
@@ -0,0 +1,16 @@
+@props(['name'])
+
+@if ($menu = \App\Models\Menu::whereName($name)->first())
+
+@endif
diff --git a/Resources/views/components/std/post-footer.blade.php b/Resources/views/components/std/post-footer.blade.php
new file mode 100644
index 00000000..1a2c8ce6
--- /dev/null
+++ b/Resources/views/components/std/post-footer.blade.php
@@ -0,0 +1,11 @@
+@props(['blocks'])
+
+@if ($blocks)
+
+@endif
diff --git a/Resources/views/components/std/post-meta.blade.php b/Resources/views/components/std/post-meta.blade.php
new file mode 100644
index 00000000..da3190e6
--- /dev/null
+++ b/Resources/views/components/std/post-meta.blade.php
@@ -0,0 +1,8 @@
+@props(['post'])
+
+@if ($post->published_at)
+ Published on {{ $post->published_at->format('M jS, Y') }} —
+ in {{ $post->category->name }}
+@else
+ [Not published]
+@endif
diff --git a/Resources/views/components/std/render-block.blade.php b/Resources/views/components/std/render-block.blade.php
new file mode 100644
index 00000000..28937e69
--- /dev/null
+++ b/Resources/views/components/std/render-block.blade.php
@@ -0,0 +1,3 @@
+@props(['block'])
+
+@component("components.blocks.{$block['type']}", $block['data'] ?? []) @endcomponent
diff --git a/Resources/views/components/std/render-blocks.blade.php b/Resources/views/components/std/render-blocks.blade.php
new file mode 100644
index 00000000..be50e6a2
--- /dev/null
+++ b/Resources/views/components/std/render-blocks.blade.php
@@ -0,0 +1,5 @@
+@props(['blocks'])
+
+@foreach ($blocks as $block)
+
+@endforeach
diff --git a/Resources/views/components/std/select.blade.php b/Resources/views/components/std/select.blade.php
new file mode 100644
index 00000000..35f33115
--- /dev/null
+++ b/Resources/views/components/std/select.blade.php
@@ -0,0 +1,24 @@
+@props([
+ 'name',
+ 'label' => '',
+ 'id' => '',
+])
+
+@php
+ $id = $id ?: "{$name}_input";
+@endphp
+
+
+ @if ($label)
+
+ @endif
+
+
+
diff --git a/Resources/views/components/std/textarea.blade.php b/Resources/views/components/std/textarea.blade.php
new file mode 100644
index 00000000..21f46709
--- /dev/null
+++ b/Resources/views/components/std/textarea.blade.php
@@ -0,0 +1,20 @@
+@props([
+ 'name',
+ 'label',
+ 'id' => '',
+])
+
+@php
+ $id = $id ?: "{$name}_input";
+@endphp
+
+
+
+
+
+
diff --git a/View/Components/Menu.php b/View/Components/Menu.php
new file mode 100644
index 00000000..42b0e43b
--- /dev/null
+++ b/View/Components/Menu.php
@@ -0,0 +1,42 @@
+execute($this->tpl);
+ $menu = MenuModel::firstOrCreate(['name' => $this->name]);
+ $view_params = [
+ 'menu' => $menu,
+ ];
+ if (null === $menu->items) {
+ $menu->items = [];
+ $menu->save();
+ }
+
+ return view($view, $view_params);
+ }
+}
diff --git a/View/Components/Std.php b/View/Components/Std.php
new file mode 100644
index 00000000..4bc69107
--- /dev/null
+++ b/View/Components/Std.php
@@ -0,0 +1,37 @@
+execute($this->tpl);
+
+ $view_params = [];
+
+ return view($view, $view_params);
+ }
+}
diff --git a/View/Components/_components.json b/View/Components/_components.json
index 348f4853..25cfcc3f 100644
--- a/View/Components/_components.json
+++ b/View/Components/_components.json
@@ -1 +1 @@
-[{"class_name":"BreadLink","comp_name":"bread-link","comp_ns":"Modules\\UI\\View\\Components\\BreadLink"},{"class_name":"Svg","comp_name":"svg","comp_ns":"Modules\\UI\\View\\Components\\Svg"}]
\ No newline at end of file
+[{"class_name":"BreadLink","comp_name":"bread-link","comp_ns":"Modules\\UI\\View\\Components\\BreadLink"},{"class_name":"Menu","comp_name":"menu","comp_ns":"Modules\\UI\\View\\Components\\Menu"},{"class_name":"Std","comp_name":"std","comp_ns":"Modules\\UI\\View\\Components\\Std"},{"class_name":"Svg","comp_name":"svg","comp_ns":"Modules\\UI\\View\\Components\\Svg"}]
\ No newline at end of file