Watch: build a custom component step by step
Follow a narrated workshop from Filament’s field generator to a reusable Composer package. Build a campaign brief with live channel previews and tracking links, then add typed configuration, your own CSS and JavaScript, table and infolist views, translations and AI-readable guidance.Jump to a workshop chapter
Jump to a workshop chapter
- 00:00 — Generate a custom Filament field with Artisan
- 02:04 — Reuse the real FLEX Text Input
- 02:49 — Configure a single Select field
- 03:35 — Configure the same Select as a searchable multi-select
- 04:34 — Position child fields in a Blade layout
- 05:16 — Add your component’s own JavaScript behavior
- 06:34 — Show missing data and publication readiness
- 07:08 — Build a copyable campaign brief
- 08:40 — Clean up listeners and handle async feedback
- 09:53 — Style your custom component with CSS
- 13:45 — Build the extension’s JavaScript and CSS assets
- 15:11 — Register dependencies and asset ownership
- 17:32 — Connect live previews to the shared form state
- 21:35 — Try the campaign brief builder
- 22:31 — Add an optional Color Picker per instance
- 24:14 — Validate the completed form in PHP
- 25:06 — Generate UTM campaign tracking links
- 29:56 — Scaffold a reusable component package
- 31:44 — Define typed configuration and child field options
- 36:12 — Form field, native Filament table column and infolist entry
- 42:52 — Add review guards and successful-copy notifications
- 46:57 — Build a custom settings dialog with asset readiness
- 52:13 — Add translations and right-to-left support
- 55:45 — Protect routes and expose AI-readable component guidance
- 59:42 — Validate schemas and explicitly migrate stored values
- 1:02:07 — Verify the complete component example
- 1:03:07 — Install through Composer and register with Filament
Compose existing fields
Build a call-to-action control with text, a URL and a Select.
Create a reusable package
Generate a field, table column and infolist entry in one package.
Use saved schemas
Select and configure registered component families from stored definitions.
Add AI guidance
Let assistants discover your component’s usage, examples and storage contract.
1. Compose a control from real fields
Watch the example: 02:04 — compose real child fields · 04:34 — place them in Blade. A composed control has a parent layout and real child fields. Each child keeps its own behavior; the parent decides how they are arranged and named. Add this to the schema of an existing Resource or form:label, url and target.
For ordinary Eloquent storage, provide a matching JSON column and array cast;
FLEX does not create the database column. If your application needs separate
columns or related rows, define that mapping in its save flow.
Every child still accepts its supported PHP options. Enabling emoji on the text
field does not enable it on other text fields, and choosing a parent layout does
not replace the child’s validation or asset ownership.
See the complete composition patterns.
2. Give one value several presentations
Watch the example: 36:12 — share a validated value across a field, table column and infolist entry. A component family can expose a field for editing, a column for tables and an entry for infolists. You can provide just the surfaces your application needs. For example, a Summary field can edit text while its column and entry display that same text. Shared appearance can be reused without loading the editor’s interactive JavaScript in the read-only views. The quickstart generates a working Summary package. Follow columns and entries when adding another presentation to your own family.3. Render components selected by a saved schema
Watch the example: 59:42 — validate configured family values · 1:01:26 — prepare an explicit value migration. Use a saved schema when the set of fields is configurable, such as product attributes or tenant settings. Your application registers which families are available and defines their supported configuration. A saved definition chooses from trusted, installed families. It does not contain executable PHP callbacks or invent a new renderer. Keep relationship queries, authorization and custom save logic in your application. This is optional. A normal field or a simple composition does not require a managed JSON field group. Learn about schema adapters, builders and saving values.How composition shares resources
A dependency declaration does not draw the child. Render its real PHP component
or use a child slot. Each rendered instance retains its own resource boundary,
including when the composition appears in a repeater, tab or modal.
See resource ownership,
typed Select children and
the child’s full PHP API.