P
Recherches récentes

// the page builder

An editor that
writes Blade.

Drag in sections, columns, blocks. On every save, the builder writes static Blade files to disk. No dynamic rendering in production, no technical debt — just compiled, fast HTML.

Builder — home.blade
â—Ź live

blocks

Hero
Columns
Pricing
Gallery
Accordion
section · hero grid · 12

// the workflow

From screen to file, in one save.

01

Drag a block

Sections, columns, blocks from the sidebar. Drag & drop, reorderable, nestable.

02

Edit

Inline or in a CodeMirror modal for CSS / HTML. CSS scoped per block, dark-mode support.

03

Save

The BladePageGenerator writes a static Blade file to disk. In production: zero dynamic rendering.

// what you can do

Built for real projects.

  • Scoped CSS per block

    Each section has its CSS isolated by #section-id, with html.dark support for dark mode.

  • CodeMirror editing

    CSS / HTML editing modal with syntax highlighting, right inside the builder.

  • Native multilingual

    One page, several locales. Copy content from one language to another in one click.

  • Shared sections

    Reuse a section across several pages. One edit propagates everywhere.

  • Responsive per column

    Independent breakpoints on each column: stacked on mobile, grid on desktop.

  • Roles & visibility

    Mark blocks as dev_only: invisible to non-developer users.

  • Import / export JSON

    Export a page or a block, re-import it elsewhere. Versionable, shareable.

  • 20+ native blocks

    Heading, columns, slider, pricing, form, map… and each module adds its own.

// extensible

Each module
brings its own blocks.

The builder doesn't know your blocks in advance: it discovers them. A module declares its types via getBuilderConfig(), and the BuilderManager exposes them in the editor. You write a generator, you get a block — drag & drop, properties, Blade rendering.

  • DĂ©couverte auto via getBuilderConfig()

  • Un gĂ©nĂ©rateur PHP = un bloc dans l'Ă©diteur

  • Namespace isolĂ© : Punky\{Module}

Module.php
public function getBuilderConfig(): array
{
 return [
 'blocks' => [
 'product-grid' => [
 'label'     => 'Product grid',
 'generator' => ProductGridGenerator::class,
 'icon'      => 'grid',
 ],
 ],
 ];
}

↑ the block shows up in the builder sidebar

Explore the blocks.