ojessecruz/simple-blog
Ready-to-use Laravel blog package: clean public listing, Livewire admin CRUD, Markdown with HTML escaping, and draft preview in a new tab. Authentication/authorization is up to you via configurable middleware (Gate, guard, etc.).
public_back_url config key — where the "Back to site" link on the public blog index points. Defaults to '/' (previous hardcoded behavior); set to null to hide the link, mirroring admin_back_url.author_model => null (the default) no longer fatals on the public pages. Post::author() used to fall back to the abstract Illuminate\Database\Eloquent\Model, which crashed as soon as a view touched the relation; it now binds to a concrete model with an always-false constraint, so the relation stays callable and simply resolves to no author (name falls back to "Team", avatar to null).author relation on the public index and category listings, removing an N+1 introduced when the templates started rendering author name/avatar per post.orchestra/testbench dev constraint now allows ^11.0, matching the Laravel 13 entry already exercised in CI.<x-blog::squiggle /> component — a hand-drawn SVG underline accent. It inherits its color from text-* classes (currentColor), so host apps can retheme it with a single utility class.Author contract gained getBlogAuthorAvatarUrl(): ?string, surfaced in the templates through Post::authorAvatarUrl(). Host models implementing the contract must add the method (returning null is fine — the templates fall back to an initials badge).index, show) with a more editorial layout while keeping the neutral zinc/emerald palette and dark mode support: serif-italic display title with a squiggle accent on the index, category navigation as bordered chips, mono uppercase category eyebrows, mono meta lines with ✦ separators, thick accent underline on hovered titles, serif-italic excerpt lede on the post page, and accent-underlined links, accent blockquotes and list markers in the post body typography. Apps that published the views (vendor:publish --tag="simple-blog-views-public") are unaffected; republish to adopt the new defaults.0.6.0 changelog entry. The 0.6.0 feature code (the simple-blog:install command) is unchanged; this patch only adds its changelog entry, which landed after 0.6.0 was already tagged. No functional changes.simple-blog:install command. One idempotent command publishes the config and migrations, registers the Tailwind v4 source by injecting [@import](https://github.com/import) '../../vendor/ojessecruz/simple-blog/resources/css/simple-blog.css'; into resources/css/app.css (right after the [@import](https://github.com/import) "tailwindcss"; line, or prepended when absent), and offers to run the migrations. A clean install is now composer require → php artisan simple-blog:install → npm run build instead of hand-editing CSS. Re-running is safe — it never duplicates the import — and when resources/css/app.css is missing it prints the line to add manually.resources/css/simple-blog.css. It registers the package views via [@source](https://github.com/source), so a consuming app enables the package's styling with a single [@import](https://github.com/import) '../../vendor/ojessecruz/simple-blog/resources/css/simple-blog.css'; from its main stylesheet instead of hardcoding the vendor path. Without it, Tailwind v4 never scans the package and the blog renders unstyled. The [@source](https://github.com/source) path is resolved relative to the package file, so it survives host-app restructuring.[@import](https://github.com/import)) and v3 (tailwind.config.js content) wiring.livewire/livewire constraint widens to ^3.5||^4.0, so the package installs cleanly alongside either major version. The full test suite passes against the Livewire 3.5 floor (with Laravel 11) and against Livewire 4.3 (with Laravel 12).blog.admin.post-index, blog.admin.post-form, blog.admin.category-index) instead of blog::admin.*. Livewire 4 reserves :: for namespace resolution and would fail to resolve the ::-style names, throwing ComponentNotFoundException. The new names resolve identically on Livewire 3 and 4. Routing is unaffected (admin routes reference the component classes directly).Post::published() scope now uses the scopePublished() naming convention instead of the #[Scope] attribute. The attribute (Illuminate\Database\Eloquent\Attributes\Scope) only exists in Laravel 12+, so on Laravel 11 the scope threw ArgumentCountError. This is the version range declared in composer.json (illuminate/contracts: ^11.0) but was never exercised in CI, which only ran Laravel 12/13. The conventional scopePublished() works across Laravel 11/12/13.text-zinc-900 dark:text-zinc-100 on the label and bg-white dark:bg-zinc-900 on the checkbox so it stops rendering as a bright white square against the dark card.max-w-7xl to match the post index, giving the split-view editor and preview panes enough horizontal room on wide screens.dark: variants. The host app's Tailwind config controls the strategy (media or class).en, pt_BR, and es locales. New locale config key in config/blog.php — null follows app()->getLocale(), a string pins the blog to that locale. Custom translations can be added via vendor:publish --tag="simple-blog-lang".Str::markdown() pipeline as the published post and uses inline styles, so it does not depend on the [@tailwindcss](https://github.com/tailwindcss)/typography plugin in the host app.How can I help you explore Laravel packages today?