From 9feb09147321b68644357ed5eba9d55366313bd8 Mon Sep 17 00:00:00 2001 From: Manuk Date: Thu, 14 May 2026 00:52:44 +0400 Subject: [PATCH] chore: rename package to relaticle/ink (v2.0.0 breaking) Pure namespace + branding rename, no behavior changes. Renamed: - composer name: manukminasyan/filament-blog -> relaticle/ink - PHP namespace: ManukMinasyan\FilamentBlog\ -> Relaticle\Ink\ - Service provider: FilamentBlogServiceProvider -> InkServiceProvider - Filament plugin: FilamentBlogPlugin -> InkPlugin - Config file: config/filament-blog.php -> config/ink.php - Publish tags: filament-blog-{config,views,migrations,translations} -> ink-* - Blade prefix: x-blog::* -> x-ink::* - View namespace: view('blog::X') -> view('ink::X') Preserved (no migration required): - Database tables: blog_posts, blog_categories, blog_tags, blog_post_tag - Route names: blog.index, blog.show, blog.category, blog.preview, blog.feed, blog.tag - URL prefix default: /blog (configurable via config('ink.prefix')) - All public model methods, component APIs, MCP tool signatures Docs, README, CHANGELOG, UPGRADING.md updated. All 23 package tests pass. --- CHANGELOG.md | 26 +++ README.md | 38 ++-- UPGRADING.md | 85 +++++++++ composer.json | 18 +- config/{filament-blog.php => ink.php} | 0 database/factories/CategoryFactory.php | 4 +- database/factories/PostFactory.php | 8 +- database/factories/TagFactory.php | 4 +- docs/app.config.ts | 4 +- .../1.getting-started/1.installation.md | 22 +-- .../1.getting-started/2.frontend-setup.md | 30 ++-- .../1.getting-started/3.public-routes-mode.md | 4 +- .../2.essentials/1.blade-components.md | 24 +-- docs/content/2.essentials/2.filament-admin.md | 4 +- docs/content/2.essentials/3.mcp-tools.md | 2 +- docs/content/2.essentials/4.configuration.md | 12 +- docs/content/2.essentials/5.tags.md | 12 +- docs/content/2.essentials/6.media-library.md | 8 +- docs/content/4.community/1.contributing.md | 4 +- docs/content/index.md | 2 +- docs/nuxt.config.ts | 4 +- docs/package.json | 2 +- .../plans/2026-05-08-public-routes-phase-1.md | 162 +++++++++--------- .../views/components/feed-link.blade.php | 2 +- resources/views/components/feed.blade.php | 8 +- .../views/components/post-card.blade.php | 2 +- .../views/components/post-header.blade.php | 2 +- .../views/components/related-posts.blade.php | 2 +- resources/views/pages/category.blade.php | 4 +- resources/views/pages/feed.blade.php | 8 +- resources/views/pages/index.blade.php | 6 +- resources/views/pages/preview.blade.php | 2 +- resources/views/pages/show.blade.php | 2 +- resources/views/pages/tag.blade.php | 4 +- routes/web.php | 4 +- src/BlogSitemapGenerator.php | 6 +- src/Components/CategoryBadge.php | 6 +- src/Components/Feed.php | 6 +- src/Components/FeedLink.php | 6 +- src/Components/MetaTags.php | 6 +- src/Components/PostBody.php | 6 +- src/Components/PostCard.php | 6 +- src/Components/PostHeader.php | 6 +- src/Components/PreviewBanner.php | 6 +- src/Components/RelatedPosts.php | 6 +- src/Components/StructuredData.php | 8 +- src/Enums/PostStatus.php | 2 +- src/Filament/Resources/CategoryResource.php | 10 +- .../CategoryResource/Pages/CreateCategory.php | 4 +- .../CategoryResource/Pages/EditCategory.php | 4 +- .../CategoryResource/Pages/ListCategories.php | 4 +- src/Filament/Resources/PostResource.php | 18 +- .../PostResource/Pages/CreatePost.php | 4 +- .../Resources/PostResource/Pages/EditPost.php | 4 +- .../PostResource/Pages/ListPosts.php | 6 +- src/Filament/Resources/TagResource.php | 12 +- .../Resources/TagResource/Pages/CreateTag.php | 4 +- .../Resources/TagResource/Pages/EditTag.php | 4 +- .../Resources/TagResource/Pages/ListTags.php | 4 +- src/Http/Controllers/BlogController.php | 30 ++-- src/{FilamentBlogPlugin.php => InkPlugin.php} | 8 +- ...iceProvider.php => InkServiceProvider.php} | 12 +- src/Mcp/Tools/CreateCategoryTool.php | 4 +- src/Mcp/Tools/CreatePostTool.php | 6 +- src/Mcp/Tools/DeleteCategoryTool.php | 4 +- src/Mcp/Tools/DeletePostTool.php | 4 +- src/Mcp/Tools/GeneratePreviewUrlTool.php | 4 +- src/Mcp/Tools/GetCategoryTool.php | 4 +- src/Mcp/Tools/GetPostTool.php | 4 +- src/Mcp/Tools/ListCategoriesTool.php | 4 +- src/Mcp/Tools/ListPostsTool.php | 6 +- src/Mcp/Tools/RestoreCategoryTool.php | 4 +- src/Mcp/Tools/RestorePostTool.php | 4 +- src/Mcp/Tools/UpdateCategoryTool.php | 4 +- src/Mcp/Tools/UpdatePostTool.php | 6 +- src/Models/Category.php | 4 +- src/Models/Post.php | 10 +- src/Models/Tag.php | 4 +- tests/Feature/PostModelTest.php | 4 +- tests/Feature/PublicRoutesTest.php | 22 +-- tests/Feature/TagsTest.php | 32 ++-- tests/Pest.php | 2 +- tests/TestCase.php | 8 +- 83 files changed, 492 insertions(+), 375 deletions(-) create mode 100644 UPGRADING.md rename config/{filament-blog.php => ink.php} (100%) rename src/{FilamentBlogPlugin.php => InkPlugin.php} (77%) rename src/{FilamentBlogServiceProvider.php => InkServiceProvider.php} (61%) diff --git a/CHANGELOG.md b/CHANGELOG.md index fc22e37..f03a880 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,32 @@ All notable changes to this project will be documented in this file. +## [2.0.0] - Unreleased + +### Changed (BREAKING) +- **Package renamed** from `manukminasyan/filament-blog` to `relaticle/ink` +- **PHP namespace** changed from `ManukMinasyan\FilamentBlog\` to `Relaticle\Ink\` +- **Service provider** renamed: `FilamentBlogServiceProvider` → `InkServiceProvider` +- **Filament plugin** renamed: `FilamentBlogPlugin` → `InkPlugin` +- **Config file** renamed: `config/filament-blog.php` → `config/ink.php`. Use `config('ink.X')` instead of `config('filament-blog.X')`. +- **Publish tags** renamed: `filament-blog-config` → `ink-config`, `filament-blog-views` → `ink-views`, `filament-blog-migrations` → `ink-migrations`, `filament-blog-translations` → `ink-translations` +- **View component prefix** renamed: `` → `` (all components affected) +- **View namespace** renamed: `view('blog::X')` → `view('ink::X')` + +### Unchanged (compatibility-preserving) +- Database table names (`blog_posts`, `blog_categories`, `blog_tags`, `blog_post_tag`) — no data migration required +- Route names (`blog.index`, `blog.show`, `blog.category`, `blog.preview`, `blog.feed`, `blog.tag`) — public API contract preserved +- URL prefix default (still `/blog`, configurable via `config('ink.prefix')`) +- All public model/component APIs and method signatures + +### Migration +```bash +composer remove manukminasyan/filament-blog +composer require relaticle/ink:^2.0 +``` + +See [UPGRADING.md](UPGRADING.md) for the full sed recipe. + ## [1.0.1] - 2026-04-01 ### Fixed diff --git a/README.md b/README.md index a07b27a..b364152 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# Filament Blog +# Ink -Headless blog package for Filament applications. Provides models, Filament admin, MCP tools, SEO components, publishable UI components, and an **opt-in public-routes mode** for hosts that just want a working blog without writing controllers. +Filament-native content publishing for blog, docs, and AI-citable articles. Ships Eloquent models, a full Filament admin, MCP tools for AI agents, SEO components, publishable Blade UI components, and an **opt-in public-routes mode** for hosts that want a working blog without writing controllers. ## Features @@ -25,14 +25,14 @@ Headless blog package for Filament applications. Provides models, Filament admin ## Installation ```bash -composer require manukminasyan/filament-blog +composer require relaticle/ink ``` Register the plugin and run migrations: ```php // AppPanelProvider.php -->plugin(\ManukMinasyan\FilamentBlog\FilamentBlogPlugin::make()) +->plugin(\Relaticle\Ink\InkPlugin::make()) ``` ```bash @@ -46,7 +46,7 @@ By default this package is fully headless: no routes, no controllers, no forced To get a working blog at `/blog` without writing any controllers, flip the feature flag: ```php -// config/filament-blog.php +// config/ink.php 'features' => [ 'public_routes' => true, // /blog, /blog/{slug}, /blog/category/{slug}, /blog/preview/{post} 'feed' => true, // adds /blog/feed (RSS 2.0) @@ -62,19 +62,19 @@ Routes register at the service-provider level — no Filament panel boot is requ Publish the views if you want to customize them: ```bash -php artisan vendor:publish --tag=filament-blog-views +php artisan vendor:publish --tag=ink-views ``` ## Documentation -**[Read the full documentation →](https://manukminasyan.github.io/filament-blog/)** +**[Read the full documentation →](https://relaticle.github.io/ink/)** -- [Installation](https://manukminasyan.github.io/filament-blog/getting-started/installation) -- [Frontend Setup](https://manukminasyan.github.io/filament-blog/getting-started/frontend-setup) -- [Blade Components](https://manukminasyan.github.io/filament-blog/essentials/blade-components) -- [Filament Admin](https://manukminasyan.github.io/filament-blog/essentials/filament-admin) -- [MCP Tools](https://manukminasyan.github.io/filament-blog/essentials/mcp-tools) -- [Configuration](https://manukminasyan.github.io/filament-blog/essentials/configuration) +- [Installation](https://relaticle.github.io/ink/getting-started/installation) +- [Frontend Setup](https://relaticle.github.io/ink/getting-started/frontend-setup) +- [Blade Components](https://relaticle.github.io/ink/essentials/blade-components) +- [Filament Admin](https://relaticle.github.io/ink/essentials/filament-admin) +- [MCP Tools](https://relaticle.github.io/ink/essentials/mcp-tools) +- [Configuration](https://relaticle.github.io/ink/essentials/configuration) ## Quick Example (headless) @@ -82,14 +82,14 @@ php artisan vendor:publish --tag=filament-blog-views {{-- In your blog show page --}} @push('head') - - + + @endpush - - - - + + + + ``` diff --git a/UPGRADING.md b/UPGRADING.md new file mode 100644 index 0000000..c76a45b --- /dev/null +++ b/UPGRADING.md @@ -0,0 +1,85 @@ +# Upgrading from `manukminasyan/filament-blog` to `relaticle/ink` + +This package was renamed from `manukminasyan/filament-blog` to `relaticle/ink` at version `2.0.0`. + +## What changed + +| Before | After | +|---|---| +| `manukminasyan/filament-blog` | `relaticle/ink` | +| `ManukMinasyan\FilamentBlog\` | `Relaticle\Ink\` | +| `FilamentBlogServiceProvider` | `InkServiceProvider` | +| `FilamentBlogPlugin` | `InkPlugin` | +| `config/filament-blog.php` | `config/ink.php` | +| `config('filament-blog.X')` | `config('ink.X')` | +| `` etc. | `` etc. | +| `view('blog::pages.show')` | `view('ink::pages.show')` | +| `--tag=filament-blog-config` | `--tag=ink-config` | +| `--tag=filament-blog-views` | `--tag=ink-views` | +| `--tag=filament-blog-migrations` | `--tag=ink-migrations` | +| `--tag=filament-blog-translations` | `--tag=ink-translations` | + +## What did NOT change + +- Database tables stay `blog_posts`, `blog_categories`, `blog_tags`, `blog_post_tag` — **no data migration required** +- Route names stay `blog.index`, `blog.show`, `blog.category`, `blog.preview`, `blog.feed`, `blog.tag` +- URL prefix default stays `/blog` (override via `config('ink.prefix')`) +- All public model methods, component APIs, MCP tool signatures + +## Upgrade steps + +### 1. Swap the composer dependency + +```bash +composer remove manukminasyan/filament-blog +composer require relaticle/ink:^2.0 +``` + +### 2. Update imports and references + +From your project root, run: + +```bash +# PHP namespaces and class names +find app -type f -name '*.php' -exec perl -i -pe ' + s|ManukMinasyan\\FilamentBlog|Relaticle\\Ink|g; + s|FilamentBlogServiceProvider|InkServiceProvider|g; + s|FilamentBlogPlugin|InkPlugin|g; +' {} + + +# Config calls +find app config -type f \( -name '*.php' -o -name '*.blade.php' \) -exec perl -i -pe " + s|config\('filament-blog\\.|config('ink.|g; + s|config\(\"filament-blog\\.|config(\"ink.|g; +" {} + + +# Blade components and view namespace +find resources -type f -name '*.blade.php' -exec perl -i -pe ' + s| */ class CategoryFactory extends Factory diff --git a/database/factories/PostFactory.php b/database/factories/PostFactory.php index 1a45c18..a9031e0 100644 --- a/database/factories/PostFactory.php +++ b/database/factories/PostFactory.php @@ -2,13 +2,13 @@ declare(strict_types=1); -namespace ManukMinasyan\FilamentBlog\Database\Factories; +namespace Relaticle\Ink\Database\Factories; use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Foundation\Auth\User; use Illuminate\Support\Str; -use ManukMinasyan\FilamentBlog\Enums\PostStatus; -use ManukMinasyan\FilamentBlog\Models\Post; +use Relaticle\Ink\Enums\PostStatus; +use Relaticle\Ink\Models\Post; /** @extends Factory */ class PostFactory extends Factory @@ -62,7 +62,7 @@ public function scheduled(): static */ protected function resolveAuthorId(): int|string { - $authorModel = (string) config('filament-blog.author_model', User::class); + $authorModel = (string) config('ink.author_model', User::class); if (class_exists($authorModel) && method_exists($authorModel, 'factory')) { return $authorModel::factory()->create()->getKey(); diff --git a/database/factories/TagFactory.php b/database/factories/TagFactory.php index d25e431..5cbe6c6 100644 --- a/database/factories/TagFactory.php +++ b/database/factories/TagFactory.php @@ -2,10 +2,10 @@ declare(strict_types=1); -namespace ManukMinasyan\FilamentBlog\Database\Factories; +namespace Relaticle\Ink\Database\Factories; use Illuminate\Database\Eloquent\Factories\Factory; -use ManukMinasyan\FilamentBlog\Models\Tag; +use Relaticle\Ink\Models\Tag; /** @extends Factory */ class TagFactory extends Factory diff --git a/docs/app.config.ts b/docs/app.config.ts index 8ea654f..30f9ec5 100644 --- a/docs/app.config.ts +++ b/docs/app.config.ts @@ -8,7 +8,7 @@ export default defineAppConfig({ description: 'Headless blog package for Filament with SEO, MCP tools, and publishable components.', }, github: { - repo: 'filament-blog', + repo: 'ink', owner: 'ManukMinasyan', edit: true, rootDir: 'docs' @@ -23,7 +23,7 @@ export default defineAppConfig({ title: 'On this page', bottom: { title: 'Ecosystem', - edit: 'https://github.com/ManukMinasyan/filament-blog', + edit: 'https://github.com/relaticle/ink', links: [ { icon: 'i-simple-icons-laravel', diff --git a/docs/content/1.getting-started/1.installation.md b/docs/content/1.getting-started/1.installation.md index aaf949f..217644e 100644 --- a/docs/content/1.getting-started/1.installation.md +++ b/docs/content/1.getting-started/1.installation.md @@ -18,14 +18,14 @@ navigation: ### Install Package ```bash [Terminal] -composer require manukminasyan/filament-blog +composer require relaticle/ink ``` ::alert{type="info"} For private repositories, add the VCS repository to your `composer.json` first: ```json [composer.json] "repositories": [ - {"type": "vcs", "url": "git@github.com:ManukMinasyan/filament-blog.git"} + {"type": "vcs", "url": "git@github.com:relaticle/ink.git"} ] ``` :: @@ -41,17 +41,17 @@ This creates `blog_posts`, `blog_categories`, `blog_tags`, and `blog_post_tag` t ### Register Filament Plugin ```php [AppPanelProvider.php] -use ManukMinasyan\FilamentBlog\FilamentBlogPlugin; +use Relaticle\Ink\InkPlugin; $panel->plugins([ - FilamentBlogPlugin::make(), + InkPlugin::make(), ]); ``` ### Publish Config (optional) ```bash [Terminal] -php artisan vendor:publish --tag=filament-blog-config +php artisan vendor:publish --tag=ink-config ``` :: @@ -70,9 +70,9 @@ Most teams porting from the Tapix/FilaForms internal blog packages want public-r ## Default config -After publishing, `config/filament-blog.php` looks like this. Everything is opt-in — defaults match the headless mode, so the package is a no-op until you flip a flag: +After publishing, `config/ink.php` looks like this. Everything is opt-in — defaults match the headless mode, so the package is a no-op until you flip a flag: -```php [config/filament-blog.php] +```php [config/ink.php] return [ 'prefix' => 'blog', 'layout' => 'layouts.app', @@ -115,9 +115,9 @@ If your app enforces morph maps, register the blog models: ```php [AppServiceProvider.php] Relation::enforceMorphMap([ // ...existing entries - 'blog_post' => \ManukMinasyan\FilamentBlog\Models\Post::class, - 'blog_category' => \ManukMinasyan\FilamentBlog\Models\Category::class, - 'blog_tag' => \ManukMinasyan\FilamentBlog\Models\Tag::class, + 'blog_post' => \Relaticle\Ink\Models\Post::class, + 'blog_category' => \Relaticle\Ink\Models\Category::class, + 'blog_tag' => \Relaticle\Ink\Models\Tag::class, ]); ``` @@ -136,7 +136,7 @@ The schema is identical (`blog_posts` and `blog_categories` table names match). ```bash [Terminal] composer remove tapix/blog # or filaforms/blog -composer require manukminasyan/filament-blog +composer require relaticle/ink ``` Then enable public-routes mode in config: diff --git a/docs/content/1.getting-started/2.frontend-setup.md b/docs/content/1.getting-started/2.frontend-setup.md index 1e81f36..29c5ad6 100644 --- a/docs/content/1.getting-started/2.frontend-setup.md +++ b/docs/content/1.getting-started/2.frontend-setup.md @@ -16,7 +16,7 @@ In headless mode the package ships **no routes, no controllers, no page views**. ```php [routes/web.php] use App\Http\Controllers\BlogController; -Route::prefix('blog')->name('blog.')->group(function () { +Route::prefix('ink')->name('blog.')->group(function () { Route::get('/', [BlogController::class, 'index'])->name('index'); Route::get('/feed', [BlogController::class, 'feed'])->name('feed'); Route::get('/category/{slug}', [BlogController::class, 'category'])->name('category'); @@ -32,9 +32,9 @@ The route names matter — the package's URL helpers and SEO components check fo ## Create controller ```php [app/Http/Controllers/BlogController.php] -use ManukMinasyan\FilamentBlog\Models\Category; -use ManukMinasyan\FilamentBlog\Models\Post; -use ManukMinasyan\FilamentBlog\Models\Tag; +use Relaticle\Ink\Models\Category; +use Relaticle\Ink\Models\Post; +use Relaticle\Ink\Models\Tag; final readonly class BlogController { @@ -44,7 +44,7 @@ final readonly class BlogController ->published() ->with(['category', 'author', 'seo']) ->latest('published_at') - ->paginate(config('filament-blog.per_page', 12)); + ->paginate(config('ink.per_page', 12)); return view('blog.index', compact('posts')); } @@ -70,7 +70,7 @@ final readonly class BlogController ->published() ->with(['category', 'author', 'seo']) ->latest('published_at') - ->paginate(config('filament-blog.per_page', 12)); + ->paginate(config('ink.per_page', 12)); return view('blog.category', compact('category', 'posts')); } @@ -83,7 +83,7 @@ final readonly class BlogController ->published() ->with(['category', 'author', 'seo']) ->latest('published_at') - ->paginate(config('filament-blog.per_page', 12)); + ->paginate(config('ink.per_page', 12)); return view('blog.tag', compact('tag', 'posts')); } @@ -116,22 +116,22 @@ Use the package's Blade components inside your own page templates: ```blade [resources/views/blog/show.blade.php] @push('head') - - + + @endpush - + - - - + + + ``` ```blade [resources/views/blog/index.blade.php] @foreach($posts as $post) - + @endforeach {{ $posts->links() }} @@ -139,7 +139,7 @@ Use the package's Blade components inside your own page templates: ``` ```blade [resources/views/blog/feed.blade.php] - + ``` ## Helpers on the Post model diff --git a/docs/content/1.getting-started/3.public-routes-mode.md b/docs/content/1.getting-started/3.public-routes-mode.md index 56d64ca..90a9a01 100644 --- a/docs/content/1.getting-started/3.public-routes-mode.md +++ b/docs/content/1.getting-started/3.public-routes-mode.md @@ -18,7 +18,7 @@ The package ships an **opt-in public-routes mode**. Flip a flag in config and yo ## Enable it -```php [config/filament-blog.php] +```php [config/ink.php] 'features' => [ 'public_routes' => true, 'feed' => true, // optional, enables /blog/feed @@ -52,7 +52,7 @@ The page views extend the layout you set in `'layout'`. It must define a `@yield If your layout uses a different slot mechanism (e.g. Blade components with `{{ $slot }}`), publish the page views and adapt them: ```bash [Terminal] -php artisan vendor:publish --tag=filament-blog-views +php artisan vendor:publish --tag=ink-views ``` ## Customizing pages diff --git a/docs/content/2.essentials/1.blade-components.md b/docs/content/2.essentials/1.blade-components.md index 76dfc18..468d745 100644 --- a/docs/content/2.essentials/1.blade-components.md +++ b/docs/content/2.essentials/1.blade-components.md @@ -5,7 +5,7 @@ navigation: icon: i-lucide-component --- -All components are publishable. Run `php artisan vendor:publish --tag=filament-blog-views` to customize. +All components are publishable. Run `php artisan vendor:publish --tag=ink-views` to customize. ## SEO Components @@ -15,7 +15,7 @@ Renders Open Graph, Twitter Card, and article meta tags in ``. ```blade @push('head') - + @endpush ``` @@ -26,7 +26,7 @@ Renders Open Graph, Twitter Card, and article meta tags in ``. Renders JSON-LD `BlogPosting` schema with publisher and breadcrumb data. ```blade - + ``` **Renders:** `@type: BlogPosting` with headline, description, datePublished, dateModified, author, publisher (from config), articleSection, articleBody, and image. @@ -37,7 +37,7 @@ Renders RSS `` tag in ``. Only renders if `blog.feed` route exists a ```blade @push('head') - + @endpush ``` @@ -47,7 +47,7 @@ Renders full RSS 2.0 XML. Use in your feed route view: ```blade {{-- resources/views/blog/feed.blade.php --}} - + ``` ## UI Components @@ -57,7 +57,7 @@ Renders full RSS 2.0 XML. Use in your feed route view: Displays a post in a listing. Shows category badge, date, title, excerpt, and featured image thumbnail. ```blade - + ``` ### Post Header @@ -65,7 +65,7 @@ Displays a post in a listing. Shows category badge, date, title, excerpt, and fe Renders category badge, title, author name, published date, and estimated read time. ```blade - + ``` ### Post Body @@ -73,7 +73,7 @@ Renders category badge, title, author name, published date, and estimated read t Renders featured image and markdown content in a Tailwind prose container with dark mode support. ```blade - + ``` ### Related Posts @@ -81,7 +81,7 @@ Renders featured image and markdown content in a Tailwind prose container with d Shows related posts section. Only renders if the collection is not empty. ```blade - + ``` ### Category Badge @@ -89,8 +89,8 @@ Shows related posts section. Only renders if the collection is not empty. Displays a category pill. Links to category page if `blog.category` route exists. ```blade - - + + ``` ### Preview Banner @@ -98,5 +98,5 @@ Displays a category pill. Links to category page if `blog.category` route exists Sticky amber banner for draft previews. Pushes `noindex` meta tag. ```blade - + ``` diff --git a/docs/content/2.essentials/2.filament-admin.md b/docs/content/2.essentials/2.filament-admin.md index b3888d9..39e1072 100644 --- a/docs/content/2.essentials/2.filament-admin.md +++ b/docs/content/2.essentials/2.filament-admin.md @@ -67,10 +67,10 @@ See the [Tags Taxonomy](/essentials/tags) page for full schema and usage. ## Plugin Registration ```php [AppPanelProvider.php] -use ManukMinasyan\FilamentBlog\FilamentBlogPlugin; +use Relaticle\Ink\InkPlugin; $panel->plugins([ - FilamentBlogPlugin::make(), + InkPlugin::make(), ]); ``` diff --git a/docs/content/2.essentials/3.mcp-tools.md b/docs/content/2.essentials/3.mcp-tools.md index b4d7362..bb4a99e 100644 --- a/docs/content/2.essentials/3.mcp-tools.md +++ b/docs/content/2.essentials/3.mcp-tools.md @@ -35,7 +35,7 @@ The package includes 13 Model Context Protocol tools for full blog management vi Register the tools in your MCP server: ```php [app/Mcp/Servers/BlogServer.php] -use ManukMinasyan\FilamentBlog\Mcp\Tools; +use Relaticle\Ink\Mcp\Tools; class BlogServer extends Server { diff --git a/docs/content/2.essentials/4.configuration.md b/docs/content/2.essentials/4.configuration.md index 99d9f96..d86deea 100644 --- a/docs/content/2.essentials/4.configuration.md +++ b/docs/content/2.essentials/4.configuration.md @@ -8,12 +8,12 @@ navigation: Publish the config file: ```bash [Terminal] -php artisan vendor:publish --tag=filament-blog-config +php artisan vendor:publish --tag=ink-config ``` ## Full reference -```php [config/filament-blog.php] +```php [config/ink.php] return [ /* |-------------------------------------------------------------------------- @@ -97,7 +97,7 @@ return [ |-------------------------------------------------------------------------- | JSON-LD publisher block |-------------------------------------------------------------------------- - | Used by and the Post::getDynamicSEOData() + | Used by and the Post::getDynamicSEOData() | Article schema. Leave nulls to omit fields. */ 'publisher' => [ @@ -125,7 +125,7 @@ return [ Add blog URLs to your sitemap generation: ```php [GenerateSitemapCommand.php] -use ManukMinasyan\FilamentBlog\BlogSitemapGenerator; +use Relaticle\Ink\BlogSitemapGenerator; use Spatie\Sitemap\Sitemap; $sitemap = Sitemap::create(); @@ -140,7 +140,7 @@ The generator is route-aware — it only adds URLs for routes that exist in your Publish all Blade page + component views: ```bash [Terminal] -php artisan vendor:publish --tag=filament-blog-views +php artisan vendor:publish --tag=ink-views ``` Published files go to: @@ -152,7 +152,7 @@ Edit them to match your design system. Once published, the package no longer ser ## Customizing translations ```bash [Terminal] -php artisan vendor:publish --tag=filament-blog-translations +php artisan vendor:publish --tag=ink-translations ``` (No translations ship by default; this tag exists for future localization.) diff --git a/docs/content/2.essentials/5.tags.md b/docs/content/2.essentials/5.tags.md index fa07a4f..4d74030 100644 --- a/docs/content/2.essentials/5.tags.md +++ b/docs/content/2.essentials/5.tags.md @@ -9,7 +9,7 @@ Tags are an **opt-in** feature — the schema ships with every install but the a ## Enable -```php [config/filament-blog.php] +```php [config/ink.php] 'features' => [ 'tags' => true, ], @@ -41,7 +41,7 @@ Soft deletes are enabled on `blog_tags`. Pivot rows cascade-delete when a post o ## Model -`ManukMinasyan\FilamentBlog\Models\Tag`: +`Relaticle\Ink\Models\Tag`: ```php $tag = Tag::factory()->create(['name' => 'Laravel']); @@ -54,8 +54,8 @@ The slug is stable — renaming a tag preserves its slug (and existing URLs). ## Attaching tags to posts ```php -use ManukMinasyan\FilamentBlog\Models\Post; -use ManukMinasyan\FilamentBlog\Models\Tag; +use Relaticle\Ink\Models\Post; +use Relaticle\Ink\Models\Tag; $post = Post::find($id); $tag = Tag::firstOrCreate(['name' => 'Laravel']); @@ -87,14 +87,14 @@ When both `features.public_routes` and `features.tags` are on, the route `/blog/ Route::get('/tag/{slug}', [BlogController::class, 'tag'])->name('blog.tag'); ``` -The shipped view at `resources/views/vendor/blog/pages/tag.blade.php` uses the `` component. Publish and edit it to customize. +The shipped view at `resources/views/vendor/blog/pages/tag.blade.php` uses the `` component. Publish and edit it to customize. ## Disabling tags after enabling Flip the flag back to `false` and the admin UI + archive route disappear. Existing data stays in the tables — uninstall fully via: ```bash [Terminal] -php artisan migrate:rollback --path=vendor/manukminasyan/filament-blog/database/migrations +php artisan migrate:rollback --path=vendor/relaticle/ink/database/migrations ``` ## Related-posts behavior diff --git a/docs/content/2.essentials/6.media-library.md b/docs/content/2.essentials/6.media-library.md index e0e1177..d53723c 100644 --- a/docs/content/2.essentials/6.media-library.md +++ b/docs/content/2.essentials/6.media-library.md @@ -23,7 +23,7 @@ The package ships an **opt-in** integration with [`spatie/laravel-medialibrary`] 2. Flip the flag: - ```php [config/filament-blog.php] + ```php [config/ink.php] 'features' => [ 'media_library' => true, ], @@ -40,7 +40,7 @@ If you want the full integration today, override the `Post` model in your app: ```php [app/Models/BlogPost.php] namespace App\Models; -use ManukMinasyan\FilamentBlog\Models\Post as BasePost; +use Relaticle\Ink\Models\Post as BasePost; use Spatie\MediaLibrary\HasMedia; use Spatie\MediaLibrary\InteractsWithMedia; use Spatie\MediaLibrary\MediaCollections\Models\Collections\MediaCollection; @@ -58,13 +58,13 @@ class BlogPost extends BasePost implements HasMedia Then point the package at your model: -```php [config/filament-blog.php] +```php [config/ink.php] // (post_model is not currently a config key — track this in // Phase 3 follow-up; for now the package always uses its own Post) ``` ::alert{type="warning"} -Swapping the post model isn't a config option in v1.4 — that lands in Phase 3 along with the model-side integration. Watch the [GitHub releases](https://github.com/ManukMinasyan/filament-blog/releases) for `v1.5`. +Swapping the post model isn't a config option in v1.4 — that lands in Phase 3 along with the model-side integration. Watch the [GitHub releases](https://github.com/relaticle/ink/releases) for `v1.5`. :: ## Migrating existing `featured_image` data diff --git a/docs/content/4.community/1.contributing.md b/docs/content/4.community/1.contributing.md index ab71fcc..da1b1f8 100644 --- a/docs/content/4.community/1.contributing.md +++ b/docs/content/4.community/1.contributing.md @@ -16,8 +16,8 @@ Contributions are welcome! Here's how to get started: ## Development Setup ```bash [Terminal] -git clone git@github.com:ManukMinasyan/filament-blog.git -cd filament-blog +git clone git@github.com:relaticle/ink.git +cd ink composer install ``` diff --git a/docs/content/index.md b/docs/content/index.md index 097180a..c9650de 100644 --- a/docs/content/index.md +++ b/docs/content/index.md @@ -27,7 +27,7 @@ Ships the admin, SEO components, MCP tools, and Blade components. Bring your own color: neutral icon: simple-icons:github size: xl - to: https://github.com/ManukMinasyan/filament-blog + to: https://github.com/relaticle/ink variant: outline --- Source on GitHub diff --git a/docs/nuxt.config.ts b/docs/nuxt.config.ts index ca0a807..88e1fd2 100644 --- a/docs/nuxt.config.ts +++ b/docs/nuxt.config.ts @@ -9,7 +9,7 @@ export default defineNuxtConfig({ }, appConfig: { docus: { - url: `https://manukminasyan.github.io${baseURL}`, + url: `https://relaticle.github.io${baseURL}`, header: { logo: false, }, @@ -41,7 +41,7 @@ export default defineNuxtConfig({ }, }, llms: { - domain: `https://manukminasyan.github.io${baseURL.replace(/\/$/, '')}`, + domain: `https://relaticle.github.io${baseURL.replace(/\/$/, '')}`, }, nitro: { preset: 'github_pages', diff --git a/docs/package.json b/docs/package.json index 68f8f32..2481d24 100644 --- a/docs/package.json +++ b/docs/package.json @@ -1,5 +1,5 @@ { - "name": "filament-blog-docs", + "name": "ink-docs", "scripts": { "dev": "nuxt dev --extends docus", "build": "nuxt build --extends docus", diff --git a/docs/superpowers/plans/2026-05-08-public-routes-phase-1.md b/docs/superpowers/plans/2026-05-08-public-routes-phase-1.md index 0b63c5d..86fbeb0 100644 --- a/docs/superpowers/plans/2026-05-08-public-routes-phase-1.md +++ b/docs/superpowers/plans/2026-05-08-public-routes-phase-1.md @@ -2,9 +2,9 @@ > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. -**Goal:** Make `manukminasyan/filament-blog` a drop-in replacement for the Tapix and FilaForms internal blog packages by adding opt-in public routes (controller + page views), bulk publishing actions, MCP markdown sanitization, reading-time / related-posts wiring, plus a real test suite and CI. +**Goal:** Make `relaticle/ink` a drop-in replacement for the Tapix and FilaForms internal blog packages by adding opt-in public routes (controller + page views), bulk publishing actions, MCP markdown sanitization, reading-time / related-posts wiring, plus a real test suite and CI. -**Architecture:** Feature flags live in `config/filament-blog.php` (not on the Filament plugin) so public routes register at the service-provider level — independently of any Filament panel boot. Headless behavior remains the default (`features.public_routes = false` would mean exactly today's behavior). Filament panel concerns stay on the plugin (resource discovery, MCP tool registration). Two-layer architecture: Core (always on) + Plus (opt-in via config). +**Architecture:** Feature flags live in `config/ink.php` (not on the Filament plugin) so public routes register at the service-provider level — independently of any Filament panel boot. Headless behavior remains the default (`features.public_routes = false` would mean exactly today's behavior). Filament panel concerns stay on the plugin (resource discovery, MCP tool registration). Two-layer architecture: Core (always on) + Plus (opt-in via config). **Tech Stack:** PHP 8.3+ · Laravel 12 · Filament v5 · Pest v3 · Spatie Laravel Package Tools · Spatie Sluggable · Ralph J Smit Laravel SEO · Spatie Markdown. @@ -21,7 +21,7 @@ - `resources/views/pages/show.blade.php` - `resources/views/pages/category.blade.php` - `resources/views/pages/preview.blade.php` -- `resources/views/pages/feed.blade.php` — RSS 2.0 page (re-uses existing `` component) +- `resources/views/pages/feed.blade.php` — RSS 2.0 page (re-uses existing `` component) - `resources/views/pages/_post-content.blade.php` — shared partial used by show + preview - `tests/TestCase.php` — Orchestra Testbench base - `tests/Pest.php` — pest bootstrap @@ -34,8 +34,8 @@ - `.github/workflows/tests.yml` **Modified:** -- `config/filament-blog.php` — add `features` array, `layout`, `tables` sections, fill default `feed` metadata -- `src/FilamentBlogServiceProvider.php` — read config flags, conditionally register routes +- `config/ink.php` — add `features` array, `layout`, `tables` sections, fill default `feed` metadata +- `src/InkServiceProvider.php` — read config flags, conditionally register routes - `src/Filament/Resources/PostResource.php` — add bulk publish/unpublish/schedule actions - `src/Mcp/Tools/CreatePostTool.php` — markdown sanitization - `src/Mcp/Tools/UpdatePostTool.php` — markdown sanitization @@ -103,7 +103,7 @@ Expected: `composer.json` gets a `require-dev` block; `composer.lock` updated; v declare(strict_types=1); -namespace ManukMinasyan\FilamentBlog\Tests; +namespace Relaticle\Ink\Tests; use BladeUI\Heroicons\BladeHeroiconsServiceProvider; use BladeUI\Icons\BladeIconsServiceProvider; @@ -118,7 +118,7 @@ use Filament\Tables\TablesServiceProvider; use Filament\Widgets\WidgetsServiceProvider; use Illuminate\Database\Schema\Blueprint; use Livewire\LivewireServiceProvider; -use ManukMinasyan\FilamentBlog\FilamentBlogServiceProvider; +use Relaticle\Ink\InkServiceProvider; use Orchestra\Testbench\TestCase as BaseTestCase; use RalphJSmit\Laravel\SEO\SEOServiceProvider as RalphSEOServiceProvider; use Spatie\Sluggable\HasSlug; @@ -142,7 +142,7 @@ class TestCase extends BaseTestCase WidgetsServiceProvider::class, LivewireServiceProvider::class, RalphSEOServiceProvider::class, - FilamentBlogServiceProvider::class, + InkServiceProvider::class, ]; } @@ -183,7 +183,7 @@ class TestCase extends BaseTestCase declare(strict_types=1); use Illuminate\Foundation\Testing\RefreshDatabase; -use ManukMinasyan\FilamentBlog\Tests\TestCase; +use Relaticle\Ink\Tests\TestCase; pest()->extend(TestCase::class) ->use(RefreshDatabase::class) @@ -331,11 +331,11 @@ git commit -m "ci: add tests + lint workflow" ### Task 3: Add `features`, `layout`, `tables` to config **Files:** -- Modify: `config/filament-blog.php` (full rewrite — short file) +- Modify: `config/ink.php` (full rewrite — short file) - [ ] **Step 1: Replace the config file** -Replace `config/filament-blog.php` contents with: +Replace `config/ink.php` contents with: ```php set('filament-blog.features.public_routes', true); - config()->set('filament-blog.layout', 'tests::layouts.empty'); + config()->set('ink.features.public_routes', true); + config()->set('ink.layout', 'tests::layouts.empty'); }); test('public index route returns published posts when feature enabled', function () { @@ -418,7 +418,7 @@ test('public index route returns published posts when feature enabled', function }); test('public index route is not registered when feature disabled', function () { - config()->set('filament-blog.features.public_routes', false); + config()->set('ink.features.public_routes', false); expect(\Illuminate\Support\Facades\Route::has('blog.index'))->toBeFalse(); }); @@ -449,10 +449,10 @@ Expected: FAIL — `route('blog.index')` not defined; route helper throws. declare(strict_types=1); -namespace ManukMinasyan\FilamentBlog\Database\Factories; +namespace Relaticle\Ink\Database\Factories; use Illuminate\Database\Eloquent\Factories\Factory; -use ManukMinasyan\FilamentBlog\Models\Category; +use Relaticle\Ink\Models\Category; class CategoryFactory extends Factory { @@ -477,12 +477,12 @@ class CategoryFactory extends Factory declare(strict_types=1); -namespace ManukMinasyan\FilamentBlog\Database\Factories; +namespace Relaticle\Ink\Database\Factories; use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Support\Str; -use ManukMinasyan\FilamentBlog\Enums\PostStatus; -use ManukMinasyan\FilamentBlog\Models\Post; +use Relaticle\Ink\Enums\PostStatus; +use Relaticle\Ink\Models\Post; class PostFactory extends Factory { @@ -530,8 +530,8 @@ In `composer.json`, ensure the factories namespace is autoloaded — add this `a ```json "autoload-dev": { "psr-4": { - "ManukMinasyan\\FilamentBlog\\Tests\\": "tests/", - "ManukMinasyan\\FilamentBlog\\Database\\Factories\\": "database/factories/" + "Relaticle\\Ink\\Tests\\": "tests/", + "Relaticle\\Ink\\Database\\Factories\\": "database/factories/" } } ``` @@ -547,18 +547,18 @@ composer dump-autoload In `src/Models/Post.php`, ensure `use HasFactory;` is present and add the static `newFactory()` if HasFactory cannot resolve namespace: ```php -protected static function newFactory(): \ManukMinasyan\FilamentBlog\Database\Factories\PostFactory +protected static function newFactory(): \Relaticle\Ink\Database\Factories\PostFactory { - return \ManukMinasyan\FilamentBlog\Database\Factories\PostFactory::new(); + return \Relaticle\Ink\Database\Factories\PostFactory::new(); } ``` Same for `Category.php`: ```php -protected static function newFactory(): \ManukMinasyan\FilamentBlog\Database\Factories\CategoryFactory +protected static function newFactory(): \Relaticle\Ink\Database\Factories\CategoryFactory { - return \ManukMinasyan\FilamentBlog\Database\Factories\CategoryFactory::new(); + return \Relaticle\Ink\Database\Factories\CategoryFactory::new(); } ``` @@ -606,18 +606,18 @@ git commit -m "test: add Post + Category factories and fixture layout" declare(strict_types=1); -namespace ManukMinasyan\FilamentBlog\Http\Controllers; +namespace Relaticle\Ink\Http\Controllers; use Illuminate\Contracts\View\View; use Illuminate\Http\Request; use Illuminate\Routing\Controller; -use ManukMinasyan\FilamentBlog\Models\Post; +use Relaticle\Ink\Models\Post; class BlogController extends Controller { public function index(Request $request): View { - $perPage = (int) config('filament-blog.per_page', 12); + $perPage = (int) config('ink.per_page', 12); $posts = Post::query() ->with(['category', 'author', 'seo']) @@ -625,7 +625,7 @@ class BlogController extends Controller ->latest('published_at') ->paginate($perPage); - return view('blog::pages.index', [ + return view('ink::pages.index', [ 'posts' => $posts, ]); } @@ -642,9 +642,9 @@ class BlogController extends Controller declare(strict_types=1); use Illuminate\Support\Facades\Route; -use ManukMinasyan\FilamentBlog\Http\Controllers\BlogController; +use Relaticle\Ink\Http\Controllers\BlogController; -$prefix = config('filament-blog.prefix', 'blog'); +$prefix = config('ink.prefix', 'ink'); Route::prefix($prefix)->middleware('web')->group(function () { Route::get('/', [BlogController::class, 'index'])->name('blog.index'); @@ -653,14 +653,14 @@ Route::prefix($prefix)->middleware('web')->group(function () { - [ ] **Step 3: Wire route loading in service provider** -In `src/FilamentBlogServiceProvider.php`, replace `packageBooted()` with: +In `src/InkServiceProvider.php`, replace `packageBooted()` with: ```php public function packageBooted(): void { - Blade::componentNamespace('ManukMinasyan\\FilamentBlog\\Components', 'blog'); + Blade::componentNamespace('Relaticle\\Ink\\Components', 'ink'); - if (config('filament-blog.features.public_routes')) { + if (config('ink.features.public_routes')) { $this->loadRoutesFrom(__DIR__.'/../routes/web.php'); } } @@ -671,15 +671,15 @@ public function packageBooted(): void `resources/views/pages/index.blade.php`: ```blade -@extends(config('filament-blog.layout', 'layouts.app')) +@extends(config('ink.layout', 'layouts.app')) @section('content')
-

{{ config('filament-blog.feed.title') ?? 'Blog' }}

+

{{ config('ink.feed.title') ?? 'Blog' }}

@forelse ($posts as $post) - + @empty

No posts yet.

@endforelse @@ -703,7 +703,7 @@ Expected: PASS for "public index route returns published posts when feature enab - [ ] **Step 6: Commit** ```bash -git add src/Http/Controllers/BlogController.php routes/web.php src/FilamentBlogServiceProvider.php resources/views/pages/index.blade.php +git add src/Http/Controllers/BlogController.php routes/web.php src/InkServiceProvider.php resources/views/pages/index.blade.php git commit -m "feat: add public blog routes and index page (config-gated)" ``` @@ -772,7 +772,7 @@ public function show(string $slug): View $related = $post->relatedPosts(limit: 3)->get(); - return view('blog::pages.show', [ + return view('ink::pages.show', [ 'post' => $post, 'relatedPosts' => $related, ]); @@ -796,15 +796,15 @@ Route::get('/{slug}', [BlogController::class, 'show'])->name('blog.show'); `resources/views/pages/show.blade.php`: ```blade -@extends(config('filament-blog.layout', 'layouts.app')) +@extends(config('ink.layout', 'layouts.app')) @section('content')
- + @include('blog::pages._post-content', ['post' => $post]) - +
@endsection ``` @@ -815,7 +815,7 @@ Route::get('/{slug}', [BlogController::class, 'show'])->name('blog.show'); ```blade
- +
``` @@ -879,8 +879,8 @@ In `BlogController`, add: ```php public function category(string $slug): View { - $category = \ManukMinasyan\FilamentBlog\Models\Category::where('slug', $slug)->firstOrFail(); - $perPage = (int) config('filament-blog.per_page', 12); + $category = \Relaticle\Ink\Models\Category::where('slug', $slug)->firstOrFail(); + $perPage = (int) config('ink.per_page', 12); $posts = Post::query() ->with(['category', 'author', 'seo']) @@ -889,7 +889,7 @@ public function category(string $slug): View ->latest('published_at') ->paginate($perPage); - return view('blog::pages.category', [ + return view('ink::pages.category', [ 'category' => $category, 'posts' => $posts, ]); @@ -913,16 +913,16 @@ Route::prefix($prefix)->middleware('web')->group(function () { `resources/views/pages/category.blade.php`: ```blade -@extends(config('filament-blog.layout', 'layouts.app')) +@extends(config('ink.layout', 'layouts.app')) @section('content')

{{ $category->name }}

-

Posts filed under

+

Posts filed under

@forelse ($posts as $post) - + @empty

No posts in this category yet.

@endforelse @@ -989,9 +989,9 @@ test('preview route 403s without signature', function () { - [ ] **Step 2: Add controller action** ```php -public function preview(\ManukMinasyan\FilamentBlog\Models\Post $post): View +public function preview(\Relaticle\Ink\Models\Post $post): View { - return view('blog::pages.preview', [ + return view('ink::pages.preview', [ 'post' => $post->loadMissing(['category', 'author', 'seo']), ]); } @@ -1012,18 +1012,18 @@ Route::get('/preview/{post}', [BlogController::class, 'preview']) `resources/views/pages/preview.blade.php`: ```blade -@extends(config('filament-blog.layout', 'layouts.app')) +@extends(config('ink.layout', 'layouts.app')) @section('content')
- - + + @include('blog::pages._post-content', ['post' => $post])
@endsection ``` -The existing `` component should already push a `noindex,nofollow` meta tag — confirm with: +The existing `` component should already push a `noindex,nofollow` meta tag — confirm with: ```bash grep -n "noindex" /tmp/filament-blog/src/Components/PreviewBanner.php /tmp/filament-blog/resources/views/components/preview-banner.blade.php 2>&1 @@ -1054,7 +1054,7 @@ git commit -m "feat: add signed preview route for drafts" - Modify: `tests/Feature/PublicRoutesTest.php` - Modify: `src/Http/Controllers/BlogController.php` - Modify: `routes/web.php` -- Modify: `src/FilamentBlogServiceProvider.php` +- Modify: `src/InkServiceProvider.php` - Create: `resources/views/pages/feed.blade.php` - [ ] **Step 1: Failing tests** @@ -1063,7 +1063,7 @@ Append: ```php test('feed route returns RSS XML when feed feature enabled', function () { - config()->set('filament-blog.features.feed', true); + config()->set('ink.features.feed', true); $post = Post::factory()->published()->create(['title' => 'Hello feed']); @@ -1075,7 +1075,7 @@ test('feed route returns RSS XML when feed feature enabled', function () { }); test('feed route is not registered when feed feature disabled', function () { - config()->set('filament-blog.features.feed', false); + config()->set('ink.features.feed', false); expect(\Illuminate\Support\Facades\Route::has('blog.feed'))->toBeFalse(); }); @@ -1102,7 +1102,7 @@ public function feed(): \Illuminate\Http\Response ->get(); return response() - ->view('blog::pages.feed', ['posts' => $posts]) + ->view('ink::pages.feed', ['posts' => $posts]) ->header('Content-Type', 'application/rss+xml; charset=UTF-8'); } ``` @@ -1117,9 +1117,9 @@ In `routes/web.php`, conditionally register the feed: declare(strict_types=1); use Illuminate\Support\Facades\Route; -use ManukMinasyan\FilamentBlog\Http\Controllers\BlogController; +use Relaticle\Ink\Http\Controllers\BlogController; -$prefix = config('filament-blog.prefix', 'blog'); +$prefix = config('ink.prefix', 'ink'); Route::prefix($prefix)->middleware('web')->group(function () { Route::get('/', [BlogController::class, 'index'])->name('blog.index'); @@ -1128,7 +1128,7 @@ Route::prefix($prefix)->middleware('web')->group(function () { ->middleware('signed') ->name('blog.preview'); - if (config('filament-blog.features.feed')) { + if (config('ink.features.feed')) { Route::get('/feed', [BlogController::class, 'feed'])->name('blog.feed'); } @@ -1144,9 +1144,9 @@ Route::prefix($prefix)->middleware('web')->group(function () { - {{ config('filament-blog.feed.title') ?? config('app.name') }} + {{ config('ink.feed.title') ?? config('app.name') }} {{ url('/') }} - {{ config('filament-blog.feed.description') ?? '' }} + {{ config('ink.feed.description') ?? '' }} en @foreach ($posts as $post) @@ -1156,8 +1156,8 @@ Route::prefix($prefix)->middleware('web')->group(function () { {{ \Illuminate\Support\Facades\Route::has('blog.show') ? route('blog.show', $post->slug) : url('/blog/'.$post->slug) }} {{ $post->published_at?->toRfc822String() }} excerpt }}]]> - @if (config('filament-blog.feed.author_email')) - {{ config('filament-blog.feed.author_email') }} + @if (config('ink.feed.author_email')) + {{ config('ink.feed.author_email') }} @endif @endforeach @@ -1198,9 +1198,9 @@ git commit -m "feat: add RSS feed route gated by features.feed" declare(strict_types=1); use Filament\Actions\Testing\TestAction; -use ManukMinasyan\FilamentBlog\Enums\PostStatus; -use ManukMinasyan\FilamentBlog\Filament\Resources\PostResource\Pages\ListPosts; -use ManukMinasyan\FilamentBlog\Models\Post; +use Relaticle\Ink\Enums\PostStatus; +use Relaticle\Ink\Filament\Resources\PostResource\Pages\ListPosts; +use Relaticle\Ink\Models\Post; use function Pest\Livewire\livewire; beforeEach(function () { @@ -1352,8 +1352,8 @@ git commit -m "feat(admin): add bulk publish/unpublish/schedule actions" declare(strict_types=1); use Laravel\Mcp\Server\Request; -use ManukMinasyan\FilamentBlog\Mcp\Tools\CreatePostTool; -use ManukMinasyan\FilamentBlog\Models\Post; +use Relaticle\Ink\Mcp\Tools\CreatePostTool; +use Relaticle\Ink\Models\Post; test('CreatePostTool strips HTML and unsafe links from content', function () { $user = (object) ['is_admin' => true]; @@ -1445,7 +1445,7 @@ git commit -m "fix(mcp): sanitize markdown in Create/UpdatePostTool (strip HTML, declare(strict_types=1); -use ManukMinasyan\FilamentBlog\Models\Post; +use Relaticle\Ink\Models\Post; test('readingTime computes minutes from content word count', function () { $post = Post::factory()->create([ @@ -1512,7 +1512,7 @@ Append to `tests/Feature/PostModelTest.php`: ```php test('relatedPosts returns same-category published posts excluding self', function () { - $cat = \ManukMinasyan\FilamentBlog\Models\Category::factory()->create(); + $cat = \Relaticle\Ink\Models\Category::factory()->create(); $self = Post::factory()->published()->create(['category_id' => $cat->id]); $a = Post::factory()->published()->create(['category_id' => $cat->id]); $b = Post::factory()->published()->create(['category_id' => $cat->id]); @@ -1617,7 +1617,7 @@ To get a working blog at `/blog` without writing any controllers, flip the feature flag: ```php -// config/filament-blog.php +// config/ink.php 'features' => [ 'public_routes' => true, // /blog, /blog/{slug}, /blog/category/{slug}, /blog/preview/{post} 'feed' => true, // adds /blog/feed (RSS 2.0) @@ -1633,7 +1633,7 @@ admin. Publish the views if you want to customize them: ```bash -php artisan vendor:publish --tag=filament-blog-views +php artisan vendor:publish --tag=ink-views ``` ``` @@ -1704,18 +1704,18 @@ git push -u origin feat/public-routes-phase-1 gh pr create --base main --title "feat: opt-in public routes (drop-in for Tapix/FilaForms blog) [Phase 1]" --body "$(cat <<'EOF' ## Summary -Phase 1 of the strategy laid out in `.context/blog-package-comparison.md` (in the demo workspace). Makes `manukminasyan/filament-blog` a drop-in replacement for the Tapix and FilaForms internal blog packages while keeping the headless-by-default behavior intact. +Phase 1 of the strategy laid out in `.context/blog-package-comparison.md` (in the demo workspace). Makes `relaticle/ink` a drop-in replacement for the Tapix and FilaForms internal blog packages while keeping the headless-by-default behavior intact. ## What's new -- **Public routes mode** (opt-in via `config('filament-blog.features.public_routes') = true`) +- **Public routes mode** (opt-in via `config('ink.features.public_routes') = true`) - `BlogController` + `routes/web.php` registering `blog.index`, `blog.show`, `blog.category`, `blog.preview` (signed) - Service provider loads routes at boot — no Filament panel needed - **RSS feed** (opt-in via `features.feed`) — `/blog/feed` returns RSS 2.0 - **Layout config** (`'layout' => 'layouts.app'`) for the page views to extend - **Bulk publish/unpublish/schedule actions** in `PostResource` - **MCP markdown sanitization** — `CreatePostTool` and `UpdatePostTool` now strip HTML and disallow unsafe links -- **`Post::readingTime()`** accessor and **`Post::relatedPosts()`** query, with `` wired to use them +- **`Post::readingTime()`** accessor and **`Post::relatedPosts()`** query, with `` wired to use them - **Test infrastructure** — Pest 3 + Orchestra Testbench, Pint config, GitHub Actions workflow - **README / docs** updated with the new mode diff --git a/resources/views/components/feed-link.blade.php b/resources/views/components/feed-link.blade.php index 70b8c7c..f07e12a 100644 --- a/resources/views/components/feed-link.blade.php +++ b/resources/views/components/feed-link.blade.php @@ -1,3 +1,3 @@ diff --git a/resources/views/components/feed.blade.php b/resources/views/components/feed.blade.php index 8954690..4784aad 100644 --- a/resources/views/components/feed.blade.php +++ b/resources/views/components/feed.blade.php @@ -1,9 +1,9 @@ @php echo ''; @endphp - {{ config('filament-blog.feed.title', config('app.name') . ' Blog') }} + {{ config('ink.feed.title', config('app.name') . ' Blog') }} {{ \Illuminate\Support\Facades\Route::has('blog.index') ? route('blog.index') : url('/') }} - {{ config('filament-blog.feed.description', '') }} + {{ config('ink.feed.description', '') }} en {{ $posts->first()?->published_at?->toRfc2822String() }} @if(\Illuminate\Support\Facades\Route::has('blog.feed')) @@ -22,8 +22,8 @@ @if($post->category) {{ $post->category->name }} @endif - @if(config('filament-blog.feed.author_email')) - {{ config('filament-blog.feed.author_email') }} ({{ $post->author?->name }}) + @if(config('ink.feed.author_email')) + {{ config('ink.feed.author_email') }} ({{ $post->author?->name }}) @endif @endforeach diff --git a/resources/views/components/post-card.blade.php b/resources/views/components/post-card.blade.php index 2488ed3..31631fa 100644 --- a/resources/views/components/post-card.blade.php +++ b/resources/views/components/post-card.blade.php @@ -3,7 +3,7 @@
@if($post->category) - + @endif @if($post->published_at)