The visual layout and widget composition engine for Capell CMS — content-first and drag-drop editing, responsive containers, reusable widgets, and safe public rendering.
capell-app/layout-builder is a Laravel package for the visual layout and widget composition engine for capell cms — content-first and drag-drop editing, responsive containers, reusable widgets, and safe public rendering..
It currently has 2 GitHub stars and 337 downloads on Packagist (latest version v1.0.49).
Install it with composer require capell-app/layout-builder.
Discover more Laravel packages by capell-app
or browse all Laravel packages to compare alternatives.
Last updated
Layout Builder is an Available, Schema-owning Capell package in the Capell Foundation product group. It ships as capell-app/layout-builder and extends these surfaces: admin, frontend, console.
Layout Builder adds a visual page composition workflow with layout areas, widgets, reusable widgets, presets, and reversible layout edits.
Editors can add, reorder, resize, and edit page widgets in admin. Visitors receive the saved layout graph as ordinary public output without authoring markers.
Status details:
capell-app/layout-builderCapell\LayoutBuilderFor developers: Registries and typed Actions provide stable extension points for widget definitions, layout widgets, presets, and public render data.
For teams: Choose Layout Builder when page composition changes; use Content Sections for reusable published sections or Structured Content Library for typed records such as testimonials and FAQs. Both can feed a Layout Builder composition. If a site only needs a few fixed templates, its existing Laravel templates may be enough.
Screenshot contract: docs/screenshots.json.
The Page and its blueprint remain Core inputs. Layout Builder owns the areas, widget keys, widget definitions, and widget assets that BuildPublicLayoutGraphAction turns into a public layout graph; Frontend owns the final public render contract.
What changes when you edit an article, its layout, or its theme? In this illustrative example, A day on the coast uses main for an article content widget and sidebar for a related-reading widget; these are example choices, not seeded defaults.
main and sidebar placements.Source: BuildPublicLayoutGraphAction maps layout containers and ordered widgets into public data; LayoutLoader resolves widgets and their assets. Page, Blueprint, Translation, Layout and Theme remain Core models; Widget and WidgetAsset belong to optional Layout Builder.


Capell\LayoutBuilder\LayoutBuilderServiceProviderAbstractFoundationWidgetServiceProviderpackages/layout-builder/config/capell-layout-builder.phppackages/layout-builder/database/migrations/2026_05_10_190841_02_create_widgets_table.phppackages/layout-builder/database/migrations/2026_05_10_190841_03_create_widget_assets_table.phppackages/layout-builder/database/migrations/2026_05_10_190841_04_create_widget_widgets_table.phppackages/layout-builder/database/migrations/2026_05_10_190841_05_add_container_widgets_to_layouts_table.phppackages/layout-builder/database/migrations/2026_05_10_190841_06_create_layout_presets_table.phppackages/layout-builder/database/migrations/2026_06_07_000001_create_layout_bulk_change_tables.phppackages/layout-builder/database/migrations/2026_07_09_000001_create_public_widget_snapshots_table.phppackages/layout-builder/database/migrations/2026_07_10_000001_add_linked_preset_fields_to_layout_presets_table.phppackages/layout-builder/database/migrations/2026_07_10_000002_create_layout_preset_usages_table.phppackages/layout-builder/database/migrations/2026_07_10_000003_create_layout_preset_sync_runs_table.phppackages/layout-builder/database/migrations/2026_08_28_000003_change_widget_visibility_to_datetime.phppackages/layout-builder/database/migrations/2026_09_01_000001_add_shadowed_by_workspace_id_to_widgets_table.phpLayoutLayoutBulkChangeResultLayoutBulkChangeRunLayoutPresetLayoutPresetSyncResultLayoutPresetSyncRunLayoutPresetUsagePublicWidgetSnapshotWidgetWidgetAssetWidgetWidgetCreateWidgetActionActionsRepeaterAlignSelectAssetTypeSelectAssetsRepeaterBackgroundSchemaBorderSelectCarouselSettingsSchemaColorSchemeComponentColumnInputContainerWidthSelectCustomColorInputHeadingSizeSelectHeadingStyleSelectHtmlClassInputLayoutTabMarginSelectPaddingSelectHeroEditorLayoutTabPageModelSelectResponsiveLayoutPatternSchemaResponsiveLayoutPatternSelectSizeSelectSpacingSelectTagSelectAdminSchemaComponentSectionCreateDetailsSchemaDisplaySectionResultsOverrideSchemaResultsSchemaSettingsSchemaWidgetAdminTabWidgetDisplayTabWidgetPresentationTabsWidgetSettingsTabTranslationsRepeaterTypeSelectWidgetFileUploadWidgetSelectDefaultLayoutContainerConfiguratorDefaultLayoutWidgetConfiguratorPageLayoutWidgetConfiguratorResultsLayoutWidgetConfiguratorWidgetTypeConfiguratorAbstractWidgetAssetConfiguratorAssetsWidgetConfiguratorCTASectionWidgetConfiguratorCardGridWidgetConfiguratorCarouselWidgetConfiguratorDefaultWidgetConfiguratorFeatureListWidgetConfiguratorHeroBannerWidgetConfiguratorHeroWidgetConfiguratorImageGalleryWidgetConfiguratorKitchenSinkReferenceWidgetConfiguratorModernAlternatingContentConfiguratorModernCTASectionConfiguratorModernCardGridConfiguratorModernFaqConfiguratorModernFeatureListConfiguratorModernHeroBannerConfiguratorModernImageGalleryConfiguratorModernPricingTableConfiguratorModernProcessStepsConfiguratorModernStatsSectionConfiguratorModernTeamMembersConfiguratorModernTestimonialsConfiguratorNavigationWidgetConfiguratorPageContentWidgetConfiguratorPageWidgetAssetFormRegisteredAssetWidgetAssetFormResultsWidgetConfiguratorSystemWidgetConfiguratorHeroPageSchemaExtenderLayoutBuilderResourceLayoutPresetResourceListLayoutPresetsLayoutResourceCreateLayoutEditLayoutListLayoutsLayoutSchemaExtenderLayoutsTablePageSchemaExtenderPageSelectionTableCreateWidgetEditWidgetListWidgetsLayoutsRelationManagerWidgetAssetsRelationManagerWidgetAssetFormWidgetFormWidgetAssetsTableWidgetSelectionTableWidgetsTableWidgetResourceLayoutHealthFilamentWidgetRecentActivityFilamentWidgetAuthorizesLayoutBuilderAccessHasLayoutActionsManagesAssetsManagesContainersManagesLayoutBuilderStateManagesWidgetsLayoutBuilderModalTableSelectLayoutBuilderActionFactoryLayoutPresetPolicyPublicLayoutWidgetAssetsRendererLayoutContainerSchemaExtenderWidgetAssetSchemaExtenderWidgetSchemaExtenderLayoutContainerThemePresentationProjectorLayoutContentGroupContributorLayoutSidebarWidgetContributorPublicLayoutWidgetPayloadContributorPublicLayoutWidgetPayloadResolverWidgetAssetReferenceRepointerWidgetExtensionBatchPayloadResolverWidgetExtensionDependencyResolverWidgetExtensionStateUpcasterWidgetSnapshotLocatorCipherAfterRecordSavedLayoutLoadedMaintainPublicWidgetSnapshotsListenerSiteTreeRebuiltTypeValidatedAddHeroWidgetToLayoutActionAddWidgetToLayoutContainerActionAnalyzeLayoutDiagnosticsActionAnalyzeLayoutHealthActionApplyLayoutPresetActionApplyLayoutSidebarWidgetContributionsActionApplyStarterLayoutPresetActionAttachWidgetToLayoutAreaActionBuildLayoutBuilderTreeActionBuildLayoutContentInventoryActionBuildLayoutHealthWorkQueueActionBuildPublicLayoutGraphActionBuildWidgetDeletionImpactActionBuildWidgetVisualRegressionManifestActionApplyLayoutBulkChangeRunActionApplyLayoutWidgetOperationToContainersActionPreviewLayoutBulkChangeActionQueueLayoutBulkChangeRunActionResolveLayoutBulkChangeTargetsActionRevertLayoutBulkChangeRunActionScopeLayoutBulkChangeQueryForActorActionCountLinkedLayoutPresetUsagesActionCreateHeroWidgetActionCreateLayoutBuilderDemoSiteActionCreateLayoutPresetSyncRunActionCreateLinkedLayoutPresetActionFindReusableWidgetsActionBuildLayoutBuilderFragmentReferenceActionRenderPublicFragmentActionResolveLayoutBuilderFragmentWidgetVersionActionGenerateLayoutPreviewImageActionGetLayoutPreviewImageUrlActionGetWidgetContainerWidthActionHeroWidgetHasPrimaryHeadingActionInsertLinkedLayoutPresetActionInstallLayoutBuilderPackageActionInstallLayoutBuilderWidgetCatalogActionInstallPackageActionInvalidateLayoutPreviewImageActionInvalidateTypeLayoutPreviewImagesActionInvalidateWidgetLayoutPreviewImagesActionBuildLayoutWidgetResourceUsagesActionRenderLazyLayoutWidgetActionLinkLayoutPresetContainerActionListLayoutPresetsActionMakeWidgetActionCreateLayoutFragmentActionNormalizeLayoutBuilderStateActionPasteLayoutFragmentActionPushLayoutMutationSnapshotActionRedoLayoutMutationSnapshotActionReorderLayoutContainerActionReorderLayoutWidgetActionResizeLayoutContainerActionUndoLayoutMutationSnapshotActionNormalizeLayoutContainerPaddingActionPersistLayoutBuilderStateActionPreviewLayoutPlanActionPruneLayoutBulkChangeRunsActionPublishLayoutBuilderAdminAssetsActionRenderAdminLayoutPreviewActionRepointWidgetAssetReferencesActionResetLayoutContainerThemeSettingsActionResolveAdminWidgetPreviewDataActionResolveLayoutAreaContainersActionResolveLayoutContainerPresentationActionResolvePublicWidgetAssetsActionResolvePublicWidgetRenderContextActionResolveWidgetPresentationDataActionRunLinkedLayoutPresetSyncActionSaveFormComponentRelationshipActionSaveLayoutPresetActionSeedLayoutBuilderScreenshotFixtureActionSeedWidgetIntegrityScreenshotFixturesActionSetupLayoutBuilderPackageActionStripLayoutPresetLinkActionSummarizeLayoutChangesActionSyncLayoutPresetUsagesActionUpdateLinkedLayoutPresetItemActionWidgetContractValidatorActionBuildPublicWidgetPayloadsActionRenderPublicWidgetExtensionActionResolveWidgetExtensionDependenciesActionRestoreWidgetInteractionContextActionWidgetIsSlotActionBuildPublicWidgetInteractionLocatorsActionPrunePublicWidgetSnapshotsActionRebuildPublicWidgetSnapshotsActionResolvePublicWidgetSnapshotActionRevokePublicWidgetSnapshotsActionWithdrawPublicWidgetSnapshotsActionAdminLayoutPreviewDataAdminWidgetPreviewDataActivityItemDataLayoutHealthDataLayoutHealthWorkQueueItemDataLeastUsedWidgetDataRecentActivityDataUnusedWidgetDataWidgetGroupDataDemoSitePlanDataLayoutAssetBridgeDataLayoutBuilderStateDataLayoutBuilderTreeContainerDataLayoutBuilderTreeDataLayoutBuilderTreeWidgetDataLayoutBulkChangeCriteriaDataLayoutBulkWidgetOperationDataLayoutBulkWidgetOperationResultDataLayoutChangeDataLayoutContainerPresentationDataLayoutContainerResponsivePaddingDataLayoutContainerSchemaContextDataLayoutContainerThemePresentationDataLayoutContentGroupDataLayoutContentInventoryContextDataLayoutContentInventoryDataLayoutContentItemDataLayoutDiagnosticDataLayoutFragmentDataLayoutMutationHistoryDataLayoutMutationNavigationDataLayoutMutationResultDataLayoutPlanDataLayoutPlanResultDataLayoutPresetDataLayoutPresetLinkDataLayoutSidebarWidgetDataLayoutWidgetCatalogDefinitionDataLayoutWidgetDefinitionDataPublicFragmentRenderResultDataPublicLayoutContainerDataPublicLayoutGraphDataPublicLayoutWidgetDataPublicWidgetRenderContextDataDiscoveredWidgetExtensionDataWidgetExtensionCapabilitiesDataWidgetExtensionCollisionDataWidgetExtensionDefinitionDataWidgetExtensionDependencyDataWidgetExtensionPayloadBatchDataWidgetExtensionPayloadInputDataWidgetExtensionRenderContextDataWidgetLayoutUsageDataWidgetScaffoldDataWidgetSnapshotLocatorDataApplyLayoutBulkChangeRunJobSyncLinkedLayoutPresetJobcapell:layout-builder-installcapell:layout-builder-widget-visual-regressioncapell:layout-builder:prune-bulk-change-runscapell:layouts:bulk-changecapell:widget-snapshots:pruneinstall: Capell\LayoutBuilder\Actions\InstallLayoutBuilderPackageActionpruneLayoutBulkChangeRuns: Capell\LayoutBuilder\Actions\PruneLayoutBulkChangeRunsActionsetup: Capell\LayoutBuilder\Actions\SetupLayoutBuilderPackageActioncapell:layout-builder:prune-bulk-change-runs (daily; manifest declared)capell:widget-snapshots:prune (daily; manifest declared)InstallCommandLayoutBulkChangeCommandPruneLayoutBulkChangeRunsCommandPrunePublicWidgetSnapshotsCommandResyncLayoutPresetCommandSeedLayoutBuilderScreenshotFixtureCommandWidgetVisualRegressionCommandadmin-resource: Capell\LayoutBuilder\Support\LayoutBuilderAdminRegistrarasset: Capell\LayoutBuilder\Support\LayoutBuilderAdminRegistrarconfigurator: Capell\LayoutBuilder\Support\LayoutBuilderAdminRegistrarconsole-command: Capell\LayoutBuilder\Manifest\LayoutBuilderConsoleCommandsContributionmigration: Capell\LayoutBuilder\Manifest\LayoutBuilderMigrationsContributionmodel: Capell\LayoutBuilder\Manifest\LayoutBuilderModelsContributionpage-type: Capell\LayoutBuilder\Manifest\LayoutBuilderPageTypesContributionroute: Capell\LayoutBuilder\Manifest\LayoutBuilderRoutesContributionscheduled-job: Capell\LayoutBuilder\Manifest\LayoutBuilderBulkChangePruneScheduleContributionscheduled-job: Capell\LayoutBuilder\Manifest\LayoutBuilderSnapshotPruneScheduleContributionschema-extender: Capell\LayoutBuilder\Support\LayoutBuilderAdminRegistrarCapell\LayoutBuilder\Health\LayoutBuilderHealthCheckpackages/layout-builder/resources/views/components/filament/layout-builder/asset.blade.phppackages/layout-builder/resources/views/components/filament/layout-builder/assets.blade.phppackages/layout-builder/resources/views/components/filament/layout-builder/container.blade.phppackages/layout-builder/resources/views/components/filament/layout-builder/drag-handle-icon.blade.phppackages/layout-builder/resources/views/components/filament/layout-builder/widget.blade.phppackages/layout-builder/resources/views/components/infolists/entries/layout-widget.blade.phppackages/layout-builder/resources/views/components/infolists/entries/layout-widgets.blade.phppackages/layout-builder/resources/views/components/layout-widget-assets.blade.phppackages/layout-builder/resources/views/components/layout-widgets/content.blade.phppackages/layout-builder/resources/views/components/layout-widgets/extension-gated.blade.phppackages/layout-builder/resources/views/components/layout-widgets/extension-unavailable.blade.phppackages/layout-builder/resources/views/components/layout-widgets/image.blade.phppackages/layout-builder/resources/views/components/layout-widgets/index.blade.phppackages/layout-builder/resources/views/components/layout-widgets/interaction-target.blade.phppackages/layout-builder/resources/views/components/layout-widgets/runtime-wrapper.blade.phppackages/layout-builder/resources/views/components/layout-widgets/title.blade.phppackages/layout-builder/resources/views/components/layout/area.blade.phppackages/layout-builder/resources/views/components/layout/container.blade.phppackages/layout-builder/resources/views/components/layout/main-content.blade.phppackages/layout-builder/resources/views/components/layout/widget.blade.phppackages/layout-builder/resources/views/filament/actions/layout-bulk-change-review.blade.phppackages/layout-builder/resources/views/filament/layout-builder/admin-preview/container.blade.phppackages/layout-builder/resources/views/filament/layout-builder/admin-preview/page.blade.phppackages/layout-builder/resources/views/filament/layout-builder/admin-preview/widget-fallback.blade.phppackages/layout-builder/resources/views/filament/layout-builder/previews/default.blade.phppackages/layout-builder/resources/views/filament/layout-builder/previews/page-content.blade.phppackages/layout-builder/resources/views/filament/resources/widgets/widget-card.blade.phppackages/layout-builder/resources/views/filament/widgets/layout-health.blade.phppackages/layout-builder/resources/views/filament/widgets/recent-activity.blade.phppackages/layout-builder/resources/views/frontend-authoring/filament-shell-assets.blade.phppackages/layout-builder/resources/views/frontend-authoring/layout-builder-editor.blade.phppackages/layout-builder/resources/views/livewire/filament/layout-builder/content-first.blade.phppackages/layout-builder/resources/views/livewire/filament/layout-builder/index.blade.phppackages/layout-builder/resources/views/livewire/filament/layout-builder/visual-editor-markup.blade.phppackages/layout-builder/resources/views/livewire/filament/layout-builder/visual-editor.blade.phppackages/layout-builder/resources/views/livewire/filament/layout-builder/visual-tree.blade.phppackages/layout-builder/resources/views/livewire/filament/layout-builder/widgets-table-select.blade.phplayout-builderlayouts, widgets, widget_assets, widget_widgets, layout_presets, layout_bulk_change_runs, layout_bulk_change_results, layout_preset_usages, layout_preset_sync_runs, layout_preset_sync_results, public_widget_snapshots.Layout, LayoutBulkChangeResult, LayoutBulkChangeRun, LayoutPreset, LayoutPresetSyncResult, LayoutPresetSyncRun, LayoutPresetUsage, PublicWidgetSnapshot, Widget, WidgetAsset, WidgetWidget.sites via site_id, languages via language_id, layouts via layout_id, widgets via widget_id, themes via theme_id.2026_05_10_190841_02_create_widgets_table.php, 2026_05_10_190841_03_create_widget_assets_table.php, 2026_05_10_190841_04_create_widget_widgets_table.php, 2026_05_10_190841_05_add_container_widgets_to_layouts_table.php, 2026_05_10_190841_06_create_layout_presets_table.php, 2026_06_07_000001_create_layout_bulk_change_tables.php, 2026_07_09_000001_create_public_widget_snapshots_table.php, 2026_07_10_000001_add_linked_preset_fields_to_layout_presets_table.php, 2026_07_10_000002_create_layout_preset_usages_table.php, 2026_07_10_000003_create_layout_preset_sync_runs_table.php, 2026_08_28_000003_change_widget_visibility_to_datetime.php, 2026_09_01_000001_add_shadowed_by_workspace_id_to_widgets_table.php.capell:widget-snapshots:prune (daily; declared in the manifest) and capell:layout-builder:prune-bulk-change-runs (daily; declared in the manifest).capell-app/core, capell-app/admin, capell-app/block-library, capell-app/frontend.admin-resource: LayoutBuilderAdminRegistrar; each Filament page or resource controls its own navigation visibility.configurator: LayoutBuilderAdminRegistrar, schema-extender: LayoutBuilderAdminRegistrar.ViewAny:Layout, View:Layout, Create:Layout, EditContent:Layout, EditLayout:Layout, Update:Layout, Delete:Layout, DeleteAny:Layout, Restore:Layout, ForceDelete:Layout, Replicate:Layout, Reorder:Layout, BulkMutate:Layout; access also governed by package policies: LayoutPresetPolicy.LayoutBuilderRoutesContribution.config/capell-layout-builder.php.capell:layout-builder:prune-bulk-change-runs (daily; manifest declared), capell:widget-snapshots:prune (daily; manifest declared); queue jobs ApplyLayoutBulkChangeRunJob, SyncLinkedLayoutPresetJob.layout-builder.capell:layout-builder-install, capell:layout-builder-widget-visual-regression, capell:layout-builder:prune-bulk-change-runs, capell:layouts:bulk-change, capell:widget-snapshots:prune.capell-app/core, capell-app/admin, capell-app/block-library, capell-app/frontend.config/capell-layout-builder.php.capell:layout-builder:prune-bulk-change-runs (daily; manifest declared), capell:widget-snapshots:prune (daily; manifest declared).layout-builder cache tags.| Symptom | Likely cause | Check | Fix |
| --- | --- | --- | --- |
| Package surface is missing after install | Provider or manifest is not loaded | Confirm capell.json, package composer.json, and provider registration | Reinstall the package, refresh Composer autoload, and clear host caches |
| Admin screen or command fails on missing table | Package migrations have not run | Check the tables listed in Data Model | Run host migrations and rerun the focused package test |
| Background work does not run | Queue worker or declared schedule is not active | Check the jobs and scheduled commands listed in Technical Shape | Start the queue worker or host scheduler, then run the focused command or package test |
| Public output leaks unexpected state | Render data, cache variation, or authoring boundary has regressed | Check public Blade, cache tags, and public-output safety tests | Move data loading out of Blade and rerun the package public-output tests |
composer require capell-app/layout-builder.php artisan capell:layout-builder-install./admin/layout-builder/widgets and confirm Layout Builder is available.config/capell-layout-builder.php.