Copy disabled (too large)
Download .txt
Showing preview only (13,594K chars total). Download the full file to get everything.
Repository: thedevdojo/wave
Branch: main
Commit: 6cee13e84f21
Files: 433
Total size: 12.9 MB
Directory structure:
gitextract_oox3trws/
├── .editorconfig
├── .gitattributes
├── .github/
│ └── workflows/
│ ├── auth.yml
│ ├── install-automatic.yml
│ ├── pint.yml
│ └── tests.yml
├── .gitignore
├── CLAUDE.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE.md
├── README.md
├── SECURITY.md
├── app/
│ ├── Console/
│ │ └── Commands/
│ │ ├── CreateRole.php
│ │ └── CreateUser.php
│ ├── Filament/
│ │ ├── Pages/
│ │ │ ├── Dashboard.php
│ │ │ ├── Media.php
│ │ │ ├── Plugins.php
│ │ │ └── Themes.php
│ │ ├── Resources/
│ │ │ ├── Categories/
│ │ │ │ ├── CategoryResource.php
│ │ │ │ └── Pages/
│ │ │ │ ├── CreateCategory.php
│ │ │ │ ├── EditCategory.php
│ │ │ │ └── ListCategories.php
│ │ │ ├── Changelogs/
│ │ │ │ ├── ChangelogResource.php
│ │ │ │ └── Pages/
│ │ │ │ ├── CreateChangelog.php
│ │ │ │ ├── EditChangelog.php
│ │ │ │ └── ListChangelogs.php
│ │ │ ├── Forms/
│ │ │ │ ├── FormsResource.php
│ │ │ │ └── Pages/
│ │ │ │ ├── CreateForms.php
│ │ │ │ ├── EditForms.php
│ │ │ │ └── ListForms.php
│ │ │ ├── Pages/
│ │ │ │ ├── PageResource.php
│ │ │ │ └── Pages/
│ │ │ │ ├── CreatePage.php
│ │ │ │ ├── EditPage.php
│ │ │ │ └── ListPages.php
│ │ │ ├── Permissions/
│ │ │ │ ├── Pages/
│ │ │ │ │ ├── CreatePermission.php
│ │ │ │ │ ├── EditPermission.php
│ │ │ │ │ └── ListPermissions.php
│ │ │ │ └── PermissionResource.php
│ │ │ ├── Plans/
│ │ │ │ ├── Pages/
│ │ │ │ │ ├── CreatePlan.php
│ │ │ │ │ ├── EditPlan.php
│ │ │ │ │ └── ListPlans.php
│ │ │ │ └── PlanResource.php
│ │ │ ├── Posts/
│ │ │ │ ├── Pages/
│ │ │ │ │ ├── CreatePost.php
│ │ │ │ │ ├── EditPost.php
│ │ │ │ │ └── ListPosts.php
│ │ │ │ └── PostResource.php
│ │ │ ├── Roles/
│ │ │ │ ├── Pages/
│ │ │ │ │ ├── CreateRole.php
│ │ │ │ │ ├── EditRole.php
│ │ │ │ │ └── ListRoles.php
│ │ │ │ └── RoleResource.php
│ │ │ ├── Settings/
│ │ │ │ ├── Pages/
│ │ │ │ │ ├── CreateSetting.php
│ │ │ │ │ ├── EditSetting.php
│ │ │ │ │ └── ListSettings.php
│ │ │ │ └── SettingResource.php
│ │ │ └── Users/
│ │ │ ├── Pages/
│ │ │ │ ├── CreateUser.php
│ │ │ │ ├── EditUser.php
│ │ │ │ └── ListUsers.php
│ │ │ └── UserResource.php
│ │ └── Widgets/
│ │ └── DashboardWidget.php
│ ├── Http/
│ │ └── Controllers/
│ │ └── Controller.php
│ ├── Listeners/
│ │ ├── LogSuccessfulLogin.php
│ │ └── LogSuccessfulLogout.php
│ ├── Models/
│ │ ├── Category.php
│ │ ├── Forms.php
│ │ ├── Post.php
│ │ └── User.php
│ ├── Notifications/
│ │ └── TestNotification.php
│ └── Providers/
│ ├── AppServiceProvider.php
│ ├── Filament/
│ │ └── AdminPanelProvider.php
│ ├── FolioServiceProvider.php
│ └── VoltServiceProvider.php
├── artisan
├── bootstrap/
│ ├── app.php
│ ├── cache/
│ │ └── .gitignore
│ └── providers.php
├── composer.json
├── config/
│ ├── .gitkeep
│ ├── activity.php
│ ├── app.php
│ ├── auth.php
│ ├── database.php
│ ├── devdojo/
│ │ ├── auth/
│ │ │ ├── appearance.php
│ │ │ ├── descriptions.php
│ │ │ ├── language.php
│ │ │ ├── providers.php
│ │ │ └── settings.php
│ │ └── billing/
│ │ ├── keys.php
│ │ ├── language.php
│ │ └── style.php
│ ├── discussions.php
│ ├── features.php
│ ├── filament-google-analytics.php
│ ├── filament.php
│ ├── filesystems.php
│ ├── forms.php
│ ├── image.php
│ ├── jwt.php
│ ├── limits.php
│ ├── livewire.php
│ ├── logging.php
│ ├── mail.php
│ ├── passport.php
│ ├── permission.php
│ ├── privacy.php
│ ├── profile.php
│ ├── services.php
│ ├── style.php
│ ├── themes.php
│ └── wave.php
├── database/
│ ├── .gitignore
│ ├── factories/
│ │ ├── CategoryFactory.php
│ │ ├── PostFactory.php
│ │ └── UserFactory.php
│ ├── migrations/
│ │ ├── 2024_03_29_000000_create_cache_table.php
│ │ ├── 2024_04_24_000001_add_user_social_provider_table.php
│ │ ├── 2024_04_24_000002_update_passwords_field_to_be_nullable.php
│ │ ├── 2024_05_07_000003_add_two_factor_auth_columns.php
│ │ ├── 2024_07_31_133819_add_description_to_roles_table.php
│ │ └── 2025_02_19_101241_change_user_social_provider_table.php
│ └── seeders/
│ ├── ActivityLogSeeder.php
│ ├── ApiKeysTableSeeder.php
│ ├── CategoriesTableSeeder.php
│ ├── ChangelogsTableSeeder.php
│ ├── DatabaseSeeder.php
│ ├── ModelHasRolesTableSeeder.php
│ ├── NotificationsTableSeeder.php
│ ├── PagesTableSeeder.php
│ ├── PasswordResetsTableSeeder.php
│ ├── PermissionRoleTableSeeder.php
│ ├── PermissionsTableSeeder.php
│ ├── PlansTableSeeder.php
│ ├── PostsTableSeeder.php
│ ├── ProfileKeyValuesTableSeeder.php
│ ├── RolesTableSeeder.php
│ ├── SettingsTableSeeder.php
│ ├── ThemesTableSeeder.php
│ ├── TranslationsTableSeeder.php
│ └── UsersTableSeeder.php
├── lang/
│ ├── ar/
│ │ ├── auth.php
│ │ ├── pagination.php
│ │ ├── passwords.php
│ │ └── validation.php
│ ├── it/
│ │ ├── auth.php
│ │ ├── pagination.php
│ │ ├── passwords.php
│ │ └── validation.php
│ └── pl/
│ ├── auth.php
│ ├── pagination.php
│ ├── passwords.php
│ └── validation.php
├── package.json
├── phpunit.xml
├── pint.json
├── postcss.config.js
├── public/
│ ├── .htaccess
│ ├── auth/
│ │ ├── app.css
│ │ └── build/
│ │ ├── assets/
│ │ │ ├── scripts.js
│ │ │ └── styles.css
│ │ └── manifest.json
│ ├── billing/
│ │ ├── main.css
│ │ ├── main.js
│ │ └── manifest.json
│ ├── build/
│ │ ├── assets/
│ │ │ ├── app-75U0MKBP.css
│ │ │ ├── app-CaUPGaqM.js
│ │ │ └── theme-DRT1wFy8.css
│ │ └── manifest.json
│ ├── composer/
│ │ ├── install.php
│ │ ├── mac.php
│ │ └── windows.php
│ ├── css/
│ │ ├── bezhansalleh/
│ │ │ └── filament-google-analytics/
│ │ │ └── filament-google-analytics.css
│ │ └── filament/
│ │ ├── filament/
│ │ │ └── app.css
│ │ ├── forms/
│ │ │ └── forms.css
│ │ └── support/
│ │ └── support.css
│ ├── fonts/
│ │ └── filament/
│ │ └── filament/
│ │ └── inter/
│ │ └── index.css
│ ├── index.php
│ ├── js/
│ │ └── filament/
│ │ ├── actions/
│ │ │ └── actions.js
│ │ ├── filament/
│ │ │ ├── app.js
│ │ │ └── echo.js
│ │ ├── forms/
│ │ │ └── components/
│ │ │ ├── checkbox-list.js
│ │ │ ├── code-editor.js
│ │ │ ├── color-picker.js
│ │ │ ├── date-time-picker.js
│ │ │ ├── file-upload.js
│ │ │ ├── key-value.js
│ │ │ ├── markdown-editor.js
│ │ │ ├── rich-editor.js
│ │ │ ├── select.js
│ │ │ ├── slider.js
│ │ │ ├── tags-input.js
│ │ │ └── textarea.js
│ │ ├── notifications/
│ │ │ └── notifications.js
│ │ ├── schemas/
│ │ │ ├── components/
│ │ │ │ ├── actions.js
│ │ │ │ ├── tabs.js
│ │ │ │ └── wizard.js
│ │ │ └── schemas.js
│ │ ├── support/
│ │ │ ├── async-alpine.js
│ │ │ └── support.js
│ │ ├── tables/
│ │ │ ├── components/
│ │ │ │ ├── columns/
│ │ │ │ │ ├── checkbox.js
│ │ │ │ │ ├── select.js
│ │ │ │ │ ├── text-input.js
│ │ │ │ │ └── toggle.js
│ │ │ │ └── table.js
│ │ │ └── tables.js
│ │ └── widgets/
│ │ └── components/
│ │ ├── chart.js
│ │ └── stats-overview/
│ │ └── stat/
│ │ └── chart.js
│ ├── mix-manifest.json
│ ├── robots.txt
│ ├── themes/
│ │ ├── tailwind/
│ │ │ ├── css/
│ │ │ │ └── app.css
│ │ │ ├── js/
│ │ │ │ └── app.js
│ │ │ └── mix-manifest.json
│ │ └── tallstack/
│ │ ├── css/
│ │ │ └── app.css
│ │ ├── js/
│ │ │ └── app.js
│ │ └── mix-manifest.json
│ ├── vendor/
│ │ ├── binarytorch/
│ │ │ └── larecipe/
│ │ │ └── assets/
│ │ │ ├── css/
│ │ │ │ ├── app.css
│ │ │ │ ├── font-awesome-v4-shims.css
│ │ │ │ └── font-awesome.css
│ │ │ └── js/
│ │ │ └── app.js
│ │ └── livewire/
│ │ ├── livewire.esm.js
│ │ ├── livewire.js
│ │ └── manifest.json
│ └── wave/
│ ├── css/
│ │ └── docs.css
│ └── js/
│ └── docs.js
├── resources/
│ ├── css/
│ │ └── filament/
│ │ └── admin/
│ │ ├── tailwind.config.js
│ │ └── theme.css
│ ├── plugins/
│ │ └── installed.json
│ ├── themes/
│ │ └── .gitignore
│ └── views/
│ ├── components/
│ │ ├── avatar.blade.php
│ │ ├── button-s.blade.php
│ │ ├── button.blade.php
│ │ ├── empty-state.blade.php
│ │ ├── favicon.blade.php
│ │ ├── logo-icon.blade.php
│ │ └── logo.blade.php
│ ├── filament/
│ │ ├── pages/
│ │ │ ├── media.blade.php
│ │ │ ├── my-custom-dashboard-page.blade.php
│ │ │ ├── plugins.blade.php
│ │ │ └── themes.blade.php
│ │ └── widgets/
│ │ └── dashboard-widget.blade.php
│ ├── livewire/
│ │ ├── form.blade.php
│ │ └── wave/
│ │ └── deploy-to-do.blade.php
│ └── vendor/
│ ├── mail/
│ │ ├── html/
│ │ │ ├── button.blade.php
│ │ │ ├── footer.blade.php
│ │ │ ├── header.blade.php
│ │ │ ├── layout.blade.php
│ │ │ ├── message.blade.php
│ │ │ ├── panel.blade.php
│ │ │ ├── promotion/
│ │ │ │ └── button.blade.php
│ │ │ ├── promotion.blade.php
│ │ │ ├── subcopy.blade.php
│ │ │ ├── table.blade.php
│ │ │ └── themes/
│ │ │ └── default.css
│ │ ├── markdown/
│ │ │ ├── button.blade.php
│ │ │ ├── footer.blade.php
│ │ │ ├── header.blade.php
│ │ │ ├── layout.blade.php
│ │ │ ├── message.blade.php
│ │ │ ├── panel.blade.php
│ │ │ ├── promotion/
│ │ │ │ └── button.blade.php
│ │ │ ├── promotion.blade.php
│ │ │ ├── subcopy.blade.php
│ │ │ └── table.blade.php
│ │ └── text/
│ │ ├── button.blade.php
│ │ ├── footer.blade.php
│ │ ├── header.blade.php
│ │ ├── layout.blade.php
│ │ ├── message.blade.php
│ │ ├── panel.blade.php
│ │ ├── subcopy.blade.php
│ │ └── table.blade.php
│ └── notifications/
│ └── email.blade.php
├── routes/
│ ├── api.php
│ ├── console.php
│ └── web.php
├── storage/
│ ├── app/
│ │ └── private/
│ │ └── .gitignore
│ ├── dump.sql
│ ├── framework/
│ │ ├── .gitignore
│ │ ├── cache/
│ │ │ └── .gitignore
│ │ ├── sessions/
│ │ │ └── .gitignore
│ │ ├── testing/
│ │ │ └── .gitignore
│ │ └── views/
│ │ └── .gitignore
│ ├── logs/
│ │ └── .gitignore
│ └── wave-svg.sketch
├── tailwind.config.js
├── tests/
│ ├── Datasets/
│ │ ├── AuthRoutes.php
│ │ └── Routes.php
│ ├── Feature/
│ │ ├── AccountDeletionTest.php
│ │ ├── ActivityLogCleanupTest.php
│ │ ├── ActivityLogTest.php
│ │ ├── ApiKeyTest.php
│ │ ├── ChangelogTest.php
│ │ ├── DataExportTest.php
│ │ ├── HomeTest.php
│ │ ├── NotificationControllerTest.php
│ │ ├── NotificationPreferencesTest.php
│ │ ├── PageTest.php
│ │ ├── PasswordValidationTest.php
│ │ ├── PlanFeatureLimitsTest.php
│ │ ├── PlanSwitchingTest.php
│ │ ├── PostResourceTest.php
│ │ ├── PrivacySettingsTest.php
│ │ ├── RouteTest.php
│ │ ├── SocialLinksTest.php
│ │ ├── StorageConfigurationTest.php
│ │ ├── StripeWebhookTest.php
│ │ ├── SubscriptionCancellationTest.php
│ │ ├── UsernameUpdateTest.php
│ │ └── WaveStatsCommandTest.php
│ ├── Pest.php
│ ├── TestCase.php
│ └── Unit/
│ └── PluginAutoloaderTest.php
├── theme.json
├── vite.config.js
└── wave/
├── composer.json
├── database/
│ └── migrations/
│ ├── 2024_03_29_225419_create_users_table.php
│ ├── 2024_03_29_225420_create_permission_roles_tables.php
│ ├── 2024_03_29_225435_create_categories_table.php
│ ├── 2024_03_29_225523_create_themes_table.php
│ ├── 2024_03_29_225656_create_changelogs_table.php
│ ├── 2024_03_29_225657_create_changelog_user_table.php
│ ├── 2024_03_29_225729_create_api_keys_table.php
│ ├── 2024_03_29_225928_create_notifications_table.php
│ ├── 2024_03_29_230148_create_pages_table.php
│ ├── 2024_03_29_230255_create_password_resets_table.php
│ ├── 2024_03_29_230312_create_plans_table.php
│ ├── 2024_03_29_230313_create_subscriptions_table.php
│ ├── 2024_03_29_230316_create_posts_table.php
│ ├── 2024_03_29_230531_create_settings_table.php
│ ├── 2024_03_29_230541_create_theme_options_table.php
│ ├── 2024_03_29_230648_create_key_values_table.php
│ ├── 2024_06_26_224315_create_forms_table.php
│ ├── 2025_01_01_000000_add_notification_preferences_to_users_table.php
│ ├── 2025_01_01_100000_add_social_links_to_users_table.php
│ ├── 2025_01_22_000000_add_limits_to_plans_table.php
│ ├── 2025_10_14_113035_add_sort_order_column.php
│ ├── 2025_10_14_143501_add_currency_column.php
│ ├── 2025_12_31_110946_add_deletion_fields_to_users_table.php
│ ├── 2025_12_31_120750_create_activity_logs_table.php
│ └── 2025_12_31_144607_add_privacy_settings_to_users_table.php
├── resources/
│ ├── demo/
│ │ └── builds/
│ │ └── vite.config.js
│ └── views/
│ ├── admin/
│ │ ├── components/
│ │ │ └── label.blade.php
│ │ ├── logo-dark.blade.php
│ │ └── logo.blade.php
│ ├── admin-boxes.blade.php
│ ├── components/
│ │ └── billing/
│ │ ├── billing_cycle_toggle.blade.php
│ │ └── button.blade.php
│ ├── install.blade.php
│ ├── livewire/
│ │ └── billing/
│ │ ├── checkout.blade.php
│ │ └── update.blade.php
│ ├── media/
│ │ ├── index.blade.php
│ │ └── views/
│ │ ├── active-file.blade.php
│ │ ├── breadcrumbs.blade.php
│ │ ├── files.blade.php
│ │ ├── full-screen-file-modal.blade.php
│ │ ├── header/
│ │ │ ├── add-folder.blade.php
│ │ │ ├── delete.blade.php
│ │ │ ├── move.blade.php
│ │ │ └── search.blade.php
│ │ └── header.blade.php
│ ├── partials/
│ │ └── billing/
│ │ └── paddle_init.blade.php
│ ├── premium-theme-message.blade.php
│ ├── premium-theme-messages/
│ │ ├── 1.blade.php
│ │ ├── 2.blade.php
│ │ ├── 3.blade.php
│ │ ├── 4.blade.php
│ │ ├── 5.blade.php
│ │ ├── 6.blade.php
│ │ ├── 7.blade.php
│ │ ├── 8.blade.php
│ │ └── 9.blade.php
│ └── welcome.blade.php
├── routes/
│ ├── api.php
│ └── web.php
├── src/
│ ├── Actions/
│ │ ├── Billing/
│ │ │ └── Paddle/
│ │ │ └── AddSubscriptionIdFromTransaction.php
│ │ └── Reset.php
│ ├── ActivityLog.php
│ ├── ApiKey.php
│ ├── Category.php
│ ├── Changelog.php
│ ├── Console/
│ │ └── Commands/
│ │ ├── CancelExpiredSubscriptions.php
│ │ ├── CleanOldActivityLogs.php
│ │ ├── CreatePluginCommand.php
│ │ ├── ProcessScheduledAccountDeletions.php
│ │ └── WaveStats.php
│ ├── Facades/
│ │ └── Wave.php
│ ├── Form.php
│ ├── FormEntry.php
│ ├── Helpers/
│ │ └── globals.php
│ ├── Http/
│ │ ├── Controllers/
│ │ │ ├── API/
│ │ │ │ └── AuthController.php
│ │ │ ├── Billing/
│ │ │ │ ├── Paddle.php
│ │ │ │ ├── Stripe.php
│ │ │ │ └── Webhooks/
│ │ │ │ ├── PaddleWebhook.php
│ │ │ │ └── StripeWebhook.php
│ │ │ ├── ChangelogController.php
│ │ │ ├── LogoutController.php
│ │ │ ├── NotificationController.php
│ │ │ ├── PageController.php
│ │ │ ├── PluginImageController.php
│ │ │ ├── SubscriptionController.php
│ │ │ └── ThemeImageController.php
│ │ ├── Livewire/
│ │ │ ├── Billing/
│ │ │ │ ├── Checkout.php
│ │ │ │ └── Update.php
│ │ │ └── Notifications/
│ │ │ └── Notification.php
│ │ └── Middleware/
│ │ ├── AdminMiddleware.php
│ │ ├── InstallMiddleware.php
│ │ ├── Subscribed.php
│ │ ├── ThemeDemoMiddleware.php
│ │ ├── TokenMiddleware.php
│ │ ├── VerifyPaddleWebhookSignature.php
│ │ └── VerifyWebhook.php
│ ├── Jobs/
│ │ └── CreateActivityLog.php
│ ├── Notifications/
│ │ └── VerifyEmail.php
│ ├── Overrides/
│ │ └── Vite.php
│ ├── Page.php
│ ├── Plan.php
│ ├── Plugins/
│ │ ├── Plugin.php
│ │ ├── PluginAutoloader.php
│ │ ├── PluginManager.php
│ │ └── PluginServiceProvider.php
│ ├── Post.php
│ ├── ProfileKeyValue.php
│ ├── Setting.php
│ ├── Subscription.php
│ ├── Theme.php
│ ├── ThemeOptions.php
│ ├── Traits/
│ │ ├── HasDynamicFields.php
│ │ ├── HasPlanFeatures.php
│ │ └── HasProfileKeyValues.php
│ ├── Translation.php
│ ├── User.php
│ ├── Wave.php
│ └── WaveServiceProvider.php
└── wave.json
================================================
FILE CONTENTS
================================================
================================================
FILE: .editorconfig
================================================
root = true
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
indent_style = space
indent_size = 4
trim_trailing_whitespace = true
[*.md]
trim_trailing_whitespace = false
[*.{yml,yaml}]
indent_size = 2
[docker-compose.yml]
indent_size = 4
================================================
FILE: .gitattributes
================================================
* text=auto
*.blade.php diff=html
*.css diff=css
*.html diff=html
*.md diff=markdown
*.php diff=php
/.github export-ignore
CHANGELOG.md export-ignore
================================================
FILE: .github/workflows/auth.yml
================================================
name: Authentication Tests
on:
pull_request:
branches:
- main
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.3'
extensions: mbstring, xml, ctype, iconv, mysql
- name: Cache Composer Packages
uses: actions/cache@v4
with:
path: ~/.composer/cache
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
restore-keys: |
${{ runner.os }}-composer-git
- name: Install Dependencies
run: composer install --no-progress --prefer-dist
- name: Copy .env file
run: cp .env.example .env
- name: Generate application key
run: php artisan key:generate
- name: Configure environment for SQLite
run: |
sed -i 's/DB_CONNECTION=mysql/DB_CONNECTION=sqlite/' .env
sed -i 's/^DB_DATABASE=laravel/#DB_DATABASE=laravel/' .env
- name: Remove current tests and symlink to DevDojo Auth
run: |
rm -rf tests
ln -s vendor/devdojo/auth/tests tests
- name: Create sqlite file
run: touch database/database.sqlite
- name: Run the migrations
run: php artisan migrate --force
- name: Run the Auth Migrations
run: php artisan migrate --path=vendor/devdojo/auth/database/migrations --force
- name: Install PestPHP
run: composer require pestphp/pest --dev --with-all-dependencies
- name: Run Tests
run: ./vendor/bin/pest
================================================
FILE: .github/workflows/install-automatic.yml
================================================
name: Automated Installation
on:
push:
branches:
- main
- 3.x
pull_request:
branches: [ main ]
jobs:
installer-automatic:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.3'
- name: Create test directory
run: mkdir project_folder
- name: Download tarball of current commit
run: |
TARBALL_URL=$(curl -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
-H "Accept: application/vnd.github.v3+json" \
https://api.github.com/repos/${{ github.repository }}/tarball/${{ github.sha }} \
-I | grep -i "location:" | cut -d " " -f 2 | tr -d '\r')
curl -L -o wave.tar.gz $TARBALL_URL
- name: Extract tarball to test directory
run: tar -xzf wave.tar.gz -C project_folder --strip-components=1
- name: Debug - List contents of test directory
run: |
echo "Contents of project_folder directory:"
ls -la project_folder
echo "Contents of project_folder/public directory (if it exists):"
ls -la project_folder/public || echo "Public directory not found"
- name: Run PHP built-in server
run: |
cd project_folder
php -S localhost:8000 -t public &
echo $! > php_server.pid
- name: Wait for server to start
run: sleep 10
- name: Check if installer page is accessible
run: |
response=$(curl -sS -o response.html -w "%{http_code}" http://localhost:8000)
if [ $response -eq 200 ]; then
echo "Installer page is accessible"
cat response.html
else
echo "Installer page is not accessible. HTTP status code: $response"
cat response.html
exit 1
fi
- name: Navigate to install page and initiate installation
run: |
response=$(curl -sS -o install_page.html -w "%{http_code}" http://localhost:8000/install)
if [ $response -eq 200 ]; then
echo "Install page is accessible"
# Check if the page contains the "Install Wave" button
if grep -q "Install Wave" install_page.html; then
echo "Install Wave button found on the page"
# Attempt to initiate the installation by making a GET request
install_response=$(curl -sS -o install_response.html -w "%{http_code}" -L http://localhost:8000/install)
if [ $install_response -eq 200 ]; then
echo "Installation process initiated"
# Check if the response indicates successful installation
if grep -q "Successfully Installed" install_response.html; then
echo "Installation completed successfully"
else
echo "Installation may not have completed. Check install_response.html for details."
cat install_response.html
fi
else
echo "Failed to initiate installation. HTTP status code: $install_response"
cat install_response.html
exit 1
fi
else
echo "Install Wave button not found on the page"
cat install_page.html
exit 1
fi
else
echo "Install page is not accessible. HTTP status code: $response"
cat install_page.html
exit 1
fi
- name: Check installation complete page
run: |
response=$(curl -sS -o complete_page.html -w "%{http_code}" "http://localhost:8000/install?complete=true")
if [ $response -eq 200 ]; then
echo "Installation complete page is accessible"
if grep -q "Successfully Installed" complete_page.html; then
echo "Installation was successful"
else
echo "Installation complete page doesn't contain success message"
cat complete_page.html
exit 1
fi
else
echo "Installation complete page is not accessible. HTTP status code: $response"
cat complete_page.html
exit 1
fi
- name: Navigate to homepage and check content
run: |
response=$(curl -sS -o homepage.html -w "%{http_code}" http://localhost:8000)
if [ $response -eq 200 ]; then
echo "Homepage is accessible"
if grep -q "Ship in Days" homepage.html; then
echo "Homepage contains expected content"
else
echo "Homepage doesn't contain expected content"
echo "Content of homepage.html:"
cat homepage.html
exit 1
fi
else
echo "Homepage is not accessible. HTTP status code: $response"
echo "Content of homepage.html:"
cat homepage.html
exit 1
fi
================================================
FILE: .github/workflows/pint.yml
================================================
name: Laravel Pint
on:
pull_request:
branches:
- main
jobs:
pint:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: 8.3
extensions: dom, curl, libxml, mbstring, zip, pcntl, pdo, sqlite, pdo_sqlite, bcmath, soap, intl, gd, exif, iconv
coverage: none
- name: Install Composer dependencies
run: composer install --prefer-dist --no-interaction --no-progress --optimize-autoloader
- name: Run Laravel Pint
run: ./vendor/bin/pint --test
================================================
FILE: .github/workflows/tests.yml
================================================
name: Pest Tests
on:
push:
branches:
- main
- 3.x
pull_request:
branches: [ main ]
jobs:
installer-manual:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: '8.3'
extensions: pdo_sqlite
- name: Create project directory
run: mkdir project_folder
- name: Download tarball of current commit
run: |
TARBALL_URL=$(curl -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" \
-H "Accept: application/vnd.github.v3+json" \
https://api.github.com/repos/${{ github.repository }}/tarball/${{ github.sha }} \
-I | grep -i "location:" | cut -d " " -f 2 | tr -d '\r')
curl -L -o wave.tar.gz $TARBALL_URL
- name: Extract tarball to project directory
run: tar -xzf wave.tar.gz -C project_folder --strip-components=1
- name: Debug - List contents of project directory
run: |
echo "Contents of project_folder directory:"
ls -la project_folder
echo "Contents of project_folder/public directory (if it exists):"
ls -la project_folder/public || echo "Public directory not found"
- name: Copy .env.example file
run: |
cd project_folder
cp .env.example .env
- name: Create SQLite database
run: |
cd project_folder
touch database/database.sqlite
- name: Install Composer Dependencies
run: |
cd project_folder
composer install
- name: Generate application key
run: |
cd project_folder
php artisan key:generate
- name: Database Migrations and Seed
run: |
cd project_folder
php artisan migrate
php artisan db:seed
- name: Start Laravel server
run: |
cd project_folder
php artisan serve &
echo $! > laravel_server.pid
- name: Wait for server to start
run: sleep 5
- name: Execute tests (Unit and Feature tests) via PestPHP
run: |
cd project_folder
./vendor/bin/pest
- name: Stop Laravel server
if: always()
run: kill $(cat project_folder/laravel_server.pid)
================================================
FILE: .gitignore
================================================
/node_modules
/public/hot
/public/storage
/storage/*.key
/storage/pail
/vendor
.env
.env.backup
.phpunit.result.cache
.phpunit.cache
Homestead.json
Homestead.yaml
npm-debug.log
yarn-error.log
/.idea
/.nova
/.vscode
# Wave ignores.
/public/.well-known
/public/demo
/.vagrant
/wave-pro
Homestead.json
Homestead.yaml
npm-debug.log
yarn-error.log
.DS_Store
/wave/vendor/
/public/wave/docs
/storage/app/analytics
/packages
storage/app/livewire-tmp
resources/themes/.gitignore
/resources/plugins/*
!/resources/plugins/installed.json
/storage/app/public/livewire-tmp
/storage/app/public/*
!/storage/app/public/demo
# Ignore everything inside the resources/plugins folder
resources/plugins/*
# But do not ignore the resources/plugins folder itself
!resources/plugins/
!resources/plugins/installed.json
================================================
FILE: CLAUDE.md
================================================
# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Overview
Wave is a Laravel-based SaaS framework that provides essential features for building subscription-based applications. The application uses a modular architecture with themes, plugins, and a custom admin panel built with Filament.
## Development Commands
### Frontend Development
- `npm run dev` - Start Vite development server
- `npm run build` - Build assets for production
### Backend Development
- `php artisan serve` - Start Laravel development server
- `composer run dev` - Start full development environment (server, queue, logs, and Vite)
### Database & Migrations
- `php artisan migrate` - Run database migrations
- `php artisan db:seed` - Seed the database
- `php artisan migrate:fresh --seed` - Fresh migration with seeding
### Testing
- `php artisan test` - Run PHPUnit tests
- `vendor/bin/pest` - Run Pest tests
### Queue Management
- `php artisan queue:work` - Process queued jobs
- `php artisan queue:listen --tries=1` - Listen for jobs with retry limit
### Wave-Specific Commands
- `php artisan wave:cancel-expired-subscriptions` - Cancel expired subscriptions
- `php artisan wave:create-plugin` - Create a new plugin
## Architecture Overview
### Core Structure
- `app/` - Standard Laravel application files
- `wave/` - Wave framework core files and components
- `resources/themes/` - Theme files (Blade templates, assets)
- `resources/plugins/` - Plugin system files
- `config/wave.php` - Main Wave configuration
### Key Components
#### Wave Service Provider (`wave/src/WaveServiceProvider.php`)
- Registers middleware, Livewire components, and Blade directives
- Handles plugin registration and theme management
- Configures Filament colors and authentication
#### Models & Database
- User model extends Wave User with subscription capabilities
- Subscription management with Stripe/Paddle integration
- Role-based permissions using Spatie Laravel Permission
#### Theme System
- Multiple themes available in `resources/themes/`
- Theme switching in demo mode via cookies
- Folio integration for page routing
#### Admin Panel
- Filament-based admin interface
- Resource management for users, posts, plans, etc.
- Located in `app/Filament/`
### Billing Integration
- Supports both Stripe and Paddle
- Configured via `config/wave.php` and environment variables
- Webhook handling for subscription events
### Plugin System
- Plugins located in `resources/plugins/`
- Auto-loading via `PluginServiceProvider`
- Plugin creation command available
## Configuration
### Environment Variables
- `WAVE_DOCS` - Show/hide documentation
- `WAVE_DEMO` - Enable demo mode
- `WAVE_BAR` - Show development bar
- `BILLING_PROVIDER` - Set to 'stripe' or 'paddle'
### Important Config Files
- `config/wave.php` - Main Wave configuration
- `config/themes.php` - Theme configuration
- `config/settings.php` - Application settings
## Testing
The application uses Pest for testing with PHPUnit as the underlying framework. Test files are located in `tests/` with separate directories for Feature and Unit tests.
## Development Notes
- The application uses Laravel Folio for page routing
- Livewire components handle dynamic UI interactions
- Filament provides the admin interface
- Theme development follows Blade templating conventions
- Plugin development follows Laravel package conventions
## Performance Optimizations
### Caching Strategy
- User subscription/admin status cached for 5-10 minutes
- Active plans cached for 30 minutes
- Categories cached for 1 hour
- Helper files cached permanently until cleared
- Theme colors cached for 1 hour
- Plugin lists cached for 1 hour
### Cache Clearing
- User caches cleared via `$user->clearUserCache()` method
- Plan caches cleared via `Plan::clearCache()` method
- Category caches cleared via `Category::clearCache()` method
### Database Optimizations
- Eager loading relationships to prevent N+1 queries
- Cached query results for frequently accessed data
- Optimized middleware to use cached user roles
### Usage Tips
- Use `Plan::getActivePlans()` instead of `Plan::where('active', 1)->get()`
- Use `Plan::getByName($name)` instead of `Plan::where('name', $name)->first()`
- Use `Category::getAllCached()` instead of `Category::all()`
- Always clear relevant caches when updating user roles, plans, or categories
### Installation & CI Compatibility
- All caching methods include fallbacks for when cache service is unavailable
- Service provider guards against cache binding issues during package discovery
- Compatible with automated testing environments and CI/CD pipelines
## Activity Log Feature
A simple, performant activity logging system for tracking user actions.
### Configuration
Edit `config/activity.php`:
```php
return [
// Enable/disable activity logging
'enabled' => env('ACTIVITY_LOG_ENABLED', true),
// Queue logs for better performance (recommended for busy apps)
'queue' => env('ACTIVITY_LOG_QUEUE', false),
// Queue connection to use
'queue_connection' => env('ACTIVITY_LOG_QUEUE_CONNECTION', 'database'),
// How many days to keep logs before auto-deletion
'retention_days' => env('ACTIVITY_LOG_RETENTION_DAYS', 90),
];
```
### Environment Variables
```env
# Disable activity logging
ACTIVITY_LOG_ENABLED=false
# Enable queued logging (recommended for production)
ACTIVITY_LOG_QUEUE=true
ACTIVITY_LOG_QUEUE_CONNECTION=redis
# Keep logs for 30 days instead of default 90
ACTIVITY_LOG_RETENTION_DAYS=30
```
### Usage
#### Basic Logging
```php
use Wave\ActivityLog;
// Simple log
ActivityLog::log('action_name', 'Description of what happened');
// With metadata
ActivityLog::log('profile_updated', 'User updated their email', [
'old_email' => 'old@example.com',
'new_email' => 'new@example.com'
]);
```
### Cleanup & Maintenance
Activity logs are automatically cleaned up daily to prevent database bloat:
```bash
# Manually clean logs older than configured retention period
php artisan activity:clean
# Clean logs older than specific number of days
php artisan activity:clean --days=30
# Force cleanup without confirmation
php artisan activity:clean --no-interaction
```
The cleanup command runs automatically every day via Laravel's scheduler.
#### Queued (Recommended for Production)
```env
ACTIVITY_LOG_QUEUE=true
ACTIVITY_LOG_QUEUE_CONNECTION=redis
```
### Disabling
To completely disable activity logging:
```env
ACTIVITY_LOG_ENABLED=false
```
## Account Deletion Feature
A scheduled account deletion system that gives users a grace period before permanent deletion.
### Scheduled Command
The system automatically processes scheduled deletions daily:
```bash
# Manually process scheduled deletions
php artisan accounts:process-deletions
```
This command:
1. Finds all users with `deletion_scheduled_at` <= current time
2. Permanently deletes those accounts (force delete)
3. Logs results (success/failure for each account)
4. Returns count of deleted accounts
### Automatic Scheduling
The deletion processor runs automatically every day via Laravel's scheduler (configured in `routes/console.php`):
```php
Schedule::command('accounts:process-deletions')->daily();
```
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Code of Conduct
## Our Community
Wave is built by developers, for developers. We're here to help each other build better SaaS applications.
## Expected Behavior
- Be respectful and considerate in your communication
- Welcome newcomers and help them get started
- Give and receive constructive feedback gracefully
- Focus on what's best for the community
- Show patience when others are learning
## Unacceptable Behavior
- Harassment, discrimination, or offensive comments
- Personal attacks or trolling
- Publishing someone's private information without permission
- Spam or excessive self-promotion
- Any behavior that makes others feel unwelcome
## Reporting Issues
If you experience or witness unacceptable behavior, please contact us at support@devdojo.com.
We will review and address all reports promptly and fairly.
## Scope
This Code of Conduct applies to all project spaces including GitHub, Discord, social media, and events where you're representing the Wave community.
---
By participating in the Wave community, you agree to follow this Code of Conduct.
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to Wave
Thank you for considering contributing to Wave! We appreciate your interest in making this SaaS framework even better.
## Table of Contents
- [Code of Conduct](#code-of-conduct)
- [How Can I Contribute?](#how-can-i-contribute)
- [Development Setup](#development-setup)
- [Coding Standards](#coding-standards)
- [Submitting Changes](#submitting-changes)
- [Reporting Bugs](#reporting-bugs)
- [Suggesting Features](#suggesting-features)
- [Testing](#testing)
## Code of Conduct
This project and everyone participating in it is governed by our commitment to fostering an open and welcoming environment. We expect all contributors to:
- Use welcoming and inclusive language
- Be respectful of differing viewpoints and experiences
- Gracefully accept constructive criticism
- Focus on what is best for the community
- Show empathy towards other community members
## How Can I Contribute?
### Reporting Bugs
If you discover a bug, please:
1. Check the [documentation](https://devdojo.com/wave/docs) to ensure it's not expected behavior
2. Search [existing pull requests](https://github.com/thedevdojo/wave/pulls) to see if it's already being addressed
3. Join the [DevDojo community](https://devdojo.com) to discuss the issue
4. If confirmed, submit a pull request with a fix
When reporting or fixing a bug, please include:
- **Clear descriptive title** - Use a clear and descriptive title
- **Detailed description** - Provide a detailed description of the issue
- **Steps to reproduce** - List the exact steps to reproduce the problem
- **Expected behavior** - Describe what you expected to happen
- **Actual behavior** - Describe what actually happened
- **Environment details**:
- Wave version
- Laravel version
- PHP version
- Operating system
- Database (MySQL, PostgreSQL, SQLite)
- Billing provider (Stripe/Paddle)
- **Screenshots** - If applicable, add screenshots to help explain the problem
- **Error messages** - Include any relevant error messages or logs
### Suggesting Features
Feature suggestions are welcome! Before suggesting a feature:
- Check the [documentation](https://devdojo.com/wave/docs) to ensure the feature doesn't already exist
- Search [existing pull requests](https://github.com/thedevdojo/wave/pulls) to see if it's already in progress
- Join the [DevDojo community](https://devdojo.com) to discuss your idea with other users and maintainers
When suggesting a feature via pull request, please include:
- **Clear description** - Explain the feature in detail
- **Use case** - Describe why this feature would be useful
- **Examples** - Provide examples of how the feature would work
- **Alternatives** - Describe any alternative solutions you've considered
- **Documentation** - Update relevant documentation to explain the new feature
### Pull Requests
We actively welcome your pull requests! Here's how to submit one:
1. Fork the repository
2. Create a new branch from `main` (`git checkout -b feature/my-feature`)
3. Make your changes
4. Write or update tests as needed
5. Ensure tests pass (`./vendor/bin/pest`)
6. Ensure code follows style guidelines (`./vendor/bin/pint --test`)
7. Commit your changes with clear, descriptive messages
8. Push to your fork
9. Submit a pull request to the `main` branch
## Development Setup
### Prerequisites
- PHP 8.2 or higher
- Composer
- Node.js 18+ and npm
- SQLite, MySQL, or PostgreSQL
### Installation
1. **Clone your fork**:
```bash
git clone https://github.com/YOUR-USERNAME/wave.git
cd wave
```
2. **Install PHP dependencies**:
```bash
composer install
```
3. **Install Node dependencies**:
```bash
npm install
```
4. **Set up environment**:
```bash
cp .env.example .env
php artisan key:generate
```
5. **Create database**:
```bash
touch database/database.sqlite # For SQLite
```
6. **Run migrations and seeders**:
```bash
php artisan migrate
php artisan db:seed
```
7. **Build assets**:
```bash
npm run build
```
8. **Start development server**:
```bash
composer run dev # Starts server, queue, logs, and Vite
```
Or run components separately:
```bash
php artisan serve
npm run dev
php artisan queue:listen
```
## Coding Standards
### PHP Code Style
Wave follows the Laravel coding style using [Laravel Pint](https://laravel.com/docs/pint).
- **Check code style**: `./vendor/bin/pint --test`
- **Fix code style**: `./vendor/bin/pint`
Key conventions:
- PSR-12 compliant
- Use type hints where possible
- Write descriptive variable and method names
- Keep methods focused and concise
- Add PHPDoc blocks for complex methods
### JavaScript/CSS Style
- Follow standard JavaScript ES6+ conventions
- Use Tailwind CSS utility classes
- Avoid inline styles when possible
- Keep JavaScript minimal and maintainable
### Blade Templates
- Use Blade components where appropriate
- Keep logic out of views (use Livewire or view composers)
- Follow consistent indentation (4 spaces)
- Use Blade directives (`@if`, `@foreach`) over PHP tags
## Submitting Changes
### Commit Messages
Write clear, concise commit messages following these guidelines:
- Use the imperative mood ("Add feature" not "Added feature")
- First line should be 50 characters or less
- Optionally add a blank line and detailed description
- Reference pull requests when relevant
**Good examples**:
```
fix: resolve subscription webhook timeout issue
feat: add user data export functionality
docs: improve billing configuration examples
test: add coverage for profile update validation
```
**Commit types**:
- `feat:` - New feature
- `fix:` - Bug fix
- `docs:` - Documentation changes
- `style:` - Code style/formatting (no functional changes)
- `refactor:` - Code refactoring
- `test:` - Adding or updating tests
- `chore:` - Maintenance tasks
### Pull Request Guidelines
- **One feature per PR** - Keep pull requests focused on a single feature or fix
- **Update tests** - Add or update tests to cover your changes
- **Update documentation** - Update relevant documentation if needed
- **Clean commit history** - Squash commits if needed to keep history clean
- **Descriptive title** - Use a clear title that describes the change
- **Detailed description** - Explain what changes were made and why
- **Screenshots** - Add screenshots for UI changes
- **Breaking changes** - Clearly mark any breaking changes
## Testing
Wave uses [Pest PHP](https://pestphp.com/) for testing.
### Running Tests
```bash
# Run all tests
./vendor/bin/pest
# Run specific test file
./vendor/bin/pest tests/Feature/AccountDeletionTest.php
# Run tests with coverage
./vendor/bin/pest --coverage
# Run tests with detailed output
./vendor/bin/pest --verbose
```
### Writing Tests
- Place feature tests in `tests/Feature/`
- Place unit tests in `tests/Unit/`
- Follow existing test patterns in the codebase
- Test both success and failure scenarios
- Use descriptive test names that explain what is being tested
**Example test structure**:
```php
it('allows users to update their profile', function () {
$user = User::factory()->create();
$response = $this->actingAs($user)->put('/settings/profile', [
'name' => 'Updated Name',
'email' => 'newemail@example.com',
]);
$response->assertRedirect();
expect($user->fresh()->name)->toBe('Updated Name');
});
```
### Test Database
Tests use SQLite in-memory database by default. You can configure this in `phpunit.xml`.
## Additional Resources
- [Wave Documentation](https://devdojo.com/wave/docs)
- [Laravel Documentation](https://laravel.com/docs)
- [Pest PHP Documentation](https://pestphp.com/docs)
- [Filament Documentation](https://filamentphp.com/docs)
- [Livewire Documentation](https://livewire.laravel.com/docs)
## Questions?
If you have questions about contributing, feel free to:
- Open a [discussion](https://github.com/thedevdojo/wave/discussions)
- Join the [DevDojo community](https://devdojo.com)
- Check the [documentation](https://devdojo.com/wave/docs)
## License
By contributing to Wave, you agree that your contributions will be licensed under the [MIT License](LICENSE.md).
---
Thank you for contributing to Wave! Your efforts help make this framework better for everyone. 🌊
================================================
FILE: LICENSE.md
================================================
The MIT License (MIT)
Copyright (c) DevDojo
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
================================================
FILE: README.md
================================================
<p align="center"><a href="https://devdojo.com/wave" target="_blank"><img src="https://cdn.devdojo.com/images/october2024/wave-logo.png" width="200"></a></p>
<p align="center">
<a href="https://github.com/thedevdojo/wave/actions"><img src="https://github.com/thedevdojo/wave/actions/workflows/tests.yml/badge.svg" alt="Build Status"></a>
<a href="https://github.com/thedevdojo/wave"><img src="https://img.shields.io/github/v/release/thedevdojo/wave" alt="Latest Stable Version"></a>
<a href="https://github.com/thedevdojo/wave"><img src="https://img.shields.io/badge/license-MIT-green" alt="License"></a>
<a href="https://herd.laravel.com/new?starter-kit=devdojo/wave"><img src="https://img.shields.io/badge/Install%20with%20Herd-f55247?logo=laravel&logoColor=white"></a>
</p>
Wave is a SaaS framework, built with <a href="https://laravel.com">Laravel</a>, that will make building your SaaS application fun and easier than ever before. <a href="https://devdojo.com/wave/docs" target="_blank">View the full docs here</a>.
Wave provides you with all the essential features found in many popular SaaS platforms, allowing you to quickly transform your idea into a profitable SaaS product. Here are a handful of features that Wave provides:
- <a href="https://devdojo.com/wave/docs/features/auth" target="_blank">Authentication</a>
- <a href="https://devdojo.com/wave/docs/features/user-profiles" target="_blank">User Profiles</a>
- <a href="https://devdojo.com/wave/docs/features/user-impersonations" target="_blank">User Impersonations</a>
- <a href="https://devdojo.com/wave/docs/features/billing" target="_blank">Billing</a>
- <a href="https://devdojo.com/wave/docs/features/subscription-plans" target="_blank">Subscription Plans</a>
- <a href="https://devdojo.com/wave/docs/features/roles-permissions" target="_blank">Roles & Permissions</a>
- <a href="https://devdojo.com/wave/docs/features/notifications" target="_blank">User Notifications</a>
- <a href="https://devdojo.com/wave/docs/features/changelog" target="_blank">Changelog</a>
- <a href="https://devdojo.com/wave/docs/features/blog" target="_blank">Blog</a>
- <a href="https://devdojo.com/wave/docs/features/pages" target="_blank">Pages</a>
- <a href="https://devdojo.com/wave/docs/features/api" target="_blank">API</a>
- <a href="https://devdojo.com/wave/docs/features/admin" target="_blank">Admin</a>
- <a href="https://devdojo.com/wave/docs/features/themes" target="_blank">Themes</a>
- <a href="https://devdojo.com/wave/docs/features/plugins" target="_blank">Plugins</a>
Be sure to view a list of <a href="https://devdojo.com/wave/docs/features/auth" target="_blank">all features here</a>.
## Demo
You can view a <a href="https://devdojo.com/wave/demo" target="_blank">live demo here</a>, which will also allow you to preview all the <a href="https://devdojo.com/wave/themes" target="_blank">available themes</a>.
<a href="https://devdojo.com/wave/demo" target="_blank"><img src="https://cdn.devdojo.com/images/august2024/wave-anchor-theme.jpeg" alt="Wave Anchor Theme Preview"></a>
## Installation
There are two ways to install Wave, you can install it via the automated installer or manually.
Click here to <a href="https://devdojo.com/wave/docs/install" target="_blank">view the full installation instructions</a>.
## Support the Project
The best way to support this project is to support us by subscribing to a <a href="https://devdojo.com/pro">DevDojo Pro</a> account. This will give you access to <a href="https://devdojo.com/wave/pro">premium content</a> to help you build your SaaS even quicker. Also, make sure to tell your friends and <a href="https://github.com/thedevdojo/wave/compare" target="_blank">submit a PR</a> if you want to contribute.
We've also got a full video series on how you can setup, build, and configure Wave. 🍿 You can watch first few videos for free, and additional videos will require a [DevDojo Pro](https://devdojo.com/wave/pro) subscription. By subscribing to a [DevDojo Pro](https://devdojo.com/pro) subscription you will also be supporting the ongoing development of this project. It's a win win! 🙌
[Click here to watch the Wave Video Course](https://devdojo.com/wave/videos).
## Documentation
Checkout the [official documentation here](https://devdojo.com/wave/docs).
## Sponsors
Wave is proudly supported by our amazing sponsors. A big thank you to:
[](https://www.digitalocean.com/?refcode=dc19b9819d06&utm_campaign=Referral_Invite&utm_medium=Referral_Program&utm_source=badge)
================================================
FILE: SECURITY.md
================================================
# Security Policy
**PLEASE DON'T DISCLOSE SECURITY-RELATED ISSUES PUBLICLY.**
## Reporting a Vulnerability
If you discover a security vulnerability within Wave, please send an email to the DevDojo team at support@devdojo.com. All security vulnerabilities will be promptly addressed.
================================================
FILE: app/Console/Commands/CreateRole.php
================================================
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Validator;
use Spatie\Permission\Models\Permission;
use Spatie\Permission\Models\Role;
class CreateRole extends Command
{
protected $signature = 'app:create-role';
protected $description = 'Create a new role with optional permissions';
public function handle(): int
{
$name = $this->ask('Enter the name of the new role');
// Validate role name
$validator = Validator::make(['name' => $name], [
'name' => ['required', 'string', 'max:255', 'unique:roles,name'],
]);
if ($validator->fails()) {
$this->error('Validation failed:');
foreach ($validator->errors()->all() as $error) {
$this->line($error);
}
return 1;
}
$description = $this->ask('Enter a description for the new role (optional)') ?? null;
// Create the role
$role = Role::create([
'name' => $name,
'description' => $description,
]);
// Ask if user wants to assign permissions
if ($this->confirm('Do you want to assign permissions to this role?', true)) {
$this->assignPermissions($role);
}
$this->info("Role '{$name}' created successfully.");
return 0;
}
protected function assignPermissions(Role $role)
{
$allPermissions = Permission::all();
if ($allPermissions->isEmpty()) {
$this->warn('No permissions found in the database.');
return;
}
$permissionChoices = $allPermissions->pluck('name', 'id')->toArray();
$selectedPermissionIds = $this->choice(
'Select permissions to assign to the role (multiple selection allowed)',
$permissionChoices,
null,
null,
true
);
$selectedPermissions = $allPermissions->whereIn('id', $selectedPermissionIds);
$role->syncPermissions($selectedPermissions);
$this->info('Permissions assigned successfully.');
}
}
================================================
FILE: app/Console/Commands/CreateUser.php
================================================
<?php
namespace App\Console\Commands;
use App\Models\User;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rules\Password;
use Spatie\Permission\Models\Role;
class CreateUser extends Command
{
protected $signature = 'app:create-user';
protected $description = 'Create a new user with role assignment';
public function handle(): int
{
$name = $this->ask('Enter the user\'s name');
$email = $this->ask('Enter the user\'s email');
$username = $this->ask('Enter the user\'s username');
$password = $this->secret('Enter the user\'s password');
// Validate input
$validator = Validator::make([
'name' => $name,
'email' => $email,
'username' => $username,
'password' => $password,
], [
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
'username' => ['required', 'string', 'max:255', 'unique:users'],
'password' => ['required', Password::defaults()],
]);
if ($validator->fails()) {
$this->error('Validation failed:');
foreach ($validator->errors()->all() as $error) {
$this->line($error);
}
return 1;
}
// Create user
$user = User::create([
'name' => $name,
'email' => $email,
'username' => $username,
'password' => Hash::make($password),
'verified' => 1,
]);
// Get roles and let user select
$roles = Role::all()->pluck('name')->toArray();
$selectedRole = $this->choice(
'Select a role for the user',
$roles,
0
);
$user->syncRoles([]);
// Assign selected role to the user
$user->assignRole($selectedRole);
$this->info("User created successfully with role: {$selectedRole}");
return 0;
}
}
================================================
FILE: app/Filament/Pages/Dashboard.php
================================================
<?php
namespace App\Filament\Pages;
use BackedEnum;
use Filament\Panel;
class Dashboard extends \Filament\Pages\Dashboard
{
protected static BackedEnum|string|null $navigationIcon = 'phosphor-house-duotone';
public function panel(Panel $panel): Panel
{
return $panel
->pages([]);
}
}
================================================
FILE: app/Filament/Pages/Media.php
================================================
<?php
namespace App\Filament\Pages;
use BackedEnum;
use Filament\Pages\Page;
use Filament\Support\Enums\Width;
class Media extends Page
{
protected static BackedEnum|string|null $navigationIcon = 'heroicon-o-photo';
protected string $view = 'wave::media.index';
protected static ?int $navigationSort = 5;
public function getMaxContentWidth(): Width|string|null
{
return Width::Full;
}
}
================================================
FILE: app/Filament/Pages/Plugins.php
================================================
<?php
namespace App\Filament\Pages;
use BackedEnum;
use Filament\Notifications\Notification;
use Filament\Pages\Page;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Str;
class Plugins extends Page
{
protected static BackedEnum|string|null $navigationIcon = 'phosphor-plugs-duotone';
protected string $view = 'filament.pages.plugins';
protected static ?int $navigationSort = 9;
public $plugins = [];
public function mount()
{
$this->refreshPlugins();
}
private function refreshPlugins()
{
$this->plugins = $this->getPluginsFromFolder();
}
private function getPluginsFromFolder()
{
$plugins = [];
$plugins_folder = resource_path('plugins');
if (! file_exists($plugins_folder)) {
mkdir($plugins_folder);
}
$scandirectory = scandir($plugins_folder);
foreach ($scandirectory as $folder) {
if ($folder === '.' || $folder === '..') {
continue;
}
$studlyFolderName = Str::studly($folder);
$pluginFile = $plugins_folder.'/'.$folder.'/'.$studlyFolderName.'Plugin.php';
if (file_exists($pluginFile)) {
$pluginClass = "Wave\\Plugins\\{$studlyFolderName}\\{$studlyFolderName}Plugin";
if (class_exists($pluginClass) && method_exists($pluginClass, 'getPluginInfo')) {
$plugin = new $pluginClass(app());
$info = $plugin->getPluginInfo();
$info['folder'] = $folder;
$info['active'] = $this->isPluginActive($folder);
$plugins[$folder] = $info;
}
}
}
return $plugins;
}
private function isPluginActive($folder)
{
$installedPlugins = $this->getInstalledPlugins();
return in_array($folder, $installedPlugins);
}
private function getInstalledPlugins()
{
$path = resource_path('plugins/installed.json');
return File::exists($path) ? File::json($path) : [];
}
private function updateInstalledPlugins($plugins)
{
$json = json_encode($plugins);
file_put_contents(resource_path('plugins/installed.json'), $json);
}
public function activate($pluginFolder)
{
$installedPlugins = $this->getInstalledPlugins();
if (! in_array($pluginFolder, $installedPlugins)) {
$installedPlugins[] = $pluginFolder;
$this->updateInstalledPlugins($installedPlugins);
$this->runPostActivationCommands($pluginFolder);
Notification::make()
->title('Successfully activated '.$pluginFolder.' plugin')
->success()
->send();
}
$this->refreshPlugins();
}
private function runPostActivationCommands($pluginFolder)
{
$studlyFolderName = Str::studly($pluginFolder);
$pluginClass = "Wave\\Plugins\\{$studlyFolderName}\\{$studlyFolderName}Plugin";
if (class_exists($pluginClass)) {
$plugin = new $pluginClass(app());
if (method_exists($plugin, 'getPostActivationCommands')) {
$commands = $plugin->getPostActivationCommands();
foreach ($commands as $command) {
if (is_string($command)) {
Artisan::call($command);
} elseif (is_callable($command)) {
$command();
}
}
}
// Run migrations if they exist
$migrationPath = resource_path("plugins/{$pluginFolder}/database/migrations");
if (File::isDirectory($migrationPath)) {
Artisan::call('migrate', [
'--path' => "resources/plugins/{$pluginFolder}/database/migrations",
'--force' => true,
]);
}
}
}
public function deactivate($pluginFolder)
{
$installedPlugins = $this->getInstalledPlugins();
$installedPlugins = array_diff($installedPlugins, [$pluginFolder]);
$this->updateInstalledPlugins($installedPlugins);
Notification::make()
->title('Successfully deactivated '.$pluginFolder.' plugin')
->success()
->send();
$this->refreshPlugins();
}
public function deletePlugin($pluginFolder)
{
$this->deactivate($pluginFolder);
$pluginPath = resource_path('plugins').'/'.$pluginFolder;
if (file_exists($pluginPath)) {
File::deleteDirectory($pluginPath);
}
Notification::make()
->title('Successfully deleted '.$pluginFolder.' plugin')
->success()
->send();
$this->refreshPlugins();
}
}
================================================
FILE: app/Filament/Pages/Themes.php
================================================
<?php
namespace App\Filament\Pages;
use BackedEnum;
use Filament\Notifications\Notification;
use Filament\Pages\Page;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\File;
use Wave\Theme;
class Themes extends Page
{
public $themes = [];
private $themes_folder = '';
protected static BackedEnum|string|null $navigationIcon = 'phosphor-paint-bucket-duotone';
protected static ?int $navigationSort = 8;
protected string $view = 'filament.pages.themes';
public function mount()
{
$this->themes_folder = config('themes.folder', resource_path('themes'));
$this->installThemes();
$this->refreshThemes();
}
private function refreshThemes()
{
$all_themes = Theme::all();
$this->themes = [];
foreach ($all_themes as $theme) {
if (file_exists(resource_path('themes/'.$theme->folder))) {
array_push($this->themes, $theme);
}
}
}
private function getThemesFromFolder()
{
$themes = [];
if (! file_exists($this->themes_folder)) {
mkdir($this->themes_folder);
}
$scandirectory = scandir($this->themes_folder);
if (isset($scandirectory)) {
foreach ($scandirectory as $folder) {
// dd($theme_folder . '/' . $folder . '/' . $folder . '.json');
$json_file = $this->themes_folder.'/'.$folder.'/theme.json';
if (file_exists($json_file)) {
$themes[$folder] = json_decode(file_get_contents($json_file), true);
$themes[$folder]['folder'] = $folder;
$themes[$folder] = (object) $themes[$folder];
}
}
}
return (object) $themes;
}
private function installThemes()
{
$themes = $this->getThemesFromFolder();
foreach ($themes as $theme) {
if (isset($theme->folder)) {
$theme_exists = Theme::where('folder', '=', $theme->folder)->first();
// If the theme does not exist in the database, then update it.
if (! isset($theme_exists->id)) {
$version = isset($theme->version) ? $theme->version : '';
Theme::create(['name' => $theme->name, 'folder' => $theme->folder, 'version' => $version]);
if (config('themes.publish_assets', true)) {
$this->publishAssets($theme->folder);
}
} else {
// If it does exist, let's make sure it's been updated
$theme_exists->name = $theme->name;
$theme_exists->version = isset($theme->version) ? $theme->version : '';
$theme_exists->save();
if (config('themes.publish_assets', true)) {
$this->publishAssets($theme->folder);
}
}
}
}
}
public function activate($theme_folder)
{
$theme = Theme::where('folder', '=', $theme_folder)->first();
if (isset($theme->id)) {
$this->deactivateThemes();
$theme->active = 1;
$theme->save();
$this->writeThemeJson($theme_folder);
Notification::make()
->title('Successfully activated '.$theme_folder.' theme')
->success()
->send();
} else {
Notification::make()
->title('Could not find theme folder. Please confirm this theme has been installed.')
->danger()
->send();
}
Artisan::call('config:clear');
Artisan::call('view:clear');
Artisan::call('route:clear');
$this->refreshThemes();
}
private function writeThemeJson($themeName)
{
$themeJsonPath = base_path('theme.json');
$themeJsonContent = json_encode(['name' => $themeName], JSON_PRETTY_PRINT);
File::put($themeJsonPath, $themeJsonContent);
}
private function deactivateThemes()
{
Theme::query()->update(['active' => 0]);
}
public function deleteTheme($theme_folder)
{
$theme = Theme::where('folder', '=', $theme_folder)->first();
if (! isset($theme)) {
Notification::make()
->title('Theme not found, please make sure this theme exists in the database.')
->danger()
->send();
}
$theme_name = $theme->name;
$theme_location = config('themes.folder').'/'.$theme->folder;
// if the folder exists delete it
if (file_exists($theme_location)) {
File::deleteDirectory($theme_location, false);
}
$theme->delete();
Notification::make()
->title('Theme successfully deleted')
->success()
->send();
$this->refreshThemes();
}
}
================================================
FILE: app/Filament/Resources/Categories/CategoryResource.php
================================================
<?php
namespace App\Filament\Resources\Categories;
use App\Filament\Resources\Categories\Pages\CreateCategory;
use App\Filament\Resources\Categories\Pages\EditCategory;
use App\Filament\Resources\Categories\Pages\ListCategories;
use BackedEnum;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteAction;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Resources\Resource;
use Filament\Schemas\Schema;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
use Wave\Category;
class CategoryResource extends Resource
{
protected static ?string $model = Category::class;
protected static BackedEnum|string|null $navigationIcon = 'phosphor-folder-open-duotone';
protected static ?int $navigationSort = 6;
public static function form(Schema $schema): Schema
{
return $schema
->components([
TextInput::make('name')
->required()
->maxLength(191),
TextInput::make('slug')
->required()
->unique(ignoreRecord: true)
->maxLength(191),
Select::make('parent_id')
->label('Parent Category')
->options(Category::all()->pluck('name', 'id'))
->searchable(),
TextInput::make('order')
->required()
->numeric()
->default(1),
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
TextColumn::make('name')
->searchable(),
TextColumn::make('slug')
->searchable(),
TextColumn::make('created_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
TextColumn::make('updated_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
//
])
->recordActions([
EditAction::make(),
DeleteAction::make(),
])
->toolbarActions([
BulkActionGroup::make([
DeleteBulkAction::make(),
]),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => ListCategories::route('/'),
'create' => CreateCategory::route('/create'),
'edit' => EditCategory::route('/{record}/edit'),
];
}
}
================================================
FILE: app/Filament/Resources/Categories/Pages/CreateCategory.php
================================================
<?php
namespace App\Filament\Resources\Categories\Pages;
use App\Filament\Resources\Categories\CategoryResource;
use Filament\Resources\Pages\CreateRecord;
class CreateCategory extends CreateRecord
{
protected static string $resource = CategoryResource::class;
}
================================================
FILE: app/Filament/Resources/Categories/Pages/EditCategory.php
================================================
<?php
namespace App\Filament\Resources\Categories\Pages;
use App\Filament\Resources\Categories\CategoryResource;
use Filament\Actions\DeleteAction;
use Filament\Resources\Pages\EditRecord;
class EditCategory extends EditRecord
{
protected static string $resource = CategoryResource::class;
protected function getHeaderActions(): array
{
return [
DeleteAction::make(),
];
}
}
================================================
FILE: app/Filament/Resources/Categories/Pages/ListCategories.php
================================================
<?php
namespace App\Filament\Resources\Categories\Pages;
use App\Filament\Resources\Categories\CategoryResource;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ListRecords;
class ListCategories extends ListRecords
{
protected static string $resource = CategoryResource::class;
protected function getHeaderActions(): array
{
return [
CreateAction::make(),
];
}
}
================================================
FILE: app/Filament/Resources/Changelogs/ChangelogResource.php
================================================
<?php
namespace App\Filament\Resources\Changelogs;
use App\Filament\Resources\Changelogs\Pages\CreateChangelog;
use App\Filament\Resources\Changelogs\Pages\EditChangelog;
use App\Filament\Resources\Changelogs\Pages\ListChangelogs;
use BackedEnum;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteAction;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction;
use Filament\Forms\Components\RichEditor;
use Filament\Forms\Components\TextInput;
use Filament\Resources\Resource;
use Filament\Schemas\Schema;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
use Wave\Changelog;
class ChangelogResource extends Resource
{
protected static ?string $model = Changelog::class;
protected static BackedEnum|string|null $navigationIcon = 'phosphor-book-open-text-duotone';
protected static ?int $navigationSort = 7;
public static function form(Schema $schema): Schema
{
return $schema
->components([
TextInput::make('title')
->required()
->maxLength(191),
TextInput::make('description')
->required()
->maxLength(191),
RichEditor::make('body')
->required()
->columnSpanFull(),
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
TextColumn::make('title')
->searchable(),
TextColumn::make('description')
->searchable(),
TextColumn::make('created_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
TextColumn::make('updated_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
//
])
->recordActions([
EditAction::make(),
DeleteAction::make(),
])
->toolbarActions([
BulkActionGroup::make([
DeleteBulkAction::make(),
]),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => ListChangelogs::route('/'),
'create' => CreateChangelog::route('/create'),
'edit' => EditChangelog::route('/{record}/edit'),
];
}
}
================================================
FILE: app/Filament/Resources/Changelogs/Pages/CreateChangelog.php
================================================
<?php
namespace App\Filament\Resources\Changelogs\Pages;
use App\Filament\Resources\Changelogs\ChangelogResource;
use Filament\Resources\Pages\CreateRecord;
class CreateChangelog extends CreateRecord
{
protected static string $resource = ChangelogResource::class;
}
================================================
FILE: app/Filament/Resources/Changelogs/Pages/EditChangelog.php
================================================
<?php
namespace App\Filament\Resources\Changelogs\Pages;
use App\Filament\Resources\Changelogs\ChangelogResource;
use Filament\Actions\DeleteAction;
use Filament\Resources\Pages\EditRecord;
class EditChangelog extends EditRecord
{
protected static string $resource = ChangelogResource::class;
protected function getHeaderActions(): array
{
return [
DeleteAction::make(),
];
}
}
================================================
FILE: app/Filament/Resources/Changelogs/Pages/ListChangelogs.php
================================================
<?php
namespace App\Filament\Resources\Changelogs\Pages;
use App\Filament\Resources\Changelogs\ChangelogResource;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ListRecords;
class ListChangelogs extends ListRecords
{
protected static string $resource = ChangelogResource::class;
protected function getHeaderActions(): array
{
return [
CreateAction::make(),
];
}
}
================================================
FILE: app/Filament/Resources/Forms/FormsResource.php
================================================
<?php
namespace App\Filament\Resources\Forms;
use App\Filament\Resources\Forms\Pages\CreateForms;
use App\Filament\Resources\Forms\Pages\EditForms;
use App\Filament\Resources\Forms\Pages\ListForms;
use App\Models\Forms;
use BackedEnum;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteAction;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction;
use Filament\Forms\Components\Repeater;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Toggle;
use Filament\Forms\Set;
use Filament\Resources\Resource;
use Filament\Schemas\Schema;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Columns\ToggleColumn;
use Filament\Tables\Table;
use Illuminate\Support\Str;
class FormsResource extends Resource
{
protected static ?string $model = Forms::class;
protected static BackedEnum|string|null $navigationIcon = 'heroicon-o-rectangle-stack';
protected static bool $shouldRegisterNavigation = false;
protected static ?int $navigationSort = 12;
public static function form(Schema $schema): Schema
{
return $schema
->components([
TextInput::make('name')
->label('Name')
->required()
->live(debounce: 500)
->afterStateUpdated(fn (Set $set, ?string $state) => $set('slug', Str::slug($state)))
->maxLength(191),
TextInput::make('slug')
->label('Slug')
->required()
->unique(ignoreRecord: true)
->maxLength(191),
Repeater::make('fields')
->schema([
TextInput::make('label')->required(),
Select::make('type')
->options(config('forms.types'))
->required(),
TextInput::make('rules'),
// Repeater::make('options')
// ->schema([
// TextInput::make('option')->required(),
// ])->columnSpanFull()
])
->columns(3)
->columnSpanFull(),
Toggle::make('is_active')
->label('Is Active')
->inline(false),
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
TextColumn::make('name'),
TextColumn::make('slug'),
ToggleColumn::make('is_active'),
])
->filters([
//
])
->recordActions([
EditAction::make(),
DeleteAction::make(),
])
->toolbarActions([
BulkActionGroup::make([
DeleteBulkAction::make(),
]),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => ListForms::route('/'),
'create' => CreateForms::route('/create'),
'edit' => EditForms::route('/{record}/edit'),
];
}
}
================================================
FILE: app/Filament/Resources/Forms/Pages/CreateForms.php
================================================
<?php
namespace App\Filament\Resources\Forms\Pages;
use App\Filament\Resources\Forms\FormsResource;
use Filament\Resources\Pages\CreateRecord;
class CreateForms extends CreateRecord
{
protected static string $resource = FormsResource::class;
protected function mutateFormDataBeforeCreate(array $data): array
{
$data['fields'] = json_encode($data['fields'], true);
return $data;
}
}
================================================
FILE: app/Filament/Resources/Forms/Pages/EditForms.php
================================================
<?php
namespace App\Filament\Resources\Forms\Pages;
use App\Filament\Resources\Forms\FormsResource;
use Filament\Actions\DeleteAction;
use Filament\Resources\Pages\EditRecord;
class EditForms extends EditRecord
{
protected static string $resource = FormsResource::class;
protected function getHeaderActions(): array
{
return [
DeleteAction::make(),
];
}
protected function mutateFormDataBeforeFill(array $data): array
{
// $fields = [];
if (is_string($data['fields'])) {
$data['fields'] = json_decode($data['fields'], true);
}
// dd($data['fields']);
// foreach($data['fields'] as $field){
// $fields[] = json_decode($field, true);
// }
// $data['fields'] = $fields;
// dd($data['fields']);
return $data;
// Runs before the form fields are populated with their default values.
}
}
================================================
FILE: app/Filament/Resources/Forms/Pages/ListForms.php
================================================
<?php
namespace App\Filament\Resources\Forms\Pages;
use App\Filament\Resources\Forms\FormsResource;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ListRecords;
class ListForms extends ListRecords
{
protected static string $resource = FormsResource::class;
protected function getHeaderActions(): array
{
return [
CreateAction::make(),
];
}
}
================================================
FILE: app/Filament/Resources/Pages/PageResource.php
================================================
<?php
namespace App\Filament\Resources\Pages;
use App\Filament\Resources\Pages\Pages\CreatePage;
use App\Filament\Resources\Pages\Pages\EditPage;
use App\Filament\Resources\Pages\Pages\ListPages;
use App\Models\User;
use BackedEnum;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteAction;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction;
use Filament\Forms\Components\FileUpload;
use Filament\Forms\Components\RichEditor;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\Textarea;
use Filament\Forms\Components\TextInput;
use Filament\Resources\Resource;
use Filament\Schemas\Components\Utilities\Set;
use Filament\Schemas\Schema;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
use Illuminate\Support\Str;
use Wave\Page;
class PageResource extends Resource
{
protected static ?string $model = Page::class;
protected static BackedEnum|string|null $navigationIcon = 'phosphor-files-duotone';
protected static ?int $navigationSort = 5;
public static function form(Schema $schema): Schema
{
return $schema
->components([
TextInput::make('title')
->live(onBlur: true)
->afterStateUpdated(fn (Set $set, ?string $state) => $set('slug', Str::slug($state)))
->required()
->maxLength(191),
TextInput::make('slug')
->required()
->unique(ignoreRecord: true)
->maxLength(191),
RichEditor::make('body')
->required()
->columnSpanFull(),
Textarea::make('excerpt')
->columnSpanFull(),
FileUpload::make('image')
->image(),
Select::make('author_id')
->label('Author')
->options(
User::all()
->mapWithKeys(fn ($user) => [
$user->id => $user->name
?? $user->username
?? $user->email,
])
->toArray()
)
->searchable()
->required(),
Textarea::make('meta_description')
->columnSpanFull(),
Textarea::make('meta_keywords')
->columnSpanFull(),
Select::make('status')
->required()
->options([
'ACTIVE' => 'Active',
'INACTIVE' => 'Inactive',
]),
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
TextColumn::make('title')
->searchable(),
TextColumn::make('slug')
->searchable(),
TextColumn::make('status'),
TextColumn::make('created_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
TextColumn::make('updated_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
//
])
->recordActions([
EditAction::make(),
DeleteAction::make(),
])
->toolbarActions([
BulkActionGroup::make([
DeleteBulkAction::make(),
]),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => ListPages::route('/'),
'create' => CreatePage::route('/create'),
'edit' => EditPage::route('/{record}/edit'),
];
}
}
================================================
FILE: app/Filament/Resources/Pages/Pages/CreatePage.php
================================================
<?php
namespace App\Filament\Resources\Pages\Pages;
use App\Filament\Resources\Pages\PageResource;
use Filament\Resources\Pages\CreateRecord;
class CreatePage extends CreateRecord
{
protected static string $resource = PageResource::class;
}
================================================
FILE: app/Filament/Resources/Pages/Pages/EditPage.php
================================================
<?php
namespace App\Filament\Resources\Pages\Pages;
use App\Filament\Resources\Pages\PageResource;
use Filament\Actions\DeleteAction;
use Filament\Resources\Pages\EditRecord;
class EditPage extends EditRecord
{
protected static string $resource = PageResource::class;
protected function getHeaderActions(): array
{
return [
DeleteAction::make(),
];
}
}
================================================
FILE: app/Filament/Resources/Pages/Pages/ListPages.php
================================================
<?php
namespace App\Filament\Resources\Pages\Pages;
use App\Filament\Resources\Pages\PageResource;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ListRecords;
class ListPages extends ListRecords
{
protected static string $resource = PageResource::class;
protected function getHeaderActions(): array
{
return [
CreateAction::make(),
];
}
}
================================================
FILE: app/Filament/Resources/Permissions/Pages/CreatePermission.php
================================================
<?php
namespace App\Filament\Resources\Permissions\Pages;
use App\Filament\Resources\Permissions\PermissionResource;
use Filament\Resources\Pages\CreateRecord;
class CreatePermission extends CreateRecord
{
protected static string $resource = PermissionResource::class;
}
================================================
FILE: app/Filament/Resources/Permissions/Pages/EditPermission.php
================================================
<?php
namespace App\Filament\Resources\Permissions\Pages;
use App\Filament\Resources\Permissions\PermissionResource;
use Filament\Actions\DeleteAction;
use Filament\Resources\Pages\EditRecord;
class EditPermission extends EditRecord
{
protected static string $resource = PermissionResource::class;
protected function getHeaderActions(): array
{
return [
DeleteAction::make(),
];
}
}
================================================
FILE: app/Filament/Resources/Permissions/Pages/ListPermissions.php
================================================
<?php
namespace App\Filament\Resources\Permissions\Pages;
use App\Filament\Resources\Permissions\PermissionResource;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ListRecords;
class ListPermissions extends ListRecords
{
protected static string $resource = PermissionResource::class;
protected function getHeaderActions(): array
{
return [
CreateAction::make(),
];
}
}
================================================
FILE: app/Filament/Resources/Permissions/PermissionResource.php
================================================
<?php
namespace App\Filament\Resources\Permissions;
use App\Filament\Resources\Permissions\Pages\CreatePermission;
use App\Filament\Resources\Permissions\Pages\EditPermission;
use App\Filament\Resources\Permissions\Pages\ListPermissions;
use BackedEnum;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction;
use Filament\Forms\Components\TextInput;
use Filament\Resources\Resource;
use Filament\Schemas\Schema;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
use Spatie\Permission\Models\Permission;
class PermissionResource extends Resource
{
protected static ?string $model = Permission::class;
protected static BackedEnum|string|null $navigationIcon = 'phosphor-shield-check-duotone';
protected static ?int $navigationSort = 3;
public static function form(Schema $schema): Schema
{
return $schema
->components([
TextInput::make('name')
->required()
->maxLength(191),
TextInput::make('guard_name')
->required()
->maxLength(191),
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
TextColumn::make('name')
->searchable(),
TextColumn::make('guard_name')
->searchable(),
TextColumn::make('created_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
TextColumn::make('updated_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
//
])
->recordActions([
EditAction::make(),
])
->toolbarActions([
BulkActionGroup::make([
DeleteBulkAction::make(),
]),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => ListPermissions::route('/'),
'create' => CreatePermission::route('/create'),
'edit' => EditPermission::route('/{record}/edit'),
];
}
}
================================================
FILE: app/Filament/Resources/Plans/Pages/CreatePlan.php
================================================
<?php
namespace App\Filament\Resources\Plans\Pages;
use App\Filament\Resources\Plans\PlanResource;
use Filament\Resources\Pages\CreateRecord;
class CreatePlan extends CreateRecord
{
protected static string $resource = PlanResource::class;
}
================================================
FILE: app/Filament/Resources/Plans/Pages/EditPlan.php
================================================
<?php
namespace App\Filament\Resources\Plans\Pages;
use App\Filament\Resources\Plans\PlanResource;
use Filament\Actions\DeleteAction;
use Filament\Resources\Pages\EditRecord;
class EditPlan extends EditRecord
{
protected static string $resource = PlanResource::class;
protected function getHeaderActions(): array
{
return [
DeleteAction::make(),
];
}
}
================================================
FILE: app/Filament/Resources/Plans/Pages/ListPlans.php
================================================
<?php
namespace App\Filament\Resources\Plans\Pages;
use App\Filament\Resources\Plans\PlanResource;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ListRecords;
class ListPlans extends ListRecords
{
protected static string $resource = PlanResource::class;
protected function getHeaderActions(): array
{
return [
CreateAction::make(),
];
}
}
================================================
FILE: app/Filament/Resources/Plans/PlanResource.php
================================================
<?php
namespace App\Filament\Resources\Plans;
use App\Filament\Resources\Plans\Pages\CreatePlan;
use App\Filament\Resources\Plans\Pages\EditPlan;
use App\Filament\Resources\Plans\Pages\ListPlans;
use BackedEnum;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteAction;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction;
use Filament\Forms\Components\KeyValue;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TagsInput;
use Filament\Forms\Components\Textarea;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Toggle;
use Filament\Resources\Resource;
use Filament\Schemas\Components\Section;
use Filament\Schemas\Schema;
use Filament\Tables\Columns\BooleanColumn;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
use Spatie\Permission\Models\Role;
use Wave\Plan;
class PlanResource extends Resource
{
protected static ?string $model = Plan::class;
protected static BackedEnum|string|null $navigationIcon = 'phosphor-credit-card-duotone';
protected static ?int $navigationSort = 3;
public static function form(Schema $schema): Schema
{
return $schema
->components([
Section::make('Plan Details')
->description('Below are the basic details for each plan including name, description, and features')
->schema([
TextInput::make('name')
->required()
->maxLength(191)
->columnSpan(2),
Textarea::make('description')
->columnSpan([
'default' => 2,
'lg' => 1,
]),
TagsInput::make('features')
->reorderable()
->separator(',')
->placeholder('New feature')
->columnSpan([
'default' => 2,
'lg' => 1,
]),
])->columns(2),
Section::make('Plan Pricing')
->description('Add the pricing details for your plans below')
->schema([
TextInput::make('monthly_price_id')
->label('Monthly Price ID')
->hint('Stripe/Paddle ID')
->maxLength(191),
TextInput::make('monthly_price')
->maxLength(191),
TextInput::make('yearly_price_id')
->label('Yearly Price ID')
->hint('Stripe/Paddle ID')
->maxLength(191),
TextInput::make('yearly_price')
->maxLength(191),
TextInput::make('onetime_price_id')
->label('One-time Price ID')
->hint('Stripe/Paddle ID')
->maxLength(191),
TextInput::make('onetime_price')
->maxLength(191),
Select::make('currency')
->default('$')
->options([
'$' => '$',
'€' => '€',
'£' => '£',
'¥' => '¥',
]),
])->columns(2),
Section::make('Plan Status')
->description('Make the plan default or active/inactive and set the sort order')
->schema([
Toggle::make('active')
->required(),
Toggle::make('default')
->required(),
TextInput::make('sort_order')
->integer()
->default(0)
->minValue(0)
->required(),
])->columns(2),
Section::make('Feature Limits')
->description('Set usage limits for this plan. Leave empty for unlimited. Use -1 for explicitly unlimited, 0 to disable.')
->schema([
KeyValue::make('limits')
->keyLabel('Feature')
->valueLabel('Limit')
->keyPlaceholder('e.g., api_keys')
->valuePlaceholder('e.g., 10')
->reorderable()
->columnSpanFull(),
]),
Section::make('Associated Role')
->description('When the user subscribes to this plan, what role should they be assigned?')
->schema([
Select::make('role_id')
->label('Role')
->options(Role::all()->pluck('name', 'id'))
->searchable()
->required(),
]),
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
TextColumn::make('name')
->searchable(),
TextColumn::make('sort_order')
->numeric()
->sortable(),
TextColumn::make('role_id')
->numeric()
->sortable(),
BooleanColumn::make('active')
->sortable(),
TextColumn::make('currency')
->toggleable(isToggledHiddenByDefault: true),
TextColumn::make('created_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
TextColumn::make('updated_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->defaultSort('sort_order')
->filters([
//
])
->recordActions([
EditAction::make(),
DeleteAction::make(),
])
->toolbarActions([
BulkActionGroup::make([
DeleteBulkAction::make(),
]),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => ListPlans::route('/'),
'create' => CreatePlan::route('/create'),
'edit' => EditPlan::route('/{record}/edit'),
];
}
}
================================================
FILE: app/Filament/Resources/Posts/Pages/CreatePost.php
================================================
<?php
namespace App\Filament\Resources\Posts\Pages;
use App\Filament\Resources\Posts\PostResource;
use Filament\Resources\Pages\CreateRecord;
class CreatePost extends CreateRecord
{
protected static string $resource = PostResource::class;
}
================================================
FILE: app/Filament/Resources/Posts/Pages/EditPost.php
================================================
<?php
namespace App\Filament\Resources\Posts\Pages;
use App\Filament\Resources\Posts\PostResource;
use Filament\Actions\DeleteAction;
use Filament\Resources\Pages\EditRecord;
class EditPost extends EditRecord
{
protected static string $resource = PostResource::class;
protected function getHeaderActions(): array
{
return [
DeleteAction::make(),
];
}
}
================================================
FILE: app/Filament/Resources/Posts/Pages/ListPosts.php
================================================
<?php
namespace App\Filament\Resources\Posts\Pages;
use App\Filament\Resources\Posts\PostResource;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ListRecords;
class ListPosts extends ListRecords
{
protected static string $resource = PostResource::class;
protected function getHeaderActions(): array
{
return [
CreateAction::make(),
];
}
}
================================================
FILE: app/Filament/Resources/Posts/PostResource.php
================================================
<?php
namespace App\Filament\Resources\Posts;
use App\Filament\Resources\Posts\Pages\CreatePost;
use App\Filament\Resources\Posts\Pages\EditPost;
use App\Filament\Resources\Posts\Pages\ListPosts;
use App\Models\User;
use BackedEnum;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteAction;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction;
use Filament\Forms\Components\FileUpload;
use Filament\Forms\Components\RichEditor;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\Textarea;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Toggle;
use Filament\Resources\Resource;
use Filament\Schemas\Components\Utilities\Set;
use Filament\Schemas\Schema;
use Filament\Tables\Columns\IconColumn;
use Filament\Tables\Columns\ImageColumn;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
use Illuminate\Support\Str;
use Wave\Category;
use Wave\Post;
class PostResource extends Resource
{
protected static ?string $model = Post::class;
protected static BackedEnum|string|null $navigationIcon = 'phosphor-pencil-line-duotone';
protected static ?int $navigationSort = 3;
public static function form(Schema $schema): Schema
{
return $schema
->components([
TextInput::make('title')
->live(onBlur: true)
->afterStateUpdated(fn (Set $set, ?string $state) => $set('slug', Str::slug($state)))
->required()
->maxLength(191),
TextInput::make('slug')
->required()
->unique(ignoreRecord: true)
->maxLength(191),
RichEditor::make('body')
->required()
->fileAttachmentsDisk(config('filament.default_filesystem_disk'))
->fileAttachmentsDirectory('attachments')
->fileAttachmentsVisibility('public')
->columnSpanFull(),
Textarea::make('excerpt')
->columnSpanFull(),
FileUpload::make('image')
->image()
->disk(config('filament.default_filesystem_disk'))
->directory('posts'),
TextInput::make('seo_title')
->maxLength(191),
Select::make('author_id')
->label('Author')
->options(
User::all()
->mapWithKeys(fn ($user) => [
$user->id => $user->name
?? $user->username
?? $user->email,
])
->toArray()
)
->searchable()
->required(),
Select::make('category_id')
->label('Category')
->options(Category::all()->pluck('name', 'id'))
->searchable()
->required(),
Textarea::make('meta_description')
->columnSpanFull(),
Textarea::make('meta_keywords')
->columnSpanFull(),
Select::make('status')
->required()
->options([
'DRAFT' => 'Draft',
'PUBLISHED' => 'Published',
'PENDING' => 'Pending',
]),
Toggle::make('featured')
->required(),
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
TextColumn::make('user.name')
->numeric()
->sortable(),
TextColumn::make('category.name')
->searchable()
->sortable(),
TextColumn::make('title')
->searchable(),
ImageColumn::make('image'),
TextColumn::make('status'),
IconColumn::make('featured')
->boolean(),
TextColumn::make('created_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
TextColumn::make('updated_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
//
])
->recordActions([
EditAction::make(),
DeleteAction::make(),
])
->toolbarActions([
BulkActionGroup::make([
DeleteBulkAction::make(),
]),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => ListPosts::route('/'),
'create' => CreatePost::route('/create'),
'edit' => EditPost::route('/{record}/edit'),
];
}
}
================================================
FILE: app/Filament/Resources/Roles/Pages/CreateRole.php
================================================
<?php
namespace App\Filament\Resources\Roles\Pages;
use App\Filament\Resources\Roles\RoleResource;
use Filament\Resources\Pages\CreateRecord;
class CreateRole extends CreateRecord
{
protected static string $resource = RoleResource::class;
}
================================================
FILE: app/Filament/Resources/Roles/Pages/EditRole.php
================================================
<?php
namespace App\Filament\Resources\Roles\Pages;
use App\Filament\Resources\Roles\RoleResource;
use Filament\Actions\DeleteAction;
use Filament\Resources\Pages\EditRecord;
class EditRole extends EditRecord
{
protected static string $resource = RoleResource::class;
protected function getHeaderActions(): array
{
return [
DeleteAction::make(),
];
}
}
================================================
FILE: app/Filament/Resources/Roles/Pages/ListRoles.php
================================================
<?php
namespace App\Filament\Resources\Roles\Pages;
use App\Filament\Resources\Roles\RoleResource;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ListRecords;
class ListRoles extends ListRecords
{
protected static string $resource = RoleResource::class;
protected function getHeaderActions(): array
{
return [
CreateAction::make(),
];
}
}
================================================
FILE: app/Filament/Resources/Roles/RoleResource.php
================================================
<?php
namespace App\Filament\Resources\Roles;
use App\Filament\Resources\Roles\Pages\CreateRole;
use App\Filament\Resources\Roles\Pages\EditRole;
use App\Filament\Resources\Roles\Pages\ListRoles;
use BackedEnum;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteAction;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction;
use Filament\Forms\Components\TextInput;
use Filament\Resources\Resource;
use Filament\Schemas\Schema;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
use Spatie\Permission\Models\Role;
class RoleResource extends Resource
{
protected static ?string $model = Role::class;
protected static BackedEnum|string|null $navigationIcon = 'phosphor-address-book-duotone';
protected static ?int $navigationSort = 2;
public static function form(Schema $schema): Schema
{
return $schema
->components([
TextInput::make('name')
->required()
->maxLength(191),
TextInput::make('guard_name')
->required()
->maxLength(191),
TextInput::make('description')
->required()
->maxLength(191)
->columnSpanFull(),
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
TextColumn::make('name')
->searchable(),
TextColumn::make('guard_name')
->searchable(),
TextColumn::make('created_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
TextColumn::make('updated_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
//
])
->recordActions([
EditAction::make(),
DeleteAction::make(),
])
->toolbarActions([
BulkActionGroup::make([
DeleteBulkAction::make(),
]),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => ListRoles::route('/'),
'create' => CreateRole::route('/create'),
'edit' => EditRole::route('/{record}/edit'),
];
}
}
================================================
FILE: app/Filament/Resources/Settings/Pages/CreateSetting.php
================================================
<?php
namespace App\Filament\Resources\Settings\Pages;
use App\Filament\Resources\Settings\SettingResource;
use Filament\Resources\Pages\CreateRecord;
use Illuminate\Support\Facades\Cache;
class CreateSetting extends CreateRecord
{
protected static string $resource = SettingResource::class;
protected function afterCreate(): void
{
Cache::forget('wave_settings');
}
}
================================================
FILE: app/Filament/Resources/Settings/Pages/EditSetting.php
================================================
<?php
namespace App\Filament\Resources\Settings\Pages;
use App\Filament\Resources\Settings\SettingResource;
use Filament\Actions\DeleteAction;
use Filament\Resources\Pages\EditRecord;
use Illuminate\Support\Facades\Cache;
class EditSetting extends EditRecord
{
protected static string $resource = SettingResource::class;
protected function getHeaderActions(): array
{
return [
DeleteAction::make(),
];
}
protected function afterSave(): void
{
Cache::forget('wave_settings');
}
}
================================================
FILE: app/Filament/Resources/Settings/Pages/ListSettings.php
================================================
<?php
namespace App\Filament\Resources\Settings\Pages;
use App\Filament\Resources\Settings\SettingResource;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ListRecords;
use Illuminate\Support\Facades\Cache;
class ListSettings extends ListRecords
{
protected static string $resource = SettingResource::class;
protected function getHeaderActions(): array
{
return [
CreateAction::make(),
];
}
protected function afterDelete(): void
{
Cache::forget('wave_settings');
}
}
================================================
FILE: app/Filament/Resources/Settings/SettingResource.php
================================================
<?php
namespace App\Filament\Resources\Settings;
use App\Filament\Resources\Settings\Pages\CreateSetting;
use App\Filament\Resources\Settings\Pages\EditSetting;
use App\Filament\Resources\Settings\Pages\ListSettings;
use BackedEnum;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteAction;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction;
use Filament\Forms\Components\Textarea;
use Filament\Forms\Components\TextInput;
use Filament\Resources\Resource;
use Filament\Schemas\Schema;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
use Wave\Setting;
class SettingResource extends Resource
{
protected static ?string $model = Setting::class;
protected static BackedEnum|string|null $navigationIcon = 'phosphor-gear-fine-duotone';
protected static ?int $navigationSort = 9;
public static function form(Schema $schema): Schema
{
return $schema
->components([
TextInput::make('key')
->required()
->unique(ignoreRecord: true)
->maxLength(191),
TextInput::make('display_name')
->required()
->maxLength(191),
Textarea::make('value')
->columnSpanFull(),
Textarea::make('details')
->columnSpanFull(),
TextInput::make('type')
->required()
->maxLength(191),
TextInput::make('order')
->required()
->numeric()
->default(1),
TextInput::make('group')
->maxLength(191),
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
TextColumn::make('key')
->searchable(),
TextColumn::make('value')
->searchable(),
TextColumn::make('type')
->searchable(),
TextColumn::make('order')
->numeric()
->sortable(),
TextColumn::make('group')
->searchable(),
TextColumn::make('created_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
TextColumn::make('updated_at')
->dateTime()
->sortable()
->toggleable(isToggledHiddenByDefault: true),
])
->filters([
//
])
->recordActions([
EditAction::make(),
DeleteAction::make(),
])
->toolbarActions([
BulkActionGroup::make([
DeleteBulkAction::make(),
]),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => ListSettings::route('/'),
'create' => CreateSetting::route('/create'),
'edit' => EditSetting::route('/{record}/edit'),
];
}
}
================================================
FILE: app/Filament/Resources/Users/Pages/CreateUser.php
================================================
<?php
namespace App\Filament\Resources\Users\Pages;
use App\Filament\Resources\Users\UserResource;
use Filament\Resources\Pages\CreateRecord;
class CreateUser extends CreateRecord
{
protected static string $resource = UserResource::class;
}
================================================
FILE: app/Filament/Resources/Users/Pages/EditUser.php
================================================
<?php
namespace App\Filament\Resources\Users\Pages;
use App\Filament\Resources\Users\UserResource;
use Filament\Actions\DeleteAction;
use Filament\Resources\Pages\EditRecord;
class EditUser extends EditRecord
{
protected static string $resource = UserResource::class;
protected function getHeaderActions(): array
{
return [
DeleteAction::make(),
];
}
}
================================================
FILE: app/Filament/Resources/Users/Pages/ListUsers.php
================================================
<?php
namespace App\Filament\Resources\Users\Pages;
use App\Filament\Resources\Users\UserResource;
use Filament\Actions\CreateAction;
use Filament\Resources\Pages\ListRecords;
class ListUsers extends ListRecords
{
protected static string $resource = UserResource::class;
protected function getHeaderActions(): array
{
return [
CreateAction::make(),
];
}
}
================================================
FILE: app/Filament/Resources/Users/UserResource.php
================================================
<?php
namespace App\Filament\Resources\Users;
use App\Filament\Resources\Users\Pages\CreateUser;
use App\Filament\Resources\Users\Pages\EditUser;
use App\Filament\Resources\Users\Pages\ListUsers;
use App\Models\User;
use BackedEnum;
use Filament\Actions\Action;
use Filament\Actions\BulkActionGroup;
use Filament\Actions\DeleteAction;
use Filament\Actions\DeleteBulkAction;
use Filament\Actions\EditAction;
use Filament\Forms\Components\DateTimePicker;
use Filament\Forms\Components\FileUpload;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Toggle;
use Filament\Resources\Resource;
use Filament\Schemas\Schema;
use Filament\Tables\Columns\ImageColumn;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
use Illuminate\Support\Facades\Hash;
class UserResource extends Resource
{
protected static ?string $model = User::class;
protected static BackedEnum|string|null $navigationIcon = 'phosphor-users-duotone';
protected static ?int $navigationSort = 1;
public static function form(Schema $schema): Schema
{
return $schema
->components([
TextInput::make('name')
->required()
->maxLength(191),
TextInput::make('username')
->required()
->maxLength(191),
TextInput::make('email')
->email()
->required()
->maxLength(191),
FileUpload::make('avatar')
->required()
->image(),
DateTimePicker::make('email_verified_at'),
TextInput::make('password')
->password()
->dehydrateStateUsing(fn ($state) => Hash::make($state))
->dehydrated(fn ($state) => filled($state))
->required(fn (string $context): bool => $context === 'create'),
Select::make('roles')
->multiple()
->relationship('roles', 'name')
->preload()
->searchable()
->required(),
DateTimePicker::make('trial_ends_at'),
TextInput::make('verification_code')
->maxLength(191),
Toggle::make('verified'),
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
TextColumn::make('name')
->searchable(),
TextColumn::make('email')
->searchable(),
ImageColumn::make('avatar')
->circular()
->defaultImageUrl(url('storage/demo/default.png')),
TextColumn::make('username')
->searchable(),
])
->filters([
//
])
->recordActions([
EditAction::make(),
DeleteAction::make(),
Action::make('Impersonate')
->url(fn ($record) => route('impersonate', $record))
->visible(fn ($record) => auth()->user()->id !== $record->id),
])
->toolbarActions([
BulkActionGroup::make([
DeleteBulkAction::make(),
]),
]);
}
public static function getRelations(): array
{
return [
//
];
}
public static function getPages(): array
{
return [
'index' => ListUsers::route('/'),
'create' => CreateUser::route('/create'),
'edit' => EditUser::route('/{record}/edit'),
];
}
}
================================================
FILE: app/Filament/Widgets/DashboardWidget.php
================================================
<?php
namespace App\Filament\Widgets;
use Filament\Widgets\Widget;
class DashboardWidget extends Widget
{
protected static ?int $sort = 10;
protected int|string|array $columnSpan = 'full';
protected static bool $isLazy = false;
/**
* @var view-string
*/
protected string $view = 'filament.widgets.dashboard-widget';
}
================================================
FILE: app/Http/Controllers/Controller.php
================================================
<?php
namespace App\Http\Controllers;
abstract class Controller {}
================================================
FILE: app/Listeners/LogSuccessfulLogin.php
================================================
<?php
namespace App\Listeners;
use Illuminate\Auth\Events\Login;
class LogSuccessfulLogin
{
/**
* Create the event listener.
*/
public function __construct()
{
//
}
/**
* Handle the event.
*/
public function handle(Login $event): void
{
if (! config('activity.enabled', true) || ! $event->user) {
return;
}
// Prevent duplicate login logs within the same session
$recentLogin = \Wave\ActivityLog::where('user_id', $event->user->id)
->where('action', 'login')
->where('created_at', '>=', now()->subMinutes(5))
->exists();
if (! $recentLogin) {
\Wave\ActivityLog::log('login', 'User logged in successfully');
}
}
}
================================================
FILE: app/Listeners/LogSuccessfulLogout.php
================================================
<?php
namespace App\Listeners;
use Illuminate\Auth\Events\Logout;
class LogSuccessfulLogout
{
/**
* Create the event listener.
*/
public function __construct()
{
//
}
/**
* Handle the event.
*/
public function handle(Logout $event): void
{
if (! config('activity.enabled', true) || ! $event->user) {
return;
}
// Prevent duplicate logout logs
$recentLogout = \Wave\ActivityLog::where('user_id', $event->user->id)
->where('action', 'logout')
->where('created_at', '>=', now()->subMinutes(5))
->exists();
if (! $recentLogout) {
\Wave\ActivityLog::create([
'user_id' => $event->user->id,
'action' => 'logout',
'description' => 'User logged out',
'ip_address' => request()->header('CF-Connecting-IP') ?? request()->ip(),
'user_agent' => request()->userAgent(),
]);
}
}
}
================================================
FILE: app/Models/Category.php
================================================
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Category extends Model {}
================================================
FILE: app/Models/Forms.php
================================================
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Forms extends Model
{
use HasFactory;
/**
* The attributes that are mass assignable.
*
* @var array<int, string>
*/
protected $fillable = [
'name',
'slug',
'fields',
'is_active',
];
/**
* Get the attributes that should be cast.
*
* @return array<string, string>
*/
protected function casts(): array
{
return [
'fields' => 'array', // Cast the fields attribute to an array
'is_active' => 'boolean',
];
}
}
================================================
FILE: app/Models/Post.php
================================================
<?php
namespace App\Models;
use Wave\Post as WavePost;
class Post extends WavePost
{
public $guarded = [];
}
================================================
FILE: app/Models/User.php
================================================
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Notifications\Notifiable;
use Illuminate\Support\Str;
use Wave\ActivityLog;
use Wave\Traits\HasProfileKeyValues;
use Wave\User as WaveUser;
class User extends WaveUser
{
use HasFactory, HasProfileKeyValues, Notifiable, SoftDeletes;
public $guard_name = 'web';
/**
* Get the attributes that should be cast.
*
* @return array<string, string>
*/
protected function casts(): array
{
return [
'notification_preferences' => 'array',
'social_links' => 'array',
'privacy_settings' => 'array',
'deletion_scheduled_at' => 'datetime',
];
}
public function activityLogs(): HasMany
{
return $this->hasMany(ActivityLog::class);
}
protected static function boot()
{
parent::boot();
// Listen for the creating event of the model
static::creating(function ($user) {
// Check if the username attribute is empty
if (empty($user->username)) {
// Use the name to generate a slugified username
$username = Str::slug($user->name, '');
$i = 1;
while (self::where('username', $username)->exists()) {
$username = Str::slug($user->name, '').$i;
$i++;
}
$user->username = $username;
}
});
// Listen for the created event of the model
static::created(function ($user) {
// Remove all roles
$user->syncRoles([]);
// Assign the default role if it exists
$defaultRole = config('wave.default_user_role', 'registered');
if (\Spatie\Permission\Models\Role::where('name', $defaultRole)->where('guard_name', 'web')->exists()) {
$user->assignRole($defaultRole);
}
});
}
}
================================================
FILE: app/Notifications/TestNotification.php
================================================
<?php
namespace App\Notifications;
use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Notification;
class TestNotification extends Notification
{
use Queueable;
/**
* Create a new notification instance.
*/
public function __construct()
{
//
}
/**
* Get the notification's delivery channels.
*
* @return array<int, string>
*/
public function via(object $notifiable): array
{
return ['database'];
}
/**
* Get the mail representation of the notification.
*/
public function toMail(object $notifiable): MailMessage
{
return (new MailMessage())
->line('The introduction to the notification.')
->action('Notification Action', url('/'))
->line('Thank you for using our application!');
}
/**
* Get the array representation of the notification.
*
* @return array<string, mixed>
*/
public function toArray($notifiable): array
{
return [
'icon' => '/storage/demo/default.png',
'body' => 'This is an example, when the user clicks this notification it will go to the link.',
'link' => '/dashboard',
'user' => [
'name' => 'John Doe',
],
];
}
}
================================================
FILE: app/Providers/AppServiceProvider.php
================================================
<?php
namespace App\Providers;
use App\Listeners\LogSuccessfulLogin;
use App\Listeners\LogSuccessfulLogout;
use Exception;
use Illuminate\Auth\Events\Login;
use Illuminate\Auth\Events\Logout;
use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* The path to the "home" route for your application.
*
* Typically, users are redirected here after authentication.
*
* @var string
*/
public const HOME = '/dashboard';
/**
* Register any application services.
*/
public function register(): void
{
//
}
/**
* Bootstrap any application services.
*/
public function boot(): void
{
if ($this->app->environment() == 'production') {
$this->app['request']->server->set('HTTPS', true);
}
$this->setSchemaDefaultLength();
// Register activity log event listeners
Event::listen(Login::class, LogSuccessfulLogin::class);
Event::listen(Logout::class, LogSuccessfulLogout::class);
Validator::extend('base64image', function ($attribute, $value, $parameters, $validator) {
$explode = explode(',', $value);
$allow = ['png', 'jpg', 'svg', 'jpeg'];
$format = str_replace(
[
'data:image/',
';',
'base64',
],
[
'', '', '',
],
$explode[0]
);
// check file format
if (! in_array($format, $allow)) {
return false;
}
// check base64 format
if (! preg_match('%^[a-zA-Z0-9/+]*={0,2}$%', $explode[1])) {
return false;
}
return true;
});
$this->bootRoute();
}
private function setSchemaDefaultLength(): void
{
try {
Schema::defaultStringLength(191);
} catch (Exception $exception) {
}
}
public function bootRoute()
{
RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(60)->by($request->user()?->id ?: (request()->header('CF-Connecting-IP') ?? request()->ip()));
});
}
}
================================================
FILE: app/Providers/Filament/AdminPanelProvider.php
================================================
<?php
namespace App\Providers\Filament;
use App\Filament\Widgets\DashboardWidget;
use Filament\Facades\Filament;
use Filament\Http\Middleware\Authenticate;
use Filament\Http\Middleware\DisableBladeIconComponents;
use Filament\Http\Middleware\DispatchServingFilamentEvent;
use Filament\Panel;
use Filament\PanelProvider;
// use Filament\Widgets;
// use BezhanSalleh\FilamentGoogleAnalytics\Widgets;
use Filament\Support\Colors\Color;
use Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse;
use Illuminate\Cookie\Middleware\EncryptCookies;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken;
use Illuminate\Routing\Middleware\SubstituteBindings;
use Illuminate\Session\Middleware\AuthenticateSession;
use Illuminate\Session\Middleware\StartSession;
use Illuminate\Support\Facades\Blade;
use Illuminate\View\Middleware\ShareErrorsFromSession;
class AdminPanelProvider extends PanelProvider
{
protected static ?string $navigationIcon = 'heroicon-o-document-text';
public static function getNavigationIcon(): ?string
{
return 'heroicon-o-presentation-chart-line';
}
public function panel(Panel $panel): Panel
{
Blade::component('wave::admin.components.label', 'label');
return $panel
->default()
->id('admin')
->path('admin')
->colors([
'primary' => Color::Blue,
])
->sidebarCollapsibleOnDesktop()
->viteTheme('resources/css/filament/admin/theme.css')
->discoverResources(in: app_path('Filament/Resources'), for: 'App\\Filament\\Resources')
->discoverPages(in: app_path('Filament/Pages'), for: 'App\\Filament\\Pages')
->pages([])
->discoverWidgets(in: app_path('Filament/Widgets'), for: 'App\\Filament\\Widgets')
// ->discoverWidgets(in: app_path('BezhanSalleh\FilamentGoogleAnalytics\Widgets'), for: 'BezhanSalleh\\FilamentGoogleAnalytics\\Widgets')
->widgets([
DashboardWidget::class,
])
->middleware([
EncryptCookies::class,
AddQueuedCookiesToResponse::class,
StartSession::class,
AuthenticateSession::class,
ShareErrorsFromSession::class,
VerifyCsrfToken::class,
SubstituteBindings::class,
DisableBladeIconComponents::class,
DispatchServingFilamentEvent::class,
// \App\Http\Middleware\WaveEditTab::class
])
->authMiddleware([
Authenticate::class,
])
->brandLogo(fn () => view('wave::admin.logo'))
->darkModeBrandLogo(fn () => view('wave::admin.logo-dark'));
}
}
================================================
FILE: app/Providers/FolioServiceProvider.php
================================================
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class FolioServiceProvider extends ServiceProvider
{
/**
* Register services.
*/
public function register(): void
{
//
}
/**
* Bootstrap services.
*/
public function boot(): void {}
}
================================================
FILE: app/Providers/VoltServiceProvider.php
================================================
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Livewire\Volt\Volt;
class VoltServiceProvider extends ServiceProvider
{
/**
* Register services.
*/
public function register(): void
{
//
}
/**
* Bootstrap services.
*/
public function boot(): void
{
Volt::mount([
config('livewire.view_path', resource_path('views/livewire')),
resource_path('views/pages'),
]);
}
}
================================================
FILE: artisan
================================================
#!/usr/bin/env php
<?php
use Illuminate\Foundation\Application;
use Symfony\Component\Console\Input\ArgvInput;
define('LARAVEL_START', microtime(true));
// Register the Composer autoloader...
require __DIR__.'/vendor/autoload.php';
// Bootstrap Laravel and handle the command...
/** @var Application $app */
$app = require_once __DIR__.'/bootstrap/app.php';
$status = $app->handleCommand(new ArgvInput);
exit($status);
================================================
FILE: bootstrap/app.php
================================================
<?php
use App\Providers\AppServiceProvider;
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
return Application::configure(basePath: dirname(__DIR__))
->withProviders([
\Lab404\Impersonate\ImpersonateServiceProvider::class,
\Wave\WaveServiceProvider::class,
\DevDojo\Themes\ThemesServiceProvider::class,
\DevDojo\Themes\ThemesServiceProvider::class,
])
->withRouting(
web: __DIR__.'/../routes/web.php',
api: __DIR__.'/../routes/api.php',
commands: __DIR__.'/../routes/console.php',
// channels: __DIR__.'/../routes/channels.php',
health: '/up',
)
->withMiddleware(function (Middleware $middleware) {
$middleware->redirectGuestsTo(fn () => route('login'));
$middleware->redirectUsersTo(AppServiceProvider::HOME);
$middleware->encryptCookies(except: [
'theme',
]);
$middleware->validateCsrfTokens(except: [
'/webhook/paddle',
'/webhook/stripe',
]);
$middleware->append(\Filament\Http\Middleware\DisableBladeIconComponents::class);
$middleware->web(\RalphJSmit\Livewire\Urls\Middleware\LivewireUrlsMiddleware::class);
$middleware->throttleApi();
})
->withExceptions(function (Exceptions $exceptions) {
//
})->create();
================================================
FILE: bootstrap/cache/.gitignore
================================================
*
!.gitignore
================================================
FILE: bootstrap/providers.php
================================================
<?php
return [
App\Providers\AppServiceProvider::class,
App\Providers\Filament\AdminPanelProvider::class,
App\Providers\FolioServiceProvider::class,
App\Providers\VoltServiceProvider::class,
];
================================================
FILE: composer.json
================================================
{
"name": "devdojo/wave",
"description": "Wave SaaS Starter Kit",
"keywords": [
"framework",
"laravel",
"SaaS",
"Starter Kit"
],
"license": "MIT",
"type": "project",
"require": {
"php": "^8.2",
"ext-exif": "*",
"ext-gd": "*",
"codeat3/blade-phosphor-icons": "^2.0",
"devdojo/app": "0.11.0",
"devdojo/auth": "^2.2.0",
"devdojo/themes": "0.0.11",
"filament/filament": "^4.0",
"filament/tables": "^4.0",
"gehrisandro/tailwind-merge-laravel": "^1.3",
"guzzlehttp/guzzle": "^7.8",
"intervention/image": "^3.11",
"lab404/laravel-impersonate": "^1.7.5",
"laravel/folio": "^1.1",
"laravel/framework": "^12.18",
"laravel/pail": "^1.2.2",
"laravel/tinker": "^2.10.1",
"laravel/ui": "^4.6",
"livewire/livewire": "^3.6.4",
"ralphjsmit/livewire-urls": "^1.5",
"spatie/laravel-permission": "^6.12",
"stripe/stripe-php": "^17.3",
"tymon/jwt-auth": "^2.2"
},
"require-dev": {
"alebatistella/duskapiconf": "^1.2",
"fakerphp/faker": "^1.23",
"filament/upgrade": "^4.0",
"laravel/dusk": "^8.2",
"laravel/pint": "^1.26",
"mockery/mockery": "^1.6",
"nunomaduro/collision": "^8.6",
"pestphp/pest": "^4.3",
"pestphp/pest-plugin-laravel": "^4.0",
"phpunit/phpunit": "^12.5.4",
"spatie/laravel-ignition": "^2.9"
},
"autoload": {
"psr-4": {
"App\\": "app/",
"Database\\Factories\\": "database/factories/",
"Database\\Seeders\\": "database/seeders/",
"Wave\\": "wave/src/"
}
},
"autoload-dev": {
"psr-4": {
"Tests\\": "tests/"
}
},
"extra": {
"laravel": {
"dont-discover": [],
"providers": [
"Wave\\WaveServiceProvider"
]
}
},
"scripts": {
"post-root-package-install": [
"@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
],
"post-create-project-cmd": [
"@php artisan key:generate --ansi",
"@php -r \"file_exists('database/database.sqlite') || touch('database/database.sqlite');\"",
"@php artisan migrate --graceful --ansi",
"@php artisan db:seed"
],
"post-autoload-dump": [
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
"@php artisan package:discover",
"@php artisan storage:link",
"@php artisan filament:upgrade",
"@php artisan livewire:publish --assets"
],
"dev": [
"Composer\\Config::disableProcessTimeout",
"npx concurrently -c \"#93c5fd,#c4b5fd,#fb7185,#fdba74\" \"php artisan serve\" \"php artisan queue:listen --tries=1\" \"php artisan pail --timeout=0\" \"npm run dev\" --names=server,queue,logs,vite"
]
},
"config": {
"preferred-install": "dist",
"sort-packages": true,
"optimize-autoloader": true,
"allow-plugins": {
"pestphp/pest-plugin": true
}
},
"minimum-stability": "stable",
"prefer-stable": true
}
================================================
FILE: config/.gitkeep
================================================
================================================
FILE: config/activity.php
================================================
<?php
return [
/*
|--------------------------------------------------------------------------
| Activity Logging Enabled
|--------------------------------------------------------------------------
|
| Enable or disable activity logging across your application. When disabled,
| no activity logs will be created.
|
*/
'enabled' => env('ACTIVITY_LOG_ENABLED', true),
/*
|--------------------------------------------------------------------------
| Queue Activity Logs
|--------------------------------------------------------------------------
|
| Queue activity log creation to avoid performance impact on user requests.
| Recommended for high-traffic applications.
|
*/
'queue' => env('ACTIVITY_LOG_QUEUE', false),
/*
|--------------------------------------------------------------------------
| Queue Connection
|--------------------------------------------------------------------------
|
| The queue connection to use for queued activity logs.
|
*/
'queue_connection' => env('ACTIVITY_LOG_QUEUE_CONNECTION', 'database'),
/*
|--------------------------------------------------------------------------
| Retention Period (Days)
|--------------------------------------------------------------------------
|
| Number of days to keep activity logs. Logs older than this will be
| automatically deleted. Set to null to keep logs indefinitely.
|
*/
'retention_days' => env('ACTIVITY_LOG_RETENTION_DAYS', 90),
];
================================================
FILE: config/app.php
================================================
<?php
use Illuminate\Support\Facades\Facade;
return [
'aliases' => Facade::defaultAliases()->merge([
'JWTAuth' => Tymon\JWTAuth\Facades\JWTAuth::class,
'JWTFactory' => Tymon\JWTAuth\Facades\JWTFactory::class,
])->toArray(),
];
================================================
FILE: config/auth.php
================================================
<?php
return [
'guards' => [
'api' => [
'driver' => 'jwt',
'provider' => 'users',
],
],
/*
|--------------------------------------------------------------------------
| Resetting Passwords
|--------------------------------------------------------------------------
|
| You may specify multiple password reset configurations if you have more
| than one user table or model in the application and you want to have
| separate password reset settings based on the specific user types.
|
| The expire time is the number of minutes that each reset token will be
| considered valid. This security feature keeps tokens short-lived so
| they have less time to be guessed. You may change this as needed.
|
*/
'passwords' => [
'users' => [
'provider' => 'users',
'table' => 'password_resets',
'expire' => 60,
'throttle' => 60,
],
],
];
================================================
FILE: config/database.php
================================================
<?php
return [
'migrations' => [
'table' => 'migrations',
'update_date_on_publish' => false, // disable to preserve original behavior for existing applications
],
];
================================================
FILE: config/devdojo/auth/appearance.php
================================================
<?php
/*
* Branding configs for your application
*/
return [
'logo' => [
'type' => 'svg',
'image_src' => '',
'svg_string' => '<svg class="w-full h-full" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 27 27" fill="none"><g fill="currentColor"><path d="M21.508 13.52c1.096 1.048 2.456.12 2.425-1.647a3.282 3.282 0 0 0-.632-1.878c-.382-.498-.866-.769-1.331-.742-1.568.089-1.874 2.92-.462 4.267ZM25.462 15.698c.18-.925 0-1.535-.06-1.736-.177-.52-.459-.646-.573-.676-1.098-.297-2.012 2.679-1.208 3.93.544.844 1.541.022 1.84-1.518ZM22.976 6.382c-.898.21-.015 3.05 1.152 3.708.747.419 1.1-.36.713-1.574a4.657 4.657 0 0 0-.832-1.525c-.38-.442-.767-.672-1.034-.609ZM18.174 9.37c1.307.922 2.769.17 2.557-1.317-.1-.6-.401-1.146-.854-1.552-.204-.173-.826-.7-1.591-.588-1.393.203-1.695 2.339-.112 3.456ZM20.714 13.793c-.16-.198-.496-.608-1.121-.708-1.756-.277-3.05 2.048-2.005 3.606 1.009 1.506 3.139.858 3.507-1.073a2.364 2.364 0 0 0-.381-1.825ZM26.459 12.157a6.3 6.3 0 0 0-.327-1.6c-.064-.16-.258-.651-.477-.624-.562.068-.254 3.43.357 3.906.334.261.541-.525.447-1.682ZM20.72 3.994c-.726-.528-1.108-.518-1.3-.416-.72.381.279 2.448 1.632 2.866.826.256 1.172-.347.712-1.238a3.804 3.804 0 0 0-1.044-1.212ZM22.734 19.18c.34-.8.18-1.31.12-1.5a.927.927 0 0 0-.433-.49c-1.146-.554-2.794 1.533-2.317 2.938.425 1.255 2.02.483 2.63-.947ZM17.116 9.842a2.18 2.18 0 0 0-1.457-.645c-1.87-.067-2.83 2.127-1.528 3.503 1.251 1.326 3.48.592 3.615-1.19.064-.898-.463-1.477-.63-1.668ZM24.513 6.842c.218.056-.007-.487-.483-1.161a8.951 8.951 0 0 0-.894-1.075c-.313-.315-.555-.495-.616-.457-.234.145 1.574 2.586 1.993 2.693ZM25.621 17.335c-.408-.169-1.695 2.434-1.514 3.06.1.344.695-.325 1.158-1.302.202-.404.347-.835.432-1.279.055-.366-.024-.457-.076-.479ZM14.446 5.54c1.05.8 2.522.286 2.38-.829-.071-.558-.51-.927-.652-1.048-.351-.285-.8-.422-1.25-.381-1.078.126-1.534 1.452-.478 2.258ZM17.01 19.179a1.529 1.529 0 0 0-.316-1.407 1.637 1.637 0 0 0-.89-.519c-1.601-.357-2.92 1.29-2.077 2.592.823 1.268 2.878.85 3.283-.666ZM21.475 3.803c.23 0 .095-.343-.478-.849a6.936 6.936 0 0 0-1.071-.762c-.408-.237-.721-.36-.777-.307-.137.127 1.732 1.923 2.326 1.918ZM23.087 20.72c-.5-.407-2.265 1.518-2.146 2.342.068.476 1.05-.159 1.684-.962.442-.556.514-.907.541-1.04.012-.073.026-.253-.079-.34ZM17.237 1.8c-.712-.382-1.002-.287-1.111-.191-.45.38.366 1.55 1.4 1.726.64.109.898-.277.542-.81-.256-.382-.69-.64-.83-.726ZM18.975 22.245c.325-.577.173-.932.107-1.083a.86.86 0 0 0-.223-.256c-.91-.66-2.64.643-2.372 1.789.264 1.129 1.858.671 2.488-.45ZM11.83 13.246c-1.603-.228-2.63 1.66-1.616 2.969a1.779 1.779 0 0 0 3.204-.844c.114-.808-.323-1.334-.487-1.535a1.911 1.911 0 0 0-1.102-.59ZM10.71 8.565c.898 1.034 2.76.452 2.931-.916a1.529 1.529 0 0 0-.434-1.249 1.585 1.585 0 0 0-.933-.448c-1.432-.165-2.47 1.568-1.564 2.613ZM17.57 25.047c-.042.453.988.021 1.622-.586.35-.331.394-.53.415-.626a.25.25 0 0 0-.03-.156c-.31-.46-1.944.648-2.008 1.368ZM17.153 1.28c.41.19.669.249.75.216.114-.047-.091-.239-.467-.436a5.856 5.856 0 0 0-.918-.375c-.087-.027-.526-.164-.593-.127.021.062.858.546 1.228.722ZM6.988 12.102c.669.945 2.292.552 2.522-.923a1.627 1.627 0 0 0-.302-1.264 1.27 1.27 0 0 0-.814-.458c-1.28-.162-2.187 1.544-1.406 2.645ZM11.822 20.888c-1.08-.135-1.651.898-.954 1.727.697.829 2.01.581 2.124-.405.06-.506-.248-.83-.364-.953a1.48 1.48 0 0 0-.806-.369ZM11.894 2.644c.397.469 1.543.264 1.635-.443a.665.665 0 0 0-.225-.572.805.805 0 0 0-.44-.19c-.737-.077-1.38.722-.97 1.205ZM15.31 24.617a.58.58 0 0 0-.046-.655.687.687 0 0 0-.277-.19c-.764-.298-1.675.363-1.416 1.022.258.66 1.381.548 1.74-.177ZM14.52 1.183c.351.04.606-.114.41-.382A1.096 1.096 0 0 0 14.51.51c-.396-.155-.561-.086-.625-.03-.21.186.065.634.635.704ZM8.482 4.998c.258.698 1.623.476 2.005-.533.113-.298.095-.59-.044-.801a.584.584 0 0 0-.234-.198c-.782-.37-2.022.733-1.727 1.532ZM9.432 18.922a1.618 1.618 0 0 0-.468-1.109c-.124-.115-.5-.465-1.05-.437-1.028.051-1.28 1.403-.416 2.224.82.774 1.938.38 1.934-.678ZM14.863 26.317c-.031.237.62.014.942-.19.26-.167.28-.277.286-.324a.158.158 0 0 0-.013-.056c-.154-.273-1.166.204-1.215.57ZM5.71 15.016a1.757 1.757 0 0 0-.302-1.072c-.095-.118-.315-.394-.676-.415-.886-.05-1.232 1.476-.513 2.268.601.667 1.452.217 1.492-.781ZM4.92 8.127c.264.628 1.322.33 1.695-.674.177-.476.065-.762.023-.872a.532.532 0 0 0-.262-.258c-.732-.31-1.792 1.005-1.457 1.804ZM12.055.693a.357.357 0 0 0 .133-.2.056.056 0 0 0-.015-.04c-.119-.107-.942.203-.95.434-.008.188.513.098.832-.194ZM10.474 24.48a1.17 1.17 0 0 0-.405-.504c-.308-.222-.596-.25-.749-.206-.442.124-.161.768.469 1.075.543.265.819.018.685-.365ZM12.72 25.845a.707.707 0 0 0-.458-.117c-.286.032-.328.251-.095.451.287.246.764.256.738-.054a.421.421 0 0 0-.184-.28ZM9.224 2.101c.181-.2.203-.31.213-.358a.103.103 0 0 0-.032-.095c-.242-.2-1.35.539-1.317.877.029.268.697.061 1.136-.424ZM6.944 21.802a1.686 1.686 0 0 0-.437-.608c-.44-.36-.705-.293-.798-.247-.452.223.057 1.233.757 1.502.461.177.688-.13.477-.647h.001ZM3.05 10.945c.066-.258.059-.529-.02-.783-.081-.217-.211-.27-.286-.286-.535-.095-1.018 1.225-.654 1.783.255.39.784.1.96-.714ZM5.565 4.448a1.12 1.12 0 0 0 .245-.483c0-.041.009-.11-.036-.144-.254-.19-1.218.762-1.146 1.131.052.258.566-.02.937-.504ZM3.074 17.794c-.17-.212-.35-.317-.486-.279-.41.113-.15 1.188.376 1.554.37.258.54-.11.436-.587a1.764 1.764 0 0 0-.326-.688ZM2.26 7.383c.062-.123.107-.253.134-.388.006-.044.017-.136-.03-.15-.173-.054-.669.822-.598 1.048.05.157.32-.157.493-.514v.004ZM.79 14.1c-.023-.06-.084-.224-.164-.213-.221.03-.176 1.09.054 1.275.135.108.217-.222.198-.58A1.785 1.785 0 0 0 .79 14.1Z"/></g></svg>
',
'height' => '40',
],
'background' => [
'color' => '#ffffff',
'image' => '/storage/auth/background.jpg',
'image_overlay_color' => '#ffffff',
'image_overlay_opacity' => '1',
],
'color' => [
'text' => '#00173d',
'button' => '#000000',
'button_text' => '#ffffff',
'input_text' => '#00134d',
'input_border' => '#232329',
],
'alignment' => [
'heading' => 'center',
'container' => 'center',
],
'favicon' => [
'light' => '/storage/auth/favicon.png',
'dark' => '/storage/auth/favicon-dark.png',
],
];
================================================
FILE: config/devdojo/auth/descriptions.php
================================================
<?php
/*
* Branding configs for your application
*/
return [
'settings' => [
'redirect_after_auth' => 'Where should the user be redirected to after they are authenticated?',
'registration_enabled' => 'Enable or disable registration functionality. If disabled, users will not be able to register for an account.',
'registration_show_password_same_screen' => 'During registrations, show the password on the same screen or show it on an individual screen.',
'registration_include_name_field' => 'During registration, include the Name field.',
'registration_include_password_confirmation_field' => 'During registration, include the Password Confirmation field.',
'registration_require_email_verification' => 'During registration, require users to verify their email.',
'enable_branding' => 'This will toggle on/off the Auth branding at the bottom of each auth screen. Consider leaving on to support and help grow this project.',
'dev_mode' => 'This is for development mode, when set in Dev Mode Assets will be loaded from Vite',
'enable_2fa' => 'Enable the ability for users to turn on Two Factor Authentication',
'enable_email_registration' => 'Enable the ability for users to register via email',
'login_show_social_providers' => 'Show the social providers login buttons on the login form',
'center_align_social_provider_button_content' => 'Center align the content in the social provider button?',
'center_align_text' => 'Center align text?',
'social_providers_location' => 'The location of the social provider buttons (top or bottom)',
'check_account_exists_before_login' => 'Determines if the system checks for account existence before login',
],
];
================================================
FILE: config/devdojo/auth/language.php
================================================
<?php
/*
* Branding configs for your application
*/
return [
'login' => [
'page_title' => 'Sign in',
'headline' => 'Sign in',
'subheadline' => 'Login to your account below',
'show_subheadline' => false,
'email_address' => 'Email Address',
'password' => 'Password',
'remember_me' => 'Remember me',
'edit' => 'Edit',
'button' => 'Continue',
'forget_password' => 'Forget your password?',
'dont_have_an_account' => "Don't have an account?",
'sign_up' => 'Sign up',
'social_auth_authenticated_message' => 'You have been authenticated via __social_providers_list__. Please login to that network below.',
'change_email' => 'Change Email',
'couldnt_find_your_account' => 'Couldn’t find your account',
],
'register' => [
'page_title' => 'Sign up',
'headline' => 'Sign up',
'subheadline' => 'Register for your free account below.',
'show_subheadline' => false,
'name' => 'Name',
'email_address' => 'Email Address',
'password' => 'Password',
'password_confirmation' => 'Confirm Password',
'already_have_an_account' => 'Already have an account?',
'sign_in' => 'Sign in',
'button' => 'Continue',
'email_registration_disabled' => 'Email registration is currently disabled. Please use social login.',
],
'verify' => [
'page_title' => 'Verify Your Account',
'headline' => 'Verify your email address',
'subheadline' => 'Before you can proceed you must verify your email.',
'show_subheadline' => false,
'description' => 'Before proceeding, please check your email for a verification link. If you did not receive the email,',
'new_request_link' => 'click here to request another',
'new_link_sent' => 'A new link has been sent to your email address.',
'or' => 'Or',
'logout' => 'click here to logout',
],
'passwordConfirm' => [
'page_title' => 'Confirm Your Password',
'headline' => 'Confirm Password',
'subheadline' => 'Be sure to confirm your password below',
'show_subheadline' => false,
'password' => 'Password',
'button' => 'Confirm password',
],
'passwordResetRequest' => [
'page_title' => 'Request a Password Reset',
'headline' => 'Reset password',
'subheadline' => 'Enter your email below to reset your password',
'show_subheadline' => false,
'email' => 'Email Address',
'button' => 'Send password reset link',
'or' => 'or',
'return_to_login' => 'return to login',
],
'passwordReset' => [
'page_title' => 'Reset Your Password',
'headline' => 'Reset Password',
'subheadline' => 'Reset your password below',
'show_subheadline' => false,
'email' => 'Email Address',
'password' => 'Password',
'password_confirm' => 'Confirm Password',
'button' => 'Reset Password',
],
'twoFactorChallenge' => [
'page_title' => 'Two Factor Challenge',
'headline_auth' => 'Authentication Code',
'subheadline_auth' => 'Enter the authentication code provided by your authenticator application.',
'show_subheadline_auth' => false,
'headline_recovery' => 'Recovery Code',
'subheadline_recovery' => 'Please confirm access to your account by entering one of your emergency recovery codes.',
'show_subheadline_recovery' => false,
],
];
================================================
FILE: config/devdojo/auth/providers.php
================================================
<?php
return [
'facebook' => [
'name' => 'Facebook',
'scopes' => null,
'parameters' => null,
'stateless' => true,
'active' => false,
'socialite' => true,
'svg' => '<svg class="w-full h-full" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" fill="none"><path fill="#0866FF" d="M48 24C48 10.745 37.255 0 24 0S0 10.745 0 24c0 11.255 7.75 20.7 18.203 23.293V31.334h-4.95V24h4.95v-3.16c0-8.169 3.697-11.955 11.716-11.955 1.521 0 4.145.298 5.218.596v6.648c-.566-.06-1.55-.09-2.773-.09-3.935 0-5.455 1.492-5.455 5.367V24h7.84L33.4 31.334H26.91v16.49C38.793 46.39 48 36.271 48 24H48Z"/><path fill="#fff" d="M33.4 31.334 34.747 24h-7.84v-2.594c0-3.875 1.521-5.366 5.457-5.366 1.222 0 2.206.03 2.772.089V9.481c-1.073-.299-3.697-.596-5.218-.596-8.02 0-11.716 3.786-11.716 11.955V24h-4.95v7.334h4.95v15.96a24.042 24.042 0 0 0 8.705.53v-16.49H33.4Z"/></svg>',
'client_id' => env('FACEBOOK_CLIENT_ID'),
'client_secret' => env('FACEBOOK_CLIENT_SECRET'),
],
'twitter' => [
'name' => 'Twitter',
'scopes' => null,
'parameters' => null,
'stateless' => true,
'active' => false,
'socialite' => true,
'svg' => '<svg class="w-full h-full" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" fill="none"><path fill="#000" d="M36.653 3.808H43.4L28.66 20.655 46 43.58H32.422L21.788 29.676 9.62 43.58H2.869l15.766-18.02L2 3.808h13.922l9.613 12.709 11.118-12.71ZM34.285 39.54h3.738L13.891 7.634H9.879l24.406 31.907Z"/></svg>',
'client_id' => env('TWITTER_CLIENT_ID'),
'client_secret' => env('TWITTER_CLIENT_SECRET'),
],
'linkedin' => [
'name' => 'LinkedIn',
'scopes' => null,
'parameters' => null,
'stateless' => true,
'active' => false,
'socialite' => true,
'svg' => '<svg class="w-full h-full" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" fill="none"><path fill="#0A66C2" d="M44.457 0H3.543A3.543 3.543 0 0 0 0 3.543v40.914A3.543 3.543 0 0 0 3.543 48h40.914A3.543 3.543 0 0 0 48 44.457V3.543A3.543 3.543 0 0 0 44.457 0Zm-30.15 40.89H7.09V17.967h7.217V40.89Zm-3.614-26.1a4.143 4.143 0 1 1 4.167-4.14 4.083 4.083 0 0 1-4.167 4.14Zm30.214 26.12h-7.214V28.387c0-3.694-1.57-4.834-3.596-4.834-2.14 0-4.24 1.614-4.24 4.927v12.43H18.64V17.983h6.94v3.177h.093c.697-1.41 3.137-3.82 6.86-3.82 4.027 0 8.377 2.39 8.377 9.39l-.003 14.18Z"/></svg>',
'client_id' => env('LINKEDIN_CLIENT_ID'),
'client_secret' => env('LINKEDIN_CLIENT_SECRET'),
],
'google' => [
'name' => 'Google',
'scopes' => null,
'parameters' => null,
'stateless' => true,
'active' => false,
'socialite' => true,
'svg' => '<svg class="w-full h-full" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" fill="none"><path fill="#4285F4" d="M24 19.636v9.295h12.916c-.567 2.989-2.27 5.52-4.822 7.222l7.79 6.043c4.537-4.188 7.155-10.341 7.155-17.65 0-1.702-.152-3.339-.436-4.91H24Z"/><path fill="#34A853" d="m10.55 28.568-1.757 1.345-6.219 4.843C6.524 42.59 14.617 48 24 48c6.48 0 11.913-2.138 15.884-5.804l-7.79-6.043c-2.138 1.44-4.865 2.313-8.094 2.313-6.24 0-11.541-4.211-13.44-9.884l-.01-.014Z"/><path fill="#FBBC05" d="M2.574 13.244A23.704 23.704 0 0 0 0 24c0 3.883.938 7.527 2.574 10.756 0 .022 7.986-6.196 7.986-6.196A14.384 14.384 0 0 1 9.796 24c0-1.593.284-3.12.764-4.56l-7.986-6.196Z"/><path fill="#EA4335" d="M24 9.556c3.534 0 6.676 1.222 9.185 3.579l6.873-6.873C35.89 2.378 30.48 0 24 0 14.618 0 6.523 5.39 2.574 13.244l7.986 6.196c1.898-5.673 7.2-9.884 13.44-9.884Z"/></svg>',
'client_id' => env('GOOGLE_CLIENT_ID'),
'client_secret' => env('GOOGLE_CLIENT_SECRET'),
],
'github' => [
'name' => 'Github',
'scopes' => null,
'parameters' => null,
'stateless' => true,
'active' => false,
'socialite' => true,
'svg' => '<svg class="w-full h-full" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" fill="none"><path fill="#24292F" fill-rule="evenodd" d="M24.02 0C10.738 0 0 10.817 0 24.198 0 34.895 6.88 43.95 16.424 47.154c1.193.241 1.63-.52 1.63-1.161 0-.561-.039-2.484-.039-4.488-6.682 1.443-8.073-2.884-8.073-2.884-1.074-2.805-2.665-3.525-2.665-3.525-2.187-1.483.16-1.483.16-1.483 2.425.16 3.698 2.484 3.698 2.484 2.147 3.686 5.607 2.644 7 2.003.198-1.562.834-2.644 1.51-3.245-5.329-.56-10.936-2.644-10.936-11.939 0-2.644.954-4.807 2.466-6.49-.239-.6-1.074-3.085.239-6.41 0 0 2.028-.641 6.6 2.484 1.959-.53 3.978-.8 6.006-.802 2.028 0 4.095.281 6.005.802 4.573-3.125 6.601-2.484 6.601-2.484 1.313 3.325.477 5.81.239 6.41 1.55 1.683 2.465 3.846 2.465 6.49 0 9.295-5.607 11.338-10.976 11.94.876.76 1.63 2.202 1.63 4.486 0 3.245-.039 5.85-.039 6.65 0 .642.438 1.403 1.63 1.163C41.12 43.949 48 34.895 48 24.198 48.04 10.817 37.262 0 24.02 0Z" clip-rule="evenodd"/></svg>',
'client_id' => env('GITHUB_CLIENT_ID'),
'client_secret' => env('GITHUB_CLIENT_SECRET'),
],
'gitlab' => [
'name' => 'GitLab',
'scopes' => null,
'parameters' => null,
'stateless' => true,
'active' => false,
'socialite' => true,
'svg' => '<svg class="w-full h-full" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 49" fill="none"><path fill="#E24329" d="m47.201 20.094-.068-.172L40.6 2.872a1.703 1.703 0 0 0-1.689-1.07c-.357.019-.7.147-.982.367a1.75 1.75 0 0 0-.58.88l-4.411 13.496H15.075L10.664 3.05a1.715 1.715 0 0 0-.58-.882 1.75 1.75 0 0 0-2-.108 1.717 1.717 0 0 0-.672.81L.866 19.912l-.065.172a12.132 12.132 0 0 0 4.024 14.021l.023.018.06.043 9.952 7.452 4.924 3.727 2.999 2.264a2.017 2.017 0 0 0 2.44 0l2.998-2.264 4.924-3.727 10.012-7.498.025-.02a12.137 12.137 0 0 0 4.019-14.006Z"/><path fill="#FC6D26" d="m47.201 20.094-.068-.172a22.071 22.071 0 0 0-8.785 3.949L24 34.72c4.886 3.696 9.14 6.907 9.14 6.907l10.012-7.498.025-.02a12.137 12.137 0 0 0 4.024-14.016Z"/><path fill="#FCA326" d="m14.86 41.628 4.924 3.727 2.999 2.264a2.017 2.017 0 0 0 2.44 0l2.998-2.264 4.924-3.727S28.886 38.407 24 34.72c-4.886 3.687-9.14 6.908-9.14 6.908Z"/><path fill="#FC6D26" d="M9.649 23.87a22.042 22.042 0 0 0-8.783-3.958l-.065.172a12.132 12.132 0 0 0 4.024 14.021l.023.018.06.043 9.952 7.452L24 34.71 9.649 23.87Z"/></svg>',
'client_id' => env('GITLAB_CLIENT_ID'),
'client_secret' => env('GITLAB_CLIENT_SECRET'),
],
'bitbucket' => [
'name' => 'Bitbucket',
'scopes' => null,
'parameters' => null,
'stateless' => true,
'active' => false,
'socialite' => true,
'svg' => '<svg class="w-full h-full" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" fill="none"><g><path fill="#2684FF" d="M1.538 3.32A1.538 1.538 0 0 0 0 5.104l6.529 39.633a2.091 2.091 0 0 0 2.045 1.746h31.32a1.538 1.538 0 0 0 1.539-1.292l6.529-40.08a1.536 1.536 0 0 0-1.538-1.783L1.538 3.32Zm27.491 28.645h-9.997l-2.706-14.142H31.45L29.03 31.965Z"/><path fill="url(#bitbucket-gradient)" d="M45.885 17.823H31.452l-2.423 14.142h-9.997L7.228 45.975c.375.324.852.504 1.346.508h31.329a1.538 1.538 0 0 0 1.538-1.292l4.444-27.368Z"/></g><defs><linearGradient id="bitbucket-gradient" x1="49.223" x2="25.369" y1="21.783" y2="40.4" gradientUnits="userSpaceOnUse"><stop offset=".18" stop-color="#0052CC"/><stop offset="1" stop-color="#2684FF"/></linearGradient></defs></svg>',
'client_id' => env('BITBUCKET_CLIENT_ID'),
'client_secret' => env('BITBUCKET_CLIENT_SECRET'),
],
'slack' => [
'name' => 'Slack',
'scopes' => null,
'parameters' => null,
'stateless' => true,
'active' => false,
'socialite' => true,
'svg' => '<svg class="w-full h-full" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 49" fill="none"><path fill="#E01E5A" d="M10.28 31.15a4.984 4.984 0 0 1-4.989 4.988A4.984 4.984 0 0 1 .302 31.15c0-2.759 2.23-4.989 4.99-4.989h4.988v4.99Zm2.495 0c0-2.76 2.23-4.99 4.989-4.99a4.984 4.984 0 0 1 4.989 4.99v12.472c0 2.759-2.23 4.989-4.99 4.989a4.984 4.984 0 0 1-4.988-4.99V31.15Z"/><path fill="#36C5F0" d="M17.764 11.118a4.984 4.984 0 0 1-4.99-4.99c0-2.758 2.23-4.988 4.99-4.988 2.759 0 4.989 2.23 4.989 4.989v4.989h-4.99Zm0 2.532c2.759 0 4.989 2.23 4.989 4.989 0 2.76-2.23 4.989-4.99 4.989H5.254a4.984 4.984 0 0 1-4.988-4.989 4.984 4.984 0 0 1 4.989-4.989h12.51Z"/><path fill="#2EB67D" d="M37.758 18.639a4.984 4.984 0 0 1 4.988-4.989 4.984 4.984 0 0 1 4.99 4.989c0 2.76-2.23 4.989-4.99 4.989h-4.989v-4.989Zm-2.495 0c0 2.76-2.23 4.989-4.989 4.989a4.984 4.984 0 0 1-4.989-4.989V6.129c0-2.76 2.23-4.99 4.989-4.99 2.76 0 4.989 2.23 4.989 4.99v12.51Z"/><path fill="#ECB22E" d="M30.274 38.633c2.76 0 4.989 2.23 4.989 4.989s-2.23 4.989-4.989 4.989a4.984 4.984 0 0 1-4.989-4.99v-4.988h4.989Zm0-2.495a4.984 4.984 0 0 1-4.989-4.989c0-2.759 2.23-4.989 4.989-4.989h12.51c2.76 0 4.99 2.23 4.99 4.99a4.984 4.984 0 0 1-4.99 4.988h-12.51Z"/></svg>',
'client_id' => env('SLACK_CLIENT_ID'),
'client_secret' => env('SLACK_CLIENT_SECRET'),
],
'apple' => [
'name' => 'Apple',
'scopes' => null,
'parameters' => null,
'stateless' => true,
'active' => false,
'socialite' => false,
'svg' => '<svg class="w-full h-full" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" fill="none"><path fill="#000" d="M43.584 37.407a26.1 26.1 0 0 1-2.58 4.64c-1.358 1.935-2.469 3.274-3.325 4.018-1.327 1.22-2.75 1.846-4.273 1.881-1.093 0-2.411-.311-3.946-.942-1.54-.628-2.955-.94-4.249-.94-1.357 0-2.812.312-4.369.94-1.559.63-2.815.96-3.775.992-1.46.063-2.916-.58-4.37-1.931-.927-.81-2.086-2.196-3.476-4.16-1.491-2.098-2.717-4.53-3.677-7.304C4.516 31.606 4 28.705 4 25.897c0-3.217.695-5.991 2.087-8.316 1.095-1.868 2.55-3.34 4.372-4.422a11.761 11.761 0 0 1 5.91-1.668c1.16 0 2.681.359 4.572 1.064 1.885.707 3.095 1.066 3.626 1.066.396 0 1.741-.42 4.02-1.256 2.156-.776 3.975-1.097 5.465-.97 4.039.326 7.073 1.918 9.09 4.786-3.611 2.188-5.398 5.253-5.362 9.185.032 3.063 1.143 5.612 3.327 7.635.99.94 2.095 1.665 3.324 2.181a35.927 35.927 0 0 1-.847 2.225ZM34.322.961c0 2.4-.877 4.642-2.625 6.716-2.11 2.467-4.661 3.892-7.428 3.667a7.465 7.465 0 0 1-.056-.91c0-2.304 1.003-4.77 2.785-6.787.89-1.021 2.02-1.87 3.392-2.547C31.76.433 33.054.064 34.272 0c.035.321.05.642.05.96Z"/></svg>',
'client_id' => env('APPLE_CLIENT_ID'),
'client_secret' => env('APPLE_CLIENT_SECRET'),
],
'microsoft' => [
'name' => 'Microsoft',
'scopes' => null,
'parameters' => null,
'stateless' => true,
'active' => false,
'socialite' => false,
'svg' => '<svg class="w-full h-full" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" fill="none"><path fill="#F35325" d="M2.087 2.087h20.87v20.87H2.086V2.086Z"/><path fill="#81BC06" d="M25.044 2.087h20.869v20.87h-20.87V2.086Z"/><path fill="#05A6F0" d="M2.087 25.044h20.87v20.869H2.086v-20.87Z"/><path fill="#FFBA08" d="M25.044 25.044h20.869v20.869h-20.87v-20.87Z"/></svg>',
'client_id' => env('MICROSOFT_CLIENT_ID'),
'client_secret' => env('MICROSOFT_CLIENT_SECRET'),
],
'pinterest' => [
'name' => 'Pinterest',
'scopes' => null,
'parameters' => null,
'stateless' => true,
'active' => false,
'socialite' => false,
'svg' => '<svg class="w-full h-full" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" fill="none"><path fill="#fff" d="M24 48c13.255 0 24-10.745 24-24S37.255 0 24 0 0 10.745 0 24s10.745 24 24 24Z"/><path fill="#E60019" d="M24 0C10.746 0 0 10.746 0 24c0 10.173 6.321 18.864 15.25 22.36-.218-1.896-.396-4.82.078-6.893.435-1.877 2.805-11.931 2.805-11.931s-.71-1.442-.71-3.556c0-3.338 1.935-5.827 4.345-5.827 2.054 0 3.042 1.54 3.042 3.378 0 2.054-1.304 5.136-1.995 8-.573 2.39 1.205 4.346 3.555 4.346 4.267 0 7.546-4.504 7.546-10.983 0-5.748-4.128-9.758-10.034-9.758-6.835 0-10.845 5.116-10.845 10.41 0 2.054.79 4.266 1.778 5.471a.714.714 0 0 1 .158.692c-.178.75-.593 2.39-.672 2.726-.098.434-.355.533-.81.316-3.002-1.403-4.879-5.768-4.879-9.304 0-7.565 5.492-14.519 15.862-14.519 8.316 0 14.795 5.926 14.795 13.867 0 8.277-5.215 14.933-12.444 14.933-2.43 0-4.721-1.264-5.492-2.765l-1.5 5.709c-.534 2.093-1.996 4.7-2.984 6.3a24.104 24.104 0 0 0 7.111 1.067c13.255 0 24-10.745 24-24C48 10.747 37.255 0 24 0Z"/></svg>',
'client_id' => env('PINTEREST_CLIENT_ID'),
'client_secret' => env('PINTEREST_CLIENT_SECRET'),
],
'reddit' => [
'name' => 'Reddit',
'scopes' => null,
'parameters' => null,
'stateless' => true,
'active' => false,
'socialite' => false,
'svg' => '<svg class="w-full h-full" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" fill="none"><path fill="#FF4500" d="M24 0C10.746 0 0 10.746 0 24a23.925 23.925 0 0 0 7.03 16.97l-4.572 4.572C1.551 46.449 2.194 48 3.476 48H24c13.254 0 24-10.746 24-24S37.254 0 24 0Z"/><path fill="#fff" d="M37.605 28.789a5.604 5.604 0 1 0 0-11.209 5.604 5.604 0 0 0 0 11.209ZM10.395 28.789a5.604 5.604 0 1 0 0-11.209 5.604 5.604 0 0 0 0 11.209Z"/><path fill="#fff" d="M24.013 40c8.836 0 16-5.373 16-12 0-6.628-7.164-12-16-12s-16 5.372-16 12c0 6.627 7.164 12 16 12Z"/><path fill="#842123" d="M19.282 26.833c-.093 2.033-1.443 2.771-3.013 2.771-1.569 0-2.769-1.04-2.675-3.073.094-2.032 1.444-3.378 3.013-3.378 1.57 0 2.77 1.648 2.675 3.68ZM34.432 26.53c.094 2.032-1.104 3.072-2.675 3.072-1.571 0-2.921-.736-3.013-2.77-.094-2.033 1.104-3.681 2.675-3.681 1.572 0 2.922 1.344 3.013 3.378Z"/><path fill="#FD4401" d="M28.744 27.01c.088 1.902 1.35 2.592 2.82 2.592 1.47 0 2.591-1.033 2.503-2.936-.088-1.903-1.35-3.148-2.82-3.148-1.47 0-2.591 1.588-2.503 3.491ZM19.284 27.01c-.088 1.902-1.35 2.592-2.82 2.592-1.47 0-2.59-1.033-2.503-2.936.088-1.903 1.35-3.148 2.82-3.148 1.47 0 2.591 1.588 2.503 3.491Z"/><path fill="#BBCFDA" d="M24.013 30.96c-1.984 0-3.885.096-5.644.27a.444.444 0 0 0-.375.61c.985 2.308 3.308 3.93 6.02 3.93 2.71 0 5.032-1.623 6.018-3.93a.443.443 0 0 0-.375-.61 57.525 57.525 0 0 0-5.644-.27Z"/><path fill="#fff" d="M24.013 31.4c-1.978 0-3.874.098-5.627.276a.45.45 0 0 0-.373.619 6.502 6.502 0 0 0 11.998 0 .45.45 0 0 0-.373-.619 55.963 55.963 0 0 0-5.627-.275h.002Z"/><path fill="#2B2B2B" d="M24.013 31.172c-1.946 0-3.812.095-5.539.27a.444.444 0 0 0-.367.61 6.402 6.402 0 0 0 11.813 0 .444.444 0 0 0-.368-.61 55.38 55.38 0 0 0-5.539-.27Z"/><path fill="#fff" d="M32.777 14.368a3.971 3.971 0 1 0 0-7.942 3.971 3.971 0 0 0 0 7.942Z"/><path fill="url(#b)" d="M23.957 16.506c-.476 0-.86-.2-.86-.507a6.459 6.459 0 0 1 6.451-6.452.86.86 0 1 1 0 1.722 4.736 4.736 0 0 0-4.73 4.73c0 .308-.387.507-.861.507Z"/><path fill="#FF6101" d="M18.238 27.95c0 .738-.784 1.067-1.75 1.067-.965 0-1.749-.33-1.749-1.066 0-.737.784-1.334 1.75-1.334.965 0 1.75.597 1.75 1.334ZM33.289 27.95c0 .738-.784 1.067-1.75 1.067-.965 0-1.749-.33-1.749-1.066 0-.737.784-1.334 1.75-1.334.965 0 1.749.597 1.749 1.334Z"/><path fill="#FFC49C" d="M17.696 25.952c.344 0 .623-.304.623-.679 0-.375-.279-.679-.623-.679s-.622.304-.622.68c0 .374.278.678.622.678ZM32.492 25.952c.344 0 .622-.304.622-.679 0-.375-.278-.679-.622-.679s-.623.304-.623.68c0 .374.28.678.623.678Z"/></svg>',
'client_id' => env('REDDIT_CLIENT_ID'),
'client_secret' => env('REDDIT_CLIENT_SECRET'),
],
'tiktok' => [
'name' => 'TikTok',
'scopes' => null,
'parameters' => null,
'stateless' => true,
'active' => false,
'socialite' => false,
'svg' => '<svg class="w-full h-full" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" fill="none"><path fill="#FF004F" d="M34.353 17.327a18.724 18.724 0 0 0 10.952 3.517v-7.887c-.773 0-1.544-.08-2.3-.241v6.208a18.727 18.727 0 0 1-10.952-3.517v16.095c0 8.051-6.504 14.578-14.526 14.578a14.42 14.42 0 0 1-8.087-2.466A14.457 14.457 0 0 0 19.826 48c8.023 0 14.527-6.527 14.527-14.578V17.327ZM37.19 9.37a11.012 11.012 0 0 1-2.837-6.436V1.92h-2.18a11.043 11.043 0 0 0 5.017 7.45ZM14.514 37.436a6.657 6.657 0 0 1-1.355-4.038c0-3.682 2.975-6.668 6.645-6.668.684 0 1.364.105 2.015.313V18.98c-.761-.105-1.53-.15-2.299-.133v6.276a6.63 6.63 0 0 0-2.016-.313c-3.67 0-6.645 2.986-6.645 6.669a6.67 6.67 0 0 0 3.655 5.957Z"/><path fill="#000" d="M32.053 15.407a18.727 18.727 0 0 0 10.952 3.517v-6.208A10.984 10.984 0 0 1 37.19 9.37a11.043 11.043 0 0 1-5.017-7.45h-5.725v31.501c-.013 3.673-2.983 6.646-6.645 6.646a6.627 6.627 0 0 1-5.29-2.631 6.67 6.67 0 0 1-3.655-5.957c0-3.683 2.975-6.668 6.645-6.668.703 0 1.381.11 2.017.312v-6.276C11.638 19.01 5.3 25.473 5.3 33.42c0 3.968 1.578 7.565 4.14 10.193a14.421 14.421 0 0 0 8.087 2.466c8.022 0 14.526-6.527 14.526-14.578V15.407Z"/><path fill="#00F2EA" d="M43.005 12.716v-1.679A10.921 10.921 0 0 1 37.19 9.37a10.975 10.975 0 0 0 5.815 3.346ZM32.173 1.92c-.052-.3-.092-.602-.12-.906V0h-7.905v31.502c-.013 3.671-2.982 6.645-6.645 6.645a6.598 6.598 0 0 1-2.99-.711 6.627 6.627 0 0 0 5.29 2.631c3.662 0 6.632-2.973 6.645-6.646V1.92h5.725ZM19.52 18.847V17.06a14.62 14.62 0 0 0-1.993-.136C9.504 16.924 3 23.451 3 31.502c0 5.047 2.556 9.495 6.44 12.112A14.555 14.555 0 0 1 5.3 33.421c0-7.948 6.339-14.41 14.22-14.574Z"/></svg>',
'client_id' => env('TIKTOK_CLIENT_ID'),
'client_secret' => env('TIKTOK_CLIENT_SECRET'),
],
'twitch' => [
'name' => 'Twitch',
'scopes' => null,
'parameters' => null,
'stateless' => true,
'active' => false,
'socialite' => false,
'svg' => '<svg class="w-full h-full" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 48" fill="none"><path fill="#fff" d="m41.144 22.286-6.857 6.857H27.43l-6 6v-6h-7.714V3.429h27.428v18.857Z"/><path fill="#9146FF" d="M12.002 0 3.43 8.571V39.43h10.286V48l8.571-8.571h6.857L44.573 24V0H12Zm29.142 22.286-6.857 6.857H27.43l-6 6v-6h-7.714V3.429h27.428v18.857Z"/><path fill="#9146FF" d="M36.001 9.429h-3.428v10.285H36V9.43ZM26.573 9.429h-3.429v10.285h3.429V9.43Z"/></svg>',
'client_id' => env('TWITCH_CLIENT_ID'),
'client_secret' => env('TWITCH_CLIENT_SECRET'),
],
];
================================================
FILE: config/devdojo/auth/settings.php
================================================
<?php
/*
* These are some default authentication settings
*/
return [
'redirect_after_auth' => '/',
'registration_enabled' => true,
'registration_show_password_same_screen' => true,
'registration_include_name_field' => false,
'registration_include_password_confirmation_field' => false,
'registration_require_email_verification' => false,
'enable_branding' => true,
'dev_mode' => false,
'enable_2fa' => false, // Enable or disable 2FA functionality globally
'enable_email_registration' => true,
'login_show_social_providers' => true,
'center_align_social_provider_button_content' => false,
'center_align_text' => false,
'social_providers_location' => 'bottom',
'check_account_exists_before_login' => false,
];
================================================
FILE: config/devdojo/billing/keys.php
================================================
<?php
return [
'stripe' => [
'publishable_key' => env('STRIPE_PUBLISHABLE_KEY'),
'secret_key' => env('STRIPE_SECRET_KEY'),
'webhook_secret' => env('STRIPE_WEBHOOK_SECRET'),
],
'paddle' => [
'vendor_id' => env('PADDLE_VENDOR_ID'),
'api_key' => env('PADDLE_API_KEY'),
'env' => env('PADDLE_ENV'),
'public_key' => env('PADDLE_PUBLIC_KEY'),
],
];
================================================
FILE: config/devdojo/billing/language.php
================================================
<?php
return [
'subscriptions' => [
'header' => 'Subscribe to a Plan Below',
'description' => 'Select a plan below. This description text is editable inside the devdojo.billing.language file.',
'sidebar_description' => 'Welcome to the checkout page for your SaaS product. This sidebar description text is customizable from inside the devdojo.billing.language config.',
'notification' => '',
],
];
================================================
FILE: config/devdojo/billing/style.php
================================================
<?php
return [
'color' => 'blue', // black, white, red, green, blue, yellow, orange, pink, purple
'logo_height' => '36',
];
================================================
FILE: config/discussions.php
================================================
<?php
return [
'headline_logo' => '/vendor/foundationapp/discussions/assets/images/logo-light.png',
'user' => [
'namespace' => App\Models\User::class,
'database_field_with_user_name' => 'name',
'relative_url_to_profile' => '',
'relative_url_to_image_assets' => '',
'avatar_image_database_field' => '',
],
'load_more' => [
'posts' => 10,
'discussions' => 10,
],
'home_route' => 'discussions',
'route_prefix' => 'discussions',
'route_prefix_post' => 'discussion',
/*
|--------------------------------------------------------------------------
| A Few security measures to prevent spam on your forum
|--------------------------------------------------------------------------
|
| Here are a few configurations that you can add to your forum to prevent
| possible spammers or bots.
|
| *limit_time_between_posts*: Stop user from being able to spam by making
| them wait a specified time before being able to post again.
|
| *time_between_posts*: In minutes, the time a user must wait before
| being allowed to add more content. Only valid if above value is
| set to true.
|
*/
'security' => [
'limit_time_between_posts' => true, // true or false
'time_between_posts' => 1, // In minutes
],
/*
|--------------------------------------------------------------------------
| Styles for discussions
|--------------------------------------------------------------------------
|
| This is a minimal config to update a few of the sytles in the discussions
|
*/
'styles' => [
'rounded' => 'rounded-lg',
'sidebar_width' => 'w-56',
'container_classes' => 'max-w-7xl md:px-12 xl:px-20 mx-auto py-12',
'container_max_width' => 'max-w-[1120px]',
'header_classes' => 'dark:text-white text-gray-900 text-4xl font-semibold tracking-tighter',
],
/*
|--------------------------------------------------------------------------
| Editor
|--------------------------------------------------------------------------
|
| You may wish to choose between a couple different editors. At the moment
| The following editors are supported:
| - textarea
/ - richeditor
| - markdown
*/
'editor' => 'richeditor',
/*
|--------------------------------------------------------------------------
| Categories
|--------------------------------------------------------------------------
|
| Here you will define the categories that are available for discussions.
| If you do not wish to include categories in your discussions, you can
| set the 'show_categories' value to false.
|
*/
'show_categories' => true,
'categories' => [
'announcements' => [
'icon' => '📣',
'title' => 'Announcements',
'description' => 'Important announcements from the administrators.',
],
'general' => [
'icon' => '💬',
'title' => 'General Discussion',
'description' => 'Chat about anything and everything here',
],
'ideas' => [
'icon' => '💡',
'title' => 'Ideas',
'description' => 'Share ideas for new features',
],
'qa' => [
'icon' => '🙏',
'title' => 'Q&A',
'description' => 'Ask the community for help',
],
'show-and-tell' => [
'icon' => '🙌',
'title' => 'Show and tell',
'description' => 'Show off something you\'ve made',
],
],
];
================================================
FILE: config/features.php
================================================
<?php
return [
(object) [
'title' => 'Authentication',
'description' => 'Fully loaded authentication, email verification, and password reset. Authentication in a snap!',
'image' => '/themes/tailwind/images/authentication.png',
],
(object) [
'title' => 'User Profiles',
'description' => 'Customizable user profiles. Allow your users to enter data and easily customize their user profiles.',
'image' => '/themes/tailwind/images/profile.png',
],
(object) [
'title' => 'User Impersonation',
'description' => 'With user impersonations you can login as another user and resolve an issue or troubleshoot a bug.',
'image' => '/themes/tailwind/images/impersonation.png',
],
(object) [
'title' => 'Subscriptions',
'description' => 'Allow users to pay for your service and signup for a subscription using Paddle Payments.',
'image' => '/themes/tailwind/images/subscriptions.png',
],
(object) [
'title' => 'Subscription Plans',
'description' => 'Create new plans with different features and intrigue your users to subscribe to any plan.',
'image' => '/themes/tailwind/images/plans.png',
],
(object) [
'title' => 'User Roles',
'description' => 'Grant user permissions based on roles, you can then assign a role to a specific plan.',
'image' => '/themes/tailwind/images/roles.png',
],
(object) [
'title' => 'Notifications',
'description' => 'Ready-to-use Notification System which integrates with the default Laravel notification feature.',
'image' => '/themes/tailwind/images/notifications.png',
],
(object) [
'title' => 'Announcements',
'description' => 'Create user announcements to notify users about new features or updates in your application.',
'image' => '/themes/tailwind/images/announcements.png',
],
(object) [
'title' => 'Blog',
'description' => 'Equipped with a fully-functional blog. Write posts related to your product to gain free SEO traffic.',
'image' => '/themes/tailwind/images/blog.png',
],
(object) [
'title' => 'Fully Functional API',
'description' => 'Ready-to-consume API for your application. Create API tokens with role specific permissions.',
'image' => '/themes/tailwind/images/api.png',
],
(object) [
'title' => 'Filament Admin',
'description' => 'Wave utilizes Filament to provide a beautiful admin panel.',
'image' => '/themes/tailwind/images/admin.png',
],
(object) [
'title' => 'Themes',
'description' => 'Fully configurable themes. Choose from a few starter themes to begin configuring to make it your own.',
'image' => '/themes/tailwind/images/themes.png',
],
];
================================================
FILE: config/filament-google-analytics.php
================================================
<?php
return [
/**
* Dashboard Page
*/
'dedicated_dashboard' => true,
'dashboard_icon' => 'heroicon-m-chart-bar',
/**
* Widgets
*/
'page_views' => [
'filament_dashboard' => false,
'global' => true,
],
'visitors' => [
'filament_dashboard' => false,
'global' => true,
],
'active_users_one_day' => [
'filament_dashboard' => false,
'global' => true,
],
'active_users_seven_day' => [
'filament_dashboard' => false,
'global' => true,
],
'active_users_twenty_eight_day' => [
'filament_dashboard' => false,
'global' => false,
],
'sessions' => [
'filament_dashboard' => false,
'global' => true,
],
'sessions_duration' => [
'filament_dashboard' => false,
'global' => true,
],
'sessions_by_country' => [
'filament_dashboard' => false,
'global' => true,
],
'sessions_by_device' => [
'filament_dashboard' => false,
'global' => true,
],
'most_visited_pages' => [
'filament_dashboard' => false,
'global' => true,
],
'top_referrers_list' => [
'filament_dashboard' => false,
'global' => true,
],
/**
* Trajectory Icons
*/
'trending_up_icon' => 'heroicon-o-arrow-trending-up',
'trending_down_icon' => 'heroicon-o-arrow-trending-down',
'steady_icon' => 'heroicon-o-arrows-right-left',
/**
* Trajectory Colors
*/
'trending_up_color' => 'success',
'trending_down_color' => 'danger',
'steady_color' => 'secondary',
];
================================================
FILE: config/filament.php
================================================
<?php
// use Filament\Support\Commands\FileGenerators\FileGenerationFlag;
return [
/*
|--------------------------------------------------------------------------
| Broadcasting
|--------------------------------------------------------------------------
|
| By uncommenting the Laravel Echo configuration, you may connect Filament
| to any Pusher-compatible websockets server.
|
| This will allow your users to receive real-time notifications.
|
*/
'broadcasting' => [
// 'echo' => [
// 'broadcaster' => 'pusher',
// 'key' => env('VITE_PUSHER_APP_KEY'),
// 'cluster' => env('VITE_PUSHER_APP_CLUSTER'),
// 'wsHost' => env('VITE_PUSHER_HOST'),
// 'wsPort' => env('VITE_PUSHER_PORT'),
// 'wssPort' => env('VITE_PUSHER_PORT'),
// 'authEndpoint' => '/broadcasting/auth',
// 'disableStats' => true,
// 'encrypted' => true,
// 'forceTLS' => true,
// ],
],
/*
|--------------------------------------------------------------------------
| Default Filesystem Disk
|--------------------------------------------------------------------------
|
| This is the storage disk Filament will use to store files. You may use
| any of the disks defined in the `config/filesystems.php`.
|
*/
'default_filesystem_disk' => env('FILAMENT_FILESYSTEM_DISK', 'public'),
/*
|--------------------------------------------------------------------------
| Assets Path
|--------------------------------------------------------------------------
|
| This is the directory where Filament's assets will be published to. It
| is relative to the `public` directory of your Laravel application.
|
| After changing the path, you should run `php artisan filament:assets`.
|
*/
'assets_path' => null,
/*
|--------------------------------------------------------------------------
| Cache Path
|--------------------------------------------------------------------------
|
| This is the directory that Filament will use to store cache files that
| are used to optimize the registration of components.
|
| After changing the path, you should run `php artisan filament:cache-components`.
|
*/
'cache_path' => base_path('bootstrap/cache/filament'),
/*
|--------------------------------------------------------------------------
| Livewire Loading Delay
|--------------------------------------------------------------------------
|
| This sets the delay before loading indicators appear.
|
| Setting this to 'none' makes indicators appear immediately, which can be
| desirable for high-latency connections. Setting it to 'default' applies
| Livewire's standard 200ms delay.
|
*/
'livewire_loading_delay' => 'default',
/*
|--------------------------------------------------------------------------
| System Route Prefix
|--------------------------------------------------------------------------
|
| This is the prefix used for the system routes that Filament registers,
| such as the routes for downloading exports and failed import rows.
|
*/
'system_route_prefix' => 'filament',
// 'file_generation' => [
// 'flags' => [
// FileGenerationFlag::EMBEDDED_PANEL_RESOURCE_SCHEMAS, // Define new forms and infolists inside the resource class instead of a separate schema class.
// FileGenerationFlag::EMBEDDED_PANEL_RESOURCE_TABLES, // Define new tables inside the resource class instead of a separate table class.
// FileGenerationFlag::PANEL_CLUSTER_CLASSES_OUTSIDE_DIRECTORIES, // Create new cluster classes outside of their directories. Not required if you run `php artisan filament:upgrade-directory-structure-to-v4`.
// FileGenerationFlag::PANEL_RESOURCE_CLASSES_OUTSIDE_DIRECTORIES, // Create new resource classes outside of their directories. Not required if you run `php artisan filament:upgrade-directory-structure-to-v4`.
// FileGenerationFlag::PARTIAL_IMPORTS, // Partially import components such as form fields and table columns instead of importing each component explicitly.
// ],
// ],
];
================================================
FILE: config/filesystems.php
================================================
<?php
return [
/*
|--------------------------------------------------------------------------
| Default Filesystem Disk
|--------------------------------------------------------------------------
|
| Here you may specify the default filesystem disk that should be used
| by the framework. The "local" disk, as well as a variety of cloud
| based disks are available to your application for file storage.
|
*/
'default' => env('FILESYSTEM_DISK', 'local'),
/*
|--------------------------------------------------------------------------
| Filesystem Disks
|--------------------------------------------------------------------------
|
| Below you may configure as many filesystem disks as necessary, and you
| may even configure multiple disks for the same driver. Examples for
| most supported storage drivers are configured here for reference.
|
| Supported drivers: "local", "ftp", "sftp", "s3"
|
*/
'disks' => [
'local' => [
'driver' => 'local',
'root' => storage_path('app/private'),
'serve' => true,
'throw' => false,
'report' => false,
],
'public' => [
'driver' => 'local',
'root' => storage_path('app/public'),
'url' => env('APP_URL').'/storage',
'visibility' => 'public',
'throw' => false,
'report' => false,
],
],
/*
|--------------------------------------------------------------------------
| Symbolic Links
|--------------------------------------------------------------------------
|
| Here you may configure the symbolic links that will be created when the
| `storage:link` Artisan command is executed. The array keys should be
| the locations of the links and the values should be their targets.
|
*/
'links' => [
public_path('storage') => storage_path('app/public'),
],
];
================================================
FILE: config/forms.php
================================================
<?php
return [
'types' => [
'TextInput' => 'Text Input',
'Textarea' => 'Textarea Input',
'RichEditor' => 'Rich Text Editor',
'MarkdownEditor' => 'Markdown Editor',
'Select' => 'Select Dropdown',
'Checkbox' => 'Checkbox',
'Toggle' => 'Toggle',
'CheckBoxList' => 'Checkbox List',
'Radio' => 'Radio',
'DateTimePicker' => 'Date Time Picker',
'DatePicker' => 'Date Picker',
'TimePicker' => 'Time Picker',
'FileUpload' => 'File Upload',
'TagsInput' => 'Tags Input',
'ColorPicker' => 'Color Picker',
],
];
================================================
FILE: config/image.php
================================================
<?php
return [
/*
|--------------------------------------------------------------------------
| Image Driver
|--------------------------------------------------------------------------
|
| Intervention Image supports "GD Library" and "Imagick" to process images
| internally. You may choose one of them according to your PHP
| configuration. By default PHP's "GD Library" implementation is used.
|
| Supported: "gd", "imagick"
|
*/
'driver' => 'gd',
];
================================================
FILE: config/jwt.php
================================================
<?php
/*
* This file is part of jwt-auth.
*
* (c) Sean Tymon <tymon148@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
return [
/*
|--------------------------------------------------------------------------
| JWT Authentication Secret
|--------------------------------------------------------------------------
|
| Don't forget to set this in your .env file, as it will be used to sign
| your tokens. A helper command is provided for this:
| `php artisan jwt:secret`
|
| Note: This will be used for Symmetric algorithms only (HMAC),
| since RSA and ECDSA use a private/public key combo (See below).
|
*/
'secret' => env('JWT_SECRET'),
/*
|--------------------------------------------------------------------------
| JWT Authentication Keys
|--------------------------------------------------------------------------
|
| The algorithm you are using, will determine whether your tokens are
| signed with a random string (defined in `JWT_SECRET`) or using the
| following public & private keys.
|
| Symmetric Algorithms:
| HS256, HS384 & HS512 will use `JWT_SECRET`.
|
| Asymmetric Algorithms:
| RS256, RS384 & RS512 / ES256, ES384 & ES512 will use the keys below.
|
*/
'keys' => [
/*
|--------------------------------------------------------------------------
| Public Key
|--------------------------------------------------------------------------
|
| A path or resource to your public key.
|
| E.g. 'file://path/to/public/key'
|
*/
'public' => env('JWT_PUBLIC_KEY'),
/*
|--------------------------------------------------------------------------
| Private Key
|--------------------------------------------------------------------------
|
| A path or resource to your private key.
|
| E.g. 'file://path/to/private/key'
|
*/
'private' => env('JWT_PRIVATE_KEY'),
/*
|--------------------------------------------------------------------------
| Passphrase
|--------------------------------------------------------------------------
|
| The passphrase for your private key. Can be null if none set.
|
*/
'passphrase' => env('JWT_PASSPHRASE'),
],
/*
|--------------------------------------------------------------------------
| JWT time to live
|--------------------------------------------------------------------------
|
| Specify the length of time (in minutes) that the token will be valid for.
| Defaults to 1 hour.
|
| You can also set this to null, to yield a never expiring token.
| Some people may want this behaviour for e.g. a mobile app.
| This is not particularly recommended, so make sure you have appropriate
| systems in place to revoke the token if necessary.
|
*/
'ttl' => env('JWT_TTL', 60),
/*
|--------------------------------------------------------------------------
| Refresh time to live
|--------------------------------------------------------------------------
|
| Specify the length of time (in minutes) that the token can be refreshed
| within. I.E. The user can refresh their token within a 2 week window of
| the original token being created until they must re-authenticate.
| Defaults to 2 weeks.
|
| You can also set this to null, to yield an infinite refresh time.
| Some may want this instead of never expiring tokens for e.g. a mobile app.
| This is not particularly recommended, so make sure you have appropriate
| systems in place to revoke the token if necessary.
|
*/
'refresh_ttl' => env('JWT_REFRESH_TTL', 20160),
/*
|--------------------------------------------------------------------------
| JWT hashing algorithm
|--------------------------------------------------------------------------
|
| Specify the hashing algorithm that will be used to sign the token.
|
| See here: https://github.com/namshi/jose/tree/master/src/Namshi/JOSE/Signer/OpenSSL
| for possible values.
|
*/
'algo' => env('JWT_ALGO', 'HS256'),
/*
|--------------------------------------------------------------------------
| Required Claims
|--------------------------------------------------------------------------
|
| Specify the required claims that must exist in any token.
| A TokenInvalidException will be thrown if any of these claims are not
| present in the payload.
|
*/
'required_claims' => [
'iss',
'iat',
'exp',
'nbf',
'sub',
'jti',
],
/*
|--------------------------------------------------------------------------
| Persistent Claims
|--------------------------------------------------------------------------
|
| Specify the claim keys to be persisted when refreshing a token.
| `sub` and `iat` will automatically be persisted, in
| addition to the these claims.
|
| Note: If a claim does not exist then it will be ignored.
|
*/
'persistent_claims' => [
// 'foo',
// 'bar',
],
/*
|--------------------------------------------------------------------------
| Lock Subject
|--------------------------------------------------------------------------
|
| This will determine whether a `prv` claim is automatically added to
| the token. The purpose of this is to ensure that if you have multiple
| authentication models e.g. `App\Models\User` & `App\OtherPerson`, then we
| should prevent one authentication request from impersonating another,
| if 2 tokens happen to have the same id across the 2 different models.
|
| Under specific circumstances, you may want to disable this behaviour
| e.g. if you only have one authentication model, then you would save
| a little on token size.
|
*/
'lock_subject' => true,
/*
|--------------------------------------------------------------------------
| Leeway
|--------------------------------------------------------------------------
|
| This property gives the jwt timestamp claims some "leeway".
| Meaning that if you have any unavoidable slight clock skew on
| any of your servers then this will afford you some level of cushioning.
|
| This applies to the claims `iat`, `nbf` and `exp`.
|
| Specify in seconds - only if you know you need it.
|
*/
'leeway' => env('JWT_LEEWAY', 0),
/*
|--------------------------------------------------------------------------
| Blacklist Enabled
|--------------------------------------------------------------------------
|
| In order to invalidate tokens, you must have the blacklist enabled.
| If you do not want or need this functionality, then set this to false.
|
*/
'blacklist_enabled' => env('JWT_BLACKLIST_ENABLED', true),
/*
| -------------------------------------------------------------------------
| Blacklist Grace Period
| -------------------------------------------------------------------------
|
| When multiple concurrent requests are made with the same JWT,
| it is possible that some of them fail, due to token regeneration
| on every request.
|
| Set grace period in seconds to prevent parallel request failure.
|
*/
'blacklist_grace_period' => env('JWT_BLACKLIST_GRACE_PERIOD', 0),
/*
|--------------------------------------------------------------------------
| Cookies encryption
|--------------------------------------------------------------------------
|
| By default Laravel encrypt cookies for security reason.
| If you decide to not decrypt cookies, you will have to configure Laravel
| to not encrypt your cookie token by adding its name into the $except
| array available in the middleware "EncryptCookies" provided by Laravel.
| see https://laravel.com/docs/master/responses#cookies-and-encryption
| for details.
|
| Set it to true if you want to decrypt cookies.
|
*/
'decrypt_cookies' => false,
/*
|--------------------------------------------------------------------------
| Providers
|--------------------------------------------------------------------------
|
| Specify the various providers used throughout the package.
|
*/
'providers' => [
/*
|--------------------------------------------------------------------------
| JWT Provider
|--------------------------------------------------------------------------
|
| Specify the provider that is used to create and decode the tokens.
|
*/
'jwt' => Tymon\JWTAuth\Providers\JWT\Lcobucci::class,
/*
|--------------------------------------------------------------------------
| Authentication Provider
|--------------------------------------------------------------------------
|
| Specify the provider that is used to authenticate users.
|
*/
'auth' => Tymon\JWTAuth\Providers\Auth\Illuminate::class,
/*
|--------------------------------------------------------------------------
| Storage Provider
|--------------------------------------------------------------------------
|
| Specify the provider that is used to store tokens in the blacklist.
|
*/
'storage' => Tymon\JWTAuth\Providers\Storage\Illuminate::class,
],
];
================================================
FILE: config/limits.php
================================================
<?php
return [
/*
|--------------------------------------------------------------------------
| Feature Limits
|--------------------------------------------------------------------------
|
| Define countable features and their associated models. Each feature
| can have a limit defined per plan. The model and column are used to
| count the user's current usage.
|
| Example:
| 'projects' => [
| 'model' => App\Models\Project::class,
| 'column' => 'user_id',
| ],
|
*/
'features' => [
'api_keys' => [
'model' => \Wave\ApiKey::class,
'column' => 'user_id',
],
],
/*
|--------------------------------------------------------------------------
| Admin Bypass
|--------------------------------------------------------------------------
|
| When enabled, users with the admin role bypass all feature limits.
|
*/
'admin_bypass' => true,
/*
|--------------------------------------------------------------------------
| Default Limits
|--------------------------------------------------------------------------
|
| Default limits for users without an active subscription. Set to null
| for unlimited, 0 to disable the feature entirely.
|
*/
'defaults' => [
'api_keys' => 1,
],
];
================================================
FILE: config/livewire.php
================================================
<?php
return [
/*
|---------------------------------------------------------------------------
| Class Namespace
|---------------------------------------------------------------------------
|
| This value sets the root class namespace for Livewire component classes in
| your application. This value will change where component auto-discovery
| finds components. It's also referenced by the file creation commands.
|
*/
'class_namespace' => 'App\\Livewire',
/*
|---------------------------------------------------------------------------
| View Path
|---------------------------------------------------------------------------
|
| This value is used to specify where Livewire component Blade templates are
| stored when running file creation commands like `artisan make:livewire`.
| It is also used if you choose to omit a component's render() method.
|
*/
'view_path' => resource_path('views/livewire'),
/*
|---------------------------------------------------------------------------
| Layout
|---------------------------------------------------------------------------
| The view that will be used as the layout when rendering a single component
| as an entire page via `Route::get('/post/create', CreatePost::class);`.
| In this case, the view returned by CreatePost will render into $slot.
|
*/
'layout' => 'components.layouts.app',
/*
|---------------------------------------------------------------------------
| Lazy Loading Placeholder
|---------------------------------------------------------------------------
| Livewire allows you to lazy load components that would otherwise slow down
| the initial page load. Every component can have a custom placeholder or
| you can define the default placeholder view for all components below.
|
*/
'lazy_placeholder' => null,
/*
|---------------------------------------------------------------------------
| Temporary File Uploads
|---------------------------------------------------------------------------
|
| Livewire handles file uploads by storing uploads in a temporary directory
| before the file is stored permanently. All file uploads are directed to
| a global endpoint for temporary storage. You may configure this below:
|
*/
'temporary_file_upload' => [
'disk' => null, // Example: 'local', 's3' | Default: 'default'
'rules' => null, // Example: ['file', 'mimes:png,jpg'] | Default: ['required', 'file', 'max:12288'] (12MB)
'directory' => null, // Example: 'tmp' | Default: 'livewire-tmp'
'middleware' => null, // Example: 'throttle:5,1' | Default: 'throttle:60,1'
'preview_mimes' => [ // Supported file types for temporary pre-signed file URLs...
'png', 'gif', 'bmp', 'svg', 'wav', 'mp4',
'mov', 'avi', 'wmv', 'mp3', 'm4a',
'jpg', 'jpeg', 'mpga', 'webp', 'wma',
],
'max_upload_time' => 5, // Max duration (in minutes) before an upload is invalidated...
'cleanup' => true, // Should cleanup temporary uploads older than 24 hrs...
],
/*
|---------------------------------------------------------------------------
| Render On Redirect
|---------------------------------------------------------------------------
|
| This value determines if Livewire will run a component's `render()` method
| after a redirect has been triggered using something like `redirect(...)`
| Setting this to true will render the view once more before redirecting
|
*/
'render_on_redirect' => false,
/*
|---------------------------------------------------------------------------
| Eloquent Model Binding
|---------------------------------------------------------------------------
|
| Previous versions of Livewire supported binding directly to eloquent model
| properties using wire:model by default. However, this behavior has been
| deemed too "magical" and has therefore been put under a feature flag.
|
*/
'legacy_model_binding' => false,
/*
|---------------------------------------------------------------------------
| Auto-inject Frontend Assets
|---------------------------------------------------------------------------
|
| By default, Livewire automatically injects its JavaScript and CSS into the
| <head> and <body> of pages containing Livewire components. By disabling
| this behavior, you need to use @livewireStyles and @livewireScripts.
|
*/
'inject_assets' => true,
/*
|---------------------------------------------------------------------------
| Navigate (SPA mode)
|---------------------------------------------------------------------------
|
| By adding `wire:navigate` to links in your Livewire application, Livewire
| will prevent the default link handling and instead request those pages
| via AJAX, creating an SPA-like effect. Configure this behavior here.
|
*/
'navigate' => [
'show_progress_bar' => true,
'progress_bar_color' => '#2299dd',
],
/*
|---------------------------------------------------------------------------
| HTML Morph Markers
|---------------------------------------------------------------------------
|
| Livewire intelligently "morphs" existing HTML into the newly rendered HTML
| after each update. To make this process more reliable, Livewire injects
| "markers" into the rendered Blade surrounding @if, @class & @foreach.
|
*/
'inject_morph_markers' => true,
/*
|---------------------------------------------------------------------------
| Pagination Theme
|---------------------------------------------------------------------------
|
| When enabling Livewire's pagination feature by using the `WithPagination`
| trait, Livewire will use Tailwind templates to render pagination views
| on the page. If you want Bootstrap CSS, you can specify: "bootstrap"
|
*/
'pagination_theme' => 'tailwind',
];
================================================
FILE: config/logging.php
================================================
<?php
use Monolog\Handler\NullHandler;
use Monolog\Handler\StreamHandler;
use Monolog\Handler\SyslogUdpHandler;
use Monolog\Processor\PsrLogMessageProcessor;
return [
/*
|--------------------------------------------------------------------------
| Default Log Channel
|--------------------------------------------------------------------------
|
| This option defines the default log channel that is utilized to write
| messages to your logs. The value provided here should match one of
| the channels present in the list of "channels" configured below.
|
*/
'default' => env('LOG_CHANNEL', 'stack'),
/*
|--------------------------------------------------------------------------
| Deprecations Log Channel
|--------------------------------------------------------------------------
|
| This option controls the log channel that should be used to log warnings
| regarding deprecated PHP and library features. This allows you to get
| your application ready for upcoming major versions of dependencies.
|
*/
'deprecations' => [
'channel' => env('LOG_DEPRECATIONS_CHANNEL', 'null'),
'trace' => env('LOG_DEPRECATIONS_TRACE', false),
],
/*
|--------------------------------------------------------------------------
| Log Channels
|--------------------------------------------------------------------------
|
| Here you may configure the log channels for your application. Laravel
| utilizes the Monolog PHP logging library, which includes a variety
| of powerful log handlers and formatters that you're free to use.
|
| Available drivers:
gitextract_oox3trws/
├── .editorconfig
├── .gitattributes
├── .github/
│ └── workflows/
│ ├── auth.yml
│ ├── install-automatic.yml
│ ├── pint.yml
│ └── tests.yml
├── .gitignore
├── CLAUDE.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE.md
├── README.md
├── SECURITY.md
├── app/
│ ├── Console/
│ │ └── Commands/
│ │ ├── CreateRole.php
│ │ └── CreateUser.php
│ ├── Filament/
│ │ ├── Pages/
│ │ │ ├── Dashboard.php
│ │ │ ├── Media.php
│ │ │ ├── Plugins.php
│ │ │ └── Themes.php
│ │ ├── Resources/
│ │ │ ├── Categories/
│ │ │ │ ├── CategoryResource.php
│ │ │ │ └── Pages/
│ │ │ │ ├── CreateCategory.php
│ │ │ │ ├── EditCategory.php
│ │ │ │ └── ListCategories.php
│ │ │ ├── Changelogs/
│ │ │ │ ├── ChangelogResource.php
│ │ │ │ └── Pages/
│ │ │ │ ├── CreateChangelog.php
│ │ │ │ ├── EditChangelog.php
│ │ │ │ └── ListChangelogs.php
│ │ │ ├── Forms/
│ │ │ │ ├── FormsResource.php
│ │ │ │ └── Pages/
│ │ │ │ ├── CreateForms.php
│ │ │ │ ├── EditForms.php
│ │ │ │ └── ListForms.php
│ │ │ ├── Pages/
│ │ │ │ ├── PageResource.php
│ │ │ │ └── Pages/
│ │ │ │ ├── CreatePage.php
│ │ │ │ ├── EditPage.php
│ │ │ │ └── ListPages.php
│ │ │ ├── Permissions/
│ │ │ │ ├── Pages/
│ │ │ │ │ ├── CreatePermission.php
│ │ │ │ │ ├── EditPermission.php
│ │ │ │ │ └── ListPermissions.php
│ │ │ │ └── PermissionResource.php
│ │ │ ├── Plans/
│ │ │ │ ├── Pages/
│ │ │ │ │ ├── CreatePlan.php
│ │ │ │ │ ├── EditPlan.php
│ │ │ │ │ └── ListPlans.php
│ │ │ │ └── PlanResource.php
│ │ │ ├── Posts/
│ │ │ │ ├── Pages/
│ │ │ │ │ ├── CreatePost.php
│ │ │ │ │ ├── EditPost.php
│ │ │ │ │ └── ListPosts.php
│ │ │ │ └── PostResource.php
│ │ │ ├── Roles/
│ │ │ │ ├── Pages/
│ │ │ │ │ ├── CreateRole.php
│ │ │ │ │ ├── EditRole.php
│ │ │ │ │ └── ListRoles.php
│ │ │ │ └── RoleResource.php
│ │ │ ├── Settings/
│ │ │ │ ├── Pages/
│ │ │ │ │ ├── CreateSetting.php
│ │ │ │ │ ├── EditSetting.php
│ │ │ │ │ └── ListSettings.php
│ │ │ │ └── SettingResource.php
│ │ │ └── Users/
│ │ │ ├── Pages/
│ │ │ │ ├── CreateUser.php
│ │ │ │ ├── EditUser.php
│ │ │ │ └── ListUsers.php
│ │ │ └── UserResource.php
│ │ └── Widgets/
│ │ └── DashboardWidget.php
│ ├── Http/
│ │ └── Controllers/
│ │ └── Controller.php
│ ├── Listeners/
│ │ ├── LogSuccessfulLogin.php
│ │ └── LogSuccessfulLogout.php
│ ├── Models/
│ │ ├── Category.php
│ │ ├── Forms.php
│ │ ├── Post.php
│ │ └── User.php
│ ├── Notifications/
│ │ └── TestNotification.php
│ └── Providers/
│ ├── AppServiceProvider.php
│ ├── Filament/
│ │ └── AdminPanelProvider.php
│ ├── FolioServiceProvider.php
│ └── VoltServiceProvider.php
├── artisan
├── bootstrap/
│ ├── app.php
│ ├── cache/
│ │ └── .gitignore
│ └── providers.php
├── composer.json
├── config/
│ ├── .gitkeep
│ ├── activity.php
│ ├── app.php
│ ├── auth.php
│ ├── database.php
│ ├── devdojo/
│ │ ├── auth/
│ │ │ ├── appearance.php
│ │ │ ├── descriptions.php
│ │ │ ├── language.php
│ │ │ ├── providers.php
│ │ │ └── settings.php
│ │ └── billing/
│ │ ├── keys.php
│ │ ├── language.php
│ │ └── style.php
│ ├── discussions.php
│ ├── features.php
│ ├── filament-google-analytics.php
│ ├── filament.php
│ ├── filesystems.php
│ ├── forms.php
│ ├── image.php
│ ├── jwt.php
│ ├── limits.php
│ ├── livewire.php
│ ├── logging.php
│ ├── mail.php
│ ├── passport.php
│ ├── permission.php
│ ├── privacy.php
│ ├── profile.php
│ ├── services.php
│ ├── style.php
│ ├── themes.php
│ └── wave.php
├── database/
│ ├── .gitignore
│ ├── factories/
│ │ ├── CategoryFactory.php
│ │ ├── PostFactory.php
│ │ └── UserFactory.php
│ ├── migrations/
│ │ ├── 2024_03_29_000000_create_cache_table.php
│ │ ├── 2024_04_24_000001_add_user_social_provider_table.php
│ │ ├── 2024_04_24_000002_update_passwords_field_to_be_nullable.php
│ │ ├── 2024_05_07_000003_add_two_factor_auth_columns.php
│ │ ├── 2024_07_31_133819_add_description_to_roles_table.php
│ │ └── 2025_02_19_101241_change_user_social_provider_table.php
│ └── seeders/
│ ├── ActivityLogSeeder.php
│ ├── ApiKeysTableSeeder.php
│ ├── CategoriesTableSeeder.php
│ ├── ChangelogsTableSeeder.php
│ ├── DatabaseSeeder.php
│ ├── ModelHasRolesTableSeeder.php
│ ├── NotificationsTableSeeder.php
│ ├── PagesTableSeeder.php
│ ├── PasswordResetsTableSeeder.php
│ ├── PermissionRoleTableSeeder.php
│ ├── PermissionsTableSeeder.php
│ ├── PlansTableSeeder.php
│ ├── PostsTableSeeder.php
│ ├── ProfileKeyValuesTableSeeder.php
│ ├── RolesTableSeeder.php
│ ├── SettingsTableSeeder.php
│ ├── ThemesTableSeeder.php
│ ├── TranslationsTableSeeder.php
│ └── UsersTableSeeder.php
├── lang/
│ ├── ar/
│ │ ├── auth.php
│ │ ├── pagination.php
│ │ ├── passwords.php
│ │ └── validation.php
│ ├── it/
│ │ ├── auth.php
│ │ ├── pagination.php
│ │ ├── passwords.php
│ │ └── validation.php
│ └── pl/
│ ├── auth.php
│ ├── pagination.php
│ ├── passwords.php
│ └── validation.php
├── package.json
├── phpunit.xml
├── pint.json
├── postcss.config.js
├── public/
│ ├── .htaccess
│ ├── auth/
│ │ ├── app.css
│ │ └── build/
│ │ ├── assets/
│ │ │ ├── scripts.js
│ │ │ └── styles.css
│ │ └── manifest.json
│ ├── billing/
│ │ ├── main.css
│ │ ├── main.js
│ │ └── manifest.json
│ ├── build/
│ │ ├── assets/
│ │ │ ├── app-75U0MKBP.css
│ │ │ ├── app-CaUPGaqM.js
│ │ │ └── theme-DRT1wFy8.css
│ │ └── manifest.json
│ ├── composer/
│ │ ├── install.php
│ │ ├── mac.php
│ │ └── windows.php
│ ├── css/
│ │ ├── bezhansalleh/
│ │ │ └── filament-google-analytics/
│ │ │ └── filament-google-analytics.css
│ │ └── filament/
│ │ ├── filament/
│ │ │ └── app.css
│ │ ├── forms/
│ │ │ └── forms.css
│ │ └── support/
│ │ └── support.css
│ ├── fonts/
│ │ └── filament/
│ │ └── filament/
│ │ └── inter/
│ │ └── index.css
│ ├── index.php
│ ├── js/
│ │ └── filament/
│ │ ├── actions/
│ │ │ └── actions.js
│ │ ├── filament/
│ │ │ ├── app.js
│ │ │ └── echo.js
│ │ ├── forms/
│ │ │ └── components/
│ │ │ ├── checkbox-list.js
│ │ │ ├── code-editor.js
│ │ │ ├── color-picker.js
│ │ │ ├── date-time-picker.js
│ │ │ ├── file-upload.js
│ │ │ ├── key-value.js
│ │ │ ├── markdown-editor.js
│ │ │ ├── rich-editor.js
│ │ │ ├── select.js
│ │ │ ├── slider.js
│ │ │ ├── tags-input.js
│ │ │ └── textarea.js
│ │ ├── notifications/
│ │ │ └── notifications.js
│ │ ├── schemas/
│ │ │ ├── components/
│ │ │ │ ├── actions.js
│ │ │ │ ├── tabs.js
│ │ │ │ └── wizard.js
│ │ │ └── schemas.js
│ │ ├── support/
│ │ │ ├── async-alpine.js
│ │ │ └── support.js
│ │ ├── tables/
│ │ │ ├── components/
│ │ │ │ ├── columns/
│ │ │ │ │ ├── checkbox.js
│ │ │ │ │ ├── select.js
│ │ │ │ │ ├── text-input.js
│ │ │ │ │ └── toggle.js
│ │ │ │ └── table.js
│ │ │ └── tables.js
│ │ └── widgets/
│ │ └── components/
│ │ ├── chart.js
│ │ └── stats-overview/
│ │ └── stat/
│ │ └── chart.js
│ ├── mix-manifest.json
│ ├── robots.txt
│ ├── themes/
│ │ ├── tailwind/
│ │ │ ├── css/
│ │ │ │ └── app.css
│ │ │ ├── js/
│ │ │ │ └── app.js
│ │ │ └── mix-manifest.json
│ │ └── tallstack/
│ │ ├── css/
│ │ │ └── app.css
│ │ ├── js/
│ │ │ └── app.js
│ │ └── mix-manifest.json
│ ├── vendor/
│ │ ├── binarytorch/
│ │ │ └── larecipe/
│ │ │ └── assets/
│ │ │ ├── css/
│ │ │ │ ├── app.css
│ │ │ │ ├── font-awesome-v4-shims.css
│ │ │ │ └── font-awesome.css
│ │ │ └── js/
│ │ │ └── app.js
│ │ └── livewire/
│ │ ├── livewire.esm.js
│ │ ├── livewire.js
│ │ └── manifest.json
│ └── wave/
│ ├── css/
│ │ └── docs.css
│ └── js/
│ └── docs.js
├── resources/
│ ├── css/
│ │ └── filament/
│ │ └── admin/
│ │ ├── tailwind.config.js
│ │ └── theme.css
│ ├── plugins/
│ │ └── installed.json
│ ├── themes/
│ │ └── .gitignore
│ └── views/
│ ├── components/
│ │ ├── avatar.blade.php
│ │ ├── button-s.blade.php
│ │ ├── button.blade.php
│ │ ├── empty-state.blade.php
│ │ ├── favicon.blade.php
│ │ ├── logo-icon.blade.php
│ │ └── logo.blade.php
│ ├── filament/
│ │ ├── pages/
│ │ │ ├── media.blade.php
│ │ │ ├── my-custom-dashboard-page.blade.php
│ │ │ ├── plugins.blade.php
│ │ │ └── themes.blade.php
│ │ └── widgets/
│ │ └── dashboard-widget.blade.php
│ ├── livewire/
│ │ ├── form.blade.php
│ │ └── wave/
│ │ └── deploy-to-do.blade.php
│ └── vendor/
│ ├── mail/
│ │ ├── html/
│ │ │ ├── button.blade.php
│ │ │ ├── footer.blade.php
│ │ │ ├── header.blade.php
│ │ │ ├── layout.blade.php
│ │ │ ├── message.blade.php
│ │ │ ├── panel.blade.php
│ │ │ ├── promotion/
│ │ │ │ └── button.blade.php
│ │ │ ├── promotion.blade.php
│ │ │ ├── subcopy.blade.php
│ │ │ ├── table.blade.php
│ │ │ └── themes/
│ │ │ └── default.css
│ │ ├── markdown/
│ │ │ ├── button.blade.php
│ │ │ ├── footer.blade.php
│ │ │ ├── header.blade.php
│ │ │ ├── layout.blade.php
│ │ │ ├── message.blade.php
│ │ │ ├── panel.blade.php
│ │ │ ├── promotion/
│ │ │ │ └── button.blade.php
│ │ │ ├── promotion.blade.php
│ │ │ ├── subcopy.blade.php
│ │ │ └── table.blade.php
│ │ └── text/
│ │ ├── button.blade.php
│ │ ├── footer.blade.php
│ │ ├── header.blade.php
│ │ ├── layout.blade.php
│ │ ├── message.blade.php
│ │ ├── panel.blade.php
│ │ ├── subcopy.blade.php
│ │ └── table.blade.php
│ └── notifications/
│ └── email.blade.php
├── routes/
│ ├── api.php
│ ├── console.php
│ └── web.php
├── storage/
│ ├── app/
│ │ └── private/
│ │ └── .gitignore
│ ├── dump.sql
│ ├── framework/
│ │ ├── .gitignore
│ │ ├── cache/
│ │ │ └── .gitignore
│ │ ├── sessions/
│ │ │ └── .gitignore
│ │ ├── testing/
│ │ │ └── .gitignore
│ │ └── views/
│ │ └── .gitignore
│ ├── logs/
│ │ └── .gitignore
│ └── wave-svg.sketch
├── tailwind.config.js
├── tests/
│ ├── Datasets/
│ │ ├── AuthRoutes.php
│ │ └── Routes.php
│ ├── Feature/
│ │ ├── AccountDeletionTest.php
│ │ ├── ActivityLogCleanupTest.php
│ │ ├── ActivityLogTest.php
│ │ ├── ApiKeyTest.php
│ │ ├── ChangelogTest.php
│ │ ├── DataExportTest.php
│ │ ├── HomeTest.php
│ │ ├── NotificationControllerTest.php
│ │ ├── NotificationPreferencesTest.php
│ │ ├── PageTest.php
│ │ ├── PasswordValidationTest.php
│ │ ├── PlanFeatureLimitsTest.php
│ │ ├── PlanSwitchingTest.php
│ │ ├── PostResourceTest.php
│ │ ├── PrivacySettingsTest.php
│ │ ├── RouteTest.php
│ │ ├── SocialLinksTest.php
│ │ ├── StorageConfigurationTest.php
│ │ ├── StripeWebhookTest.php
│ │ ├── SubscriptionCancellationTest.php
│ │ ├── UsernameUpdateTest.php
│ │ └── WaveStatsCommandTest.php
│ ├── Pest.php
│ ├── TestCase.php
│ └── Unit/
│ └── PluginAutoloaderTest.php
├── theme.json
├── vite.config.js
└── wave/
├── composer.json
├── database/
│ └── migrations/
│ ├── 2024_03_29_225419_create_users_table.php
│ ├── 2024_03_29_225420_create_permission_roles_tables.php
│ ├── 2024_03_29_225435_create_categories_table.php
│ ├── 2024_03_29_225523_create_themes_table.php
│ ├── 2024_03_29_225656_create_changelogs_table.php
│ ├── 2024_03_29_225657_create_changelog_user_table.php
│ ├── 2024_03_29_225729_create_api_keys_table.php
│ ├── 2024_03_29_225928_create_notifications_table.php
│ ├── 2024_03_29_230148_create_pages_table.php
│ ├── 2024_03_29_230255_create_password_resets_table.php
│ ├── 2024_03_29_230312_create_plans_table.php
│ ├── 2024_03_29_230313_create_subscriptions_table.php
│ ├── 2024_03_29_230316_create_posts_table.php
│ ├── 2024_03_29_230531_create_settings_table.php
│ ├── 2024_03_29_230541_create_theme_options_table.php
│ ├── 2024_03_29_230648_create_key_values_table.php
│ ├── 2024_06_26_224315_create_forms_table.php
│ ├── 2025_01_01_000000_add_notification_preferences_to_users_table.php
│ ├── 2025_01_01_100000_add_social_links_to_users_table.php
│ ├── 2025_01_22_000000_add_limits_to_plans_table.php
│ ├── 2025_10_14_113035_add_sort_order_column.php
│ ├── 2025_10_14_143501_add_currency_column.php
│ ├── 2025_12_31_110946_add_deletion_fields_to_users_table.php
│ ├── 2025_12_31_120750_create_activity_logs_table.php
│ └── 2025_12_31_144607_add_privacy_settings_to_users_table.php
├── resources/
│ ├── demo/
│ │ └── builds/
│ │ └── vite.config.js
│ └── views/
│ ├── admin/
│ │ ├── components/
│ │ │ └── label.blade.php
│ │ ├── logo-dark.blade.php
│ │ └── logo.blade.php
│ ├── admin-boxes.blade.php
│ ├── components/
│ │ └── billing/
│ │ ├── billing_cycle_toggle.blade.php
│ │ └── button.blade.php
│ ├── install.blade.php
│ ├── livewire/
│ │ └── billing/
│ │ ├── checkout.blade.php
│ │ └── update.blade.php
│ ├── media/
│ │ ├── index.blade.php
│ │ └── views/
│ │ ├── active-file.blade.php
│ │ ├── breadcrumbs.blade.php
│ │ ├── files.blade.php
│ │ ├── full-screen-file-modal.blade.php
│ │ ├── header/
│ │ │ ├── add-folder.blade.php
│ │ │ ├── delete.blade.php
│ │ │ ├── move.blade.php
│ │ │ └── search.blade.php
│ │ └── header.blade.php
│ ├── partials/
│ │ └── billing/
│ │ └── paddle_init.blade.php
│ ├── premium-theme-message.blade.php
│ ├── premium-theme-messages/
│ │ ├── 1.blade.php
│ │ ├── 2.blade.php
│ │ ├── 3.blade.php
│ │ ├── 4.blade.php
│ │ ├── 5.blade.php
│ │ ├── 6.blade.php
│ │ ├── 7.blade.php
│ │ ├── 8.blade.php
│ │ └── 9.blade.php
│ └── welcome.blade.php
├── routes/
│ ├── api.php
│ └── web.php
├── src/
│ ├── Actions/
│ │ ├── Billing/
│ │ │ └── Paddle/
│ │ │ └── AddSubscriptionIdFromTransaction.php
│ │ └── Reset.php
│ ├── ActivityLog.php
│ ├── ApiKey.php
│ ├── Category.php
│ ├── Changelog.php
│ ├── Console/
│ │ └── Commands/
│ │ ├── CancelExpiredSubscriptions.php
│ │ ├── CleanOldActivityLogs.php
│ │ ├── CreatePluginCommand.php
│ │ ├── ProcessScheduledAccountDeletions.php
│ │ └── WaveStats.php
│ ├── Facades/
│ │ └── Wave.php
│ ├── Form.php
│ ├── FormEntry.php
│ ├── Helpers/
│ │ └── globals.php
│ ├── Http/
│ │ ├── Controllers/
│ │ │ ├── API/
│ │ │ │ └── AuthController.php
│ │ │ ├── Billing/
│ │ │ │ ├── Paddle.php
│ │ │ │ ├── Stripe.php
│ │ │ │ └── Webhooks/
│ │ │ │ ├── PaddleWebhook.php
│ │ │ │ └── StripeWebhook.php
│ │ │ ├── ChangelogController.php
│ │ │ ├── LogoutController.php
│ │ │ ├── NotificationController.php
│ │ │ ├── PageController.php
│ │ │ ├── PluginImageController.php
│ │ │ ├── SubscriptionController.php
│ │ │ └── ThemeImageController.php
│ │ ├── Livewire/
│ │ │ ├── Billing/
│ │ │ │ ├── Checkout.php
│ │ │ │ └── Update.php
│ │ │ └── Notifications/
│ │ │ └── Notification.php
│ │ └── Middleware/
│ │ ├── AdminMiddleware.php
│ │ ├── InstallMiddleware.php
│ │ ├── Subscribed.php
│ │ ├── ThemeDemoMiddleware.php
│ │ ├── TokenMiddleware.php
│ │ ├── VerifyPaddleWebhookSignature.php
│ │ └── VerifyWebhook.php
│ ├── Jobs/
│ │ └── CreateActivityLog.php
│ ├── Notifications/
│ │ └── VerifyEmail.php
│ ├── Overrides/
│ │ └── Vite.php
│ ├── Page.php
│ ├── Plan.php
│ ├── Plugins/
│ │ ├── Plugin.php
│ │ ├── PluginAutoloader.php
│ │ ├── PluginManager.php
│ │ └── PluginServiceProvider.php
│ ├── Post.php
│ ├── ProfileKeyValue.php
│ ├── Setting.php
│ ├── Subscription.php
│ ├── Theme.php
│ ├── ThemeOptions.php
│ ├── Traits/
│ │ ├── HasDynamicFields.php
│ │ ├── HasPlanFeatures.php
│ │ └── HasProfileKeyValues.php
│ ├── Translation.php
│ ├── User.php
│ ├── Wave.php
│ └── WaveServiceProvider.php
└── wave.json
Showing preview only (1,059K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (11465 symbols across 213 files)
FILE: app/Console/Commands/CreateRole.php
class CreateRole (line 10) | class CreateRole extends Command
method handle (line 16) | public function handle(): int
method assignPermissions (line 52) | protected function assignPermissions(Role $role)
FILE: app/Console/Commands/CreateUser.php
class CreateUser (line 12) | class CreateUser extends Command
method handle (line 18) | public function handle(): int
FILE: app/Filament/Pages/Dashboard.php
class Dashboard (line 8) | class Dashboard extends \Filament\Pages\Dashboard
method panel (line 12) | public function panel(Panel $panel): Panel
FILE: app/Filament/Pages/Media.php
class Media (line 9) | class Media extends Page
method getMaxContentWidth (line 17) | public function getMaxContentWidth(): Width|string|null
FILE: app/Filament/Pages/Plugins.php
class Plugins (line 12) | class Plugins extends Page
method mount (line 22) | public function mount()
method refreshPlugins (line 27) | private function refreshPlugins()
method getPluginsFromFolder (line 32) | private function getPluginsFromFolder()
method isPluginActive (line 66) | private function isPluginActive($folder)
method getInstalledPlugins (line 73) | private function getInstalledPlugins()
method updateInstalledPlugins (line 80) | private function updateInstalledPlugins($plugins)
method activate (line 86) | public function activate($pluginFolder)
method runPostActivationCommands (line 104) | private function runPostActivationCommands($pluginFolder)
method deactivate (line 135) | public function deactivate($pluginFolder)
method deletePlugin (line 149) | public function deletePlugin($pluginFolder)
FILE: app/Filament/Pages/Themes.php
class Themes (line 12) | class Themes extends Page
method mount (line 24) | public function mount()
method refreshThemes (line 32) | private function refreshThemes()
method getThemesFromFolder (line 43) | private function getThemesFromFolder()
method installThemes (line 70) | private function installThemes()
method activate (line 98) | public function activate($theme_folder)
method writeThemeJson (line 130) | private function writeThemeJson($themeName)
method deactivateThemes (line 137) | private function deactivateThemes()
method deleteTheme (line 142) | public function deleteTheme($theme_folder)
FILE: app/Filament/Resources/Categories/CategoryResource.php
class CategoryResource (line 21) | class CategoryResource extends Resource
method form (line 29) | public static function form(Schema $schema): Schema
method table (line 51) | public static function table(Table $table): Table
method getRelations (line 82) | public static function getRelations(): array
method getPages (line 89) | public static function getPages(): array
FILE: app/Filament/Resources/Categories/Pages/CreateCategory.php
class CreateCategory (line 8) | class CreateCategory extends CreateRecord
FILE: app/Filament/Resources/Categories/Pages/EditCategory.php
class EditCategory (line 9) | class EditCategory extends EditRecord
method getHeaderActions (line 13) | protected function getHeaderActions(): array
FILE: app/Filament/Resources/Categories/Pages/ListCategories.php
class ListCategories (line 9) | class ListCategories extends ListRecords
method getHeaderActions (line 13) | protected function getHeaderActions(): array
FILE: app/Filament/Resources/Changelogs/ChangelogResource.php
class ChangelogResource (line 21) | class ChangelogResource extends Resource
method form (line 29) | public static function form(Schema $schema): Schema
method table (line 45) | public static function table(Table $table): Table
method getRelations (line 76) | public static function getRelations(): array
method getPages (line 83) | public static function getPages(): array
FILE: app/Filament/Resources/Changelogs/Pages/CreateChangelog.php
class CreateChangelog (line 8) | class CreateChangelog extends CreateRecord
FILE: app/Filament/Resources/Changelogs/Pages/EditChangelog.php
class EditChangelog (line 9) | class EditChangelog extends EditRecord
method getHeaderActions (line 13) | protected function getHeaderActions(): array
FILE: app/Filament/Resources/Changelogs/Pages/ListChangelogs.php
class ListChangelogs (line 9) | class ListChangelogs extends ListRecords
method getHeaderActions (line 13) | protected function getHeaderActions(): array
FILE: app/Filament/Resources/Forms/FormsResource.php
class FormsResource (line 26) | class FormsResource extends Resource
method form (line 36) | public static function form(Schema $schema): Schema
method table (line 74) | public static function table(Table $table): Table
method getRelations (line 96) | public static function getRelations(): array
method getPages (line 103) | public static function getPages(): array
FILE: app/Filament/Resources/Forms/Pages/CreateForms.php
class CreateForms (line 8) | class CreateForms extends CreateRecord
method mutateFormDataBeforeCreate (line 12) | protected function mutateFormDataBeforeCreate(array $data): array
FILE: app/Filament/Resources/Forms/Pages/EditForms.php
class EditForms (line 9) | class EditForms extends EditRecord
method getHeaderActions (line 13) | protected function getHeaderActions(): array
method mutateFormDataBeforeFill (line 20) | protected function mutateFormDataBeforeFill(array $data): array
FILE: app/Filament/Resources/Forms/Pages/ListForms.php
class ListForms (line 9) | class ListForms extends ListRecords
method getHeaderActions (line 13) | protected function getHeaderActions(): array
FILE: app/Filament/Resources/Pages/PageResource.php
class PageResource (line 27) | class PageResource extends Resource
method form (line 35) | public static function form(Schema $schema): Schema
method table (line 81) | public static function table(Table $table): Table
method getRelations (line 113) | public static function getRelations(): array
method getPages (line 120) | public static function getPages(): array
FILE: app/Filament/Resources/Pages/Pages/CreatePage.php
class CreatePage (line 8) | class CreatePage extends CreateRecord
FILE: app/Filament/Resources/Pages/Pages/EditPage.php
class EditPage (line 9) | class EditPage extends EditRecord
method getHeaderActions (line 13) | protected function getHeaderActions(): array
FILE: app/Filament/Resources/Pages/Pages/ListPages.php
class ListPages (line 9) | class ListPages extends ListRecords
method getHeaderActions (line 13) | protected function getHeaderActions(): array
FILE: app/Filament/Resources/Permissions/Pages/CreatePermission.php
class CreatePermission (line 8) | class CreatePermission extends CreateRecord
FILE: app/Filament/Resources/Permissions/Pages/EditPermission.php
class EditPermission (line 9) | class EditPermission extends EditRecord
method getHeaderActions (line 13) | protected function getHeaderActions(): array
FILE: app/Filament/Resources/Permissions/Pages/ListPermissions.php
class ListPermissions (line 9) | class ListPermissions extends ListRecords
method getHeaderActions (line 13) | protected function getHeaderActions(): array
FILE: app/Filament/Resources/Permissions/PermissionResource.php
class PermissionResource (line 19) | class PermissionResource extends Resource
method form (line 27) | public static function form(Schema $schema): Schema
method table (line 40) | public static function table(Table $table): Table
method getRelations (line 70) | public static function getRelations(): array
method getPages (line 77) | public static function getPages(): array
FILE: app/Filament/Resources/Plans/Pages/CreatePlan.php
class CreatePlan (line 8) | class CreatePlan extends CreateRecord
FILE: app/Filament/Resources/Plans/Pages/EditPlan.php
class EditPlan (line 9) | class EditPlan extends EditRecord
method getHeaderActions (line 13) | protected function getHeaderActions(): array
FILE: app/Filament/Resources/Plans/Pages/ListPlans.php
class ListPlans (line 9) | class ListPlans extends ListRecords
method getHeaderActions (line 13) | protected function getHeaderActions(): array
FILE: app/Filament/Resources/Plans/PlanResource.php
class PlanResource (line 28) | class PlanResource extends Resource
method form (line 36) | public static function form(Schema $schema): Schema
method table (line 127) | public static function table(Table $table): Table
method getRelations (line 167) | public static function getRelations(): array
method getPages (line 174) | public static function getPages(): array
FILE: app/Filament/Resources/Posts/Pages/CreatePost.php
class CreatePost (line 8) | class CreatePost extends CreateRecord
FILE: app/Filament/Resources/Posts/Pages/EditPost.php
class EditPost (line 9) | class EditPost extends EditRecord
method getHeaderActions (line 13) | protected function getHeaderActions(): array
FILE: app/Filament/Resources/Posts/Pages/ListPosts.php
class ListPosts (line 9) | class ListPosts extends ListRecords
method getHeaderActions (line 13) | protected function getHeaderActions(): array
FILE: app/Filament/Resources/Posts/PostResource.php
class PostResource (line 31) | class PostResource extends Resource
method form (line 39) | public static function form(Schema $schema): Schema
method table (line 100) | public static function table(Table $table): Table
method getRelations (line 139) | public static function getRelations(): array
method getPages (line 146) | public static function getPages(): array
FILE: app/Filament/Resources/Roles/Pages/CreateRole.php
class CreateRole (line 8) | class CreateRole extends CreateRecord
FILE: app/Filament/Resources/Roles/Pages/EditRole.php
class EditRole (line 9) | class EditRole extends EditRecord
method getHeaderActions (line 13) | protected function getHeaderActions(): array
FILE: app/Filament/Resources/Roles/Pages/ListRoles.php
class ListRoles (line 9) | class ListRoles extends ListRecords
method getHeaderActions (line 13) | protected function getHeaderActions(): array
FILE: app/Filament/Resources/Roles/RoleResource.php
class RoleResource (line 20) | class RoleResource extends Resource
method form (line 28) | public static function form(Schema $schema): Schema
method table (line 45) | public static function table(Table $table): Table
method getRelations (line 76) | public static function getRelations(): array
method getPages (line 83) | public static function getPages(): array
FILE: app/Filament/Resources/Settings/Pages/CreateSetting.php
class CreateSetting (line 9) | class CreateSetting extends CreateRecord
method afterCreate (line 13) | protected function afterCreate(): void
FILE: app/Filament/Resources/Settings/Pages/EditSetting.php
class EditSetting (line 10) | class EditSetting extends EditRecord
method getHeaderActions (line 14) | protected function getHeaderActions(): array
method afterSave (line 21) | protected function afterSave(): void
FILE: app/Filament/Resources/Settings/Pages/ListSettings.php
class ListSettings (line 10) | class ListSettings extends ListRecords
method getHeaderActions (line 14) | protected function getHeaderActions(): array
method afterDelete (line 21) | protected function afterDelete(): void
FILE: app/Filament/Resources/Settings/SettingResource.php
class SettingResource (line 21) | class SettingResource extends Resource
method form (line 29) | public static function form(Schema $schema): Schema
method table (line 56) | public static function table(Table $table): Table
method getRelations (line 94) | public static function getRelations(): array
method getPages (line 101) | public static function getPages(): array
FILE: app/Filament/Resources/Users/Pages/CreateUser.php
class CreateUser (line 8) | class CreateUser extends CreateRecord
FILE: app/Filament/Resources/Users/Pages/EditUser.php
class EditUser (line 9) | class EditUser extends EditRecord
method getHeaderActions (line 13) | protected function getHeaderActions(): array
FILE: app/Filament/Resources/Users/Pages/ListUsers.php
class ListUsers (line 9) | class ListUsers extends ListRecords
method getHeaderActions (line 13) | protected function getHeaderActions(): array
FILE: app/Filament/Resources/Users/UserResource.php
class UserResource (line 27) | class UserResource extends Resource
method form (line 35) | public static function form(Schema $schema): Schema
method table (line 71) | public static function table(Table $table): Table
method getRelations (line 102) | public static function getRelations(): array
method getPages (line 109) | public static function getPages(): array
FILE: app/Filament/Widgets/DashboardWidget.php
class DashboardWidget (line 7) | class DashboardWidget extends Widget
FILE: app/Http/Controllers/Controller.php
class Controller (line 5) | abstract class Controller {}
FILE: app/Listeners/LogSuccessfulLogin.php
class LogSuccessfulLogin (line 7) | class LogSuccessfulLogin
method __construct (line 12) | public function __construct()
method handle (line 20) | public function handle(Login $event): void
FILE: app/Listeners/LogSuccessfulLogout.php
class LogSuccessfulLogout (line 7) | class LogSuccessfulLogout
method __construct (line 12) | public function __construct()
method handle (line 20) | public function handle(Logout $event): void
FILE: app/Models/Category.php
class Category (line 7) | class Category extends Model {}
FILE: app/Models/Forms.php
class Forms (line 8) | class Forms extends Model
method casts (line 29) | protected function casts(): array
FILE: app/Models/Post.php
class Post (line 7) | class Post extends WavePost
FILE: app/Models/User.php
class User (line 14) | class User extends WaveUser
method casts (line 25) | protected function casts(): array
method activityLogs (line 35) | public function activityLogs(): HasMany
method boot (line 40) | protected static function boot()
FILE: app/Notifications/TestNotification.php
class TestNotification (line 9) | class TestNotification extends Notification
method __construct (line 16) | public function __construct()
method via (line 26) | public function via(object $notifiable): array
method toMail (line 34) | public function toMail(object $notifiable): MailMessage
method toArray (line 47) | public function toArray($notifiable): array
FILE: app/Providers/AppServiceProvider.php
class AppServiceProvider (line 19) | class AppServiceProvider extends ServiceProvider
method register (line 33) | public function register(): void
method boot (line 41) | public function boot(): void
method setSchemaDefaultLength (line 84) | private function setSchemaDefaultLength(): void
method bootRoute (line 92) | public function bootRoute()
FILE: app/Providers/Filament/AdminPanelProvider.php
class AdminPanelProvider (line 24) | class AdminPanelProvider extends PanelProvider
method getNavigationIcon (line 28) | public static function getNavigationIcon(): ?string
method panel (line 33) | public function panel(Panel $panel): Panel
FILE: app/Providers/FolioServiceProvider.php
class FolioServiceProvider (line 7) | class FolioServiceProvider extends ServiceProvider
method register (line 12) | public function register(): void
method boot (line 20) | public function boot(): void {}
FILE: app/Providers/VoltServiceProvider.php
class VoltServiceProvider (line 8) | class VoltServiceProvider extends ServiceProvider
method register (line 13) | public function register(): void
method boot (line 21) | public function boot(): void
FILE: database/factories/CategoryFactory.php
class CategoryFactory (line 11) | class CategoryFactory extends Factory
method definition (line 20) | public function definition(): array
FILE: database/factories/PostFactory.php
class PostFactory (line 13) | class PostFactory extends Factory
method definition (line 22) | public function definition(): array
FILE: database/factories/UserFactory.php
class UserFactory (line 8) | class UserFactory extends Factory
method definition (line 13) | public function definition(): array
FILE: database/migrations/2024_03_29_000000_create_cache_table.php
method up (line 12) | public function up(): void
method down (line 30) | public function down(): void
FILE: database/migrations/2024_04_24_000001_add_user_social_provider_table.php
method up (line 12) | public function up(): void
method down (line 37) | public function down(): void
FILE: database/migrations/2024_04_24_000002_update_passwords_field_to_be_nullable.php
method up (line 13) | public function up(): void
method down (line 24) | public function down(): void
FILE: database/migrations/2024_05_07_000003_add_two_factor_auth_columns.php
method up (line 12) | public function up(): void
method down (line 40) | public function down(): void
FILE: database/migrations/2024_07_31_133819_add_description_to_roles_table.php
method up (line 12) | public function up(): void
method down (line 22) | public function down(): void
FILE: database/migrations/2025_02_19_101241_change_user_social_provider_table.php
method up (line 12) | public function up(): void
method down (line 23) | public function down(): void
FILE: database/seeders/ActivityLogSeeder.php
class ActivityLogSeeder (line 9) | class ActivityLogSeeder extends Seeder
method run (line 11) | public function run(): void
FILE: database/seeders/ApiKeysTableSeeder.php
class ApiKeysTableSeeder (line 8) | class ApiKeysTableSeeder extends Seeder
method run (line 13) | public function run(): void
FILE: database/seeders/CategoriesTableSeeder.php
class CategoriesTableSeeder (line 8) | class CategoriesTableSeeder extends Seeder
method run (line 13) | public function run(): void
FILE: database/seeders/ChangelogsTableSeeder.php
class ChangelogsTableSeeder (line 8) | class ChangelogsTableSeeder extends Seeder
method run (line 13) | public function run(): void
FILE: database/seeders/DatabaseSeeder.php
class DatabaseSeeder (line 9) | class DatabaseSeeder extends Seeder
method run (line 14) | public function run(): void
function fixPostgresSequence (line 38) | function fixPostgresSequence()
FILE: database/seeders/ModelHasRolesTableSeeder.php
class ModelHasRolesTableSeeder (line 8) | class ModelHasRolesTableSeeder extends Seeder
method run (line 13) | public function run(): void
FILE: database/seeders/NotificationsTableSeeder.php
class NotificationsTableSeeder (line 8) | class NotificationsTableSeeder extends Seeder
method run (line 13) | public function run(): void
FILE: database/seeders/PagesTableSeeder.php
class PagesTableSeeder (line 8) | class PagesTableSeeder extends Seeder
method run (line 13) | public function run(): void
FILE: database/seeders/PasswordResetsTableSeeder.php
class PasswordResetsTableSeeder (line 8) | class PasswordResetsTableSeeder extends Seeder
method run (line 13) | public function run(): void
FILE: database/seeders/PermissionRoleTableSeeder.php
class PermissionRoleTableSeeder (line 8) | class PermissionRoleTableSeeder extends Seeder
method run (line 13) | public function run(): void
FILE: database/seeders/PermissionsTableSeeder.php
class PermissionsTableSeeder (line 8) | class PermissionsTableSeeder extends Seeder
method run (line 13) | public function run(): void
FILE: database/seeders/PlansTableSeeder.php
class PlansTableSeeder (line 8) | class PlansTableSeeder extends Seeder
method run (line 13) | public function run(): void
FILE: database/seeders/PostsTableSeeder.php
class PostsTableSeeder (line 8) | class PostsTableSeeder extends Seeder
method run (line 13) | public function run(): void
FILE: database/seeders/ProfileKeyValuesTableSeeder.php
class ProfileKeyValuesTableSeeder (line 8) | class ProfileKeyValuesTableSeeder extends Seeder
method run (line 13) | public function run(): void
FILE: database/seeders/RolesTableSeeder.php
class RolesTableSeeder (line 8) | class RolesTableSeeder extends Seeder
method run (line 13) | public function run(): void
FILE: database/seeders/SettingsTableSeeder.php
class SettingsTableSeeder (line 8) | class SettingsTableSeeder extends Seeder
method run (line 13) | public function run(): void
FILE: database/seeders/ThemesTableSeeder.php
class ThemesTableSeeder (line 8) | class ThemesTableSeeder extends Seeder
method run (line 13) | public function run(): void
FILE: database/seeders/TranslationsTableSeeder.php
class TranslationsTableSeeder (line 8) | class TranslationsTableSeeder extends Seeder
method run (line 13) | public function run(): void
FILE: database/seeders/UsersTableSeeder.php
class UsersTableSeeder (line 8) | class UsersTableSeeder extends Seeder
method run (line 13) | public function run(): void
FILE: public/composer/install.php
function copyEnv (line 15) | function copyEnv($projectRoot)
function redirectIfNotHomepage (line 26) | function redirectIfNotHomepage()
function getOperatingSystem (line 39) | function getOperatingSystem()
function convertSlashes (line 54) | function convertSlashes($path)
function runCmd (line 136) | function runCmd($cmd)
FILE: public/js/filament/actions/actions.js
method init (line 1) | init(){window.addEventListener("sync-action-modals",t=>{t.detail.id===e&...
method syncActionModals (line 1) | syncActionModals(t){if(this.actionNestingIndex===t){this.actionNestingIn...
method generateModalId (line 1) | generateModalId(t){return`fi-${e}-action-`+t}
method openModal (line 1) | openModal(){let t=this.generateModalId(this.actionNestingIndex);document...
method closeModal (line 1) | closeModal(){let t=this.generateModalId(this.actionNestingIndex);documen...
FILE: public/js/filament/filament/app.js
function P (line 1) | function P(e,r,s){if(e.addEventListener){e.addEventListener(r,s,!1);retu...
function T (line 1) | function T(e){if(e.type=="keypress"){var r=String.fromCharCode(e.which);...
function J (line 1) | function J(e,r){return e.sort().join(",")===r.sort().join(",")}
function H (line 1) | function H(e){var r=[];return e.shiftKey&&r.push("shift"),e.altKey&&r.pu...
function F (line 1) | function F(e){if(e.preventDefault){e.preventDefault();return}e.returnVal...
function B (line 1) | function B(e){if(e.stopPropagation){e.stopPropagation();return}e.cancelB...
function C (line 1) | function C(e){return e=="shift"||e=="ctrl"||e=="alt"||e=="meta"}
function X (line 1) | function X(){if(!A){A={};for(var e in c)e>95&&e<112||c.hasOwnProperty(e)...
function Y (line 1) | function Y(e,r,s){return s||(s=X()[e]?"keydown":"keypress"),s=="keypress...
function Q (line 1) | function Q(e){return e==="+"?["+"]:(e=e.replace(/\+{2}/g,"+plus"),e.spli...
function R (line 1) | function R(e,r){var s,h,k,S=[];for(s=Q(e),k=0;k<s.length;++k)h=s[k],G[h]...
function I (line 1) | function I(e,r){return e===null||e===l?!1:e===r?!0:I(e.parentNode,r)}
function v (line 1) | function v(e){var r=this;if(e=e||l,!(r instanceof v))return new v(e);r.t...
method init (line 1) | init(){this.resizeObserver=null,this.setUpResizeObserver(),document.addE...
method setUpResizeObserver (line 1) | setUpResizeObserver(){this.resizeObserver&&this.resizeObserver.disconnec...
method groupIsCollapsed (line 1) | groupIsCollapsed(t){return this.collapsedGroups.includes(t)}
method collapseGroup (line 1) | collapseGroup(t){this.collapsedGroups.includes(t)||(this.collapsedGroups...
method toggleCollapsedGroup (line 1) | toggleCollapsedGroup(t){this.collapsedGroups=this.collapsedGroups.includ...
method close (line 1) | close(){this.isOpen=!1,window.innerWidth>=1024&&(this.isOpenDesktop=!1)}
method open (line 1) | open(){this.isOpen=!0,window.innerWidth>=1024&&(this.isOpenDesktop=!0)}
FILE: public/js/filament/filament/echo.js
function a (line 1) | function a(c){if(h[c])return h[c].exports;var s=h[c]={i:c,l:!1,exports:{...
function w (line 1) | function w(){this.constructor=v}
function b (line 1) | function b(v){v===void 0&&(v="="),this._paddingCharacter=v}
function N (line 1) | function N(b){return d.encode(b)}
function P (line 1) | function P(b){return d.decode(b)}
function v (line 1) | function v(){return b!==null&&b.apply(this,arguments)||this}
function C (line 1) | function C(b){return S.encode(b)}
function x (line 1) | function x(b){return S.decode(b)}
function f (line 1) | function f(P){for(var T=new Uint8Array(d(P)),S=0,C=0;C<P.length;C++){var...
function d (line 1) | function d(P){for(var T=0,S=0;S<P.length;S++){var C=P.charCodeAt(S);if(C...
function N (line 1) | function N(P){for(var T=[],S=0;S<P.length;S++){var C=P[S];if(C&128){var ...
function e (line 1) | function e(t,n){this.lastId=0,this.prefix=t,this.name=n}
function e (line 1) | function e(t){this.options=t,this.receivers=t.receivers||s,this.loading={}}
function r (line 1) | function r(){this.constructor=t}
function t (line 1) | function t(n){var r=this.constructor,i=e.call(this,n)||this;return Objec...
function t (line 1) | function t(n){var r=this.constructor,i=e.call(this,n)||this;return Objec...
function t (line 1) | function t(n){var r=this.constructor,i=e.call(this,n)||this;return Objec...
function t (line 1) | function t(n){var r=this.constructor,i=e.call(this,n)||this;return Objec...
function t (line 1) | function t(n){var r=this.constructor,i=e.call(this,n)||this;return Objec...
function t (line 1) | function t(n){var r=this.constructor,i=e.call(this,n)||this;return Objec...
function t (line 1) | function t(n){var r=this.constructor,i=e.call(this,n)||this;return Objec...
function t (line 1) | function t(n){var r=this.constructor,i=e.call(this,n)||this;return Objec...
function t (line 1) | function t(n,r){var i=this.constructor,o=e.call(this,r)||this;return o.s...
function Ce (line 1) | function Ce(e){return Ee(Oe(e))}
function e (line 1) | function e(t,n,r,i){var o=this;this.clear=n,this.timer=t(function(){o.ti...
function r (line 1) | function r(){this.constructor=t}
function Re (line 1) | function Re(e){window.clearTimeout(e)}
function Ie (line 1) | function Ie(e){window.clearInterval(e)}
function t (line 1) | function t(n,r){return e.call(this,setTimeout,Re,n,function(i){return r(...
function t (line 1) | function t(n,r){return e.call(this,setInterval,Ie,n,function(i){return r...
function U (line 1) | function U(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n...
function qe (line 1) | function qe(){for(var e=["Pusher"],t=0;t<arguments.length;t++)typeof arg...
function qt (line 1) | function qt(e,t){var n=Array.prototype.indexOf;if(e===null)return-1;if(n...
function W (line 1) | function W(e,t){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)...
function Ut (line 1) | function Ut(e){var t=[];return W(e,function(n,r){t.push(r)}),t}
function Ue (line 1) | function Ue(e){var t=[];return W(e,function(n){t.push(n)}),t}
function rt (line 1) | function rt(e,t,n){for(var r=0;r<e.length;r++)t.call(n||window,e[r],r,e)}
function Dt (line 1) | function Dt(e,t){for(var n=[],r=0;r<e.length;r++)n.push(t(e[r],r,e,n));r...
function De (line 1) | function De(e,t){var n={};return W(e,function(r,i){n[i]=t(r)}),n}
function Ht (line 1) | function Ht(e,t){t=t||function(i){return!!i};for(var n=[],r=0;r<e.length...
function Mt (line 1) | function Mt(e,t){var n={};return W(e,function(r,i){(t&&t(r,i,e,n)||r)&&(...
function He (line 1) | function He(e){var t=[];return W(e,function(n,r){t.push([r,n])}),t}
function zt (line 1) | function zt(e,t){for(var n=0;n<e.length;n++)if(t(e[n],n,e))return!0;retu...
function Me (line 1) | function Me(e,t){for(var n=0;n<e.length;n++)if(!t(e[n],n,e))return!1;ret...
function ze (line 1) | function ze(e){return De(e,function(t){return typeof t=="object"&&(t=ut(...
function Fe (line 1) | function Fe(e){var t=Mt(e,function(r){return r!==void 0}),n=Dt(He(ze(t))...
function Be (line 1) | function Be(e){var t=[],n=[];return(function r(i,o){var u,p,_;switch(typ...
function ut (line 1) | function ut(e){try{return JSON.stringify(e)}catch{return JSON.stringify(...
function e (line 1) | function e(){this.globalLog=function(t){window.console&&window.console.l...
function e (line 1) | function e(t){this.src=t}
function e (line 1) | function e(t,n){this.url=t,this.data=n}
function yt (line 1) | function yt(e,t,n){var r=e+(t.useTLS?"s":""),i=t.useTLS?t.hostTLS:t.host...
function gt (line 1) | function gt(e,t){var n="/app/"+e,r="?protocol="+d.PROTOCOL+"&client=js&v...
function e (line 1) | function e(){this._callbacks={}}
function _t (line 1) | function _t(e){return"_"+e}
function e (line 1) | function e(t){this.callbacks=new on,this.global_callbacks=[],this.failTh...
function r (line 1) | function r(){this.constructor=t}
function t (line 1) | function t(n,r,i,o,u){var p=e.call(this)||this;return p.initialize=m.tra...
function e (line 1) | function e(t){this.hooks=t}
function r (line 1) | function r(){this.constructor=t}
function t (line 1) | function t(){var n=e.call(this)||this,r=n;return window.addEventListener...
function e (line 1) | function e(t,n,r){this.manager=t,this.transport=n,this.minPingDelay=r.mi...
function r (line 1) | function r(){this.constructor=t}
function t (line 1) | function t(n,r){var i=e.call(this)||this;return i.id=n,i.transport=r,i.a...
function e (line 1) | function e(t,n){this.transport=t,this.callback=n,this.bindListeners()}
function e (line 1) | function e(t,n){this.timeline=t,this.options=n||{}}
function r (line 1) | function r(){this.constructor=t}
function t (line 1) | function t(n,r){var i=e.call(this,function(o,u){A.debug("No callbacks on...
function r (line 1) | function r(){this.constructor=t}
function t (line 1) | function t(){return e!==null&&e.apply(this,arguments)||this}
function e (line 1) | function e(){this.reset()}
function r (line 1) | function r(){this.constructor=t}
function i (line 1) | function i(o){return o instanceof n?o:new n(function(u){u(o)})}
function p (line 1) | function p(k){try{g(r.next(k))}catch(E){u(E)}}
function _ (line 1) | function _(k){try{g(r.throw(k))}catch(E){u(E)}}
function g (line 1) | function g(k){k.done?o(k.value):i(k.value).then(p,_)}
function p (line 1) | function p(g){return function(k){return _([g,k])}}
function _ (line 1) | function _(g){if(r)throw new TypeError("Generator is already executing."...
function t (line 1) | function t(n,r){var i=e.call(this,n,r)||this;return i.members=new qn,i}
function r (line 1) | function r(){this.constructor=t}
function t (line 1) | function t(n,r,i){var o=e.call(this,n,r)||this;return o.key=null,o.nacl=...
function r (line 1) | function r(){this.constructor=t}
function t (line 1) | function t(n,r){var i=e.call(this)||this;i.state="initialized",i.connect...
function e (line 1) | function e(){this.channels={}}
function Yn (line 1) | function Yn(e,t){if(e.indexOf("private-encrypted-")===0){if(t.config.nac...
function e (line 1) | function e(t){this.options=t||{},this.livesLeft=this.options.lives||1/0}
function e (line 1) | function e(t,n){this.strategies=t,this.loop=!!n.loop,this.failFast=!!n.f...
function e (line 1) | function e(t){this.strategies=t}
function nr (line 1) | function nr(e,t,n){var r=Dt(e,function(i,o,u,p){return i.connect(t,n(o,p...
function rr (line 1) | function rr(e){return Me(e,function(t){return!!t.error})}
function ir (line 1) | function ir(e){!e.error&&!e.aborted&&(e.abort(),e.aborted=!0)}
function e (line 1) | function e(t,n,r){this.strategy=t,this.transports=n,this.ttl=r.ttl||1800...
function St (line 1) | function St(e){return"pusherTransport"+(e?"TLS":"NonTLS")}
function ar (line 1) | function ar(e){var t=m.getLocalStorage();if(t)try{var n=t[St(e)];if(n)re...
function cr (line 1) | function cr(e,t,n){var r=m.getLocalStorage();if(r)try{r[St(e)]=ut({times...
function Qt (line 1) | function Qt(e){var t=m.getLocalStorage();if(t)try{delete t[St(e)]}catch{}}
function e (line 1) | function e(t,n){var r=n.delay;this.strategy=t,this.options={delay:r}}
function e (line 1) | function e(t,n,r){this.test=t,this.trueBranch=n,this.falseBranch=r}
function e (line 1) | function e(t){this.strategy=t}
function ot (line 1) | function ot(e){return function(){return e.isSupported()}}
function i (line 1) | function i(ce,mi,wi,ki,Si){var ue=n(e,ce,mi,wi,ki,Si);return r[ce]=ue,ue}
function r (line 1) | function r(){this.constructor=t}
function t (line 1) | function t(n,r,i){var o=e.call(this)||this;return o.hooks=n,o.method=r,o...
function e (line 2) | function e(t,n){this.hooks=t,this.session=Yt(1e3)+"/"+xr(8),this.locatio...
function Cr (line 2) | function Cr(e){var t=/([^\?]*)\/*(\??.*)/.exec(e);return{base:t[1],query...
function Tr (line 2) | function Tr(e,t){return e.base+"/"+t+"/xhr_send"}
function Kt (line 2) | function Kt(e){var t=e.indexOf("?")===-1?"?":"&";return e+t+"t="+ +new D...
function Pr (line 2) | function Pr(e,t){var n=/(https?:\/\/)([^\/:]+)((\/|:)?.*)/.exec(e);retur...
function Yt (line 2) | function Yt(e){return m.randomInt(e)}
function xr (line 2) | function xr(e){for(var t=[],n=0;n<e;n++)t.push(Yt(32).toString(32));retu...
function e (line 2) | function e(t,n,r){this.key=t,this.session=n,this.events=[],this.options=...
function e (line 2) | function e(t,n,r,i){this.name=t,this.priority=n,this.transport=r,this.op...
function Zt (line 2) | function Zt(e,t){return j.defer(function(){t(e)}),{abort:function(){},fo...
function $r (line 2) | function $r(e,t){var n={activityTimeout:e.activityTimeout||d.activityTim...
function Zr (line 2) | function Zr(e){return e.httpHost?e.httpHost:e.cluster?"sockjs-"+e.cluste...
function ti (line 2) | function ti(e){return e.wsHost?e.wsHost:e.cluster?te(e.cluster):te(d.clu...
function te (line 2) | function te(e){return"ws-"+e+".pusher.com"}
function ei (line 2) | function ei(e){return m.getProtocol()==="https:"?!0:e.forceTLS!==!1}
function ni (line 2) | function ni(e){return"enableStats"in e?e.enableStats:"disableStats"in e?...
function ri (line 2) | function ri(e){var t=et(et({},d.userAuthentication),e.userAuthentication...
function ii (line 2) | function ii(e,t){var n;return"channelAuthorization"in e?n=et(et({},d.cha...
function oi (line 2) | function oi(e,t){var n=ii(e,t);return"customHandler"in n&&n.customHandle...
function r (line 2) | function r(){this.constructor=t}
function t (line 2) | function t(n){var r=e.call(this,function(i,o){A.debug("No callbacks on w...
function ui (line 2) | function ui(){var e,t,n=new Promise(function(r,i){e=r,t=i});return{promi...
function r (line 2) | function r(){this.constructor=t}
function t (line 2) | function t(n){var r=e.call(this,function(i,o){A.debug("No callbacks on u...
function e (line 2) | function e(t,n){var r=this;if(di(t),n=n||{},!n.cluster&&!(n.wsHost||n.ht...
function di (line 2) | function di(e){if(e==null)throw"You must pass your app key when you inst...
function st (line 2) | function st(l){"@babel/helpers - typeof";return st=typeof Symbol=="funct...
function L (line 2) | function L(l,h){if(!(l instanceof h))throw new TypeError("Cannot call a ...
function le (line 2) | function le(l,h){for(var a=0;a<h.length;a++){var c=h[a];c.enumerable=c.e...
function R (line 2) | function R(l,h,a){return h&&le(l.prototype,h),a&&le(l,a),Object.definePr...
function at (line 2) | function at(){return at=Object.assign||function(l){for(var h=1;h<argumen...
function D (line 2) | function D(l,h){if(typeof h!="function"&&h!==null)throw new TypeError("S...
function pt (line 2) | function pt(l){return pt=Object.setPrototypeOf?Object.getPrototypeOf:fun...
function At (line 2) | function At(l,h){return At=Object.setPrototypeOf||function(c,s){return c...
function Ri (line 2) | function Ri(){if(typeof Reflect>"u"||!Reflect.construct||Reflect.constru...
function Ii (line 2) | function Ii(l){if(l===void 0)throw new ReferenceError("this hasn't been ...
function ji (line 2) | function ji(l,h){if(h&&(typeof h=="object"||typeof h=="function"))return...
function H (line 2) | function H(l){var h=Ri();return function(){var c=pt(l),s;if(h){var f=pt(...
function l (line 2) | function l(){L(this,l)}
function l (line 2) | function l(h){L(this,l),this.namespace=h}
function Ni (line 2) | function Ni(l){try{new l}catch(h){if(h.message.includes("is not a constr...
function a (line 2) | function a(c,s,f){var d;return L(this,a),d=h.call(this),d.name=s,d.pushe...
function a (line 2) | function a(){return L(this,a),h.apply(this,arguments)}
function a (line 2) | function a(){return L(this,a),h.apply(this,arguments)}
function a (line 2) | function a(){return L(this,a),h.apply(this,arguments)}
function a (line 2) | function a(c,s,f){var d;return L(this,a),d=h.call(this),d.events={},d.li...
function a (line 2) | function a(){return L(this,a),h.apply(this,arguments)}
function a (line 2) | function a(){return L(this,a),h.apply(this,arguments)}
function a (line 2) | function a(){return L(this,a),h.apply(this,arguments)}
function a (line 2) | function a(){return L(this,a),h.apply(this,arguments)}
function a (line 2) | function a(){return L(this,a),h.apply(this,arguments)}
function a (line 2) | function a(){return L(this,a),h.apply(this,arguments)}
function l (line 2) | function l(h){L(this,l),this._defaultOptions={auth:{headers:{}},authEndp...
function a (line 2) | function a(){var c;return L(this,a),c=h.apply(this,arguments),c.channels...
function a (line 2) | function a(){var c;return L(this,a),c=h.apply(this,arguments),c.channels...
function a (line 2) | function a(){var c;return L(this,a),c=h.apply(this,arguments),c.channels...
function l (line 2) | function l(h){L(this,l),this.options=h,this.connect(),this.options.witho...
FILE: public/js/filament/forms/components/checkbox-list.js
function c (line 1) | function c({livewireId:s}){return{areAllCheckboxesChecked:!1,checkboxLis...
FILE: public/js/filament/forms/components/code-editor.js
function zg (line 1) | function zg(O){if(O<768)return!1;for(let e=0,t=Ms.length;;){let i=e+t>>1...
function gh (line 1) | function gh(O){return O>=127462&&O<=127487}
function Th (line 1) | function Th(O,e,t=!0,i=!0){return(t?bh:Ug)(O,e,i)}
function bh (line 1) | function bh(O,e,t){if(e==O.length)return e;e&&yh(O.charCodeAt(e))&&xh(O....
function Ug (line 1) | function Ug(O,e,t){for(;e>0;){let i=bh(O,e-2,t);if(i<e)return i;e--}retu...
function Ls (line 1) | function Ls(O,e){let t=O.charCodeAt(e);if(!xh(t)||e+1==O.length)return t...
function yh (line 1) | function yh(O){return O>=56320&&O<57344}
function xh (line 1) | function xh(O){return O>=55296&&O<56320}
function Sh (line 1) | function Sh(O){return O<65536?1:2}
method lineAt (line 1) | lineAt(e){if(e<0||e>this.length)throw new RangeError(`Invalid position $...
method line (line 1) | line(e){if(e<1||e>this.lines)throw new RangeError(`Invalid line number $...
method replace (line 1) | replace(e,t,i){[e,t]=NO(this,e,t);let r=[];return this.decompose(0,e,r,2...
method append (line 1) | append(e){return this.replace(this.length,this.length,e)}
method slice (line 1) | slice(e,t=this.length){[e,t]=NO(this,e,t);let i=[];return this.decompose...
method eq (line 1) | eq(e){if(e==this)return!0;if(e.length!=this.length||e.lines!=this.lines)...
method iter (line 1) | iter(e=1){return new $O(this,e)}
method iterRange (line 1) | iterRange(e,t=this.length){return new Dr(this,e,t)}
method iterLines (line 1) | iterLines(e,t){let i;if(e==null)i=this.iter();else{t==null&&(t=this.line...
method toString (line 1) | toString(){return this.sliceString(0)}
method toJSON (line 1) | toJSON(){let e=[];return this.flatten(e),e}
method constructor (line 1) | constructor(){}
method of (line 1) | static of(e){if(e.length==0)throw new RangeError("A document must have a...
method constructor (line 1) | constructor(e,t=Wg(e)){super(),this.text=e,this.length=t}
method lines (line 1) | get lines(){return this.text.length}
method children (line 1) | get children(){return null}
method lineInner (line 1) | lineInner(e,t,i,r){for(let n=0;;n++){let s=this.text[n],a=r+s.length;if(...
method decompose (line 1) | decompose(e,t,i,r){let n=e<=0&&t>=this.length?this:new O(kh(this.text,e,...
method replace (line 1) | replace(e,t,i){if(!(i instanceof O))return super.replace(e,t,i);[e,t]=NO...
method sliceString (line 1) | sliceString(e,t=this.length,i=`
method flatten (line 2) | flatten(e){for(let t of this.text)e.push(t)}
method scanIdentical (line 2) | scanIdentical(){return 0}
method split (line 2) | static split(e,t){let i=[],r=-1;for(let n of e)i.push(n),r+=n.length+1,i...
method constructor (line 2) | constructor(e,t){super(),this.children=e,this.length=t,this.lines=0;for(...
method lineInner (line 2) | lineInner(e,t,i,r){for(let n=0;;n++){let s=this.children[n],a=r+s.length...
method decompose (line 2) | decompose(e,t,i,r){for(let n=0,s=0;s<=t&&n<this.children.length;n++){let...
method replace (line 2) | replace(e,t,i){if([e,t]=NO(this,e,t),i.lines<this.lines)for(let r=0,n=0;...
method sliceString (line 2) | sliceString(e,t=this.length,i=`
method flatten (line 3) | flatten(e){for(let t of this.children)t.flatten(e)}
method scanIdentical (line 3) | scanIdentical(e,t){if(!(e instanceof O))return 0;let i=0,[r,n,s,a]=t>0?[...
method from (line 3) | static from(e,t=e.reduce((i,r)=>i+r.length+1,-1)){let i=0;for(let u of e...
function Wg (line 3) | function Wg(O){let e=-1;for(let t of O)e+=t.length+1;return e}
function Mr (line 3) | function Mr(O,e,t=0,i=1e9){for(let r=0,n=0,s=!0;n<O.length&&r<=i;n++){le...
function kh (line 3) | function kh(O,e,t){return Mr(O,[""],e,t)}
method constructor (line 3) | constructor(e,t=1){this.dir=t,this.done=!1,this.lineBreak=!1,this.value=...
method nextInner (line 3) | nextInner(e,t){for(this.done=this.lineBreak=!1;;){let i=this.nodes.lengt...
method next (line 4) | next(e=0){return e<0&&(this.nextInner(-e,-this.dir),e=this.value.length)...
method constructor (line 4) | constructor(e,t,i){this.value="",this.done=!1,this.cursor=new $O(e,t>i?-...
method nextInner (line 4) | nextInner(e,t){if(t<0?this.pos<=this.from:this.pos>=this.to)return this....
method next (line 4) | next(e=0){return e<0?e=Math.max(e,this.from-this.pos):e>0&&(e=Math.min(e...
method lineBreak (line 4) | get lineBreak(){return this.cursor.lineBreak&&this.value!=""}
method constructor (line 4) | constructor(e){this.inner=e,this.afterBreak=!0,this.value="",this.done=!1}
method next (line 4) | next(e=0){let{done:t,lineBreak:i,value:r}=this.inner.next(e);return t&&t...
method lineBreak (line 4) | get lineBreak(){return!1}
method constructor (line 4) | constructor(e,t,i,r){this.from=e,this.to=t,this.number=i,this.text=r}
method length (line 4) | get length(){return this.to-this.from}
function NO (line 4) | function NO(O,e,t){return e=Math.max(0,Math.min(O.length,e)),[e,Math.max...
function fe (line 4) | function fe(O,e,t=!0,i=!0){return Th(O,e,t,i)}
function jg (line 4) | function jg(O){return O>=56320&&O<57344}
function Cg (line 4) | function Cg(O){return O>=55296&&O<56320}
function Se (line 4) | function Se(O,e){let t=O.charCodeAt(e);if(!Cg(t)||e+1==O.length)return t...
function Ri (line 4) | function Ri(O){return O<=65535?String.fromCharCode(O):(O-=65536,String.f...
function Me (line 4) | function Me(O){return O<65536?1:2}
method constructor (line 4) | constructor(e){this.sections=e}
method length (line 4) | get length(){let e=0;for(let t=0;t<this.sections.length;t+=2)e+=this.sec...
method newLength (line 4) | get newLength(){let e=0;for(let t=0;t<this.sections.length;t+=2){let i=t...
method empty (line 4) | get empty(){return this.sections.length==0||this.sections.length==2&&thi...
method iterGaps (line 4) | iterGaps(e){for(let t=0,i=0,r=0;t<this.sections.length;){let n=this.sect...
method iterChangedRanges (line 4) | iterChangedRanges(e,t=!1){Ns(this,e,t)}
method invertedDesc (line 4) | get invertedDesc(){let e=[];for(let t=0;t<this.sections.length;){let i=t...
method composeDesc (line 4) | composeDesc(e){return this.empty?e:e.empty?this:_h(this,e)}
method mapDesc (line 4) | mapDesc(e,t=!1){return e.empty?this:Fs(this,e,t)}
method mapPos (line 4) | mapPos(e,t=-1,i=pe.Simple){let r=0,n=0;for(let s=0;s<this.sections.lengt...
method touchesRange (line 4) | touchesRange(e,t=e){for(let i=0,r=0;i<this.sections.length&&r<=t;){let n...
method toString (line 4) | toString(){let e="";for(let t=0;t<this.sections.length;){let i=this.sect...
method toJSON (line 4) | toJSON(){return this.sections}
method fromJSON (line 4) | static fromJSON(e){if(!Array.isArray(e)||e.length%2||e.some(t=>typeof t!...
method create (line 4) | static create(e){return new O(e)}
method constructor (line 4) | constructor(e,t){super(e),this.inserted=t}
method apply (line 4) | apply(e){if(this.length!=e.length)throw new RangeError("Applying change ...
method mapDesc (line 4) | mapDesc(e,t=!1){return Fs(this,e,t,!0)}
method invert (line 4) | invert(e){let t=this.sections.slice(),i=[];for(let r=0,n=0;r<t.length;r+...
method compose (line 4) | compose(e){return this.empty?e:e.empty?this:_h(this,e,!0)}
method map (line 4) | map(e,t=!1){return e.empty?this:Fs(this,e,t,!0)}
method iterChanges (line 4) | iterChanges(e,t=!1){Ns(this,e,t)}
method desc (line 4) | get desc(){return vt.create(this.sections)}
method filter (line 4) | filter(e){let t=[],i=[],r=[],n=new pO(this);e:for(let s=0,a=0;;){let o=s...
method toJSON (line 4) | toJSON(){let e=[];for(let t=0;t<this.sections.length;t+=2){let i=this.se...
method of (line 4) | static of(e,t,i){let r=[],n=[],s=0,a=null;function o(c=!1){if(!c&&!r.len...
method empty (line 4) | static empty(e){return new O(e?[e,-1]:[],[])}
method fromJSON (line 4) | static fromJSON(e){if(!Array.isArray(e))throw new RangeError("Invalid JS...
method createSet (line 4) | static createSet(e,t){return new O(e,t)}
function ye (line 4) | function ye(O,e,t,i=!1){if(e==0&&t<=0)return;let r=O.length-2;r>=0&&t<=0...
function Mt (line 4) | function Mt(O,e,t){if(t.length==0)return;let i=e.length-2>>1;if(i<O.leng...
function Ns (line 4) | function Ns(O,e,t){let i=O.inserted;for(let r=0,n=0,s=0;s<O.sections.len...
function Fs (line 4) | function Fs(O,e,t,i=!1){let r=[],n=i?[]:null,s=new pO(O),a=new pO(e);for...
function _h (line 4) | function _h(O,e,t=!1){let i=[],r=t?[]:null,n=new pO(O),s=new pO(e);for(l...
method constructor (line 4) | constructor(e){this.set=e,this.i=0,this.next()}
method next (line 4) | next(){let{sections:e}=this.set;this.i<e.length?(this.len=e[this.i++],th...
method done (line 4) | get done(){return this.ins==-2}
method len2 (line 4) | get len2(){return this.ins<0?this.len:this.ins}
method text (line 4) | get text(){let{inserted:e}=this.set,t=this.i-2>>1;return t>=e.length?E.e...
method textBit (line 4) | textBit(e){let{inserted:t}=this.set,i=this.i-2>>1;return i>=t.length&&!e...
method forward (line 4) | forward(e){e==this.len?this.next():(this.len-=e,this.off+=e)}
method forward2 (line 4) | forward2(e){this.ins==-1?this.forward(e):e==this.ins?this.next():(this.i...
method constructor (line 4) | constructor(e,t,i){this.from=e,this.to=t,this.flags=i}
method anchor (line 4) | get anchor(){return this.flags&32?this.to:this.from}
method head (line 4) | get head(){return this.flags&32?this.from:this.to}
method empty (line 4) | get empty(){return this.from==this.to}
method assoc (line 4) | get assoc(){return this.flags&8?-1:this.flags&16?1:0}
method bidiLevel (line 4) | get bidiLevel(){let e=this.flags&7;return e==7?null:e}
method goalColumn (line 4) | get goalColumn(){let e=this.flags>>6;return e==16777215?void 0:e}
method map (line 4) | map(e,t=-1){let i,r;return this.empty?i=r=e.mapPos(this.from,t):(i=e.map...
method extend (line 4) | extend(e,t=e){if(e<=this.anchor&&t>=this.anchor)return S.range(e,t);let ...
method eq (line 4) | eq(e,t=!1){return this.anchor==e.anchor&&this.head==e.head&&(!t||!this.e...
method toJSON (line 4) | toJSON(){return{anchor:this.anchor,head:this.head}}
method fromJSON (line 4) | static fromJSON(e){if(!e||typeof e.anchor!="number"||typeof e.head!="num...
method create (line 4) | static create(e,t,i){return new O(e,t,i)}
method constructor (line 4) | constructor(e,t){this.ranges=e,this.mainIndex=t}
method map (line 4) | map(e,t=-1){return e.empty?this:O.create(this.ranges.map(i=>i.map(e,t)),...
method eq (line 4) | eq(e,t=!1){if(this.ranges.length!=e.ranges.length||this.mainIndex!=e.mai...
method main (line 4) | get main(){return this.ranges[this.mainIndex]}
method asSingle (line 4) | asSingle(){return this.ranges.length==1?this:new O([this.main],0)}
method addRange (line 4) | addRange(e,t=!0){return O.create([e].concat(this.ranges),t?0:this.mainIn...
method replaceRange (line 4) | replaceRange(e,t=this.mainIndex){let i=this.ranges.slice();return i[t]=e...
method toJSON (line 4) | toJSON(){return{ranges:this.ranges.map(e=>e.toJSON()),main:this.mainIndex}}
method fromJSON (line 4) | static fromJSON(e){if(!e||!Array.isArray(e.ranges)||typeof e.main!="numb...
method single (line 4) | static single(e,t=e){return new O([O.range(e,t)],0)}
method create (line 4) | static create(e,t=0){if(e.length==0)throw new RangeError("A selection ne...
method cursor (line 4) | static cursor(e,t=0,i,r){return MO.create(e,e,(t==0?0:t<0?8:16)|(i==null...
method range (line 4) | static range(e,t,i,r){let n=(i??16777215)<<6|(r==null?7:Math.min(6,r));r...
method normalized (line 4) | static normalized(e,t=0){let i=e[t];e.sort((r,n)=>r.from-n.from),t=e.ind...
function Rh (line 4) | function Rh(O,e){for(let t of O.ranges)if(t.to>e)throw new RangeError("S...
method constructor (line 4) | constructor(e,t,i,r,n){this.combine=e,this.compareInput=t,this.compare=i...
method reader (line 4) | get reader(){return this}
method define (line 4) | static define(e={}){return new O(e.combine||(t=>t),e.compareInput||((t,i...
method of (line 4) | of(e){return new IO([],this,0,e)}
method compute (line 4) | compute(e,t){if(this.isStatic)throw new Error("Can't compute a static fa...
method computeN (line 4) | computeN(e,t){if(this.isStatic)throw new Error("Can't compute a static f...
method from (line 4) | from(e,t){return t||(t=i=>i),this.compute([e],i=>t(i.field(e)))}
function aa (line 4) | function aa(O,e){return O==e||O.length==e.length&&O.every((t,i)=>t===e[i])}
method constructor (line 4) | constructor(e,t,i,r){this.dependencies=e,this.facet=t,this.type=i,this.v...
method dynamicSlot (line 4) | dynamicSlot(e){var t;let i=this.value,r=this.facet.compareInput,n=this.i...
function wh (line 4) | function wh(O,e,t){if(O.length!=e.length)return!1;for(let i=0;i<O.length...
function Hs (line 4) | function Hs(O,e){let t=!1;for(let i of e)Zi(O,i)&1&&(t=!0);return t}
function Gg (line 4) | function Gg(O,e,t){let i=t.map(o=>O[o.id]),r=t.map(o=>o.type),n=i.filter...
method constructor (line 4) | constructor(e,t,i,r,n){this.id=e,this.createF=t,this.updateF=i,this.comp...
method define (line 4) | static define(e){let t=new O(sa++,e.create,e.update,e.compare||((i,r)=>i...
method create (line 4) | create(e){let t=e.facet(Er).find(i=>i.field==this);return(t?.create||thi...
method slot (line 4) | slot(e){let t=e[this.id]>>1;return{create:i=>(i.values[t]=this.create(i)...
method init (line 4) | init(e){return[this,Er.of({field:this,create:e})]}
method extension (line 4) | get extension(){return this}
function wi (line 4) | function wi(O){return e=>new Br(e,O)}
method constructor (line 4) | constructor(e,t){this.inner=e,this.prec=t}
method of (line 4) | of(e){return new vi(this,e)}
method reconfigure (line 4) | reconfigure(e){return O.reconfigure.of({compartment:this,extension:e})}
method get (line 4) | get(e){return e.config.compartments.get(this)}
method constructor (line 4) | constructor(e,t){this.compartment=e,this.inner=t}
method constructor (line 4) | constructor(e,t,i,r,n,s){for(this.base=e,this.compartments=t,this.dynami...
method staticFacet (line 4) | staticFacet(e){let t=this.address[e.id];return t==null?e.default:this.st...
method resolve (line 4) | static resolve(e,t,i){let r=[],n=Object.create(null),s=new Map;for(let f...
function Eg (line 4) | function Eg(O,e,t){let i=[[],[],[],[],[]],r=new Map;function n(s,a){let ...
function Zi (line 4) | function Zi(O,e){if(e&1)return 2;let t=e>>1,i=O.status[t];if(i==4)throw ...
function Fr (line 4) | function Fr(O,e){return e&1?O.config.staticValues[e>>1]:O.values[e>>1]}
method constructor (line 4) | constructor(e,t){this.type=e,this.value=t}
method define (line 4) | static define(){return new Js}
method of (line 4) | of(e){return new qe(this,e)}
method constructor (line 4) | constructor(e){this.map=e}
method of (line 4) | of(e){return new V(this,e)}
method constructor (line 4) | constructor(e,t){this.type=e,this.value=t}
method map (line 4) | map(e){let t=this.type.map(this.value,e);return t===void 0?void 0:t==thi...
method is (line 4) | is(e){return this.type==e}
method define (line 4) | static define(e={}){return new ea(e.map||(t=>t))}
method mapEffects (line 4) | static mapEffects(e,t){if(!e.length)return e;let i=[];for(let r of e){le...
method constructor (line 4) | constructor(e,t,i,r,n,s){this.startState=e,this.changes=t,this.selection...
method create (line 4) | static create(e,t,i,r,n,s){return new O(e,t,i,r,n,s)}
method newDoc (line 4) | get newDoc(){return this._doc||(this._doc=this.changes.apply(this.startS...
method newSelection (line 4) | get newSelection(){return this.selection||this.startState.selection.map(...
method state (line 4) | get state(){return this._state||this.startState.applyTransaction(this),t...
method annotation (line 4) | annotation(e){for(let t of this.annotations)if(t.type==e)return t.value}
method docChanged (line 4) | get docChanged(){return!this.changes.empty}
method reconfigured (line 4) | get reconfigured(){return this.startState.config!=this.state.config}
method isUserEvent (line 4) | isUserEvent(e){let t=this.annotation(O.userEvent);return!!(t&&(t==e||t.l...
function Ag (line 4) | function Ag(O,e){let t=[];for(let i=0,r=0;;){let n,s;if(i<O.length&&(r==...
function Ch (line 4) | function Ch(O,e,t){var i;let r,n,s;return t?(r=e.changes,n=Ze.empty(e.ch...
function ta (line 4) | function ta(O,e,t){let i=e.selection,r=BO(e.annotations);return e.userEv...
function Gh (line 4) | function Gh(O,e,t){let i=ta(O,e.length?e[0]:{},O.doc.length);e.length&&e...
function Lg (line 4) | function Lg(O){let e=O.startState,t=!0;for(let r of e.facet(zh)){let n=r...
function Mg (line 4) | function Mg(O){let e=O.startState,t=e.facet(Wh),i=O;for(let r=t.length-1...
function BO (line 4) | function BO(O){return O==null?Dg:Array.isArray(O)?O:[O]}
function Bg (line 4) | function Bg(O){if(Oa)return Oa.test(O);for(let e=0;e<O.length;e++){let t...
function Ng (line 4) | function Ng(O){return e=>{if(!/\S/.test(e))return ee.Space;if(Bg(e))retu...
method constructor (line 4) | constructor(e,t,i,r,n,s){this.config=e,this.doc=t,this.selection=i,this....
method field (line 4) | field(e,t=!0){let i=this.config.address[e.id];if(i==null){if(t)throw new...
method update (line 4) | update(...e){return Gh(this,e,!0)}
method applyTransaction (line 4) | applyTransaction(e){let t=this.config,{base:i,compartments:r}=t;for(let ...
method replaceSelection (line 4) | replaceSelection(e){return typeof e=="string"&&(e=this.toText(e)),this.c...
method changeByRange (line 4) | changeByRange(e){let t=this.selection,i=e(t.ranges[0]),r=this.changes(i....
method changes (line 4) | changes(e=[]){return e instanceof Ze?e:Ze.of(e,this.doc.length,this.face...
method toText (line 4) | toText(e){return E.of(e.split(this.facet(O.lineSeparator)||Bs))}
method sliceDoc (line 4) | sliceDoc(e=0,t=this.doc.length){return this.doc.sliceString(e,t,this.lin...
method facet (line 4) | facet(e){let t=this.config.address[e.id];return t==null?e.default:(Zi(th...
method toJSON (line 4) | toJSON(e){let t={doc:this.sliceDoc(),selection:this.selection.toJSON()};...
method fromJSON (line 4) | static fromJSON(e,t={},i){if(!e||typeof e.doc!="string")throw new RangeE...
method create (line 4) | static create(e={}){let t=Nr.resolve(e.extensions||[],new Map),i=e.doc i...
method tabSize (line 4) | get tabSize(){return this.facet(O.tabSize)}
method lineBreak (line 4) | get lineBreak(){return this.facet(O.lineSeparator)||`
method readOnly (line 5) | get readOnly(){return this.facet(jh)}
method phrase (line 5) | phrase(e,...t){for(let i of this.facet(O.phrases))if(Object.prototype.ha...
method languageDataAt (line 5) | languageDataAt(e,t,i=-1){let r=[];for(let n of this.facet(Vh))for(let s ...
method charCategorizer (line 5) | charCategorizer(e){let t=this.languageDataAt("wordChars",e);return Ng(t....
method wordAt (line 5) | wordAt(e){let{text:t,from:i,length:r}=this.doc.lineAt(e),n=this.charCate...
method compare (line 5) | compare(O,e){let t=Object.keys(O),i=Object.keys(e);return t.length==i.le...
function xe (line 5) | function xe(O,e,t={}){let i={};for(let r of O)for(let n of Object.keys(r...
method eq (line 5) | eq(e){return this==e}
method range (line 5) | range(e,t=e){return Yi.create(e,t,this)}
function oa (line 5) | function oa(O,e){return O==e||O.constructor==e.constructor&&O.eq(e)}
method constructor (line 5) | constructor(e,t,i){this.from=e,this.to=t,this.value=i}
method create (line 5) | static create(e,t,i){return new O(e,t,i)}
function ia (line 5) | function ia(O,e){return O.from-e.from||O.value.startSide-e.value.startSide}
method constructor (line 5) | constructor(e,t,i,r){this.from=e,this.to=t,this.value=i,this.maxPoint=r}
method length (line 5) | get length(){return this.to[this.to.length-1]}
method findIndex (line 5) | findIndex(e,t,i,r=0){let n=i?this.to:this.from;for(let s=r,a=n.length;;)...
method between (line 5) | between(e,t,i,r){for(let n=this.findIndex(t,-1e9,!0),s=this.findIndex(i,...
method map (line 5) | map(e,t){let i=[],r=[],n=[],s=-1,a=-1;for(let o=0;o<this.value.length;o+...
method constructor (line 5) | constructor(e,t,i,r){this.chunkPos=e,this.chunk=t,this.nextLayer=i,this....
method create (line 5) | static create(e,t,i,r){return new O(e,t,i,r)}
method length (line 5) | get length(){let e=this.chunk.length-1;return e<0?0:Math.max(this.chunkE...
method size (line 5) | get size(){if(this.isEmpty)return 0;let e=this.nextLayer.size;for(let t ...
method chunkEnd (line 5) | chunkEnd(e){return this.chunkPos[e]+this.chunk[e].length}
method update (line 5) | update(e){let{add:t=[],sort:i=!1,filterFrom:r=0,filterTo:n=this.length}=...
method map (line 5) | map(e){if(e.empty||this.isEmpty)return this;let t=[],i=[],r=-1;for(let s...
method between (line 5) | between(e,t,i){if(!this.isEmpty){for(let r=0;r<this.chunk.length;r++){le...
method iter (line 5) | iter(e=0){return _i.from([this]).goto(e)}
method isEmpty (line 5) | get isEmpty(){return this.nextLayer==this}
method iter (line 5) | static iter(e,t=0){return _i.from(e).goto(t)}
method compare (line 5) | static compare(e,t,i,r,n=-1){let s=e.filter(h=>h.maxPoint>0||!h.isEmpty&...
method eq (line 5) | static eq(e,t,i=0,r){r==null&&(r=999999999);let n=e.filter(c=>!c.isEmpty...
method spans (line 5) | static spans(e,t,i,r,n=-1){let s=new QO(e,null,n).goto(t),a=t,o=s.openSt...
method of (line 5) | static of(e,t=!1){let i=new Le;for(let r of e instanceof Yi?[e]:t?Fg(e):...
method join (line 5) | static join(e){if(!e.length)return O.empty;let t=e[e.length-1];for(let i...
function Fg (line 5) | function Fg(O){if(O.length>1)for(let e=O[0],t=1;t<O.length;t++){let i=O[...
method finishChunk (line 5) | finishChunk(e){this.chunks.push(new ra(this.from,this.to,this.value,this...
method constructor (line 5) | constructor(){this.chunks=[],this.chunkPos=[],this.chunkStart=-1,this.la...
method add (line 5) | add(e,t,i){this.addInner(e,t,i)||(this.nextLayer||(this.nextLayer=new O)...
method addInner (line 5) | addInner(e,t,i){let r=e-this.lastTo||i.startSide-this.last.endSide;if(r<...
method addChunk (line 5) | addChunk(e,t){if((e-this.lastTo||t.value[0].startSide-this.last.endSide)...
method finish (line 5) | finish(){return this.finishInner(M.empty)}
method finishInner (line 5) | finishInner(e){if(this.from.length&&this.finishChunk(!1),this.chunks.len...
function Zh (line 5) | function Zh(O,e,t){let i=new Map;for(let n of O)for(let s=0;s<n.chunk.le...
method constructor (line 5) | constructor(e,t,i,r=0){this.layer=e,this.skip=t,this.minPoint=i,this.ran...
method startSide (line 5) | get startSide(){return this.value?this.value.startSide:0}
method endSide (line 5) | get endSide(){return this.value?this.value.endSide:0}
method goto (line 5) | goto(e,t=-1e9){return this.chunkIndex=this.rangeIndex=0,this.gotoInner(e...
method gotoInner (line 5) | gotoInner(e,t,i){for(;this.chunkIndex<this.layer.chunk.length;){let r=th...
method forward (line 5) | forward(e,t){(this.to-e||this.endSide-t)<0&&this.gotoInner(e,t,!0)}
method next (line 5) | next(){for(;;)if(this.chunkIndex==this.layer.chunk.length){this.from=thi...
method setRangeIndex (line 5) | setRangeIndex(e){if(e==this.layer.chunk[this.chunkIndex].value.length){i...
method nextChunk (line 5) | nextChunk(){this.chunkIndex++,this.rangeIndex=0,this.next()}
method compare (line 5) | compare(e){return this.from-e.from||this.startSide-e.startSide||this.ran...
method constructor (line 5) | constructor(e){this.heap=e}
method from (line 5) | static from(e,t=null,i=-1){let r=[];for(let n=0;n<e.length;n++)for(let s...
method startSide (line 5) | get startSide(){return this.value?this.value.startSide:0}
method goto (line 5) | goto(e,t=-1e9){for(let i of this.heap)i.goto(e,t);for(let i=this.heap.le...
method forward (line 5) | forward(e,t){for(let i of this.heap)i.forward(e,t);for(let i=this.heap.l...
method next (line 5) | next(){if(this.heap.length==0)this.from=this.to=1e9,this.value=null,this...
function Ds (line 5) | function Ds(O,e){for(let t=O[e];;){let i=(e<<1)+1;if(i>=O.length)break;l...
method constructor (line 5) | constructor(e,t,i){this.minPoint=i,this.active=[],this.activeTo=[],this....
method goto (line 5) | goto(e,t=-1e9){return this.cursor.goto(e,t),this.active.length=this.acti...
method forward (line 5) | forward(e,t){for(;this.minActive>-1&&(this.activeTo[this.minActive]-e||t...
method removeActive (line 5) | removeActive(e){Ar(this.active,e),Ar(this.activeTo,e),Ar(this.activeRank...
method addActive (line 5) | addActive(e){let t=0,{value:i,to:r,rank:n}=this.cursor;for(;t<this.activ...
method next (line 5) | next(){let e=this.to,t=this.point;this.point=null;let i=this.openStart<0...
method activeForPoint (line 5) | activeForPoint(e){if(!this.active.length)return this.active;let t=[];for...
method openEnd (line 5) | openEnd(e){let t=0;for(let i=this.activeTo.length-1;i>=0&&this.activeTo[...
function vh (line 5) | function vh(O,e,t,i,r,n){O.goto(e),t.goto(i);let s=i+r,a=i,o=i-e,l=!!n.b...
function na (line 5) | function na(O,e){if(O.length!=e.length)return!1;for(let t=0;t<O.length;t...
function Ar (line 5) | function Ar(O,e){for(let t=e,i=O.length-1;t<i;t++)O[t]=O[t+1];O.pop()}
function Lr (line 5) | function Lr(O,e,t){for(let i=O.length-1;i>=e;i--)O[i+1]=O[i];O[e]=t}
function Yh (line 5) | function Yh(O,e){let t=-1,i=1e9;for(let r=0;r<e.length;r++)(e[r]-i||O[r]...
function ve (line 5) | function ve(O,e,t=O.length){let i=0;for(let r=0;r<t&&r<O.length;)O.charC...
function Kr (line 5) | function Kr(O,e,t,i){for(let r=0,n=0;;){if(n>=e)return r;if(r==O.length)...
method constructor (line 5) | constructor(e,t){this.rules=[];let{finish:i}=t||{};function r(s){return/...
method getRules (line 5) | getRules(){return this.rules.join(`
method newName (line 6) | static newName(){let e=Ah[Eh]||1;return Ah[Eh]=e+1,"\u037C"+e.toString(36)}
method mount (line 6) | static mount(e,t,i){let r=e[la],n=i&&i.nonce;r?n&&r.setNonce(n):r=new ca...
method constructor (line 6) | constructor(e,t){let i=e.ownerDocument||e,r=i.defaultView;if(!e.head&&e....
method mount (line 6) | mount(e,t){let i=this.sheet,r=0,n=0;for(let s=0;s<e.length;s++){let a=e[...
method setNonce (line 7) | setNonce(e){this.styleTag&&this.styleTag.getAttribute("nonce")!=e&&this....
function Mh (line 7) | function Mh(O){var e=Hg&&O.metaKey&&O.shiftKey&&!O.ctrlKey&&!O.altKey||K...
function N (line 7) | function N(){var O=arguments[0];typeof O=="string"&&(O=document.createEl...
function Dh (line 7) | function Dh(O,e){if(typeof e=="string")O.appendChild(document.createText...
function uo (line 7) | function uo(O,e){for(let t in O)t=="class"&&e.class?e.class+=" "+O.class...
function Qo (line 7) | function Qo(O,e,t){if(O==e)return!0;O||(O=$n),e||(e=$n);let i=Object.key...
function Jg (line 7) | function Jg(O,e){for(let t=O.attributes.length-1;t>=0;t--){let i=O.attri...
function Fh (line 7) | function Fh(O,e,t){let i=!1;if(e)for(let r in e)t&&r in t||(i=!0,r=="sty...
function eP (line 7) | function eP(O){let e=Object.create(null);for(let t=0;t<O.attributes.leng...
method eq (line 7) | eq(e){return!1}
method updateDOM (line 7) | updateDOM(e,t){return!1}
method compare (line 7) | compare(e){return this==e||this.constructor==e.constructor&&this.eq(e)}
method estimatedHeight (line 7) | get estimatedHeight(){return-1}
method lineBreaks (line 7) | get lineBreaks(){return 0}
method ignoreEvent (line 7) | ignoreEvent(e){return!0}
method coordsAt (line 7) | coordsAt(e,t,i){return null}
method isHidden (line 7) | get isHidden(){return!1}
method editable (line 7) | get editable(){return!1}
method destroy (line 7) | destroy(e){}
method constructor (line 7) | constructor(e,t,i,r){super(),this.startSide=e,this.endSide=t,this.widget...
method heightRelevant (line 7) | get heightRelevant(){return!1}
method mark (line 7) | static mark(e){return new Di(e)}
method widget (line 7) | static widget(e){let t=Math.max(-1e4,Math.min(1e4,e.side||0)),i=!!e.bloc...
method replace (line 7) | static replace(e){let t=!!e.block,i,r;if(e.isBlockGap)i=-5e8,r=4e8;else{...
method line (line 7) | static line(e){return new Ii(e)}
method set (line 7) | static set(e,t=!1){return M.of(e,t)}
method hasHeight (line 7) | hasHeight(){return this.widget?this.widget.estimatedHeight>-1:!1}
method constructor (line 7) | constructor(e){let{start:t,end:i}=Rf(e);super(t?-1:5e8,i?1:-6e8,null,e),...
method eq (line 7) | eq(e){return this==e||e instanceof O&&this.tagName==e.tagName&&Qo(this.a...
method range (line 7) | range(e,t=e){if(e>=t)throw new RangeError("Mark decorations may not be e...
method constructor (line 7) | constructor(e){super(-2e8,-2e8,null,e)}
method eq (line 7) | eq(e){return e instanceof O&&this.spec.class==e.spec.class&&Qo(this.spec...
method range (line 7) | range(e,t=e){if(t!=e)throw new RangeError("Line decoration ranges must b...
method constructor (line 7) | constructor(e,t,i,r,n,s){super(t,i,n,e),this.block=r,this.isReplace=s,th...
method type (line 7) | get type(){return this.startSide!=this.endSide?Te.WidgetRange:this.start...
method heightRelevant (line 7) | get heightRelevant(){return this.block||!!this.widget&&(this.widget.esti...
method eq (line 7) | eq(e){return e instanceof O&&tP(this.widget,e.widget)&&this.block==e.blo...
method range (line 7) | range(e,t=e){if(this.isReplace&&(e>t||e==t&&this.startSide>0&&this.endSi...
function Rf (line 7) | function Rf(O,e=!1){let{inclusiveStart:t,inclusiveEnd:i}=O;return t==nul...
function tP (line 7) | function tP(O,e){return O==e||!!(O&&e&&O.compare(e))}
function Oi (line 7) | function Oi(O,e,t,i=0){let r=t.length-1;r>=0&&t[r]+i>=O?t[r]=Math.max(t[...
method constructor (line 7) | constructor(e,t){super(),this.tagName=e,this.attributes=t}
method eq (line 7) | eq(e){return e==this||e instanceof O&&this.tagName==e.tagName&&Qo(this.a...
method create (line 7) | static create(e){return new O(e.tagName,e.attributes||$n)}
method set (line 7) | static set(e,t=!1){return M.of(e,t)}
function Bi (line 7) | function Bi(O){let e;return O.nodeType==11?e=O.getSelection?O:O.ownerDoc...
function Ta (line 7) | function Ta(O,e){return e?O==e||O.contains(e.nodeType!=1?e.parentNode:e)...
function cn (line 7) | function cn(O,e){if(!e.anchorNode)return!1;try{return Ta(O,e.anchorNode)...
function hn (line 7) | function hn(O){return O.nodeType==3?Ni(O,0,O.nodeValue.length).getClient...
function Wi (line 7) | function Wi(O,e,t,i){return t?Hh(O,e,t,i,-1)||Hh(O,e,t,i,1):!1}
function Nt (line 7) | function Nt(O){for(var e=0;;e++)if(O=O.previousSibling,!O)return e}
function mn (line 7) | function mn(O){return O.nodeType==1&&/^(DIV|P|LI|UL|OL|BLOCKQUOTE|DD|DT|...
function Hh (line 7) | function Hh(O,e,t,i,r){for(;;){if(O==t&&e==i)return!0;if(e==(r<0?0:Rt(O)...
function Rt (line 7) | function Rt(O){return O.nodeType==3?O.nodeValue.length:O.childNodes.length}
function gn (line 7) | function gn(O,e){let t=e?O.left:O.right;return{left:t,right:t,top:O.top,...
function OP (line 7) | function OP(O){let e=O.visualViewport;return e?{left:0,right:e.width,top...
function Vf (line 7) | function Vf(O,e){let t=e.width/O.offsetWidth,i=e.height/O.offsetHeight;r...
function iP (line 7) | function iP(O,e,t,i,r,n,s,a){let o=O.ownerDocument,l=o.defaultView||wind...
function rP (line 7) | function rP(O){let e=O.ownerDocument,t,i;for(let r=O.parentNode;r&&!(r==...
method constructor (line 7) | constructor(){this.anchorNode=null,this.anchorOffset=0,this.focusNode=nu...
method eq (line 7) | eq(e){return this.anchorNode==e.anchorNode&&this.anchorOffset==e.anchorO...
method setRange (line 7) | setRange(e){let{anchorNode:t,focusNode:i}=e;this.set(t,Math.min(e.anchor...
method set (line 7) | set(e,t,i,r){this.anchorNode=e,this.anchorOffset=t,this.focusNode=i,this...
function qf (line 7) | function qf(O){if(O.setActive)return O.setActive();if(mO)return O.focus(...
function Ni (line 7) | function Ni(O,e,t=e){let i=Kh||(Kh=document.createRange());return i.setE...
function ii (line 7) | function ii(O,e,t,i){let r={key:e,code:e,keyCode:t,which:t,cancelable:!0...
function nP (line 7) | function nP(O){for(;O;){if(O&&(O.nodeType==9||O.nodeType==11&&O.host))re...
function sP (line 7) | function sP(O,e){let t=e.focusNode,i=e.focusOffset;if(!t||e.anchorNode!=...
function zf (line 7) | function zf(O){return O.scrollTop>Math.max(1,O.scrollHeight-O.clientHeig...
function Uf (line 7) | function Uf(O,e){for(let t=O,i=e;;){if(t.nodeType==3&&i>0)return{node:t,...
function Wf (line 7) | function Wf(O,e){for(let t=O,i=e;;){if(t.nodeType==3&&i<t.nodeValue.leng...
method constructor (line 7) | constructor(e,t,i=!0){this.node=e,this.offset=t,this.precise=i}
method before (line 7) | static before(e,t){return new O(e.parentNode,Nt(e),t)}
method after (line 7) | static after(e,t){return new O(e.parentNode,Nt(e)+1,t)}
function jf (line 7) | function jf(O){let e=[];for(let t=0;t<O.length;t++)e.push(1<<+O[t]);retu...
function Cf (line 7) | function Cf(O){return O<=247?aP[O]:1424<=O&&O<=1524?2:1536<=O&&O<=1785?o...
method dir (line 7) | get dir(){return this.level%2?$o:SO}
method constructor (line 7) | constructor(e,t,i){this.from=e,this.to=t,this.level=i}
method side (line 7) | side(e,t){return this.dir==t==e?this.to:this.from}
method forward (line 7) | forward(e,t){return e==(this.dir==t)}
method find (line 7) | static find(e,t,i,r){let n=-1;for(let s=0;s<e.length;s++){let a=e[s];if(...
function Gf (line 7) | function Gf(O,e){if(O.length!=e.length)return!1;for(let t=0;t<O.length;t...
function cP (line 7) | function cP(O,e,t,i,r){for(let n=0;n<=i.length;n++){let s=n?i[n-1].to:e,...
function hP (line 7) | function hP(O,e,t,i,r){let n=r==1?2:1;for(let s=0,a=0,o=0;s<=i.length;s+...
function fP (line 7) | function fP(O,e,t,i){for(let r=0,n=i;r<=t.length;r++){let s=r?t[r-1].to:...
function xa (line 7) | function xa(O,e,t,i,r,n,s){let a=i%2?2:1;if(i%2==r%2)for(let o=e,l=0;o<t...
function ka (line 7) | function ka(O,e,t,i,r,n,s){let a=e%2?2:1;cP(O,r,n,i,a),hP(O,r,n,i,a),fP(...
function dP (line 7) | function dP(O,e,t){if(!O)return[new ct(0,0,e==$o?1:0)];if(e==SO&&!t.leng...
function Ef (line 7) | function Ef(O){return[new ct(0,O,0)]}
function uP (line 7) | function uP(O,e,t,i,r){var n;let s=i.head-O.from,a=ct.find(e,s,(n=i.bidi...
function QP (line 7) | function QP(O,e,t){for(let i=e;i<t;i++){let r=Cf(O.charCodeAt(i));if(r==...
method constructor (line 7) | constructor(e,t="nearest",i="nearest",r=5,n=5,s=!1){this.range=e,this.y=...
method map (line 7) | map(e){return e.empty?this:new O(this.range.map(e),this.y,this.x,this.yM...
method clip (line 7) | clip(e){return this.range.to<=e.doc.length?this:new O(S.cursor(e.doc.len...
function Xe (line 7) | function Xe(O,e,t){let i=O.facet(If);i.length?i[0](e):window.onerror&&wi...
method combine (line 7) | combine(O){return O.filter((e,t)=>{for(let i=0;i<t;i++)if(O[i].plugin==e...
method constructor (line 7) | constructor(e,t,i,r,n){this.id=e,this.create=t,this.domEventHandlers=i,t...
method of (line 7) | of(e){return this.baseExtensions.concat(KO.of({plugin:this,arg:e}))}
method define (line 7) | static define(e,t){let{eventHandlers:i,eventObservers:r,provide:n,decora...
method fromClass (line 7) | static fromClass(e,t){return O.define((i,r)=>new e(i,r),t)}
method constructor (line 7) | constructor(e){this.spec=e,this.mustUpdate=null,this.value=null}
method plugin (line 7) | get plugin(){return this.spec&&this.spec.plugin}
method update (line 7) | update(e){if(this.value){if(this.mustUpdate){let t=this.mustUpdate;if(th...
method destroy (line 7) | destroy(e){var t;if(!((t=this.value)===null||t===void 0)&&t.destroy)try{...
method deactivate (line 7) | deactivate(){this.spec=this.value=null}
function Jh (line 7) | function Jh(O,e){let t=O.state.facet(id);if(!t.length)return t;let i=t.m...
function Po (line 7) | function Po(O){let e=0,t=0,i=0,r=0;for(let n of O.state.facet(rd)){let s...
method constructor (line 7) | constructor(e,t,i,r){this.fromA=e,this.toA=t,this.fromB=i,this.toB=r}
method join (line 7) | join(e){return new O(Math.min(this.fromA,e.fromA),Math.max(this.toA,e.to...
method addToSet (line 7) | addToSet(e){let t=e.length,i=this;for(;t>0;t--){let r=e[t-1];if(!(r.from...
method extendWithRanges (line 7) | static extendWithRanges(e,t){if(t.length==0)return e;let i=[];for(let r=...
method constructor (line 7) | constructor(e,t,i){this.view=e,this.state=t,this.transactions=i,this.fla...
method create (line 7) | static create(e,t,i){return new O(e,t,i)}
method viewportChanged (line 7) | get viewportChanged(){return(this.flags&4)>0}
method viewportMoved (line 7) | get viewportMoved(){return(this.flags&8)>0}
method heightChanged (line 7) | get heightChanged(){return(this.flags&2)>0}
method geometryChanged (line 7) | get geometryChanged(){return this.docChanged||(this.flags&18)>0}
method focusChanged (line 7) | get focusChanged(){return(this.flags&1)>0}
method docChanged (line 7) | get docChanged(){return!this.changes.empty}
method selectionSet (line 7) | get selectionSet(){return this.transactions.some(e=>e.selection)}
method empty (line 7) | get empty(){return this.flags==0&&this.transactions.length==0}
method constructor (line 7) | constructor(e,t,i=0){this.dom=e,this.length=t,this.flags=i,this.parent=n...
method breakAfter (line 7) | get breakAfter(){return this.flags&1}
method children (line 7) | get children(){return pP}
method isWidget (line 7) | isWidget(){return!1}
method isHidden (line 7) | get isHidden(){return!1}
method isComposite (line 7) | isComposite(){return!1}
method isLine (line 7) | isLine(){return!1}
method isText (line 7) | isText(){return!1}
method isBlock (line 7) | isBlock(){return!1}
method domAttrs (line 7) | get domAttrs(){return null}
method sync (line 7) | sync(e){if(this.flags|=2,this.flags&4){this.flags&=-5;let t=this.domAttr...
method toString (line 7) | toString(){return this.constructor.name+(this.children.length?`(${this.c...
method destroy (line 7) | destroy(){this.parent=null}
method setDOM (line 7) | setDOM(e){this.dom=e,e.cmTile=this}
method posAtStart (line 7) | get posAtStart(){return this.parent?this.parent.posBefore(this):0}
method posAtEnd (line 7) | get posAtEnd(){return this.posAtStart+this.length}
method posBefore (line 7) | posBefore(e,t=this.posAtStart){let i=t;for(let r of this.children){if(r=...
method posAfter (line 7) | posAfter(e){return this.posBefore(e)+e.length}
method covers (line 7) | covers(e){return!0}
method coordsIn (line 7) | coordsIn(e,t){return null}
method domPosFor (line 7) | domPosFor(e,t){let i=Nt(this.dom),r=this.length?e>0:t>0;return new St(th...
method markDirty (line 7) | markDirty(e){this.flags&=-3,e&&(this.flags|=4),this.parent&&this.parent....
method overrideDOMText (line 7) | get overrideDOMText(){return null}
method root (line 7) | get root(){for(let e=this;e;e=e.parent)if(e instanceof ni)return e;retur...
method get (line 7) | static get(e){return e.cmTile}
method constructor (line 7) | constructor(e){super(e,0),this._children=[]}
method isComposite (line 7) | isComposite(){return!0}
method children (line 7) | get children(){return this._children}
method lastChild (line 7) | get lastChild(){return this.children.length?this.children[this.children....
method append (line 7) | append(e){this.children.push(e),e.parent=this}
method sync (line 7) | sync(e){if(this.flags&2)return;super.sync(e);let t=this.dom,i=null,r,n=e...
function ef (line 7) | function ef(O){let e=O.nextSibling;return O.parentNode.removeChild(O),e}
method constructor (line 7) | constructor(e,t){super(t),this.view=e}
method owns (line 7) | owns(e){for(;e;e=e.parent)if(e==this)return!0;return!1}
method isBlock (line 7) | isBlock(){return!0}
method nearest (line 7) | nearest(e){for(;;){if(!e)return null;let t=de.get(e);if(t&&this.owns(t))...
method blockTiles (line 7) | blockTiles(e){for(let t=[],i=this,r=0,n=0;;)if(r==i.children.length){if(...
method resolveBlock (line 7) | resolveBlock(e,t){let i,r=-1,n,s=-1;if(this.blockTiles((a,o)=>{let l=o+a...
method constructor (line 7) | constructor(e,t){super(e),this.wrapper=t}
method isBlock (line 7) | isBlock(){return!0}
method covers (line 7) | covers(e){return this.children.length?e<0?this.children[0].covers(-1):th...
method domAttrs (line 7) | get domAttrs(){return this.wrapper.attributes}
method of (line 7) | static of(e,t){let i=new O(t||document.createElement(e.tagName),e);retur...
method constructor (line 7) | constructor(e,t){super(e),this.attrs=t}
method isLine (line 7) | isLine(){return!0}
method start (line 7) | static start(e,t,i){let r=new O(t||document.createElement("div"),e);retu...
method domAttrs (line 7) | get domAttrs(){return this.attrs}
method resolveInline (line 7) | resolveInline(e,t,i){let r=null,n=-1,s=null,a=-1;function o(c,h){for(let...
method coordsIn (line 7) | coordsIn(e,t){let i=this.resolveInline(e,t,!0);return i?i.tile.coordsIn(...
method domIn (line 7) | domIn(e,t){let i=this.resolveInline(e,t);if(i){let{tile:r,offset:n}=i;if...
function mP (line 7) | function mP(O){let e=O.dom.lastChild;if(!e)return O.dom.getBoundingClien...
function gP (line 7) | function gP(O,e){let t=O.coordsIn(0,1),i=e.coordsIn(0,1);return t&&i&&i....
method constructor (line 7) | constructor(e,t){super(e),this.mark=t}
method domAttrs (line 7) | get domAttrs(){return this.mark.attrs}
method of (line 7) | static of(e,t){let i=new O(t||document.createElement(e.tagName),e);retur...
method constructor (line 7) | constructor(e,t){super(e,t.length),this.text=t}
method sync (line 7) | sync(e){this.flags&2||(super.sync(e),this.dom.nodeValue!=this.text&&(e&&...
method isText (line 7) | isText(){return!0}
method toString (line 7) | toString(){return JSON.stringify(this.text)}
method coordsIn (line 7) | coordsIn(e,t){let i=this.dom.nodeValue.length;e>i&&(e=i);let r=e,n=e,s=0...
method of (line 7) | static of(e,t){let i=new O(t||document.createTextNode(e),e);return t||(i...
method constructor (line 7) | constructor(e,t,i,r){super(e,t,r),this.widget=i}
method isWidget (line 7) | isWidget(){return!0}
method isHidden (line 7) | get isHidden(){return this.widget.isHidden}
method covers (line 7) | covers(e){return this.flags&48?!1:(this.flags&(e<0?64:128))>0}
method coordsIn (line 7) | coordsIn(e,t){return this.coordsInWidget(e,t,!1)}
method coordsInWidget (line 7) | coordsInWidget(e,t,i){let r=this.widget.coordsAt(this.dom,e,t);if(r)retu...
method overrideDOMText (line 7) | get overrideDOMText(){if(!this.length)return E.empty;let{root:e}=this;if...
method destroy (line 7) | destroy(){super.destroy(),this.widget.destroy(this.dom)}
method of (line 7) | static of(e,t,i,r,n){return n||(n=e.toDOM(t),e.editable||(n.contentEdita...
method constructor (line 7) | constructor(e){let t=document.createElement("img");t.className="cm-widge...
method isHidden (line 7) | get isHidden(){return!0}
method overrideDOMText (line 7) | get overrideDOMText(){return E.empty}
method coordsIn (line 7) | coordsIn(e){return this.dom.getBoundingClientRect()}
method constructor (line 7) | constructor(e){this.index=0,this.beforeBreak=!1,this.parents=[],this.til...
method advance (line 7) | advance(e,t,i){let{tile:r,index:n,beforeBreak:s,parents:a}=this;for(;e||...
method root (line 7) | get root(){return this.parents.length?this.parents[0].tile:this.tile}
method constructor (line 7) | constructor(e,t,i,r){this.from=e,this.to=t,this.wrapper=i,this.rank=r}
method constructor (line 7) | constructor(e,t,i){this.cache=e,this.root=t,this.blockWrappers=i,this.cu...
method addText (line 7) | addText(e,t,i,r){var n;this.flushBuffer();let s=this.ensureMarks(t,i),a=...
method addComposition (line 7) | addComposition(e,t){let i=this.curLine;i.dom!=t.line.dom&&(i.setDOM(this...
method addInlineWidget (line 7) | addInlineWidget(e,t,i){let r=this.afterWidget&&e.flags&48&&(this.afterWi...
method addMark (line 7) | addMark(e,t,i){this.flushBuffer(),this.ensureMarks(t,i).append(e),this.p...
method addBlockWidget (line 7) | addBlockWidget(e){this.getBlockPos().append(e),this.pos+=e.length,this.l...
method continueWidget (line 7) | continueWidget(e){let t=this.afterWidget||this.lastBlock;t.length+=e,thi...
method addLineStart (line 7) | addLineStart(e,t){var i;e||(e=nd);let r=si.start(e,t||((i=this.cache.fin...
method addLine (line 7) | addLine(e){this.getBlockPos().append(e),this.pos+=e.length,this.lastBloc...
method addBreak (line 7) | addBreak(){this.lastBlock.flags|=1,this.endLine(),this.pos++}
method addLineStartIfNotCovered (line 7) | addLineStartIfNotCovered(e){this.blockPosCovered()||this.addLineStart(e)}
method ensureLine (line 7) | ensureLine(e){this.curLine||this.addLineStart(e)}
method ensureMarks (line 7) | ensureMarks(e,t){var i;let r=this.curLine;for(let n=e.length-1;n>=0;n--)...
method endLine (line 7) | endLine(){if(this.curLine){this.flushBuffer();let e=this.curLine.lastChi...
method updateBlockWrappers (line 7) | updateBlockWrappers(){this.wrapperPos>this.pos+1e4&&(this.blockWrappers....
method getBlockPos (line 7) | getBlockPos(){var e;this.updateBlockWrappers();let t=this.root;for(let i...
method blockPosCovered (line 7) | blockPosCovered(){let e=this.lastBlock;return e!=null&&!e.breakAfter&&(!...
method getBuffer (line 7) | getBuffer(e){let t=2|(e<0?16:32),i=this.cache.find(ai,void 0,1);return i...
method flushBuffer (line 7) | flushBuffer(){this.afterWidget&&!(this.afterWidget.flags&32)&&(this.afte...
method constructor (line 7) | constructor(e){this.skipCount=0,this.text="",this.textOff=0,this.cursor=...
method skip (line 7) | skip(e){this.textOff+e<=this.text.length?this.textOff+=e:(this.skipCount...
method next (line 7) | next(e){if(this.textOff==this.text.length){let{value:r,lineBreak:n,done:...
method constructor (line 7) | constructor(e){this.view=e,this.buckets=Sn.map(()=>[]),this.index=Sn.map...
method add (line 7) | add(e){let t=e.constructor.bucket,i=this.buckets[t];i.length<6?i.push(e)...
method find (line 7) | find(e,t,i=2){let r=e.bucket,n=this.buckets[r],s=this.index[r];for(let a...
method findWidget (line 7) | findWidget(e,t,i){let r=this.buckets[0];if(r.length)for(let n=0,s=0;;n++...
method reuse (line 7) | reuse(e){return this.reused.set(e,1),e}
method maybeReuse (line 7) | maybeReuse(e,t=2){if(!this.reused.has(e))return this.reused.set(e,t),e.dom}
method constructor (line 7) | constructor(e,t,i,r,n){this.view=e,this.decorations=r,this.disallowBlock...
method run (line 7) | run(e,t){let i=t&&this.getCompositionContext(t.text);for(let r=0,n=0,s=0...
method preserve (line 7) | preserve(e,t,i){let r=XP(this.old),n=this.openMarks;this.old.advance(e,i...
method emit (line 7) | emit(e,t){let i=null,r=this.builder,n=0,s=M.spans(this.decorations,e,t,{...
method forward (line 7) | forward(e,t){t-e<=10?this.old.advance(t-e,1,this.reuseWalker):(this.old....
method getCompositionContext (line 7) | getCompositionContext(e){let t=[],i=null;for(let r=e.parentNode;;r=r.par...
function tf (line 7) | function tf(O,e){let t=i=>{for(let r of i.children)if((e?r.isText():r.le...
function PP (line 7) | function PP(O){let e=O.isReplace?(O.startSide<0?64:0)|(O.endSide>0?128:0...
function SP (line 7) | function SP(O,e){let t=e.spec.attributes,i=e.spec.class;return!t&&!i||(O...
function XP (line 7) | function XP(O){let e=[];for(let t=O.parents.length;t>1;t--){let i=t==O.p...
function fa (line 7) | function fa(O){let e=de.get(O);return e&&e.setDOM(O.cloneNode()),O}
method constructor (line 7) | constructor(e){super(),this.tag=e}
method eq (line 7) | eq(e){return e.tag==this.tag}
method toDOM (line 7) | toDOM(){return document.createElement(this.tag)}
method updateDOM (line 7) | updateDOM(e){return e.nodeName.toLowerCase()==this.tag}
method isHidden (line 7) | get isHidden(){return!0}
method toDOM (line 7) | toDOM(){return document.createElement("br")}
method isHidden (line 7) | get isHidden(){return!0}
method editable (line 7) | get editable(){return!0}
method constructor (line 7) | constructor(e){this.view=e,this.decorations=[],this.blockWrappers=[],thi...
method update (line 7) | update(e){var t;let i=e.changedRanges;this.minWidth>0&&i.length&&(i.ever...
method updateInner (line 7) | updateInner(e,t){this.view.viewState.mustMeasureContent=!0;let{observer:...
method updateEditContextFormatting (line 7) | updateEditContextFormatting(e){this.editContextFormatting=this.editConte...
method updateSelection (line 7) | updateSelection(e=!1,t=!1){(e||!this.view.observer.selectionRange.focusN...
method suppressWidgetCursorChange (line 7) | suppressWidgetCursorChange(e,t){return this.hasComposition&&t.empty&&Wi(...
method enforceCursorAssoc (line 7) | enforceCursorAssoc(){if(this.hasComposition)return;let{view:e}=this,t=e....
method posFromDOM (line 7) | posFromDOM(e,t){let i=this.tile.nearest(e);if(!i)return this.tile.dom.co...
method domAtPos (line 7) | domAtPos(e,t){let{tile:i,offset:r}=this.tile.resolveBlock(e,t);return i....
method inlineDOMNearPos (line 7) | inlineDOMNearPos(e,t){let i,r=-1,n=!1,s,a=-1,o=!1;return this.tile.block...
method coordsAt (line 7) | coordsAt(e,t){let{tile:i,offset:r}=this.tile.resolveBlock(e,t);return i....
method lineAt (line 7) | lineAt(e,t){let{tile:i}=this.tile.resolveBlock(e,t);return i.isLine()?i:...
method coordsForChar (line 7) | coordsForChar(e){let{tile:t,offset:i}=this.tile.resolveBlock(e,1);if(!t....
method measureVisibleLineHeights (line 7) | measureVisibleLineHeights(e){let t=[],{from:i,to:r}=e,n=this.view.conten...
method textDirectionAt (line 7) | textDirectionAt(e){let{tile:t}=this.tile.resolveBlock(e,1);return getCom...
method measureTextSize (line 7) | measureTextSize(){let e=this.tile.blockTiles(s=>{if(s.isLine()&&s.childr...
method computeBlockGapDeco (line 7) | computeBlockGapDeco(){let e=[],t=this.view.viewState;for(let i=0,r=0;;r+...
method updateDeco (line 7) | updateDeco(){let e=1,t=this.view.state.facet(Fi).map(n=>(this.dynamicDec...
method scrollIntoView (line 7) | scrollIntoView(e){if(e.isSnapshot){let l=this.view.viewState.lineBlockAt...
method lineHasWidget (line 7) | lineHasWidget(e){let t=i=>i.isWidget()||i.children.some(t);return t(this...
method destroy (line 7) | destroy(){qa(this.tile)}
function qa (line 7) | function qa(O,e){let t=e?.get(O);if(t!=1){t==null&&O.destroy();for(let i...
function TP (line 7) | function TP(O){return O.node.nodeType==1&&O.node.firstChild&&(O.offset==...
function sd (line 7) | function sd(O,e){let t=O.observer.selectionRange;if(!t.focusNode)return ...
function bP (line 7) | function bP(O,e,t){let i=sd(O,t);if(!i)return null;let{node:r,from:n,to:...
function yP (line 7) | function yP(O,e){return O.nodeType!=1?0:(e&&O.childNodes[e-1].contentEdi...
method constructor (line 7) | constructor(){this.changes=[]}
method compareRange (line 7) | compareRange(e,t){Oi(e,t,this.changes)}
method comparePoint (line 7) | comparePoint(e,t){Oi(e,t,this.changes)}
method boundChange (line 7) | boundChange(e){Oi(e,e,this.changes)}
function kP (line 7) | function kP(O,e,t){let i=new xP;return M.compare(O,e,t,i),i.changes}
method constructor (line 7) | constructor(){this.changes=[]}
method compareRange (line 7) | compareRange(e,t){Oi(e,t,this.changes)}
method comparePoint (line 7) | comparePoint(){}
method boundChange (line 7) | boundChange(e){Oi(e,e,this.changes)}
function wP (line 7) | function wP(O,e,t){let i=new za;return M.compare(O,e,t,i),i.changes}
function ZP (line 7) | function ZP(O,e){for(let t=O;t&&t!=e;t=t.assignedSlot||t.parentNode)if(t...
function vP (line 7) | function vP(O,e){let t=!1;return e&&O.iterChangedRanges((i,r)=>{i<e.to&&...
method constructor (line 7) | constructor(e){super(),this.height=e}
method toDOM (line 7) | toDOM(){let e=document.createElement("div");return e.className="cm-gap",...
method eq (line 7) | eq(e){return e.height==this.height}
method updateDOM (line 7) | updateDOM(e){return e.style.height=this.height+"px",!0}
method editable (line 7) | get editable(){return!0}
method estimatedHeight (line 7) | get estimatedHeight(){return this.height}
method ignoreEvent (line 7) | ignoreEvent(){return!1}
function YP (line 7) | function YP(O,e,t=1){let i=O.charCategorizer(e),r=O.doc.lineAt(e),n=e-r....
function _P (line 7) | function _P(O,e,t,i,r){let n=Math.round((i-e.left)*O.defaultCharacterWid...
function Ua (line 7) | function Ua(O,e,t){let i=O.lineBlockAt(e);if(Array.isArray(i.type)){let ...
function RP (line 7) | function RP(O,e,t,i){let r=Ua(O,e.head,e.assoc||-1),n=!i||r.type!=Te.Tex...
function Of (line 7) | function Of(O,e,t,i){let r=O.state.doc.lineAt(e.head),n=O.bidiSpans(r),s...
function VP (line 8) | function VP(O,e,t){let i=O.state.charCategorizer(e),r=i(t);return n=>{le...
function qP (line 8) | function qP(O,e,t,i){let r=e.head,n=t?1:-1;if(r==(t?O.state.doc.length:0...
function Ei (line 8) | function Ei(O,e,t){for(;;){let i=0;for(let r of O)r.between(e-1,e+1,(n,s...
function ad (line 8) | function ad(O,e){let t=null;for(let i=0;i<e.ranges.length;i++){let r=e.r...
function ua (line 8) | function ua(O,e,t){let i=Ei(O.state.facet(Ji).map(r=>r(O)),t.from,e.head...
method constructor (line 8) | constructor(e,t){this.pos=e,this.assoc=t}
function Wa (line 8) | function Wa(O,e,t,i){let r=O.contentDOM.getBoundingClientRect(),n=r.top+...
function od (line 8) | function od(O,e,t,i,r){let n=-1,s=null,a=1e9,o=1e9,l=r,c=r,h=(f,u)=>{for...
function rf (line 8) | function rf(O,e){let t=O.state.doc.lineAt(e);return O.bidiSpans(t)[ct.fi...
method constructor (line 8) | constructor(e,t){this.points=e,this.view=t,this.text="",this.lineSeparat...
method append (line 8) | append(e){this.text+=e}
method lineBreak (line 8) | lineBreak(){this.text+=qi}
method readRange (line 8) | readRange(e,t){if(!e)return this;let i=e.parentNode;for(let r=e;;){this....
method readTextNode (line 8) | readTextNode(e){let t=e.nodeValue;for(let i of this.points)i.node==e&&(i...
method readNode (line 8) | readNode(e){let t=de.get(e),i=t&&t.overrideDOMText;if(i!=null){this.find...
method findPointBefore (line 8) | findPointBefore(e,t){for(let i of this.points)i.node==e&&e.childNodes[i....
method findPointInside (line 8) | findPointInside(e,t){for(let i of this.points)(e.nodeType==3?i.node==e:e...
function zP (line 8) | function zP(O,e,t){for(;;){if(!e||t<Rt(e))return!1;if(e==O)return!0;t=Nt...
function UP (line 8) | function UP(O,e){let t;for(;!(O==e||!O);O=O.nextSibling){let i=de.get(O)...
method constructor (line 8) | constructor(e,t){this.node=e,this.offset=t,this.pos=-1}
method constructor (line 8) | constructor(e,t,i,r){this.typeOver=r,this.bounds=null,this.text="",this....
function ld (line 8) | function ld(O,e,t,i){if(O.isComposite()){let r=-1,n=-1,s=-1,a=-1;for(let...
function cd (line 8) | function cd(O,e){let t,{newSel:i}=e,r=O.state.selection.main,n=O.inputSt...
function So (line 9) | function So(O,e,t,i=-1){if(v.ios&&O.inputState.flushIOSKey(e))return!0;l...
function WP (line 9) | function WP(O,e,t){let i,r=O.state,n=r.selection.main,s=-1;if(e.from==e....
function hd (line 9) | function hd(O,e,t,i){let r=Math.min(O.length,e.length),n=0;for(;n<r&&O.c...
function jP (line 9) | function jP(O){let e=[];if(O.root.activeElement!=O.contentDOM)return e;l...
function CP (line 9) | function CP(O,e){if(O.length==0)return null;let t=O[0].pos,i=O.length==2...
method setSelectionOrigin (line 9) | setSelectionOrigin(e){this.lastSelectionOrigin=e,this.lastSelectionTime=...
method constructor (line 9) | constructor(e){this.view=e,this.lastKeyCode=0,this.lastKeyTime=0,this.la...
method handleEvent (line 9) | handleEvent(e){!IP(this.view,e)||this.ignoreDuringComposition(e)||e.type...
method runHandlers (line 9) | runHandlers(e,t){let i=this.handlers[e];if(i){for(let r of i.observers)r...
method ensureHandlers (line 9) | ensureHandlers(e){let t=GP(e),i=this.handlers,r=this.view.contentDOM;for...
method keydown (line 9) | keydown(e){if(this.lastKeyCode=e.keyCode,this.lastKeyTime=Date.now(),e.k...
method flushIOSKey (line 9) | flushIOSKey(e){let t=this.pendingIOSKey;return!t||t.key=="Enter"&&e&&e.f...
method ignoreDuringComposition (line 9) | ignoreDuringComposition(e){return!/^key/.test(e.type)||e.synthetic?!1:th...
method startMouseSelection (line 9) | startMouseSelection(e){this.mouseSelection&&this.mouseSelection.destroy(...
method update (line 9) | update(e){this.view.observer.update(e),this.mouseSelection&&this.mouseSe...
method destroy (line 9) | destroy(){this.mouseSelection&&this.mouseSelection.destroy()}
function nf (line 9) | function nf(O,e){return(t,i)=>{try{return e.call(O,i,t)}catch(r){Xe(t.st...
function GP (line 9) | function GP(O){let e=Object.create(null);function t(i){return e[i]||(e[i...
function On (line 9) | function On(O){return Math.max(0,O)*.7+8}
function AP (line 9) | function AP(O,e){return Math.max(Math.abs(O.clientX-e.clientX),Math.abs(...
method constructor (line 9) | constructor(e,t,i,r){this.view=e,this.startEvent=t,this.style=i,this.mus...
method start (line 9) | start(e){this.dragging===!1&&this.select(e)}
method move (line 9) | move(e){if(e.buttons==0)return this.destroy();if(this.dragging||this.dra...
method up (line 9) | up(e){this.dragging==null&&this.select(this.lastEvent),this.dragging||e....
method destroy (line 9) | destroy(){this.setScrollSpeed(0,0);let e=this.view.contentDOM.ownerDocum...
method setScrollSpeed (line 9) | setScrollSpeed(e,t){this.scrollSpeed={x:e,y:t},e||t?this.scrolling<0&&(t...
method scroll (line 9) | scroll(){let{x:e,y:t}=this.scrollSpeed;e&&this.scrollParents.x&&(this.sc...
method select (line 9) | select(e){let{view:t}=this,i=ad(this.atoms,this.style.get(e,this.extend,...
method update (line 9) | update(e){e.transactions.some(t=>t.isUserEvent("input.type"))?this.destr...
function LP (line 9) | function LP(O,e){let t=O.state.facet(Lf);return t.length?t[0](e):v.mac?e...
function MP (line 9) | function MP(O,e){let t=O.state.facet(Mf);return t.length?t[0](e):v.mac?!...
function DP (line 9) | function DP(O,e){let{main:t}=O.state.selection;if(t.empty)return!1;let i...
function IP (line 9) | function IP(O,e){if(!e.bubbles)return!0;if(e.defaultPrevented)return!1;f...
function BP (line 9) | function BP(O){let e=O.dom.parentNode;if(!e)return;let t=e.appendChild(d...
function Vn (line 9) | function Vn(O,e,t){for(let i of O.facet(e))t=i(t,O);return t}
function Qd (line 9) | function Qd(O,e){e=Vn(O.state,po,e);let{state:t}=O,i,r=1,n=t.toText(e),s...
function sf (line 9) | function sf(O,e,t,i){if(i==1)return S.cursor(e,t);if(i==2)return YP(O.st...
function $d (line 9) | function $d(O){if(!NP)return O.detail;let e=af,t=lf;return af=O,lf=Date....
function FP (line 9) | function FP(O,e){let t=O.posAndSideAtCoords({x:e.clientX,y:e.clientY},!1...
function HP (line 9) | function HP(O,e){for(let t=0;t<O.ranges.length;t++){let{from:i,to:r}=O.r...
function cf (line 9) | function cf(O,e,t,i){if(t=Vn(O.state,po,t),!t)return;let r=O.posAtCoords...
function KP (line 9) | function KP(O,e){let t=O.dom.parentNode;if(!t)return;let i=t.appendChild...
function JP (line 9) | function JP(O){let e=[],t=[],i=!1;for(let r of O.selection.ranges)r.empt...
function md (line 9) | function md(O,e){let t=[];for(let i of O.facet(Nf)){let r=i(O,e);r&&t.pu...
function gd (line 9) | function gd(O){setTimeout(()=>{let e=O.hasFocus;if(e!=O.inputState.notif...
function eS (line 9) | function eS(O){hf.has(O)||(hf.add(O),O.addEventListener("copy",()=>{}),O...
function df (line 9) | function df(){oi=!1}
method constructor (line 9) | constructor(e){this.lineWrapping=e,this.doc=E.empty,this.heightSamples={...
method heightForGap (line 9) | heightForGap(e,t){let i=this.doc.lineAt(t).number-this.doc.lineAt(e).num...
method heightForLine (line 9) | heightForLine(e){return this.lineWrapping?(1+Math.max(0,Math.ceil((e-thi...
method setDoc (line 9) | setDoc(e){return this.doc=e,this}
method mustRefreshForWrapping (line 9) | mustRefreshForWrapping(e){return ff.indexOf(e)>-1!=this.lineWrapping}
method mustRefreshForHeights (line 9) | mustRefreshForHeights(e){let t=!1;for(let i=0;i<e.length;i++){let r=e[i]...
method refresh (line 9) | refresh(e,t,i,r,n,s){let a=ff.indexOf(e)>-1,o=Math.round(t)!=Math.round(...
method constructor (line 9) | constructor(e,t){this.from=e,this.heights=t,this.index=0}
method more (line 9) | get more(){return this.index<this.heights.length}
method constructor (line 9) | constructor(e,t,i,r,n){this.from=e,this.length=t,this.top=i,this.height=...
method type (line 9) | get type(){return typeof this._content=="number"?Te.Text:Array.isArray(t...
method to (line 9) | get to(){return this.from+this.length}
method bottom (line 9) | get bottom(){return this.top+this.height}
method widget (line 9) | get widget(){return this._content instanceof PO?this._content.widget:null}
method widgetLineBreaks (line 9) | get widgetLineBreaks(){return typeof this._content=="number"?this._conte...
method join (line 9) | join(e){let t=(Array.isArray(this._content)?this._content:[this]).concat...
method constructor (line 9) | constructor(e,t,i=2){this.length=e,this.height=t,this.flags=i}
method outdated (line 9) | get outdated(){return(this.flags&2)>0}
method outdated (line 9) | set outdated(e){this.flags=(e?2:0)|this.flags&-3}
method setHeight (line 9) | setHeight(e){this.height!=e&&(Math.abs(this.height-e)>fn&&(oi=!0),this.h...
method replace (line 9) | replace(e,t,i){return O.of(i)}
method decomposeLeft (line 9) | decomposeLeft(e,t){t.push(this)}
method decomposeRight (line 9) | decomposeRight(e,t){t.push(this)}
method applyChanges (line 9) | applyChanges(e,t,i,r){let n=this,s=i.doc;for(let a=r.length-1;a>=0;a--){...
method empty (line 9) | static empty(){return new it(0,0,0)}
method of (line 9) | static of(e){if(e.length==1)return e[0];let t=0,i=e.length,r=0,n=0;for(;...
function bn (line 9) | function bn(O,e){return O==e?O:(O.constructor!=e.constructor&&(oi=!0),e)}
method constructor (line 9) | constructor(e,t,i){super(e,t),this.deco=i,this.spaceAbove=0}
method mainBlock (line 9) | mainBlock(e,t){return new lt(t,this.length,e+this.spaceAbove,this.height...
method blockAt (line 9) | blockAt(e,t,i,r){return this.spaceAbove&&e<i+this.spaceAbove?new lt(r,0,...
method lineAt (line 9) | lineAt(e,t,i,r,n){let s=this.mainBlock(r,n);return this.spaceAbove?this....
method forEachLine (line 9) | forEachLine(e,t,i,r,n,s){e<=n+this.length&&t>=n&&s(this.lineAt(0,oe.ByPo...
method setMeasuredHeight (line 9) | setMeasuredHeight(e){let t=e.heights[e.index++];t<0?(this.spaceAbove=-t,...
method updateHeight (line 9) | updateHeight(e,t=0,i=!1,r){return r&&r.from<=t&&r.more&&this.setMeasured...
method toString (line 9) | toString(){return`block(${this.length})`}
method constructor (line 9) | constructor(e,t,i){super(e,t,null),this.collapsed=0,this.widgetHeight=0,...
method mainBlock (line 9) | mainBlock(e,t){return new lt(t,this.length,e+this.spaceAbove,this.height...
method replace (line 9) | replace(e,t,i){let r=i[0];return i.length==1&&(r instanceof O||r instanc...
method updateHeight (line 9) | updateHeight(e,t=0,i=!1,r){return r&&r.from<=t&&r.more?this.setMeasuredH...
method toString (line 9) | toString(){return`line(${this.length}${this.collapsed?-this.collapsed:""...
method constructor (line 9) | constructor(e){super(e,0)}
method heightMetrics (line 9) | heightMetrics(e,t){let i=e.doc.lineAt(t).number,r=e.doc.lineAt(t+this.le...
method blockAt (line 9) | blockAt(e,t,i,r){let{firstLine:n,lastLine:s,perLine:a,perChar:o}=this.he...
method lineAt (line 9) | lineAt(e,t,i,r,n){if(t==oe.ByHeight)return this.blockAt(e,i,r,n);if(t==o...
method forEachLine (line 9) | forEachLine(e,t,i,r,n,s){e=Math.max(e,n),t=Math.min(t,n+this.length);let...
method replace (line 9) | replace(e,t,i){let r=this.length-t;if(r>0){let n=i[i.length-1];n instanc...
method decomposeLeft (line 9) | decomposeLeft(e,t){t.push(new O(e-1),null)}
method decomposeRight (line 9) | decomposeRight(e,t){t.push(null,new O(this.length-e-1))}
method updateHeight (line 9) | updateHeight(e,t=0,i=!1,r){let n=t+this.length;if(r&&r.from<=t+this.leng...
method toString (line 9) | toString(){return`gap(${this.length})`}
method constructor (line 9) | constructor(e,t,i){super(e.length+t+i.length,e.height+i.height,t|(e.outd...
method break (line 9) | get break(){return this.flags&1}
method blockAt (line 9) | blockAt(e,t,i,r){let n=i+this.left.height;return e<n?this.left.blockAt(e...
method lineAt (line 9) | lineAt(e,t,i,r,n){let s=r+this.left.height,a=n+this.left.length+this.bre...
method forEachLine (line 9) | forEachLine(e,t,i,r,n,s){let a=r+this.left.height,o=n+this.left.length+t...
method replace (line 9) | replace(e,t,i){let r=this.left.length+this.break;if(t<r)return this.bala...
method decomposeLeft (line 9) | decomposeLeft(e,t){let i=this.left.length;if(e<=i)return this.left.decom...
method decomposeRight (line 9) | decomposeRight(e,t){let i=this.left.length,r=i+this.break;if(e>=r)return...
method balanced (line 9) | balanced(e,t){return e.size>2*t.size||t.size>2*e.size?De.of(this.break?[...
method updateHeight (line 9) | updateHeight(e,t=0,i=!1,r){let{left:n,right:s}=this,a=t+n.length+this.br...
method toString (line 9) | toString(){return this.left+(this.break?" ":"-")+this.right}
function uf (line 9) | function uf(O,e){let t,i;O[e]==null&&(t=O[e-1])instanceof Bt&&(i=O[e+1])...
method constructor (line 9) | constructor(e,t){this.pos=e,this.oracle=t,this.nodes=[],this.lineStart=-...
method isCovered (line 9) | get isCovered(){return this.covering&&this.nodes[this.nodes.length-1]==t...
method span (line 9) | span(e,t){if(this.lineStart>-1){let i=Math.min(t,this.lineEnd),r=this.no...
method point (line 9) | point(e,t,i){if(e<t||i.heightRelevant){let r=i.widget?i.widget.estimated...
method enterLine (line 9) | enterLine(){if(this.lineStart>-1)return;let{from:e,to:t}=this.oracle.doc...
method blankContent (line 9) | blankContent(e,t){let i=new Bt(t-e);return this.oracle.doc.lineAt(e).to=...
method ensureLine (line 9) | ensureLine(){this.enterLine();let e=this.nodes.length?this.nodes[this.no...
method addBlock (line 9) | addBlock(e){this.enterLine();let t=e.deco;t&&t.startSide>0&&!this.isCove...
method addLineDeco (line 9) | addLineDeco(e,t,i){let r=this.ensureLine();r.length+=i,r.collapsed+=i,r....
method finish (line 9) | finish(e){let t=this.nodes.length==0?null:this.nodes[this.nodes.length-1...
method build (line 9) | static build(e,t,i,r){let n=new O(i,e);return M.spans(t,i,r,n,0),n.finis...
function iS (line 9) | function iS(O,e,t){let i=new Ba;return M.compare(O,e,t,i,0),i.changes}
method constructor (line 9) | constructor(){this.changes=[]}
method compareRange (line 9) | compareRange(){}
method comparePoint (line 9) | comparePoint(e,t,i,r){(e<t||i&&i.heightRelevant||r&&r.heightRelevant)&&O...
function rS (line 9) | function rS(O,e){let t=O.getBoundingClientRect(),i=O.ownerDocument,r=i.d...
function nS (line 9) | function nS(O){let e=O.getBoundingClientRect(),t=O.ownerDocument.default...
function sS (line 9) | function sS(O,e){let t=O.getBoundingClientRect();return{left:0,right:t.r...
method constructor (line 9) | constructor(e,t,i,r){this.from=e,this.to=t,this.size=i,this.displaySize=r}
method same (line 9) | static same(e,t){if(e.length!=t.length)return!1;for(let i=0;i<e.length;i...
method draw (line 9) | draw(e,t){return Y.replace({widget:new Na(this.displaySize*(t?e.scaleY:e...
method constructor (line 9) | constructor(e,t){super(),this.size=e,this.vertical=t}
method eq (line 9) | eq(e){return e.size==this.size&&e.vertical==this.vertical}
method toDOM (line 9) | toDOM(){let e=document.createElement("div");return this.vertical?e.style...
method estimatedHeight (line 9) | get estimatedHeight(){return this.vertical?this.size:-1}
method constructor (line 9) | constructor(e){this.state=e,this.pixelViewport={left:0,right:window.inne...
method updateForViewport (line 9) | updateForViewport(){let e=[this.viewport],{main:t}=this.state.selection;...
method updateScaler (line 9) | updateScaler(){let e=this.scaler;return this.scaler=this.heightMap.heigh...
method updateViewportLines (line 9) | updateViewportLines(){this.viewportLines=[],this.heightMap.forEachLine(t...
method update (line 9) | update(e,t=null){this.state=e.state;let i=this.stateDeco;this.stateDeco=...
method measure (line 9) | measure(e){let t=e.contentDOM,i=window.getComputedStyle(t),r=this.height...
method visibleTop (line 9) | get visibleTop(){return this.scaler.fromDOM(this.pixelViewport.top)}
method visibleBottom (line 9) | get visibleBottom(){return this.scaler.fromDOM(this.pixelViewport.bottom)}
method getViewport (line 9) | getViewport(e,t){let i=.5-Math.max(-.5,Math.min(.5,e/1e3/2)),r=this.heig...
method mapViewport (line 9) | mapViewport(e,t){let i=t.mapPos(e.from,-1),r=t.mapPos(e.to,1);return new...
method viewportIsAppropriate (line 9) | viewportIsAppropriate({from:e,to:t},i=0){if(!this.inView)return!0;let{to...
method mapLineGaps (line 9) | mapLineGaps(e,t){if(!e.length||t.empty)return e;let i=[];for(let r of e)...
method ensureLineGaps (line 9) | ensureLineGaps(e,t){let i=this.heightOracle.lineWrapping,r=i?1e4:2e3,n=r...
method gapSize (line 9) | gapSize(e,t,i,r){let n=nn(r,i)-nn(r,t);return this.heightOracle.lineWrap...
method updateLineGaps (line 9) | updateLineGaps(e){Ai.same(e,this.lineGaps)||(this.lineGaps=e,this.lineGa...
method computeVisibleRanges (line 9) | computeVisibleRanges(e){let t=this.stateDeco;this.lineGaps.length&&(t=t....
method lineBlockAt (line 9) | lineBlockAt(e){return e>=this.viewport.from&&e<=this.viewport.to&&this.v...
method lineBlockAtHeight (line 9) | lineBlockAtHeight(e){return e>=this.viewportLines[0].top&&e<=this.viewpo...
method scrollAnchorAt (line 9) | scrollAnchorAt(e){let t=this.lineBlockAtHeight(e+8);return t.from>=this....
method elementAtHeight (line 9) | elementAtHeight(e){return zi(this.heightMap.blockAt(this.scaler.fromDOM(...
method docHeight (line 9) | get docHeight(){return this.scaler.toDOM(this.heightMap.height)}
method contentHeight (line 9) | get contentHeight(){return this.docHeight+this.paddingTop+this.paddingBo...
method constructor (line 9) | constructor(e,t){this.from=e,this.to=t}
function aS (line 9) | function aS(O,e,t){let i=[],r=O,n=0;return M.spans(t,O,e,{span(){},point...
function rn (line 9) | function rn({total:O,ranges:e},t){if(t<=0)return e[0].from;if(t>=1)retur...
function nn (line 9) | function nn(O,e){let t=0;for(let{from:i,to:r}of O.ranges){if(e<=r){t+=e-...
function oS (line 9) | function oS(O,e){for(let t of O)if(e(t))return t}
method toDOM (line 9) | toDOM(O){return O}
method fromDOM (line 9) | fromDOM(O){return O}
method eq (line 9) | eq(O){return O==this}
method constructor (line 9) | constructor(e,t,i){let r=0,n=0,s=0;this.viewports=i.map(({from:a,to:o})=...
method toDOM (line 9) | toDOM(e){for(let t=0,i=0,r=0;;t++){let n=t<this.viewports.length?this.vi...
method fromDOM (line 9) | fromDOM(e){for(let t=0,i=0,r=0;;t++){let n=t<this.viewports.length?this....
method eq (line 9) | eq(e){return e instanceof O?this.scale==e.scale&&this.viewports.length==...
function zi (line 9) | function zi(O,e){if(e.scale==1)return O;let t=e.toDOM(O.top),i=e.toDOM(O...
function Ja (line 9) | function Ja(O,e,t){return new Ot(e,{finish(i){return/&/.test(i)?i.replac...
method constructor (line 9) | constructor(e){this.view=e,this.active=!1,this.editContext=null,this.sel...
method onScrollChanged (line 9) | onScrollChanged(e){this.view.inputState.runHandlers("scroll",e),this.int...
method onScroll (line 9) | onScroll(e){this.intersecting&&this.flush(!1),this.editContext&&this.vie...
method onResize (line 9) | onResize(){this.resizeTimeout<0&&(this.resizeTimeout=setTimeout(()=>{thi...
method onPrint (line 9) | onPrint(e){(e.type=="change"||!e.type)&&!e.matches||(this.view.viewState...
method updateGaps (line 9) | updateGaps(e){if(this.gapIntersection&&(e.length!=this.gaps.length||this...
method onSelectionChange (line 9) | onSelectionChange(e){let t=this.selectionChanged;if(!this.readSelectionR...
method readSelectionRange (line 9) | readSelectionRange(){let{view:e}=this,t=Bi(e.root);if(!t)return!1;let i=...
method setSelectionRange (line 9) | setSelectionRange(e,t){this.selectionRange.set(e.node,e.offset,t.node,t....
method clearSelectionRange (line 9) | clearSelectionRange(){this.selectionRange.set(null,0,null,0)}
method listenForScroll (line 9) | listenForScroll(){this.parentCheck=-1;let e=0,t=null;for(let i=this.dom;...
method ignore (line 9) | ignore(e){if(!this.active)return e();try{return this.stop(),e()}finally{...
method start (line 9) | start(){this.active||(this.observer.observe(this.dom,cS),Qa&&this.dom.ad...
method stop (line 9) | stop(){this.active&&(this.active=!1,this.observer.disconnect(),Qa&&this....
method clear (line 9) | clear(){this.processRecords(),this.queue.length=0,this.selectionChanged=!1}
method delayAndroidKey (line 9) | delayAndroidKey(e,t){var i;if(!this.delayedAndroidKey){let r=()=>{let n=...
method clearDelayedAndroidKey (line 9) | clearDelayedAndroidKey(){this.win.cancelAnimationFrame(this.flushingAndr...
method flushSoon (line 9) | flushSoon(){this.delayedFlush<0&&(this.delayedFlush=this.view.win.reques...
method forceFlush (line 9) | forceFlush(){this.delayedFlush>=0&&(this.view.win.cancelAnimationFrame(t...
method pendingRecords (line 9) | pendingRecords(){for(let e of this.observer.takeRecords())this.queue.pus...
method processRecords (line 9) | processRecords(){let e=this.pendingRecords();e.length&&(this.queue=[]);l...
method readChange (line 9) | readChange(){let{from:e,to:t,typeOver:i}=this.processRecords(),r=this.se...
method flush (line 9) | flush(e=!0){if(this.delayedFlush>=0||this.delayedAndroidKey)return!1;e&&...
method readMutation (line 9) | readMutation(e){let t=this.view.docView.tile.nearest(e.target);if(!t||t....
method setWindow (line 9) | setWindow(e){e!=this.win&&(this.removeWindowListeners(this.win),this.win...
method addWindowListeners (line 9) | addWindowListeners(e){e.addEventListener("resize",this.onResize),this.pr...
method removeWindowListeners (line 9) | removeWindowListeners(e){e.removeEventListener("scroll",this.onScroll),e...
method update (line 9) | update(e){this.editContext&&(this.editContext.update(e),e.startState.fac...
method destroy (line 9) | destroy(){var e,t,i;this.stop(),(e=this.intersection)===null||e===void 0...
function $f (line 9) | function $f(O,e,t){for(;e;){let i=de.get(e);if(i&&i.parent==O)return i;l...
function pf (line 9) | function pf(O,e){let t=e.startContainer,i=e.startOffset,r=e.endContainer...
function hS (line 9) | function hS(O,e){if(e.getComposedRanges){let r=e.getComposedRanges(O.roo...
method constructor (line 9) | constructor(e){this.from=0,this.to=0,this.pendingContextChange=null,this...
method applyEdits (line 10) | applyEdits(e){let t=0,i=!1,r=this.pendingContextChange;return e.changes....
method update (line 10) | update(e){let t=this.pendingContextChange,i=e.startState.selection.main;...
method resetRange (line 10) | resetRange(e){let{head:t}=e.selection.main;this.from=Math.max(0,t-1e4),t...
method reset (line 10) | reset(e){this.resetRange(e),this.editContext.updateText(0,this.editConte...
method revertPending (line 10) | revertPending(e){let t=this.pendingContextChange;this.pendingContextChan...
method setSelection (line 10) | setSelection(e){let{main:t}=e.selection,i=this.toContextPos(Math.max(thi...
method rangeIsValid (line 10) | rangeIsValid(e){let{head:t}=e.selection.main;return!(this.from>0&&t-this...
method toEditorPos (line 10) | toEditorPos(e,t=this.to-this.from){e=Math.min(e,t);let i=this.composing;...
method toContextPos (line 10) | toContextPos(e){let t=this.composing;return t&&t.drifted?t.contextBase+(...
method destroy (line 10) | destroy(){for(let e in this.handlers)this.editContext.removeEventListene...
method state (line 10) | get state(){return this.viewState.state}
method viewport (line 10) | get viewport(){return this.viewState.viewport}
method visibleRanges (line 10) | get visibleRanges(){return this.viewState.visibleRanges}
method inView (line 10) | get inView(){return this.viewState.inView}
method composing (line 10) | get composing(){return!!this.inputState&&this.inputState.composing>0}
method compositionStarted (line 10) | get compositionStarted(){return!!this.inputState&&this.inputState.compos...
method root (line 10) | get root(){return this._root}
method win (line 10) | get win(){return this.dom.ownerDocument.defaultView||window}
method constructor (line 10) | constructor(e={}){var t;this.plugins=[],this.pluginMap=new Map,this.edit...
method dispatch (line 10) | dispatch(...e){let t=e.length==1&&e[0]instanceof Qe?e:e.length==1&&Array...
method update (line 10) | update(e){if(this.updateState!=0)throw new Error("Calls to EditorView.up...
method setState (line 10) | setState(e){if(this.updateState!=0)throw new Error("Calls to EditorView....
method updatePlugins (line 10) | updatePlugins(e){let t=e.startState.facet(KO),i=e.state.facet(KO);if(t!=...
method docViewUpdate (line 10) | docViewUpdate(){for(let e of this.plugins){let t=e.value;if(t&&t.docView...
method measure (line 10) | measure(e=!0){if(this.destroyed)return;if(this.measureScheduled>-1&&this...
method themeClasses (line 10) | get themeClasses(){return Ka+" "+(this.state.facet(Ha)?Sd:Pd)+" "+this.s...
method updateAttrs (line 10) | updateAttrs(){let e=gf(this,ed,{class:"cm-editor"+(this.hasFocus?" cm-fo...
method showAnnouncements (line 10) | showAnnouncements(e){let t=!0;for(let i of e)for(let r of i.effects)if(r...
method mountStyles (line 10) | mountStyles(){this.styleModules=this.state.facet(Vi);let e=this.state.fa...
method readMeasured (line 10) | readMeasured(){if(this.updateState==2)throw new Error("Reading the edito...
method requestMeasure (line 10) | requestMeasure(e){if(this.measureScheduled<0&&(this.measureScheduled=thi...
method plugin (line 10) | plugin(e){let t=this.pluginMap.get(e);return(t===void 0||t&&t.plugin!=e)...
method documentTop (line 10) | get documentTop(){return this.contentDOM.getBoundingClientRect().top+thi...
method documentPadding (line 10) | get documentPadding(){return{top:this.viewState.paddingTop,bottom:this.v...
method scaleX (line 10) | get scaleX(){return this.viewState.scaleX}
method scaleY (line 10) | get scaleY(){return this.viewState.scaleY}
method elementAtHeight (line 10) | elementAtHeight(e){return this.readMeasured(),this.viewState.elementAtHe...
method lineBlockAtHeight (line 10) | lineBlockAtHeight(e){return this.readMeasured(),this.viewState.lineBlock...
method viewportLineBlocks (line 10) | get viewportLineBlocks(){return this.viewState.viewportLines}
method lineBlockAt (line 10) | lineBlockAt(e){return this.viewState.lineBlockAt(e)}
method contentHeight (line 10) | get contentHeight(){return this.viewState.contentHeight}
method moveByChar (line 10) | moveByChar(e,t,i){return ua(this,e,Of(this,e,t,i))}
method moveByGroup (line 10) | moveByGroup(e,t){return ua(this,e,Of(this,e,t,i=>VP(this,e.head,i)))}
method visualLineSide (line 10) | visualLineSide(e,t){let i=this.bidiSpans(e),r=this.textDirectionAt(e.fro...
method moveToLineBoundary (line 10) | moveToLineBoundary(e,t,i=!0){return RP(this,e,t,i)}
method moveVertically (line 10) | moveVertically(e,t,i){return ua(this,e,qP(this,e,t,i))}
method domAtPos (line 10) | domAtPos(e,t=1){return this.docView.domAtPos(e,t)}
method posAtDOM (line 10) | posAtDOM(e,t=0){return this.docView.posFromDOM(e,t)}
method posAtCoords (line 10) | posAtCoords(e,t=!0){this.readMeasured();let i=Wa(this,e,t);return i&&i.pos}
method posAndSideAtCoords (line 10) | posAndSideAtCoords(e,t=!0){return this.readMeasured(),Wa(this,e,t)}
method coordsAtPos (line 10) | coordsAtPos(e,t=1){this.readMeasured();let i=this.docView.coordsAt(e,t);...
method coordsForChar (line 10) | coordsForChar(e){return this.readMeasured(),this.docView.coordsForChar(e)}
method defaultCharacterWidth (line 10) | get defaultCharacterWidth(){return this.viewState.heightOracle.charWidth}
method defaultLineHeight (line 10) | get defaultLineHeight(){return this.viewState.heightOracle.lineHeight}
method textDirection (line 10) | get textDirection(){return this.viewState.defaultTextDirection}
method textDirectionAt (line 10) | textDirectionAt(e){return!this.state.facet(Ff)||e<this.viewport.from||e>...
method lineWrapping (line 10) | get lineWrapping(){return this.viewState.heightOracle.lineWrapping}
method bidiSpans (line 10) | bidiSpans(e){if(e.length>fS)return Ef(e.length);let t=this.textDirection...
method hasFocus (line 10) | get hasFocus(){var e;return(this.dom.ownerDocument.hasFocus()||v.safari&...
method focus (line 10) | focus(){this.observer.ignore(()=>{qf(this.contentDOM),this.docView.updat...
method setRoot (line 10) | setRoot(e){this._root!=e&&(this._root=e,this.observer.setWindow((e.nodeT...
method destroy (line 10) | destroy(){this.root.activeElement==this.contentDOM&&this.contentDOM.blur...
method scrollIntoView (line 10) | static scrollIntoView(e,t={}){return en.of(new ji(typeof e=="number"?S.c...
method scrollSnapshot (line 10) | scrollSnapshot(){let{scrollTop:e,scrollLeft:t}=this.scrollDOM,i=this.vie...
method setTabFocusMode (line 10) | setTabFocusMode(e){e==null?this.inputState.tabFocusMode=this.inputState....
method domEventHandlers (line 10) | static domEventHandlers(e){return he.define(()=>({}),{eventHandlers:e})}
method domEventObservers (line 10) | static domEventObservers(e){return he.define(()=>({}),{eventObservers:e})}
method theme (line 10) | static theme(e,t){let i=Ot.newName(),r=[sn.of(i),Vi.of(Ja(`.${i}`,e))];r...
method baseTheme (line 10) | static baseTheme(e){return ze.lowest(Vi.of(Ja("."+Ka,e,Xd)))}
method findFromDOM (line 10) | static findFromDOM(e){var t;let i=e.querySelector(".cm-content"),r=i&&de...
method constructor (line 10) | constructor(e,t,i,r,n,s){this.from=e,this.to=t,this.dir=i,this.isolates=...
method update (line 10) | static update(e,t){if(t.empty&&!e.some(n=>n.fresh))return e;let i=[],r=e...
function gf (line 10) | function gf(O,e,t){for(let i=O.state.facet(e),r=i.length-1;r>=0;r--){let...
function uS (line 10) | function uS(O,e){let t=O.split(/-(?!$)/),i=t[t.length-1];i=="Space"&&(i=...
function an (line 10) | function an(O,e,t){return e.altKey&&(O="Alt-"+O),e.ctrlKey&&(O="Ctrl-"+O...
method keydown (line 10) | keydown(O,e){return yd(Td(e.state),O,e,"editor")}
function Td (line 10) | function Td(O){let e=O.facet(Xt),t=Pf.get(e);return t||Pf.set(e,t=pS(e.r...
function bd (line 10) | function bd(O,e,t){return yd(Td(O.state),e,O,t)}
function pS (line 10) | function pS(O,e=dS){let t=Object.create(null),i=Object.create(null),r=(s...
function yd (line 10) | function yd(O,e,t,i){Oo=e;let r=Mh(e),n=Se(r,0),s=Me(n)==r.length&&r!=" ...
method constructor (line 10) | constructor(e,t,i,r,n){this.className=e,this.left=t,this.top=i,this.widt...
method draw (line 10) | draw(){let e=document.createElement("div");return e.className=this.class...
method update (line 10) | update(e,t){return t.className!=this.className?!1:(this.adjust(e),!0)}
method adjust (line 10) | adjust(e){e.style.left=this.left+"px",e.style.top=this.top+"px",this.wid...
method eq (line 10) | eq(e){return this.left==e.left&&this.top==e.top&&this.width==e.width&&th...
method forRange (line 10) | static forRange(e,t,i){if(i.empty){let r=e.coordsAtPos(i.head,i.assoc||1...
function xd (line 10) | function xd(O){let e=O.scrollDOM.getBoundingClientRect();return{left:(O....
function Sf (line 10) | function Sf(O,e,t,i){let r=O.coordsAtPos(e,t*2);if(!r)return i;let n=O.d...
function mS (line 10) | function mS(O,e,t){if(t.to<=O.viewport.from||t.from>=O.viewport.to)retur...
function gS (line 10) | function gS(O,e){return O.constructor==e.constructor&&O.eq(e)}
method constructor (line 10) | constructor(e,t){this.view=e,this.layer=t,this.drawn=[],this.scaleX=1,th...
method update (line 10) | update(e){e.startState.facet(dn)!=e.state.facet(dn)&&this.setOrder(e.sta...
method docViewUpdate (line 10) | docViewUpdate(e){this.layer.updateOnDocViewUpdate!==!1&&e.requestMeasure...
method setOrder (line 10) | setOrder(e){let t=0,i=e.facet(dn);for(;t<i.length&&i[t]!=this.layer;)t++...
method measure (line 10) | measure(){return this.layer.markers(this.view)}
method scale (line 10) | scale(){let{scaleX:e,scaleY:t}=this.view;(e!=this.scaleX||t!=this.scaleY...
method draw (line 10) | draw(e){if(e.length!=this.drawn.length||e.some((t,i)=>!gS(t,this.drawn[i...
method destroy (line 10) | destroy(){this.layer.destroy&&this.layer.destroy(this.dom,this.view),thi...
function kd (line 10) | function kd(O){return[he.define(e=>new io(e,O)),dn.of(O)]}
method combine (line 10) | combine(O){return xe(O,{cursorBlinkRate:1200,drawRangeCursor:!0},{cursor...
function wd (line 10) | function wd(O={}){return[Ki.of(O),PS,SS,XS,Hf.of(!0)]}
function Zd (line 10) | function Zd(O){return O.startState.facet(Ki)!=O.state.facet(Ki)}
method markers (line 10) | markers(O){let{state:e}=O,t=e.facet(Ki),i=[];for(let r of e.selection.ra...
method update (line 10) | update(O,e){O.transactions.some(i=>i.selection)&&(e.style.animationName=...
method mount (line 10) | mount(O,e){Xf(e.state,O)}
function Xf (line 10) | function Xf(O,e){e.style.animationDuration=O.facet(Ki).cursorBlinkRate+"...
method markers (line 10) | markers(O){return O.state.selection.ranges.map(e=>e.empty?[]:Hi.forRange...
method update (line 10) | update(O,e){return O.docChanged||O.selectionSet||O.viewportChanged||Zd(O)}
method map (line 10) | map(O,e){return O==null?null:e.mapPos(O)}
method create (line 10) | create(){return null}
method update (line 10) | update(O,e){return O!=null&&(O=e.changes.mapPos(O)),e.effects.reduce((t,...
method constructor (line 10) | constructor(O){this.view=O,this.cursor=null,this.measureReq={read:this.r...
method update (line 10) | update(O){var e;let t=O.state.field(Ui);t==null?this.cursor!=null&&((e=t...
method readPos (line 10) | readPos(){let{view:O}=this,e=O.state.field(Ui),t=e!=null&&O.coordsAtPos(...
method drawCursor (line 10) | drawCursor(O){if(this.cursor){let{scaleX:e,scaleY:t}=this.view;O?(this.c...
method destroy (line 10) | destroy(){this.cursor&&this.cursor.remove()}
method setDropPos (line 10) | setDropPos(O){this.view.state.field(Ui)!=O&&this.view.dispatch({effects:...
method dragover (line 10) | dragover(O){this.setDropPos(this.view.posAtCoords({x:O.clientX,y:O.clien...
method dragleave (line 10) | dragleave(O){(O.target==this.view.contentDOM||!this.view.contentDOM.cont...
method dragend (line 10) | dragend(){this.setDropPos(null)}
method drop (line 10) | drop(){this.setDropPos(null)}
function Yd (line 10) | function Yd(){return[Ui,TS]}
function Tf (line 10) | function Tf(O,e,t,i,r){e.lastIndex=0;for(let n=O.iterRange(t,i),s=t,a;!n...
function bS (line 10) | function bS(O,e){let t=O.visibleRanges;if(t.length==1&&t[0].from==O.view...
method constructor (line 10) | constructor(e){let{regexp:t,decoration:i,decorate:r,boundary:n,maxLength...
method createDeco (line 10) | createDeco(e){let t=new Le,i=t.add.bind(t);for(let{from:r,to:n}of bS(e,t...
method updateDeco (line 10) | updateDeco(e,t){let i=1e9,r=-1;return e.docChanged&&e.changes.iterChange...
method updateRange (line 10) | updateRange(e,t,i,r){for(let n of e.visibleRanges){let s=Math.max(n.from...
function kS (line 11) | function kS(){var O;if($a==null&&typeof document<"u"&&document.body){let...
method combine (line 11) | combine(O){let e=xe(O,{render:null,specialChars:yS,addSpecialChars:null}...
function _d (line 11) | function _d(O={}){return[un.of(O),wS()]}
function wS (line 11) | function wS(){return bf||(bf=he.fromClass(class{constructor(O){this.view...
function vS (line 11) | function vS(O){return O>=32?ZS:O==10?"\u2424":String.fromCharCode(9216+O)}
method constructor (line 11) | constructor(e,t){super(),this.options=e,this.code=t}
method eq (line 11) | eq(e){return e.code==this.code}
method toDOM (line 11) | toDOM(e){let t=vS(this.code),i=e.state.phrase("Control character")+" "+(...
method ignoreEvent (line 11) | ignoreEvent(){return!1}
method constructor (line 11) | constructor(e){super(),this.width=e}
method eq (line 11) | eq(e){return e.width==this.width}
method toDOM (line 11) | toDOM(){let e=document.createElement("span");return e.textContent=" ",e....
method ignoreEvent (line 11) | ignoreEvent(){return!1}
function Rd (line 11) | function Rd(){return _S}
method constructor (line 11) | constructor(O){this.decorations=this.getDeco(O)}
method update (line 11) | update(O){(O.docChanged||O.selectionSet)&&(this.decorations=this.getDeco...
method getDeco (line 11) | getDeco(O){let e=-1,t=[];for(let i of O.state.selection.ranges){let r=O....
function RS (line 11) | function RS(O,e,t){let i=Math.min(e.line,t.line),r=Math.max(e.line,t.lin...
function VS (line 11) | function VS(O,e){let t=O.coordsAtPos(O.viewport.from);return t?Math.roun...
function yf (line 11) | function yf(O,e){let t=O.posAtCoords({x:e.clientX,y:e.clientY},!1),i=O.s...
function qS (line 11) | function qS(O,e){let t=yf(O,e),i=O.state.selection;return t?{update(r){i...
function Vd (line 11) | function Vd(O){let e=O?.eventFilter||(t=>t.altKey&&t.button==0);return T...
function qd (line 11) | function qd(O={}){let[e,t]=zS[O.key||"Alt"],i=he.fromClass(class{constru...
method constructor (line 11) | constructor(e,t,i,r){this.facet=t,this.createTooltipView=i,this.removeTo...
method update (line 11) | update(e,t){var i;let r=e.state.facet(this.facet),n=r.filter(o=>o);if(r=...
function WS (line 11) | function WS(O){let e=O.dom.ownerDocument.documentElement;return{top:0,le...
method constructor (line 11) | constructor(O){this.view=O,this.above=[],this.inView=!0,this.madeAbsolut...
method createContainer (line 11) | createContainer(){this.parent?(this.container=document.createElement("di...
method observeIntersection (line 11) | observeIntersection(){if(this.intersectionObserver){this.intersectionObs...
method measureSoon (line 11) | measureSoon(){this.measureTimeout<0&&(this.measureTimeout=setTimeout(()=...
method update (line 11) | update(O){O.transactions.length&&(this.lastTransaction=Date.now());let e...
method createTooltip (line 11) | createTooltip(O,e){let t=O.create(this.view),i=e?e.dom:null;if(t.dom.cla...
method destroy (line 11) | destroy(){var O,e,t;this.view.win.removeEventListener("resize",this.meas...
method readMeasure (line 11) | readMeasure(){let O=1,e=1,t=!1;if(this.position=="fixed"&&this.manager.t...
method writeMeasure (line 11) | writeMeasure(O){var e;if(O.makeAbsolute){this.madeAbsolute=!0,this.posit...
method maybeMeasure (line 11) | maybeMeasure(){if(this.manager.tooltips.length&&(this.view.inView&&this....
method scroll (line 11) | scroll(){this.maybeMeasure()}
function kf (line 11) | function kf(O,e){let t=parseInt(O.style.left,10);(isNaN(t)||Math.abs(e-t...
method create (line 11) | static create(e){return new O(e)}
method constructor (line 11) | constructor(e){this.view=e,this.mounted=!1,this.dom=document.createEleme...
method createHostedView (line 11) | createHostedView(e,t){let i=e.create(this.view);return i.dom.classList.a...
method mount (line 11) | mount(e){for(let t of this.manager.tooltipViews)t.mount&&t.mount(e);this...
method positioned (line 11) | positioned(e){for(let t of this.manager.tooltipViews)t.positioned&&t.pos...
method update (line 11) | update(e){this.manager.update(e)}
method destroy (line 11) | destroy(){var e;for(let t of this.manager.tooltipViews)(e=t.destroy)===n...
method passProp (line 11) | passProp(e){let t;for(let i of this.manager.tooltipViews){let r=i[e];if(...
method offset (line 11) | get offset(){return this.passProp("offset")}
method getCoords (line 11) | get getCoords(){return this.passProp("getCoords")}
method overlap (line 11) | get overlap(){return this.passProp("overlap")}
method resize (line 11) | get resize(){return this.passProp("resize")}
method constructor (line 11) | constructor(e,t,i,r,n){this.view=e,this.source=t,this.field=i,this.setHo...
method update (line 11) | update(){this.pending&&(this.pending=null,clearTimeout(this.restartTimeo...
method active (line 11) | get active(){return this.view.state.field(this.field)}
method checkHover (line 11) | checkHover(){if(this.hoverTimeout=-1,this.active.length)return;let e=Dat...
method startHover (line 11) | startHover(){clearTimeout(this.restartTimeout);let{view:e,lastMove:t}=th...
method tooltip (line 11) | get tooltip(){let e=this.view.plugin(Xo),t=e?e.manager.tooltips.findInde...
method mousemove (line 11) | mousemove(e){var t,i;this.lastMove={x:e.clientX,y:e.clientY,target:e.tar...
method mouseleave (line 11) | mouseleave(e){clearTimeout(this.hoverTimeout),this.hoverTimeout=-1;let{a...
method watchTooltipLeave (line 11) | watchTooltipLeave(e){let t=i=>{e.removeEventListener("mouseleave",t),thi...
method destroy (line 11) | destroy(){clearTimeout(this.hoverTimeout),this.view.dom.removeEventListe...
function ES (line 11) | function ES(O,e){let{left:t,right:i,top:r,bottom:n}=O.getBoundingClientR...
function AS (line 11) | function AS(O,e,t,i,r,n){let s=O.scrollDOM.getBoundingClientRect(),a=O.d...
function zd (line 11) | function zd(O,e={}){let t=V.define(),i=ce.define({create(){return[]},upd...
function To (line 11) | function To(O,e){let t=O.plugin(Xo);if(!t)return null;let i=t.manager.to...
method combine (line 11) | combine(O){let e,t;for(let i of O)e=e||i.topContainer,t=t||i.bottomConta...
function bO (line 11) | function bO(O,e){let t=O.plugin(Ud),i=t?t.specs.indexOf(e):-1;return i>-...
method constructor (line 11) | constructor(O){this.input=O.state.facet(TO),this.specs=this.input.filter...
method update (line 11) | update(O){let e=O.state.facet(wf);this.top.container!=e.topContainer&&(t...
method destroy (line 11) | destroy(){this.top.sync([]),this.bottom.sync([])}
method constructor (line 11) | constructor(e,t,i){this.view=e,this.top=t,this.container=i,this.dom=void...
method sync (line 11) | sync(e){for(let t of this.panels)t.destroy&&e.indexOf(t)<0&&t.destroy();...
method syncDOM (line 11) | syncDOM(){if(this.panels.length==0){this.dom&&(this.dom.remove(),this.do...
method scrollMargin (line 11) | scrollMargin(){return!this.dom||this.container?0:Math.max(0,this.top?thi...
method syncClasses (line 11) | syncClasses(){if(!(!this.container||this.classes==this.view.themeClasses...
function Zf (line 11) | function Zf(O){let e=O.nextSibling;return O.remove(),e}
method compare (line 11) | compare(e){return this==e||this.constructor==e.constructor&&this.eq(e)}
method eq (line 11) | eq(e){return!1}
method destroy (line 11) | destroy(e){}
function bo (line 11) | function bo(O){return[Wd(),Li.of({...DS,...O})]}
function Wd (line 11) | function Wd(O){let e=[IS];return O&&O.fixed===!1&&e.push(co.of(!0)),e}
method constructor (line 11) | constructor(O){this.view=O,this.domAfter=null,this.prevViewport=O.viewpo...
method getDOMAfter (line 11) | getDOMAfter(){return this.domAfter||(this.domAfter=document.createElemen...
method update (line 11) | update(O){if(this.updateGutters(O)){let e=this.prevViewport,t=O.view.vie...
method syncGutters (line 11) | syncGutters(O){let e=this.dom.nextSibling;O&&(this.dom.remove(),this.dom...
method updateGutters (line 11) | updateGutters(O){let e=O.startState.facet(Li),t=O.state.facet(Li),i=O.do...
method destroy (line 11) | destroy(){for(let O of this.gutters)O.destroy();this.dom.remove(),this.d...
function vf (line 11) | function vf(O){return Array.isArray(O)?O:[O]}
function ho (line 11) | function ho(O,e,t){for(;O.value&&O.from<=t;)O.from==t&&e.push(O.value),O...
method constructor (line 11) | constructor(e,t,i){this.gutter=e,this.height=i,this.i=0,this.cursor=M.it...
method addElement (line 11) | addElement(e,t,i){let{gutter:r}=this,n=(t.top-this.height)/e.scaleY,s=t....
method line (line 11) | line(e,t,i){let r=[];ho(this.cursor,r,t.from),i.length&&(r=r.concat(i));...
method widget (line 11) | widget(e,t){let i=this.gutter.config.widgetMarker(e,t.widget,t),r=i?[i]:...
method finish (line 11) | finish(){let e=this.gutter;for(;e.elements.length>this.i;){let t=e.eleme...
method constructor (line 11) | constructor(e,t){this.view=e,this.config=t,this.elements=[],this.spacer=...
method update (line 11) | update(e){let t=this.markers;if(this.markers=vf(this.config.markers(e.vi...
method destroy (line 11) | destroy(){for(let e of this.elements)e.destroy()}
method constructor (line 11) | constructor(e,t,i,r){this.height=-1,this.above=0,this.markers=[],this.do...
method update (line 11) | update(e,t,i,r){this.height!=t&&(this.height=t,this.dom.style.height=t+"...
method setMarkers (line 11) | setMarkers(e,t){let i="cm-gutterElement",r=this.dom.firstChild;for(let n...
method destroy (line 11) | destroy(){this.setMarkers(null,[])}
function BS (line 11) | function BS(O,e){if(O.length!=e.length)return!1;for(let t=0;t<O.length;t...
method combine (line 11) | combine(O){return xe(O,{formatNumber:String,domEventHandlers:{}},{domEve...
method constructor (line 11) | constructor(e){super(),this.number=e}
method eq (line 11) | eq(e){return this.number==e.number}
method toDOM (line 11) | toDOM(){return document.createTextNode(this.number)}
function ma (line 11) | function ma(O,e){return O.state.facet(ti).formatNumber(e,O.state)}
method markers (line 11) | markers(e){return e.state.facet(NS)}
method lineMarker (line 11) | lineMarker(e,t,i){return i.some(r=>r.toDOM)?null:new Mi(ma(e,e.state.doc...
method initialSpacer (line 11) | initialSpacer(e){return new Mi(ma(e,Yf(e.state.doc.lines)))}
method updateSpacer (line 11) | updateSpacer(e,t){let i=ma(t.view,Yf(t.view.state.doc.lines));return i==...
function jd (line 11) | function jd(O={}){return[ti.of(O),Wd(),HS]}
function Yf (line 11) | function Yf(O){let e=9;for(;e<O;)e=e*10+9;return e}
method constructor (line 11) | constructor(){super(...arguments),this.elementClass="cm-activeLineGutter"}
function Cd (line 11) | function Cd(){return JS}
method constructor (line 11) | constructor(e,t){this.from=e,this.to=t}
method constructor (line 11) | constructor(e={}){this.id=eX++,this.perNode=!!e.perNode,this.deserialize...
method add (line 11) | add(e){if(this.perNode)throw new RangeError("Can't add per-node props to...
method constructor (line 11) | constructor(e,t,i,r=!1){this.tree=e,this.overlay=t,this.parser=i,this.br...
method get (line 11) | static get(e){return e&&e.props&&e.props[R.mounted.id]}
method constructor (line 11) | constructor(e,t,i,r=0){this.name=e,this.props=t,this.id=i,this.flags=r}
method define (line 11) | static define(e){let t=e.props&&e.props.length?Object.create(null):tX,i=...
method prop (line 11) | prop(e){return this.props[e.id]}
method isTop (line 11) | get isTop(){return(this.flags&1)>0}
method isSkipped (line 11) | get isSkipped(){return(this.flags&2)>0}
method isError (line 11) | get isError(){return(this.flags&4)>0}
method isAnonymous (line 11) | get isAnonymous(){return(this.flags&8)>0}
method is (line 11) | is(e){if(typeof e=="string"){if(this.name==e)return!0;let t=this.prop(R....
method match (line 11) | static match(e){let t=Object.create(null);for(let i in e)for(let r of i....
method constructor (line 11) | constructor(e){this.types=e;for(let t=0;t<e.length;t++)if(e[t].id!=t)thr...
method extend (line 11) | extend(...e){let t=[];for(let i of this.types){let r=null;for(let n of e...
method constructor (line 11) | constructor(e,t,i,r,n){if(this.type=e,this.children=t,this.positions=i,t...
method toString (line 11) | toString(){let e=Ht.get(this);if(e&&!e.overlay)return e.tree.toString();...
method cursor (line 11) | cursor(e=0){return new li(this.topNode,e)}
method cursorAt (line 11) | cursorAt(e,t=0,i=0){let r=qn.get(this)||this.topNode,n=new li(r);return ...
method topNode (line 11) | get topNode(){return new je(this,0,0,null)}
method resolve (line 11) | resolve(e,t=0){let i=tr(qn.get(this)||this.topNode,e,t,!1);return qn.set...
method resolveInner (line 11) | resolveInner(e,t=0){let i=tr(Gd.get(this)||this.topNode,e,t,!0);return G...
method resolveStack (line 11) | resolveStack(e,t=0){return OX(this,e,t)}
method iterate (line 11) | iterate(e){let{enter:t,leave:i,from:r=0,to:n=this.length}=e,s=e.mode||0,...
method prop (line 11) | prop(e){return e.perNode?this.props?this.props[e.id]:void 0:this.type.pr...
method propValues (line 11) | get propValues(){let e=[];if(this.props)for(let t in this.props)e.push([...
method balance (line 11) | balance(e={}){return this.children.length<=8?this:qo(ue.none,this.childr...
method build (line 11) | static build(e){return iX(e)}
method constructor (line 11) | constructor(e,t){this.buffer=e,this.index=t}
method id (line 11) | get id(){return this.buffer[this.index-4]}
method start (line 11) | get start(){return this.buffer[this.index-3]}
method end (line 11) | get end(){return this.buffer[this.index-2]}
method size (line 11) | get size(){return this.buffer[this.index-1]}
method pos (line 11) | get pos(){return this.index}
method next (line 11) | next(){this.index-=4}
method fork (line 11) | fork(){return new O(this.buffer,this.index)}
method constructor (line 11) | constructor(e,t,i){this.buffer=e,this.length=t,this.set=i}
method type (line 11) | get type(){return ue.none}
method toString (line 11) | toString(){let e=[];for(let t=0;t<this.buffer.length;)e.push(this.childS...
method childString (line 11) | childString(e){let t=this.buffer[e],i=this.buffer[e+3],r=this.set.types[...
method findChild (line 11) | findChild(e,t,i,r,n){let{buffer:s}=this,a=-1;for(let o=e;o!=t&&!(Bd(n,r,...
method slice (line 11) | slice(e,t,i){let r=this.buffer,n=new Uint16Array(t-e),s=0;for(let a=e,o=...
function Bd (line 11) | function Bd(O,e,t,i){switch(O){case-2:return t<e;case-1:return i>=e&&t<e...
function tr (line 11) | function tr(O,e,t,i){for(var r;O.from==O.to||(t<1?O.from>=e:O.from>e)||(...
method cursor (line 11) | cursor(e=0){return new li(this,e)}
method getChild (line 11) | getChild(e,t=null,i=null){let r=Ed(this,e,t,i);return r.length?r[0]:null}
method getChildren (line 11) | getChildren(e,t=null,i=null){return Ed(this,e,t,i)}
method resolve (line 11) | resolve(e,t=0){return tr(this,e,t,!1)}
method resolveInner (line 11) | resolveInner(e,t=0){return tr(this,e,t,!0)}
method matchContext (line 11) | matchContext(e){return xo(this.parent,e)}
method enterUnfinishedNodesBefore (line 11) | enterUnfinishedNodesBefore(e){let t=this.childBefore(e),i=this;for(;t;){...
method node (line 11) | get node(){return this}
method next (line 11) | get next(){return this.parent}
method constructor (line 11) | constructor(e,t,i,r){super(),this._tree=e,this.from=t,this.index=i,this....
method type (line 11) | get type(){return this._tree.type}
method name (line 11) | get name(){return this._tree.type.name}
method to (line 11) | get to(){return this.from+this._tree.length}
method nextChild (line 11) | nextChild(e,t,i,r,n=0){var s;for(let a=this;;){for(let{children:o,positi...
method firstChild (line 11) | get firstChild(){return this.nextChild(0,1,0,4)}
method lastChild (line 11) | get lastChild(){return this.nextChild(this._tree.children.length-1,-1,0,4)}
method childAfter (line 11) | childAfter(e){return this.nextChild(0,1,e,2)}
method childBefore (line 11) | childBefore(e){return this.nextChild(this._tree.children.length-1,-1,e,-2)}
method prop (line 11) | prop(e){return this._tree.prop(e)}
method enter (line 11) | enter(e,t,i=0){let r;if(!(i&C.IgnoreOverlays)&&(r=Ht.get(this._tree))&&r...
method nextSignificantParent (line 11) | nextSignificantParent(){let e=this;for(;e.type.isAnonymous&&e._parent;)e...
method parent (line 11) | get parent(){return this._parent?this._parent.nextSignificantParent():null}
method nextSibling (line 11) | get nextSibling(){return this._parent&&this.index>=0?this._parent.nextCh...
method prevSibling (line 11) | get prevSibling(){return this._parent&&this.index>=0?this._parent.nextCh...
method tree (line 11) | get tree(){return this._tree}
method toTree (line 11) | toTree(){return this._tree}
method toString (line 11) | toString(){return this._tree.toString()}
function Ed (line 11) | function Ed(O,e,t,i){let r=O.cursor(),n=[];if(!r.firstChild())return n;i...
function xo (line 11) | function xo(O,e,t=e.length-1){for(let i=O;t>=0;i=i.parent){if(!i)return!...
method constructor (line 11) | constructor(e,t,i,r){this.parent=e,this.buffer=t,this.index=i,this.start=r}
method name (line 11) | get name(){return this.type.name}
method from (line 11) | get from(){return this.context.start+this.context.buffer.buffer[this.ind...
method to (line 11) | get to(){return this.context.start+this.context.buffer.buffer[this.index...
method constructor (line 11) | constructor(e,t,i){super(),this.context=e,this._parent=t,this.index=i,th...
method child (line 11) | child(e,t,i){let{buffer:r}=this.context,n=r.findChild(this.index+4,r.buf...
method firstChild (line 11) | get firstChild(){return this.child(1,0,4)}
method lastChild (line 11) | get lastChild(){return this.child(-1,0,4)}
method childAfter (line 11) | childAfter(e){return this.child(1,e,2)}
method childBefore (line 11) | childBefore(e){return this.child(-1,e,-2)}
method prop (line 11) | prop(e){return this.type.prop(e)}
method enter (line 11) | enter(e,t,i=0){if(i&C.ExcludeBuffers)return null;let{buffer:r}=this.cont...
method parent (line 11) | get parent(){return this._parent||this.context.parent.nextSignificantPar...
method externalSibling (line 11) | externalSibling(e){return this._parent?null:this.context.parent.nextChil...
method nextSibling (line 11) | get nextSibling(){let{buffer:e}=this.context,t=e.buffer[this.index+3];re...
method prevSibling (line 11) | get prevSibling(){let{buffer:e}=this.context,t=this._parent?this._parent...
method tree (line 11) | get tree(){return null}
method toTree (line 11) | toTree(){let e=[],t=[],{buffer:i}=this.context,r=this.index+4,n=i.buffer...
method toString (line 11) | toString(){return this.context.buffer.childString(this.index)}
function Nd (line 11) | function Nd(O){if(!O.length)return null;let e=0,t=O[0];for(let n=1;n<O.l...
method constructor (line 11) | constructor(e,t){this.heads=e,this.node=t}
method next (line 11) | get next(){return Nd(this.heads)}
function OX (line 11) | function OX(O,e,t){let i=O.resolveInner(e,t),r=null;for(let n=i instance...
method name (line 11) | get name(){return this.type.name}
method constructor (line 11) | constructor(e,t=0){if(this.buffer=null,this.stack=[],this.index=0,this.b...
method yieldNode (line 11) | yieldNode(e){return e?(this._tree=e,this.type=e.type,this.from=e.from,th...
method yieldBuf (line 11) | yieldBuf(e,t){this.index=e;let{start:i,buffer:r}=this.buffer;return this...
method yield (line 11) | yield(e){return e?e instanceof je?(this.buffer=null,this.yieldNode(e)):(...
method toString (line 11) | toString(){return this.buffer?this.buffer.buffer.childString(this.index)...
method enterChild (line 11) | enterChild(e,t,i){if(!this.buffer)return this.yield(this._tree.nextChild...
method firstChild (line 11) | firstChild(){return this.enterChild(1,0,4)}
method lastChild (line 11) | lastChild(){return this.enterChild(-1,0,4)}
method childAfter (line 11) | childAfter(e){return this.enterChild(1,e,2)}
method childBefore (line 11) | childBefore(e){return this.enterChild(-1,e,-2)}
method enter (line 11) | enter(e,t,i=this.mode){return this.buffer?i&C.ExcludeBuffers?!1:this.ent...
method parent (line 11) | parent(){if(!this.buffer)return this.yieldNode(this.mode&C.IncludeAnonym...
method sibling (line 11) | sibling(e){if(!this.buffer)return this._tree._parent?this.yield(this._tr...
method nextSibling (line 11) | nextSibling(){return this.sibling(1)}
method prevSibling (line 11) | prevSibling(){return this.sibling(-1)}
method atLastNode (line 11) | atLastNode(e){let t,i,{buffer:r}=this;if(r){if(e>0){if(this.index<r.buff...
method move (line 11) | move(e,t){if(t&&this.enterChild(e,0,4))return!0;for(;;){if(this.sibling(...
method next (line 11) | next(e=!0){return this.move(1,e)}
method prev (line 11) | prev(e=!0){return this.move(-1,e)}
method moveTo (line 11) | moveTo(e,t=0){for(;(this.from==this.to||(t<1?this.from>=e:this.from>e)||...
method node (line 11) | get node(){if(!this.buffer)return this._tree;let e=this.bufferNode,t=nul...
method tree (line 11) | get tree(){return this.buffer?null:this._tree._tree}
method iterate (line 11) | iterate(e,t){for(let i=0;;){let r=!1;if(this.type.isAnonymous||e(this)!=...
method matchContext (line 11) | matchContext(e){if(!this.buffer)return xo(this.node.parent,e);let{buffer...
function Vo (line 11) | function Vo(O){return O.children.some(e=>e instanceof Jt||!e.type.isAnon...
function iX (line 11) | function iX(O){var e;let{buffer:t,nodeSet:i,maxBufferLength:r=1024,reuse...
function zn (line 11) | function zn(O,e){if(!O.isAnonymous||e instanceof Jt||e.type!=O)return 1;...
function qo (line 11) | function qo(O,e,t,i,r,n,s,a,o){let l=0;for(let Q=i;Q<r;Q++)l+=zn(O,e[Q])...
method constructor (line 11) | constructor(){this.map=new WeakMap}
method setBuffer (line 11) | setBuffer(e,t,i){let r=this.map.get(e);r||this.map.set(e,r=new Map),r.se...
method getBuffer (line 11) | getBuffer(e,t){let i=this.map.get(e);return i&&i.get(t)}
method set (line 11) | set(e,t){e instanceof yO?this.setBuffer(e.context.buffer,e.index,t):e in...
method get (line 11) | get(e){return e instanceof yO?this.getBuffer(e.context.buffer,e.index):e...
method cursorSet (line 11) | cursorSet(e,t){e.buffer?this.setBuffer(e.buffer.buffer,e.index,t):this.m...
method cursorGet (line 11) | cursorGet(e){return e.buffer?this.getBuffer(e.buffer.buffer,e.index):thi...
method constructor (line 11) | constructor(e,t,i,r,n=!1,s=!1){this.from=e,this.to=t,this.tree=i,this.of...
method openStart (line 11) | get openStart(){return(this.open&1)>0}
method openEnd (line 11) | get openEnd(){return(this.open&2)>0}
method addTree (line 11) | static addTree(e,t=[],i=!1){let r=[new O(0,e.length,e,0,!1,i)];for(let n...
method applyChanges (line 11) | static applyChanges(e,t,i=128){if(!t.length)return e;let r=[],n=1,s=e.le...
method startParse (line 11) | startParse(e,t,i){return typeof e=="string"&&(e=new Zo(e)),i=i?i.length?...
method parse (line 11) | parse(e,t,i){let r=this.startParse(e,t,i);for(;;){let n=r.advance();if(n...
method constructor (line 11) | constructor(e){this.string=e}
method length (line 11) | get length(){return this.string.length}
method chunk (line 11) | chunk(e){return this.string.slice(e)}
method lineChunks (line 11) | get lineChunks(){return!1}
method read (line 11) | read(e,t){return this.string.slice(e,t)}
function xO (line 11) | function xO(O){return(e,t,i,r)=>new _o(e,O,t,i,r)}
method constructor (line 11) | constructor(e,t,i,r,n,s){this.parser=e,this.parse=t,this.overlay=i,this....
function Ld (line 11) | function Ld(O){if(!O.length||O.some(e=>e.from>=e.to))throw new RangeErro...
method constructor (line 11) | constructor(e,t,i,r,n,s,a,o){this.parser=e,this.predicate=t,this.mounts=...
method constructor (line 11) | constructor(e,t,i,r,n){this.nest=t,this.input=i,this.fragments=r,this.ra...
method advance (line 11) | advance(){if(this.baseParse){let i=this.baseParse.advance();if(!i)return...
method parsedPos (line 11) | get parsedPos(){if(this.baseParse)return 0;let e=this.input.length;for(l...
method stopAt (line 11) | stopAt(e){if(this.stoppedAt=e,this.baseParse)this.baseParse.stopAt(e);el...
method startInner (line 11) | startInner(){let e=new Ro(this.fragments),t=null,i=null,r=new li(new je(...
function rX (line 11) | function rX(O,e,t){for(let i of O){if(i.from>=t)break;if(i.to>e)return i...
function Md (line 11) | function Md(O,e,t,i,r,n){if(e<t){let s=O.buffer[e+1];i.push(O.slice(e,t,...
function nX (line 11) | function nX(O){let{node:e}=O,t=[],i=e.context.buffer;do t.push(O.index),...
method constructor (line 11) | constructor(e,t){this.offset=t,this.done=!1,this.cursor=e.cursor(C.Inclu...
method moveTo (line 11) | moveTo(e){let{cursor:t}=this,i=e-this.offset;for(;!this.done&&t.from<i;)...
method hasNode (line 11) | hasNode(e){if(this.moveTo(e.from),!this.done&&this.cursor.from+this.offs...
method constructor (line 11) | constructor(e){var t;if(this.fragments=e,this.curTo=0,this.fragI=0,e.len...
method hasNode (line 11) | hasNode(e){for(;this.curFrag&&e.from>=this.curTo;)this.nextFrag();return...
method nextFrag (line 11) | nextFrag(){var e;if(this.fragI++,this.fragI==this.fragments.length)this....
method findMounts (line 11) | findMounts(e,t){var i;let r=[];if(this.inner){this.inner.cursor.moveTo(e...
function Dd (line 11) | function Dd(O,e){let t=null,i=e;for(let r=1,n=0;r<O.length;r++){let s=O[...
function sX (line 11) | function sX(O,e,t,i){let r=0,n=0,s=!1,a=!1,o=-1e9,l=[];for(;;){let c=r==...
function Id (line 11) | function Id(O,e){let t=[];for(let{pos:i,mount:r,frag:n}of O){let s=i+(r....
method constructor (line 11) | constructor(e,t,i,r){this.name=e,this.set=t,this.base=i,this.modified=r,...
method toString (line 11) | toString(){let{name:e}=this;for(let t of this.modified)t.name&&(e=`${t.n...
method define (line 11) | static define(e,t){let i=typeof e=="string"?e:"?";if(e instanceof O&&(t=...
method defineModifier (line 11) | static defineModifier(e){let t=new An(e);return i=>i.modified.indexOf(t)...
method constructor (line 11) | constructor(e){this.name=e,this.instances=[],this.id=oX++}
method get (line 11) | static get(e,t){if(!t.length)return e;let i=t[0].instances.find(a=>a.bas...
function lX (line 11) | function lX(O,e){return O.length==e.length&&O.every((t,i)=>t==e[i])}
function cX (line 11) | function cX(O){let e=[[]];for(let t=0;t<O.length;t++)for(let i=0,r=e.len...
function F (line 11) | function F(O){let e=Object.create(null);for(let t in O){let i=O[t];Array...
method combine (line 11) | combine(O,e){let t,i,r;for(;O||e;){if(!O||e&&O.depth>=e.depth?(r=e,e=e.n...
method constructor (line 11) | constructor(e,t,i,r){this.tags=e,this.mode=t,this.context=i,this.next=r}
method opaque (line 11) | get opaque(){return this.mode==0}
method inherit (line 11) | get inherit(){return this.mode==1}
method sort (line 11) | sort(e){return!e||e.depth<this.depth?(this.next=e,this):(e.next=this.sor...
method depth (line 11) | get depth(){return this.context?this.context.length:0}
function jo (line 11) | function jo(O,e){let t=Object.create(null);for(let n of O)if(!Array.isAr...
function hX (line 11) | function hX(O,e){let t=null;for(let i of O){let r=i.style(e);r&&(t=t?t+"...
function Jd (line 11) | function Jd(O,e,t,i=0,r=O.length){let n=new Uo(i,Array.isArray(e)?e:[e],...
method constructor (line 11) | constructor(e,t,i){this.at=e,this.highlighters=t,this.span=i,this.class=""}
method startSpan (line 11) | startSpan(e,t){t!=this.class&&(this.flush(e),e>this.at&&(this.at=e),this...
method flush (line 11) | flush(e){e>this.at&&this.class&&this.span(this.at,e,this.class)}
method highlightRange (line 11) | highlightRange(e,t,i,r,n){let{type:s,from:a,to:o}=e;if(a>=i||o<=t)return...
function fX (line 11) | function fX(O){let e=O.type.prop(Kd);for(;e&&e.context&&!O.matchContext(...
function or (line 11) | function or(O){return Z.define({combine:O?e=>e.concat(O):void 0})}
method constructor (line 11) | constructor(e,t,i=[],r=""){this.data=e,this.name=r,I.prototype.hasOwnPro...
method isActiveAt (line 11) | isActiveAt(e,t,i=-1){return eu(e,t,i).type.prop(iO)==this.data}
method findRegions (line 11) | findRegions(e){let t=e.facet(rO);if(t?.data==this.data)return[{from:0,to...
method allowsNesting (line 11) | get allowsNesting(){return!0}
function eu (line 11) | function eu(O,e,t){let i=O.facet(rO),r=U(O).topNode;if(!i||i.allowsNesti...
method constructor (line 11) | constructor(e,t,i){super(e,t,[],i),this.parser=t}
method define (line 11) | static define(e){let t=or(e.languageData);return new O(t,e.parser.config...
method configure (line 11) | configure(e,t){return new O(this.data,this.parser.configure(e),t||this.n...
method allowsNesting (line 11) | get allowsNesting(){return this.parser.hasWrappers()}
function U (line 11) | function U(O){let e=O.field(Re.state,!1);return e?e.tree:D.empty}
method constructor (line 11) | constructor(e){this.doc=e,this.cursorPos=0,this.string="",this.cursor=e....
method length (line 11) | get length(){return this.doc.length}
method syncTo (line 11) | syncTo(e){return this.string=this.cursor.next(e-this.cursorPos).value,th...
method chunk (line 11) | chunk(e){return this.syncTo(e),this.string}
method lineChunks (line 11) | get lineChunks(){return!0}
method read (line 11) | read(e,t){let i=this.cursorPos-this.string.length;return e<i||t>=this.cu...
method constructor (line 11) | constructor(e,t,i=[],r,n,s,a,o){this.parser=e,this.state=t,this.fragment...
method create (line 11) | static create(e,t,i){return new O(e,t,[],D.empty,0,i,[],null)}
method startParse (line 11) | startParse(){return this.parser.startParse(new Lo(this.state.doc),this.f...
method work (line 11) | work(e,t){return t!=null&&t>=this.state.doc.length&&(t=void 0),this.tree...
method takeTree (line 11) | takeTree(){let e,t;this.parse&&(e=this.parse.parsedPos)>=this.treeLen&&(...
method withContext (line 11) | withContext(e){let t=ir;ir=this;try{return e()}finally{ir=t}}
method withoutTempSkipped (line 11) | withoutTempSkipped(e){for(let t;t=this.tempSkipped.pop();)e=tu(e,t.from,...
method changes (line 11) | changes(e,t){let{fragments:i,tree:r,treeLen:n,viewport:s,skipped:a}=this...
method updateViewport (line 11) | updateViewport(e){if(this.viewport.from==e.from&&this.viewport.to==e.to)...
method reset (line 11) | reset(){this.parse&&(this.takeTree(),this.parse=null)}
method skipUntilInView (line 11) | skipUntilInView(e,t){this.skipped.push({from:e,to:t})}
method getSkippingParser (line 11) | static getSkippingParser(e){return new class extends eO{createParse(t,i,...
method isDone (line 11) | isDone(e){e=Math.min(e,this.state.doc.length);let t=this.fragments;retur...
method get (line 11) | static get(){return ir}
function tu (line 11) | function tu(O,e,t){return Vt.applyChanges(O,[{fromA:e,toA:t,fromB:e,toB:...
method constructor (line 11) | constructor(e){this.context=e,this.tree=e.tree}
method apply (line 11) | apply(e){if(!e.docChanged&&this.tree==this.context.tree)return this;let ...
method init (line 11) | static init(e){let t=Math.min(3e3,e.doc.length),i=nr.create(e.facet(rO)....
method update (line 11) | update(O,e){for(let t of e.effects)if(t.is(Re.setState))return t.value;r...
method constructor (line 11) | constructor(e){this.view=e,this.working=null,this.workScheduled=0,this.c...
method update (line 11) | update(e){let t=this.view.state.field(Re.state).context;(t.updateViewpor...
method scheduleWork (line 11) | scheduleWork(){if(this.working)return;let{state:e}=this.view,t=e.field(R...
method work (line 11) | work(e){this.working=null;let t=Date.now();if(this.chunkEnd<t&&(this.chu...
method checkAsyncSchedule (line 11) | checkAsyncSchedule(e){e.scheduleOn&&(this.workScheduled++,e.scheduleOn.t...
method destroy (line 11) | destroy(){this.working&&this.working()}
method isWorking (line 11) | isWorking(){return!!(this.working||this.workScheduled>0)}
method focus (line 11) | focus(){this.scheduleWork()}
method combine (line 11) | combine(O){return O.length?O[0]:null}
method constructor (line 11) | constructor(e,t=[]){this.language=e,this.support=t,this.extension=[e,t]}
method constructor (line 11) | constructor(e,t,i,r,n,s=void 0){this.name=e,this.alias=t,this.extensions...
method load (line 11) | load(){return this.loading||(this.loading=this.loadFunc().then(e=>this.s...
method of (line 11) | static of(e){let{load:t,support:i}=e;if(!t){if(!i)throw new RangeError("...
method matchFilename (line 11) | static matchFilename(e,t){for(let r of e)if(r.filename&&r.filename.test(...
method matchLanguageName (line 11) | static matchLanguageName(e,t,i=!0){t=t.toLowerCase();for(let r of e)if(r...
function lr (line 11) | function lr(O){let e=O.facet(nO);return e.charCodeAt(0)==9?O.tabSize*e.l...
function hi (line 11) | function hi(O,e){let t="",i=O.tabSize,r=O.facet(nO)[0];if(r==" "){for(;e...
function In (line 11) | function In(O,e){O instanceof I&&(O=new ZO(O));for(let i of O.state.face...
method constructor (line 11) | constructor(e,t={}){this.state=e,this.options=t,this.unit=lr(e)}
method lineAt (line 11) | lineAt(e,t=1){let i=this.state.doc.lineAt(e),{simulateBreak:r,simulateDo...
method textAfterPos (line 11) | textAfterPos(e,t=1){if(this.options.simulateDoubleBreak&&e==this.options...
method column (line 11) | column(e,t=1){let{text:i,from:r}=this.lineAt(e,t),n=this.countColumn(i,e...
method countColumn (line 11) | countColumn(e,t=e.length){return ve(e,this.state.tabSize,t)}
method lineIndent (line 11) | lineIndent(e,t=1){let{text:i,from:r}=this.lineAt(e,t),n=this.options.ove...
method simulatedBreak (line 11) | get simulatedBreak(){return this.options.simulateBreak||null}
function QX (line 11) | function QX(O,e,t){let i=e.resolveStack(t),r=e.resolveInner(t,-1).resolv...
function ou (line 11) | function ou(O,e,t){for(let i=O;i;i=i.next){let r=pX(i.node);if(r)return ...
function $X (line 11) | function $X(O){return O.pos==O.options.simulateBreak&&O.options.simulate...
function pX (line 11) | function pX(O){let e=O.type.prop(se);if(e)return e;let t=O.firstChild,i;...
function mX (line 11) | function mX(){return 0}
method constructor (line 11) | constructor(e,t,i){super(e.state,e.options),this.base=e,this.pos=t,this....
method node (line 11) | get node(){return this.context.node}
method create (line 11) | static create(e,t,i){return new O(e,t,i)}
method textAfter (line 11) | get textAfter(){return this.textAfterPos(this.pos)}
method baseIndent (line 11) | get baseIndent(){return this.baseIndentFor(this.node)}
method baseIndentFor (line 11) | baseIndentFor(e){let t=this.state.doc.lineAt(e.from);for(;;){let i=e.res...
method continue (line 11) | continue(){return ou(this.context.next,this.base,this.pos)}
function gX (line 11) | function gX(O,e){for(let t=e;t;t=t.parent)if(O==t)return!0;return!1}
function PX (line 11) | function PX(O){let e=O.node,t=e.childAfter(e.from),i=e.lastChild;if(!t)r...
function be (line 11) | function be({closing:O,align:e=!0,units:t=1}){return i=>lu(i,e,t,O)}
function lu (line 11) | function lu(O,e,t,i,r){let n=O.textAfter,s=n.match(/^\s*/)[0].length,a=i...
function le (line 11) | function le({except:O,units:e=1}={}){return t=>{let i=O&&O.test(t.textAf...
function cu (line 11) | function cu(){return I.transactionFilter.of(O=>{if(!O.docChanged||!O.isU...
function me (line 11) | function me(O){let e=O.firstChild,t=O.lastChild;return e&&e.to<t.from?{f...
function XX (line 11) | function XX(O,e,t){let i=U(O);if(i.length<t)return null;let r=i.resolveS...
function TX (line 11) | function TX(O){let e=O.lastChild;return e&&e.to==O.to&&e.type.isError}
function Ln (line 11) | function Ln(O,e,t){for(let i of O.facet(Ho)){let r=i(O,e,t);if(r)return ...
function hu (line 11) | function hu(O,e){let t=e.mapPos(O.from,1),i=e.mapPos(O.to,-1);return t>=...
function fu (line 11) | function fu(O){let e=[];for(let{head:t}of O.state.selection.ranges)e.som...
method create (line 11) | create(){return Y.none}
method update (line 11) | update(O,e){e.isUserEvent("delete")&&e.changes.iterChangedRanges((t,i)=>...
method toJSON (line 11) | toJSON(O,e){let t=[];return O.between(0,e.doc.length,(i,r)=>{t.push(i,r)...
method fromJSON (line 11) | fromJSON(O){if(!Array.isArray(O)||O.length%2)throw new RangeError("Inval...
function Ou (line 11) | function Ou(O,e,t=e){let i=!1;return O.between(e,t,(r,n)=>{r<t&&n>e&&(i=...
function Mn (line 11) | function Mn(O,e,t){var i;let r=null;return(i=O.field(vO,!1))===null||i==...
function bX (line 11) | function bX(O,e,t){let i=!1;return O.between(e,e,(r,n)=>{r==e&&n==t&&(i=...
function du (line 11) | function du(O,e){return O.field(vO,!1)?e:e.concat(V.appendConfig.of($u()))}
function uu (line 11) | function uu(O,e,t=!0){let i=O.state.doc.lineAt(e.from).number,r=O.state....
method combine (line 11) | combine(O){return xe(O,ZX)}
function $u (line 11) | function $u(O){let e=[vO,YX];return O&&e.push(Ko.of(O)),e}
function pu (line 11) | function pu(O,e){let{state:t}=O,i=t.facet(Ko),r=s=>{let a=O.lineBlockAt(...
method toDOM (line 11) | toDOM(O){return pu(O,null)}
method constructor (line 11) | constructor(e){super(),this.value=e}
method eq (line 11) | eq(e){return this.value==e.value}
method toDOM (line 11) | toDOM(e){return pu(e,this.value)}
method constructor (line 11) | constructor(e,t){super(),this.config=e,this.open=t}
method eq (line 11) | eq(e){return this.config==e.config&&this.open==e.open}
method toDOM (line 11) | toDOM(e){if(this.config.markerDOM)return this.config.markerDOM(this.open...
function mu (line 11) | function mu(O={}){let e={...vX,...O},t=new rr(e,!0),i=new rr(e,!1),r=he....
method constructor (line 11) | constructor(e,t){this.specs=e;let i;function r(a){let o=Ot.newName();ret...
method define (line 11) | static define(e,t){return new O(e,t||{})}
method combine (line 11) | combine(O){return O.length?[O[0]]:null}
function Eo (line 11) | function Eo(O){let e=O.facet(Io);return e.length?e:O.facet(gu)}
function Nn (line 11) | function Nn(O,e){let t=[_X],i;return O instanceof ci&&(O.module&&t.push(...
method constructor (line 11) | constructor(e){this.markCache=Object.create(null),this.tree=U(e.state),t...
method update (line 11) | update(e){let t=U(e.state),i=Eo(e.state),r=i!=Eo(e.startState),{viewport...
method buildDeco (line 11) | buildDeco(e,t){if(!t||!this.tree.length)return Y.none;let i=new Le;for(l...
method combine (line 11) | combine(O){return xe(O,{afterCursor:!0,brackets:Xu,maxScanDistance:Su,re...
function zX (line 11) | function zX(O){let e=[],t=O.matched?VX:qX;return e.push(t.range(O.start....
method create (line 11) | create(){return Y.none}
method update (line 11) | update(O,e){if(!e.docChanged&&!e.selection)return O;let t=[],i=e.state.f...
function bu (line 11) | function bu(O={}){return[Tu.of(O),WX]}
function No (line 11) | function No(O,e,t){let i=O.prop(e<0?R.openedBy:R.closedBy);if(i)return i...
function Fo (line 11) | function Fo(O){let e=O.type.prop(hr);return e?e(O.node):O}
function dt (line 11) | function dt(O,e,t,i={}){let r=i.maxScanDistance||Su,n=i.brackets||Xu,s=U...
function jX (line 11) | function jX(O,e,t,i,r,n,s){let a=i.parent,o={from:r.from,to:r.to},l=0,c=...
function CX (line 11) | function CX(O,e,t,i,r,n,s){let a=t<0?O.sliceDoc(e-1,e):O.sliceDoc(e,e+1)...
function Ao (line 11) | function Ao(O,e){nu.indexOf(O)>-1||(nu.push(O),console.warn(e))}
function AX (line 11) | function AX(O,e){let t=[];for(let a of e.split(" ")){let o=[];for(let l ...
function rl (line 11) | function rl(O,e){return({state:t,dispatch:i})=>{if(t.readOnly)return!1;l...
function nl (line 11) | function nl(O,e){let t=O.languageDataAt("commentTokens",e,1);return t.le...
function BX (line 11) | function BX(O,{open:e,close:t},i,r){let n=O.sliceDoc(i-fr,i),s=O.sliceDo...
function NX (line 11) | function NX(O){let e=[];for(let t of O.selection.ranges){let i=O.doc.lin...
function Ru (line 11) | function Ru(O,e,t=e.selection.ranges){let i=t.map(n=>nl(e,n.from).block)...
function FX (line 11) | function FX(O,e,t=e.selection.ranges){let i=[],r=-1;for(let{from:n,to:s}...
method combine (line 11) | combine(O){return xe(O,{minDepth:100,newGroupDelay:500,joinToEvent:(e,t)...
method create (line 11) | create(){return YO.empty}
method update (line 11) | update(O,e){let t=e.state.facet(Vu),i=e.annotation(el);if(i){let o=ut.fr...
method toJSON (line 11) | toJSON(O){return{done:O.done.map(e=>e.toJSON()),undone:O.undone.map(e=>e...
method fromJSON (line 11) | fromJSON(O){return new YO(O.done.map(ut.fromJSON),O.undone.map(ut.fromJS...
function zu (line 11) | function zu(O={}){return[qu,Vu.of(O),T.domEventHandlers({beforeinput(e,t...
function Kn (line 11) | function Kn(O,e){return function({state:t,dispatch:i}){if(!e&&t.readOnly...
method constructor (line 11) | constructor(e,t,i,r,n){this.changes=e,this.effects=t,this.mapped=i,this....
method setSelAfter (line 11) | setSelAfter(e){return new O(this.changes,this.effects,this.mapped,this.s...
method toJSON (line 11) | toJSON(){var e,t,i;return{changes:(e=this.changes)===null||e===void 0?vo...
method fromJSON (line 11) | static fromJSON(e){return new O(e.changes&&Ze.fromJSON(e.changes),[],e.m...
method fromTransaction (line 11) | static fromTransaction(e,t){let i=st;for(let r of e.startState.facet(KX)...
method selection (line 11) | static selection(e){return new O(void 0,st,void 0,void 0,e)}
function Hn (line 11) | function Hn(O,e,t,i){let r=e+1>t+20?e-t-1:0,n=O.slice(r,e);return n.push...
function tT (line 11) | function tT(O,e){let t=[],i=!1;return O.iterChangedRanges((r,n)=>t.push(...
function OT (line 11) | function OT(O,e){return O.ranges.length==e.ranges.length&&O.ranges.filte...
function Wu (line 11) | function Wu(O,e){return O.length?e.length?O.concat(e):O:e}
function ju (line 11) | function ju(O,e){if(O.length){let t=O[O.length-1],i=t.selectionsAfter.sl...
function rT (line 11) | function rT(O){let e=O[O.length-1],t=O.slice();return t[O.length-1]=e.se...
function Jo (line 11) | function Jo(O,e){if(!O.length)return O;let t=O.length,i=st;for(;t;){let ...
function nT (line 11) | function nT(O,e,t){let i=Wu(O.selectionsAfter.length?O.selectionsAfter.m...
method constructor (line 11) | constructor(e,t,i=0,r=void 0){this.done=e,this.undone=t,this.prevTime=i,...
method isolate (line 11) | isolate(){return this.prevTime?new O(this.done,this.undone):this}
method addChanges (line 11) | addChanges(e,t,i,r,n){let s=this.done,a=s[s.length-1];return a&&a.change...
method addSelection (line 11) | addSelection(e,t,i,r){let n=this.done.length?this.done[this.done.length-...
method addMapping (line 11) | addMapping(e){return new O(Jo(this.done,e),Jo(this.undone,e),this.prevTi...
method pop (line 11) | pop(e,t,i){let r=e==0?this.done:this.undone;if(r.length==0)return null;l...
function fi (line 11) | function fi(O,e){return S.create(O.ranges.map(e),O.mainIndex)}
function Qt (line 11) | function Qt(O,e){return O.update({selection:e,scrollIntoView:!0,userEven...
function $t (line 11) | function $t({state:O,dispatch:e},t){let i=fi(O.selection,t);return i.eq(...
function Jn (line 11) | function Jn(O,e){return S.cursor(e?O.to:O.from)}
function Gu (line 11) | function Gu(O,e){return $t(O,t=>t.empty?O.moveByChar(t,e):Jn(t,e))}
function ke (line 11) | function ke(O){return O.textDirectionAt(O.state.selection.main.head)==H....
function Lu (line 11) | function Lu(O,e){return $t(O,t=>t.empty?O.moveByGroup(t,e):Jn(t,e))}
function lT (line 11) | function lT(O,e,t){if(e.type.prop(t))return!0;let i=e.to-e.from;return i...
function es (line 11) | function es(O,e,t){let i=U(O).resolveInner(e.head),r=t?R.closedBy:R.open...
function Mu (line 11) | function Mu(O,e){return $t(O,t=>{if(!t.empty)return Jn(t,e);let i=O.move...
function Bu (line 11) | function Bu(O){let e=O.scrollDOM.clientHeight<O.scrollDOM.scrollHeight-2...
function Nu (line 11) | function Nu(O,e){let t=Bu(O),{state:i}=O,r=fi(i.selection,s=>s.empty?O.m...
function aO (line 11) | function aO(O,e,t){let i=O.lineBlockAt(e.head),r=O.moveToLineBoundary(e,...
function mT (line 11) | function mT(O,e,t){let i=!1,r=fi(O.selection,n=>{let s=dt(O,n.head,-1)||...
function at (line 11) | function at(O,e){let t=fi(O.state.selection,i=>{let r=e(i);return S.rang...
function Fu (line 11) | function Fu(O,e){return at(O,t=>O.moveByChar(t,e))}
function Ju (line 11) | function Ju(O,e){return at(O,t=>O.moveByGroup(t,e))}
function eQ (line 11) | function eQ(O,e){return at(O,t=>O.moveVertically(t,e))}
function iQ (line 11) | function iQ(O,e){return at(O,t=>O.moveVertically(t,e,Bu(O).height))}
function rQ (line 11) | function rQ(O,e){let{state:t}=O,i=t.selection,r=t.selection.ranges.slice...
function dr (line 11) | function dr(O,e){if(O.state.readOnly)return!1;let t="delete.selection",{...
function Fn (line 11) | function Fn(O,e,t){if(O instanceof T)for(let i of O.state.facet(T.atomic...
function ts (line 11) | function ts(O){let e=[],t=-1;for(let i of O.selection.ranges){let r=O.do...
function lQ (line 11) | function lQ(O,e,t){if(O.readOnly)return!1;let i=[],r=[];for(let n of ts(...
function cQ (line 11) | function cQ(O,e,t){if(O.readOnly)return!1;let i=[];for(let n of ts(O))t?...
function IT (line 11) | function IT(O,e){if(/\(\)|\[\]|\{\}/.test(O.sliceDoc(e-1,e+1)))return{fr...
function hQ (line 11) | function hQ(O){return({state:e,dispatch:t})=>{if(e.readOnly)return!1;let...
function sl (line 11) | function sl(O,e){let t=-1;return O.changeByRange(i=>{let r=[];for(let s=...
method constructor (line 11) | constructor(e,t,i=0,r=e.length,n,s){this.test=s,this.value={from:0,to:0}...
method peek (line 11) | peek(){if(this.bufferPos==this.buffer.length){if(this.bufferStart+=this....
method next (line 11) | next(){for(;this.matches.length;)this.matches.pop();return this.nextOver...
method nextOverlapping (line 11) | nextOverlapping(){for(;;){let e=this.peek();if(e<0)return this.done=!0,t...
method match (line 11) | match(e,t,i){let r=null;for(let n=0;n<this.matches.length;n+=2){let s=th...
method constructor (line 11) | constructor(e,t,i,r=0,n=e.length){if(this.text=e,this.to=n,this.curLine=...
method getLine (line 11) | getLine(e){this.iter.next(e),this.iter.lineBreak?this.curLine="":(this.c...
method nextLine (line 11) | nextLine(){this.curLineStart=this.curLineStart+this.curLine.length+1,thi...
method next (line 11) | next(){for(let e=this.matchPos-this.curLineStart;;){this.re.lastIndex=e;...
method constructor (line 11) | constructor(e,t){this.from=e,this.text=t}
method to (line 11) | get to(){return this.from+this.text.length}
method get (line 11) | static get(e,t,i){let r=al.get(e);if(!r||r.from>=i||r.to<=t){let a=new O...
method constructor (line 11) | constructor(e,t,i,r,n){this.text=e,this.to=n,this.done=!1,this.value=PQ,...
method chunkEnd (line 11) | chunkEnd(e){return e>=this.to?this.to:this.text.lineAt(e).to}
method next (line 11) | next(){for(;;){let e=this.re.lastIndex=this.matchPos-this.flat.from,t=th...
function JT (line 11) | function JT(O){try{return new RegExp(O,dl),!0}catch{return!1}}
function as (line 11) | function as(O,e){if(e>=O.length)return e;let t=O.lineAt(e),i;for(;e<t.to...
function ol (line 11) | function ol(O){let e=String(O.state.doc.lineAt(O.state.selection.main.he...
method create (line 11) | create(){return!0}
method update (line 11) | update(O,e){for(let t of e.effects)t.is(ur)&&(O=t.value);return O}
method combine (line 11) | combine(O){return xe(O,O1,{highlightWordAroundCursor:(e,t)=>e||t,minSele...
function XQ (line 11) | function XQ(O){let e=[a1,s1];return O&&e.push(SQ.of(O)),e}
function mQ (line 11) | function mQ(O,e,t,i){return(t==0||O(e.sliceDoc(t-1,t))!=ee.Word)&&(i==e....
function n1 (line 11) | function n1(O,e,t,i){return O(e.sliceDoc(t,t+1))==ee.Word&&O(e.sliceDoc(...
method constructor (line 11) | constructor(O){this.decorations=this.getDeco(O)}
method update (line 11) | update(O){(O.selectionSet||O.docChanged||O.viewportChanged)&&(this.decor...
method getDeco (line 11) | getDeco(O){let e=O.state.facet(SQ),{state:t}=O,i=t.selection;if(i.ranges...
function l1 (line 11) | function l1(O,e){let{main:t,ranges:i}=O.selection,r=O.wordAt(t.head),n=r...
method combine (line 11) | combine(O){return xe(O,{top:!1,caseSensitive:!1,literal:!1,regexp:!1,who...
method constructor (line 11) | constructor(e){this.search=e.search,this.caseSensitive=!!e.caseSensitive...
method unquote (line 11) | unquote(e){return this.literal?e:e.replace(/\\([nrt\\])/g,(t,i)=>i=="n"?`
method eq (line 12) | eq(e){return this.search==e.search&&this.replace==e.replace&&this.caseSe...
method create (line 12) | create(){return this.regexp?new cl(this):new ll(this)}
method getCursor (line 12) | getCursor(e,t=0,i){let r=e.doc?e:I.create({doc:e});return i==null&&(i=r....
method constructor (line 12) | constructor(e){this.spec=e}
function di (line 12) | function di(O,e,t,i){return new lO(e.doc,O.unquoted,t,i,O.caseSensitive?...
function h1 (line 12) | function h1(O,e){return(t,i,r,n)=>((n>t||n+r.length<i)&&(n=Math.max(0,t-...
method constructor (line 12) | constructor(e){super(e)}
method nextMatch (line 12) | nextMatch(e,t,i){let r=di(this.spec,e,i,e.doc.length).nextOverlapping();...
method prevMatchInRange (line 12) | prevMatchInRange(e,t,i){for(let r=i;;){let n=Math.max(t,r-1e4-this.spec....
method prevMatch (line 12) | prevMatch(e,t,i){let r=this.prevMatchInRange(e,0,t);return r||(r=this.pr...
method getReplacement (line 12) | getReplacement(e){return this.spec.unquote(this.spec.replace)}
method matchAll (line 12) | matchAll(e,t){let i=di(this.spec,e,0,e.doc.length),r=[];for(;!i.next().d...
method highlight (line 12) | highlight(e,t,i,r){let n=di(this.spec,e,Math.max(0,t-this.spec.unquoted....
function ui (line 12) | function ui(O,e,t,i){return new rs(e.doc,O.search,{ignoreCase:!O.caseSen...
function cs (line 12) | function cs(O,e){return O.slice(fe(O,e,!1),e)}
function hs (line 12) | function hs(O,e){return O.slice(e,fe(O,e))}
function f1 (line 12) | function f1(O){return(e,t,i)=>!i[0].length||(O(cs(i.input,i.index))!=ee....
method nextMatch (line 12) | nextMatch(e,t,i){let r=ui(this.spec,e,i,e.doc.length).next();return r.do...
method prevMatchInRange (line 12) | prevMatchInRange(e,t,i){for(let r=1;;r++){let n=Math.max(t,i-r*1e4),s=ui...
method prevMatch (line 12) | prevMatch(e,t,i){return this.prevMatchInRange(e,0,t)||this.prevMatchInRa...
method getReplacement (line 12) | getReplacement(e){return this.spec.unquote(this.spec.replace).replace(/\...
method matchAll (line 12) | matchAll(e,t){let i=ui(this.spec,e,0,e.doc.length),r=[];for(;!i.next().d...
method highlight (line 12) | highlight(e,t,i,r){let n=ui(this.spec,e,Math.max(0,t-250),Math.min(i+250...
method create (line 12) | create(O){return new Qr(hl(O).create(),null)}
method update (line 12) | update(O,e){for(let t of e.effects)t.is($r)?O=new Qr(t.value.create(),O....
method constructor (line 12) | constructor(e,t){this.query=e,this.panel=t}
method constructor (line 12) | constructor(O){this.view=O,this.decorations=this.highlight(O.state.field...
method update (line 12) | update(O){let e=O.state.field(oO);(e!=O.startState.field(oO)||O.docChang...
method highlight (line 12) | highlight({query:O,panel:e}){if(!e||!O.spec.valid)return Y.none;let{view...
function pr (line 12) | function pr(O){return e=>{let t=e.state.field(oO,!1);return t&&t.query.s...
function Ql (line 12) | function Ql(O){return O.state.facet(Qi).createPanel(O)}
function hl (line 12) | function hl(O,e){var t,i,r,n,s;let a=O.selection.main,o=a.empty||a.to>a....
function TQ (line 12) | function TQ(O){let e=bO(O,Ql);return e&&e.dom.querySelector("[main-field...
function bQ (line 12) | function bQ(O){let e=TQ(O);e&&e==O.root.activeElement&&e.select()}
method constructor (line 12) | constructor(e){this.view=e;let t=this.query=e.state.field(oO).query.spec...
method commit (line 12) | commit(){let e=new os({search:this.searchField.value,caseSensitive:this....
method keydown (line 12) | keydown(e){bd(this.view,e,"search-panel")?e.preventDefault():e.keyCode==...
method update (line 12) | update(e){for(let t of e.transactions)for(let i of t.effects)i.is($r)&&!...
method setQuery (line 12) | setQuery(e){this.query=e,this.searchField.value=e.search,this.replaceFie...
method mount (line 12) | mount(){this.searchField.select()}
method pos (line 12) | get pos(){return 80}
method top (line 12) | get top(){return this.view.state.facet(Qi).top}
function Ne (line 12) | function Ne(O,e){return O.state.phrase(e)}
function $l (line 12) | function $l(O,{from:e,to:t}){let i=O.state.doc.lineAt(e),r=O.state.doc.l...
method constructor (line 12) | constructor(e,t,i,r){this.state=e,this.pos=t,this.explicit=i,this.view=r...
method tokenBefore (line 12) | tokenBefore(e){let t=U(this.state).resolveInner(this.pos,-1);for(;t&&e.i...
method matchBefore (line 12) | matchBefore(e){let t=this.state.doc.lineAt(this.pos),i=Math.max(t.from,t...
method aborted (line 12) | get aborted(){return this.abortListeners==null}
method addEventListener (line 12) | addEventListener(e,t,i){e=="abort"&&this.abortListeners&&(this.abortList...
function wQ (line 12) | function wQ(O){let e=Object.keys(O).join(""),t=/\w/.test(e);return t&&(e...
function S1 (line 12) | function S1(O){let e=Object.create(null),t=Object.create(null);for(let{l...
function zt (line 12) | function zt(O){let e=O.map(r=>typeof r=="string"?{label:r}:r),[t,i]=e.ev...
function cO (line 12) | function cO(O,e){return t=>{for(let i=U(t.state).resolveInner(t.pos,-1);...
method constructor (line 12) | constructor(e,t,i,r){this.completion=e,this.source=t,this.match=i,this.s...
function RO (line 12) | function RO(O){return O.selection.main.from}
function zQ (line 12) | function zQ(O,e){var t;let{source:i}=O,r=e&&i[0]!="^",n=i[i.length-1]!="...
function X1 (line 12) | function X1(O,e,t,i){let{main:r}=O.selection,n=t-r.from,s=i-r.from;retur...
function T1 (line 12) | function T1(O){if(!Array.isArray(O))return O;let e=ZQ.get(O);return e||Z...
method constructor (line 12) | constructor(e){this.pattern=e,this.chars=[],this.folded=[],this.any=[],t...
method ret (line 12) | ret(e,t){return this.score=e,this.matched=t,this}
method match (line 12) | match(e){if(this.pattern.length==0)return this.ret(-100,[]);if(e.length<...
method result (line 12) | result(e,t,i){let r=[],n=0;for(let s of t){let a=s+(this.astral?Me(Se(i,...
method constructor (line 12) | constructor(e){this.pattern=e,this.matched=[],this.score=0,this.folded=e...
method match (line 12) | match(e){if(e.length<this.pattern.length)return null;let t=e.slice(0,thi...
method combine (line 12) | combine(O){return xe(O,{activateOnTyping:!0,activateOnCompletion:()=>!1,...
function vQ (line 12) | function vQ(O,e){return O?e?O+" "+e:O:e}
function b1 (line 12) | function b1(O,e,t,i,r,n){let s=O.textDirection==H.RTL,a=s,o=!1,l="top",c...
function y1 (line 12) | function y1(O){let e=O.addToOptions.slice();return O.icons&&e.push({rend...
function pl (line 12) | function pl(O,e,t){if(O<=t)return{from:0,to:O};if(e<0&&(e=0),e<=O>>1){le...
method constructor (line 12) | constructor(e,t,i){this.view=e,this.stateField=t,this.applyCompletion=i,...
method mount (line 12) | mount(){this.updateSel()}
method showOptions (line 12) | showOptions(e,t){this.list&&this.list.remove(),this.list=this.dom.append...
method update (line 12) | update(e){var t;let i=e.state.field(this.stateField),r=e.startState.fiel...
method updateTooltipClass (line 12) | updateTooltipClass(e){let t=this.tooltipClass(e);if(t!=this.currentClass...
method positioned (line 12) | positioned(e){this.space=e,this.info&&this.view.requestMeasure(this.plac...
method updateSel (line 12) | updateSel(){let e=this.view.state.field(this.stateField),t=e.open;(t.sel...
method addInfoPane (line 12) | addInfoPane(e,t){this.destroyInfo();let i=this.info=document.createEleme...
method updateSelectedOption (line 12) | updateSelectedOption(e){let t=null;for(let i=this.list.firstChild,r=this...
method measureInfo (line 12) | measureInfo(){let e=this.dom.querySelector("[aria-selected]");if(!e||!th...
method placeInfo (line 12) | placeInfo(e){this.info&&(e?(e.style&&(this.info.style.cssText=e.style),t...
method createListBox (line 12) | createListBox(e,t,i){let r=document.createElement("ul");r.id=t,r.setAttr...
method destroyInfo (line 12) | destroyInfo(){this.info&&(this.infoDestroy&&this.infoDestroy(),this.info...
method destroy (line 12) | destroy(){this.destroyInfo()}
function x1 (line 12) | function x1(O,e){return t=>new Xl(t,O,e)}
function k1 (line 12) | function k1(O,e){let t=O.getBoundingClientRect(),i=e.getBoundingClientRe...
function YQ (line 12) | function YQ(O){return(O.boost||0)*100+(O.apply?10:0)+(O.info?5:0)+(O.typ...
function w1 (line 12) | function w1(O,e){let t=[],i=null,r=null,n=c=>{t.push(c);let{section:h}=c...
method constructor (line 12) | constructor(e,t,i,r,n,s){this.options=e,this.attrs=t,this.tooltip=i,this...
method setSelected (line 12) | setSelected(e,t){return e==this.selected||e>=this.options.length?this:ne...
method build (line 12) | static build(e,t,i,r,n,s){if(r&&!s&&e.some(l=>l.isPending))return r.setD...
method map (line 12) | map(e){return new O(this.options,this.attrs,{...this.tooltip,pos:e.mapPo...
method setDisabled (line 12) | setDisabled(){return new O(this.options,this.attrs,this.tooltip,this.tim...
method constructor (line 12) | constructor(e,t,i){this.active=e,this.id=t,this.open=i}
method start (line 12) | static start(){return new O(_1,"cm-ac-"+Math.floor(Math.random()*2e6).to...
method update (line 12) | update(e){let{state:t}=e,i=t.facet(ge),n=(i.override||t.languageDataAt("...
method tooltip (line 12) | get tooltip(){return this.open?this.open.tooltip:null}
method attrs (line 12) | get attrs(){return this.open?this.open.attrs:this.active.length?v1:Y1}
function Z1 (line 12) | function Z1(O,e){if(O==e)return!0;for(let t=0,i=0;;){for(;t<O.length&&!O...
function _Q (line 12) | function _Q(O,e){let t={"aria-autocomplete":"list","aria-haspopup":"list...
function UQ (line 12) | function UQ(O,e){if(O.isUserEvent("input.complete")){let i=O.annotation(...
method constructor (line 12) | constructor(e,t,i=!1){this.source=e,this.state=t,this.explicit=i}
method hasResult (line 12) | hasResult(){return!1}
method isPending (line 12) | get isPending(){return this.state==1}
method update (line 12) | update(e,t){let i=UQ(e,t),r=this;(i&8||i&16&&this.touches(e))&&(r=new O(...
method updateFor (line 12) | updateFor(e,t){return this.map(e.changes)}
method map (line 12) | map(e){return this}
method touches (line 12) | touches(e){return e.changes.touchesRange(RO(e.state))}
method constructor (line 12) | constructor(e,t,i,r,n,s){super(e,3,t),this.limit=i,this.result=r,this.fr...
method hasResult (line 12) | hasResult(){return!0}
method updateFor (line 12) | updateFor(e,t){var i;if(!(t&3))return this.map(e.changes);let r=this.res...
method map (line 12) | map(e){return e.empty?this:(this.result.map?this.result.map(this.result,...
method touches (line 12) | touches(e){return e.changes.touchesRange(this.from,this.to)}
function R1 (line 12) | function R1(O,e,t,i){if(!O)return!1;let r=e.sliceDoc(t,i);return typeof ...
method map (line 12) | map(O,e){return O.map(t=>t.map(e))}
method create (line 12) | create(){return bl.start()}
method update (line 12) | update(O,e){return O.update(e)}
function Yl (line 12) | function Yl(O,e){let t=e.completion.apply||e.completion.label,i=O.state....
function us (line 12) | function us(O,e="option"){return t=>{let i=t.state.field(Ce,!1);if(!i||!...
method constructor (line 12) | constructor(e,t){this.active=e,this.context=t,this.time=Date.now(),this....
method constructor (line 12) | constructor(O){this.view=O,this.debounceUpdate=-1,this.running=[],this.d...
method update (line 12) | update(O){let e=O.state.field(Ce),t=O.state.facet(ge);if(!O.selectionSet...
method startUpdate (line 12) | startUpdate(){this.debounceUpdate=-1,this.pendingStart=!1;let{state:O}=t...
method startQuery (line 12) | startQuery(O){let{state:e}=this.view,t=RO(e),i=new $i(e,t,O.explicit,thi...
method scheduleAccept (line 12) | scheduleAccept(){this.running.every(O=>O.done!==void 0)?this.accept():th...
method accept (line 12) | accept(){var O;this.debounceAccept>-1&&clearTimeout(this.debounceAccept)...
method blur (line 12) | blur(O){let e=this.view.state.field(Ce,!1);if(e&&e.tooltip&&this.view.st...
method compositionstart (line 12) | compositionstart(){this.composing=1}
method compositionend (line 12) | compositionend(){this.composing==3&&setTimeout(()=>this.view.dispatch({e...
method keydown (line 12) | keydown(O,e){let t=e.state.field(Ce,!1);if(!t||!t.open||t.open.disabled|...
method constructor (line 12) | constructor(e,t,i,r){this.field=e,this.line=t,this.from=i,this.to=r}
method constructor (line 12) | constructor(e,t,i){this.field=e,this.from=t,this.to=i}
method map (line 12) | map(e){let t=e.mapPos(this.from,-1,pe.TrackDel),i=e.mapPos(this.to,1,pe....
method constructor (line 12) | constructor(e,t){this.lines=e,this.fieldPositions=t}
method instantiate (line 12) | instantiate(e,t){let i=[],r=[t],n=e.doc.lineAt(t),s=/^\s*/.exec(n.text)[...
method parse (line 12) | static parse(e){let t=[],i=[],r=[],n;for(let s of e.split(/\r\n?|\n/)){f...
method toDOM (line 12) | toDOM(){let O=document.createElement("span");return O.className="cm-snip...
method ignoreEvent (line 12) | ignoreEvent(){return!1}
method constructor (line 12) | constructor(e,t){this.ranges=e,this.active=t,this.deco=Y.set(e.map(i=>(i...
method map (line 12) | map(e){let t=[];for(let i of this.ranges){let r=i.map(e);if(!r)return nu...
method selectionInsideField (line 12) | selectionInsideField(e){return e.ranges.every(t=>this.ranges.some(i=>i.f...
method map (line 12) | map(O,e){return O&&O.map(e)}
method create (line 12) | create(){return null}
method update (line 12) | update(O,e){for(let t of e.effects){if(t.is(Sr))return t.value;if(t.is(L...
function _l (line 12) | function _l(O,e){return S.create(O.filter(t=>t.field==e).map(t=>S.range(...
function M1 (line 12) | function M1(O){let e=wl.parse(O);return(t,i,r,n)=>{let{text:s,ranges:a}=...
function CQ (line 12) | function CQ(O){return({state:e,dispatch:t})=>{let i=e.field(gr,!1);if(!i...
method combine (line 12) | combine(O){return O.length?O[0]:N1}
function W (line 12) | function W(O,e){return{...e,apply:M1(O)}}
method mousedown (line 12) | mousedown(O,e){let t=e.state.field(gr,!1),i;if(!t||(i=e.posAtCoords({x:O...
method map (line 12) | map(O,e){let t=e.mapPos(O,-1,pe.TrackAfter);return t??void 0}
method create (line 12) | create(){return M.empty}
method update (line 12) | update(O,e){if(O=O.map(e.changes),e.selection){let t=e.state.doc.lineAt(...
function EQ (line 12) | function EQ(){return[J1,GQ]}
function AQ (line 12) | function AQ(O){for(let e=0;e<gl.length;e+=2)if(gl.charCodeAt(e)==O)retur...
function LQ (line 12) | function LQ(O,e){return O.languageDataAt("closeBrackets",e)[0]||Pr}
function t0 (line 12) | function t0(O,e){let t=LQ(O,O.selection.main.head),i=t.brackets||Pr.brac...
function DQ (line 12) | function DQ(O,e){let t=!1;return O.field(GQ).between(0,O.doc.length,i=>{...
function ms (line 12) | function ms(O,e){let t=O.sliceString(e,e+2);return t.slice(0,Me(Se(t,0)))}
function O0 (line 12) | function O0(O,e){let t=O.sliceString(e-2,e);return Me(Se(t,0))==t.length...
function i0 (line 12) | function i0(O,e,t,i){let r=null,n=O.changeByRange(s=>{if(!s.empty)return...
function r0 (line 12) | function r0(O,e,t){let i=null,r=O.changeByRange(n=>n.empty&&ms(O.doc,n.h...
function n0 (line 12) | function n0(O,e,t,i){let r=i.stringPrefixes||Pr.stringPrefixes,n=null,s=...
function VQ (line 12) | function VQ(O,e){let t=U(O).resolveInner(e+1);return t.parent&&t.from==e}
function s0 (line 12) | function s0(O,e,t,i){let r=U(O).resolveInner(e,-1),n=i.reduce((s,a)=>Mat...
function qQ (line 12) | function qQ(O,e,t){let i=O.charCategorizer(e);if(i(O.sliceDoc(e-1,e))!=e...
function IQ (line 12) | function IQ(O={}){return[G1,Ce,ge.of(O),j1,a0,jQ]}
method constructor (line 12) | constructor(e,t,i){this.from=e,this.to=t,this.diagnostic=i}
method constructor (line 12) | constructor(e,t,i){this.diagnostics=e,this.panel=t,this.selected=i}
method init (line 12) | static init(e,t,i){let r=i.facet(Xr).markerFilter;r&&(e=r(e,i));let n=e....
function mi (line 12) | function mi(O,e=null,t=0){let i=null;return O.between(t,1e9,(r,n,{spec:s...
function o0 (line 12) | function o0(O,e){let t=e.pos,i=e.end||t,r=O.state.facet(Xr).hideOn(O,t,i...
function l0 (line 12) | function l0(O,e){return O.field(Fe,!1)?e:e.concat(V.appendConfig.of(g0))}
method create (line 12) | create(){return new VO(Y.none,null,null)}
method update (line 12) | update(O,e){if(e.docChanged&&O.diagnostics.size){let t=O.diagnostics.map...
function h0 (line 12) | function h0(O,e,t){let{diagnostics:i}=O.state.field(Fe),r,n=-1,s=-1;i.be...
function f0 (line 12) | function f0(O,e){return N("ul",{class:"cm-tooltip-lint"},e.map(t=>e$(O,t...
method combine (line 12) | combine(O){return{sources:O.map(e=>e.source).filter(e=>e!=null),...xe(O....
function NQ (line 12) | function NQ(O,e){return O?e?(t,i)=>e(O(t,i),i):O:e}
function JQ (line 12) | function JQ(O){let e=[];if(O)e:for(let{name:t}of O){for(let i=0;i<t.leng...
function e$ (line 12) | function e$(O,e,t){var i;let r=t?JQ(e.actions):[];return N("li",{class:"...
method constructor (line 12) | constructor(e){super(),this.sev=e}
method eq (line 12) | eq(e){return e.sev==this.sev}
method toDOM (line 12) | toDOM(){return N("span",{class:"cm-lintPoint cm-lintPoint-"+this.sev})}
method constructor (line 12) | constructor(e,t){this.diagnostic=t,this.id="item_"+Math.floor(Math.rando...
method constructor (line 12) | constructor(e){this.view=e,this.items=[];let t=r=>{if(r.keyCode==27)BQ(t...
method selectedIndex (line 12) | get selectedIndex(){let e=this.view.state.field(Fe).selected;if(!e)retur...
method update (line 12) | update(){let{diagnostics:e,selected:t}=this.view.state.field(Fe),i=0,r=!...
method sync (line 12) | sync(){let e=this.list.firstChild;function t(){let i=e;e=i.nextSibling,i...
method moveSelection (line 12) | moveSelection(e){if(this.selectedIndex<0)return;let t=this.view.state.fi...
method open (line 12) | static open(e){return new O(e)}
function Q0 (line 12) | function Q0(O,e='viewBox="0 0 40 40"'){return`url('data:image/svg+xml,<s...
function gs (line 12) | function gs(O){return Q0(`<path d="m0 2.5 l2 -1.5 l1 0 l2 1.5 l1 0" stro...
function p0 (line 12) | function p0(O){return O=="error"?4:O=="warning"?3:O=="info"?2:1}
function m0 (line 12) | function m0(O){let e="hint",t=1;for(let i of O){let r=p0(i.severity);r>t...
method constructor (line 12) | constructor(e,t,i,r,n,s,a,o,l,c=0,h){this.p=e,this.stack=t,this.state=i,...
method toString (line 12) | toString(){return`[${this.stack.filter((e,t)=>t%3==0).concat(this.state)...
method start (line 12) | static start(e,t,i=0){let r=e.parser.context;return new O(e,[],t,i,i,0,[...
method context (line 12) | get context(){return this.curContext?this.curContext.context:null}
method pushState (line 12) | pushState(e,t){this.stack.push(this.state,t,this.bufferBase+this.buffer....
method reduce (line 12) | reduce(e){var t;let i=e>>19,r=e&65535,{parser:n}=this.p,s=this.reducePos...
method storeNode (line 12) | storeNode(e,t,i,r=4,n=!1){if(e==0&&(!this.stack.length||this.stack[this....
method shift (line 12) | shift(e,t,i,r){if(e&131072)this.pushState(e&65535,this.pos);else if((e&2...
method apply (line 12) | apply(e,t,i,r){e&65536?this.reduce(e):this.shift(e,t,i,r)}
method useNode (line 12) | useNode(e,t){let i=this.p.reused.length-1;(i<0||this.p.reused[i]!=e)&&(t...
method split (line 12) | split(){let e=this,t=e.buffer.length;for(;t>0&&e.buffer[t-2]>e.reducePos...
method recoverByDelete (line 12) | recoverByDelete(e,t){let i=e<=this.p.parser.maxNode;i&&this.storeNode(e,...
method canShift (line 12) | canShift(e){for(let t=new El(this);;){let i=this.p.parser.stateSlot(t.st...
method recoverByInsert (line 12) | recoverByInsert(e){if(this.stack.length>=300)return[];let t=this.p.parse...
method forceReduce (line 12) | forceReduce(){let{parser:e}=this.p,t=e.stateSlot(this.state,5);if((t&655...
method findForcedReduction (line 12) | findForcedReduction(){let{parser:e}=this.p,t=[],i=(r,n)=>{if(!t.includes...
method forceAll (line 12) | forceAll(){for(;!this.p.parser.stateFlag(this.state,2);)if(!this.forceRe...
method deadEnd (line 12) | get deadEnd(){if(this.stack.length!=3)return!1;let{parser:e}=this.p;retu...
method restart (line 12) | restart(){this.storeNode(0,this.pos,this.pos,4,!0),this.state=this.stack...
method sameState (line 12) | sameState(e){if(this.state!=e.state||this.stack.length!=e.stack.length)r...
method parser (line 12) | get parser(){return this.p.parser}
method dialectEnabled (line 12) | dialectEnabled(e){return this.p.parser.dialect.flags[e]}
method shiftContext (line 12) | shiftContext(e,t){this.curContext&&this.updateContext(this.curContext.tr...
method reduceContext (line 12) | reduceContext(e,t){this.curContext&&this.updateContext(this.curContext.t...
method emitContext (line 12) | emitContext(){let e=this.buffer.length-1;(e<0||this.buffer[e]!=-3)&&this...
method emitLookAhead (line 12) | emitLookAhead(){let e=this.buffer.length-1;(e<0||this.buffer[e]!=-4)&&th...
method updateContext (line 12) | updateContext(e){if(e!=this.curContext.context){let t=new Ts(this.curCon...
method setLookAhead (line 12) | setLookAhead(e){return e<=this.lookAhead?!1:(this.emitLookAhead(),this.l...
method close (line 12) | close(){this.curContext&&this.curContext.tracker.strict&&this.emitContex...
method constructor (line 12) | constructor(e,t){this.tracker=e,this.context=t,this.hash=e.strict?e.hash...
method constructor (line 12) | constructor(e){this.start=e,this.state=e.state,this.stack=e.stack,this.b...
method reduce (line 12) | reduce(e){let t=e&65535,i=e>>19;i==0?(this.stack==this.start.stack&&(thi...
method constructor (line 12) | constructor(e,t,i){this.stack=e,this.pos=t,this.index=i,this.buffer=e.bu...
method create (line 12) | static create(e,t=e.bufferBase+e.buffer.length){return new O(e,t,t-e.buf...
method maybeNext (line 12) | maybeNext(){let e=this.stack.parent;e!=null&&(this.index=this.stack.buff...
method id (line 12) | get id(){return this.buffer[this.index-4]}
method start (line 12) | get start(){return this.buffer[this.index-3]}
method end (line 12) | get end(){return this.buffer[this.index-2]}
method size (line 12) | get size(){return this.buffer[this.index-1]}
method next (line 12) | next(){this.index-=4,this.pos-=4,this.index==0&&this.maybeNext()}
method fork (line 12) | fork(){return new O(this.stack,this.pos,this.index)}
function br (line 12) | function br(O,e=Uint16Array){if(typeof O!="string")return O;let t=null;f...
method constructor (line 12) | constructor(){this.start=-1,this.value=-1,this.end=-1,this.extended=-1,t...
method constructor (line 12) | constructor(e,t){this.input=e,this.ranges=t,this.chunk="",this.chunkOff=...
method resolveOffset (line 12) | resolveOffset(e,t){let i=this.range,r=this.rangeIndex,n=this.pos+e;for(;...
method clipPos (line 12) | clipPos(e){if(e>=this.range.from&&e<this.range.to)return e;for(let t of ...
method peek (line 12) | peek(e){let t=this.chunkOff+e,i,r;if(t>=0&&t<this.chunk.length)i=this.po...
method acceptToken (line 12) | acceptToken(e,t=0){let i=t?this.resolveOffset(t,-1):this.pos;if(i==null|...
method acceptTokenTo (line 12) | acceptTokenTo(e,t){this.token.value=e,this.token.end=t}
method getChunk (line 12) | getChunk(){if(this.pos>=this.chunk2Pos&&this.pos<this.chunk2Pos+this.chu...
method readNext (line 12) | readNext(){return this.chunkOff>=this.chunk.length&&(this.getChunk(),thi...
method advance (line 12) | advance(e=1){for(this.chunkOff+=e;this.pos+e>=this.range.to;){if(this.ra...
method setDone (line 12) | setDone(){return this.pos=this.chunkPos=this.end,this.range=this.ranges[...
method re
Copy disabled (too large)
Download .json
Condensed preview — 433 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (14,113K chars).
[
{
"path": ".editorconfig",
"chars": 258,
"preview": "root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\ninsert_final_newline = true\nindent_style = space\nindent_size = 4\ntrim_"
},
{
"path": ".gitattributes",
"chars": 152,
"preview": "* text=auto\n\n*.blade.php diff=html\n*.css diff=css\n*.html diff=html\n*.md diff=markdown\n*.php diff=php\n\n/.github export-ig"
},
{
"path": ".github/workflows/auth.yml",
"chars": 1544,
"preview": "name: Authentication Tests\n\non:\n pull_request:\n branches:\n - main\n\njobs:\n test:\n runs-on: ubuntu-latest\n\n "
},
{
"path": ".github/workflows/install-automatic.yml",
"chars": 4895,
"preview": "name: Automated Installation\n\non:\n push:\n branches:\n - main\n - 3.x\n pull_request:\n branches: [ main ]\n"
},
{
"path": ".github/workflows/pint.yml",
"chars": 650,
"preview": "name: Laravel Pint\n\non:\n pull_request:\n branches:\n - main\n\njobs:\n pint:\n runs-on: ubuntu-latest\n\n steps:"
},
{
"path": ".github/workflows/tests.yml",
"chars": 2285,
"preview": "name: Pest Tests\n\non:\n push:\n branches:\n - main\n - 3.x\n pull_request:\n branches: [ main ]\n\njobs:\n ins"
},
{
"path": ".gitignore",
"chars": 797,
"preview": "/node_modules\n/public/hot\n/public/storage\n/storage/*.key\n/storage/pail\n/vendor\n.env\n.env.backup\n.phpunit.result.cache\n.p"
},
{
"path": "CLAUDE.md",
"chars": 7272,
"preview": "# CLAUDE.md\n\nThis file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.\n\n## "
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 1081,
"preview": "# Code of Conduct\n\n## Our Community\n\nWave is built by developers, for developers. We're here to help each other build be"
},
{
"path": "CONTRIBUTING.md",
"chars": 8304,
"preview": "# Contributing to Wave\n\nThank you for considering contributing to Wave! We appreciate your interest in making this SaaS "
},
{
"path": "LICENSE.md",
"chars": 1069,
"preview": "The MIT License (MIT)\n\nCopyright (c) DevDojo\n\nPermission is hereby granted, free of charge, to any person obtaining a co"
},
{
"path": "README.md",
"chars": 4622,
"preview": "<p align=\"center\"><a href=\"https://devdojo.com/wave\" target=\"_blank\"><img src=\"https://cdn.devdojo.com/images/october202"
},
{
"path": "SECURITY.md",
"chars": 286,
"preview": "# Security Policy\n\n**PLEASE DON'T DISCLOSE SECURITY-RELATED ISSUES PUBLICLY.**\n\n## Reporting a Vulnerability\n\nIf you dis"
},
{
"path": "app/Console/Commands/CreateRole.php",
"chars": 2145,
"preview": "<?php\n\nnamespace App\\Console\\Commands;\n\nuse Illuminate\\Console\\Command;\nuse Illuminate\\Support\\Facades\\Validator;\nuse Sp"
},
{
"path": "app/Console/Commands/CreateUser.php",
"chars": 2103,
"preview": "<?php\n\nnamespace App\\Console\\Commands;\n\nuse App\\Models\\User;\nuse Illuminate\\Console\\Command;\nuse Illuminate\\Support\\Faca"
},
{
"path": "app/Filament/Pages/Dashboard.php",
"chars": 324,
"preview": "<?php\n\nnamespace App\\Filament\\Pages;\n\nuse BackedEnum;\nuse Filament\\Panel;\n\nclass Dashboard extends \\Filament\\Pages\\Dashb"
},
{
"path": "app/Filament/Pages/Media.php",
"chars": 425,
"preview": "<?php\n\nnamespace App\\Filament\\Pages;\n\nuse BackedEnum;\nuse Filament\\Pages\\Page;\nuse Filament\\Support\\Enums\\Width;\n\nclass "
},
{
"path": "app/Filament/Pages/Plugins.php",
"chars": 4906,
"preview": "<?php\n\nnamespace App\\Filament\\Pages;\n\nuse BackedEnum;\nuse Filament\\Notifications\\Notification;\nuse Filament\\Pages\\Page;\n"
},
{
"path": "app/Filament/Pages/Themes.php",
"chars": 5022,
"preview": "<?php\n\nnamespace App\\Filament\\Pages;\n\nuse BackedEnum;\nuse Filament\\Notifications\\Notification;\nuse Filament\\Pages\\Page;\n"
},
{
"path": "app/Filament/Resources/Categories/CategoryResource.php",
"chars": 2932,
"preview": "<?php\n\nnamespace App\\Filament\\Resources\\Categories;\n\nuse App\\Filament\\Resources\\Categories\\Pages\\CreateCategory;\nuse App"
},
{
"path": "app/Filament/Resources/Categories/Pages/CreateCategory.php",
"chars": 270,
"preview": "<?php\n\nnamespace App\\Filament\\Resources\\Categories\\Pages;\n\nuse App\\Filament\\Resources\\Categories\\CategoryResource;\nuse F"
},
{
"path": "app/Filament/Resources/Categories/Pages/EditCategory.php",
"chars": 423,
"preview": "<?php\n\nnamespace App\\Filament\\Resources\\Categories\\Pages;\n\nuse App\\Filament\\Resources\\Categories\\CategoryResource;\nuse F"
},
{
"path": "app/Filament/Resources/Categories/Pages/ListCategories.php",
"chars": 427,
"preview": "<?php\n\nnamespace App\\Filament\\Resources\\Categories\\Pages;\n\nuse App\\Filament\\Resources\\Categories\\CategoryResource;\nuse F"
},
{
"path": "app/Filament/Resources/Changelogs/ChangelogResource.php",
"chars": 2694,
"preview": "<?php\n\nnamespace App\\Filament\\Resources\\Changelogs;\n\nuse App\\Filament\\Resources\\Changelogs\\Pages\\CreateChangelog;\nuse Ap"
},
{
"path": "app/Filament/Resources/Changelogs/Pages/CreateChangelog.php",
"chars": 273,
"preview": "<?php\n\nnamespace App\\Filament\\Resources\\Changelogs\\Pages;\n\nuse App\\Filament\\Resources\\Changelogs\\ChangelogResource;\nuse "
},
{
"path": "app/Filament/Resources/Changelogs/Pages/EditChangelog.php",
"chars": 426,
"preview": "<?php\n\nnamespace App\\Filament\\Resources\\Changelogs\\Pages;\n\nuse App\\Filament\\Resources\\Changelogs\\ChangelogResource;\nuse "
},
{
"path": "app/Filament/Resources/Changelogs/Pages/ListChangelogs.php",
"chars": 429,
"preview": "<?php\n\nnamespace App\\Filament\\Resources\\Changelogs\\Pages;\n\nuse App\\Filament\\Resources\\Changelogs\\ChangelogResource;\nuse "
},
{
"path": "app/Filament/Resources/Forms/FormsResource.php",
"chars": 3412,
"preview": "<?php\n\nnamespace App\\Filament\\Resources\\Forms;\n\nuse App\\Filament\\Resources\\Forms\\Pages\\CreateForms;\nuse App\\Filament\\Res"
},
{
"path": "app/Filament/Resources/Forms/Pages/CreateForms.php",
"chars": 419,
"preview": "<?php\n\nnamespace App\\Filament\\Resources\\Forms\\Pages;\n\nuse App\\Filament\\Resources\\Forms\\FormsResource;\nuse Filament\\Resou"
},
{
"path": "app/Filament/Resources/Forms/Pages/EditForms.php",
"chars": 952,
"preview": "<?php\n\nnamespace App\\Filament\\Resources\\Forms\\Pages;\n\nuse App\\Filament\\Resources\\Forms\\FormsResource;\nuse Filament\\Actio"
},
{
"path": "app/Filament/Resources/Forms/Pages/ListForms.php",
"chars": 406,
"preview": "<?php\n\nnamespace App\\Filament\\Resources\\Forms\\Pages;\n\nuse App\\Filament\\Resources\\Forms\\FormsResource;\nuse Filament\\Actio"
},
{
"path": "app/Filament/Resources/Pages/PageResource.php",
"chars": 4152,
"preview": "<?php\n\nnamespace App\\Filament\\Resources\\Pages;\n\nuse App\\Filament\\Resources\\Pages\\Pages\\CreatePage;\nuse App\\Filament\\Reso"
},
{
"path": "app/Filament/Resources/Pages/Pages/CreatePage.php",
"chars": 248,
"preview": "<?php\n\nnamespace App\\Filament\\Resources\\Pages\\Pages;\n\nuse App\\Filament\\Resources\\Pages\\PageResource;\nuse Filament\\Resour"
},
{
"path": "app/Filament/Resources/Pages/Pages/EditPage.php",
"chars": 401,
"preview": "<?php\n\nnamespace App\\Filament\\Resources\\Pages\\Pages;\n\nuse App\\Filament\\Resources\\Pages\\PageResource;\nuse Filament\\Action"
},
{
"path": "app/Filament/Resources/Pages/Pages/ListPages.php",
"chars": 404,
"preview": "<?php\n\nnamespace App\\Filament\\Resources\\Pages\\Pages;\n\nuse App\\Filament\\Resources\\Pages\\PageResource;\nuse Filament\\Action"
},
{
"path": "app/Filament/Resources/Permissions/Pages/CreatePermission.php",
"chars": 278,
"preview": "<?php\n\nnamespace App\\Filament\\Resources\\Permissions\\Pages;\n\nuse App\\Filament\\Resources\\Permissions\\PermissionResource;\nu"
},
{
"path": "app/Filament/Resources/Permissions/Pages/EditPermission.php",
"chars": 431,
"preview": "<?php\n\nnamespace App\\Filament\\Resources\\Permissions\\Pages;\n\nuse App\\Filament\\Resources\\Permissions\\PermissionResource;\nu"
},
{
"path": "app/Filament/Resources/Permissions/Pages/ListPermissions.php",
"chars": 434,
"preview": "<?php\n\nnamespace App\\Filament\\Resources\\Permissions\\Pages;\n\nuse App\\Filament\\Resources\\Permissions\\PermissionResource;\nu"
},
{
"path": "app/Filament/Resources/Permissions/PermissionResource.php",
"chars": 2492,
"preview": "<?php\n\nnamespace App\\Filament\\Resources\\Permissions;\n\nuse App\\Filament\\Resources\\Permissions\\Pages\\CreatePermission;\nuse"
},
{
"path": "app/Filament/Resources/Plans/Pages/CreatePlan.php",
"chars": 248,
"preview": "<?php\n\nnamespace App\\Filament\\Resources\\Plans\\Pages;\n\nuse App\\Filament\\Resources\\Plans\\PlanResource;\nuse Filament\\Resour"
},
{
"path": "app/Filament/Resources/Plans/Pages/EditPlan.php",
"chars": 401,
"preview": "<?php\n\nnamespace App\\Filament\\Resources\\Plans\\Pages;\n\nuse App\\Filament\\Resources\\Plans\\PlanResource;\nuse Filament\\Action"
},
{
"path": "app/Filament/Resources/Plans/Pages/ListPlans.php",
"chars": 404,
"preview": "<?php\n\nnamespace App\\Filament\\Resources\\Plans\\Pages;\n\nuse App\\Filament\\Resources\\Plans\\PlanResource;\nuse Filament\\Action"
},
{
"path": "app/Filament/Resources/Plans/PlanResource.php",
"chars": 7104,
"preview": "<?php\n\nnamespace App\\Filament\\Resources\\Plans;\n\nuse App\\Filament\\Resources\\Plans\\Pages\\CreatePlan;\nuse App\\Filament\\Reso"
},
{
"path": "app/Filament/Resources/Posts/Pages/CreatePost.php",
"chars": 248,
"preview": "<?php\n\nnamespace App\\Filament\\Resources\\Posts\\Pages;\n\nuse App\\Filament\\Resources\\Posts\\PostResource;\nuse Filament\\Resour"
},
{
"path": "app/Filament/Resources/Posts/Pages/EditPost.php",
"chars": 401,
"preview": "<?php\n\nnamespace App\\Filament\\Resources\\Posts\\Pages;\n\nuse App\\Filament\\Resources\\Posts\\PostResource;\nuse Filament\\Action"
},
{
"path": "app/Filament/Resources/Posts/Pages/ListPosts.php",
"chars": 404,
"preview": "<?php\n\nnamespace App\\Filament\\Resources\\Posts\\Pages;\n\nuse App\\Filament\\Resources\\Posts\\PostResource;\nuse Filament\\Action"
},
{
"path": "app/Filament/Resources/Posts/PostResource.php",
"chars": 5317,
"preview": "<?php\n\nnamespace App\\Filament\\Resources\\Posts;\n\nuse App\\Filament\\Resources\\Posts\\Pages\\CreatePost;\nuse App\\Filament\\Reso"
},
{
"path": "app/Filament/Resources/Roles/Pages/CreateRole.php",
"chars": 248,
"preview": "<?php\n\nnamespace App\\Filament\\Resources\\Roles\\Pages;\n\nuse App\\Filament\\Resources\\Roles\\RoleResource;\nuse Filament\\Resour"
},
{
"path": "app/Filament/Resources/Roles/Pages/EditRole.php",
"chars": 401,
"preview": "<?php\n\nnamespace App\\Filament\\Resources\\Roles\\Pages;\n\nuse App\\Filament\\Resources\\Roles\\RoleResource;\nuse Filament\\Action"
},
{
"path": "app/Filament/Resources/Roles/Pages/ListRoles.php",
"chars": 404,
"preview": "<?php\n\nnamespace App\\Filament\\Resources\\Roles\\Pages;\n\nuse App\\Filament\\Resources\\Roles\\RoleResource;\nuse Filament\\Action"
},
{
"path": "app/Filament/Resources/Roles/RoleResource.php",
"chars": 2644,
"preview": "<?php\n\nnamespace App\\Filament\\Resources\\Roles;\n\nuse App\\Filament\\Resources\\Roles\\Pages\\CreateRole;\nuse App\\Filament\\Reso"
},
{
"path": "app/Filament/Resources/Settings/Pages/CreateSetting.php",
"chars": 397,
"preview": "<?php\n\nnamespace App\\Filament\\Resources\\Settings\\Pages;\n\nuse App\\Filament\\Resources\\Settings\\SettingResource;\nuse Filame"
},
{
"path": "app/Filament/Resources/Settings/Pages/EditSetting.php",
"chars": 548,
"preview": "<?php\n\nnamespace App\\Filament\\Resources\\Settings\\Pages;\n\nuse App\\Filament\\Resources\\Settings\\SettingResource;\nuse Filame"
},
{
"path": "app/Filament/Resources/Settings/Pages/ListSettings.php",
"chars": 553,
"preview": "<?php\n\nnamespace App\\Filament\\Resources\\Settings\\Pages;\n\nuse App\\Filament\\Resources\\Settings\\SettingResource;\nuse Filame"
},
{
"path": "app/Filament/Resources/Settings/SettingResource.php",
"chars": 3342,
"preview": "<?php\n\nnamespace App\\Filament\\Resources\\Settings;\n\nuse App\\Filament\\Resources\\Settings\\Pages\\CreateSetting;\nuse App\\Fila"
},
{
"path": "app/Filament/Resources/Users/Pages/CreateUser.php",
"chars": 248,
"preview": "<?php\n\nnamespace App\\Filament\\Resources\\Users\\Pages;\n\nuse App\\Filament\\Resources\\Users\\UserResource;\nuse Filament\\Resour"
},
{
"path": "app/Filament/Resources/Users/Pages/EditUser.php",
"chars": 401,
"preview": "<?php\n\nnamespace App\\Filament\\Resources\\Users\\Pages;\n\nuse App\\Filament\\Resources\\Users\\UserResource;\nuse Filament\\Action"
},
{
"path": "app/Filament/Resources/Users/Pages/ListUsers.php",
"chars": 404,
"preview": "<?php\n\nnamespace App\\Filament\\Resources\\Users\\Pages;\n\nuse App\\Filament\\Resources\\Users\\UserResource;\nuse Filament\\Action"
},
{
"path": "app/Filament/Resources/Users/UserResource.php",
"chars": 3825,
"preview": "<?php\n\nnamespace App\\Filament\\Resources\\Users;\n\nuse App\\Filament\\Resources\\Users\\Pages\\CreateUser;\nuse App\\Filament\\Reso"
},
{
"path": "app/Filament/Widgets/DashboardWidget.php",
"chars": 354,
"preview": "<?php\n\nnamespace App\\Filament\\Widgets;\n\nuse Filament\\Widgets\\Widget;\n\nclass DashboardWidget extends Widget\n{\n protect"
},
{
"path": "app/Http/Controllers/Controller.php",
"chars": 69,
"preview": "<?php\n\nnamespace App\\Http\\Controllers;\n\nabstract class Controller {}\n"
},
{
"path": "app/Listeners/LogSuccessfulLogin.php",
"chars": 787,
"preview": "<?php\n\nnamespace App\\Listeners;\n\nuse Illuminate\\Auth\\Events\\Login;\n\nclass LogSuccessfulLogin\n{\n /**\n * Create the"
},
{
"path": "app/Listeners/LogSuccessfulLogout.php",
"chars": 1033,
"preview": "<?php\n\nnamespace App\\Listeners;\n\nuse Illuminate\\Auth\\Events\\Logout;\n\nclass LogSuccessfulLogout\n{\n /**\n * Create t"
},
{
"path": "app/Models/Category.php",
"chars": 103,
"preview": "<?php\n\nnamespace App\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Model;\n\nclass Category extends Model {}\n"
},
{
"path": "app/Models/Forms.php",
"chars": 683,
"preview": "<?php\n\nnamespace App\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Factories\\HasFactory;\nuse Illuminate\\Database\\Eloquent\\Mo"
},
{
"path": "app/Models/Post.php",
"chars": 116,
"preview": "<?php\n\nnamespace App\\Models;\n\nuse Wave\\Post as WavePost;\n\nclass Post extends WavePost\n{\n public $guarded = [];\n}\n"
},
{
"path": "app/Models/User.php",
"chars": 2096,
"preview": "<?php\n\nnamespace App\\Models;\n\nuse Illuminate\\Database\\Eloquent\\Factories\\HasFactory;\nuse Illuminate\\Database\\Eloquent\\Re"
},
{
"path": "app/Notifications/TestNotification.php",
"chars": 1376,
"preview": "<?php\n\nnamespace App\\Notifications;\n\nuse Illuminate\\Bus\\Queueable;\nuse Illuminate\\Notifications\\Messages\\MailMessage;\nus"
},
{
"path": "app/Providers/AppServiceProvider.php",
"chars": 2587,
"preview": "<?php\n\nnamespace App\\Providers;\n\nuse App\\Listeners\\LogSuccessfulLogin;\nuse App\\Listeners\\LogSuccessfulLogout;\nuse Except"
},
{
"path": "app/Providers/Filament/AdminPanelProvider.php",
"chars": 2781,
"preview": "<?php\n\nnamespace App\\Providers\\Filament;\n\nuse App\\Filament\\Widgets\\DashboardWidget;\nuse Filament\\Facades\\Filament;\nuse F"
},
{
"path": "app/Providers/FolioServiceProvider.php",
"chars": 311,
"preview": "<?php\n\nnamespace App\\Providers;\n\nuse Illuminate\\Support\\ServiceProvider;\n\nclass FolioServiceProvider extends ServiceProv"
},
{
"path": "app/Providers/VoltServiceProvider.php",
"chars": 494,
"preview": "<?php\n\nnamespace App\\Providers;\n\nuse Illuminate\\Support\\ServiceProvider;\nuse Livewire\\Volt\\Volt;\n\nclass VoltServiceProvi"
},
{
"path": "artisan",
"chars": 425,
"preview": "#!/usr/bin/env php\n<?php\n\nuse Illuminate\\Foundation\\Application;\nuse Symfony\\Component\\Console\\Input\\ArgvInput;\n\ndefine("
},
{
"path": "bootstrap/app.php",
"chars": 1436,
"preview": "<?php\n\nuse App\\Providers\\AppServiceProvider;\nuse Illuminate\\Foundation\\Application;\nuse Illuminate\\Foundation\\Configurat"
},
{
"path": "bootstrap/cache/.gitignore",
"chars": 14,
"preview": "*\n!.gitignore\n"
},
{
"path": "bootstrap/providers.php",
"chars": 211,
"preview": "<?php\n\nreturn [\n App\\Providers\\AppServiceProvider::class,\n App\\Providers\\Filament\\AdminPanelProvider::class,\n A"
},
{
"path": "composer.json",
"chars": 3332,
"preview": "{\n \"name\": \"devdojo/wave\",\n \"description\": \"Wave SaaS Starter Kit\",\n \"keywords\": [\n \"framework\",\n "
},
{
"path": "config/.gitkeep",
"chars": 0,
"preview": ""
},
{
"path": "config/activity.php",
"chars": 1574,
"preview": "<?php\n\nreturn [\n\n /*\n |--------------------------------------------------------------------------\n | Activity L"
},
{
"path": "config/app.php",
"chars": 255,
"preview": "<?php\n\nuse Illuminate\\Support\\Facades\\Facade;\n\nreturn [\n\n 'aliases' => Facade::defaultAliases()->merge([\n 'JWT"
},
{
"path": "config/auth.php",
"chars": 1006,
"preview": "<?php\n\nreturn [\n\n 'guards' => [\n 'api' => [\n 'driver' => 'jwt',\n 'provider' => 'users',\n"
},
{
"path": "config/database.php",
"chars": 193,
"preview": "<?php\n\nreturn [\n\n 'migrations' => [\n 'table' => 'migrations',\n 'update_date_on_publish' => false, // di"
},
{
"path": "config/devdojo/auth/appearance.php",
"chars": 6202,
"preview": "<?php\n\n/*\n * Branding configs for your application\n */\n\nreturn [\n 'logo' => [\n 'type' => 'svg',\n 'image"
},
{
"path": "config/devdojo/auth/descriptions.php",
"chars": 1782,
"preview": "<?php\n\n/*\n * Branding configs for your application\n */\nreturn [\n 'settings' => [\n 'redirect_after_auth' => 'Wh"
},
{
"path": "config/devdojo/auth/language.php",
"chars": 3574,
"preview": "<?php\n\n/*\n * Branding configs for your application\n */\nreturn [\n 'login' => [\n 'page_title' => 'Sign in',\n "
},
{
"path": "config/devdojo/auth/providers.php",
"chars": 18068,
"preview": "<?php\n\nreturn [\n 'facebook' => [\n 'name' => 'Facebook',\n 'scopes' => null,\n 'parameters' => null"
},
{
"path": "config/devdojo/auth/settings.php",
"chars": 773,
"preview": "<?php\n\n/*\n * These are some default authentication settings\n */\nreturn [\n 'redirect_after_auth' => '/',\n 'registra"
},
{
"path": "config/devdojo/billing/keys.php",
"chars": 415,
"preview": "<?php\n\nreturn [\n 'stripe' => [\n 'publishable_key' => env('STRIPE_PUBLISHABLE_KEY'),\n 'secret_key' => en"
},
{
"path": "config/devdojo/billing/language.php",
"chars": 438,
"preview": "<?php\n\nreturn [\n 'subscriptions' => [\n 'header' => 'Subscribe to a Plan Below',\n 'description' => 'Sele"
},
{
"path": "config/devdojo/billing/style.php",
"chars": 133,
"preview": "<?php\n\nreturn [\n 'color' => 'blue', // black, white, red, green, blue, yellow, orange, pink, purple\n 'logo_height'"
},
{
"path": "config/discussions.php",
"chars": 3721,
"preview": "<?php\n\nreturn [\n 'headline_logo' => '/vendor/foundationapp/discussions/assets/images/logo-light.png',\n\n 'user' => "
},
{
"path": "config/features.php",
"chars": 2870,
"preview": "<?php\n\nreturn [\n (object) [\n 'title' => 'Authentication',\n 'description' => 'Fully loaded authenticatio"
},
{
"path": "config/filament-google-analytics.php",
"chars": 1662,
"preview": "<?php\n\nreturn [\n\n /**\n * Dashboard Page\n */\n 'dedicated_dashboard' => true,\n 'dashboard_icon' => 'heroi"
},
{
"path": "config/filament.php",
"chars": 4370,
"preview": "<?php\n\n// use Filament\\Support\\Commands\\FileGenerators\\FileGenerationFlag;\n\nreturn [\n\n /*\n |----------------------"
},
{
"path": "config/filesystems.php",
"chars": 2015,
"preview": "<?php\n\nreturn [\n\n /*\n |--------------------------------------------------------------------------\n | Default Fi"
},
{
"path": "config/forms.php",
"chars": 628,
"preview": "<?php\n\nreturn [\n 'types' => [\n 'TextInput' => 'Text Input',\n 'Textarea' => 'Textarea Input',\n 'R"
},
{
"path": "config/image.php",
"chars": 509,
"preview": "<?php\n\nreturn [\n\n /*\n |--------------------------------------------------------------------------\n | Image Driv"
},
{
"path": "config/jwt.php",
"chars": 9913,
"preview": "<?php\n\n/*\n * This file is part of jwt-auth.\n *\n * (c) Sean Tymon <tymon148@gmail.com>\n *\n * For the full copyright and l"
},
{
"path": "config/limits.php",
"chars": 1397,
"preview": "<?php\n\nreturn [\n\n /*\n |--------------------------------------------------------------------------\n | Feature Li"
},
{
"path": "config/livewire.php",
"chars": 6281,
"preview": "<?php\n\nreturn [\n\n /*\n |---------------------------------------------------------------------------\n | Class Nam"
},
{
"path": "config/logging.php",
"chars": 4310,
"preview": "<?php\n\nuse Monolog\\Handler\\NullHandler;\nuse Monolog\\Handler\\StreamHandler;\nuse Monolog\\Handler\\SyslogUdpHandler;\nuse Mon"
},
{
"path": "config/mail.php",
"chars": 258,
"preview": "<?php\n\nreturn [\n\n 'mailers' => [\n 'mailgun' => [\n 'transport' => 'mailgun',\n ],\n ],\n\n "
},
{
"path": "config/passport.php",
"chars": 555,
"preview": "<?php\n\nreturn [\n\n /*\n |--------------------------------------------------------------------------\n | Encryption"
},
{
"path": "config/permission.php",
"chars": 6513,
"preview": "<?php\n\nreturn [\n\n 'models' => [\n\n /*\n * When using the \"HasPermissions\" trait from this package, we ne"
},
{
"path": "config/privacy.php",
"chars": 906,
"preview": "<?php\n\nreturn [\n\n /*\n |--------------------------------------------------------------------------\n | Default Pr"
},
{
"path": "config/profile.php",
"chars": 331,
"preview": "<?php\n\nreturn [\n 'fields' => [\n 'about' => [\n 'label' => 'About',\n 'type' => 'Textarea',"
},
{
"path": "config/services.php",
"chars": 302,
"preview": "<?php\n\nreturn [\n\n 'mailgun' => [\n 'domain' => env('MAILGUN_DOMAIN'),\n 'secret' => env('MAILGUN_SECRET')"
},
{
"path": "config/style.php",
"chars": 89,
"preview": "<?php\n\nreturn [\n // 'primary_color' => '#FF69B4'\n 'primary_color' => '#000000',\n];\n"
},
{
"path": "config/themes.php",
"chars": 121,
"preview": "<?php\n\nreturn [\n 'folder' => resource_path('themes'),\n 'publish_assets' => false,\n 'create_tables' => false,\n];"
},
{
"path": "config/wave.php",
"chars": 960,
"preview": "<?php\n\nreturn [\n\n 'api' => [\n 'auth_token_expires' => 60,\n 'key_token_expires' => 1,\n ],\n\n 'auth'"
},
{
"path": "database/.gitignore",
"chars": 9,
"preview": "*.sqlite\n"
},
{
"path": "database/factories/CategoryFactory.php",
"chars": 638,
"preview": "<?php\n\nnamespace Database\\Factories;\n\nuse Illuminate\\Database\\Eloquent\\Factories\\Factory;\nuse Wave\\Category;\n\n/**\n * @ex"
},
{
"path": "database/factories/PostFactory.php",
"chars": 1217,
"preview": "<?php\n\nnamespace Database\\Factories;\n\nuse Illuminate\\Database\\Eloquent\\Factories\\Factory;\nuse Wave\\Category;\nuse Wave\\Po"
},
{
"path": "database/factories/UserFactory.php",
"chars": 649,
"preview": "<?php\n\nnamespace Database\\Factories;\n\nuse Illuminate\\Database\\Eloquent\\Factories\\Factory;\nuse Illuminate\\Support\\Str;\n\nc"
},
{
"path": "database/migrations/2024_03_29_000000_create_cache_table.php",
"chars": 851,
"preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
},
{
"path": "database/migrations/2024_04_24_000001_add_user_social_provider_table.php",
"chars": 1301,
"preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
},
{
"path": "database/migrations/2024_04_24_000002_update_passwords_field_to_be_nullable.php",
"chars": 1050,
"preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
},
{
"path": "database/migrations/2024_05_07_000003_add_two_factor_auth_columns.php",
"chars": 1360,
"preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
},
{
"path": "database/migrations/2024_07_31_133819_add_description_to_roles_table.php",
"chars": 604,
"preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
},
{
"path": "database/migrations/2025_02_19_101241_change_user_social_provider_table.php",
"chars": 782,
"preview": "<?php\n\nuse Illuminate\\Database\\Migrations\\Migration;\nuse Illuminate\\Database\\Schema\\Blueprint;\nuse Illuminate\\Support\\Fa"
},
{
"path": "database/seeders/ActivityLogSeeder.php",
"chars": 2065,
"preview": "<?php\n\nnamespace Database\\Seeders;\n\nuse App\\Models\\User;\nuse Illuminate\\Database\\Seeder;\nuse Wave\\ActivityLog;\n\nclass Ac"
},
{
"path": "database/seeders/ApiKeysTableSeeder.php",
"chars": 283,
"preview": "<?php\n\nnamespace Database\\Seeders;\n\nuse Illuminate\\Database\\Seeder;\nuse Illuminate\\Support\\Facades\\DB;\n\nclass ApiKeysTab"
},
{
"path": "database/seeders/CategoriesTableSeeder.php",
"chars": 975,
"preview": "<?php\n\nnamespace Database\\Seeders;\n\nuse Illuminate\\Database\\Seeder;\nuse Illuminate\\Support\\Facades\\DB;\n\nclass Categories"
},
{
"path": "database/seeders/ChangelogsTableSeeder.php",
"chars": 3869,
"preview": "<?php\n\nnamespace Database\\Seeders;\n\nuse Illuminate\\Database\\Seeder;\nuse Illuminate\\Support\\Facades\\DB;\n\nclass Changelogs"
},
{
"path": "database/seeders/DatabaseSeeder.php",
"chars": 2182,
"preview": "<?php\n\nnamespace Database\\Seeders;\n\nuse Illuminate\\Database\\Seeder;\nuse Illuminate\\Support\\Facades\\DB;\nuse Illuminate\\Su"
},
{
"path": "database/seeders/ModelHasRolesTableSeeder.php",
"chars": 496,
"preview": "<?php\n\nnamespace Database\\Seeders;\n\nuse Illuminate\\Database\\Seeder;\nuse Illuminate\\Support\\Facades\\DB;\n\nclass ModelHasRo"
},
{
"path": "database/seeders/NotificationsTableSeeder.php",
"chars": 294,
"preview": "<?php\n\nnamespace Database\\Seeders;\n\nuse Illuminate\\Database\\Seeder;\nuse Illuminate\\Support\\Facades\\DB;\n\nclass Notificati"
},
{
"path": "database/seeders/PagesTableSeeder.php",
"chars": 5751,
"preview": "<?php\n\nnamespace Database\\Seeders;\n\nuse Illuminate\\Database\\Seeder;\nuse Illuminate\\Support\\Facades\\DB;\n\nclass PagesTable"
},
{
"path": "database/seeders/PasswordResetsTableSeeder.php",
"chars": 297,
"preview": "<?php\n\nnamespace Database\\Seeders;\n\nuse Illuminate\\Database\\Seeder;\nuse Illuminate\\Support\\Facades\\DB;\n\nclass PasswordRe"
},
{
"path": "database/seeders/PermissionRoleTableSeeder.php",
"chars": 300,
"preview": "<?php\n\nnamespace Database\\Seeders;\n\nuse Illuminate\\Database\\Seeder;\nuse Illuminate\\Support\\Facades\\DB;\n\nclass Permission"
},
{
"path": "database/seeders/PermissionsTableSeeder.php",
"chars": 288,
"preview": "<?php\n\nnamespace Database\\Seeders;\n\nuse Illuminate\\Database\\Seeder;\nuse Illuminate\\Support\\Facades\\DB;\n\nclass Permission"
},
{
"path": "database/seeders/PlansTableSeeder.php",
"chars": 2442,
"preview": "<?php\n\nnamespace Database\\Seeders;\n\nuse Illuminate\\Database\\Seeder;\nuse Illuminate\\Support\\Facades\\DB;\n\nclass PlansTable"
},
{
"path": "database/seeders/PostsTableSeeder.php",
"chars": 31531,
"preview": "<?php\n\nnamespace Database\\Seeders;\n\nuse Illuminate\\Database\\Seeder;\nuse Illuminate\\Support\\Facades\\DB;\n\nclass PostsTable"
},
{
"path": "database/seeders/ProfileKeyValuesTableSeeder.php",
"chars": 725,
"preview": "<?php\n\nnamespace Database\\Seeders;\n\nuse Illuminate\\Database\\Seeder;\nuse Illuminate\\Support\\Facades\\DB;\n\nclass ProfileKey"
},
{
"path": "database/seeders/RolesTableSeeder.php",
"chars": 2293,
"preview": "<?php\n\nnamespace Database\\Seeders;\n\nuse Illuminate\\Database\\Seeder;\nuse Illuminate\\Support\\Facades\\DB;\n\nclass RolesTable"
},
{
"path": "database/seeders/SettingsTableSeeder.php",
"chars": 1385,
"preview": "<?php\n\nnamespace Database\\Seeders;\n\nuse Illuminate\\Database\\Seeder;\nuse Illuminate\\Support\\Facades\\DB;\n\nclass SettingsTa"
},
{
"path": "database/seeders/ThemesTableSeeder.php",
"chars": 537,
"preview": "<?php\n\nnamespace Database\\Seeders;\n\nuse Illuminate\\Database\\Seeder;\nuse Illuminate\\Support\\Facades\\DB;\n\nclass ThemesTabl"
},
{
"path": "database/seeders/TranslationsTableSeeder.php",
"chars": 12275,
"preview": "<?php\n\nnamespace Database\\Seeders;\n\nuse Illuminate\\Database\\Seeder;\nuse Illuminate\\Support\\Facades\\DB;\n\nclass Translatio"
},
{
"path": "database/seeders/UsersTableSeeder.php",
"chars": 985,
"preview": "<?php\n\nnamespace Database\\Seeders;\n\nuse Illuminate\\Database\\Seeder;\nuse Illuminate\\Support\\Facades\\DB;\n\nclass UsersTable"
},
{
"path": "lang/ar/auth.php",
"chars": 707,
"preview": "<?php\n\nreturn [\n\n /*\n |--------------------------------------------------------------------------\n | Authentica"
},
{
"path": "lang/ar/pagination.php",
"chars": 534,
"preview": "<?php\n\nreturn [\n\n /*\n |--------------------------------------------------------------------------\n | Pagination"
},
{
"path": "lang/ar/passwords.php",
"chars": 778,
"preview": "<?php\n\nreturn [\n\n /*\n |--------------------------------------------------------------------------\n | Password R"
},
{
"path": "lang/ar/validation.php",
"chars": 10578,
"preview": "<?php\n\nreturn [\n\n /*\n |--------------------------------------------------------------------------\n | Validation"
},
{
"path": "lang/it/auth.php",
"chars": 628,
"preview": "<?php\n\nreturn [\n\n /*\n |--------------------------------------------------------------------------\n | Authentica"
},
{
"path": "lang/it/pagination.php",
"chars": 542,
"preview": "<?php\n\nreturn [\n\n /*\n |--------------------------------------------------------------------------\n | Pagination"
},
{
"path": "lang/it/passwords.php",
"chars": 866,
"preview": "<?php\n\nreturn [\n\n /*\n |--------------------------------------------------------------------------\n | Password R"
},
{
"path": "lang/it/validation.php",
"chars": 8177,
"preview": "<?php\n\nreturn [\n\n /*\n |--------------------------------------------------------------------------\n | Validation"
},
{
"path": "lang/pl/auth.php",
"chars": 672,
"preview": "<?php\n\nreturn [\n\n /*\n |--------------------------------------------------------------------------\n | Authentica"
},
{
"path": "lang/pl/pagination.php",
"chars": 540,
"preview": "<?php\n\nreturn [\n\n /*\n |--------------------------------------------------------------------------\n | Pagination"
},
{
"path": "lang/pl/passwords.php",
"chars": 792,
"preview": "<?php\n\nreturn [\n\n /*\n |--------------------------------------------------------------------------\n | Password R"
},
{
"path": "lang/pl/validation.php",
"chars": 9085,
"preview": "<?php\n\nreturn [\n\n /*\n |--------------------------------------------------------------------------\n | Validation"
},
{
"path": "package.json",
"chars": 538,
"preview": "{\n \"private\": true,\n \"type\": \"module\",\n \"scripts\": {\n \"dev\": \"vite\",\n \"build\": \"vite build\"\n },\n \"devDependen"
},
{
"path": "phpunit.xml",
"chars": 1147,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<phpunit xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n xsi:noNam"
},
{
"path": "pint.json",
"chars": 375,
"preview": "{\n \"preset\": \"laravel\",\n \"rules\": {\n \"simplified_null_return\": true,\n \"braces\": false,\n \"new_"
},
{
"path": "postcss.config.js",
"chars": 78,
"preview": "export default {\n plugins: {\n \"@tailwindcss/postcss\": {},\n },\n};\n"
},
{
"path": "public/.htaccess",
"chars": 740,
"preview": "<IfModule mod_rewrite.c>\n <IfModule mod_negotiation.c>\n Options -MultiViews -Indexes\n </IfModule>\n\n Rewr"
},
{
"path": "public/auth/app.css",
"chars": 76,
"preview": "#auth-heading-title{\n padding-top:8px;\n}\n\n#auth-container{\n border:0px;\n}\n"
},
{
"path": "public/auth/build/assets/scripts.js",
"chars": 1,
"preview": "\n"
},
{
"path": "public/auth/build/assets/styles.css",
"chars": 51147,
"preview": "*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-conten"
},
{
"path": "public/auth/build/manifest.json",
"chars": 271,
"preview": "{\n \"resources/css/auth.css\": {\n \"file\": \"assets/styles.css\",\n \"src\": \"resources/css/auth.css\",\n \"isEntry\": tru"
},
{
"path": "public/billing/main.css",
"chars": 4894,
"preview": "*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-conten"
},
{
"path": "public/billing/main.js",
"chars": 39,
"preview": "console.log(\"Billing page JS loaded\");\n"
},
{
"path": "public/billing/manifest.json",
"chars": 209,
"preview": "{\n \"css/main.css\": {\n \"file\": \"main.css\",\n \"src\": \"css/main.css\",\n \"isEntry\": true\n },\n \"js/main.js\": {\n "
},
{
"path": "public/build/assets/app-75U0MKBP.css",
"chars": 657147,
"preview": "/*! tailwindcss v4.1.12 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) "
},
{
"path": "public/build/assets/app-CaUPGaqM.js",
"chars": 197,
"preview": "window.demoButtonClickMessage=function(o){o.preventDefault(),new FilamentNotification().title(\"Modify this button in you"
},
{
"path": "public/build/assets/theme-DRT1wFy8.css",
"chars": 607480,
"preview": "/*! tailwindcss v4.1.12 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) "
},
{
"path": "public/build/manifest.json",
"chars": 523,
"preview": "{\n \"resources/css/filament/admin/theme.css\": {\n \"file\": \"assets/theme-DRT1wFy8.css\",\n \"src\": \"resources/css/filam"
},
{
"path": "public/composer/install.php",
"chars": 5416,
"preview": "<?php\n\n// Define the correct project root path directly\n$projectRoot = dirname(getcwd());\n\n// Define the path to the aut"
},
{
"path": "public/composer/mac.php",
"chars": 15936,
"preview": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width"
},
{
"path": "public/composer/windows.php",
"chars": 15265,
"preview": "<?php\n$combinedOutputFile = $projectRoot.'\\public\\combined_output.txt';\n?>\n\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n "
},
{
"path": "public/css/bezhansalleh/filament-google-analytics/filament-google-analytics.css",
"chars": 11651,
"preview": ".w-24{width:6rem}.w-28{width:7rem}.w-44{width:11rem}.grow{flex-grow:1}.transform{transform:translate(var(--tw-translate-"
},
{
"path": "public/css/filament/filament/app.css",
"chars": 564128,
"preview": "/*! tailwindcss v4.1.18 | MIT License | https://tailwindcss.com */\n@layer properties{@supports (((-webkit-hyphens:none))"
},
{
"path": "public/css/filament/forms/forms.css",
"chars": 83350,
"preview": "input::-webkit-datetime-edit{display:block;padding:0}.cropper-container{-webkit-touch-callout:none;direction:ltr;font-si"
},
{
"path": "public/css/filament/support/support.css",
"chars": 3147,
"preview": ".fi-pagination-items,.fi-pagination-overview,.fi-pagination-records-per-page-select:not(.fi-compact){display:none}@suppo"
},
{
"path": "public/fonts/filament/filament/inter/index.css",
"chars": 2002,
"preview": "@font-face{font-family:Inter Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(\"./inter-cyrillic-"
},
{
"path": "public/index.php",
"chars": 2177,
"preview": "<?php\n\nuse Illuminate\\Contracts\\Http\\Kernel;\nuse Illuminate\\Http\\Request;\n\ndefine('LARAVEL_START', microtime(true));\n\n/*"
},
{
"path": "public/js/filament/actions/actions.js",
"chars": 1019,
"preview": "(()=>{var n=({livewireId:e})=>({actionNestingIndex:null,init(){window.addEventListener(\"sync-action-modals\",t=>{t.detail"
},
{
"path": "public/js/filament/filament/app.js",
"chars": 10829,
"preview": "(()=>{var re=Object.create,x=Object.defineProperty,ne=Object.getPrototypeOf,ie=Object.prototype.hasOwnProperty,ae=Object"
},
{
"path": "public/js/filament/filament/echo.js",
"chars": 91906,
"preview": "(()=>{var Ci=Object.create;var he=Object.defineProperty;var Ti=Object.getOwnPropertyDescriptor;var Pi=Object.getOwnPrope"
},
{
"path": "public/js/filament/forms/components/checkbox-list.js",
"chars": 1686,
"preview": "function c({livewireId:s}){return{areAllCheckboxesChecked:!1,checkboxListOptions:[],search:\"\",visibleCheckboxListOptions"
},
{
"path": "public/js/filament/forms/components/code-editor.js",
"chars": 976956,
"preview": "var Ms=[],Xh=[];(()=>{let O=\"lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17"
},
{
"path": "public/js/filament/forms/components/color-picker.js",
"chars": 9769,
"preview": "var c=(e,t=0,r=1)=>e>r?r:e<t?t:e,a=(e,t=0,r=Math.pow(10,t))=>Math.round(r*e)/r;var at={grad:360/400,turn:360,rad:360/(Ma"
},
{
"path": "public/js/filament/forms/components/date-time-picker.js",
"chars": 123072,
"preview": "var Gi=Object.create;var Hn=Object.defineProperty;var Ri=Object.getOwnPropertyDescriptor;var Zi=Object.getOwnPropertyNam"
},
{
"path": "public/js/filament/forms/components/file-upload.js",
"chars": 369612,
"preview": "var Ir=Object.defineProperty;var vr=(e,t)=>{for(var i in t)Ir(e,i,{get:t[i],enumerable:!0})};var na={};vr(na,{FileOrigin"
},
{
"path": "public/js/filament/forms/components/key-value.js",
"chars": 995,
"preview": "function h({state:r}){return{state:r,rows:[],init(){this.updateRows(),this.rows.length<=0?this.rows.push({key:\"\",value:\""
},
{
"path": "public/js/filament/forms/components/markdown-editor.js",
"chars": 521974,
"preview": "var ss=Object.defineProperty;var Sd=Object.getOwnPropertyDescriptor;var Td=Object.getOwnPropertyNames;var Ld=Object.prot"
},
{
"path": "public/js/filament/forms/components/rich-editor.js",
"chars": 472906,
"preview": "function ge(t){this.content=t}ge.prototype={constructor:ge,find:function(t){for(var e=0;e<this.content.length;e+=2)if(th"
},
{
"path": "public/js/filament/forms/components/select.js",
"chars": 84478,
"preview": "var Ft=Math.min,vt=Math.max,Ht=Math.round;var st=n=>({x:n,y:n}),ji={left:\"right\",right:\"left\",bottom:\"top\",top:\"bottom\"}"
},
{
"path": "public/js/filament/forms/components/slider.js",
"chars": 28931,
"preview": "var I;(function(r){r.Range=\"range\",r.Steps=\"steps\",r.Positions=\"positions\",r.Count=\"count\",r.Values=\"values\"})(I||(I={})"
},
{
"path": "public/js/filament/forms/components/tags-input.js",
"chars": 814,
"preview": "function s({state:n,splitKeys:a}){return{newTag:\"\",state:n,createTag(){if(this.newTag=this.newTag.trim(),this.newTag!==\""
},
{
"path": "public/js/filament/forms/components/textarea.js",
"chars": 769,
"preview": "function n({initialHeight:e,shouldAutosize:i,state:h}){return{state:h,wrapperEl:null,init(){this.wrapperEl=this.$el.pare"
},
{
"path": "public/js/filament/notifications/notifications.js",
"chars": 7024,
"preview": "(()=>{var O=Object.create;var N=Object.defineProperty;var V=Object.getOwnPropertyDescriptor;var Y=Object.getOwnPropertyN"
},
{
"path": "public/js/filament/schemas/components/actions.js",
"chars": 876,
"preview": "var i=()=>({isSticky:!1,width:0,resizeObserver:null,boundUpdateWidth:null,init(){let e=this.$el.parentElement;e&&(this.u"
},
{
"path": "public/js/filament/schemas/components/tabs.js",
"chars": 3241,
"preview": "function I({activeTab:w,isScrollable:f,isTabPersistedInQueryString:m,livewireId:g,tab:T,tabQueryStringKey:c}){return{bou"
},
{
"path": "public/js/filament/schemas/components/wizard.js",
"chars": 1412,
"preview": "function o({isSkippable:s,isStepPersistedInQueryString:i,key:r,startStep:h,stepQueryStringKey:n}){return{step:null,init("
},
{
"path": "public/js/filament/schemas/schemas.js",
"chars": 2667,
"preview": "(()=>{var d=()=>({isSticky:!1,width:0,resizeObserver:null,boundUpdateWidth:null,init(){let t=this.$el.parentElement;t&&("
},
{
"path": "public/js/filament/support/async-alpine.js",
"chars": 5266,
"preview": "(()=>{(()=>{var d=Object.defineProperty,m=t=>d(t,\"__esModule\",{value:!0}),f=(t,e)=>{m(t);for(var i in e)d(t,i,{get:e[i],"
},
{
"path": "public/js/filament/support/support.js",
"chars": 139878,
"preview": "(()=>{var qo=Object.create;var Ti=Object.defineProperty;var Go=Object.getOwnPropertyDescriptor;var Ko=Object.getOwnPrope"
},
{
"path": "public/js/filament/tables/components/columns/checkbox.js",
"chars": 842,
"preview": "function o({name:i,recordKey:s,state:a}){return{error:void 0,isLoading:!1,state:a,init(){Livewire.hook(\"commit\",({compon"
},
{
"path": "public/js/filament/tables/components/columns/select.js",
"chars": 85090,
"preview": "var Ft=Math.min,vt=Math.max,Ht=Math.round;var st=n=>({x:n,y:n}),ji={left:\"right\",right:\"left\",bottom:\"top\",top:\"bottom\"}"
}
]
// ... and 233 more files (download for full content)
About this extraction
This page contains the full source code of the thedevdojo/wave GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 433 files (12.9 MB), approximately 3.4M tokens, and a symbol index with 11465 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.