Integrates the Trix Editor with Laravel. Inspired by the Action Text gem from Rails.

Overview

Logo Rich Text Laravel

Total Downloads License

Integrates the Trix Editor with Laravel. Inspired by the Action Text gem from Rails.

Installation

You can install the package via composer:

composer require tonysm/rich-text-laravel

Usage

We're going to extract attachments before saving the rich text field (which uses Trix) in the database. We replace the attachment with rich-text-attachable tag with an sgid. When rendering that rich content again, we can render the attachables. This works for Remote URLs and for any Attachable record (more on that later).

The way this works is that we're going to add cast to any Rich Text field on any model, like so:

use Tonysm\RichTextLaravel\Casts\AsRichTextContent;

class Post extends Model
{
    protected $casts = [
        'content' => AsRichTextContent::class,
    ];
}

Then this will convert this:

Something cool
HTML, ]) ">
$post->update([
    'content' => <<<HTML
    

Hello World

'{ "url": "http://example.com/image.jpg", "width": 300, "height": 150, "contentType": "image/jpeg", "caption": "Something cool" }'> "http://example.com/image.jpg" width="300" height="150" /> Something cool
HTML, ])

to this:

">
<div>
    <h1>Hello Worldh1>
    <rich-text-attachable sgid="ALSklmasdklmKNAFKNAsdknknkn1@Kasd...==">rich-text-attachable>
div>

And when it renders it again, it will re-render the remote image again inside the rich-text-attachable tag.

Attaching Models

You can have any model on your application as attachable inside a Trix rich text field. To do that, you need to implement the AttachableContract and use the Attachable trait in a model. Besides that, you also have to implement a richTextRender(): string where you can tell the package how to render that model inside Trix:

use Tonysm\RichTextLaravel\Attachables\AttachableContract;
use Tonysm\RichTextLaravel\Attachables\Attachable;

class User extends Model implements AttachableContract
{
    use Attachable;

    public function richTextRender(): string
    {
        return view('users._mention', [
            'user' => $this,
        ])->render();
    }
}

Then inside that users._mention Blade template you have full control over the HTML for this attachable field.

Getting Attachables

You can retrieve all the attachables of a rich content field using the attachables() method from the content instance:

$post->content->attachables()

This will return a collection of all the attachables (anything that is attachable, really, so images and users, in this case).

Testing

composer test

Changelog

Please see CHANGELOG for more information on what has changed recently.

Contributing

Please see CONTRIBUTING for details.

Security Vulnerabilities

Please review our security policy on how to report security vulnerabilities.

Credits

License

The MIT License (MIT). Please see License File for more information.

Comments
  • Attachments that are not images throw error

    Attachments that are not images throw error

    In some cases, things like CSVs, PDFs, and other file types throw this error when they are uploaded the form is submitted:

    Attempt to read property "childNodes" on null

    This is where the error occurs:

    Illuminate\Foundation\Bootstrap\HandleExceptions::handleError
    vendor/tonysm/rich-text-laravel/src/Fragment.php:78
    
    opened by mrpritchett 14
  • No practical way to link an image upload to a model (e.g. Spatie's Media Library)?

    No practical way to link an image upload to a model (e.g. Spatie's Media Library)?

    Thanks for a great package πŸ™ Just wanted to open a discussion about deeper integration between attachments and uploaded files, as I've been trying to wrangle this to work but am having a fair bit of difficulty.

    The docs give a simple example of handling image uploads, and suggest more advanced implementations are possible with things like Spatie's Media Library package. I've been trying to set that up, but keep hitting a few issues. There's quite a bit of detail here but to summarise:

    • The built-in RemoteImage attachable format can fully support captions and gallery views, because it has access to the DOMElement during construction.
    • By replacing this with a custom Media attachable, captions and gallery layouts are no longer possible (or at least, not in any easy way).
    • If you simply handle the upload as a non-attachable Media file, you lose the advantages of being able to re-style or format an SGID-based attachment, and need to manually track associations between the rich-text entry and the Media Library.

    Ideally, there should first-class support for things like Media which render simple images, at the same level we can get with normal RemoteImage attachables. I think one of the places to start would be by changing AttachableFactory:

    public static function fromNode(DOMElement $node): Attachables\AttachableContract
    {
        if ($node->hasAttribute('sgid') && $attachable = static::attachableFromSgid($node->getAttribute('sgid'))) {
            return $attachable;
        }
    
        if ($attachable = ContentAttachment::fromNode($node)) {
            return $attachable;
        }
    
        if ($attachable = RemoteImage::fromNode($node)) {
            return $attachable;
        }
    
        if ($attachable = RemoteFile::fromNode($node)) {
            return $attachable;
        }
    
        return new Attachables\MissingAttachable();
    }
    
    • This parses each Trix node to figure out which Attachable to use
    • A RemoteImage attachable is able to construct itself with extra detail from Trix, as it's created using ::fromNode($node)
    • Any node which has an sgid attribute doesn't receive the DOMElement, so custom Attachable models for images lose access to the caption, galleries, etc.

    I started trying to work around this with a custom AsRichTextContent cast on my Eloquent model (though at the loss of being able to store rich text in a separate table). This cast extends \Tonysm\RichTextLaravel\Casts\AsRichTextContent, then I also had to extend a version of \Tonysm\RichTextLaravel\Content to handle different processing.

    In my extended Content class, I had to override the attachables() function to use a custom AttachableFactory:

    public function attachables(): Collection
    {
        return $this->cachedAttachables ??= $this->attachmentNodes()->map(
            fn(DOMElement $node) => (CustomAttachableFactory::fromNode($node))
        );
    }
    

    Then used an overridden fromNode() method in the custom factory:

    public static function fromNode(DOMElement $node): \Tonysm\RichTextLaravel\Attachables\AttachableContract
    {
        if ($node->hasAttribute('sgid') && $attachable = static::attachableFromSgid($node->getAttribute('sgid'))) {
            if (! $attachable instanceof Media) {
                return $attachable;
            }
    
            if ($mediaAttachable = $attachable->mediaAttachableFromNode($node)) {
                return $mediaAttachable;
            }
        }
    
        return parent::fromNode($node);
    }
    

    This is where it started getting really messy... Extending classes became almost impossible as the inheritance tree gets very complex with lots of private methods. I had to extend 7 different classes just to get a Media instance, with an SGID, to be treated the same way as a RemoteImage in parsing. That's why I had to use a specific mediaAttachableFromNode() method, which returns a new static MediaRemoteImage class (extending RemoteImage)...

    Even after things seemed to working as I'd hoped, there are some weird quirks going on (e.g. captions appearing twice) β€” so I think I'm going to have to scrap this way of doing things, as it seems too fragile.

    I appreciate that was a lot of detail, and this is an excellent package in every other regard! Just wanted to share how I went about trying to solve this, and maybe discuss some solutions or workarounds? Thank you 😊

    opened by JackWH 9
  • Not able to install

    Not able to install

    Please why is this showing?

    [InvalidArgumentException]                                                                                       
    Package tonysm/rich-text-laravel has a PHP requirement incompatible with your PHP version, PHP extensions
     and Composer version
    

    image

    opened by cletuskingdom 7
  • RFC: The Rich Text Model

    RFC: The Rich Text Model

    The current implementation of the package suggests using a custom caster to the rich text field on any model. Although that's easy enough to use, the ActionText gem is a bit more opinionated. Instead of having rich text columns on multiple tables, the idea is to centralize them all in a single table.

    This idea is mentioned briefly in the ActionText introduction video (link with timestamps), but basically it consists of the package shipping with a polymorphic model that stores all rich text content from the application. The trade-off here is that we have to interact with a relationship instead of an attribute. This changes the DX quite a bit.

    Rails does some meta-programming to improve the DX of interacting with the rich content realtionship. I'm not sure if this will be possible with Eloquent. Here's what it would look like:

    class Post < ApplicationRecord
      has_rich_text :content
    end
    
    class PostsController < ApplicationController
      def create
        post = Post.create! params.require(:title, :content)
        redirect_to post
      end
    end
    

    Although it looks like we're setting the content attribute in the post model, it's actually setting the body field in the content relationship. That relationship, when called, will return the rich content model for the body field (you could have multiple rich text fields on the same model, so the rich text model holds a backreference to the field name). Saving the post model, also saves the related data. For more, here's the ruby code that adds the methods to the model with meta-programming.

    Having them as a relationship keeps the other models in the application lean (they only have their own attributes, which occupy way less memory when interacting with them), leaving the rich content only when you need to use it (by either eager loading or just lazy loading them). I feel like this is a safe bet. However, I don't how we would we could achieve a similar API for this in Eloquent.

    I'll play around with some APIs, but if you have any ideas, let me know.

    Some open ideas/questions:

    1. I want to be able to create dynamic accessors/mutators based on property in the model (see Example 1), is that possible?
    2. I think we can use dynamic relationships here
    3. I also need to be able to create some scopes dynamically (see Example 1), not sure if this is possible.

    Example 1

    This is what the RichText model could look like:

    class RichText extends Model
    {
      protected $fillable = ['field', 'body'];
    
      protected $casts = [
        'body' => AsRichTextContent::class,
      ];
    
      public function record()
      {
        return $this->morphTo();
      }
    
      public function __call($method, $arguments)
      {
        if (method_exists($this->body, $method)) {
          return $this->body->{$method}(...$arguments);
        }
    
        return parent::__call($method, $arguments);
      }
    
      public function __toString()
      {
        return $this->body->render();
      }
    }
    

    There would be a trait for applying some things to the entity that has rich text fields:

    class Post extends Model
    {
      use HasRichText;
    
      protected $richTextFields = [
        'body',
      ];
    }
    

    When the HasRichText boots, it would fetch the $richTextFields property for the fields and create the relationship and dynamic accessors/mutators for that field, something like (🚧 pseudo-code below 🚧):

    trait HasRichText
    {
      public static function bootHasRichText()
      {
        $richTextFields = (new static)->richTextFields;
    
        foreach ($richTextFields as $field)
        {
          static::defineRichTextRelationships($field);
          static::defineRichTextScopes($field);
          static::defineRichTextAccessorsAndMutators($field);
        }
      }
    
      protected static function defineRichTextRelationships(string $field)
      {
        // I think this is the only thing that actually works...
        static::resolveRelationUsing($field, function ($postModel) use ($field) {
          return $postModel->morphOne(RichText::class, 'record')->where('field', $field);
        });
      }
    
      protected static function defineRichTextScopes(string $field)
      {
        static::resolveScopeUsing('withRichText' . Str::studly($field), function ($query) use ($field) {
          $query->with($field);
        });
      }
    
      protected static function defineRichTextAccessorAndMutators(string $field)
      {
        static::resolveAccessorUsing($field, function () use ($field) {
          // return the existing rich text model or make one on the fly.
          return $this->{$field} ?: $this->{$field}()->make(['field'=> $field]);
        });
    
        static::resolveMutatorUsing($field, function ($content) {
          // This will use the accessor above, so it will always return an instance of the rich text model.
          return $this->{$field}->body = $content;
        });
      }
    
      public function scopeWithAllRichTextContent($query)
      {
         // Eager load everything.
    
         foreach ($this->richTextFields as $field)
         {
           $query->{'withRichText' . Str::studly($field)}();
         }
      }
    }
    

    This would allow an API like this:

    // Setting looks like an attribute, but it's actually setting on the dynamic relationship.
    $post = Post::create(['title' => $title, 'body' => $body]);
    
    // Fetching posts won't include the rich text content by default, you could lazy-load it:
    $posts = Post::withRichTextBody()->get();
    
    // Eager loading all rich text fields on the post model (assuming there 
    // are multiple fields that are rich text on the post model):
    $posts = Post::withAllRichTextContent()->get();
    

    The rich text content would forward calls to the content field, so things like:

    // The first "body" is the relationship, the second "body" is the rich text field on the RichText model... 
    $post->body->body->attachments();
    

    Would be the same as:

    $post->body->attachments();
    

    Rendering the model would also render the content:

    {{ $post->body }}
    

    This is pseudo-code, not sure how much of this will be possible.

    opened by tonysm 5
  • Hangs with Livewire and L9?

    Hangs with Livewire and L9?

    Trying to get this working on a Livewire component. But as soon as we submit the form, the whole page times out. It only times out when we try saving the related model. Remove that, and the form submits fine (but obviously no content saves).

    We have HasRichText on the Account model. about is the field content saving.

        {
            $this->validate();
            $this->account->about = 'test';
            $this->account->save();                  // remove this and everything processes fine.
    
            return redirect(route('settings.preferences.listing'));
        }
        
        
    opened by brandon-9 3
  • Handle image galleries

    Handle image galleries

    Not sure if there is anything we need to do differently, but there are some references to image galleries in the ActionText gem.

    I think I need to set up file upload to properly test this.

    opened by tonysm 3
  • Improve the `richtext:install` command

    Improve the `richtext:install` command

    The command is currently dumping some needed CSS and stuff. There might be a better way to deal with this.

    Also, would be great to detect if users are using the Importmap Laravel package instead of Mix and act accordingly.

    opened by tonysm 2
  • Update documentation about mews/purifier and email rendering

    Update documentation about mews/purifier and email rendering

    Just a brief documentation update, I noticed a misconfiguration in the mews/purifier suggested config which threw an error every time it tried to decode Trix markup for rendering.

    I've removed the attribute data-turbo-frame from a elements, as it's not supported by Purifier (nor would we expect Trix's rendered output to contain it).

    Thanks!

    opened by JackWH 1
  • Feature Request - Oembed support with Content Attachments

    Feature Request - Oembed support with Content Attachments

    Is it possible to integrate oEmbed support with content attachments? My brain says it should be, but I haven't had enough coffee yet to work out how this would work practically.

    opened by mrpritchett 1
  • Change Attachment Serialization

    Change Attachment Serialization

    The first implementation was based on what I thought the gem was doing. After a bit of digging, I noticed that it doesn't serialize the entire list of attributes and all that. I think we can probably reduce the size of the SGID or something.

    What was sent in the browser:

    <div>
        <figure
            data-trix-attachment="{&quot;contentType&quot;:&quot;image/png&quot;,&quot;filename&quot;:&quot;blue.png&quot;,&quot;filesize&quot;:1168,&quot;height&quot;:300,&quot;previewable&quot;:true,&quot;sgid&quot;:&quot;BAh7CEkYWN0aW9uLXRleHQtdGVz--73b0fe9c92a450323dd9dd8136968a0f973c&quot;,&quot;url&quot;:&quot;http://localhost:3000/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBCZz09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--aksmdk--123/blue.png&quot;,&quot;width&quot;:300}"
            data-trix-content-type="image/png"
            data-trix-attributes="{&quot;presentation&quot;:&quot;gallery&quot;}"
            class="attachment attachment--preview attachment--png"
        >
            <img src="http://localhost:3000/rails/active_storage/blobs/redirect/aksmdk--123/blue.png" width="300" height="300">
            <figcaption class="attachment__caption"><span class="attachment__name">blue.png</span> <span class="attachment__size">1.14 KB</span></figcaption>
        </figure>
    </div>
    

    What is stored in the database (the sgid and the image name hash were trimmed for the sake of this example):

    <div>
        <action-text-attachment
            sgid="BAh7CEkYWN0aW9uLXRleHQtdGVz--73b0fe9c92a450323dd9dd8136968a0f973c"
            content-type="image/png" 
            url="http://localhost:3000/rails/active_storage/blobs/redirect/aksmdk--123/blue.png"
            filename="blue.png"
            filesize="1168"
            width="300"
            height="300"
            presentation="gallery"
        ></action-text-attachment>
    </div>
    

    This might need a complete re-do.

    opened by tonysm 1
  • Only store the sgid field (not the `data-trix-attachment` attribute) for storage

    Only store the sgid field (not the `data-trix-attachment` attribute) for storage

    Right now we're storing both the sgid attribute and the data-trix-attachment attribute when storing the attachable, but I don't think that's needed. I think we can get away by storing the sgid field only and only generating the data-trix-attachment when we want to render it with content (for storage), but need to test this.

    opened by tonysm 1
  • Failed to resolve import

    Failed to resolve import "trix" from "resources\js\libs\trix.js".

    I got this error after I downloaded the package.

    [plugin:vite:import-analysis] Failed to resolve import "trix" from "resources\js\libs\trix.js". Does the file exist?
    

    this error appears on pages I don't use the editor in. The page the editor in doesn't use npm.

    the component in the page source

    <label class="label absolute block top-0 mt-2 ltr:ml-4 rtl:mr-4 font-heading uppercase">body</label>
                <input type="hidden" name="body" id="body_input" value="
    ">
    
    <trix-editor id="body" input="body_input" class="trix-content form-control"></trix-editor>
    

    I know there are many errors, but the installation isn't detailed enough, so I'm sorry I couldn't fix it.

    PHP version: 8.1.10
    laravel version: 9.36.4
    npm version: 8.3.1
    
    opened by eymeen 0
Releases(1.6.0)
  • 1.6.0(Jul 3, 2022)

    Changelog

    • CHANGED: The richtext:install command was modified to work with the new Vite setup from Laravel. I also took the time to make it look better. It works with the old Mix installs from Laravel 8 still and, of course, it works when using the Importmap Laravel as well.
    Source code(tar.gz)
    Source code(zip)
  • 1.5.0(Jun 15, 2022)

    Changelog

    • CHANGED: The install command now publishes the Trix overrides styles to a resources/css/_trix.css which, based on the app's setup, can do two things: a) automatically add the import line to the resources/css/app.css file; or b) tell the developer to add the import or do whatever they want with the file
    • CHANGED: The install command now also is a bit smarter and detects when the application is using Importmap Laravel and installs JS dependencies using that instead of always assuming NPM.
    • NEW: There's a new <x-rich-text-trix-styles /> Blade Component that can be used to output the Trix core styles (copied from the Trix repository) instead of using a CDN
    • NEW: A new <x-trix-field /> Blade Component is now published to the application's resources/views/components. This makes for a nice starting point.
    Source code(tar.gz)
    Source code(zip)
  • 1.4.1(Apr 8, 2022)

    Changelog

    • Fixes Livewire components "hanging" when a model with rich text fields is bound to it by unsetting the rich text relationships when the component is dehydrating (https://github.com/tonysm/rich-text-laravel/pull/22)
    Source code(tar.gz)
    Source code(zip)
  • 1.4.0(Feb 9, 2022)

  • 1.3.0(Jan 29, 2022)

    Changelog

    • NEW: There's a new Content::attachables() method which allows pulling all the attachables of a document right away without having to pluck them out of the attachaments. Previously: $message->content->attachments()->pluck('attachable'), Now: $message->content->attachables(). PR: https://github.com/tonysm/rich-text-laravel/pull/20
    • NEW: Attachments now have a toHtml(): string method which allows for easily rendering them. We can now do Attachment::fromAttachable($user)->toHtml() which renders the <rich-text-attachment> tag. Same PR as above: https://github.com/tonysm/rich-text-laravel/pull/20

    Here's an example of how we can use the Attachment->toHtml() method to parse the document and create attachments from the backend:

    class Message extends Model
    {
      public static function booted()
      {
        static::creating(function (Message $message) {
          // Scan the document looking for @-mentions and replace them
          // with a `<rich-text-attachment>` for the mentioned user...
    
          $message->content = preg_replace_callback(
            '/\B\@(\w+)/',
            function ($matches) {
              if ($user = User::where('username', $matches[1])->first()) {
                return Attachment::fromAttachable($user)->toHtml();
              }
    
              return $matches[0];
            },
            $message->content->toHtml(),
          );
        });
      }
    }
    
    Source code(tar.gz)
    Source code(zip)
  • 1.2.0(Oct 29, 2021)

    Changelog

    • NEW: Better handles deeply nested lists and lists inside lists
    • CHANGED: [internal] Most of the methods of the plain text converter were supposed to be private. This is technically BC, but I don't think it was worth a major version.
    Source code(tar.gz)
    Source code(zip)
  • 1.1.0(Oct 27, 2021)

  • 1.0.2(Oct 20, 2021)

    Changelog

    • FIXED: Fixes emoji rendering. https://github.com/tonysm/rich-text-laravel/pull/14
    • CHANGED: Replace the windows-latest test matrix with macos-latest. Tests were failing on Windows for encoding reasons and I just don't have the bandwidth to fix it. Users can still consume the package there using WSL2, I think.
    Source code(tar.gz)
    Source code(zip)
  • 1.0.1(Oct 20, 2021)

    Changelog

    • FIXED: Fixes the installer by using ensureDirectoryExists() (which is idempotent) instead of mkdir() (which fails when dir already exists)
    Source code(tar.gz)
    Source code(zip)
  • 1.0.0(Sep 16, 2021)

  • 1.0.0-RC1(Sep 7, 2021)

  • 1.0.0-BETA(Aug 31, 2021)

  • 0.0.3(Aug 14, 2021)

    Changelog

    • CHANGED: more documentation (see the README.md)
    • NEW: the package now recommends keeping the rich text content outside of the main entity on its own rich_texts table, which uses the new RichText polymorphic model that the package ships with. The behavior is documented at the The RichText Model section on the readme. The old behavior of using the custom cast directly still works (in fact, the RichText model uses that same approach). You can find more about this in the PR and in the RFC issue.
    Source code(tar.gz)
    Source code(zip)
Owner
Tony Messias
Tony Messias
Laravel Nova's Queued Export As CSV Action

Laravel Nova's Queued Export As CSV Action Installation To install through composer, run the following command from terminal: composer require "nova-k

null 9 Dec 15, 2022
Creates a Filament table action.

Filament Action Designed for easy integration and manage of Filament actions. Installation You can install the package via composer: composer require

Mitesh Rathod 10 Jun 14, 2023
Laravel Debugbar (Integrates PHP Debug Bar)

Laravel Debugbar This is a package to integrate PHP Debug Bar with Laravel. It includes a ServiceProvider to register the debugbar and attach it to th

Barry vd. Heuvel 14.7k Dec 30, 2022
A package that makes it easy to have the `artisan make:` commands open the newly created file in your editor of choice.

Open On Make A package that makes it easy to have the artisan make: commands open the newly created file in your editor of choice. Installation compos

Andrew Huggins 94 Nov 22, 2022
File & Folders & Media Browser With Code Editor

Filament Browser File & Folders & Media Browser With Code Editor Features File Browser Code Editor with highlights Media Viewer .Env Editor Screenshot

Fady Mondy 23 Jan 5, 2023
Integrates libphonenumber into your Symfony application

PhoneNumberBundle This bundle is a fork of misd-service-development/phone-number-bundle. As this project doesn't look maintained anymore, we decided t

Olivier Dolbeau 161 Dec 23, 2022
CSS Exfil helper script to generate injected CSS and corresponding HTML (inspired by mike gualtieri)

The PoC-CSS Exfill Basic Keylogger First of all i was developing bot stuff and i seen attribute=value] [target=_blank] in source code of website. This

Ahsen 6 Apr 2, 2022
Laravel package to convert English numbers to Bangla number or Bangla text, Bangla month name and Bangla Money Format

Number to Bangla Number, Word or Month Name in Laravel | Get Wordpress Plugin Laravel package to convert English numbers to Bangla number or Bangla te

Md. Rakibul Islam 50 Dec 26, 2022
Laravel package to convert English numbers to Bangla number or Bangla text, Bangla month name and Bangla Money Format

Number to Bangla Number, Word or Month Name in Laravel | Get Wordpress Plugin Laravel package to convert English numbers to Bangla number or Bangla te

Md. Rakibul Islam 50 Dec 26, 2022
Emmet for Sublime Text

This plugin is deprecated and no longer maintained, please use new version. Emmet for Sublime Text Official Emmet plugin for Sublime Text. How to inst

Sergey Chikuyonok 5.3k Jan 5, 2023
Enhancements to Sublime Text sidebar. Files and folders.

Sidebar Enhancements In other languages Japanese - http://taamemo.blogspot.jp/2012/10/sublime-text-2-sidebarenhancements.html?m=1 Russian - https://ww

Tito 2.1k Dec 27, 2022
πŸ’‘ Full-featured code intelligence and smart autocomplete for Sublime Text

SublimeCodeIntel This Code Intelligence plugin for Sublime Text provides an interface to CodeIntel. CodeIntel is a code intelligence engine that was p

null 5.1k Dec 27, 2022
The code linting framework for Sublime Text 3

SublimeLinter The code linting framework for Sublime Text. No linters included: get them via Package Control. Installation Install SublimeLinter and l

null 2k Jan 8, 2023
An online communication application that provides a real-time or live transmission of text messages from sender to receiver.

Realtime-chat-application An online communication application that provides a real-time or live transmission of text messages from sender to receiver.

isha 2 Aug 15, 2022
List of 77 languages for Laravel Framework 4, 5, 6, 7 and 8, Laravel Jetstream , Laravel Fortify, Laravel Breeze, Laravel Cashier, Laravel Nova and Laravel Spark.

Laravel Lang In this repository, you can find the lang files for the Laravel Framework 4/5/6/7/8, Laravel Jetstream , Laravel Fortify, Laravel Cashier

Laravel Lang 6.9k Jan 2, 2023
⚑ Laravel Charts β€” Build charts using laravel. The laravel adapter for Chartisan.

What is laravel charts? Charts is a Laravel library used to create Charts using Chartisan. Chartisan does already have a PHP adapter. However, this li

Erik C. ForΓ©s 31 Dec 18, 2022
Laravel Kickstart is a Laravel starter configuration that helps you build Laravel websites faster.

Laravel Kickstart What is Laravel Kickstart? Laravel Kickstart is a Laravel starter configuration that helps you build Laravel websites faster. It com

Sam Rapaport 46 Oct 1, 2022
Laravel User Activity Log - a package for Laravel 8.x that provides easy to use features to log the activities of the users of your Laravel app

Laravel User Activity Log - a package for Laravel 8.x that provides easy to use features to log the activities of the users of your Laravel app

null 9 Dec 14, 2022
Laravel Segment is an opinionated, approach to integrating Segment into your Laravel application.

Laravel Segment Laravel Segment is an opinionated, approach to integrating Segment into your Laravel application. Installation You can install the pac

Octohook 13 May 16, 2022