Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Page Composer Laravel Package

flobbos/page-composer

View on GitHub
Deep Wiki
Context7
1.0.2

Release v1.0.2

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.

Platform Requirements

  • PHP 8.3+
  • Laravel 13.x
  • Livewire 4.x

Breaking Changes

Drag & drop migrated to Livewire 4's wire:sort

The 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.

Quill Alpine component renamed

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({})">

Minimum Laravel / Livewire / PHP versions

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.

New Features

Configurable Quill toolbar

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.

Native Livewire 4 drag & drop

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.

Bug Fixes

  • Cache hydration across framework upgrades: Lookup tables (languages, elements, categories, tags) now cache plain arrays (->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.
  • Blade parse error: Fixed a ParseError in page-composer.blade.php caused by a nested inline array default inside [@json](https://github.com/json)(config(...)).
  • Packagist rejection: Removed the hardcoded version field from composer.json so Packagist derives the version from git tags. This is what prevented 1.0.0 from landing on Packagist.
  • Livewire 4 serialization: Eliminated stale serialization patterns introduced by Livewire 3 — wire:model.defer (47 instances), $queryString on BugComponent, and legacy get*Property() accessors.

Quality-of-life fixes inherited from the 1.0.0 attempt

These landed in the 1.0.0 tag and are still present in 1.0.2:

  • Replaced uniqid() with stable keys to stop Livewire components from re-mounting on every render (20+ call sites)
  • Replaced uniqid() with Str::ulid() / Str::random(8) for filenames and element IDs (5 sites)
  • Fixed 9 files with namespace Foo\Bar;; (double-semicolon syntax errors)
  • Fixed setInterval memory leak in flash message auto-hide (now setTimeout)
  • Fixed unreachable return false in ImageUploadComponent::imageExists()
  • Fixed $comlumn_key typo in ElementList
  • Removed commented-out debug code, dead code blocks, and stale service provider entries

Upgrade Guide

  1. Bump your app to PHP 8.3+, Laravel 13, and Livewire 4.
  2. Run composer update flobbos/page-composer.
  3. Clear everything:
    php artisan cache:clear
    php artisan view:clear
    php artisan config:clear
    php artisan optimize:clear
    
  4. If you published element views, rename quillEditorpageComposerEditor in the published copies.
  5. If you built custom wire:sortable code, migrate to wire:sort (see the table above).

See the full migration guide in the README.

1.0.1

v. 1.0.1

  • Fix: Removed hardcoded version field from composer.json that caused Packagist rejection on v1.0.0

v. 1.0.0

  • Breaking: Minimum requirements raised to PHP 8.3+, Laravel 13, and Livewire 4
  • Native Drag & Drop: Removed external [@wotz](https://github.com/wotz)/livewire-sortablejs CDN dependency — Livewire 4 ships with built-in wire:sortable support
  • Stable Component Keys: Replaced all uniqid() usage with deterministic keys, preventing unnecessary component re-mounts on every render
  • Livewire 4 Modernization:
    • Replaced 47 instances of deprecated wire:model.defer with wire:model across 14 blade files
    • Converted legacy $queryString property to #[Url] attributes in BugComponent
    • Removed redundant get*Property() accessors in favor of #[Computed] attributes
  • Fixed: Double-semicolon namespace declarations in 9 component files
  • Fixed: setInterval memory leak in flash message auto-hide (now uses setTimeout)
  • Fixed: Unreachable return false in ImageUploadComponent::imageExists()
  • Fixed: $comlumn_key typo in ElementList
  • Cleanup: Removed commented-out debug code, dead code blocks, and stale service provider entries
  • Cleanup: Replaced uniqid() with Str::ulid() for filenames and Str::random(8) for element IDs
  • Cleanup: Removed hardcoded version field from composer.json (Packagist derives version from git tags)
1.0.0

Release v1.0.0

Breaking Changes

  • Minimum PHP version: 8.3+
  • Minimum Laravel version: 13.x (dropped support for Laravel 10, 11, 12)
  • Minimum Livewire version: 4.x (dropped support for Livewire 3)
  • Removed external SortableJS dependency: The [@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.

Upgrade Guide

  1. Ensure your application runs Laravel 13 and Livewire 4
  2. Run composer update flobbos/page-composer
  3. If you published element stubs or blade views, check for any wire:model.defer usage in your custom elements and replace with wire:model
  4. If you extended any components that used getSortedRowsProperty(), getSortedColumnsProperty(), or getSortedElementsProperty(), use the #[Computed] attribute-based $this->sortedRows, $this->sortedColumns, or $this->sortedElements instead

What's New

Native Drag & Drop

Removed the external [@wotz](https://github.com/wotz)/livewire-sortablejs library in favor of Livewire 4's built-in wire:sortable support. This means:

  • No more CDN script injection
  • Faster page loads
  • No third-party dependency for drag-and-drop functionality
  • Row reordering (mini map) and column reordering work natively

Stable Component Keys

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.

Modern Livewire 4 Patterns

  • Replaced all wire:model.defer bindings with wire:model (deferred by default in Livewire 3+, removed in Livewire 4) across 47 instances in 14 blade files
  • Converted legacy $queryString property to #[Url] attributes in BugComponent
  • Removed redundant get*Property() accessor methods in favor of #[Computed] attributes

Bug Fixes

  • Fixed namespace syntax errors: Corrected double-semicolon namespace declarations (namespace Foo;;) in 9 component files (ColumnComponent, ImageUploadComponent, ElementList, CommentComponent, MultiSelect, SelectInput, DatePicker, LanguageComponent, CategoryComponent)
  • Fixed memory leak: Replaced setInterval with setTimeout for auto-hiding flash messages in page composer and page index views
  • Fixed unreachable code: Removed dead return false statement after an if/else block in ImageUploadComponent::imageExists()
  • Fixed typo: Corrected $comlumn_key to $column_key in ElementList component

Code Quality

  • Removed commented-out dd() debug statement in PageComposer
  • Removed large commented-out code block in loadTemplate() method
  • Removed commented-out model publishing block in ServiceProvider
  • Replaced uniqid() with Str::ulid() for filename generation (more unique, sortable)
  • Replaced uniqid() with Str::random(8) for element IDs

Files Changed

PHP Components (14 files)

  • PageComposer.php — removed debug code, legacy accessor, commented block
  • RowComponent.php — removed legacy accessor
  • ColumnComponent.php — fixed namespace, removed legacy accessor, updated callers
  • ImageUploadComponent.php — fixed namespace, unreachable code, replaced uniqid()
  • BugComponent.php — converted $queryString to #[Url], replaced uniqid()
  • ElementList.php — fixed namespace, fixed typo
  • CommentComponent.php — fixed namespace
  • CategoryComponent.php — fixed namespace
  • LanguageComponent.php — fixed namespace
  • DatePicker.php — fixed namespace
  • MultiSelect.php — fixed namespace
  • SelectInput.php — fixed namespace
  • Elements/Photo.php — replaced uniqid()
  • PageComposerServiceProvider.php — removed commented code

Blade Views (22 files)

  • page-composer.blade.php — removed SortableJS CDN, stable keys, setTimeout fix, wire:model update
  • page-index.blade.php — stable keys, setTimeout fix
  • row-component.blade.phpwire:model update
  • column-component.blade.php — no changes needed (already clean)
  • multi-select-input.blade.php — stable loop keys
  • base-element.blade.php — stable modal ID
  • settings/general.blade.php — stable component keys
  • settings/media.blade.php — stable component keys
  • 14 element/component blade files — wire:model.defer -> wire:model

Config

  • composer.json — PHP ^8.3, Laravel 13.*, Livewire ^4.0
  • .gitignore — added .claude/
  • README.md — updated compatibility table and Livewire version reference
0.1.0
  • Livewire 3 Compatibility: Removed legacy model binding usage across editor flows
    • Replaced public model properties in key components with scalar IDs/arrays where needed
    • Updated media settings bindings to use scalar props instead of direct model access
    • Improved compatibility with Livewire 3/4 hydration and event flows
  • Row Editor Stability: Fixed row deletion rendering mismatch in page composer
    • Prevented key collisions after row deletion by preserving stable row keys
    • Added explicit wrapper keys in row rendering to ensure correct DOM diffing
  • Layout Composer Enhancements: Improved column preset and preview behavior
    • Added configurable column preset options
    • Updated segment/preview display behavior for clearer column layout feedback
  • Mini Map Improvements: Refined sorting and compact display behavior
    • Improved mini map ordering consistency
    • Tuned compact spacing and readability in dense page structures
0.0.20
  • Mini Map UI Tuning: Refined mini map row presentation for dense content pages
    • Reduced row/card spacing to improve readability with many rows
    • Kept drag handle placement reliable within row boundaries
    • Tightened per-column preview details to reduce visual noise
0.0.19
  • Element Generator Fix: page-composer:element now also creates the preview Blade component
    • Added preview stub generation alongside class and Livewire view generation
    • Preview files are now created in resources/views/components/page-composer-elements/
  • Element Registration Validation: Manual element registration now validates preview file presence
    • Validation now checks class file, Livewire view file, and preview Blade file before saving
    • Added clear validation error message when preview file is missing
  • Path Alignment: Unified preview component paths across creation and validation flows
    • Generator output path and admin validation path now point to the same directory
0.0.18
  • Element Component Registration: Enhanced manual component registration workflow
    • Added "Component Name" input field when skipping template generation
    • Users can now provide custom component directory name for existing custom components
    • Added server-side file path validation to ensure both class and view files exist
    • Clear error messages showing expected file paths when validation fails
  • Search Performance: Improved search efficiency
    • Implemented minimum 4-character threshold via updatedSearch() lifecycle hook
    • Searches with 1-3 characters are now skipped (no database query triggered)
    • Clearing search (empty string) still shows full list
    • Reduces query churn during user typing
  • User Confirmations: Added protection against accidental destructive actions
    • Added confirmation prompt before deleting bug reports
    • Added confirmation prompt before deleting templates
    • Page deletion already had confirmation modals in place
  • Fixed: Cleaned up duplicate "Version History" header in changelog
v0.0.17
  • Added 6 new out-of-the-box elements:
  • Hero/Banner (full-width background + overlay text + CTA)
  • Grid/Cards (services/features grid with icons/images)
  • Bullet List/Features (icon-based feature list)
  • Testimonials/Trust Badges (logos, badges, stats)
  • Accordion/FAQ (collapsible Q&A sections)
  • Call-to-Action Section (centered CTA block)
  • Added pagination to PageIndex component (15 items per page with WithPagination trait)
  • Added search functionality to PageIndex (searches ID, slug, name, title with live debounced search)
  • Bug Tracker Enhancement: Added support for multiple screenshots per bug report
    • Users can now upload up to 5 screenshots (2MB each) when creating/viewing bug reports
    • Multiple uploads supported across repeated file picker selections
    • Preview tiles with remove buttons before save
    • Maintains backward compatibility with existing single-photo bug entries
    • Added JSON photos column to store multiple filenames
  • Element Management: Made template generation optional during element creation
    • Added "Create element from template?" checkbox to element creation form
    • Artisan command only runs if checkbox is checked
    • Users can register elements without auto-generating component/view files
  • Element Renaming: Fixed component file renaming
    • Replaced non-existent livewire:move command with PHP rename() function
    • Properly renames both class file and blade view file when updating element name
  • Filter Reset: Fixed filter reset functionality on PageIndex
    • Changed from manual null assignment to using Livewire's reset() method
    • Properly clears URL parameter from query string
    • Added proper prop passing to filter component (Blade component)
  • Search Improvements: Added trim() to search input
    • Search now works correctly with leading/trailing spaces
    • Prevents empty-space searches from matching unintended results
  • Fixed: Pagination serialization error - removed public $pages property, paginator now only returned from render()
  • Fixed: Element data persistence - ensured all element components have $target property and dispatch elementUpdated events for parent synchronization
  • Fixed: "pagebuilder:element" command name reference to actual "page-composer:element" in ElementComponent
  • Performance: Added #[Computed] attributes to sortedElements(), sortedColumns(), and sortedRows() for query caching
  • Performance: Replaced uniqid() with stable component keys (based on source/locale/position) to enable Livewire component diffing instead of full re-renders
  • Updated element generator stub to include $target property and event dispatch pattern
v0.0.15

There was a problem with the redirect after saving. I also updated the migration to make the photo field options in the pages table.

v0.0.14

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.

v0.0.13

There was an issue when saving an existing page inline that made the rows double upon saving and redirecting to the main page listing.

v0.0.12

Fixed a problem with the Datepicker where the displayed weekdays were all over the place.

v0.0.11

The previous release brought the inactive elements back but the checkboxes weren't playing along. Now they do.

v0.0.10

The previous release hid the inactive elements in the admin which is counter productive so I removed that restraint.

v0.0.9

Fixed the display issue for the FAQ component Added delete option for element in preview mode

v0.0.8

Last release had all busted notifications. Sorry. This release should fix those issues

v0.0.7

Added notifications for closing/reopening bug reports

v0.0.6

Added simple notifications to the built in bug tracker. Can be switched off in config.

v0.0.5

Fixed an issue with the event names in the page composer listener for main images

v0.0.4

Fixed a bug in the image upload component Added bug user to config Added IDs to main post list

v0.0.3

Fixed an issue with image previews and saving Added main user for bug component to fix "mark as read" feature

v0.0.2
v0.0.1

This is far from perfect but we're moving out of the beta stage.

v0.0.3-beta
v0.0.2-beta

In some cases you may want to extend the page model from the package which lead to broken use statements.

v0.0.1-beta

This should theoretically work as expected. Bugs still remain. Use at your own risk.

v0.0.11-alpha
v0.0.10-alpha

THIS RELEASE IS BROKEN!

v0.0.9-alpha

Icon package removed again. Added SVG instead of css icon code

v0.0.8-alpha

Made improvements to the file upload component to allow multiple of them to be used on the same Livewire component without conflict.

Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
apiboxsym/user-bundle
apiboxsym/health-check-bundle
jayeshmepani/jpl-moshier-ephemeris-php
elnasnato/laraliveui
labrodev/rest-sdk
sampaui/sampaui
babelqueue/php-sdk
facebook/capi-param-builder-php
babelqueue/symfony
hamzi/corewatch
minionfactory/raw-hydrator
hexters/coinpayment
rjcodes/rjcms
act-training/laravel-permissions-manager
alimarchal/laravel-chart-of-accounts
babenkoivan/elastic-scout-driver
mkwebdesign/filament-watchdog-v5
renatomarinho/laravel-page-speed
zedmagdy/filament-business-hours
renatovdemoura/blade-elements-ui