diff --git a/config/zeus-sky.php b/config/zeus-sky.php
index c79ecf1..923a419 100644
--- a/config/zeus-sky.php
+++ b/config/zeus-sky.php
@@ -58,4 +58,11 @@
* \LaraZeus\Sky\Editors\RichEditor::class,
*/
'editor' => \LaraZeus\Sky\Editors\RichEditor::class,
+
+ /**
+ * A list of custom NavLinkRenderer classes for your app.
+ */
+ 'navRenderers' => [
+ // Add your custom Nav Renderers here...
+ ],
];
diff --git a/resources/views/components/sky-link.blade.php b/resources/views/components/sky-link.blade.php
new file mode 100644
index 0000000..a80e206
--- /dev/null
+++ b/resources/views/components/sky-link.blade.php
@@ -0,0 +1,3 @@
+except(['label', 'hasLabelWrap']) }}>
+ {{ $label }}
+
diff --git a/src/Classes/LinkRenderers/GenericLinkRenderer.php b/src/Classes/LinkRenderers/GenericLinkRenderer.php
new file mode 100644
index 0000000..bf90b52
--- /dev/null
+++ b/src/Classes/LinkRenderers/GenericLinkRenderer.php
@@ -0,0 +1,23 @@
+item['data']['url'];
+ }
+
+ public function isActiveRoute(): bool
+ {
+ return false;
+ }
+}
diff --git a/src/Classes/LinkRenderers/LibraryLinkRenderer.php b/src/Classes/LinkRenderers/LibraryLinkRenderer.php
new file mode 100644
index 0000000..c46bbf6
--- /dev/null
+++ b/src/Classes/LinkRenderers/LibraryLinkRenderer.php
@@ -0,0 +1,37 @@
+getModel('Tag')::find($this->item['data']['library_id']);
+ }
+
+ public function getLink(): ?string
+ {
+ /**
+ * @var Library $tag
+ */
+ $tag = $this->getModel();
+
+ return route('library.tag', $tag->slug);
+ }
+
+ public function isActiveRoute(): bool
+ {
+ /**
+ * @var Library $tag
+ */
+ $tag = $this->getModel();
+
+ return str(request()->url())->contains($tag->library->first()->slug);
+ }
+}
diff --git a/src/Classes/LinkRenderers/NavLinkRenderer.php b/src/Classes/LinkRenderers/NavLinkRenderer.php
new file mode 100644
index 0000000..cc1d488
--- /dev/null
+++ b/src/Classes/LinkRenderers/NavLinkRenderer.php
@@ -0,0 +1,45 @@
+isActiveRoute() ?
+ self::$activeClasses :
+ self::$nonActiveClasses;
+ }
+
+ /**
+ * @return array{}
+ */
+ public function getPreparedLink(string $classes = ''): array
+ {
+ return [
+ 'class' => $classes . ' ' . $this->getActiveClass(),
+ 'target' => $this->item['data']['target'] ?? '_self',
+ 'href' => $this->getLink(),
+ 'label' => $this->item['label'],
+ ];
+ }
+}
diff --git a/src/Classes/LinkRenderers/PageLinkRenderer.php b/src/Classes/LinkRenderers/PageLinkRenderer.php
new file mode 100644
index 0000000..3e83e19
--- /dev/null
+++ b/src/Classes/LinkRenderers/PageLinkRenderer.php
@@ -0,0 +1,39 @@
+getModel('Post')::page()
+ ->whereDate('published_at', '<=', now())
+ ->find($this->item['data']['page_id']);
+ }
+
+ public function getLink(): ?string
+ {
+ /**
+ * @var Post $page
+ */
+ $page = $this->getModel();
+
+ return route('page', $page);
+ }
+
+ public function isActiveRoute(): bool
+ {
+ /**
+ * @var Post $page
+ */
+ $page = $this->getModel();
+
+ return request()->routeIs('page', $page);
+ }
+}
diff --git a/src/Classes/LinkRenderers/PostLinkRenderer.php b/src/Classes/LinkRenderers/PostLinkRenderer.php
new file mode 100644
index 0000000..0734ef6
--- /dev/null
+++ b/src/Classes/LinkRenderers/PostLinkRenderer.php
@@ -0,0 +1,38 @@
+getModel('Post')::whereDate('published_at', '<=', now())
+ ->find($this->item['data']['post_id']);
+ }
+
+ public function getLink(): ?string
+ {
+ /**
+ * @var Post $post
+ */
+ $post = $this->getModel();
+
+ return route('post', $post);
+ }
+
+ public function isActiveRoute(): bool
+ {
+ /**
+ * @var Post $post
+ */
+ $post = $this->getModel();
+
+ return request()->routeIs('post', $post);
+ }
+}
diff --git a/src/Classes/RenderNavItem.php b/src/Classes/RenderNavItem.php
index 660f143..603fb24 100644
--- a/src/Classes/RenderNavItem.php
+++ b/src/Classes/RenderNavItem.php
@@ -2,52 +2,79 @@
namespace LaraZeus\Sky\Classes;
-use LaraZeus\Sky\SkyPlugin;
+use Illuminate\Support\Facades\Blade;
+use LaraZeus\Sky\Classes\LinkRenderers\GenericLinkRenderer;
+use LaraZeus\Sky\Classes\LinkRenderers\LibraryLinkRenderer;
+use LaraZeus\Sky\Classes\LinkRenderers\NavLinkRenderer;
+use LaraZeus\Sky\Classes\LinkRenderers\PageLinkRenderer;
+use LaraZeus\Sky\Classes\LinkRenderers\PostLinkRenderer;
class RenderNavItem
{
- public static function render(array $item, string $class = ''): string
+ /**
+ * @var class-string
+ */
+ public static string $defaultRendererClass = GenericLinkRenderer::class;
+
+ /**
+ * Set the default active CSS class(es) on a nav link.
+ *
+ * @return $this
+ */
+ public static function setActiveClasses(string $activeClasses): void
+ {
+ NavLinkRenderer::$activeClasses = $activeClasses;
+ }
+
+ /**
+ * Set the default non-active CSS class(es) on a nav link.
+ *
+ * @return $this
+ */
+ public static function setNonActiveClasses(string $nonActiveClass): void
+ {
+ NavLinkRenderer::$nonActiveClasses = $nonActiveClass;
+ }
+
+ public static function getNavRenderers(): array
{
- $color = 'border-b border-b-secondary-500 text-secondary-500';
-
- if ($item['type'] === 'page-link' || $item['type'] === 'page_link') {
- $page = SkyPlugin::get()->getModel('Post')::page()->whereDate('published_at', '<=', now())->find($item['data']['page_id']) ?? '';
- $activeClass = (request()->routeIs('page', $page)) ? $color : 'border-transparent';
-
- return '' .
- $item['label'] .
- '';
- } elseif ($item['type'] === 'post-link' || $item['type'] === 'post_link') {
- $post = SkyPlugin::get()->getModel('Post')::find($item['data']['post_id']) ?? '';
- $activeClass = (request()->routeIs('post', $post)) ? $color : 'border-transparent';
-
- return '' .
- $item['label'] .
- '';
- } elseif ($item['type'] === 'library-link' || $item['type'] === 'library_link') {
- $tag = SkyPlugin::get()->getModel('Tag')::find($item['data']['library_id']) ?? '';
- $activeClass = (str(request()->url())->contains($tag->library->first()->slug)) ? $color : 'border-transparent';
-
- return '' .
- $item['label'] .
- '';
+ $allRenderers = array_merge([
+ PageLinkRenderer::$rendersKey => PageLinkRenderer::class,
+ PostLinkRenderer::$rendersKey => PostLinkRenderer::class,
+ LibraryLinkRenderer::$rendersKey => LibraryLinkRenderer::class,
+ ], config('zeus-sky.navRenderers', []));
+ $renderersMap = [];
+ foreach ($allRenderers as $renderer) {
+ /**
+ * @var NavLinkRenderer $renderer
+ */
+ $renderersMap[$renderer::$rendersKey] = $renderer;
+ }
+
+ return $renderersMap;
+ }
+
+ public static function render(array $item, string $class = ''): string
+ {
+ $itemType = $item['type'];
+ if (str($itemType)->contains('_')) {
+ $itemType = str($itemType)->replace('_', '-')->toString();
+ }
+ $renderersMap = static::getNavRenderers();
+ if (array_key_exists($itemType, $renderersMap)) {
+ $rendererClass = $renderersMap[$itemType];
+ $renderer = new $rendererClass($item);
} else {
- return '' .
- $item['label'] .
- '';
+ $renderer = new static::$defaultRendererClass($item);
}
+
+ /**
+ * @var NavLinkRenderer $renderer
+ */
+ return Blade::render(
+ '',
+ $renderer->getPreparedLink($class)
+ );
}
}
diff --git a/src/Components/SkyLink.php b/src/Components/SkyLink.php
new file mode 100644
index 0000000..f593b89
--- /dev/null
+++ b/src/Components/SkyLink.php
@@ -0,0 +1,22 @@
+data());
+ }
+}
diff --git a/src/Configuration.php b/src/Configuration.php
index 28d4aea..1ddae6d 100644
--- a/src/Configuration.php
+++ b/src/Configuration.php
@@ -6,6 +6,7 @@
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Illuminate\Support\Str;
+use LaraZeus\Sky\Classes\LinkRenderers\NavLinkRenderer;
trait Configuration
{
@@ -55,6 +56,11 @@ trait Configuration
protected array $itemTypes = [];
+ /**
+ * @var class-string[]
+ */
+ protected array $navRenderers = [];
+
protected array | Closure $extraFields = [];
public function navigationGroupLabel(Closure | string $lable): static
diff --git a/src/SkyServiceProvider.php b/src/SkyServiceProvider.php
index 2112dd7..10b1d01 100644
--- a/src/SkyServiceProvider.php
+++ b/src/SkyServiceProvider.php
@@ -5,6 +5,7 @@
use Filament\Facades\Filament;
use Filament\Forms\Components\Select;
use LaraZeus\Core\CoreServiceProvider;
+use LaraZeus\Sky\Components\SkyLink;
use LaraZeus\Sky\Console\InstallCommand;
use LaraZeus\Sky\Console\migrateCommand;
use LaraZeus\Sky\Console\PublishCommand;
@@ -31,6 +32,7 @@ public function configurePackage(Package $package): void
->hasConfigFile()
->hasCommands($this->getCommands())
->hasViews('zeus')
+ ->hasViewComponent('zeus', SkyLink::class)
->hasRoute('web');
}