PHPackages                             jiannius/atom - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Templating &amp; Views](/categories/templating)
4. /
5. jiannius/atom

ActiveLibrary[Templating &amp; Views](/categories/templating)

jiannius/atom
=============

Atom UI components

v3.6.2(1w ago)01.4kMITBladePHP ^8.3

Since May 11Pushed 2d ago1 watchersCompare

[ Source](https://github.com/jiannius/atom)[ Packagist](https://packagist.org/packages/jiannius/atom)[ RSS](/packages/jiannius-atom/feed)WikiDiscussions main Synced 2d ago

READMEChangelogDependencies (11)Versions (48)Used By (0)

Atom
====

[](#atom)

A Laravel UI component library built on **Tailwind + Alpine + Livewire 4**. Atom ships ~50 anonymous Blade components, a Livewire trait, an `atom()` runtime singleton for dispatching modals/toasts/alerts/confirms from PHP, a set of Laravel macros, and a pre-built JS/CSS bundle that the package serves itself — there is nothing to `npm install` in your host app.

- Composer: `jiannius/atom`
- Namespace: `Jiannius\Atom\`
- Custom Blade syntax: ``, ``, `` …

---

Requirements
------------

[](#requirements)

DependencyVersionPHP`^8.3`Laravel (illuminate/support)`^13.0`Livewire`^4.0`Intervention Image`^3.0`---

Installation
------------

[](#installation)

```
composer require jiannius/atom
```

The service provider (`Jiannius\Atom\AtomServiceProvider`) auto-registers via Laravel's package discovery. It will:

- Mount its routes under `/atom/*` (asset serving + action endpoint).
- Register all components under the `atom` view namespace.
- Install the `` Blade tag compiler.
- Swap Laravel's `Date` facade for `Jiannius\Atom\Services\Carbon`.
- Mix macros onto `Eloquent\Builder`, `Query\Builder`, `ComponentAttributeBag`, `Request`, `Str`, `Stringable`, and `Arr`.
- Register the artisan command `atom:purge-editor-images`.

No publishing step is required to get started.

### Page boilerplate

[](#page-boilerplate)

Use `` once at the top of any full-page Blade view. It writes the ``, ``, meta tags, Tailwind base, atom's bundled CSS/JS, and your host app's Vite entry.

```

        {{ $slot }}

```

Useful `` props (all optional):

PropPurpose`title``` and OG tag (falls back to `config('page.title')`).`description`Meta description / OG description.`image`OG image (defaults to `storage/img/logo.png`).`canonical`Canonical URL.`hreflang`Array of locale alternates.`jsonld`Raw JSON-LD payload.`gtm` / `ga` / `fbp`Tracking IDs for GTM, GA, Facebook Pixel.`fonts`Google Font family to preload (default `inter`).`dark`Adds `class="dark"` to ``.`styles`Additional stylesheet URLs.`scripts`Additional script URLs.`editor`Loads the editor CSS chunk (for pages using ``).`vite`Vite entries from your host app.`noindex`Sets `robots` to `noindex,nofollow`.The package's own JS/CSS bundle is served from `/atom/{file}` (immutable, hashed via `dist/manifest.json`); you do **not** need to add it to your Vite config.

### Component directory

[](#component-directory)

With the package installed and `APP_ENV=local`, visit **`/atom/docs`** in your app for a browsable directory of every component: live previews, copyable code snippets, auto-generated prop tables, and searchable icon/logo galleries. The routes are not registered outside the local environment.

### Service provider entry points (reference)

[](#service-provider-entry-points-reference)

If something feels magic, the answer is almost always in `src/AtomServiceProvider.php` (boot order: routes → migrations → translations → views → components → tag compiler → date facade swap → macros → asset routes → `/atom/action/{name}` POST endpoint).

---

The `` tag syntax
---------------------------

[](#the-atom-tag-syntax)

`src/Services/TagCompiler.php` rewrites tags before Blade compiles:

You writeResolves toFile`...``...``components/button/index.blade.php``````components/icon/check.blade.php``...``...``components/button/group.blade.php``````components/input/text.blade.php`Dot paths map to subdirectories. The classic `` form still works — `` is preferred for terseness.

---

Quickstart example
------------------

[](#quickstart-example)

A typical Livewire 4 form using Atom:

```
// app/Livewire/Customers/Create.php
namespace App\Livewire\Customers;

use Jiannius\Atom\Traits\AtomComponent;
use Livewire\Component;

class Create extends Component
{
    use AtomComponent;

    public $name;
    public $email;
    public $bio;

    public function breadcrumbs($crumbs)
    {
        return $crumbs
            ->home('Dashboard', route('home'))
            ->push('Customers', route('customers.index'))
            ->push('New Customer');
    }

    public function save()
    {
        $this->validate([
            'name' => 'required',
            'email' => 'required|email',
        ]);

        // ... persist

        $this->toast('Customer created', variant: 'success');
        return redirect()->route('customers.index');
    }

    public function render()
    {
        return view('livewire.customers.create');
    }
}
```

```
{{-- resources/views/livewire/customers/create.blade.php --}}

            Cancel
            Save

```

---

Helpers
-------

[](#helpers)

### The `atom()` singleton

[](#the-atom-singleton)

`app('atom')` (aliased) is a single entry point for runtime UI dispatch. Inside a Livewire component, prefer the trait methods (`$this->toast(...)`) — they delegate here but are shorter. Use `app('atom')->...` from controllers, jobs, or anywhere outside the component class.

```
app('atom')->modal('confirm-delete')->show();
app('atom')->modal('details')->slide('right');   // slide-over
app('atom')->modal('details')->close();

app('atom')->toast('Saved.', variant: 'success', delay: 4000);

app('atom')->alert(
    heading: 'Heads up',
    message: 'Your subscription expires tomorrow.',
    variant: 'warning',
    button: 'Got it',
);

app('atom')->confirm(
    heading: 'Delete customer?',
    message: 'This cannot be undone.',
    buttonConfirm: 'Delete',
    password: true,                       // require password re-entry
    onAccepted: 'reallyDelete',           // calls $wire.reallyDelete()
    onRejected: 'cancelDelete',
);

app('atom')->action('Foo.Bar', ['method' => 'doThing', ...$params]);

app('atom')->mail(
    to: $user->email,
    subject: 'Welcome',
    content: 'Hello!',
    cta: ['label' => 'Open dashboard', 'url' => route('home')],
    queue: true,
);

$breadcrumbs = app('atom')->breadcrumbs()
    ->home('Home', '/')
    ->push('Customers', route('customers.index'))
    ->push('Edit')
    ->build();

app('atom')->asset()->version('atom.js');     // → /atom/atom-{hash}.js
app('atom')->sitemap();
app('atom')->broadcast();
```

All `heading`, `subheading`, and `message` strings are auto-passed through `t()` for translation.

### Global functions (`src/Helpers.php`)

[](#global-functions-srchelpersphp)

FunctionPurpose`t($key, $count = 1, $params = [])`Translation shim. Number → `trans_choice`, array → `__($key, $array)`, scalar → `__($key, $params)`. Used internally by every component.`num($value)`Wraps Laravel's `Number` helper. Adds `->currency($iso, $rounding, $bracket, $abbreviate)` and `->filesize($precision)`. All other `Number::*` methods proxy through.`carbon(...$args)`Returns a `Jiannius\Atom\Services\Carbon` instance.`js($value)`Alias for `Js::from()`.`is_enum($value)`True for `UnitEnum` / `BackedEnum`.`is_using_trait($class, $trait)`True if `$class` (recursively) uses `$trait`.Examples:

```
t('Welcome :name', ['name' => $user->name]);
t('item.count', 5);                       // → trans_choice
num(1234.5)->currency('USD');             // → "USD 1,234.50"
num(2048)->filesize();                    // → "2 MB"
num(1500000)->currency('USD', abbreviate: true);  // → "USD 1.5M"
```

### The `AtomComponent` Livewire trait

[](#the-atomcomponent-livewire-trait)

`use Jiannius\Atom\Traits\AtomComponent;` on any Livewire component to get:

- `WithPagination` + `WithFileUploads` automatically.
- Reserved state buckets:
    - `$_breadcrumbs` — auto-populated from your optional `breadcrumbs($crumbs)` method.
    - `$_table` — sort, checkboxes, max rows, show-trashed (consumed by ``).
    - `$_editor.images` — temporary upload URLs for the rich text editor.
- Short methods that delegate to `app('atom')`:

```
$this->modal('name-of-modal')->show();
$this->toast('Saved!');
$this->alert(message: 'Done.');
$this->confirm(message: 'Sure?', onAccepted: 'doIt');
$this->action('Foo.Bar', $params);
$this->wirekey('row', $id);     // stable md5 key for wire:key
```

### The `Enum` trait

[](#the-enum-trait)

`use Jiannius\Atom\Traits\Enum;` on backed enums to get the convention used by Atom's status badges and selects:

```
enum OrderStatus: string {
    use \Jiannius\Atom\Traits\Enum;

    case NEW = 'new';
    case PAID = 'paid';
    case CANCELLED = 'cancelled';
}

OrderStatus::all();              // collection of cases (filters out TRASHED)
OrderStatus::get('paid');        // → OrderStatus::PAID
OrderStatus::PAID->label();      // → "Paid" (headline of value)
OrderStatus::PAID->color();      // → "green" (sensible mapping by value)
OrderStatus::PAID->toArray();    // → ['value' => ..., 'label' => ..., 'color' => ...]
OrderStatus::PAID->is('paid', OrderStatus::NEW);
```

---

Macros
------

[](#macros)

### Eloquent / Query `Builder` (`src/Macros/Builder.php`)

[](#eloquent--query-builder-srcmacrosbuilderphp)

```
User::query()->whereDateBetween('created_at', '2025-01-01 to 2025-12-31');
$q->toPage(2, 50);                       // paginate to page 2, 50 per page
$q->toTable();                           // paginate using $_table state from
$q->filter(['search' => 'tj', 'status:!=' => 'archived']);
$q->breakdown($diff, $start);            // group-by year/month/day for charts
$q->randomCode(8, 'code');               // unique random code
User::query()->tableColumns();           // cached SHOW COLUMNS
User::query()->tableHasColumn('email');
User::query()->tableColumnType('created_at');
```

`filter()` knows about: named scopes (`search`, `byFoo`), enum casts, JSON columns, date columns, and the `key:operator` syntax (`'price:>=' => 100`).

### `Request` (`src/Macros/Request.php`)

[](#request-srcmacrosrequestphp)

```
request()->portal();                     // → 'auth' | 'admin' | 'app' | etc., derived from route name
request()->portal('admin');              // → boolean
request()->subdomain();                  // → "client" from "client.app.test"
request()->hostWithoutSubdomain();
request()->isLivewireRequest();
```

### `Str` / `Stringable` (`src/Macros/Str.php`)

[](#str--stringable-srcmacrosstrphp)

```
str('foo.bar')->namespace();             // → "Foo\Bar"
str('App\Models\User')->dotpath();       // → "App.Models.User"
str('3 months')->interval();             // → "Quarterly"
str()->initials('Tan Joon Long');        // → "TJ"
```

### `Arr` (`src/Macros/Arr.php`)

[](#arr-srcmacrosarrphp)

```
Arr::pick(['xs' => false, 'sm' => true, 'lg' => false]);  // → "sm"
```

### `ComponentAttributeBag` (`src/Macros/ComponentAttributeBag.php`)

[](#componentattributebag-srcmacroscomponentattributebagphp)

Used inside component templates:

```
{{-- inside components/button/index.blade.php style code --}}
$attributes->size('md')                  {{-- → "xs"|"sm"|"md"|"lg"|... from `sm`/`md`/`lg` modifiers or size= --}}
$attributes->modifier()                  {{-- → "lazy", "live", etc. from wire:model.X --}}
$attributes->modifier('live')            {{-- → boolean --}}
$attributes->field()                     {{-- → field name from field=, for=, or wire:model --}}
$attributes->hasLike('wire:click*')
$attributes->getLike('x-on:click*')
$attributes->getAny('alt', 'title', 'aria-label')
$attributes->classes()->add('foo')->add($condition && 'bar')
$attributes->styles()->add('width', '100px')
```

---

Component catalog
-----------------

[](#component-catalog)

All components live in `components/`. Open `components//index.blade.php` (or `components/.blade.php`) to see the canonical `@props([...])` list. The tables below list the most-used props per component.

### Form inputs

[](#form-inputs)

TagNotable props / subcomponents```name`, `type` (`text`, `email`, `password`, `number`, `tel`, `color`), `label`, `caption`, `prefix`, `suffix`, `required`, `error`. Subs: ``, ``, ``, ``, ``, ``.```name`, `label`, `caption`, `rows` (default 3), `autoresize`, `variant="transparent"`.```name`, `label`, `caption`, `variant` (`native` (default), `listbox`, `filter`), `required`, `error`, `prefix`, `suffix`, `inline`. Children: ``, ``.```name`, `label`, `caption`, `align` (`start`, `center`, `end`). Group with ``.``Same as checkbox. Group with ``.```name`, `label`, `caption`. Group with ``.```name`, `variant` (`date`, `range`, `calendar`), `label`, `caption`, `inline`, `prefix`, `suffix`. Subs: ``, ``, ``.```name`, `label`, `caption`, `invalid`, `inline`.```label` (default `Upload`), `variant`, `size`. Drop variant: ``.``Tiptap rich text. `name`, `label`, `caption`, `readonly`, `autofocus`, `variant="transparent"`, `placeholder`, `toolbar`, `mention`. Many sub-buttons under `` and contextual menus under ``. Requires `` on the page.### Buttons &amp; links

[](#buttons--links)

TagNotable props```type` (`submit`, `delete`), `variant` (`primary`, `danger`, `accent`, `ghost`, `link`, `facebook`, `google`, `linkedin`, `whatsapp`, `telegram`), `size` (`xs`, `sm`, `md`, `lg`), `block`, `href`, `icon`, `iconSuffix`, `inverted`, `newtab`. Wraps `wire:click`, dispatches `confirmed` for `type="delete"` (auto-confirmed → `$wire.delete()`).``Layout helper for adjacent buttons.```href`, `icon`, `iconSuffix`, `variant="accent"`, `newtab`, `rel`.### Display &amp; typography

[](#display--typography)

TagNotable props```size` (`sm`, `default`, `lg`, `xl`, or `px`), `level` (`h1`..`h6`).``Same as heading, smaller / muted.``Small muted text.```icon`, `align`.```src`, `name`, `initial`, `square` (default `true`), `size` (`xs`..`xl`). Stack: ``.```status` (enum-aware), `size` (`xs`, `default`, `lg`), `icon`, `color`, `label`. Group: ``.```inset`, `subtle`, `divided`, `variant` (`stats`, `chart`), `heading`, `data`, `indicator`, `trend`, `color`.```icon`, `heading`, `content`, `variant` (`info`, `success`, `warning`, `danger`, `error`), `closeable`.``Animated loading block.```size="100%x20px"`.```icon` (default `inbox`), `size`, `subtle`, `heading`, `subheading`.```name`, `avatar`, `email`, `size`.``200+ icons. Examples: ``, ``, ``. Browse `components/icon/`.``Payment / brand marks: `apple-pay`, `fpx`, `google-pay`, `ipay88`, `master`, `senangpay`, `stripe`, `tng`, `visa`.### Feedback &amp; overlays

[](#feedback--overlays)

TagNotable props```name` (required for `atom()->modal($name)` to find it), `inset`, `dismissible`, `closeable`. Trigger via `` or `$this->modal('name')->show()` from PHP.``Window-bound. Triggered by `atom()->alert(...)`. Config keys: `heading`, `subheading`, `message`, `variant`, `button`, `onDismissed`.``Window-bound. Triggered by `atom()->toast(...)`. Config keys: `message`, `variant` (`success`, `warning`, `danger`), `delay` (default 3000), `position` (`top`, `bottom`, `center`), `align`.``Window-bound. Triggered by `atom()->confirm(...)`. Supports `password`, `passphrase`, optional reason field. Wires `onAccepted` / `onRejected` to Livewire methods.```interactive`, `position` (`top`, `bottom`, `left`, `right`), `align` (`start`, `center`, `end`), `content`, `kbd`, `toggleable`.```position` (`bottom`, `top`), `align` (`start`, `end`), `locked`.``Image lightbox; click any `` inside to zoom.The four window-level overlays (`alert`, `toast`, `confirm`) are usually dropped **once** in your root layout — drop them in `` or near `` and dispatch from anywhere.

### Layout &amp; navigation

[](#layout--navigation)

TagNotable props```inset`. Wraps form, handles auto loading state on submit.```empty`, `paginate`, `maxRows` (array of row options). Children: ``, ``, ``, ``, ``. Driven by `$_table` state on the Livewire component.```tabs` (array), `size` (`sm`), `variant` (`button`, `border`). Child: ``.```heading`, `scrollable` (default `true`). Child: ``.```popover`. Child: ``.``Sidebar nav container. Children: ``, ``, ``.```heading` (default `true`). Reads `$_breadcrumbs` populated by your `breadcrumbs()` method.```name`, `modes` (`calendar`, `timeline`), `periods` (`month`, `week`, `day`).```align` (`left`, `center`, `right`). Slot becomes the label.``Centered auth layout (login, register, forgot password).``App layout with sidebar + top bar.### Miscellaneous

[](#miscellaneous)

TagNotable props```value` — copy-to-clipboard button.``Dark-mode switcher (works with `class="dark"` on ``).``Definition list. Child: ``.```src`, `icon`, `file` — embeds image / video / YouTube / file preview.``Plain error message slot.``Page boilerplate (see [Page boilerplate](#page-boilerplate)).```sites` (array), `url`, `title` — social share buttons.```number`, `text` — floating WhatsApp button.---

The `AsEditorContent` cast
--------------------------

[](#the-aseditorcontent-cast)

Use this when you want a column to behave as Tiptap rich-text content with automatic image persistence:

```
use Jiannius\Atom\Casts\AsEditorContent;

class Article extends Model
{
    protected $casts = [
        'body' => AsEditorContent::class,
    ];
}
```

What it does on save:

1. Scans the HTML for Livewire temporary preview URLs (`/livewire-{hash}/preview-file/...`).
2. Resizes each via Intervention Image (max width 1000, quality 80).
3. Persists to `Storage::disk(env('FILESYSTEM_DISK'))` under `/editor/`.
4. Rewrites the URLs back into the HTML, serializes the result.

`get()` lazily `unserialize()`s, falling back to the raw value if it isn't serialized.

Pair with the scheduled command to clean up images no longer referenced:

```
php artisan atom:purge-editor-images          # dry-clean (move to editor-purged/)
php artisan atom:purge-editor-images --force  # delete the editor-purged/ backup
```

---

Actions
-------

[](#actions)

JS-callable PHP classes. Atom mounts `POST /atom/action/{name}` automatically, and the front-end exposes `window.atom.action('Foo.Bar', params)`.

```
// in Alpine or any component
const result = await window.atom.action('Customer.Search', { q: 'jane' });
```

```
// app/Actions/Customer/Search.php
namespace App\Actions\Customer;

class Search
{
    public function handle($params)
    {
        return \App\Models\Customer::query()
            ->where('name', 'like', '%'.$params['q'].'%')
            ->take(10)
            ->get();
    }
}
```

Resolution order:

1. `App\Actions\{Name}` (host app — wins).
2. `Jiannius\Atom\Actions\{Name}` (package fallback).

Pass `method` in `$params` to invoke something other than `handle`.

You can also call from PHP: `atom()->action('Customer.Search', ['q' => 'jane'])`.

### `GetOptions`: shared option lists

[](#getoptions-shared-option-lists)

`Jiannius\Atom\Actions\GetOptions` loads option arrays from JSON files. It merges:

- Package JSON at `/json/{name}.json`
- App JSON at `resource_path('json/{name}.json')`

with the app-side values taking precedence. Results are cached under `_options`.

Built-in JSON sets: `countries`, `postcodes`, `colors`. Override any of them by creating `resources/json/colors.json` in your host app.

---

Translation
-----------

[](#translation)

`t('Some string', $countOrParams, $params)` is the translation shim. Almost every UI string in components passes through it, so to translate your app you just drop standard Laravel translation files under `lang/{locale}/`.

```
t('Save changes');                      // → __('Save changes')
t('item.count', 5);                     // → trans_choice('item.count', 5)
t('Hello :name', ['name' => $user]);    // → __('Hello :name', ['name' => $user])
```

---

Front-end JS API
----------------

[](#front-end-js-api)

`resources/js/atom.js` is built to `dist/` and served by the package; it boots automatically when `` renders. It exposes:

- `window.atom.action(name, params)` — POST to `/atom/action/{name}`.
- `window.dd(...args)` — `console.log` dump.
- `window.empty(value)` — truthy-empty helper.
- Alpine factories: `modal`, `editor`, `select`, `tooltip`, `dropdown`, `lightbox`, `telInput`, `emailInput`, `breadcrumbs`, `datePicker`, `timePicker`, `dateRange`, `calendar`, plus chart variants.
- `$clipboard` Alpine magic.
- Prototype additions on `Array`, `Number`, `String` (see `resources/js/prototypes/`).
- Alpine plugins loaded: `@alpinejs/intersect`, `@marcreichel/alpine-autosize`.

---

Conventions worth knowing
-------------------------

[](#conventions-worth-knowing)

- Window-level Livewire events are prefixed `atom-` (`atom-modal-show`, `atom-modal-close`, `atom-toast-show`, `atom-alert-show`, `atom-confirm-show`). Grep by this prefix when tracing overlay state.
- `` auto-dispatches `confirmed` on accept, which (unless overridden) calls `$wire.delete()`.
- Date handling everywhere goes through `Jiannius\Atom\Services\Carbon` because of the `Date::use()` swap in the service provider.
- Components prefer `Arr::toCssClasses([...])` and `match` over conditional class strings. See `components/button/index.blade.php` for the canonical pattern.
- The bundled `dist/` directory is **committed**; the package serves it itself. If you fork and edit JS/CSS sources, run `npm run build` and commit `dist/`.

---

Artisan commands
----------------

[](#artisan-commands)

CommandPurpose`atom:purge-editor-images`Walks `App\Models\*`, finds columns cast as `AsEditorContent`, and moves any unreferenced editor image to `editor-purged/` on the local disk before removing from the configured disk.`atom:purge-editor-images --force`Empties the `editor-purged/` backup folder.---

License
-------

[](#license)

MIT. See `LICENSE.md`.

###  Health Score

50

—

FairBetter than 95% of packages

Maintenance99

Actively maintained with recent releases

Popularity20

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity61

Established project with proven stability

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~1 days

Total

47

Last Release

8d ago

Major Versions

v1.0.0 → v2.0.02026-05-12

v2.0.0 → v3.0.02026-05-12

v1.0.1 → v2.0.12026-05-12

v2.0.1 → v3.0.22026-05-12

v1.0.2 → v3.1.02026-05-29

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/101174228?v=4)[Jiannius Technologies Sdn. Bhd.](/maintainers/jiannius)[@jiannius](https://github.com/jiannius)

---

Top Contributors

[![tjloong](https://avatars.githubusercontent.com/u/2275921?v=4)](https://github.com/tjloong "tjloong (188 commits)")

###  Code Quality

TestsPest

### Embed Badge

![Health badge](/badges/jiannius-atom/health.svg)

```
[![Health](https://phpackages.com/badges/jiannius-atom/health.svg)](https://phpackages.com/packages/jiannius-atom)
```

###  Alternatives

[tallstackui/tallstackui

TallStackUI is a powerful suite of Blade components that elevate your workflow of Livewire applications.

725173.2k14](/packages/tallstackui-tallstackui)[craftcms/cms

Craft CMS

3.6k3.6M3.1k](/packages/craftcms-cms)[hasinhayder/tyro-dashboard

Tyro Dashboard - Beautiful admin dashboard for managing Tyro roles, privileges, users, and settings

5443.8k](/packages/hasinhayder-tyro-dashboard)[mati365/ckeditor5-livewire

CKEditor 5 integration for Laravel Livewire

447.9k](/packages/mati365-ckeditor5-livewire)[wendelladriel/slidewire

Create beautiful presentations powered by Livewire

1342.9k](/packages/wendelladriel-slidewire)[fleetbase/core-api

Core Framework and Resources for Fleetbase API

1235.9k20](/packages/fleetbase-core-api)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
