{"id":15016896,"url":"https://github.com/zofe/rapyd-livewire","last_synced_at":"2025-10-13T19:08:27.557Z","repository":{"id":49394397,"uuid":"471518461","full_name":"zofe/rapyd-livewire","owner":"zofe","description":"rapyd: crud widgets for laravel. datatable, grids, forms, in a simple package","archived":false,"fork":false,"pushed_at":"2023-05-24T15:24:49.000Z","size":16695,"stargazers_count":34,"open_issues_count":0,"forks_count":4,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-09-20T01:11:22.168Z","etag":null,"topics":["crud","laravel","livewire","livewire-components","modules","rapyd"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zofe.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":".github/CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":".github/SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"zofe"}},"created_at":"2022-03-18T21:13:12.000Z","updated_at":"2024-05-07T23:30:58.000Z","dependencies_parsed_at":"2024-09-16T06:00:54.128Z","dependency_job_id":"cb9efd01-1982-4e96-9243-41bad2899f44","html_url":"https://github.com/zofe/rapyd-livewire","commit_stats":{"total_commits":277,"total_committers":4,"mean_commits":69.25,"dds":"0.21660649819494582","last_synced_commit":"040480f48335c78401468eb23bb82bf64dd46396"},"previous_names":[],"tags_count":47,"template":false,"template_full_name":null,"purl":"pkg:github/zofe/rapyd-livewire","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zofe%2Frapyd-livewire","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zofe%2Frapyd-livewire/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zofe%2Frapyd-livewire/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zofe%2Frapyd-livewire/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zofe","download_url":"https://codeload.github.com/zofe/rapyd-livewire/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zofe%2Frapyd-livewire/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279016865,"owners_count":26085884,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-13T02:00:06.723Z","response_time":61,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["crud","laravel","livewire","livewire-components","modules","rapyd"],"created_at":"2024-09-24T19:49:32.241Z","updated_at":"2025-10-13T19:08:27.529Z","avatar_url":"https://github.com/zofe.png","language":"PHP","funding_links":["https://github.com/sponsors/zofe"],"categories":[],"sub_categories":[],"readme":"# rapyd-livewire\n\n\u003ca href=\"https://github.com/zofe/rapyd-livewire/actions/workflows/run-tests.yml\"\u003e\u003cimg src=\"https://github.com/zofe/rapyd-livewire/actions/workflows/run-tests.yml/badge.svg\" alt=\"Build Status\"\u003e\u003c/a\u003e\n\u003ca href=\"https://packagist.org/packages/zofe/rapyd-livewire\"\u003e\u003cimg src=\"https://img.shields.io/packagist/dt/zofe/rapyd-livewire\" alt=\"Total Downloads\"\u003e\u003c/a\u003e\n\u003ca href=\"https://packagist.org/packages/zofe/rapyd-livewire\"\u003e\u003cimg src=\"https://img.shields.io/packagist/v/zofe/rapyd-livewire\" alt=\"Latest Stable Version\"\u003e\u003c/a\u003e\n\n[![rapyd.dev](screencast.gif)](https://rapyd.dev/demo)\n\n\nrequirements: laravel ^8.65 | 9.* | 10.*\n\nDemo: [rapyd.dev](https://rapyd.dev/demo)\n\n\n## What is it?\n\nis a laravel library of **blade components**, **livewire traits**, and **modules** scaffolder  that you can use to generate \nadministration interfaces in a concise, reusable, uncluttered, and testable manner.\n\nIt also bundles standard frontend libraries like \nBootstrap, Vue, Alpine, Tom Select and Quill to be used as fast boilerplate for your laravel admin panels.\n\nThe idea is to speed up and organize the development of large laravel applications:\n- **modular approach** (you can organize your backends into reusable modules, isolating everything, components, views, tests, but also translations, migrations, jobs, each module can be like an isolated laravel application)\n- **livewire component** based (no needed controllers, each component is naturally reactive, you can get away with few pure livewire classes and blade views, easily testable and maintainable)\n- **blade component** based (dozens of available anonymous components to standardize frontend in few \"bootstrap based\" spacialized tags, which you can eventually extend)\n\n## Modules\n\nexample of out of the box module structure you can use after installing rapyd.\n\n- You can create \"Modules\" folder in you app/ directory of your laravel application.  \n- Then you can create your Module Folder i.e.: `Blog`\n- Livewire components will be searched in the `Components` subfolder\n- You can refer to the views in your module using intuitive shortcut i.e.: `blog::Articles.views.articles_edit`\n- Inside your Module folder you can reply (if needed) the laravel application folder structure (controllers, migrations, jobs, etc..)\n\n```\nlaravel/\n├─ app/\n│  ├─ Modules/\n│  │  ├─ Blog/\n│  │  │  ├─ Components/\n│  │  │  │  ├─ Articles/\n│  │  │  │  │  ├─ views/\n│  │  │  │  │  │  ├─ articles_edit.blade.php\n│  │  │  │  │  │  ├─ articles_table.blade.php\n│  │  │  │  │  │  ├─ articles_view.blade.php\n│  │  │  │  │  ├─ ArticlesEdit.php\n│  │  │  │  │  ├─ ArticlesTable.php\n│  │  │  │  │  ├─ ArticlesView.php\n│  │  │  │  ├─ routes.php\n```\n\nRapyd has also some public modules available via \"composer require\":\n\n\n* [zofe/demo-module](https://github.com/zofe/demo-module) demo\n* [zofe/knowledgebase-module](https://github.com/zofe/knowledgebase-module) knowledgebase \n* [zofe/auth-module](https://github.com/zofe/auth-module) auth\n\n* [zofe/layout-module](https://github.com/zofe/layout-module) layout\n\nRapyd has a \"module installer\": [zofe/rapyd-module-installer](https://github.com/zofe/rapyd-module-installer)   \nthis means that you can plan to create \u0026 distribute your modules as packages including it as dependency and following a simple naming convention, for example with a composer.json file like this:\n\n```\n{\n    \"name\": \"yourname/mymodule-module\",\n    \"description\": \"my custom module for laravel application\",\n    \"license\": \"mit\",\n    \"type\": \"rapyd-module\",\n    \"authors\": [\n        {\n            \"name\": \"Me\",\n            \"email\": \"me@email.com\"\n        }\n    ],\n    \"require\": {\n        \"php\": \"^7.4|^8.0|^8.1|^8.2\",\n        \"illuminate/config\": \"^8.65|^9.0|^10.0\",\n        \"illuminate/contracts\": \"^8.65|^9.0|^10.0\",\n        \"livewire/livewire\": \"^2.0\",\n        \"zofe/rapyd-livewire\": \"dev-main|^0.8\",\n        \"zofe/rapyd-module-installer\": \"^0.0|^0.1\",\n        \"zofe/layout-module\": \"dev-main|^0.0|^0.1\"\n    },\n    \"config\": {\n        \"allow-plugins\": {\n            \"zofe/rapyd-module-installer\": true\n        }\n    },\n    \"minimum-stability\": \"dev\",\n    \"prefer-stable\": true\n}\n```\n\nthen you can include your own modules using composer require \"yourname/mymodule-module\" and this will install your dependency in \n`app/Modules/Mymodule`\n\nPlease check for example [zofe/knowledgebase-module](https://github.com/zofe/knowledgebase-module) knowledgebase module to get an idea of how to structure it.\n\n\n\n## Installation\n\nYou can install the package via composer:\n\n```bash\ncomposer require zofe/rapyd-livewire\n```\n\n\nYou can publish static assets using:\n```bash\nphp artisan vendor:publish --provider=\"Zofe\\Rapyd\\RapydServiceProvider\" --tag=\"public\"\n```\n\nif you want you can download the demo module in your laravel-rapyd application try the [zofe/demo-module](https://github.com/zofe/demo-module) \n\n\n\n## Usage\n\n---\n### DataTable\nA DataTable is a \"listing component\" with these features:\n- \"input filters\" to search in a custom data set \n- \"buttons\" (for example \"add\" record or \"reset\" filters)\n- \"pagination links\"\n- \"sort links\" \n\n\n```html\n\u003cx-rpd::table\n    title=\"Article List\"\n    :items=\"$items\"\n\u003e\n\n    \u003cx-slot name=\"filters\"\u003e\n      \u003cx-rpd::input col=\"col-8\" debounce=\"350\" model=\"search\"  placeholder=\"search...\" /\u003e\n      \u003cx-rpd::select col=\"col-4\" model=\"author_id\" :options=\"$authors\" placeholder=\"author...\" addempty /\u003e\n    \u003c/x-slot\u003e\n\n    \u003ctable class=\"table\"\u003e\n        \u003cthead\u003e\n        \u003ctr\u003e\n            \u003cth\u003e\n                \u003cx-rpd::sort model=\"id\" label=\"id\" /\u003e\n            \u003c/th\u003e\n            \u003cth\u003etitle\u003c/th\u003e\n            \u003cth\u003eauthor\u003c/th\u003e\n            \u003cth\u003ebody\u003c/th\u003e\n        \u003c/tr\u003e\n        \u003c/thead\u003e\n        \u003ctbody\u003e\n        @foreach ($items as $article)\n        \u003ctr\u003e\n            \u003ctd\u003e\n                \u003ca href=\"{{ route('articles.view',$article-\u003eid) }}\"\u003e{{ $article-\u003eid }}\u003c/a\u003e\n            \u003c/td\u003e\n            \u003ctd\u003e{{ $article-\u003etitle }}\u003c/td\u003e\n            \u003ctd\u003e{{ $article-\u003eauthor-\u003efirstname }}\u003c/td\u003e\n            \u003ctd\u003e{{ Str::limit($article-\u003ebody,50) }}\u003c/td\u003e\n        \u003c/tr\u003e\n        @endforeach\n        \u003c/tbody\u003e\n    \u003c/table\u003e\n\n\u003c/x-rpd::table\u003e\n```\n    \nprops\n- `title`: the heading title for this crud\n\ncontent/slots\n- should be a html table that loops model $items\n- `buttons`: buttons panel\n\nexample: [rapyd.dev/demo/articles](https://rapyd.dev/demo/articles)\n\n\n---\n### DataView\na DataView is a \"detail page component\" with :  \n\n- \"buttons\" slot (for example back to \"list\" or \"edit\" current record)\n- \"actions\" any link that trigger a server-side  \n\n```html\n    \u003cx-rpd::view title=\"Article Detail\"\u003e\n\n        \u003cx-slot name=\"buttons\"\u003e\n            \u003ca href=\"{{ route('articles') }}\" class=\"btn btn-outline-primary\"\u003elist\u003c/a\u003e\n            \u003ca href=\"{{ route('articles.edit',$model-\u003egetKey()) }}\" class=\"btn btn-outline-primary\"\u003eedit\u003c/a\u003e\n        \u003c/x-slot\u003e\n\n        \u003cdiv\u003eTitle: {{ $article-\u003etitle }}\u003c/div\u003e\n        \u003cdiv\u003eAuthor: {{ $article-\u003eauthor-\u003efirstname }} {{ $model-\u003eauthor-\u003elastname }}\u003c/div\u003e\n        \u003cdiv\u003e\u003ca wire:click.prevent=\"someAction\"\u003eDownload TXT version\u003c/a\u003e\u003c/div\u003e\n          \n    \u003c/x-rpd::view\u003e\n```\n\nprops\n- `title`: the heading title for this crud\n\ncontent/slots\n- should be a detail of $model\n- `buttons`: buttons panel\n- `actions`: buttons panel\n\nexample: [rapyd.dev/demo/article/view/1](https://rapyd.dev/demo/article/view/1)\n\n\n---\n### DataEdit\nDataEdit is a \"form component\" usually binded to a model with:  \n\n- \"buttons\" and \"actions\" (undo, save, etc..)\n- form \"fields\"\n- automatic errors massages / rules management\n\n\n```html\n    \u003cx-rpd::edit title=\"Article Edit\"\u003e\n\n       \u003cx-rpd::input model=\"article.title\" label=\"Title\" /\u003e\n       \u003cx-rpd::rich-text model=\"article.body\" label=\"Body\" /\u003e\n\n    \u003c/x-rpd::edit\u003e\n```\n\nprops\n- `title`: the heading title for this crud\n\ncontent/slots\n- form fields binded with public/model properties\n\nexample: [rapyd.dev/demo/article/edit/1](https://rapyd.dev/demo/article/edit/1)\n\n\n---\n\n\n### Fields \n\ninside some widget views you can drastically semplify the syntax using \npredefined blade components that interacts with livewire\n\n```html\n\u003cx-rpd::input model=\"search\" debounce=\"350\" placeholder=\"search...\" /\u003e\n```\n\n```html\n\u003cx-rpd::select model=\"author_id\" lazy :options=\"$authors\" /\u003e\n```\n\n```html\n\u003c!-- tom select dropdown --\u003e\n\u003cx-rpd::select-list model=\"roles\" multiple :options=\"$available_roles\" label=\"Roles\" /\u003e\nor\n\u003cx-rpd::select-list model=\"roles\" multiple endpoint=\"/ajax/roles\" label=\"Roles\" /\u003e\n```\n\n```html\n\u003c!-- date, datetime and date-range components --\u003e\n\u003cx-rpd::date-time model=\"date_time\" format=\"dd/MM/yyyy HH:mm:ss\" value-format=\"yyyy-MM-dd HH:mm:ss\" label=\"DateTime\" /\u003e\n\n\u003cx-rpd::date model=\"date\" format=\"dd/MM/yyyy\" value-format=\"yyyy-MM-dd\" label=\"Date\" /\u003e\n\n\u003cx-rpd::date-range\n    model_from=\"date_from\"\n    model_to=\"date_to\"\n    range-separator=\"-\"\n    start-placeholder=\"from\"\n    end-placeholder=\"to\"\n    type=\"daterange\"\n    format=\"dd/MM/yyyy\"\n    value-format=\"yyyy-MM-dd\"\n/\u003e\n```\n\n```html\n\u003cx-rpd::textarea model=\"body\" label=\"Body\" rows=\"5\" :help=\"__('the article summary')\"/\u003e\n```\n\n```html\n\u003c!-- quill wysiwyg editor --\u003e\n\u003cx-rpd::rich-text model=\"body\" label=\"Body\" /\u003e\n```\n\n\nprops\n\n- `label`: label to display above the input\n- `placeholder`: placeholder to use for the empty first option\n- `model`: Livewire model property key\n- `options`: array of options e.g. (used in selects)\n- `debounce`: Livewire time in ms to bind data on keyup\n- `lazy`: Livewire bind data only on change\n- `prepend`: addon to display before input, can be used via named slot\n- `append`: addon to display after input, can be used via named slot\n- `help`: helper label to display under the input\n- `icon`: Font Awesome icon to show before input e.g. `cog`, `envelope`\n- `size`: Bootstrap input size e.g. `sm`, `lg`\n- `rows`: rows nums\n- `multiple`: allow multiple option selection (used in select-list)\n- `endpoint`: a remote url for fetch optioms (used in select-list)\n- `format`: the client-side field format (used in date and date-time)\n- `value-format`: the server-side field value format (used in date and date-time)\n\n\n## special tags\n\n```html\n\u003c!-- sort ascending/descending link actions (in a datatable view context)--\u003e\n\u003cx-rpd::sort model=\"id\" label=\"id\" /\u003e\n```\n## navigation\n\nNav Tabs: bootstrap nav-link menu with self-determined active link\n\n```html\n\u003cul class=\"nav nav-tabs\"\u003e\n    \u003cx-rpd::nav-link label=\"Home\" route=\"home\" /\u003e\n    \u003cx-rpd::nav-link label=\"Articles\" route=\"articles\" /\u003e\n    \u003cx-rpd::nav-link label=\"Article Detail\" route=\"articles.view\" :params=\"1\"/\u003e\n    \u003cx-rpd::nav-link label=\"Article edit\" route=\"articles.edit\" /\u003e\n\u003c/ul\u003e\n```\n\nNav Items: boostrap vertical menu items / single or grouped (collapsed)\n\n```html\n\u003cx-rpd::nav-dropdown icon=\"fas fa-fw fa-book\" label=\"KnowledgeBase\" active=\"/kb\"\u003e\n    \u003cx-rpd::nav-link label=\"Edit Categories\" route=\"kb.admin.categories.table\" type=\"collapse-item\" /\u003e\n    \u003cx-rpd::nav-link label=\"Edit Articles\" route=\"kb.admin.articles.table\" type=\"collapse-item\" /\u003e\n\u003c/x-rpd::nav-dropdown\u003e\n```\n\n\nNav Sidebar: bootstrap sidebar with self-determined or segment-based active link\n```html\n\u003cx-rpd::sidebar title=\"Rapyd.dev\" class=\"p-3 text-white border-end\"\u003e\n   \u003cx-rpd::nav-item label=\"Demo\" route=\"demo\" active=\"/rapyd-demo\" /\u003e\n   \u003cx-rpd::nav-item label=\"Page\" route=\"page\"  /\u003e\n\u003c/x-rpd::sidebar\u003e\n```\n\n\n\n## minimal application layout\nthere are some css/js dependencies (livewire, bootstrap, alpinejs, vuejs)\nbut rapyd has two directive to simplify all needed inclusions.\n\nConsider to use `{{ $slot }}` as entry-point if you plan to use \n[Full-page components](https://laravel-livewire.com/docs/2.x/rendering-components#page-components)\n\ndon't forget to add \"app\" class to your main div if you plan to use vuejs components\n\n```html\n\u003c!DOCTYPE html\u003e\n\u003chtml lang=\"en\"\u003e\n\u003chead\u003e\n    \u003cmeta charset=\"utf-8\"\u003e\n    @rapydLivewireStyles\n\u003c/head\u003e\n\u003cbody\u003e\n\u003cdiv id=\"app\"\u003e\n   \u003c!-- your main content blade section --\u003e\n   {{ $slot ??'' }}\n\u003c/div\u003e\n\n@rapydLivewireScripts\n\u003c/body\u003e\n\u003c/html\u003e\n```\n\n\n## layout module\n\nIf you want to isolate the layout as well and make it a module, reusable in multiple projects, rapyd does that as well, and it has a default module that you can customize or take as an example:\n\n* [zofe/layout-module](https://github.com/zofe/layout-module) layout module\n\n\n\n## To-do\n\n- component generators (with custom stub for DataTable,DataEdit,DataView)\n- \"plugin\" architecture (a way to download a module from a public or private repository.. or just a composer way to deploy in app/Modules)\n\n## Credits\n\n- [Felice Ostuni](https://github.com/zofe)\n- [All Contributors](../../contributors)\n\n\nInspirations:\n\n- [rapyd-laravel](https://github.com/zofe/rapyd-laravel) my old laravel library (150k downloads)\n- [livewire](https://laravel-livewire.com/)  widely used \"full-stack framework\" to compose laravel application by widgets\n- [laravel-bootstrap-components](https://github.com/bastinald/laravel-bootstrap-components) smart library which reduced the complexity of this one\n\n\n\n## License \u0026 Contacts\n\nRapyd is licensed under the [MIT license](http://opensource.org/licenses/MIT)\n\nPlease join me and review my work on [Linkedin](https://www.linkedin.com/in/feliceostuni/)\n\nthanks\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzofe%2Frapyd-livewire","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzofe%2Frapyd-livewire","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzofe%2Frapyd-livewire/lists"}