1.0.0 shipped broken (a stale version field in composer.json caused Packagist to reject it). 1.0.2 is the first usable 1.x release and supersedes 1.0.0 entirely. Anyone on 1.0.0 should upgrade immediately.
Treat this as the real 1.x release notes.
wire:sortThe old wire:sortable directive (which came from the third-party [@wotz](https://github.com/wotz)/livewire-sortablejs library) has been replaced with Livewire 4's native wire:sort. The external CDN script is no longer loaded.
If you have custom code using the old directive, migrate:
Old ([@wotz](https://github.com/wotz)/livewire-sortablejs) |
New (Livewire 4 native) |
|---|---|
wire:sortable="method" |
wire:sort="method" |
wire:sortable.item="id" |
wire:sort:item="id" |
wire:sortable.handle |
wire:sort:handle |
wire:sortable.options="{...}" |
(removed — animations built in) |
Sort handler signatures change from (array $items) to ($id, $position). $position is zero-based and the method is called once per moved item.
The package's Quill-based elements (Text, HeadlineText) now register an Alpine component named pageComposerEditor instead of quillEditor. This avoids collisions with host apps that already define their own quillEditor Alpine component.
If you published element views (vendor:publish --tag=page-composer-elements), update your published copies:
<!-- before -->
<div x-data="quillEditor({})">
<!-- after -->
<div x-data="pageComposerEditor({})">
Support for Laravel 10–12, Livewire 3, and PHP 8.1–8.2 has been dropped. See the Upgrading from 0.1.x to 1.x section of the README for the full migration guide.
Quill's toolbar is now configurable via the quill_toolbar config key. The default is a minimal Normal / H1–H3 dropdown:
'quill_toolbar' => [
[['header' => [false, 1, 2, 3]]],
],
Add groups for more formatting options — see Quill's toolbar docs for the full syntax.
No external JS library is required anymore. The package ships with Livewire 4's built-in wire:sort for row and column reordering. Smooth animations are enabled by default.
->toArray()) and rehydrate fresh model instances on read. This prevents __PHP_Incomplete_Class errors on Illuminate\Database\Eloquent\Collection when cache entries span framework or cache-driver changes.ParseError in page-composer.blade.php caused by a nested inline array default inside [@json](https://github.com/json)(config(...)).version field from composer.json so Packagist derives the version from git tags. This is what prevented 1.0.0 from landing on Packagist.wire:model.defer (47 instances), $queryString on BugComponent, and legacy get*Property() accessors.These landed in the 1.0.0 tag and are still present in 1.0.2:
uniqid() with stable keys to stop Livewire components from re-mounting on every render (20+ call sites)uniqid() with Str::ulid() / Str::random(8) for filenames and element IDs (5 sites)namespace Foo\Bar;; (double-semicolon syntax errors)setInterval memory leak in flash message auto-hide (now setTimeout)return false in ImageUploadComponent::imageExists()$comlumn_key typo in ElementListcomposer update flobbos/page-composer.php artisan cache:clear
php artisan view:clear
php artisan config:clear
php artisan optimize:clear
quillEditor → pageComposerEditor in the published copies.wire:sortable code, migrate to wire:sort (see the table above).See the full migration guide in the README.
version field from composer.json that caused Packagist rejection on v1.0.0[@wotz](https://github.com/wotz)/livewire-sortablejs CDN dependency — Livewire 4 ships with built-in wire:sortable supportuniqid() usage with deterministic keys, preventing unnecessary component re-mounts on every renderwire:model.defer with wire:model across 14 blade files$queryString property to #[Url] attributes in BugComponentget*Property() accessors in favor of #[Computed] attributessetInterval memory leak in flash message auto-hide (now uses setTimeout)return false in ImageUploadComponent::imageExists()$comlumn_key typo in ElementListuniqid() with Str::ulid() for filenames and Str::random(8) for element IDsversion field from composer.json (Packagist derives version from git tags)[@wotz](https://github.com/wotz)/livewire-sortablejs CDN script has been removed. Livewire 4 ships with native wire:sortable support, so drag-and-drop works out of the box without any external JavaScript libraries.composer update flobbos/page-composerwire:model.defer usage in your custom elements and replace with wire:modelgetSortedRowsProperty(), getSortedColumnsProperty(), or getSortedElementsProperty(), use the #[Computed] attribute-based $this->sortedRows, $this->sortedColumns, or $this->sortedElements insteadRemoved the external [@wotz](https://github.com/wotz)/livewire-sortablejs library in favor of Livewire 4's built-in wire:sortable support. This means:
Replaced all uniqid() usage with stable, deterministic keys for Livewire components. This prevents unnecessary component re-mounting on every render cycle, resulting in better performance and more predictable state management.
wire:model.defer bindings with wire:model (deferred by default in Livewire 3+, removed in Livewire 4) across 47 instances in 14 blade files$queryString property to #[Url] attributes in BugComponentget*Property() accessor methods in favor of #[Computed] attributesnamespace Foo;;) in 9 component files (ColumnComponent, ImageUploadComponent, ElementList, CommentComponent, MultiSelect, SelectInput, DatePicker, LanguageComponent, CategoryComponent)setInterval with setTimeout for auto-hiding flash messages in page composer and page index viewsreturn false statement after an if/else block in ImageUploadComponent::imageExists()$comlumn_key to $column_key in ElementList componentdd() debug statement in PageComposerloadTemplate() methoduniqid() with Str::ulid() for filename generation (more unique, sortable)uniqid() with Str::random(8) for element IDsPageComposer.php — removed debug code, legacy accessor, commented blockRowComponent.php — removed legacy accessorColumnComponent.php — fixed namespace, removed legacy accessor, updated callersImageUploadComponent.php — fixed namespace, unreachable code, replaced uniqid()BugComponent.php — converted $queryString to #[Url], replaced uniqid()ElementList.php — fixed namespace, fixed typoCommentComponent.php — fixed namespaceCategoryComponent.php — fixed namespaceLanguageComponent.php — fixed namespaceDatePicker.php — fixed namespaceMultiSelect.php — fixed namespaceSelectInput.php — fixed namespaceElements/Photo.php — replaced uniqid()PageComposerServiceProvider.php — removed commented codepage-composer.blade.php — removed SortableJS CDN, stable keys, setTimeout fix, wire:model updatepage-index.blade.php — stable keys, setTimeout fixrow-component.blade.php — wire:model updatecolumn-component.blade.php — no changes needed (already clean)multi-select-input.blade.php — stable loop keysbase-element.blade.php — stable modal IDsettings/general.blade.php — stable component keyssettings/media.blade.php — stable component keyswire:model.defer -> wire:modelcomposer.json — PHP ^8.3, Laravel 13.*, Livewire ^4.0.gitignore — added .claude/README.md — updated compatibility table and Livewire version referencepage-composer:element now also creates the preview Blade component
resources/views/components/page-composer-elements/updatedSearch() lifecycle hookphotos column to store multiple filenameslivewire:move command with PHP rename() functionreset() methodtrim() to search input
$pages property, paginator now only returned from render()$target property and dispatch elementUpdated events for parent synchronization#[Computed] attributes to sortedElements(), sortedColumns(), and sortedRows() for query cachinguniqid() with stable component keys (based on source/locale/position) to enable Livewire component diffing instead of full re-renders$target property and event dispatch patternThere was a problem with the redirect after saving. I also updated the migration to make the photo field options in the pages table.
There was an issue with the entangle, at least in some instances, where the "Add row" button didn't show up although a language was selected. Fixed the issue with resorting to Livewire only to show the button.
There was an issue when saving an existing page inline that made the rows double upon saving and redirecting to the main page listing.
Fixed a problem with the Datepicker where the displayed weekdays were all over the place.
The previous release brought the inactive elements back but the checkboxes weren't playing along. Now they do.
The previous release hid the inactive elements in the admin which is counter productive so I removed that restraint.
Fixed the display issue for the FAQ component Added delete option for element in preview mode
Last release had all busted notifications. Sorry. This release should fix those issues
Added notifications for closing/reopening bug reports
Added simple notifications to the built in bug tracker. Can be switched off in config.
Fixed an issue with the event names in the page composer listener for main images
Fixed a bug in the image upload component Added bug user to config Added IDs to main post list
Fixed an issue with image previews and saving Added main user for bug component to fix "mark as read" feature
This is far from perfect but we're moving out of the beta stage.
In some cases you may want to extend the page model from the package which lead to broken use statements.
This should theoretically work as expected. Bugs still remain. Use at your own risk.
THIS RELEASE IS BROKEN!
Icon package removed again. Added SVG instead of css icon code
Made improvements to the file upload component to allow multiple of them to be used on the same Livewire component without conflict.
How can I help you explore Laravel packages today?