From 3d924c2afbc995f3f5224121c96b584056f48200 Mon Sep 17 00:00:00 2001 From: Dan Harrin Date: Tue, 7 Dec 2021 13:00:51 +0000 Subject: [PATCH] =?UTF-8?q?Admin=20v2=20=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .editorconfig | 15 + .github/FUNDING.yml | 1 + .github/ISSUE_TEMPLATE/bug_report.yml | 74 + .github/ISSUE_TEMPLATE/config.yml | 11 + .github/workflows/php-cs-fixer.yml | 21 + .github/workflows/tests.yml | 38 + .gitignore | 12 + .php-cs-fixer.dist.php | 40 + .prettierrc | 6 + CODE_OF_CONDUCT.md | 76 + LICENSE.md | 21 + README.md | 64 + SECURITY.md | 12 + bin/build.js | 26 + bin/tailwind.config.js | 24 + composer.json | 47 + composer.lock | 8855 ++++++ main.js | 6 + monorepo-builder.php | 23 + package-lock.json | 17803 +++++++++++ package.json | 34 + packages/admin/.gitignore | 1 + packages/admin/composer.json | 48 + packages/admin/composer.lock | 4722 +++ packages/admin/config/filament.php | 180 + packages/admin/dist/app.css | 6 + packages/admin/dist/app.css.map | 1 + packages/admin/dist/app.js | 49 + packages/admin/dist/app.js.map | 1 + packages/admin/dist/mix-manifest.json | 4 + packages/admin/dist/module.esm.css | 1449 + packages/admin/dist/module.esm.js | 24483 ++++++++++++++++ packages/admin/docs/01-installation.md | 64 + packages/admin/docs/02-resources.md | 626 + packages/admin/docs/03-pages.md | 111 + packages/admin/docs/04-dashboard.md | 197 + packages/admin/docs/05-navigation.md | 69 + packages/admin/docs/06-users.md | 82 + packages/admin/docs/07-appearance.md | 90 + packages/admin/docs/08-plugins.md | 185 + packages/admin/docs/09-upgrade-guide.md | 455 + packages/admin/resources/css/app.css | 5 + packages/admin/resources/js/app.js | 29 + .../admin/resources/lang/en/global-search.php | 12 + packages/admin/resources/lang/en/layout.php | 13 + packages/admin/resources/lang/en/login.php | 36 + .../resources/lang/en/pages/dashboard.php | 7 + .../lang/en/resources/pages/create-record.php | 31 + .../lang/en/resources/pages/edit-record.php | 65 + .../lang/en/resources/pages/list-records.php | 31 + .../lang/en/resources/pages/view-record.php | 15 + .../en/resources/relation-managers/attach.php | 41 + .../en/resources/relation-managers/create.php | 33 + .../en/resources/relation-managers/delete.php | 33 + .../en/resources/relation-managers/detach.php | 33 + .../en/resources/relation-managers/edit.php | 29 + .../lang/en/widgets/account-widget.php | 15 + .../lang/en/widgets/filament-info-widget.php | 17 + .../actions/button-action.blade.php | 17 + .../views/components/actions/index.blade.php | 22 + .../actions/select-action.blade.php | 23 + .../views/components/brand.blade.php | 3 + .../views/components/button.blade.php | 64 + .../views/components/card/heading.blade.php | 3 + .../views/components/card/index.blade.php | 50 + .../views/components/footer.blade.php | 15 + .../resources/views/components/form.blade.php | 3 + .../components/global-search/end.blade.php | 0 .../components/global-search/index.blade.php | 15 + .../components/global-search/input.blade.php | 19 + .../no-results-message.blade.php | 3 + .../global-search/result-group.blade.php | 22 + .../components/global-search/result.blade.php | 19 + .../global-search/results-container.blade.php | 20 + .../components/global-search/start.blade.php | 0 .../views/components/header/heading.blade.php | 3 + .../views/components/header/index.blade.php | 12 + .../resources/views/components/hr.blade.php | 1 + .../views/components/layouts/app.blade.php | 81 + .../layouts/app/sidebar/end.blade.php | 0 .../layouts/app/sidebar/footer.blade.php | 22 + .../layouts/app/sidebar/group.blade.php | 18 + .../layouts/app/sidebar/index.blade.php | 42 + .../layouts/app/sidebar/item.blade.php | 22 + .../layouts/app/sidebar/start.blade.php | 0 .../views/components/layouts/base.blade.php | 61 + .../views/components/modal/actions.blade.php | 13 + .../views/components/modal/heading.blade.php | 3 + .../views/components/modal/index.blade.php | 128 + .../components/modal/subheading.blade.php | 3 + .../views/components/notification.blade.php | 64 + .../resources/views/components/page.blade.php | 29 + .../relation-managers/index.blade.php | 47 + .../views/components/stats/card.blade.php | 36 + .../views/components/stats/index.blade.php | 17 + .../views/components/tabs/index.blade.php | 3 + .../views/components/tabs/item.blade.php | 26 + .../admin/resources/views/login.blade.php | 17 + .../resources/views/pages/dashboard.blade.php | 7 + .../resources/pages/create-record.blade.php | 7 + .../resources/pages/edit-record.blade.php | 37 + .../resources/pages/list-records.blade.php | 3 + .../resources/pages/view-record.blade.php | 3 + ...belongs-to-many-relation-manager.blade.php | 3 + .../has-many-relation-manager.blade.php | 3 + .../views/widgets/account-widget.blade.php | 24 + .../views/widgets/chart-widget.blade.php | 31 + .../widgets/filament-info-widget.blade.php | 91 + .../widgets/stats-overview-widget.blade.php | 5 + .../stats-overview-widget/card.blade.php | 7 + packages/admin/routes/web.php | 38 + .../Contracts/AvatarProvider.php | 10 + .../src/AvatarProviders/UiAvatarsProvider.php | 13 + .../Aliases/MakeBelongsToManyCommand.php | 12 + .../Commands/Aliases/MakeHasManyCommand.php | 12 + .../src/Commands/Aliases/MakePageCommand.php | 12 + .../Commands/Aliases/MakeResourceCommand.php | 12 + .../src/Commands/Aliases/MakeUserCommand.php | 12 + .../Commands/Aliases/MakeWidgetCommand.php | 12 + .../Commands/Concerns/CanManipulateFiles.php | 60 + .../Commands/Concerns/CanValidateInput.php | 31 + .../src/Commands/MakeBelongsToManyCommand.php | 65 + .../admin/src/Commands/MakeHasManyCommand.php | 65 + .../admin/src/Commands/MakePageCommand.php | 104 + .../src/Commands/MakeResourceCommand.php | 102 + .../admin/src/Commands/MakeUserCommand.php | 48 + .../admin/src/Commands/MakeWidgetCommand.php | 68 + .../admin/src/Commands/UpgradeCommand.php | 30 + packages/admin/src/Events/ServingFilament.php | 10 + packages/admin/src/Facades/Filament.php | 43 + packages/admin/src/FilamentManager.php | 224 + .../admin/src/FilamentServiceProvider.php | 208 + .../src/Http/Controllers/AssetController.php | 72 + .../admin/src/Http/Livewire/Auth/Login.php | 84 + .../admin/src/Http/Livewire/GlobalSearch.php | 58 + .../src/Http/Middleware/Authenticate.php | 40 + .../DispatchServingFilamentEvent.php | 17 + .../Middleware/MirrorConfigToSubpackages.php | 19 + .../src/Models/Contracts/FilamentUser.php | 8 + .../admin/src/Models/Contracts/HasAvatar.php | 8 + .../admin/src/Models/Contracts/HasName.php | 8 + .../admin/src/Navigation/NavigationItem.php | 103 + packages/admin/src/Pages/Actions/Action.php | 51 + .../admin/src/Pages/Actions/ButtonAction.php | 27 + .../Pages/Actions/Concerns/CanBeHidden.php | 20 + .../src/Pages/Actions/Concerns/CanOpenUrl.php | 35 + .../Pages/Actions/Concerns/CanSubmitForm.php | 20 + .../src/Pages/Actions/Concerns/HasAction.php | 20 + .../src/Pages/Actions/Concerns/HasColor.php | 20 + .../src/Pages/Actions/Concerns/HasIcon.php | 20 + .../src/Pages/Actions/Concerns/HasId.php | 20 + .../src/Pages/Actions/Concerns/HasLabel.php | 26 + .../src/Pages/Actions/Concerns/HasName.php | 20 + .../src/Pages/Actions/Concerns/HasView.php | 20 + .../admin/src/Pages/Actions/SelectAction.php | 46 + packages/admin/src/Pages/Dashboard.php | 27 + packages/admin/src/Pages/Page.php | 172 + packages/admin/src/PluginServiceProvider.php | 94 + packages/admin/src/Resources/Form.php | 51 + .../Pages/Concerns/HasRecordBreadcrumb.php | 33 + .../Pages/Concerns/InteractsWithRecord.php | 31 + .../Pages/Concerns/UsesResourceForm.php | 19 + .../src/Resources/Pages/CreateRecord.php | 127 + .../admin/src/Resources/Pages/EditRecord.php | 159 + .../admin/src/Resources/Pages/ListRecords.php | 173 + packages/admin/src/Resources/Pages/Page.php | 59 + .../admin/src/Resources/Pages/ViewRecord.php | 79 + .../BelongsToManyRelationManager.php | 101 + .../Concerns/CanAttachRecords.php | 136 + .../Concerns/CanCreateRecords.php | 78 + .../Concerns/CanDeleteRecords.php | 52 + .../Concerns/CanDetachRecords.php | 52 + .../Concerns/CanEditRecords.php | 61 + .../HasManyRelationManager.php | 38 + .../RelationManagers/RelationManager.php | 200 + packages/admin/src/Resources/Resource.php | 334 + packages/admin/src/Resources/Table.php | 145 + packages/admin/src/Widgets/AccountWidget.php | 10 + packages/admin/src/Widgets/BarChartWidget.php | 11 + .../admin/src/Widgets/BubbleChartWidget.php | 11 + packages/admin/src/Widgets/ChartWidget.php | 59 + .../admin/src/Widgets/DoughnutChartWidget.php | 11 + .../admin/src/Widgets/FilamentInfoWidget.php | 10 + .../admin/src/Widgets/LineChartWidget.php | 11 + packages/admin/src/Widgets/PieChartWidget.php | 11 + .../src/Widgets/PolarAreaChartWidget.php | 11 + .../admin/src/Widgets/RadarChartWidget.php | 11 + .../admin/src/Widgets/ScatterChartWidget.php | 11 + .../admin/src/Widgets/StatsOverviewWidget.php | 22 + .../src/Widgets/StatsOverviewWidget/Card.php | 101 + packages/admin/src/Widgets/Widget.php | 28 + packages/admin/src/helpers.php | 32 + .../stubs/BelongsToManyRelationManager.stub | 35 + packages/admin/stubs/DefaultResourcePage.stub | 11 + .../admin/stubs/HasManyRelationManager.stub | 35 + packages/admin/stubs/Page.stub | 12 + packages/admin/stubs/PageView.stub | 3 + packages/admin/stubs/Resource.stub | 54 + packages/admin/stubs/ResourcePage.stub | 13 + packages/admin/stubs/Widget.stub | 10 + packages/admin/stubs/WidgetView.stub | 5 + packages/admin/tailwind.config.js | 30 + packages/forms/.gitignore | 1 + packages/forms/composer.json | 41 + packages/forms/composer.lock | 3680 +++ packages/forms/config/forms.php | 15 + packages/forms/dist/module.esm.css | 1449 + packages/forms/dist/module.esm.js | 24483 ++++++++++++++++ packages/forms/docs/01-installation.md | 173 + packages/forms/docs/02-getting-started.md | 731 + packages/forms/docs/03-fields.md | 1181 + packages/forms/docs/04-layout.md | 319 + packages/forms/docs/05-advanced.md | 189 + .../resources/css/components/file-upload.css | 3 + .../js/components/date-time-picker.js | 367 + .../resources/js/components/file-upload.js | 129 + .../resources/js/components/key-value.js | 56 + .../js/components/markdown-editor.js | 86 + .../resources/js/components/multi-select.js | 190 + .../resources/js/components/rich-editor.js | 39 + .../forms/resources/js/components/select.js | 183 + .../resources/js/components/tags-input.js | 33 + .../resources/js/components/text-input.js | 32 + .../forms/resources/js/components/textarea.js | 14 + packages/forms/resources/js/index.js | 36 + .../forms/resources/lang/ar/components.php | 59 + .../forms/resources/lang/ca/components.php | 59 + .../forms/resources/lang/da/components.php | 59 + .../forms/resources/lang/de/components.php | 59 + .../forms/resources/lang/en/components.php | 156 + .../forms/resources/lang/es/components.php | 104 + .../forms/resources/lang/fa/components.php | 104 + .../forms/resources/lang/fr/components.php | 59 + .../forms/resources/lang/id/components.php | 59 + .../forms/resources/lang/it/components.php | 59 + .../forms/resources/lang/ka/components.php | 59 + .../forms/resources/lang/ku/components.php | 104 + .../forms/resources/lang/nl/components.php | 59 + .../forms/resources/lang/pt-br/components.php | 59 + .../forms/resources/lang/ru/components.php | 59 + .../forms/resources/lang/sv/components.php | 104 + .../forms/resources/lang/zh-CN/components.php | 104 + .../views/component-container.blade.php | 177 + .../views/components/builder.blade.php | 163 + .../views/components/builder/block.blade.php | 3 + .../resources/views/components/card.blade.php | 6 + .../views/components/checkbox.blade.php | 29 + .../components/date-time-picker.blade.php | 204 + .../field-wrapper/error-message.blade.php | 3 + .../field-wrapper/helper-text.blade.php | 3 + .../components/field-wrapper/hint.blade.php | 3 + .../components/field-wrapper/index.blade.php | 55 + .../components/field-wrapper/label.blade.php | 21 + .../views/components/fieldset.blade.php | 10 + .../views/components/file-upload.blade.php | 50 + .../components/file-upload/input.blade.php | 36 + .../resources/views/components/grid.blade.php | 1 + .../views/components/group.blade.php | 1 + .../views/components/hidden.blade.php | 7 + .../views/components/key-value.blade.php | 105 + .../components/markdown-editor.blade.php | 204 + .../markdown-editor/toolbar-button.blade.php | 7 + .../views/components/multi-select.blade.php | 166 + .../components/multiple-file-upload.blade.php | 17 + .../views/components/placeholder.blade.php | 10 + .../views/components/radio.blade.php | 47 + .../views/components/repeater.blade.php | 80 + .../views/components/rich-editor.blade.php | 287 + .../views/components/section.blade.php | 46 + .../views/components/select.blade.php | 175 + .../resources/views/components/tabs.blade.php | 32 + .../views/components/tabs/tab.blade.php | 10 + .../views/components/tags-input.blade.php | 64 + .../views/components/text-input.blade.php | 76 + .../views/components/textarea.blade.php | 34 + .../views/components/toggle.blade.php | 71 + .../src/Commands/Aliases/MakeFieldCommand.php | 12 + .../Aliases/MakeLayoutComponentCommand.php | 12 + .../Commands/Concerns/CanManipulateFiles.php | 60 + .../Commands/Concerns/CanValidateInput.php | 31 + .../forms/src/Commands/InstallCommand.php | 67 + .../forms/src/Commands/MakeFieldCommand.php | 68 + .../Commands/MakeLayoutComponentCommand.php | 68 + packages/forms/src/ComponentContainer.php | 56 + .../Components/BelongsToManyMultiSelect.php | 145 + .../forms/src/Components/BelongsToSelect.php | 151 + packages/forms/src/Components/Builder.php | 219 + .../forms/src/Components/Builder/Block.php | 46 + packages/forms/src/Components/Card.php | 28 + packages/forms/src/Components/Checkbox.php | 20 + packages/forms/src/Components/Component.php | 52 + .../Concerns/BelongsToContainer.php | 28 + .../Components/Concerns/BelongsToModel.php | 45 + .../src/Components/Concerns/CanBeAccepted.php | 13 + .../Concerns/CanBeAutocapitalized.php | 29 + .../Concerns/CanBeAutocompleted.php | 29 + .../Components/Concerns/CanBeAutofocused.php | 20 + .../Components/Concerns/CanBeConcealed.php | 24 + .../src/Components/Concerns/CanBeDisabled.php | 20 + .../src/Components/Concerns/CanBeHidden.php | 70 + .../src/Components/Concerns/CanBeInline.php | 20 + .../Concerns/CanBeLengthConstrained.php | 46 + .../Components/Concerns/CanBeValidated.php | 172 + .../Components/Concerns/CanSpanColumns.php | 39 + .../src/Components/Concerns/Cloneable.php | 11 + .../Concerns/EvaluatesCallbacks.php | 28 + .../Concerns/HasChildComponents.php | 54 + .../Concerns/HasExtraAttributes.php | 20 + .../Concerns/HasFileAttachments.php | 112 + .../src/Components/Concerns/HasHelperText.php | 20 + .../forms/src/Components/Concerns/HasHint.php | 20 + .../forms/src/Components/Concerns/HasId.php | 20 + .../src/Components/Concerns/HasLabel.php | 34 + .../src/Components/Concerns/HasMaxWidth.php | 20 + .../forms/src/Components/Concerns/HasMeta.php | 35 + .../forms/src/Components/Concerns/HasName.php | 20 + .../Components/Concerns/HasPlaceholder.php | 20 + .../src/Components/Concerns/HasState.php | 202 + .../forms/src/Components/Concerns/HasView.php | 20 + .../Concerns/InteractsWithToolbarButtons.php | 54 + .../Components/Concerns/ListensToEvents.php | 37 + .../Contracts/CanConcealComponents.php | 7 + .../Contracts/HasFileAttachments.php | 10 + .../Contracts/HasValidationRules.php | 12 + packages/forms/src/Components/DatePicker.php | 11 + .../forms/src/Components/DateTimePicker.php | 242 + packages/forms/src/Components/Field.php | 47 + packages/forms/src/Components/Fieldset.php | 30 + packages/forms/src/Components/FileUpload.php | 487 + packages/forms/src/Components/Grid.php | 28 + packages/forms/src/Components/Group.php | 21 + packages/forms/src/Components/Hidden.php | 8 + packages/forms/src/Components/KeyValue.php | 119 + .../forms/src/Components/MarkdownEditor.php | 25 + packages/forms/src/Components/MultiSelect.php | 138 + .../src/Components/MultipleFileUpload.php | 109 + packages/forms/src/Components/Placeholder.php | 62 + packages/forms/src/Components/Radio.php | 96 + packages/forms/src/Components/Repeater.php | 172 + packages/forms/src/Components/RichEditor.php | 28 + packages/forms/src/Components/Section.php | 102 + packages/forms/src/Components/Select.php | 173 + packages/forms/src/Components/Tabs.php | 38 + packages/forms/src/Components/Tabs/Tab.php | 31 + packages/forms/src/Components/TagsInput.php | 53 + packages/forms/src/Components/TextInput.php | 284 + .../forms/src/Components/TextInput/Mask.php | 346 + packages/forms/src/Components/Textarea.php | 55 + packages/forms/src/Components/TimePicker.php | 11 + packages/forms/src/Components/Toggle.php | 58 + packages/forms/src/Components/View.php | 16 + packages/forms/src/Components/ViewField.php | 7 + .../forms/src/Concerns/BelongsToLivewire.php | 22 + .../forms/src/Concerns/BelongsToModel.php | 43 + .../src/Concerns/BelongsToParentComponent.php | 22 + packages/forms/src/Concerns/CanBeDisabled.php | 20 + packages/forms/src/Concerns/CanBeHidden.php | 11 + .../forms/src/Concerns/CanBeValidated.php | 83 + packages/forms/src/Concerns/Cloneable.php | 25 + packages/forms/src/Concerns/HasColumns.php | 45 + packages/forms/src/Concerns/HasComponents.php | 68 + packages/forms/src/Concerns/HasState.php | 177 + .../src/Concerns/HasStateBindingModifiers.php | 55 + .../forms/src/Concerns/InteractsWithForms.php | 248 + .../forms/src/Concerns/ListensToEvents.php | 23 + .../SupportsComponentFileAttachments.php | 35 + .../src/Concerns/SupportsFileUploadFields.php | 52 + .../Concerns/SupportsMultiSelectFields.php | 50 + .../src/Concerns/SupportsSelectFields.php | 50 + packages/forms/src/Contracts/HasForms.php | 28 + packages/forms/src/FormsComponent.php | 10 + packages/forms/src/FormsServiceProvider.php | 82 + packages/forms/stubs/Field.stub | 10 + packages/forms/stubs/FieldView.stub | 13 + packages/forms/stubs/LayoutComponent.stub | 15 + packages/forms/stubs/LayoutComponentView.stub | 3 + .../stubs/scaffolding/resources/css/app.css | 5 + .../stubs/scaffolding/resources/js/app.js | 8 + .../resources/views/layouts/app.blade.php | 26 + .../stubs/scaffolding/tailwind.config.js | 21 + .../forms/stubs/scaffolding/webpack.mix.js | 7 + .../.gitignore | 1 + .../composer.json | 25 + .../composer.lock | 2961 ++ .../docs/01-installation.md | 31 + .../docs/02-form-components.md | 38 + .../docs/03-table-columns.md | 23 + .../SpatieMediaLibraryFileUpload.php | 124 + .../SpatieMediaLibraryMultipleFileUpload.php | 67 + .../Columns/SpatieMediaLibraryImageColumn.php | 46 + .../spatie-laravel-settings-plugin/.gitignore | 1 + .../composer.json | 32 + .../composer.lock | 3987 +++ .../docs/01-installation.md | 31 + .../docs/02-getting-started.md | 46 + .../views/pages/settings-page.blade.php | 7 + .../Aliases/MakeSettingsPageCommand.php | 12 + .../src/Commands/MakeSettingsPageCommand.php | 75 + .../src/Pages/SettingsPage.php | 90 + ...ieLaravelSettingsPluginServiceProvider.php | 43 + .../stubs/SettingsPage.stub | 20 + .../spatie-laravel-tags-plugin/.gitignore | 1 + .../spatie-laravel-tags-plugin/composer.json | 25 + .../spatie-laravel-tags-plugin/composer.lock | 4819 +++ .../docs/01-installation.md | 31 + .../docs/02-form-components.md | 30 + .../src/Forms/Components/SpatieTagsInput.php | 59 + .../.gitignore | 1 + .../composer.json | 32 + .../composer.lock | 3343 +++ ...ent-spatie-laravel-translatable-plugin.php | 18 + .../docs/01-installation.md | 39 + .../docs/02-getting-started.md | 78 + .../resources/lang/actions.php | 9 + .../src/Resources/Concerns/Translatable.php | 33 + .../Concerns/HasActiveFormLocaleSelect.php | 23 + .../CreateRecord/Concerns/Translatable.php | 67 + .../EditRecord/Concerns/Translatable.php | 82 + .../ListRecords/Concerns/Translatable.php | 7 + .../ViewRecord/Concerns/Translatable.php | 54 + ...ravelTranslatablePluginServiceProvider.php | 63 + .../stubs/SettingsPage.stub | 20 + packages/tables/.gitignore | 1 + packages/tables/composer.json | 41 + packages/tables/composer.lock | 3860 +++ packages/tables/config/tables.php | 7 + packages/tables/docs/01-installation.md | 173 + packages/tables/docs/02-getting-started.md | 500 + packages/tables/docs/03-columns.md | 389 + packages/tables/docs/04-filters.md | 146 + packages/tables/docs/05-actions.md | 179 + packages/tables/resources/lang/ar/table.php | 96 + packages/tables/resources/lang/ca/table.php | 96 + packages/tables/resources/lang/da/table.php | 96 + packages/tables/resources/lang/de/table.php | 96 + packages/tables/resources/lang/en/table.php | 96 + packages/tables/resources/lang/es/table.php | 96 + packages/tables/resources/lang/fa/table.php | 96 + packages/tables/resources/lang/fr/table.php | 96 + packages/tables/resources/lang/id/table.php | 96 + packages/tables/resources/lang/it/table.php | 96 + packages/tables/resources/lang/ka/table.php | 96 + packages/tables/resources/lang/ku/table.php | 96 + packages/tables/resources/lang/nl/table.php | 97 + .../tables/resources/lang/pt-br/table.php | 96 + packages/tables/resources/lang/ru/table.php | 96 + packages/tables/resources/lang/sv/table.php | 96 + .../tables/resources/lang/zh-CN/table.php | 96 + .../views/actions/button-action.blade.php | 33 + .../actions/icon-button-action.blade.php | 31 + .../views/actions/link-action.blade.php | 31 + .../modal/actions/button-action.blade.php | 10 + .../views/columns/badge-column.blade.php | 20 + .../views/columns/boolean-column.blade.php | 23 + .../views/columns/icon-column.blade.php | 18 + .../views/columns/image-column.blade.php | 22 + .../views/columns/text-column.blade.php | 3 + .../views/components/actions-cell.blade.php | 14 + .../views/components/actions.blade.php | 9 + .../components/bulk-actions/index.blade.php | 47 + .../components/bulk-actions/trigger.blade.php | 6 + .../views/components/button.blade.php | 64 + .../resources/views/components/cell.blade.php | 33 + .../views/components/checkbox-cell.blade.php | 13 + .../views/components/container.blade.php | 3 + .../views/components/dropdown/item.blade.php | 42 + .../empty-state/description.blade.php | 3 + .../components/empty-state/heading.blade.php | 3 + .../components/empty-state/index.blade.php | 28 + .../views/components/filters/index.blade.php | 43 + .../components/filters/trigger.blade.php | 6 + .../views/components/header-cell.blade.php | 33 + .../components/header/description.blade.php | 3 + .../views/components/header/heading.blade.php | 3 + .../views/components/header/index.blade.php | 27 + .../resources/views/components/hr.blade.php | 1 + .../views/components/icon-button.blade.php | 45 + .../resources/views/components/link.blade.php | 29 + .../views/components/modal/actions.blade.php | 13 + .../views/components/modal/heading.blade.php | 3 + .../views/components/modal/index.blade.php | 128 + .../components/modal/subheading.blade.php | 3 + .../components/pagination/index.blade.php | 94 + .../components/pagination/item.blade.php | 30 + .../records-per-page-selector.blade.php | 15 + .../resources/views/components/row.blade.php | 3 + .../views/components/search-input.blade.php | 19 + .../views/components/table.blade.php | 26 + .../tables/resources/views/index.blade.php | 273 + packages/tables/src/Actions/Action.php | 103 + packages/tables/src/Actions/BulkAction.php | 70 + packages/tables/src/Actions/ButtonAction.php | 24 + .../src/Actions/Concerns/BelongsToTable.php | 28 + .../src/Actions/Concerns/CanBeHidden.php | 20 + .../src/Actions/Concerns/CanBeMounted.php | 32 + .../CanDeselectRecordsAfterCompletion.php | 20 + .../src/Actions/Concerns/CanOpenModal.php | 150 + .../src/Actions/Concerns/CanOpenUrl.php | 44 + .../Concerns/CanRequireConfirmation.php | 20 + .../tables/src/Actions/Concerns/HasAction.php | 20 + .../tables/src/Actions/Concerns/HasColor.php | 20 + .../src/Actions/Concerns/HasFormSchema.php | 25 + .../tables/src/Actions/Concerns/HasIcon.php | 20 + .../tables/src/Actions/Concerns/HasLabel.php | 26 + .../tables/src/Actions/Concerns/HasName.php | 20 + .../tables/src/Actions/Concerns/HasRecord.php | 22 + .../src/Actions/Concerns/HasRecords.php | 22 + .../tables/src/Actions/Concerns/HasView.php | 20 + .../tables/src/Actions/IconButtonAction.php | 10 + packages/tables/src/Actions/LinkAction.php | 8 + .../src/Actions/Modal/Actions/Action.php | 53 + .../Actions/Modal/Actions/ButtonAction.php | 24 + .../Actions/Concerns/CanCancelAction.php | 20 + .../Modal/Actions/Concerns/CanSubmitForm.php | 20 + .../Modal/Actions/Concerns/HasAction.php | 20 + .../Modal/Actions/Concerns/HasColor.php | 20 + .../Modal/Actions/Concerns/HasIcon.php | 20 + .../Modal/Actions/Concerns/HasLabel.php | 26 + .../Modal/Actions/Concerns/HasName.php | 20 + .../Modal/Actions/Concerns/HasView.php | 20 + packages/tables/src/Columns/BadgeColumn.php | 11 + packages/tables/src/Columns/BooleanColumn.php | 102 + packages/tables/src/Columns/Column.php | 58 + .../src/Columns/Concerns/BelongsToTable.php | 28 + .../src/Columns/Concerns/CanBeHidden.php | 48 + .../src/Columns/Concerns/CanBeSearchable.php | 40 + .../src/Columns/Concerns/CanBeSortable.php | 40 + .../src/Columns/Concerns/CanCallAction.php | 36 + .../src/Columns/Concerns/CanFormatState.php | 76 + .../src/Columns/Concerns/CanOpenUrl.php | 46 + .../tables/src/Columns/Concerns/HasColors.php | 40 + .../tables/src/Columns/Concerns/HasLabel.php | 26 + .../tables/src/Columns/Concerns/HasName.php | 20 + .../tables/src/Columns/Concerns/HasRecord.php | 22 + .../tables/src/Columns/Concerns/HasState.php | 50 + .../tables/src/Columns/Concerns/HasView.php | 20 + .../Concerns/InteractsWithTableQuery.php | 124 + packages/tables/src/Columns/IconColumn.php | 51 + packages/tables/src/Columns/ImageColumn.php | 129 + packages/tables/src/Columns/TextColumn.php | 10 + packages/tables/src/Columns/ViewColumn.php | 7 + .../Commands/Aliases/MakeColumnCommand.php | 12 + .../Commands/Concerns/CanManipulateFiles.php | 60 + .../Commands/Concerns/CanValidateInput.php | 31 + .../tables/src/Commands/InstallCommand.php | 68 + .../tables/src/Commands/MakeColumnCommand.php | 68 + .../tables/src/Concerns/BelongsToLivewire.php | 22 + .../src/Concerns/CanPaginateRecords.php | 49 + .../tables/src/Concerns/CanSearchRecords.php | 56 + .../tables/src/Concerns/CanSelectRecords.php | 139 + .../tables/src/Concerns/CanSortRecords.php | 77 + packages/tables/src/Concerns/HasActions.php | 112 + .../tables/src/Concerns/HasBulkActions.php | 102 + packages/tables/src/Concerns/HasColumns.php | 54 + .../tables/src/Concerns/HasContentFooter.php | 13 + .../tables/src/Concerns/HasEmptyState.php | 58 + packages/tables/src/Concerns/HasFilters.php | 92 + packages/tables/src/Concerns/HasHeader.php | 54 + .../tables/src/Concerns/HasRecordAction.php | 13 + packages/tables/src/Concerns/HasRecordUrl.php | 13 + packages/tables/src/Concerns/HasRecords.php | 54 + .../src/Concerns/InteractsWithTable.php | 122 + packages/tables/src/Contracts/HasTable.php | 64 + .../src/Filters/Concerns/BelongsToTable.php | 28 + .../src/Filters/Concerns/CanBeDefault.php | 20 + .../src/Filters/Concerns/CanBeHidden.php | 20 + .../src/Filters/Concerns/HasFormSchema.php | 26 + .../tables/src/Filters/Concerns/HasLabel.php | 26 + .../tables/src/Filters/Concerns/HasName.php | 20 + .../Concerns/InteractsWithTableQuery.php | 43 + packages/tables/src/Filters/Filter.php | 38 + packages/tables/src/Filters/SelectFilter.php | 81 + packages/tables/src/Table.php | 332 + packages/tables/src/TableComponent.php | 11 + packages/tables/src/TablesServiceProvider.php | 41 + packages/tables/stubs/Column.stub | 10 + packages/tables/stubs/ColumnView.stub | 3 + .../stubs/scaffolding/resources/css/app.css | 5 + .../stubs/scaffolding/resources/js/app.js | 10 + .../resources/views/layouts/app.blade.php | 26 + .../stubs/scaffolding/tailwind.config.js | 24 + .../tables/stubs/scaffolding/webpack.mix.js | 7 + phpstan.neon | 6 + phpunit.xml.dist | 30 + tests/Pest.php | 8 + tests/database/factories/PostFactory.php | 22 + tests/database/factories/UserFactory.php | 23 + .../migrations/create_posts_table.php | 24 + .../migrations/create_users_table.php | 25 + tests/src/Admin/Auth/LoginTest.php | 101 + tests/src/Admin/Fixtures/Pages/Settings.php | 9 + .../Admin/Fixtures/Resources/PostResource.php | 50 + .../PostResource/Pages/CreatePost.php | 11 + .../Resources/PostResource/Pages/EditPost.php | 11 + .../PostResource/Pages/ListPosts.php | 11 + .../Resources/PostResource/Pages/ViewPost.php | 11 + .../src/Admin/Pages/PagesServiceProvider.php | 18 + tests/src/Admin/Pages/RegistrationTest.php | 12 + tests/src/Admin/Pages/TestCase.php | 23 + .../Resources/Pages/CreateRecordTest.php | 39 + .../Admin/Resources/Pages/EditRecordTest.php | 65 + .../Admin/Resources/Pages/ListRecordsTest.php | 10 + .../Admin/Resources/Pages/ViewRecordTest.php | 33 + .../src/Admin/Resources/RegistrationTest.php | 12 + tests/src/Admin/Resources/ResourceTest.php | 59 + .../Resources/ResourcesServiceProvider.php | 18 + tests/src/Admin/Resources/TestCase.php | 23 + tests/src/Forms/ComponentContainerTest.php | 97 + tests/src/Forms/ComponentTest.php | 70 + tests/src/Forms/EventsTest.php | 26 + tests/src/Forms/FieldTest.php | 40 + tests/src/Forms/Fixtures/Livewire.php | 24 + tests/src/Forms/GridTest.php | 110 + tests/src/Forms/HiddenComponentsTest.php | 99 + tests/src/Forms/StateBindingModifiersTest.php | 47 + tests/src/Forms/StateTest.php | 183 + tests/src/Forms/ValidationTest.php | 90 + tests/src/Models/Post.php | 29 + tests/src/Models/User.php | 30 + tests/src/TestCase.php | 44 + webpack.mix.js | 22 + 621 files changed, 140030 insertions(+) create mode 100644 .editorconfig create mode 100644 .github/FUNDING.yml create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/workflows/php-cs-fixer.yml create mode 100644 .github/workflows/tests.yml create mode 100644 .gitignore create mode 100644 .php-cs-fixer.dist.php create mode 100644 .prettierrc create mode 100644 CODE_OF_CONDUCT.md create mode 100644 LICENSE.md create mode 100644 README.md create mode 100644 SECURITY.md create mode 100644 bin/build.js create mode 100644 bin/tailwind.config.js create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 main.js create mode 100644 monorepo-builder.php create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 packages/admin/.gitignore create mode 100644 packages/admin/composer.json create mode 100644 packages/admin/composer.lock create mode 100644 packages/admin/config/filament.php create mode 100644 packages/admin/dist/app.css create mode 100644 packages/admin/dist/app.css.map create mode 100644 packages/admin/dist/app.js create mode 100644 packages/admin/dist/app.js.map create mode 100644 packages/admin/dist/mix-manifest.json create mode 100644 packages/admin/dist/module.esm.css create mode 100644 packages/admin/dist/module.esm.js create mode 100644 packages/admin/docs/01-installation.md create mode 100644 packages/admin/docs/02-resources.md create mode 100644 packages/admin/docs/03-pages.md create mode 100644 packages/admin/docs/04-dashboard.md create mode 100644 packages/admin/docs/05-navigation.md create mode 100644 packages/admin/docs/06-users.md create mode 100644 packages/admin/docs/07-appearance.md create mode 100644 packages/admin/docs/08-plugins.md create mode 100644 packages/admin/docs/09-upgrade-guide.md create mode 100644 packages/admin/resources/css/app.css create mode 100644 packages/admin/resources/js/app.js create mode 100644 packages/admin/resources/lang/en/global-search.php create mode 100644 packages/admin/resources/lang/en/layout.php create mode 100644 packages/admin/resources/lang/en/login.php create mode 100644 packages/admin/resources/lang/en/pages/dashboard.php create mode 100644 packages/admin/resources/lang/en/resources/pages/create-record.php create mode 100644 packages/admin/resources/lang/en/resources/pages/edit-record.php create mode 100644 packages/admin/resources/lang/en/resources/pages/list-records.php create mode 100644 packages/admin/resources/lang/en/resources/pages/view-record.php create mode 100644 packages/admin/resources/lang/en/resources/relation-managers/attach.php create mode 100644 packages/admin/resources/lang/en/resources/relation-managers/create.php create mode 100644 packages/admin/resources/lang/en/resources/relation-managers/delete.php create mode 100644 packages/admin/resources/lang/en/resources/relation-managers/detach.php create mode 100644 packages/admin/resources/lang/en/resources/relation-managers/edit.php create mode 100644 packages/admin/resources/lang/en/widgets/account-widget.php create mode 100644 packages/admin/resources/lang/en/widgets/filament-info-widget.php create mode 100644 packages/admin/resources/views/components/actions/button-action.blade.php create mode 100644 packages/admin/resources/views/components/actions/index.blade.php create mode 100644 packages/admin/resources/views/components/actions/select-action.blade.php create mode 100644 packages/admin/resources/views/components/brand.blade.php create mode 100644 packages/admin/resources/views/components/button.blade.php create mode 100644 packages/admin/resources/views/components/card/heading.blade.php create mode 100644 packages/admin/resources/views/components/card/index.blade.php create mode 100644 packages/admin/resources/views/components/footer.blade.php create mode 100644 packages/admin/resources/views/components/form.blade.php create mode 100644 packages/admin/resources/views/components/global-search/end.blade.php create mode 100644 packages/admin/resources/views/components/global-search/index.blade.php create mode 100644 packages/admin/resources/views/components/global-search/input.blade.php create mode 100644 packages/admin/resources/views/components/global-search/no-results-message.blade.php create mode 100644 packages/admin/resources/views/components/global-search/result-group.blade.php create mode 100644 packages/admin/resources/views/components/global-search/result.blade.php create mode 100644 packages/admin/resources/views/components/global-search/results-container.blade.php create mode 100644 packages/admin/resources/views/components/global-search/start.blade.php create mode 100644 packages/admin/resources/views/components/header/heading.blade.php create mode 100644 packages/admin/resources/views/components/header/index.blade.php create mode 100644 packages/admin/resources/views/components/hr.blade.php create mode 100644 packages/admin/resources/views/components/layouts/app.blade.php create mode 100644 packages/admin/resources/views/components/layouts/app/sidebar/end.blade.php create mode 100644 packages/admin/resources/views/components/layouts/app/sidebar/footer.blade.php create mode 100644 packages/admin/resources/views/components/layouts/app/sidebar/group.blade.php create mode 100644 packages/admin/resources/views/components/layouts/app/sidebar/index.blade.php create mode 100644 packages/admin/resources/views/components/layouts/app/sidebar/item.blade.php create mode 100644 packages/admin/resources/views/components/layouts/app/sidebar/start.blade.php create mode 100644 packages/admin/resources/views/components/layouts/base.blade.php create mode 100644 packages/admin/resources/views/components/modal/actions.blade.php create mode 100644 packages/admin/resources/views/components/modal/heading.blade.php create mode 100644 packages/admin/resources/views/components/modal/index.blade.php create mode 100644 packages/admin/resources/views/components/modal/subheading.blade.php create mode 100644 packages/admin/resources/views/components/notification.blade.php create mode 100644 packages/admin/resources/views/components/page.blade.php create mode 100644 packages/admin/resources/views/components/resources/relation-managers/index.blade.php create mode 100644 packages/admin/resources/views/components/stats/card.blade.php create mode 100644 packages/admin/resources/views/components/stats/index.blade.php create mode 100644 packages/admin/resources/views/components/tabs/index.blade.php create mode 100644 packages/admin/resources/views/components/tabs/item.blade.php create mode 100644 packages/admin/resources/views/login.blade.php create mode 100644 packages/admin/resources/views/pages/dashboard.blade.php create mode 100644 packages/admin/resources/views/resources/pages/create-record.blade.php create mode 100644 packages/admin/resources/views/resources/pages/edit-record.blade.php create mode 100644 packages/admin/resources/views/resources/pages/list-records.blade.php create mode 100644 packages/admin/resources/views/resources/pages/view-record.blade.php create mode 100644 packages/admin/resources/views/resources/relation-managers/belongs-to-many-relation-manager.blade.php create mode 100644 packages/admin/resources/views/resources/relation-managers/has-many-relation-manager.blade.php create mode 100644 packages/admin/resources/views/widgets/account-widget.blade.php create mode 100644 packages/admin/resources/views/widgets/chart-widget.blade.php create mode 100644 packages/admin/resources/views/widgets/filament-info-widget.blade.php create mode 100644 packages/admin/resources/views/widgets/stats-overview-widget.blade.php create mode 100644 packages/admin/resources/views/widgets/stats-overview-widget/card.blade.php create mode 100644 packages/admin/routes/web.php create mode 100644 packages/admin/src/AvatarProviders/Contracts/AvatarProvider.php create mode 100644 packages/admin/src/AvatarProviders/UiAvatarsProvider.php create mode 100644 packages/admin/src/Commands/Aliases/MakeBelongsToManyCommand.php create mode 100644 packages/admin/src/Commands/Aliases/MakeHasManyCommand.php create mode 100644 packages/admin/src/Commands/Aliases/MakePageCommand.php create mode 100644 packages/admin/src/Commands/Aliases/MakeResourceCommand.php create mode 100644 packages/admin/src/Commands/Aliases/MakeUserCommand.php create mode 100644 packages/admin/src/Commands/Aliases/MakeWidgetCommand.php create mode 100644 packages/admin/src/Commands/Concerns/CanManipulateFiles.php create mode 100644 packages/admin/src/Commands/Concerns/CanValidateInput.php create mode 100644 packages/admin/src/Commands/MakeBelongsToManyCommand.php create mode 100644 packages/admin/src/Commands/MakeHasManyCommand.php create mode 100644 packages/admin/src/Commands/MakePageCommand.php create mode 100644 packages/admin/src/Commands/MakeResourceCommand.php create mode 100644 packages/admin/src/Commands/MakeUserCommand.php create mode 100644 packages/admin/src/Commands/MakeWidgetCommand.php create mode 100644 packages/admin/src/Commands/UpgradeCommand.php create mode 100644 packages/admin/src/Events/ServingFilament.php create mode 100644 packages/admin/src/Facades/Filament.php create mode 100644 packages/admin/src/FilamentManager.php create mode 100644 packages/admin/src/FilamentServiceProvider.php create mode 100644 packages/admin/src/Http/Controllers/AssetController.php create mode 100644 packages/admin/src/Http/Livewire/Auth/Login.php create mode 100644 packages/admin/src/Http/Livewire/GlobalSearch.php create mode 100644 packages/admin/src/Http/Middleware/Authenticate.php create mode 100644 packages/admin/src/Http/Middleware/DispatchServingFilamentEvent.php create mode 100644 packages/admin/src/Http/Middleware/MirrorConfigToSubpackages.php create mode 100644 packages/admin/src/Models/Contracts/FilamentUser.php create mode 100644 packages/admin/src/Models/Contracts/HasAvatar.php create mode 100644 packages/admin/src/Models/Contracts/HasName.php create mode 100644 packages/admin/src/Navigation/NavigationItem.php create mode 100644 packages/admin/src/Pages/Actions/Action.php create mode 100644 packages/admin/src/Pages/Actions/ButtonAction.php create mode 100644 packages/admin/src/Pages/Actions/Concerns/CanBeHidden.php create mode 100644 packages/admin/src/Pages/Actions/Concerns/CanOpenUrl.php create mode 100644 packages/admin/src/Pages/Actions/Concerns/CanSubmitForm.php create mode 100644 packages/admin/src/Pages/Actions/Concerns/HasAction.php create mode 100644 packages/admin/src/Pages/Actions/Concerns/HasColor.php create mode 100644 packages/admin/src/Pages/Actions/Concerns/HasIcon.php create mode 100644 packages/admin/src/Pages/Actions/Concerns/HasId.php create mode 100644 packages/admin/src/Pages/Actions/Concerns/HasLabel.php create mode 100644 packages/admin/src/Pages/Actions/Concerns/HasName.php create mode 100644 packages/admin/src/Pages/Actions/Concerns/HasView.php create mode 100644 packages/admin/src/Pages/Actions/SelectAction.php create mode 100644 packages/admin/src/Pages/Dashboard.php create mode 100644 packages/admin/src/Pages/Page.php create mode 100644 packages/admin/src/PluginServiceProvider.php create mode 100644 packages/admin/src/Resources/Form.php create mode 100644 packages/admin/src/Resources/Pages/Concerns/HasRecordBreadcrumb.php create mode 100644 packages/admin/src/Resources/Pages/Concerns/InteractsWithRecord.php create mode 100644 packages/admin/src/Resources/Pages/Concerns/UsesResourceForm.php create mode 100644 packages/admin/src/Resources/Pages/CreateRecord.php create mode 100644 packages/admin/src/Resources/Pages/EditRecord.php create mode 100644 packages/admin/src/Resources/Pages/ListRecords.php create mode 100644 packages/admin/src/Resources/Pages/Page.php create mode 100644 packages/admin/src/Resources/Pages/ViewRecord.php create mode 100644 packages/admin/src/Resources/RelationManagers/BelongsToManyRelationManager.php create mode 100644 packages/admin/src/Resources/RelationManagers/Concerns/CanAttachRecords.php create mode 100644 packages/admin/src/Resources/RelationManagers/Concerns/CanCreateRecords.php create mode 100644 packages/admin/src/Resources/RelationManagers/Concerns/CanDeleteRecords.php create mode 100644 packages/admin/src/Resources/RelationManagers/Concerns/CanDetachRecords.php create mode 100644 packages/admin/src/Resources/RelationManagers/Concerns/CanEditRecords.php create mode 100644 packages/admin/src/Resources/RelationManagers/HasManyRelationManager.php create mode 100644 packages/admin/src/Resources/RelationManagers/RelationManager.php create mode 100644 packages/admin/src/Resources/Resource.php create mode 100644 packages/admin/src/Resources/Table.php create mode 100644 packages/admin/src/Widgets/AccountWidget.php create mode 100644 packages/admin/src/Widgets/BarChartWidget.php create mode 100644 packages/admin/src/Widgets/BubbleChartWidget.php create mode 100644 packages/admin/src/Widgets/ChartWidget.php create mode 100644 packages/admin/src/Widgets/DoughnutChartWidget.php create mode 100644 packages/admin/src/Widgets/FilamentInfoWidget.php create mode 100644 packages/admin/src/Widgets/LineChartWidget.php create mode 100644 packages/admin/src/Widgets/PieChartWidget.php create mode 100644 packages/admin/src/Widgets/PolarAreaChartWidget.php create mode 100644 packages/admin/src/Widgets/RadarChartWidget.php create mode 100644 packages/admin/src/Widgets/ScatterChartWidget.php create mode 100644 packages/admin/src/Widgets/StatsOverviewWidget.php create mode 100644 packages/admin/src/Widgets/StatsOverviewWidget/Card.php create mode 100644 packages/admin/src/Widgets/Widget.php create mode 100644 packages/admin/src/helpers.php create mode 100644 packages/admin/stubs/BelongsToManyRelationManager.stub create mode 100644 packages/admin/stubs/DefaultResourcePage.stub create mode 100644 packages/admin/stubs/HasManyRelationManager.stub create mode 100644 packages/admin/stubs/Page.stub create mode 100644 packages/admin/stubs/PageView.stub create mode 100644 packages/admin/stubs/Resource.stub create mode 100644 packages/admin/stubs/ResourcePage.stub create mode 100644 packages/admin/stubs/Widget.stub create mode 100644 packages/admin/stubs/WidgetView.stub create mode 100644 packages/admin/tailwind.config.js create mode 100644 packages/forms/.gitignore create mode 100644 packages/forms/composer.json create mode 100644 packages/forms/composer.lock create mode 100644 packages/forms/config/forms.php create mode 100644 packages/forms/dist/module.esm.css create mode 100644 packages/forms/dist/module.esm.js create mode 100644 packages/forms/docs/01-installation.md create mode 100644 packages/forms/docs/02-getting-started.md create mode 100644 packages/forms/docs/03-fields.md create mode 100644 packages/forms/docs/04-layout.md create mode 100644 packages/forms/docs/05-advanced.md create mode 100644 packages/forms/resources/css/components/file-upload.css create mode 100644 packages/forms/resources/js/components/date-time-picker.js create mode 100644 packages/forms/resources/js/components/file-upload.js create mode 100644 packages/forms/resources/js/components/key-value.js create mode 100644 packages/forms/resources/js/components/markdown-editor.js create mode 100644 packages/forms/resources/js/components/multi-select.js create mode 100644 packages/forms/resources/js/components/rich-editor.js create mode 100644 packages/forms/resources/js/components/select.js create mode 100644 packages/forms/resources/js/components/tags-input.js create mode 100644 packages/forms/resources/js/components/text-input.js create mode 100644 packages/forms/resources/js/components/textarea.js create mode 100644 packages/forms/resources/js/index.js create mode 100644 packages/forms/resources/lang/ar/components.php create mode 100644 packages/forms/resources/lang/ca/components.php create mode 100644 packages/forms/resources/lang/da/components.php create mode 100644 packages/forms/resources/lang/de/components.php create mode 100644 packages/forms/resources/lang/en/components.php create mode 100644 packages/forms/resources/lang/es/components.php create mode 100644 packages/forms/resources/lang/fa/components.php create mode 100644 packages/forms/resources/lang/fr/components.php create mode 100644 packages/forms/resources/lang/id/components.php create mode 100644 packages/forms/resources/lang/it/components.php create mode 100644 packages/forms/resources/lang/ka/components.php create mode 100644 packages/forms/resources/lang/ku/components.php create mode 100644 packages/forms/resources/lang/nl/components.php create mode 100644 packages/forms/resources/lang/pt-br/components.php create mode 100644 packages/forms/resources/lang/ru/components.php create mode 100644 packages/forms/resources/lang/sv/components.php create mode 100644 packages/forms/resources/lang/zh-CN/components.php create mode 100644 packages/forms/resources/views/component-container.blade.php create mode 100644 packages/forms/resources/views/components/builder.blade.php create mode 100644 packages/forms/resources/views/components/builder/block.blade.php create mode 100644 packages/forms/resources/views/components/card.blade.php create mode 100644 packages/forms/resources/views/components/checkbox.blade.php create mode 100644 packages/forms/resources/views/components/date-time-picker.blade.php create mode 100644 packages/forms/resources/views/components/field-wrapper/error-message.blade.php create mode 100644 packages/forms/resources/views/components/field-wrapper/helper-text.blade.php create mode 100644 packages/forms/resources/views/components/field-wrapper/hint.blade.php create mode 100644 packages/forms/resources/views/components/field-wrapper/index.blade.php create mode 100644 packages/forms/resources/views/components/field-wrapper/label.blade.php create mode 100644 packages/forms/resources/views/components/fieldset.blade.php create mode 100644 packages/forms/resources/views/components/file-upload.blade.php create mode 100644 packages/forms/resources/views/components/file-upload/input.blade.php create mode 100644 packages/forms/resources/views/components/grid.blade.php create mode 100644 packages/forms/resources/views/components/group.blade.php create mode 100644 packages/forms/resources/views/components/hidden.blade.php create mode 100644 packages/forms/resources/views/components/key-value.blade.php create mode 100644 packages/forms/resources/views/components/markdown-editor.blade.php create mode 100644 packages/forms/resources/views/components/markdown-editor/toolbar-button.blade.php create mode 100644 packages/forms/resources/views/components/multi-select.blade.php create mode 100644 packages/forms/resources/views/components/multiple-file-upload.blade.php create mode 100644 packages/forms/resources/views/components/placeholder.blade.php create mode 100644 packages/forms/resources/views/components/radio.blade.php create mode 100644 packages/forms/resources/views/components/repeater.blade.php create mode 100644 packages/forms/resources/views/components/rich-editor.blade.php create mode 100644 packages/forms/resources/views/components/section.blade.php create mode 100644 packages/forms/resources/views/components/select.blade.php create mode 100644 packages/forms/resources/views/components/tabs.blade.php create mode 100644 packages/forms/resources/views/components/tabs/tab.blade.php create mode 100644 packages/forms/resources/views/components/tags-input.blade.php create mode 100644 packages/forms/resources/views/components/text-input.blade.php create mode 100644 packages/forms/resources/views/components/textarea.blade.php create mode 100644 packages/forms/resources/views/components/toggle.blade.php create mode 100644 packages/forms/src/Commands/Aliases/MakeFieldCommand.php create mode 100644 packages/forms/src/Commands/Aliases/MakeLayoutComponentCommand.php create mode 100644 packages/forms/src/Commands/Concerns/CanManipulateFiles.php create mode 100644 packages/forms/src/Commands/Concerns/CanValidateInput.php create mode 100644 packages/forms/src/Commands/InstallCommand.php create mode 100644 packages/forms/src/Commands/MakeFieldCommand.php create mode 100644 packages/forms/src/Commands/MakeLayoutComponentCommand.php create mode 100644 packages/forms/src/ComponentContainer.php create mode 100644 packages/forms/src/Components/BelongsToManyMultiSelect.php create mode 100644 packages/forms/src/Components/BelongsToSelect.php create mode 100644 packages/forms/src/Components/Builder.php create mode 100644 packages/forms/src/Components/Builder/Block.php create mode 100644 packages/forms/src/Components/Card.php create mode 100644 packages/forms/src/Components/Checkbox.php create mode 100644 packages/forms/src/Components/Component.php create mode 100644 packages/forms/src/Components/Concerns/BelongsToContainer.php create mode 100644 packages/forms/src/Components/Concerns/BelongsToModel.php create mode 100644 packages/forms/src/Components/Concerns/CanBeAccepted.php create mode 100644 packages/forms/src/Components/Concerns/CanBeAutocapitalized.php create mode 100644 packages/forms/src/Components/Concerns/CanBeAutocompleted.php create mode 100644 packages/forms/src/Components/Concerns/CanBeAutofocused.php create mode 100644 packages/forms/src/Components/Concerns/CanBeConcealed.php create mode 100644 packages/forms/src/Components/Concerns/CanBeDisabled.php create mode 100644 packages/forms/src/Components/Concerns/CanBeHidden.php create mode 100644 packages/forms/src/Components/Concerns/CanBeInline.php create mode 100644 packages/forms/src/Components/Concerns/CanBeLengthConstrained.php create mode 100644 packages/forms/src/Components/Concerns/CanBeValidated.php create mode 100644 packages/forms/src/Components/Concerns/CanSpanColumns.php create mode 100644 packages/forms/src/Components/Concerns/Cloneable.php create mode 100644 packages/forms/src/Components/Concerns/EvaluatesCallbacks.php create mode 100644 packages/forms/src/Components/Concerns/HasChildComponents.php create mode 100644 packages/forms/src/Components/Concerns/HasExtraAttributes.php create mode 100644 packages/forms/src/Components/Concerns/HasFileAttachments.php create mode 100644 packages/forms/src/Components/Concerns/HasHelperText.php create mode 100644 packages/forms/src/Components/Concerns/HasHint.php create mode 100644 packages/forms/src/Components/Concerns/HasId.php create mode 100644 packages/forms/src/Components/Concerns/HasLabel.php create mode 100644 packages/forms/src/Components/Concerns/HasMaxWidth.php create mode 100644 packages/forms/src/Components/Concerns/HasMeta.php create mode 100644 packages/forms/src/Components/Concerns/HasName.php create mode 100644 packages/forms/src/Components/Concerns/HasPlaceholder.php create mode 100644 packages/forms/src/Components/Concerns/HasState.php create mode 100644 packages/forms/src/Components/Concerns/HasView.php create mode 100644 packages/forms/src/Components/Concerns/InteractsWithToolbarButtons.php create mode 100644 packages/forms/src/Components/Concerns/ListensToEvents.php create mode 100644 packages/forms/src/Components/Contracts/CanConcealComponents.php create mode 100644 packages/forms/src/Components/Contracts/HasFileAttachments.php create mode 100644 packages/forms/src/Components/Contracts/HasValidationRules.php create mode 100644 packages/forms/src/Components/DatePicker.php create mode 100644 packages/forms/src/Components/DateTimePicker.php create mode 100644 packages/forms/src/Components/Field.php create mode 100644 packages/forms/src/Components/Fieldset.php create mode 100644 packages/forms/src/Components/FileUpload.php create mode 100644 packages/forms/src/Components/Grid.php create mode 100644 packages/forms/src/Components/Group.php create mode 100644 packages/forms/src/Components/Hidden.php create mode 100644 packages/forms/src/Components/KeyValue.php create mode 100644 packages/forms/src/Components/MarkdownEditor.php create mode 100644 packages/forms/src/Components/MultiSelect.php create mode 100644 packages/forms/src/Components/MultipleFileUpload.php create mode 100644 packages/forms/src/Components/Placeholder.php create mode 100644 packages/forms/src/Components/Radio.php create mode 100644 packages/forms/src/Components/Repeater.php create mode 100644 packages/forms/src/Components/RichEditor.php create mode 100644 packages/forms/src/Components/Section.php create mode 100644 packages/forms/src/Components/Select.php create mode 100644 packages/forms/src/Components/Tabs.php create mode 100644 packages/forms/src/Components/Tabs/Tab.php create mode 100644 packages/forms/src/Components/TagsInput.php create mode 100644 packages/forms/src/Components/TextInput.php create mode 100644 packages/forms/src/Components/TextInput/Mask.php create mode 100644 packages/forms/src/Components/Textarea.php create mode 100644 packages/forms/src/Components/TimePicker.php create mode 100644 packages/forms/src/Components/Toggle.php create mode 100644 packages/forms/src/Components/View.php create mode 100644 packages/forms/src/Components/ViewField.php create mode 100644 packages/forms/src/Concerns/BelongsToLivewire.php create mode 100644 packages/forms/src/Concerns/BelongsToModel.php create mode 100644 packages/forms/src/Concerns/BelongsToParentComponent.php create mode 100644 packages/forms/src/Concerns/CanBeDisabled.php create mode 100644 packages/forms/src/Concerns/CanBeHidden.php create mode 100644 packages/forms/src/Concerns/CanBeValidated.php create mode 100644 packages/forms/src/Concerns/Cloneable.php create mode 100644 packages/forms/src/Concerns/HasColumns.php create mode 100644 packages/forms/src/Concerns/HasComponents.php create mode 100644 packages/forms/src/Concerns/HasState.php create mode 100644 packages/forms/src/Concerns/HasStateBindingModifiers.php create mode 100644 packages/forms/src/Concerns/InteractsWithForms.php create mode 100644 packages/forms/src/Concerns/ListensToEvents.php create mode 100644 packages/forms/src/Concerns/SupportsComponentFileAttachments.php create mode 100644 packages/forms/src/Concerns/SupportsFileUploadFields.php create mode 100644 packages/forms/src/Concerns/SupportsMultiSelectFields.php create mode 100644 packages/forms/src/Concerns/SupportsSelectFields.php create mode 100644 packages/forms/src/Contracts/HasForms.php create mode 100644 packages/forms/src/FormsComponent.php create mode 100644 packages/forms/src/FormsServiceProvider.php create mode 100644 packages/forms/stubs/Field.stub create mode 100644 packages/forms/stubs/FieldView.stub create mode 100644 packages/forms/stubs/LayoutComponent.stub create mode 100644 packages/forms/stubs/LayoutComponentView.stub create mode 100644 packages/forms/stubs/scaffolding/resources/css/app.css create mode 100644 packages/forms/stubs/scaffolding/resources/js/app.js create mode 100644 packages/forms/stubs/scaffolding/resources/views/layouts/app.blade.php create mode 100644 packages/forms/stubs/scaffolding/tailwind.config.js create mode 100644 packages/forms/stubs/scaffolding/webpack.mix.js create mode 100644 packages/spatie-laravel-media-library-plugin/.gitignore create mode 100644 packages/spatie-laravel-media-library-plugin/composer.json create mode 100644 packages/spatie-laravel-media-library-plugin/composer.lock create mode 100644 packages/spatie-laravel-media-library-plugin/docs/01-installation.md create mode 100644 packages/spatie-laravel-media-library-plugin/docs/02-form-components.md create mode 100644 packages/spatie-laravel-media-library-plugin/docs/03-table-columns.md create mode 100644 packages/spatie-laravel-media-library-plugin/src/Forms/Components/SpatieMediaLibraryFileUpload.php create mode 100644 packages/spatie-laravel-media-library-plugin/src/Forms/Components/SpatieMediaLibraryMultipleFileUpload.php create mode 100644 packages/spatie-laravel-media-library-plugin/src/Tables/Columns/SpatieMediaLibraryImageColumn.php create mode 100644 packages/spatie-laravel-settings-plugin/.gitignore create mode 100644 packages/spatie-laravel-settings-plugin/composer.json create mode 100644 packages/spatie-laravel-settings-plugin/composer.lock create mode 100644 packages/spatie-laravel-settings-plugin/docs/01-installation.md create mode 100644 packages/spatie-laravel-settings-plugin/docs/02-getting-started.md create mode 100644 packages/spatie-laravel-settings-plugin/resources/views/pages/settings-page.blade.php create mode 100644 packages/spatie-laravel-settings-plugin/src/Commands/Aliases/MakeSettingsPageCommand.php create mode 100644 packages/spatie-laravel-settings-plugin/src/Commands/MakeSettingsPageCommand.php create mode 100644 packages/spatie-laravel-settings-plugin/src/Pages/SettingsPage.php create mode 100644 packages/spatie-laravel-settings-plugin/src/SpatieLaravelSettingsPluginServiceProvider.php create mode 100644 packages/spatie-laravel-settings-plugin/stubs/SettingsPage.stub create mode 100644 packages/spatie-laravel-tags-plugin/.gitignore create mode 100644 packages/spatie-laravel-tags-plugin/composer.json create mode 100644 packages/spatie-laravel-tags-plugin/composer.lock create mode 100644 packages/spatie-laravel-tags-plugin/docs/01-installation.md create mode 100644 packages/spatie-laravel-tags-plugin/docs/02-form-components.md create mode 100644 packages/spatie-laravel-tags-plugin/src/Forms/Components/SpatieTagsInput.php create mode 100644 packages/spatie-laravel-translatable-plugin/.gitignore create mode 100644 packages/spatie-laravel-translatable-plugin/composer.json create mode 100644 packages/spatie-laravel-translatable-plugin/composer.lock create mode 100644 packages/spatie-laravel-translatable-plugin/config/filament-spatie-laravel-translatable-plugin.php create mode 100644 packages/spatie-laravel-translatable-plugin/docs/01-installation.md create mode 100644 packages/spatie-laravel-translatable-plugin/docs/02-getting-started.md create mode 100644 packages/spatie-laravel-translatable-plugin/resources/lang/actions.php create mode 100644 packages/spatie-laravel-translatable-plugin/src/Resources/Concerns/Translatable.php create mode 100644 packages/spatie-laravel-translatable-plugin/src/Resources/Pages/Concerns/HasActiveFormLocaleSelect.php create mode 100644 packages/spatie-laravel-translatable-plugin/src/Resources/Pages/CreateRecord/Concerns/Translatable.php create mode 100644 packages/spatie-laravel-translatable-plugin/src/Resources/Pages/EditRecord/Concerns/Translatable.php create mode 100644 packages/spatie-laravel-translatable-plugin/src/Resources/Pages/ListRecords/Concerns/Translatable.php create mode 100644 packages/spatie-laravel-translatable-plugin/src/Resources/Pages/ViewRecord/Concerns/Translatable.php create mode 100644 packages/spatie-laravel-translatable-plugin/src/SpatieLaravelTranslatablePluginServiceProvider.php create mode 100644 packages/spatie-laravel-translatable-plugin/stubs/SettingsPage.stub create mode 100644 packages/tables/.gitignore create mode 100644 packages/tables/composer.json create mode 100644 packages/tables/composer.lock create mode 100644 packages/tables/config/tables.php create mode 100644 packages/tables/docs/01-installation.md create mode 100644 packages/tables/docs/02-getting-started.md create mode 100644 packages/tables/docs/03-columns.md create mode 100644 packages/tables/docs/04-filters.md create mode 100644 packages/tables/docs/05-actions.md create mode 100644 packages/tables/resources/lang/ar/table.php create mode 100644 packages/tables/resources/lang/ca/table.php create mode 100644 packages/tables/resources/lang/da/table.php create mode 100644 packages/tables/resources/lang/de/table.php create mode 100644 packages/tables/resources/lang/en/table.php create mode 100644 packages/tables/resources/lang/es/table.php create mode 100644 packages/tables/resources/lang/fa/table.php create mode 100644 packages/tables/resources/lang/fr/table.php create mode 100644 packages/tables/resources/lang/id/table.php create mode 100644 packages/tables/resources/lang/it/table.php create mode 100644 packages/tables/resources/lang/ka/table.php create mode 100644 packages/tables/resources/lang/ku/table.php create mode 100644 packages/tables/resources/lang/nl/table.php create mode 100644 packages/tables/resources/lang/pt-br/table.php create mode 100644 packages/tables/resources/lang/ru/table.php create mode 100644 packages/tables/resources/lang/sv/table.php create mode 100644 packages/tables/resources/lang/zh-CN/table.php create mode 100644 packages/tables/resources/views/actions/button-action.blade.php create mode 100644 packages/tables/resources/views/actions/icon-button-action.blade.php create mode 100644 packages/tables/resources/views/actions/link-action.blade.php create mode 100644 packages/tables/resources/views/actions/modal/actions/button-action.blade.php create mode 100644 packages/tables/resources/views/columns/badge-column.blade.php create mode 100644 packages/tables/resources/views/columns/boolean-column.blade.php create mode 100644 packages/tables/resources/views/columns/icon-column.blade.php create mode 100644 packages/tables/resources/views/columns/image-column.blade.php create mode 100644 packages/tables/resources/views/columns/text-column.blade.php create mode 100644 packages/tables/resources/views/components/actions-cell.blade.php create mode 100644 packages/tables/resources/views/components/actions.blade.php create mode 100644 packages/tables/resources/views/components/bulk-actions/index.blade.php create mode 100644 packages/tables/resources/views/components/bulk-actions/trigger.blade.php create mode 100644 packages/tables/resources/views/components/button.blade.php create mode 100644 packages/tables/resources/views/components/cell.blade.php create mode 100644 packages/tables/resources/views/components/checkbox-cell.blade.php create mode 100644 packages/tables/resources/views/components/container.blade.php create mode 100644 packages/tables/resources/views/components/dropdown/item.blade.php create mode 100644 packages/tables/resources/views/components/empty-state/description.blade.php create mode 100644 packages/tables/resources/views/components/empty-state/heading.blade.php create mode 100644 packages/tables/resources/views/components/empty-state/index.blade.php create mode 100644 packages/tables/resources/views/components/filters/index.blade.php create mode 100644 packages/tables/resources/views/components/filters/trigger.blade.php create mode 100644 packages/tables/resources/views/components/header-cell.blade.php create mode 100644 packages/tables/resources/views/components/header/description.blade.php create mode 100644 packages/tables/resources/views/components/header/heading.blade.php create mode 100644 packages/tables/resources/views/components/header/index.blade.php create mode 100644 packages/tables/resources/views/components/hr.blade.php create mode 100644 packages/tables/resources/views/components/icon-button.blade.php create mode 100644 packages/tables/resources/views/components/link.blade.php create mode 100644 packages/tables/resources/views/components/modal/actions.blade.php create mode 100644 packages/tables/resources/views/components/modal/heading.blade.php create mode 100644 packages/tables/resources/views/components/modal/index.blade.php create mode 100644 packages/tables/resources/views/components/modal/subheading.blade.php create mode 100644 packages/tables/resources/views/components/pagination/index.blade.php create mode 100644 packages/tables/resources/views/components/pagination/item.blade.php create mode 100644 packages/tables/resources/views/components/pagination/records-per-page-selector.blade.php create mode 100644 packages/tables/resources/views/components/row.blade.php create mode 100644 packages/tables/resources/views/components/search-input.blade.php create mode 100644 packages/tables/resources/views/components/table.blade.php create mode 100644 packages/tables/resources/views/index.blade.php create mode 100644 packages/tables/src/Actions/Action.php create mode 100644 packages/tables/src/Actions/BulkAction.php create mode 100644 packages/tables/src/Actions/ButtonAction.php create mode 100644 packages/tables/src/Actions/Concerns/BelongsToTable.php create mode 100644 packages/tables/src/Actions/Concerns/CanBeHidden.php create mode 100644 packages/tables/src/Actions/Concerns/CanBeMounted.php create mode 100644 packages/tables/src/Actions/Concerns/CanDeselectRecordsAfterCompletion.php create mode 100644 packages/tables/src/Actions/Concerns/CanOpenModal.php create mode 100644 packages/tables/src/Actions/Concerns/CanOpenUrl.php create mode 100644 packages/tables/src/Actions/Concerns/CanRequireConfirmation.php create mode 100644 packages/tables/src/Actions/Concerns/HasAction.php create mode 100644 packages/tables/src/Actions/Concerns/HasColor.php create mode 100644 packages/tables/src/Actions/Concerns/HasFormSchema.php create mode 100644 packages/tables/src/Actions/Concerns/HasIcon.php create mode 100644 packages/tables/src/Actions/Concerns/HasLabel.php create mode 100644 packages/tables/src/Actions/Concerns/HasName.php create mode 100644 packages/tables/src/Actions/Concerns/HasRecord.php create mode 100644 packages/tables/src/Actions/Concerns/HasRecords.php create mode 100644 packages/tables/src/Actions/Concerns/HasView.php create mode 100644 packages/tables/src/Actions/IconButtonAction.php create mode 100644 packages/tables/src/Actions/LinkAction.php create mode 100644 packages/tables/src/Actions/Modal/Actions/Action.php create mode 100644 packages/tables/src/Actions/Modal/Actions/ButtonAction.php create mode 100644 packages/tables/src/Actions/Modal/Actions/Concerns/CanCancelAction.php create mode 100644 packages/tables/src/Actions/Modal/Actions/Concerns/CanSubmitForm.php create mode 100644 packages/tables/src/Actions/Modal/Actions/Concerns/HasAction.php create mode 100644 packages/tables/src/Actions/Modal/Actions/Concerns/HasColor.php create mode 100644 packages/tables/src/Actions/Modal/Actions/Concerns/HasIcon.php create mode 100644 packages/tables/src/Actions/Modal/Actions/Concerns/HasLabel.php create mode 100644 packages/tables/src/Actions/Modal/Actions/Concerns/HasName.php create mode 100644 packages/tables/src/Actions/Modal/Actions/Concerns/HasView.php create mode 100644 packages/tables/src/Columns/BadgeColumn.php create mode 100644 packages/tables/src/Columns/BooleanColumn.php create mode 100644 packages/tables/src/Columns/Column.php create mode 100644 packages/tables/src/Columns/Concerns/BelongsToTable.php create mode 100644 packages/tables/src/Columns/Concerns/CanBeHidden.php create mode 100644 packages/tables/src/Columns/Concerns/CanBeSearchable.php create mode 100644 packages/tables/src/Columns/Concerns/CanBeSortable.php create mode 100644 packages/tables/src/Columns/Concerns/CanCallAction.php create mode 100644 packages/tables/src/Columns/Concerns/CanFormatState.php create mode 100644 packages/tables/src/Columns/Concerns/CanOpenUrl.php create mode 100644 packages/tables/src/Columns/Concerns/HasColors.php create mode 100644 packages/tables/src/Columns/Concerns/HasLabel.php create mode 100644 packages/tables/src/Columns/Concerns/HasName.php create mode 100644 packages/tables/src/Columns/Concerns/HasRecord.php create mode 100644 packages/tables/src/Columns/Concerns/HasState.php create mode 100644 packages/tables/src/Columns/Concerns/HasView.php create mode 100644 packages/tables/src/Columns/Concerns/InteractsWithTableQuery.php create mode 100644 packages/tables/src/Columns/IconColumn.php create mode 100644 packages/tables/src/Columns/ImageColumn.php create mode 100644 packages/tables/src/Columns/TextColumn.php create mode 100644 packages/tables/src/Columns/ViewColumn.php create mode 100644 packages/tables/src/Commands/Aliases/MakeColumnCommand.php create mode 100644 packages/tables/src/Commands/Concerns/CanManipulateFiles.php create mode 100644 packages/tables/src/Commands/Concerns/CanValidateInput.php create mode 100644 packages/tables/src/Commands/InstallCommand.php create mode 100644 packages/tables/src/Commands/MakeColumnCommand.php create mode 100644 packages/tables/src/Concerns/BelongsToLivewire.php create mode 100644 packages/tables/src/Concerns/CanPaginateRecords.php create mode 100644 packages/tables/src/Concerns/CanSearchRecords.php create mode 100644 packages/tables/src/Concerns/CanSelectRecords.php create mode 100644 packages/tables/src/Concerns/CanSortRecords.php create mode 100644 packages/tables/src/Concerns/HasActions.php create mode 100644 packages/tables/src/Concerns/HasBulkActions.php create mode 100644 packages/tables/src/Concerns/HasColumns.php create mode 100644 packages/tables/src/Concerns/HasContentFooter.php create mode 100644 packages/tables/src/Concerns/HasEmptyState.php create mode 100644 packages/tables/src/Concerns/HasFilters.php create mode 100644 packages/tables/src/Concerns/HasHeader.php create mode 100644 packages/tables/src/Concerns/HasRecordAction.php create mode 100644 packages/tables/src/Concerns/HasRecordUrl.php create mode 100644 packages/tables/src/Concerns/HasRecords.php create mode 100644 packages/tables/src/Concerns/InteractsWithTable.php create mode 100644 packages/tables/src/Contracts/HasTable.php create mode 100644 packages/tables/src/Filters/Concerns/BelongsToTable.php create mode 100644 packages/tables/src/Filters/Concerns/CanBeDefault.php create mode 100644 packages/tables/src/Filters/Concerns/CanBeHidden.php create mode 100644 packages/tables/src/Filters/Concerns/HasFormSchema.php create mode 100644 packages/tables/src/Filters/Concerns/HasLabel.php create mode 100644 packages/tables/src/Filters/Concerns/HasName.php create mode 100644 packages/tables/src/Filters/Concerns/InteractsWithTableQuery.php create mode 100644 packages/tables/src/Filters/Filter.php create mode 100644 packages/tables/src/Filters/SelectFilter.php create mode 100644 packages/tables/src/Table.php create mode 100644 packages/tables/src/TableComponent.php create mode 100644 packages/tables/src/TablesServiceProvider.php create mode 100644 packages/tables/stubs/Column.stub create mode 100644 packages/tables/stubs/ColumnView.stub create mode 100644 packages/tables/stubs/scaffolding/resources/css/app.css create mode 100644 packages/tables/stubs/scaffolding/resources/js/app.js create mode 100644 packages/tables/stubs/scaffolding/resources/views/layouts/app.blade.php create mode 100644 packages/tables/stubs/scaffolding/tailwind.config.js create mode 100644 packages/tables/stubs/scaffolding/webpack.mix.js create mode 100644 phpstan.neon create mode 100644 phpunit.xml.dist create mode 100644 tests/Pest.php create mode 100644 tests/database/factories/PostFactory.php create mode 100644 tests/database/factories/UserFactory.php create mode 100644 tests/database/migrations/create_posts_table.php create mode 100644 tests/database/migrations/create_users_table.php create mode 100644 tests/src/Admin/Auth/LoginTest.php create mode 100644 tests/src/Admin/Fixtures/Pages/Settings.php create mode 100644 tests/src/Admin/Fixtures/Resources/PostResource.php create mode 100644 tests/src/Admin/Fixtures/Resources/PostResource/Pages/CreatePost.php create mode 100644 tests/src/Admin/Fixtures/Resources/PostResource/Pages/EditPost.php create mode 100644 tests/src/Admin/Fixtures/Resources/PostResource/Pages/ListPosts.php create mode 100644 tests/src/Admin/Fixtures/Resources/PostResource/Pages/ViewPost.php create mode 100644 tests/src/Admin/Pages/PagesServiceProvider.php create mode 100644 tests/src/Admin/Pages/RegistrationTest.php create mode 100644 tests/src/Admin/Pages/TestCase.php create mode 100644 tests/src/Admin/Resources/Pages/CreateRecordTest.php create mode 100644 tests/src/Admin/Resources/Pages/EditRecordTest.php create mode 100644 tests/src/Admin/Resources/Pages/ListRecordsTest.php create mode 100644 tests/src/Admin/Resources/Pages/ViewRecordTest.php create mode 100644 tests/src/Admin/Resources/RegistrationTest.php create mode 100644 tests/src/Admin/Resources/ResourceTest.php create mode 100644 tests/src/Admin/Resources/ResourcesServiceProvider.php create mode 100644 tests/src/Admin/Resources/TestCase.php create mode 100644 tests/src/Forms/ComponentContainerTest.php create mode 100644 tests/src/Forms/ComponentTest.php create mode 100644 tests/src/Forms/EventsTest.php create mode 100644 tests/src/Forms/FieldTest.php create mode 100644 tests/src/Forms/Fixtures/Livewire.php create mode 100644 tests/src/Forms/GridTest.php create mode 100644 tests/src/Forms/HiddenComponentsTest.php create mode 100644 tests/src/Forms/StateBindingModifiersTest.php create mode 100644 tests/src/Forms/StateTest.php create mode 100644 tests/src/Forms/ValidationTest.php create mode 100644 tests/src/Models/Post.php create mode 100644 tests/src/Models/User.php create mode 100644 tests/src/TestCase.php create mode 100644 webpack.mix.js diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000000..b0a1de9de5 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,15 @@ +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 diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000000..4df58a127d --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +github: [danharrin] diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000000..5b8d0fe47a --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,74 @@ +name: Bug report +description: Create a report to help us improve +labels: bug,unconfirmed +body: + - type: markdown + attributes: + value: | + Before opening a bug report, please search for the behaviour in the existing issues. + + --- + + Thank you for taking the time to file a bug report. To address this bug as fast as possible, we need some information. + - type: dropdown + id: package + attributes: + label: Package + description: Which package is this bug report for? + options: + - filament/filament + - filament/forms + - filament/tables + - filament/spatie-laravel-media-library-plugin + - filament/spatie-tags-plugin + - Other + validations: + required: true + - type: input + id: package-version + attributes: + label: Package Version + description: "Please provide the full version of your package you have installed." + placeholder: "v2.0.0" + validations: + required: true + - type: input + id: laravel-version + attributes: + label: Laravel Version + description: "Please provide the full Laravel version of your project." + placeholder: "v8.0.0" + validations: + required: true + - type: input + id: livewire-version + attributes: + label: Livewire Version + description: "Please provide the full Livewire version of your project, if applicable." + placeholder: "v2.0.0" + - type: input + id: php-version + attributes: + label: PHP Version + description: "Please provide the full PHP version of your server." + placeholder: "PHP 8.0.0" + validations: + required: true + - type: textarea + id: description + attributes: + label: Bug description + description: What happened? + validations: + required: true + - type: textarea + id: steps + attributes: + label: Steps to reproduce + description: Which steps do we need to take to reproduce this error? + - type: textarea + id: logs + attributes: + label: Relevant log output + description: If applicable, provide relevant log output. No need for backticks here. + render: shell diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000000..5714abcbfb --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,11 @@ +blank_issues_enabled: false +contact_links: + - name: Feature request + url: https://github.com/laravel-filament/filament/discussions/new + about: For ideas or feature requests + - name: Support questions & other + url: https://github.com/laravel-filament/filament/discussions/new + about: If you have a question or need help installing using the package + - name: Discord + url: https://discord.gg/livewire + about: We are partnered with the Laravel Livewire Discord server. For quick help, ask questions in the Filament channel. diff --git a/.github/workflows/php-cs-fixer.yml b/.github/workflows/php-cs-fixer.yml new file mode 100644 index 0000000000..f126dc804f --- /dev/null +++ b/.github/workflows/php-cs-fixer.yml @@ -0,0 +1,21 @@ +name: php-cs-fixer + +on: push + +jobs: + php-cs-fixer: + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v2 + with: + ref: ${{ github.head_ref }} + - name: Run PHP CS Fixer + uses: docker://oskarstark/php-cs-fixer-ga + with: + args: --config=.php-cs-fixer.dist.php --allow-risky=yes + - name: Commit changes + uses: stefanzweifel/git-auto-commit-action@v4 + with: + commit_message: > + chore: styling diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 0000000000..d607ec25a7 --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,38 @@ +name: tests + +on: + push: + pull_request: + +jobs: + run-tests: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + php: [ 8.1, 8.0 ] + laravel: [ 8.* ] + dependency-version: [ prefer-stable ] + include: + - laravel: 8.* + testbench: 6.* + name: P${{ matrix.php }} - L${{ matrix.laravel }} - ${{ matrix.dependency-version }} + steps: + - uses: actions/checkout@v2 + - name: Cache dependencies + uses: actions/cache@v2 + with: + path: ~/.composer/cache/files + key: dependencies-laravel-${{ matrix.laravel }}-php-${{ matrix.php }}-composer-${{ hashFiles('composer.json') }} + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php }} + extensions: mbstring, pdo, pdo_sqlite + coverage: none + - name: Install dependencies + run: | + composer require "laravel/framework:${{ matrix.laravel }}" "orchestra/testbench:${{ matrix.testbench }}" --no-interaction --no-update + composer update --${{ matrix.dependency-version }} --prefer-dist --no-interaction --no-suggest + - name: Execute tests + run: ./vendor/bin/pest --verbose diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..816b93942b --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +/.idea +/build +/coverage +/node_modules +/vendor +/.vscode +.DS_Store +.php-cs-fixer.cache +.phpunit.result.cache +composer.phar +Thumbs.db +phpunit.xml diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php new file mode 100644 index 0000000000..195b60881c --- /dev/null +++ b/.php-cs-fixer.dist.php @@ -0,0 +1,40 @@ +in([ + __DIR__ . '/packages', + __DIR__ . '/tests', + ]) + ->name('*.php') + ->notName('*.blade.php') + ->ignoreDotFiles(true) + ->ignoreVCS(true); + +return (new PhpCsFixer\Config()) + ->setRules([ + '@PSR12' => true, + 'array_syntax' => ['syntax' => 'short'], + 'ordered_imports' => ['sort_algorithm' => 'alpha'], + 'no_unused_imports' => true, + 'not_operator_with_successor_space' => true, + 'trailing_comma_in_multiline' => true, + 'phpdoc_scalar' => true, + 'unary_operator_spaces' => true, + 'binary_operator_spaces' => true, + 'blank_line_before_statement' => [ + 'statements' => ['break', 'continue', 'declare', 'return', 'throw', 'try'], + ], + 'phpdoc_single_line_var_spacing' => true, + 'phpdoc_var_without_name' => true, + 'class_attributes_separation' => [ + 'elements' => [ + 'method' => 'one', + ], + ], + 'method_argument_space' => [ + 'on_multiline' => 'ensure_fully_multiline', + 'keep_multiple_spaces_after_comma' => true, + ], + 'single_trait_insert_per_statement' => true, + ]) + ->setFinder($finder); diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000000..e74ed9ff35 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,6 @@ +{ + "trailingComma": "es5", + "tabWidth": 4, + "semi": false, + "singleQuote": true +} diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000000..e2f0ffef4b --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,76 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or + advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting Ryan Scherler at ryan@eastslope.studio. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see +https://www.contributor-covenant.org/faq diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000000..8c1a801a4c --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,21 @@ +# MIT License + +Copyright (c) Filament + +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. diff --git a/README.md b/README.md new file mode 100644 index 0000000000..c4e029e715 --- /dev/null +++ b/README.md @@ -0,0 +1,64 @@ +

+ Banner +

+ +

+ Tests passing + Laravel v8.x + Livewire v2.x + PHP 8.0 +

+ +Filament is a collection of tools for rapidly building beautiful TALL stack interfaces, designed for humans. + +## Packages + +### Admin Panel • [Documentation](https://filamentadmin.com/docs/admin) + +```bash +composer require filament/filament +``` + +### Form Builder • [Documentation](https://filamentadmin.com/docs/forms) + +```bash +composer require filament/forms +``` + +### Table Builder • [Documentation](https://filamentadmin.com/docs/tables) + +```bash +composer require filament/tables +``` + +### spatie/laravel-medialibrary Plugin • [Documentation](https://filamentadmin.com/docs/spatie-laravel-media-library-plugin) + +```bash +composer require filament/spatie-laravel-media-library-plugin +``` + +### spatie/laravel-settings Plugin • [Documentation](https://filamentadmin.com/docs/spatie-laravel-settings-plugin) + +```bash +composer require filament/spatie-laravel-settings-plugin +``` + +### spatie/laravel-tags Plugin • [Documentation](https://filamentadmin.com/docs/spatie-laravel-tags-plugin) + +```bash +composer require filament/spatie-laravel-tags-plugin +``` + +### spatie/laravel-translatable Plugin • [Documentation](https://filamentadmin.com/docs/spatie-laravel-translatable-plugin) + +```bash +composer require filament/spatie-laravel-translatable-plugin +``` + +## Need Help? + +🐞 If you spot a bug, please [submit a detailed issue](https://github.com/laravel-filament/filament/issues/new), and wait for assistance. + +🤔 If you have a question or feature request, please [start a new discussion](https://github.com/laravel-filament/filament/discussions/new). We also have a [Discord community](https://discord.gg/cpqnMTHZja). For quick help, ask questions in the appropriate package help channel. + +🔐 If you discover a vulnerability, please review our [security policy](https://github.com/laravel-filament/filament/blob/2.x/SECURITY.md). diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000000..d9451e9307 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,12 @@ +# Security Policy + +## Supported Versions + +| Version | Supported | +| ------- | ------------------ | +| 1.x | :white_check_mark: | +| 2.x | :white_check_mark: | + +## Reporting a Vulnerability + +If you discover a security vulnerability within Filament, please email Dan Harrin via [dan@danharrin.com](mailto:dan@danharrin.com). All security vulnerabilities will be promptly addressed. diff --git a/bin/build.js b/bin/build.js new file mode 100644 index 0000000000..d3a63f029a --- /dev/null +++ b/bin/build.js @@ -0,0 +1,26 @@ +const esbuild = require('esbuild') +const shouldWatch = process.argv.includes('--watch') + +esbuild.build({ + define: { + 'process.env.NODE_ENV': shouldWatch ? `'production'` : `'development'`, + }, + entryPoints: ['packages/forms/resources/js/index.js'], + outfile: 'packages/forms/dist/module.esm.js', + bundle: true, + platform: 'neutral', + mainFields: ['module'], + watch: shouldWatch, +}).catch(() => process.exit(1)) + +esbuild.build({ + define: { + 'process.env.NODE_ENV': shouldWatch ? `'production'` : `'development'`, + }, + entryPoints: ['packages/forms/resources/js/index.js'], + outfile: 'packages/admin/dist/module.esm.js', + bundle: true, + platform: 'neutral', + mainFields: ['module'], + watch: shouldWatch, +}).catch(() => process.exit(1)) diff --git a/bin/tailwind.config.js b/bin/tailwind.config.js new file mode 100644 index 0000000000..8927acf6b2 --- /dev/null +++ b/bin/tailwind.config.js @@ -0,0 +1,24 @@ +const colors = require('tailwindcss/colors') + +module.exports = { + mode: 'jit', + purge: [ + './resources/**/*.blade.php', + '../forms/resources/**/*.blade.php', + '../tables/resources/**/*.blade.php', + ], + theme: { + extend: { + colors: { + danger: colors.rose, + primary: colors.blue, + success: colors.green, + warning: colors.yellow, + }, + }, + }, + plugins: [ + require('@tailwindcss/forms'), + require('@tailwindcss/typography'), + ], +} diff --git a/composer.json b/composer.json new file mode 100644 index 0000000000..d010d227ff --- /dev/null +++ b/composer.json @@ -0,0 +1,47 @@ +{ + "name": "filament/filament", + "description": "The elegant TALL stack admin panel for Laravel artisans.", + "license": "MIT", + "require": { + "php": "^8.0" + }, + "require-dev": { + "blade-ui-kit/blade-heroicons": "^1.2", + "danharrin/livewire-rate-limiting": "^0.3.0", + "laravel/ui": "^3.3", + "livewire/livewire": "^2.5", + "orchestra/testbench": "^6.0", + "pestphp/pest": "^1.17", + "pestphp/pest-plugin-livewire": "^1.0", + "pestphp/pest-plugin-parallel": "^0.3", + "phpstan/phpstan": "^0.12", + "spatie/laravel-package-tools": "^1.9", + "symplify/monorepo-builder": "^9.0" + }, + "autoload-dev": { + "files": [ + "packages/admin/src/helpers.php" + ], + "psr-4": { + "Filament\\": [ + "packages/admin/src", + "packages/spatie-laravel-media-library-plugin/src", + "packages/spatie-laravel-settings-plugin/src", + "packages/spatie-laravel-tags-plugin/src", + "packages/spatie-laravel-translatable-plugin/src" + ], + "Filament\\Forms\\": "packages/forms/src", + "Filament\\Tables\\": "packages/tables/src", + "Filament\\Tests\\": "tests/src", + "Filament\\Tests\\Database\\Factories\\": "tests/database/factories" + } + }, + "config": { + "sort-packages": true + }, + "scripts": { + "test": "./vendor/bin/pest --parallel" + }, + "minimum-stability": "dev", + "prefer-stable": true +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000000..98fd37bf44 --- /dev/null +++ b/composer.lock @@ -0,0 +1,8855 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "1db1dde1fe5ef036d27508e4b4b984b5", + "packages": [], + "packages-dev": [ + { + "name": "blade-ui-kit/blade-heroicons", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/blade-ui-kit/blade-heroicons.git", + "reference": "8c614b98ec27177509cb37023d04f6eb8d1d8d97" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/blade-ui-kit/blade-heroicons/zipball/8c614b98ec27177509cb37023d04f6eb8d1d8d97", + "reference": "8c614b98ec27177509cb37023d04f6eb8d1d8d97", + "shasum": "" + }, + "require": { + "blade-ui-kit/blade-icons": "^1.1", + "illuminate/support": "^8.0", + "php": "^7.4|^8.0" + }, + "require-dev": { + "orchestra/testbench": "^6.0", + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "BladeUI\\Heroicons\\BladeHeroiconsServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "BladeUI\\Heroicons\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dries Vints", + "homepage": "https://driesvints.com" + } + ], + "description": "A package to easily make use of Heroicons in your Laravel Blade views.", + "homepage": "https://github.com/blade-ui-kit/blade-heroicons", + "keywords": [ + "Heroicons", + "blade", + "laravel" + ], + "support": { + "issues": "https://github.com/blade-ui-kit/blade-heroicons/issues", + "source": "https://github.com/blade-ui-kit/blade-heroicons/tree/1.2.1" + }, + "funding": [ + { + "url": "https://github.com/caneco", + "type": "github" + }, + { + "url": "https://github.com/driesvints", + "type": "github" + } + ], + "time": "2021-12-05T17:15:57+00:00" + }, + { + "name": "blade-ui-kit/blade-icons", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/blade-ui-kit/blade-icons.git", + "reference": "548869bc820a25f803530c82028482aefe08115f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/blade-ui-kit/blade-icons/zipball/548869bc820a25f803530c82028482aefe08115f", + "reference": "548869bc820a25f803530c82028482aefe08115f", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^8.0", + "illuminate/filesystem": "^8.0", + "illuminate/support": "^8.0", + "illuminate/view": "^8.0", + "php": "^7.4|^8.0", + "symfony/console": "^5.3", + "symfony/finder": "^5.3" + }, + "require-dev": { + "mockery/mockery": "^1.3", + "orchestra/testbench": "^6.0", + "phpunit/phpunit": "^9.0" + }, + "bin": [ + "bin/blade-icons-generate" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "BladeUI\\Icons\\BladeIconsServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "BladeUI\\Icons\\": "src" + }, + "files": [ + "src/helpers.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dries Vints", + "homepage": "https://driesvints.com" + } + ], + "description": "A package to easily make use of icons in your Laravel Blade views.", + "homepage": "https://github.com/blade-ui-kit/blade-icons", + "keywords": [ + "blade", + "icons", + "laravel", + "svg" + ], + "support": { + "issues": "https://github.com/blade-ui-kit/blade-icons/issues", + "source": "https://github.com/blade-ui-kit/blade-icons" + }, + "funding": [ + { + "url": "https://github.com/caneco", + "type": "github" + }, + { + "url": "https://github.com/driesvints", + "type": "github" + } + ], + "time": "2021-08-11T10:09:06+00:00" + }, + { + "name": "brianium/paratest", + "version": "v6.4.1", + "source": { + "type": "git", + "url": "https://github.com/paratestphp/paratest.git", + "reference": "c32a5c4fc2ff339202437d25d19a5f496f880d61" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/paratestphp/paratest/zipball/c32a5c4fc2ff339202437d25d19a5f496f880d61", + "reference": "c32a5c4fc2ff339202437d25d19a5f496f880d61", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-simplexml": "*", + "php": "^7.3 || ^8.0", + "phpunit/php-code-coverage": "^9.2.9", + "phpunit/php-file-iterator": "^3.0.5", + "phpunit/php-timer": "^5.0.3", + "phpunit/phpunit": "^9.5.10", + "sebastian/environment": "^5.1.3", + "symfony/console": "^5.4.0 || ^6.0.0", + "symfony/process": "^5.4.0 || ^6.0.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9.0.0", + "ekino/phpstan-banned-code": "^0.5.0", + "ergebnis/phpstan-rules": "^0.15.3", + "ext-posix": "*", + "infection/infection": "^0.25.3", + "malukenho/mcbumpface": "^1.1.5", + "phpstan/phpstan": "^0.12.99", + "phpstan/phpstan-deprecation-rules": "^0.12.6", + "phpstan/phpstan-phpunit": "^0.12.22", + "phpstan/phpstan-strict-rules": "^0.12.11", + "squizlabs/php_codesniffer": "^3.6.1", + "symfony/filesystem": "^v5.4.0", + "thecodingmachine/phpstan-strict-rules": "^v0.12.2", + "vimeo/psalm": "^4.13.1" + }, + "bin": [ + "bin/paratest" + ], + "type": "library", + "autoload": { + "psr-4": { + "ParaTest\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Scaturro", + "email": "scaturrob@gmail.com", + "role": "Developer" + }, + { + "name": "Filippo Tessarotto", + "email": "zoeslam@gmail.com", + "role": "Developer" + } + ], + "description": "Parallel testing for PHP", + "homepage": "https://github.com/paratestphp/paratest", + "keywords": [ + "concurrent", + "parallel", + "phpunit", + "testing" + ], + "support": { + "issues": "https://github.com/paratestphp/paratest/issues", + "source": "https://github.com/paratestphp/paratest/tree/v6.4.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/Slamdunk", + "type": "github" + }, + { + "url": "https://paypal.me/filippotessarotto", + "type": "paypal" + } + ], + "time": "2021-12-02T09:12:23+00:00" + }, + { + "name": "brick/math", + "version": "0.9.3", + "source": { + "type": "git", + "url": "https://github.com/brick/math.git", + "reference": "ca57d18f028f84f777b2168cd1911b0dee2343ae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/brick/math/zipball/ca57d18f028f84f777b2168cd1911b0dee2343ae", + "reference": "ca57d18f028f84f777b2168cd1911b0dee2343ae", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.0", + "vimeo/psalm": "4.9.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Brick\\Math\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Arbitrary-precision arithmetic library", + "keywords": [ + "Arbitrary-precision", + "BigInteger", + "BigRational", + "arithmetic", + "bigdecimal", + "bignum", + "brick", + "math" + ], + "support": { + "issues": "https://github.com/brick/math/issues", + "source": "https://github.com/brick/math/tree/0.9.3" + }, + "funding": [ + { + "url": "https://github.com/BenMorel", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/brick/math", + "type": "tidelift" + } + ], + "time": "2021-08-15T20:50:18+00:00" + }, + { + "name": "danharrin/livewire-rate-limiting", + "version": "v0.3.0", + "source": { + "type": "git", + "url": "https://github.com/danharrin/livewire-rate-limiting.git", + "reference": "c97041cd4f94168d5077d4463062e681d057e00a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/danharrin/livewire-rate-limiting/zipball/c97041cd4f94168d5077d4463062e681d057e00a", + "reference": "c97041cd4f94168d5077d4463062e681d057e00a", + "shasum": "" + }, + "require": { + "illuminate/support": "^8.0", + "php": "^7.2|^8.0" + }, + "require-dev": { + "livewire/livewire": "^2.3", + "orchestra/testbench": "^6.2", + "phpunit/phpunit": "^9.4", + "symplify/monorepo-builder": "^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "DanHarrin\\LivewireRateLimiting\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dan Harrin", + "email": "dan@danharrin.com" + } + ], + "description": "Apply rate limiters to Laravel Livewire actions.", + "homepage": "https://github.com/danharrin/livewire-rate-limiting", + "support": { + "issues": "https://github.com/danharrin/livewire-rate-limiting/issues", + "source": "https://github.com/danharrin/livewire-rate-limiting" + }, + "funding": [ + { + "url": "https://github.com/danharrin", + "type": "github" + } + ], + "time": "2021-05-17T08:01:19+00:00" + }, + { + "name": "dflydev/dot-access-data", + "version": "v3.0.1", + "source": { + "type": "git", + "url": "https://github.com/dflydev/dflydev-dot-access-data.git", + "reference": "0992cc19268b259a39e86f296da5f0677841f42c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dflydev/dflydev-dot-access-data/zipball/0992cc19268b259a39e86f296da5f0677841f42c", + "reference": "0992cc19268b259a39e86f296da5f0677841f42c", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.42", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.3", + "scrutinizer/ocular": "1.6.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^3.14" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Dflydev\\DotAccessData\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dragonfly Development Inc.", + "email": "info@dflydev.com", + "homepage": "http://dflydev.com" + }, + { + "name": "Beau Simensen", + "email": "beau@dflydev.com", + "homepage": "http://beausimensen.com" + }, + { + "name": "Carlos Frutos", + "email": "carlos@kiwing.it", + "homepage": "https://github.com/cfrutos" + }, + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com" + } + ], + "description": "Given a deep data structure, access data by dot notation.", + "homepage": "https://github.com/dflydev/dflydev-dot-access-data", + "keywords": [ + "access", + "data", + "dot", + "notation" + ], + "support": { + "issues": "https://github.com/dflydev/dflydev-dot-access-data/issues", + "source": "https://github.com/dflydev/dflydev-dot-access-data/tree/v3.0.1" + }, + "time": "2021-08-13T13:06:58+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89", + "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^8.2", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpstan/phpstan-strict-rules": "^0.12", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "vimeo/psalm": "^4.10" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.4" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2021-10-22T20:16:43+00:00" + }, + { + "name": "doctrine/instantiator", + "version": "1.4.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/d56bf6102915de5702778fe20f2de3b2fe570b5b", + "reference": "d56bf6102915de5702778fe20f2de3b2fe570b5b", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^8.0", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^0.13 || 1.0.0-alpha2", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/1.4.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2020-11-10T18:47:58+00:00" + }, + { + "name": "doctrine/lexer", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042", + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "phpstan/phpstan": "^0.11.8", + "phpunit/phpunit": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/1.2.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2020-05-25T17:44:05+00:00" + }, + { + "name": "dragonmantank/cron-expression", + "version": "v3.1.0", + "source": { + "type": "git", + "url": "https://github.com/dragonmantank/cron-expression.git", + "reference": "7a8c6e56ab3ffcc538d05e8155bb42269abf1a0c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/7a8c6e56ab3ffcc538d05e8155bb42269abf1a0c", + "reference": "7a8c6e56ab3ffcc538d05e8155bb42269abf1a0c", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0", + "webmozart/assert": "^1.7.0" + }, + "replace": { + "mtdowling/cron-expression": "^1.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-webmozart-assert": "^0.12.7", + "phpunit/phpunit": "^7.0|^8.0|^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cron\\": "src/Cron/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Tankersley", + "email": "chris@ctankersley.com", + "homepage": "https://github.com/dragonmantank" + } + ], + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], + "support": { + "issues": "https://github.com/dragonmantank/cron-expression/issues", + "source": "https://github.com/dragonmantank/cron-expression/tree/v3.1.0" + }, + "funding": [ + { + "url": "https://github.com/dragonmantank", + "type": "github" + } + ], + "time": "2020-11-24T19:55:57+00:00" + }, + { + "name": "egulias/email-validator", + "version": "2.1.25", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/0dbf5d78455d4d6a41d186da50adc1122ec066f4", + "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^1.0.1", + "php": ">=5.5", + "symfony/polyfill-intl-idn": "^1.10" + }, + "require-dev": { + "dominicsayers/isemail": "^3.0.7", + "phpunit/phpunit": "^4.8.36|^7.5.15", + "satooshi/php-coveralls": "^1.0.1" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/2.1.25" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2020-12-29T14:50:06+00:00" + }, + { + "name": "facade/ignition-contracts", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/facade/ignition-contracts.git", + "reference": "3c921a1cdba35b68a7f0ccffc6dffc1995b18267" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/facade/ignition-contracts/zipball/3c921a1cdba35b68a7f0ccffc6dffc1995b18267", + "reference": "3c921a1cdba35b68a7f0ccffc6dffc1995b18267", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^v2.15.8", + "phpunit/phpunit": "^9.3.11", + "vimeo/psalm": "^3.17.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Facade\\IgnitionContracts\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://flareapp.io", + "role": "Developer" + } + ], + "description": "Solution contracts for Ignition", + "homepage": "https://github.com/facade/ignition-contracts", + "keywords": [ + "contracts", + "flare", + "ignition" + ], + "support": { + "issues": "https://github.com/facade/ignition-contracts/issues", + "source": "https://github.com/facade/ignition-contracts/tree/1.0.2" + }, + "time": "2020-10-16T08:27:54+00:00" + }, + { + "name": "fakerphp/faker", + "version": "v1.17.0", + "source": { + "type": "git", + "url": "https://github.com/FakerPHP/Faker.git", + "reference": "b85e9d44eae8c52cca7aa0939483611f7232b669" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/b85e9d44eae8c52cca7aa0939483611f7232b669", + "reference": "b85e9d44eae8c52cca7aa0939483611f7232b669", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "psr/container": "^1.0 || ^2.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "conflict": { + "fzaninotto/faker": "*" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "ext-intl": "*", + "symfony/phpunit-bridge": "^4.4 || ^5.2" + }, + "suggest": { + "ext-curl": "Required by Faker\\Provider\\Image to download images.", + "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.", + "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.", + "ext-mbstring": "Required for multibyte Unicode string functionality." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "v1.17-dev" + } + }, + "autoload": { + "psr-4": { + "Faker\\": "src/Faker/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "support": { + "issues": "https://github.com/FakerPHP/Faker/issues", + "source": "https://github.com/FakerPHP/Faker/tree/v1.17.0" + }, + "time": "2021-12-05T17:14:47+00:00" + }, + { + "name": "filp/whoops", + "version": "2.14.4", + "source": { + "type": "git", + "url": "https://github.com/filp/whoops.git", + "reference": "f056f1fe935d9ed86e698905a957334029899895" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filp/whoops/zipball/f056f1fe935d9ed86e698905a957334029899895", + "reference": "f056f1fe935d9ed86e698905a957334029899895", + "shasum": "" + }, + "require": { + "php": "^5.5.9 || ^7.0 || ^8.0", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "require-dev": { + "mockery/mockery": "^0.9 || ^1.0", + "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.3", + "symfony/var-dumper": "^2.6 || ^3.0 || ^4.0 || ^5.0" + }, + "suggest": { + "symfony/var-dumper": "Pretty print complex values better with var-dumper available", + "whoops/soap": "Formats errors as SOAP responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.7-dev" + } + }, + "autoload": { + "psr-4": { + "Whoops\\": "src/Whoops/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Filipe Dobreira", + "homepage": "https://github.com/filp", + "role": "Developer" + } + ], + "description": "php error handling for cool kids", + "homepage": "https://filp.github.io/whoops/", + "keywords": [ + "error", + "exception", + "handling", + "library", + "throwable", + "whoops" + ], + "support": { + "issues": "https://github.com/filp/whoops/issues", + "source": "https://github.com/filp/whoops/tree/2.14.4" + }, + "funding": [ + { + "url": "https://github.com/denis-sokolov", + "type": "github" + } + ], + "time": "2021-10-03T12:00:00+00:00" + }, + { + "name": "graham-campbell/result-type", + "version": "v1.0.4", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "0690bde05318336c7221785f2a932467f98b64ca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/0690bde05318336c7221785f2a932467f98b64ca", + "reference": "0690bde05318336c7221785f2a932467f98b64ca", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "phpoption/phpoption": "^1.8" + }, + "require-dev": { + "phpunit/phpunit": "^6.5.14 || ^7.5.20 || ^8.5.19 || ^9.5.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.0.4" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2021-11-21T21:41:47+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "089edd38f5b8abba6cb01567c2a8aaa47cec4c72" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/089edd38f5b8abba6cb01567c2a8aaa47cec4c72", + "reference": "089edd38f5b8abba6cb01567c2a8aaa47cec4c72", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^8.5.8 || ^9.3.10" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.1.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2021-10-06T17:43:30+00:00" + }, + { + "name": "hamcrest/hamcrest-php", + "version": "v2.0.1", + "source": { + "type": "git", + "url": "https://github.com/hamcrest/hamcrest-php.git", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "shasum": "" + }, + "require": { + "php": "^5.3|^7.0|^8.0" + }, + "replace": { + "cordoval/hamcrest-php": "*", + "davedevelopment/hamcrest-php": "*", + "kodova/hamcrest-php": "*" + }, + "require-dev": { + "phpunit/php-file-iterator": "^1.4 || ^2.0", + "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "classmap": [ + "hamcrest" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "description": "This is the PHP port of Hamcrest Matchers", + "keywords": [ + "test" + ], + "support": { + "issues": "https://github.com/hamcrest/hamcrest-php/issues", + "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.0.1" + }, + "time": "2020-07-09T08:09:16+00:00" + }, + { + "name": "laravel/framework", + "version": "v8.74.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/framework.git", + "reference": "004ea195012d5132eca07a176a6e587c6a74815e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/framework/zipball/004ea195012d5132eca07a176a6e587c6a74815e", + "reference": "004ea195012d5132eca07a176a6e587c6a74815e", + "shasum": "" + }, + "require": { + "doctrine/inflector": "^1.4|^2.0", + "dragonmantank/cron-expression": "^3.0.2", + "egulias/email-validator": "^2.1.10", + "ext-json": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "laravel/serializable-closure": "^1.0", + "league/commonmark": "^1.3|^2.0.2", + "league/flysystem": "^1.1", + "monolog/monolog": "^2.0", + "nesbot/carbon": "^2.53.1", + "opis/closure": "^3.6", + "php": "^7.3|^8.0", + "psr/container": "^1.0", + "psr/log": "^1.0 || ^2.0", + "psr/simple-cache": "^1.0", + "ramsey/uuid": "^4.2.2", + "swiftmailer/swiftmailer": "^6.3", + "symfony/console": "^5.4", + "symfony/error-handler": "^5.4", + "symfony/finder": "^5.4", + "symfony/http-foundation": "^5.4", + "symfony/http-kernel": "^5.4", + "symfony/mime": "^5.4", + "symfony/process": "^5.4", + "symfony/routing": "^5.4", + "symfony/var-dumper": "^5.4", + "tijsverkoyen/css-to-inline-styles": "^2.2.2", + "vlucas/phpdotenv": "^5.2", + "voku/portable-ascii": "^1.4.8" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "provide": { + "psr/container-implementation": "1.0", + "psr/simple-cache-implementation": "1.0" + }, + "replace": { + "illuminate/auth": "self.version", + "illuminate/broadcasting": "self.version", + "illuminate/bus": "self.version", + "illuminate/cache": "self.version", + "illuminate/collections": "self.version", + "illuminate/config": "self.version", + "illuminate/console": "self.version", + "illuminate/container": "self.version", + "illuminate/contracts": "self.version", + "illuminate/cookie": "self.version", + "illuminate/database": "self.version", + "illuminate/encryption": "self.version", + "illuminate/events": "self.version", + "illuminate/filesystem": "self.version", + "illuminate/hashing": "self.version", + "illuminate/http": "self.version", + "illuminate/log": "self.version", + "illuminate/macroable": "self.version", + "illuminate/mail": "self.version", + "illuminate/notifications": "self.version", + "illuminate/pagination": "self.version", + "illuminate/pipeline": "self.version", + "illuminate/queue": "self.version", + "illuminate/redis": "self.version", + "illuminate/routing": "self.version", + "illuminate/session": "self.version", + "illuminate/support": "self.version", + "illuminate/testing": "self.version", + "illuminate/translation": "self.version", + "illuminate/validation": "self.version", + "illuminate/view": "self.version" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.198.1", + "doctrine/dbal": "^2.13.3|^3.1.4", + "filp/whoops": "^2.14.3", + "guzzlehttp/guzzle": "^6.5.5|^7.0.1", + "league/flysystem-cached-adapter": "^1.0", + "mockery/mockery": "^1.4.4", + "orchestra/testbench-core": "^6.27", + "pda/pheanstalk": "^4.0", + "phpunit/phpunit": "^8.5.19|^9.5.8", + "predis/predis": "^1.1.9", + "symfony/cache": "^5.4" + }, + "suggest": { + "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage and SES mail driver (^3.198.1).", + "brianium/paratest": "Required to run tests in parallel (^6.0).", + "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.13.3|^3.1.4).", + "ext-bcmath": "Required to use the multiple_of validation rule.", + "ext-ftp": "Required to use the Flysystem FTP driver.", + "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", + "ext-memcached": "Required to use the memcache cache driver.", + "ext-pcntl": "Required to use all features of the queue worker.", + "ext-posix": "Required to use all features of the queue worker.", + "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0).", + "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", + "filp/whoops": "Required for friendly error pages in development (^2.14.3).", + "guzzlehttp/guzzle": "Required to use the HTTP Client, Mailgun mail driver and the ping methods on schedules (^6.5.5|^7.0.1).", + "laravel/tinker": "Required to use the tinker console command (^2.0).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^1.0).", + "league/flysystem-cached-adapter": "Required to use the Flysystem cache (^1.0).", + "league/flysystem-sftp": "Required to use the Flysystem SFTP driver (^1.0).", + "mockery/mockery": "Required to use mocking (^1.4.4).", + "nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (^4.0).", + "phpunit/phpunit": "Required to use assertions and run tests (^8.5.19|^9.5.8).", + "predis/predis": "Required to use the predis connector (^1.1.9).", + "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", + "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^4.0|^5.0|^6.0|^7.0).", + "symfony/cache": "Required to PSR-6 cache bridge (^5.4).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^5.4).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^2.0).", + "wildbit/swiftmailer-postmark": "Required to use Postmark mail driver (^3.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "files": [ + "src/Illuminate/Collections/helpers.php", + "src/Illuminate/Events/functions.php", + "src/Illuminate/Foundation/helpers.php", + "src/Illuminate/Support/helpers.php" + ], + "psr-4": { + "Illuminate\\": "src/Illuminate/", + "Illuminate\\Support\\": [ + "src/Illuminate/Macroable/", + "src/Illuminate/Collections/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Laravel Framework.", + "homepage": "https://laravel.com", + "keywords": [ + "framework", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-11-30T15:26:05+00:00" + }, + { + "name": "laravel/serializable-closure", + "version": "v1.0.5", + "source": { + "type": "git", + "url": "https://github.com/laravel/serializable-closure.git", + "reference": "25de3be1bca1b17d52ff0dc02b646c667ac7266c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/25de3be1bca1b17d52ff0dc02b646c667ac7266c", + "reference": "25de3be1bca1b17d52ff0dc02b646c667ac7266c", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "pestphp/pest": "^1.18", + "phpstan/phpstan": "^0.12.98", + "symfony/var-dumper": "^5.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\SerializableClosure\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "nuno@laravel.com" + } + ], + "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", + "keywords": [ + "closure", + "laravel", + "serializable" + ], + "support": { + "issues": "https://github.com/laravel/serializable-closure/issues", + "source": "https://github.com/laravel/serializable-closure" + }, + "time": "2021-11-30T15:53:04+00:00" + }, + { + "name": "laravel/ui", + "version": "v3.4.0", + "source": { + "type": "git", + "url": "https://github.com/laravel/ui.git", + "reference": "b3e804559bf3973ecca160a4ae1068e6c7c167c6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/ui/zipball/b3e804559bf3973ecca160a4ae1068e6c7c167c6", + "reference": "b3e804559bf3973ecca160a4ae1068e6c7c167c6", + "shasum": "" + }, + "require": { + "illuminate/console": "^8.42|^9.0", + "illuminate/filesystem": "^8.42|^9.0", + "illuminate/support": "^8.42|^9.0", + "illuminate/validation": "^8.42|^9.0", + "php": "^7.3|^8.0" + }, + "require-dev": { + "orchestra/testbench": "^6.23|^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Ui\\UiServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Ui\\": "src/", + "Illuminate\\Foundation\\Auth\\": "auth-backend/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Laravel UI utilities and presets.", + "keywords": [ + "laravel", + "ui" + ], + "support": { + "source": "https://github.com/laravel/ui/tree/v3.4.0" + }, + "time": "2021-11-30T16:22:00+00:00" + }, + { + "name": "league/commonmark", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "819276bc54e83c160617d3ac0a436c239e479928" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/819276bc54e83c160617d3ac0a436c239e479928", + "reference": "819276bc54e83c160617d3ac0a436c239e479928", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "league/config": "^1.1.1", + "php": "^7.4 || ^8.0", + "psr/event-dispatcher": "^1.0", + "symfony/polyfill-php80": "^1.15" + }, + "require-dev": { + "cebe/markdown": "^1.0", + "commonmark/cmark": "0.30.0", + "commonmark/commonmark.js": "0.30.0", + "composer/package-versions-deprecated": "^1.8", + "erusev/parsedown": "^1.0", + "ext-json": "*", + "github/gfm": "0.29.0", + "michelf/php-markdown": "^1.4", + "phpstan/phpstan": "^0.12.88 || ^1.0.0", + "phpunit/phpunit": "^9.5.5", + "scrutinizer/ocular": "^1.8.1", + "symfony/finder": "^5.3", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0", + "unleashedtech/php-coding-standard": "^3.1", + "vimeo/psalm": "^4.7.3" + }, + "suggest": { + "symfony/yaml": "v2.3+ required if using the Front Matter extension" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.2-dev" + } + }, + "autoload": { + "psr-4": { + "League\\CommonMark\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)", + "homepage": "https://commonmark.thephpleague.com", + "keywords": [ + "commonmark", + "flavored", + "gfm", + "github", + "github-flavored", + "markdown", + "md", + "parser" + ], + "support": { + "docs": "https://commonmark.thephpleague.com/", + "forum": "https://github.com/thephpleague/commonmark/discussions", + "issues": "https://github.com/thephpleague/commonmark/issues", + "rss": "https://github.com/thephpleague/commonmark/releases.atom", + "source": "https://github.com/thephpleague/commonmark" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/commonmark", + "type": "tidelift" + } + ], + "time": "2021-12-05T18:25:20+00:00" + }, + { + "name": "league/config", + "version": "v1.1.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/config.git", + "reference": "a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/config/zipball/a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e", + "reference": "a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e", + "shasum": "" + }, + "require": { + "dflydev/dot-access-data": "^3.0.1", + "nette/schema": "^1.2", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.90", + "phpunit/phpunit": "^9.5.5", + "scrutinizer/ocular": "^1.8.1", + "unleashedtech/php-coding-standard": "^3.1", + "vimeo/psalm": "^4.7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Config\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Define configuration arrays with strict schemas and access values with dot notation", + "homepage": "https://config.thephpleague.com", + "keywords": [ + "array", + "config", + "configuration", + "dot", + "dot-access", + "nested", + "schema" + ], + "support": { + "docs": "https://config.thephpleague.com/", + "issues": "https://github.com/thephpleague/config/issues", + "rss": "https://github.com/thephpleague/config/releases.atom", + "source": "https://github.com/thephpleague/config" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + } + ], + "time": "2021-08-14T12:15:32+00:00" + }, + { + "name": "league/flysystem", + "version": "1.1.8", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "c995bb0c23c58c9813d081f9523c9b7bb496698e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/c995bb0c23c58c9813d081f9523c9b7bb496698e", + "reference": "c995bb0c23c58c9813d081f9523c9b7bb496698e", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "league/mime-type-detection": "^1.3", + "php": "^7.2.5 || ^8.0" + }, + "conflict": { + "league/flysystem-sftp": "<1.0.6" + }, + "require-dev": { + "phpspec/prophecy": "^1.11.1", + "phpunit/phpunit": "^8.5.8" + }, + "suggest": { + "ext-ftp": "Allows you to use FTP server storage", + "ext-openssl": "Allows you to use FTPS server storage", + "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2", + "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3", + "league/flysystem-azure": "Allows you to use Windows Azure Blob storage", + "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching", + "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem", + "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files", + "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib", + "league/flysystem-webdav": "Allows you to use WebDAV storage", + "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter", + "spatie/flysystem-dropbox": "Allows you to use Dropbox storage", + "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frenky.net" + } + ], + "description": "Filesystem abstraction: Many filesystems, one API.", + "keywords": [ + "Cloud Files", + "WebDAV", + "abstraction", + "aws", + "cloud", + "copy.com", + "dropbox", + "file systems", + "files", + "filesystem", + "filesystems", + "ftp", + "rackspace", + "remote", + "s3", + "sftp", + "storage" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem/issues", + "source": "https://github.com/thephpleague/flysystem/tree/1.1.8" + }, + "funding": [ + { + "url": "https://offset.earth/frankdejonge", + "type": "other" + } + ], + "time": "2021-11-28T21:50:23+00:00" + }, + { + "name": "league/mime-type-detection", + "version": "1.9.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "aa70e813a6ad3d1558fc927863d47309b4c23e69" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/aa70e813a6ad3d1558fc927863d47309b4c23e69", + "reference": "aa70e813a6ad3d1558fc927863d47309b4c23e69", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^3.2", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\MimeTypeDetection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Mime-type detection for Flysystem", + "support": { + "issues": "https://github.com/thephpleague/mime-type-detection/issues", + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.9.0" + }, + "funding": [ + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2021-11-21T11:48:40+00:00" + }, + { + "name": "livewire/livewire", + "version": "v2.8.1", + "source": { + "type": "git", + "url": "https://github.com/livewire/livewire.git", + "reference": "0f846a93369109e445f0e5009741b1e19e6fa6f6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/livewire/livewire/zipball/0f846a93369109e445f0e5009741b1e19e6fa6f6", + "reference": "0f846a93369109e445f0e5009741b1e19e6fa6f6", + "shasum": "" + }, + "require": { + "illuminate/database": "^7.0|^8.0", + "illuminate/support": "^7.0|^8.0", + "illuminate/validation": "^7.0|^8.0", + "php": "^7.2.5|^8.0", + "symfony/http-kernel": "^5.0" + }, + "require-dev": { + "calebporzio/sushi": "^2.1", + "laravel/framework": "^7.0|^8.0", + "mockery/mockery": "^1.3.1", + "orchestra/testbench": "^5.0|^6.0", + "orchestra/testbench-dusk": "^5.2|^6.0", + "phpunit/phpunit": "^8.4|^9.0", + "psy/psysh": "@stable" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Livewire\\LivewireServiceProvider" + ], + "aliases": { + "Livewire": "Livewire\\Livewire" + } + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Livewire\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Caleb Porzio", + "email": "calebporzio@gmail.com" + } + ], + "description": "A front-end framework for Laravel.", + "support": { + "issues": "https://github.com/livewire/livewire/issues", + "source": "https://github.com/livewire/livewire/tree/v2.8.1" + }, + "funding": [ + { + "url": "https://github.com/livewire", + "type": "github" + } + ], + "time": "2021-12-02T01:31:26+00:00" + }, + { + "name": "mockery/mockery", + "version": "1.4.4", + "source": { + "type": "git", + "url": "https://github.com/mockery/mockery.git", + "reference": "e01123a0e847d52d186c5eb4b9bf58b0c6d00346" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mockery/mockery/zipball/e01123a0e847d52d186c5eb4b9bf58b0c6d00346", + "reference": "e01123a0e847d52d186c5eb4b9bf58b0c6d00346", + "shasum": "" + }, + "require": { + "hamcrest/hamcrest-php": "^2.0.1", + "lib-pcre": ">=7.0", + "php": "^7.3 || ^8.0" + }, + "conflict": { + "phpunit/phpunit": "<8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.5 || ^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.4.x-dev" + } + }, + "autoload": { + "psr-0": { + "Mockery": "library/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Pádraic Brady", + "email": "padraic.brady@gmail.com", + "homepage": "http://blog.astrumfutura.com" + }, + { + "name": "Dave Marshall", + "email": "dave.marshall@atstsolutions.co.uk", + "homepage": "http://davedevelopment.co.uk" + } + ], + "description": "Mockery is a simple yet flexible PHP mock object framework", + "homepage": "https://github.com/mockery/mockery", + "keywords": [ + "BDD", + "TDD", + "library", + "mock", + "mock objects", + "mockery", + "stub", + "test", + "test double", + "testing" + ], + "support": { + "issues": "https://github.com/mockery/mockery/issues", + "source": "https://github.com/mockery/mockery/tree/1.4.4" + }, + "time": "2021-09-13T15:28:59+00:00" + }, + { + "name": "monolog/monolog", + "version": "2.3.5", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "fd4380d6fc37626e2f799f29d91195040137eba9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/fd4380d6fc37626e2f799f29d91195040137eba9", + "reference": "fd4380d6fc37626e2f799f29d91195040137eba9", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7", + "graylog2/gelf-php": "^1.4.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "php-console/php-console": "^3.1.3", + "phpspec/prophecy": "^1.6.1", + "phpstan/phpstan": "^0.12.91", + "phpunit/phpunit": "^8.5", + "predis/predis": "^1.1", + "rollbar/rollbar": "^1.3", + "ruflin/elastica": ">=0.90@dev", + "swiftmailer/swiftmailer": "^5.3|^6.0" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "php-console/php-console": "Allow sending log messages to Google Chrome", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/2.3.5" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2021-10-01T21:08:31+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.10.2", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/776f831124e9c62e1a2c601ecc52e776d8bb7220", + "reference": "776f831124e9c62e1a2c601ecc52e776d8bb7220", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "replace": { + "myclabs/deep-copy": "self.version" + }, + "require-dev": { + "doctrine/collections": "^1.0", + "doctrine/common": "^2.6", + "phpunit/phpunit": "^7.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + }, + "files": [ + "src/DeepCopy/deep_copy.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.10.2" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2020-11-13T09:40:50+00:00" + }, + { + "name": "nesbot/carbon", + "version": "2.55.2", + "source": { + "type": "git", + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "8c2a18ce3e67c34efc1b29f64fe61304368259a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/8c2a18ce3e67c34efc1b29f64fe61304368259a2", + "reference": "8c2a18ce3e67c34efc1b29f64fe61304368259a2", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.1.8 || ^8.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" + }, + "require-dev": { + "doctrine/dbal": "^2.0 || ^3.0", + "doctrine/orm": "^2.7", + "friendsofphp/php-cs-fixer": "^3.0", + "kylekatarnls/multi-tester": "^2.0", + "phpmd/phpmd": "^2.9", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12.54", + "phpunit/phpunit": "^7.5.20 || ^8.5.14", + "squizlabs/php_codesniffer": "^3.4" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-3.x": "3.x-dev", + "dev-master": "2.x-dev" + }, + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "docs": "https://carbon.nesbot.com/docs", + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon" + }, + "funding": [ + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "time": "2021-12-03T14:59:52+00:00" + }, + { + "name": "nette/schema", + "version": "v1.2.2", + "source": { + "type": "git", + "url": "https://github.com/nette/schema.git", + "reference": "9a39cef03a5b34c7de64f551538cbba05c2be5df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/schema/zipball/9a39cef03a5b34c7de64f551538cbba05c2be5df", + "reference": "9a39cef03a5b34c7de64f551538cbba05c2be5df", + "shasum": "" + }, + "require": { + "nette/utils": "^2.5.7 || ^3.1.5 || ^4.0", + "php": ">=7.1 <8.2" + }, + "require-dev": { + "nette/tester": "^2.3 || ^2.4", + "phpstan/phpstan-nette": "^0.12", + "tracy/tracy": "^2.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "📐 Nette Schema: validating data structures against a given Schema.", + "homepage": "https://nette.org", + "keywords": [ + "config", + "nette" + ], + "support": { + "issues": "https://github.com/nette/schema/issues", + "source": "https://github.com/nette/schema/tree/v1.2.2" + }, + "time": "2021-10-15T11:40:02+00:00" + }, + { + "name": "nette/utils", + "version": "v3.2.6", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "2f261e55bd6a12057442045bf2c249806abc1d02" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/2f261e55bd6a12057442045bf2c249806abc1d02", + "reference": "2f261e55bd6a12057442045bf2c249806abc1d02", + "shasum": "" + }, + "require": { + "php": ">=7.2 <8.2" + }, + "conflict": { + "nette/di": "<3.0.6" + }, + "require-dev": { + "nette/tester": "~2.0", + "phpstan/phpstan": "^1.0", + "tracy/tracy": "^2.3" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()", + "ext-xml": "to use Strings::length() etc. when mbstring is not available" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "support": { + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v3.2.6" + }, + "time": "2021-11-24T15:47:23+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v4.13.2", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "210577fe3cf7badcc5814d99455df46564f3c077" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/210577fe3cf7badcc5814d99455df46564f3c077", + "reference": "210577fe3cf7badcc5814d99455df46564f3c077", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.0" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.13.2" + }, + "time": "2021-11-30T19:35:32+00:00" + }, + { + "name": "nunomaduro/collision", + "version": "v5.10.0", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/collision.git", + "reference": "3004cfa49c022183395eabc6d0e5207dfe498d00" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/3004cfa49c022183395eabc6d0e5207dfe498d00", + "reference": "3004cfa49c022183395eabc6d0e5207dfe498d00", + "shasum": "" + }, + "require": { + "facade/ignition-contracts": "^1.0", + "filp/whoops": "^2.14.3", + "php": "^7.3 || ^8.0", + "symfony/console": "^5.0" + }, + "require-dev": { + "brianium/paratest": "^6.1", + "fideloper/proxy": "^4.4.1", + "fruitcake/laravel-cors": "^2.0.3", + "laravel/framework": "8.x-dev", + "nunomaduro/larastan": "^0.6.2", + "nunomaduro/mock-final-classes": "^1.0", + "orchestra/testbench": "^6.0", + "phpstan/phpstan": "^0.12.64", + "phpunit/phpunit": "^9.5.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "NunoMaduro\\Collision\\Adapters\\Laravel\\CollisionServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "NunoMaduro\\Collision\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Cli error handling for console/command-line PHP applications.", + "keywords": [ + "artisan", + "cli", + "command-line", + "console", + "error", + "handling", + "laravel", + "laravel-zero", + "php", + "symfony" + ], + "support": { + "issues": "https://github.com/nunomaduro/collision/issues", + "source": "https://github.com/nunomaduro/collision" + }, + "funding": [ + { + "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2021-09-20T15:06:32+00:00" + }, + { + "name": "opis/closure", + "version": "3.6.2", + "source": { + "type": "git", + "url": "https://github.com/opis/closure.git", + "reference": "06e2ebd25f2869e54a306dda991f7db58066f7f6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/opis/closure/zipball/06e2ebd25f2869e54a306dda991f7db58066f7f6", + "reference": "06e2ebd25f2869e54a306dda991f7db58066f7f6", + "shasum": "" + }, + "require": { + "php": "^5.4 || ^7.0 || ^8.0" + }, + "require-dev": { + "jeremeamia/superclosure": "^2.0", + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.6.x-dev" + } + }, + "autoload": { + "psr-4": { + "Opis\\Closure\\": "src/" + }, + "files": [ + "functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marius Sarca", + "email": "marius.sarca@gmail.com" + }, + { + "name": "Sorin Sarca", + "email": "sarca_sorin@hotmail.com" + } + ], + "description": "A library that can be used to serialize closures (anonymous functions) and arbitrary objects.", + "homepage": "https://opis.io/closure", + "keywords": [ + "anonymous functions", + "closure", + "function", + "serializable", + "serialization", + "serialize" + ], + "support": { + "issues": "https://github.com/opis/closure/issues", + "source": "https://github.com/opis/closure/tree/3.6.2" + }, + "time": "2021-04-09T13:42:10+00:00" + }, + { + "name": "orchestra/testbench", + "version": "v6.23.1", + "source": { + "type": "git", + "url": "https://github.com/orchestral/testbench.git", + "reference": "c4c1e420ec0fd60ab149aca0ced194911a46b928" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/orchestral/testbench/zipball/c4c1e420ec0fd60ab149aca0ced194911a46b928", + "reference": "c4c1e420ec0fd60ab149aca0ced194911a46b928", + "shasum": "" + }, + "require": { + "laravel/framework": "^8.71", + "mockery/mockery": "^1.4.4", + "orchestra/testbench-core": "^6.27.3", + "php": "^7.3 || ^8.0", + "phpunit/phpunit": "^8.5.21 || ^9.5.10", + "spatie/laravel-ray": "^1.26.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.0-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mior Muhammad Zaki", + "email": "crynobone@gmail.com", + "homepage": "https://github.com/crynobone" + } + ], + "description": "Laravel Testing Helper for Packages Development", + "homepage": "https://packages.tools/testbench/", + "keywords": [ + "BDD", + "TDD", + "laravel", + "orchestra-platform", + "orchestral", + "testing" + ], + "support": { + "issues": "https://github.com/orchestral/testbench/issues", + "source": "https://github.com/orchestral/testbench/tree/v6.23.1" + }, + "funding": [ + { + "url": "https://paypal.me/crynobone", + "type": "custom" + }, + { + "url": "https://liberapay.com/crynobone", + "type": "liberapay" + } + ], + "time": "2021-12-03T22:47:04+00:00" + }, + { + "name": "orchestra/testbench-core", + "version": "v6.27.3", + "source": { + "type": "git", + "url": "https://github.com/orchestral/testbench-core.git", + "reference": "86867f7853e49a8f516951aa4e303230ebce40ac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/orchestral/testbench-core/zipball/86867f7853e49a8f516951aa4e303230ebce40ac", + "reference": "86867f7853e49a8f516951aa4e303230ebce40ac", + "shasum": "" + }, + "require": { + "fakerphp/faker": "^1.9.1", + "php": "^7.3 || ^8.0", + "symfony/yaml": "^5.0", + "vlucas/phpdotenv": "^5.1" + }, + "require-dev": { + "laravel/framework": "^8.71", + "laravel/laravel": "8.x-dev", + "mockery/mockery": "^1.4.4", + "orchestra/canvas": "^6.1", + "phpunit/phpunit": "^8.5.21 || ^9.5.10 || ^10.0", + "spatie/laravel-ray": "^1.7.1", + "symfony/process": "^5.0" + }, + "suggest": { + "laravel/framework": "Required for testing (^8.71).", + "mockery/mockery": "Allow using Mockery for testing (^1.4.4).", + "orchestra/testbench-browser-kit": "Allow using legacy Laravel BrowserKit for testing (^6.0).", + "orchestra/testbench-dusk": "Allow using Laravel Dusk for testing (^6.0).", + "phpunit/phpunit": "Allow using PHPUnit for testing (^8.5.21|^9.5.10|^10.0)." + }, + "bin": [ + "testbench" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.0-dev" + } + }, + "autoload": { + "psr-4": { + "Orchestra\\Testbench\\": "src/" + }, + "files": [ + "src/helpers.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mior Muhammad Zaki", + "email": "crynobone@gmail.com", + "homepage": "https://github.com/crynobone" + } + ], + "description": "Testing Helper for Laravel Development", + "homepage": "https://packages.tools/testbench", + "keywords": [ + "BDD", + "TDD", + "laravel", + "orchestra-platform", + "orchestral", + "testing" + ], + "support": { + "issues": "https://github.com/orchestral/testbench/issues", + "source": "https://github.com/orchestral/testbench-core" + }, + "funding": [ + { + "url": "https://paypal.me/crynobone", + "type": "custom" + }, + { + "url": "https://liberapay.com/crynobone", + "type": "liberapay" + } + ], + "time": "2021-12-03T22:38:19+00:00" + }, + { + "name": "pestphp/pest", + "version": "v1.21.1", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest.git", + "reference": "92b8d32ef78c54c915641999e0c4167d7202b2d9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest/zipball/92b8d32ef78c54c915641999e0c4167d7202b2d9", + "reference": "92b8d32ef78c54c915641999e0c4167d7202b2d9", + "shasum": "" + }, + "require": { + "nunomaduro/collision": "^5.4.0|^6.0", + "pestphp/pest-plugin": "^1.0.0", + "php": "^7.3 || ^8.0", + "phpunit/phpunit": "^9.5.5" + }, + "require-dev": { + "illuminate/console": "^8.47.0", + "illuminate/support": "^8.47.0", + "laravel/dusk": "^6.15.0", + "pestphp/pest-dev-tools": "dev-master", + "pestphp/pest-plugin-parallel": "^1.0" + }, + "bin": [ + "bin/pest" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + }, + "pest": { + "plugins": [ + "Pest\\Plugins\\Coverage", + "Pest\\Plugins\\Init", + "Pest\\Plugins\\Version", + "Pest\\Plugins\\Environment" + ] + }, + "laravel": { + "providers": [ + "Pest\\Laravel\\PestServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Pest\\": "src/" + }, + "files": [ + "src/Functions.php", + "src/Pest.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "An elegant PHP Testing Framework.", + "keywords": [ + "framework", + "pest", + "php", + "test", + "testing", + "unit" + ], + "support": { + "issues": "https://github.com/pestphp/pest/issues", + "source": "https://github.com/pestphp/pest/tree/v1.21.1" + }, + "funding": [ + { + "url": "https://www.paypal.com/paypalme/enunomaduro", + "type": "custom" + }, + { + "url": "https://github.com/lukeraymonddowning", + "type": "github" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://github.com/octoper", + "type": "github" + }, + { + "url": "https://github.com/olivernybroe", + "type": "github" + }, + { + "url": "https://github.com/owenvoke", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2021-11-25T16:44:17+00:00" + }, + { + "name": "pestphp/pest-plugin", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin.git", + "reference": "fc8519de148699fe612d9c669be60554cd2db4fa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin/zipball/fc8519de148699fe612d9c669be60554cd2db4fa", + "reference": "fc8519de148699fe612d9c669be60554cd2db4fa", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.1 || ^2.0", + "php": "^7.3 || ^8.0" + }, + "conflict": { + "pestphp/pest": "<1.0" + }, + "require-dev": { + "composer/composer": "^1.10.19", + "pestphp/pest": "^1.0", + "pestphp/pest-dev-tools": "dev-master" + }, + "type": "composer-plugin", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + }, + "class": "Pest\\Plugin\\Manager" + }, + "autoload": { + "psr-4": { + "Pest\\Plugin\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The Pest plugin manager", + "keywords": [ + "framework", + "manager", + "pest", + "php", + "plugin", + "test", + "testing", + "unit" + ], + "support": { + "source": "https://github.com/pestphp/pest-plugin/tree/v1.0.0" + }, + "funding": [ + { + "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2021-01-03T15:53:42+00:00" + }, + { + "name": "pestphp/pest-plugin-livewire", + "version": "v1.0.0", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin-livewire.git", + "reference": "30e259e57c18dd40402e7fd29d46344a6cb9ff03" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin-livewire/zipball/30e259e57c18dd40402e7fd29d46344a6cb9ff03", + "reference": "30e259e57c18dd40402e7fd29d46344a6cb9ff03", + "shasum": "" + }, + "require": { + "livewire/livewire": "^1.2|^2.0", + "pestphp/pest": "^1.0", + "php": "^7.3|^8.0" + }, + "require-dev": { + "orchestra/testbench": "^6.4", + "pestphp/pest-dev-tools": "dev-master" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Pest\\Livewire\\": "src/" + }, + "files": [ + "src/Autoload.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The Pest Livewire Plugin", + "keywords": [ + "framework", + "livewire", + "pest", + "php", + "plugin", + "test", + "testing", + "unit" + ], + "support": { + "source": "https://github.com/pestphp/pest-plugin-livewire/tree/v1.0.0" + }, + "funding": [ + { + "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L", + "type": "custom" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2021-01-03T15:37:46+00:00" + }, + { + "name": "pestphp/pest-plugin-parallel", + "version": "v0.3.1", + "source": { + "type": "git", + "url": "https://github.com/pestphp/pest-plugin-parallel.git", + "reference": "67c0a49754e26cbe5ecd6965631351c0ede956fa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/pestphp/pest-plugin-parallel/zipball/67c0a49754e26cbe5ecd6965631351c0ede956fa", + "reference": "67c0a49754e26cbe5ecd6965631351c0ede956fa", + "shasum": "" + }, + "require": { + "brianium/paratest": "^6.3", + "pestphp/pest-plugin": "^1.0", + "php": "^7.3 || ^8.0" + }, + "conflict": { + "laravel/framework": "<8.55", + "nunomaduro/collision": "<5.8", + "pestphp/pest": "<1.16" + }, + "require-dev": { + "pestphp/pest": "dev-master", + "pestphp/pest-dev-tools": "dev-master" + }, + "type": "library", + "extra": { + "pest": { + "plugins": [ + "Pest\\Parallel\\Plugin" + ] + }, + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Pest\\Parallel\\": "src/" + }, + "exclude-from-classmap": [ + "ParaTest\\Runners\\PHPUnit\\Worker\\RunnerWorker", + "ParaTest\\Runners\\PHPUnit\\BaseRunner" + ], + "files": [ + "src/Autoload.php", + "build/RunnerWorker.php", + "build/BaseRunner.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "The Pest Parallel Plugin", + "keywords": [ + "framework", + "parallel", + "pest", + "php", + "plugin", + "test", + "testing", + "unit" + ], + "support": { + "source": "https://github.com/pestphp/pest-plugin-parallel/tree/v0.3.1" + }, + "funding": [ + { + "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L", + "type": "custom" + }, + { + "url": "https://github.com/lukeraymonddowning", + "type": "github" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://github.com/octoper", + "type": "github" + }, + { + "url": "https://github.com/olivernybroe", + "type": "github" + }, + { + "url": "https://github.com/owenvoke", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2021-09-06T20:21:59+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.3" + }, + "time": "2021-07-20T11:28:43+00:00" + }, + { + "name": "phar-io/version", + "version": "3.1.0", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "bae7c545bef187884426f042434e561ab1ddb182" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/bae7c545bef187884426f042434e561ab1ddb182", + "reference": "bae7c545bef187884426f042434e561ab1ddb182", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.1.0" + }, + "time": "2021-02-23T14:00:09+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, + "time": "2020-06-27T09:03:43+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "5.3.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^1.3", + "webmozart/assert": "^1.9.1" + }, + "require-dev": { + "mockery/mockery": "~1.3.2", + "psalm/phar": "^4.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + }, + { + "name": "Jaap van Otterdijk", + "email": "account@ijaap.nl" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" + }, + "time": "2021-10-19T17:43:47+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.5.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "a12f7e301eb7258bb68acd89d4aefa05c2906cae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/a12f7e301eb7258bb68acd89d4aefa05c2906cae", + "reference": "a12f7e301eb7258bb68acd89d4aefa05c2906cae", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.0" + }, + "require-dev": { + "ext-tokenizer": "*", + "psalm/phar": "^4.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.5.1" + }, + "time": "2021-10-02T14:08:47+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.8.1", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "eab7a0df01fe2344d172bff4cd6dbd3f8b84ad15" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/eab7a0df01fe2344d172bff4cd6dbd3f8b84ad15", + "reference": "eab7a0df01fe2344d172bff4cd6dbd3f8b84ad15", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "phpunit/phpunit": "^6.5.14 || ^7.5.20 || ^8.5.19 || ^9.5.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8-dev" + } + }, + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.8.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2021-12-04T23:24:31+00:00" + }, + { + "name": "phpspec/prophecy", + "version": "1.14.0", + "source": { + "type": "git", + "url": "https://github.com/phpspec/prophecy.git", + "reference": "d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e", + "reference": "d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.2", + "php": "^7.2 || ~8.0, <8.2", + "phpdocumentor/reflection-docblock": "^5.2", + "sebastian/comparator": "^3.0 || ^4.0", + "sebastian/recursion-context": "^3.0 || ^4.0" + }, + "require-dev": { + "phpspec/phpspec": "^6.0 || ^7.0", + "phpunit/phpunit": "^8.0 || ^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Prophecy\\": "src/Prophecy" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + }, + { + "name": "Marcello Duarte", + "email": "marcello.duarte@gmail.com" + } + ], + "description": "Highly opinionated mocking framework for PHP 5.3+", + "homepage": "https://github.com/phpspec/prophecy", + "keywords": [ + "Double", + "Dummy", + "fake", + "mock", + "spy", + "stub" + ], + "support": { + "issues": "https://github.com/phpspec/prophecy/issues", + "source": "https://github.com/phpspec/prophecy/tree/1.14.0" + }, + "time": "2021-09-10T09:02:12+00:00" + }, + { + "name": "phpstan/phpstan", + "version": "0.12.99", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan.git", + "reference": "b4d40f1d759942f523be267a1bab6884f46ca3f7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/b4d40f1d759942f523be267a1bab6884f46ca3f7", + "reference": "b4d40f1d759942f523be267a1bab6884f46ca3f7", + "shasum": "" + }, + "require": { + "php": "^7.1|^8.0" + }, + "conflict": { + "phpstan/phpstan-shim": "*" + }, + "bin": [ + "phpstan", + "phpstan.phar" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.12-dev" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPStan - PHP Static Analysis Tool", + "support": { + "issues": "https://github.com/phpstan/phpstan/issues", + "source": "https://github.com/phpstan/phpstan/tree/0.12.99" + }, + "funding": [ + { + "url": "https://github.com/ondrejmirtes", + "type": "github" + }, + { + "url": "https://github.com/phpstan", + "type": "github" + }, + { + "url": "https://www.patreon.com/phpstan", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", + "type": "tidelift" + } + ], + "time": "2021-09-12T20:09:55+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "9.2.10", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "d5850aaf931743067f4bfc1ae4cbd06468400687" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/d5850aaf931743067f4bfc1ae4cbd06468400687", + "reference": "d5850aaf931743067f4bfc1ae4cbd06468400687", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.13.0", + "php": ">=7.3", + "phpunit/php-file-iterator": "^3.0.3", + "phpunit/php-text-template": "^2.0.2", + "sebastian/code-unit-reverse-lookup": "^2.0.2", + "sebastian/complexity": "^2.0", + "sebastian/environment": "^5.1.2", + "sebastian/lines-of-code": "^1.0.3", + "sebastian/version": "^3.0.1", + "theseer/tokenizer": "^1.2.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcov": "*", + "ext-xdebug": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.10" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-12-05T09:12:13+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "3.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-12-02T12:48:52+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:58:55+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T05:33:50+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "5.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:16:10+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "9.5.10", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "c814a05837f2edb0d1471d6e3f4ab3501ca3899a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c814a05837f2edb0d1471d6e3f4ab3501ca3899a", + "reference": "c814a05837f2edb0d1471d6e3f4ab3501ca3899a", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.3.1", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.10.1", + "phar-io/manifest": "^2.0.3", + "phar-io/version": "^3.0.2", + "php": ">=7.3", + "phpspec/prophecy": "^1.12.1", + "phpunit/php-code-coverage": "^9.2.7", + "phpunit/php-file-iterator": "^3.0.5", + "phpunit/php-invoker": "^3.1.1", + "phpunit/php-text-template": "^2.0.3", + "phpunit/php-timer": "^5.0.2", + "sebastian/cli-parser": "^1.0.1", + "sebastian/code-unit": "^1.0.6", + "sebastian/comparator": "^4.0.5", + "sebastian/diff": "^4.0.3", + "sebastian/environment": "^5.1.3", + "sebastian/exporter": "^4.0.3", + "sebastian/global-state": "^5.0.1", + "sebastian/object-enumerator": "^4.0.3", + "sebastian/resource-operations": "^3.0.3", + "sebastian/type": "^2.3.4", + "sebastian/version": "^3.0.2" + }, + "require-dev": { + "ext-pdo": "*", + "phpspec/prophecy-phpunit": "^2.0.1" + }, + "suggest": { + "ext-soap": "*", + "ext-xdebug": "*" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.5-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ], + "files": [ + "src/Framework/Assert/Functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.10" + }, + "funding": [ + { + "url": "https://phpunit.de/donate.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-09-25T07:38:51+00:00" + }, + { + "name": "pimple/pimple", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/silexphp/Pimple.git", + "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/silexphp/Pimple/zipball/a94b3a4db7fb774b3d78dad2315ddc07629e1bed", + "reference": "a94b3a4db7fb774b3d78dad2315ddc07629e1bed", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1 || ^2.0" + }, + "require-dev": { + "symfony/phpunit-bridge": "^5.4@dev" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.4.x-dev" + } + }, + "autoload": { + "psr-0": { + "Pimple": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Pimple, a simple Dependency Injection Container", + "homepage": "https://pimple.symfony.com", + "keywords": [ + "container", + "dependency injection" + ], + "support": { + "source": "https://github.com/silexphp/Pimple/tree/v3.5.0" + }, + "time": "2021-10-28T11:13:42+00:00" + }, + { + "name": "psr/container", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.2" + }, + "time": "2021-11-05T16:50:12+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory/tree/master" + }, + "time": "2019-04-30T12:38:16+00:00" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/master" + }, + "time": "2016-08-06T14:39:51+00:00" + }, + { + "name": "psr/log", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/ef29f6d262798707a9edd554e2b82517ef3a9376", + "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/2.0.0" + }, + "time": "2021-07-14T16:41:46+00:00" + }, + { + "name": "psr/simple-cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/master" + }, + "time": "2017-10-23T01:57:42+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "ramsey/collection", + "version": "1.2.2", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "cccc74ee5e328031b15640b51056ee8d3bb66c0a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/cccc74ee5e328031b15640b51056ee8d3bb66c0a", + "reference": "cccc74ee5e328031b15640b51056ee8d3bb66c0a", + "shasum": "" + }, + "require": { + "php": "^7.3 || ^8", + "symfony/polyfill-php81": "^1.23" + }, + "require-dev": { + "captainhook/captainhook": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "ergebnis/composer-normalize": "^2.6", + "fakerphp/faker": "^1.5", + "hamcrest/hamcrest-php": "^2", + "jangregor/phpstan-prophecy": "^0.8", + "mockery/mockery": "^1.3", + "phpspec/prophecy-phpunit": "^2.0", + "phpstan/extension-installer": "^1", + "phpstan/phpstan": "^0.12.32", + "phpstan/phpstan-mockery": "^0.12.5", + "phpstan/phpstan-phpunit": "^0.12.11", + "phpunit/phpunit": "^8.5 || ^9", + "psy/psysh": "^0.10.4", + "slevomat/coding-standard": "^6.3", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP library for representing and manipulating collections.", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "support": { + "issues": "https://github.com/ramsey/collection/issues", + "source": "https://github.com/ramsey/collection/tree/1.2.2" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/collection", + "type": "tidelift" + } + ], + "time": "2021-10-10T03:01:02+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.2.3", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df", + "reference": "fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df", + "shasum": "" + }, + "require": { + "brick/math": "^0.8 || ^0.9", + "ext-json": "*", + "php": "^7.2 || ^8.0", + "ramsey/collection": "^1.0", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-php80": "^1.14" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "captainhook/captainhook": "^5.10", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "doctrine/annotations": "^1.8", + "ergebnis/composer-normalize": "^2.15", + "mockery/mockery": "^1.3", + "moontoast/math": "^1.1", + "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.2", + "php-mock/php-mock-mockery": "^1.3", + "php-parallel-lint/php-parallel-lint": "^1.1", + "phpbench/phpbench": "^1.0", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-mockery": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpunit/phpunit": "^8.5 || ^9", + "slevomat/coding-standard": "^7.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.9" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-ctype": "Enables faster processing of character classification using ctype functions.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.x-dev" + }, + "captainhook": { + "force-install": true + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Uuid\\": "src/" + }, + "files": [ + "src/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "support": { + "issues": "https://github.com/ramsey/uuid/issues", + "source": "https://github.com/ramsey/uuid/tree/4.2.3" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", + "type": "tidelift" + } + ], + "time": "2021-09-25T23:10:38+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:08:49+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "1.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:08:54+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:30:19+00:00" + }, + { + "name": "sebastian/comparator", + "version": "4.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "55f4261989e546dc112258c7a75935a81a7ce382" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382", + "reference": "55f4261989e546dc112258c7a75935a81a7ce382", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/diff": "^4.0", + "sebastian/exporter": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T15:49:45+00:00" + }, + { + "name": "sebastian/complexity", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", + "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.7", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T15:52:27+00:00" + }, + { + "name": "sebastian/diff", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:10:38+00:00" + }, + { + "name": "sebastian/environment", + "version": "5.1.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "388b6ced16caa751030f6a69e588299fa09200ac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/388b6ced16caa751030f6a69e588299fa09200ac", + "reference": "388b6ced16caa751030f6a69e588299fa09200ac", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:52:38+00:00" + }, + { + "name": "sebastian/exporter", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/65e8b7db476c5dd267e65eea9cab77584d3cfff9", + "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-11-11T14:18:36+00:00" + }, + { + "name": "sebastian/global-state", + "version": "5.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "23bd5951f7ff26f12d4e3242864df3e08dec4e49" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/23bd5951f7ff26f12d4e3242864df3e08dec4e49", + "reference": "23bd5951f7ff26f12d4e3242864df3e08dec4e49", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-06-11T13:31:12+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.6", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-28T06:42:11+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:12:34+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:14:26+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172", + "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:17:30+00:00" + }, + { + "name": "sebastian/resource-operations", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", + "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "support": { + "issues": "https://github.com/sebastianbergmann/resource-operations/issues", + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:45:17+00:00" + }, + { + "name": "sebastian/type", + "version": "2.3.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b8cd8a1c753c90bc1a0f5372170e3e489136f914", + "reference": "b8cd8a1c753c90bc1a0f5372170e3e489136f914", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/2.3.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-06-15T12:49:02+00:00" + }, + { + "name": "sebastian/version", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c6c1022351a901512170118436c764e473f6de8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", + "reference": "c6c1022351a901512170118436c764e473f6de8c", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:39:44+00:00" + }, + { + "name": "spatie/backtrace", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/backtrace.git", + "reference": "4ee7d41aa5268107906ea8a4d9ceccde136dbd5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/backtrace/zipball/4ee7d41aa5268107906ea8a4d9ceccde136dbd5b", + "reference": "4ee7d41aa5268107906ea8a4d9ceccde136dbd5b", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "ext-json": "*", + "phpunit/phpunit": "^9.3", + "symfony/var-dumper": "^5.1" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Backtrace\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van de Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A better backtrace", + "homepage": "https://github.com/spatie/backtrace", + "keywords": [ + "Backtrace", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/backtrace/issues", + "source": "https://github.com/spatie/backtrace/tree/1.2.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spatie", + "type": "github" + }, + { + "url": "https://spatie.be/open-source/support-us", + "type": "other" + } + ], + "time": "2021-11-09T10:57:15+00:00" + }, + { + "name": "spatie/laravel-package-tools", + "version": "1.9.2", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-package-tools.git", + "reference": "f710fe196c126fb9e0aee67eb5af49ad8f13f528" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/f710fe196c126fb9e0aee67eb5af49ad8f13f528", + "reference": "f710fe196c126fb9e0aee67eb5af49ad8f13f528", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^7.0|^8.0", + "php": "^7.4|^8.0" + }, + "require-dev": { + "mockery/mockery": "^1.4", + "orchestra/testbench": "^5.0|^6.0", + "phpunit/phpunit": "^9.3", + "spatie/test-time": "^1.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\LaravelPackageTools\\": "src", + "Spatie\\LaravelPackageTools\\Database\\Factories\\": "database/factories" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "role": "Developer" + } + ], + "description": "Tools for creating Laravel packages", + "homepage": "https://github.com/spatie/laravel-package-tools", + "keywords": [ + "laravel-package-tools", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/laravel-package-tools/issues", + "source": "https://github.com/spatie/laravel-package-tools/tree/1.9.2" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2021-09-21T13:06:51+00:00" + }, + { + "name": "spatie/laravel-ray", + "version": "1.26.3", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-ray.git", + "reference": "ec971959bc8e513cbfa1163e6af030cdaa5ce7bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-ray/zipball/ec971959bc8e513cbfa1163e6af030cdaa5ce7bf", + "reference": "ec971959bc8e513cbfa1163e6af030cdaa5ce7bf", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/contracts": "^7.20|^8.19", + "illuminate/database": "^7.20|^8.19", + "illuminate/queue": "^7.20|^8.19", + "illuminate/support": "^7.20|^8.19", + "php": "^7.3|^8.0", + "spatie/backtrace": "^1.0", + "spatie/ray": "^1.27.1", + "symfony/stopwatch": "4.2|^5.1", + "zbateson/mail-mime-parser": "^1.3.1|^2.0" + }, + "require-dev": { + "facade/ignition": "^2.5", + "guzzlehttp/guzzle": "^7.3", + "laravel/framework": "^7.20|^8.19", + "orchestra/testbench-core": "^5.0|^6.0", + "phpstan/phpstan": "^0.12.93", + "phpunit/phpunit": "^9.3", + "spatie/phpunit-snapshot-assertions": "^4.2" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\LaravelRay\\RayServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Spatie\\LaravelRay\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Easily debug Laravel apps", + "homepage": "https://github.com/spatie/laravel-ray", + "keywords": [ + "laravel-ray", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/laravel-ray/issues", + "source": "https://github.com/spatie/laravel-ray/tree/1.26.3" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spatie", + "type": "github" + }, + { + "url": "https://spatie.be/open-source/support-us", + "type": "other" + } + ], + "time": "2021-11-22T15:57:41+00:00" + }, + { + "name": "spatie/macroable", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/macroable.git", + "reference": "ec2c320f932e730607aff8052c44183cf3ecb072" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/macroable/zipball/ec2c320f932e730607aff8052c44183cf3ecb072", + "reference": "ec2c320f932e730607aff8052c44183cf3ecb072", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.0|^9.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Macroable\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "A trait to dynamically add methods to a class", + "homepage": "https://github.com/spatie/macroable", + "keywords": [ + "macroable", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/macroable/issues", + "source": "https://github.com/spatie/macroable/tree/2.0.0" + }, + "time": "2021-03-26T22:39:02+00:00" + }, + { + "name": "spatie/ray", + "version": "1.32.1", + "source": { + "type": "git", + "url": "https://github.com/spatie/ray.git", + "reference": "73baa5d216865480f0c67cac5cb4dedd1a00f4f1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/ray/zipball/73baa5d216865480f0c67cac5cb4dedd1a00f4f1", + "reference": "73baa5d216865480f0c67cac5cb4dedd1a00f4f1", + "shasum": "" + }, + "require": { + "ext-curl": "*", + "ext-json": "*", + "php": "^7.3|^8.0", + "ramsey/uuid": "^3.0|^4.1", + "spatie/backtrace": "^1.1", + "spatie/macroable": "^1.0|^2.0", + "symfony/stopwatch": "^4.0|^5.1", + "symfony/var-dumper": "^4.2|^5.1" + }, + "require-dev": { + "illuminate/support": "6.x|^8.18", + "nesbot/carbon": "^2.43", + "phpstan/phpstan": "^0.12.92", + "phpunit/phpunit": "^9.5", + "spatie/phpunit-snapshot-assertions": "^4.2", + "spatie/test-time": "^1.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Ray\\": "src" + }, + "files": [ + "src/helpers.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Debug with Ray to fix problems faster", + "homepage": "https://github.com/spatie/ray", + "keywords": [ + "ray", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/ray/issues", + "source": "https://github.com/spatie/ray/tree/1.32.1" + }, + "funding": [ + { + "url": "https://github.com/sponsors/spatie", + "type": "github" + }, + { + "url": "https://spatie.be/open-source/support-us", + "type": "other" + } + ], + "time": "2021-11-30T15:52:12+00:00" + }, + { + "name": "swiftmailer/swiftmailer", + "version": "v6.3.0", + "source": { + "type": "git", + "url": "https://github.com/swiftmailer/swiftmailer.git", + "reference": "8a5d5072dca8f48460fce2f4131fcc495eec654c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/8a5d5072dca8f48460fce2f4131fcc495eec654c", + "reference": "8a5d5072dca8f48460fce2f4131fcc495eec654c", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.0|^3.1", + "php": ">=7.0.0", + "symfony/polyfill-iconv": "^1.0", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "symfony/phpunit-bridge": "^4.4|^5.4" + }, + "suggest": { + "ext-intl": "Needed to support internationalized email addresses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.2-dev" + } + }, + "autoload": { + "files": [ + "lib/swift_required.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Corbyn" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Swiftmailer, free feature-rich PHP mailer", + "homepage": "https://swiftmailer.symfony.com", + "keywords": [ + "email", + "mail", + "mailer" + ], + "support": { + "issues": "https://github.com/swiftmailer/swiftmailer/issues", + "source": "https://github.com/swiftmailer/swiftmailer/tree/v6.3.0" + }, + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/swiftmailer/swiftmailer", + "type": "tidelift" + } + ], + "abandoned": "symfony/mailer", + "time": "2021-10-18T15:26:12+00:00" + }, + { + "name": "symfony/console", + "version": "v5.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "ec3661faca1d110d6c307e124b44f99ac54179e3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/ec3661faca1d110d6c307e124b44f99ac54179e3", + "reference": "ec3661faca1d110d6c307e124b44f99ac54179e3", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.8", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/string": "^5.1|^6.0" + }, + "conflict": { + "psr/log": ">=3", + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", + "symfony/lock": "<4.4", + "symfony/process": "<4.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/log": "^1|^2", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/lock": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v5.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-29T15:30:56+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v5.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "44b933f98bb4b5220d10bed9ce5662f8c2d13dcc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/44b933f98bb4b5220d10bed9ce5662f8c2d13dcc", + "reference": "44b933f98bb4b5220d10bed9ce5662f8c2d13dcc", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Converts CSS selectors to XPath expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/css-selector/tree/v5.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-09-09T08:06:01+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "c726b64c1ccfe2896cb7df2e1331c357ad1c8ced" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/c726b64c1ccfe2896cb7df2e1331c357ad1c8ced", + "reference": "c726b64c1ccfe2896cb7df2e1331c357ad1c8ced", + "shasum": "" + }, + "require": { + "php": ">=8.0.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.0.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-01T23:48:49+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v5.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "8433fa3145ac78df88b87a4a539118e950828126" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/8433fa3145ac78df88b87a4a539118e950828126", + "reference": "8433fa3145ac78df88b87a4a539118e950828126", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^4.4|^5.0|^6.0" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/http-kernel": "^4.4|^5.0|^6.0", + "symfony/serializer": "^4.4|^5.0|^6.0" + }, + "bin": [ + "Resources/bin/patch-type-declarations" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v5.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-29T15:30:56+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v6.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "2774908d5ae32fd94e363e7cbbd87462712c4576" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/2774908d5ae32fd94e363e7cbbd87462712c4576", + "reference": "2774908d5ae32fd94e363e7cbbd87462712c4576", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "symfony/event-dispatcher-contracts": "^2|^3" + }, + "conflict": { + "symfony/dependency-injection": "<5.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/error-handler": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/http-foundation": "^5.4|^6.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/stopwatch": "^5.4|^6.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v6.0.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-23T19:05:29+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "aa5422287b75594b90ee9cd807caf8f0df491385" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/aa5422287b75594b90ee9cd807caf8f0df491385", + "reference": "aa5422287b75594b90ee9cd807caf8f0df491385", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "psr/event-dispatcher": "^1" + }, + "suggest": { + "symfony/event-dispatcher-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.0.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-07-15T12:33:35+00:00" + }, + { + "name": "symfony/finder", + "version": "v5.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "d2f29dac98e96a98be467627bd49c2efb1bc2590" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/d2f29dac98e96a98be467627bd49c2efb1bc2590", + "reference": "d2f29dac98e96a98be467627bd49c2efb1bc2590", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v5.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-28T15:25:38+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v5.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "5ef86ac7927d2de08dc1e26eb91325f9ccbe6309" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/5ef86ac7927d2de08dc1e26eb91325f9ccbe6309", + "reference": "5ef86ac7927d2de08dc1e26eb91325f9ccbe6309", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "predis/predis": "~1.0", + "symfony/cache": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/mime": "^4.4|^5.0|^6.0" + }, + "suggest": { + "symfony/mime": "To use the file extension guesser" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v5.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-28T15:25:38+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v5.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "e012f16688bcb151e965473a70d8ebaa8b1d15ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/e012f16688bcb151e965473a70d8ebaa8b1d15ea", + "reference": "e012f16688bcb151e965473a70d8ebaa8b1d15ea", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/log": "^1|^2", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^5.0|^6.0", + "symfony/http-foundation": "^5.3.7|^6.0", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/browser-kit": "<5.4", + "symfony/cache": "<5.0", + "symfony/config": "<5.0", + "symfony/console": "<4.4", + "symfony/dependency-injection": "<5.3", + "symfony/doctrine-bridge": "<5.0", + "symfony/form": "<5.0", + "symfony/http-client": "<5.0", + "symfony/mailer": "<5.0", + "symfony/messenger": "<5.0", + "symfony/translation": "<5.0", + "symfony/twig-bridge": "<5.0", + "symfony/validator": "<5.0", + "twig/twig": "<2.13" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^5.4|^6.0", + "symfony/config": "^5.0|^6.0", + "symfony/console": "^4.4|^5.0|^6.0", + "symfony/css-selector": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^5.3|^6.0", + "symfony/dom-crawler": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/finder": "^4.4|^5.0|^6.0", + "symfony/http-client-contracts": "^1.1|^2|^3", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/routing": "^4.4|^5.0|^6.0", + "symfony/stopwatch": "^4.4|^5.0|^6.0", + "symfony/translation": "^4.4|^5.0|^6.0", + "symfony/translation-contracts": "^1.1|^2|^3", + "twig/twig": "^2.13|^3.0.4" + }, + "suggest": { + "symfony/browser-kit": "", + "symfony/config": "", + "symfony/console": "", + "symfony/dependency-injection": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a structured process for converting a Request into a Response", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v5.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-29T16:56:53+00:00" + }, + { + "name": "symfony/mime", + "version": "v5.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "d4365000217b67c01acff407573906ff91bcfb34" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/d4365000217b67c01acff407573906ff91bcfb34", + "reference": "d4365000217b67c01acff407573906ff91bcfb34", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/mailer": "<4.4" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/property-access": "^4.4|^5.1|^6.0", + "symfony/property-info": "^4.4|^5.1|^6.0", + "symfony/serializer": "^5.2|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v5.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-23T10:19:22+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-19T12:13:01+00:00" + }, + { + "name": "symfony/polyfill-iconv", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-iconv.git", + "reference": "63b5bb7db83e5673936d6e3b8b3e022ff6474933" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/63b5bb7db83e5673936d6e3b8b3e022ff6474933", + "reference": "63b5bb7db83e5673936d6e3b8b3e022ff6474933", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-iconv": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Iconv\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Iconv extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "iconv", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-iconv/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T09:27:20+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.23.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "16880ba9c5ebe3642d1995ab866db29270b36535" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/16880ba9c5ebe3642d1995ab866db29270b36535", + "reference": "16880ba9c5ebe3642d1995ab866db29270b36535", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T12:26:48+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/65bd267525e82759e7d8c4e8ceea44f398838e65", + "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php72": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T09:27:20+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-19T12:13:01+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.23.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6", + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T12:26:48+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "9a142215a36a3888e30d0a9eeea9766764e96976" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9a142215a36a3888e30d0a9eeea9766764e96976", + "reference": "9a142215a36a3888e30d0a9eeea9766764e96976", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php72/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T09:17:38+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-19T12:13:01+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.23.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be", + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-07-28T13:41:28+00:00" + }, + { + "name": "symfony/polyfill-php81", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "e66119f3de95efc359483f810c4c3e6436279436" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/e66119f3de95efc359483f810c4c3e6436279436", + "reference": "e66119f3de95efc359483f810c4c3e6436279436", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php81\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php81/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-21T13:25:03+00:00" + }, + { + "name": "symfony/process", + "version": "v5.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "5be20b3830f726e019162b26223110c8f47cf274" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/5be20b3830f726e019162b26223110c8f47cf274", + "reference": "5be20b3830f726e019162b26223110c8f47cf274", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v5.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-28T15:25:38+00:00" + }, + { + "name": "symfony/routing", + "version": "v5.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "9eeae93c32ca86746e5d38f3679e9569981038b1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/9eeae93c32ca86746e5d38f3679e9569981038b1", + "reference": "9eeae93c32ca86746e5d38f3679e9569981038b1", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "doctrine/annotations": "<1.12", + "symfony/config": "<5.3", + "symfony/dependency-injection": "<4.4", + "symfony/yaml": "<4.4" + }, + "require-dev": { + "doctrine/annotations": "^1.12", + "psr/log": "^1|^2|^3", + "symfony/config": "^5.3|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/http-foundation": "^4.4|^5.0|^6.0", + "symfony/yaml": "^4.4|^5.0|^6.0" + }, + "suggest": { + "symfony/config": "For using the all-in-one router or any loader", + "symfony/expression-language": "For using expression matching", + "symfony/http-foundation": "For using a Symfony Request object", + "symfony/yaml": "For using the YAML loader" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Maps an HTTP request to a set of configuration variables", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "support": { + "source": "https://github.com/symfony/routing/tree/v5.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-23T10:19:22+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v2.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "d664541b99d6fb0247ec5ff32e87238582236204" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d664541b99d6fb0247ec5ff32e87238582236204", + "reference": "d664541b99d6fb0247ec5ff32e87238582236204", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v2.4.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-04T16:37:19+00:00" + }, + { + "name": "symfony/stopwatch", + "version": "v5.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/stopwatch.git", + "reference": "208ef96122bfed82a8f3a61458a07113a08bdcfe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/208ef96122bfed82a8f3a61458a07113a08bdcfe", + "reference": "208ef96122bfed82a8f3a61458a07113a08bdcfe", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/service-contracts": "^1|^2|^3" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Stopwatch\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a way to profile code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/stopwatch/tree/v5.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-23T10:19:22+00:00" + }, + { + "name": "symfony/string", + "version": "v6.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "ba727797426af0f587f4800566300bdc0cda0777" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/ba727797426af0f587f4800566300bdc0cda0777", + "reference": "ba727797426af0f587f4800566300bdc0cda0777", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.0" + }, + "require-dev": { + "symfony/error-handler": "^5.4|^6.0", + "symfony/http-client": "^5.4|^6.0", + "symfony/translation-contracts": "^2.0|^3.0", + "symfony/var-exporter": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "files": [ + "Resources/functions.php" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v6.0.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-29T07:35:21+00:00" + }, + { + "name": "symfony/translation", + "version": "v6.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "5e3848083ef1abc4814be154095946b8193f41d6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/5e3848083ef1abc4814be154095946b8193f41d6", + "reference": "5e3848083ef1abc4814be154095946b8193f41d6", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.3|^3.0" + }, + "conflict": { + "symfony/config": "<5.4", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<5.4", + "symfony/http-kernel": "<5.4", + "symfony/twig-bundle": "<5.4", + "symfony/yaml": "<5.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/console": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/finder": "^5.4|^6.0", + "symfony/http-client-contracts": "^1.1|^2.0|^3.0", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/intl": "^5.4|^6.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/service-contracts": "^1.1.2|^2|^3", + "symfony/yaml": "^5.4|^6.0" + }, + "suggest": { + "psr/log-implementation": "To use logging capability in translator", + "symfony/config": "", + "symfony/yaml": "" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v6.0.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-29T15:32:57+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "1b6ea5a7442af5a12dba3dbd6d71034b5b234e77" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/1b6ea5a7442af5a12dba3dbd6d71034b5b234e77", + "reference": "1b6ea5a7442af5a12dba3dbd6d71034b5b234e77", + "shasum": "" + }, + "require": { + "php": ">=8.0.2" + }, + "suggest": { + "symfony/translation-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.0.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-09-07T12:43:40+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v5.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "89ab66eaef230c9cd1992de2e9a1b26652b127b9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/89ab66eaef230c9cd1992de2e9a1b26652b127b9", + "reference": "89ab66eaef230c9cd1992de2e9a1b26652b127b9", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "phpunit/phpunit": "<5.4.3", + "symfony/console": "<4.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/uid": "^5.1|^6.0", + "twig/twig": "^2.13|^3.0.4" + }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v5.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-29T15:30:56+00:00" + }, + { + "name": "symfony/yaml", + "version": "v5.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "034ccc0994f1ae3f7499fa5b1f2e75d5e7a94efc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/034ccc0994f1ae3f7499fa5b1f2e75d5e7a94efc", + "reference": "034ccc0994f1ae3f7499fa5b1f2e75d5e7a94efc", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<5.3" + }, + "require-dev": { + "symfony/console": "^5.3|^6.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v5.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-28T15:25:38+00:00" + }, + { + "name": "symplify/monorepo-builder", + "version": "9.4.70", + "source": { + "type": "git", + "url": "https://github.com/symplify/monorepo-builder.git", + "reference": "49260ac962cbeadb1670adc115c3dbe80abdd2b1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symplify/monorepo-builder/zipball/49260ac962cbeadb1670adc115c3dbe80abdd2b1", + "reference": "49260ac962cbeadb1670adc115c3dbe80abdd2b1", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "bin": [ + "bin/monorepo-builder" + ], + "type": "library", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Prefixed version of Not only Composer tools to build a Monorepo.", + "support": { + "source": "https://github.com/symplify/monorepo-builder/tree/9.4.70" + }, + "funding": [ + { + "url": "https://www.paypal.me/rectorphp", + "type": "custom" + }, + { + "url": "https://github.com/tomasvotruba", + "type": "github" + } + ], + "time": "2021-10-02T16:07:18+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.1" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2021-07-28T10:34:58+00:00" + }, + { + "name": "tijsverkoyen/css-to-inline-styles", + "version": "2.2.3", + "source": { + "type": "git", + "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", + "reference": "b43b05cf43c1b6d849478965062b6ef73e223bb5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/b43b05cf43c1b6d849478965062b6ef73e223bb5", + "reference": "b43b05cf43c1b6d849478965062b6ef73e223bb5", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": "^5.5 || ^7.0 || ^8.0", + "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^7.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "TijsVerkoyen\\CssToInlineStyles\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Tijs Verkoyen", + "email": "css_to_inline_styles@verkoyen.eu", + "role": "Developer" + } + ], + "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", + "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", + "support": { + "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/2.2.3" + }, + "time": "2020-07-13T06:12:54+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v5.4.0", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "d4394d044ed69a8f244f3445bcedf8a0d7fe2403" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/d4394d044ed69a8f244f3445bcedf8a0d7fe2403", + "reference": "d4394d044ed69a8f244f3445bcedf8a0d7fe2403", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.0.2", + "php": "^7.1.3 || ^8.0", + "phpoption/phpoption": "^1.8", + "symfony/polyfill-ctype": "^1.23", + "symfony/polyfill-mbstring": "^1.23.1", + "symfony/polyfill-php80": "^1.23.1" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "ext-filter": "*", + "phpunit/phpunit": "^7.5.20 || ^8.5.21 || ^9.5.10" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.4-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.4.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2021-11-10T01:08:39+00:00" + }, + { + "name": "voku/portable-ascii", + "version": "1.5.6", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "80953678b19901e5165c56752d087fc11526017c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/80953678b19901e5165c56752d087fc11526017c", + "reference": "80953678b19901e5165c56752d087fc11526017c", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "http://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/1.5.6" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "time": "2020-11-12T00:07:28+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.10.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25", + "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.10.0" + }, + "time": "2021-03-09T10:59:23+00:00" + }, + { + "name": "zbateson/mail-mime-parser", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/zbateson/mail-mime-parser.git", + "reference": "0ef2d7de2577ea0a339d34720451c8ba8cd9dbb4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zbateson/mail-mime-parser/zipball/0ef2d7de2577ea0a339d34720451c8ba8cd9dbb4", + "reference": "0ef2d7de2577ea0a339d34720451c8ba8cd9dbb4", + "shasum": "" + }, + "require": { + "guzzlehttp/psr7": "^1.7.0|^2.0", + "php": ">=5.4", + "pimple/pimple": "^3.0", + "zbateson/mb-wrapper": "^1.0.1", + "zbateson/stream-decorators": "^1.0.6" + }, + "require-dev": { + "mikey179/vfsstream": "^1.6.0", + "sanmai/phpunit-legacy-adapter": "^6.3 || ^8.2" + }, + "suggest": { + "ext-iconv": "For best support/performance", + "ext-mbstring": "For best support/performance" + }, + "type": "library", + "autoload": { + "psr-4": { + "ZBateson\\MailMimeParser\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Zaahid Bateson" + }, + { + "name": "Contributors", + "homepage": "https://github.com/zbateson/mail-mime-parser/graphs/contributors" + } + ], + "description": "MIME email message parser", + "homepage": "https://mail-mime-parser.org", + "keywords": [ + "MimeMailParser", + "email", + "mail", + "mailparse", + "mime", + "mimeparse", + "parser", + "php-imap" + ], + "support": { + "docs": "https://mail-mime-parser.org/#usage-guide", + "issues": "https://github.com/zbateson/mail-mime-parser/issues", + "source": "https://github.com/zbateson/mail-mime-parser" + }, + "funding": [ + { + "url": "https://github.com/zbateson", + "type": "github" + } + ], + "time": "2021-11-09T18:24:41+00:00" + }, + { + "name": "zbateson/mb-wrapper", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/zbateson/mb-wrapper.git", + "reference": "bfd45fb3e2a8cf4c496b2c3ebd63b5f815721498" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zbateson/mb-wrapper/zipball/bfd45fb3e2a8cf4c496b2c3ebd63b5f815721498", + "reference": "bfd45fb3e2a8cf4c496b2c3ebd63b5f815721498", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "symfony/polyfill-iconv": "^1.9", + "symfony/polyfill-mbstring": "^1.9" + }, + "require-dev": { + "sanmai/phpunit-legacy-adapter": "^6.3 || ^8" + }, + "suggest": { + "ext-iconv": "For best support/performance", + "ext-mbstring": "For best support/performance" + }, + "type": "library", + "autoload": { + "psr-4": { + "ZBateson\\MbWrapper\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Zaahid Bateson" + } + ], + "description": "Wrapper for mbstring with fallback to iconv for encoding conversion and string manipulation", + "keywords": [ + "charset", + "encoding", + "http", + "iconv", + "mail", + "mb", + "mb_convert_encoding", + "mbstring", + "mime", + "multibyte", + "string" + ], + "support": { + "issues": "https://github.com/zbateson/mb-wrapper/issues", + "source": "https://github.com/zbateson/mb-wrapper/tree/1.1.1" + }, + "funding": [ + { + "url": "https://github.com/zbateson", + "type": "github" + } + ], + "time": "2021-11-22T21:59:45+00:00" + }, + { + "name": "zbateson/stream-decorators", + "version": "1.0.6", + "source": { + "type": "git", + "url": "https://github.com/zbateson/stream-decorators.git", + "reference": "3403c4323bd1cd15fe54348b031b26b064c706af" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/zbateson/stream-decorators/zipball/3403c4323bd1cd15fe54348b031b26b064c706af", + "reference": "3403c4323bd1cd15fe54348b031b26b064c706af", + "shasum": "" + }, + "require": { + "guzzlehttp/psr7": "^1.7.0|^2.0", + "php": ">=5.4", + "zbateson/mb-wrapper": "^1.0.0" + }, + "require-dev": { + "sanmai/phpunit-legacy-adapter": "^6.3 || ^8" + }, + "type": "library", + "autoload": { + "psr-4": { + "ZBateson\\StreamDecorators\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-2-Clause" + ], + "authors": [ + { + "name": "Zaahid Bateson" + } + ], + "description": "PHP psr7 stream decorators for mime message part streams", + "keywords": [ + "base64", + "charset", + "decorators", + "mail", + "mime", + "psr7", + "quoted-printable", + "stream", + "uuencode" + ], + "support": { + "issues": "https://github.com/zbateson/stream-decorators/issues", + "source": "https://github.com/zbateson/stream-decorators/tree/1.0.6" + }, + "funding": [ + { + "url": "https://github.com/zbateson", + "type": "github" + } + ], + "time": "2021-07-08T19:01:59+00:00" + } + ], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": [], + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": "^8.0" + }, + "platform-dev": [], + "plugin-api-version": "2.0.0" +} diff --git a/main.js b/main.js new file mode 100644 index 0000000000..697d5c2903 --- /dev/null +++ b/main.js @@ -0,0 +1,6 @@ +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ +/******/ +/******/ })() +; \ No newline at end of file diff --git a/monorepo-builder.php b/monorepo-builder.php new file mode 100644 index 0000000000..1d57fa3bec --- /dev/null +++ b/monorepo-builder.php @@ -0,0 +1,23 @@ +services(); + + # Release workers - in order to execute + $services->set(UpdateReplaceReleaseWorker::class); + $services->set(SetCurrentMutualDependenciesReleaseWorker::class); + $services->set(TagVersionReleaseWorker::class); + $services->set(PushTagReleaseWorker::class); + $services->set(SetNextMutualDependenciesReleaseWorker::class); + $services->set(UpdateBranchAliasReleaseWorker::class); + $services->set(PushNextDevReleaseWorker::class); +}; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000000..b729faebf5 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,17803 @@ +{ + "name": "filament", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "filament", + "devDependencies": { + "@alpinejs/trap": "^3.5.0", + "@babel/runtime": "^7.15.3", + "@github/file-attachment-element": "^2.0.1", + "@github/markdown-toolbar-element": "^1.5.1", + "@tailwindcss/forms": "^0.3.4", + "@tailwindcss/typography": "^0.4.1", + "alpinejs": "^3.5.0", + "chart.js": "^3.6.0", + "dayjs": "^1.10.6", + "esbuild": "^0.8.57", + "filepond": "^4.28.2", + "filepond-plugin-file-validate-size": "^2.2.4", + "filepond-plugin-file-validate-type": "^1.2.6", + "filepond-plugin-image-crop": "^2.0.6", + "filepond-plugin-image-exif-orientation": "^1.0.11", + "filepond-plugin-image-preview": "^4.6.7", + "filepond-plugin-image-resize": "^2.0.10", + "filepond-plugin-image-transform": "^3.8.6", + "imask": "^6.1.0", + "laravel-mix": "^6.0.37", + "marked": "^3.0.0", + "mdhl": "^0.0.6", + "tailwindcss": "^2.2.19", + "tailwindcss-dir": "^4.0.0", + "trix": "^1.3.1" + } + }, + "node_modules/@alpinejs/trap": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@alpinejs/trap/-/trap-3.5.1.tgz", + "integrity": "sha512-D0EnbOnKOliY+Sl2+1xHAAipeGTivZP7v7gDL/Xg1MIQOPuV0yXdpjGz9CvA7TKju35lJmbMvWQESzYtVi6YGg==", + "dev": true, + "dependencies": { + "focus-trap": "^6.6.1" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.0.tgz", + "integrity": "sha512-DGjt2QZse5SGd9nfOSqO4WLJ8NN/oHkijbXbPrxuoJO3oIPJL3TciZs9FX+cOHNiY9E9l0opL8g7BmLe3T+9ew==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz", + "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.0", + "@babel/helper-compilation-targets": "^7.16.0", + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helpers": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", + "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz", + "integrity": "sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.0.tgz", + "integrity": "sha512-9KuleLT0e77wFUku6TUkqZzCEymBdtuQQ27MhEKzf9UOOJu3cYj98kyaDAzxpC7lV6DGiZFuC8XqDsq8/Kl6aQ==", + "dev": true, + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.16.0", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz", + "integrity": "sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.16.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.17.5", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.0.tgz", + "integrity": "sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-member-expression-to-functions": "^7.16.0", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/helper-replace-supers": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.0.tgz", + "integrity": "sha512-3DyG0zAFAZKcOp7aVr33ddwkxJ0Z0Jr5V99y3I690eYLpukJsJvAbzTy1ewoCqsML8SbIrjH14Jc/nSQ4TvNPA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "regexpu-core": "^4.7.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.4.tgz", + "integrity": "sha512-OrpPZ97s+aPi6h2n1OXzdhVis1SGSsMU2aMHgLcOKfsp4/v1NWpx3CWT3lBj5eeBq9cDkPkh+YCfdF7O12uNDQ==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.0.tgz", + "integrity": "sha512-Hk2SLxC9ZbcOhLpg/yMznzJ11W++lg5GMbxt1ev6TXUiJB0N42KPC+7w8a+eWGuqDnUYuwStJoZHM7RgmIOaGQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", + "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", + "dev": true, + "dependencies": { + "@babel/helper-get-function-arity": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-get-function-arity": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", + "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz", + "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz", + "integrity": "sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", + "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz", + "integrity": "sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-replace-supers": "^7.16.0", + "@babel/helper-simple-access": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", + "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", + "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.0.tgz", + "integrity": "sha512-MLM1IOMe9aQBqMWxcRw8dcb9jlM86NIw7KA0Wri91Xkfied+dE0QuBFSBjMNvqzmS0OSIDsMNC24dBEkPUi7ew==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-wrap-function": "^7.16.0", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz", + "integrity": "sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==", + "dev": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.16.0", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", + "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", + "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", + "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.0.tgz", + "integrity": "sha512-VVMGzYY3vkWgCJML+qVLvGIam902mJW0FvT7Avj1zEe0Gn7D93aWdLblYARTxEw+6DhZmtzhBM2zv0ekE5zg1g==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.3.tgz", + "integrity": "sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w==", + "dev": true, + "dependencies": { + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.3", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.15.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.3.tgz", + "integrity": "sha512-dcNwU1O4sx57ClvLBVFbEgx0UZWfd0JQX5X6fxFRCLHelFBGXFfSz6Y0FAq2PEwUqlqLkdVjVr4VASEOuUnLJw==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.16.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.2.tgz", + "integrity": "sha512-h37CvpLSf8gb2lIJ2CgC3t+EjFbi0t8qS7LCS1xcJIlEXE4czlofwaW7W1HA8zpgOCzI9C1nmoqNR1zWkk0pQg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.0.tgz", + "integrity": "sha512-4tcFwwicpWTrpl9qjf7UsoosaArgImF85AxqCRZlgc3IQDvkUHjJpruXAL58Wmj+T6fypWTC/BakfEkwIL/pwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.0.tgz", + "integrity": "sha512-nyYmIo7ZqKsY6P4lnVmBlxp9B3a96CscbLotlsNuktMHahkDwoPYEjXrZHU0Tj844Z9f1IthVxQln57mhkcExw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.16.0", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.0.tgz", + "integrity": "sha512-mCF3HcuZSY9Fcx56Lbn+CGdT44ioBMMvjNVldpKtj8tpniETdLjnxdHI1+sDWXIM1nNt+EanJOZ3IG9lzVjs7A==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.0.tgz", + "integrity": "sha512-mAy3sdcY9sKAkf3lQbDiv3olOfiLqI51c9DR9b19uMoR2Z6r5pmGl7dfNFqEvqOyqbf1ta4lknK4gc5PJn3mfA==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.0.tgz", + "integrity": "sha512-QGSA6ExWk95jFQgwz5GQ2Dr95cf7eI7TKutIXXTb7B1gCLTCz5hTjFTQGfLFBBiC5WSNi7udNwWsqbbMh1c4yQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.0.tgz", + "integrity": "sha512-CjI4nxM/D+5wCnhD11MHB1AwRSAYeDT+h8gCdcVJZ/OK7+wRzFsf7PFPWVpVpNRkHMmMkQWAHpTq+15IXQ1diA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.0.tgz", + "integrity": "sha512-kouIPuiv8mSi5JkEhzApg5Gn6hFyKPnlkO0a9YSzqRurH8wYzSlf6RJdzluAsbqecdW5pBvDJDfyDIUR/vLxvg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.0.tgz", + "integrity": "sha512-pbW0fE30sVTYXXm9lpVQQ/Vc+iTeQKiXlaNRZPPN2A2VdlWyAtsUrsQ3xydSlDW00TFMK7a8m3cDTkBF5WnV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.0.tgz", + "integrity": "sha512-3bnHA8CAFm7cG93v8loghDYyQ8r97Qydf63BeYiGgYbjKKB/XP53W15wfRC7dvKfoiJ34f6Rbyyx2btExc8XsQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.0.tgz", + "integrity": "sha512-FAhE2I6mjispy+vwwd6xWPyEx3NYFS13pikDBWUAFGZvq6POGs5eNchw8+1CYoEgBl9n11I3NkzD7ghn25PQ9Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.0.tgz", + "integrity": "sha512-LU/+jp89efe5HuWJLmMmFG0+xbz+I2rSI7iLc1AlaeSMDMOGzWlc5yJrMN1d04osXN4sSfpo4O+azkBNBes0jg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.16.0", + "@babel/helper-compilation-targets": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.0.tgz", + "integrity": "sha512-kicDo0A/5J0nrsCPbn89mTG3Bm4XgYi0CZtvex9Oyw7gGZE3HXGD0zpQNH+mo+tEfbo8wbmMvJftOwpmPy7aVw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.0.tgz", + "integrity": "sha512-Y4rFpkZODfHrVo70Uaj6cC1JJOt3Pp0MdWSwIKtb8z1/lsjl9AmnB7ErRFV+QNGIfcY1Eruc2UMx5KaRnXjMyg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.0.tgz", + "integrity": "sha512-IvHmcTHDFztQGnn6aWq4t12QaBXTKr1whF/dgp9kz84X6GUcwq9utj7z2wFCUfeOup/QKnOlt2k0zxkGFx9ubg==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.0.tgz", + "integrity": "sha512-3jQUr/HBbMVZmi72LpjQwlZ55i1queL8KcDTQEkAHihttJnAPrcvG9ZNXIfsd2ugpizZo595egYV6xy+pv4Ofw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-create-class-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.0.tgz", + "integrity": "sha512-ti7IdM54NXv29cA4+bNNKEMS4jLMCbJgl+Drv+FgYy0erJLAxNAIXcNjNjrRZEcWq0xJHsNVwQezskMFpF8N9g==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.0.tgz", + "integrity": "sha512-vIFb5250Rbh7roWARvCLvIJ/PtAU5Lhv7BtZ1u24COwpI9Ypjsh+bZcKk6rlIyalK+r0jOc1XQ8I4ovNxNrWrA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.0.tgz", + "integrity": "sha512-PbIr7G9kR8tdH6g8Wouir5uVjklETk91GMVSUq+VaOgiinbCkBP6Q7NN/suM/QutZkMJMvcyAriogcYAdhg8Gw==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.0.tgz", + "integrity": "sha512-V14As3haUOP4ZWrLJ3VVx5rCnrYhMSHN/jX7z6FAt5hjRkLsb0snPCmJwSOML5oxkKO4FNoNv7V5hw/y2bjuvg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.0.tgz", + "integrity": "sha512-27n3l67/R3UrXfizlvHGuTwsRIFyce3D/6a37GRxn28iyTPvNXaW4XvznexRh1zUNLPjbLL22Id0XQElV94ruw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.0.tgz", + "integrity": "sha512-HUxMvy6GtAdd+GKBNYDWCIA776byUQH8zjnfjxwT1P1ARv/wFu8eBDpmXQcLS/IwRtrxIReGiplOwMeyO7nsDQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.0.tgz", + "integrity": "sha512-63l1dRXday6S8V3WFY5mXJwcRAnPYxvFfTlt67bwV1rTyVTM5zrp0DBBb13Kl7+ehkCVwIZPumPpFP/4u70+Tw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.0.tgz", + "integrity": "sha512-Q7tBUwjxLTsHEoqktemHBMtb3NYwyJPTJdM+wDwb0g8PZ3kQUIzNvwD5lPaqW/p54TXBc/MXZu9Jr7tbUEUM8Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.0.tgz", + "integrity": "sha512-FXlDZfQeLILfJlC6I1qyEwcHK5UpRCFkaoVyA1nk9A1L1Yu583YO4un2KsLBsu3IJb4CUbctZks8tD9xPQubLw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.0.tgz", + "integrity": "sha512-LIe2kcHKAZOJDNxujvmp6z3mfN6V9lJxubU4fJIGoQCkKe3Ec2OcbdlYP+vW++4MpxwG0d1wSDOJtQW5kLnkZQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.0.tgz", + "integrity": "sha512-OwYEvzFI38hXklsrbNivzpO3fh87skzx8Pnqi4LoSYeav0xHlueSoCJrSgTPfnbyzopo5b3YVAJkFIcUpK2wsw==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.0.tgz", + "integrity": "sha512-5QKUw2kO+GVmKr2wMYSATCTTnHyscl6sxFRAY+rvN7h7WB0lcG0o4NoV6ZQU32OZGVsYUsfLGgPQpDFdkfjlJQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.0.tgz", + "integrity": "sha512-lBzMle9jcOXtSOXUpc7tvvTpENu/NuekNJVova5lCCWCV9/U1ho2HH2y0p6mBg8fPm/syEAbfaaemYGOHCY3mg==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.0.tgz", + "integrity": "sha512-gQDlsSF1iv9RU04clgXqRjrPyyoJMTclFt3K1cjLmTKikc0s/6vE3hlDeEVC71wLTRu72Fq7650kABrdTc2wMQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.0.tgz", + "integrity": "sha512-WRpw5HL4Jhnxw8QARzRvwojp9MIE7Tdk3ez6vRyUk1MwgjJN0aNpRoXainLR5SgxmoXx/vsXGZ6OthP6t/RbUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.0.tgz", + "integrity": "sha512-rWFhWbCJ9Wdmzln1NmSCqn7P0RAD+ogXG/bd9Kg5c7PKWkJtkiXmYsMBeXjDlzHpVTJ4I/hnjs45zX4dEv81xw==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.0.tgz", + "integrity": "sha512-Dzi+NWqyEotgzk/sb7kgQPJQf7AJkQBWsVp1N6JWc1lBVo0vkElUnGdr1PzUBmfsCCN5OOFya3RtpeHk15oLKQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-simple-access": "^7.16.0", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.0.tgz", + "integrity": "sha512-yuGBaHS3lF1m/5R+6fjIke64ii5luRUg97N2wr+z1sF0V+sNSXPxXDdEEL/iYLszsN5VKxVB1IPfEqhzVpiqvg==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.16.0", + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-identifier": "^7.15.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.0.tgz", + "integrity": "sha512-nx4f6no57himWiHhxDM5pjwhae5vLpTK2zCnDH8+wNLJy0TVER/LJRHl2bkt6w9Aad2sPD5iNNoUpY3X9sTGDg==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.0.tgz", + "integrity": "sha512-LogN88uO+7EhxWc8WZuQ8vxdSyVGxhkh8WTC3tzlT8LccMuQdA81e9SGV6zY7kY2LjDhhDOFdQVxdGwPyBCnvg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.0.tgz", + "integrity": "sha512-fhjrDEYv2DBsGN/P6rlqakwRwIp7rBGLPbrKxwh7oVt5NNkIhZVOY2GRV+ULLsQri1bDqwDWnU3vhlmx5B2aCw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.0.tgz", + "integrity": "sha512-fds+puedQHn4cPLshoHcR1DTMN0q1V9ou0mUjm8whx9pGcNvDrVVrgw+KJzzCaiTdaYhldtrUps8DWVMgrSEyg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.3.tgz", + "integrity": "sha512-3MaDpJrOXT1MZ/WCmkOFo7EtmVVC8H4EUZVrHvFOsmwkk4lOjQj8rzv8JKUZV4YoQKeoIgk07GO+acPU9IMu/w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.0.tgz", + "integrity": "sha512-XLldD4V8+pOqX2hwfWhgwXzGdnDOThxaNTgqagOcpBgIxbUvpgU2FMvo5E1RyHbk756WYgdbS0T8y0Cj9FKkWQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.0.tgz", + "integrity": "sha512-JAvGxgKuwS2PihiSFaDrp94XOzzTUeDeOQlcKzVAyaPap7BnZXK/lvMDiubkPTdotPKOIZq9xWXWnggUMYiExg==", + "dev": true, + "dependencies": { + "regenerator-transform": "^0.14.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.0.tgz", + "integrity": "sha512-Dgs8NNCehHSvXdhEhln8u/TtJxfVwGYCgP2OOr5Z3Ar+B+zXicEOKNTyc+eca2cuEOMtjW6m9P9ijOt8QdqWkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.0.tgz", + "integrity": "sha512-zlPf1/XFn5+vWdve3AAhf+Sxl+MVa5VlwTwWgnLx23u4GlatSRQJ3Eoo9vllf0a9il3woQsT4SK+5Z7c06h8ag==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-polyfill-corejs2": "^0.2.3", + "babel-plugin-polyfill-corejs3": "^0.3.0", + "babel-plugin-polyfill-regenerator": "^0.2.3", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.0.tgz", + "integrity": "sha512-iVb1mTcD8fuhSv3k99+5tlXu5N0v8/DPm2mO3WACLG6al1CGZH7v09HJyUb1TtYl/Z+KrM6pHSIJdZxP5A+xow==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.0.tgz", + "integrity": "sha512-Ao4MSYRaLAQczZVp9/7E7QHsCuK92yHRrmVNRe/SlEJjhzivq0BSn8mEraimL8wizHZ3fuaHxKH0iwzI13GyGg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.0.tgz", + "integrity": "sha512-/ntT2NljR9foobKk4E/YyOSwcGUXtYWv5tinMK/3RkypyNBNdhHUaq6Orw5DWq9ZcNlS03BIlEALFeQgeVAo4Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.0.tgz", + "integrity": "sha512-Rd4Ic89hA/f7xUSJQk5PnC+4so50vBoBfxjdQAdvngwidM8jYIBVxBZ/sARxD4e0yMXRbJVDrYf7dyRtIIKT6Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.0.tgz", + "integrity": "sha512-++V2L8Bdf4vcaHi2raILnptTBjGEFxn5315YU+e8+EqXIucA+q349qWngCLpUYqqv233suJ6NOienIVUpS9cqg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.0.tgz", + "integrity": "sha512-VFi4dhgJM7Bpk8lRc5CMaRGlKZ29W9C3geZjt9beuzSUrlJxsNwX7ReLwaL6WEvsOf2EQkyIJEPtF8EXjB/g2A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.0.tgz", + "integrity": "sha512-jHLK4LxhHjvCeZDWyA9c+P9XH1sOxRd1RO9xMtDVRAOND/PczPqizEtVdx4TQF/wyPaewqpT+tgQFYMnN/P94A==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.0.tgz", + "integrity": "sha512-cdTu/W0IrviamtnZiTfixPfIncr2M1VqRrkjzZWlr1B4TVYimCFK5jkyOdP4qw2MrlKHi+b3ORj6x8GoCew8Dg==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.16.0", + "@babel/helper-compilation-targets": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.0", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-async-generator-functions": "^7.16.0", + "@babel/plugin-proposal-class-properties": "^7.16.0", + "@babel/plugin-proposal-class-static-block": "^7.16.0", + "@babel/plugin-proposal-dynamic-import": "^7.16.0", + "@babel/plugin-proposal-export-namespace-from": "^7.16.0", + "@babel/plugin-proposal-json-strings": "^7.16.0", + "@babel/plugin-proposal-logical-assignment-operators": "^7.16.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", + "@babel/plugin-proposal-numeric-separator": "^7.16.0", + "@babel/plugin-proposal-object-rest-spread": "^7.16.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-private-methods": "^7.16.0", + "@babel/plugin-proposal-private-property-in-object": "^7.16.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.16.0", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.16.0", + "@babel/plugin-transform-async-to-generator": "^7.16.0", + "@babel/plugin-transform-block-scoped-functions": "^7.16.0", + "@babel/plugin-transform-block-scoping": "^7.16.0", + "@babel/plugin-transform-classes": "^7.16.0", + "@babel/plugin-transform-computed-properties": "^7.16.0", + "@babel/plugin-transform-destructuring": "^7.16.0", + "@babel/plugin-transform-dotall-regex": "^7.16.0", + "@babel/plugin-transform-duplicate-keys": "^7.16.0", + "@babel/plugin-transform-exponentiation-operator": "^7.16.0", + "@babel/plugin-transform-for-of": "^7.16.0", + "@babel/plugin-transform-function-name": "^7.16.0", + "@babel/plugin-transform-literals": "^7.16.0", + "@babel/plugin-transform-member-expression-literals": "^7.16.0", + "@babel/plugin-transform-modules-amd": "^7.16.0", + "@babel/plugin-transform-modules-commonjs": "^7.16.0", + "@babel/plugin-transform-modules-systemjs": "^7.16.0", + "@babel/plugin-transform-modules-umd": "^7.16.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.0", + "@babel/plugin-transform-new-target": "^7.16.0", + "@babel/plugin-transform-object-super": "^7.16.0", + "@babel/plugin-transform-parameters": "^7.16.0", + "@babel/plugin-transform-property-literals": "^7.16.0", + "@babel/plugin-transform-regenerator": "^7.16.0", + "@babel/plugin-transform-reserved-words": "^7.16.0", + "@babel/plugin-transform-shorthand-properties": "^7.16.0", + "@babel/plugin-transform-spread": "^7.16.0", + "@babel/plugin-transform-sticky-regex": "^7.16.0", + "@babel/plugin-transform-template-literals": "^7.16.0", + "@babel/plugin-transform-typeof-symbol": "^7.16.0", + "@babel/plugin-transform-unicode-escapes": "^7.16.0", + "@babel/plugin-transform-unicode-regex": "^7.16.0", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.16.0", + "babel-plugin-polyfill-corejs2": "^0.2.3", + "babel-plugin-polyfill-corejs3": "^0.3.0", + "babel-plugin-polyfill-regenerator": "^0.2.3", + "core-js-compat": "^3.19.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.3.tgz", + "integrity": "sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", + "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.3.tgz", + "integrity": "sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.0", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-hoist-variables": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/parser": "^7.16.3", + "@babel/types": "^7.16.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", + "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.15.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.5.tgz", + "integrity": "sha512-6nFkfkmSeV/rqSaS4oWHgmpnYw194f6hmWF5is6b0J1naJZoiD0NTc9AiUwPHvWsowkjuHErCZT1wa0jg+BLIA==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@fullhuman/postcss-purgecss": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@fullhuman/postcss-purgecss/-/postcss-purgecss-2.3.0.tgz", + "integrity": "sha512-qnKm5dIOyPGJ70kPZ5jiz0I9foVOic0j+cOzNDoo8KoCf6HjicIZ99UfO2OmE7vCYSKAAepEwJtNzpiiZAh9xw==", + "dev": true, + "dependencies": { + "postcss": "7.0.32", + "purgecss": "^2.3.0" + } + }, + "node_modules/@fullhuman/postcss-purgecss/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@fullhuman/postcss-purgecss/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@fullhuman/postcss-purgecss/node_modules/chalk/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@fullhuman/postcss-purgecss/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@fullhuman/postcss-purgecss/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/@fullhuman/postcss-purgecss/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@fullhuman/postcss-purgecss/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@fullhuman/postcss-purgecss/node_modules/postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "dev": true, + "dependencies": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + } + }, + "node_modules/@fullhuman/postcss-purgecss/node_modules/purgecss": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-2.3.0.tgz", + "integrity": "sha512-BE5CROfVGsx2XIhxGuZAT7rTH9lLeQx/6M0P7DTXQH4IUc3BBzs9JUzt4yzGf3JrH9enkeq6YJBe9CTtkm1WmQ==", + "dev": true, + "dependencies": { + "commander": "^5.0.0", + "glob": "^7.0.0", + "postcss": "7.0.32", + "postcss-selector-parser": "^6.0.2" + }, + "bin": { + "purgecss": "bin/purgecss" + } + }, + "node_modules/@fullhuman/postcss-purgecss/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@fullhuman/postcss-purgecss/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@github/file-attachment-element": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@github/file-attachment-element/-/file-attachment-element-2.0.1.tgz", + "integrity": "sha512-GQUgDPZeuE9xco4GbReAKFvtOFe9js+yctSrSYUSTGeD3N4xO2kX2MvaEiQRuVkERFgGPD9r57CLbbUoyJBn2Q==", + "dev": true + }, + "node_modules/@github/markdown-toolbar-element": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@github/markdown-toolbar-element/-/markdown-toolbar-element-1.5.3.tgz", + "integrity": "sha512-fNgAuHBWWzqxMvkTMM7ijqPryLmnPVOi4OWp8YyUC74YgtJCRvQyL7gl9SzNLMXmGQxiRVIYbUJxa61X1oRObw==", + "dev": true + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@tailwindcss/forms": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.3.4.tgz", + "integrity": "sha512-vlAoBifNJUkagB+PAdW4aHMe4pKmSLroH398UPgIogBFc91D2VlHUxe4pjxQhiJl0Nfw53sHSJSQBSTQBZP3vA==", + "dev": true, + "dependencies": { + "mini-svg-data-uri": "^1.2.3" + }, + "peerDependencies": { + "tailwindcss": ">=2.0.0" + } + }, + "node_modules/@tailwindcss/typography": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.4.1.tgz", + "integrity": "sha512-ovPPLUhs7zAIJfr0y1dbGlyCuPhpuv/jpBoFgqAc658DWGGrOBWBMpAWLw2KlzbNeVk4YBJMzue1ekvIbdw6XA==", + "dev": true, + "dependencies": { + "lodash.castarray": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "lodash.uniq": "^4.5.0" + }, + "peerDependencies": { + "tailwindcss": ">=2.0.0" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/babel__core": { + "version": "7.1.16", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.16.tgz", + "integrity": "sha512-EAEHtisTMM+KaKwfWdC3oyllIqswlznXCIVCt7/oRNrh+DhgT4UEBNC/jlADNjvw7UnfbcdkGQcPVZ1xYiLcrQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.3.tgz", + "integrity": "sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", + "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.3.0" + } + }, + "node_modules/@types/clean-css": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@types/clean-css/-/clean-css-4.2.5.tgz", + "integrity": "sha512-NEzjkGGpbs9S9fgC4abuBvTpVwE3i+Acu9BBod3PUyjDVZcNsGx61b8r2PphR61QGPnn0JHVs5ey6/I4eTrkxw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "source-map": "^0.6.0" + } + }, + "node_modules/@types/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@types/eslint": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz", + "integrity": "sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "0.0.50", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", + "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", + "dev": true + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/http-proxy": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.7.tgz", + "integrity": "sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/imagemin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@types/imagemin/-/imagemin-8.0.0.tgz", + "integrity": "sha512-B9X2CUeDv/uUeY9CqkzSTfmsLkeJP6PkmXlh4lODBbf9SwpmNuLS30WzUOi863dgsjY3zt3gY5q2F+UdifRi1A==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/imagemin-gifsicle": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@types/imagemin-gifsicle/-/imagemin-gifsicle-7.0.1.tgz", + "integrity": "sha512-kUz6sUh0P95JOS0RGEaaemWUrASuw+dLsWIveK2UZJx74id/B9epgblMkCk/r5MjUWbZ83wFvacG5Rb/f97gyA==", + "dev": true, + "dependencies": { + "@types/imagemin": "*" + } + }, + "node_modules/@types/imagemin-mozjpeg": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@types/imagemin-mozjpeg/-/imagemin-mozjpeg-8.0.1.tgz", + "integrity": "sha512-kMQWEoKxxhlnH4POI3qfW9DjXlQfi80ux3l2b3j5R3eudSCoUIzKQLkfMjNJ6eMYnMWBcB+rfQOWqIzdIwFGKw==", + "dev": true, + "dependencies": { + "@types/imagemin": "*" + } + }, + "node_modules/@types/imagemin-optipng": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@types/imagemin-optipng/-/imagemin-optipng-5.2.1.tgz", + "integrity": "sha512-XCM/3q+HUL7v4zOqMI+dJ5dTxT+MUukY9KU49DSnYb/4yWtSMHJyADP+WHSMVzTR63J2ZvfUOzSilzBNEQW78g==", + "dev": true, + "dependencies": { + "@types/imagemin": "*" + } + }, + "node_modules/@types/imagemin-svgo": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@types/imagemin-svgo/-/imagemin-svgo-8.0.1.tgz", + "integrity": "sha512-YafkdrVAcr38U0Ln1C+L1n4SIZqC47VBHTyxCq7gTUSd1R9MdIvMcrljWlgU1M9O68WZDeQWUrKipKYfEOCOvQ==", + "dev": true, + "dependencies": { + "@types/imagemin": "*", + "@types/svgo": "^1" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "16.11.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.7.tgz", + "integrity": "sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw==", + "dev": true + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "node_modules/@types/retry": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", + "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==", + "dev": true + }, + "node_modules/@types/svgo": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/@types/svgo/-/svgo-1.3.6.tgz", + "integrity": "sha512-AZU7vQcy/4WFEuwnwsNsJnFwupIpbllH1++LXScN6uxT1Z4zPzdrWG97w4/I7eFKFTvfy/bHFStWjdBAg2Vjug==", + "dev": true + }, + "node_modules/@vue/reactivity": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.1.5.tgz", + "integrity": "sha512-1tdfLmNjWG6t/CsPldh+foumYFo3cpyCHgBYQ34ylaMsJ+SNHQ1kApMIa8jN+i593zQuaw3AdWH0nJTARzCFhg==", + "dev": true, + "dependencies": { + "@vue/shared": "3.1.5" + } + }, + "node_modules/@vue/shared": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.1.5.tgz", + "integrity": "sha512-oJ4F3TnvpXaQwZJNF3ZK+kLPHKarDmJjJ6jyzVNDKH9md1dptjC7lWR//jrGuLdek/U6iltWxqAnYOu8gCiOvA==", + "dev": true + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.0.tgz", + "integrity": "sha512-ttOkEkoalEHa7RaFYpM0ErK1xc4twg3Am9hfHhL7MVqlHebnkYd2wuI/ZqTDj0cVzZho6PdinY0phFZV3O0Mzg==", + "dev": true, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x", + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.0.tgz", + "integrity": "sha512-F6b+Man0rwE4n0409FyAJHStYA5OIZERxmnUfLVwv0mc0V1wLad3V7jqRlMkgKBeAq07jUvglacNaa6g9lOpuw==", + "dev": true, + "dependencies": { + "envinfo": "^7.7.3" + }, + "peerDependencies": { + "webpack-cli": "4.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.0.tgz", + "integrity": "sha512-ZkVeqEmRpBV2GHvjjUZqEai2PpUbuq8Bqd//vEYsp63J8WyexI8ppCqVS3Zs0QADf6aWuPdU+0XsPI647PVlQA==", + "dev": true, + "peerDependencies": { + "webpack-cli": "4.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dev": true, + "dependencies": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "node_modules/acorn-node/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "node_modules/alpinejs": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/alpinejs/-/alpinejs-3.5.1.tgz", + "integrity": "sha512-GqdRNYpEW/rCoh45oqbGLQ1w2Uygt8DNEiqD7Di/kklJ+EZ3xjDAlFlgJ2xf37K+NtzEu2NdmkaYY6B9NBI79Q==", + "dev": true, + "dependencies": { + "@vue/reactivity": "~3.1.1" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", + "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==", + "dev": true + }, + "node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "dependencies": { + "object-assign": "^4.1.1", + "util": "0.10.3" + } + }, + "node_modules/assert/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "node_modules/assert/node_modules/util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "dependencies": { + "inherits": "2.0.1" + } + }, + "node_modules/async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.0.tgz", + "integrity": "sha512-7FdJ1ONtwzV1G43GDD0kpVMn/qbiNqyOPMFTX5nRffI+7vgWoFEc6DcXOxHJxrWNDXrZh18eDsZjvZGUljSRGA==", + "dev": true, + "dependencies": { + "browserslist": "^4.17.5", + "caniuse-lite": "^1.0.30001272", + "fraction.js": "^4.1.1", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.1.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/babel-loader": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.3.tgz", + "integrity": "sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==", + "dev": true, + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^1.4.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.3.tgz", + "integrity": "sha512-NDZ0auNRzmAfE1oDDPW2JhzIMXUk+FFe2ICejmt5T4ocKgiQx3e0VCRx9NCAidcMtL2RUZaWtXnmjTCkx0tcbA==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.4", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.3.0.tgz", + "integrity": "sha512-JLwi9vloVdXLjzACL80j24bG6/T1gYxwowG44dg6HN/7aTPdyPbJJidf6ajoA3RPHHtW0j9KMrSOLpIZpAnPpg==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.2.4", + "core-js-compat": "^3.18.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.3.tgz", + "integrity": "sha512-JVE78oRZPKFIeUqFGrSORNzQnrDwZR16oiWeGM8ZyjBn2XAT5OjP+wXx5ESuo33nUsFUEJYjtklnsKbxW5L+7g==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.2.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", + "dev": true + }, + "node_modules/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "dependencies": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "dependencies": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "dependencies": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "node_modules/browserify-sign/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/browserify-sign/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserslist": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.18.0.tgz", + "integrity": "sha512-ER2M0g5iAR84fS/zjBDqEgU6iO5fS9JI2EkHr5zxDxYEFk3LjhU9Vpp/INb6RMQphxko7PDV1FH38H/qVP5yCA==", + "dev": true, + "dependencies": { + "caniuse-lite": "^1.0.30001280", + "electron-to-chromium": "^1.3.896", + "escalade": "^3.1.1", + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001280", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001280.tgz", + "integrity": "sha512-kFXwYvHe5rix25uwueBxC569o53J6TpnGu0BEEn+6Lhl2vsnAumRFWEBhDft1fwyo6m1r4i+RqA4+163FpeFcA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/chart.js": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-3.6.0.tgz", + "integrity": "sha512-iOzzDKePL+bj+ccIsVAgWQehCXv8xOKGbaU2fO/myivH736zcx535PGJzQGanvcSGVOqX6yuLZsN3ygcQ35UgQ==", + "dev": true + }, + "node_modules/chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/clean-css": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.2.tgz", + "integrity": "sha512-/eR8ru5zyxKzpBLv9YZvMXgTSSQn7AdkMItMYynsFgGwTveCRVam9IUPFloE85B4vAIj05IuKmmEoV7/AQjT0w==", + "dev": true, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-table3": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.0.tgz", + "integrity": "sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ==", + "dev": true, + "dependencies": { + "object-assign": "^4.1.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "colors": "^1.1.2" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/collect.js": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/collect.js/-/collect.js-4.29.0.tgz", + "integrity": "sha512-yhgGYEsLEcqnLT1NmRlN1+1euoz9SDhxQ4QyDhWYsKoWsg7252PKA5++dWaDs8mdFxbkmXDXQUaHXI9J2eTPkQ==", + "dev": true + }, + "node_modules/color": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/color/-/color-4.0.1.tgz", + "integrity": "sha512-rpZjOKN5O7naJxkH2Rx1sZzzBgaiWECc6BYXjeCE6kF0kcASJYbUq02u7JqIHwCb/j3NhV+QhRL2683aICeGZA==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1", + "color-string": "^1.6.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/color-string": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.6.0.tgz", + "integrity": "sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==", + "dev": true, + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/colord": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.1.tgz", + "integrity": "sha512-4LBMSt09vR0uLnPVkOUBnmxgoaeN4ewRbx801wY/bXcltXfpR/G46OdWn96XpYmCWuYvO46aBZP4NgX8HpNAcw==", + "dev": true + }, + "node_modules/colorette": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", + "dev": true + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/concat": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/concat/-/concat-1.0.3.tgz", + "integrity": "sha1-QPM1MInWVGdpXLGIa0Xt1jfYzKg=", + "dev": true, + "dependencies": { + "commander": "^2.9.0" + }, + "bin": { + "concat": "bin/concat" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/concat/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==", + "dev": true + }, + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "node_modules/content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "node_modules/core-js-compat": { + "version": "3.19.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.19.1.tgz", + "integrity": "sha512-Q/VJ7jAF/y68+aUsQJ/afPOewdsGkDtcMb40J8MbuWKlK3Y+wtHq8bTHKPj2WKWLIqmS5JhHs4CzHtz6pT2W6g==", + "dev": true, + "dependencies": { + "browserslist": "^4.17.6", + "semver": "7.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dev": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/css-color-names": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-1.0.1.tgz", + "integrity": "sha512-/loXYOch1qU1biStIFsHH8SxTmOseh1IJqFvy8IujXOm1h+QjUdDhkzOrR5HG8K8mlxREj0yfi8ewCHx0eMxzA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/css-declaration-sorter": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.1.3.tgz", + "integrity": "sha512-SvjQjNRZgh4ULK1LDJ2AduPKUKxIqmtU7ZAyi47BTV+M90Qvxr9AB6lKlLbDUfXqI9IQeYA8LbAsCZPpJEV3aA==", + "dev": true, + "dependencies": { + "timsort": "^0.3.0" + }, + "engines": { + "node": ">= 10" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-loader": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.7.tgz", + "integrity": "sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==", + "dev": true, + "dependencies": { + "icss-utils": "^5.1.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.15", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.27.0 || ^5.0.0" + } + }, + "node_modules/css-loader/node_modules/loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/css-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/css-select": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", + "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^5.0.0", + "domhandler": "^4.2.0", + "domutils": "^2.6.0", + "nth-check": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-select/node_modules/domhandler": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz", + "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-tree/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-unit-converter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.2.tgz", + "integrity": "sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA==", + "dev": true + }, + "node_modules/css-what": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", + "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.0.10.tgz", + "integrity": "sha512-YfNhVJJ04imffOpbPbXP2zjIoByf0m8E2c/s/HnvSvjXgzXMfgopVjAEGvxYOjkOpWuRQDg/OZFjO7WW94Ri8w==", + "dev": true, + "dependencies": { + "cssnano-preset-default": "^5.1.6", + "is-resolvable": "^1.1.0", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-preset-default": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.1.6.tgz", + "integrity": "sha512-X2nDeNGBXc0486oHjT2vSj+TdeyVsxRvJUxaOH50hOM6vSDLkKd0+59YXpSZRInJ4sNtBOykS4KsPfhdrU/35w==", + "dev": true, + "dependencies": { + "css-declaration-sorter": "^6.0.3", + "cssnano-utils": "^2.0.1", + "postcss-calc": "^8.0.0", + "postcss-colormin": "^5.2.1", + "postcss-convert-values": "^5.0.2", + "postcss-discard-comments": "^5.0.1", + "postcss-discard-duplicates": "^5.0.1", + "postcss-discard-empty": "^5.0.1", + "postcss-discard-overridden": "^5.0.1", + "postcss-merge-longhand": "^5.0.3", + "postcss-merge-rules": "^5.0.2", + "postcss-minify-font-values": "^5.0.1", + "postcss-minify-gradients": "^5.0.3", + "postcss-minify-params": "^5.0.1", + "postcss-minify-selectors": "^5.1.0", + "postcss-normalize-charset": "^5.0.1", + "postcss-normalize-display-values": "^5.0.1", + "postcss-normalize-positions": "^5.0.1", + "postcss-normalize-repeat-style": "^5.0.1", + "postcss-normalize-string": "^5.0.1", + "postcss-normalize-timing-functions": "^5.0.1", + "postcss-normalize-unicode": "^5.0.1", + "postcss-normalize-url": "^5.0.2", + "postcss-normalize-whitespace": "^5.0.1", + "postcss-ordered-values": "^5.0.2", + "postcss-reduce-initial": "^5.0.1", + "postcss-reduce-transforms": "^5.0.1", + "postcss-svgo": "^5.0.3", + "postcss-unique-selectors": "^5.0.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-2.0.1.tgz", + "integrity": "sha512-i8vLRZTnEH9ubIyfdZCAdIdgnHAUeQeByEeQ2I7oTilvP9oHO6RScpeq3GsFUVqeB8uZgOQ9pw8utofNn32hhQ==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/dayjs": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.7.tgz", + "integrity": "sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "dependencies": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, + "node_modules/del": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", + "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", + "dev": true, + "dependencies": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del/node_modules/globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "node_modules/detective": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", + "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", + "dev": true, + "dependencies": { + "acorn-node": "^1.6.1", + "defined": "^1.0.0", + "minimist": "^1.1.1" + }, + "bin": { + "detective": "bin/detective.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "node_modules/dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "dev": true, + "dependencies": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "dependencies": { + "buffer-indexof": "^1.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/dom-serializer/node_modules/domhandler": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz", + "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true, + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "node_modules/domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz", + "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/domutils/node_modules/domhandler": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz", + "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "dev": true + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.3.896", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.896.tgz", + "integrity": "sha512-NcGkBVXePiuUrPLV8IxP43n1EOtdg+dudVjrfVEUd/bOqpQUFZ2diL5PPYzbgEhZFEltdXV3AcyKwGnEQ5lhMA==", + "dev": true + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz", + "integrity": "sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "dev": true, + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.8.57", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.8.57.tgz", + "integrity": "sha512-j02SFrUwFTRUqiY0Kjplwjm1psuzO1d6AjaXKuOR9hrY0HuPsT6sV42B6myW34h1q4CRy+Y3g4RU/cGJeI/nNA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "dependencies": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/file-loader/node_modules/loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/file-type": { + "version": "12.4.2", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-12.4.2.tgz", + "integrity": "sha512-UssQP5ZgIOKelfsaB5CuGAL+Y+q7EmONuiwF3N5HAH0t27rvrttgi6Ra9k/+DVaY9UF6+ybxu5pOXLUdA8N7Vg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/filepond": { + "version": "4.30.3", + "resolved": "https://registry.npmjs.org/filepond/-/filepond-4.30.3.tgz", + "integrity": "sha512-G2b1LEe90Sq2vH0SYDASTB+vVU735NBctzIaFPlZtb14QAgi/AL89WyQ6LhTfqgyrMyuZur2O9yHAmzS2E9ZnA==", + "dev": true + }, + "node_modules/filepond-plugin-file-validate-size": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/filepond-plugin-file-validate-size/-/filepond-plugin-file-validate-size-2.2.5.tgz", + "integrity": "sha512-x+fYZl317R17w3dExKab1oYZa10Wl2HcXKD6dzIgRKyngEHtjBF99geGaiDPk9IfozV8Zjzx69D7urcthF2CYQ==", + "dev": true, + "peerDependencies": { + "filepond": ">=3.1.2 <5.x" + } + }, + "node_modules/filepond-plugin-file-validate-type": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/filepond-plugin-file-validate-type/-/filepond-plugin-file-validate-type-1.2.6.tgz", + "integrity": "sha512-3JFxpb4o5D4BssP/Drjn2GPpejg/QXzU4e3/Pq8IvIJuokHz95b6+RPYstQ+6ITKREYup0N8F/CO/OQfhVkUgg==", + "dev": true, + "peerDependencies": { + "filepond": ">=1.x <5.x" + } + }, + "node_modules/filepond-plugin-image-crop": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/filepond-plugin-image-crop/-/filepond-plugin-image-crop-2.0.6.tgz", + "integrity": "sha512-bSy/KND4EP/QtW8MxIj23qgSEPUVRrT8XdktJ+OU9y8xRjFjTG+qcuw1LsycARQYRtzi8cZrD3P4POOITfkywQ==", + "dev": true, + "peerDependencies": { + "filepond": ">=3.x <5.x" + } + }, + "node_modules/filepond-plugin-image-exif-orientation": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/filepond-plugin-image-exif-orientation/-/filepond-plugin-image-exif-orientation-1.0.11.tgz", + "integrity": "sha512-hLBc12Fk6Zkj3L8mSAn+elugHOqT5rLUbgVXQQIQjMe0FsGjtpoxqeVR6jt4IWHGat2L9sFAgU2TGmd1mqosCg==", + "dev": true, + "peerDependencies": { + "filepond": ">=3.x <5.x" + } + }, + "node_modules/filepond-plugin-image-preview": { + "version": "4.6.10", + "resolved": "https://registry.npmjs.org/filepond-plugin-image-preview/-/filepond-plugin-image-preview-4.6.10.tgz", + "integrity": "sha512-C7Q5Sr/d4RQb2nMNQR93OiMt91OHxpvmIBGl+CO1dZE46lM49NUfI08dyElAOxTslDcA8pAfjFFCKo0sNYbrBg==", + "dev": true, + "peerDependencies": { + "filepond": ">=4.x <5.x" + } + }, + "node_modules/filepond-plugin-image-resize": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/filepond-plugin-image-resize/-/filepond-plugin-image-resize-2.0.10.tgz", + "integrity": "sha512-irX+J275u8Ph1KcciCeSQmxeFjbu0+co5XVCkiwdSNnz6KiqrCKN7RXTvEbdgSdDzyi5omr2oP1rKWps5L1RsQ==", + "dev": true, + "peerDependencies": { + "filepond": ">=3.x <5.x" + } + }, + "node_modules/filepond-plugin-image-transform": { + "version": "3.8.7", + "resolved": "https://registry.npmjs.org/filepond-plugin-image-transform/-/filepond-plugin-image-transform-3.8.7.tgz", + "integrity": "sha512-vgKwyIDG2y5twanf7YpqZvxkaLudTjwd9vRcoq5sQDB8egUlX5/NA0bQ0823pocrm0fjbFeetICu44mkqeDkIA==", + "dev": true, + "peerDependencies": { + "filepond": ">=3.6.0 <5.x" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/focus-trap": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-6.7.1.tgz", + "integrity": "sha512-a6czHbT9twVpy2RpkWQA9vIgwQgB9Nx1PIxNNUxQT4nugG/3QibwxO+tWTh9i+zSY2SFiX4pnYhTaFaQF/6ZAg==", + "dev": true, + "dependencies": { + "tabbable": "^5.2.1" + } + }, + "node_modules/follow-redirects": { + "version": "1.14.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.5.tgz", + "integrity": "sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.2.tgz", + "integrity": "sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "dev": true, + "dependencies": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, + "node_modules/growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash-base/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/hash-base/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", + "dev": true + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "dev": true + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", + "dev": true + }, + "node_modules/hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", + "dev": true + }, + "node_modules/html-entities": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz", + "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==", + "dev": true + }, + "node_modules/html-loader": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-1.3.2.tgz", + "integrity": "sha512-DEkUwSd0sijK5PF3kRWspYi56XP7bTNkyg5YWSzBdjaSDmvCufep5c4Vpb3PBf6lUL0YPtLwBfy9fL0t5hBAGA==", + "dev": true, + "dependencies": { + "html-minifier-terser": "^5.1.1", + "htmlparser2": "^4.1.0", + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/html-loader/node_modules/loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/html-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/html-minifier-terser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", + "dev": true, + "dependencies": { + "camel-case": "^4.1.1", + "clean-css": "^4.2.3", + "commander": "^4.1.1", + "he": "^1.2.0", + "param-case": "^3.0.3", + "relateurl": "^0.2.7", + "terser": "^4.6.3" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/html-minifier-terser/node_modules/clean-css": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", + "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", + "dev": true, + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/html-minifier-terser/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/html-minifier-terser/node_modules/terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dev": true, + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/html-minifier-terser/node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/html-tags": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", + "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/htmlparser2": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-4.1.0.tgz", + "integrity": "sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^3.0.0", + "domutils": "^2.0.0", + "entities": "^2.0.0" + } + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "node_modules/http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/http-parser-js": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", + "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.1.tgz", + "integrity": "sha512-cfaXRVoZxSed/BmkA7SwBVNI9Kj7HFltaE5rqYOub5kWzWZ+gofV2koVN1j2rMW7pEfSSlCHGJ31xmuyFyfLOg==", + "dev": true, + "dependencies": { + "@types/http-proxy": "^1.17.5", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", + "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/imagemin": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/imagemin/-/imagemin-7.0.1.tgz", + "integrity": "sha512-33AmZ+xjZhg2JMCe+vDf6a9mzWukE7l+wAtesjE7KyteqqKjzxv7aVQeWnul1Ve26mWvEQqyPwl0OctNBfSR9w==", + "dev": true, + "dependencies": { + "file-type": "^12.0.0", + "globby": "^10.0.0", + "graceful-fs": "^4.2.2", + "junk": "^3.1.0", + "make-dir": "^3.0.0", + "p-pipe": "^3.0.0", + "replace-ext": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/imask": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/imask/-/imask-6.2.2.tgz", + "integrity": "sha512-oREITqngsjD0YxO62UpVQSxLNjIcb/mNO9hX2F8xQ282Kj3X9KXEAobipbUXz5R5NgtiL6nOPrWwo+AnLuz5AQ==", + "dev": true, + "engines": { + "npm": ">=4.0.0" + } + }, + "node_modules/img-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/img-loader/-/img-loader-4.0.0.tgz", + "integrity": "sha512-UwRcPQdwdOyEHyCxe1V9s9YFwInwEWCpoO+kJGfIqDrBDqA8jZUsEZTxQ0JteNPGw/Gupmwesk2OhLTcnw6tnQ==", + "dev": true, + "dependencies": { + "loader-utils": "^1.1.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "imagemin": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/import-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz", + "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==", + "dev": true, + "dependencies": { + "import-from": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", + "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.3.tgz", + "integrity": "sha512-bE9iaUY3CXH8Cwfan/abDKAxe1KGT9kyGsBPqf6DMK/z0a2OzAsrukeYNgIH6cH5Xr452jb1TUL8rSfCLjZ9uA==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/internal-ip": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-6.2.0.tgz", + "integrity": "sha512-D8WGsR6yDt8uq7vDMu7mjcR+yRMm3dW8yufyChmszWRjcSHuxLBkR3GdS2HZAjodsaGuCvXeEJpueisXJULghg==", + "dev": true, + "dependencies": { + "default-gateway": "^6.0.0", + "ipaddr.js": "^1.9.1", + "is-ip": "^3.1.0", + "p-event": "^4.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/internal-ip?sponsor=1" + } + }, + "node_modules/internal-ip/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "node_modules/ip-regex": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", + "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ipaddr.js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "dev": true, + "dependencies": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "node_modules/is-color-stop/node_modules/css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/is-core-module": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", + "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-ip": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-3.1.0.tgz", + "integrity": "sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==", + "dev": true, + "dependencies": { + "ip-regex": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.3.1.tgz", + "integrity": "sha512-ks3WCzsiZaOPJl/oMsDjaf0TRiSv7ctNgs0FqRr2nARsovz6AWWy4oLElwcquGSz692DzgZQrCLScPNs5YlC4g==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/junk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz", + "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klona": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", + "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/laravel-mix": { + "version": "6.0.39", + "resolved": "https://registry.npmjs.org/laravel-mix/-/laravel-mix-6.0.39.tgz", + "integrity": "sha512-ChTRKSNx9ViD3Xw1+BDQUZ0PLETcBrXlM7vNmomoDUZBXLUurVUJ9oaRUdGmH/WENNqL0qQ8FFxjq+6U368Nlg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.15.8", + "@babel/plugin-proposal-object-rest-spread": "^7.15.6", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.15.8", + "@babel/preset-env": "^7.15.8", + "@babel/runtime": "^7.15.4", + "@types/babel__core": "^7.1.16", + "@types/clean-css": "^4.2.5", + "@types/imagemin-gifsicle": "^7.0.1", + "@types/imagemin-mozjpeg": "^8.0.1", + "@types/imagemin-optipng": "^5.2.1", + "@types/imagemin-svgo": "^8.0.0", + "autoprefixer": "^10.4.0", + "babel-loader": "^8.2.3", + "chalk": "^4.1.2", + "chokidar": "^3.5.2", + "clean-css": "^4.2.3 || ^5.1.2", + "cli-table3": "^0.6.0", + "collect.js": "^4.28.5", + "commander": "^7.2.0", + "concat": "^1.0.3", + "css-loader": "^5.2.6", + "cssnano": "^5.0.8", + "dotenv": "^10.0.0", + "dotenv-expand": "^5.1.0", + "file-loader": "^6.2.0", + "fs-extra": "^10.0.0", + "glob": "^7.2.0", + "html-loader": "^1.3.2", + "imagemin": "^7.0.1", + "img-loader": "^4.0.0", + "lodash": "^4.17.21", + "md5": "^2.3.0", + "mini-css-extract-plugin": "^1.6.2", + "node-libs-browser": "^2.2.1", + "postcss-load-config": "^3.1.0", + "postcss-loader": "^6.2.0", + "semver": "^7.3.5", + "strip-ansi": "^6.0.0", + "style-loader": "^2.0.0", + "terser": "^5.9.0", + "terser-webpack-plugin": "^5.2.4", + "vue-style-loader": "^4.1.3", + "webpack": "^5.60.0", + "webpack-cli": "^4.9.1", + "webpack-dev-server": "4.4.0", + "webpack-merge": "^5.8.0", + "webpack-notifier": "^1.14.1", + "webpackbar": "^5.0.0-3", + "yargs": "^17.2.1" + }, + "bin": { + "laravel-mix": "bin/cli.js", + "mix": "bin/cli.js" + }, + "engines": { + "node": ">=12.14.0" + }, + "peerDependencies": { + "@babel/core": "^7.15.8", + "@babel/plugin-proposal-object-rest-spread": "^7.15.6", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.15.8", + "@babel/preset-env": "^7.15.8", + "postcss": "^8.3.11", + "webpack": "^5.60.0", + "webpack-cli": "^4.9.1" + } + }, + "node_modules/lilconfig": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz", + "integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "node_modules/loader-runner": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", + "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/loader-utils/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.castarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", + "integrity": "sha1-wCUTUV4wna3dTCTGDP3c9ZdtkRU=", + "dev": true + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", + "dev": true + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.topath": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.topath/-/lodash.topath-4.5.2.tgz", + "integrity": "sha1-NhY1Hzu6YZlKCTGYlmC9AyVP0Ak=", + "dev": true + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/marked": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/marked/-/marked-3.0.8.tgz", + "integrity": "sha512-0gVrAjo5m0VZSJb4rpL59K1unJAMb/hm8HRXqasD8VeC8m91ytDPMritgFSlKonfdt+rRYYpP/JfLxgIX8yoSw==", + "dev": true, + "bin": { + "marked": "bin/marked" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "dev": true, + "dependencies": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/mdhl": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/mdhl/-/mdhl-0.0.6.tgz", + "integrity": "sha512-dY0ld/laPE9+9aq7LwGhg+zME0autnOR0juhf6AA/Njs0/awITgbxmUD/cHq8y07bV9j1JQbYM1RnLqhFym5KA==", + "dev": true, + "engines": { + "node": ">=12.17.0" + } + }, + "node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.3.0.tgz", + "integrity": "sha512-BEE62uMfKOavX3iG7GYX43QJ+hAeeWnwIAuJ/R6q96jaMtiLzhsxHJC8B1L7fK7Pt/vXDRwb3SG/yBpNGDPqzg==", + "dev": true, + "dependencies": { + "fs-monkey": "1.0.3" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "dev": true, + "dependencies": { + "mime-db": "1.51.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.6.2.tgz", + "integrity": "sha512-WhDvO3SjGm40oV5y26GjMJYjd2UMqrLAGKy5YS2/3QKJy2F7jgynuHTir/tgUUOiNQu5saXHdc8reo7YuhhT4Q==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0", + "webpack-sources": "^1.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.4.0 || ^5.0.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/mini-svg-data-uri": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.3.tgz", + "integrity": "sha512-gSfqpMRC8IxghvMcxzzmMnWpXAChSA+vy4cia33RgerMS8Fex95akUyQZPbxJJmeBGiGmK7n/1OpUX8ksRjIdA==", + "dev": true, + "bin": { + "mini-svg-data-uri": "cli.js" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/modern-normalize": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/modern-normalize/-/modern-normalize-1.1.0.tgz", + "integrity": "sha512-2lMlY1Yc1+CUy0gw4H95uNN7vjbpoED7NNRSBHE25nWfLBdmMzFCsPshlzbxHz+gYMcBEUN8V4pU16prcdPSgA==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "dependencies": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.1.30", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz", + "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "dev": true, + "dependencies": { + "lodash": "^4.17.21" + } + }, + "node_modules/node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "dev": true, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "dependencies": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + } + }, + "node_modules/node-notifier": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-9.0.1.tgz", + "integrity": "sha512-fPNFIp2hF/Dq7qLDzSg4vZ0J4e9v60gJR+Qx7RbjbWqzPDdEqeVpEx5CFeDAELIl+A/woaaNn1fQ5nEVerMxJg==", + "dev": true, + "dependencies": { + "growly": "^1.3.0", + "is-wsl": "^2.2.0", + "semver": "^7.3.2", + "shellwords": "^0.1.1", + "uuid": "^8.3.0", + "which": "^2.0.2" + } + }, + "node_modules/node-notifier/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/node-releases": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/normalize.css": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz", + "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==", + "dev": true + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "node_modules/p-event": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", + "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", + "dev": true, + "dependencies": { + "p-timeout": "^3.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-pipe": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-3.1.0.tgz", + "integrity": "sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz", + "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==", + "dev": true, + "dependencies": { + "@types/retry": "^0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "dev": true, + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "dependencies": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dev": true, + "dependencies": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/portfinder/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/postcss": { + "version": "8.3.11", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.11.tgz", + "integrity": "sha512-hCmlUAIlUiav8Xdqw3Io4LcpA1DOt7h3LSTAC4G6JGHFFaWzI6qvFt9oilvl8BmkbBRX1IhM90ZAmpk68zccQA==", + "dev": true, + "dependencies": { + "nanoid": "^3.1.30", + "picocolors": "^1.0.0", + "source-map-js": "^0.6.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-calc": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.0.0.tgz", + "integrity": "sha512-5NglwDrcbiy8XXfPM11F3HeC6hoT9W7GUH/Zi5U/p7u3Irv4rHhdDcIZwG0llHXV4ftsBjpfWMXAnXNl4lnt8g==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-colormin": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.2.1.tgz", + "integrity": "sha512-VVwMrEYLcHYePUYV99Ymuoi7WhKrMGy/V9/kTS0DkCoJYmmjdOMneyhzYUxcNgteKDVbrewOkSM7Wje/MFwxzA==", + "dev": true, + "dependencies": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-convert-values": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.0.2.tgz", + "integrity": "sha512-KQ04E2yadmfa1LqXm7UIDwW1ftxU/QWZmz6NKnHnUvJ3LEYbbcX6i329f/ig+WnEByHegulocXrECaZGLpL8Zg==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-comments": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.0.1.tgz", + "integrity": "sha512-lgZBPTDvWrbAYY1v5GYEv8fEO/WhKOu/hmZqmCYfrpD6eyDWWzAOsl2rF29lpvziKO02Gc5GJQtlpkTmakwOWg==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.1.tgz", + "integrity": "sha512-svx747PWHKOGpAXXQkCc4k/DsWo+6bc5LsVrAsw+OU+Ibi7klFZCyX54gjYzX4TH+f2uzXjRviLARxkMurA2bA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-empty": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.0.1.tgz", + "integrity": "sha512-vfU8CxAQ6YpMxV2SvMcMIyF2LX1ZzWpy0lqHDsOdaKKLQVQGVP1pzhrI9JlsO65s66uQTfkQBKBD/A5gp9STFw==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.0.1.tgz", + "integrity": "sha512-Y28H7y93L2BpJhrdUR2SR2fnSsT+3TVx1NmVQLbcnZWwIUpJ7mfcTC6Za9M2PG6w8j7UQRfzxqn8jU2VwFxo3Q==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-functions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-functions/-/postcss-functions-3.0.0.tgz", + "integrity": "sha1-DpTQFERwCkgd4g3k1V+yZAVkJQ4=", + "dev": true, + "dependencies": { + "glob": "^7.1.2", + "object-assign": "^4.1.1", + "postcss": "^6.0.9", + "postcss-value-parser": "^3.3.0" + } + }, + "node_modules/postcss-functions/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-functions/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-functions/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/postcss-functions/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/postcss-functions/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-functions/node_modules/postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "dependencies": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/postcss-functions/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/postcss-functions/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-functions/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-js": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-3.0.3.tgz", + "integrity": "sha512-gWnoWQXKFw65Hk/mi2+WTQTHdPD5UJdDXZmX073EY/B3BWnYjO4F4t0VneTCnCGQ5E5GsCdMkzPaTXwl3r5dJw==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1", + "postcss": "^8.1.6" + }, + "engines": { + "node": ">=10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-load-config": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.0.tgz", + "integrity": "sha512-ipM8Ds01ZUophjDTQYSVP70slFSYg3T0/zyfII5vzhN6V57YSxMgG5syXuwi5VtS8wSf3iL30v0uBdoIVx4Q0g==", + "dev": true, + "dependencies": { + "import-cwd": "^3.0.0", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.0.tgz", + "integrity": "sha512-H9hv447QjQJVDbHj3OUdciyAXY3v5+UDduzEytAlZCVHCpNAAg/mCSwhYYqZr9BiGYhmYspU8QXxZwiHTLn3yA==", + "dev": true, + "dependencies": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.4", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.0.3.tgz", + "integrity": "sha512-kmB+1TjMTj/bPw6MCDUiqSA5e/x4fvLffiAdthra3a0m2/IjTrWsTmD3FdSskzUjEwkj5ZHBDEbv5dOcqD7CMQ==", + "dev": true, + "dependencies": { + "css-color-names": "^1.0.1", + "postcss-value-parser": "^4.1.0", + "stylehacks": "^5.0.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-rules": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.0.2.tgz", + "integrity": "sha512-5K+Md7S3GwBewfB4rjDeol6V/RZ8S+v4B66Zk2gChRqLTCC8yjnHQ601omj9TKftS19OPGqZ/XzoqpzNQQLwbg==", + "dev": true, + "dependencies": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^2.0.1", + "postcss-selector-parser": "^6.0.5", + "vendors": "^1.0.3" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.0.1.tgz", + "integrity": "sha512-7JS4qIsnqaxk+FXY1E8dHBDmraYFWmuL6cgt0T1SWGRO5bzJf8sUoelwa4P88LEWJZweHevAiDKxHlofuvtIoA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.0.3.tgz", + "integrity": "sha512-Z91Ol22nB6XJW+5oe31+YxRsYooxOdFKcbOqY/V8Fxse1Y3vqlNRpi1cxCqoACZTQEhl+xvt4hsbWiV5R+XI9Q==", + "dev": true, + "dependencies": { + "colord": "^2.9.1", + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-params": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.0.1.tgz", + "integrity": "sha512-4RUC4k2A/Q9mGco1Z8ODc7h+A0z7L7X2ypO1B6V8057eVK6mZ6xwz6QN64nHuHLbqbclkX1wyzRnIrdZehTEHw==", + "dev": true, + "dependencies": { + "alphanum-sort": "^1.0.2", + "browserslist": "^4.16.0", + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0", + "uniqs": "^2.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.1.0.tgz", + "integrity": "sha512-NzGBXDa7aPsAcijXZeagnJBKBPMYLaJJzB8CQh6ncvyl2sIndLVWfbcDi0SBjRWk5VqEjXvf8tYwzoKf4Z07og==", + "dev": true, + "dependencies": { + "alphanum-sort": "^1.0.2", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-nested": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", + "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.6" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.0.1.tgz", + "integrity": "sha512-6J40l6LNYnBdPSk+BHZ8SF+HAkS4q2twe5jnocgd+xWpz/mx/5Sa32m3W1AA8uE8XaXN+eg8trIlfu8V9x61eg==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.0.1.tgz", + "integrity": "sha512-uupdvWk88kLDXi5HEyI9IaAJTE3/Djbcrqq8YgjvAVuzgVuqIk3SuJWUisT2gaJbZm1H9g5k2w1xXilM3x8DjQ==", + "dev": true, + "dependencies": { + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.0.1.tgz", + "integrity": "sha512-rvzWAJai5xej9yWqlCb1OWLd9JjW2Ex2BCPzUJrbaXmtKtgfL8dBMOOMTX6TnvQMtjk3ei1Lswcs78qKO1Skrg==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.1.tgz", + "integrity": "sha512-syZ2itq0HTQjj4QtXZOeefomckiV5TaUO6ReIEabCh3wgDs4Mr01pkif0MeVwKyU/LHEkPJnpwFKRxqWA/7O3w==", + "dev": true, + "dependencies": { + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-string": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.0.1.tgz", + "integrity": "sha512-Ic8GaQ3jPMVl1OEn2U//2pm93AXUcF3wz+OriskdZ1AOuYV25OdgS7w9Xu2LO5cGyhHCgn8dMXh9bO7vi3i9pA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.0.1.tgz", + "integrity": "sha512-cPcBdVN5OsWCNEo5hiXfLUnXfTGtSFiBU9SK8k7ii8UD7OLuznzgNRYkLZow11BkQiiqMcgPyh4ZqXEEUrtQ1Q==", + "dev": true, + "dependencies": { + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.1.tgz", + "integrity": "sha512-kAtYD6V3pK0beqrU90gpCQB7g6AOfP/2KIPCVBKJM2EheVsBQmx/Iof+9zR9NFKLAx4Pr9mDhogB27pmn354nA==", + "dev": true, + "dependencies": { + "browserslist": "^4.16.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-url": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.0.2.tgz", + "integrity": "sha512-k4jLTPUxREQ5bpajFQZpx8bCF2UrlqOTzP9kEqcEnOfwsRshWs2+oAFIHfDQB8GO2PaUaSE0NlTAYtbluZTlHQ==", + "dev": true, + "dependencies": { + "is-absolute-url": "^3.0.3", + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.1.tgz", + "integrity": "sha512-iPklmI5SBnRvwceb/XH568yyzK0qRVuAG+a1HFUsFRf11lEJTiQQa03a4RSCQvLKdcpX7XsI1Gen9LuLoqwiqA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-ordered-values": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.0.2.tgz", + "integrity": "sha512-8AFYDSOYWebJYLyJi3fyjl6CqMEG/UVworjiyK1r573I56kb3e879sCJLGvR3merj+fAdPpVplXKQZv+ey6CgQ==", + "dev": true, + "dependencies": { + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.0.1.tgz", + "integrity": "sha512-zlCZPKLLTMAqA3ZWH57HlbCjkD55LX9dsRyxlls+wfuRfqCi5mSlZVan0heX5cHr154Dq9AfbH70LyhrSAezJw==", + "dev": true, + "dependencies": { + "browserslist": "^4.16.0", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.1.tgz", + "integrity": "sha512-a//FjoPeFkRuAguPscTVmRQUODP+f3ke2HqFNgGPwdYnpeC29RZdCBvGRGTsKpMURb/I3p6jdKoBQ2zI+9Q7kA==", + "dev": true, + "dependencies": { + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", + "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.0.3.tgz", + "integrity": "sha512-41XZUA1wNDAZrQ3XgWREL/M2zSw8LJPvb5ZWivljBsUQAGoEKMYm6okHsTjJxKYI4M75RQEH4KYlEM52VwdXVA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.1.0", + "svgo": "^2.7.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.0.1.tgz", + "integrity": "sha512-gwi1NhHV4FMmPn+qwBNuot1sG1t2OmacLQ/AX29lzyggnjd+MnVD5uqQmpXO3J17KGL2WAxQruj1qTd3H0gG/w==", + "dev": true, + "dependencies": { + "alphanum-sort": "^1.0.2", + "postcss-selector-parser": "^6.0.5", + "uniqs": "^2.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "dev": true + }, + "node_modules/pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pretty-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", + "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + }, + "node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "node_modules/purgecss": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-4.0.3.tgz", + "integrity": "sha512-PYOIn5ibRIP34PBU9zohUcCI09c7drPJJtTDAc0Q6QlRz2/CHQ8ywGLdE7ZhxU2VTqB7p5wkvj5Qcm05Rz3Jmw==", + "dev": true, + "dependencies": { + "commander": "^6.0.0", + "glob": "^7.0.0", + "postcss": "^8.2.1", + "postcss-selector-parser": "^6.0.2" + }, + "bin": { + "purgecss": "bin/purgecss.js" + } + }, + "node_modules/purgecss/node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "dependencies": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "dependencies": { + "resolve": "^1.9.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/reduce-css-calc": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-2.1.8.tgz", + "integrity": "sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg==", + "dev": true, + "dependencies": { + "css-unit-converter": "^1.1.1", + "postcss-value-parser": "^3.3.0" + } + }, + "node_modules/reduce-css-calc/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz", + "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", + "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^9.0.0", + "regjsgen": "^0.5.2", + "regjsparser": "^0.7.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true + }, + "node_modules/regjsparser": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz", + "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", + "dev": true + }, + "node_modules/rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", + "dev": true + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "node_modules/selfsigned": { + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", + "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", + "dev": true, + "dependencies": { + "node-forge": "^0.10.0" + } + }, + "node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, + "node_modules/signal-exit": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", + "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==", + "dev": true + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dev": true, + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/sockjs": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", + "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^3.4.0", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", + "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", + "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/spdy-transport/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/std-env": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.0.1.tgz", + "integrity": "sha512-mC1Ps9l77/97qeOZc+HrOL7TIaOboHqMZ24dGVQrlxFcpPpfCHpH+qfUT7Dz+6mlG8+JPA1KfBQo19iC/+Ngcw==", + "dev": true + }, + "node_modules/stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/style-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz", + "integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/style-loader/node_modules/loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/style-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/stylehacks": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.0.1.tgz", + "integrity": "sha512-Es0rVnHIqbWzveU1b24kbw92HsebBepxfcqe5iix7t9j0PQqhs0IxXVXv0pY2Bxa08CgMkzD6OWql7kbGOuEdA==", + "dev": true, + "dependencies": { + "browserslist": "^4.16.0", + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dev": true, + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tabbable": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-5.2.1.tgz", + "integrity": "sha512-40pEZ2mhjaZzK0BnI+QGNjJO8UYx9pP5v7BGe17SORTO0OEuuaAwQTkAp8whcZvqon44wKFOikD+Al11K3JICQ==", + "dev": true + }, + "node_modules/tailwindcss": { + "version": "2.2.19", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-2.2.19.tgz", + "integrity": "sha512-6Ui7JSVtXadtTUo2NtkBBacobzWiQYVjYW0ZnKaP9S1ZCKQ0w7KVNz+YSDI/j7O7KCMHbOkz94ZMQhbT9pOqjw==", + "dev": true, + "dependencies": { + "arg": "^5.0.1", + "bytes": "^3.0.0", + "chalk": "^4.1.2", + "chokidar": "^3.5.2", + "color": "^4.0.1", + "cosmiconfig": "^7.0.1", + "detective": "^5.2.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.7", + "fs-extra": "^10.0.0", + "glob-parent": "^6.0.1", + "html-tags": "^3.1.0", + "is-color-stop": "^1.1.0", + "is-glob": "^4.0.1", + "lodash": "^4.17.21", + "lodash.topath": "^4.5.2", + "modern-normalize": "^1.1.0", + "node-emoji": "^1.11.0", + "normalize-path": "^3.0.0", + "object-hash": "^2.2.0", + "postcss-js": "^3.0.3", + "postcss-load-config": "^3.1.0", + "postcss-nested": "5.0.6", + "postcss-selector-parser": "^6.0.6", + "postcss-value-parser": "^4.1.0", + "pretty-hrtime": "^1.0.3", + "purgecss": "^4.0.3", + "quick-lru": "^5.1.1", + "reduce-css-calc": "^2.1.8", + "resolve": "^1.20.0", + "tmp": "^0.2.1" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "autoprefixer": "^10.0.2", + "postcss": "^8.0.9" + } + }, + "node_modules/tailwindcss-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tailwindcss-dir/-/tailwindcss-dir-4.0.0.tgz", + "integrity": "sha512-G5orTODS8sDQOZqKa2Q4Ey/F4nlxK1mTZm02iKHLxZaNjpboPews/h2KUksC5KbgIVrpmOe1hqcNYZJy07ftwA==", + "dev": true, + "dependencies": { + "tailwindcss": "^1.0.1" + } + }, + "node_modules/tailwindcss-dir/node_modules/autoprefixer": { + "version": "9.8.8", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz", + "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", + "dev": true, + "dependencies": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "picocolors": "^0.2.1", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + }, + "node_modules/tailwindcss-dir/node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "node_modules/tailwindcss-dir/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/tailwindcss-dir/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/tailwindcss-dir/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/tailwindcss-dir/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/tailwindcss-dir/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/tailwindcss-dir/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/tailwindcss-dir/node_modules/postcss-js": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-2.0.3.tgz", + "integrity": "sha512-zS59pAk3deu6dVHyrGqmC3oDXBdNdajk4k1RyxeVXCrcEDBUBHoIhE4QTsmhxgzXxsaqFDAkUZfmMa5f/N/79w==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1", + "postcss": "^7.0.18" + } + }, + "node_modules/tailwindcss-dir/node_modules/postcss-nested": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-4.2.3.tgz", + "integrity": "sha512-rOv0W1HquRCamWy2kFl3QazJMMe1ku6rCFoAAH+9AcxdbpDeBr6k968MLWuLjvjMcGEip01ak09hKOEgpK9hvw==", + "dev": true, + "dependencies": { + "postcss": "^7.0.32", + "postcss-selector-parser": "^6.0.2" + } + }, + "node_modules/tailwindcss-dir/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tailwindcss-dir/node_modules/tailwindcss": { + "version": "1.9.6", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-1.9.6.tgz", + "integrity": "sha512-nY8WYM/RLPqGsPEGEV2z63riyQPcHYZUJpAwdyBzVpxQHOHqHE+F/fvbCeXhdF1+TA5l72vSkZrtYCB9hRcwkQ==", + "dev": true, + "dependencies": { + "@fullhuman/postcss-purgecss": "^2.1.2", + "autoprefixer": "^9.4.5", + "browserslist": "^4.12.0", + "bytes": "^3.0.0", + "chalk": "^3.0.0 || ^4.0.0", + "color": "^3.1.2", + "detective": "^5.2.0", + "fs-extra": "^8.0.0", + "html-tags": "^3.1.0", + "lodash": "^4.17.20", + "node-emoji": "^1.8.1", + "normalize.css": "^8.0.1", + "object-hash": "^2.0.3", + "postcss": "^7.0.11", + "postcss-functions": "^3.0.0", + "postcss-js": "^2.0.0", + "postcss-nested": "^4.1.1", + "postcss-selector-parser": "^6.0.0", + "postcss-value-parser": "^4.1.0", + "pretty-hrtime": "^1.0.3", + "reduce-css-calc": "^2.1.6", + "resolve": "^1.14.2" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/tailwindcss-dir/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tailwindcss/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", + "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==", + "dev": true, + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "acorn": "^8.5.0" + }, + "peerDependenciesMeta": { + "acorn": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.2.5.tgz", + "integrity": "sha512-3luOVHku5l0QBeYS8r4CdHYWEGMmIj3H1U64jgkdZzECcSOJAyJ9TjuqcQZvw1Y+4AOBN9SeYJPJmFn2cM4/2g==", + "dev": true, + "dependencies": { + "jest-worker": "^27.0.6", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1", + "terser": "^5.7.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "node_modules/terser/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "node_modules/timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", + "dev": true + }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/trix": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/trix/-/trix-1.3.1.tgz", + "integrity": "sha512-BbH6mb6gk+AV4f2as38mP6Ucc1LE3OD6XxkZnAgPIduWXYtvg2mI3cZhIZSLqmMh9OITEpOBCCk88IVmyjU7bA==", + "dev": true + }, + "node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "dev": true + }, + "node_modules/tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uri-js/node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + }, + "node_modules/util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "node_modules/vue-style-loader": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz", + "integrity": "sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==", + "dev": true, + "dependencies": { + "hash-sum": "^1.0.2", + "loader-utils": "^1.0.2" + } + }, + "node_modules/watchpack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.2.0.tgz", + "integrity": "sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/webpack": { + "version": "5.64.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.64.0.tgz", + "integrity": "sha512-UclnN24m054HaPC45nmDEosX6yXWD+UGC12YtUs5i356DleAUGMDC9LBAw37xRRfgPKYIdCYjGA7RZ1AA+ZnGg==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.0", + "@types/estree": "^0.0.50", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.8.3", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.4", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.2.0", + "webpack-sources": "^3.2.0" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.1.tgz", + "integrity": "sha512-JYRFVuyFpzDxMDB+v/nanUdQYcZtqFPGzmlW4s+UkPMFhSpfRNmf1z4AwYcHJVdvEFAM7FFCQdNTpsBYhDLusQ==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.1.0", + "@webpack-cli/info": "^1.4.0", + "@webpack-cli/serve": "^1.6.0", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "execa": "^5.0.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "webpack": "4.x.x || 5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "@webpack-cli/migrate": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.2.1.tgz", + "integrity": "sha512-Kx1X+36Rn9JaZcQMrJ7qN3PMAuKmEDD9ZISjUj3Cgq4A6PtwYsC4mpaKotSRYH3iOF6HsUa8viHKS59FlyVifQ==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.2.2", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^3.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.4.0.tgz", + "integrity": "sha512-+S0XRIbsopVjPFjCO8I07FXYBWYqkFmuP56ucGMTs2hA/gV4q2M9xTmNo5Tg4o8ffRR+Nm3AsXnQXxKRyYovrA==", + "dev": true, + "dependencies": { + "ansi-html-community": "^0.0.8", + "bonjour": "^3.5.0", + "chokidar": "^3.5.2", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "del": "^6.0.0", + "express": "^4.17.1", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.0", + "internal-ip": "^6.2.0", + "ipaddr.js": "^2.0.1", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "portfinder": "^1.0.28", + "schema-utils": "^3.1.0", + "selfsigned": "^1.10.11", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "spdy": "^4.0.2", + "strip-ansi": "^7.0.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^5.2.1", + "ws": "^8.1.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-notifier": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/webpack-notifier/-/webpack-notifier-1.14.1.tgz", + "integrity": "sha512-OVOoiOyKHS3z9pN1nLdPY2Pf/R3wiBsN0KiPc3K6ApwMBfHbyUomQc2Mr0naeKxfqXyCBPHfQuqpL9yoL0rgkA==", + "dev": true, + "dependencies": { + "node-notifier": "^9.0.0", + "strip-ansi": "^6.0.0" + }, + "peerDependencies": { + "@types/webpack": "^4.41.31" + }, + "peerDependenciesMeta": { + "@types/webpack": { + "optional": true + } + } + }, + "node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/webpack-sources/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack/node_modules/webpack-sources": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.2.tgz", + "integrity": "sha512-cp5qdmHnu5T8wRg2G3vZZHoJPN14aqQ89SyQ11NpGH5zEMDCclt49rzo+MaRazk7/UeILhAI+/sEtcM+7Fr0nw==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpackbar": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz", + "integrity": "sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "consola": "^2.15.3", + "pretty-time": "^1.1.0", + "std-env": "^3.0.1" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "webpack": "3 || 4 || 5" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/ws": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "17.2.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.2.1.tgz", + "integrity": "sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + } + }, + "dependencies": { + "@alpinejs/trap": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@alpinejs/trap/-/trap-3.5.1.tgz", + "integrity": "sha512-D0EnbOnKOliY+Sl2+1xHAAipeGTivZP7v7gDL/Xg1MIQOPuV0yXdpjGz9CvA7TKju35lJmbMvWQESzYtVi6YGg==", + "dev": true, + "requires": { + "focus-trap": "^6.6.1" + } + }, + "@babel/code-frame": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", + "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.0" + } + }, + "@babel/compat-data": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.0.tgz", + "integrity": "sha512-DGjt2QZse5SGd9nfOSqO4WLJ8NN/oHkijbXbPrxuoJO3oIPJL3TciZs9FX+cOHNiY9E9l0opL8g7BmLe3T+9ew==", + "dev": true + }, + "@babel/core": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz", + "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.0", + "@babel/helper-compilation-targets": "^7.16.0", + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helpers": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", + "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz", + "integrity": "sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.0.tgz", + "integrity": "sha512-9KuleLT0e77wFUku6TUkqZzCEymBdtuQQ27MhEKzf9UOOJu3cYj98kyaDAzxpC7lV6DGiZFuC8XqDsq8/Kl6aQ==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz", + "integrity": "sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.16.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.17.5", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.0.tgz", + "integrity": "sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-member-expression-to-functions": "^7.16.0", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/helper-replace-supers": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.0.tgz", + "integrity": "sha512-3DyG0zAFAZKcOp7aVr33ddwkxJ0Z0Jr5V99y3I690eYLpukJsJvAbzTy1ewoCqsML8SbIrjH14Jc/nSQ4TvNPA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "regexpu-core": "^4.7.1" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.4.tgz", + "integrity": "sha512-OrpPZ97s+aPi6h2n1OXzdhVis1SGSsMU2aMHgLcOKfsp4/v1NWpx3CWT3lBj5eeBq9cDkPkh+YCfdF7O12uNDQ==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.0.tgz", + "integrity": "sha512-Hk2SLxC9ZbcOhLpg/yMznzJ11W++lg5GMbxt1ev6TXUiJB0N42KPC+7w8a+eWGuqDnUYuwStJoZHM7RgmIOaGQ==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-function-name": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", + "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", + "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz", + "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz", + "integrity": "sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", + "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-module-transforms": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz", + "integrity": "sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-replace-supers": "^7.16.0", + "@babel/helper-simple-access": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", + "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", + "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.0.tgz", + "integrity": "sha512-MLM1IOMe9aQBqMWxcRw8dcb9jlM86NIw7KA0Wri91Xkfied+dE0QuBFSBjMNvqzmS0OSIDsMNC24dBEkPUi7ew==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-wrap-function": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-replace-supers": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz", + "integrity": "sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.16.0", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-simple-access": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", + "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", + "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", + "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.0.tgz", + "integrity": "sha512-VVMGzYY3vkWgCJML+qVLvGIam902mJW0FvT7Avj1zEe0Gn7D93aWdLblYARTxEw+6DhZmtzhBM2zv0ekE5zg1g==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/helpers": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.3.tgz", + "integrity": "sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w==", + "dev": true, + "requires": { + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.3", + "@babel/types": "^7.16.0" + } + }, + "@babel/highlight": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", + "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.3.tgz", + "integrity": "sha512-dcNwU1O4sx57ClvLBVFbEgx0UZWfd0JQX5X6fxFRCLHelFBGXFfSz6Y0FAq2PEwUqlqLkdVjVr4VASEOuUnLJw==", + "dev": true + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.16.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.2.tgz", + "integrity": "sha512-h37CvpLSf8gb2lIJ2CgC3t+EjFbi0t8qS7LCS1xcJIlEXE4czlofwaW7W1HA8zpgOCzI9C1nmoqNR1zWkk0pQg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.0.tgz", + "integrity": "sha512-4tcFwwicpWTrpl9qjf7UsoosaArgImF85AxqCRZlgc3IQDvkUHjJpruXAL58Wmj+T6fypWTC/BakfEkwIL/pwA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.0" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.0.tgz", + "integrity": "sha512-nyYmIo7ZqKsY6P4lnVmBlxp9B3a96CscbLotlsNuktMHahkDwoPYEjXrZHU0Tj844Z9f1IthVxQln57mhkcExw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.16.0", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.0.tgz", + "integrity": "sha512-mCF3HcuZSY9Fcx56Lbn+CGdT44ioBMMvjNVldpKtj8tpniETdLjnxdHI1+sDWXIM1nNt+EanJOZ3IG9lzVjs7A==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.0.tgz", + "integrity": "sha512-mAy3sdcY9sKAkf3lQbDiv3olOfiLqI51c9DR9b19uMoR2Z6r5pmGl7dfNFqEvqOyqbf1ta4lknK4gc5PJn3mfA==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.0.tgz", + "integrity": "sha512-QGSA6ExWk95jFQgwz5GQ2Dr95cf7eI7TKutIXXTb7B1gCLTCz5hTjFTQGfLFBBiC5WSNi7udNwWsqbbMh1c4yQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.0.tgz", + "integrity": "sha512-CjI4nxM/D+5wCnhD11MHB1AwRSAYeDT+h8gCdcVJZ/OK7+wRzFsf7PFPWVpVpNRkHMmMkQWAHpTq+15IXQ1diA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.0.tgz", + "integrity": "sha512-kouIPuiv8mSi5JkEhzApg5Gn6hFyKPnlkO0a9YSzqRurH8wYzSlf6RJdzluAsbqecdW5pBvDJDfyDIUR/vLxvg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.0.tgz", + "integrity": "sha512-pbW0fE30sVTYXXm9lpVQQ/Vc+iTeQKiXlaNRZPPN2A2VdlWyAtsUrsQ3xydSlDW00TFMK7a8m3cDTkBF5WnV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.0.tgz", + "integrity": "sha512-3bnHA8CAFm7cG93v8loghDYyQ8r97Qydf63BeYiGgYbjKKB/XP53W15wfRC7dvKfoiJ34f6Rbyyx2btExc8XsQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.0.tgz", + "integrity": "sha512-FAhE2I6mjispy+vwwd6xWPyEx3NYFS13pikDBWUAFGZvq6POGs5eNchw8+1CYoEgBl9n11I3NkzD7ghn25PQ9Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.0.tgz", + "integrity": "sha512-LU/+jp89efe5HuWJLmMmFG0+xbz+I2rSI7iLc1AlaeSMDMOGzWlc5yJrMN1d04osXN4sSfpo4O+azkBNBes0jg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.16.0", + "@babel/helper-compilation-targets": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.16.0" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.0.tgz", + "integrity": "sha512-kicDo0A/5J0nrsCPbn89mTG3Bm4XgYi0CZtvex9Oyw7gGZE3HXGD0zpQNH+mo+tEfbo8wbmMvJftOwpmPy7aVw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.0.tgz", + "integrity": "sha512-Y4rFpkZODfHrVo70Uaj6cC1JJOt3Pp0MdWSwIKtb8z1/lsjl9AmnB7ErRFV+QNGIfcY1Eruc2UMx5KaRnXjMyg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.0.tgz", + "integrity": "sha512-IvHmcTHDFztQGnn6aWq4t12QaBXTKr1whF/dgp9kz84X6GUcwq9utj7z2wFCUfeOup/QKnOlt2k0zxkGFx9ubg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.0.tgz", + "integrity": "sha512-3jQUr/HBbMVZmi72LpjQwlZ55i1queL8KcDTQEkAHihttJnAPrcvG9ZNXIfsd2ugpizZo595egYV6xy+pv4Ofw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-create-class-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.0.tgz", + "integrity": "sha512-ti7IdM54NXv29cA4+bNNKEMS4jLMCbJgl+Drv+FgYy0erJLAxNAIXcNjNjrRZEcWq0xJHsNVwQezskMFpF8N9g==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.0.tgz", + "integrity": "sha512-vIFb5250Rbh7roWARvCLvIJ/PtAU5Lhv7BtZ1u24COwpI9Ypjsh+bZcKk6rlIyalK+r0jOc1XQ8I4ovNxNrWrA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.0.tgz", + "integrity": "sha512-PbIr7G9kR8tdH6g8Wouir5uVjklETk91GMVSUq+VaOgiinbCkBP6Q7NN/suM/QutZkMJMvcyAriogcYAdhg8Gw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.16.0" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.0.tgz", + "integrity": "sha512-V14As3haUOP4ZWrLJ3VVx5rCnrYhMSHN/jX7z6FAt5hjRkLsb0snPCmJwSOML5oxkKO4FNoNv7V5hw/y2bjuvg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.0.tgz", + "integrity": "sha512-27n3l67/R3UrXfizlvHGuTwsRIFyce3D/6a37GRxn28iyTPvNXaW4XvznexRh1zUNLPjbLL22Id0XQElV94ruw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.0.tgz", + "integrity": "sha512-HUxMvy6GtAdd+GKBNYDWCIA776byUQH8zjnfjxwT1P1ARv/wFu8eBDpmXQcLS/IwRtrxIReGiplOwMeyO7nsDQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.0", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-optimise-call-expression": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.0.tgz", + "integrity": "sha512-63l1dRXday6S8V3WFY5mXJwcRAnPYxvFfTlt67bwV1rTyVTM5zrp0DBBb13Kl7+ehkCVwIZPumPpFP/4u70+Tw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.0.tgz", + "integrity": "sha512-Q7tBUwjxLTsHEoqktemHBMtb3NYwyJPTJdM+wDwb0g8PZ3kQUIzNvwD5lPaqW/p54TXBc/MXZu9Jr7tbUEUM8Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.0.tgz", + "integrity": "sha512-FXlDZfQeLILfJlC6I1qyEwcHK5UpRCFkaoVyA1nk9A1L1Yu583YO4un2KsLBsu3IJb4CUbctZks8tD9xPQubLw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.0.tgz", + "integrity": "sha512-LIe2kcHKAZOJDNxujvmp6z3mfN6V9lJxubU4fJIGoQCkKe3Ec2OcbdlYP+vW++4MpxwG0d1wSDOJtQW5kLnkZQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.0.tgz", + "integrity": "sha512-OwYEvzFI38hXklsrbNivzpO3fh87skzx8Pnqi4LoSYeav0xHlueSoCJrSgTPfnbyzopo5b3YVAJkFIcUpK2wsw==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.0.tgz", + "integrity": "sha512-5QKUw2kO+GVmKr2wMYSATCTTnHyscl6sxFRAY+rvN7h7WB0lcG0o4NoV6ZQU32OZGVsYUsfLGgPQpDFdkfjlJQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.0.tgz", + "integrity": "sha512-lBzMle9jcOXtSOXUpc7tvvTpENu/NuekNJVova5lCCWCV9/U1ho2HH2y0p6mBg8fPm/syEAbfaaemYGOHCY3mg==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.0.tgz", + "integrity": "sha512-gQDlsSF1iv9RU04clgXqRjrPyyoJMTclFt3K1cjLmTKikc0s/6vE3hlDeEVC71wLTRu72Fq7650kABrdTc2wMQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.0.tgz", + "integrity": "sha512-WRpw5HL4Jhnxw8QARzRvwojp9MIE7Tdk3ez6vRyUk1MwgjJN0aNpRoXainLR5SgxmoXx/vsXGZ6OthP6t/RbUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.0.tgz", + "integrity": "sha512-rWFhWbCJ9Wdmzln1NmSCqn7P0RAD+ogXG/bd9Kg5c7PKWkJtkiXmYsMBeXjDlzHpVTJ4I/hnjs45zX4dEv81xw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.0.tgz", + "integrity": "sha512-Dzi+NWqyEotgzk/sb7kgQPJQf7AJkQBWsVp1N6JWc1lBVo0vkElUnGdr1PzUBmfsCCN5OOFya3RtpeHk15oLKQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-simple-access": "^7.16.0", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.0.tgz", + "integrity": "sha512-yuGBaHS3lF1m/5R+6fjIke64ii5luRUg97N2wr+z1sF0V+sNSXPxXDdEEL/iYLszsN5VKxVB1IPfEqhzVpiqvg==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.16.0", + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-identifier": "^7.15.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.0.tgz", + "integrity": "sha512-nx4f6no57himWiHhxDM5pjwhae5vLpTK2zCnDH8+wNLJy0TVER/LJRHl2bkt6w9Aad2sPD5iNNoUpY3X9sTGDg==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.0.tgz", + "integrity": "sha512-LogN88uO+7EhxWc8WZuQ8vxdSyVGxhkh8WTC3tzlT8LccMuQdA81e9SGV6zY7kY2LjDhhDOFdQVxdGwPyBCnvg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.0" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.0.tgz", + "integrity": "sha512-fhjrDEYv2DBsGN/P6rlqakwRwIp7rBGLPbrKxwh7oVt5NNkIhZVOY2GRV+ULLsQri1bDqwDWnU3vhlmx5B2aCw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.0.tgz", + "integrity": "sha512-fds+puedQHn4cPLshoHcR1DTMN0q1V9ou0mUjm8whx9pGcNvDrVVrgw+KJzzCaiTdaYhldtrUps8DWVMgrSEyg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.16.0" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.3.tgz", + "integrity": "sha512-3MaDpJrOXT1MZ/WCmkOFo7EtmVVC8H4EUZVrHvFOsmwkk4lOjQj8rzv8JKUZV4YoQKeoIgk07GO+acPU9IMu/w==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.0.tgz", + "integrity": "sha512-XLldD4V8+pOqX2hwfWhgwXzGdnDOThxaNTgqagOcpBgIxbUvpgU2FMvo5E1RyHbk756WYgdbS0T8y0Cj9FKkWQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.0.tgz", + "integrity": "sha512-JAvGxgKuwS2PihiSFaDrp94XOzzTUeDeOQlcKzVAyaPap7BnZXK/lvMDiubkPTdotPKOIZq9xWXWnggUMYiExg==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.0.tgz", + "integrity": "sha512-Dgs8NNCehHSvXdhEhln8u/TtJxfVwGYCgP2OOr5Z3Ar+B+zXicEOKNTyc+eca2cuEOMtjW6m9P9ijOt8QdqWkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.0.tgz", + "integrity": "sha512-zlPf1/XFn5+vWdve3AAhf+Sxl+MVa5VlwTwWgnLx23u4GlatSRQJ3Eoo9vllf0a9il3woQsT4SK+5Z7c06h8ag==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-polyfill-corejs2": "^0.2.3", + "babel-plugin-polyfill-corejs3": "^0.3.0", + "babel-plugin-polyfill-regenerator": "^0.2.3", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.0.tgz", + "integrity": "sha512-iVb1mTcD8fuhSv3k99+5tlXu5N0v8/DPm2mO3WACLG6al1CGZH7v09HJyUb1TtYl/Z+KrM6pHSIJdZxP5A+xow==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.0.tgz", + "integrity": "sha512-Ao4MSYRaLAQczZVp9/7E7QHsCuK92yHRrmVNRe/SlEJjhzivq0BSn8mEraimL8wizHZ3fuaHxKH0iwzI13GyGg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.0.tgz", + "integrity": "sha512-/ntT2NljR9foobKk4E/YyOSwcGUXtYWv5tinMK/3RkypyNBNdhHUaq6Orw5DWq9ZcNlS03BIlEALFeQgeVAo4Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.0.tgz", + "integrity": "sha512-Rd4Ic89hA/f7xUSJQk5PnC+4so50vBoBfxjdQAdvngwidM8jYIBVxBZ/sARxD4e0yMXRbJVDrYf7dyRtIIKT6Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.0.tgz", + "integrity": "sha512-++V2L8Bdf4vcaHi2raILnptTBjGEFxn5315YU+e8+EqXIucA+q349qWngCLpUYqqv233suJ6NOienIVUpS9cqg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.0.tgz", + "integrity": "sha512-VFi4dhgJM7Bpk8lRc5CMaRGlKZ29W9C3geZjt9beuzSUrlJxsNwX7ReLwaL6WEvsOf2EQkyIJEPtF8EXjB/g2A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.0.tgz", + "integrity": "sha512-jHLK4LxhHjvCeZDWyA9c+P9XH1sOxRd1RO9xMtDVRAOND/PczPqizEtVdx4TQF/wyPaewqpT+tgQFYMnN/P94A==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/preset-env": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.0.tgz", + "integrity": "sha512-cdTu/W0IrviamtnZiTfixPfIncr2M1VqRrkjzZWlr1B4TVYimCFK5jkyOdP4qw2MrlKHi+b3ORj6x8GoCew8Dg==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.16.0", + "@babel/helper-compilation-targets": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.0", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-async-generator-functions": "^7.16.0", + "@babel/plugin-proposal-class-properties": "^7.16.0", + "@babel/plugin-proposal-class-static-block": "^7.16.0", + "@babel/plugin-proposal-dynamic-import": "^7.16.0", + "@babel/plugin-proposal-export-namespace-from": "^7.16.0", + "@babel/plugin-proposal-json-strings": "^7.16.0", + "@babel/plugin-proposal-logical-assignment-operators": "^7.16.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", + "@babel/plugin-proposal-numeric-separator": "^7.16.0", + "@babel/plugin-proposal-object-rest-spread": "^7.16.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-private-methods": "^7.16.0", + "@babel/plugin-proposal-private-property-in-object": "^7.16.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.16.0", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.16.0", + "@babel/plugin-transform-async-to-generator": "^7.16.0", + "@babel/plugin-transform-block-scoped-functions": "^7.16.0", + "@babel/plugin-transform-block-scoping": "^7.16.0", + "@babel/plugin-transform-classes": "^7.16.0", + "@babel/plugin-transform-computed-properties": "^7.16.0", + "@babel/plugin-transform-destructuring": "^7.16.0", + "@babel/plugin-transform-dotall-regex": "^7.16.0", + "@babel/plugin-transform-duplicate-keys": "^7.16.0", + "@babel/plugin-transform-exponentiation-operator": "^7.16.0", + "@babel/plugin-transform-for-of": "^7.16.0", + "@babel/plugin-transform-function-name": "^7.16.0", + "@babel/plugin-transform-literals": "^7.16.0", + "@babel/plugin-transform-member-expression-literals": "^7.16.0", + "@babel/plugin-transform-modules-amd": "^7.16.0", + "@babel/plugin-transform-modules-commonjs": "^7.16.0", + "@babel/plugin-transform-modules-systemjs": "^7.16.0", + "@babel/plugin-transform-modules-umd": "^7.16.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.0", + "@babel/plugin-transform-new-target": "^7.16.0", + "@babel/plugin-transform-object-super": "^7.16.0", + "@babel/plugin-transform-parameters": "^7.16.0", + "@babel/plugin-transform-property-literals": "^7.16.0", + "@babel/plugin-transform-regenerator": "^7.16.0", + "@babel/plugin-transform-reserved-words": "^7.16.0", + "@babel/plugin-transform-shorthand-properties": "^7.16.0", + "@babel/plugin-transform-spread": "^7.16.0", + "@babel/plugin-transform-sticky-regex": "^7.16.0", + "@babel/plugin-transform-template-literals": "^7.16.0", + "@babel/plugin-transform-typeof-symbol": "^7.16.0", + "@babel/plugin-transform-unicode-escapes": "^7.16.0", + "@babel/plugin-transform-unicode-regex": "^7.16.0", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.16.0", + "babel-plugin-polyfill-corejs2": "^0.2.3", + "babel-plugin-polyfill-corejs3": "^0.3.0", + "babel-plugin-polyfill-regenerator": "^0.2.3", + "core-js-compat": "^3.19.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/runtime": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.3.tgz", + "integrity": "sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", + "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/traverse": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.3.tgz", + "integrity": "sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.0", + "@babel/helper-function-name": "^7.16.0", + "@babel/helper-hoist-variables": "^7.16.0", + "@babel/helper-split-export-declaration": "^7.16.0", + "@babel/parser": "^7.16.3", + "@babel/types": "^7.16.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", + "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.15.7", + "to-fast-properties": "^2.0.0" + } + }, + "@discoveryjs/json-ext": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.5.tgz", + "integrity": "sha512-6nFkfkmSeV/rqSaS4oWHgmpnYw194f6hmWF5is6b0J1naJZoiD0NTc9AiUwPHvWsowkjuHErCZT1wa0jg+BLIA==", + "dev": true + }, + "@fullhuman/postcss-purgecss": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@fullhuman/postcss-purgecss/-/postcss-purgecss-2.3.0.tgz", + "integrity": "sha512-qnKm5dIOyPGJ70kPZ5jiz0I9foVOic0j+cOzNDoo8KoCf6HjicIZ99UfO2OmE7vCYSKAAepEwJtNzpiiZAh9xw==", + "dev": true, + "requires": { + "postcss": "7.0.32", + "purgecss": "^2.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "postcss": { + "version": "7.0.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.32.tgz", + "integrity": "sha512-03eXong5NLnNCD05xscnGKGDZ98CyzoqPSMjOe6SuoQY7Z2hIj0Ld1g/O/UQRuOle2aRtiIRDg9tDcTGAkLfKw==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" + } + }, + "purgecss": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-2.3.0.tgz", + "integrity": "sha512-BE5CROfVGsx2XIhxGuZAT7rTH9lLeQx/6M0P7DTXQH4IUc3BBzs9JUzt4yzGf3JrH9enkeq6YJBe9CTtkm1WmQ==", + "dev": true, + "requires": { + "commander": "^5.0.0", + "glob": "^7.0.0", + "postcss": "7.0.32", + "postcss-selector-parser": "^6.0.2" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@github/file-attachment-element": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@github/file-attachment-element/-/file-attachment-element-2.0.1.tgz", + "integrity": "sha512-GQUgDPZeuE9xco4GbReAKFvtOFe9js+yctSrSYUSTGeD3N4xO2kX2MvaEiQRuVkERFgGPD9r57CLbbUoyJBn2Q==", + "dev": true + }, + "@github/markdown-toolbar-element": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@github/markdown-toolbar-element/-/markdown-toolbar-element-1.5.3.tgz", + "integrity": "sha512-fNgAuHBWWzqxMvkTMM7ijqPryLmnPVOi4OWp8YyUC74YgtJCRvQyL7gl9SzNLMXmGQxiRVIYbUJxa61X1oRObw==", + "dev": true + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@tailwindcss/forms": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.3.4.tgz", + "integrity": "sha512-vlAoBifNJUkagB+PAdW4aHMe4pKmSLroH398UPgIogBFc91D2VlHUxe4pjxQhiJl0Nfw53sHSJSQBSTQBZP3vA==", + "dev": true, + "requires": { + "mini-svg-data-uri": "^1.2.3" + } + }, + "@tailwindcss/typography": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.4.1.tgz", + "integrity": "sha512-ovPPLUhs7zAIJfr0y1dbGlyCuPhpuv/jpBoFgqAc658DWGGrOBWBMpAWLw2KlzbNeVk4YBJMzue1ekvIbdw6XA==", + "dev": true, + "requires": { + "lodash.castarray": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "lodash.uniq": "^4.5.0" + } + }, + "@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true + }, + "@types/babel__core": { + "version": "7.1.16", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.16.tgz", + "integrity": "sha512-EAEHtisTMM+KaKwfWdC3oyllIqswlznXCIVCt7/oRNrh+DhgT4UEBNC/jlADNjvw7UnfbcdkGQcPVZ1xYiLcrQ==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "@types/babel__generator": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.3.tgz", + "integrity": "sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA==", + "dev": true, + "requires": { + "@babel/types": "^7.0.0" + } + }, + "@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dev": true, + "requires": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "@types/babel__traverse": { + "version": "7.14.2", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz", + "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } + }, + "@types/clean-css": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@types/clean-css/-/clean-css-4.2.5.tgz", + "integrity": "sha512-NEzjkGGpbs9S9fgC4abuBvTpVwE3i+Acu9BBod3PUyjDVZcNsGx61b8r2PphR61QGPnn0JHVs5ey6/I4eTrkxw==", + "dev": true, + "requires": { + "@types/node": "*", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@types/eslint": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz", + "integrity": "sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.50", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz", + "integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==", + "dev": true + }, + "@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/http-proxy": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.7.tgz", + "integrity": "sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/imagemin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@types/imagemin/-/imagemin-8.0.0.tgz", + "integrity": "sha512-B9X2CUeDv/uUeY9CqkzSTfmsLkeJP6PkmXlh4lODBbf9SwpmNuLS30WzUOi863dgsjY3zt3gY5q2F+UdifRi1A==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/imagemin-gifsicle": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@types/imagemin-gifsicle/-/imagemin-gifsicle-7.0.1.tgz", + "integrity": "sha512-kUz6sUh0P95JOS0RGEaaemWUrASuw+dLsWIveK2UZJx74id/B9epgblMkCk/r5MjUWbZ83wFvacG5Rb/f97gyA==", + "dev": true, + "requires": { + "@types/imagemin": "*" + } + }, + "@types/imagemin-mozjpeg": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@types/imagemin-mozjpeg/-/imagemin-mozjpeg-8.0.1.tgz", + "integrity": "sha512-kMQWEoKxxhlnH4POI3qfW9DjXlQfi80ux3l2b3j5R3eudSCoUIzKQLkfMjNJ6eMYnMWBcB+rfQOWqIzdIwFGKw==", + "dev": true, + "requires": { + "@types/imagemin": "*" + } + }, + "@types/imagemin-optipng": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@types/imagemin-optipng/-/imagemin-optipng-5.2.1.tgz", + "integrity": "sha512-XCM/3q+HUL7v4zOqMI+dJ5dTxT+MUukY9KU49DSnYb/4yWtSMHJyADP+WHSMVzTR63J2ZvfUOzSilzBNEQW78g==", + "dev": true, + "requires": { + "@types/imagemin": "*" + } + }, + "@types/imagemin-svgo": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/@types/imagemin-svgo/-/imagemin-svgo-8.0.1.tgz", + "integrity": "sha512-YafkdrVAcr38U0Ln1C+L1n4SIZqC47VBHTyxCq7gTUSd1R9MdIvMcrljWlgU1M9O68WZDeQWUrKipKYfEOCOvQ==", + "dev": true, + "requires": { + "@types/imagemin": "*", + "@types/svgo": "^1" + } + }, + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true + }, + "@types/node": { + "version": "16.11.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.7.tgz", + "integrity": "sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw==", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "@types/retry": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", + "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==", + "dev": true + }, + "@types/svgo": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/@types/svgo/-/svgo-1.3.6.tgz", + "integrity": "sha512-AZU7vQcy/4WFEuwnwsNsJnFwupIpbllH1++LXScN6uxT1Z4zPzdrWG97w4/I7eFKFTvfy/bHFStWjdBAg2Vjug==", + "dev": true + }, + "@vue/reactivity": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.1.5.tgz", + "integrity": "sha512-1tdfLmNjWG6t/CsPldh+foumYFo3cpyCHgBYQ34ylaMsJ+SNHQ1kApMIa8jN+i593zQuaw3AdWH0nJTARzCFhg==", + "dev": true, + "requires": { + "@vue/shared": "3.1.5" + } + }, + "@vue/shared": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.1.5.tgz", + "integrity": "sha512-oJ4F3TnvpXaQwZJNF3ZK+kLPHKarDmJjJ6jyzVNDKH9md1dptjC7lWR//jrGuLdek/U6iltWxqAnYOu8gCiOvA==", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", + "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "dev": true, + "requires": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "dev": true + }, + "@webassemblyjs/helper-numbers": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", + "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "dev": true, + "requires": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", + "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", + "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", + "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", + "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/helper-wasm-section": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-opt": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "@webassemblyjs/wast-printer": "1.11.1" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", + "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", + "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", + "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/ieee754": "1.11.1", + "@webassemblyjs/leb128": "1.11.1", + "@webassemblyjs/utf8": "1.11.1" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", + "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "@webpack-cli/configtest": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.0.tgz", + "integrity": "sha512-ttOkEkoalEHa7RaFYpM0ErK1xc4twg3Am9hfHhL7MVqlHebnkYd2wuI/ZqTDj0cVzZho6PdinY0phFZV3O0Mzg==", + "dev": true, + "requires": {} + }, + "@webpack-cli/info": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.0.tgz", + "integrity": "sha512-F6b+Man0rwE4n0409FyAJHStYA5OIZERxmnUfLVwv0mc0V1wLad3V7jqRlMkgKBeAq07jUvglacNaa6g9lOpuw==", + "dev": true, + "requires": { + "envinfo": "^7.7.3" + } + }, + "@webpack-cli/serve": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.0.tgz", + "integrity": "sha512-ZkVeqEmRpBV2GHvjjUZqEai2PpUbuq8Bqd//vEYsp63J8WyexI8ppCqVS3Zs0QADf6aWuPdU+0XsPI647PVlQA==", + "dev": true, + "requires": {} + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", + "dev": true + }, + "acorn-import-assertions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", + "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "dev": true, + "requires": {} + }, + "acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dev": true, + "requires": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + } + } + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "requires": {} + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", + "dev": true + }, + "alpinejs": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/alpinejs/-/alpinejs-3.5.1.tgz", + "integrity": "sha512-GqdRNYpEW/rCoh45oqbGLQ1w2Uygt8DNEiqD7Di/kklJ+EZ3xjDAlFlgJ2xf37K+NtzEu2NdmkaYY6B9NBI79Q==", + "dev": true, + "requires": { + "@vue/reactivity": "~3.1.1" + } + }, + "ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "arg": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", + "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==", + "dev": true + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "autoprefixer": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.0.tgz", + "integrity": "sha512-7FdJ1ONtwzV1G43GDD0kpVMn/qbiNqyOPMFTX5nRffI+7vgWoFEc6DcXOxHJxrWNDXrZh18eDsZjvZGUljSRGA==", + "dev": true, + "requires": { + "browserslist": "^4.17.5", + "caniuse-lite": "^1.0.30001272", + "fraction.js": "^4.1.1", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.1.0" + } + }, + "babel-loader": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.3.tgz", + "integrity": "sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==", + "dev": true, + "requires": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^1.4.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.3.tgz", + "integrity": "sha512-NDZ0auNRzmAfE1oDDPW2JhzIMXUk+FFe2ICejmt5T4ocKgiQx3e0VCRx9NCAidcMtL2RUZaWtXnmjTCkx0tcbA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.4", + "semver": "^6.1.1" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.3.0.tgz", + "integrity": "sha512-JLwi9vloVdXLjzACL80j24bG6/T1gYxwowG44dg6HN/7aTPdyPbJJidf6ajoA3RPHHtW0j9KMrSOLpIZpAnPpg==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.4", + "core-js-compat": "^3.18.0" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.3.tgz", + "integrity": "sha512-JVE78oRZPKFIeUqFGrSORNzQnrDwZR16oiWeGM8ZyjBn2XAT5OjP+wXx5ESuo33nUsFUEJYjtklnsKbxW5L+7g==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.4" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", + "dev": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "requires": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.18.0.tgz", + "integrity": "sha512-ER2M0g5iAR84fS/zjBDqEgU6iO5fS9JI2EkHr5zxDxYEFk3LjhU9Vpp/INb6RMQphxko7PDV1FH38H/qVP5yCA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001280", + "electron-to-chromium": "^1.3.896", + "escalade": "^3.1.1", + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001280", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001280.tgz", + "integrity": "sha512-kFXwYvHe5rix25uwueBxC569o53J6TpnGu0BEEn+6Lhl2vsnAumRFWEBhDft1fwyo6m1r4i+RqA4+163FpeFcA==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=", + "dev": true + }, + "chart.js": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-3.6.0.tgz", + "integrity": "sha512-iOzzDKePL+bj+ccIsVAgWQehCXv8xOKGbaU2fO/myivH736zcx535PGJzQGanvcSGVOqX6yuLZsN3ygcQ35UgQ==", + "dev": true + }, + "chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "clean-css": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.2.tgz", + "integrity": "sha512-/eR8ru5zyxKzpBLv9YZvMXgTSSQn7AdkMItMYynsFgGwTveCRVam9IUPFloE85B4vAIj05IuKmmEoV7/AQjT0w==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cli-table3": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.0.tgz", + "integrity": "sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ==", + "dev": true, + "requires": { + "colors": "^1.1.2", + "object-assign": "^4.1.0", + "string-width": "^4.2.0" + } + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + } + }, + "collect.js": { + "version": "4.29.0", + "resolved": "https://registry.npmjs.org/collect.js/-/collect.js-4.29.0.tgz", + "integrity": "sha512-yhgGYEsLEcqnLT1NmRlN1+1euoz9SDhxQ4QyDhWYsKoWsg7252PKA5++dWaDs8mdFxbkmXDXQUaHXI9J2eTPkQ==", + "dev": true + }, + "color": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/color/-/color-4.0.1.tgz", + "integrity": "sha512-rpZjOKN5O7naJxkH2Rx1sZzzBgaiWECc6BYXjeCE6kF0kcASJYbUq02u7JqIHwCb/j3NhV+QhRL2683aICeGZA==", + "dev": true, + "requires": { + "color-convert": "^2.0.1", + "color-string": "^1.6.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "color-string": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.6.0.tgz", + "integrity": "sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==", + "dev": true, + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "colord": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.1.tgz", + "integrity": "sha512-4LBMSt09vR0uLnPVkOUBnmxgoaeN4ewRbx801wY/bXcltXfpR/G46OdWn96XpYmCWuYvO46aBZP4NgX8HpNAcw==", + "dev": true + }, + "colorette": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", + "dev": true + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "optional": true + }, + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "concat": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/concat/-/concat-1.0.3.tgz", + "integrity": "sha1-QPM1MInWVGdpXLGIa0Xt1jfYzKg=", + "dev": true, + "requires": { + "commander": "^2.9.0" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==", + "dev": true + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "core-js-compat": { + "version": "3.19.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.19.1.tgz", + "integrity": "sha512-Q/VJ7jAF/y68+aUsQJ/afPOewdsGkDtcMb40J8MbuWKlK3Y+wtHq8bTHKPj2WKWLIqmS5JhHs4CzHtz6pT2W6g==", + "dev": true, + "requires": { + "browserslist": "^4.17.6", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=", + "dev": true + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "css-color-names": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-1.0.1.tgz", + "integrity": "sha512-/loXYOch1qU1biStIFsHH8SxTmOseh1IJqFvy8IujXOm1h+QjUdDhkzOrR5HG8K8mlxREj0yfi8ewCHx0eMxzA==", + "dev": true + }, + "css-declaration-sorter": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.1.3.tgz", + "integrity": "sha512-SvjQjNRZgh4ULK1LDJ2AduPKUKxIqmtU7ZAyi47BTV+M90Qvxr9AB6lKlLbDUfXqI9IQeYA8LbAsCZPpJEV3aA==", + "dev": true, + "requires": { + "timsort": "^0.3.0" + } + }, + "css-loader": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.7.tgz", + "integrity": "sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==", + "dev": true, + "requires": { + "icss-utils": "^5.1.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.15", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.5" + }, + "dependencies": { + "loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "css-select": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", + "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^5.0.0", + "domhandler": "^4.2.0", + "domutils": "^2.6.0", + "nth-check": "^2.0.0" + }, + "dependencies": { + "domhandler": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz", + "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + } + } + }, + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "css-unit-converter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.2.tgz", + "integrity": "sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA==", + "dev": true + }, + "css-what": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", + "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "cssnano": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.0.10.tgz", + "integrity": "sha512-YfNhVJJ04imffOpbPbXP2zjIoByf0m8E2c/s/HnvSvjXgzXMfgopVjAEGvxYOjkOpWuRQDg/OZFjO7WW94Ri8w==", + "dev": true, + "requires": { + "cssnano-preset-default": "^5.1.6", + "is-resolvable": "^1.1.0", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + } + }, + "cssnano-preset-default": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.1.6.tgz", + "integrity": "sha512-X2nDeNGBXc0486oHjT2vSj+TdeyVsxRvJUxaOH50hOM6vSDLkKd0+59YXpSZRInJ4sNtBOykS4KsPfhdrU/35w==", + "dev": true, + "requires": { + "css-declaration-sorter": "^6.0.3", + "cssnano-utils": "^2.0.1", + "postcss-calc": "^8.0.0", + "postcss-colormin": "^5.2.1", + "postcss-convert-values": "^5.0.2", + "postcss-discard-comments": "^5.0.1", + "postcss-discard-duplicates": "^5.0.1", + "postcss-discard-empty": "^5.0.1", + "postcss-discard-overridden": "^5.0.1", + "postcss-merge-longhand": "^5.0.3", + "postcss-merge-rules": "^5.0.2", + "postcss-minify-font-values": "^5.0.1", + "postcss-minify-gradients": "^5.0.3", + "postcss-minify-params": "^5.0.1", + "postcss-minify-selectors": "^5.1.0", + "postcss-normalize-charset": "^5.0.1", + "postcss-normalize-display-values": "^5.0.1", + "postcss-normalize-positions": "^5.0.1", + "postcss-normalize-repeat-style": "^5.0.1", + "postcss-normalize-string": "^5.0.1", + "postcss-normalize-timing-functions": "^5.0.1", + "postcss-normalize-unicode": "^5.0.1", + "postcss-normalize-url": "^5.0.2", + "postcss-normalize-whitespace": "^5.0.1", + "postcss-ordered-values": "^5.0.2", + "postcss-reduce-initial": "^5.0.1", + "postcss-reduce-transforms": "^5.0.1", + "postcss-svgo": "^5.0.3", + "postcss-unique-selectors": "^5.0.1" + } + }, + "cssnano-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-2.0.1.tgz", + "integrity": "sha512-i8vLRZTnEH9ubIyfdZCAdIdgnHAUeQeByEeQ2I7oTilvP9oHO6RScpeq3GsFUVqeB8uZgOQ9pw8utofNn32hhQ==", + "dev": true, + "requires": {} + }, + "csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "requires": { + "css-tree": "^1.1.2" + } + }, + "dayjs": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.7.tgz", + "integrity": "sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig==", + "dev": true + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "requires": { + "execa": "^5.0.0" + } + }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "defined": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", + "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", + "dev": true + }, + "del": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", + "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", + "dev": true, + "requires": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "dependencies": { + "globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + } + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "detective": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", + "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", + "dev": true, + "requires": { + "acorn-node": "^1.6.1", + "defined": "^1.0.0", + "minimist": "^1.1.1" + } + }, + "didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "dependencies": { + "domhandler": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz", + "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + } + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true + }, + "domhandler": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz", + "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "dependencies": { + "domhandler": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz", + "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + } + } + }, + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "dev": true + }, + "dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "dev": true + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.896", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.896.tgz", + "integrity": "sha512-NcGkBVXePiuUrPLV8IxP43n1EOtdg+dudVjrfVEUd/bOqpQUFZ2diL5PPYzbgEhZFEltdXV3AcyKwGnEQ5lhMA==", + "dev": true + }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dev": true, + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "enhanced-resolve": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz", + "integrity": "sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, + "envinfo": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-module-lexer": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "dev": true + }, + "esbuild": { + "version": "0.8.57", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.8.57.tgz", + "integrity": "sha512-j02SFrUwFTRUqiY0Kjplwjm1psuzO1d6AjaXKuOR9hrY0HuPsT6sV42B6myW34h1q4CRy+Y3g4RU/cGJeI/nNA==", + "dev": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", + "dev": true + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "file-type": { + "version": "12.4.2", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-12.4.2.tgz", + "integrity": "sha512-UssQP5ZgIOKelfsaB5CuGAL+Y+q7EmONuiwF3N5HAH0t27rvrttgi6Ra9k/+DVaY9UF6+ybxu5pOXLUdA8N7Vg==", + "dev": true + }, + "filepond": { + "version": "4.30.3", + "resolved": "https://registry.npmjs.org/filepond/-/filepond-4.30.3.tgz", + "integrity": "sha512-G2b1LEe90Sq2vH0SYDASTB+vVU735NBctzIaFPlZtb14QAgi/AL89WyQ6LhTfqgyrMyuZur2O9yHAmzS2E9ZnA==", + "dev": true + }, + "filepond-plugin-file-validate-size": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/filepond-plugin-file-validate-size/-/filepond-plugin-file-validate-size-2.2.5.tgz", + "integrity": "sha512-x+fYZl317R17w3dExKab1oYZa10Wl2HcXKD6dzIgRKyngEHtjBF99geGaiDPk9IfozV8Zjzx69D7urcthF2CYQ==", + "dev": true, + "requires": {} + }, + "filepond-plugin-file-validate-type": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/filepond-plugin-file-validate-type/-/filepond-plugin-file-validate-type-1.2.6.tgz", + "integrity": "sha512-3JFxpb4o5D4BssP/Drjn2GPpejg/QXzU4e3/Pq8IvIJuokHz95b6+RPYstQ+6ITKREYup0N8F/CO/OQfhVkUgg==", + "dev": true, + "requires": {} + }, + "filepond-plugin-image-crop": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/filepond-plugin-image-crop/-/filepond-plugin-image-crop-2.0.6.tgz", + "integrity": "sha512-bSy/KND4EP/QtW8MxIj23qgSEPUVRrT8XdktJ+OU9y8xRjFjTG+qcuw1LsycARQYRtzi8cZrD3P4POOITfkywQ==", + "dev": true, + "requires": {} + }, + "filepond-plugin-image-exif-orientation": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/filepond-plugin-image-exif-orientation/-/filepond-plugin-image-exif-orientation-1.0.11.tgz", + "integrity": "sha512-hLBc12Fk6Zkj3L8mSAn+elugHOqT5rLUbgVXQQIQjMe0FsGjtpoxqeVR6jt4IWHGat2L9sFAgU2TGmd1mqosCg==", + "dev": true, + "requires": {} + }, + "filepond-plugin-image-preview": { + "version": "4.6.10", + "resolved": "https://registry.npmjs.org/filepond-plugin-image-preview/-/filepond-plugin-image-preview-4.6.10.tgz", + "integrity": "sha512-C7Q5Sr/d4RQb2nMNQR93OiMt91OHxpvmIBGl+CO1dZE46lM49NUfI08dyElAOxTslDcA8pAfjFFCKo0sNYbrBg==", + "dev": true, + "requires": {} + }, + "filepond-plugin-image-resize": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/filepond-plugin-image-resize/-/filepond-plugin-image-resize-2.0.10.tgz", + "integrity": "sha512-irX+J275u8Ph1KcciCeSQmxeFjbu0+co5XVCkiwdSNnz6KiqrCKN7RXTvEbdgSdDzyi5omr2oP1rKWps5L1RsQ==", + "dev": true, + "requires": {} + }, + "filepond-plugin-image-transform": { + "version": "3.8.7", + "resolved": "https://registry.npmjs.org/filepond-plugin-image-transform/-/filepond-plugin-image-transform-3.8.7.tgz", + "integrity": "sha512-vgKwyIDG2y5twanf7YpqZvxkaLudTjwd9vRcoq5sQDB8egUlX5/NA0bQ0823pocrm0fjbFeetICu44mkqeDkIA==", + "dev": true, + "requires": {} + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "focus-trap": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-6.7.1.tgz", + "integrity": "sha512-a6czHbT9twVpy2RpkWQA9vIgwQgB9Nx1PIxNNUxQT4nugG/3QibwxO+tWTh9i+zSY2SFiX4pnYhTaFaQF/6ZAg==", + "dev": true, + "requires": { + "tabbable": "^5.2.1" + } + }, + "follow-redirects": { + "version": "1.14.5", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.5.tgz", + "integrity": "sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA==", + "dev": true + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true + }, + "fraction.js": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.2.tgz", + "integrity": "sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA==", + "dev": true + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "fs-extra": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==", + "dev": true + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "hash-sum": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz", + "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", + "dev": true + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true + }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", + "dev": true + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", + "dev": true + }, + "html-entities": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz", + "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==", + "dev": true + }, + "html-loader": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-1.3.2.tgz", + "integrity": "sha512-DEkUwSd0sijK5PF3kRWspYi56XP7bTNkyg5YWSzBdjaSDmvCufep5c4Vpb3PBf6lUL0YPtLwBfy9fL0t5hBAGA==", + "dev": true, + "requires": { + "html-minifier-terser": "^5.1.1", + "htmlparser2": "^4.1.0", + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "html-minifier-terser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", + "dev": true, + "requires": { + "camel-case": "^4.1.1", + "clean-css": "^4.2.3", + "commander": "^4.1.1", + "he": "^1.2.0", + "param-case": "^3.0.3", + "relateurl": "^0.2.7", + "terser": "^4.6.3" + }, + "dependencies": { + "clean-css": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", + "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + } + }, + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + } + } + } + } + }, + "html-tags": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", + "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==", + "dev": true + }, + "htmlparser2": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-4.1.0.tgz", + "integrity": "sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^3.0.0", + "domutils": "^2.0.0", + "entities": "^2.0.0" + } + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "http-parser-js": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", + "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==", + "dev": true + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.1.tgz", + "integrity": "sha512-cfaXRVoZxSed/BmkA7SwBVNI9Kj7HFltaE5rqYOub5kWzWZ+gofV2koVN1j2rMW7pEfSSlCHGJ31xmuyFyfLOg==", + "dev": true, + "requires": { + "@types/http-proxy": "^1.17.5", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "requires": {} + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "ignore": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz", + "integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==", + "dev": true + }, + "imagemin": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/imagemin/-/imagemin-7.0.1.tgz", + "integrity": "sha512-33AmZ+xjZhg2JMCe+vDf6a9mzWukE7l+wAtesjE7KyteqqKjzxv7aVQeWnul1Ve26mWvEQqyPwl0OctNBfSR9w==", + "dev": true, + "requires": { + "file-type": "^12.0.0", + "globby": "^10.0.0", + "graceful-fs": "^4.2.2", + "junk": "^3.1.0", + "make-dir": "^3.0.0", + "p-pipe": "^3.0.0", + "replace-ext": "^1.0.0" + } + }, + "imask": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/imask/-/imask-6.2.2.tgz", + "integrity": "sha512-oREITqngsjD0YxO62UpVQSxLNjIcb/mNO9hX2F8xQ282Kj3X9KXEAobipbUXz5R5NgtiL6nOPrWwo+AnLuz5AQ==", + "dev": true + }, + "img-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/img-loader/-/img-loader-4.0.0.tgz", + "integrity": "sha512-UwRcPQdwdOyEHyCxe1V9s9YFwInwEWCpoO+kJGfIqDrBDqA8jZUsEZTxQ0JteNPGw/Gupmwesk2OhLTcnw6tnQ==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0" + } + }, + "import-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz", + "integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==", + "dev": true, + "requires": { + "import-from": "^3.0.0" + } + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } + } + }, + "import-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz", + "integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + } + }, + "import-local": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.3.tgz", + "integrity": "sha512-bE9iaUY3CXH8Cwfan/abDKAxe1KGT9kyGsBPqf6DMK/z0a2OzAsrukeYNgIH6cH5Xr452jb1TUL8rSfCLjZ9uA==", + "dev": true, + "requires": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + } + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "internal-ip": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-6.2.0.tgz", + "integrity": "sha512-D8WGsR6yDt8uq7vDMu7mjcR+yRMm3dW8yufyChmszWRjcSHuxLBkR3GdS2HZAjodsaGuCvXeEJpueisXJULghg==", + "dev": true, + "requires": { + "default-gateway": "^6.0.0", + "ipaddr.js": "^1.9.1", + "is-ip": "^3.1.0", + "p-event": "^4.2.0" + }, + "dependencies": { + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + } + } + }, + "interpret": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "dev": true + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ip-regex": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", + "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", + "dev": true + }, + "ipaddr.js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "dev": true + }, + "is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "dev": true, + "requires": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + }, + "dependencies": { + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "dev": true + } + } + }, + "is-core-module": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", + "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-ip": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-3.1.0.tgz", + "integrity": "sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==", + "dev": true, + "requires": { + "ip-regex": "^4.0.0" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "jest-worker": { + "version": "27.3.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.3.1.tgz", + "integrity": "sha512-ks3WCzsiZaOPJl/oMsDjaf0TRiSv7ctNgs0FqRr2nARsovz6AWWy4oLElwcquGSz692DzgZQrCLScPNs5YlC4g==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "dependencies": { + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "junk": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/junk/-/junk-3.1.0.tgz", + "integrity": "sha512-pBxcB3LFc8QVgdggvZWyeys+hnrNWg4OcZIU/1X59k5jQdLBlCsYGRQaz234SqoRLTCgMH00fY0xRJH+F9METQ==", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "klona": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", + "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", + "dev": true + }, + "laravel-mix": { + "version": "6.0.39", + "resolved": "https://registry.npmjs.org/laravel-mix/-/laravel-mix-6.0.39.tgz", + "integrity": "sha512-ChTRKSNx9ViD3Xw1+BDQUZ0PLETcBrXlM7vNmomoDUZBXLUurVUJ9oaRUdGmH/WENNqL0qQ8FFxjq+6U368Nlg==", + "dev": true, + "requires": { + "@babel/core": "^7.15.8", + "@babel/plugin-proposal-object-rest-spread": "^7.15.6", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.15.8", + "@babel/preset-env": "^7.15.8", + "@babel/runtime": "^7.15.4", + "@types/babel__core": "^7.1.16", + "@types/clean-css": "^4.2.5", + "@types/imagemin-gifsicle": "^7.0.1", + "@types/imagemin-mozjpeg": "^8.0.1", + "@types/imagemin-optipng": "^5.2.1", + "@types/imagemin-svgo": "^8.0.0", + "autoprefixer": "^10.4.0", + "babel-loader": "^8.2.3", + "chalk": "^4.1.2", + "chokidar": "^3.5.2", + "clean-css": "^4.2.3 || ^5.1.2", + "cli-table3": "^0.6.0", + "collect.js": "^4.28.5", + "commander": "^7.2.0", + "concat": "^1.0.3", + "css-loader": "^5.2.6", + "cssnano": "^5.0.8", + "dotenv": "^10.0.0", + "dotenv-expand": "^5.1.0", + "file-loader": "^6.2.0", + "fs-extra": "^10.0.0", + "glob": "^7.2.0", + "html-loader": "^1.3.2", + "imagemin": "^7.0.1", + "img-loader": "^4.0.0", + "lodash": "^4.17.21", + "md5": "^2.3.0", + "mini-css-extract-plugin": "^1.6.2", + "node-libs-browser": "^2.2.1", + "postcss-load-config": "^3.1.0", + "postcss-loader": "^6.2.0", + "semver": "^7.3.5", + "strip-ansi": "^6.0.0", + "style-loader": "^2.0.0", + "terser": "^5.9.0", + "terser-webpack-plugin": "^5.2.4", + "vue-style-loader": "^4.1.3", + "webpack": "^5.60.0", + "webpack-cli": "^4.9.1", + "webpack-dev-server": "4.4.0", + "webpack-merge": "^5.8.0", + "webpack-notifier": "^1.14.1", + "webpackbar": "^5.0.0-3", + "yargs": "^17.2.1" + } + }, + "lilconfig": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz", + "integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==", + "dev": true + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", + "dev": true + }, + "loader-runner": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz", + "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==", + "dev": true + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "lodash.castarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", + "integrity": "sha1-wCUTUV4wna3dTCTGDP3c9ZdtkRU=", + "dev": true + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=", + "dev": true + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "lodash.topath": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.topath/-/lodash.topath-4.5.2.tgz", + "integrity": "sha1-NhY1Hzu6YZlKCTGYlmC9AyVP0Ak=", + "dev": true + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=", + "dev": true + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "requires": { + "tslib": "^2.0.3" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "marked": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/marked/-/marked-3.0.8.tgz", + "integrity": "sha512-0gVrAjo5m0VZSJb4rpL59K1unJAMb/hm8HRXqasD8VeC8m91ytDPMritgFSlKonfdt+rRYYpP/JfLxgIX8yoSw==", + "dev": true + }, + "md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "dev": true, + "requires": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mdhl": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/mdhl/-/mdhl-0.0.6.tgz", + "integrity": "sha512-dY0ld/laPE9+9aq7LwGhg+zME0autnOR0juhf6AA/Njs0/awITgbxmUD/cHq8y07bV9j1JQbYM1RnLqhFym5KA==", + "dev": true + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "memfs": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.3.0.tgz", + "integrity": "sha512-BEE62uMfKOavX3iG7GYX43QJ+hAeeWnwIAuJ/R6q96jaMtiLzhsxHJC8B1L7fK7Pt/vXDRwb3SG/yBpNGDPqzg==", + "dev": true, + "requires": { + "fs-monkey": "1.0.3" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "dev": true + }, + "mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "dev": true, + "requires": { + "mime-db": "1.51.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "mini-css-extract-plugin": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.6.2.tgz", + "integrity": "sha512-WhDvO3SjGm40oV5y26GjMJYjd2UMqrLAGKy5YS2/3QKJy2F7jgynuHTir/tgUUOiNQu5saXHdc8reo7YuhhT4Q==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0", + "webpack-sources": "^1.1.0" + }, + "dependencies": { + "loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "mini-svg-data-uri": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.3.tgz", + "integrity": "sha512-gSfqpMRC8IxghvMcxzzmMnWpXAChSA+vy4cia33RgerMS8Fex95akUyQZPbxJJmeBGiGmK7n/1OpUX8ksRjIdA==", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "modern-normalize": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/modern-normalize/-/modern-normalize-1.1.0.tgz", + "integrity": "sha512-2lMlY1Yc1+CUy0gw4H95uNN7vjbpoED7NNRSBHE25nWfLBdmMzFCsPshlzbxHz+gYMcBEUN8V4pU16prcdPSgA==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "nanoid": { + "version": "3.1.30", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz", + "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==", + "dev": true + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "dev": true, + "requires": { + "lodash": "^4.17.21" + } + }, + "node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "dev": true + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + } + }, + "node-notifier": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-9.0.1.tgz", + "integrity": "sha512-fPNFIp2hF/Dq7qLDzSg4vZ0J4e9v60gJR+Qx7RbjbWqzPDdEqeVpEx5CFeDAELIl+A/woaaNn1fQ5nEVerMxJg==", + "dev": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^2.2.0", + "semver": "^7.3.2", + "shellwords": "^0.1.1", + "uuid": "^8.3.0", + "which": "^2.0.2" + }, + "dependencies": { + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + } + } + }, + "node-releases": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", + "dev": true + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true + }, + "normalize.css": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz", + "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "nth-check": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "dev": true + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "dev": true, + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "p-event": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", + "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", + "dev": true, + "requires": { + "p-timeout": "^3.1.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-pipe": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-3.1.0.tgz", + "integrity": "sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==", + "dev": true + }, + "p-retry": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz", + "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==", + "dev": true, + "requires": { + "@types/retry": "^0.12.0", + "retry": "^0.13.1" + } + }, + "p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "dev": true, + "requires": { + "p-finally": "^1.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "requires": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dev": true, + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "postcss": { + "version": "8.3.11", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.11.tgz", + "integrity": "sha512-hCmlUAIlUiav8Xdqw3Io4LcpA1DOt7h3LSTAC4G6JGHFFaWzI6qvFt9oilvl8BmkbBRX1IhM90ZAmpk68zccQA==", + "dev": true, + "requires": { + "nanoid": "^3.1.30", + "picocolors": "^1.0.0", + "source-map-js": "^0.6.2" + } + }, + "postcss-calc": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.0.0.tgz", + "integrity": "sha512-5NglwDrcbiy8XXfPM11F3HeC6hoT9W7GUH/Zi5U/p7u3Irv4rHhdDcIZwG0llHXV4ftsBjpfWMXAnXNl4lnt8g==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + } + }, + "postcss-colormin": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.2.1.tgz", + "integrity": "sha512-VVwMrEYLcHYePUYV99Ymuoi7WhKrMGy/V9/kTS0DkCoJYmmjdOMneyhzYUxcNgteKDVbrewOkSM7Wje/MFwxzA==", + "dev": true, + "requires": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-convert-values": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.0.2.tgz", + "integrity": "sha512-KQ04E2yadmfa1LqXm7UIDwW1ftxU/QWZmz6NKnHnUvJ3LEYbbcX6i329f/ig+WnEByHegulocXrECaZGLpL8Zg==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-discard-comments": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.0.1.tgz", + "integrity": "sha512-lgZBPTDvWrbAYY1v5GYEv8fEO/WhKOu/hmZqmCYfrpD6eyDWWzAOsl2rF29lpvziKO02Gc5GJQtlpkTmakwOWg==", + "dev": true, + "requires": {} + }, + "postcss-discard-duplicates": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.1.tgz", + "integrity": "sha512-svx747PWHKOGpAXXQkCc4k/DsWo+6bc5LsVrAsw+OU+Ibi7klFZCyX54gjYzX4TH+f2uzXjRviLARxkMurA2bA==", + "dev": true, + "requires": {} + }, + "postcss-discard-empty": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.0.1.tgz", + "integrity": "sha512-vfU8CxAQ6YpMxV2SvMcMIyF2LX1ZzWpy0lqHDsOdaKKLQVQGVP1pzhrI9JlsO65s66uQTfkQBKBD/A5gp9STFw==", + "dev": true, + "requires": {} + }, + "postcss-discard-overridden": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.0.1.tgz", + "integrity": "sha512-Y28H7y93L2BpJhrdUR2SR2fnSsT+3TVx1NmVQLbcnZWwIUpJ7mfcTC6Za9M2PG6w8j7UQRfzxqn8jU2VwFxo3Q==", + "dev": true, + "requires": {} + }, + "postcss-functions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-functions/-/postcss-functions-3.0.0.tgz", + "integrity": "sha1-DpTQFERwCkgd4g3k1V+yZAVkJQ4=", + "dev": true, + "requires": { + "glob": "^7.1.2", + "object-assign": "^4.1.1", + "postcss": "^6.0.9", + "postcss-value-parser": "^3.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-js": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-3.0.3.tgz", + "integrity": "sha512-gWnoWQXKFw65Hk/mi2+WTQTHdPD5UJdDXZmX073EY/B3BWnYjO4F4t0VneTCnCGQ5E5GsCdMkzPaTXwl3r5dJw==", + "dev": true, + "requires": { + "camelcase-css": "^2.0.1", + "postcss": "^8.1.6" + } + }, + "postcss-load-config": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.0.tgz", + "integrity": "sha512-ipM8Ds01ZUophjDTQYSVP70slFSYg3T0/zyfII5vzhN6V57YSxMgG5syXuwi5VtS8wSf3iL30v0uBdoIVx4Q0g==", + "dev": true, + "requires": { + "import-cwd": "^3.0.0", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + } + }, + "postcss-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.0.tgz", + "integrity": "sha512-H9hv447QjQJVDbHj3OUdciyAXY3v5+UDduzEytAlZCVHCpNAAg/mCSwhYYqZr9BiGYhmYspU8QXxZwiHTLn3yA==", + "dev": true, + "requires": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.4", + "semver": "^7.3.5" + } + }, + "postcss-merge-longhand": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.0.3.tgz", + "integrity": "sha512-kmB+1TjMTj/bPw6MCDUiqSA5e/x4fvLffiAdthra3a0m2/IjTrWsTmD3FdSskzUjEwkj5ZHBDEbv5dOcqD7CMQ==", + "dev": true, + "requires": { + "css-color-names": "^1.0.1", + "postcss-value-parser": "^4.1.0", + "stylehacks": "^5.0.1" + } + }, + "postcss-merge-rules": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.0.2.tgz", + "integrity": "sha512-5K+Md7S3GwBewfB4rjDeol6V/RZ8S+v4B66Zk2gChRqLTCC8yjnHQ601omj9TKftS19OPGqZ/XzoqpzNQQLwbg==", + "dev": true, + "requires": { + "browserslist": "^4.16.6", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^2.0.1", + "postcss-selector-parser": "^6.0.5", + "vendors": "^1.0.3" + } + }, + "postcss-minify-font-values": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.0.1.tgz", + "integrity": "sha512-7JS4qIsnqaxk+FXY1E8dHBDmraYFWmuL6cgt0T1SWGRO5bzJf8sUoelwa4P88LEWJZweHevAiDKxHlofuvtIoA==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-minify-gradients": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.0.3.tgz", + "integrity": "sha512-Z91Ol22nB6XJW+5oe31+YxRsYooxOdFKcbOqY/V8Fxse1Y3vqlNRpi1cxCqoACZTQEhl+xvt4hsbWiV5R+XI9Q==", + "dev": true, + "requires": { + "colord": "^2.9.1", + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-minify-params": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.0.1.tgz", + "integrity": "sha512-4RUC4k2A/Q9mGco1Z8ODc7h+A0z7L7X2ypO1B6V8057eVK6mZ6xwz6QN64nHuHLbqbclkX1wyzRnIrdZehTEHw==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.2", + "browserslist": "^4.16.0", + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0", + "uniqs": "^2.0.0" + } + }, + "postcss-minify-selectors": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.1.0.tgz", + "integrity": "sha512-NzGBXDa7aPsAcijXZeagnJBKBPMYLaJJzB8CQh6ncvyl2sIndLVWfbcDi0SBjRWk5VqEjXvf8tYwzoKf4Z07og==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.2", + "postcss-selector-parser": "^6.0.5" + } + }, + "postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true, + "requires": {} + }, + "postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "dev": true, + "requires": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.4" + } + }, + "postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "requires": { + "icss-utils": "^5.0.0" + } + }, + "postcss-nested": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz", + "integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.6" + } + }, + "postcss-normalize-charset": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.0.1.tgz", + "integrity": "sha512-6J40l6LNYnBdPSk+BHZ8SF+HAkS4q2twe5jnocgd+xWpz/mx/5Sa32m3W1AA8uE8XaXN+eg8trIlfu8V9x61eg==", + "dev": true, + "requires": {} + }, + "postcss-normalize-display-values": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.0.1.tgz", + "integrity": "sha512-uupdvWk88kLDXi5HEyI9IaAJTE3/Djbcrqq8YgjvAVuzgVuqIk3SuJWUisT2gaJbZm1H9g5k2w1xXilM3x8DjQ==", + "dev": true, + "requires": { + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-normalize-positions": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.0.1.tgz", + "integrity": "sha512-rvzWAJai5xej9yWqlCb1OWLd9JjW2Ex2BCPzUJrbaXmtKtgfL8dBMOOMTX6TnvQMtjk3ei1Lswcs78qKO1Skrg==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-normalize-repeat-style": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.1.tgz", + "integrity": "sha512-syZ2itq0HTQjj4QtXZOeefomckiV5TaUO6ReIEabCh3wgDs4Mr01pkif0MeVwKyU/LHEkPJnpwFKRxqWA/7O3w==", + "dev": true, + "requires": { + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-normalize-string": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.0.1.tgz", + "integrity": "sha512-Ic8GaQ3jPMVl1OEn2U//2pm93AXUcF3wz+OriskdZ1AOuYV25OdgS7w9Xu2LO5cGyhHCgn8dMXh9bO7vi3i9pA==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-normalize-timing-functions": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.0.1.tgz", + "integrity": "sha512-cPcBdVN5OsWCNEo5hiXfLUnXfTGtSFiBU9SK8k7ii8UD7OLuznzgNRYkLZow11BkQiiqMcgPyh4ZqXEEUrtQ1Q==", + "dev": true, + "requires": { + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-normalize-unicode": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.1.tgz", + "integrity": "sha512-kAtYD6V3pK0beqrU90gpCQB7g6AOfP/2KIPCVBKJM2EheVsBQmx/Iof+9zR9NFKLAx4Pr9mDhogB27pmn354nA==", + "dev": true, + "requires": { + "browserslist": "^4.16.0", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-normalize-url": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.0.2.tgz", + "integrity": "sha512-k4jLTPUxREQ5bpajFQZpx8bCF2UrlqOTzP9kEqcEnOfwsRshWs2+oAFIHfDQB8GO2PaUaSE0NlTAYtbluZTlHQ==", + "dev": true, + "requires": { + "is-absolute-url": "^3.0.3", + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-normalize-whitespace": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.1.tgz", + "integrity": "sha512-iPklmI5SBnRvwceb/XH568yyzK0qRVuAG+a1HFUsFRf11lEJTiQQa03a4RSCQvLKdcpX7XsI1Gen9LuLoqwiqA==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-ordered-values": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.0.2.tgz", + "integrity": "sha512-8AFYDSOYWebJYLyJi3fyjl6CqMEG/UVworjiyK1r573I56kb3e879sCJLGvR3merj+fAdPpVplXKQZv+ey6CgQ==", + "dev": true, + "requires": { + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-reduce-initial": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.0.1.tgz", + "integrity": "sha512-zlCZPKLLTMAqA3ZWH57HlbCjkD55LX9dsRyxlls+wfuRfqCi5mSlZVan0heX5cHr154Dq9AfbH70LyhrSAezJw==", + "dev": true, + "requires": { + "browserslist": "^4.16.0", + "caniuse-api": "^3.0.0" + } + }, + "postcss-reduce-transforms": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.1.tgz", + "integrity": "sha512-a//FjoPeFkRuAguPscTVmRQUODP+f3ke2HqFNgGPwdYnpeC29RZdCBvGRGTsKpMURb/I3p6jdKoBQ2zI+9Q7kA==", + "dev": true, + "requires": { + "cssnano-utils": "^2.0.1", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-selector-parser": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", + "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-svgo": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.0.3.tgz", + "integrity": "sha512-41XZUA1wNDAZrQ3XgWREL/M2zSw8LJPvb5ZWivljBsUQAGoEKMYm6okHsTjJxKYI4M75RQEH4KYlEM52VwdXVA==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.1.0", + "svgo": "^2.7.0" + } + }, + "postcss-unique-selectors": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.0.1.tgz", + "integrity": "sha512-gwi1NhHV4FMmPn+qwBNuot1sG1t2OmacLQ/AX29lzyggnjd+MnVD5uqQmpXO3J17KGL2WAxQruj1qTd3H0gG/w==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.2", + "postcss-selector-parser": "^6.0.5", + "uniqs": "^2.0.0" + } + }, + "postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "dev": true + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true + }, + "pretty-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", + "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "dependencies": { + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + } + } + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "dev": true + } + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "purgecss": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-4.0.3.tgz", + "integrity": "sha512-PYOIn5ibRIP34PBU9zohUcCI09c7drPJJtTDAc0Q6QlRz2/CHQ8ywGLdE7ZhxU2VTqB7p5wkvj5Qcm05Rz3Jmw==", + "dev": true, + "requires": { + "commander": "^6.0.0", + "glob": "^7.0.0", + "postcss": "^8.2.1", + "postcss-selector-parser": "^6.0.2" + }, + "dependencies": { + "commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true + } + } + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "rechoir": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", + "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "dev": true, + "requires": { + "resolve": "^1.9.0" + } + }, + "reduce-css-calc": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-2.1.8.tgz", + "integrity": "sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg==", + "dev": true, + "requires": { + "css-unit-converter": "^1.1.1", + "postcss-value-parser": "^3.3.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } + } + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz", + "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==", + "dev": true, + "requires": { + "regenerate": "^1.4.2" + } + }, + "regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "dev": true + }, + "regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "regexpu-core": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", + "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==", + "dev": true, + "requires": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^9.0.0", + "regjsgen": "^0.5.2", + "regjsparser": "^0.7.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + } + }, + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true + }, + "regjsparser": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz", + "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true + }, + "replace-ext": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", + "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + } + }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", + "dev": true + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selfsigned": { + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", + "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", + "dev": true, + "requires": { + "node-forge": "^0.10.0" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, + "signal-exit": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", + "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==", + "dev": true + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dev": true, + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + } + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "sockjs": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", + "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "dev": true, + "requires": { + "faye-websocket": "^0.11.3", + "uuid": "^3.4.0", + "websocket-driver": "^0.7.4" + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", + "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", + "dev": true + }, + "source-map-support": { + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", + "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "std-env": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.0.1.tgz", + "integrity": "sha512-mC1Ps9l77/97qeOZc+HrOL7TIaOboHqMZ24dGVQrlxFcpPpfCHpH+qfUT7Dz+6mlG8+JPA1KfBQo19iC/+Ngcw==", + "dev": true + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + } + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true + }, + "style-loader": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-2.0.0.tgz", + "integrity": "sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "stylehacks": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.0.1.tgz", + "integrity": "sha512-Es0rVnHIqbWzveU1b24kbw92HsebBepxfcqe5iix7t9j0PQqhs0IxXVXv0pY2Bxa08CgMkzD6OWql7kbGOuEdA==", + "dev": true, + "requires": { + "browserslist": "^4.16.0", + "postcss-selector-parser": "^6.0.4" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dev": true, + "requires": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + } + }, + "tabbable": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-5.2.1.tgz", + "integrity": "sha512-40pEZ2mhjaZzK0BnI+QGNjJO8UYx9pP5v7BGe17SORTO0OEuuaAwQTkAp8whcZvqon44wKFOikD+Al11K3JICQ==", + "dev": true + }, + "tailwindcss": { + "version": "2.2.19", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-2.2.19.tgz", + "integrity": "sha512-6Ui7JSVtXadtTUo2NtkBBacobzWiQYVjYW0ZnKaP9S1ZCKQ0w7KVNz+YSDI/j7O7KCMHbOkz94ZMQhbT9pOqjw==", + "dev": true, + "requires": { + "arg": "^5.0.1", + "bytes": "^3.0.0", + "chalk": "^4.1.2", + "chokidar": "^3.5.2", + "color": "^4.0.1", + "cosmiconfig": "^7.0.1", + "detective": "^5.2.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.7", + "fs-extra": "^10.0.0", + "glob-parent": "^6.0.1", + "html-tags": "^3.1.0", + "is-color-stop": "^1.1.0", + "is-glob": "^4.0.1", + "lodash": "^4.17.21", + "lodash.topath": "^4.5.2", + "modern-normalize": "^1.1.0", + "node-emoji": "^1.11.0", + "normalize-path": "^3.0.0", + "object-hash": "^2.2.0", + "postcss-js": "^3.0.3", + "postcss-load-config": "^3.1.0", + "postcss-nested": "5.0.6", + "postcss-selector-parser": "^6.0.6", + "postcss-value-parser": "^4.1.0", + "pretty-hrtime": "^1.0.3", + "purgecss": "^4.0.3", + "quick-lru": "^5.1.1", + "reduce-css-calc": "^2.1.8", + "resolve": "^1.20.0", + "tmp": "^0.2.1" + }, + "dependencies": { + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + } + } + }, + "tailwindcss-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tailwindcss-dir/-/tailwindcss-dir-4.0.0.tgz", + "integrity": "sha512-G5orTODS8sDQOZqKa2Q4Ey/F4nlxK1mTZm02iKHLxZaNjpboPews/h2KUksC5KbgIVrpmOe1hqcNYZJy07ftwA==", + "dev": true, + "requires": { + "tailwindcss": "^1.0.1" + }, + "dependencies": { + "autoprefixer": { + "version": "9.8.8", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz", + "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", + "dev": true, + "requires": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "picocolors": "^0.2.1", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + } + }, + "color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "dev": true, + "requires": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-js": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-2.0.3.tgz", + "integrity": "sha512-zS59pAk3deu6dVHyrGqmC3oDXBdNdajk4k1RyxeVXCrcEDBUBHoIhE4QTsmhxgzXxsaqFDAkUZfmMa5f/N/79w==", + "dev": true, + "requires": { + "camelcase-css": "^2.0.1", + "postcss": "^7.0.18" + } + }, + "postcss-nested": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-4.2.3.tgz", + "integrity": "sha512-rOv0W1HquRCamWy2kFl3QazJMMe1ku6rCFoAAH+9AcxdbpDeBr6k968MLWuLjvjMcGEip01ak09hKOEgpK9hvw==", + "dev": true, + "requires": { + "postcss": "^7.0.32", + "postcss-selector-parser": "^6.0.2" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "tailwindcss": { + "version": "1.9.6", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-1.9.6.tgz", + "integrity": "sha512-nY8WYM/RLPqGsPEGEV2z63riyQPcHYZUJpAwdyBzVpxQHOHqHE+F/fvbCeXhdF1+TA5l72vSkZrtYCB9hRcwkQ==", + "dev": true, + "requires": { + "@fullhuman/postcss-purgecss": "^2.1.2", + "autoprefixer": "^9.4.5", + "browserslist": "^4.12.0", + "bytes": "^3.0.0", + "chalk": "^3.0.0 || ^4.0.0", + "color": "^3.1.2", + "detective": "^5.2.0", + "fs-extra": "^8.0.0", + "html-tags": "^3.1.0", + "lodash": "^4.17.20", + "node-emoji": "^1.8.1", + "normalize.css": "^8.0.1", + "object-hash": "^2.0.3", + "postcss": "^7.0.11", + "postcss-functions": "^3.0.0", + "postcss-js": "^2.0.0", + "postcss-nested": "^4.1.1", + "postcss-selector-parser": "^6.0.0", + "postcss-value-parser": "^4.1.0", + "pretty-hrtime": "^1.0.3", + "reduce-css-calc": "^2.1.6", + "resolve": "^1.14.2" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + } + } + }, + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true + }, + "terser": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", + "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.2.5.tgz", + "integrity": "sha512-3luOVHku5l0QBeYS8r4CdHYWEGMmIj3H1U64jgkdZzECcSOJAyJ9TjuqcQZvw1Y+4AOBN9SeYJPJmFn2cM4/2g==", + "dev": true, + "requires": { + "jest-worker": "^27.0.6", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1", + "terser": "^5.7.2" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", + "dev": true + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "trix": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/trix/-/trix-1.3.1.tgz", + "integrity": "sha512-BbH6mb6gk+AV4f2as38mP6Ucc1LE3OD6XxkZnAgPIduWXYtvg2mI3cZhIZSLqmMh9OITEpOBCCk88IVmyjU7bA==", + "dev": true + }, + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "dev": true + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", + "dev": true + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + } + } + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "dev": true + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "vue-style-loader": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz", + "integrity": "sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==", + "dev": true, + "requires": { + "hash-sum": "^1.0.2", + "loader-utils": "^1.0.2" + } + }, + "watchpack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.2.0.tgz", + "integrity": "sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA==", + "dev": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "webpack": { + "version": "5.64.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.64.0.tgz", + "integrity": "sha512-UclnN24m054HaPC45nmDEosX6yXWD+UGC12YtUs5i356DleAUGMDC9LBAw37xRRfgPKYIdCYjGA7RZ1AA+ZnGg==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.0", + "@types/estree": "^0.0.50", + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/wasm-edit": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1", + "acorn": "^8.4.1", + "acorn-import-assertions": "^1.7.6", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.8.3", + "es-module-lexer": "^0.9.0", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.4", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.1.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.1.3", + "watchpack": "^2.2.0", + "webpack-sources": "^3.2.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "webpack-sources": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.2.tgz", + "integrity": "sha512-cp5qdmHnu5T8wRg2G3vZZHoJPN14aqQ89SyQ11NpGH5zEMDCclt49rzo+MaRazk7/UeILhAI+/sEtcM+7Fr0nw==", + "dev": true + } + } + }, + "webpack-cli": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.1.tgz", + "integrity": "sha512-JYRFVuyFpzDxMDB+v/nanUdQYcZtqFPGzmlW4s+UkPMFhSpfRNmf1z4AwYcHJVdvEFAM7FFCQdNTpsBYhDLusQ==", + "dev": true, + "requires": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.1.0", + "@webpack-cli/info": "^1.4.0", + "@webpack-cli/serve": "^1.6.0", + "colorette": "^2.0.14", + "commander": "^7.0.0", + "execa": "^5.0.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "webpack-merge": "^5.7.3" + } + }, + "webpack-dev-middleware": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.2.1.tgz", + "integrity": "sha512-Kx1X+36Rn9JaZcQMrJ7qN3PMAuKmEDD9ZISjUj3Cgq4A6PtwYsC4mpaKotSRYH3iOF6HsUa8viHKS59FlyVifQ==", + "dev": true, + "requires": { + "colorette": "^2.0.10", + "memfs": "^3.2.2", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^3.1.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "webpack-dev-server": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.4.0.tgz", + "integrity": "sha512-+S0XRIbsopVjPFjCO8I07FXYBWYqkFmuP56ucGMTs2hA/gV4q2M9xTmNo5Tg4o8ffRR+Nm3AsXnQXxKRyYovrA==", + "dev": true, + "requires": { + "ansi-html-community": "^0.0.8", + "bonjour": "^3.5.0", + "chokidar": "^3.5.2", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "del": "^6.0.0", + "express": "^4.17.1", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.0", + "internal-ip": "^6.2.0", + "ipaddr.js": "^2.0.1", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "portfinder": "^1.0.28", + "schema-utils": "^3.1.0", + "selfsigned": "^1.10.11", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "spdy": "^4.0.2", + "strip-ansi": "^7.0.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^5.2.1", + "ws": "^8.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + } + } + }, + "webpack-merge": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", + "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + } + }, + "webpack-notifier": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/webpack-notifier/-/webpack-notifier-1.14.1.tgz", + "integrity": "sha512-OVOoiOyKHS3z9pN1nLdPY2Pf/R3wiBsN0KiPc3K6ApwMBfHbyUomQc2Mr0naeKxfqXyCBPHfQuqpL9yoL0rgkA==", + "dev": true, + "requires": { + "node-notifier": "^9.0.0", + "strip-ansi": "^6.0.0" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "webpackbar": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz", + "integrity": "sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "consola": "^2.15.3", + "pretty-time": "^1.1.0", + "std-env": "^3.0.1" + } + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "ws": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "dev": true, + "requires": {} + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true + }, + "yargs": { + "version": "17.2.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.2.1.tgz", + "integrity": "sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000000..c313ff96ac --- /dev/null +++ b/package.json @@ -0,0 +1,34 @@ +{ + "name": "filament", + "scripts": { + "build": "node bin/build && mix --production", + "watch": "node bin/build && mix watch" + }, + "devDependencies": { + "@alpinejs/trap": "^3.5.0", + "@babel/runtime": "^7.15.3", + "@github/file-attachment-element": "^2.0.1", + "@github/markdown-toolbar-element": "^1.5.1", + "@tailwindcss/forms": "^0.3.4", + "@tailwindcss/typography": "^0.4.1", + "alpinejs": "^3.5.0", + "chart.js": "^3.6.0", + "dayjs": "^1.10.6", + "esbuild": "^0.8.57", + "filepond": "^4.28.2", + "filepond-plugin-file-validate-size": "^2.2.4", + "filepond-plugin-file-validate-type": "^1.2.6", + "filepond-plugin-image-crop": "^2.0.6", + "filepond-plugin-image-exif-orientation": "^1.0.11", + "filepond-plugin-image-preview": "^4.6.7", + "filepond-plugin-image-resize": "^2.0.10", + "filepond-plugin-image-transform": "^3.8.6", + "imask": "^6.1.0", + "laravel-mix": "^6.0.37", + "marked": "^3.0.0", + "mdhl": "^0.0.6", + "tailwindcss": "^2.2.19", + "tailwindcss-dir": "^4.0.0", + "trix": "^1.3.1" + } +} diff --git a/packages/admin/.gitignore b/packages/admin/.gitignore new file mode 100644 index 0000000000..61ead86667 --- /dev/null +++ b/packages/admin/.gitignore @@ -0,0 +1 @@ +/vendor diff --git a/packages/admin/composer.json b/packages/admin/composer.json new file mode 100644 index 0000000000..e54341e1bd --- /dev/null +++ b/packages/admin/composer.json @@ -0,0 +1,48 @@ +{ + "name": "filament/filament", + "description": "Effortlessly build TALL-powered admin panels.", + "license": "MIT", + "homepage": "https://github.com/laravel-filament/filament", + "support": { + "issues": "https://github.com/laravel-filament/filament/issues", + "source": "https://github.com/laravel-filament/filament" + }, + "require": { + "php": "^8.0", + "danharrin/livewire-rate-limiting": "^0.3.0", + "filament/forms": "self.version", + "filament/tables": "self.version", + "illuminate/auth": "^8.6", + "illuminate/console": "^8.6", + "illuminate/contracts": "^8.6", + "illuminate/cookie": "^8.6", + "illuminate/database": "^8.6", + "illuminate/http": "^8.6", + "illuminate/routing": "^8.6", + "illuminate/session": "^8.6", + "illuminate/support": "^8.6", + "illuminate/view": "^8.6", + "livewire/livewire": "^2.6", + "spatie/laravel-package-tools": "^1.9" + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Filament\\": "src" + } + }, + "extra": { + "laravel": { + "providers": [ + "Filament\\FilamentServiceProvider" + ] + } + }, + "config": { + "sort-packages": true + }, + "minimum-stability": "dev", + "prefer-stable": true +} diff --git a/packages/admin/composer.lock b/packages/admin/composer.lock new file mode 100644 index 0000000000..ff19550013 --- /dev/null +++ b/packages/admin/composer.lock @@ -0,0 +1,4722 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "6650aed78681b002634cfdf09b39d690", + "packages": [ + { + "name": "akaunting/laravel-money", + "version": "1.2.3", + "source": { + "type": "git", + "url": "https://github.com/akaunting/laravel-money.git", + "reference": "e97cbb9735540fac995e5e0b17395ef4ba33ac38" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/akaunting/laravel-money/zipball/e97cbb9735540fac995e5e0b17395ef4ba33ac38", + "reference": "e97cbb9735540fac995e5e0b17395ef4ba33ac38", + "shasum": "" + }, + "require": { + "illuminate/support": ">=5.4", + "illuminate/view": ">=5.4", + "php": ">=5.6.4" + }, + "require-dev": { + "mockery/mockery": ">=1.0", + "phpunit/phpunit": ">=5.7" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Akaunting\\Money\\Provider" + ] + } + }, + "autoload": { + "psr-4": { + "Akaunting\\Money\\": "./src" + }, + "files": [ + "src/helpers.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Denis Duliçi", + "email": "info@akaunting.com", + "homepage": "https://akaunting.com", + "role": "Developer" + } + ], + "description": "Currency formatting and conversion package for Laravel", + "keywords": [ + "convert", + "currency", + "format", + "laravel", + "money" + ], + "support": { + "issues": "https://github.com/akaunting/laravel-money/issues", + "source": "https://github.com/akaunting/laravel-money/tree/1.2.3" + }, + "time": "2021-09-28T06:19:54+00:00" + }, + { + "name": "blade-ui-kit/blade-heroicons", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/blade-ui-kit/blade-heroicons.git", + "reference": "8c614b98ec27177509cb37023d04f6eb8d1d8d97" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/blade-ui-kit/blade-heroicons/zipball/8c614b98ec27177509cb37023d04f6eb8d1d8d97", + "reference": "8c614b98ec27177509cb37023d04f6eb8d1d8d97", + "shasum": "" + }, + "require": { + "blade-ui-kit/blade-icons": "^1.1", + "illuminate/support": "^8.0", + "php": "^7.4|^8.0" + }, + "require-dev": { + "orchestra/testbench": "^6.0", + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "BladeUI\\Heroicons\\BladeHeroiconsServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "BladeUI\\Heroicons\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dries Vints", + "homepage": "https://driesvints.com" + } + ], + "description": "A package to easily make use of Heroicons in your Laravel Blade views.", + "homepage": "https://github.com/blade-ui-kit/blade-heroicons", + "keywords": [ + "Heroicons", + "blade", + "laravel" + ], + "support": { + "issues": "https://github.com/blade-ui-kit/blade-heroicons/issues", + "source": "https://github.com/blade-ui-kit/blade-heroicons/tree/1.2.1" + }, + "funding": [ + { + "url": "https://github.com/caneco", + "type": "github" + }, + { + "url": "https://github.com/driesvints", + "type": "github" + } + ], + "time": "2021-12-05T17:15:57+00:00" + }, + { + "name": "blade-ui-kit/blade-icons", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/blade-ui-kit/blade-icons.git", + "reference": "548869bc820a25f803530c82028482aefe08115f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/blade-ui-kit/blade-icons/zipball/548869bc820a25f803530c82028482aefe08115f", + "reference": "548869bc820a25f803530c82028482aefe08115f", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^8.0", + "illuminate/filesystem": "^8.0", + "illuminate/support": "^8.0", + "illuminate/view": "^8.0", + "php": "^7.4|^8.0", + "symfony/console": "^5.3", + "symfony/finder": "^5.3" + }, + "require-dev": { + "mockery/mockery": "^1.3", + "orchestra/testbench": "^6.0", + "phpunit/phpunit": "^9.0" + }, + "bin": [ + "bin/blade-icons-generate" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "BladeUI\\Icons\\BladeIconsServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "BladeUI\\Icons\\": "src" + }, + "files": [ + "src/helpers.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dries Vints", + "homepage": "https://driesvints.com" + } + ], + "description": "A package to easily make use of icons in your Laravel Blade views.", + "homepage": "https://github.com/blade-ui-kit/blade-icons", + "keywords": [ + "blade", + "icons", + "laravel", + "svg" + ], + "support": { + "issues": "https://github.com/blade-ui-kit/blade-icons/issues", + "source": "https://github.com/blade-ui-kit/blade-icons" + }, + "funding": [ + { + "url": "https://github.com/caneco", + "type": "github" + }, + { + "url": "https://github.com/driesvints", + "type": "github" + } + ], + "time": "2021-08-11T10:09:06+00:00" + }, + { + "name": "brick/math", + "version": "0.9.3", + "source": { + "type": "git", + "url": "https://github.com/brick/math.git", + "reference": "ca57d18f028f84f777b2168cd1911b0dee2343ae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/brick/math/zipball/ca57d18f028f84f777b2168cd1911b0dee2343ae", + "reference": "ca57d18f028f84f777b2168cd1911b0dee2343ae", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.2", + "phpunit/phpunit": "^7.5.15 || ^8.5 || ^9.0", + "vimeo/psalm": "4.9.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Brick\\Math\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Arbitrary-precision arithmetic library", + "keywords": [ + "Arbitrary-precision", + "BigInteger", + "BigRational", + "arithmetic", + "bigdecimal", + "bignum", + "brick", + "math" + ], + "support": { + "issues": "https://github.com/brick/math/issues", + "source": "https://github.com/brick/math/tree/0.9.3" + }, + "funding": [ + { + "url": "https://github.com/BenMorel", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/brick/math", + "type": "tidelift" + } + ], + "time": "2021-08-15T20:50:18+00:00" + }, + { + "name": "danharrin/date-format-converter", + "version": "v0.2.0", + "source": { + "type": "git", + "url": "https://github.com/danharrin/date-format-converter.git", + "reference": "ee448ab0cbe2ea36edb886a01670fc760e388f19" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/danharrin/date-format-converter/zipball/ee448ab0cbe2ea36edb886a01670fc760e388f19", + "reference": "ee448ab0cbe2ea36edb886a01670fc760e388f19", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0" + }, + "type": "library", + "autoload": { + "files": [ + "src/helpers.php", + "src/standards.php" + ], + "psr-4": { + "DanHarrin\\DateFormatConverter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dan Harrin", + "email": "dan@danharrin.com" + } + ], + "description": "Convert token-based date formats between standards.", + "homepage": "https://github.com/danharrin/date-format-converter", + "support": { + "issues": "https://github.com/danharrin/date-format-converter/issues", + "source": "https://github.com/danharrin/date-format-converter" + }, + "funding": [ + { + "url": "https://github.com/danharrin", + "type": "github" + } + ], + "time": "2021-02-10T23:58:47+00:00" + }, + { + "name": "danharrin/livewire-rate-limiting", + "version": "v0.3.0", + "source": { + "type": "git", + "url": "https://github.com/danharrin/livewire-rate-limiting.git", + "reference": "c97041cd4f94168d5077d4463062e681d057e00a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/danharrin/livewire-rate-limiting/zipball/c97041cd4f94168d5077d4463062e681d057e00a", + "reference": "c97041cd4f94168d5077d4463062e681d057e00a", + "shasum": "" + }, + "require": { + "illuminate/support": "^8.0", + "php": "^7.2|^8.0" + }, + "require-dev": { + "livewire/livewire": "^2.3", + "orchestra/testbench": "^6.2", + "phpunit/phpunit": "^9.4", + "symplify/monorepo-builder": "^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "DanHarrin\\LivewireRateLimiting\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dan Harrin", + "email": "dan@danharrin.com" + } + ], + "description": "Apply rate limiters to Laravel Livewire actions.", + "homepage": "https://github.com/danharrin/livewire-rate-limiting", + "support": { + "issues": "https://github.com/danharrin/livewire-rate-limiting/issues", + "source": "https://github.com/danharrin/livewire-rate-limiting" + }, + "funding": [ + { + "url": "https://github.com/danharrin", + "type": "github" + } + ], + "time": "2021-05-17T08:01:19+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89", + "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^8.2", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpstan/phpstan-strict-rules": "^0.12", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "vimeo/psalm": "^4.10" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.4" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2021-10-22T20:16:43+00:00" + }, + { + "name": "doctrine/lexer", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042", + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "phpstan/phpstan": "^0.11.8", + "phpunit/phpunit": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/1.2.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2020-05-25T17:44:05+00:00" + }, + { + "name": "egulias/email-validator", + "version": "2.1.25", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/0dbf5d78455d4d6a41d186da50adc1122ec066f4", + "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^1.0.1", + "php": ">=5.5", + "symfony/polyfill-intl-idn": "^1.10" + }, + "require-dev": { + "dominicsayers/isemail": "^3.0.7", + "phpunit/phpunit": "^4.8.36|^7.5.15", + "satooshi/php-coveralls": "^1.0.1" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/2.1.25" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2020-12-29T14:50:06+00:00" + }, + { + "name": "filament/forms", + "version": "2.x-dev", + "source": { + "type": "git", + "url": "https://github.com/laravel-filament/forms.git", + "reference": "6018bfdba1ea4279408ff87e5c5e0f978d456934" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel-filament/forms/zipball/6018bfdba1ea4279408ff87e5c5e0f978d456934", + "reference": "6018bfdba1ea4279408ff87e5c5e0f978d456934", + "shasum": "" + }, + "require": { + "blade-ui-kit/blade-heroicons": "^1.2", + "danharrin/date-format-converter": "^0.2", + "illuminate/console": "^8.6", + "illuminate/contracts": "^8.6", + "illuminate/database": "^8.6", + "illuminate/filesystem": "^8.6", + "illuminate/support": "^8.6", + "illuminate/validation": "^8.6", + "illuminate/view": "^8.6", + "livewire/livewire": "^2.6", + "php": "^8.0", + "spatie/laravel-package-tools": "^1.9" + }, + "default-branch": true, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Filament\\Forms\\FormsServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Filament\\Forms\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Effortlessly build TALL-powered forms.", + "homepage": "https://github.com/laravel-filament/filament", + "support": { + "issues": "https://github.com/laravel-filament/filament/issues", + "source": "https://github.com/laravel-filament/filament" + }, + "time": "2021-12-06T16:33:35+00:00" + }, + { + "name": "filament/tables", + "version": "2.x-dev", + "source": { + "type": "git", + "url": "https://github.com/laravel-filament/tables.git", + "reference": "6bee5ecfd3357f1a279d9940782beb145e4cf505" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel-filament/tables/zipball/6bee5ecfd3357f1a279d9940782beb145e4cf505", + "reference": "6bee5ecfd3357f1a279d9940782beb145e4cf505", + "shasum": "" + }, + "require": { + "akaunting/laravel-money": "^1.2", + "blade-ui-kit/blade-heroicons": "^1.2", + "filament/forms": "self.version", + "illuminate/console": "^8.6", + "illuminate/contracts": "^8.6", + "illuminate/database": "^8.6", + "illuminate/filesystem": "^8.6", + "illuminate/support": "^8.6", + "illuminate/view": "^8.6", + "livewire/livewire": "^2.6", + "php": "^8.0", + "spatie/laravel-package-tools": "^1.9" + }, + "default-branch": true, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Filament\\Tables\\TablesServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Filament\\Tables\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Effortlessly build TALL-powered tables.", + "homepage": "https://github.com/laravel-filament/filament", + "support": { + "issues": "https://github.com/laravel-filament/filament/issues", + "source": "https://github.com/laravel-filament/filament" + }, + "time": "2021-12-06T16:33:34+00:00" + }, + { + "name": "illuminate/auth", + "version": "v8.74.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/auth.git", + "reference": "9b26b62776a4c7c15e680e6f5c067d6fcb463fb2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/auth/zipball/9b26b62776a4c7c15e680e6f5c067d6fcb463fb2", + "reference": "9b26b62776a4c7c15e680e6f5c067d6fcb463fb2", + "shasum": "" + }, + "require": { + "illuminate/collections": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/http": "^8.0", + "illuminate/macroable": "^8.0", + "illuminate/queue": "^8.0", + "illuminate/support": "^8.0", + "php": "^7.3|^8.0" + }, + "suggest": { + "illuminate/console": "Required to use the auth:clear-resets command (^8.0).", + "illuminate/queue": "Required to fire login / logout events (^8.0).", + "illuminate/session": "Required to use the session based guard (^8.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Auth\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Auth package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-11-18T14:09:24+00:00" + }, + { + "name": "illuminate/bus", + "version": "v8.74.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/bus.git", + "reference": "82ed7d9d6edc625ffe5d01fe17af3e223aed1cb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/bus/zipball/82ed7d9d6edc625ffe5d01fe17af3e223aed1cb0", + "reference": "82ed7d9d6edc625ffe5d01fe17af3e223aed1cb0", + "shasum": "" + }, + "require": { + "illuminate/collections": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/pipeline": "^8.0", + "illuminate/support": "^8.0", + "php": "^7.3|^8.0" + }, + "suggest": { + "illuminate/queue": "Required to use closures when chaining jobs (^7.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Bus\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Bus package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-11-23T19:43:42+00:00" + }, + { + "name": "illuminate/collections", + "version": "v8.74.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/collections.git", + "reference": "f292b77824b42cd28decc7327e7c2e24c3806371" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/collections/zipball/f292b77824b42cd28decc7327e7c2e24c3806371", + "reference": "f292b77824b42cd28decc7327e7c2e24c3806371", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^8.0", + "illuminate/macroable": "^8.0", + "php": "^7.3|^8.0" + }, + "suggest": { + "symfony/var-dumper": "Required to use the dump method (^5.4)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + }, + "files": [ + "helpers.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Collections package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-11-30T14:29:03+00:00" + }, + { + "name": "illuminate/console", + "version": "v8.74.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/console.git", + "reference": "1f952710c671b8ca90bb10be585ebcc94f72166a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/console/zipball/1f952710c671b8ca90bb10be585ebcc94f72166a", + "reference": "1f952710c671b8ca90bb10be585ebcc94f72166a", + "shasum": "" + }, + "require": { + "illuminate/collections": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/macroable": "^8.0", + "illuminate/support": "^8.0", + "php": "^7.3|^8.0", + "symfony/console": "^5.4", + "symfony/process": "^5.4" + }, + "suggest": { + "dragonmantank/cron-expression": "Required to use scheduler (^3.0.2).", + "guzzlehttp/guzzle": "Required to use the ping methods on schedules (^6.5.5|^7.0.1).", + "illuminate/bus": "Required to use the scheduled job dispatcher (^8.0).", + "illuminate/container": "Required to use the scheduler (^8.0).", + "illuminate/filesystem": "Required to use the generator command (^8.0).", + "illuminate/queue": "Required to use closures for scheduled jobs (^8.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Console\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Console package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-11-30T14:13:40+00:00" + }, + { + "name": "illuminate/container", + "version": "v8.74.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/container.git", + "reference": "6ac391bb27391706c5f921b85060aa2c4ca03fae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/container/zipball/6ac391bb27391706c5f921b85060aa2c4ca03fae", + "reference": "6ac391bb27391706c5f921b85060aa2c4ca03fae", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^8.0", + "php": "^7.3|^8.0", + "psr/container": "^1.0" + }, + "provide": { + "psr/container-implementation": "1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Container\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Container package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-11-17T15:04:30+00:00" + }, + { + "name": "illuminate/contracts", + "version": "v8.74.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/contracts.git", + "reference": "b0886ec05a63b204634d64d0b39d5b78a7c06f81" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/contracts/zipball/b0886ec05a63b204634d64d0b39d5b78a7c06f81", + "reference": "b0886ec05a63b204634d64d0b39d5b78a7c06f81", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0", + "psr/container": "^1.0", + "psr/simple-cache": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Contracts\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Contracts package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-11-17T15:04:30+00:00" + }, + { + "name": "illuminate/cookie", + "version": "v8.74.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/cookie.git", + "reference": "9cd5bac80b550350edeb2dd59e0c9fbf1a57adb8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/cookie/zipball/9cd5bac80b550350edeb2dd59e0c9fbf1a57adb8", + "reference": "9cd5bac80b550350edeb2dd59e0c9fbf1a57adb8", + "shasum": "" + }, + "require": { + "illuminate/collections": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/macroable": "^8.0", + "illuminate/support": "^8.0", + "php": "^7.3|^8.0", + "symfony/http-foundation": "^5.4", + "symfony/http-kernel": "^5.4" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Cookie\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Cookie package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-11-30T14:13:40+00:00" + }, + { + "name": "illuminate/database", + "version": "v8.74.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/database.git", + "reference": "bc11c74366afdde941e5a6e76abd4812c22ca8dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/database/zipball/bc11c74366afdde941e5a6e76abd4812c22ca8dd", + "reference": "bc11c74366afdde941e5a6e76abd4812c22ca8dd", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/collections": "^8.0", + "illuminate/container": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/macroable": "^8.0", + "illuminate/support": "^8.0", + "php": "^7.3|^8.0", + "symfony/console": "^5.4" + }, + "suggest": { + "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.13.3|^3.1.4).", + "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", + "illuminate/console": "Required to use the database commands (^8.0).", + "illuminate/events": "Required to use the observers with Eloquent (^8.0).", + "illuminate/filesystem": "Required to use the migrations (^8.0).", + "illuminate/pagination": "Required to paginate the result set (^8.0).", + "symfony/finder": "Required to use Eloquent model factories (^5.4)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Database\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Database package.", + "homepage": "https://laravel.com", + "keywords": [ + "database", + "laravel", + "orm", + "sql" + ], + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-11-30T15:21:26+00:00" + }, + { + "name": "illuminate/events", + "version": "v8.74.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/events.git", + "reference": "b7f06cafb6c09581617f2ca05d69e9b159e5a35d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/events/zipball/b7f06cafb6c09581617f2ca05d69e9b159e5a35d", + "reference": "b7f06cafb6c09581617f2ca05d69e9b159e5a35d", + "shasum": "" + }, + "require": { + "illuminate/bus": "^8.0", + "illuminate/collections": "^8.0", + "illuminate/container": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/macroable": "^8.0", + "illuminate/support": "^8.0", + "php": "^7.3|^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Events\\": "" + }, + "files": [ + "functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Events package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-09-15T14:32:50+00:00" + }, + { + "name": "illuminate/filesystem", + "version": "v8.74.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/filesystem.git", + "reference": "b8f4b43a65d0e93312d8599bc4e86e21f68f7ccf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/filesystem/zipball/b8f4b43a65d0e93312d8599bc4e86e21f68f7ccf", + "reference": "b8f4b43a65d0e93312d8599bc4e86e21f68f7ccf", + "shasum": "" + }, + "require": { + "illuminate/collections": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/macroable": "^8.0", + "illuminate/support": "^8.0", + "php": "^7.3|^8.0", + "symfony/finder": "^5.4" + }, + "suggest": { + "ext-ftp": "Required to use the Flysystem FTP driver.", + "illuminate/http": "Required for handling uploaded files (^7.0).", + "league/flysystem": "Required to use the Flysystem local and FTP drivers (^1.1).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^1.0).", + "league/flysystem-cached-adapter": "Required to use the Flysystem cache (^1.0).", + "league/flysystem-sftp": "Required to use the Flysystem SFTP driver (^1.0).", + "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^5.4).", + "symfony/mime": "Required to enable support for guessing extensions (^5.4)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Filesystem\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Filesystem package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-11-30T14:13:40+00:00" + }, + { + "name": "illuminate/http", + "version": "v8.74.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/http.git", + "reference": "e135f6aa7406b5e1bcff5aba99eab3b3889a319b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/http/zipball/e135f6aa7406b5e1bcff5aba99eab3b3889a319b", + "reference": "e135f6aa7406b5e1bcff5aba99eab3b3889a319b", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/collections": "^8.0", + "illuminate/macroable": "^8.0", + "illuminate/session": "^8.0", + "illuminate/support": "^8.0", + "php": "^7.3|^8.0", + "symfony/http-foundation": "^5.4", + "symfony/http-kernel": "^5.4", + "symfony/mime": "^5.4" + }, + "suggest": { + "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", + "guzzlehttp/guzzle": "Required to use the HTTP Client (^6.5.5|^7.0.1)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Http\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Http package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-11-30T14:13:40+00:00" + }, + { + "name": "illuminate/macroable", + "version": "v8.74.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/macroable.git", + "reference": "aed81891a6e046fdee72edd497f822190f61c162" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/macroable/zipball/aed81891a6e046fdee72edd497f822190f61c162", + "reference": "aed81891a6e046fdee72edd497f822190f61c162", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Macroable package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-11-16T13:57:03+00:00" + }, + { + "name": "illuminate/pipeline", + "version": "v8.74.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/pipeline.git", + "reference": "23aeff5b26ae4aee3f370835c76bd0f4e93f71d2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/pipeline/zipball/23aeff5b26ae4aee3f370835c76bd0f4e93f71d2", + "reference": "23aeff5b26ae4aee3f370835c76bd0f4e93f71d2", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^8.0", + "illuminate/support": "^8.0", + "php": "^7.3|^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Pipeline\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Pipeline package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-03-26T18:39:16+00:00" + }, + { + "name": "illuminate/queue", + "version": "v8.74.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/queue.git", + "reference": "7111e907b4febe419c512a27ca4ce0510638308d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/queue/zipball/7111e907b4febe419c512a27ca4ce0510638308d", + "reference": "7111e907b4febe419c512a27ca4ce0510638308d", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/collections": "^8.0", + "illuminate/console": "^8.0", + "illuminate/container": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/database": "^8.0", + "illuminate/filesystem": "^8.0", + "illuminate/pipeline": "^8.0", + "illuminate/support": "^8.0", + "laravel/serializable-closure": "^1.0", + "opis/closure": "^3.6", + "php": "^7.3|^8.0", + "ramsey/uuid": "^4.2.2", + "symfony/process": "^5.4" + }, + "suggest": { + "aws/aws-sdk-php": "Required to use the SQS queue driver and DynamoDb failed job storage (^3.198.1).", + "ext-pcntl": "Required to use all features of the queue worker.", + "ext-posix": "Required to use all features of the queue worker.", + "illuminate/redis": "Required to use the Redis queue driver (^8.0).", + "pda/pheanstalk": "Required to use the Beanstalk queue driver (^4.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Queue\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Queue package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-11-30T14:13:40+00:00" + }, + { + "name": "illuminate/routing", + "version": "v8.74.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/routing.git", + "reference": "2b4ee7c2c26e48303bfaa6feac95ecc52518fc19" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/routing/zipball/2b4ee7c2c26e48303bfaa6feac95ecc52518fc19", + "reference": "2b4ee7c2c26e48303bfaa6feac95ecc52518fc19", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/collections": "^8.0", + "illuminate/container": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/http": "^8.0", + "illuminate/macroable": "^8.0", + "illuminate/pipeline": "^8.0", + "illuminate/session": "^8.0", + "illuminate/support": "^8.0", + "php": "^7.3|^8.0", + "symfony/http-foundation": "^5.4", + "symfony/http-kernel": "^5.4", + "symfony/routing": "^5.4" + }, + "suggest": { + "illuminate/console": "Required to use the make commands (^8.0).", + "nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^2.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Routing\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Routing package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-11-30T14:13:40+00:00" + }, + { + "name": "illuminate/session", + "version": "v8.74.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/session.git", + "reference": "c5964a2348354f266fb18aac60eed0b81355c258" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/session/zipball/c5964a2348354f266fb18aac60eed0b81355c258", + "reference": "c5964a2348354f266fb18aac60eed0b81355c258", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/collections": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/filesystem": "^8.0", + "illuminate/support": "^8.0", + "php": "^7.3|^8.0", + "symfony/finder": "^5.4", + "symfony/http-foundation": "^5.4" + }, + "suggest": { + "illuminate/console": "Required to use the session:table command (^8.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Session\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Session package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-11-30T14:13:40+00:00" + }, + { + "name": "illuminate/support", + "version": "v8.74.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/support.git", + "reference": "79bb5570274d6abbfaac736992c6b5f5cbcc17c1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/support/zipball/79bb5570274d6abbfaac736992c6b5f5cbcc17c1", + "reference": "79bb5570274d6abbfaac736992c6b5f5cbcc17c1", + "shasum": "" + }, + "require": { + "doctrine/inflector": "^1.4|^2.0", + "ext-json": "*", + "ext-mbstring": "*", + "illuminate/collections": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/macroable": "^8.0", + "nesbot/carbon": "^2.53.1", + "php": "^7.3|^8.0", + "voku/portable-ascii": "^1.4.8" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "suggest": { + "illuminate/filesystem": "Required to use the composer class (^8.0).", + "league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^1.3|^2.0.2).", + "ramsey/uuid": "Required to use Str::uuid() (^4.2.2).", + "symfony/process": "Required to use the composer class (^5.4).", + "symfony/var-dumper": "Required to use the dd function (^5.4).", + "vlucas/phpdotenv": "Required to use the Env class and env helper (^5.2)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + }, + "files": [ + "helpers.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Support package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-11-30T14:13:40+00:00" + }, + { + "name": "illuminate/translation", + "version": "v8.74.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/translation.git", + "reference": "c10a68f37f590dc8c1c1fe5b6ad3f09381282137" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/translation/zipball/c10a68f37f590dc8c1c1fe5b6ad3f09381282137", + "reference": "c10a68f37f590dc8c1c1fe5b6ad3f09381282137", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/collections": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/filesystem": "^8.0", + "illuminate/macroable": "^8.0", + "illuminate/support": "^8.0", + "php": "^7.3|^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Translation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Translation package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-10-30T16:01:33+00:00" + }, + { + "name": "illuminate/validation", + "version": "v8.74.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/validation.git", + "reference": "09dc9206918c341ffc567d4faa977f5ea6d29760" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/validation/zipball/09dc9206918c341ffc567d4faa977f5ea6d29760", + "reference": "09dc9206918c341ffc567d4faa977f5ea6d29760", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.10", + "ext-json": "*", + "illuminate/collections": "^8.0", + "illuminate/container": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/macroable": "^8.0", + "illuminate/support": "^8.0", + "illuminate/translation": "^8.0", + "php": "^7.3|^8.0", + "symfony/http-foundation": "^5.4", + "symfony/mime": "^5.4" + }, + "suggest": { + "ext-bcmath": "Required to use the multiple_of validation rule.", + "illuminate/database": "Required to use the database presence verifier (^8.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Validation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Validation package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-11-30T14:13:40+00:00" + }, + { + "name": "illuminate/view", + "version": "v8.74.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/view.git", + "reference": "cdc88707b86eb9139e350a4fd53ab8e4a32c03f8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/view/zipball/cdc88707b86eb9139e350a4fd53ab8e4a32c03f8", + "reference": "cdc88707b86eb9139e350a4fd53ab8e4a32c03f8", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/collections": "^8.0", + "illuminate/container": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/events": "^8.0", + "illuminate/filesystem": "^8.0", + "illuminate/macroable": "^8.0", + "illuminate/support": "^8.0", + "php": "^7.3|^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\View\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate View package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-11-16T14:40:15+00:00" + }, + { + "name": "laravel/serializable-closure", + "version": "v1.0.5", + "source": { + "type": "git", + "url": "https://github.com/laravel/serializable-closure.git", + "reference": "25de3be1bca1b17d52ff0dc02b646c667ac7266c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/25de3be1bca1b17d52ff0dc02b646c667ac7266c", + "reference": "25de3be1bca1b17d52ff0dc02b646c667ac7266c", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "pestphp/pest": "^1.18", + "phpstan/phpstan": "^0.12.98", + "symfony/var-dumper": "^5.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\SerializableClosure\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "nuno@laravel.com" + } + ], + "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", + "keywords": [ + "closure", + "laravel", + "serializable" + ], + "support": { + "issues": "https://github.com/laravel/serializable-closure/issues", + "source": "https://github.com/laravel/serializable-closure" + }, + "time": "2021-11-30T15:53:04+00:00" + }, + { + "name": "livewire/livewire", + "version": "v2.8.1", + "source": { + "type": "git", + "url": "https://github.com/livewire/livewire.git", + "reference": "0f846a93369109e445f0e5009741b1e19e6fa6f6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/livewire/livewire/zipball/0f846a93369109e445f0e5009741b1e19e6fa6f6", + "reference": "0f846a93369109e445f0e5009741b1e19e6fa6f6", + "shasum": "" + }, + "require": { + "illuminate/database": "^7.0|^8.0", + "illuminate/support": "^7.0|^8.0", + "illuminate/validation": "^7.0|^8.0", + "php": "^7.2.5|^8.0", + "symfony/http-kernel": "^5.0" + }, + "require-dev": { + "calebporzio/sushi": "^2.1", + "laravel/framework": "^7.0|^8.0", + "mockery/mockery": "^1.3.1", + "orchestra/testbench": "^5.0|^6.0", + "orchestra/testbench-dusk": "^5.2|^6.0", + "phpunit/phpunit": "^8.4|^9.0", + "psy/psysh": "@stable" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Livewire\\LivewireServiceProvider" + ], + "aliases": { + "Livewire": "Livewire\\Livewire" + } + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Livewire\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Caleb Porzio", + "email": "calebporzio@gmail.com" + } + ], + "description": "A front-end framework for Laravel.", + "support": { + "issues": "https://github.com/livewire/livewire/issues", + "source": "https://github.com/livewire/livewire/tree/v2.8.1" + }, + "funding": [ + { + "url": "https://github.com/livewire", + "type": "github" + } + ], + "time": "2021-12-02T01:31:26+00:00" + }, + { + "name": "nesbot/carbon", + "version": "2.55.2", + "source": { + "type": "git", + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "8c2a18ce3e67c34efc1b29f64fe61304368259a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/8c2a18ce3e67c34efc1b29f64fe61304368259a2", + "reference": "8c2a18ce3e67c34efc1b29f64fe61304368259a2", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.1.8 || ^8.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" + }, + "require-dev": { + "doctrine/dbal": "^2.0 || ^3.0", + "doctrine/orm": "^2.7", + "friendsofphp/php-cs-fixer": "^3.0", + "kylekatarnls/multi-tester": "^2.0", + "phpmd/phpmd": "^2.9", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12.54", + "phpunit/phpunit": "^7.5.20 || ^8.5.14", + "squizlabs/php_codesniffer": "^3.4" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-3.x": "3.x-dev", + "dev-master": "2.x-dev" + }, + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "docs": "https://carbon.nesbot.com/docs", + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon" + }, + "funding": [ + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "time": "2021-12-03T14:59:52+00:00" + }, + { + "name": "opis/closure", + "version": "3.6.2", + "source": { + "type": "git", + "url": "https://github.com/opis/closure.git", + "reference": "06e2ebd25f2869e54a306dda991f7db58066f7f6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/opis/closure/zipball/06e2ebd25f2869e54a306dda991f7db58066f7f6", + "reference": "06e2ebd25f2869e54a306dda991f7db58066f7f6", + "shasum": "" + }, + "require": { + "php": "^5.4 || ^7.0 || ^8.0" + }, + "require-dev": { + "jeremeamia/superclosure": "^2.0", + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.6.x-dev" + } + }, + "autoload": { + "psr-4": { + "Opis\\Closure\\": "src/" + }, + "files": [ + "functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marius Sarca", + "email": "marius.sarca@gmail.com" + }, + { + "name": "Sorin Sarca", + "email": "sarca_sorin@hotmail.com" + } + ], + "description": "A library that can be used to serialize closures (anonymous functions) and arbitrary objects.", + "homepage": "https://opis.io/closure", + "keywords": [ + "anonymous functions", + "closure", + "function", + "serializable", + "serialization", + "serialize" + ], + "support": { + "issues": "https://github.com/opis/closure/issues", + "source": "https://github.com/opis/closure/tree/3.6.2" + }, + "time": "2021-04-09T13:42:10+00:00" + }, + { + "name": "psr/container", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.2" + }, + "time": "2021-11-05T16:50:12+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/log", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/ef29f6d262798707a9edd554e2b82517ef3a9376", + "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/2.0.0" + }, + "time": "2021-07-14T16:41:46+00:00" + }, + { + "name": "psr/simple-cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/master" + }, + "time": "2017-10-23T01:57:42+00:00" + }, + { + "name": "ramsey/collection", + "version": "1.2.2", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "cccc74ee5e328031b15640b51056ee8d3bb66c0a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/cccc74ee5e328031b15640b51056ee8d3bb66c0a", + "reference": "cccc74ee5e328031b15640b51056ee8d3bb66c0a", + "shasum": "" + }, + "require": { + "php": "^7.3 || ^8", + "symfony/polyfill-php81": "^1.23" + }, + "require-dev": { + "captainhook/captainhook": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "ergebnis/composer-normalize": "^2.6", + "fakerphp/faker": "^1.5", + "hamcrest/hamcrest-php": "^2", + "jangregor/phpstan-prophecy": "^0.8", + "mockery/mockery": "^1.3", + "phpspec/prophecy-phpunit": "^2.0", + "phpstan/extension-installer": "^1", + "phpstan/phpstan": "^0.12.32", + "phpstan/phpstan-mockery": "^0.12.5", + "phpstan/phpstan-phpunit": "^0.12.11", + "phpunit/phpunit": "^8.5 || ^9", + "psy/psysh": "^0.10.4", + "slevomat/coding-standard": "^6.3", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP library for representing and manipulating collections.", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "support": { + "issues": "https://github.com/ramsey/collection/issues", + "source": "https://github.com/ramsey/collection/tree/1.2.2" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/collection", + "type": "tidelift" + } + ], + "time": "2021-10-10T03:01:02+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.2.3", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df", + "reference": "fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df", + "shasum": "" + }, + "require": { + "brick/math": "^0.8 || ^0.9", + "ext-json": "*", + "php": "^7.2 || ^8.0", + "ramsey/collection": "^1.0", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-php80": "^1.14" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "captainhook/captainhook": "^5.10", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "doctrine/annotations": "^1.8", + "ergebnis/composer-normalize": "^2.15", + "mockery/mockery": "^1.3", + "moontoast/math": "^1.1", + "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.2", + "php-mock/php-mock-mockery": "^1.3", + "php-parallel-lint/php-parallel-lint": "^1.1", + "phpbench/phpbench": "^1.0", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-mockery": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpunit/phpunit": "^8.5 || ^9", + "slevomat/coding-standard": "^7.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.9" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-ctype": "Enables faster processing of character classification using ctype functions.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.x-dev" + }, + "captainhook": { + "force-install": true + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Uuid\\": "src/" + }, + "files": [ + "src/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "support": { + "issues": "https://github.com/ramsey/uuid/issues", + "source": "https://github.com/ramsey/uuid/tree/4.2.3" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", + "type": "tidelift" + } + ], + "time": "2021-09-25T23:10:38+00:00" + }, + { + "name": "spatie/laravel-package-tools", + "version": "1.9.2", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-package-tools.git", + "reference": "f710fe196c126fb9e0aee67eb5af49ad8f13f528" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/f710fe196c126fb9e0aee67eb5af49ad8f13f528", + "reference": "f710fe196c126fb9e0aee67eb5af49ad8f13f528", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^7.0|^8.0", + "php": "^7.4|^8.0" + }, + "require-dev": { + "mockery/mockery": "^1.4", + "orchestra/testbench": "^5.0|^6.0", + "phpunit/phpunit": "^9.3", + "spatie/test-time": "^1.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\LaravelPackageTools\\": "src", + "Spatie\\LaravelPackageTools\\Database\\Factories\\": "database/factories" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "role": "Developer" + } + ], + "description": "Tools for creating Laravel packages", + "homepage": "https://github.com/spatie/laravel-package-tools", + "keywords": [ + "laravel-package-tools", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/laravel-package-tools/issues", + "source": "https://github.com/spatie/laravel-package-tools/tree/1.9.2" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2021-09-21T13:06:51+00:00" + }, + { + "name": "symfony/console", + "version": "v5.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "ec3661faca1d110d6c307e124b44f99ac54179e3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/ec3661faca1d110d6c307e124b44f99ac54179e3", + "reference": "ec3661faca1d110d6c307e124b44f99ac54179e3", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.8", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/string": "^5.1|^6.0" + }, + "conflict": { + "psr/log": ">=3", + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", + "symfony/lock": "<4.4", + "symfony/process": "<4.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/log": "^1|^2", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/lock": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v5.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-29T15:30:56+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "c726b64c1ccfe2896cb7df2e1331c357ad1c8ced" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/c726b64c1ccfe2896cb7df2e1331c357ad1c8ced", + "reference": "c726b64c1ccfe2896cb7df2e1331c357ad1c8ced", + "shasum": "" + }, + "require": { + "php": ">=8.0.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.0.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-01T23:48:49+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v6.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "0e8f0c1123a9e9740562f909b7f2daa8525aacd7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/0e8f0c1123a9e9740562f909b7f2daa8525aacd7", + "reference": "0e8f0c1123a9e9740562f909b7f2daa8525aacd7", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^5.4|^6.0" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/serializer": "^5.4|^6.0" + }, + "bin": [ + "Resources/bin/patch-type-declarations" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v6.0.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-29T15:32:57+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v6.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "2774908d5ae32fd94e363e7cbbd87462712c4576" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/2774908d5ae32fd94e363e7cbbd87462712c4576", + "reference": "2774908d5ae32fd94e363e7cbbd87462712c4576", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "symfony/event-dispatcher-contracts": "^2|^3" + }, + "conflict": { + "symfony/dependency-injection": "<5.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/error-handler": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/http-foundation": "^5.4|^6.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/stopwatch": "^5.4|^6.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v6.0.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-23T19:05:29+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "aa5422287b75594b90ee9cd807caf8f0df491385" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/aa5422287b75594b90ee9cd807caf8f0df491385", + "reference": "aa5422287b75594b90ee9cd807caf8f0df491385", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "psr/event-dispatcher": "^1" + }, + "suggest": { + "symfony/event-dispatcher-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.0.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-07-15T12:33:35+00:00" + }, + { + "name": "symfony/finder", + "version": "v5.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "d2f29dac98e96a98be467627bd49c2efb1bc2590" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/d2f29dac98e96a98be467627bd49c2efb1bc2590", + "reference": "d2f29dac98e96a98be467627bd49c2efb1bc2590", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v5.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-28T15:25:38+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v5.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "5ef86ac7927d2de08dc1e26eb91325f9ccbe6309" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/5ef86ac7927d2de08dc1e26eb91325f9ccbe6309", + "reference": "5ef86ac7927d2de08dc1e26eb91325f9ccbe6309", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "predis/predis": "~1.0", + "symfony/cache": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/mime": "^4.4|^5.0|^6.0" + }, + "suggest": { + "symfony/mime": "To use the file extension guesser" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v5.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-28T15:25:38+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v5.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "e012f16688bcb151e965473a70d8ebaa8b1d15ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/e012f16688bcb151e965473a70d8ebaa8b1d15ea", + "reference": "e012f16688bcb151e965473a70d8ebaa8b1d15ea", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/log": "^1|^2", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^5.0|^6.0", + "symfony/http-foundation": "^5.3.7|^6.0", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/browser-kit": "<5.4", + "symfony/cache": "<5.0", + "symfony/config": "<5.0", + "symfony/console": "<4.4", + "symfony/dependency-injection": "<5.3", + "symfony/doctrine-bridge": "<5.0", + "symfony/form": "<5.0", + "symfony/http-client": "<5.0", + "symfony/mailer": "<5.0", + "symfony/messenger": "<5.0", + "symfony/translation": "<5.0", + "symfony/twig-bridge": "<5.0", + "symfony/validator": "<5.0", + "twig/twig": "<2.13" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^5.4|^6.0", + "symfony/config": "^5.0|^6.0", + "symfony/console": "^4.4|^5.0|^6.0", + "symfony/css-selector": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^5.3|^6.0", + "symfony/dom-crawler": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/finder": "^4.4|^5.0|^6.0", + "symfony/http-client-contracts": "^1.1|^2|^3", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/routing": "^4.4|^5.0|^6.0", + "symfony/stopwatch": "^4.4|^5.0|^6.0", + "symfony/translation": "^4.4|^5.0|^6.0", + "symfony/translation-contracts": "^1.1|^2|^3", + "twig/twig": "^2.13|^3.0.4" + }, + "suggest": { + "symfony/browser-kit": "", + "symfony/config": "", + "symfony/console": "", + "symfony/dependency-injection": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a structured process for converting a Request into a Response", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v5.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-29T16:56:53+00:00" + }, + { + "name": "symfony/mime", + "version": "v5.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "d4365000217b67c01acff407573906ff91bcfb34" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/d4365000217b67c01acff407573906ff91bcfb34", + "reference": "d4365000217b67c01acff407573906ff91bcfb34", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/mailer": "<4.4" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/property-access": "^4.4|^5.1|^6.0", + "symfony/property-info": "^4.4|^5.1|^6.0", + "symfony/serializer": "^5.2|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v5.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-23T10:19:22+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-19T12:13:01+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.23.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "16880ba9c5ebe3642d1995ab866db29270b36535" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/16880ba9c5ebe3642d1995ab866db29270b36535", + "reference": "16880ba9c5ebe3642d1995ab866db29270b36535", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T12:26:48+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/65bd267525e82759e7d8c4e8ceea44f398838e65", + "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php72": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T09:27:20+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-19T12:13:01+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.23.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6", + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T12:26:48+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "9a142215a36a3888e30d0a9eeea9766764e96976" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9a142215a36a3888e30d0a9eeea9766764e96976", + "reference": "9a142215a36a3888e30d0a9eeea9766764e96976", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php72/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T09:17:38+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-19T12:13:01+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.23.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be", + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-07-28T13:41:28+00:00" + }, + { + "name": "symfony/polyfill-php81", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "e66119f3de95efc359483f810c4c3e6436279436" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/e66119f3de95efc359483f810c4c3e6436279436", + "reference": "e66119f3de95efc359483f810c4c3e6436279436", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php81\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php81/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-21T13:25:03+00:00" + }, + { + "name": "symfony/process", + "version": "v5.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "5be20b3830f726e019162b26223110c8f47cf274" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/5be20b3830f726e019162b26223110c8f47cf274", + "reference": "5be20b3830f726e019162b26223110c8f47cf274", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v5.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-28T15:25:38+00:00" + }, + { + "name": "symfony/routing", + "version": "v5.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "9eeae93c32ca86746e5d38f3679e9569981038b1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/9eeae93c32ca86746e5d38f3679e9569981038b1", + "reference": "9eeae93c32ca86746e5d38f3679e9569981038b1", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "doctrine/annotations": "<1.12", + "symfony/config": "<5.3", + "symfony/dependency-injection": "<4.4", + "symfony/yaml": "<4.4" + }, + "require-dev": { + "doctrine/annotations": "^1.12", + "psr/log": "^1|^2|^3", + "symfony/config": "^5.3|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/http-foundation": "^4.4|^5.0|^6.0", + "symfony/yaml": "^4.4|^5.0|^6.0" + }, + "suggest": { + "symfony/config": "For using the all-in-one router or any loader", + "symfony/expression-language": "For using expression matching", + "symfony/http-foundation": "For using a Symfony Request object", + "symfony/yaml": "For using the YAML loader" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Maps an HTTP request to a set of configuration variables", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "support": { + "source": "https://github.com/symfony/routing/tree/v5.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-23T10:19:22+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v2.4.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "d664541b99d6fb0247ec5ff32e87238582236204" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d664541b99d6fb0247ec5ff32e87238582236204", + "reference": "d664541b99d6fb0247ec5ff32e87238582236204", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v2.4.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-04T16:37:19+00:00" + }, + { + "name": "symfony/string", + "version": "v6.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "ba727797426af0f587f4800566300bdc0cda0777" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/ba727797426af0f587f4800566300bdc0cda0777", + "reference": "ba727797426af0f587f4800566300bdc0cda0777", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.0" + }, + "require-dev": { + "symfony/error-handler": "^5.4|^6.0", + "symfony/http-client": "^5.4|^6.0", + "symfony/translation-contracts": "^2.0|^3.0", + "symfony/var-exporter": "^5.4|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "files": [ + "Resources/functions.php" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v6.0.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-29T07:35:21+00:00" + }, + { + "name": "symfony/translation", + "version": "v6.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "5e3848083ef1abc4814be154095946b8193f41d6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/5e3848083ef1abc4814be154095946b8193f41d6", + "reference": "5e3848083ef1abc4814be154095946b8193f41d6", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "symfony/polyfill-mbstring": "~1.0", + "symfony/translation-contracts": "^2.3|^3.0" + }, + "conflict": { + "symfony/config": "<5.4", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<5.4", + "symfony/http-kernel": "<5.4", + "symfony/twig-bundle": "<5.4", + "symfony/yaml": "<5.4" + }, + "provide": { + "symfony/translation-implementation": "2.3|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^5.4|^6.0", + "symfony/console": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/finder": "^5.4|^6.0", + "symfony/http-client-contracts": "^1.1|^2.0|^3.0", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/intl": "^5.4|^6.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/service-contracts": "^1.1.2|^2|^3", + "symfony/yaml": "^5.4|^6.0" + }, + "suggest": { + "psr/log-implementation": "To use logging capability in translator", + "symfony/config": "", + "symfony/yaml": "" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v6.0.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-29T15:32:57+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v3.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "1b6ea5a7442af5a12dba3dbd6d71034b5b234e77" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/1b6ea5a7442af5a12dba3dbd6d71034b5b234e77", + "reference": "1b6ea5a7442af5a12dba3dbd6d71034b5b234e77", + "shasum": "" + }, + "require": { + "php": ">=8.0.2" + }, + "suggest": { + "symfony/translation-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v3.0.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-09-07T12:43:40+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v6.0.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "18d9a1737466b7d88df044b8653a13adaa7648f1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/18d9a1737466b7d88df044b8653a13adaa7648f1", + "reference": "18d9a1737466b7d88df044b8653a13adaa7648f1", + "shasum": "" + }, + "require": { + "php": ">=8.0.2", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "phpunit/phpunit": "<5.4.3", + "symfony/console": "<5.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^5.4|^6.0", + "symfony/process": "^5.4|^6.0", + "symfony/uid": "^5.4|^6.0", + "twig/twig": "^2.13|^3.0.4" + }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v6.0.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-29T15:32:57+00:00" + }, + { + "name": "voku/portable-ascii", + "version": "1.5.6", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "80953678b19901e5165c56752d087fc11526017c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/80953678b19901e5165c56752d087fc11526017c", + "reference": "80953678b19901e5165c56752d087fc11526017c", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "http://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/1.5.6" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "time": "2020-11-12T00:07:28+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": { + "filament/forms": 20, + "filament/tables": 20 + }, + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": "^8.0" + }, + "platform-dev": [], + "plugin-api-version": "2.0.0" +} diff --git a/packages/admin/config/filament.php b/packages/admin/config/filament.php new file mode 100644 index 0000000000..fc9d80a8ef --- /dev/null +++ b/packages/admin/config/filament.php @@ -0,0 +1,180 @@ + env('FILAMENT_PATH', 'admin'), + + /* + |-------------------------------------------------------------------------- + | Filament Domain + |-------------------------------------------------------------------------- + | + | You may change the domain where Filament should be active. If the domain + | is empty, all domains will be valid. + | + */ + + 'domain' => env('FILAMENT_DOMAIN'), + + /* + |-------------------------------------------------------------------------- + | Auth + |-------------------------------------------------------------------------- + | + | This is the configuration that Filament will use to handle authentication + | into the admin panel. + | + */ + + 'auth' => [ + 'guard' => env('FILAMENT_AUTH_GUARD', 'web'), + 'pages' => [ + 'login' => \Filament\Http\Livewire\Auth\Login::class, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Pages + |-------------------------------------------------------------------------- + | + | This is the namespace and directory that Filament will automatically + | register pages from. You may also register pages here. + | + */ + + 'pages' => [ + 'namespace' => 'App\\Filament\\Pages', + 'path' => app_path('Filament/Pages'), + 'register' => [ + Pages\Dashboard::class, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Resources + |-------------------------------------------------------------------------- + | + | This is the namespace and directory that Filament will automatically + | register resources from. You may also register resources here. + | + */ + + 'resources' => [ + 'namespace' => 'App\\Filament\\Resources', + 'path' => app_path('Filament/Resources'), + 'register' => [], + ], + + /* + |-------------------------------------------------------------------------- + | Widgets + |-------------------------------------------------------------------------- + | + | This is the namespace and directory that Filament will automatically + | register dashboard widgets from. You may also register widgets here. + | + */ + + 'widgets' => [ + 'namespace' => 'App\\Filament\\Widgets', + 'path' => app_path('Filament/Widgets'), + 'register' => [ + Widgets\AccountWidget::class, + Widgets\FilamentInfoWidget::class, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Layout + |-------------------------------------------------------------------------- + | + | This is the configuration for the general appearance of the admin panel. + | + | You may configure the max content width from `xl` to `7xl`, or `full` + | for no max width. + | + */ + + 'layout' => [ + 'max_content_width' => null, + ], + + /* + |-------------------------------------------------------------------------- + | Default Avatar Provider + |-------------------------------------------------------------------------- + | + | This is the service that will be used to retrieve default avatars if one + | has not been uploaded. + | + */ + + 'default_avatar_provider' => \Filament\AvatarProviders\UiAvatarsProvider::class, + + /* + |-------------------------------------------------------------------------- + | Default Filesystem Disk + |-------------------------------------------------------------------------- + | + | This is the storage disk Filament will use to put media. You may use any + | of the disks defined in the `config/filesystems.php`. + | + */ + + 'default_filesystem_disk' => env('FILAMENT_FILESYSTEM_DRIVER', 'public'), + + /* + |-------------------------------------------------------------------------- + | Middleware + |-------------------------------------------------------------------------- + | + | You may customise the middleware stack that Filament uses to handle + | requests. + | + */ + + 'middleware' => [ + 'auth' => [ + Authenticate::class, + ], + 'base' => [ + EncryptCookies::class, + AddQueuedCookiesToResponse::class, + StartSession::class, + AuthenticateSession::class, + ShareErrorsFromSession::class, + VerifyCsrfToken::class, + SubstituteBindings::class, + DispatchServingFilamentEvent::class, + MirrorConfigToSubpackages::class, + ], + ], + +]; diff --git a/packages/admin/dist/app.css b/packages/admin/dist/app.css new file mode 100644 index 0000000000..1e1dd2569f --- /dev/null +++ b/packages/admin/dist/app.css @@ -0,0 +1,6 @@ +.filepond--image-preview-markup{left:0;position:absolute;top:0}.filepond--image-preview-wrapper{z-index:2}.filepond--image-preview-overlay{display:block;left:0;margin:0;max-height:7rem;min-height:5rem;opacity:0;pointer-events:none;position:absolute;top:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%;z-index:2}.filepond--image-preview-overlay svg{color:inherit;height:auto;max-height:inherit;width:100%}.filepond--image-preview-overlay-idle{color:rgba(40,40,40,.85);mix-blend-mode:multiply}.filepond--image-preview-overlay-success{color:#369763;mix-blend-mode:normal}.filepond--image-preview-overlay-failure{color:#c44e47;mix-blend-mode:normal}@supports (-webkit-marquee-repetition:infinite) and ((-o-object-fit:fill) or (object-fit:fill)){.filepond--image-preview-overlay-idle{mix-blend-mode:normal}}.filepond--image-preview-wrapper{background:rgba(0,0,0,.01);border-radius:.45em;height:100%;left:0;margin:0;overflow:hidden;position:absolute;right:0;top:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.filepond--image-preview{align-items:center;background:#222;display:flex;height:100%;left:0;pointer-events:none;position:absolute;top:0;width:100%;will-change:transform,opacity;z-index:1}.filepond--image-clip{margin:0 auto;overflow:hidden;position:relative}.filepond--image-clip[data-transparency-indicator=grid] canvas,.filepond--image-clip[data-transparency-indicator=grid] img{background-color:#fff;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 100 100' xmlns='http://www.w3.org/2000/svg' fill='%23eee'%3E%3Cpath d='M0 0h50v50H0M50 50h50v50H50'/%3E%3C/svg%3E");background-size:1.25em 1.25em}.filepond--image-bitmap,.filepond--image-vector{left:0;position:absolute;top:0;will-change:transform}.filepond--root[data-style-panel-layout~=integrated] .filepond--image-preview-wrapper{border-radius:0}.filepond--root[data-style-panel-layout~=integrated] .filepond--image-preview{align-items:center;display:flex;height:100%;justify-content:center}.filepond--root[data-style-panel-layout~=circle] .filepond--image-preview-wrapper{border-radius:99999rem}.filepond--root[data-style-panel-layout~=circle] .filepond--image-preview-overlay{bottom:0;top:auto;transform:scaleY(-1)}.filepond--root[data-style-panel-layout~=circle] .filepond--file .filepond--file-action-button[data-align*=bottom]:not([data-align*=center]){margin-bottom:.325em}.filepond--root[data-style-panel-layout~=circle] .filepond--file [data-align*=left]{left:calc(50% - 3em)}.filepond--root[data-style-panel-layout~=circle] .filepond--file [data-align*=right]{right:calc(50% - 3em)}.filepond--root[data-style-panel-layout~=circle] .filepond--progress-indicator[data-align*=bottom][data-align*=left],.filepond--root[data-style-panel-layout~=circle] .filepond--progress-indicator[data-align*=bottom][data-align*=right]{margin-bottom:.5125em}.filepond--root[data-style-panel-layout~=circle] .filepond--progress-indicator[data-align*=bottom][data-align*=center]{margin-bottom:.1875em;margin-left:.1875em;margin-top:0}.filepond--assistant{clip:rect(1px,1px,1px,1px);border:0;-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.filepond--browser.filepond--browser{font-size:0;left:1em;margin:0;opacity:0;padding:0;position:absolute;top:1.75em;width:calc(100% - 2em)}.filepond--data{border:none;contain:strict;height:0;margin:0;padding:0;visibility:hidden;width:0}.filepond--data,.filepond--drip{pointer-events:none;position:absolute}.filepond--drip{background:rgba(0,0,0,.01);border-radius:.5em;bottom:0;left:0;opacity:.1;overflow:hidden;right:0;top:0}.filepond--drip-blob{background:#292625;border-radius:50%;height:8em;margin-left:-4em;margin-top:-4em;transform-origin:center center;width:8em}.filepond--drip-blob,.filepond--drop-label{left:0;position:absolute;top:0;will-change:transform,opacity}.filepond--drop-label{align-items:center;color:#4f4f4f;display:flex;height:0;justify-content:center;margin:0;right:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.filepond--drop-label.filepond--drop-label label{display:block;margin:0;padding:.5em}.filepond--drop-label label{cursor:default;font-size:.875em;font-weight:400;line-height:1.5;text-align:center}.filepond--label-action{-webkit-text-decoration-skip:ink;cursor:pointer;text-decoration:underline;-webkit-text-decoration-color:#a7a4a4;text-decoration-color:#a7a4a4;text-decoration-skip-ink:auto}.filepond--root[data-disabled] .filepond--drop-label label{opacity:.5}.filepond--file-action-button.filepond--file-action-button{border:none;font-family:inherit;font-size:1em;height:1.625em;line-height:inherit;margin:0;outline:none;padding:0;width:1.625em;will-change:transform,opacity}.filepond--file-action-button.filepond--file-action-button span{clip:rect(1px,1px,1px,1px);border:0;-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.filepond--file-action-button.filepond--file-action-button svg{height:100%;width:100%}.filepond--file-action-button.filepond--file-action-button:after{bottom:-.75em;content:"";left:-.75em;position:absolute;right:-.75em;top:-.75em}.filepond--file-action-button{background-color:rgba(0,0,0,.5);background-image:none;border-radius:50%;box-shadow:0 0 0 0 hsla(0,0%,100%,0);color:#fff;cursor:auto;transition:box-shadow .25s ease-in}.filepond--file-action-button:focus,.filepond--file-action-button:hover{box-shadow:0 0 0 .125em hsla(0,0%,100%,.9)}.filepond--file-action-button[disabled]{background-color:rgba(0,0,0,.25);color:hsla(0,0%,100%,.5)}.filepond--file-action-button[hidden]{display:none}.filepond--action-edit-item.filepond--action-edit-item{height:2em;padding:.1875em;width:2em}.filepond--action-edit-item.filepond--action-edit-item[data-align*=center]{margin-left:-.1875em}.filepond--action-edit-item.filepond--action-edit-item[data-align*=bottom]{margin-bottom:-.1875em}.filepond--action-edit-item-alt{background:transparent;border:none;color:inherit;font-family:inherit;line-height:inherit;margin:0 0 0 .25em;outline:none;padding:0;pointer-events:all;position:absolute}.filepond--action-edit-item-alt svg{height:1.3125em;width:1.3125em}.filepond--action-edit-item-alt span{font-size:0;opacity:0}.filepond--file-info{align-items:flex-start;display:flex;flex:1;flex-direction:column;margin:0 .5em 0 0;min-width:0;pointer-events:none;position:static;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;will-change:transform,opacity}.filepond--file-info *{margin:0}.filepond--file-info .filepond--file-info-main{font-size:.75em;line-height:1.2;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.filepond--file-info .filepond--file-info-sub{font-size:.625em;opacity:.5;transition:opacity .25s ease-in-out;white-space:nowrap}.filepond--file-info .filepond--file-info-sub:empty{display:none}.filepond--file-status{align-items:flex-end;display:flex;flex-direction:column;flex-grow:0;flex-shrink:0;margin:0;min-width:2.25em;pointer-events:none;position:static;text-align:right;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;will-change:transform,opacity}.filepond--file-status *{margin:0;white-space:nowrap}.filepond--file-status .filepond--file-status-main{font-size:.75em;line-height:1.2}.filepond--file-status .filepond--file-status-sub{font-size:.625em;opacity:.5;transition:opacity .25s ease-in-out}.filepond--file-wrapper.filepond--file-wrapper{border:none;height:100%;margin:0;min-width:0;padding:0}.filepond--file-wrapper.filepond--file-wrapper>legend{clip:rect(1px,1px,1px,1px);border:0;-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.filepond--file{align-items:flex-start;border-radius:.5em;color:#fff;display:flex;height:100%;padding:.5625em;position:static}.filepond--file .filepond--file-status{margin-left:auto;margin-right:2.25em}.filepond--file .filepond--processing-complete-indicator{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;z-index:3}.filepond--file .filepond--file-action-button,.filepond--file .filepond--processing-complete-indicator,.filepond--file .filepond--progress-indicator{position:absolute}.filepond--file [data-align*=left]{left:.5625em}.filepond--file [data-align*=right]{right:.5625em}.filepond--file [data-align*=center]{left:calc(50% - .8125em)}.filepond--file [data-align*=bottom]{bottom:1.125em}.filepond--file [data-align=center]{top:calc(50% - .8125em)}.filepond--file .filepond--progress-indicator{margin-top:.1875em}.filepond--file .filepond--progress-indicator[data-align*=right]{margin-right:.1875em}.filepond--file .filepond--progress-indicator[data-align*=left]{margin-left:.1875em}[data-filepond-item-state*=error] .filepond--file-info,[data-filepond-item-state*=invalid] .filepond--file-info,[data-filepond-item-state=cancelled] .filepond--file-info{margin-right:2.25em}[data-filepond-item-state~=processing] .filepond--file-status-sub{opacity:0}[data-filepond-item-state~=processing] .filepond--action-abort-item-processing~.filepond--file-status .filepond--file-status-sub{opacity:.5}[data-filepond-item-state=processing-error] .filepond--file-status-sub{opacity:0}[data-filepond-item-state=processing-error] .filepond--action-retry-item-processing~.filepond--file-status .filepond--file-status-sub{opacity:.5}[data-filepond-item-state=processing-complete] .filepond--action-revert-item-processing svg{-webkit-animation:fall .5s linear .125s both;animation:fall .5s linear .125s both}[data-filepond-item-state=processing-complete] .filepond--file-status-sub{opacity:.5}[data-filepond-item-state=processing-complete] .filepond--file-info-sub,[data-filepond-item-state=processing-complete] .filepond--processing-complete-indicator:not([style*=hidden])~.filepond--file-status .filepond--file-status-sub{opacity:0}[data-filepond-item-state=processing-complete] .filepond--action-revert-item-processing~.filepond--file-info .filepond--file-info-sub{opacity:.5}[data-filepond-item-state*=error] .filepond--file-wrapper,[data-filepond-item-state*=error] .filepond--panel,[data-filepond-item-state*=invalid] .filepond--file-wrapper,[data-filepond-item-state*=invalid] .filepond--panel{-webkit-animation:shake .65s linear both;animation:shake .65s linear both}[data-filepond-item-state*=busy] .filepond--progress-indicator svg{-webkit-animation:spin 1s linear infinite;animation:spin 1s linear infinite}@-webkit-keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}@-webkit-keyframes shake{10%,90%{transform:translateX(-.0625em)}20%,80%{transform:translateX(.125em)}30%,50%,70%{transform:translateX(-.25em)}40%,60%{transform:translateX(.25em)}}@keyframes shake{10%,90%{transform:translateX(-.0625em)}20%,80%{transform:translateX(.125em)}30%,50%,70%{transform:translateX(-.25em)}40%,60%{transform:translateX(.25em)}}@-webkit-keyframes fall{0%{-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out;opacity:0;transform:scale(.5)}70%{-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;opacity:1;transform:scale(1.1)}to{-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out;transform:scale(1)}}@keyframes fall{0%{-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out;opacity:0;transform:scale(.5)}70%{-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;opacity:1;transform:scale(1.1)}to{-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out;transform:scale(1)}}.filepond--hopper[data-hopper-state=drag-over]>*{pointer-events:none}.filepond--hopper[data-hopper-state=drag-over]:after{bottom:0;content:"";left:0;position:absolute;right:0;top:0;z-index:100}.filepond--progress-indicator{z-index:103}.filepond--file-action-button{z-index:102}.filepond--file-status{z-index:101}.filepond--file-info{z-index:100}.filepond--item{left:0;margin:.25em;padding:0;position:absolute;right:0;top:0;will-change:transform,opacity;z-index:1}.filepond--item>.filepond--panel{z-index:-1}.filepond--item>.filepond--panel .filepond--panel-bottom{box-shadow:0 .0625em .125em -.0625em rgba(0,0,0,.25)}.filepond--item>.filepond--file-wrapper,.filepond--item>.filepond--panel{transition:opacity .15s ease-out}.filepond--item[data-drag-state]{cursor:-webkit-grab;cursor:grab}.filepond--item[data-drag-state]>.filepond--panel{box-shadow:0 0 0 transparent;transition:box-shadow .125s ease-in-out}.filepond--item[data-drag-state=drag]{cursor:-webkit-grabbing;cursor:grabbing}.filepond--item[data-drag-state=drag]>.filepond--panel{box-shadow:0 .125em .3125em rgba(0,0,0,.325)}.filepond--item[data-drag-state]:not([data-drag-state=idle]){z-index:2}.filepond--item-panel{background-color:#64605e}[data-filepond-item-state=processing-complete] .filepond--item-panel{background-color:#369763}[data-filepond-item-state*=error] .filepond--item-panel,[data-filepond-item-state*=invalid] .filepond--item-panel{background-color:#c44e47}.filepond--item-panel{border-radius:.5em;transition:background-color .25s}.filepond--list-scroller{left:0;margin:0;position:absolute;right:0;top:0;will-change:transform}.filepond--list-scroller[data-state=overflow] .filepond--list{bottom:0;right:0}.filepond--list-scroller[data-state=overflow]{-webkit-overflow-scrolling:touch;-webkit-mask:linear-gradient(180deg,#000 calc(100% - .5em),transparent);mask:linear-gradient(180deg,#000 calc(100% - .5em),transparent);overflow-x:hidden;overflow-y:scroll}.filepond--list-scroller::-webkit-scrollbar{background:transparent}.filepond--list-scroller::-webkit-scrollbar:vertical{width:1em}.filepond--list-scroller::-webkit-scrollbar:horizontal{height:0}.filepond--list-scroller::-webkit-scrollbar-thumb{background-clip:content-box;background-color:rgba(0,0,0,.3);border:.3125em solid transparent;border-radius:99999px}.filepond--list.filepond--list{list-style-type:none;margin:0;padding:0;position:absolute;top:0;will-change:transform}.filepond--list{left:.75em;right:.75em}.filepond--root[data-style-panel-layout~=integrated]{height:100%;margin:0;max-width:none;width:100%}.filepond--root[data-style-panel-layout~=circle] .filepond--panel-root,.filepond--root[data-style-panel-layout~=integrated] .filepond--panel-root{border-radius:0}.filepond--root[data-style-panel-layout~=circle] .filepond--panel-root>*,.filepond--root[data-style-panel-layout~=integrated] .filepond--panel-root>*{display:none}.filepond--root[data-style-panel-layout~=circle] .filepond--drop-label,.filepond--root[data-style-panel-layout~=integrated] .filepond--drop-label{align-items:center;bottom:0;display:flex;height:auto;justify-content:center;z-index:7}.filepond--root[data-style-panel-layout~=circle] .filepond--item-panel,.filepond--root[data-style-panel-layout~=integrated] .filepond--item-panel{display:none}.filepond--root[data-style-panel-layout~=compact] .filepond--list-scroller,.filepond--root[data-style-panel-layout~=integrated] .filepond--list-scroller{height:100%;margin-bottom:0;margin-top:0;overflow:hidden}.filepond--root[data-style-panel-layout~=compact] .filepond--list,.filepond--root[data-style-panel-layout~=integrated] .filepond--list{height:100%;left:0;right:0}.filepond--root[data-style-panel-layout~=compact] .filepond--item,.filepond--root[data-style-panel-layout~=integrated] .filepond--item{margin:0}.filepond--root[data-style-panel-layout~=compact] .filepond--file-wrapper,.filepond--root[data-style-panel-layout~=integrated] .filepond--file-wrapper{height:100%}.filepond--root[data-style-panel-layout~=compact] .filepond--drop-label,.filepond--root[data-style-panel-layout~=integrated] .filepond--drop-label{z-index:7}.filepond--root[data-style-panel-layout~=circle]{border-radius:99999rem;overflow:hidden}.filepond--root[data-style-panel-layout~=circle]>.filepond--panel{border-radius:inherit}.filepond--root[data-style-panel-layout~=circle] .filepond--file-info,.filepond--root[data-style-panel-layout~=circle] .filepond--file-status,.filepond--root[data-style-panel-layout~=circle]>.filepond--panel>*{display:none}.filepond--root[data-style-panel-layout~=circle] .filepond--action-edit-item{opacity:1!important;visibility:visible!important}@media not all and (-webkit-min-device-pixel-ratio:0),not all and (min-resolution:0.001dpcm){@supports (-webkit-appearance:none) and (stroke-color:transparent){.filepond--root[data-style-panel-layout~=circle]{will-change:transform}}}.filepond--panel-root{background-color:#f1f0ef;border-radius:.5em}.filepond--panel{height:100%!important;left:0;margin:0;pointer-events:none;position:absolute;right:0;top:0}.filepond-panel:not([data-scalable=false]){height:auto!important}.filepond--panel[data-scalable=false]>div{display:none}.filepond--panel[data-scalable=true]{background-color:transparent!important;border:none!important;transform-style:preserve-3d}.filepond--panel-bottom,.filepond--panel-center,.filepond--panel-top{left:0;margin:0;padding:0;position:absolute;right:0;top:0}.filepond--panel-bottom,.filepond--panel-top{height:.5em}.filepond--panel-top{border-bottom:none!important;border-bottom-left-radius:0!important;border-bottom-right-radius:0!important}.filepond--panel-top:after{background-color:inherit;bottom:-1px;content:"";height:2px;left:0;position:absolute;right:0}.filepond--panel-bottom,.filepond--panel-center{-webkit-backface-visibility:hidden;backface-visibility:hidden;transform:translate3d(0,.5em,0);transform-origin:left top;will-change:transform}.filepond--panel-bottom{border-top:none!important;border-top-left-radius:0!important;border-top-right-radius:0!important}.filepond--panel-bottom:before{background-color:inherit;content:"";height:2px;left:0;position:absolute;right:0;top:-1px}.filepond--panel-center{border-bottom:none!important;border-radius:0!important;border-top:none!important;height:100px!important}.filepond--panel-center:not([style]){visibility:hidden}.filepond--progress-indicator{color:#fff;height:1.25em;margin:0;pointer-events:none;position:static;width:1.25em;will-change:transform,opacity}.filepond--progress-indicator svg{height:100%;transform-box:fill-box;vertical-align:top;width:100%}.filepond--progress-indicator path{fill:none;stroke:currentColor}.filepond--list-scroller{z-index:6}.filepond--drop-label{z-index:5}.filepond--drip{z-index:3}.filepond--root>.filepond--panel{z-index:2}.filepond--browser{z-index:1}.filepond--root{text-rendering:optimizeLegibility;box-sizing:border-box;contain:layout style size;direction:ltr;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol;font-size:1rem;font-weight:450;line-height:normal;margin-bottom:1em;position:relative;text-align:left}.filepond--root *{box-sizing:inherit;line-height:inherit}.filepond--root :not(text){font-size:inherit}.filepond--root[data-disabled]{pointer-events:none}.filepond--root[data-disabled] .filepond--list-scroller{pointer-events:all}.filepond--root[data-disabled] .filepond--list{pointer-events:none}.filepond--root .filepond--drop-label{min-height:4.75em}.filepond--root .filepond--list-scroller{margin-bottom:1em;margin-top:1em}.filepond--root .filepond--credits{bottom:-14px;color:inherit;font-size:11px;line-height:.85;opacity:.175;position:absolute;right:0;text-decoration:none;z-index:3}.filepond--root .filepond--credits[style]{bottom:auto;margin-top:14px;top:0}trix-editor{border:1px solid #bbb;border-radius:3px;margin:0;min-height:5em;outline:none;padding:.4em .6em}trix-toolbar *{box-sizing:border-box}trix-toolbar .trix-button-row{display:flex;flex-wrap:nowrap;justify-content:space-between;overflow-x:auto}trix-toolbar .trix-button-group{border-color:#ccc #bbb #888;border-radius:3px;border-style:solid;border-width:1px;display:flex;margin-bottom:10px}trix-toolbar .trix-button-group:not(:first-child){margin-left:1.5vw}@media (max-device-width:768px){trix-toolbar .trix-button-group:not(:first-child){margin-left:0}}trix-toolbar .trix-button-group-spacer{flex-grow:1}@media (max-device-width:768px){trix-toolbar .trix-button-group-spacer{display:none}}trix-toolbar .trix-button{background:transparent;border:none;border-bottom:1px solid #ddd;border-radius:0;color:rgba(0,0,0,.6);float:left;font-size:.75em;font-weight:600;margin:0;outline:none;padding:0 .5em;position:relative;white-space:nowrap}trix-toolbar .trix-button:not(:first-child){border-left:1px solid #ccc}trix-toolbar .trix-button.trix-active{background:#cbeefa;color:#000}trix-toolbar .trix-button:not(:disabled){cursor:pointer}trix-toolbar .trix-button:disabled{color:rgba(0,0,0,.125)}@media (max-device-width:768px){trix-toolbar .trix-button{letter-spacing:-.01em;padding:0 .3em}}trix-toolbar .trix-button--icon{font-size:inherit;height:1.6em;max-width:calc(.8em + 4vw);text-indent:-9999px;width:2.6em}@media (max-device-width:768px){trix-toolbar .trix-button--icon{height:2em;max-width:calc(.8em + 3.5vw)}}trix-toolbar .trix-button--icon:before{background-position:50%;background-repeat:no-repeat;background-size:contain;bottom:0;content:"";display:inline-block;left:0;opacity:.6;position:absolute;right:0;top:0}@media (max-device-width:768px){trix-toolbar .trix-button--icon:before{left:6%;right:6%}}trix-toolbar .trix-button--icon.trix-active:before{opacity:1}trix-toolbar .trix-button--icon:disabled:before{opacity:.125}trix-toolbar .trix-button--icon-attach:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath d='M16.5 6v11.5a4 4 0 1 1-8 0V5a2.5 2.5 0 0 1 5 0v10.5a1 1 0 1 1-2 0V6H10v9.5a2.5 2.5 0 0 0 5 0V5a4 4 0 1 0-8 0v12.5a5.5 5.5 0 0 0 11 0V6h-1.5z'/%3E%3C/svg%3E");bottom:4%;top:8%}trix-toolbar .trix-button--icon-bold:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath d='M15.6 11.8c1-.7 1.6-1.8 1.6-2.8a4 4 0 0 0-4-4H7v14h7c2.1 0 3.7-1.7 3.7-3.8 0-1.5-.8-2.8-2.1-3.4zM10 7.5h3a1.5 1.5 0 1 1 0 3h-3v-3zm3.5 9H10v-3h3.5a1.5 1.5 0 1 1 0 3z'/%3E%3C/svg%3E")}trix-toolbar .trix-button--icon-italic:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath d='M10 5v3h2.2l-3.4 8H6v3h8v-3h-2.2l3.4-8H18V5h-8z'/%3E%3C/svg%3E")}trix-toolbar .trix-button--icon-link:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath d='M9.88 13.7a4.3 4.3 0 0 1 0-6.07l3.37-3.37a4.26 4.26 0 0 1 6.07 0 4.3 4.3 0 0 1 0 6.06l-1.96 1.72a.91.91 0 1 1-1.3-1.3l1.97-1.71a2.46 2.46 0 0 0-3.48-3.48l-3.38 3.37a2.46 2.46 0 0 0 0 3.48.91.91 0 1 1-1.3 1.3z'/%3E%3Cpath d='M4.25 19.46a4.3 4.3 0 0 1 0-6.07l1.93-1.9a.91.91 0 1 1 1.3 1.3l-1.93 1.9a2.46 2.46 0 0 0 3.48 3.48l3.37-3.38c.96-.96.96-2.52 0-3.48a.91.91 0 1 1 1.3-1.3 4.3 4.3 0 0 1 0 6.07l-3.38 3.38a4.26 4.26 0 0 1-6.07 0z'/%3E%3C/svg%3E")}trix-toolbar .trix-button--icon-strike:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath d='m12.73 14 .28.14c.26.15.45.3.57.44.12.14.18.3.18.5 0 .3-.15.56-.44.75-.3.2-.76.3-1.39.3A13.52 13.52 0 0 1 7 14.95v3.37a10.64 10.64 0 0 0 4.84.88c1.26 0 2.35-.19 3.28-.56.93-.37 1.64-.9 2.14-1.57s.74-1.45.74-2.32c0-.26-.02-.51-.06-.75h-5.21zm-5.5-4c-.08-.34-.12-.7-.12-1.1 0-1.29.52-2.3 1.58-3.02 1.05-.72 2.5-1.08 4.34-1.08 1.62 0 3.28.34 4.97 1l-1.3 2.93c-1.47-.6-2.73-.9-3.8-.9-.55 0-.96.08-1.2.26-.26.17-.38.38-.38.64 0 .27.16.52.48.74.17.12.53.3 1.05.53H7.23zM3 13h18v-2H3v2z'/%3E%3C/svg%3E")}trix-toolbar .trix-button--icon-quote:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg version='1' xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath d='M6 17h3l2-4V7H5v6h3zm8 0h3l2-4V7h-6v6h3z'/%3E%3C/svg%3E")}trix-toolbar .trix-button--icon-heading-1:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg version='1' xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath d='M12 9v3H9v7H6v-7H3V9h9zM8 4h14v3h-6v12h-3V7H8V4z'/%3E%3C/svg%3E")}trix-toolbar .trix-button--icon-code:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath d='M18.2 12 15 15.2l1.4 1.4L21 12l-4.6-4.6L15 8.8l3.2 3.2zM5.8 12 9 8.8 7.6 7.4 3 12l4.6 4.6L9 15.2 5.8 12z'/%3E%3C/svg%3E")}trix-toolbar .trix-button--icon-bullet-list:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg version='1' xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath d='M4 4a2 2 0 1 0 0 4 2 2 0 0 0 0-4zm0 6a2 2 0 1 0 0 4 2 2 0 0 0 0-4zm0 6a2 2 0 1 0 0 4 2 2 0 0 0 0-4zm4 3h14v-2H8v2zm0-6h14v-2H8v2zm0-8v2h14V5H8z'/%3E%3C/svg%3E")}trix-toolbar .trix-button--icon-number-list:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath d='M2 17h2v.5H3v1h1v.5H2v1h3v-4H2v1zm1-9h1V4H2v1h1v3zm-1 3h1.8L2 13.1v.9h3v-1H3.2L5 10.9V10H2v1zm5-6v2h14V5H7zm0 14h14v-2H7v2zm0-6h14v-2H7v2z'/%3E%3C/svg%3E")}trix-toolbar .trix-button--icon-undo:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath d='M12.5 8c-2.6 0-5 1-6.9 2.6L2 7v9h9l-3.6-3.6A8 8 0 0 1 20 16l2.4-.8a10.5 10.5 0 0 0-10-7.2z'/%3E%3C/svg%3E")}trix-toolbar .trix-button--icon-redo:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath d='M18.4 10.6a10.5 10.5 0 0 0-16.9 4.6L4 16a8 8 0 0 1 12.7-3.6L13 16h9V7l-3.6 3.6z'/%3E%3C/svg%3E")}trix-toolbar .trix-button--icon-decrease-nesting-level:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath d='M3 19h19v-2H3v2zm7-6h12v-2H10v2zm-8.3-.3 2.8 2.9L6 14.2 4 12l2-2-1.4-1.5L1 12l.7.7zM3 5v2h19V5H3z'/%3E%3C/svg%3E")}trix-toolbar .trix-button--icon-increase-nesting-level:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath d='M3 19h19v-2H3v2zm7-6h12v-2H10v2zm-6.9-1L1 14.2l1.4 1.4L6 12l-.7-.7-2.8-2.8L1 9.9 3.1 12zM3 5v2h19V5H3z'/%3E%3C/svg%3E")}trix-toolbar .trix-dialogs{position:relative}trix-toolbar .trix-dialog{background:#fff;border-radius:5px;border-top:2px solid #888;box-shadow:0 .3em 1em #ccc;font-size:.75em;left:0;padding:15px 10px;position:absolute;right:0;top:0;z-index:5}trix-toolbar .trix-input--dialog{-webkit-appearance:none;-moz-appearance:none;background-color:#fff;border:1px solid #bbb;border-radius:3px;box-shadow:none;font-size:inherit;font-weight:400;margin:0 10px 0 0;outline:none;padding:.5em .8em}trix-toolbar .trix-input--dialog.validate:invalid{box-shadow:0 0 1.5px 1px red}trix-toolbar .trix-button--dialog{border-bottom:none;font-size:inherit;padding:.5em}trix-toolbar .trix-dialog--link{max-width:600px}trix-toolbar .trix-dialog__link-fields{align-items:baseline;display:flex}trix-toolbar .trix-dialog__link-fields .trix-input{flex:1}trix-toolbar .trix-dialog__link-fields .trix-button-group{flex:0 0 content;margin:0}trix-editor [data-trix-mutable]:not(.attachment__caption-editor){-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}trix-editor [data-trix-cursor-target]::-moz-selection,trix-editor [data-trix-mutable]::-moz-selection,trix-editor [data-trix-mutable] ::-moz-selection{background:none}trix-editor [data-trix-cursor-target]::selection,trix-editor [data-trix-mutable]::selection,trix-editor [data-trix-mutable] ::selection{background:none}trix-editor [data-trix-mutable].attachment__caption-editor:focus::-moz-selection{background:highlight}trix-editor [data-trix-mutable].attachment__caption-editor:focus::selection{background:highlight}trix-editor [data-trix-mutable].attachment.attachment--file{border-color:transparent;box-shadow:0 0 0 2px highlight}trix-editor [data-trix-mutable].attachment img{box-shadow:0 0 0 2px highlight}trix-editor .attachment{position:relative}trix-editor .attachment:hover{cursor:default}trix-editor .attachment--preview .attachment__caption:hover{cursor:text}trix-editor .attachment__progress{height:20px;left:5%;opacity:.9;position:absolute;top:calc(50% - 10px);transition:opacity .2s ease-in;width:90%;z-index:1}trix-editor .attachment__progress[value="100"]{opacity:0}trix-editor .attachment__caption-editor{-webkit-appearance:none;-moz-appearance:none;border:none;color:inherit;display:inline-block;font-family:inherit;font-size:inherit;line-height:inherit;margin:0;outline:none;padding:0;text-align:center;vertical-align:top;width:100%}trix-editor .attachment__toolbar{left:0;position:absolute;text-align:center;top:-.9em;width:100%;z-index:1}trix-editor .trix-button-group{display:inline-flex}trix-editor .trix-button{background:transparent;border:none;border-radius:0;color:#666;float:left;font-size:80%;margin:0;outline:none;padding:0 .8em;position:relative;white-space:nowrap}trix-editor .trix-button:not(:first-child){border-left:1px solid #ccc}trix-editor .trix-button.trix-active{background:#cbeefa}trix-editor .trix-button:not(:disabled){cursor:pointer}trix-editor .trix-button--remove{background-color:#fff;border:2px solid highlight;border-radius:50%;box-shadow:1px 1px 6px rgba(0,0,0,.25);display:inline-block;height:1.8em;line-height:1.8em;outline:none;padding:0;text-indent:-9999px;width:1.8em}trix-editor .trix-button--remove:before{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg height='24' width='24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M19 6.4 17.6 5 12 10.6 6.4 5 5 6.4l5.6 5.6L5 17.6 6.4 19l5.6-5.6 5.6 5.6 1.4-1.4-5.6-5.6z'/%3E%3Cpath d='M0 0h24v24H0z' fill='none'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:90%;bottom:0;content:"";display:inline-block;left:0;opacity:.7;position:absolute;right:0;top:0}trix-editor .trix-button--remove:hover{border-color:#333}trix-editor .trix-button--remove:hover:before{opacity:1}trix-editor .attachment__metadata-container{position:relative}trix-editor .attachment__metadata{background-color:rgba(0,0,0,.7);border-radius:3px;color:#fff;font-size:.8em;left:50%;max-width:90%;padding:.1em .6em;position:absolute;top:2em;transform:translate(-50%)}trix-editor .attachment__metadata .attachment__name{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;vertical-align:bottom;white-space:nowrap}trix-editor .attachment__metadata .attachment__size{margin-left:.2em;white-space:nowrap}.trix-content{line-height:1.5}.trix-content *{box-sizing:border-box;margin:0;padding:0}.trix-content h1{font-size:1.2em;line-height:1.2}.trix-content blockquote{border:solid #ccc;border-width:0 0 0 .3em;margin-left:.3em;padding-left:.6em}.trix-content [dir=rtl] blockquote,.trix-content blockquote[dir=rtl]{border-width:0 .3em 0 0;margin-right:.3em;padding-right:.6em}.trix-content li{margin-left:1em}.trix-content [dir=rtl] li{margin-right:1em}.trix-content pre{background-color:#eee;display:inline-block;font-family:monospace;font-size:.9em;overflow-x:auto;padding:.5em;vertical-align:top;white-space:pre;width:100%}.trix-content img{height:auto;max-width:100%}.trix-content .attachment{display:inline-block;max-width:100%;position:relative}.trix-content .attachment a{color:inherit;text-decoration:none}.trix-content .attachment a:hover,.trix-content .attachment a:visited:hover{color:inherit}.trix-content .attachment__caption{text-align:center}.trix-content .attachment__caption .attachment__name+.attachment__size:before{content:" \b7 "}.trix-content .attachment--preview{text-align:center;width:100%}.trix-content .attachment--preview .attachment__caption{color:#666;font-size:.9em;line-height:1.2}.trix-content .attachment--file{border:1px solid #bbb;border-radius:5px;color:#333;line-height:1;margin:0 2px 2px;padding:.4em 1em}.trix-content .attachment-gallery{display:flex;flex-wrap:wrap;position:relative}.trix-content .attachment-gallery .attachment{flex:1 0 33%;max-width:33%;padding:0 .5em}.trix-content .attachment-gallery.attachment-gallery--2 .attachment,.trix-content .attachment-gallery.attachment-gallery--4 .attachment{flex-basis:50%;max-width:50%}.filepond--root{margin-bottom:0} +/*! tailwindcss v2.2.19 | MIT License | https://tailwindcss.com*/ + +/*! modern-normalize v1.1.0 | MIT License | https://github.com/sindresorhus/modern-normalize */html{-webkit-text-size-adjust:100%;line-height:1.15;-moz-tab-size:4;-o-tab-size:4;tab-size:4}body{font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji;margin:0}hr{color:inherit;height:0}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{border-color:inherit;text-indent:0}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}::-moz-focus-inner{border-style:none;padding:0}:-moz-focusring{outline:1px dotted ButtonText}:-moz-ui-invalid{box-shadow:none}legend{padding:0}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}button{background-color:transparent;background-image:none}fieldset,ol,ul{margin:0;padding:0}ol,ul{list-style:none}html{font-family:DM Sans,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}body{font-family:inherit;line-height:inherit}*,:after,:before{border:0 solid;box-sizing:border-box}hr{border-top-width:1px}img{border-style:solid}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#a8a29e;opacity:1}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#a8a29e;opacity:1}input::placeholder,textarea::placeholder{color:#a8a29e;opacity:1}[role=button],button{cursor:pointer}:-moz-focusring{outline:auto}table{border-collapse:collapse}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}button,input,optgroup,select,textarea{color:inherit;line-height:inherit;padding:0}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{height:auto;max-width:100%}[hidden]{display:none}*,:after,:before{--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-transform:translateX(var(--tw-translate-x)) translateY(var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-border-opacity:1;--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-blur:var(--tw-empty,/*!*/ /*!*/);--tw-brightness:var(--tw-empty,/*!*/ /*!*/);--tw-contrast:var(--tw-empty,/*!*/ /*!*/);--tw-grayscale:var(--tw-empty,/*!*/ /*!*/);--tw-hue-rotate:var(--tw-empty,/*!*/ /*!*/);--tw-invert:var(--tw-empty,/*!*/ /*!*/);--tw-saturate:var(--tw-empty,/*!*/ /*!*/);--tw-sepia:var(--tw-empty,/*!*/ /*!*/);--tw-drop-shadow:var(--tw-empty,/*!*/ /*!*/);--tw-filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);--tw-backdrop-blur:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-brightness:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-contrast:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-grayscale:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-hue-rotate:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-invert:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-opacity:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-saturate:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-sepia:var(--tw-empty,/*!*/ /*!*/);--tw-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);border-color:rgba(231,229,228,var(--tw-border-opacity))}[multiple],[type=date],[type=datetime-local],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],select,textarea{--tw-shadow:0 0 #0000;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#78716c;border-radius:0;border-width:1px;font-size:1rem;line-height:1.5rem;padding:.5rem .75rem}[multiple]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,select:focus,textarea:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);border-color:#2563eb;box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid transparent;outline-offset:2px}input::-moz-placeholder,textarea::-moz-placeholder{color:#78716c;opacity:1}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#78716c;opacity:1}input::placeholder,textarea::placeholder{color:#78716c;opacity:1}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-date-and-time-value{min-height:1.5em}select{-webkit-print-color-adjust:exact;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%2378716c' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3E%3C/svg%3E");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;color-adjust:exact;padding-right:2.5rem}[multiple]{-webkit-print-color-adjust:unset;background-image:none;background-position:0 0;background-repeat:unset;background-size:initial;color-adjust:unset;padding-right:.75rem}[type=checkbox],[type=radio]{-webkit-print-color-adjust:exact;--tw-shadow:0 0 #0000;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;background-origin:border-box;border-color:#78716c;border-width:1px;color:#2563eb;color-adjust:exact;display:inline-block;flex-shrink:0;height:1rem;padding:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;width:1rem}[type=checkbox]{border-radius:0}[type=radio]{border-radius:100%}[type=checkbox]:focus,[type=radio]:focus{--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:2px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid transparent;outline-offset:2px}[type=checkbox]:checked,[type=radio]:checked{background-color:currentColor;background-position:50%;background-repeat:no-repeat;background-size:100% 100%;border-color:transparent}[type=checkbox]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12.207 4.793a1 1 0 0 1 0 1.414l-5 5a1 1 0 0 1-1.414 0l-2-2a1 1 0 0 1 1.414-1.414L6.5 9.086l4.293-4.293a1 1 0 0 1 1.414 0z'/%3E%3C/svg%3E")}[type=radio]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E")}[type=checkbox]:checked:focus,[type=checkbox]:checked:hover,[type=radio]:checked:focus,[type=radio]:checked:hover{background-color:currentColor;border-color:transparent}[type=checkbox]:indeterminate{background-color:currentColor;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3E%3Cpath stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3E%3C/svg%3E");background-position:50%;background-repeat:no-repeat;background-size:100% 100%;border-color:transparent}[type=checkbox]:indeterminate:focus,[type=checkbox]:indeterminate:hover{background-color:currentColor;border-color:transparent}[type=file]{background:unset;border-color:inherit;border-radius:0;border-width:0;font-size:unset;line-height:inherit;padding:0}[type=file]:focus{outline:1px auto -webkit-focus-ring-color}.prose{color:#44403c;max-width:65ch}.prose [class~=lead]{color:#57534e;font-size:1.25em;line-height:1.6;margin-bottom:1.2em;margin-top:1.2em}.prose a{color:#1c1917;font-weight:500;text-decoration:underline}.prose strong{color:#1c1917;font-weight:600}.prose ol[type=A]{--list-counter-style:upper-alpha}.prose ol[type=a]{--list-counter-style:lower-alpha}.prose ol[type=A s]{--list-counter-style:upper-alpha}.prose ol[type=a s]{--list-counter-style:lower-alpha}.prose ol[type=I]{--list-counter-style:upper-roman}.prose ol[type=i]{--list-counter-style:lower-roman}.prose ol[type=I s]{--list-counter-style:upper-roman}.prose ol[type=i s]{--list-counter-style:lower-roman}.prose ol[type="1"]{--list-counter-style:decimal}.prose ol>li{padding-left:1.75em;position:relative}.prose ol>li:before{color:#78716c;content:counter(list-item,var(--list-counter-style,decimal)) ".";font-weight:400;left:0;position:absolute}.prose ul>li{padding-left:1.75em;position:relative}.prose ul>li:before{background-color:#d6d3d1;border-radius:50%;content:"";height:.375em;left:.25em;position:absolute;top:.6875em;width:.375em}.prose hr{border-color:#e7e5e4;border-top-width:1px;margin-bottom:3em;margin-top:3em}.prose blockquote{border-left-color:#e7e5e4;border-left-width:.25rem;color:#1c1917;font-style:italic;font-weight:500;margin-bottom:1.6em;margin-top:1.6em;padding-left:1em;quotes:"\201C""\201D""\2018""\2019"}.prose blockquote p:first-of-type:before{content:open-quote}.prose blockquote p:last-of-type:after{content:close-quote}.prose h1{color:#1c1917;font-size:2.25em;font-weight:800;line-height:1.1111111;margin-bottom:.8888889em;margin-top:0}.prose h2{color:#1c1917;font-size:1.5em;font-weight:700;line-height:1.3333333;margin-bottom:1em;margin-top:2em}.prose h3{color:#1c1917;font-size:1.25em;font-weight:600;line-height:1.6;margin-bottom:.6em;margin-top:1.6em}.prose h4{color:#1c1917;font-weight:600;line-height:1.5;margin-bottom:.5em;margin-top:1.5em}.prose figure figcaption{color:#78716c;font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose code{color:#1c1917;font-size:.875em;font-weight:600}.prose code:after,.prose code:before{content:"`"}.prose a code{color:#1c1917}.prose pre{background-color:#292524;border-radius:.375rem;color:#e7e5e4;font-size:.875em;line-height:1.7142857;margin-bottom:1.7142857em;margin-top:1.7142857em;overflow-x:auto;padding:.8571429em 1.1428571em}.prose pre code{background-color:transparent;border-radius:0;border-width:0;color:inherit;font-family:inherit;font-size:inherit;font-weight:400;line-height:inherit;padding:0}.prose pre code:after,.prose pre code:before{content:none}.prose table{font-size:.875em;line-height:1.7142857;margin-bottom:2em;margin-top:2em;table-layout:auto;text-align:left;width:100%}.prose thead{border-bottom-color:#d6d3d1;border-bottom-width:1px;color:#1c1917;font-weight:600}.prose thead th{padding-bottom:.5714286em;padding-left:.5714286em;padding-right:.5714286em;vertical-align:bottom}.prose tbody tr{border-bottom-color:#e7e5e4;border-bottom-width:1px}.prose tbody tr:last-child{border-bottom-width:0}.prose tbody td{padding:.5714286em;vertical-align:top}.prose{font-size:1rem;line-height:1.75}.prose p{margin-bottom:1.25em;margin-top:1.25em}.prose figure,.prose img,.prose video{margin-bottom:2em;margin-top:2em}.prose figure>*{margin-bottom:0;margin-top:0}.prose h2 code{font-size:.875em}.prose h3 code{font-size:.9em}.prose ol,.prose ul{margin-bottom:1.25em;margin-top:1.25em}.prose li{margin-bottom:.5em;margin-top:.5em}.prose>ul>li p{margin-bottom:.75em;margin-top:.75em}.prose>ul>li>:first-child{margin-top:1.25em}.prose>ul>li>:last-child{margin-bottom:1.25em}.prose>ol>li>:first-child{margin-top:1.25em}.prose>ol>li>:last-child{margin-bottom:1.25em}.prose ol ol,.prose ol ul,.prose ul ol,.prose ul ul{margin-bottom:.75em;margin-top:.75em}.prose h2+*,.prose h3+*,.prose h4+*,.prose hr+*{margin-top:0}.prose thead th:first-child{padding-left:0}.prose thead th:last-child{padding-right:0}.prose tbody td:first-child{padding-left:0}.prose tbody td:last-child{padding-right:0}.prose>:first-child{margin-top:0}.prose>:last-child{margin-bottom:0}.sr-only{clip:rect(0,0,0,0);border-width:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:-webkit-sticky;position:sticky}.inset-0{bottom:0;top:0}.inset-0,.inset-x-0{left:0;right:0}.inset-y-0{bottom:0;top:0}.top-0{top:0}.right-0{right:0}.bottom-0{bottom:0}.left-0{left:0}.top-auto{top:auto}.top-full{top:100%}.z-10{z-index:10}.z-20{z-index:20}.z-40{z-index:40}.col-span-full{grid-column:1/-1}.col-span-1{grid-column:span 1/span 1}.col-span-2{grid-column:span 2/span 2}.col-span-3{grid-column:span 3/span 3}.col-span-4{grid-column:span 4/span 4}.col-span-5{grid-column:span 5/span 5}.col-span-6{grid-column:span 6/span 6}.col-span-7{grid-column:span 7/span 7}.col-span-8{grid-column:span 8/span 8}.col-span-9{grid-column:span 9/span 9}.col-span-10{grid-column:span 10/span 10}.col-span-11{grid-column:span 11/span 11}.col-span-12{grid-column:span 12/span 12}.mx-auto{margin-left:auto;margin-right:auto}.-mx-3{margin-left:-.75rem;margin-right:-.75rem}.my-1{margin-bottom:.25rem;margin-top:.25rem}.-my-2{margin-bottom:-.5rem;margin-top:-.5rem}.-my-3{margin-bottom:-.75rem;margin-top:-.75rem}.mr-1{margin-right:.25rem}.-ml-2{margin-left:-.5rem}.mr-2{margin-right:.5rem}.-ml-3{margin-left:-.75rem}.-ml-1\.5{margin-left:-.375rem}.-ml-1{margin-left:-.25rem}.ml-1{margin-left:.25rem}.-mr-2{margin-right:-.5rem}.ml-2{margin-left:.5rem}.-mr-3{margin-right:-.75rem}.-mr-1\.5{margin-right:-.375rem}.-mr-1{margin-right:-.25rem}.mt-2{margin-top:.5rem}.mt-auto{margin-top:auto}.-mr-6{margin-right:-1.5rem}.mt-9{margin-top:2.25rem}.ml-3{margin-left:.75rem}.ml-11{margin-left:2.75rem}.ml-auto{margin-left:auto}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-9{height:2.25rem}.h-8{height:2rem}.h-11{height:2.75rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-5{height:1.25rem}.h-auto{height:auto}.h-12{height:3rem}.h-10{height:2.5rem}.h-16{height:4rem}.h-full{height:100%}.h-\[4rem\]{height:4rem}.h-4{height:1rem}.h-screen{height:100vh}.h-3{height:.75rem}.h-14{height:3.5rem}.max-h-96{max-height:24rem}.max-h-60{max-height:15rem}.min-h-screen{min-height:100vh}.min-h-full{min-height:100%}.w-screen{width:100vw}.w-full{width:100%}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-5{width:1.25rem}.w-24{width:6rem}.w-10{width:2.5rem}.w-16{width:4rem}.w-4{width:1rem}.w-11{width:2.75rem}.w-80{width:20rem}.w-8{width:2rem}.w-52{width:13rem}.w-64{width:16rem}.w-20{width:5rem}.w-32{width:8rem}.w-3{width:.75rem}.w-9{width:2.25rem}.min-w-full{min-width:100%}.min-w-\[2rem\]{min-width:2rem}.max-w-md{max-width:28rem}.max-w-xs{max-width:20rem}.max-w-xl{max-width:36rem}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-7xl{max-width:80rem}.max-w-full{max-width:100%}.max-w-6xl{max-width:72rem}.max-w-sm{max-width:24rem}.max-w-lg{max-width:32rem}.max-w-none{max-width:none}.flex-1{flex:1 1 0%}.flex-shrink-0{flex-shrink:0}.flex-grow{flex-grow:1}.table-auto{table-layout:auto}.translate-y-8{--tw-translate-y:2rem;transform:var(--tw-transform)}.translate-y-0{--tw-translate-y:0px;transform:var(--tw-transform)}.translate-x-0{--tw-translate-x:0px;transform:var(--tw-transform)}.-translate-x-full{--tw-translate-x:-100%;transform:var(--tw-transform)}.translate-x-5{--tw-translate-x:1.25rem;transform:var(--tw-transform)}.-translate-y-1{--tw-translate-y:-0.25rem;transform:var(--tw-transform)}.-translate-y-2{--tw-translate-y:-0.5rem;transform:var(--tw-transform)}.translate-y-2{--tw-translate-y:0.5rem;transform:var(--tw-transform)}.-rotate-180{--tw-rotate:-180deg}.-rotate-180,.-skew-x-12{transform:var(--tw-transform)}.-skew-x-12{--tw-skew-x:-12deg}.transform{transform:var(--tw-transform)}.cursor-pointer{cursor:pointer}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.select-none{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.resize-none{resize:none}.resize{resize:both}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-\[repeat\(auto-fit\2c minmax\(0\2c 1fr\)\)\]{grid-template-columns:repeat(auto-fit,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-stretch{align-items:stretch}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-4{gap:1rem}.gap-2{gap:.5rem}.gap-6{gap:1.5rem}.gap-3{gap:.75rem}.gap-1{gap:.25rem}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(2rem*var(--tw-space-y-reverse));margin-top:calc(2rem*(1 - var(--tw-space-y-reverse)))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1.5rem*var(--tw-space-y-reverse));margin-top:calc(1.5rem*(1 - var(--tw-space-y-reverse)))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.5rem*var(--tw-space-y-reverse));margin-top:calc(.5rem*(1 - var(--tw-space-y-reverse)))}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.5rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.5rem*var(--tw-space-x-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.25rem*var(--tw-space-y-reverse));margin-top:calc(.25rem*(1 - var(--tw-space-y-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1rem*var(--tw-space-x-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(1rem*var(--tw-space-y-reverse));margin-top:calc(1rem*(1 - var(--tw-space-y-reverse)))}.space-x-1>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.25rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.25rem*var(--tw-space-x-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(.75rem*var(--tw-space-y-reverse));margin-top:calc(.75rem*(1 - var(--tw-space-y-reverse)))}.space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(.75rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(.75rem*var(--tw-space-x-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse:0;border-bottom-width:calc(1px*var(--tw-divide-y-reverse));border-top-width:calc(1px*(1 - var(--tw-divide-y-reverse)))}.divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse:0;border-left-width:calc(1px*(1 - var(--tw-divide-x-reverse)));border-right-width:calc(1px*var(--tw-divide-x-reverse))}.divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(231,229,228,var(--tw-divide-opacity))}.divide-gray-300>:not([hidden])~:not([hidden]){--tw-divide-opacity:1;border-color:rgba(214,211,209,var(--tw-divide-opacity))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-hidden{overflow-y:hidden}.overflow-y-scroll{overflow-y:scroll}.truncate{overflow:hidden;text-overflow:ellipsis}.truncate,.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.rounded-2xl{border-radius:1rem}.rounded-lg{border-radius:.5rem}.rounded-xl{border-radius:.75rem}.rounded-full{border-radius:9999px}.rounded{border-radius:.25rem}.rounded-md{border-radius:.375rem}.rounded-r-2xl{border-bottom-right-radius:1rem;border-top-right-radius:1rem}.rounded-l-lg{border-bottom-left-radius:.5rem;border-top-left-radius:.5rem}.rounded-r-lg{border-top-right-radius:.5rem}.rounded-b-lg,.rounded-r-lg{border-bottom-right-radius:.5rem}.rounded-b-lg{border-bottom-left-radius:.5rem}.rounded-t-xl{border-top-left-radius:.75rem;border-top-right-radius:.75rem}.border{border-width:1px}.border-0{border-width:0}.border-2{border-width:2px}.border-t{border-top-width:1px}.border-b{border-bottom-width:1px}.border-r{border-right-width:1px}.border-l{border-left-width:1px}.border-gray-300{--tw-border-opacity:1;border-color:rgba(214,211,209,var(--tw-border-opacity))}.border-transparent{border-color:transparent}.border-danger-300{--tw-border-opacity:1;border-color:rgba(253,164,175,var(--tw-border-opacity))}.border-danger-600{--tw-border-opacity:1;border-color:rgba(225,29,72,var(--tw-border-opacity))}.border-gray-200{--tw-border-opacity:1;border-color:rgba(231,229,228,var(--tw-border-opacity))}.bg-gray-100{--tw-bg-opacity:1;background-color:rgba(245,245,244,var(--tw-bg-opacity))}.bg-white{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.bg-primary-600{--tw-bg-opacity:1;background-color:rgba(202,138,4,var(--tw-bg-opacity))}.bg-danger-600{--tw-bg-opacity:1;background-color:rgba(225,29,72,var(--tw-bg-opacity))}.bg-success-600{--tw-bg-opacity:1;background-color:rgba(22,163,74,var(--tw-bg-opacity))}.bg-warning-600{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.bg-danger-50{--tw-bg-opacity:1;background-color:rgba(255,241,242,var(--tw-bg-opacity))}.bg-success-50{--tw-bg-opacity:1;background-color:rgba(240,253,244,var(--tw-bg-opacity))}.bg-warning-50{--tw-bg-opacity:1;background-color:rgba(255,251,235,var(--tw-bg-opacity))}.bg-gray-200{--tw-bg-opacity:1;background-color:rgba(231,229,228,var(--tw-bg-opacity))}.bg-gray-400\/10{background-color:hsla(24,5%,64%,.1)}.bg-gray-50\/80{background-color:hsla(60,9%,98%,.8)}.bg-gray-50{--tw-bg-opacity:1;background-color:rgba(250,250,249,var(--tw-bg-opacity))}.bg-gray-900\/50{background-color:rgba(28,25,23,.5)}.bg-black\/50{background-color:rgba(0,0,0,.5)}.bg-gray-500\/5{background-color:hsla(25,5%,45%,.05)}.bg-primary-500{--tw-bg-opacity:1;background-color:rgba(234,179,8,var(--tw-bg-opacity))}.bg-primary-50{--tw-bg-opacity:1;background-color:rgba(254,252,232,var(--tw-bg-opacity))}.bg-primary-200{--tw-bg-opacity:1;background-color:rgba(254,240,138,var(--tw-bg-opacity))}.bg-transparent{background-color:transparent}.bg-primary-500\/10{background-color:rgba(234,179,8,.1)}.bg-danger-500\/10{background-color:rgba(244,63,94,.1)}.bg-success-500\/10{background-color:rgba(34,197,94,.1)}.bg-warning-500\/10{background-color:rgba(245,158,11,.1)}.bg-gray-500\/10{background-color:hsla(25,5%,45%,.1)}.bg-cover{background-size:cover}.bg-center{background-position:50%}.fill-current{fill:currentColor}.p-2{padding:.5rem}.p-8{padding:2rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.p-1{padding:.25rem}.p-0{padding:0}.px-4{padding-left:1rem;padding-right:1rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-2{padding-bottom:.5rem;padding-top:.5rem}.py-1{padding-bottom:.25rem;padding-top:.25rem}.py-4{padding-bottom:1rem;padding-top:1rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.py-3{padding-bottom:.75rem;padding-top:.75rem}.py-6{padding-bottom:1.5rem;padding-top:1.5rem}.px-1{padding-left:.25rem;padding-right:.25rem}.py-8{padding-bottom:2rem;padding-top:2rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.pl-10{padding-left:2.5rem}.pl-3{padding-left:.75rem}.pr-10{padding-right:2.5rem}.pr-2{padding-right:.5rem}.pr-1{padding-right:.25rem}.pr-9{padding-right:2.25rem}.pr-4{padding-right:1rem}.pt-2{padding-top:.5rem}.pl-9{padding-left:2.25rem}.pl-12{padding-left:3rem}.pl-2{padding-left:.5rem}.pr-8{padding-right:2rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-base{font-size:1rem;line-height:1.5rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.font-normal{font-weight:400}.uppercase{text-transform:uppercase}.italic{font-style:italic}.leading-6{line-height:1.5rem}.leading-none{line-height:1}.leading-loose{line-height:2}.leading-tight{line-height:1.25}.leading-4{line-height:1rem}.tracking-tight{letter-spacing:-.025em}.tracking-wider{letter-spacing:.05em}.tracking-normal{letter-spacing:0}.text-gray-900{--tw-text-opacity:1;color:rgba(28,25,23,var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.text-gray-800{--tw-text-opacity:1;color:rgba(41,37,36,var(--tw-text-opacity))}.text-gray-300{--tw-text-opacity:1;color:rgba(214,211,209,var(--tw-text-opacity))}.text-danger-600{--tw-text-opacity:1;color:rgba(225,29,72,var(--tw-text-opacity))}.text-success-600{--tw-text-opacity:1;color:rgba(22,163,74,var(--tw-text-opacity))}.text-warning-600{--tw-text-opacity:1;color:rgba(217,119,6,var(--tw-text-opacity))}.text-primary-600{--tw-text-opacity:1;color:rgba(202,138,4,var(--tw-text-opacity))}.text-danger-900{--tw-text-opacity:1;color:rgba(136,19,55,var(--tw-text-opacity))}.text-success-900{--tw-text-opacity:1;color:rgba(20,83,45,var(--tw-text-opacity))}.text-warning-900{--tw-text-opacity:1;color:rgba(120,53,15,var(--tw-text-opacity))}.text-gray-600{--tw-text-opacity:1;color:rgba(87,83,78,var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity:1;color:rgba(120,113,108,var(--tw-text-opacity))}.text-gray-700{--tw-text-opacity:1;color:rgba(68,64,60,var(--tw-text-opacity))}.text-primary-500{--tw-text-opacity:1;color:rgba(234,179,8,var(--tw-text-opacity))}.text-gray-400{--tw-text-opacity:1;color:rgba(168,162,158,var(--tw-text-opacity))}.text-primary-700{--tw-text-opacity:1;color:rgba(161,98,7,var(--tw-text-opacity))}.text-danger-400{--tw-text-opacity:1;color:rgba(251,113,133,var(--tw-text-opacity))}.text-danger-700{--tw-text-opacity:1;color:rgba(190,18,60,var(--tw-text-opacity))}.text-success-700{--tw-text-opacity:1;color:rgba(21,128,61,var(--tw-text-opacity))}.text-warning-700{--tw-text-opacity:1;color:rgba(180,83,9,var(--tw-text-opacity))}.text-danger-500{--tw-text-opacity:1;color:rgba(244,63,94,var(--tw-text-opacity))}.text-success-500{--tw-text-opacity:1;color:rgba(34,197,94,var(--tw-text-opacity))}.text-warning-500{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.placeholder-gray-500::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(120,113,108,var(--tw-placeholder-opacity))}.placeholder-gray-500:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(120,113,108,var(--tw-placeholder-opacity))}.placeholder-gray-500::placeholder{--tw-placeholder-opacity:1;color:rgba(120,113,108,var(--tw-placeholder-opacity))}.placeholder-gray-400::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(168,162,158,var(--tw-placeholder-opacity))}.placeholder-gray-400:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(168,162,158,var(--tw-placeholder-opacity))}.placeholder-gray-400::placeholder{--tw-placeholder-opacity:1;color:rgba(168,162,158,var(--tw-placeholder-opacity))}.placeholder-opacity-100::-moz-placeholder{--tw-placeholder-opacity:1}.placeholder-opacity-100:-ms-input-placeholder{--tw-placeholder-opacity:1}.placeholder-opacity-100::placeholder{--tw-placeholder-opacity:1}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-50{opacity:.5}.opacity-75{opacity:.75}.shadow{--tw-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.shadow,.shadow-sm{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.shadow-xl{--tw-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04)}.shadow-2xl,.shadow-xl{box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px rgba(0,0,0,.25)}.ring-1{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-0,.ring-1{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-0{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.ring-2{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.ring-danger-200{--tw-ring-opacity:1;--tw-ring-color:rgba(254,205,211,var(--tw-ring-opacity))}.ring-success-200{--tw-ring-opacity:1;--tw-ring-color:rgba(187,247,208,var(--tw-ring-opacity))}.ring-warning-200{--tw-ring-opacity:1;--tw-ring-color:rgba(253,230,138,var(--tw-ring-opacity))}.ring-gray-200{--tw-ring-opacity:1;--tw-ring-color:rgba(231,229,228,var(--tw-ring-opacity))}.ring-danger-500{--tw-ring-opacity:1;--tw-ring-color:rgba(244,63,94,var(--tw-ring-opacity))}.ring-danger-600{--tw-ring-opacity:1;--tw-ring-color:rgba(225,29,72,var(--tw-ring-opacity))}.ring-primary-500{--tw-ring-opacity:1;--tw-ring-color:rgba(234,179,8,var(--tw-ring-opacity))}.filter{filter:var(--tw-filter)}.backdrop-blur-xl{--tw-backdrop-blur:blur(24px)}.backdrop-blur-xl,.backdrop-saturate-150{-webkit-backdrop-filter:var(--tw-backdrop-filter);backdrop-filter:var(--tw-backdrop-filter)}.backdrop-saturate-150{--tw-backdrop-saturate:saturate(1.5)}.transition{transition-duration:.15s;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-colors{transition-duration:.15s;transition-property:background-color,border-color,color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1)}.transition-opacity{transition-duration:.15s;transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-75{transition-duration:75ms}.duration-300{transition-duration:.3s}.duration-100{transition-duration:.1s}.duration-200{transition-duration:.2s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.invalid\:text-gray-400:invalid{--tw-text-opacity:1;color:rgba(168,162,158,var(--tw-text-opacity))}.focus-within\:border-primary-600:focus-within{--tw-border-opacity:1;border-color:rgba(202,138,4,var(--tw-border-opacity))}.focus-within\:ring-1:focus-within{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus-within\:ring-inset:focus-within{--tw-ring-inset:inset}.focus-within\:ring-primary-600:focus-within{--tw-ring-opacity:1;--tw-ring-color:rgba(202,138,4,var(--tw-ring-opacity))}.hover\:bg-primary-500:hover{--tw-bg-opacity:1;background-color:rgba(234,179,8,var(--tw-bg-opacity))}.hover\:bg-danger-500:hover{--tw-bg-opacity:1;background-color:rgba(244,63,94,var(--tw-bg-opacity))}.hover\:bg-gray-50:hover{--tw-bg-opacity:1;background-color:rgba(250,250,249,var(--tw-bg-opacity))}.hover\:bg-success-500:hover{--tw-bg-opacity:1;background-color:rgba(34,197,94,var(--tw-bg-opacity))}.hover\:bg-warning-500:hover{--tw-bg-opacity:1;background-color:rgba(245,158,11,var(--tw-bg-opacity))}.hover\:bg-gray-500\/5:hover{background-color:hsla(25,5%,45%,.05)}.hover\:bg-primary-600:hover{--tw-bg-opacity:1;background-color:rgba(202,138,4,var(--tw-bg-opacity))}.hover\:bg-gray-100:hover{--tw-bg-opacity:1;background-color:rgba(245,245,244,var(--tw-bg-opacity))}.hover\:bg-danger-600:hover{--tw-bg-opacity:1;background-color:rgba(225,29,72,var(--tw-bg-opacity))}.hover\:bg-success-600:hover{--tw-bg-opacity:1;background-color:rgba(22,163,74,var(--tw-bg-opacity))}.hover\:bg-warning-600:hover{--tw-bg-opacity:1;background-color:rgba(217,119,6,var(--tw-bg-opacity))}.hover\:text-primary-500:hover{--tw-text-opacity:1;color:rgba(234,179,8,var(--tw-text-opacity))}.hover\:text-gray-800:hover{--tw-text-opacity:1;color:rgba(41,37,36,var(--tw-text-opacity))}.hover\:text-gray-700:hover{--tw-text-opacity:1;color:rgba(68,64,60,var(--tw-text-opacity))}.hover\:text-white:hover{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.hover\:text-danger-700:hover{--tw-text-opacity:1;color:rgba(190,18,60,var(--tw-text-opacity))}.hover\:text-danger-500:hover{--tw-text-opacity:1;color:rgba(244,63,94,var(--tw-text-opacity))}.hover\:text-gray-500:hover{--tw-text-opacity:1;color:rgba(120,113,108,var(--tw-text-opacity))}.hover\:text-success-500:hover{--tw-text-opacity:1;color:rgba(34,197,94,var(--tw-text-opacity))}.hover\:text-warning-500:hover{--tw-text-opacity:1;color:rgba(245,158,11,var(--tw-text-opacity))}.hover\:underline:hover{text-decoration:underline}.focus\:border-primary-600:focus{--tw-border-opacity:1;border-color:rgba(202,138,4,var(--tw-border-opacity))}.focus\:border-primary-500:focus{--tw-border-opacity:1;border-color:rgba(234,179,8,var(--tw-border-opacity))}.focus\:border-blue-300:focus{--tw-border-opacity:1;border-color:rgba(147,197,253,var(--tw-border-opacity))}.focus\:border-primary-300:focus{--tw-border-opacity:1;border-color:rgba(253,224,71,var(--tw-border-opacity))}.focus\:bg-primary-700:focus{--tw-bg-opacity:1;background-color:rgba(161,98,7,var(--tw-bg-opacity))}.focus\:bg-danger-700:focus{--tw-bg-opacity:1;background-color:rgba(190,18,60,var(--tw-bg-opacity))}.focus\:bg-primary-50:focus{--tw-bg-opacity:1;background-color:rgba(254,252,232,var(--tw-bg-opacity))}.focus\:bg-success-700:focus{--tw-bg-opacity:1;background-color:rgba(21,128,61,var(--tw-bg-opacity))}.focus\:bg-warning-700:focus{--tw-bg-opacity:1;background-color:rgba(180,83,9,var(--tw-bg-opacity))}.focus\:bg-white:focus{--tw-bg-opacity:1;background-color:rgba(255,255,255,var(--tw-bg-opacity))}.focus\:bg-gray-500\/5:focus{background-color:hsla(25,5%,45%,.05)}.focus\:bg-primary-500\/10:focus{background-color:rgba(234,179,8,.1)}.focus\:bg-danger-500\/10:focus{background-color:rgba(244,63,94,.1)}.focus\:bg-gray-500\/10:focus{background-color:hsla(25,5%,45%,.1)}.focus\:bg-success-500\/10:focus{background-color:rgba(34,197,94,.1)}.focus\:bg-warning-500\/10:focus{background-color:rgba(245,158,11,.1)}.focus\:text-primary-600:focus{--tw-text-opacity:1;color:rgba(202,138,4,var(--tw-text-opacity))}.focus\:text-gray-700:focus{--tw-text-opacity:1;color:rgba(68,64,60,var(--tw-text-opacity))}.focus\:text-danger-600:focus{--tw-text-opacity:1;color:rgba(225,29,72,var(--tw-text-opacity))}.focus\:text-white:focus{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.focus\:underline:focus{text-decoration:underline}.focus\:placeholder-gray-400:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(168,162,158,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-400:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(168,162,158,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-400:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(168,162,158,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-500:focus::-moz-placeholder{--tw-placeholder-opacity:1;color:rgba(120,113,108,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-500:focus:-ms-input-placeholder{--tw-placeholder-opacity:1;color:rgba(120,113,108,var(--tw-placeholder-opacity))}.focus\:placeholder-gray-500:focus::placeholder{--tw-placeholder-opacity:1;color:rgba(120,113,108,var(--tw-placeholder-opacity))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-1:focus,.focus\:ring-2:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring-1:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-0:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-0:focus,.focus\:ring:focus{box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\:ring:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color)}.focus\:ring-inset:focus{--tw-ring-inset:inset}.focus\:ring-white:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(255,255,255,var(--tw-ring-opacity))}.focus\:ring-primary-600:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(202,138,4,var(--tw-ring-opacity))}.focus\:ring-gray-300:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(214,211,209,var(--tw-ring-opacity))}.focus\:ring-primary-500:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(234,179,8,var(--tw-ring-opacity))}.focus\:ring-blue-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(191,219,254,var(--tw-ring-opacity))}.focus\:ring-primary-200:focus{--tw-ring-opacity:1;--tw-ring-color:rgba(254,240,138,var(--tw-ring-opacity))}.focus\:ring-opacity-50:focus{--tw-ring-opacity:0.5}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px}.focus\:ring-offset-primary-700:focus{--tw-ring-offset-color:#a16207}.focus\:ring-offset-danger-700:focus{--tw-ring-offset-color:#be123c}.focus\:ring-offset-success-700:focus{--tw-ring-offset-color:#15803d}.focus\:ring-offset-warning-700:focus{--tw-ring-offset-color:#b45309}.group:focus-within .group-focus-within\:text-primary-500{--tw-text-opacity:1;color:rgba(234,179,8,var(--tw-text-opacity))}.group:hover .group-hover\:text-white{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.group:hover .group-hover\:text-primary-100{--tw-text-opacity:1;color:rgba(254,249,195,var(--tw-text-opacity))}.group:hover .group-hover\:text-danger-100{--tw-text-opacity:1;color:rgba(255,228,230,var(--tw-text-opacity))}.group:hover .group-hover\:text-success-100{--tw-text-opacity:1;color:rgba(220,252,231,var(--tw-text-opacity))}.group:hover .group-hover\:text-warning-100{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}.group:focus .group-focus\:text-white{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}.group:focus .group-focus\:text-primary-100{--tw-text-opacity:1;color:rgba(254,249,195,var(--tw-text-opacity))}.group:focus .group-focus\:text-danger-100{--tw-text-opacity:1;color:rgba(255,228,230,var(--tw-text-opacity))}.group:focus .group-focus\:text-success-100{--tw-text-opacity:1;color:rgba(220,252,231,var(--tw-text-opacity))}.group:focus .group-focus\:text-warning-100{--tw-text-opacity:1;color:rgba(254,243,199,var(--tw-text-opacity))}[dir=rtl] .rtl\:space-x-reverse>:not([hidden])~:not([hidden]){--tw-space-x-reverse:1}@media (min-width:640px){.sm\:col-span-1{grid-column:span 1/span 1}.sm\:col-span-2{grid-column:span 2/span 2}.sm\:col-span-3{grid-column:span 3/span 3}.sm\:col-span-4{grid-column:span 4/span 4}.sm\:col-span-5{grid-column:span 5/span 5}.sm\:col-span-6{grid-column:span 6/span 6}.sm\:col-span-7{grid-column:span 7/span 7}.sm\:col-span-8{grid-column:span 8/span 8}.sm\:col-span-9{grid-column:span 9/span 9}.sm\:col-span-10{grid-column:span 10/span 10}.sm\:col-span-11{grid-column:span 11/span 11}.sm\:col-span-12{grid-column:span 12/span 12}.sm\:col-span-full{grid-column:1/-1}.sm\:flex{display:flex}.sm\:table-cell{display:table-cell}.sm\:hidden{display:none}.sm\:max-w-xs{max-width:20rem}.sm\:max-w-lg{max-width:32rem}.sm\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.sm\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.sm\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.sm\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.sm\:grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.sm\:grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.sm\:grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.sm\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.sm\:space-y-0>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-bottom:calc(0px*var(--tw-space-y-reverse));margin-top:calc(0px*(1 - var(--tw-space-y-reverse)))}.sm\:space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-left:calc(1rem*(1 - var(--tw-space-x-reverse)));margin-right:calc(1rem*var(--tw-space-x-reverse))}.sm\:py-4{padding-bottom:1rem;padding-top:1rem}.sm\:px-4{padding-left:1rem;padding-right:1rem}.sm\:text-xl{font-size:1.25rem;line-height:1.75rem}}@media (min-width:768px){.md\:col-span-1{grid-column:span 1/span 1}.md\:col-span-2{grid-column:span 2/span 2}.md\:col-span-3{grid-column:span 3/span 3}.md\:col-span-4{grid-column:span 4/span 4}.md\:col-span-5{grid-column:span 5/span 5}.md\:col-span-6{grid-column:span 6/span 6}.md\:col-span-7{grid-column:span 7/span 7}.md\:col-span-8{grid-column:span 8/span 8}.md\:col-span-9{grid-column:span 9/span 9}.md\:col-span-10{grid-column:span 10/span 10}.md\:col-span-11{grid-column:span 11/span 11}.md\:col-span-12{grid-column:span 12/span 12}.md\:col-span-full{grid-column:1/-1}.md\:mb-auto{margin-bottom:auto}.md\:-mr-2{margin-right:-.5rem}.md\:table-cell{display:table-cell}.md\:hidden{display:none}.md\:w-auto{width:auto}.md\:max-w-md{max-width:28rem}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.md\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.md\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.md\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.md\:grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.md\:grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.md\:grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.md\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:items-start{align-items:flex-start}.md\:justify-between{justify-content:space-between}.md\:px-6{padding-left:1.5rem;padding-right:1.5rem}.md\:text-3xl{font-size:1.875rem;line-height:2.25rem}}@media (min-width:1024px){.lg\:z-0{z-index:0}.lg\:col-span-1{grid-column:span 1/span 1}.lg\:col-span-2{grid-column:span 2/span 2}.lg\:col-span-3{grid-column:span 3/span 3}.lg\:col-span-4{grid-column:span 4/span 4}.lg\:col-span-5{grid-column:span 5/span 5}.lg\:col-span-6{grid-column:span 6/span 6}.lg\:col-span-7{grid-column:span 7/span 7}.lg\:col-span-8{grid-column:span 8/span 8}.lg\:col-span-9{grid-column:span 9/span 9}.lg\:col-span-10{grid-column:span 10/span 10}.lg\:col-span-11{grid-column:span 11/span 11}.lg\:col-span-12{grid-column:span 12/span 12}.lg\:col-span-full{grid-column:1/-1}.lg\:flex{display:flex}.lg\:table-cell{display:table-cell}.lg\:grid{display:grid}.lg\:hidden{display:none}.lg\:translate-x-0{--tw-translate-x:0px;transform:var(--tw-transform)}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.lg\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.lg\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.lg\:grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.lg\:grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.lg\:grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.lg\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lg\:gap-8{gap:2rem}.lg\:border-r{border-right-width:1px}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:pl-80{padding-left:20rem}.lg\:text-lg{font-size:1.125rem;line-height:1.75rem}}@media (min-width:1280px){.xl\:col-span-1{grid-column:span 1/span 1}.xl\:col-span-2{grid-column:span 2/span 2}.xl\:col-span-3{grid-column:span 3/span 3}.xl\:col-span-4{grid-column:span 4/span 4}.xl\:col-span-5{grid-column:span 5/span 5}.xl\:col-span-6{grid-column:span 6/span 6}.xl\:col-span-7{grid-column:span 7/span 7}.xl\:col-span-8{grid-column:span 8/span 8}.xl\:col-span-9{grid-column:span 9/span 9}.xl\:col-span-10{grid-column:span 10/span 10}.xl\:col-span-11{grid-column:span 11/span 11}.xl\:col-span-12{grid-column:span 12/span 12}.xl\:col-span-full{grid-column:1/-1}.xl\:table-cell{display:table-cell}.xl\:hidden{display:none}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.xl\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.xl\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.xl\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.xl\:grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.xl\:grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.xl\:grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.xl\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.xl\:flex-row{flex-direction:row}.xl\:items-center{align-items:center}.xl\:justify-between{justify-content:space-between}}@media (min-width:1536px){.\32xl\:col-span-1{grid-column:span 1/span 1}.\32xl\:col-span-2{grid-column:span 2/span 2}.\32xl\:col-span-3{grid-column:span 3/span 3}.\32xl\:col-span-4{grid-column:span 4/span 4}.\32xl\:col-span-5{grid-column:span 5/span 5}.\32xl\:col-span-6{grid-column:span 6/span 6}.\32xl\:col-span-7{grid-column:span 7/span 7}.\32xl\:col-span-8{grid-column:span 8/span 8}.\32xl\:col-span-9{grid-column:span 9/span 9}.\32xl\:col-span-10{grid-column:span 10/span 10}.\32xl\:col-span-11{grid-column:span 11/span 11}.\32xl\:col-span-12{grid-column:span 12/span 12}.\32xl\:col-span-full{grid-column:1/-1}.\32xl\:table-cell{display:table-cell}.\32xl\:hidden{display:none}.\32xl\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.\32xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.\32xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.\32xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.\32xl\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.\32xl\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.\32xl\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.\32xl\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.\32xl\:grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.\32xl\:grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.\32xl\:grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.\32xl\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}} + +/*# sourceMappingURL=app.css.map*/ \ No newline at end of file diff --git a/packages/admin/dist/app.css.map b/packages/admin/dist/app.css.map new file mode 100644 index 0000000000..3f2e454dda --- /dev/null +++ b/packages/admin/dist/app.css.map @@ -0,0 +1 @@ +{"version":3,"file":"app.css","mappings":"AAGA,gCAEE,MAAO,CADP,iBAAkB,CAElB,KACF,CACA,iCACE,SACF,CACA,iCACE,aAAc,CAEd,MAAO,CAKP,QAAS,CADT,eAAgB,CADhB,eAAgB,CAGhB,SAAU,CAEV,mBAAoB,CATpB,iBAAkB,CAElB,KAAM,CAQN,wBAAyB,CACzB,qBAAsB,CACtB,oBAAqB,CACrB,gBAAiB,CAVjB,UAAW,CAKX,SAMF,CACA,qCAGE,aAAc,CADd,WAAY,CAEZ,kBAAmB,CAHnB,UAIF,CACA,sCAEE,wBAA6B,CAD7B,uBAEF,CACA,yCAEE,aAA2B,CAD3B,qBAEF,CACA,yCAEE,aAA2B,CAD3B,qBAEF,CACA,gGACE,sCACE,qBACF,CACF,CACA,iCAaE,0BAA+B,CAF/B,mBAAqB,CAFrB,WAAY,CAHZ,MAAO,CAIP,QAAS,CAET,eAAgB,CAPhB,iBAAkB,CAGlB,OAAQ,CADR,KAAM,CANN,wBAAyB,CACzB,qBAAsB,CACtB,oBAAqB,CACrB,gBAUF,CACA,yBAME,kBAAmB,CAInB,eAAgB,CALhB,YAAa,CAEb,WAAY,CALZ,MAAO,CAOP,mBAAoB,CARpB,iBAAkB,CAElB,KAAM,CAKN,UAAW,CAGX,6BAA+B,CAP/B,SAQF,CACA,sBAGE,aAAc,CADd,eAAgB,CADhB,iBAGF,CACA,2HAEE,qBAAsB,CACtB,8LAAyM,CACzM,6BACF,CACA,gDAGE,MAAO,CADP,iBAAkB,CAElB,KAAM,CACN,qBACF,CACA,sFACE,eACF,CACA,8EAIE,kBAAmB,CAFnB,YAAa,CADb,WAAY,CAEZ,sBAEF,CACA,kFACE,sBACF,CACA,kFAEE,QAAS,CADT,QAAS,CAGT,oBACF,CACA,6IACE,oBACF,CACA,oFACE,oBACF,CACA,qFACE,qBACF,CACA,2OAEE,qBACF,CACA,uHAEE,qBAAuB,CACvB,mBAAqB,CAFrB,YAGF,CAGA,qBAOE,0BAA8B,CAD9B,QAAS,CAET,4BAA6B,CAC7B,oBAAqB,CANrB,UAAW,CADX,eAAgB,CAGhB,SAAU,CAJV,iBAAkB,CASlB,kBAAmB,CANnB,SAOF,CACA,qCAQE,WAAY,CAJZ,QAAS,CAFT,QAAS,CAKT,SAAU,CAJV,SAAU,CAFV,iBAAkB,CAIlB,UAAW,CACX,sBAGF,CACA,gBAME,WAAY,CAGZ,cAAe,CANf,QAAS,CAET,QAAS,CADT,SAAU,CAGV,iBAAkB,CALlB,OAQF,CACA,gCAHE,mBAAoB,CAPpB,iBAqBF,CAXA,gBAUE,0BAA8B,CAD9B,kBAAmB,CAJnB,QAAS,CAFT,MAAO,CAIP,UAAW,CADX,eAAgB,CAFhB,OAAQ,CAFR,KASF,CACA,qBAOE,kBAAmB,CACnB,iBAAkB,CAJlB,UAAW,CACX,gBAAiB,CACjB,eAAgB,CAJhB,8BAA+B,CAC/B,SAMF,CACA,2CAIE,MAAO,CAFP,iBAAkB,CAClB,KAAM,CAEN,6BACF,CACA,sBAME,kBAAmB,CAHnB,aAAc,CACd,YAAa,CAGb,QAAS,CAFT,sBAAuB,CAHvB,QAAS,CADT,OAAQ,CAOR,wBAAyB,CACzB,qBAAsB,CACtB,oBAAqB,CACrB,gBACF,CACA,iDACE,aAAc,CACd,QAAS,CACT,YACF,CACA,4BACE,cAAe,CACf,gBAAiB,CACjB,eAAgB,CAEhB,eAAgB,CADhB,iBAEF,CACA,wBAEE,gCAAiC,CAIjC,cAAe,CALf,yBAA0B,CAG1B,qCAAsC,CACtC,6BAA8B,CAF9B,6BAIF,CACA,2DACE,UACF,CACA,2DAQE,WAAY,CAJZ,mBAAoB,CAHpB,aAAc,CAEd,cAAe,CAEf,mBAAoB,CACpB,QAAS,CAGT,YAAa,CAFb,SAAU,CALV,aAAc,CAQd,6BACF,CACA,gEAOE,0BAA8B,CAD9B,QAAS,CAET,4BAA6B,CAC7B,oBAAqB,CANrB,UAAW,CADX,eAAgB,CAGhB,SAAU,CAJV,iBAAkB,CASlB,kBAAmB,CANnB,SAOF,CACA,+DAEE,WAAY,CADZ,UAEF,CACA,iEAKE,aAAc,CACd,UAAW,CAJX,WAAY,CADZ,iBAAkB,CAElB,YAAa,CACb,UAGF,CACA,8BAIE,+BAAmC,CACnC,qBAAsB,CAFtB,iBAAkB,CAGlB,oCAAwC,CAJxC,UAAW,CADX,WAAY,CAMZ,kCACF,CACA,wEAEE,0CACF,CACA,wCAEE,gCAAoC,CADpC,wBAEF,CACA,sCACE,YACF,CACA,uDAEE,UAAW,CACX,eAAgB,CAFhB,SAGF,CACA,2EACE,oBACF,CACA,2EACE,sBACF,CACA,gCAGE,sBAAuB,CAFvB,WAAY,CAIZ,aAAc,CADd,mBAAoB,CAFpB,mBAAoB,CAMpB,kBAAmB,CAFnB,YAAa,CACb,SAAU,CAEV,kBAAmB,CACnB,iBACF,CACA,oCAEE,eAAgB,CADhB,cAEF,CACA,qCACE,WAAY,CACZ,SACF,CACA,qBAIE,sBAAuB,CAFvB,YAAa,CAGb,MAAO,CAFP,qBAAsB,CAGtB,iBAAkB,CAClB,WAAY,CAEZ,mBAAoB,CARpB,eAAgB,CAShB,wBAAyB,CACzB,qBAAsB,CACtB,oBAAqB,CACrB,gBAAiB,CALjB,6BAMF,CACA,uBACE,QACF,CACA,+CACE,eAAgB,CAChB,eAAgB,CAEhB,eAAgB,CADhB,sBAAuB,CAEvB,kBAAmB,CACnB,UACF,CACA,8CACE,gBAAiB,CACjB,UAAW,CACX,mCAAoC,CACpC,kBACF,CACA,oDACE,YACF,CACA,uBAIE,oBAAqB,CAFrB,YAAa,CACb,qBAAsB,CAEtB,WAAY,CACZ,aAAc,CACd,QAAS,CACT,gBAAiB,CAGjB,mBAAoB,CAVpB,eAAgB,CAQhB,gBAAiB,CAGjB,wBAAyB,CACzB,qBAAsB,CACtB,oBAAqB,CACrB,gBAAiB,CALjB,6BAMF,CACA,yBACE,QAAS,CACT,kBACF,CACA,mDACE,eAAgB,CAChB,eACF,CACA,kDACE,gBAAiB,CACjB,UAAW,CACX,mCACF,CACA,+CACE,WAAY,CAIZ,WAAY,CAHZ,QAAS,CAET,WAAY,CADZ,SAGF,CACA,sDAOE,0BAA8B,CAD9B,QAAS,CAET,4BAA6B,CAC7B,oBAAqB,CANrB,UAAW,CADX,eAAgB,CAGhB,SAAU,CAJV,iBAAkB,CASlB,kBAAmB,CANnB,SAOF,CACA,gBAIE,sBAAuB,CAGvB,kBAAmB,CADnB,UAAW,CAJX,YAAa,CACb,WAAY,CAEZ,eAAgB,CAJhB,eAOF,CACA,uCACE,gBAAiB,CACjB,mBACF,CACA,yDACE,mBAAoB,CACpB,wBAAyB,CACzB,qBAAsB,CACtB,oBAAqB,CACrB,gBAAiB,CACjB,SACF,CACA,qJAGE,iBACF,CACA,mCACE,YACF,CACA,oCACE,aACF,CACA,qCACE,wBACF,CACA,qCACE,cACF,CACA,oCACE,uBACF,CACA,8CACE,kBACF,CACA,iEACE,oBACF,CACA,gEACE,mBACF,CACA,0KAGE,mBACF,CACA,kEACE,SACF,CACA,iIACE,UACF,CACA,uEACE,SACF,CACA,sIACE,UACF,CACA,4FACE,4CAA6C,CAC7C,oCACF,CACA,0EACE,UACF,CACA,uOAEE,SACF,CACA,sIACE,UACF,CACA,8NAIE,wCAAyC,CACzC,gCACF,CACA,mEACE,yCAA0C,CAC1C,iCACF,CACA,wBACE,GAEE,sBACF,CACA,GAEE,uBACF,CACF,CACA,gBACE,GAEE,sBACF,CACA,GAEE,uBACF,CACF,CACA,yBACE,QAEE,8BACF,CACA,QAEE,4BACF,CACA,YAEE,4BACF,CACA,QAEE,2BACF,CACF,CACA,iBACE,QAEE,8BACF,CACA,QAEE,4BACF,CACA,YAEE,4BACF,CACA,QAEE,2BACF,CACF,CACA,wBACE,GAIE,0CAA2C,CAC3C,kCAAmC,CAJnC,SAAU,CAEV,mBAGF,CACA,IAIE,6CAA8C,CAC9C,qCAAsC,CAJtC,SAAU,CAEV,oBAGF,CACA,GAGE,0CAA2C,CAC3C,kCAAmC,CAFnC,kBAGF,CACF,CACA,gBACE,GAIE,0CAA2C,CAC3C,kCAAmC,CAJnC,SAAU,CAEV,mBAGF,CACA,IAIE,6CAA8C,CAC9C,qCAAsC,CAJtC,SAAU,CAEV,oBAGF,CACA,GAGE,0CAA2C,CAC3C,kCAAmC,CAFnC,kBAGF,CACF,CACA,iDACE,mBACF,CACA,qDAME,QAAS,CALT,UAAW,CAEX,MAAO,CADP,iBAAkB,CAGlB,OAAQ,CADR,KAAM,CAGN,WACF,CACA,8BACE,WACF,CACA,8BACE,WACF,CACA,uBACE,WACF,CACA,qBACE,WACF,CACA,gBAGE,MAAO,CAIP,YAAa,CADb,SAAU,CALV,iBAAkB,CAGlB,OAAQ,CAFR,KAAM,CAMN,6BAA+B,CAH/B,SAIF,CACA,iCACE,UACF,CACA,yDACE,oDACF,CACA,yEAEE,gCACF,CACA,iCACE,mBAAoB,CACpB,WACF,CACA,kDAEE,4BAA6B,CAD7B,uCAEF,CACA,sCACE,uBAAwB,CACxB,eACF,CACA,uDACE,4CACF,CACA,6DACE,SACF,CACA,sBACE,wBACF,CACA,qEACE,wBACF,CACA,kHAEE,wBACF,CACA,sBACE,kBAAmB,CACnB,gCACF,CACA,yBAGE,MAAO,CAEP,QAAS,CAJT,iBAAkB,CAGlB,OAAQ,CAFR,KAAM,CAIN,qBACF,CACA,8DACE,QAAS,CACT,OACF,CACA,8CAGE,gCAAiC,CACjC,uEAA0E,CAC1E,+DAAkE,CAHlE,iBAAkB,CADlB,iBAKF,CACA,4CACE,sBACF,CACA,qDACE,SACF,CACA,uDACE,QACF,CACA,kDAIE,2BAA4B,CAH5B,+BAAmC,CAEnC,gCAAiC,CADjC,qBAGF,CACA,+BAKE,oBAAqB,CAFrB,QAAS,CACT,SAAU,CAHV,iBAAkB,CAClB,KAAM,CAIN,qBACF,CACA,gBACE,UAAW,CACX,WACF,CACA,qDAEE,WAAY,CAEZ,QAAS,CADT,cAAe,CAFf,UAIF,CACA,kJAEE,eACF,CACA,sJAEE,YACF,CACA,kJAME,kBAAmB,CAJnB,QAAS,CAET,YAAa,CADb,WAAY,CAEZ,sBAAuB,CAEvB,SACF,CACA,kJAEE,YACF,CACA,yJAGE,WAAY,CAEZ,eAAgB,CADhB,YAAa,CAFb,eAIF,CACA,uIAIE,WAAY,CAFZ,MAAO,CACP,OAEF,CACA,uIAEE,QACF,CACA,uJAEE,WACF,CACA,mJAEE,SACF,CACA,iDACE,sBAAuB,CACvB,eACF,CACA,kEACE,qBACF,CAIA,kNAEE,YACF,CACA,6EACE,mBAAqB,CACrB,4BACF,CACA,6FACE,mEACE,iDACE,qBACF,CACF,CACF,CACA,sBAEE,wBAAyB,CADzB,kBAEF,CACA,iBAME,qBAAuB,CAJvB,MAAO,CAGP,QAAS,CAET,mBAAoB,CANpB,iBAAkB,CAGlB,OAAQ,CADR,KAKF,CACA,2CACE,qBACF,CACA,0CACE,YACF,CACA,qCAGE,sCAAwC,CACxC,qBAAuB,CAFvB,2BAGF,CACA,qEAIE,MAAO,CAGP,QAAS,CACT,SAAU,CALV,iBAAkB,CAGlB,OAAQ,CADR,KAIF,CACA,6CAEE,WACF,CACA,qBAGE,4BAA8B,CAF9B,qCAAuC,CACvC,sCAEF,CACA,2BAOE,wBAAyB,CADzB,WAAY,CALZ,UAAW,CAEX,UAAW,CACX,MAAO,CAFP,iBAAkB,CAGlB,OAGF,CACA,gDAGE,kCAAmC,CACnC,0BAA2B,CAI3B,+BAAkC,CAFlC,yBAA0B,CAJ1B,qBAOF,CACA,wBAGE,yBAA2B,CAF3B,kCAAoC,CACpC,mCAEF,CACA,+BAOE,wBAAyB,CANzB,UAAW,CAEX,UAAW,CACX,MAAO,CAFP,iBAAkB,CAGlB,OAAQ,CACR,QAEF,CACA,wBAGE,4BAA8B,CAC9B,yBAA2B,CAF3B,yBAA2B,CAD3B,sBAIF,CACA,qCACE,iBACF,CACA,8BAIE,UAAW,CADX,aAAc,CAEd,QAAS,CACT,mBAAoB,CALpB,eAAgB,CAChB,YAAa,CAKb,6BACF,CACA,kCAEE,WAAY,CAEZ,sBAAuB,CADvB,kBAAmB,CAFnB,UAIF,CACA,mCACE,SAAU,CACV,mBACF,CACA,yBACE,SACF,CACA,sBACE,SACF,CACA,gBACE,SACF,CACA,iCACE,SACF,CACA,mBACE,SACF,CACA,gBAmBE,iCAAkC,CAlBlC,qBAAsB,CAoBtB,yBAA0B,CAD1B,aAAc,CAdd,wIAUiB,CAZjB,cAAe,CAaf,eAAgB,CAZhB,kBAAmB,CAFnB,iBAAkB,CADlB,iBAAkB,CAgBlB,eAIF,CACA,kBACE,kBAAmB,CACnB,mBACF,CACA,2BACE,iBACF,CACA,+BACE,mBACF,CACA,wDACE,kBACF,CACA,+CACE,mBACF,CACA,sCACE,iBACF,CACA,yCAEE,iBAAkB,CADlB,cAEF,CACA,mCASE,YAAa,CAHb,aAAc,CADd,cAAe,CADf,eAAgB,CADhB,YAAa,CAFb,iBAAkB,CAClB,OAAQ,CAKR,oBAAqB,CACrB,SAEF,CACA,0CAEE,WAAY,CACZ,eAAgB,CAFhB,KAGF,CAGA,YACE,qBAAsB,CACtB,iBAAkB,CAClB,QAAS,CAET,cAAe,CACf,YAAa,CAFb,iBAGF,CACA,eACE,qBACF,CACA,8BACE,YAAa,CACb,gBAAiB,CACjB,6BAA8B,CAC9B,eACF,CACA,gCAKE,2BAAyB,CACzB,iBAAkB,CADlB,kBAAyB,CAAzB,gBAAyB,CAJzB,YAAa,CACb,kBAKF,CACA,kDACE,iBACF,CACA,gCACE,kDACE,aACF,CACF,CACA,uCACE,WACF,CACA,gCACE,uCACE,YACF,CACF,CACA,0BAaE,sBAAuB,CAFvB,WAA6B,CAA7B,4BAA6B,CAC7B,eAAgB,CAThB,oBAAyB,CADzB,UAAW,CAEX,eAAiB,CACjB,eAAgB,CAGhB,QAAS,CACT,YAAa,CAFb,cAAgB,CANhB,iBAAkB,CAKlB,kBAQF,CACA,4CACE,0BACF,CACA,sCACE,kBAAmB,CACnB,UACF,CACA,yCACE,cACF,CACA,mCACE,sBACF,CACA,gCACE,0BACE,qBAAuB,CACvB,cACF,CACF,CACA,gCACE,iBAAkB,CAElB,YAAa,CACb,0BAA4B,CAC5B,mBAAoB,CAHpB,WAIF,CACA,gCACE,gCACE,UAAW,CACX,4BACF,CACF,CACA,uCASE,uBAA2B,CAC3B,2BAA4B,CAC5B,uBAAwB,CANxB,QAAS,CAGT,UAAW,CAPX,oBAAqB,CAKrB,MAAO,CACP,UAAY,CALZ,iBAAkB,CAElB,OAAQ,CADR,KASF,CACA,gCACE,uCAEE,OAAQ,CADR,QAEF,CACF,CACA,mDACE,SACF,CACA,gDACE,YACF,CACA,8CACE,kSAAqY,CAErY,SAAU,CADV,MAEF,CACA,4CACE,2TACF,CACA,8CACE,qMACF,CACA,4CACE,skBACF,CACA,8CACE,qnBACF,CACA,6CACE,0MACF,CACA,iDACE,kNACF,CACA,4CACE,8PACF,CACA,mDACE,iTACF,CACA,mDACE,gSACF,CACA,4CACE,gPACF,CACA,4CACE,qOACF,CACA,8DACE,uPACF,CACA,8DACE,4PACF,CACA,2BACE,iBACF,CACA,0BAOE,eAAgB,CAGhB,iBAAkB,CADlB,yBAA0B,CAD1B,0BAA4B,CAH5B,eAAiB,CAFjB,MAAO,CAGP,iBAAkB,CALlB,iBAAkB,CAGlB,OAAQ,CAFR,KAAM,CASN,SACF,CACA,iCAUE,uBAAwB,CACxB,oBAAqB,CAJrB,qBAAsB,CADtB,qBAAsB,CADtB,iBAAkB,CAGlB,eAAgB,CAPhB,iBAAkB,CAClB,eAAmB,CAEnB,iBAAkB,CAKlB,YAAa,CANb,iBASF,CACA,kDACE,4BACF,CACA,kCAGE,kBAAmB,CAFnB,iBAAkB,CAClB,YAEF,CACA,gCACE,eACF,CACA,uCAEE,oBAAqB,CADrB,YAEF,CACA,mDACE,MACF,CACA,0DACE,gBAAiB,CACjB,QACF,CACA,iEACE,wBAAyB,CACzB,qBAAsB,CACtB,oBAAqB,CACrB,gBACF,CAMA,uJAGE,eACF,CAJA,wIAGE,eACF,CACA,iFACE,oBACF,CACA,4EACE,oBACF,CACA,4DAEE,wBAAyB,CADzB,8BAEF,CACA,+CACE,8BACF,CACA,wBACE,iBACF,CACA,8BACE,cACF,CACA,4DACE,WACF,CACA,kCAGE,WAAY,CAEZ,OAAQ,CAER,UAAY,CANZ,iBAAkB,CAGlB,oBAAqB,CAIrB,8BAAiC,CAFjC,SAAU,CAJV,SAOF,CACA,+CACE,SACF,CACA,wCAaE,uBAAwB,CACxB,oBAAqB,CAHrB,WAAY,CAHZ,aAAc,CAPd,oBAAqB,CAKrB,mBAAoB,CADpB,iBAAkB,CAElB,mBAAoB,CAJpB,QAAS,CAST,YAAa,CARb,SAAU,CAKV,iBAAkB,CAClB,kBAAmB,CARnB,UAaF,CACA,iCAIE,MAAO,CAHP,iBAAkB,CAKlB,iBAAkB,CAHlB,SAAW,CAEX,UAAW,CAHX,SAKF,CACA,+BACE,mBACF,CACA,yBAWE,sBAAuB,CAFvB,WAAY,CACZ,eAAgB,CAPhB,UAAW,CADX,UAAW,CAGX,aAAc,CAEd,QAAS,CACT,YAAa,CAFb,cAAgB,CALhB,iBAAkB,CAGlB,kBAQF,CACA,2CACE,0BACF,CACA,qCACE,kBACF,CACA,wCACE,cACF,CACA,iCASE,qBAAsB,CACtB,0BAA2B,CAF3B,iBAAkB,CAGlB,sCAA2C,CAT3C,oBAAqB,CAIrB,YAAa,CACb,iBAAkB,CAHlB,YAAa,CADb,SAAU,CAFV,mBAAoB,CAIpB,WAOF,CACA,wCASE,wRAAyW,CACzW,uBAA2B,CAC3B,2BAA4B,CAC5B,mBAAoB,CAPpB,QAAS,CAGT,UAAW,CAPX,oBAAqB,CAKrB,MAAO,CACP,UAAY,CALZ,iBAAkB,CAElB,OAAQ,CADR,KAUF,CACA,uCACE,iBACF,CACA,8CACE,SACF,CACA,4CACE,iBACF,CACA,kCASE,+BAAoC,CACpC,iBAAkB,CAFlB,UAAW,CADX,cAAgB,CALhB,QAAS,CAGT,aAAc,CACd,iBAAoB,CALpB,iBAAkB,CAElB,OAAQ,CACR,yBAOF,CACA,oDACE,oBAAqB,CACrB,cAAe,CAEf,eAAgB,CAChB,sBAAuB,CAFvB,qBAAsB,CAGtB,kBACF,CACA,oDACE,gBAAkB,CAClB,kBACF,CACA,cACE,eACF,CACA,gBACE,qBAAsB,CACtB,QAAS,CACT,SACF,CACA,iBACE,eAAgB,CAChB,eACF,CACA,yBAEE,iBAAwB,CAAxB,uBAAwB,CACxB,gBAAkB,CAClB,iBACF,CACA,qEAGE,uBAAyB,CACzB,iBAAmB,CACnB,kBACF,CACA,iBACE,eACF,CACA,2BACE,gBACF,CACA,kBAQE,qBAAsB,CAPtB,oBAAqB,CAGrB,qBAAsB,CACtB,cAAgB,CAIhB,eAAgB,CAHhB,YAAc,CAHd,kBAAmB,CAInB,eAAgB,CALhB,UAQF,CACA,kBAEE,WAAY,CADZ,cAEF,CACA,0BACE,oBAAqB,CAErB,cAAe,CADf,iBAEF,CACA,4BACE,aAAc,CACd,oBACF,CACA,4EAEE,aACF,CACA,mCACE,iBACF,CACA,8EACE,gBACF,CACA,mCAEE,iBAAkB,CADlB,UAEF,CACA,wDACE,UAAW,CACX,cAAgB,CAChB,eACF,CACA,gCAKE,qBAAsB,CACtB,iBAAkB,CALlB,UAAW,CACX,aAAc,CACd,gBAAqB,CACrB,gBAGF,CACA,kCACE,YAAa,CACb,cAAe,CACf,iBACF,CACA,8CACE,YAAa,CAEb,aAAc,CADd,cAEF,CACA,wIAEE,cAAe,CACf,aACF,CAGA,gBACE,eACF,C;ACt6CA,gEAAc;;AAAd,8FAAc,CAAd,KC+BC,6BAA8B,CAD9B,gBAAiB,CAVjB,eAAgB,CAChB,aAAW,CAAX,UDrBa,CAAd,KCoDC,+GASiB,CAjBjB,QD5Ca,CAAd,GC4EC,aAAc,CADd,QD3Ea,CAAd,YCyFC,wCAAiC,CAAjC,gCDzFa,CAAd,SCkGC,kBDlGa,CAAd,kBC8GC,gFAMU,CACV,aDrHa,CAAd,MC6HC,aD7Ha,CAAd,QCsIC,aAAc,CACd,aAAc,CACd,iBAAkB,CAClB,uBDzIa,CAAd,IC6IC,aD7Ia,CAAd,ICiJC,SDjJa,CAAd,MCgKC,oBAAqB,CADrB,aD/Ja,CAAd,sCCkLC,mBAAoB,CACpB,cAAe,CACf,gBAAiB,CACjB,QDrLa,CAAd,cC+LC,mBD/La,CAAd,gDC0MC,yBD1Ma,CAAd,mBCkNC,iBAAkB,CAClB,SDnNa,CAAd,gBC2NC,6BD3Na,CAAd,iBCoOC,eDpOa,CAAd,OC4OC,SD5Oa,CAAd,SCoPC,uBDpPa,CAAd,wDC6PC,WD7Pa,CAAd,cCsQC,4BAA6B,CAC7B,mBDvQa,CAAd,4BC+QC,uBD/Qa,CAAd,6BCwRC,yBAA0B,CAC1B,YDzRa,CAAd,QCsSC,iBDtSa,CAAd,mDEqBE,QFrBY,CAAd,OEyBE,4BAA6B,CAC7B,qBF1BY,CAAd,eE8BE,QAAS,CACT,SF/BY,CAAd,MEoCE,eFpCY,CAAd,KEqDE,wMAAsP,CACtP,eFtDY,CAAd,KEgEE,mBAAoB,CACpB,mBFjEY,CAAd,iBEoGE,cAA0B,CAH1B,qBFjGY,CAAd,GE4GE,oBF5GY,CAAd,IE0HE,kBF1HY,CAAd,SE8HE,eF9HY,CAAd,mDEoIE,aAAwC,CADxC,SFnIY,CAAd,2DEoIE,aAAwC,CADxC,SFnIY,CAAd,yCEoIE,aAAwC,CADxC,SFnIY,CAAd,qBEyIE,cFzIY,CAAd,gBEqJC,YFrJa,CAAd,MEyJE,wBFzJY,CAAd,kBEkKE,iBAAkB,CAClB,mBFnKY,CAAd,EE4KE,aAAc,CACd,uBF7KY,CAAd,sCE+LE,aAAc,CADd,mBAAoB,CADpB,SF7LY,CAAd,kBE6ME,mGF7MY,CAAd,+CEyOE,aAAc,CACd,qBF1OY,CAAd,UEuPE,WAAY,CADZ,cFtPY,CAAd,SE+PE,YF/PY,CGFd,0wEHEc,CAAd,uRGFA,meHEc,CAAd,mDGFA,uBHEc,CAAd,2DGFA,uBHEc,CAAd,yCGFA,uBHEc,CAAd,uCGFA,SHEc,CAAd,8BGFA,gBHEc,CAAd,OGFA,waHEc,CAAd,WGFA,sKHEc,CAAd,6BGFA,4ZHEc,CAAd,gBGFA,eHEc,CAAd,aGFA,kBHEc,CAAd,yCGFA,8cHEc,CAAd,6CGFA,oIHEc,CAAd,wBGFA,2RHEc,CAAd,qBGFA,kLHEc,CAAd,kHGFA,sDHEc,CAAd,8BGFA,0XHEc,CAAd,wEGFA,sDHEc,CAAd,YGFA,kHHEc,CAAd,kBGFA,yCHEc,CACd,OGHA,4BHGoB,CAApB,qBGHA,mFHGoB,CAApB,SGHA,uDHGoB,CAApB,cGHA,6BHGoB,CAApB,kBGHA,gCHGoB,CAApB,kBGHA,gCHGoB,CAApB,oBGHA,gCHGoB,CAApB,oBGHA,gCHGoB,CAApB,kBGHA,gCHGoB,CAApB,kBGHA,gCHGoB,CAApB,oBGHA,gCHGoB,CAApB,oBGHA,gCHGoB,CAApB,oBGHA,4BHGoB,CAApB,aGHA,qCHGoB,CAApB,oBGHA,uHHGoB,CAApB,aGHA,qCHGoB,CAApB,oBGHA,yHHGoB,CAApB,UGHA,0EHGoB,CAApB,kBGHA,4LHGoB,CAApB,yCGHA,kBHGoB,CAApB,uCGHA,mBHGoB,CAApB,UGHA,0GHGoB,CAApB,UGHA,oGHGoB,CAApB,UGHA,kGHGoB,CAApB,UGHA,iFHGoB,CAApB,yBGHA,0EHGoB,CAApB,YGHA,8CHGoB,CAApB,qCGHA,WHGoB,CAApB,cGHA,aHGoB,CAApB,WGHA,mMHGoB,CAApB,gBGHA,6JHGoB,CAApB,6CGHA,YHGoB,CAApB,aGHA,oHHGoB,CAApB,aGHA,iFHGoB,CAApB,gBGHA,gGHGoB,CAApB,gBGHA,mDHGoB,CAApB,2BGHA,qBHGoB,CAApB,gBGHA,qCHGoB,CAApB,OGHA,+BHGoB,CAApB,SGHA,sCHGoB,CAApB,sCGHA,gCHGoB,CAApB,gBGHA,4BHGoB,CAApB,eGHA,gBHGoB,CAApB,eGHA,cHGoB,CAApB,oBGHA,sCHGoB,CAApB,UGHA,kCHGoB,CAApB,eGHA,oCHGoB,CAApB,0BGHA,iBHGoB,CAApB,yBGHA,oBHGoB,CAApB,0BGHA,iBHGoB,CAApB,yBGHA,oBHGoB,CAApB,oDGHA,oCHGoB,CAApB,gDGHA,YHGoB,CAApB,4BGHA,cHGoB,CAApB,2BGHA,eHGoB,CAApB,4BGHA,cHGoB,CAApB,2BGHA,eHGoB,CAApB,oBGHA,YHGoB,CAApB,mBGHA,eHGoB,CACpB,SGJA,iIHImB,CAAnB,qBGJA,mBHImB,CAAnB,qBGJA,mBHImB,CAAnB,OGJA,cHImB,CAAnB,UGJA,iBHImB,CAAnB,UGJA,iBHImB,CAAnB,QGJA,uCHImB,CAAnB,SGJA,cHImB,CAAnB,oBGJA,cHImB,CAAnB,WGJA,cHImB,CAAnB,OGJA,KHImB,CAAnB,SGJA,OHImB,CAAnB,UGJA,QHImB,CAAnB,QGJA,MHImB,CAAnB,UGJA,QHImB,CAAnB,UGJA,QHImB,CAAnB,MGJA,UHImB,CAAnB,MGJA,UHImB,CAAnB,MGJA,UHImB,CAAnB,eGJA,gBHImB,CAAnB,YGJA,yBHImB,CAAnB,YGJA,yBHImB,CAAnB,YGJA,yBHImB,CAAnB,YGJA,yBHImB,CAAnB,YGJA,yBHImB,CAAnB,YGJA,yBHImB,CAAnB,YGJA,yBHImB,CAAnB,YGJA,yBHImB,CAAnB,YGJA,yBHImB,CAAnB,aGJA,2BHImB,CAAnB,aGJA,2BHImB,CAAnB,aGJA,2BHImB,CAAnB,SGJA,kCHImB,CAAnB,OGJA,wCHImB,CAAnB,MGJA,sCHImB,CAAnB,OGJA,sCHImB,CAAnB,OGJA,wCHImB,CAAnB,MGJA,mBHImB,CAAnB,OGJA,kBHImB,CAAnB,MGJA,kBHImB,CAAnB,OGJA,mBHImB,CAAnB,UGJA,oBHImB,CAAnB,OGJA,mBHImB,CAAnB,MGJA,kBHImB,CAAnB,OGJA,mBHImB,CAAnB,MGJA,iBHImB,CAAnB,OGJA,oBHImB,CAAnB,UGJA,qBHImB,CAAnB,OGJA,oBHImB,CAAnB,MGJA,gBHImB,CAAnB,SGJA,eHImB,CAAnB,OGJA,oBHImB,CAAnB,MGJA,kBHImB,CAAnB,MGJA,kBHImB,CAAnB,OGJA,mBHImB,CAAnB,SGJA,gBHImB,CAAnB,OGJA,aHImB,CAAnB,cGJA,oBHImB,CAAnB,QGJA,cHImB,CAAnB,MGJA,YHImB,CAAnB,aGJA,mBHImB,CAAnB,OGJA,aHImB,CAAnB,MGJA,YHImB,CAAnB,QGJA,YHImB,CAAnB,KGJA,cHImB,CAAnB,KGJA,WHImB,CAAnB,MGJA,cHImB,CAAnB,KGJA,aHImB,CAAnB,KGJA,cHImB,CAAnB,KGJA,cHImB,CAAnB,QGJA,WHImB,CAAnB,MGJA,WHImB,CAAnB,MGJA,aHImB,CAAnB,MGJA,WHImB,CAAnB,QGJA,WHImB,CAAnB,YGJA,WHImB,CAAnB,KGJA,WHImB,CAAnB,UGJA,YHImB,CAAnB,KGJA,aHImB,CAAnB,MGJA,aHImB,CAAnB,UGJA,gBHImB,CAAnB,UGJA,gBHImB,CAAnB,cGJA,gBHImB,CAAnB,YGJA,eHImB,CAAnB,UGJA,WHImB,CAAnB,QGJA,UHImB,CAAnB,KGJA,YHImB,CAAnB,KGJA,aHImB,CAAnB,KGJA,aHImB,CAAnB,MGJA,UHImB,CAAnB,MGJA,YHImB,CAAnB,MGJA,UHImB,CAAnB,KGJA,UHImB,CAAnB,MGJA,aHImB,CAAnB,MGJA,WHImB,CAAnB,KGJA,UHImB,CAAnB,MGJA,WHImB,CAAnB,MGJA,WHImB,CAAnB,MGJA,UHImB,CAAnB,MGJA,UHImB,CAAnB,KGJA,YHImB,CAAnB,KGJA,aHImB,CAAnB,YGJA,cHImB,CAAnB,gBGJA,cHImB,CAAnB,UGJA,eHImB,CAAnB,UGJA,eHImB,CAAnB,UGJA,eHImB,CAAnB,WGJA,eHImB,CAAnB,WGJA,eHImB,CAAnB,WGJA,eHImB,CAAnB,WGJA,eHImB,CAAnB,WGJA,eHImB,CAAnB,YGJA,cHImB,CAAnB,WGJA,eHImB,CAAnB,UGJA,eHImB,CAAnB,UGJA,eHImB,CAAnB,YGJA,cHImB,CAAnB,QGJA,WHImB,CAAnB,eGJA,aHImB,CAAnB,WGJA,WHImB,CAAnB,YGJA,iBHImB,CAAnB,eGJA,mDHImB,CAAnB,eGJA,kDHImB,CAAnB,eGJA,kDHImB,CAAnB,mBGJA,oDHImB,CAAnB,eGJA,sDHImB,CAAnB,gBGJA,uDHImB,CAAnB,gBGJA,sDHImB,CAAnB,eGJA,qDHImB,CAAnB,aGJA,mBHImB,CAAnB,yBGJA,6BHImB,CAAnB,YGJA,kBHImB,CAAnB,WGJA,6BHImB,CAAnB,gBGJA,cHImB,CAAnB,gBGJA,cHImB,CAAnB,oBGJA,kBHImB,CAAnB,aGJA,oFHImB,CAAnB,aGJA,WHImB,CAAnB,QGJA,WHImB,CAAnB,aGJA,6CHImB,CAAnB,wDGJA,oDHImB,CAAnB,aGJA,6CHImB,CAAnB,aGJA,6CHImB,CAAnB,aGJA,6CHImB,CAAnB,aGJA,6CHImB,CAAnB,aGJA,6CHImB,CAAnB,aGJA,6CHImB,CAAnB,aGJA,6CHImB,CAAnB,aGJA,6CHImB,CAAnB,cGJA,8CHImB,CAAnB,cGJA,8CHImB,CAAnB,cGJA,8CHImB,CAAnB,UGJA,qBHImB,CAAnB,WGJA,cHImB,CAAnB,aGJA,sBHImB,CAAnB,WGJA,oBHImB,CAAnB,cGJA,kBHImB,CAAnB,eGJA,mBHImB,CAAnB,aGJA,wBHImB,CAAnB,gBGJA,sBHImB,CAAnB,iBGJA,6BHImB,CAAnB,OGJA,QHImB,CAAnB,OGJA,SHImB,CAAnB,OGJA,UHImB,CAAnB,OGJA,UHImB,CAAnB,OGJA,UHImB,CAAnB,yCGJA,+HHImB,CAAnB,yCGJA,mIHImB,CAAnB,yCGJA,iIHImB,CAAnB,yCGJA,iIHImB,CAAnB,yCGJA,mIHImB,CAAnB,yCGJA,+HHImB,CAAnB,yCGJA,+HHImB,CAAnB,yCGJA,mIHImB,CAAnB,yCGJA,mIHImB,CAAnB,yCGJA,mIHImB,CAAnB,wCGJA,4IHImB,CAAnB,wCGJA,4IHImB,CAAnB,+CGJA,6EHImB,CAAnB,+CGJA,6EHImB,CAAnB,eGJA,aHImB,CAAnB,iBGJA,eHImB,CAAnB,iBGJA,eHImB,CAAnB,iBGJA,eHImB,CAAnB,mBGJA,iBHImB,CAAnB,mBGJA,iBHImB,CAAnB,mBGJA,iBHImB,CAAnB,UGJA,sCHImB,CAAnB,6BGJA,kBHImB,CAAnB,qBGJA,oBHImB,CAAnB,aGJA,wBHImB,CAAnB,aGJA,kBHImB,CAAnB,YGJA,mBHImB,CAAnB,YGJA,oBHImB,CAAnB,cGJA,oBHImB,CAAnB,SGJA,oBHImB,CAAnB,YGJA,qBHImB,CAAnB,eGJA,4DHImB,CAAnB,cGJA,4DHImB,CAAnB,cGJA,6BHImB,CAAnB,4BGJA,gCHImB,CAAnB,cGJA,+BHImB,CAAnB,cGJA,4DHImB,CAAnB,QGJA,gBHImB,CAAnB,UGJA,cHImB,CAAnB,UGJA,gBHImB,CAAnB,UGJA,oBHImB,CAAnB,UGJA,uBHImB,CAAnB,UGJA,sBHImB,CAAnB,UGJA,qBHImB,CAAnB,iBGJA,6EHImB,CAAnB,oBGJA,wBHImB,CAAnB,mBGJA,6EHImB,CAAnB,mBGJA,2EHImB,CAAnB,iBGJA,6EHImB,CAAnB,aGJA,yEHImB,CAAnB,UGJA,yEHImB,CAAnB,gBGJA,uEHImB,CAAnB,eGJA,uEHImB,CAAnB,gBGJA,uEHImB,CAAnB,gBGJA,uEHImB,CAAnB,cGJA,yEHImB,CAAnB,eGJA,yEHImB,CAAnB,eGJA,yEHImB,CAAnB,aGJA,yEHImB,CAAnB,iBGJA,mCHImB,CAAnB,gBGJA,mCHImB,CAAnB,YGJA,yEHImB,CAAnB,iBGJA,kCHImB,CAAnB,cGJA,+BHImB,CAAnB,gBGJA,oCHImB,CAAnB,gBGJA,uEHImB,CAAnB,eGJA,yEHImB,CAAnB,gBGJA,yEHImB,CAAnB,gBGJA,4BHImB,CAAnB,oBGJA,mCHImB,CAAnB,mBGJA,mCHImB,CAAnB,oBGJA,mCHImB,CAAnB,oBGJA,oCHImB,CAAnB,iBGJA,mCHImB,CAAnB,UGJA,qBHImB,CAAnB,WGJA,uBHImB,CAAnB,cGJA,iBHImB,CAAnB,KGJA,aHImB,CAAnB,KGJA,YHImB,CAAnB,KGJA,cHImB,CAAnB,KGJA,YHImB,CAAnB,KGJA,cHImB,CAAnB,KGJA,cHImB,CAAnB,KGJA,SHImB,CAAnB,MGJA,oCHImB,CAAnB,MGJA,wCHImB,CAAnB,MGJA,wCHImB,CAAnB,MGJA,sCHImB,CAAnB,MGJA,wCHImB,CAAnB,MGJA,oCHImB,CAAnB,MGJA,sCHImB,CAAnB,MGJA,0CHImB,CAAnB,MGJA,wCHImB,CAAnB,MGJA,wCHImB,CAAnB,MGJA,wCHImB,CAAnB,MGJA,oCHImB,CAAnB,SGJA,0CHImB,CAAnB,OGJA,mBHImB,CAAnB,MGJA,mBHImB,CAAnB,OGJA,oBHImB,CAAnB,MGJA,mBHImB,CAAnB,MGJA,oBHImB,CAAnB,MGJA,qBHImB,CAAnB,MGJA,kBHImB,CAAnB,MGJA,iBHImB,CAAnB,MGJA,oBHImB,CAAnB,OGJA,iBHImB,CAAnB,MGJA,kBHImB,CAAnB,MGJA,kBHImB,CAAnB,WGJA,eHImB,CAAnB,aGJA,iBHImB,CAAnB,YGJA,gBHImB,CAAnB,WGJA,mGHImB,CAAnB,UGJA,iCHImB,CAAnB,SGJA,qCHImB,CAAnB,SGJA,qCHImB,CAAnB,SGJA,iCHImB,CAAnB,SGJA,sCHImB,CAAnB,UGJA,sCHImB,CAAnB,WGJA,iCHImB,CAAnB,WGJA,eHImB,CAAnB,aGJA,eHImB,CAAnB,eGJA,eHImB,CAAnB,aGJA,eHImB,CAAnB,WGJA,wBHImB,CAAnB,QGJA,iBHImB,CAAnB,WGJA,kBHImB,CAAnB,cGJA,aHImB,CAAnB,eGJA,aHImB,CAAnB,eGJA,gBHImB,CAAnB,WGJA,gBHImB,CAAnB,gBGJA,sBHImB,CAAnB,gBGJA,oBHImB,CAAnB,iBGJA,gBHImB,CAAnB,eGJA,+DHImB,CAAnB,YGJA,kEHImB,CAAnB,eGJA,+DHImB,CAAnB,eGJA,kEHImB,CAAnB,iBGJA,gEHImB,CAAnB,kBGJA,gEHImB,CAAnB,kBGJA,gEHImB,CAAnB,kBGJA,gEHImB,CAAnB,iBGJA,gEHImB,CAAnB,kBGJA,+DHImB,CAAnB,kBGJA,gEHImB,CAAnB,eGJA,+DHImB,CAAnB,eGJA,kEHImB,CAAnB,eGJA,+DHImB,CAAnB,kBGJA,gEHImB,CAAnB,eGJA,kEHImB,CAAnB,kBGJA,+DHImB,CAAnB,iBGJA,kEHImB,CAAnB,iBGJA,gEHImB,CAAnB,kBGJA,gEHImB,CAAnB,kBGJA,+DHImB,CAAnB,iBGJA,gEHImB,CAAnB,kBGJA,gEHImB,CAAnB,kBGJA,iEHImB,CAAnB,aGJA,oEHImB,CAAnB,wCGJA,gFHImB,CAAnB,4CGJA,gFHImB,CAAnB,mCGJA,gFHImB,CAAnB,wCGJA,gFHImB,CAAnB,4CGJA,gFHImB,CAAnB,mCGJA,gFHImB,CAAnB,2CGJA,0BHImB,CAAnB,+CGJA,0BHImB,CAAnB,sCGJA,0BHImB,CAAnB,WGJA,SHImB,CAAnB,aGJA,SHImB,CAAnB,YGJA,UHImB,CAAnB,YGJA,WHImB,CAAnB,QGJA,kEHImB,CAAnB,mBGJA,kGHImB,CAAnB,WGJA,uCHImB,CAAnB,WGJA,4EHImB,CAAnB,uBGJA,kGHImB,CAAnB,YGJA,6CHImB,CAAnB,QGJA,mNHImB,CAAnB,gBGJA,wFHImB,CAAnB,QGJA,6MHImB,CAAnB,QGJA,4SHImB,CAAnB,iBGJA,4EHImB,CAAnB,kBGJA,4EHImB,CAAnB,kBGJA,4EHImB,CAAnB,eGJA,4EHImB,CAAnB,iBGJA,0EHImB,CAAnB,iBGJA,0EHImB,CAAnB,kBGJA,0EHImB,CAAnB,QGJA,uBHImB,CAAnB,kBGJA,6BHImB,CAAnB,yCGJA,2FHImB,CAAnB,uBGJA,oCHImB,CAAnB,YGJA,mdHImB,CAAnB,mBGJA,+IHImB,CAAnB,oBGJA,uGHImB,CAAnB,aGJA,wBHImB,CAAnB,cGJA,uBHImB,CAAnB,cGJA,uBHImB,CAAnB,cGJA,uBHImB,CAAnB,aGJA,kDHImB,CAAnB,SGJA,iDHImB,CAAnB,UGJA,iDHImB,CAJnB,gCGAA,0/hB","sources":["webpack://filament/./packages/forms/dist/module.esm.css","webpack://filament/./packages/admin/resources/css/app.css","webpack://filament/./packages/admin/resources/css/%3Cinput%20css%20qbYbM5%3E","webpack://filament/./packages/admin/resources/css/%3Cinput%20css%20SQCG3c%3E","webpack://filament/"],"sourcesContent":["@charset \"UTF-8\";\n\n/* node_modules/filepond-plugin-image-preview/dist/filepond-plugin-image-preview.css */\n.filepond--image-preview-markup {\n position: absolute;\n left: 0;\n top: 0;\n}\n.filepond--image-preview-wrapper {\n z-index: 2;\n}\n.filepond--image-preview-overlay {\n display: block;\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n min-height: 5rem;\n max-height: 7rem;\n margin: 0;\n opacity: 0;\n z-index: 2;\n pointer-events: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.filepond--image-preview-overlay svg {\n width: 100%;\n height: auto;\n color: inherit;\n max-height: inherit;\n}\n.filepond--image-preview-overlay-idle {\n mix-blend-mode: multiply;\n color: rgba(40, 40, 40, 0.85);\n}\n.filepond--image-preview-overlay-success {\n mix-blend-mode: normal;\n color: rgba(54, 151, 99, 1);\n}\n.filepond--image-preview-overlay-failure {\n mix-blend-mode: normal;\n color: rgba(196, 78, 71, 1);\n}\n@supports (-webkit-marquee-repetition: infinite) and ((-o-object-fit: fill) or (object-fit: fill)) {\n .filepond--image-preview-overlay-idle {\n mix-blend-mode: normal;\n }\n}\n.filepond--image-preview-wrapper {\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n position: absolute;\n left: 0;\n top: 0;\n right: 0;\n height: 100%;\n margin: 0;\n border-radius: 0.45em;\n overflow: hidden;\n background: rgba(0, 0, 0, 0.01);\n}\n.filepond--image-preview {\n position: absolute;\n left: 0;\n top: 0;\n z-index: 1;\n display: flex;\n align-items: center;\n height: 100%;\n width: 100%;\n pointer-events: none;\n background: #222;\n will-change: transform, opacity;\n}\n.filepond--image-clip {\n position: relative;\n overflow: hidden;\n margin: 0 auto;\n}\n.filepond--image-clip[data-transparency-indicator=grid] img,\n.filepond--image-clip[data-transparency-indicator=grid] canvas {\n background-color: #fff;\n background-image: url(\"data:image/svg+xml,%3Csvg viewBox='0 0 100 100' xmlns='http://www.w3.org/2000/svg' fill='%23eee'%3E%3Cpath d='M0 0 H50 V50 H0'/%3E%3Cpath d='M50 50 H100 V100 H50'/%3E%3C/svg%3E\");\n background-size: 1.25em 1.25em;\n}\n.filepond--image-bitmap,\n.filepond--image-vector {\n position: absolute;\n left: 0;\n top: 0;\n will-change: transform;\n}\n.filepond--root[data-style-panel-layout~=integrated] .filepond--image-preview-wrapper {\n border-radius: 0;\n}\n.filepond--root[data-style-panel-layout~=integrated] .filepond--image-preview {\n height: 100%;\n display: flex;\n justify-content: center;\n align-items: center;\n}\n.filepond--root[data-style-panel-layout~=circle] .filepond--image-preview-wrapper {\n border-radius: 99999rem;\n}\n.filepond--root[data-style-panel-layout~=circle] .filepond--image-preview-overlay {\n top: auto;\n bottom: 0;\n -webkit-transform: scaleY(-1);\n transform: scaleY(-1);\n}\n.filepond--root[data-style-panel-layout~=circle] .filepond--file .filepond--file-action-button[data-align*=bottom]:not([data-align*=\"center\"]) {\n margin-bottom: 0.325em;\n}\n.filepond--root[data-style-panel-layout~=circle] .filepond--file [data-align*=left] {\n left: calc(50% - 3em);\n}\n.filepond--root[data-style-panel-layout~=circle] .filepond--file [data-align*=right] {\n right: calc(50% - 3em);\n}\n.filepond--root[data-style-panel-layout~=circle] .filepond--progress-indicator[data-align*=bottom][data-align*=left],\n.filepond--root[data-style-panel-layout~=circle] .filepond--progress-indicator[data-align*=bottom][data-align*=right] {\n margin-bottom: calc(0.325em + 0.1875em);\n}\n.filepond--root[data-style-panel-layout~=circle] .filepond--progress-indicator[data-align*=bottom][data-align*=center] {\n margin-top: 0;\n margin-bottom: 0.1875em;\n margin-left: 0.1875em;\n}\n\n/* node_modules/filepond/dist/filepond.min.css */\n.filepond--assistant {\n position: absolute;\n overflow: hidden;\n height: 1px;\n width: 1px;\n padding: 0;\n border: 0;\n clip: rect(1px, 1px, 1px, 1px);\n -webkit-clip-path: inset(50%);\n clip-path: inset(50%);\n white-space: nowrap;\n}\n.filepond--browser.filepond--browser {\n position: absolute;\n margin: 0;\n padding: 0;\n left: 1em;\n top: 1.75em;\n width: calc(100% - 2em);\n opacity: 0;\n font-size: 0;\n}\n.filepond--data {\n position: absolute;\n width: 0;\n height: 0;\n padding: 0;\n margin: 0;\n border: none;\n visibility: hidden;\n pointer-events: none;\n contain: strict;\n}\n.filepond--drip {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n overflow: hidden;\n opacity: .1;\n pointer-events: none;\n border-radius: .5em;\n background: rgba(0, 0, 0, .01);\n}\n.filepond--drip-blob {\n -webkit-transform-origin: center center;\n transform-origin: center center;\n width: 8em;\n height: 8em;\n margin-left: -4em;\n margin-top: -4em;\n background: #292625;\n border-radius: 50%;\n}\n.filepond--drip-blob,\n.filepond--drop-label {\n position: absolute;\n top: 0;\n left: 0;\n will-change: transform, opacity;\n}\n.filepond--drop-label {\n right: 0;\n margin: 0;\n color: #4f4f4f;\n display: flex;\n justify-content: center;\n align-items: center;\n height: 0;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.filepond--drop-label.filepond--drop-label label {\n display: block;\n margin: 0;\n padding: .5em;\n}\n.filepond--drop-label label {\n cursor: default;\n font-size: .875em;\n font-weight: 400;\n text-align: center;\n line-height: 1.5;\n}\n.filepond--label-action {\n text-decoration: underline;\n -webkit-text-decoration-skip: ink;\n text-decoration-skip-ink: auto;\n -webkit-text-decoration-color: #a7a4a4;\n text-decoration-color: #a7a4a4;\n cursor: pointer;\n}\n.filepond--root[data-disabled] .filepond--drop-label label {\n opacity: .5;\n}\n.filepond--file-action-button.filepond--file-action-button {\n font-size: 1em;\n width: 1.625em;\n height: 1.625em;\n font-family: inherit;\n line-height: inherit;\n margin: 0;\n padding: 0;\n border: none;\n outline: none;\n will-change: transform, opacity;\n}\n.filepond--file-action-button.filepond--file-action-button span {\n position: absolute;\n overflow: hidden;\n height: 1px;\n width: 1px;\n padding: 0;\n border: 0;\n clip: rect(1px, 1px, 1px, 1px);\n -webkit-clip-path: inset(50%);\n clip-path: inset(50%);\n white-space: nowrap;\n}\n.filepond--file-action-button.filepond--file-action-button svg {\n width: 100%;\n height: 100%;\n}\n.filepond--file-action-button.filepond--file-action-button:after {\n position: absolute;\n left: -.75em;\n right: -.75em;\n top: -.75em;\n bottom: -.75em;\n content: \"\";\n}\n.filepond--file-action-button {\n cursor: auto;\n color: #fff;\n border-radius: 50%;\n background-color: rgba(0, 0, 0, .5);\n background-image: none;\n box-shadow: 0 0 0 0 hsla(0, 0%, 100%, 0);\n transition: box-shadow .25s ease-in;\n}\n.filepond--file-action-button:focus,\n.filepond--file-action-button:hover {\n box-shadow: 0 0 0 .125em hsla(0, 0%, 100%, .9);\n}\n.filepond--file-action-button[disabled] {\n color: hsla(0, 0%, 100%, .5);\n background-color: rgba(0, 0, 0, .25);\n}\n.filepond--file-action-button[hidden] {\n display: none;\n}\n.filepond--action-edit-item.filepond--action-edit-item {\n width: 2em;\n height: 2em;\n padding: .1875em;\n}\n.filepond--action-edit-item.filepond--action-edit-item[data-align*=center] {\n margin-left: -.1875em;\n}\n.filepond--action-edit-item.filepond--action-edit-item[data-align*=bottom] {\n margin-bottom: -.1875em;\n}\n.filepond--action-edit-item-alt {\n border: none;\n line-height: inherit;\n background: transparent;\n font-family: inherit;\n color: inherit;\n outline: none;\n padding: 0;\n margin: 0 0 0 .25em;\n pointer-events: all;\n position: absolute;\n}\n.filepond--action-edit-item-alt svg {\n width: 1.3125em;\n height: 1.3125em;\n}\n.filepond--action-edit-item-alt span {\n font-size: 0;\n opacity: 0;\n}\n.filepond--file-info {\n position: static;\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n flex: 1;\n margin: 0 .5em 0 0;\n min-width: 0;\n will-change: transform, opacity;\n pointer-events: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.filepond--file-info * {\n margin: 0;\n}\n.filepond--file-info .filepond--file-info-main {\n font-size: .75em;\n line-height: 1.2;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n width: 100%;\n}\n.filepond--file-info .filepond--file-info-sub {\n font-size: .625em;\n opacity: .5;\n transition: opacity .25s ease-in-out;\n white-space: nowrap;\n}\n.filepond--file-info .filepond--file-info-sub:empty {\n display: none;\n}\n.filepond--file-status {\n position: static;\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n flex-grow: 0;\n flex-shrink: 0;\n margin: 0;\n min-width: 2.25em;\n text-align: right;\n will-change: transform, opacity;\n pointer-events: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.filepond--file-status * {\n margin: 0;\n white-space: nowrap;\n}\n.filepond--file-status .filepond--file-status-main {\n font-size: .75em;\n line-height: 1.2;\n}\n.filepond--file-status .filepond--file-status-sub {\n font-size: .625em;\n opacity: .5;\n transition: opacity .25s ease-in-out;\n}\n.filepond--file-wrapper.filepond--file-wrapper {\n border: none;\n margin: 0;\n padding: 0;\n min-width: 0;\n height: 100%;\n}\n.filepond--file-wrapper.filepond--file-wrapper > legend {\n position: absolute;\n overflow: hidden;\n height: 1px;\n width: 1px;\n padding: 0;\n border: 0;\n clip: rect(1px, 1px, 1px, 1px);\n -webkit-clip-path: inset(50%);\n clip-path: inset(50%);\n white-space: nowrap;\n}\n.filepond--file {\n position: static;\n display: flex;\n height: 100%;\n align-items: flex-start;\n padding: .5625em;\n color: #fff;\n border-radius: .5em;\n}\n.filepond--file .filepond--file-status {\n margin-left: auto;\n margin-right: 2.25em;\n}\n.filepond--file .filepond--processing-complete-indicator {\n pointer-events: none;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n z-index: 3;\n}\n.filepond--file .filepond--file-action-button,\n.filepond--file .filepond--processing-complete-indicator,\n.filepond--file .filepond--progress-indicator {\n position: absolute;\n}\n.filepond--file [data-align*=left] {\n left: .5625em;\n}\n.filepond--file [data-align*=right] {\n right: .5625em;\n}\n.filepond--file [data-align*=center] {\n left: calc(50% - .8125em);\n}\n.filepond--file [data-align*=bottom] {\n bottom: 1.125em;\n}\n.filepond--file [data-align=center] {\n top: calc(50% - .8125em);\n}\n.filepond--file .filepond--progress-indicator {\n margin-top: .1875em;\n}\n.filepond--file .filepond--progress-indicator[data-align*=right] {\n margin-right: .1875em;\n}\n.filepond--file .filepond--progress-indicator[data-align*=left] {\n margin-left: .1875em;\n}\n[data-filepond-item-state*=error] .filepond--file-info,\n[data-filepond-item-state*=invalid] .filepond--file-info,\n[data-filepond-item-state=cancelled] .filepond--file-info {\n margin-right: 2.25em;\n}\n[data-filepond-item-state~=processing] .filepond--file-status-sub {\n opacity: 0;\n}\n[data-filepond-item-state~=processing] .filepond--action-abort-item-processing ~ .filepond--file-status .filepond--file-status-sub {\n opacity: .5;\n}\n[data-filepond-item-state=processing-error] .filepond--file-status-sub {\n opacity: 0;\n}\n[data-filepond-item-state=processing-error] .filepond--action-retry-item-processing ~ .filepond--file-status .filepond--file-status-sub {\n opacity: .5;\n}\n[data-filepond-item-state=processing-complete] .filepond--action-revert-item-processing svg {\n -webkit-animation: fall .5s linear .125s both;\n animation: fall .5s linear .125s both;\n}\n[data-filepond-item-state=processing-complete] .filepond--file-status-sub {\n opacity: .5;\n}\n[data-filepond-item-state=processing-complete] .filepond--file-info-sub,\n[data-filepond-item-state=processing-complete] .filepond--processing-complete-indicator:not([style*=hidden]) ~ .filepond--file-status .filepond--file-status-sub {\n opacity: 0;\n}\n[data-filepond-item-state=processing-complete] .filepond--action-revert-item-processing ~ .filepond--file-info .filepond--file-info-sub {\n opacity: .5;\n}\n[data-filepond-item-state*=error] .filepond--file-wrapper,\n[data-filepond-item-state*=error] .filepond--panel,\n[data-filepond-item-state*=invalid] .filepond--file-wrapper,\n[data-filepond-item-state*=invalid] .filepond--panel {\n -webkit-animation: shake .65s linear both;\n animation: shake .65s linear both;\n}\n[data-filepond-item-state*=busy] .filepond--progress-indicator svg {\n -webkit-animation: spin 1s linear infinite;\n animation: spin 1s linear infinite;\n}\n@-webkit-keyframes spin {\n 0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg);\n }\n to {\n -webkit-transform: rotate(1turn);\n transform: rotate(1turn);\n }\n}\n@keyframes spin {\n 0% {\n -webkit-transform: rotate(0deg);\n transform: rotate(0deg);\n }\n to {\n -webkit-transform: rotate(1turn);\n transform: rotate(1turn);\n }\n}\n@-webkit-keyframes shake {\n 10%, 90% {\n -webkit-transform: translateX(-.0625em);\n transform: translateX(-.0625em);\n }\n 20%, 80% {\n -webkit-transform: translateX(.125em);\n transform: translateX(.125em);\n }\n 30%, 50%, 70% {\n -webkit-transform: translateX(-.25em);\n transform: translateX(-.25em);\n }\n 40%, 60% {\n -webkit-transform: translateX(.25em);\n transform: translateX(.25em);\n }\n}\n@keyframes shake {\n 10%, 90% {\n -webkit-transform: translateX(-.0625em);\n transform: translateX(-.0625em);\n }\n 20%, 80% {\n -webkit-transform: translateX(.125em);\n transform: translateX(.125em);\n }\n 30%, 50%, 70% {\n -webkit-transform: translateX(-.25em);\n transform: translateX(-.25em);\n }\n 40%, 60% {\n -webkit-transform: translateX(.25em);\n transform: translateX(.25em);\n }\n}\n@-webkit-keyframes fall {\n 0% {\n opacity: 0;\n -webkit-transform: scale(.5);\n transform: scale(.5);\n -webkit-animation-timing-function: ease-out;\n animation-timing-function: ease-out;\n }\n 70% {\n opacity: 1;\n -webkit-transform: scale(1.1);\n transform: scale(1.1);\n -webkit-animation-timing-function: ease-in-out;\n animation-timing-function: ease-in-out;\n }\n to {\n -webkit-transform: scale(1);\n transform: scale(1);\n -webkit-animation-timing-function: ease-out;\n animation-timing-function: ease-out;\n }\n}\n@keyframes fall {\n 0% {\n opacity: 0;\n -webkit-transform: scale(.5);\n transform: scale(.5);\n -webkit-animation-timing-function: ease-out;\n animation-timing-function: ease-out;\n }\n 70% {\n opacity: 1;\n -webkit-transform: scale(1.1);\n transform: scale(1.1);\n -webkit-animation-timing-function: ease-in-out;\n animation-timing-function: ease-in-out;\n }\n to {\n -webkit-transform: scale(1);\n transform: scale(1);\n -webkit-animation-timing-function: ease-out;\n animation-timing-function: ease-out;\n }\n}\n.filepond--hopper[data-hopper-state=drag-over] > * {\n pointer-events: none;\n}\n.filepond--hopper[data-hopper-state=drag-over]:after {\n content: \"\";\n position: absolute;\n left: 0;\n top: 0;\n right: 0;\n bottom: 0;\n z-index: 100;\n}\n.filepond--progress-indicator {\n z-index: 103;\n}\n.filepond--file-action-button {\n z-index: 102;\n}\n.filepond--file-status {\n z-index: 101;\n}\n.filepond--file-info {\n z-index: 100;\n}\n.filepond--item {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n z-index: 1;\n padding: 0;\n margin: .25em;\n will-change: transform, opacity;\n}\n.filepond--item > .filepond--panel {\n z-index: -1;\n}\n.filepond--item > .filepond--panel .filepond--panel-bottom {\n box-shadow: 0 .0625em .125em -.0625em rgba(0, 0, 0, .25);\n}\n.filepond--item > .filepond--file-wrapper,\n.filepond--item > .filepond--panel {\n transition: opacity .15s ease-out;\n}\n.filepond--item[data-drag-state] {\n cursor: -webkit-grab;\n cursor: grab;\n}\n.filepond--item[data-drag-state] > .filepond--panel {\n transition: box-shadow .125s ease-in-out;\n box-shadow: 0 0 0 transparent;\n}\n.filepond--item[data-drag-state=drag] {\n cursor: -webkit-grabbing;\n cursor: grabbing;\n}\n.filepond--item[data-drag-state=drag] > .filepond--panel {\n box-shadow: 0 .125em .3125em rgba(0, 0, 0, .325);\n}\n.filepond--item[data-drag-state]:not([data-drag-state=idle]) {\n z-index: 2;\n}\n.filepond--item-panel {\n background-color: #64605e;\n}\n[data-filepond-item-state=processing-complete] .filepond--item-panel {\n background-color: #369763;\n}\n[data-filepond-item-state*=error] .filepond--item-panel,\n[data-filepond-item-state*=invalid] .filepond--item-panel {\n background-color: #c44e47;\n}\n.filepond--item-panel {\n border-radius: .5em;\n transition: background-color .25s;\n}\n.filepond--list-scroller {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n margin: 0;\n will-change: transform;\n}\n.filepond--list-scroller[data-state=overflow] .filepond--list {\n bottom: 0;\n right: 0;\n}\n.filepond--list-scroller[data-state=overflow] {\n overflow-y: scroll;\n overflow-x: hidden;\n -webkit-overflow-scrolling: touch;\n -webkit-mask: linear-gradient(180deg, #000 calc(100% - .5em), transparent);\n mask: linear-gradient(180deg, #000 calc(100% - .5em), transparent);\n}\n.filepond--list-scroller::-webkit-scrollbar {\n background: transparent;\n}\n.filepond--list-scroller::-webkit-scrollbar:vertical {\n width: 1em;\n}\n.filepond--list-scroller::-webkit-scrollbar:horizontal {\n height: 0;\n}\n.filepond--list-scroller::-webkit-scrollbar-thumb {\n background-color: rgba(0, 0, 0, .3);\n border-radius: 99999px;\n border: .3125em solid transparent;\n background-clip: content-box;\n}\n.filepond--list.filepond--list {\n position: absolute;\n top: 0;\n margin: 0;\n padding: 0;\n list-style-type: none;\n will-change: transform;\n}\n.filepond--list {\n left: .75em;\n right: .75em;\n}\n.filepond--root[data-style-panel-layout~=integrated] {\n width: 100%;\n height: 100%;\n max-width: none;\n margin: 0;\n}\n.filepond--root[data-style-panel-layout~=circle] .filepond--panel-root,\n.filepond--root[data-style-panel-layout~=integrated] .filepond--panel-root {\n border-radius: 0;\n}\n.filepond--root[data-style-panel-layout~=circle] .filepond--panel-root > *,\n.filepond--root[data-style-panel-layout~=integrated] .filepond--panel-root > * {\n display: none;\n}\n.filepond--root[data-style-panel-layout~=circle] .filepond--drop-label,\n.filepond--root[data-style-panel-layout~=integrated] .filepond--drop-label {\n bottom: 0;\n height: auto;\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 7;\n}\n.filepond--root[data-style-panel-layout~=circle] .filepond--item-panel,\n.filepond--root[data-style-panel-layout~=integrated] .filepond--item-panel {\n display: none;\n}\n.filepond--root[data-style-panel-layout~=compact] .filepond--list-scroller,\n.filepond--root[data-style-panel-layout~=integrated] .filepond--list-scroller {\n overflow: hidden;\n height: 100%;\n margin-top: 0;\n margin-bottom: 0;\n}\n.filepond--root[data-style-panel-layout~=compact] .filepond--list,\n.filepond--root[data-style-panel-layout~=integrated] .filepond--list {\n left: 0;\n right: 0;\n height: 100%;\n}\n.filepond--root[data-style-panel-layout~=compact] .filepond--item,\n.filepond--root[data-style-panel-layout~=integrated] .filepond--item {\n margin: 0;\n}\n.filepond--root[data-style-panel-layout~=compact] .filepond--file-wrapper,\n.filepond--root[data-style-panel-layout~=integrated] .filepond--file-wrapper {\n height: 100%;\n}\n.filepond--root[data-style-panel-layout~=compact] .filepond--drop-label,\n.filepond--root[data-style-panel-layout~=integrated] .filepond--drop-label {\n z-index: 7;\n}\n.filepond--root[data-style-panel-layout~=circle] {\n border-radius: 99999rem;\n overflow: hidden;\n}\n.filepond--root[data-style-panel-layout~=circle] > .filepond--panel {\n border-radius: inherit;\n}\n.filepond--root[data-style-panel-layout~=circle] > .filepond--panel > * {\n display: none;\n}\n.filepond--root[data-style-panel-layout~=circle] .filepond--file-info,\n.filepond--root[data-style-panel-layout~=circle] .filepond--file-status {\n display: none;\n}\n.filepond--root[data-style-panel-layout~=circle] .filepond--action-edit-item {\n opacity: 1 !important;\n visibility: visible !important;\n}\n@media not all and (min-resolution:0.001dpcm) {\n @supports (-webkit-appearance:none) and (stroke-color:transparent) {\n .filepond--root[data-style-panel-layout~=circle] {\n will-change: transform;\n }\n }\n}\n.filepond--panel-root {\n border-radius: .5em;\n background-color: #f1f0ef;\n}\n.filepond--panel {\n position: absolute;\n left: 0;\n top: 0;\n right: 0;\n margin: 0;\n height: 100% !important;\n pointer-events: none;\n}\n.filepond-panel:not([data-scalable=false]) {\n height: auto !important;\n}\n.filepond--panel[data-scalable=false] > div {\n display: none;\n}\n.filepond--panel[data-scalable=true] {\n -webkit-transform-style: preserve-3d;\n transform-style: preserve-3d;\n background-color: transparent !important;\n border: none !important;\n}\n.filepond--panel-bottom,\n.filepond--panel-center,\n.filepond--panel-top {\n position: absolute;\n left: 0;\n top: 0;\n right: 0;\n margin: 0;\n padding: 0;\n}\n.filepond--panel-bottom,\n.filepond--panel-top {\n height: .5em;\n}\n.filepond--panel-top {\n border-bottom-left-radius: 0 !important;\n border-bottom-right-radius: 0 !important;\n border-bottom: none !important;\n}\n.filepond--panel-top:after {\n content: \"\";\n position: absolute;\n height: 2px;\n left: 0;\n right: 0;\n bottom: -1px;\n background-color: inherit;\n}\n.filepond--panel-bottom,\n.filepond--panel-center {\n will-change: transform;\n -webkit-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-transform-origin: left top;\n transform-origin: left top;\n -webkit-transform: translate3d(0, .5em, 0);\n transform: translate3d(0, .5em, 0);\n}\n.filepond--panel-bottom {\n border-top-left-radius: 0 !important;\n border-top-right-radius: 0 !important;\n border-top: none !important;\n}\n.filepond--panel-bottom:before {\n content: \"\";\n position: absolute;\n height: 2px;\n left: 0;\n right: 0;\n top: -1px;\n background-color: inherit;\n}\n.filepond--panel-center {\n height: 100px !important;\n border-top: none !important;\n border-bottom: none !important;\n border-radius: 0 !important;\n}\n.filepond--panel-center:not([style]) {\n visibility: hidden;\n}\n.filepond--progress-indicator {\n position: static;\n width: 1.25em;\n height: 1.25em;\n color: #fff;\n margin: 0;\n pointer-events: none;\n will-change: transform, opacity;\n}\n.filepond--progress-indicator svg {\n width: 100%;\n height: 100%;\n vertical-align: top;\n transform-box: fill-box;\n}\n.filepond--progress-indicator path {\n fill: none;\n stroke: currentColor;\n}\n.filepond--list-scroller {\n z-index: 6;\n}\n.filepond--drop-label {\n z-index: 5;\n}\n.filepond--drip {\n z-index: 3;\n}\n.filepond--root > .filepond--panel {\n z-index: 2;\n}\n.filepond--browser {\n z-index: 1;\n}\n.filepond--root {\n box-sizing: border-box;\n position: relative;\n margin-bottom: 1em;\n font-size: 1rem;\n line-height: normal;\n font-family:\n -apple-system,\n BlinkMacSystemFont,\n Segoe UI,\n Roboto,\n Helvetica,\n Arial,\n sans-serif,\n Apple Color Emoji,\n Segoe UI Emoji,\n Segoe UI Symbol;\n font-weight: 450;\n text-align: left;\n text-rendering: optimizeLegibility;\n direction: ltr;\n contain: layout style size;\n}\n.filepond--root * {\n box-sizing: inherit;\n line-height: inherit;\n}\n.filepond--root :not(text) {\n font-size: inherit;\n}\n.filepond--root[data-disabled] {\n pointer-events: none;\n}\n.filepond--root[data-disabled] .filepond--list-scroller {\n pointer-events: all;\n}\n.filepond--root[data-disabled] .filepond--list {\n pointer-events: none;\n}\n.filepond--root .filepond--drop-label {\n min-height: 4.75em;\n}\n.filepond--root .filepond--list-scroller {\n margin-top: 1em;\n margin-bottom: 1em;\n}\n.filepond--root .filepond--credits {\n position: absolute;\n right: 0;\n opacity: .175;\n line-height: .85;\n font-size: 11px;\n color: inherit;\n text-decoration: none;\n z-index: 3;\n bottom: -14px;\n}\n.filepond--root .filepond--credits[style] {\n top: 0;\n bottom: auto;\n margin-top: 14px;\n}\n\n/* node_modules/trix/dist/trix.css */\ntrix-editor {\n border: 1px solid #bbb;\n border-radius: 3px;\n margin: 0;\n padding: 0.4em 0.6em;\n min-height: 5em;\n outline: none;\n}\ntrix-toolbar * {\n box-sizing: border-box;\n}\ntrix-toolbar .trix-button-row {\n display: flex;\n flex-wrap: nowrap;\n justify-content: space-between;\n overflow-x: auto;\n}\ntrix-toolbar .trix-button-group {\n display: flex;\n margin-bottom: 10px;\n border: 1px solid #bbb;\n border-top-color: #ccc;\n border-bottom-color: #888;\n border-radius: 3px;\n}\ntrix-toolbar .trix-button-group:not(:first-child) {\n margin-left: 1.5vw;\n}\n@media (max-device-width: 768px) {\n trix-toolbar .trix-button-group:not(:first-child) {\n margin-left: 0;\n }\n}\ntrix-toolbar .trix-button-group-spacer {\n flex-grow: 1;\n}\n@media (max-device-width: 768px) {\n trix-toolbar .trix-button-group-spacer {\n display: none;\n }\n}\ntrix-toolbar .trix-button {\n position: relative;\n float: left;\n color: rgba(0, 0, 0, 0.6);\n font-size: 0.75em;\n font-weight: 600;\n white-space: nowrap;\n padding: 0 0.5em;\n margin: 0;\n outline: none;\n border: none;\n border-bottom: 1px solid #ddd;\n border-radius: 0;\n background: transparent;\n}\ntrix-toolbar .trix-button:not(:first-child) {\n border-left: 1px solid #ccc;\n}\ntrix-toolbar .trix-button.trix-active {\n background: #cbeefa;\n color: black;\n}\ntrix-toolbar .trix-button:not(:disabled) {\n cursor: pointer;\n}\ntrix-toolbar .trix-button:disabled {\n color: rgba(0, 0, 0, 0.125);\n}\n@media (max-device-width: 768px) {\n trix-toolbar .trix-button {\n letter-spacing: -0.01em;\n padding: 0 0.3em;\n }\n}\ntrix-toolbar .trix-button--icon {\n font-size: inherit;\n width: 2.6em;\n height: 1.6em;\n max-width: calc(0.8em + 4vw);\n text-indent: -9999px;\n}\n@media (max-device-width: 768px) {\n trix-toolbar .trix-button--icon {\n height: 2em;\n max-width: calc(0.8em + 3.5vw);\n }\n}\ntrix-toolbar .trix-button--icon::before {\n display: inline-block;\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n opacity: 0.6;\n content: \"\";\n background-position: center;\n background-repeat: no-repeat;\n background-size: contain;\n}\n@media (max-device-width: 768px) {\n trix-toolbar .trix-button--icon::before {\n right: 6%;\n left: 6%;\n }\n}\ntrix-toolbar .trix-button--icon.trix-active::before {\n opacity: 1;\n}\ntrix-toolbar .trix-button--icon:disabled::before {\n opacity: 0.125;\n}\ntrix-toolbar .trix-button--icon-attach::before {\n background-image: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M16.5%206v11.5a4%204%200%201%201-8%200V5a2.5%202.5%200%200%201%205%200v10.5a1%201%200%201%201-2%200V6H10v9.5a2.5%202.5%200%200%200%205%200V5a4%204%200%201%200-8%200v12.5a5.5%205.5%200%200%200%2011%200V6h-1.5z%22%2F%3E%3C%2Fsvg%3E);\n top: 8%;\n bottom: 4%;\n}\ntrix-toolbar .trix-button--icon-bold::before {\n background-image: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M15.6%2011.8c1-.7%201.6-1.8%201.6-2.8a4%204%200%200%200-4-4H7v14h7c2.1%200%203.7-1.7%203.7-3.8%200-1.5-.8-2.8-2.1-3.4zM10%207.5h3a1.5%201.5%200%201%201%200%203h-3v-3zm3.5%209H10v-3h3.5a1.5%201.5%200%201%201%200%203z%22%2F%3E%3C%2Fsvg%3E);\n}\ntrix-toolbar .trix-button--icon-italic::before {\n background-image: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M10%205v3h2.2l-3.4%208H6v3h8v-3h-2.2l3.4-8H18V5h-8z%22%2F%3E%3C%2Fsvg%3E);\n}\ntrix-toolbar .trix-button--icon-link::before {\n background-image: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M9.88%2013.7a4.3%204.3%200%200%201%200-6.07l3.37-3.37a4.26%204.26%200%200%201%206.07%200%204.3%204.3%200%200%201%200%206.06l-1.96%201.72a.91.91%200%201%201-1.3-1.3l1.97-1.71a2.46%202.46%200%200%200-3.48-3.48l-3.38%203.37a2.46%202.46%200%200%200%200%203.48.91.91%200%201%201-1.3%201.3z%22%2F%3E%3Cpath%20d%3D%22M4.25%2019.46a4.3%204.3%200%200%201%200-6.07l1.93-1.9a.91.91%200%201%201%201.3%201.3l-1.93%201.9a2.46%202.46%200%200%200%203.48%203.48l3.37-3.38c.96-.96.96-2.52%200-3.48a.91.91%200%201%201%201.3-1.3%204.3%204.3%200%200%201%200%206.07l-3.38%203.38a4.26%204.26%200%200%201-6.07%200z%22%2F%3E%3C%2Fsvg%3E);\n}\ntrix-toolbar .trix-button--icon-strike::before {\n background-image: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M12.73%2014l.28.14c.26.15.45.3.57.44.12.14.18.3.18.5%200%20.3-.15.56-.44.75-.3.2-.76.3-1.39.3A13.52%2013.52%200%200%201%207%2014.95v3.37a10.64%2010.64%200%200%200%204.84.88c1.26%200%202.35-.19%203.28-.56.93-.37%201.64-.9%202.14-1.57s.74-1.45.74-2.32c0-.26-.02-.51-.06-.75h-5.21zm-5.5-4c-.08-.34-.12-.7-.12-1.1%200-1.29.52-2.3%201.58-3.02%201.05-.72%202.5-1.08%204.34-1.08%201.62%200%203.28.34%204.97%201l-1.3%202.93c-1.47-.6-2.73-.9-3.8-.9-.55%200-.96.08-1.2.26-.26.17-.38.38-.38.64%200%20.27.16.52.48.74.17.12.53.3%201.05.53H7.23zM3%2013h18v-2H3v2z%22%2F%3E%3C%2Fsvg%3E);\n}\ntrix-toolbar .trix-button--icon-quote::before {\n background-image: url(data:image/svg+xml,%3Csvg%20version%3D%221%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M6%2017h3l2-4V7H5v6h3zm8%200h3l2-4V7h-6v6h3z%22%2F%3E%3C%2Fsvg%3E);\n}\ntrix-toolbar .trix-button--icon-heading-1::before {\n background-image: url(data:image/svg+xml,%3Csvg%20version%3D%221%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M12%209v3H9v7H6v-7H3V9h9zM8%204h14v3h-6v12h-3V7H8V4z%22%2F%3E%3C%2Fsvg%3E);\n}\ntrix-toolbar .trix-button--icon-code::before {\n background-image: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M18.2%2012L15%2015.2l1.4%201.4L21%2012l-4.6-4.6L15%208.8l3.2%203.2zM5.8%2012L9%208.8%207.6%207.4%203%2012l4.6%204.6L9%2015.2%205.8%2012z%22%2F%3E%3C%2Fsvg%3E);\n}\ntrix-toolbar .trix-button--icon-bullet-list::before {\n background-image: url(data:image/svg+xml,%3Csvg%20version%3D%221%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%204a2%202%200%201%200%200%204%202%202%200%200%200%200-4zm0%206a2%202%200%201%200%200%204%202%202%200%200%200%200-4zm0%206a2%202%200%201%200%200%204%202%202%200%200%200%200-4zm4%203h14v-2H8v2zm0-6h14v-2H8v2zm0-8v2h14V5H8z%22%2F%3E%3C%2Fsvg%3E);\n}\ntrix-toolbar .trix-button--icon-number-list::before {\n background-image: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M2%2017h2v.5H3v1h1v.5H2v1h3v-4H2v1zm1-9h1V4H2v1h1v3zm-1%203h1.8L2%2013.1v.9h3v-1H3.2L5%2010.9V10H2v1zm5-6v2h14V5H7zm0%2014h14v-2H7v2zm0-6h14v-2H7v2z%22%2F%3E%3C%2Fsvg%3E);\n}\ntrix-toolbar .trix-button--icon-undo::before {\n background-image: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M12.5%208c-2.6%200-5%201-6.9%202.6L2%207v9h9l-3.6-3.6A8%208%200%200%201%2020%2016l2.4-.8a10.5%2010.5%200%200%200-10-7.2z%22%2F%3E%3C%2Fsvg%3E);\n}\ntrix-toolbar .trix-button--icon-redo::before {\n background-image: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M18.4%2010.6a10.5%2010.5%200%200%200-16.9%204.6L4%2016a8%208%200%200%201%2012.7-3.6L13%2016h9V7l-3.6%203.6z%22%2F%3E%3C%2Fsvg%3E);\n}\ntrix-toolbar .trix-button--icon-decrease-nesting-level::before {\n background-image: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M3%2019h19v-2H3v2zm7-6h12v-2H10v2zm-8.3-.3l2.8%202.9L6%2014.2%204%2012l2-2-1.4-1.5L1%2012l.7.7zM3%205v2h19V5H3z%22%2F%3E%3C%2Fsvg%3E);\n}\ntrix-toolbar .trix-button--icon-increase-nesting-level::before {\n background-image: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M3%2019h19v-2H3v2zm7-6h12v-2H10v2zm-6.9-1L1%2014.2l1.4%201.4L6%2012l-.7-.7-2.8-2.8L1%209.9%203.1%2012zM3%205v2h19V5H3z%22%2F%3E%3C%2Fsvg%3E);\n}\ntrix-toolbar .trix-dialogs {\n position: relative;\n}\ntrix-toolbar .trix-dialog {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n font-size: 0.75em;\n padding: 15px 10px;\n background: #fff;\n box-shadow: 0 0.3em 1em #ccc;\n border-top: 2px solid #888;\n border-radius: 5px;\n z-index: 5;\n}\ntrix-toolbar .trix-input--dialog {\n font-size: inherit;\n font-weight: normal;\n padding: 0.5em 0.8em;\n margin: 0 10px 0 0;\n border-radius: 3px;\n border: 1px solid #bbb;\n background-color: #fff;\n box-shadow: none;\n outline: none;\n -webkit-appearance: none;\n -moz-appearance: none;\n}\ntrix-toolbar .trix-input--dialog.validate:invalid {\n box-shadow: #F00 0px 0px 1.5px 1px;\n}\ntrix-toolbar .trix-button--dialog {\n font-size: inherit;\n padding: 0.5em;\n border-bottom: none;\n}\ntrix-toolbar .trix-dialog--link {\n max-width: 600px;\n}\ntrix-toolbar .trix-dialog__link-fields {\n display: flex;\n align-items: baseline;\n}\ntrix-toolbar .trix-dialog__link-fields .trix-input {\n flex: 1;\n}\ntrix-toolbar .trix-dialog__link-fields .trix-button-group {\n flex: 0 0 content;\n margin: 0;\n}\ntrix-editor [data-trix-mutable]:not(.attachment__caption-editor) {\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\ntrix-editor [data-trix-mutable]::-moz-selection,\ntrix-editor [data-trix-cursor-target]::-moz-selection,\ntrix-editor [data-trix-mutable] ::-moz-selection {\n background: none;\n}\ntrix-editor [data-trix-mutable]::selection,\ntrix-editor [data-trix-cursor-target]::selection,\ntrix-editor [data-trix-mutable] ::selection {\n background: none;\n}\ntrix-editor [data-trix-mutable].attachment__caption-editor:focus::-moz-selection {\n background: highlight;\n}\ntrix-editor [data-trix-mutable].attachment__caption-editor:focus::selection {\n background: highlight;\n}\ntrix-editor [data-trix-mutable].attachment.attachment--file {\n box-shadow: 0 0 0 2px highlight;\n border-color: transparent;\n}\ntrix-editor [data-trix-mutable].attachment img {\n box-shadow: 0 0 0 2px highlight;\n}\ntrix-editor .attachment {\n position: relative;\n}\ntrix-editor .attachment:hover {\n cursor: default;\n}\ntrix-editor .attachment--preview .attachment__caption:hover {\n cursor: text;\n}\ntrix-editor .attachment__progress {\n position: absolute;\n z-index: 1;\n height: 20px;\n top: calc(50% - 10px);\n left: 5%;\n width: 90%;\n opacity: 0.9;\n transition: opacity 200ms ease-in;\n}\ntrix-editor .attachment__progress[value=\"100\"] {\n opacity: 0;\n}\ntrix-editor .attachment__caption-editor {\n display: inline-block;\n width: 100%;\n margin: 0;\n padding: 0;\n font-size: inherit;\n font-family: inherit;\n line-height: inherit;\n color: inherit;\n text-align: center;\n vertical-align: top;\n border: none;\n outline: none;\n -webkit-appearance: none;\n -moz-appearance: none;\n}\ntrix-editor .attachment__toolbar {\n position: absolute;\n z-index: 1;\n top: -0.9em;\n left: 0;\n width: 100%;\n text-align: center;\n}\ntrix-editor .trix-button-group {\n display: inline-flex;\n}\ntrix-editor .trix-button {\n position: relative;\n float: left;\n color: #666;\n white-space: nowrap;\n font-size: 80%;\n padding: 0 0.8em;\n margin: 0;\n outline: none;\n border: none;\n border-radius: 0;\n background: transparent;\n}\ntrix-editor .trix-button:not(:first-child) {\n border-left: 1px solid #ccc;\n}\ntrix-editor .trix-button.trix-active {\n background: #cbeefa;\n}\ntrix-editor .trix-button:not(:disabled) {\n cursor: pointer;\n}\ntrix-editor .trix-button--remove {\n text-indent: -9999px;\n display: inline-block;\n padding: 0;\n outline: none;\n width: 1.8em;\n height: 1.8em;\n line-height: 1.8em;\n border-radius: 50%;\n background-color: #fff;\n border: 2px solid highlight;\n box-shadow: 1px 1px 6px rgba(0, 0, 0, 0.25);\n}\ntrix-editor .trix-button--remove::before {\n display: inline-block;\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n opacity: 0.7;\n content: \"\";\n background-image: url(data:image/svg+xml,%3Csvg%20height%3D%2224%22%20width%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M19%206.4L17.6%205%2012%2010.6%206.4%205%205%206.4l5.6%205.6L5%2017.6%206.4%2019l5.6-5.6%205.6%205.6%201.4-1.4-5.6-5.6z%22%2F%3E%3Cpath%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%2F%3E%3C%2Fsvg%3E);\n background-position: center;\n background-repeat: no-repeat;\n background-size: 90%;\n}\ntrix-editor .trix-button--remove:hover {\n border-color: #333;\n}\ntrix-editor .trix-button--remove:hover::before {\n opacity: 1;\n}\ntrix-editor .attachment__metadata-container {\n position: relative;\n}\ntrix-editor .attachment__metadata {\n position: absolute;\n left: 50%;\n top: 2em;\n transform: translate(-50%, 0);\n max-width: 90%;\n padding: 0.1em 0.6em;\n font-size: 0.8em;\n color: #fff;\n background-color: rgba(0, 0, 0, 0.7);\n border-radius: 3px;\n}\ntrix-editor .attachment__metadata .attachment__name {\n display: inline-block;\n max-width: 100%;\n vertical-align: bottom;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\ntrix-editor .attachment__metadata .attachment__size {\n margin-left: 0.2em;\n white-space: nowrap;\n}\n.trix-content {\n line-height: 1.5;\n}\n.trix-content * {\n box-sizing: border-box;\n margin: 0;\n padding: 0;\n}\n.trix-content h1 {\n font-size: 1.2em;\n line-height: 1.2;\n}\n.trix-content blockquote {\n border: 0 solid #ccc;\n border-left-width: 0.3em;\n margin-left: 0.3em;\n padding-left: 0.6em;\n}\n.trix-content [dir=rtl] blockquote,\n.trix-content blockquote[dir=rtl] {\n border-width: 0;\n border-right-width: 0.3em;\n margin-right: 0.3em;\n padding-right: 0.6em;\n}\n.trix-content li {\n margin-left: 1em;\n}\n.trix-content [dir=rtl] li {\n margin-right: 1em;\n}\n.trix-content pre {\n display: inline-block;\n width: 100%;\n vertical-align: top;\n font-family: monospace;\n font-size: 0.9em;\n padding: 0.5em;\n white-space: pre;\n background-color: #eee;\n overflow-x: auto;\n}\n.trix-content img {\n max-width: 100%;\n height: auto;\n}\n.trix-content .attachment {\n display: inline-block;\n position: relative;\n max-width: 100%;\n}\n.trix-content .attachment a {\n color: inherit;\n text-decoration: none;\n}\n.trix-content .attachment a:hover,\n.trix-content .attachment a:visited:hover {\n color: inherit;\n}\n.trix-content .attachment__caption {\n text-align: center;\n}\n.trix-content .attachment__caption .attachment__name + .attachment__size::before {\n content: \" \\b7 \";\n}\n.trix-content .attachment--preview {\n width: 100%;\n text-align: center;\n}\n.trix-content .attachment--preview .attachment__caption {\n color: #666;\n font-size: 0.9em;\n line-height: 1.2;\n}\n.trix-content .attachment--file {\n color: #333;\n line-height: 1;\n margin: 0 2px 2px 2px;\n padding: 0.4em 1em;\n border: 1px solid #bbb;\n border-radius: 5px;\n}\n.trix-content .attachment-gallery {\n display: flex;\n flex-wrap: wrap;\n position: relative;\n}\n.trix-content .attachment-gallery .attachment {\n flex: 1 0 33%;\n padding: 0 0.5em;\n max-width: 33%;\n}\n.trix-content .attachment-gallery.attachment-gallery--2 .attachment,\n.trix-content .attachment-gallery.attachment-gallery--4 .attachment {\n flex-basis: 50%;\n max-width: 50%;\n}\n\n/* packages/forms/resources/css/components/file-upload.css */\n.filepond--root {\n margin-bottom: 0;\n}\n","@import '../../../forms/dist/module.esm.css';\n\n@tailwind base;\n@tailwind components;\n@tailwind utilities;\n","/*! modern-normalize v1.1.0 | MIT License | https://github.com/sindresorhus/modern-normalize */\n\n/*\nDocument\n========\n*/\n\n/**\nUse a better box model (opinionated).\n*/\n\n*,\n::before,\n::after {\n\tbox-sizing: border-box;\n}\n\n/**\nUse a more readable tab size (opinionated).\n*/\n\nhtml {\n\t-moz-tab-size: 4;\n\ttab-size: 4;\n}\n\n/**\n1. Correct the line height in all browsers.\n2. Prevent adjustments of font size after orientation changes in iOS.\n*/\n\nhtml {\n\tline-height: 1.15; /* 1 */\n\t-webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/*\nSections\n========\n*/\n\n/**\nRemove the margin in all browsers.\n*/\n\nbody {\n\tmargin: 0;\n}\n\n/**\nImprove consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)\n*/\n\nbody {\n\tfont-family:\n\t\tsystem-ui,\n\t\t-apple-system, /* Firefox supports this but not yet `system-ui` */\n\t\t'Segoe UI',\n\t\tRoboto,\n\t\tHelvetica,\n\t\tArial,\n\t\tsans-serif,\n\t\t'Apple Color Emoji',\n\t\t'Segoe UI Emoji';\n}\n\n/*\nGrouping content\n================\n*/\n\n/**\n1. Add the correct height in Firefox.\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n*/\n\nhr {\n\theight: 0; /* 1 */\n\tcolor: inherit; /* 2 */\n}\n\n/*\nText-level semantics\n====================\n*/\n\n/**\nAdd the correct text decoration in Chrome, Edge, and Safari.\n*/\n\nabbr[title] {\n\ttext-decoration: underline dotted;\n}\n\n/**\nAdd the correct font weight in Edge and Safari.\n*/\n\nb,\nstrong {\n\tfont-weight: bolder;\n}\n\n/**\n1. Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)\n2. Correct the odd 'em' font sizing in all browsers.\n*/\n\ncode,\nkbd,\nsamp,\npre {\n\tfont-family:\n\t\tui-monospace,\n\t\tSFMono-Regular,\n\t\tConsolas,\n\t\t'Liberation Mono',\n\t\tMenlo,\n\t\tmonospace; /* 1 */\n\tfont-size: 1em; /* 2 */\n}\n\n/**\nAdd the correct font size in all browsers.\n*/\n\nsmall {\n\tfont-size: 80%;\n}\n\n/**\nPrevent 'sub' and 'sup' elements from affecting the line height in all browsers.\n*/\n\nsub,\nsup {\n\tfont-size: 75%;\n\tline-height: 0;\n\tposition: relative;\n\tvertical-align: baseline;\n}\n\nsub {\n\tbottom: -0.25em;\n}\n\nsup {\n\ttop: -0.5em;\n}\n\n/*\nTabular data\n============\n*/\n\n/**\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n*/\n\ntable {\n\ttext-indent: 0; /* 1 */\n\tborder-color: inherit; /* 2 */\n}\n\n/*\nForms\n=====\n*/\n\n/**\n1. Change the font styles in all browsers.\n2. Remove the margin in Firefox and Safari.\n*/\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n\tfont-family: inherit; /* 1 */\n\tfont-size: 100%; /* 1 */\n\tline-height: 1.15; /* 1 */\n\tmargin: 0; /* 2 */\n}\n\n/**\nRemove the inheritance of text transform in Edge and Firefox.\n1. Remove the inheritance of text transform in Firefox.\n*/\n\nbutton,\nselect { /* 1 */\n\ttext-transform: none;\n}\n\n/**\nCorrect the inability to style clickable types in iOS and Safari.\n*/\n\nbutton,\n[type='button'],\n[type='reset'],\n[type='submit'] {\n\t-webkit-appearance: button;\n}\n\n/**\nRemove the inner border and padding in Firefox.\n*/\n\n::-moz-focus-inner {\n\tborder-style: none;\n\tpadding: 0;\n}\n\n/**\nRestore the focus styles unset by the previous rule.\n*/\n\n:-moz-focusring {\n\toutline: 1px dotted ButtonText;\n}\n\n/**\nRemove the additional ':invalid' styles in Firefox.\nSee: https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737\n*/\n\n:-moz-ui-invalid {\n\tbox-shadow: none;\n}\n\n/**\nRemove the padding so developers are not caught out when they zero out 'fieldset' elements in all browsers.\n*/\n\nlegend {\n\tpadding: 0;\n}\n\n/**\nAdd the correct vertical alignment in Chrome and Firefox.\n*/\n\nprogress {\n\tvertical-align: baseline;\n}\n\n/**\nCorrect the cursor style of increment and decrement buttons in Safari.\n*/\n\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n\theight: auto;\n}\n\n/**\n1. Correct the odd appearance in Chrome and Safari.\n2. Correct the outline style in Safari.\n*/\n\n[type='search'] {\n\t-webkit-appearance: textfield; /* 1 */\n\toutline-offset: -2px; /* 2 */\n}\n\n/**\nRemove the inner padding in Chrome and Safari on macOS.\n*/\n\n::-webkit-search-decoration {\n\t-webkit-appearance: none;\n}\n\n/**\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Change font properties to 'inherit' in Safari.\n*/\n\n::-webkit-file-upload-button {\n\t-webkit-appearance: button; /* 1 */\n\tfont: inherit; /* 2 */\n}\n\n/*\nInteractive\n===========\n*/\n\n/*\nAdd the correct display in Chrome and Safari.\n*/\n\nsummary {\n\tdisplay: list-item;\n}\n","/**\n * Manually forked from SUIT CSS Base: https://github.com/suitcss/base\n * A thin layer on top of normalize.css that provides a starting point more\n * suitable for web applications.\n */\n\n/**\n * Removes the default spacing and border for appropriate elements.\n */\n\nblockquote,\ndl,\ndd,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\nhr,\nfigure,\np,\npre {\n margin: 0;\n}\n\nbutton {\n background-color: transparent;\n background-image: none;\n}\n\nfieldset {\n margin: 0;\n padding: 0;\n}\n\nol,\nul {\n list-style: none;\n margin: 0;\n padding: 0;\n}\n\n/**\n * Tailwind custom reset styles\n */\n\n/**\n * 1. Use the user's configured `sans` font-family (with Tailwind's default\n * sans-serif font stack as a fallback) as a sane default.\n * 2. Use Tailwind's default \"normal\" line-height so the user isn't forced\n * to override it to ensure consistency even when using the default theme.\n */\n\nhtml {\n font-family: theme('fontFamily.sans', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, \"Noto Sans\", sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\"); /* 1 */\n line-height: 1.5; /* 2 */\n}\n\n\n/**\n * Inherit font-family and line-height from `html` so users can set them as\n * a class directly on the `html` element.\n */\n\nbody {\n font-family: inherit;\n line-height: inherit;\n}\n\n/**\n * 1. Prevent padding and border from affecting element width.\n *\n * We used to set this in the html element and inherit from\n * the parent element for everything else. This caused issues\n * in shadow-dom-enhanced elements like
where the content\n * is wrapped by a div with box-sizing set to `content-box`.\n *\n * https://github.com/mozdevs/cssremedy/issues/4\n *\n *\n * 2. Allow adding a border to an element by just adding a border-width.\n *\n * By default, the way the browser specifies that an element should have no\n * border is by setting it's border-style to `none` in the user-agent\n * stylesheet.\n *\n * In order to easily add borders to elements by just setting the `border-width`\n * property, we change the default border-style for all elements to `solid`, and\n * use border-width to hide them instead. This way our `border` utilities only\n * need to set the `border-width` property instead of the entire `border`\n * shorthand, making our border utilities much more straightforward to compose.\n *\n * https://github.com/tailwindcss/tailwindcss/pull/116\n */\n\n*,\n::before,\n::after {\n box-sizing: border-box; /* 1 */\n border-width: 0; /* 2 */\n border-style: solid; /* 2 */\n border-color: currentColor; /* 2 */\n}\n\n/*\n * Ensure horizontal rules are visible by default\n */\n\nhr {\n border-top-width: 1px;\n}\n\n/**\n * Undo the `border-style: none` reset that Normalize applies to images so that\n * our `border-{width}` utilities have the expected effect.\n *\n * The Normalize reset is unnecessary for us since we default the border-width\n * to 0 on all elements.\n *\n * https://github.com/tailwindcss/tailwindcss/issues/362\n */\n\nimg {\n border-style: solid;\n}\n\ntextarea {\n resize: vertical;\n}\n\ninput::placeholder,\ntextarea::placeholder {\n opacity: 1;\n color: theme('colors.gray.400', #a1a1aa);\n}\n\nbutton,\n[role=\"button\"] {\n cursor: pointer;\n}\n\n/**\n * Override legacy focus reset from Normalize with modern Firefox focus styles.\n *\n * This is actually an improvement over the new defaults in Firefox in our testing,\n * as it triggers the better focus styles even for links, which still use a dotted\n * outline in Firefox by default.\n */\n \n:-moz-focusring {\n\toutline: auto;\n}\n\ntable {\n border-collapse: collapse;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n font-size: inherit;\n font-weight: inherit;\n}\n\n/**\n * Reset links to optimize for opt-in styling instead of\n * opt-out.\n */\n\na {\n color: inherit;\n text-decoration: inherit;\n}\n\n/**\n * Reset form element properties that are easy to forget to\n * style explicitly so you don't inadvertently introduce\n * styles that deviate from your design system. These styles\n * supplement a partial reset that is already applied by\n * normalize.css.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n padding: 0;\n line-height: inherit;\n color: inherit;\n}\n\n/**\n * Use the configured 'mono' font family for elements that\n * are expected to be rendered with a monospace font, falling\n * back to the system monospace stack if there is no configured\n * 'mono' font family.\n */\n\npre,\ncode,\nkbd,\nsamp {\n font-family: theme('fontFamily.mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace);\n}\n\n/**\n * 1. Make replaced elements `display: block` by default as that's\n * the behavior you want almost all of the time. Inspired by\n * CSS Remedy, with `svg` added as well.\n *\n * https://github.com/mozdevs/cssremedy/issues/14\n * \n * 2. Add `vertical-align: middle` to align replaced elements more\n * sensibly by default when overriding `display` by adding a\n * utility like `inline`.\n *\n * This can trigger a poorly considered linting error in some\n * tools but is included by design.\n * \n * https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210\n */\n\nimg,\nsvg,\nvideo,\ncanvas,\naudio,\niframe,\nembed,\nobject {\n display: block; /* 1 */\n vertical-align: middle; /* 2 */\n}\n\n/**\n * Constrain images and videos to the parent width and preserve\n * their intrinsic aspect ratio.\n *\n * https://github.com/mozdevs/cssremedy/issues/14\n */\n\nimg,\nvideo {\n max-width: 100%;\n height: auto;\n}\n\n/**\n * Ensure the default browser behavior of the `hidden` attribute.\n */\n\n[hidden] {\n display: none;\n}\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/packages/admin/dist/app.js b/packages/admin/dist/app.js new file mode 100644 index 0000000000..369a53a214 --- /dev/null +++ b/packages/admin/dist/app.js @@ -0,0 +1,49 @@ +(()=>{var t,e={757:(t,e,n)=>{t.exports=n(666)},351:(t,e,n)=>{"use strict";var i,r,o,a,s=Object.create,u=Object.defineProperty,l=Object.getPrototypeOf,c=Object.prototype.hasOwnProperty,h=Object.getOwnPropertyNames,d=Object.getOwnPropertyDescriptor,f=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),p=f((t=>{function e(t,e){const n=Object.create(null),i=t.split(",");for(let t=0;t!!n[t.toLowerCase()]:t=>!!n[t]}Object.defineProperty(t,"__esModule",{value:!0});var i={1:"TEXT",2:"CLASS",4:"STYLE",8:"PROPS",16:"FULL_PROPS",32:"HYDRATE_EVENTS",64:"STABLE_FRAGMENT",128:"KEYED_FRAGMENT",256:"UNKEYED_FRAGMENT",512:"NEED_PATCH",1024:"DYNAMIC_SLOTS",2048:"DEV_ROOT_FRAGMENT",[-1]:"HOISTED",[-2]:"BAIL"},r={1:"STABLE",2:"DYNAMIC",3:"FORWARDED"},o=e("Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt");var a="itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly",s=e(a),u=e(a+",async,autofocus,autoplay,controls,default,defer,disabled,hidden,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected"),l=/[>/="'\u0009\u000a\u000c\u0020]/,c={};var h=e("animation-iteration-count,border-image-outset,border-image-slice,border-image-width,box-flex,box-flex-group,box-ordinal-group,column-count,columns,flex,flex-grow,flex-positive,flex-shrink,flex-negative,flex-order,grid-row,grid-row-end,grid-row-span,grid-row-start,grid-column,grid-column-end,grid-column-span,grid-column-start,font-weight,line-clamp,line-height,opacity,order,orphans,tab-size,widows,z-index,zoom,fill-opacity,flood-opacity,stop-opacity,stroke-dasharray,stroke-dashoffset,stroke-miterlimit,stroke-opacity,stroke-width"),d=e("accept,accept-charset,accesskey,action,align,allow,alt,async,autocapitalize,autocomplete,autofocus,autoplay,background,bgcolor,border,buffered,capture,challenge,charset,checked,cite,class,code,codebase,color,cols,colspan,content,contenteditable,contextmenu,controls,coords,crossorigin,csp,data,datetime,decoding,default,defer,dir,dirname,disabled,download,draggable,dropzone,enctype,enterkeyhint,for,form,formaction,formenctype,formmethod,formnovalidate,formtarget,headers,height,hidden,high,href,hreflang,http-equiv,icon,id,importance,integrity,ismap,itemprop,keytype,kind,label,lang,language,loading,list,loop,low,manifest,max,maxlength,minlength,media,min,multiple,muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,preload,radiogroup,readonly,referrerpolicy,rel,required,reversed,rows,rowspan,sandbox,scope,scoped,selected,shape,size,sizes,slot,span,spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,target,title,translate,type,usemap,value,width,wrap");var f=/;(?![^(]*\))/g,p=/:(.+)/;function g(t){const e={};return t.split(f).forEach((t=>{if(t){const n=t.split(p);n.length>1&&(e[n[0].trim()]=n[1].trim())}})),e}var m=e("html,body,base,head,link,meta,style,title,address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot"),v=e("svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistanceLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view"),y=e("area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr"),b=/["'&<>]/;var _=/^-?>||--!>|I(e)?{[`Map(${e.size})`]:[...e.entries()].reduce(((t,[e,n])=>(t[`${e} =>`]=n,t)),{})}:O(e)?{[`Set(${e.size})`]:[...e.values()]}:!P(e)||S(e)||N(e)?e:String(e),D=Object.freeze({}),w=Object.freeze([]),k=/^on[^a-z]/,T=Object.assign,C=Object.prototype.hasOwnProperty,S=Array.isArray,I=t=>"[object Map]"===B(t),O=t=>"[object Set]"===B(t),R=t=>t instanceof Date,M=t=>"function"==typeof t,L=t=>"string"==typeof t,P=t=>null!==t&&"object"==typeof t,F=Object.prototype.toString,B=t=>F.call(t),N=t=>"[object Object]"===B(t),j=e(",key,ref,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),V=t=>{const e=Object.create(null);return n=>e[n]||(e[n]=t(n))},z=/-(\w)/g,G=V((t=>t.replace(z,((t,e)=>e?e.toUpperCase():"")))),U=/\B([A-Z])/g,W=V((t=>t.replace(U,"-$1").toLowerCase())),H=V((t=>t.charAt(0).toUpperCase()+t.slice(1))),q=V((t=>t?`on${H(t)}`:""));t.EMPTY_ARR=w,t.EMPTY_OBJ=D,t.NO=()=>!1,t.NOOP=()=>{},t.PatchFlagNames=i,t.babelParserDefaultPlugins=["bigInt","optionalChaining","nullishCoalescingOperator"],t.camelize=G,t.capitalize=H,t.def=(t,e,n)=>{Object.defineProperty(t,e,{configurable:!0,enumerable:!1,value:n})},t.escapeHtml=function(t){const e=""+t,n=b.exec(e);if(!n)return e;let i,r,o="",a=0;for(r=n.index;r=e){for(let a=t-2;a<=t+2||n>r;a++){if(a<0||a>=i.length)continue;const s=a+1;o.push(`${s}${" ".repeat(Math.max(3-String(s).length,0))}| ${i[a]}`);const u=i[a].length;if(a===t){const t=e-(r-u)+1,i=Math.max(1,n>r?u-t:n-e);o.push(" | "+" ".repeat(t)+"^".repeat(i))}else if(a>t){if(n>r){const t=Math.max(Math.min(n-r,u),1);o.push(" | "+"^".repeat(t))}r+=u+1}}break}return o.join("\n")},t.getGlobalThis=()=>x||(x="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:void 0!==n.g?n.g:{}),t.hasChanged=(t,e)=>t!==e&&(t==t||e==e),t.hasOwn=(t,e)=>C.call(t,e),t.hyphenate=W,t.invokeArrayFns=(t,e)=>{for(let n=0;nL(t)&&"NaN"!==t&&"-"!==t[0]&&""+parseInt(t,10)===t,t.isKnownAttr=d,t.isMap=I,t.isModelListener=t=>t.startsWith("onUpdate:"),t.isNoUnitNumericStyleProp=h,t.isObject=P,t.isOn=t=>k.test(t),t.isPlainObject=N,t.isPromise=t=>P(t)&&M(t.then)&&M(t.catch),t.isReservedProp=j,t.isSSRSafeAttrName=function(t){if(c.hasOwnProperty(t))return c[t];const e=l.test(t);return e&&console.error(`unsafe attribute name: ${t}`),c[t]=!e},t.isSVGTag=v,t.isSet=O,t.isSpecialBooleanAttr=s,t.isString=L,t.isSymbol=t=>"symbol"==typeof t,t.isVoidTag=y,t.looseEqual=E,t.looseIndexOf=function(t,e){return t.findIndex((t=>E(t,e)))},t.makeMap=e,t.normalizeClass=function t(e){let n="";if(L(e))n=e;else if(S(e))for(let i=0;i{const n=t.indexOf(e);n>-1&&t.splice(n,1)},t.slotFlagsText=r,t.stringifyStyle=function(t){let e="";if(!t)return e;for(const n in t){const i=t[n],r=n.startsWith("--")?n:W(n);(L(i)||"number"==typeof i&&h(r))&&(e+=`${r}:${i};`)}return e},t.toDisplayString=t=>null==t?"":P(t)?JSON.stringify(t,A,2):String(t),t.toHandlerKey=q,t.toNumber=t=>{const e=parseFloat(t);return isNaN(e)?t:e},t.toRawType=t=>B(t).slice(8,-1),t.toTypeString=B})),g=f(((t,e)=>{e.exports=p()})),m=f((t=>{Object.defineProperty(t,"__esModule",{value:!0});var e,n=g(),i=new WeakMap,r=[],o=Symbol("iterate"),a=Symbol("Map key iterate");function s(t,i=n.EMPTY_OBJ){(function(t){return t&&!0===t._isEffect})(t)&&(t=t.raw);const o=function(t,n){const i=function(){if(!i.active)return t();if(!r.includes(i)){l(i);try{return f(),r.push(i),e=i,t()}finally{r.pop(),p(),e=r[r.length-1]}}};return i.id=u++,i.allowRecurse=!!n.allowRecurse,i._isEffect=!0,i.active=!0,i.raw=t,i.deps=[],i.options=n,i}(t,i);return i.lazy||o(),o}var u=0;function l(t){const{deps:e}=t;if(e.length){for(let n=0;n{t&&t.forEach((t=>{(t!==e||t.allowRecurse)&&d.add(t)}))};if("clear"===r)h.forEach(f);else if("length"===s&&n.isArray(t))h.forEach(((t,e)=>{("length"===e||e>=u)&&f(t)}));else switch(void 0!==s&&f(h.get(s)),r){case"add":n.isArray(t)?n.isIntegerKey(s)&&f(h.get("length")):(f(h.get(o)),n.isMap(t)&&f(h.get(a)));break;case"delete":n.isArray(t)||(f(h.get(o)),n.isMap(t)&&f(h.get(a)));break;case"set":n.isMap(t)&&f(h.get(o))}d.forEach((e=>{e.options.onTrigger&&e.options.onTrigger({effect:e,target:t,key:s,type:r,newValue:u,oldValue:l,oldTarget:c}),e.options.scheduler?e.options.scheduler(e):e()}))}var y=n.makeMap("__proto__,__v_isRef,__isVue"),b=new Set(Object.getOwnPropertyNames(Symbol).map((t=>Symbol[t])).filter(n.isSymbol)),_=w(),E=w(!1,!0),x=w(!0),A=w(!0,!0),D={};function w(t=!1,e=!1){return function(i,r,o){if("__v_isReactive"===r)return!t;if("__v_isReadonly"===r)return t;if("__v_raw"===r&&o===(t?e?at:ot:e?rt:it).get(i))return i;const a=n.isArray(i);if(!t&&a&&n.hasOwn(D,r))return Reflect.get(D,r,o);const s=Reflect.get(i,r,o);if(n.isSymbol(r)?b.has(r):y(r))return s;if(t||m(i,"get",r),e)return s;if(gt(s)){return!a||!n.isIntegerKey(r)?s.value:s}return n.isObject(s)?t?ut(s):st(s):s}}["includes","indexOf","lastIndexOf"].forEach((t=>{const e=Array.prototype[t];D[t]=function(...t){const n=ft(this);for(let t=0,e=this.length;t{const e=Array.prototype[t];D[t]=function(...t){d();const n=e.apply(this,t);return p(),n}}));var k=C(),T=C(!0);function C(t=!1){return function(e,i,r,o){let a=e[i];if(!t&&(r=ft(r),a=ft(a),!n.isArray(e)&>(a)&&!gt(r)))return a.value=r,!0;const s=n.isArray(e)&&n.isIntegerKey(i)?Number(i)(console.warn(`Set operation on key "${String(e)}" failed: target is readonly.`,t),!0),deleteProperty:(t,e)=>(console.warn(`Delete operation on key "${String(e)}" failed: target is readonly.`,t),!0)},O=n.extend({},S,{get:E,set:T}),R=n.extend({},I,{get:A}),M=t=>n.isObject(t)?st(t):t,L=t=>n.isObject(t)?ut(t):t,P=t=>t,F=t=>Reflect.getPrototypeOf(t);function B(t,e,n=!1,i=!1){const r=ft(t=t.__v_raw),o=ft(e);e!==o&&!n&&m(r,"get",e),!n&&m(r,"get",o);const{has:a}=F(r),s=i?P:n?L:M;return a.call(r,e)?s(t.get(e)):a.call(r,o)?s(t.get(o)):void(t!==r&&t.get(e))}function N(t,e=!1){const n=this.__v_raw,i=ft(n),r=ft(t);return t!==r&&!e&&m(i,"has",t),!e&&m(i,"has",r),t===r?n.has(t):n.has(t)||n.has(r)}function j(t,e=!1){return t=t.__v_raw,!e&&m(ft(t),"iterate",o),Reflect.get(t,"size",t)}function V(t){t=ft(t);const e=ft(this);return F(e).has.call(e,t)||(e.add(t),v(e,"add",t,t)),this}function z(t,e){e=ft(e);const i=ft(this),{has:r,get:o}=F(i);let a=r.call(i,t);a?nt(i,r,t):(t=ft(t),a=r.call(i,t));const s=o.call(i,t);return i.set(t,e),a?n.hasChanged(e,s)&&v(i,"set",t,e,s):v(i,"add",t,e),this}function G(t){const e=ft(this),{has:n,get:i}=F(e);let r=n.call(e,t);r?nt(e,n,t):(t=ft(t),r=n.call(e,t));const o=i?i.call(e,t):void 0,a=e.delete(t);return r&&v(e,"delete",t,void 0,o),a}function U(){const t=ft(this),e=0!==t.size,i=n.isMap(t)?new Map(t):new Set(t),r=t.clear();return e&&v(t,"clear",void 0,void 0,i),r}function W(t,e){return function(n,i){const r=this,a=r.__v_raw,s=ft(a),u=e?P:t?L:M;return!t&&m(s,"iterate",o),a.forEach(((t,e)=>n.call(i,u(t),u(e),r)))}}function H(t,e,i){return function(...r){const s=this.__v_raw,u=ft(s),l=n.isMap(u),c="entries"===t||t===Symbol.iterator&&l,h="keys"===t&&l,d=s[t](...r),f=i?P:e?L:M;return!e&&m(u,"iterate",h?a:o),{next(){const{value:t,done:e}=d.next();return e?{value:t,done:e}:{value:c?[f(t[0]),f(t[1])]:f(t),done:e}},[Symbol.iterator](){return this}}}}function q(t){return function(...e){{const i=e[0]?`on key "${e[0]}" `:"";console.warn(`${n.capitalize(t)} operation ${i}failed: target is readonly.`,ft(this))}return"delete"!==t&&this}}var $={get(t){return B(this,t)},get size(){return j(this)},has:N,add:V,set:z,delete:G,clear:U,forEach:W(!1,!1)},Y={get(t){return B(this,t,!1,!0)},get size(){return j(this)},has:N,add:V,set:z,delete:G,clear:U,forEach:W(!1,!0)},X={get(t){return B(this,t,!0)},get size(){return j(this,!0)},has(t){return N.call(this,t,!0)},add:q("add"),set:q("set"),delete:q("delete"),clear:q("clear"),forEach:W(!0,!1)},K={get(t){return B(this,t,!0,!0)},get size(){return j(this,!0)},has(t){return N.call(this,t,!0)},add:q("add"),set:q("set"),delete:q("delete"),clear:q("clear"),forEach:W(!0,!0)};function Z(t,e){const i=e?t?K:Y:t?X:$;return(e,r,o)=>"__v_isReactive"===r?!t:"__v_isReadonly"===r?t:"__v_raw"===r?e:Reflect.get(n.hasOwn(i,r)&&r in e?i:e,r,o)}["keys","values","entries",Symbol.iterator].forEach((t=>{$[t]=H(t,!1,!1),X[t]=H(t,!0,!1),Y[t]=H(t,!1,!0),K[t]=H(t,!0,!0)}));var J={get:Z(!1,!1)},Q={get:Z(!1,!0)},tt={get:Z(!0,!1)},et={get:Z(!0,!0)};function nt(t,e,i){const r=ft(i);if(r!==i&&e.call(t,r)){const e=n.toRawType(t);console.warn(`Reactive ${e} contains both the raw and reactive versions of the same object${"Map"===e?" as keys":""}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.`)}}var it=new WeakMap,rt=new WeakMap,ot=new WeakMap,at=new WeakMap;function st(t){return t&&t.__v_isReadonly?t:lt(t,!1,S,J,it)}function ut(t){return lt(t,!0,I,tt,ot)}function lt(t,e,i,r,o){if(!n.isObject(t))return console.warn(`value cannot be made reactive: ${String(t)}`),t;if(t.__v_raw&&(!e||!t.__v_isReactive))return t;const a=o.get(t);if(a)return a;const s=(u=t).__v_skip||!Object.isExtensible(u)?0:function(t){switch(t){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}(n.toRawType(u));var u;if(0===s)return t;const l=new Proxy(t,2===s?r:i);return o.set(t,l),l}function ct(t){return ht(t)?ct(t.__v_raw):!(!t||!t.__v_isReactive)}function ht(t){return!(!t||!t.__v_isReadonly)}function dt(t){return ct(t)||ht(t)}function ft(t){return t&&ft(t.__v_raw)||t}var pt=t=>n.isObject(t)?st(t):t;function gt(t){return Boolean(t&&!0===t.__v_isRef)}function mt(t,e=!1){return gt(t)?t:new class{constructor(t,e=!1){this._rawValue=t,this._shallow=e,this.__v_isRef=!0,this._value=e?t:pt(t)}get value(){return m(ft(this),"get","value"),this._value}set value(t){n.hasChanged(ft(t),this._rawValue)&&(this._rawValue=t,this._value=this._shallow?t:pt(t),v(ft(this),"set","value",t))}}(t,e)}function vt(t){return gt(t)?t.value:t}var yt={get:(t,e,n)=>vt(Reflect.get(t,e,n)),set:(t,e,n,i)=>{const r=t[e];return gt(r)&&!gt(n)?(r.value=n,!0):Reflect.set(t,e,n,i)}};function bt(t,e){return gt(t[e])?t[e]:new class{constructor(t,e){this._object=t,this._key=e,this.__v_isRef=!0}get value(){return this._object[this._key]}set value(t){this._object[this._key]=t}}(t,e)}t.ITERATE_KEY=o,t.computed=function(t){let e,i;return n.isFunction(t)?(e=t,i=()=>{console.warn("Write operation failed: computed value is readonly")}):(e=t.get,i=t.set),new class{constructor(t,e,n){this._setter=e,this._dirty=!0,this.__v_isRef=!0,this.effect=s(t,{lazy:!0,scheduler:()=>{this._dirty||(this._dirty=!0,v(ft(this),"set","value"))}}),this.__v_isReadonly=n}get value(){const t=ft(this);return t._dirty&&(t._value=this.effect(),t._dirty=!1),m(t,"get","value"),t._value}set value(t){this._setter(t)}}(e,i,n.isFunction(t)||!t.set)},t.customRef=function(t){return new class{constructor(t){this.__v_isRef=!0;const{get:e,set:n}=t((()=>m(this,"get","value")),(()=>v(this,"set","value")));this._get=e,this._set=n}get value(){return this._get()}set value(t){this._set(t)}}(t)},t.effect=s,t.enableTracking=f,t.isProxy=dt,t.isReactive=ct,t.isReadonly=ht,t.isRef=gt,t.markRaw=function(t){return n.def(t,"__v_skip",!0),t},t.pauseTracking=d,t.proxyRefs=function(t){return ct(t)?t:new Proxy(t,yt)},t.reactive=st,t.readonly=ut,t.ref=function(t){return mt(t)},t.resetTracking=p,t.shallowReactive=function(t){return lt(t,!1,O,Q,rt)},t.shallowReadonly=function(t){return lt(t,!0,R,et,at)},t.shallowRef=function(t){return mt(t,!0)},t.stop=function(t){t.active&&(l(t),t.options.onStop&&t.options.onStop(),t.active=!1)},t.toRaw=ft,t.toRef=bt,t.toRefs=function(t){dt(t)||console.warn("toRefs() expects a reactive object but received a plain one.");const e=n.isArray(t)?new Array(t.length):{};for(const n in t)e[n]=bt(t,n);return e},t.track=m,t.trigger=v,t.triggerRef=function(t){v(ft(t),"set","value",t.value)},t.unref=vt})),v=f(((t,e)=>{e.exports=m()})),y=!1,b=!1,_=[];function E(t){!function(t){_.includes(t)||_.push(t);b||y||(y=!0,queueMicrotask(x))}(t)}function x(){y=!1,b=!0;for(let t=0;t<_.length;t++)_[t]();_.length=0,b=!1}var A=!0;function D(t){r=t}var w=[],k=[],T=[];function C(t,e){t._x_attributeCleanups&&Object.entries(t._x_attributeCleanups).forEach((([n,i])=>{(void 0===e||e.includes(n))&&(i.forEach((t=>t())),delete t._x_attributeCleanups[n])}))}var S=new MutationObserver(N),I=!1;function O(){S.observe(document,{subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0}),I=!0}function R(){(M=M.concat(S.takeRecords())).length&&!L&&(L=!0,queueMicrotask((()=>{N(M),M.length=0,L=!1}))),S.disconnect(),I=!1}var M=[],L=!1;function P(t){if(!I)return t();R();let e=t();return O(),e}var F=!1,B=[];function N(t){if(F)return void(B=B.concat(t));let e=[],n=[],i=new Map,r=new Map;for(let o=0;o1===t.nodeType&&e.push(t))),t[o].removedNodes.forEach((t=>1===t.nodeType&&n.push(t)))),"attributes"===t[o].type)){let e=t[o].target,n=t[o].attributeName,a=t[o].oldValue,s=()=>{i.has(e)||i.set(e,[]),i.get(e).push({name:n,value:e.getAttribute(n)})},u=()=>{r.has(e)||r.set(e,[]),r.get(e).push(n)};e.hasAttribute(n)&&null===a?s():e.hasAttribute(n)?(u(),s()):u()}r.forEach(((t,e)=>{C(e,t)})),i.forEach(((t,e)=>{w.forEach((n=>n(e,t)))}));for(let t of e)n.includes(t)||T.forEach((e=>e(t)));for(let t of n)e.includes(t)||k.forEach((e=>e(t)));e=null,n=null,i=null,r=null}function j(t,e,n){return t._x_dataStack=[e,...z(n||t)],()=>{t._x_dataStack=t._x_dataStack.filter((t=>t!==e))}}function V(t,e){let n=t._x_dataStack[0];Object.entries(e).forEach((([t,e])=>{n[t]=e}))}function z(t){return t._x_dataStack?t._x_dataStack:"function"==typeof ShadowRoot&&t instanceof ShadowRoot?z(t.host):t.parentNode?z(t.parentNode):[]}function G(t){let e=new Proxy({},{ownKeys:()=>Array.from(new Set(t.flatMap((t=>Object.keys(t))))),has:(e,n)=>t.some((t=>t.hasOwnProperty(n))),get:(n,i)=>(t.find((t=>{if(t.hasOwnProperty(i)){let n=Object.getOwnPropertyDescriptor(t,i);if(n.get&&n.get._x_alreadyBound||n.set&&n.set._x_alreadyBound)return!0;if((n.get||n.set)&&n.enumerable){let r=n.get,o=n.set,a=n;r=r&&r.bind(e),o=o&&o.bind(e),r&&(r._x_alreadyBound=!0),o&&(o._x_alreadyBound=!0),Object.defineProperty(t,i,{...a,get:r,set:o})}return!0}return!1}))||{})[i],set:(e,n,i)=>{let r=t.find((t=>t.hasOwnProperty(n)));return r?r[n]=i:t[t.length-1][n]=i,!0}});return e}function U(t){let e=(n,i="")=>{Object.entries(Object.getOwnPropertyDescriptors(n)).forEach((([r,{value:o,enumerable:a}])=>{if(!1===a||void 0===o)return;let s=""===i?r:`${i}.${r}`;var u;"object"==typeof o&&null!==o&&o._x_interceptor?n[r]=o.initialize(t,s,r):"object"!=typeof(u=o)||Array.isArray(u)||null===u||o===n||o instanceof Element||e(o,s)}))};return e(t)}function W(t,e=(()=>{})){let n={initialValue:void 0,_x_interceptor:!0,initialize(e,n,i){return t(this.initialValue,(()=>function(t,e){return e.split(".").reduce(((t,e)=>t[e]),t)}(e,n)),(t=>H(e,n,t)),n,i)}};return e(n),t=>{if("object"==typeof t&&null!==t&&t._x_interceptor){let e=n.initialize.bind(n);n.initialize=(i,r,o)=>{let a=t.initialize(i,r,o);return n.initialValue=a,e(i,r,o)}}else n.initialValue=t;return n}}function H(t,e,n){if("string"==typeof e&&(e=e.split(".")),1!==e.length){if(0===e.length)throw error;return t[e[0]]||(t[e[0]]={}),H(t[e[0]],e.slice(1),n)}t[e[0]]=n}var q={};function $(t,e){q[t]=e}function Y(t,e){return Object.entries(q).forEach((([n,i])=>{Object.defineProperty(t,`$${n}`,{get:()=>i(e,{Alpine:Jt,interceptor:W}),enumerable:!1})})),t}function X(t,e,n,...i){try{return n(...i)}catch(n){K(n,t,e)}}function K(t,e,n){Object.assign(t,{el:e,expression:n}),console.warn(`Alpine Expression Error: ${t.message}\n\n${n?'Expression: "'+n+'"\n\n':""}`,e),setTimeout((()=>{throw t}),0)}function Z(t,e,n={}){let i;return J(t,e)((t=>i=t),n),i}function J(...t){return Q(...t)}var Q=tt;function tt(t,e){let n={};Y(n,t);let i=[n,...z(t)];if("function"==typeof e)return function(t,e){return(n=(()=>{}),{scope:i={},params:r=[]}={})=>{nt(n,e.apply(G([i,...t]),r))}}(i,e);let r=function(t,e,n){let i=function(t,e){if(et[t])return et[t];let n=Object.getPrototypeOf((async function(){})).constructor,i=/^[\n\s]*if.*\(.*\)/.test(t)||/^(let|const)\s/.test(t)?`(() => { ${t} })()`:t;let r=(()=>{try{return new n(["__self","scope"],`with (scope) { __self.result = ${i} }; __self.finished = true; return __self.result;`)}catch(n){return K(n,e,t),Promise.resolve()}})();return et[t]=r,r}(e,n);return(r=(()=>{}),{scope:o={},params:a=[]}={})=>{i.result=void 0,i.finished=!1;let s=G([o,...t]);if("function"==typeof i){let t=i(i,s).catch((t=>K(t,n,e)));i.finished?nt(r,i.result,s,a,n):t.then((t=>{nt(r,t,s,a,n)})).catch((t=>K(t,n,e)))}}}(i,e,t);return X.bind(null,t,e,r)}var et={};function nt(t,e,n,i,r){if("function"==typeof e){let o=e.apply(n,i);o instanceof Promise?o.then((e=>nt(t,e,n,i))).catch((t=>K(t,r,e))):t(o)}else t(e)}var it="x-";function rt(t=""){return it+t}var ot={};function at(t,e){ot[t]=e}function st(t,e,n){let i={},a=Array.from(e).map(dt(((t,e)=>i[t]=e))).filter(gt).map(function(t,e){return({name:n,value:i})=>{let r=n.match(mt()),o=n.match(/:([a-zA-Z0-9\-:]+)/),a=n.match(/\.[^.\]]+(?=[^\]]*$)/g)||[],s=e||t[n]||n;return{type:r?r[1]:null,value:o?o[1]:null,modifiers:a.map((t=>t.replace(".",""))),expression:i,original:s}}}(i,n)).sort(bt);return a.map((e=>function(t,e){let n=()=>{},i=ot[e.type]||n,a=[],s=t=>a.push(t),[u,l]=function(t){let e=()=>{};return[n=>{let i=r(n);t._x_effects||(t._x_effects=new Set,t._x_runEffects=()=>{t._x_effects.forEach((t=>t()))}),t._x_effects.add(i),e=()=>{void 0!==i&&(t._x_effects.delete(i),o(i))}},()=>{e()}]}(t);a.push(l);let c={Alpine:Jt,effect:u,cleanup:s,evaluateLater:J.bind(J,t),evaluate:Z.bind(Z,t)},h=()=>a.forEach((t=>t()));!function(t,e,n){t._x_attributeCleanups||(t._x_attributeCleanups={}),t._x_attributeCleanups[e]||(t._x_attributeCleanups[e]=[]),t._x_attributeCleanups[e].push(n)}(t,e.original,h);let d=()=>{t._x_ignore||t._x_ignoreSelf||(i.inline&&i.inline(t,e,c),i=i.bind(i,t,e,c),ut?lt.get(ct).push(i):i())};return d.runCleanups=h,d}(t,e)))}var ut=!1,lt=new Map,ct=Symbol();var ht=(t,e)=>({name:n,value:i})=>(n.startsWith(t)&&(n=n.replace(t,e)),{name:n,value:i});function dt(t=(()=>{})){return({name:e,value:n})=>{let{name:i,value:r}=ft.reduce(((t,e)=>e(t)),{name:e,value:n});return i!==e&&t(i,e),{name:i,value:r}}}var ft=[];function pt(t){ft.push(t)}function gt({name:t}){return mt().test(t)}var mt=()=>new RegExp(`^${it}([^:^.]+)\\b`);var vt="DEFAULT",yt=["ignore","ref","data","bind","init","for","model","transition","show","if",vt,"element"];function bt(t,e){let n=-1===yt.indexOf(t.type)?vt:t.type,i=-1===yt.indexOf(e.type)?vt:e.type;return yt.indexOf(n)-yt.indexOf(i)}function _t(t,e,n={}){t.dispatchEvent(new CustomEvent(e,{detail:n,bubbles:!0,composed:!0,cancelable:!0}))}var Et=[],xt=!1;function At(t){Et.push(t),queueMicrotask((()=>{xt||setTimeout((()=>{Dt()}))}))}function Dt(){for(xt=!1;Et.length;)Et.shift()()}function wt(t,e){if("function"==typeof ShadowRoot&&t instanceof ShadowRoot)return void Array.from(t.children).forEach((t=>wt(t,e)));let n=!1;if(e(t,(()=>n=!0)),n)return;let i=t.firstElementChild;for(;i;)wt(i,e),i=i.nextElementSibling}function kt(t,...e){console.warn(`Alpine Warning: ${t}`,...e)}var Tt=[],Ct=[];function St(){return Tt.map((t=>t()))}function It(){return Tt.concat(Ct).map((t=>t()))}function Ot(t){Tt.push(t)}function Rt(t,e=!1){if(!t)return;return(e?It():St()).some((e=>t.matches(e)))?t:t.parentElement?Rt(t.parentElement,e):void 0}function Mt(t,e=wt){!function(t){ut=!0;let e=Symbol();ct=e,lt.set(e,[]);let n=()=>{for(;lt.get(e).length;)lt.get(e).shift()();lt.delete(e)};t(n),ut=!1,n()}((()=>{e(t,((t,e)=>{st(t,t.attributes).forEach((t=>t())),t._x_ignore&&e()}))}))}function Lt(t,e){return Array.isArray(e)?Pt(t,e.join(" ")):"object"==typeof e&&null!==e?function(t,e){let n=t=>t.split(" ").filter(Boolean),i=Object.entries(e).flatMap((([t,e])=>!!e&&n(t))).filter(Boolean),r=Object.entries(e).flatMap((([t,e])=>!e&&n(t))).filter(Boolean),o=[],a=[];return r.forEach((e=>{t.classList.contains(e)&&(t.classList.remove(e),a.push(e))})),i.forEach((e=>{t.classList.contains(e)||(t.classList.add(e),o.push(e))})),()=>{a.forEach((e=>t.classList.add(e))),o.forEach((e=>t.classList.remove(e)))}}(t,e):"function"==typeof e?Lt(t,e()):Pt(t,e)}function Pt(t,e){return e=!0===e?e="":e||"",n=e.split(" ").filter((e=>!t.classList.contains(e))).filter(Boolean),t.classList.add(...n),()=>{t.classList.remove(...n)};var n}function Ft(t,e){return"object"==typeof e&&null!==e?function(t,e){let n={};return Object.entries(e).forEach((([e,i])=>{n[e]=t.style[e],t.style.setProperty(e.replace(/([a-z])([A-Z])/g,"$1-$2").toLowerCase(),i)})),setTimeout((()=>{0===t.style.length&&t.removeAttribute("style")})),()=>{Ft(t,n)}}(t,e):function(t,e){let n=t.getAttribute("style",e);return t.setAttribute("style",e),()=>{t.setAttribute("style",n)}}(t,e)}function Bt(t,e=(()=>{})){let n=!1;return function(){n?e.apply(this,arguments):(n=!0,t.apply(this,arguments))}}function Nt(t,e,n={}){t._x_transition||(t._x_transition={enter:{during:n,start:n,end:n},leave:{during:n,start:n,end:n},in(n=(()=>{}),i=(()=>{})){Vt(t,e,{during:this.enter.during,start:this.enter.start,end:this.enter.end},n,i)},out(n=(()=>{}),i=(()=>{})){Vt(t,e,{during:this.leave.during,start:this.leave.start,end:this.leave.end},n,i)}})}function jt(t){let e=t.parentNode;if(e)return e._x_hidePromise?e:jt(e)}function Vt(t,e,{during:n,start:i,end:r}={},o=(()=>{}),a=(()=>{})){if(t._x_transitioning&&t._x_transitioning.cancel(),0===Object.keys(n).length&&0===Object.keys(i).length&&0===Object.keys(r).length)return o(),void a();let s,u,l;!function(t,e){let n,i,r,o=Bt((()=>{P((()=>{n=!0,i||e.before(),r||(e.end(),Dt()),e.after(),t.isConnected&&e.cleanup(),delete t._x_transitioning}))}));t._x_transitioning={beforeCancels:[],beforeCancel(t){this.beforeCancels.push(t)},cancel:Bt((function(){for(;this.beforeCancels.length;)this.beforeCancels.shift()();o()})),finish:o},P((()=>{e.start(),e.during()})),xt=!0,requestAnimationFrame((()=>{if(n)return;let o=1e3*Number(getComputedStyle(t).transitionDuration.replace(/,.*/,"").replace("s","")),a=1e3*Number(getComputedStyle(t).transitionDelay.replace(/,.*/,"").replace("s",""));0===o&&(o=1e3*Number(getComputedStyle(t).animationDuration.replace("s",""))),P((()=>{e.before()})),i=!0,requestAnimationFrame((()=>{n||(P((()=>{e.end()})),Dt(),setTimeout(t._x_transitioning.finish,o+a),r=!0)}))}))}(t,{start(){s=e(t,i)},during(){u=e(t,n)},before:o,end(){s(),l=e(t,r)},after:a,cleanup(){u(),l()}})}function zt(t,e,n){if(-1===t.indexOf(e))return n;const i=t[t.indexOf(e)+1];if(!i)return n;if("scale"===e&&isNaN(i))return n;if("duration"===e){let t=i.match(/([0-9]+)ms/);if(t)return t[1]}return"origin"===e&&["top","right","left","center","bottom"].includes(t[t.indexOf(e)+2])?[i,t[t.indexOf(e)+2]].join(" "):i}function Gt(t,e){var n;return function(){var i=this,r=arguments,o=function(){n=null,t.apply(i,r)};clearTimeout(n),n=setTimeout(o,e)}}function Ut(t,e){let n;return function(){let i=this,r=arguments;n||(t.apply(i,r),n=!0,setTimeout((()=>n=!1),e))}}at("transition",((t,{value:e,modifiers:n,expression:i},{evaluate:r})=>{"function"==typeof i&&(i=r(i)),i?function(t,e,n){Nt(t,Lt,""),{enter:e=>{t._x_transition.enter.during=e},"enter-start":e=>{t._x_transition.enter.start=e},"enter-end":e=>{t._x_transition.enter.end=e},leave:e=>{t._x_transition.leave.during=e},"leave-start":e=>{t._x_transition.leave.start=e},"leave-end":e=>{t._x_transition.leave.end=e}}[n](e)}(t,i,e):function(t,e,n){Nt(t,Ft);let i=!e.includes("in")&&!e.includes("out")&&!n,r=i||e.includes("in")||["enter"].includes(n),o=i||e.includes("out")||["leave"].includes(n);e.includes("in")&&!i&&(e=e.filter(((t,n)=>nn>e.indexOf("out"))));let a=!e.includes("opacity")&&!e.includes("scale"),s=a||e.includes("opacity"),u=a||e.includes("scale"),l=s?0:1,c=u?zt(e,"scale",95)/100:1,h=zt(e,"delay",0),d=zt(e,"origin","center"),f="opacity, transform",p=zt(e,"duration",150)/1e3,g=zt(e,"duration",75)/1e3,m="cubic-bezier(0.4, 0.0, 0.2, 1)";r&&(t._x_transition.enter.during={transformOrigin:d,transitionDelay:h,transitionProperty:f,transitionDuration:`${p}s`,transitionTimingFunction:m},t._x_transition.enter.start={opacity:l,transform:`scale(${c})`},t._x_transition.enter.end={opacity:1,transform:"scale(1)"});o&&(t._x_transition.leave.during={transformOrigin:d,transitionDelay:h,transitionProperty:f,transitionDuration:`${g}s`,transitionTimingFunction:m},t._x_transition.leave.start={opacity:1,transform:"scale(1)"},t._x_transition.leave.end={opacity:l,transform:`scale(${c})`})}(t,n,e)})),window.Element.prototype._x_toggleAndCascadeWithTransitions=function(t,e,n,i){let r=()=>{"visible"===document.visibilityState?requestAnimationFrame(n):setTimeout(n)};e?t._x_transition&&(t._x_transition.enter||t._x_transition.leave)?t._x_transition.enter&&(Object.entries(t._x_transition.enter.during).length||Object.entries(t._x_transition.enter.start).length||Object.entries(t._x_transition.enter.end).length)?t._x_transition.in(n):r():t._x_transition?t._x_transition.in(n):r():(t._x_hidePromise=t._x_transition?new Promise(((e,n)=>{t._x_transition.out((()=>{}),(()=>e(i))),t._x_transitioning.beforeCancel((()=>n({isFromCancelledTransition:!0})))})):Promise.resolve(i),queueMicrotask((()=>{let e=jt(t);e?(e._x_hideChildren||(e._x_hideChildren=[]),e._x_hideChildren.push(t)):queueMicrotask((()=>{let e=t=>{let n=Promise.all([t._x_hidePromise,...(t._x_hideChildren||[]).map(e)]).then((([t])=>t()));return delete t._x_hidePromise,delete t._x_hideChildren,n};e(t).catch((t=>{if(!t.isFromCancelledTransition)throw t}))}))})))};var Wt={},Ht=!1;var qt=!1;function $t(t,e=(()=>{})){return(...n)=>qt?e(...n):t(...n)}var Yt={};var Xt,Kt,Zt={get reactive(){return i},get release(){return o},get effect(){return r},get raw(){return a},version:"3.5.1",flushAndStopDeferringMutations:function(){F=!1,N(B),B=[]},disableEffectScheduling:function(t){A=!1,t(),A=!0},setReactivityEngine:function(t){i=t.reactive,o=t.release,r=e=>t.effect(e,{scheduler:t=>{A?E(t):t()}}),a=t.raw},skipDuringClone:$t,addRootSelector:Ot,deferMutations:function(){F=!0},mapAttributes:pt,evaluateLater:J,setEvaluator:function(t){Q=t},mergeProxies:G,closestRoot:Rt,interceptor:W,transition:Vt,setStyles:Ft,mutateDom:P,directive:at,throttle:Ut,debounce:Gt,evaluate:Z,initTree:Mt,nextTick:At,prefix:function(t){it=t},plugin:function(t){t(Jt)},magic:$,store:function(t,e){if(Ht||(Wt=i(Wt),Ht=!0),void 0===e)return Wt[t];Wt[t]=e,"object"==typeof e&&null!==e&&e.hasOwnProperty("init")&&"function"==typeof e.init&&Wt[t].init(),U(Wt[t])},start:function(){document.body||kt("Unable to initialize. Trying to load Alpine before `` is available. Did you forget to add `defer` in Alpine's ` +``` diff --git a/packages/admin/docs/09-upgrade-guide.md b/packages/admin/docs/09-upgrade-guide.md new file mode 100644 index 0000000000..762dd2f00a --- /dev/null +++ b/packages/admin/docs/09-upgrade-guide.md @@ -0,0 +1,455 @@ +--- +title: Upgrading from v1.x +--- + +> If you see anything missing from this guide, please do not hesitate to [make a pull request](https://github.com/laravel-filament/filament/edit/2.x/packages/admin/docs/09-upgrade-guide.md) to our repository! Any help is appreciated! + +## High impact changes + +### Property and method changes to resource and page classes + +
+ +Changes to Resource classes + + +The `Filament\Resources\Forms\Form` class has been renamed to `Filament\Resources\Form`. + +The `Filament\Resources\Tables\Table` class has been renamed to `Filament\Resources\Table`. + +The following properties and method signatures been updated: + +```php +protected static ?string $label; // Protected the property. Added the `?string` type. + +protected static ?string $model; // Protected the property. Added the `?string` type. + +protected static ?string $navigationIcon; // Renamed from `$icon`. Protected the property. Added the `?string` type. + +protected static ?string $navigationLabel; // Protected the property. Added the `?string` type. + +protected static ?int $navigationSort; // Protected the property. Added the `?int` type. + +protected static ?string $recordTitleAttribute; // Renamed from `$primaryColumn`. Protected the property. Added the `?string` type. + +protected static ?string $slug; // Protected the property. Added the `?string` type. + +public static function form(Form $form): Form; // Added the `Form` return type. + +public static function table(Table $table): Table; // Added the `Table` return type. + +public static function getRelations(): array; // Renamed from `relations()`. Added the `array` return type. + +public static function getPages(): array; // Renamed from `routes()`. Added the `array` return type. +``` + +The syntax for registering pages in `getPages()` (formerly `routes()`) has been updated: + +```php +public static function getPages(): array +{ + return [ + 'index' => Pages\ListUsers::route('/'), + 'create' => Pages\CreateUser::route('/create'), + 'edit' => Pages\EditUser::route('/{record}/edit'), + ]; +} +``` +
+ +
+ +Changes to List page classes + + +The following properties and method signatures been updated: + +```php +protected static string $resource; // Protected the property. Added the `string` type. +``` +
+ +
+ +Changes to Create page classes + + +The following properties and method signatures been updated: + +```php +protected static string $resource; // Protected the property. Added the `string` type. +``` +
+ +
+ +Changes to Edit page classes + + +The following properties and method signatures been updated: + +```php +protected static string $resource; // Protected the property. Added the `string` type. +``` +
+ +### Forms + +The entire `Filament\Resources\Forms` namespace has been moved to `Filament\Forms`. + +The `when()`, `only()` and `except()` methods have been removed. You may now pass a closure to any field configuration method, for example `hidden()`, which determines if the method should be applied. For more information, please see the [advanced forms documentation](/docs/forms/advanced#using-callback-customisation); + +#### Fields + +The `dependable()` method has been renamed to `reactive()`, to better describe its effects. + +The `helpMessage()` method has been renamed to `helperText()`. + +##### Checkbox + +The `stacked()` method has been removed, and replaced with `inline(false)`. + +##### Select + +The `emptyOptionsMessage()` method has been renamed to `searchPrompt()`. + +##### Tags input + +The tags input component now writes to a JSON array by default. To continue using the old behavior, use `separator(',')` method. + +##### Toggle + +The `stacked()` method has been removed, and replaced with `inline(false)`. + +#### Layout components + +##### Fieldset + +The form components within the fieldset now need to be in their own `schema()` method, instead of being passed into `make()`. + +##### Grid + +The form components within the grid now need to be in their own `schema()` method, instead of being passed into `make()`. + +##### Section + +The form components within the section now need to be in their own `schema()` method, instead of being passed into `make()`. + +##### Tabs + +The `Filament\Resources\Forms\Tab` component has been moved to `Filament\Forms\Tabs\Tab`. + +The form components within each tab now need to be in their own `schema()` method, instead of being passed into `make()`. + +### Tables + +The entire `Filament\Resources\Tables` namespace has been moved to `Filament\Tables`. + +The `only()` and `except()` methods have been removed. You may now pass a closure to any column or filter configuration method, which determines if the method should be applied. + +#### Columns + +Column class names now have `Column` at the end, for example `TextColumn` not `Text`. + +The `currency()` method has been renamed to `money()`. + +The `formatUsing()` method has been renamed to `formatStateUsing()`. It now accepts a `$state` parameter, instead of `$value`. + +The `getValueUsing()` method has been renamed to `getStateUsing()`. + +The `primary()` method has been removed from columns. All columns link to the record page by default unless another URL or action is specified for that column. + +#### Filters + +The filter class has been moved from `Filament\Resources\Tables\Filter` to `Filament\Tables\Filters\Filter`. + +Filters now have a dedicated `query()` method for applying the query, instead of using the second parameter of the `make()` method. For more information, check out the [table builder filters documentation](/docs/tables/filters). + +The `apply()` method of reusable filters must now have the following signature: + +```php +public function apply(Builder $query, array $data = []): Builder +{ + // ... +} +``` + +### Published configuration updates + +If you've published the v1.x `filament.php` configuration file, you should republish it: + +```bash +php artisan vendor:publish --tag=filament-config --force +``` + +If you had customized the `path`, `domain` or `default_filesystem_disk`, you should update the new file with these changes. If you're using `.env` variables for these settings, you won't need to make any changes when upgrading, and you may even choose to delete `filament.php`. + +### Users + +Filament v2.x does not include a dedicated `filament_users` table as it did in v1.x. By default, all `App\Models\User`s can access the admin panel locally, and in production you must apply the `FilamentUser` interface to the model to control admin access. You can read more about this [here](users). + +
+ +Recommended: Are you using the filament_users table, but would like to switch to App\Models\User? + + +First, you'll need to copy the old migrations to your app, to ensure that Laravel does not complain about them missing: + +
+ +database/migrations/0000_00_00_000000_create_filament_users_table.php + + +```php +id(); + $table->string('avatar')->nullable(); + $table->string('email')->unique(); + $table->string('name'); + $table->string('password'); + $table->rememberToken(); + $table->timestamps(); + }); + } + + public function down(): void + { + Schema::dropIfExists('filament_users'); + } +} +``` +
+ +
+ +database/migrations/0000_00_00_000001_create_filament_password_resets_table.php + + +```php +string('email')->index(); + $table->string('token'); + $table->timestamp('created_at')->nullable(); + }); + } + + public function down(): void + { + Schema::dropIfExists('filament_password_resets'); + } +} +``` +
+ +Create a migration to drop the `filament_users` and `filament_password_resets` tables: + +```php + + +
+ +Are you using the filament_users table, and would like to continue using it? + + +To keep the `filament_users` and `filament_password_resets` tables in your app, you'll need to copy the old migrations and model into your app. + +
+ +database/migrations/0000_00_00_000000_create_filament_users_table.php + + +```php +id(); + $table->string('avatar')->nullable(); + $table->string('email')->unique(); + $table->string('name'); + $table->string('password'); + $table->rememberToken(); + $table->timestamps(); + }); + } + + public function down(): void + { + Schema::dropIfExists('filament_users'); + } +} +``` +
+ +
+ +database/migrations/0000_00_00_000001_create_filament_password_resets_table.php + + +```php +string('email')->index(); + $table->string('token'); + $table->timestamp('created_at')->nullable(); + }); + } + + public function down(): void + { + Schema::dropIfExists('filament_password_resets'); + } +} +``` +
+ +
+ +app/Models/FilamentUser.php + + +```php +avatar; + } +} +``` +
+
+ +
+ +Are you already using App\Models\User? + + +1) Remove the `IsFilamentUser` trait from the model. +2) Remove the `$filamentUserColumn` property if you use them. Instead, control admin access with `canAccessFilament()`. +3) If you have a `canAccessFilament()` method, add a `bool` return type to it. +4) Remove the `$filamentAdminColumn` and `$filamentRolesColumn` properties, and `isFilamentAdmin()` method, if you use them. Filament now only uses policies for authorization, so you may implement whichever roles system you wish there. We recommend [`spatie/laravel-permission`](https://github.com/spatie/laravel-permission). +
+ +## Medium impact changes + +### Relation managers + +`HasMany` and `MorphMany` relation manager classes should now extend `Filament\Resources\RelationManagers\HasManyRelationManager`. `BelongsToMany` relation manager classes should now extend `Filament\Resources\RelationManagers\BelongsToManyRelationManager`. + +The `Filament\Resources\Forms\Form` class has been renamed to `Filament\Resources\Form`. + +The `Filament\Resources\Tables\Table` class has been renamed to `Filament\Resources\Table`. + +The following properties and method signatures been updated: + +```php +protected static ?string $inverseRelationship; // Protected the property. Added the `?string` type. + +protected static ?string $recordTitleAttribute; // Renamed from `$primaryColumn`. Protected the property. Added the `?string` type. + +protected static string $relationship; // Protected the property. Added the `string` type. +``` + +### `Filament\Filament` facade renamed to `Filament\Facades\Filament` + +You should be able to safely rename all instances of this class to the new one. + +### Roles + +Filament now only uses policies for authorization, so you may implement whichever roles system you wish there. We recommend [`spatie/laravel-permission`](https://github.com/spatie/laravel-permission). + +You may remove any roles from the `App\Filament\Roles` directory, and delete any `authorization()` methods on your resources. + +## Low impact changes + +### `Filament::ignoreMigrations()` method removed + +Since Filament doesn't have any migrations anymore, you don't need to ignore them. + +### Property changes to custom page classes + +The following properties and method signatures been updated: + +```php +protected static ?string $title; // Protected the property. Added the `?string` type. + +protected static ?string $navigationLabel; // Protected the property. Added the `?string` type. + +protected static ?string $slug; // Protected the property. Added the `?string` type. +``` + +### Theming changes + +The theming system has entirely changed, to add support for Tailwind JIT's opacity features, which don't support static color codes. + +Follow the instructions on the [appearance page](appearance#building-themes) to find out how to compile your own Filament stylesheet. diff --git a/packages/admin/resources/css/app.css b/packages/admin/resources/css/app.css new file mode 100644 index 0000000000..d22bebf221 --- /dev/null +++ b/packages/admin/resources/css/app.css @@ -0,0 +1,5 @@ +@import '../../../forms/dist/module.esm.css'; + +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/packages/admin/resources/js/app.js b/packages/admin/resources/js/app.js new file mode 100644 index 0000000000..9a090f2522 --- /dev/null +++ b/packages/admin/resources/js/app.js @@ -0,0 +1,29 @@ +import '../css/app.css' + +import Alpine from 'alpinejs' +import Chart from 'chart.js/auto' +import FormsAlpinePlugin from '../../../forms/dist/module.esm' +import Trap from '@alpinejs/trap' + +Alpine.plugin(FormsAlpinePlugin) +Alpine.plugin(Trap) + +Alpine.store('sidebar', { + isOpen: false, + + close() { + this.isOpen = false + }, + + open() { + this.isOpen = true + }, +}) + +Chart.defaults.font.family = `'DM Sans', sans-serif` +Chart.defaults.backgroundColor = '#737373' + +window.Alpine = Alpine +window.Chart = Chart + +Alpine.start() diff --git a/packages/admin/resources/lang/en/global-search.php b/packages/admin/resources/lang/en/global-search.php new file mode 100644 index 0000000000..b105e0e0e4 --- /dev/null +++ b/packages/admin/resources/lang/en/global-search.php @@ -0,0 +1,12 @@ + [ + 'label' => 'Global search', + 'placeholder' => 'Search', + ], + + 'no_results_message' => 'No search results found.', + +]; diff --git a/packages/admin/resources/lang/en/layout.php b/packages/admin/resources/lang/en/layout.php new file mode 100644 index 0000000000..c8398a5dfa --- /dev/null +++ b/packages/admin/resources/lang/en/layout.php @@ -0,0 +1,13 @@ + 'ltr', + + 'buttons' => [ + 'logout' => [ + 'label' => 'Sign out', + ], + ], + +]; diff --git a/packages/admin/resources/lang/en/login.php b/packages/admin/resources/lang/en/login.php new file mode 100644 index 0000000000..2675343f97 --- /dev/null +++ b/packages/admin/resources/lang/en/login.php @@ -0,0 +1,36 @@ + [ + + 'submit' => [ + 'label' => 'Sign in', + ], + + ], + + 'fields' => [ + + 'email' => [ + 'label' => 'Email address', + ], + + 'password' => [ + 'label' => 'Password', + ], + + 'remember' => [ + 'label' => 'Remember me', + ], + + ], + + 'messages' => [ + 'failed' => 'These credentials do not match our records.', + 'throttled' => 'Too many login attempts. Please try again in :seconds seconds.', + ], + + 'heading' => 'Sign in to your account', + +]; diff --git a/packages/admin/resources/lang/en/pages/dashboard.php b/packages/admin/resources/lang/en/pages/dashboard.php new file mode 100644 index 0000000000..7d0cd2d83c --- /dev/null +++ b/packages/admin/resources/lang/en/pages/dashboard.php @@ -0,0 +1,7 @@ + 'Dashboard', + +]; diff --git a/packages/admin/resources/lang/en/resources/pages/create-record.php b/packages/admin/resources/lang/en/resources/pages/create-record.php new file mode 100644 index 0000000000..62db30aa8e --- /dev/null +++ b/packages/admin/resources/lang/en/resources/pages/create-record.php @@ -0,0 +1,31 @@ + 'Create', + + 'form' => [ + + 'actions' => [ + + 'cancel' => [ + 'label' => 'Cancel', + ], + + 'create' => [ + 'label' => 'Create', + ], + + 'create_and_create_another' => [ + 'label' => 'Create & create another', + ], + + ], + + ], + + 'messages' => [ + 'created' => 'Created', + ], + +]; diff --git a/packages/admin/resources/lang/en/resources/pages/edit-record.php b/packages/admin/resources/lang/en/resources/pages/edit-record.php new file mode 100644 index 0000000000..9470f55cdd --- /dev/null +++ b/packages/admin/resources/lang/en/resources/pages/edit-record.php @@ -0,0 +1,65 @@ + 'Edit :record', + + 'breadcrumb' => 'Edit', + + 'actions' => [ + + 'delete' => [ + 'label' => 'Delete', + ], + + 'view' => [ + 'label' => 'View', + ], + + ], + + 'form' => [ + + 'actions' => [ + + 'cancel' => [ + 'label' => 'Cancel', + ], + + 'save' => [ + 'label' => 'Save', + ], + + ], + + ], + + 'messages' => [ + 'saved' => 'Saved', + ], + + 'modals' => [ + + 'delete' => [ + + 'heading' => 'Delete :record', + + 'subheading' => 'Are you sure you would like to do this?', + + 'buttons' => [ + + 'cancel' => [ + 'label' => 'Cancel', + ], + + 'delete' => [ + 'label' => 'Delete', + ], + + ], + + ], + + ], + +]; diff --git a/packages/admin/resources/lang/en/resources/pages/list-records.php b/packages/admin/resources/lang/en/resources/pages/list-records.php new file mode 100644 index 0000000000..3424b16554 --- /dev/null +++ b/packages/admin/resources/lang/en/resources/pages/list-records.php @@ -0,0 +1,31 @@ + 'List', + + 'table' => [ + + 'actions' => [ + + 'edit' => [ + 'label' => 'Edit', + ], + + 'view' => [ + 'label' => 'View', + ], + + ], + + 'bulk_actions' => [ + + 'delete' => [ + 'label' => 'Delete selected', + ], + + ], + + ], + +]; diff --git a/packages/admin/resources/lang/en/resources/pages/view-record.php b/packages/admin/resources/lang/en/resources/pages/view-record.php new file mode 100644 index 0000000000..0ae596be41 --- /dev/null +++ b/packages/admin/resources/lang/en/resources/pages/view-record.php @@ -0,0 +1,15 @@ + 'View', + + 'actions' => [ + + 'edit' => [ + 'label' => 'Edit', + ], + + ], + +]; diff --git a/packages/admin/resources/lang/en/resources/relation-managers/attach.php b/packages/admin/resources/lang/en/resources/relation-managers/attach.php new file mode 100644 index 0000000000..2e28648777 --- /dev/null +++ b/packages/admin/resources/lang/en/resources/relation-managers/attach.php @@ -0,0 +1,41 @@ + [ + + 'label' => 'Attach', + + 'modal' => [ + + 'heading' => 'Attach :label', + + 'fields' => [ + + 'record_ids' => [ + 'label' => 'Records', + ], + + ], + + 'actions' => [ + + 'attach' => [ + 'label' => 'Attach', + ], + + 'attach_and_attach_another' => [ + 'label' => 'Attach & attach another', + ], + + ], + + ], + + 'messages' => [ + 'attached' => 'Attached', + ], + + ], + +]; diff --git a/packages/admin/resources/lang/en/resources/relation-managers/create.php b/packages/admin/resources/lang/en/resources/relation-managers/create.php new file mode 100644 index 0000000000..ad6348dd7d --- /dev/null +++ b/packages/admin/resources/lang/en/resources/relation-managers/create.php @@ -0,0 +1,33 @@ + [ + + 'label' => 'Create', + + 'modal' => [ + + 'heading' => 'Create :label', + + 'actions' => [ + + 'create' => [ + 'label' => 'Create', + ], + + 'create_and_create_another' => [ + 'label' => 'Create & create another', + ], + + ], + + ], + + 'messages' => [ + 'created' => 'Created', + ], + + ], + +]; diff --git a/packages/admin/resources/lang/en/resources/relation-managers/delete.php b/packages/admin/resources/lang/en/resources/relation-managers/delete.php new file mode 100644 index 0000000000..64a97065af --- /dev/null +++ b/packages/admin/resources/lang/en/resources/relation-managers/delete.php @@ -0,0 +1,33 @@ + [ + + 'label' => 'Delete', + + 'modal' => [ + 'heading' => 'Delete :label', + ], + + 'messages' => [ + 'deleted' => 'Deleted', + ], + + ], + + 'bulk_action' => [ + + 'label' => 'Delete selected', + + 'modal' => [ + 'heading' => 'Delete selected :label', + ], + + 'messages' => [ + 'deleted' => 'Deleted', + ], + + ], + +]; diff --git a/packages/admin/resources/lang/en/resources/relation-managers/detach.php b/packages/admin/resources/lang/en/resources/relation-managers/detach.php new file mode 100644 index 0000000000..c274a9cc02 --- /dev/null +++ b/packages/admin/resources/lang/en/resources/relation-managers/detach.php @@ -0,0 +1,33 @@ + [ + + 'label' => 'Detach', + + 'modal' => [ + 'heading' => 'Detach :label', + ], + + 'messages' => [ + 'detached' => 'Detached', + ], + + ], + + 'bulk_action' => [ + + 'label' => 'Detach selected', + + 'modal' => [ + 'heading' => 'Detach selected :label', + ], + + 'messages' => [ + 'detached' => 'Detached', + ], + + ], + +]; diff --git a/packages/admin/resources/lang/en/resources/relation-managers/edit.php b/packages/admin/resources/lang/en/resources/relation-managers/edit.php new file mode 100644 index 0000000000..3838dbbb9a --- /dev/null +++ b/packages/admin/resources/lang/en/resources/relation-managers/edit.php @@ -0,0 +1,29 @@ + [ + + 'label' => 'Edit', + + 'modal' => [ + + 'heading' => 'Edit :label', + + 'actions' => [ + + 'save' => [ + 'label' => 'Save', + ], + + ], + + ], + + 'messages' => [ + 'saved' => 'Saved', + ], + + ], + +]; diff --git a/packages/admin/resources/lang/en/widgets/account-widget.php b/packages/admin/resources/lang/en/widgets/account-widget.php new file mode 100644 index 0000000000..c076976660 --- /dev/null +++ b/packages/admin/resources/lang/en/widgets/account-widget.php @@ -0,0 +1,15 @@ + [ + + 'logout' => [ + 'label' => 'Sign out', + ], + + ], + + 'welcome' => 'Welcome, :user', + +]; diff --git a/packages/admin/resources/lang/en/widgets/filament-info-widget.php b/packages/admin/resources/lang/en/widgets/filament-info-widget.php new file mode 100644 index 0000000000..766c93ec5e --- /dev/null +++ b/packages/admin/resources/lang/en/widgets/filament-info-widget.php @@ -0,0 +1,17 @@ + [ + + 'visit_documentation' => [ + 'label' => 'Documentation', + ], + + 'visit_github' => [ + 'label' => 'GitHub', + ], + + ], + +]; diff --git a/packages/admin/resources/views/components/actions/button-action.blade.php b/packages/admin/resources/views/components/actions/button-action.blade.php new file mode 100644 index 0000000000..e9f128cad8 --- /dev/null +++ b/packages/admin/resources/views/components/actions/button-action.blade.php @@ -0,0 +1,17 @@ +@php + $action = $getAction(); + $url = $getUrl(); +@endphp + + + {{ $getLabel() }} + diff --git a/packages/admin/resources/views/components/actions/index.blade.php b/packages/admin/resources/views/components/actions/index.blade.php new file mode 100644 index 0000000000..2db0b9d534 --- /dev/null +++ b/packages/admin/resources/views/components/actions/index.blade.php @@ -0,0 +1,22 @@ +@props([ + 'actions', +]) + +@if ($actions instanceof \Illuminate\Contracts\View\View) + {{ $actions }} +@elseif (is_array($actions)) + @php + $actions = array_filter( + $actions, + fn (\Filament\Pages\Actions\Action $action): bool => ! $action->isHidden(), + ); + @endphp + + @if (count($actions)) +
class(['flex flex-wrap items-center gap-4']) }}> + @foreach ($actions as $action) + {{ $action }} + @endforeach +
+ @endif +@endif diff --git a/packages/admin/resources/views/components/actions/select-action.blade.php b/packages/admin/resources/views/components/actions/select-action.blade.php new file mode 100644 index 0000000000..4d807772ef --- /dev/null +++ b/packages/admin/resources/views/components/actions/select-action.blade.php @@ -0,0 +1,23 @@ +
+ + + +
diff --git a/packages/admin/resources/views/components/brand.blade.php b/packages/admin/resources/views/components/brand.blade.php new file mode 100644 index 0000000000..848a92f878 --- /dev/null +++ b/packages/admin/resources/views/components/brand.blade.php @@ -0,0 +1,3 @@ +
+ {{ config('app.name') }} +
diff --git a/packages/admin/resources/views/components/button.blade.php b/packages/admin/resources/views/components/button.blade.php new file mode 100644 index 0000000000..ec3d4b5cff --- /dev/null +++ b/packages/admin/resources/views/components/button.blade.php @@ -0,0 +1,64 @@ +@props([ + 'color' => 'primary', + 'icon' => null, + 'iconPosition' => 'before', + 'tag' => 'button', + 'type' => 'button', + 'size' => 'md', +]) + +@php + $buttonClasses = [ + 'inline-flex items-center justify-center font-medium tracking-tight transition rounded-lg focus:outline-none focus:ring-offset-2 focus:ring-2 focus:ring-inset', + 'bg-primary-600 hover:bg-primary-500 focus:bg-primary-700 focus:ring-offset-primary-700' => $color === 'primary', + 'h-9 px-4' => $size === 'md', + 'text-white shadow focus:ring-white' => $color !== 'secondary', + 'bg-danger-600 hover:bg-danger-500 focus:bg-danger-700 focus:ring-offset-danger-700' => $color === 'danger', + 'text-gray-800 bg-white border border-gray-300 hover:bg-gray-50 focus:ring-primary-600 focus:text-primary-600 focus:bg-primary-50 focus:border-primary-600' => $color === 'secondary', + 'bg-success-600 hover:bg-success-500 focus:bg-success-700 focus:ring-offset-success-700' => $color === 'success', + 'bg-warning-600 hover:bg-warning-500 focus:bg-warning-700 focus:ring-offset-warning-700' => $color === 'warning', + 'h-8 px-3 text-sm' => $size === 'sm', + 'h-11 px-6 text-xl' => $size === 'lg', + ]; + + $iconClasses = \Illuminate\Support\Arr::toCssClasses([ + 'w-6 h-6' => $size === 'md', + 'w-7 h-7' => $size === 'lg', + 'w-5 h-5' => $size === 'sm', + 'mr-1 -ml-2' => ($iconPosition === 'before') && ($size === 'md'), + 'mr-2 -ml-3' => ($iconPosition === 'before') && ($size === 'lg'), + 'mr-1 -ml-1.5' => ($iconPosition === 'before') && ($size === 'sm'), + 'ml-1 -mr-2' => ($iconPosition === 'after') && ($size === 'md'), + 'ml-2 -mr-3' => ($iconPosition === 'after') && ($size === 'lg'), + 'ml-1 -mr-1.5' => ($iconPosition === 'after') && ($size === 'sm'), + ]); +@endphp + +@if ($tag === 'button') + +@elseif ($tag === 'a') + class($buttonClasses) }}> + @if ($icon && $iconPosition === 'before') + + @endif + + {{ $slot }} + + @if ($icon && $iconPosition === 'after') + + @endif + +@endif diff --git a/packages/admin/resources/views/components/card/heading.blade.php b/packages/admin/resources/views/components/card/heading.blade.php new file mode 100644 index 0000000000..c52db49d5a --- /dev/null +++ b/packages/admin/resources/views/components/card/heading.blade.php @@ -0,0 +1,3 @@ +

class(['text-xl font-semibold tracking-tight']) }}> + {{ $slot }} +

diff --git a/packages/admin/resources/views/components/card/index.blade.php b/packages/admin/resources/views/components/card/index.blade.php new file mode 100644 index 0000000000..88c42b7c22 --- /dev/null +++ b/packages/admin/resources/views/components/card/index.blade.php @@ -0,0 +1,50 @@ +@props([ + 'actions' => null, + 'footer' => null, + 'header' => null, + 'heading' => null, +]) + +
class(['p-2 space-y-2 bg-white shadow rounded-xl']) }}> + @if ($actions || $header || $heading) +
+ @if ($header) + {{ $header }} + @elseif ($actions || $heading) +
+ + {{ $heading }} + + + @if ($actions) +
+ {{ $actions }} +
+ @endif +
+ @endif +
+ @endif + + @if (($actions || $header || $heading) && $slot->isNotEmpty()) + + @endif + +
+ @if ($slot->isNotEmpty()) +
+ {{ $slot }} +
+ @endif +
+ + @if ($footer && $slot->isNotEmpty()) + + @endif + + @if ($footer) +
+ {{ $footer }} +
+ @endif +
diff --git a/packages/admin/resources/views/components/footer.blade.php b/packages/admin/resources/views/components/footer.blade.php new file mode 100644 index 0000000000..7067f80015 --- /dev/null +++ b/packages/admin/resources/views/components/footer.blade.php @@ -0,0 +1,15 @@ + diff --git a/packages/admin/resources/views/components/form.blade.php b/packages/admin/resources/views/components/form.blade.php new file mode 100644 index 0000000000..2fc98e9bae --- /dev/null +++ b/packages/admin/resources/views/components/form.blade.php @@ -0,0 +1,3 @@ +
class('space-y-6') }}> + {{ $slot }} +
diff --git a/packages/admin/resources/views/components/global-search/end.blade.php b/packages/admin/resources/views/components/global-search/end.blade.php new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/admin/resources/views/components/global-search/index.blade.php b/packages/admin/resources/views/components/global-search/index.blade.php new file mode 100644 index 0000000000..4149cef036 --- /dev/null +++ b/packages/admin/resources/views/components/global-search/index.blade.php @@ -0,0 +1,15 @@ +
+ + + @if ($this->isEnabled()) +
+ + + @if ($results !== null) + + @endif +
+ @endif + + +
diff --git a/packages/admin/resources/views/components/global-search/input.blade.php b/packages/admin/resources/views/components/global-search/input.blade.php new file mode 100644 index 0000000000..f57377d7ea --- /dev/null +++ b/packages/admin/resources/views/components/global-search/input.blade.php @@ -0,0 +1,19 @@ +
+ + +
+ + + + + +
+
diff --git a/packages/admin/resources/views/components/global-search/no-results-message.blade.php b/packages/admin/resources/views/components/global-search/no-results-message.blade.php new file mode 100644 index 0000000000..8b641133f6 --- /dev/null +++ b/packages/admin/resources/views/components/global-search/no-results-message.blade.php @@ -0,0 +1,3 @@ +
class(['px-6 py-4']) }}> + {{ __('filament::global-search.no_results_message') }} +
diff --git a/packages/admin/resources/views/components/global-search/result-group.blade.php b/packages/admin/resources/views/components/global-search/result-group.blade.php new file mode 100644 index 0000000000..985d26bcc5 --- /dev/null +++ b/packages/admin/resources/views/components/global-search/result-group.blade.php @@ -0,0 +1,22 @@ +@props([ + 'label', + 'results', +]) + +
    class(['divide-y']) }}> +
  • +
    +

    + {{ $label }} +

    +
    +
  • + + @foreach ($results as $result) + + @endforeach +
diff --git a/packages/admin/resources/views/components/global-search/result.blade.php b/packages/admin/resources/views/components/global-search/result.blade.php new file mode 100644 index 0000000000..27aaf6eb9c --- /dev/null +++ b/packages/admin/resources/views/components/global-search/result.blade.php @@ -0,0 +1,19 @@ +@props([ + 'details' => [], + 'title', + 'url', +]) + +
  • + +

    {{ $title }}

    + +

    + @foreach ($details as $label => $value) + + {{ $label }}: {{ $value }} + + @endforeach +

    +
    +
  • diff --git a/packages/admin/resources/views/components/global-search/results-container.blade.php b/packages/admin/resources/views/components/global-search/results-container.blade.php new file mode 100644 index 0000000000..7c4a6a8bda --- /dev/null +++ b/packages/admin/resources/views/components/global-search/results-container.blade.php @@ -0,0 +1,20 @@ +@props([ + 'results', +]) + +
    class(['absolute right-0 top-auto z-10 mt-2 shadow-xl overflow-hidden rounded-xl w-screen max-w-xs sm:max-w-lg']) }} +> +
    + @forelse ($results as $group => $groupedResults) + + @empty + + @endforelse +
    +
    diff --git a/packages/admin/resources/views/components/global-search/start.blade.php b/packages/admin/resources/views/components/global-search/start.blade.php new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/admin/resources/views/components/header/heading.blade.php b/packages/admin/resources/views/components/header/heading.blade.php new file mode 100644 index 0000000000..6b6c448793 --- /dev/null +++ b/packages/admin/resources/views/components/header/heading.blade.php @@ -0,0 +1,3 @@ +

    class(['text-2xl font-bold tracking-tight md:text-3xl']) }}> + {{ $slot }} +

    diff --git a/packages/admin/resources/views/components/header/index.blade.php b/packages/admin/resources/views/components/header/index.blade.php new file mode 100644 index 0000000000..1651f0bd0f --- /dev/null +++ b/packages/admin/resources/views/components/header/index.blade.php @@ -0,0 +1,12 @@ +@props([ + 'actions' => null, + 'heading', +]) + +
    class('space-y-2 items-start justify-between sm:flex sm:space-y-0 sm:space-x-4 sm:py-4') }}> + + {{ $heading }} + + + +
    diff --git a/packages/admin/resources/views/components/hr.blade.php b/packages/admin/resources/views/components/hr.blade.php new file mode 100644 index 0000000000..bf2a652112 --- /dev/null +++ b/packages/admin/resources/views/components/hr.blade.php @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/admin/resources/views/components/layouts/app.blade.php b/packages/admin/resources/views/components/layouts/app.blade.php new file mode 100644 index 0000000000..dca69d567f --- /dev/null +++ b/packages/admin/resources/views/components/layouts/app.blade.php @@ -0,0 +1,81 @@ + +
    +
    + + + +
    +
    +
    'max-w-xl', + '2xl' => 'max-w-2xl', + '3xl' => 'max-w-3xl', + '4xl' => 'max-w-4xl', + '5xl' => 'max-w-5xl', + '7xl' => 'max-w-7xl', + 'full' => 'max-w-full', + default => 'max-w-6xl', + }, + ])> + + +
    +
    + +
    + + @livewire('filament.core.global-search') +
    +
    +
    + +
    'max-w-xl', + '2xl' => 'max-w-2xl', + '3xl' => 'max-w-3xl', + '4xl' => 'max-w-4xl', + '5xl' => 'max-w-5xl', + '7xl' => 'max-w-7xl', + 'full' => 'max-w-full', + default => 'max-w-6xl', + }, + ])> + {{ $slot }} +
    + +
    + +
    +
    +
    +
    diff --git a/packages/admin/resources/views/components/layouts/app/sidebar/end.blade.php b/packages/admin/resources/views/components/layouts/app/sidebar/end.blade.php new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/admin/resources/views/components/layouts/app/sidebar/footer.blade.php b/packages/admin/resources/views/components/layouts/app/sidebar/footer.blade.php new file mode 100644 index 0000000000..cc393d91dc --- /dev/null +++ b/packages/admin/resources/views/components/layouts/app/sidebar/footer.blade.php @@ -0,0 +1,22 @@ + diff --git a/packages/admin/resources/views/components/layouts/app/sidebar/group.blade.php b/packages/admin/resources/views/components/layouts/app/sidebar/group.blade.php new file mode 100644 index 0000000000..6c1fc4e7a2 --- /dev/null +++ b/packages/admin/resources/views/components/layouts/app/sidebar/group.blade.php @@ -0,0 +1,18 @@ +@props([ + 'label' => null, +]) + +
  • + @if ($label) +

    + {{ $label }} +

    + @endif + +
      $label, + ])> + {{ $slot }} +
    +
  • diff --git a/packages/admin/resources/views/components/layouts/app/sidebar/index.blade.php b/packages/admin/resources/views/components/layouts/app/sidebar/index.blade.php new file mode 100644 index 0000000000..e8d8bc7338 --- /dev/null +++ b/packages/admin/resources/views/components/layouts/app/sidebar/index.blade.php @@ -0,0 +1,42 @@ + diff --git a/packages/admin/resources/views/components/layouts/app/sidebar/item.blade.php b/packages/admin/resources/views/components/layouts/app/sidebar/item.blade.php new file mode 100644 index 0000000000..bd571023e1 --- /dev/null +++ b/packages/admin/resources/views/components/layouts/app/sidebar/item.blade.php @@ -0,0 +1,22 @@ +@props([ + 'active' => false, + 'icon', + 'url', +]) + +
  • + ! $active, + 'bg-primary-500 text-white' => $active, + ]) + > + + + + {{ $slot }} + + +
  • diff --git a/packages/admin/resources/views/components/layouts/app/sidebar/start.blade.php b/packages/admin/resources/views/components/layouts/app/sidebar/start.blade.php new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/admin/resources/views/components/layouts/base.blade.php b/packages/admin/resources/views/components/layouts/base.blade.php new file mode 100644 index 0000000000..59a8ef030c --- /dev/null +++ b/packages/admin/resources/views/components/layouts/base.blade.php @@ -0,0 +1,61 @@ +@props([ + 'title' => null, +]) + + + + + + + + + {{ $title ? "{$title} - " : null }} {{ config('app.name') }} + + + + @livewireStyles + + + + + + + + @foreach (\Filament\Facades\Filament::getStyles() as $path) + @if (Str::of($path)->startsWith(['http://', 'https://'])) + + @else + + @endif + @endforeach + + + + {{ $slot }} + + @livewireScripts + + + + + + @foreach (\Filament\Facades\Filament::getScripts() as $path) + @if (Str::of($path)->startsWith(['http://', 'https://'])) + + @else + + @endif + @endforeach + + @stack('scripts') + + diff --git a/packages/admin/resources/views/components/modal/actions.blade.php b/packages/admin/resources/views/components/modal/actions.blade.php new file mode 100644 index 0000000000..f3790254dc --- /dev/null +++ b/packages/admin/resources/views/components/modal/actions.blade.php @@ -0,0 +1,13 @@ +@props([ + 'align' => 'left', + 'fullWidth' => false, +]) + +
    class([ + 'flex items-center space-x-4' => ! $fullWidth, + 'justify-end' => (! $fullWidth) && ($align === 'right'), + 'justify-center' => (! $fullWidth) && ($align === 'center'), + 'grid gap-2 grid-cols-[repeat(auto-fit,minmax(0,1fr))]' => $fullWidth, +]) }}> + {{ $slot }} +
    diff --git a/packages/admin/resources/views/components/modal/heading.blade.php b/packages/admin/resources/views/components/modal/heading.blade.php new file mode 100644 index 0000000000..15e3444714 --- /dev/null +++ b/packages/admin/resources/views/components/modal/heading.blade.php @@ -0,0 +1,3 @@ +

    class(['text-xl font-bold tracking-tight']) }}> + {{ $slot }} +

    diff --git a/packages/admin/resources/views/components/modal/index.blade.php b/packages/admin/resources/views/components/modal/index.blade.php new file mode 100644 index 0000000000..cde6c73159 --- /dev/null +++ b/packages/admin/resources/views/components/modal/index.blade.php @@ -0,0 +1,128 @@ +@props([ + 'actions' => null, + 'ariaLabelledby' => null, + 'closeEventName' => 'close-modal', + 'displayClasses' => 'inline-block', + 'footer' => null, + 'header' => null, + 'heading' => null, + 'id' => null, + 'openEventName' => 'open-modal', + 'subheading' => null, + 'trigger' => null, + 'width' => 'sm', +]) + + diff --git a/packages/admin/resources/views/components/modal/subheading.blade.php b/packages/admin/resources/views/components/modal/subheading.blade.php new file mode 100644 index 0000000000..9c9072c89e --- /dev/null +++ b/packages/admin/resources/views/components/modal/subheading.blade.php @@ -0,0 +1,3 @@ +

    class(['text-gray-500']) }}> + {{ $slot }} +

    \ No newline at end of file diff --git a/packages/admin/resources/views/components/notification.blade.php b/packages/admin/resources/views/components/notification.blade.php new file mode 100644 index 0000000000..e0382a6a7d --- /dev/null +++ b/packages/admin/resources/views/components/notification.blade.php @@ -0,0 +1,64 @@ +@props([ + 'message', + 'status', +]) + +
    +
    +
    'bg-danger-50 ring-danger-200', + 'success' => 'bg-success-50 ring-success-200', + 'warning' => 'bg-warning-50 ring-warning-200', + default => 'bg-white ring-gray-200', + }, + ]) + > + + +
    +
    +

    'text-danger-900', + 'success' => 'text-success-900', + 'warning' => 'text-warning-900', + default => 'text-gray-900', + }, + ]) + > + {{ $message }} +

    +
    +
    +
    +
    +
    diff --git a/packages/admin/resources/views/components/page.blade.php b/packages/admin/resources/views/components/page.blade.php new file mode 100644 index 0000000000..6d25994deb --- /dev/null +++ b/packages/admin/resources/views/components/page.blade.php @@ -0,0 +1,29 @@ +@props([ + 'modals' => null, +]) + +
    +
    + @if ($header = $this->getHeader()) + {{ $header }} + @elseif ($heading = $this->getHeading()) + + + {{ $heading }} + + + @endif + + {{ $slot }} + + @if ($footer = $this->getFooter()) + {{ $footer }} + @endif +
    + + {{ $modals }} + + @if ($notification = session()->get('notification')) + + @endif +
    diff --git a/packages/admin/resources/views/components/resources/relation-managers/index.blade.php b/packages/admin/resources/views/components/resources/relation-managers/index.blade.php new file mode 100644 index 0000000000..2297a32bdd --- /dev/null +++ b/packages/admin/resources/views/components/resources/relation-managers/index.blade.php @@ -0,0 +1,47 @@ +@props([ + 'activeManager', + 'managers', + 'ownerRecord', +]) + +
    + @if (count($managers) > 1) +
    + + @foreach ($managers as $manager) + + @endforeach + +
    + @endif + + @if ($activeManager) +
    1) + id="{{ $activeManager }}" + role="tabpanel" + tabindex="0" + @endif + class="focus:outline-none" + > + @livewire(\Livewire\Livewire::getAlias($activeManager, $activeManager::getName()), ['ownerRecord' => $ownerRecord], key($activeManager)) +
    + @endif +
    diff --git a/packages/admin/resources/views/components/stats/card.blade.php b/packages/admin/resources/views/components/stats/card.blade.php new file mode 100644 index 0000000000..aeca49ecdb --- /dev/null +++ b/packages/admin/resources/views/components/stats/card.blade.php @@ -0,0 +1,36 @@ +@props([ + 'description' => null, + 'descriptionColor' => null, + 'descriptionIcon' => null, + 'flat' => false, + 'label' => null, + 'value' => null, +]) + +
    class([ + 'p-6 rounded-2xl', + 'bg-white shadow' => ! $flat, + 'border' => $flat, +]) }}> +
    +
    {{ $label }}
    + +
    {{ $value }}
    + + @if ($description) +
    + {{ $description }} + + @if ($descriptionIcon) + + @endif +
    + @endif +
    +
    diff --git a/packages/admin/resources/views/components/stats/index.blade.php b/packages/admin/resources/views/components/stats/index.blade.php new file mode 100644 index 0000000000..3b359e697b --- /dev/null +++ b/packages/admin/resources/views/components/stats/index.blade.php @@ -0,0 +1,17 @@ +@props([ + 'columns' => '3', +]) + +@php + $columns = (int) $columns; +@endphp + +
    class([ + 'grid gap-6', + 'md:grid-cols-3' => $columns === 3, + 'md:grid-cols-1' => $columns === 1, + 'md:grid-cols-2' => $columns === 2, + 'md:grid-cols-2 xl:grid-cols-4' => $columns === 4, +]) }}> + {{ $slot }} +
    diff --git a/packages/admin/resources/views/components/tabs/index.blade.php b/packages/admin/resources/views/components/tabs/index.blade.php new file mode 100644 index 0000000000..e2d856386b --- /dev/null +++ b/packages/admin/resources/views/components/tabs/index.blade.php @@ -0,0 +1,3 @@ + diff --git a/packages/admin/resources/views/components/tabs/item.blade.php b/packages/admin/resources/views/components/tabs/item.blade.php new file mode 100644 index 0000000000..429826c458 --- /dev/null +++ b/packages/admin/resources/views/components/tabs/item.blade.php @@ -0,0 +1,26 @@ +@props([ + 'active' => false, + 'tag' => 'button', + 'type' => 'button', +]) + +@php + $buttonClasses = generateClasses([ + 'flex items-center h-8 px-5 font-medium transition rounded-lg focus:outline-none focus:ring-2 focus:ring-primary-600 focus:ring-inset', + 'hover:text-gray-800 focus:text-primary-600' => ! $active, + 'text-primary-600 shadow bg-white' => $active, + ]); +@endphp + +@if ($tag === 'button') + +@elseif ($tag === 'a') + class([$buttonClasses]) }}> + {{ $slot }} + +@endif \ No newline at end of file diff --git a/packages/admin/resources/views/login.blade.php b/packages/admin/resources/views/login.blade.php new file mode 100644 index 0000000000..63fd0301d5 --- /dev/null +++ b/packages/admin/resources/views/login.blade.php @@ -0,0 +1,17 @@ +
    +
    +
    +

    + {{ __('filament::login.heading') }} +

    + + {{ $this->form }} + + + {{ __('filament::login.buttons.submit.label') }} + +
    + + +
    +
    diff --git a/packages/admin/resources/views/pages/dashboard.blade.php b/packages/admin/resources/views/pages/dashboard.blade.php new file mode 100644 index 0000000000..5659ac37d1 --- /dev/null +++ b/packages/admin/resources/views/pages/dashboard.blade.php @@ -0,0 +1,7 @@ + +
    + @foreach (\Filament\Facades\Filament::getWidgets() as $widget) + @livewire(\Livewire\Livewire::getAlias($widget)) + @endforeach +
    +
    diff --git a/packages/admin/resources/views/resources/pages/create-record.blade.php b/packages/admin/resources/views/resources/pages/create-record.blade.php new file mode 100644 index 0000000000..44fcda359d --- /dev/null +++ b/packages/admin/resources/views/resources/pages/create-record.blade.php @@ -0,0 +1,7 @@ + + + {{ $this->form }} + + + + diff --git a/packages/admin/resources/views/resources/pages/edit-record.blade.php b/packages/admin/resources/views/resources/pages/edit-record.blade.php new file mode 100644 index 0000000000..580dd79a8a --- /dev/null +++ b/packages/admin/resources/views/resources/pages/edit-record.blade.php @@ -0,0 +1,37 @@ + + + {{ $this->form }} + + + + + @if (count($relationManagers = $this->getResource()::getRelations())) + + + + @endif + + + + + {{ __('filament::resources/pages/edit-record.modals.delete.heading', ['record' => $this->getRecordTitle() ?? static::getResource()::getLabel()]) }} + + + + {{ __('filament::resources/pages/edit-record.modals.delete.subheading') }} + + + + + + {{ __('filament::resources/pages/edit-record.modals.delete.buttons.cancel.label') }} + + + + {{ __('filament::resources/pages/edit-record.modals.delete.buttons.delete.label') }} + + + + + + diff --git a/packages/admin/resources/views/resources/pages/list-records.blade.php b/packages/admin/resources/views/resources/pages/list-records.blade.php new file mode 100644 index 0000000000..b03a259bdb --- /dev/null +++ b/packages/admin/resources/views/resources/pages/list-records.blade.php @@ -0,0 +1,3 @@ + + {{ $this->table }} + diff --git a/packages/admin/resources/views/resources/pages/view-record.blade.php b/packages/admin/resources/views/resources/pages/view-record.blade.php new file mode 100644 index 0000000000..394b4b4e40 --- /dev/null +++ b/packages/admin/resources/views/resources/pages/view-record.blade.php @@ -0,0 +1,3 @@ + + {{ $this->form }} + diff --git a/packages/admin/resources/views/resources/relation-managers/belongs-to-many-relation-manager.blade.php b/packages/admin/resources/views/resources/relation-managers/belongs-to-many-relation-manager.blade.php new file mode 100644 index 0000000000..c3fedc4aac --- /dev/null +++ b/packages/admin/resources/views/resources/relation-managers/belongs-to-many-relation-manager.blade.php @@ -0,0 +1,3 @@ +
    + {{ $this->table }} +
    diff --git a/packages/admin/resources/views/resources/relation-managers/has-many-relation-manager.blade.php b/packages/admin/resources/views/resources/relation-managers/has-many-relation-manager.blade.php new file mode 100644 index 0000000000..c3fedc4aac --- /dev/null +++ b/packages/admin/resources/views/resources/relation-managers/has-many-relation-manager.blade.php @@ -0,0 +1,3 @@ +
    + {{ $this->table }} +
    diff --git a/packages/admin/resources/views/widgets/account-widget.blade.php b/packages/admin/resources/views/widgets/account-widget.blade.php new file mode 100644 index 0000000000..2d9ab2e8d3 --- /dev/null +++ b/packages/admin/resources/views/widgets/account-widget.blade.php @@ -0,0 +1,24 @@ + + @php + $user = \Filament\Facades\Filament::auth()->user(); + @endphp + +
    +
    + +
    +

    + {{ __('filament::widgets/account-widget.welcome', ['user' => \Filament\Facades\Filament::getUserName($user)]) }} +

    + +

    + + {{ __('filament::widgets/account-widget.buttons.logout.label') }} + +

    +
    +
    +
    diff --git a/packages/admin/resources/views/widgets/chart-widget.blade.php b/packages/admin/resources/views/widgets/chart-widget.blade.php new file mode 100644 index 0000000000..7bf3e602e5 --- /dev/null +++ b/packages/admin/resources/views/widgets/chart-widget.blade.php @@ -0,0 +1,31 @@ + + + {{ $this->getHeading() }} + + +
    getPollingInterval()) ? "wire:poll.{$pollingInterval}=\"updateChartData\"" : '' !!}> + +
    +
    diff --git a/packages/admin/resources/views/widgets/filament-info-widget.blade.php b/packages/admin/resources/views/widgets/filament-info-widget.blade.php new file mode 100644 index 0000000000..f82159d63e --- /dev/null +++ b/packages/admin/resources/views/widgets/filament-info-widget.blade.php @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/packages/admin/resources/views/widgets/stats-overview-widget.blade.php b/packages/admin/resources/views/widgets/stats-overview-widget.blade.php new file mode 100644 index 0000000000..b37f95a5a5 --- /dev/null +++ b/packages/admin/resources/views/widgets/stats-overview-widget.blade.php @@ -0,0 +1,5 @@ + + @foreach ($this->getCards() as $card) + {{ $card }} + @endforeach + diff --git a/packages/admin/resources/views/widgets/stats-overview-widget/card.blade.php b/packages/admin/resources/views/widgets/stats-overview-widget/card.blade.php new file mode 100644 index 0000000000..0005dd3b67 --- /dev/null +++ b/packages/admin/resources/views/widgets/stats-overview-widget/card.blade.php @@ -0,0 +1,7 @@ + diff --git a/packages/admin/routes/web.php b/packages/admin/routes/web.php new file mode 100644 index 0000000000..63fa1f8df8 --- /dev/null +++ b/packages/admin/routes/web.php @@ -0,0 +1,38 @@ +middleware(config('filament.middleware.base')) + ->name('filament.') + ->prefix(config('filament.path')) + ->group(function () { + if ($loginPage = config('filament.auth.pages.login')) { + Route::get('/login', $loginPage)->name('auth.login'); + } + + Route::get('/assets/{path}', AssetController::class)->where('path', '.*')->name('asset'); + + Route::middleware(config('filament.middleware.auth'))->group(function (): void { + Route::name('pages.')->group(function (): void { + foreach (Filament::getPages() as $page) { + Route::group([], $page::getRoutes()); + } + }); + + Route::name('resources.')->group(function (): void { + foreach (Filament::getResources() as $resource) { + Route::group([], $resource::getRoutes()); + } + }); + + Route::get('/logout', function (): RedirectResponse { + Filament::auth()->logout(); + + return redirect()->route('filament.auth.login'); + })->name('auth.logout'); + }); + }); diff --git a/packages/admin/src/AvatarProviders/Contracts/AvatarProvider.php b/packages/admin/src/AvatarProviders/Contracts/AvatarProvider.php new file mode 100644 index 0000000000..ee8aaf7ed1 --- /dev/null +++ b/packages/admin/src/AvatarProviders/Contracts/AvatarProvider.php @@ -0,0 +1,10 @@ +name) . '&color=FFFFFF&background=111827'; + } +} diff --git a/packages/admin/src/Commands/Aliases/MakeBelongsToManyCommand.php b/packages/admin/src/Commands/Aliases/MakeBelongsToManyCommand.php new file mode 100644 index 0000000000..23be81d696 --- /dev/null +++ b/packages/admin/src/Commands/Aliases/MakeBelongsToManyCommand.php @@ -0,0 +1,12 @@ +fileExists($path)) { + $this->error("$path already exists, aborting."); + + return true; + } + } + + return false; + } + + protected function copyStubToApp(string $stub, string $targetPath, array $replacements = []): void + { + $filesystem = new Filesystem(); + + if (! $this->fileExists($stubPath = base_path("stubs/filament/{$stub}.stub"))) { + $stubPath = __DIR__ . "/../../../stubs/{$stub}.stub"; + } + + $stub = Str::of($filesystem->get($stubPath)); + + foreach ($replacements as $key => $replacement) { + $stub = $stub->replace("{{ {$key} }}", $replacement); + } + + $stub = (string) $stub; + + $this->writeFile($targetPath, $stub); + } + + protected function fileExists(string $path): bool + { + $filesystem = new Filesystem(); + + return $filesystem->exists($path); + } + + protected function writeFile(string $path, string $contents): void + { + $filesystem = new Filesystem(); + + $filesystem->ensureDirectoryExists( + (string) Str::of($path) + ->beforeLast('/'), + ); + + $filesystem->put($path, $contents); + } +} diff --git a/packages/admin/src/Commands/Concerns/CanValidateInput.php b/packages/admin/src/Commands/Concerns/CanValidateInput.php new file mode 100644 index 0000000000..d7e9dba73e --- /dev/null +++ b/packages/admin/src/Commands/Concerns/CanValidateInput.php @@ -0,0 +1,31 @@ +validateInput(fn () => $this->ask($question), $field, ['required']); + } + + protected function validateInput(callable $callback, string $field, array $rules): string + { + $input = $callback(); + + $validator = Validator::make( + [$field => $input], + [$field => $rules], + ); + + if ($validator->fails()) { + $this->error($validator->errors()->first()); + + $input = $this->validateInput($callback, $field, $rules); + } + + return $input; + } +} diff --git a/packages/admin/src/Commands/MakeBelongsToManyCommand.php b/packages/admin/src/Commands/MakeBelongsToManyCommand.php new file mode 100644 index 0000000000..778ce32a84 --- /dev/null +++ b/packages/admin/src/Commands/MakeBelongsToManyCommand.php @@ -0,0 +1,65 @@ +argument('resource') ?? $this->askRequired('Resource (e.g. `DepartmentResource`)', 'resource')) + ->studly() + ->trim('/') + ->trim('\\') + ->trim(' ') + ->replace('/', '\\'); + + if (! Str::of($resource)->endsWith('Resource')) { + $resource .= 'Resource'; + } + + $relationship = (string) Str::of($this->argument('relationship') ?? $this->askRequired('Relationship (e.g. `members`)', 'relationship')) + ->trim(' '); + $managerClass = (string) Str::of($relationship) + ->studly() + ->append('RelationManager'); + + $recordTitleAttribute = (string) Str::of($this->argument('recordTitleAttribute') ?? $this->askRequired('Title attribute (e.g. `name`)', 'title attribute')) + ->trim(' '); + + $path = app_path( + (string) Str::of($managerClass) + ->prepend("Filament\\Resources\\{$resource}\\RelationManagers\\") + ->replace('\\', '/') + ->append('.php'), + ); + + if ($this->checkForCollision([ + $path, + ])) { + return static::INVALID; + } + + $this->copyStubToApp('BelongsToManyRelationManager', $path, [ + 'namespace' => "App\\Filament\\Resources\\{$resource}\\RelationManagers", + 'managerClass' => $managerClass, + 'recordTitleAttribute' => $recordTitleAttribute, + 'relationship' => $relationship, + ]); + + $this->info("Successfully created {$managerClass}!"); + + $this->info("Make sure to register the relation in `{$resource}::getRelations()`."); + + return static::SUCCESS; + } +} diff --git a/packages/admin/src/Commands/MakeHasManyCommand.php b/packages/admin/src/Commands/MakeHasManyCommand.php new file mode 100644 index 0000000000..232db72d6e --- /dev/null +++ b/packages/admin/src/Commands/MakeHasManyCommand.php @@ -0,0 +1,65 @@ +argument('resource') ?? $this->askRequired('Resource (e.g. `UserResource`)', 'resource')) + ->studly() + ->trim('/') + ->trim('\\') + ->trim(' ') + ->replace('/', '\\'); + + if (! Str::of($resource)->endsWith('Resource')) { + $resource .= 'Resource'; + } + + $relationship = (string) Str::of($this->argument('relationship') ?? $this->askRequired('Relationship (e.g. `blogPosts`)', 'relationship')) + ->trim(' '); + $managerClass = (string) Str::of($relationship) + ->studly() + ->append('RelationManager'); + + $recordTitleAttribute = (string) Str::of($this->argument('recordTitleAttribute') ?? $this->askRequired('Title attribute (e.g. `title`)', 'title attribute')) + ->trim(' '); + + $path = app_path( + (string) Str::of($managerClass) + ->prepend("Filament\\Resources\\{$resource}\\RelationManagers\\") + ->replace('\\', '/') + ->append('.php'), + ); + + if ($this->checkForCollision([ + $path, + ])) { + return static::INVALID; + } + + $this->copyStubToApp('HasManyRelationManager', $path, [ + 'namespace' => "App\\Filament\\Resources\\{$resource}\\RelationManagers", + 'managerClass' => $managerClass, + 'recordTitleAttribute' => $recordTitleAttribute, + 'relationship' => $relationship, + ]); + + $this->info("Successfully created {$managerClass}!"); + + $this->info("Make sure to register the relation in `{$resource}::getRelations()`."); + + return static::SUCCESS; + } +} diff --git a/packages/admin/src/Commands/MakePageCommand.php b/packages/admin/src/Commands/MakePageCommand.php new file mode 100644 index 0000000000..2a730c3e8a --- /dev/null +++ b/packages/admin/src/Commands/MakePageCommand.php @@ -0,0 +1,104 @@ +argument('name') ?? $this->askRequired('Name (e.g. `Settings`)', 'name')) + ->trim('/') + ->trim('\\') + ->trim(' ') + ->replace('/', '\\'); + $pageClass = (string) Str::of($page)->afterLast('\\'); + $pageNamespace = Str::of($page)->contains('\\') ? + (string) Str::of($page)->beforeLast('\\') : + ''; + + $resource = null; + $resourceClass = null; + + $resourceInput = $this->option('resource') ?? $this->ask('(Optional) Resource (e.g. `UserResource`)'); + + if ($resourceInput !== null) { + $resource = (string) Str::of($resourceInput) + ->studly() + ->trim('/') + ->trim('\\') + ->trim(' ') + ->replace('/', '\\'); + + if (! Str::of($resource)->endsWith('Resource')) { + $resource .= 'Resource'; + } + + $resourceClass = (string) Str::of($resource) + ->afterLast('\\'); + } + + $view = Str::of($page) + ->prepend($resource === null ? 'filament\\pages\\' : "filament\\resources\\{$resource}\\pages\\") + ->explode('\\') + ->map(fn ($segment) => Str::kebab($segment)) + ->implode('.'); + + $path = app_path( + (string) Str::of($page) + ->prepend($resource === null ? 'Filament\\Pages\\' : "Filament\\Resources\\{$resource}\\Pages\\") + ->replace('\\', '/') + ->append('.php'), + ); + $viewPath = resource_path( + (string) Str::of($view) + ->replace('.', '/') + ->prepend('views/') + ->append('.blade.php'), + ); + + if ($this->checkForCollision([ + $path, + $viewPath, + ])) { + return static::INVALID; + } + + if ($resource === null) { + $this->copyStubToApp('Page', $path, [ + 'class' => $pageClass, + 'namespace' => 'App\\Filament\\Pages' . ($pageNamespace !== '' ? "\\{$pageNamespace}" : ''), + 'view' => $view, + ]); + } else { + $this->copyStubToApp('ResourcePage', $path, [ + 'baseResourcePage' => 'Filament\\Resources\\Pages\\Page', + 'baseResourcePageClass' => 'Page', + 'namespace' => "App\\Filament\\Resources\\{$resource}\\Pages" . ($pageNamespace !== '' ? "\\{$pageNamespace}" : ''), + 'resource' => $resource, + 'resourceClass' => $resourceClass, + 'resourcePageClass' => $pageClass, + 'view' => $view, + ]); + } + + $this->copyStubToApp('PageView', $viewPath); + + $this->info("Successfully created {$page}!"); + + if ($resource !== null) { + $this->info("Make sure to register the page in `{$resourceClass}::getPages()`."); + } + + return static::SUCCESS; + } +} diff --git a/packages/admin/src/Commands/MakeResourceCommand.php b/packages/admin/src/Commands/MakeResourceCommand.php new file mode 100644 index 0000000000..b89e063e0c --- /dev/null +++ b/packages/admin/src/Commands/MakeResourceCommand.php @@ -0,0 +1,102 @@ +argument('name') ?? $this->askRequired('Model (e.g. `BlogPost`)', 'name')) + ->studly() + ->beforeLast('Resource') + ->trim('/') + ->trim('\\') + ->trim(' ') + ->studly() + ->replace('/', '\\'); + $modelClass = (string) Str::of($model)->afterLast('\\'); + $modelNamespace = Str::of($model)->contains('\\') ? + (string) Str::of($model)->beforeLast('\\') : + ''; + $pluralModelClass = (string) Str::of($modelClass)->pluralStudly(); + + $resource = "{$model}Resource"; + $resourceClass = "{$modelClass}Resource"; + $resourceNamespace = $modelNamespace; + $indexResourcePageClass = "List{$pluralModelClass}"; + $createResourcePageClass = "Create{$modelClass}"; + $editResourcePageClass = "Edit{$modelClass}"; + + $baseResourcePath = app_path( + (string) Str::of($resource) + ->prepend('Filament\\Resources\\') + ->replace('\\', '/'), + ); + $resourcePath = "{$baseResourcePath}.php"; + $resourcePagesDirectory = "{$baseResourcePath}/Pages"; + $indexResourcePagePath = "{$resourcePagesDirectory}/{$indexResourcePageClass}.php"; + $createResourcePagePath = "{$resourcePagesDirectory}/{$createResourcePageClass}.php"; + $editResourcePagePath = "{$resourcePagesDirectory}/{$editResourcePageClass}.php"; + + if ($this->checkForCollision([ + $resourcePath, + $indexResourcePagePath, + $createResourcePagePath, + $editResourcePagePath, + ])) { + return static::INVALID; + } + + $this->copyStubToApp('Resource', $resourcePath, [ + 'createResourcePageClass' => $createResourcePageClass, + 'editResourcePageClass' => $editResourcePageClass, + 'indexResourcePageClass' => $indexResourcePageClass, + 'model' => $model, + 'modelClass' => $modelClass, + 'namespace' => 'App\\Filament\\Resources' . ($resourceNamespace !== '' ? "\\{$resourceNamespace}" : ''), + 'resource' => $resource, + 'resourceClass' => $resourceClass, + ]); + + $this->copyStubToApp('DefaultResourcePage', $indexResourcePagePath, [ + 'baseResourcePage' => 'Filament\\Resources\\Pages\\ListRecords', + 'baseResourcePageClass' => 'ListRecords', + 'namespace' => "App\\Filament\\Resources\\{$resource}\\Pages", + 'resource' => $resource, + 'resourceClass' => $resourceClass, + 'resourcePageClass' => $indexResourcePageClass, + ]); + + $this->copyStubToApp('DefaultResourcePage', $createResourcePagePath, [ + 'baseResourcePage' => 'Filament\\Resources\\Pages\\CreateRecord', + 'baseResourcePageClass' => 'CreateRecord', + 'namespace' => "App\\Filament\\Resources\\{$resource}\\Pages", + 'resource' => $resource, + 'resourceClass' => $resourceClass, + 'resourcePageClass' => $createResourcePageClass, + ]); + + $this->copyStubToApp('DefaultResourcePage', $editResourcePagePath, [ + 'baseResourcePage' => 'Filament\\Resources\\Pages\\EditRecord', + 'baseResourcePageClass' => 'EditRecord', + 'namespace' => "App\\Filament\\Resources\\{$resource}\\Pages", + 'resource' => $resource, + 'resourceClass' => $resourceClass, + 'resourcePageClass' => $editResourcePageClass, + ]); + + $this->info("Successfully created {$resource}!"); + + return static::SUCCESS; + } +} diff --git a/packages/admin/src/Commands/MakeUserCommand.php b/packages/admin/src/Commands/MakeUserCommand.php new file mode 100644 index 0000000000..c788a6cf8a --- /dev/null +++ b/packages/admin/src/Commands/MakeUserCommand.php @@ -0,0 +1,48 @@ +getProvider()->getModel(); + + $user = $userModel::create([ + 'name' => $this->validateInput(fn () => $this->ask('Name'), 'name', ['required']), + 'email' => $this->validateInput(fn () => $this->ask('Email address'), 'email', ['required', 'email', 'unique:' . $userModel]), + 'password' => Hash::make($this->validateInput(fn () => $this->secret('Password'), 'password', ['required', 'min:8'])), + ]); + + $loginUrl = route('filament.auth.login'); + $this->info("Success! {$user->email} may now log in at {$loginUrl}."); + + if ($auth->getProvider()->getModel()::count() === 1 && $this->confirm('Would you like to show some love by starring the repo?', true)) { + if (PHP_OS_FAMILY === 'Darwin') { + exec('open https://github.com/laravel-filament/filament'); + } + if (PHP_OS_FAMILY === 'Linux') { + exec('xdg-open https://github.com/laravel-filament/filament'); + } + if (PHP_OS_FAMILY === 'Windows') { + exec('start https://github.com/laravel-filament/filament'); + } + + $this->line('Thank you!'); + } + + return static::SUCCESS; + } +} diff --git a/packages/admin/src/Commands/MakeWidgetCommand.php b/packages/admin/src/Commands/MakeWidgetCommand.php new file mode 100644 index 0000000000..678caeb160 --- /dev/null +++ b/packages/admin/src/Commands/MakeWidgetCommand.php @@ -0,0 +1,68 @@ +argument('name') ?? $this->askRequired('Name (e.g. `BlogPostsChartWidget`)', 'name')) + ->studly() + ->trim('/') + ->trim('\\') + ->trim(' ') + ->replace('/', '\\'); + $widgetClass = (string) Str::of($widget)->afterLast('\\'); + $widgetNamespace = Str::of($widget)->contains('\\') ? + (string) Str::of($widget)->beforeLast('\\') : + ''; + + $view = Str::of($widget) + ->prepend('filament\\widgets\\') + ->explode('\\') + ->map(fn ($segment) => Str::kebab($segment)) + ->implode('.'); + + $path = app_path( + (string) Str::of($widget) + ->prepend('Filament\\Widgets\\') + ->replace('\\', '/') + ->append('.php'), + ); + $viewPath = resource_path( + (string) Str::of($view) + ->replace('.', '/') + ->prepend('views/') + ->append('.blade.php'), + ); + + if ($this->checkForCollision([ + $path, + $viewPath, + ])) { + return static::INVALID; + } + + $this->copyStubToApp('Widget', $path, [ + 'class' => $widgetClass, + 'namespace' => 'App\\Filament\\Widgets' . ($widgetNamespace !== '' ? "\\{$widgetNamespace}" : ''), + 'view' => $view, + ]); + + $this->copyStubToApp('WidgetView', $viewPath); + + $this->info("Successfully created {$widget}!"); + + return static::SUCCESS; + } +} diff --git a/packages/admin/src/Commands/UpgradeCommand.php b/packages/admin/src/Commands/UpgradeCommand.php new file mode 100644 index 0000000000..5105dfd66b --- /dev/null +++ b/packages/admin/src/Commands/UpgradeCommand.php @@ -0,0 +1,30 @@ +call($command); + } + + $this->info('Successfully upgraded!'); + + return static::SUCCESS; + } +} diff --git a/packages/admin/src/Events/ServingFilament.php b/packages/admin/src/Events/ServingFilament.php new file mode 100644 index 0000000000..e3b24285f5 --- /dev/null +++ b/packages/admin/src/Events/ServingFilament.php @@ -0,0 +1,10 @@ +guard(config('filament.auth.guard')); + } + + public function mountNavigation(): void + { + foreach (static::getPages() as $page) { + $page::registerNavigationItems(); + } + + foreach (static::getResources() as $resource) { + $resource::registerNavigationItems(); + } + + $this->isNavigationMounted = true; + } + + public function registerNavigationGroups(array $groups): void + { + $this->navigationGroups = array_merge($this->navigationGroups, $groups); + } + + public function registerNavigationItems(array $items): void + { + $this->navigationItems = array_merge($this->navigationItems, $items); + } + + public function registerPages(array $pages): void + { + $this->pages = array_merge($this->pages, $pages); + } + + public function registerResources(array $resources): void + { + $this->resources = array_merge($this->resources, $resources); + } + + public function registerScripts(array $scripts): void + { + $this->scripts = array_merge($this->scripts, $scripts); + } + + public function registerScriptData(array $data): void + { + $this->scriptData = array_merge($this->scriptData, $data); + } + + public function registerStyles(array $styles): void + { + $this->styles = array_merge($this->styles, $styles); + } + + public function registerTheme(string $url): void + { + $this->themeUrl = $url; + } + + public function registerWidgets(array $widgets): void + { + $this->widgets = array_merge($this->widgets, $widgets); + } + + public function serving(callable $callback): void + { + Event::listen(ServingFilament::class, $callback); + } + + public function getNavigation(): array + { + if (! $this->isNavigationMounted) { + $this->mountNavigation(); + } + + $groupedItems = collect($this->navigationItems) + ->sortBy(fn (Navigation\NavigationItem $item): int => $item->getSort()) + ->groupBy(fn (Navigation\NavigationItem $item): ?string => $item->getGroup()); + + $sortedGroups = $groupedItems + ->keys() + ->sortBy(function (?string $group): int { + if (! $group) { + return -1; + } + + $sort = array_search($group, $this->navigationGroups); + + if ($sort === false) { + return count($this->navigationGroups); + } + + return $sort; + }); + + return $sortedGroups + ->mapWithKeys(function (?string $group) use ($groupedItems): array { + return [$group => $groupedItems->get($group)]; + }) + ->toArray(); + } + + public function getNavigationGroups(): array + { + return $this->navigationGroups; + } + + public function getNavigationItems(): array + { + return $this->navigationItems; + } + + public function getPages(): array + { + return $this->pages; + } + + public function getResources(): array + { + return $this->resources; + } + + public function getScripts(): array + { + return $this->scripts; + } + + public function getScriptData(): array + { + return $this->scriptData; + } + + public function getStyles(): array + { + return $this->styles; + } + + public function getThemeUrl(): string + { + return $this->themeUrl ?? route('filament.asset', [ + 'id' => get_asset_id('app.css'), + 'path' => 'app.css', + ]); + } + + public function getUrl(): ?string + { + $flatNavigation = Arr::flatten($this->getNavigation()); + + $firstItem = $flatNavigation[0] ?? null; + + if (! $firstItem) { + return null; + } + + return $firstItem->getUrl(); + } + + public function getUserAvatarUrl(Authenticatable $user): string + { + $avatar = null; + + if ($user instanceof HasAvatar) { + $avatar = $user->getFilamentAvatarUrl(); + } + + if ($avatar) { + return $avatar; + } + + $provider = config('filament.default_avatar_provider'); + + return (new $provider())->get($user); + } + + public function getUserName(Authenticatable $user): string + { + if ($user instanceof HasName) { + return $user->getFilamentName(); + } + + return $user->name; + } + + public function getWidgets(): array + { + return collect($this->widgets) + ->sortBy(fn (string $widget): int => $widget::getSort()) + ->toArray(); + } +} diff --git a/packages/admin/src/FilamentServiceProvider.php b/packages/admin/src/FilamentServiceProvider.php new file mode 100644 index 0000000000..4b234f0a4d --- /dev/null +++ b/packages/admin/src/FilamentServiceProvider.php @@ -0,0 +1,208 @@ +name('filament') + ->hasCommands($this->getCommands()) + ->hasConfigFile() + ->hasRoutes(['web']) + ->hasTranslations() + ->hasViews(); + } + + protected function getCommands(): array + { + $commands = [ + Commands\MakeBelongsToManyCommand::class, + Commands\MakeHasManyCommand::class, + Commands\MakePageCommand::class, + Commands\MakeResourceCommand::class, + Commands\MakeUserCommand::class, + Commands\MakeWidgetCommand::class, + Commands\UpgradeCommand::class, + ]; + + $aliases = []; + + foreach ($commands as $command) { + $class = 'Filament\\Commands\\Aliases\\' . class_basename($command); + + if (! class_exists($class)) { + continue; + } + + $aliases[] = $class; + } + + return array_merge($commands, $aliases); + } + + public function packageRegistered(): void + { + $this->app->singleton('filament', function (): FilamentManager { + return new FilamentManager(); + }); + + $this->mergeConfigFrom(__DIR__ . '/../config/filament.php', 'filament'); + + $this->discoverPages(); + $this->discoverResources(); + $this->discoverWidgets(); + } + + public function packageBooted(): void + { + $this->bootLivewireComponents(); + } + + protected function bootLivewireComponents(): void + { + Livewire::component('filament.core.auth.login', Login::class); + Livewire::component('filament.core.global-search', GlobalSearch::class); + Livewire::component('filament.core.pages.dashboard', Dashboard::class); + Livewire::component('filament.core.widgets.account-widget', AccountWidget::class); + Livewire::component('filament.core.widgets.filament-info-widget', FilamentInfoWidget::class); + + $this->registerLivewireComponentDirectory(app_path('Filament'), 'App\\Filament', 'filament.'); + } + + protected function discoverPages(): void + { + $filesystem = new Filesystem(); + + $filesystem->ensureDirectoryExists(config('filament.pages.path')); + + Filament::registerPages(config('filament.pages.register', [])); + + Filament::registerPages(collect($filesystem->allFiles(config('filament.pages.path'))) + ->map(function (SplFileInfo $file): string { + return (string) Str::of(config('filament.pages.namespace')) + ->append('\\', $file->getRelativePathname()) + ->replace(['/', '.php'], ['\\', '']); + }) + ->filter(fn (string $class): bool => is_subclass_of($class, Page::class) && (! (new ReflectionClass($class))->isAbstract())) + ->toArray()); + } + + protected function discoverResources(): void + { + $filesystem = new Filesystem(); + + $filesystem->ensureDirectoryExists(config('filament.resources.path')); + + Filament::registerResources(config('filament.resources.register', [])); + + Filament::registerResources(collect($filesystem->allFiles(config('filament.resources.path'))) + ->map(function (SplFileInfo $file): string { + return (string) Str::of(config('filament.resources.namespace')) + ->append('\\', $file->getRelativePathname()) + ->replace(['/', '.php'], ['\\', '']); + }) + ->filter(fn (string $class): bool => is_subclass_of($class, Resource::class) && (! (new ReflectionClass($class))->isAbstract())) + ->toArray()); + } + + protected function discoverWidgets(): void + { + $filesystem = new Filesystem(); + + $filesystem->ensureDirectoryExists(config('filament.widgets.path')); + + Filament::registerWidgets(config('filament.widgets.register', [])); + + Filament::registerWidgets(collect($filesystem->allFiles(config('filament.widgets.path'))) + ->map(function (SplFileInfo $file): string { + return (string) Str::of(config('filament.widgets.namespace')) + ->append('\\', $file->getRelativePathname()) + ->replace(['/', '.php'], ['\\', '']); + }) + ->filter(fn ($class): bool => is_subclass_of($class, Widget::class) && (! (new ReflectionClass($class))->isAbstract())) + ->toArray()); + } + + protected function mergeConfig(array $original, array $merging): array + { + $array = array_merge($original, $merging); + + foreach ($original as $key => $value) { + if (! is_array($value)) { + continue; + } + + if (! Arr::exists($merging, $key)) { + continue; + } + + if (is_numeric($key)) { + continue; + } + + if ($key === 'middleware' || $key === 'register') { + continue; + } + + $array[$key] = $this->mergeConfig($value, $merging[$key]); + } + + return $array; + } + + protected function mergeConfigFrom($path, $key): void + { + $config = $this->app['config']->get($key, []); + + $this->app['config']->set($key, $this->mergeConfig(require $path, $config)); + } + + protected function registerLivewireComponentDirectory(string $directory, string $namespace, string $aliasPrefix = ''): void + { + $filesystem = new Filesystem(); + + if (! $filesystem->isDirectory($directory)) { + return; + } + + collect($filesystem->allFiles($directory)) + ->map(function (SplFileInfo $file) use ($namespace): string { + return (string) Str::of($namespace) + ->append('\\', $file->getRelativePathname()) + ->replace(['/', '.php'], ['\\', '']); + }) + ->filter(fn (string $class): bool => is_subclass_of($class, Component::class) && (! (new ReflectionClass($class))->isAbstract())) + ->each(function (string $class) use ($namespace, $aliasPrefix): void { + $alias = Str::of($class) + ->after($namespace . '\\') + ->replace(['/', '\\'], '.') + ->prepend($aliasPrefix) + ->explode('.') + ->map([Str::class, 'kebab']) + ->implode('.'); + + Livewire::component($alias, $class); + }); + } +} diff --git a/packages/admin/src/Http/Controllers/AssetController.php b/packages/admin/src/Http/Controllers/AssetController.php new file mode 100644 index 0000000000..02ca323cba --- /dev/null +++ b/packages/admin/src/Http/Controllers/AssetController.php @@ -0,0 +1,72 @@ +pretendResponseIsFile(__DIR__ . '/../../../dist/app.css', 'text/css; charset=utf-8'); + case 'app.css.map': + return $this->pretendResponseIsFile(__DIR__ . '/../../../dist/app.css.map', 'text/css; charset=utf-8'); + case 'app.js': + return $this->pretendResponseIsFile(__DIR__ . '/../../../dist/app.js', 'application/javascript; charset=utf-8'); + case 'app.js.map': + return $this->pretendResponseIsFile(__DIR__ . '/../../../dist/app.js.map', 'application/json; charset=utf-8'); + } + + if (Str::endsWith($path, '.js')) { + abort_unless( + in_array($path, Filament::getScripts()), + 404 + ); + + return $this->pretendResponseIsFile($path, 'application/javascript; charset=utf-8'); + } + + if (Str::endsWith($path, '.css')) { + abort_unless( + in_array($path, Filament::getStyles()), + 404 + ); + + return $this->pretendResponseIsFile($path, 'text/css; charset=utf-8'); + } + + abort(404); + } + + protected function getHttpDate($timestamp) + { + return sprintf('%s GMT', gmdate('D, d M Y H:i:s', $timestamp)); + } + + protected function pretendResponseIsFile($path, $contentType) + { + abort_if(! file_exists($path), 404); + + $cacheControl = 'public, max-age=31536000'; + $expires = strtotime('+1 year'); + + $lastModified = filemtime($path); + + if (@strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'] ?? '') === $lastModified) { + return response()->noContent(304, [ + 'Expires' => $this->getHttpDate($expires), + 'Cache-Control' => $cacheControl, + ]); + } + + return response()->file($path, [ + 'Content-Type' => $contentType, + 'Expires' => $this->getHttpDate($expires), + 'Cache-Control' => $cacheControl, + 'Last-Modified' => $this->getHttpDate($lastModified), + ]); + } +} diff --git a/packages/admin/src/Http/Livewire/Auth/Login.php b/packages/admin/src/Http/Livewire/Auth/Login.php new file mode 100644 index 0000000000..83baf6be8d --- /dev/null +++ b/packages/admin/src/Http/Livewire/Auth/Login.php @@ -0,0 +1,84 @@ +check()) { + redirect()->intended(Filament::getUrl()); + } + + $this->form->fill(); + } + + public function authenticate(): void + { + try { + $this->rateLimit(5); + } catch (TooManyRequestsException $exception) { + $this->addError('email', __('filament::login.messages.throttled', [ + 'seconds' => $exception->secondsUntilAvailable, + 'minutes' => ceil($exception->secondsUntilAvailable / 60), + ])); + + return; + } + + $data = $this->form->getState(); + + if (! Filament::auth()->attempt([ + 'email' => $data['email'], + 'password' => $data['password'], + ], $data['remember'])) { + $this->addError('email', __('filament::login.messages.failed')); + + return; + } + + redirect()->intended(Filament::getUrl()); + } + + protected function getFormSchema(): array + { + return [ + TextInput::make('email') + ->label(__('filament::login.fields.email.label')) + ->email() + ->required() + ->autocomplete(), + TextInput::make('password') + ->label(__('filament::login.fields.password.label')) + ->password() + ->required(), + Checkbox::make('remember') + ->label(__('filament::login.fields.remember.label')), + ]; + } + + public function render(): View + { + return view('filament::login') + ->layout('filament::components.layouts.base', [ + 'title' => 'Login', + ]); + } +} diff --git a/packages/admin/src/Http/Livewire/GlobalSearch.php b/packages/admin/src/Http/Livewire/GlobalSearch.php new file mode 100644 index 0000000000..8185b5b54b --- /dev/null +++ b/packages/admin/src/Http/Livewire/GlobalSearch.php @@ -0,0 +1,58 @@ +searchQuery); + + if ($searchQuery === '') { + return null; + } + + $results = []; + + foreach (Filament::getResources() as $resource) { + if (! $resource::canGloballySearch()) { + continue; + } + + $resourceResults = $resource::getGlobalSearchResults($searchQuery); + + if (! $resourceResults->count()) { + continue; + } + + $results[$resource::getPluralLabel()] = $resourceResults; + } + + $this->dispatchBrowserEvent('open-global-search-results'); + + return $results; + } + + protected function isEnabled(): bool + { + foreach (Filament::getResources() as $resource) { + if ($resource::canGloballySearch()) { + return true; + } + } + + return false; + } + + public function render() + { + return view('filament::components.global-search.index', [ + 'results' => $this->getResults(), + ]); + } +} diff --git a/packages/admin/src/Http/Middleware/Authenticate.php b/packages/admin/src/Http/Middleware/Authenticate.php new file mode 100644 index 0000000000..6c16c73599 --- /dev/null +++ b/packages/admin/src/Http/Middleware/Authenticate.php @@ -0,0 +1,40 @@ +auth->guard($guardName); + + if (! $guard->check()) { + $this->unauthenticated($request, $guards); + + return; + } + + $this->auth->shouldUse($guardName); + + $user = $this->auth->user(); + + if (config('app.env') === 'local') { + return; + } + + if ($user instanceof FilamentUser && $user->canAccessFilament()) { + return; + } + + abort(404); + } + + protected function redirectTo($request): string + { + return route('filament.auth.login'); + } +} diff --git a/packages/admin/src/Http/Middleware/DispatchServingFilamentEvent.php b/packages/admin/src/Http/Middleware/DispatchServingFilamentEvent.php new file mode 100644 index 0000000000..7b77e2af8b --- /dev/null +++ b/packages/admin/src/Http/Middleware/DispatchServingFilamentEvent.php @@ -0,0 +1,17 @@ +config; + + $config->set('forms.default_filesystem_disk', $config->get('filament.default_filesystem_disk')); + $config->set('tables.default_filesystem_disk', $config->get('filament.default_filesystem_disk')); + + return $next($request); + } +} diff --git a/packages/admin/src/Models/Contracts/FilamentUser.php b/packages/admin/src/Models/Contracts/FilamentUser.php new file mode 100644 index 0000000000..55fd4c9921 --- /dev/null +++ b/packages/admin/src/Models/Contracts/FilamentUser.php @@ -0,0 +1,8 @@ +group = $group; + + return $this; + } + + public function icon(string $icon): static + { + $this->icon = $icon; + + return $this; + } + + public function isActiveWhen(Closure $callback): static + { + $this->isActiveWhen = $callback; + + return $this; + } + + public function label(string $label): static + { + $this->label = $label; + + return $this; + } + + public function sort(?int $sort): static + { + $this->sort = $sort; + + return $this; + } + + public function url(?string $url): static + { + $this->url = $url; + + return $this; + } + + public function getGroup(): ?string + { + return $this->group; + } + + public function getIcon(): string + { + return $this->icon; + } + + public function getLabel(): string + { + return $this->label; + } + + public function getSort(): int + { + return $this->sort ?? -1; + } + + public function getUrl(): ?string + { + return $this->url; + } + + public function isActive(): bool + { + $callback = $this->isActiveWhen; + + if ($callback === null) { + return false; + } + + return app()->call($callback); + } +} diff --git a/packages/admin/src/Pages/Actions/Action.php b/packages/admin/src/Pages/Actions/Action.php new file mode 100644 index 0000000000..4ed85b197a --- /dev/null +++ b/packages/admin/src/Pages/Actions/Action.php @@ -0,0 +1,51 @@ +name($name); + } + + public static function make(string $name): static + { + $static = new static($name); + $static->setUp(); + + return $static; + } + + protected function setUp(): void + { + } + + public function toHtml(): string + { + return $this->render()->render(); + } + + public function render(): View + { + return view($this->getView(), array_merge($this->data(), [ + 'action' => $this, + ])); + } +} diff --git a/packages/admin/src/Pages/Actions/ButtonAction.php b/packages/admin/src/Pages/Actions/ButtonAction.php new file mode 100644 index 0000000000..0b439fc8b1 --- /dev/null +++ b/packages/admin/src/Pages/Actions/ButtonAction.php @@ -0,0 +1,27 @@ +iconPosition = $position; + + return $this; + } + + public function getIconPosition(): ?string + { + return $this->iconPosition; + } +} diff --git a/packages/admin/src/Pages/Actions/Concerns/CanBeHidden.php b/packages/admin/src/Pages/Actions/Concerns/CanBeHidden.php new file mode 100644 index 0000000000..157a988f43 --- /dev/null +++ b/packages/admin/src/Pages/Actions/Concerns/CanBeHidden.php @@ -0,0 +1,20 @@ +isHidden = $condition; + + return $this; + } + + public function isHidden(): bool + { + return $this->isHidden; + } +} diff --git a/packages/admin/src/Pages/Actions/Concerns/CanOpenUrl.php b/packages/admin/src/Pages/Actions/Concerns/CanOpenUrl.php new file mode 100644 index 0000000000..ce3db98c27 --- /dev/null +++ b/packages/admin/src/Pages/Actions/Concerns/CanOpenUrl.php @@ -0,0 +1,35 @@ +shouldOpenUrlInNewTab = $condition; + + return $this; + } + + public function url(string | callable | null $url, bool $shouldOpenInNewTab = false): static + { + $this->shouldOpenUrlInNewTab = $shouldOpenInNewTab; + $this->url = $url; + + return $this; + } + + public function getUrl(): ?string + { + return value($this->url); + } + + public function shouldOpenUrlInNewTab(): bool + { + return $this->shouldOpenUrlInNewTab; + } +} diff --git a/packages/admin/src/Pages/Actions/Concerns/CanSubmitForm.php b/packages/admin/src/Pages/Actions/Concerns/CanSubmitForm.php new file mode 100644 index 0000000000..540f68d3d4 --- /dev/null +++ b/packages/admin/src/Pages/Actions/Concerns/CanSubmitForm.php @@ -0,0 +1,20 @@ +canSubmitForm = $condition; + + return $this; + } + + public function canSubmitForm(): bool + { + return $this->canSubmitForm; + } +} diff --git a/packages/admin/src/Pages/Actions/Concerns/HasAction.php b/packages/admin/src/Pages/Actions/Concerns/HasAction.php new file mode 100644 index 0000000000..8e2463788f --- /dev/null +++ b/packages/admin/src/Pages/Actions/Concerns/HasAction.php @@ -0,0 +1,20 @@ +action = $action; + + return $this; + } + + public function getAction(): string | null + { + return $this->action; + } +} diff --git a/packages/admin/src/Pages/Actions/Concerns/HasColor.php b/packages/admin/src/Pages/Actions/Concerns/HasColor.php new file mode 100644 index 0000000000..8de13e084b --- /dev/null +++ b/packages/admin/src/Pages/Actions/Concerns/HasColor.php @@ -0,0 +1,20 @@ +color = $color; + + return $this; + } + + public function getColor(): ?string + { + return $this->color; + } +} diff --git a/packages/admin/src/Pages/Actions/Concerns/HasIcon.php b/packages/admin/src/Pages/Actions/Concerns/HasIcon.php new file mode 100644 index 0000000000..9e8f0c0146 --- /dev/null +++ b/packages/admin/src/Pages/Actions/Concerns/HasIcon.php @@ -0,0 +1,20 @@ +icon = $icon; + + return $this; + } + + public function getIcon(): ?string + { + return $this->icon; + } +} diff --git a/packages/admin/src/Pages/Actions/Concerns/HasId.php b/packages/admin/src/Pages/Actions/Concerns/HasId.php new file mode 100644 index 0000000000..b1a7676906 --- /dev/null +++ b/packages/admin/src/Pages/Actions/Concerns/HasId.php @@ -0,0 +1,20 @@ +id = $id; + + return $this; + } + + public function getId(): string + { + return $this->id ?? $this->getName(); + } +} diff --git a/packages/admin/src/Pages/Actions/Concerns/HasLabel.php b/packages/admin/src/Pages/Actions/Concerns/HasLabel.php new file mode 100644 index 0000000000..78332e778b --- /dev/null +++ b/packages/admin/src/Pages/Actions/Concerns/HasLabel.php @@ -0,0 +1,26 @@ +label = $label; + + return $this; + } + + public function getLabel(): string + { + return $this->label ?? (string) Str::of($this->getName()) + ->before('.') + ->kebab() + ->replace(['-', '_'], ' ') + ->ucfirst(); + } +} diff --git a/packages/admin/src/Pages/Actions/Concerns/HasName.php b/packages/admin/src/Pages/Actions/Concerns/HasName.php new file mode 100644 index 0000000000..8e7990e236 --- /dev/null +++ b/packages/admin/src/Pages/Actions/Concerns/HasName.php @@ -0,0 +1,20 @@ +name = $name; + + return $this; + } + + public function getName(): string + { + return $this->name; + } +} diff --git a/packages/admin/src/Pages/Actions/Concerns/HasView.php b/packages/admin/src/Pages/Actions/Concerns/HasView.php new file mode 100644 index 0000000000..60711582f4 --- /dev/null +++ b/packages/admin/src/Pages/Actions/Concerns/HasView.php @@ -0,0 +1,20 @@ +view = $view; + + return $this; + } + + public function getView(): string + { + return $this->view; + } +} diff --git a/packages/admin/src/Pages/Actions/SelectAction.php b/packages/admin/src/Pages/Actions/SelectAction.php new file mode 100644 index 0000000000..ebc44a3b47 --- /dev/null +++ b/packages/admin/src/Pages/Actions/SelectAction.php @@ -0,0 +1,46 @@ +options = $options; + + return $this; + } + + public function placeholder(string $placeholder): static + { + $this->placeholder = $placeholder; + + return $this; + } + + public function getOptions(): array + { + $options = $this->options; + + if ($options instanceof Arrayable) { + $options = $options->toArray(); + } + + return $options; + } + + public function getPlaceholder(): ?string + { + return $this->placeholder; + } +} diff --git a/packages/admin/src/Pages/Dashboard.php b/packages/admin/src/Pages/Dashboard.php new file mode 100644 index 0000000000..f05901febb --- /dev/null +++ b/packages/admin/src/Pages/Dashboard.php @@ -0,0 +1,27 @@ +name(static::getSlug()); + }; + } + + protected function getTitle(): string + { + return static::$title ?? __('filament::pages/dashboard.title'); + } +} diff --git a/packages/admin/src/Pages/Page.php b/packages/admin/src/Pages/Page.php new file mode 100644 index 0000000000..25501461c3 --- /dev/null +++ b/packages/admin/src/Pages/Page.php @@ -0,0 +1,172 @@ +group(static::getNavigationGroup()) + ->icon(static::getNavigationIcon()) + ->isActiveWhen(fn (): bool => request()->routeIs([ + $routeName = static::getRouteName(), + "{$routeName}*", + ])) + ->label(static::getNavigationLabel()) + ->sort(static::getNavigationSort()) + ->url(static::getNavigationUrl()), + ]); + } + + public static function getRouteName(): string + { + $slug = static::getSlug(); + + return "filament.pages.{$slug}"; + } + + public static function getRoutes(): Closure + { + return function () { + $slug = static::getSlug(); + + Route::get($slug, static::class)->name($slug); + }; + } + + public static function getSlug(): string + { + return static::$slug ?? Str::kebab(static::$title ?? class_basename(static::class)); + } + + public static function getUrl(array $parameters = [], bool $absolute = true): string + { + return route(static::getRouteName(), $parameters, $absolute); + } + + protected function notify(string $status, string $message): void + { + session()->flash('notification', [ + 'message' => $message, + 'status' => $status, + ]); + } + + public function render(): View + { + return view(static::$view, $this->getViewData()) + ->layout(static::$layout, $this->getLayoutData()); + } + + protected function getBreadcrumbs(): array + { + return []; + } + + protected static function getNavigationGroup(): ?string + { + return static::$navigationGroup; + } + + protected static function getNavigationIcon(): string + { + return static::$navigationIcon ?? 'heroicon-o-document-text'; + } + + protected static function getNavigationLabel(): string + { + return static::$navigationLabel ?? static::$title ?? Str::of(class_basename(static::class)) + ->kebab() + ->replace('-', ' ') + ->title(); + } + + protected static function getNavigationSort(): ?int + { + return static::$navigationSort; + } + + protected static function getNavigationUrl(): string + { + return static::getUrl(); + } + + protected function getActions(): array | View | null + { + return null; + } + + protected function getFooter(): ?View + { + return null; + } + + protected function getHeader(): ?View + { + return null; + } + + protected function getHeading(): string + { + return $this->getTitle(); + } + + protected function getTitle(): string + { + return static::$title ?? (string) Str::of(class_basename(static::class)) + ->kebab() + ->replace('-', ' ') + ->title(); + } + + protected function getLayoutData(): array + { + return [ + 'breadcrumbs' => $this->getBreadcrumbs(), + 'title' => $this->getTitle(), + ]; + } + + protected function getViewData(): array + { + return []; + } +} diff --git a/packages/admin/src/PluginServiceProvider.php b/packages/admin/src/PluginServiceProvider.php new file mode 100644 index 0000000000..9582df5f18 --- /dev/null +++ b/packages/admin/src/PluginServiceProvider.php @@ -0,0 +1,94 @@ +name(static::$name) + ->hasTranslations() + ->hasViews(); + } + + public function packageRegistered(): void + { + Facades\Filament::registerPages($this->getPages()); + Facades\Filament::registerResources($this->getResources()); + Facades\Filament::registerWidgets($this->getWidgets()); + + Facades\Filament::serving(function () { + Facades\Filament::registerScripts($this->getScripts()); + Facades\Filament::registerStyles($this->getStyles()); + Facades\Filament::registerScriptData($this->getScriptData()); + }); + } + + public function packageBooted(): void + { + foreach ($this->getPages() as $page) { + Livewire::component($page::getName(), $page); + } + + foreach ($this->getResources() as $resource) { + foreach ($resource::getPages() as $page) { + Livewire::component($page['class']::getName(), $page['class']); + } + + foreach ($resource::getRelations() as $relation) { + Livewire::component($relation::getName(), $relation); + } + } + + foreach ($this->getWidgets() as $widget) { + Livewire::component($widget::getName(), $widget); + } + } + + protected function getPages(): array + { + return $this->pages; + } + + protected function getResources(): array + { + return $this->resources; + } + + protected function getScriptData(): array + { + return []; + } + + protected function getScripts(): array + { + return $this->scripts; + } + + protected function getStyles(): array + { + return $this->styles; + } + + protected function getWidgets(): array + { + return $this->widgets; + } +} diff --git a/packages/admin/src/Resources/Form.php b/packages/admin/src/Resources/Form.php new file mode 100644 index 0000000000..bcf065aaf3 --- /dev/null +++ b/packages/admin/src/Resources/Form.php @@ -0,0 +1,51 @@ +columns = $columns; + + return $this; + } + + public function schema(array | Component $schema): static + { + $this->schema = $schema; + + return $this; + } + + public function getColumns(): array | int | null + { + return $this->columns; + } + + public function getSchema(): array | Component + { + $schema = $this->schema; + + if (is_array($this->schema)) { + $schema = Grid::make() + ->schema($schema) + ->columns($this->getColumns()); + } + + return [$schema]; + } +} diff --git a/packages/admin/src/Resources/Pages/Concerns/HasRecordBreadcrumb.php b/packages/admin/src/Resources/Pages/Concerns/HasRecordBreadcrumb.php new file mode 100644 index 0000000000..853bb17749 --- /dev/null +++ b/packages/admin/src/Resources/Pages/Concerns/HasRecordBreadcrumb.php @@ -0,0 +1,33 @@ + $resource::getBreadcrumb(), + ]; + + if ($resource::hasRecordTitle()) { + if ($resource::canEdit($this->record)) { + $breadcrumbs[ + $resource::getUrl('edit', ['record' => $this->record]) + ] = $this->getRecordTitle(); + } elseif ($resource::canView($this->record)) { + $breadcrumbs[ + $resource::getUrl('view', ['record' => $this->record]) + ] = $this->getRecordTitle(); + } else { + $breadcrumbs[] = $this->getRecordTitle(); + } + } + + $breadcrumbs[] = $this->getBreadcrumb(); + + return $breadcrumbs; + } +} diff --git a/packages/admin/src/Resources/Pages/Concerns/InteractsWithRecord.php b/packages/admin/src/Resources/Pages/Concerns/InteractsWithRecord.php new file mode 100644 index 0000000000..8b50a26053 --- /dev/null +++ b/packages/admin/src/Resources/Pages/Concerns/InteractsWithRecord.php @@ -0,0 +1,31 @@ +setModel(static::getModel(), [$key]); + } + + return $record; + } + + protected function getRecordTitle(): ?string + { + $resource = static::getResource(); + + if (! $resource::hasRecordTitle()) { + return null; + } + + return $resource::getRecordTitle($this->record); + } +} diff --git a/packages/admin/src/Resources/Pages/Concerns/UsesResourceForm.php b/packages/admin/src/Resources/Pages/Concerns/UsesResourceForm.php new file mode 100644 index 0000000000..0b9eee4034 --- /dev/null +++ b/packages/admin/src/Resources/Pages/Concerns/UsesResourceForm.php @@ -0,0 +1,19 @@ +resourceForm) { + $this->resourceForm = static::getResource()::form(Form::make($this)->columns(2)); + } + + return $this->resourceForm; + } +} diff --git a/packages/admin/src/Resources/Pages/CreateRecord.php b/packages/admin/src/Resources/Pages/CreateRecord.php new file mode 100644 index 0000000000..df914ecbf4 --- /dev/null +++ b/packages/admin/src/Resources/Pages/CreateRecord.php @@ -0,0 +1,127 @@ +fillForm(); + } + + protected function fillForm(): void + { + $this->callHook('beforeFill'); + + $this->form->fill(); + + $this->callHook('afterFill'); + } + + public function create(bool $another = false): void + { + $this->callHook('beforeValidate'); + + $data = $this->form->getState(); + + $this->callHook('afterValidate'); + + $this->callHook('beforeCreate'); + + $this->record = static::getModel()::create($data); + + $this->form->model($this->record)->saveRelationships(); + + $this->callHook('afterCreate'); + + if ($another) { + $this->fillForm(); + + $this->notify('success', __('filament::resources/pages/create-record.messages.created')); + + return; + } + + if ($redirectUrl = $this->getRedirectUrl()) { + $this->redirect($redirectUrl); + } + } + + protected function getFormActions(): array + { + return [ + $this->getCreateButtonFormAction(), + $this->getCreateAndCreateAnotherButtonFormAction(), + $this->getCancelButtonFormAction(), + ]; + } + + protected function getCreateButtonFormAction(): ButtonAction + { + return ButtonAction::make('create') + ->label(__('filament::resources/pages/create-record.form.actions.create.label')) + ->submit(); + } + + protected function getCreateAndCreateAnotherButtonFormAction(): ButtonAction + { + return ButtonAction::make('createAnother') + ->label(__('filament::resources/pages/create-record.form.actions.create_and_create_another.label')) + ->action('create(true)') + ->color('secondary'); + } + + protected function getCancelButtonFormAction(): ButtonAction + { + return ButtonAction::make('cancel') + ->label(__('filament::resources/pages/create-record.form.actions.cancel.label')) + ->url(static::getResource()::getUrl()) + ->color('secondary'); + } + + protected function getForms(): array + { + return [ + 'form' => $this->makeForm() + ->model(static::getModel()) + ->schema($this->getResourceForm()->getSchema()) + ->statePath('data'), + ]; + } + + protected function getRedirectUrl(): ?string + { + $resource = static::getResource(); + + if ($resource::canEdit($this->record)) { + return $resource::getUrl('edit', ['record' => $this->record]); + } + + if ($resource::canView($this->record)) { + return $resource::getUrl('view', ['record' => $this->record]); + } + + return null; + } +} diff --git a/packages/admin/src/Resources/Pages/EditRecord.php b/packages/admin/src/Resources/Pages/EditRecord.php new file mode 100644 index 0000000000..1dbf244b89 --- /dev/null +++ b/packages/admin/src/Resources/Pages/EditRecord.php @@ -0,0 +1,159 @@ +record = $this->getRecord($record); + + abort_unless(static::getResource()::canEdit($this->record), 403); + + $this->fillForm(); + + $this->activeRelationManager = $this->getResource()::getRelations()[0] ?? null; + } + + protected function fillForm(): void + { + $this->callHook('beforeFill'); + + $this->form->fill($this->record->toArray()); + + $this->callHook('afterFill'); + } + + public function save(bool $shouldRedirect = true): void + { + $this->callHook('beforeValidate'); + + $data = $this->form->getState(); + + $this->callHook('afterValidate'); + + $this->callHook('beforeSave'); + + $this->record->update($data); + + $this->callHook('afterSave'); + + if ($shouldRedirect && ($redirectUrl = $this->getRedirectUrl())) { + $this->redirect($redirectUrl); + } else { + $this->notify('success', __('filament::resources/pages/edit-record.messages.saved')); + } + } + + public function openDeleteModal(): void + { + $this->dispatchBrowserEvent('open-modal', [ + 'id' => 'delete', + ]); + } + + public function delete(): void + { + abort_unless(static::getResource()::canDelete($this->record), 403); + + $this->callHook('beforeDelete'); + + $this->record->delete(); + + $this->callHook('afterDelete'); + + $this->redirect(static::getResource()::getUrl('index')); + } + + protected function getActions(): array + { + $resource = static::getResource(); + + return array_merge( + ($resource::canView($this->record) ? [$this->getViewButtonAction()] : []), + ($resource::canDelete($this->record) ? [$this->getDeleteButtonAction()] : []), + ); + } + + protected function getViewButtonAction(): ButtonAction + { + return ButtonAction::make('view') + ->label(__('filament::resources/pages/edit-record.actions.view.label')) + ->url(fn () => static::getResource()::getUrl('view', ['record' => $this->record])) + ->color('secondary'); + } + + protected function getDeleteButtonAction(): ButtonAction + { + return ButtonAction::make('delete') + ->label(__('filament::resources/pages/edit-record.actions.delete.label')) + ->action('openDeleteModal') + ->color('danger'); + } + + protected function getTitle(): string + { + return static::$title ?? (($recordTitle = $this->getRecordTitle()) ? __('filament::resources/pages/edit-record.title', ['record' => $recordTitle]) : parent::getTitle()); + } + + protected function getFormActions(): array + { + return [ + $this->getSaveButtonFormAction(), + $this->getCancelButtonFormAction(), + ]; + } + + protected function getSaveButtonFormAction(): ButtonAction + { + return ButtonAction::make('save') + ->label(__('filament::resources/pages/edit-record.form.actions.save.label')) + ->submit(); + } + + protected function getCancelButtonFormAction(): ButtonAction + { + return ButtonAction::make('cancel') + ->label(__('filament::resources/pages/edit-record.form.actions.cancel.label')) + ->url(static::getResource()::getUrl()) + ->color('secondary'); + } + + protected function getForms(): array + { + return [ + 'form' => $this->makeForm() + ->model($this->record) + ->schema($this->getResourceForm()->getSchema()) + ->statePath('data'), + ]; + } + + protected function getRedirectUrl(): ?string + { + return null; + } +} diff --git a/packages/admin/src/Resources/Pages/ListRecords.php b/packages/admin/src/Resources/Pages/ListRecords.php new file mode 100644 index 0000000000..d278783f4e --- /dev/null +++ b/packages/admin/src/Resources/Pages/ListRecords.php @@ -0,0 +1,173 @@ + ['except' => ''], + ]; + + public function mount(): void + { + static::authorizeResourceAccess(); + } + + public function getBreadcrumb(): string + { + return static::$breadcrumb ?? __('filament::resources/pages/list-records.breadcrumb'); + } + + protected function getResourceTable(): Table + { + if (! $this->resourceTable) { + $table = Table::make(); + + $resource = static::getResource(); + + $table->actions(array_merge( + ($resource::hasPage('view') ? [$this->getViewLinkTableAction()] : []), + ($resource::hasPage('edit') ? [$this->getEditLinkTableAction()] : []), + )); + + if ($resource::canDeleteAny()) { + $table->bulkActions([$this->getDeleteTableBulkAction()]); + } + + $this->resourceTable = static::getResource()::table($table); + } + + return $this->resourceTable; + } + + protected function getViewLinkTableAction(): Tables\Actions\LinkAction + { + $resource = static::getResource(); + + return Tables\Actions\LinkAction::make('view') + ->label(__('filament::resources/pages/list-records.table.actions.view.label')) + ->url(fn (Model $record): string => $resource::getUrl('view', ['record' => $record])) + ->hidden(fn (Model $record): bool => ! $resource::canView($record)); + } + + protected function getEditLinkTableAction(): Tables\Actions\LinkAction + { + $resource = static::getResource(); + + return Tables\Actions\LinkAction::make('edit') + ->label(__('filament::resources/pages/list-records.table.actions.edit.label')) + ->url(fn (Model $record): string => $resource::getUrl('edit', ['record' => $record])) + ->hidden(fn (Model $record): bool => ! $resource::canEdit($record)); + } + + protected function getDeleteTableBulkAction(): Tables\Actions\BulkAction + { + return Tables\Actions\BulkAction::make('delete') + ->label(__('filament::resources/pages/list-records.table.bulk_actions.delete.label')) + ->action(fn (Collection $records) => $records->each->delete()) + ->requiresConfirmation() + ->deselectRecordsAfterCompletion() + ->color('danger') + ->icon('heroicon-o-trash'); + } + + protected function getTitle(): string + { + return static::$title ?? Str::title(static::getResource()::getPluralLabel()); + } + + protected function getActions(): array + { + $resource = static::getResource(); + + if (! $resource::canCreate()) { + return []; + } + + return [$this->getCreateButtonAction()]; + } + + protected function getCreateButtonAction(): ButtonAction + { + $resource = static::getResource(); + $label = $resource::getLabel(); + + return ButtonAction::make('create') + ->label("New {$label}") + ->url(fn () => $resource::getUrl('create')); + } + + protected function getDefaultTableSortColumn(): ?string + { + return $this->getResourceTable()->getDefaultSortColumn(); + } + + protected function getDefaultTableSortDirection(): ?string + { + return $this->getResourceTable()->getDefaultSortDirection(); + } + + protected function getTableActions(): array + { + return $this->getResourceTable()->getActions(); + } + + protected function getTableBulkActions(): array + { + return $this->getResourceTable()->getBulkActions(); + } + + protected function getTableColumns(): array + { + return $this->getResourceTable()->getColumns(); + } + + protected function getTableFilters(): array + { + return $this->getResourceTable()->getFilters(); + } + + protected function getTableHeaderActions(): array + { + return $this->getResourceTable()->getHeaderActions(); + } + + protected function getTableRecordUrlUsing(): ?Closure + { + return function (Model $record): ?string { + $resource = static::getResource(); + + if ($resource::canEdit($record)) { + return $resource::getUrl('edit', ['record' => $record]); + } + + if ($resource::canView($record)) { + return $resource::getUrl('view', ['record' => $record]); + } + + return null; + }; + } + + protected function getTableQuery(): Builder + { + return static::getResource()::getEloquentQuery(); + } +} diff --git a/packages/admin/src/Resources/Pages/Page.php b/packages/admin/src/Resources/Pages/Page.php new file mode 100644 index 0000000000..fc20eee81b --- /dev/null +++ b/packages/admin/src/Resources/Pages/Page.php @@ -0,0 +1,59 @@ + static::class, + 'route' => $path, + ]; + } + + public function getBreadcrumb(): string + { + return static::$breadcrumb ?? static::getTitle(); + } + + protected function getBreadcrumbs(): array + { + $resource = static::getResource(); + + return [ + $resource::getUrl() => $resource::getBreadcrumb(), + $this->getBreadcrumb(), + ]; + } + + public static function authorizeResourceAccess(): void + { + abort_unless(static::getResource()::canViewAny(), 403); + } + + public static function getModel(): string + { + return static::getResource()::getModel(); + } + + public static function getResource(): string + { + return static::$resource; + } + + protected function callHook(string $hook): void + { + if (! method_exists($this, $hook)) { + return; + } + + $this->{$hook}(); + } +} diff --git a/packages/admin/src/Resources/Pages/ViewRecord.php b/packages/admin/src/Resources/Pages/ViewRecord.php new file mode 100644 index 0000000000..9820d23e9a --- /dev/null +++ b/packages/admin/src/Resources/Pages/ViewRecord.php @@ -0,0 +1,79 @@ +record = $this->getRecord($record); + + abort_unless(static::getResource()::canView($this->record), 403); + + $this->fillForm(); + } + + protected function fillForm(): void + { + $this->callHook('beforeFill'); + + $this->form->fill($this->record->toArray()); + + $this->callHook('afterFill'); + } + + protected function getActions(): array + { + $resource = static::getResource(); + + if (! $resource::canEdit($this->record)) { + return []; + } + + return [$this->getEditButtonAction()]; + } + + protected function getEditButtonAction(): ButtonAction + { + return ButtonAction::make('edit') + ->label(__('filament::resources/pages/view-record.actions.edit.label')) + ->url(fn () => static::getResource()::getUrl('edit', ['record' => $this->record])); + } + + protected function getTitle(): string + { + return static::$title ?? (($recordTitle = $this->getRecordTitle()) ? $recordTitle : parent::getTitle()); + } + + protected function getForms(): array + { + return [ + 'form' => $this->makeForm() + ->disabled() + ->model($this->record) + ->schema($this->getResourceForm()->getSchema()) + ->statePath('data'), + ]; + } +} diff --git a/packages/admin/src/Resources/RelationManagers/BelongsToManyRelationManager.php b/packages/admin/src/Resources/RelationManagers/BelongsToManyRelationManager.php new file mode 100644 index 0000000000..f5cbe87d6b --- /dev/null +++ b/packages/admin/src/Resources/RelationManagers/BelongsToManyRelationManager.php @@ -0,0 +1,101 @@ +resourceTable) { + $table = Table::make(); + + $table->actions([ + $this->getEditLinkTableAction(), + $this->getDetachLinkTableAction(), + $this->getDeleteLinkTableAction(), + ]); + + $table->bulkActions(array_merge( + ($this->canDeleteAny() ? [$this->getDeleteTableBulkAction()] : []), + ($this->canDetachAny() ? [$this->getDetachTableBulkAction()] : []), + )); + + $table->headerActions(array_merge( + ($this->canCreate() ? [$this->getCreateButtonTableHeaderAction()] : []), + ($this->canAttach() ? [$this->getAttachButtonTableHeaderAction()] : []), + )); + + $this->resourceTable = static::table($table); + } + + return $this->resourceTable; + } + + protected function create(): void + { + $this->callHook('beforeValidate'); + $this->callHook('beforeCreateValidate'); + + $data = $this->getMountedTableActionForm()->getState(); + + $this->callHook('afterValidate'); + $this->callHook('afterCreateValidate'); + + $this->callHook('beforeCreate'); + + $relationship = $this->getRelationship(); + $pivotColumns = $relationship->getPivotColumns(); + $pivotData = Arr::only($data, $pivotColumns); + $data = Arr::except($data, $pivotColumns); + + $record = $relationship->getQuery()->create($data); + $this->getMountedTableActionForm()->model($record)->saveRelationships(); + $relationship->attach($record, $pivotData); + + $this->callHook('afterCreate'); + } + + protected function save(): void + { + $this->callHook('beforeValidate'); + $this->callHook('beforeEditValidate'); + + $data = $this->getMountedTableActionForm()->getState(); + + $this->callHook('afterValidate'); + $this->callHook('afterEditValidate'); + + $this->callHook('beforeSave'); + + $relationship = $this->getRelationship(); + $pivotColumns = $relationship->getPivotColumns(); + $pivotData = Arr::only($data, $pivotColumns); + $data = Arr::except($data, $pivotColumns); + + $record = $this->getMountedTableActionRecord(); + $record->update($data); + $relationship->updateExistingPivot($record, $pivotData); + + $this->callHook('afterSave'); + } + + // https://github.com/laravel/framework/issues/4962 + protected function getTableQuery(): Builder + { + $query = parent::getTableQuery(); + + return $query->select($this->getRelationship()->getTable().'.*', $query->getModel()->getTable().'.*'); + } +} diff --git a/packages/admin/src/Resources/RelationManagers/Concerns/CanAttachRecords.php b/packages/admin/src/Resources/RelationManagers/Concerns/CanAttachRecords.php new file mode 100644 index 0000000000..a0235ad220 --- /dev/null +++ b/packages/admin/src/Resources/RelationManagers/Concerns/CanAttachRecords.php @@ -0,0 +1,136 @@ +can('attach'); + } + + public static function attachForm(Form $form): Form + { + return $form->schema([ + static::getAttachFormRecordSelect(), + ]); + } + + protected function getResourceAttachForm(): Form + { + if (! $this->resourceAttachForm) { + $this->resourceAttachForm = static::attachForm(Form::make($this)); + } + + return $this->resourceAttachForm; + } + + protected static function getAttachFormRecordSelect(): Select + { + return Select::make('recordId') + ->label(__('filament::resources/relation-managers/attach.action.modal.fields.record_id.label')) + ->searchable() + ->getSearchResultsUsing(function (RelationManager $livewire, string $query): array { + $relationship = $livewire->getRelationship(); + + $displayColumnName = static::getRecordTitleAttribute(); + + $relationshipQuery = $relationship->getRelated()->orderBy($displayColumnName); + + $query = strtolower($query); + $searchOperator = match ($relationshipQuery->getConnection()->getDriverName()) { + 'pgsql' => 'ilike', + default => 'like', + }; + + return $relationshipQuery + ->where($displayColumnName, $searchOperator, "%{$query}%") + ->whereDoesntHave($livewire->getInverseRelationshipName(), function (Builder $query) use ($livewire): void { + $query->where($livewire->ownerRecord->getQualifiedKeyName(), $livewire->ownerRecord->getKey()); + }) + ->pluck($displayColumnName, $relationship->getRelated()->getKeyName()) + ->toArray(); + }) + ->getOptionLabelUsing(fn (RelationManager $livewire, $value): ?string => static::getRecordTitle($livewire->getRelationship()->getRelated()->find($value))) + ->disableLabel(); + } + + protected function getAttachFormSchema(): array + { + return $this->getResourceAttachForm()->getSchema(); + } + + protected function fillAttachForm(): void + { + $this->callHook('beforeFill'); + $this->callHook('beforeAttachFill'); + + $this->getMountedTableActionForm()->fill(); + + $this->callHook('afterFill'); + $this->callHook('afterAttachFill'); + } + + public function attach(bool $another = false): void + { + $form = $this->getMountedTableActionForm(); + + $this->callHook('beforeValidate'); + $this->callHook('beforeCreateValidate'); + + $data = $form->getState(); + + $this->callHook('afterValidate'); + $this->callHook('afterCreateValidate'); + + $this->callHook('beforeCreate'); + + $relationship = $this->getRelationship(); + $pivotColumns = $relationship->getPivotColumns(); + + $record = $relationship->getRelated()->find($data['recordId']); + $relationship->attach($record, Arr::only($data, $pivotColumns)); + + $this->callHook('afterCreate'); + + if ($another) { + $form->fill(); + } + } + + protected function getAttachButtonTableHeaderAction(): Tables\Actions\ButtonAction + { + return Tables\Actions\ButtonAction::make('attach') + ->label(__('filament::resources/relation-managers/attach.action.label')) + ->form($this->getAttachFormSchema()) + ->mountUsing(fn () => $this->fillAttachForm()) + ->modalActions([ + ButtonAction::make('submit') + ->label(__('filament::resources/relation-managers/attach.action.modal.actions.attach.label')) + ->submit() + ->color('primary'), + ButtonAction::make('submit') + ->label(__('filament::resources/relation-managers/attach.action.modal.actions.attach_and_attach_another.label')) + ->action('attach(true)') + ->color('secondary'), + ButtonAction::make('cancel') + ->label(__('tables::table.actions.modal.buttons.cancel.label')) + ->cancel() + ->color('secondary'), + ]) + ->modalHeading(__('filament::resources/relation-managers/attach.action.modal.heading', ['label' => static::getRecordLabel()])) + ->modalWidth('lg') + ->action(fn () => $this->attach()) + ->color('secondary'); + } +} diff --git a/packages/admin/src/Resources/RelationManagers/Concerns/CanCreateRecords.php b/packages/admin/src/Resources/RelationManagers/Concerns/CanCreateRecords.php new file mode 100644 index 0000000000..ec53cba585 --- /dev/null +++ b/packages/admin/src/Resources/RelationManagers/Concerns/CanCreateRecords.php @@ -0,0 +1,78 @@ +can('create'); + } + + protected function getCreateFormSchema(): array + { + return $this->getResourceForm()->getSchema(); + } + + protected function fillCreateForm(): void + { + $this->callHook('beforeFill'); + $this->callHook('beforeCreateFill'); + + $this->getMountedTableActionForm()->fill(); + + $this->callHook('afterFill'); + $this->callHook('afterCreateFill'); + } + + public function create(bool $another = false): void + { + $form = $this->getMountedTableActionForm(); + + $this->callHook('beforeValidate'); + $this->callHook('beforeCreateValidate'); + + $data = $form->getState(); + + $this->callHook('afterValidate'); + $this->callHook('afterCreateValidate'); + + $this->callHook('beforeCreate'); + + $record = $this->getRelationship()->create($data); + $form->model($record)->saveRelationships(); + + $this->callHook('afterCreate'); + + if ($another) { + $form->fill(); + } + } + + protected function getCreateButtonTableHeaderAction(): Tables\Actions\ButtonAction + { + return Tables\Actions\ButtonAction::make('create') + ->label(__('filament::resources/relation-managers/create.action.label')) + ->form($this->getCreateFormSchema()) + ->mountUsing(fn () => $this->fillCreateForm()) + ->modalActions([ + ButtonAction::make('submit') + ->label(__('filament::resources/relation-managers/create.action.modal.actions.create.label')) + ->submit() + ->color('primary'), + ButtonAction::make('submit') + ->label(__('filament::resources/relation-managers/create.action.modal.actions.create_and_create_another.label')) + ->action('create(true)') + ->color('secondary'), + ButtonAction::make('cancel') + ->label(__('tables::table.actions.modal.buttons.cancel.label')) + ->cancel() + ->color('secondary'), + ]) + ->modalHeading(__('filament::resources/relation-managers/create.action.modal.heading', ['label' => static::getRecordLabel()])) + ->action(fn () => $this->create()); + } +} diff --git a/packages/admin/src/Resources/RelationManagers/Concerns/CanDeleteRecords.php b/packages/admin/src/Resources/RelationManagers/Concerns/CanDeleteRecords.php new file mode 100644 index 0000000000..96c3777f4b --- /dev/null +++ b/packages/admin/src/Resources/RelationManagers/Concerns/CanDeleteRecords.php @@ -0,0 +1,52 @@ +can('delete', $record); + } + + protected function canDeleteAny(): bool + { + return $this->can('deleteAny'); + } + + public function delete(): void + { + $this->callHook('beforeDelete'); + + $this->getMountedTableActionRecord()->delete(); + + $this->callHook('afterDelete'); + } + + protected function getDeleteLinkTableAction(): Tables\Actions\LinkAction + { + return Tables\Actions\LinkAction::make('delete') + ->label(__('filament::resources/relation-managers/delete.action.label')) + ->requiresConfirmation() + ->modalHeading(__('filament::resources/relation-managers/delete.action.modal.heading', ['label' => static::getRecordLabel()])) + ->action(fn () => $this->delete()) + ->color('danger') + ->hidden(fn (Model $record): bool => ! static::canDelete($record)); + } + + protected function getDeleteTableBulkAction(): Tables\Actions\BulkAction + { + return Tables\Actions\BulkAction::make('delete') + ->label(__('filament::resources/relation-managers/delete.bulk_action.label')) + ->action(fn (Collection $records) => $records->each->delete()) + ->requiresConfirmation() + ->modalHeading(__('filament::resources/relation-managers/delete.bulk_action.modal.heading', ['label' => static::getPluralRecordLabel()])) + ->deselectRecordsAfterCompletion() + ->color('danger') + ->icon('heroicon-o-trash'); + } +} diff --git a/packages/admin/src/Resources/RelationManagers/Concerns/CanDetachRecords.php b/packages/admin/src/Resources/RelationManagers/Concerns/CanDetachRecords.php new file mode 100644 index 0000000000..dad6cdaead --- /dev/null +++ b/packages/admin/src/Resources/RelationManagers/Concerns/CanDetachRecords.php @@ -0,0 +1,52 @@ +can('detach', $record); + } + + protected function canDetachAny(): bool + { + return $this->can('detachAny'); + } + + public function detach(): void + { + $this->callHook('beforeDetach'); + + $this->getRelationship()->detach($this->getMountedTableActionRecord()); + + $this->callHook('afterDetach'); + } + + protected function getDetachLinkTableAction(): Tables\Actions\LinkAction + { + return Tables\Actions\LinkAction::make('detach') + ->label(__('filament::resources/relation-managers/detach.action.label')) + ->requiresConfirmation() + ->modalHeading(__('filament::resources/relation-managers/detach.action.modal.heading', ['label' => static::getRecordLabel()])) + ->action(fn () => $this->detach()) + ->color('danger') + ->hidden(fn (Model $record): bool => ! static::canDetach($record)); + } + + protected function getDetachTableBulkAction(): Tables\Actions\BulkAction + { + return Tables\Actions\BulkAction::make('detach') + ->label(__('filament::resources/relation-managers/detach.bulk_action.label')) + ->action(fn (Collection $records) => $this->getRelationship()->detach($records)) + ->requiresConfirmation() + ->modalHeading(__('filament::resources/relation-managers/detach.bulk_action.modal.heading', ['label' => static::getPluralRecordLabel()])) + ->deselectRecordsAfterCompletion() + ->color('danger') + ->icon('heroicon-o-x'); + } +} diff --git a/packages/admin/src/Resources/RelationManagers/Concerns/CanEditRecords.php b/packages/admin/src/Resources/RelationManagers/Concerns/CanEditRecords.php new file mode 100644 index 0000000000..6bf385f942 --- /dev/null +++ b/packages/admin/src/Resources/RelationManagers/Concerns/CanEditRecords.php @@ -0,0 +1,61 @@ +can('update', $record); + } + + protected function getEditFormSchema(): array + { + return $this->getResourceForm()->getSchema(); + } + + protected function fillEditForm(): void + { + $this->callHook('beforeFill'); + $this->callHook('beforeEditFill'); + + $this->getMountedTableActionForm()->fill( + $this->getMountedTableActionRecord()->toArray(), + ); + + $this->callHook('afterFill'); + $this->callHook('afterEditFill'); + } + + public function save(): void + { + $this->callHook('beforeValidate'); + $this->callHook('beforeEditValidate'); + + $data = $this->getMountedTableActionForm()->getState(); + + $this->callHook('afterValidate'); + $this->callHook('afterEditValidate'); + + $this->callHook('beforeSave'); + + $this->getMountedTableActionRecord()->update($data); + + $this->callHook('afterSave'); + } + + protected function getEditLinkTableAction(): Tables\Actions\LinkAction + { + return Tables\Actions\LinkAction::make('edit') + ->label(__('filament::resources/relation-managers/edit.action.label')) + ->form($this->getEditFormSchema()) + ->mountUsing(fn () => $this->fillEditForm()) + ->modalButton(__('filament::resources/relation-managers/edit.action.modal.actions.save.label')) + ->modalHeading(__('filament::resources/relation-managers/edit.action.modal.heading', ['label' => static::getRecordLabel()])) + ->action(fn () => $this->save()) + ->hidden(fn (Model $record): bool => ! static::canEdit($record)); + } +} diff --git a/packages/admin/src/Resources/RelationManagers/HasManyRelationManager.php b/packages/admin/src/Resources/RelationManagers/HasManyRelationManager.php new file mode 100644 index 0000000000..e06162a1ac --- /dev/null +++ b/packages/admin/src/Resources/RelationManagers/HasManyRelationManager.php @@ -0,0 +1,38 @@ +resourceTable) { + $table = Table::make(); + + $table->actions([ + $this->getEditLinkTableAction(), + $this->getDeleteLinkTableAction(), + ]); + + if ($this->canDeleteAny()) { + $table->bulkActions([$this->getDeleteTableBulkAction()]); + } + + if ($this->canCreate()) { + $table->headerActions([$this->getCreateButtonTableHeaderAction()]); + } + + $this->resourceTable = static::table($table); + } + + return $this->resourceTable; + } +} diff --git a/packages/admin/src/Resources/RelationManagers/RelationManager.php b/packages/admin/src/Resources/RelationManagers/RelationManager.php new file mode 100644 index 0000000000..f1a1c7e8cc --- /dev/null +++ b/packages/admin/src/Resources/RelationManagers/RelationManager.php @@ -0,0 +1,200 @@ +canViewAny()) { + $this->skipRender(); + } + } + + protected function getTableQueryStringIdentifier(): ?string + { + return lcfirst(class_basename(static::class)); + } + + protected function getResourceForm(): Form + { + if (! $this->resourceForm) { + $this->resourceForm = static::form(Form::make($this)->columns(2)); + } + + return $this->resourceForm; + } + + protected function callHook(string $hook): void + { + if (! method_exists($this, $hook)) { + return; + } + + $this->{$hook}(); + } + + protected function can(string $action, ?Model $record = null): bool + { + $policy = Gate::getPolicyFor($model = $this->getRelatedModel()); + + if ($policy === null || (! method_exists($policy, $action))) { + return true; + } + + return Gate::check($action, $record ?? $model); + } + + protected function canViewAny(): bool + { + return $this->can('viewAny'); + } + + public static function form(Form $form): Form + { + return $form; + } + + public function getInverseRelationshipName(): string + { + return static::$inverseRelationship ?? (string) Str::of(class_basename($this->ownerRecord)) + ->lower() + ->plural() + ->camel(); + } + + public static function table(Table $table): Table + { + return $table; + } + + public static function getRelationshipName(): string + { + return static::$relationship; + } + + public static function getTitle(): string + { + return static::$title ?? Str::title(static::getPluralRecordLabel()); + } + + public static function getRecordTitleAttribute(): ?string + { + return static::$recordTitleAttribute; + } + + public static function getRecordTitle(?Model $record): ?string + { + return $record?->getAttribute(static::getRecordTitleAttribute()) ?? $record?->getKey(); + } + + protected static function getRecordLabel(): string + { + return static::$label ?? Str::singular(static::getPluralRecordLabel()); + } + + protected static function getPluralRecordLabel(): string + { + return static::$pluralLabel ?? (string) Str::of(static::getRelationshipName()) + ->kebab() + ->replace('-', ' '); + } + + protected function getRelatedModel(): string + { + return $this->getRelationship()->getQuery()->getModel()::class; + } + + protected function getRelationship(): Relation + { + return $this->ownerRecord->{static::getRelationshipName()}(); + } + + protected function getDefaultTableSortColumn(): ?string + { + return $this->getResourceTable()->getDefaultSortColumn(); + } + + protected function getDefaultTableSortDirection(): ?string + { + return $this->getResourceTable()->getDefaultSortDirection(); + } + + protected function getTableActions(): array + { + return $this->getResourceTable()->getActions(); + } + + protected function getTableBulkActions(): array + { + return $this->getResourceTable()->getBulkActions(); + } + + protected function getTableColumns(): array + { + return $this->getResourceTable()->getColumns(); + } + + protected function getTableFilters(): array + { + return $this->getResourceTable()->getFilters(); + } + + protected function getTableHeaderActions(): array + { + return $this->getResourceTable()->getHeaderActions(); + } + + protected function getTableHeading(): ?string + { + return static::getTitle(); + } + + protected function getTableQuery(): Builder + { + return $this->getRelationship()->getQuery(); + } + + public function render(): View + { + return view(static::$view, $this->getViewData()); + } + + protected function getViewData(): array + { + return []; + } +} diff --git a/packages/admin/src/Resources/Resource.php b/packages/admin/src/Resources/Resource.php new file mode 100644 index 0000000000..6370da8063 --- /dev/null +++ b/packages/admin/src/Resources/Resource.php @@ -0,0 +1,334 @@ +group(static::getNavigationGroup()) + ->icon(static::getNavigationIcon()) + ->isActiveWhen(fn () => request()->routeIs("{$routeBaseName}*")) + ->label(static::getNavigationLabel()) + ->sort(static::getNavigationSort()) + ->url(static::getNavigationUrl()), + ]); + } + + public static function table(Table $table): Table + { + return $table; + } + + public static function resolveRecordRouteBinding($key): ?Model + { + $model = static::getModel(); + + return static::getEloquentQuery() + ->where((new $model())->getRouteKeyName(), $key) + ->first(); + } + + public static function can(string $action, ?Model $record = null): bool + { + $policy = Gate::getPolicyFor($model = static::getModel()); + + if ($policy === null || (! method_exists($policy, $action))) { + return true; + } + + return Gate::check($action, $record ?? $model); + } + + public static function canViewAny(): bool + { + return static::can('viewAny'); + } + + public static function canCreate(): bool + { + return static::hasPage('create') && static::can('create'); + } + + public static function canEdit(Model $record): bool + { + return static::hasPage('edit') && static::can('update', $record); + } + + public static function canDelete(Model $record): bool + { + return static::can('delete', $record); + } + + public static function canDeleteAny(): bool + { + return static::can('deleteAny'); + } + + public static function canGloballySearch(): bool + { + return static::$isGloballySearchable && count(static::getGloballySearchableAttributes()) && static::canViewAny(); + } + + public static function canView(Model $record): bool + { + return static::hasPage('view') && static::can('view', $record); + } + + public static function getBreadcrumb(): string + { + return static::$breadcrumb ?? Str::title(static::getPluralLabel()); + } + + public static function getEloquentQuery(): Builder + { + return static::getModel()::query(); + } + + public static function getGloballySearchableAttributes(): array + { + $titleAttribute = static::getRecordTitleAttribute(); + + if ($titleAttribute === null) { + return []; + } + + return [$titleAttribute]; + } + + public static function getGlobalSearchResultDetails(Model $record): array + { + return []; + } + + public static function getGlobalSearchResultTitle(Model $record): string + { + return static::getRecordTitle($record); + } + + public static function getGlobalSearchResultUrl(Model $record): ?string + { + if (static::canEdit($record)) { + return static::getUrl('edit', ['record' => $record]); + } + + if (static::canView($record)) { + return static::getUrl('view', ['record' => $record]); + } + + return null; + } + + public static function getGlobalSearchResults(string $searchQuery): Collection + { + $query = static::getGlobalSearchEloquentQuery(); + + foreach (explode(' ', $searchQuery) as $searchQueryWord) { + $query->where(function (Builder $query) use ($searchQueryWord) { + $isFirst = true; + + foreach (static::getGloballySearchableAttributes() as $attributes) { + static::applyGlobalSearchAttributeConstraint($query, Arr::wrap($attributes), $searchQueryWord, $isFirst); + } + }); + } + + return $query + ->get() + ->map(fn (Model $record): array => [ + 'details' => static::getGlobalSearchResultDetails($record), + 'title' => static::getGlobalSearchResultTitle($record), + 'url' => static::getGlobalSearchResultUrl($record), + ]); + } + + public static function getLabel(): string + { + return static::$label ?? (string) Str::of(class_basename(static::getModel())) + ->kebab() + ->replace('-', ' '); + } + + public static function getModel(): string + { + return static::$model ?? (string) Str::of(class_basename(static::class)) + ->beforeLast('Resource') + ->prepend('App\\Models\\'); + } + + public static function getPages(): array + { + return []; + } + + public static function getPluralLabel(): string + { + return static::$pluralLabel ?? Str::plural(static::getLabel()); + } + + public static function getRecordTitleAttribute(): ?string + { + return static::$recordTitleAttribute; + } + + public static function getRecordTitle(?Model $record): ?string + { + return $record?->getAttribute(static::getRecordTitleAttribute()) ?? $record?->getKey(); + } + + public static function getRelations(): array + { + return []; + } + + public static function getRouteBaseName(): string + { + $slug = static::getSlug(); + + return "filament.resources.{$slug}"; + } + + public static function getRoutes(): Closure + { + return function () { + $slug = static::getSlug(); + + Route::name("{$slug}.")->prefix($slug)->group(function () use ($slug) { + foreach (static::getPages() as $name => $page) { + Route::get($page['route'], $page['class'])->name($name); + } + }); + }; + } + + public static function getSlug(): string + { + return static::$slug ?? (string) Str::of(class_basename(static::getModel())) + ->plural() + ->kebab(); + } + + public static function getUrl($name = 'index', $params = []): string + { + $routeBaseName = static::getRouteBaseName(); + + return route("{$routeBaseName}.{$name}", $params); + } + + public static function hasPage($page): bool + { + return array_key_exists($page, static::getPages()); + } + + public static function hasRecordTitle(): bool + { + return static::getRecordTitleAttribute() !== null; + } + + protected static function applyGlobalSearchAttributeConstraint(Builder $query, array $searchAttributes, string $searchQuery, bool &$isFirst): Builder + { + $searchOperator = match ($query->getConnection()->getDriverName()) { + 'pgsql' => 'ilike', + default => 'like', + }; + + foreach ($searchAttributes as $searchAttribute) { + if (Str::of($searchAttribute)->contains('.')) { + $query->{$isFirst ? 'whereHas' : 'orWhereHas'}( + (string) Str::of($searchAttribute)->beforeLast('.'), + fn ($query) => $query->where( + (string) Str::of($searchAttribute)->afterLast('.'), + $searchOperator, + "%{$searchQuery}%", + ), + ); + } else { + $query->{$isFirst ? 'where' : 'orWhere'}( + $searchAttribute, + $searchOperator, + "%{$searchQuery}%" + ); + } + + $isFirst = false; + } + + return $query; + } + + protected static function getGlobalSearchEloquentQuery(): Builder + { + return static::getEloquentQuery(); + } + + protected static function getNavigationGroup(): ?string + { + return static::$navigationGroup; + } + + protected static function getNavigationIcon(): string + { + return static::$navigationIcon ?? 'heroicon-o-collection'; + } + + protected static function getNavigationLabel(): string + { + return static::$navigationLabel ?? Str::title(static::getPluralLabel()); + } + + protected static function getNavigationSort(): ?int + { + return static::$navigationSort; + } + + protected static function getNavigationUrl(): string + { + return static::getUrl(); + } +} diff --git a/packages/admin/src/Resources/Table.php b/packages/admin/src/Resources/Table.php new file mode 100644 index 0000000000..ba39efed03 --- /dev/null +++ b/packages/admin/src/Resources/Table.php @@ -0,0 +1,145 @@ +actions = $actions; + + return $this; + } + + public function bulkActions(array $actions): static + { + $this->bulkActions = $actions; + + return $this; + } + + public function columns(array $columns): static + { + $this->columns = $columns; + + return $this; + } + + public function defaultSort(string $column, string $direction = 'asc'): static + { + $this->defaultSortColumn = $column; + $this->defaultSortDirection = $direction; + + return $this; + } + + public function filters(array $filters): static + { + $this->filters = $filters; + + return $this; + } + + public function headerActions(array $actions): static + { + $this->headerActions = $actions; + + return $this; + } + + public function prependActions(array $actions): static + { + $this->actions = array_merge($actions, $this->actions); + + return $this; + } + + public function prependBulkActions(array $actions): static + { + $this->bulkActions = array_merge($actions, $this->bulkActions); + + return $this; + } + + public function prependHeaderActions(array $actions): static + { + $this->headerActions = array_merge($actions, $this->headerActions); + + return $this; + } + + public function pushActions(array $actions): static + { + $this->actions = array_merge($this->actions, $actions); + + return $this; + } + + public function pushBulkActions(array $actions): static + { + $this->bulkActions = array_merge($this->bulkActions, $actions); + + return $this; + } + + public function pushHeaderActions(array $actions): static + { + $this->headerActions = array_merge($this->headerActions, $actions); + + return $this; + } + + public function getActions(): array + { + return $this->actions; + } + + public function getBulkActions(): array + { + return $this->bulkActions; + } + + public function getColumns(): array + { + return $this->columns; + } + + public function getDefaultSortColumn(): ?string + { + return $this->defaultSortColumn; + } + + public function getDefaultSortDirection(): ?string + { + return $this->defaultSortDirection; + } + + public function getFilters(): array + { + return $this->filters; + } + + public function getHeaderActions(): array + { + return $this->headerActions; + } +} diff --git a/packages/admin/src/Widgets/AccountWidget.php b/packages/admin/src/Widgets/AccountWidget.php new file mode 100644 index 0000000000..350e968518 --- /dev/null +++ b/packages/admin/src/Widgets/AccountWidget.php @@ -0,0 +1,10 @@ +dataChecksum = $this->generateDataChecksum(); + } + + protected function generateDataChecksum(): string + { + return md5(json_encode($this->getData())); + } + + protected function getData(): array + { + return []; + } + + protected function getHeading(): ?string + { + return static::$heading; + } + + protected function getOptions(): ?array + { + return static::$options; + } + + protected function getPollingInterval(): ?string + { + return static::$pollingInterval; + } + + public function updateChartData() + { + $newDataChecksum = $this->generateDataChecksum(); + + if ($newDataChecksum !== $this->dataChecksum) { + $this->dataChecksum = $newDataChecksum; + + $this->emitSelf('updateChartData', [ + 'data' => $this->getData(), + ]); + } + } +} diff --git a/packages/admin/src/Widgets/DoughnutChartWidget.php b/packages/admin/src/Widgets/DoughnutChartWidget.php new file mode 100644 index 0000000000..114e461b18 --- /dev/null +++ b/packages/admin/src/Widgets/DoughnutChartWidget.php @@ -0,0 +1,11 @@ +getCards())) { + 5, 6, 9, 11 => 3, + 7, 8, 10, 12 => 4, + default => $count, + }; + } + + protected function getCards(): array + { + return []; + } +} diff --git a/packages/admin/src/Widgets/StatsOverviewWidget/Card.php b/packages/admin/src/Widgets/StatsOverviewWidget/Card.php new file mode 100644 index 0000000000..f4c61d37cf --- /dev/null +++ b/packages/admin/src/Widgets/StatsOverviewWidget/Card.php @@ -0,0 +1,101 @@ +label($label); + $this->value($value); + } + + public static function make(string $label, $value): static + { + return new static($label, $value); + } + + public function description(?string $description): static + { + $this->description = $description; + + return $this; + } + + public function descriptionColor(?string $color): static + { + $this->descriptionColor = $color; + + return $this; + } + + public function descriptionIcon(?string $icon): static + { + $this->descriptionIcon = $icon; + + return $this; + } + + public function label(string $label): static + { + $this->label = $label; + + return $this; + } + + public function value($value): static + { + $this->value = $value; + + return $this; + } + + public function getDescription(): ?string + { + return $this->description; + } + + public function getDescriptionColor(): ?string + { + return $this->descriptionColor; + } + + public function getDescriptionIcon(): ?string + { + return $this->descriptionIcon; + } + + public function getLabel(): string + { + return $this->label; + } + + public function getValue() + { + return $this->value; + } + + public function toHtml(): string + { + return $this->render()->render(); + } + + public function render(): View + { + return view('filament::widgets.stats-overview-widget.card', $this->data()); + } +} diff --git a/packages/admin/src/Widgets/Widget.php b/packages/admin/src/Widgets/Widget.php new file mode 100644 index 0000000000..5bd637e66c --- /dev/null +++ b/packages/admin/src/Widgets/Widget.php @@ -0,0 +1,28 @@ +getViewData()); + } +} diff --git a/packages/admin/src/helpers.php b/packages/admin/src/helpers.php new file mode 100644 index 0000000000..faf30fcebb --- /dev/null +++ b/packages/admin/src/helpers.php @@ -0,0 +1,32 @@ +after('id='); + } +} diff --git a/packages/admin/stubs/BelongsToManyRelationManager.stub b/packages/admin/stubs/BelongsToManyRelationManager.stub new file mode 100644 index 0000000000..acea81ad1a --- /dev/null +++ b/packages/admin/stubs/BelongsToManyRelationManager.stub @@ -0,0 +1,35 @@ +schema([ + // + ]); + } + + public static function table(Table $table): Table + { + return $table + ->columns([ + // + ]) + ->filters([ + // + ]); + } +} diff --git a/packages/admin/stubs/DefaultResourcePage.stub b/packages/admin/stubs/DefaultResourcePage.stub new file mode 100644 index 0000000000..0e8fa5f316 --- /dev/null +++ b/packages/admin/stubs/DefaultResourcePage.stub @@ -0,0 +1,11 @@ +schema([ + // + ]); + } + + public static function table(Table $table): Table + { + return $table + ->columns([ + // + ]) + ->filters([ + // + ]); + } +} diff --git a/packages/admin/stubs/Page.stub b/packages/admin/stubs/Page.stub new file mode 100644 index 0000000000..f1bae2aa67 --- /dev/null +++ b/packages/admin/stubs/Page.stub @@ -0,0 +1,12 @@ + + + diff --git a/packages/admin/stubs/Resource.stub b/packages/admin/stubs/Resource.stub new file mode 100644 index 0000000000..b0bfb69fcc --- /dev/null +++ b/packages/admin/stubs/Resource.stub @@ -0,0 +1,54 @@ +schema([ + // + ]); + } + + public static function table(Table $table): Table + { + return $table + ->columns([ + // + ]) + ->filters([ + // + ]); + } + + public static function getRelations(): array + { + return [ + // + ]; + } + + public static function getPages(): array + { + return [ + 'index' => Pages\{{ indexResourcePageClass }}::route('/'), + 'create' => Pages\{{ createResourcePageClass }}::route('/create'), + 'edit' => Pages\{{ editResourcePageClass }}::route('/{record}/edit'), + ]; + } +} diff --git a/packages/admin/stubs/ResourcePage.stub b/packages/admin/stubs/ResourcePage.stub new file mode 100644 index 0000000000..6927578aec --- /dev/null +++ b/packages/admin/stubs/ResourcePage.stub @@ -0,0 +1,13 @@ + + + {{-- Widget content --}} + + diff --git a/packages/admin/tailwind.config.js b/packages/admin/tailwind.config.js new file mode 100644 index 0000000000..e4b665a15e --- /dev/null +++ b/packages/admin/tailwind.config.js @@ -0,0 +1,30 @@ +const colors = require('tailwindcss/colors') +const defaultTheme = require('tailwindcss/defaultTheme') + +module.exports = { + mode: 'jit', + purge: [ + './packages/admin/resources/**/*.blade.php', + './packages/forms/resources/**/*.blade.php', + './packages/tables/resources/**/*.blade.php', + ], + theme: { + extend: { + colors: { + danger: colors.rose, + gray: colors.warmGray, + primary: colors.yellow, + success: colors.green, + warning: colors.amber, + }, + fontFamily: { + sans: ['DM Sans', ...defaultTheme.fontFamily.sans], + }, + }, + }, + plugins: [ + require('@tailwindcss/forms'), + require('@tailwindcss/typography'), + require('tailwindcss-dir'), + ], +} diff --git a/packages/forms/.gitignore b/packages/forms/.gitignore new file mode 100644 index 0000000000..61ead86667 --- /dev/null +++ b/packages/forms/.gitignore @@ -0,0 +1 @@ +/vendor diff --git a/packages/forms/composer.json b/packages/forms/composer.json new file mode 100644 index 0000000000..179b97dc79 --- /dev/null +++ b/packages/forms/composer.json @@ -0,0 +1,41 @@ +{ + "name": "filament/forms", + "description": "Effortlessly build TALL-powered forms.", + "license": "MIT", + "homepage": "https://github.com/laravel-filament/filament", + "support": { + "issues": "https://github.com/laravel-filament/filament/issues", + "source": "https://github.com/laravel-filament/filament" + }, + "require": { + "php": "^8.0", + "blade-ui-kit/blade-heroicons": "^1.2", + "danharrin/date-format-converter": "^0.2", + "illuminate/console": "^8.6", + "illuminate/contracts": "^8.6", + "illuminate/database": "^8.6", + "illuminate/filesystem": "^8.6", + "illuminate/support": "^8.6", + "illuminate/validation": "^8.6", + "illuminate/view": "^8.6", + "livewire/livewire": "^2.6", + "spatie/laravel-package-tools": "^1.9" + }, + "autoload": { + "psr-4": { + "Filament\\Forms\\": "src" + } + }, + "extra": { + "laravel": { + "providers": [ + "Filament\\Forms\\FormsServiceProvider" + ] + } + }, + "config": { + "sort-packages": true + }, + "minimum-stability": "dev", + "prefer-stable": true +} diff --git a/packages/forms/composer.lock b/packages/forms/composer.lock new file mode 100644 index 0000000000..eaa0993cd4 --- /dev/null +++ b/packages/forms/composer.lock @@ -0,0 +1,3680 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "8181657df3b3556a20b47519846b472d", + "packages": [ + { + "name": "blade-ui-kit/blade-heroicons", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/blade-ui-kit/blade-heroicons.git", + "reference": "99d82616a72e36492edc9b95c6a2112d8632e9a7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/blade-ui-kit/blade-heroicons/zipball/99d82616a72e36492edc9b95c6a2112d8632e9a7", + "reference": "99d82616a72e36492edc9b95c6a2112d8632e9a7", + "shasum": "" + }, + "require": { + "blade-ui-kit/blade-icons": "^1.0", + "illuminate/support": "^8.0", + "php": "^7.4|^8.0" + }, + "require-dev": { + "orchestra/testbench": "^6.0", + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "BladeUI\\Heroicons\\BladeHeroiconsServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "BladeUI\\Heroicons\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dries Vints", + "homepage": "https://driesvints.com" + } + ], + "description": "A package to easily make use of Heroicons in your Laravel Blade views.", + "homepage": "https://github.com/blade-ui-kit/blade-heroicons", + "keywords": [ + "Heroicons", + "blade", + "laravel" + ], + "support": { + "issues": "https://github.com/blade-ui-kit/blade-heroicons/issues", + "source": "https://github.com/blade-ui-kit/blade-heroicons/tree/1.2.0" + }, + "funding": [ + { + "url": "https://github.com/caneco", + "type": "github" + }, + { + "url": "https://github.com/driesvints", + "type": "github" + } + ], + "time": "2021-05-05T14:59:46+00:00" + }, + { + "name": "blade-ui-kit/blade-icons", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/blade-ui-kit/blade-icons.git", + "reference": "548869bc820a25f803530c82028482aefe08115f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/blade-ui-kit/blade-icons/zipball/548869bc820a25f803530c82028482aefe08115f", + "reference": "548869bc820a25f803530c82028482aefe08115f", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^8.0", + "illuminate/filesystem": "^8.0", + "illuminate/support": "^8.0", + "illuminate/view": "^8.0", + "php": "^7.4|^8.0", + "symfony/console": "^5.3", + "symfony/finder": "^5.3" + }, + "require-dev": { + "mockery/mockery": "^1.3", + "orchestra/testbench": "^6.0", + "phpunit/phpunit": "^9.0" + }, + "bin": [ + "bin/blade-icons-generate" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "BladeUI\\Icons\\BladeIconsServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "BladeUI\\Icons\\": "src" + }, + "files": [ + "src/helpers.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dries Vints", + "homepage": "https://driesvints.com" + } + ], + "description": "A package to easily make use of icons in your Laravel Blade views.", + "homepage": "https://github.com/blade-ui-kit/blade-icons", + "keywords": [ + "blade", + "icons", + "laravel", + "svg" + ], + "support": { + "issues": "https://github.com/blade-ui-kit/blade-icons/issues", + "source": "https://github.com/blade-ui-kit/blade-icons" + }, + "funding": [ + { + "url": "https://github.com/caneco", + "type": "github" + }, + { + "url": "https://github.com/driesvints", + "type": "github" + } + ], + "time": "2021-08-11T10:09:06+00:00" + }, + { + "name": "danharrin/date-format-converter", + "version": "v0.2.0", + "source": { + "type": "git", + "url": "https://github.com/danharrin/date-format-converter.git", + "reference": "ee448ab0cbe2ea36edb886a01670fc760e388f19" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/danharrin/date-format-converter/zipball/ee448ab0cbe2ea36edb886a01670fc760e388f19", + "reference": "ee448ab0cbe2ea36edb886a01670fc760e388f19", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0" + }, + "type": "library", + "autoload": { + "files": [ + "src/helpers.php", + "src/standards.php" + ], + "psr-4": { + "DanHarrin\\DateFormatConverter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dan Harrin", + "email": "dan@danharrin.com" + } + ], + "description": "Convert token-based date formats between standards.", + "homepage": "https://github.com/danharrin/date-format-converter", + "support": { + "issues": "https://github.com/danharrin/date-format-converter/issues", + "source": "https://github.com/danharrin/date-format-converter" + }, + "funding": [ + { + "url": "https://github.com/danharrin", + "type": "github" + } + ], + "time": "2021-02-10T23:58:47+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89", + "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^8.2", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpstan/phpstan-strict-rules": "^0.12", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "vimeo/psalm": "^4.10" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.4" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2021-10-22T20:16:43+00:00" + }, + { + "name": "doctrine/lexer", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042", + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "phpstan/phpstan": "^0.11.8", + "phpunit/phpunit": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/1.2.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2020-05-25T17:44:05+00:00" + }, + { + "name": "egulias/email-validator", + "version": "2.1.25", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/0dbf5d78455d4d6a41d186da50adc1122ec066f4", + "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^1.0.1", + "php": ">=5.5", + "symfony/polyfill-intl-idn": "^1.10" + }, + "require-dev": { + "dominicsayers/isemail": "^3.0.7", + "phpunit/phpunit": "^4.8.36|^7.5.15", + "satooshi/php-coveralls": "^1.0.1" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/2.1.25" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2020-12-29T14:50:06+00:00" + }, + { + "name": "illuminate/bus", + "version": "v8.69.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/bus.git", + "reference": "be400399687b97d5558a224e970060fd5d5f2735" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/bus/zipball/be400399687b97d5558a224e970060fd5d5f2735", + "reference": "be400399687b97d5558a224e970060fd5d5f2735", + "shasum": "" + }, + "require": { + "illuminate/collections": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/pipeline": "^8.0", + "illuminate/support": "^8.0", + "php": "^7.3|^8.0" + }, + "suggest": { + "illuminate/queue": "Required to use closures when chaining jobs (^7.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Bus\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Bus package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-10-21T19:19:36+00:00" + }, + { + "name": "illuminate/collections", + "version": "v8.69.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/collections.git", + "reference": "05f286ec5fd2dd286e8384577047efc375c8954c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/collections/zipball/05f286ec5fd2dd286e8384577047efc375c8954c", + "reference": "05f286ec5fd2dd286e8384577047efc375c8954c", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^8.0", + "illuminate/macroable": "^8.0", + "php": "^7.3|^8.0" + }, + "suggest": { + "symfony/var-dumper": "Required to use the dump method (^5.1.4)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + }, + "files": [ + "helpers.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Collections package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-10-22T18:01:46+00:00" + }, + { + "name": "illuminate/console", + "version": "v8.69.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/console.git", + "reference": "9c66af18f7a491d45dc7527837f22a175776870a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/console/zipball/9c66af18f7a491d45dc7527837f22a175776870a", + "reference": "9c66af18f7a491d45dc7527837f22a175776870a", + "shasum": "" + }, + "require": { + "illuminate/collections": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/macroable": "^8.0", + "illuminate/support": "^8.0", + "php": "^7.3|^8.0", + "symfony/console": "^5.1.4", + "symfony/process": "^5.1.4" + }, + "suggest": { + "dragonmantank/cron-expression": "Required to use scheduler (^3.0.2).", + "guzzlehttp/guzzle": "Required to use the ping methods on schedules (^6.5.5|^7.0.1).", + "illuminate/bus": "Required to use the scheduled job dispatcher (^8.0).", + "illuminate/container": "Required to use the scheduler (^8.0).", + "illuminate/filesystem": "Required to use the generator command (^8.0).", + "illuminate/queue": "Required to use closures for scheduled jobs (^8.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Console\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Console package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-10-21T19:19:36+00:00" + }, + { + "name": "illuminate/container", + "version": "v8.69.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/container.git", + "reference": "ef73feb5216ef97ab7023cf59c0c8dbbd5505a9d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/container/zipball/ef73feb5216ef97ab7023cf59c0c8dbbd5505a9d", + "reference": "ef73feb5216ef97ab7023cf59c0c8dbbd5505a9d", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^8.0", + "php": "^7.3|^8.0", + "psr/container": "^1.0" + }, + "provide": { + "psr/container-implementation": "1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Container\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Container package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-09-15T14:32:50+00:00" + }, + { + "name": "illuminate/contracts", + "version": "v8.69.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/contracts.git", + "reference": "e76f4bce73a2a1656add24bd5210ebc4b8af49c0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/contracts/zipball/e76f4bce73a2a1656add24bd5210ebc4b8af49c0", + "reference": "e76f4bce73a2a1656add24bd5210ebc4b8af49c0", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0", + "psr/container": "^1.0", + "psr/simple-cache": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Contracts\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Contracts package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-10-22T18:01:46+00:00" + }, + { + "name": "illuminate/database", + "version": "v8.69.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/database.git", + "reference": "43c7ffb6299ae55b000b286cf1278afd268ef29f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/database/zipball/43c7ffb6299ae55b000b286cf1278afd268ef29f", + "reference": "43c7ffb6299ae55b000b286cf1278afd268ef29f", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/collections": "^8.0", + "illuminate/container": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/macroable": "^8.0", + "illuminate/support": "^8.0", + "php": "^7.3|^8.0", + "symfony/console": "^5.1.4" + }, + "suggest": { + "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.13.3|^3.1.2).", + "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", + "illuminate/console": "Required to use the database commands (^8.0).", + "illuminate/events": "Required to use the observers with Eloquent (^8.0).", + "illuminate/filesystem": "Required to use the migrations (^8.0).", + "illuminate/pagination": "Required to paginate the result set (^8.0).", + "symfony/finder": "Required to use Eloquent model factories (^5.1.4)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Database\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Database package.", + "homepage": "https://laravel.com", + "keywords": [ + "database", + "laravel", + "orm", + "sql" + ], + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-10-29T19:46:53+00:00" + }, + { + "name": "illuminate/events", + "version": "v8.69.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/events.git", + "reference": "b7f06cafb6c09581617f2ca05d69e9b159e5a35d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/events/zipball/b7f06cafb6c09581617f2ca05d69e9b159e5a35d", + "reference": "b7f06cafb6c09581617f2ca05d69e9b159e5a35d", + "shasum": "" + }, + "require": { + "illuminate/bus": "^8.0", + "illuminate/collections": "^8.0", + "illuminate/container": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/macroable": "^8.0", + "illuminate/support": "^8.0", + "php": "^7.3|^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Events\\": "" + }, + "files": [ + "functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Events package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-09-15T14:32:50+00:00" + }, + { + "name": "illuminate/filesystem", + "version": "v8.69.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/filesystem.git", + "reference": "a7bc30dac4e27dbeb37b026f3dbaee13bd578861" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/filesystem/zipball/a7bc30dac4e27dbeb37b026f3dbaee13bd578861", + "reference": "a7bc30dac4e27dbeb37b026f3dbaee13bd578861", + "shasum": "" + }, + "require": { + "illuminate/collections": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/macroable": "^8.0", + "illuminate/support": "^8.0", + "php": "^7.3|^8.0", + "symfony/finder": "^5.1.4" + }, + "suggest": { + "ext-ftp": "Required to use the Flysystem FTP driver.", + "illuminate/http": "Required for handling uploaded files (^7.0).", + "league/flysystem": "Required to use the Flysystem local and FTP drivers (^1.1).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^1.0).", + "league/flysystem-cached-adapter": "Required to use the Flysystem cache (^1.0).", + "league/flysystem-sftp": "Required to use the Flysystem SFTP driver (^1.0).", + "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^5.1.4).", + "symfony/mime": "Required to enable support for guessing extensions (^5.1.4)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Filesystem\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Filesystem package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-10-22T13:20:42+00:00" + }, + { + "name": "illuminate/macroable", + "version": "v8.69.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/macroable.git", + "reference": "300aa13c086f25116b5f3cde3ca54ff5c822fb05" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/macroable/zipball/300aa13c086f25116b5f3cde3ca54ff5c822fb05", + "reference": "300aa13c086f25116b5f3cde3ca54ff5c822fb05", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Macroable package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2020-10-27T15:20:30+00:00" + }, + { + "name": "illuminate/pipeline", + "version": "v8.69.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/pipeline.git", + "reference": "23aeff5b26ae4aee3f370835c76bd0f4e93f71d2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/pipeline/zipball/23aeff5b26ae4aee3f370835c76bd0f4e93f71d2", + "reference": "23aeff5b26ae4aee3f370835c76bd0f4e93f71d2", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^8.0", + "illuminate/support": "^8.0", + "php": "^7.3|^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Pipeline\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Pipeline package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-03-26T18:39:16+00:00" + }, + { + "name": "illuminate/support", + "version": "v8.69.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/support.git", + "reference": "a8851b7001530d3c11626a81449ed9b63dd10db7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/support/zipball/a8851b7001530d3c11626a81449ed9b63dd10db7", + "reference": "a8851b7001530d3c11626a81449ed9b63dd10db7", + "shasum": "" + }, + "require": { + "doctrine/inflector": "^1.4|^2.0", + "ext-json": "*", + "ext-mbstring": "*", + "illuminate/collections": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/macroable": "^8.0", + "nesbot/carbon": "^2.53.1", + "php": "^7.3|^8.0", + "voku/portable-ascii": "^1.4.8" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "suggest": { + "illuminate/filesystem": "Required to use the composer class (^8.0).", + "league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^1.3|^2.0.2).", + "ramsey/uuid": "Required to use Str::uuid() (^4.2.2).", + "symfony/process": "Required to use the composer class (^5.1.4).", + "symfony/var-dumper": "Required to use the dd function (^5.1.4).", + "vlucas/phpdotenv": "Required to use the Env class and env helper (^5.2)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + }, + "files": [ + "helpers.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Support package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-10-29T13:34:03+00:00" + }, + { + "name": "illuminate/translation", + "version": "v8.69.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/translation.git", + "reference": "c10a68f37f590dc8c1c1fe5b6ad3f09381282137" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/translation/zipball/c10a68f37f590dc8c1c1fe5b6ad3f09381282137", + "reference": "c10a68f37f590dc8c1c1fe5b6ad3f09381282137", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/collections": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/filesystem": "^8.0", + "illuminate/macroable": "^8.0", + "illuminate/support": "^8.0", + "php": "^7.3|^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Translation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Translation package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-10-30T16:01:33+00:00" + }, + { + "name": "illuminate/validation", + "version": "v8.69.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/validation.git", + "reference": "f2426f5578af420a3cffbf07969bc96b2399f56b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/validation/zipball/f2426f5578af420a3cffbf07969bc96b2399f56b", + "reference": "f2426f5578af420a3cffbf07969bc96b2399f56b", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.10", + "ext-json": "*", + "illuminate/collections": "^8.0", + "illuminate/container": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/macroable": "^8.0", + "illuminate/support": "^8.0", + "illuminate/translation": "^8.0", + "php": "^7.3|^8.0", + "symfony/http-foundation": "^5.1.4", + "symfony/mime": "^5.1.4" + }, + "suggest": { + "ext-bcmath": "Required to use the multiple_of validation rule.", + "illuminate/database": "Required to use the database presence verifier (^8.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Validation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Validation package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-11-01T17:23:09+00:00" + }, + { + "name": "illuminate/view", + "version": "v8.69.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/view.git", + "reference": "75b13b241cd5841039dd3a0fe63309f9e4b4c24c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/view/zipball/75b13b241cd5841039dd3a0fe63309f9e4b4c24c", + "reference": "75b13b241cd5841039dd3a0fe63309f9e4b4c24c", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/collections": "^8.0", + "illuminate/container": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/events": "^8.0", + "illuminate/filesystem": "^8.0", + "illuminate/macroable": "^8.0", + "illuminate/support": "^8.0", + "php": "^7.3|^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\View\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate View package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-10-26T18:50:42+00:00" + }, + { + "name": "livewire/livewire", + "version": "v2.7.2", + "source": { + "type": "git", + "url": "https://github.com/livewire/livewire.git", + "reference": "991e5bd8a48e450d23cd55336964f916e92a6464" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/livewire/livewire/zipball/991e5bd8a48e450d23cd55336964f916e92a6464", + "reference": "991e5bd8a48e450d23cd55336964f916e92a6464", + "shasum": "" + }, + "require": { + "illuminate/database": "^7.0|^8.0", + "illuminate/support": "^7.0|^8.0", + "illuminate/validation": "^7.0|^8.0", + "php": "^7.2.5|^8.0", + "symfony/http-kernel": "^5.0" + }, + "require-dev": { + "calebporzio/sushi": "^2.1", + "laravel/framework": "^7.0|^8.0", + "mockery/mockery": "^1.3.1", + "orchestra/testbench": "^5.0|^6.0", + "orchestra/testbench-dusk": "^5.2|^6.0", + "phpunit/phpunit": "^8.4|^9.0", + "psy/psysh": "@stable" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Livewire\\LivewireServiceProvider" + ], + "aliases": { + "Livewire": "Livewire\\Livewire" + } + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Livewire\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Caleb Porzio", + "email": "calebporzio@gmail.com" + } + ], + "description": "A front-end framework for Laravel.", + "support": { + "issues": "https://github.com/livewire/livewire/issues", + "source": "https://github.com/livewire/livewire/tree/v2.7.2" + }, + "funding": [ + { + "url": "https://github.com/calebporzio", + "type": "github" + } + ], + "time": "2021-10-20T02:27:35+00:00" + }, + { + "name": "nesbot/carbon", + "version": "2.54.0", + "source": { + "type": "git", + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "eed83939f1aed3eee517d03a33f5ec587ac529b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/eed83939f1aed3eee517d03a33f5ec587ac529b5", + "reference": "eed83939f1aed3eee517d03a33f5ec587ac529b5", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.1.8 || ^8.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation": "^3.4 || ^4.0 || ^5.0" + }, + "require-dev": { + "doctrine/dbal": "^2.0 || ^3.0", + "doctrine/orm": "^2.7", + "friendsofphp/php-cs-fixer": "^3.0", + "kylekatarnls/multi-tester": "^2.0", + "phpmd/phpmd": "^2.9", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12.54", + "phpunit/phpunit": "^7.5.20 || ^8.5.14", + "squizlabs/php_codesniffer": "^3.4" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-3.x": "3.x-dev", + "dev-master": "2.x-dev" + }, + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon" + }, + "funding": [ + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "time": "2021-11-01T21:22:20+00:00" + }, + { + "name": "psr/container", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.1" + }, + "time": "2021-03-05T17:36:06+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/log", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/ef29f6d262798707a9edd554e2b82517ef3a9376", + "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/2.0.0" + }, + "time": "2021-07-14T16:41:46+00:00" + }, + { + "name": "psr/simple-cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/master" + }, + "time": "2017-10-23T01:57:42+00:00" + }, + { + "name": "spatie/laravel-package-tools", + "version": "1.9.2", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-package-tools.git", + "reference": "f710fe196c126fb9e0aee67eb5af49ad8f13f528" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/f710fe196c126fb9e0aee67eb5af49ad8f13f528", + "reference": "f710fe196c126fb9e0aee67eb5af49ad8f13f528", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^7.0|^8.0", + "php": "^7.4|^8.0" + }, + "require-dev": { + "mockery/mockery": "^1.4", + "orchestra/testbench": "^5.0|^6.0", + "phpunit/phpunit": "^9.3", + "spatie/test-time": "^1.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\LaravelPackageTools\\": "src", + "Spatie\\LaravelPackageTools\\Database\\Factories\\": "database/factories" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "role": "Developer" + } + ], + "description": "Tools for creating Laravel packages", + "homepage": "https://github.com/spatie/laravel-package-tools", + "keywords": [ + "laravel-package-tools", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/laravel-package-tools/issues", + "source": "https://github.com/spatie/laravel-package-tools/tree/1.9.2" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2021-09-21T13:06:51+00:00" + }, + { + "name": "symfony/console", + "version": "v5.3.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "d4e409d9fbcfbf71af0e5a940abb7b0b4bad0bd3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/d4e409d9fbcfbf71af0e5a940abb7b0b4bad0bd3", + "reference": "d4e409d9fbcfbf71af0e5a940abb7b0b4bad0bd3", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.8", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2", + "symfony/string": "^5.1" + }, + "conflict": { + "psr/log": ">=3", + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", + "symfony/lock": "<4.4", + "symfony/process": "<4.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/log": "^1|^2", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/event-dispatcher": "^4.4|^5.0", + "symfony/lock": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0", + "symfony/var-dumper": "^4.4|^5.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v5.3.10" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-26T09:30:15+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v2.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "6f981ee24cf69ee7ce9736146d1c57c2780598a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/6f981ee24cf69ee7ce9736146d1c57c2780598a8", + "reference": "6f981ee24cf69ee7ce9736146d1c57c2780598a8", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-07-12T14:48:14+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v5.3.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "eec73dd7218713f48a7996583a741b3bae58c8d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/eec73dd7218713f48a7996583a741b3bae58c8d3", + "reference": "eec73dd7218713f48a7996583a741b3bae58c8d3", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^4.4|^5.0" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.1", + "symfony/http-kernel": "^4.4|^5.0", + "symfony/serializer": "^4.4|^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v5.3.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-13T13:42:37+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v5.3.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "661a7a6e085394f8513945669e31f7c1338a7e69" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/661a7a6e085394f8513945669e31f7c1338a7e69", + "reference": "661a7a6e085394f8513945669e31f7c1338a7e69", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/event-dispatcher-contracts": "^2", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/dependency-injection": "<4.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/error-handler": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/service-contracts": "^1.1|^2", + "symfony/stopwatch": "^4.4|^5.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v5.3.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-17T12:16:12+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v2.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "66bea3b09be61613cd3b4043a65a8ec48cfa6d2a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/66bea3b09be61613cd3b4043a65a8ec48cfa6d2a", + "reference": "66bea3b09be61613cd3b4043a65a8ec48cfa6d2a", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/event-dispatcher": "^1" + }, + "suggest": { + "symfony/event-dispatcher-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-07-12T14:48:14+00:00" + }, + { + "name": "symfony/finder", + "version": "v5.3.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/a10000ada1e600d109a6c7632e9ac42e8bf2fb93", + "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v5.3.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-08-04T21:20:46+00:00" + }, + { + "name": "symfony/http-client-contracts", + "version": "v2.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client-contracts.git", + "reference": "ec82e57b5b714dbb69300d348bd840b345e24166" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/ec82e57b5b714dbb69300d348bd840b345e24166", + "reference": "ec82e57b5b714dbb69300d348bd840b345e24166", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "suggest": { + "symfony/http-client-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\HttpClient\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to HTTP clients", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/http-client-contracts/tree/v2.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-03T09:24:47+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v5.3.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "d1e7059ebeb0b8f9fe5eb5b26eacd2e3c1f371cc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/d1e7059ebeb0b8f9fe5eb5b26eacd2e3c1f371cc", + "reference": "d1e7059ebeb0b8f9fe5eb5b26eacd2e3c1f371cc", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "predis/predis": "~1.0", + "symfony/cache": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/mime": "^4.4|^5.0" + }, + "suggest": { + "symfony/mime": "To use the file extension guesser" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v5.3.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-04T16:37:19+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v5.3.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "f53025cd1d91b1af85d6d9e17eefa98e31ee953b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/f53025cd1d91b1af85d6d9e17eefa98e31ee953b", + "reference": "f53025cd1d91b1af85d6d9e17eefa98e31ee953b", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/log": "^1|^2", + "symfony/deprecation-contracts": "^2.1", + "symfony/error-handler": "^4.4|^5.0", + "symfony/event-dispatcher": "^5.0", + "symfony/http-client-contracts": "^1.1|^2", + "symfony/http-foundation": "^5.3.7", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/browser-kit": "<4.4", + "symfony/cache": "<5.0", + "symfony/config": "<5.0", + "symfony/console": "<4.4", + "symfony/dependency-injection": "<5.3", + "symfony/doctrine-bridge": "<5.0", + "symfony/form": "<5.0", + "symfony/http-client": "<5.0", + "symfony/mailer": "<5.0", + "symfony/messenger": "<5.0", + "symfony/translation": "<5.0", + "symfony/twig-bridge": "<5.0", + "symfony/validator": "<5.0", + "twig/twig": "<2.13" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^4.4|^5.0", + "symfony/config": "^5.0", + "symfony/console": "^4.4|^5.0", + "symfony/css-selector": "^4.4|^5.0", + "symfony/dependency-injection": "^5.3", + "symfony/dom-crawler": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0", + "symfony/routing": "^4.4|^5.0", + "symfony/stopwatch": "^4.4|^5.0", + "symfony/translation": "^4.4|^5.0", + "symfony/translation-contracts": "^1.1|^2", + "twig/twig": "^2.13|^3.0.4" + }, + "suggest": { + "symfony/browser-kit": "", + "symfony/config": "", + "symfony/console": "", + "symfony/dependency-injection": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a structured process for converting a Request into a Response", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v5.3.12" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-24T08:46:46+00:00" + }, + { + "name": "symfony/mime", + "version": "v5.3.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "dffc0684f10526db12c52fcd6238c64695426d61" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/dffc0684f10526db12c52fcd6238c64695426d61", + "reference": "dffc0684f10526db12c52fcd6238c64695426d61", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/mailer": "<4.4" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/property-access": "^4.4|^5.1", + "symfony/property-info": "^4.4|^5.1", + "symfony/serializer": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v5.3.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-20T16:42:42+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-19T12:13:01+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.23.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "16880ba9c5ebe3642d1995ab866db29270b36535" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/16880ba9c5ebe3642d1995ab866db29270b36535", + "reference": "16880ba9c5ebe3642d1995ab866db29270b36535", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T12:26:48+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/65bd267525e82759e7d8c4e8ceea44f398838e65", + "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php72": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T09:27:20+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-19T12:13:01+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.23.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6", + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T12:26:48+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "9a142215a36a3888e30d0a9eeea9766764e96976" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9a142215a36a3888e30d0a9eeea9766764e96976", + "reference": "9a142215a36a3888e30d0a9eeea9766764e96976", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php72/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T09:17:38+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-19T12:13:01+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.23.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be", + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-07-28T13:41:28+00:00" + }, + { + "name": "symfony/process", + "version": "v5.3.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "38f26c7d6ed535217ea393e05634cb0b244a1967" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/38f26c7d6ed535217ea393e05634cb0b244a1967", + "reference": "38f26c7d6ed535217ea393e05634cb0b244a1967", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v5.3.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-08-04T21:20:46+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", + "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v2.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-04-01T10:43:52+00:00" + }, + { + "name": "symfony/string", + "version": "v5.3.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c", + "reference": "d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" + }, + "require-dev": { + "symfony/error-handler": "^4.4|^5.0", + "symfony/http-client": "^4.4|^5.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "files": [ + "Resources/functions.php" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v5.3.10" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-27T18:21:46+00:00" + }, + { + "name": "symfony/translation", + "version": "v5.3.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "6ef197aea2ac8b9cd63e0da7522b3771714035aa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/6ef197aea2ac8b9cd63e0da7522b3771714035aa", + "reference": "6ef197aea2ac8b9cd63e0da7522b3771714035aa", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation-contracts": "^2.3" + }, + "conflict": { + "symfony/config": "<4.4", + "symfony/dependency-injection": "<5.0", + "symfony/http-kernel": "<5.0", + "symfony/twig-bundle": "<5.0", + "symfony/yaml": "<4.4" + }, + "provide": { + "symfony/translation-implementation": "2.3" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^4.4|^5.0", + "symfony/console": "^4.4|^5.0", + "symfony/dependency-injection": "^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/http-kernel": "^5.0", + "symfony/intl": "^4.4|^5.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/service-contracts": "^1.1.2|^2", + "symfony/yaml": "^4.4|^5.0" + }, + "suggest": { + "psr/log-implementation": "To use logging capability in translator", + "symfony/config": "", + "symfony/yaml": "" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v5.3.10" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-10T06:43:24+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "95c812666f3e91db75385749fe219c5e494c7f95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/95c812666f3e91db75385749fe219c5e494c7f95", + "reference": "95c812666f3e91db75385749fe219c5e494c7f95", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "suggest": { + "symfony/translation-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v2.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-03-23T23:28:01+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v5.3.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "a029b3a11b757f9cc8693040339153b4745a913f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/a029b3a11b757f9cc8693040339153b4745a913f", + "reference": "a029b3a11b757f9cc8693040339153b4745a913f", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "phpunit/phpunit": "<5.4.3", + "symfony/console": "<4.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0", + "twig/twig": "^2.13|^3.0.4" + }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v5.3.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-12T11:38:27+00:00" + }, + { + "name": "voku/portable-ascii", + "version": "1.5.6", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "80953678b19901e5165c56752d087fc11526017c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/80953678b19901e5165c56752d087fc11526017c", + "reference": "80953678b19901e5165c56752d087fc11526017c", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "http://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/1.5.6" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "time": "2020-11-12T00:07:28+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": [], + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": "^8.0" + }, + "platform-dev": [], + "plugin-api-version": "2.1.0" +} diff --git a/packages/forms/config/forms.php b/packages/forms/config/forms.php new file mode 100644 index 0000000000..0c5ae140bb --- /dev/null +++ b/packages/forms/config/forms.php @@ -0,0 +1,15 @@ + [ + + 'date_time_picker' => [ + 'first_day_of_week' => 1, // 0 to 7 are accepted values, with Monday as 1 and Sunday as 7 or 0. + ], + + ], + + 'default_filesystem_disk' => env('FORMS_FILESYSTEM_DRIVER', 'public'), + +]; diff --git a/packages/forms/dist/module.esm.css b/packages/forms/dist/module.esm.css new file mode 100644 index 0000000000..29ce6dbfc1 --- /dev/null +++ b/packages/forms/dist/module.esm.css @@ -0,0 +1,1449 @@ +@charset "UTF-8"; + +/* node_modules/filepond-plugin-image-preview/dist/filepond-plugin-image-preview.css */ +.filepond--image-preview-markup { + position: absolute; + left: 0; + top: 0; +} +.filepond--image-preview-wrapper { + z-index: 2; +} +.filepond--image-preview-overlay { + display: block; + position: absolute; + left: 0; + top: 0; + width: 100%; + min-height: 5rem; + max-height: 7rem; + margin: 0; + opacity: 0; + z-index: 2; + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.filepond--image-preview-overlay svg { + width: 100%; + height: auto; + color: inherit; + max-height: inherit; +} +.filepond--image-preview-overlay-idle { + mix-blend-mode: multiply; + color: rgba(40, 40, 40, 0.85); +} +.filepond--image-preview-overlay-success { + mix-blend-mode: normal; + color: rgba(54, 151, 99, 1); +} +.filepond--image-preview-overlay-failure { + mix-blend-mode: normal; + color: rgba(196, 78, 71, 1); +} +@supports (-webkit-marquee-repetition: infinite) and ((-o-object-fit: fill) or (object-fit: fill)) { + .filepond--image-preview-overlay-idle { + mix-blend-mode: normal; + } +} +.filepond--image-preview-wrapper { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + position: absolute; + left: 0; + top: 0; + right: 0; + height: 100%; + margin: 0; + border-radius: 0.45em; + overflow: hidden; + background: rgba(0, 0, 0, 0.01); +} +.filepond--image-preview { + position: absolute; + left: 0; + top: 0; + z-index: 1; + display: flex; + align-items: center; + height: 100%; + width: 100%; + pointer-events: none; + background: #222; + will-change: transform, opacity; +} +.filepond--image-clip { + position: relative; + overflow: hidden; + margin: 0 auto; +} +.filepond--image-clip[data-transparency-indicator=grid] img, +.filepond--image-clip[data-transparency-indicator=grid] canvas { + background-color: #fff; + background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 100 100' xmlns='http://www.w3.org/2000/svg' fill='%23eee'%3E%3Cpath d='M0 0 H50 V50 H0'/%3E%3Cpath d='M50 50 H100 V100 H50'/%3E%3C/svg%3E"); + background-size: 1.25em 1.25em; +} +.filepond--image-bitmap, +.filepond--image-vector { + position: absolute; + left: 0; + top: 0; + will-change: transform; +} +.filepond--root[data-style-panel-layout~=integrated] .filepond--image-preview-wrapper { + border-radius: 0; +} +.filepond--root[data-style-panel-layout~=integrated] .filepond--image-preview { + height: 100%; + display: flex; + justify-content: center; + align-items: center; +} +.filepond--root[data-style-panel-layout~=circle] .filepond--image-preview-wrapper { + border-radius: 99999rem; +} +.filepond--root[data-style-panel-layout~=circle] .filepond--image-preview-overlay { + top: auto; + bottom: 0; + -webkit-transform: scaleY(-1); + transform: scaleY(-1); +} +.filepond--root[data-style-panel-layout~=circle] .filepond--file .filepond--file-action-button[data-align*=bottom]:not([data-align*="center"]) { + margin-bottom: 0.325em; +} +.filepond--root[data-style-panel-layout~=circle] .filepond--file [data-align*=left] { + left: calc(50% - 3em); +} +.filepond--root[data-style-panel-layout~=circle] .filepond--file [data-align*=right] { + right: calc(50% - 3em); +} +.filepond--root[data-style-panel-layout~=circle] .filepond--progress-indicator[data-align*=bottom][data-align*=left], +.filepond--root[data-style-panel-layout~=circle] .filepond--progress-indicator[data-align*=bottom][data-align*=right] { + margin-bottom: calc(0.325em + 0.1875em); +} +.filepond--root[data-style-panel-layout~=circle] .filepond--progress-indicator[data-align*=bottom][data-align*=center] { + margin-top: 0; + margin-bottom: 0.1875em; + margin-left: 0.1875em; +} + +/* node_modules/filepond/dist/filepond.min.css */ +.filepond--assistant { + position: absolute; + overflow: hidden; + height: 1px; + width: 1px; + padding: 0; + border: 0; + clip: rect(1px, 1px, 1px, 1px); + -webkit-clip-path: inset(50%); + clip-path: inset(50%); + white-space: nowrap; +} +.filepond--browser.filepond--browser { + position: absolute; + margin: 0; + padding: 0; + left: 1em; + top: 1.75em; + width: calc(100% - 2em); + opacity: 0; + font-size: 0; +} +.filepond--data { + position: absolute; + width: 0; + height: 0; + padding: 0; + margin: 0; + border: none; + visibility: hidden; + pointer-events: none; + contain: strict; +} +.filepond--drip { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + overflow: hidden; + opacity: .1; + pointer-events: none; + border-radius: .5em; + background: rgba(0, 0, 0, .01); +} +.filepond--drip-blob { + -webkit-transform-origin: center center; + transform-origin: center center; + width: 8em; + height: 8em; + margin-left: -4em; + margin-top: -4em; + background: #292625; + border-radius: 50%; +} +.filepond--drip-blob, +.filepond--drop-label { + position: absolute; + top: 0; + left: 0; + will-change: transform, opacity; +} +.filepond--drop-label { + right: 0; + margin: 0; + color: #4f4f4f; + display: flex; + justify-content: center; + align-items: center; + height: 0; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.filepond--drop-label.filepond--drop-label label { + display: block; + margin: 0; + padding: .5em; +} +.filepond--drop-label label { + cursor: default; + font-size: .875em; + font-weight: 400; + text-align: center; + line-height: 1.5; +} +.filepond--label-action { + text-decoration: underline; + -webkit-text-decoration-skip: ink; + text-decoration-skip-ink: auto; + -webkit-text-decoration-color: #a7a4a4; + text-decoration-color: #a7a4a4; + cursor: pointer; +} +.filepond--root[data-disabled] .filepond--drop-label label { + opacity: .5; +} +.filepond--file-action-button.filepond--file-action-button { + font-size: 1em; + width: 1.625em; + height: 1.625em; + font-family: inherit; + line-height: inherit; + margin: 0; + padding: 0; + border: none; + outline: none; + will-change: transform, opacity; +} +.filepond--file-action-button.filepond--file-action-button span { + position: absolute; + overflow: hidden; + height: 1px; + width: 1px; + padding: 0; + border: 0; + clip: rect(1px, 1px, 1px, 1px); + -webkit-clip-path: inset(50%); + clip-path: inset(50%); + white-space: nowrap; +} +.filepond--file-action-button.filepond--file-action-button svg { + width: 100%; + height: 100%; +} +.filepond--file-action-button.filepond--file-action-button:after { + position: absolute; + left: -.75em; + right: -.75em; + top: -.75em; + bottom: -.75em; + content: ""; +} +.filepond--file-action-button { + cursor: auto; + color: #fff; + border-radius: 50%; + background-color: rgba(0, 0, 0, .5); + background-image: none; + box-shadow: 0 0 0 0 hsla(0, 0%, 100%, 0); + transition: box-shadow .25s ease-in; +} +.filepond--file-action-button:focus, +.filepond--file-action-button:hover { + box-shadow: 0 0 0 .125em hsla(0, 0%, 100%, .9); +} +.filepond--file-action-button[disabled] { + color: hsla(0, 0%, 100%, .5); + background-color: rgba(0, 0, 0, .25); +} +.filepond--file-action-button[hidden] { + display: none; +} +.filepond--action-edit-item.filepond--action-edit-item { + width: 2em; + height: 2em; + padding: .1875em; +} +.filepond--action-edit-item.filepond--action-edit-item[data-align*=center] { + margin-left: -.1875em; +} +.filepond--action-edit-item.filepond--action-edit-item[data-align*=bottom] { + margin-bottom: -.1875em; +} +.filepond--action-edit-item-alt { + border: none; + line-height: inherit; + background: transparent; + font-family: inherit; + color: inherit; + outline: none; + padding: 0; + margin: 0 0 0 .25em; + pointer-events: all; + position: absolute; +} +.filepond--action-edit-item-alt svg { + width: 1.3125em; + height: 1.3125em; +} +.filepond--action-edit-item-alt span { + font-size: 0; + opacity: 0; +} +.filepond--file-info { + position: static; + display: flex; + flex-direction: column; + align-items: flex-start; + flex: 1; + margin: 0 .5em 0 0; + min-width: 0; + will-change: transform, opacity; + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.filepond--file-info * { + margin: 0; +} +.filepond--file-info .filepond--file-info-main { + font-size: .75em; + line-height: 1.2; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + width: 100%; +} +.filepond--file-info .filepond--file-info-sub { + font-size: .625em; + opacity: .5; + transition: opacity .25s ease-in-out; + white-space: nowrap; +} +.filepond--file-info .filepond--file-info-sub:empty { + display: none; +} +.filepond--file-status { + position: static; + display: flex; + flex-direction: column; + align-items: flex-end; + flex-grow: 0; + flex-shrink: 0; + margin: 0; + min-width: 2.25em; + text-align: right; + will-change: transform, opacity; + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.filepond--file-status * { + margin: 0; + white-space: nowrap; +} +.filepond--file-status .filepond--file-status-main { + font-size: .75em; + line-height: 1.2; +} +.filepond--file-status .filepond--file-status-sub { + font-size: .625em; + opacity: .5; + transition: opacity .25s ease-in-out; +} +.filepond--file-wrapper.filepond--file-wrapper { + border: none; + margin: 0; + padding: 0; + min-width: 0; + height: 100%; +} +.filepond--file-wrapper.filepond--file-wrapper > legend { + position: absolute; + overflow: hidden; + height: 1px; + width: 1px; + padding: 0; + border: 0; + clip: rect(1px, 1px, 1px, 1px); + -webkit-clip-path: inset(50%); + clip-path: inset(50%); + white-space: nowrap; +} +.filepond--file { + position: static; + display: flex; + height: 100%; + align-items: flex-start; + padding: .5625em; + color: #fff; + border-radius: .5em; +} +.filepond--file .filepond--file-status { + margin-left: auto; + margin-right: 2.25em; +} +.filepond--file .filepond--processing-complete-indicator { + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + z-index: 3; +} +.filepond--file .filepond--file-action-button, +.filepond--file .filepond--processing-complete-indicator, +.filepond--file .filepond--progress-indicator { + position: absolute; +} +.filepond--file [data-align*=left] { + left: .5625em; +} +.filepond--file [data-align*=right] { + right: .5625em; +} +.filepond--file [data-align*=center] { + left: calc(50% - .8125em); +} +.filepond--file [data-align*=bottom] { + bottom: 1.125em; +} +.filepond--file [data-align=center] { + top: calc(50% - .8125em); +} +.filepond--file .filepond--progress-indicator { + margin-top: .1875em; +} +.filepond--file .filepond--progress-indicator[data-align*=right] { + margin-right: .1875em; +} +.filepond--file .filepond--progress-indicator[data-align*=left] { + margin-left: .1875em; +} +[data-filepond-item-state*=error] .filepond--file-info, +[data-filepond-item-state*=invalid] .filepond--file-info, +[data-filepond-item-state=cancelled] .filepond--file-info { + margin-right: 2.25em; +} +[data-filepond-item-state~=processing] .filepond--file-status-sub { + opacity: 0; +} +[data-filepond-item-state~=processing] .filepond--action-abort-item-processing ~ .filepond--file-status .filepond--file-status-sub { + opacity: .5; +} +[data-filepond-item-state=processing-error] .filepond--file-status-sub { + opacity: 0; +} +[data-filepond-item-state=processing-error] .filepond--action-retry-item-processing ~ .filepond--file-status .filepond--file-status-sub { + opacity: .5; +} +[data-filepond-item-state=processing-complete] .filepond--action-revert-item-processing svg { + -webkit-animation: fall .5s linear .125s both; + animation: fall .5s linear .125s both; +} +[data-filepond-item-state=processing-complete] .filepond--file-status-sub { + opacity: .5; +} +[data-filepond-item-state=processing-complete] .filepond--file-info-sub, +[data-filepond-item-state=processing-complete] .filepond--processing-complete-indicator:not([style*=hidden]) ~ .filepond--file-status .filepond--file-status-sub { + opacity: 0; +} +[data-filepond-item-state=processing-complete] .filepond--action-revert-item-processing ~ .filepond--file-info .filepond--file-info-sub { + opacity: .5; +} +[data-filepond-item-state*=error] .filepond--file-wrapper, +[data-filepond-item-state*=error] .filepond--panel, +[data-filepond-item-state*=invalid] .filepond--file-wrapper, +[data-filepond-item-state*=invalid] .filepond--panel { + -webkit-animation: shake .65s linear both; + animation: shake .65s linear both; +} +[data-filepond-item-state*=busy] .filepond--progress-indicator svg { + -webkit-animation: spin 1s linear infinite; + animation: spin 1s linear infinite; +} +@-webkit-keyframes spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + to { + -webkit-transform: rotate(1turn); + transform: rotate(1turn); + } +} +@keyframes spin { + 0% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + to { + -webkit-transform: rotate(1turn); + transform: rotate(1turn); + } +} +@-webkit-keyframes shake { + 10%, 90% { + -webkit-transform: translateX(-.0625em); + transform: translateX(-.0625em); + } + 20%, 80% { + -webkit-transform: translateX(.125em); + transform: translateX(.125em); + } + 30%, 50%, 70% { + -webkit-transform: translateX(-.25em); + transform: translateX(-.25em); + } + 40%, 60% { + -webkit-transform: translateX(.25em); + transform: translateX(.25em); + } +} +@keyframes shake { + 10%, 90% { + -webkit-transform: translateX(-.0625em); + transform: translateX(-.0625em); + } + 20%, 80% { + -webkit-transform: translateX(.125em); + transform: translateX(.125em); + } + 30%, 50%, 70% { + -webkit-transform: translateX(-.25em); + transform: translateX(-.25em); + } + 40%, 60% { + -webkit-transform: translateX(.25em); + transform: translateX(.25em); + } +} +@-webkit-keyframes fall { + 0% { + opacity: 0; + -webkit-transform: scale(.5); + transform: scale(.5); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + 70% { + opacity: 1; + -webkit-transform: scale(1.1); + transform: scale(1.1); + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + to { + -webkit-transform: scale(1); + transform: scale(1); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } +} +@keyframes fall { + 0% { + opacity: 0; + -webkit-transform: scale(.5); + transform: scale(.5); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + 70% { + opacity: 1; + -webkit-transform: scale(1.1); + transform: scale(1.1); + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + to { + -webkit-transform: scale(1); + transform: scale(1); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } +} +.filepond--hopper[data-hopper-state=drag-over] > * { + pointer-events: none; +} +.filepond--hopper[data-hopper-state=drag-over]:after { + content: ""; + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + z-index: 100; +} +.filepond--progress-indicator { + z-index: 103; +} +.filepond--file-action-button { + z-index: 102; +} +.filepond--file-status { + z-index: 101; +} +.filepond--file-info { + z-index: 100; +} +.filepond--item { + position: absolute; + top: 0; + left: 0; + right: 0; + z-index: 1; + padding: 0; + margin: .25em; + will-change: transform, opacity; +} +.filepond--item > .filepond--panel { + z-index: -1; +} +.filepond--item > .filepond--panel .filepond--panel-bottom { + box-shadow: 0 .0625em .125em -.0625em rgba(0, 0, 0, .25); +} +.filepond--item > .filepond--file-wrapper, +.filepond--item > .filepond--panel { + transition: opacity .15s ease-out; +} +.filepond--item[data-drag-state] { + cursor: -webkit-grab; + cursor: grab; +} +.filepond--item[data-drag-state] > .filepond--panel { + transition: box-shadow .125s ease-in-out; + box-shadow: 0 0 0 transparent; +} +.filepond--item[data-drag-state=drag] { + cursor: -webkit-grabbing; + cursor: grabbing; +} +.filepond--item[data-drag-state=drag] > .filepond--panel { + box-shadow: 0 .125em .3125em rgba(0, 0, 0, .325); +} +.filepond--item[data-drag-state]:not([data-drag-state=idle]) { + z-index: 2; +} +.filepond--item-panel { + background-color: #64605e; +} +[data-filepond-item-state=processing-complete] .filepond--item-panel { + background-color: #369763; +} +[data-filepond-item-state*=error] .filepond--item-panel, +[data-filepond-item-state*=invalid] .filepond--item-panel { + background-color: #c44e47; +} +.filepond--item-panel { + border-radius: .5em; + transition: background-color .25s; +} +.filepond--list-scroller { + position: absolute; + top: 0; + left: 0; + right: 0; + margin: 0; + will-change: transform; +} +.filepond--list-scroller[data-state=overflow] .filepond--list { + bottom: 0; + right: 0; +} +.filepond--list-scroller[data-state=overflow] { + overflow-y: scroll; + overflow-x: hidden; + -webkit-overflow-scrolling: touch; + -webkit-mask: linear-gradient(180deg, #000 calc(100% - .5em), transparent); + mask: linear-gradient(180deg, #000 calc(100% - .5em), transparent); +} +.filepond--list-scroller::-webkit-scrollbar { + background: transparent; +} +.filepond--list-scroller::-webkit-scrollbar:vertical { + width: 1em; +} +.filepond--list-scroller::-webkit-scrollbar:horizontal { + height: 0; +} +.filepond--list-scroller::-webkit-scrollbar-thumb { + background-color: rgba(0, 0, 0, .3); + border-radius: 99999px; + border: .3125em solid transparent; + background-clip: content-box; +} +.filepond--list.filepond--list { + position: absolute; + top: 0; + margin: 0; + padding: 0; + list-style-type: none; + will-change: transform; +} +.filepond--list { + left: .75em; + right: .75em; +} +.filepond--root[data-style-panel-layout~=integrated] { + width: 100%; + height: 100%; + max-width: none; + margin: 0; +} +.filepond--root[data-style-panel-layout~=circle] .filepond--panel-root, +.filepond--root[data-style-panel-layout~=integrated] .filepond--panel-root { + border-radius: 0; +} +.filepond--root[data-style-panel-layout~=circle] .filepond--panel-root > *, +.filepond--root[data-style-panel-layout~=integrated] .filepond--panel-root > * { + display: none; +} +.filepond--root[data-style-panel-layout~=circle] .filepond--drop-label, +.filepond--root[data-style-panel-layout~=integrated] .filepond--drop-label { + bottom: 0; + height: auto; + display: flex; + justify-content: center; + align-items: center; + z-index: 7; +} +.filepond--root[data-style-panel-layout~=circle] .filepond--item-panel, +.filepond--root[data-style-panel-layout~=integrated] .filepond--item-panel { + display: none; +} +.filepond--root[data-style-panel-layout~=compact] .filepond--list-scroller, +.filepond--root[data-style-panel-layout~=integrated] .filepond--list-scroller { + overflow: hidden; + height: 100%; + margin-top: 0; + margin-bottom: 0; +} +.filepond--root[data-style-panel-layout~=compact] .filepond--list, +.filepond--root[data-style-panel-layout~=integrated] .filepond--list { + left: 0; + right: 0; + height: 100%; +} +.filepond--root[data-style-panel-layout~=compact] .filepond--item, +.filepond--root[data-style-panel-layout~=integrated] .filepond--item { + margin: 0; +} +.filepond--root[data-style-panel-layout~=compact] .filepond--file-wrapper, +.filepond--root[data-style-panel-layout~=integrated] .filepond--file-wrapper { + height: 100%; +} +.filepond--root[data-style-panel-layout~=compact] .filepond--drop-label, +.filepond--root[data-style-panel-layout~=integrated] .filepond--drop-label { + z-index: 7; +} +.filepond--root[data-style-panel-layout~=circle] { + border-radius: 99999rem; + overflow: hidden; +} +.filepond--root[data-style-panel-layout~=circle] > .filepond--panel { + border-radius: inherit; +} +.filepond--root[data-style-panel-layout~=circle] > .filepond--panel > * { + display: none; +} +.filepond--root[data-style-panel-layout~=circle] .filepond--file-info, +.filepond--root[data-style-panel-layout~=circle] .filepond--file-status { + display: none; +} +.filepond--root[data-style-panel-layout~=circle] .filepond--action-edit-item { + opacity: 1 !important; + visibility: visible !important; +} +@media not all and (min-resolution:0.001dpcm) { + @supports (-webkit-appearance:none) and (stroke-color:transparent) { + .filepond--root[data-style-panel-layout~=circle] { + will-change: transform; + } + } +} +.filepond--panel-root { + border-radius: .5em; + background-color: #f1f0ef; +} +.filepond--panel { + position: absolute; + left: 0; + top: 0; + right: 0; + margin: 0; + height: 100% !important; + pointer-events: none; +} +.filepond-panel:not([data-scalable=false]) { + height: auto !important; +} +.filepond--panel[data-scalable=false] > div { + display: none; +} +.filepond--panel[data-scalable=true] { + -webkit-transform-style: preserve-3d; + transform-style: preserve-3d; + background-color: transparent !important; + border: none !important; +} +.filepond--panel-bottom, +.filepond--panel-center, +.filepond--panel-top { + position: absolute; + left: 0; + top: 0; + right: 0; + margin: 0; + padding: 0; +} +.filepond--panel-bottom, +.filepond--panel-top { + height: .5em; +} +.filepond--panel-top { + border-bottom-left-radius: 0 !important; + border-bottom-right-radius: 0 !important; + border-bottom: none !important; +} +.filepond--panel-top:after { + content: ""; + position: absolute; + height: 2px; + left: 0; + right: 0; + bottom: -1px; + background-color: inherit; +} +.filepond--panel-bottom, +.filepond--panel-center { + will-change: transform; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-transform-origin: left top; + transform-origin: left top; + -webkit-transform: translate3d(0, .5em, 0); + transform: translate3d(0, .5em, 0); +} +.filepond--panel-bottom { + border-top-left-radius: 0 !important; + border-top-right-radius: 0 !important; + border-top: none !important; +} +.filepond--panel-bottom:before { + content: ""; + position: absolute; + height: 2px; + left: 0; + right: 0; + top: -1px; + background-color: inherit; +} +.filepond--panel-center { + height: 100px !important; + border-top: none !important; + border-bottom: none !important; + border-radius: 0 !important; +} +.filepond--panel-center:not([style]) { + visibility: hidden; +} +.filepond--progress-indicator { + position: static; + width: 1.25em; + height: 1.25em; + color: #fff; + margin: 0; + pointer-events: none; + will-change: transform, opacity; +} +.filepond--progress-indicator svg { + width: 100%; + height: 100%; + vertical-align: top; + transform-box: fill-box; +} +.filepond--progress-indicator path { + fill: none; + stroke: currentColor; +} +.filepond--list-scroller { + z-index: 6; +} +.filepond--drop-label { + z-index: 5; +} +.filepond--drip { + z-index: 3; +} +.filepond--root > .filepond--panel { + z-index: 2; +} +.filepond--browser { + z-index: 1; +} +.filepond--root { + box-sizing: border-box; + position: relative; + margin-bottom: 1em; + font-size: 1rem; + line-height: normal; + font-family: + -apple-system, + BlinkMacSystemFont, + Segoe UI, + Roboto, + Helvetica, + Arial, + sans-serif, + Apple Color Emoji, + Segoe UI Emoji, + Segoe UI Symbol; + font-weight: 450; + text-align: left; + text-rendering: optimizeLegibility; + direction: ltr; + contain: layout style size; +} +.filepond--root * { + box-sizing: inherit; + line-height: inherit; +} +.filepond--root :not(text) { + font-size: inherit; +} +.filepond--root[data-disabled] { + pointer-events: none; +} +.filepond--root[data-disabled] .filepond--list-scroller { + pointer-events: all; +} +.filepond--root[data-disabled] .filepond--list { + pointer-events: none; +} +.filepond--root .filepond--drop-label { + min-height: 4.75em; +} +.filepond--root .filepond--list-scroller { + margin-top: 1em; + margin-bottom: 1em; +} +.filepond--root .filepond--credits { + position: absolute; + right: 0; + opacity: .175; + line-height: .85; + font-size: 11px; + color: inherit; + text-decoration: none; + z-index: 3; + bottom: -14px; +} +.filepond--root .filepond--credits[style] { + top: 0; + bottom: auto; + margin-top: 14px; +} + +/* node_modules/trix/dist/trix.css */ +trix-editor { + border: 1px solid #bbb; + border-radius: 3px; + margin: 0; + padding: 0.4em 0.6em; + min-height: 5em; + outline: none; +} +trix-toolbar * { + box-sizing: border-box; +} +trix-toolbar .trix-button-row { + display: flex; + flex-wrap: nowrap; + justify-content: space-between; + overflow-x: auto; +} +trix-toolbar .trix-button-group { + display: flex; + margin-bottom: 10px; + border: 1px solid #bbb; + border-top-color: #ccc; + border-bottom-color: #888; + border-radius: 3px; +} +trix-toolbar .trix-button-group:not(:first-child) { + margin-left: 1.5vw; +} +@media (max-device-width: 768px) { + trix-toolbar .trix-button-group:not(:first-child) { + margin-left: 0; + } +} +trix-toolbar .trix-button-group-spacer { + flex-grow: 1; +} +@media (max-device-width: 768px) { + trix-toolbar .trix-button-group-spacer { + display: none; + } +} +trix-toolbar .trix-button { + position: relative; + float: left; + color: rgba(0, 0, 0, 0.6); + font-size: 0.75em; + font-weight: 600; + white-space: nowrap; + padding: 0 0.5em; + margin: 0; + outline: none; + border: none; + border-bottom: 1px solid #ddd; + border-radius: 0; + background: transparent; +} +trix-toolbar .trix-button:not(:first-child) { + border-left: 1px solid #ccc; +} +trix-toolbar .trix-button.trix-active { + background: #cbeefa; + color: black; +} +trix-toolbar .trix-button:not(:disabled) { + cursor: pointer; +} +trix-toolbar .trix-button:disabled { + color: rgba(0, 0, 0, 0.125); +} +@media (max-device-width: 768px) { + trix-toolbar .trix-button { + letter-spacing: -0.01em; + padding: 0 0.3em; + } +} +trix-toolbar .trix-button--icon { + font-size: inherit; + width: 2.6em; + height: 1.6em; + max-width: calc(0.8em + 4vw); + text-indent: -9999px; +} +@media (max-device-width: 768px) { + trix-toolbar .trix-button--icon { + height: 2em; + max-width: calc(0.8em + 3.5vw); + } +} +trix-toolbar .trix-button--icon::before { + display: inline-block; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + opacity: 0.6; + content: ""; + background-position: center; + background-repeat: no-repeat; + background-size: contain; +} +@media (max-device-width: 768px) { + trix-toolbar .trix-button--icon::before { + right: 6%; + left: 6%; + } +} +trix-toolbar .trix-button--icon.trix-active::before { + opacity: 1; +} +trix-toolbar .trix-button--icon:disabled::before { + opacity: 0.125; +} +trix-toolbar .trix-button--icon-attach::before { + background-image: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M16.5%206v11.5a4%204%200%201%201-8%200V5a2.5%202.5%200%200%201%205%200v10.5a1%201%200%201%201-2%200V6H10v9.5a2.5%202.5%200%200%200%205%200V5a4%204%200%201%200-8%200v12.5a5.5%205.5%200%200%200%2011%200V6h-1.5z%22%2F%3E%3C%2Fsvg%3E); + top: 8%; + bottom: 4%; +} +trix-toolbar .trix-button--icon-bold::before { + background-image: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M15.6%2011.8c1-.7%201.6-1.8%201.6-2.8a4%204%200%200%200-4-4H7v14h7c2.1%200%203.7-1.7%203.7-3.8%200-1.5-.8-2.8-2.1-3.4zM10%207.5h3a1.5%201.5%200%201%201%200%203h-3v-3zm3.5%209H10v-3h3.5a1.5%201.5%200%201%201%200%203z%22%2F%3E%3C%2Fsvg%3E); +} +trix-toolbar .trix-button--icon-italic::before { + background-image: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M10%205v3h2.2l-3.4%208H6v3h8v-3h-2.2l3.4-8H18V5h-8z%22%2F%3E%3C%2Fsvg%3E); +} +trix-toolbar .trix-button--icon-link::before { + background-image: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M9.88%2013.7a4.3%204.3%200%200%201%200-6.07l3.37-3.37a4.26%204.26%200%200%201%206.07%200%204.3%204.3%200%200%201%200%206.06l-1.96%201.72a.91.91%200%201%201-1.3-1.3l1.97-1.71a2.46%202.46%200%200%200-3.48-3.48l-3.38%203.37a2.46%202.46%200%200%200%200%203.48.91.91%200%201%201-1.3%201.3z%22%2F%3E%3Cpath%20d%3D%22M4.25%2019.46a4.3%204.3%200%200%201%200-6.07l1.93-1.9a.91.91%200%201%201%201.3%201.3l-1.93%201.9a2.46%202.46%200%200%200%203.48%203.48l3.37-3.38c.96-.96.96-2.52%200-3.48a.91.91%200%201%201%201.3-1.3%204.3%204.3%200%200%201%200%206.07l-3.38%203.38a4.26%204.26%200%200%201-6.07%200z%22%2F%3E%3C%2Fsvg%3E); +} +trix-toolbar .trix-button--icon-strike::before { + background-image: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M12.73%2014l.28.14c.26.15.45.3.57.44.12.14.18.3.18.5%200%20.3-.15.56-.44.75-.3.2-.76.3-1.39.3A13.52%2013.52%200%200%201%207%2014.95v3.37a10.64%2010.64%200%200%200%204.84.88c1.26%200%202.35-.19%203.28-.56.93-.37%201.64-.9%202.14-1.57s.74-1.45.74-2.32c0-.26-.02-.51-.06-.75h-5.21zm-5.5-4c-.08-.34-.12-.7-.12-1.1%200-1.29.52-2.3%201.58-3.02%201.05-.72%202.5-1.08%204.34-1.08%201.62%200%203.28.34%204.97%201l-1.3%202.93c-1.47-.6-2.73-.9-3.8-.9-.55%200-.96.08-1.2.26-.26.17-.38.38-.38.64%200%20.27.16.52.48.74.17.12.53.3%201.05.53H7.23zM3%2013h18v-2H3v2z%22%2F%3E%3C%2Fsvg%3E); +} +trix-toolbar .trix-button--icon-quote::before { + background-image: url(data:image/svg+xml,%3Csvg%20version%3D%221%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M6%2017h3l2-4V7H5v6h3zm8%200h3l2-4V7h-6v6h3z%22%2F%3E%3C%2Fsvg%3E); +} +trix-toolbar .trix-button--icon-heading-1::before { + background-image: url(data:image/svg+xml,%3Csvg%20version%3D%221%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M12%209v3H9v7H6v-7H3V9h9zM8%204h14v3h-6v12h-3V7H8V4z%22%2F%3E%3C%2Fsvg%3E); +} +trix-toolbar .trix-button--icon-code::before { + background-image: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M18.2%2012L15%2015.2l1.4%201.4L21%2012l-4.6-4.6L15%208.8l3.2%203.2zM5.8%2012L9%208.8%207.6%207.4%203%2012l4.6%204.6L9%2015.2%205.8%2012z%22%2F%3E%3C%2Fsvg%3E); +} +trix-toolbar .trix-button--icon-bullet-list::before { + background-image: url(data:image/svg+xml,%3Csvg%20version%3D%221%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M4%204a2%202%200%201%200%200%204%202%202%200%200%200%200-4zm0%206a2%202%200%201%200%200%204%202%202%200%200%200%200-4zm0%206a2%202%200%201%200%200%204%202%202%200%200%200%200-4zm4%203h14v-2H8v2zm0-6h14v-2H8v2zm0-8v2h14V5H8z%22%2F%3E%3C%2Fsvg%3E); +} +trix-toolbar .trix-button--icon-number-list::before { + background-image: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M2%2017h2v.5H3v1h1v.5H2v1h3v-4H2v1zm1-9h1V4H2v1h1v3zm-1%203h1.8L2%2013.1v.9h3v-1H3.2L5%2010.9V10H2v1zm5-6v2h14V5H7zm0%2014h14v-2H7v2zm0-6h14v-2H7v2z%22%2F%3E%3C%2Fsvg%3E); +} +trix-toolbar .trix-button--icon-undo::before { + background-image: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M12.5%208c-2.6%200-5%201-6.9%202.6L2%207v9h9l-3.6-3.6A8%208%200%200%201%2020%2016l2.4-.8a10.5%2010.5%200%200%200-10-7.2z%22%2F%3E%3C%2Fsvg%3E); +} +trix-toolbar .trix-button--icon-redo::before { + background-image: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M18.4%2010.6a10.5%2010.5%200%200%200-16.9%204.6L4%2016a8%208%200%200%201%2012.7-3.6L13%2016h9V7l-3.6%203.6z%22%2F%3E%3C%2Fsvg%3E); +} +trix-toolbar .trix-button--icon-decrease-nesting-level::before { + background-image: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M3%2019h19v-2H3v2zm7-6h12v-2H10v2zm-8.3-.3l2.8%202.9L6%2014.2%204%2012l2-2-1.4-1.5L1%2012l.7.7zM3%205v2h19V5H3z%22%2F%3E%3C%2Fsvg%3E); +} +trix-toolbar .trix-button--icon-increase-nesting-level::before { + background-image: url(data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2224%22%20height%3D%2224%22%3E%3Cpath%20d%3D%22M3%2019h19v-2H3v2zm7-6h12v-2H10v2zm-6.9-1L1%2014.2l1.4%201.4L6%2012l-.7-.7-2.8-2.8L1%209.9%203.1%2012zM3%205v2h19V5H3z%22%2F%3E%3C%2Fsvg%3E); +} +trix-toolbar .trix-dialogs { + position: relative; +} +trix-toolbar .trix-dialog { + position: absolute; + top: 0; + left: 0; + right: 0; + font-size: 0.75em; + padding: 15px 10px; + background: #fff; + box-shadow: 0 0.3em 1em #ccc; + border-top: 2px solid #888; + border-radius: 5px; + z-index: 5; +} +trix-toolbar .trix-input--dialog { + font-size: inherit; + font-weight: normal; + padding: 0.5em 0.8em; + margin: 0 10px 0 0; + border-radius: 3px; + border: 1px solid #bbb; + background-color: #fff; + box-shadow: none; + outline: none; + -webkit-appearance: none; + -moz-appearance: none; +} +trix-toolbar .trix-input--dialog.validate:invalid { + box-shadow: #F00 0px 0px 1.5px 1px; +} +trix-toolbar .trix-button--dialog { + font-size: inherit; + padding: 0.5em; + border-bottom: none; +} +trix-toolbar .trix-dialog--link { + max-width: 600px; +} +trix-toolbar .trix-dialog__link-fields { + display: flex; + align-items: baseline; +} +trix-toolbar .trix-dialog__link-fields .trix-input { + flex: 1; +} +trix-toolbar .trix-dialog__link-fields .trix-button-group { + flex: 0 0 content; + margin: 0; +} +trix-editor [data-trix-mutable]:not(.attachment__caption-editor) { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +trix-editor [data-trix-mutable]::-moz-selection, +trix-editor [data-trix-cursor-target]::-moz-selection, +trix-editor [data-trix-mutable] ::-moz-selection { + background: none; +} +trix-editor [data-trix-mutable]::selection, +trix-editor [data-trix-cursor-target]::selection, +trix-editor [data-trix-mutable] ::selection { + background: none; +} +trix-editor [data-trix-mutable].attachment__caption-editor:focus::-moz-selection { + background: highlight; +} +trix-editor [data-trix-mutable].attachment__caption-editor:focus::selection { + background: highlight; +} +trix-editor [data-trix-mutable].attachment.attachment--file { + box-shadow: 0 0 0 2px highlight; + border-color: transparent; +} +trix-editor [data-trix-mutable].attachment img { + box-shadow: 0 0 0 2px highlight; +} +trix-editor .attachment { + position: relative; +} +trix-editor .attachment:hover { + cursor: default; +} +trix-editor .attachment--preview .attachment__caption:hover { + cursor: text; +} +trix-editor .attachment__progress { + position: absolute; + z-index: 1; + height: 20px; + top: calc(50% - 10px); + left: 5%; + width: 90%; + opacity: 0.9; + transition: opacity 200ms ease-in; +} +trix-editor .attachment__progress[value="100"] { + opacity: 0; +} +trix-editor .attachment__caption-editor { + display: inline-block; + width: 100%; + margin: 0; + padding: 0; + font-size: inherit; + font-family: inherit; + line-height: inherit; + color: inherit; + text-align: center; + vertical-align: top; + border: none; + outline: none; + -webkit-appearance: none; + -moz-appearance: none; +} +trix-editor .attachment__toolbar { + position: absolute; + z-index: 1; + top: -0.9em; + left: 0; + width: 100%; + text-align: center; +} +trix-editor .trix-button-group { + display: inline-flex; +} +trix-editor .trix-button { + position: relative; + float: left; + color: #666; + white-space: nowrap; + font-size: 80%; + padding: 0 0.8em; + margin: 0; + outline: none; + border: none; + border-radius: 0; + background: transparent; +} +trix-editor .trix-button:not(:first-child) { + border-left: 1px solid #ccc; +} +trix-editor .trix-button.trix-active { + background: #cbeefa; +} +trix-editor .trix-button:not(:disabled) { + cursor: pointer; +} +trix-editor .trix-button--remove { + text-indent: -9999px; + display: inline-block; + padding: 0; + outline: none; + width: 1.8em; + height: 1.8em; + line-height: 1.8em; + border-radius: 50%; + background-color: #fff; + border: 2px solid highlight; + box-shadow: 1px 1px 6px rgba(0, 0, 0, 0.25); +} +trix-editor .trix-button--remove::before { + display: inline-block; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + opacity: 0.7; + content: ""; + background-image: url(data:image/svg+xml,%3Csvg%20height%3D%2224%22%20width%3D%2224%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M19%206.4L17.6%205%2012%2010.6%206.4%205%205%206.4l5.6%205.6L5%2017.6%206.4%2019l5.6-5.6%205.6%205.6%201.4-1.4-5.6-5.6z%22%2F%3E%3Cpath%20d%3D%22M0%200h24v24H0z%22%20fill%3D%22none%22%2F%3E%3C%2Fsvg%3E); + background-position: center; + background-repeat: no-repeat; + background-size: 90%; +} +trix-editor .trix-button--remove:hover { + border-color: #333; +} +trix-editor .trix-button--remove:hover::before { + opacity: 1; +} +trix-editor .attachment__metadata-container { + position: relative; +} +trix-editor .attachment__metadata { + position: absolute; + left: 50%; + top: 2em; + transform: translate(-50%, 0); + max-width: 90%; + padding: 0.1em 0.6em; + font-size: 0.8em; + color: #fff; + background-color: rgba(0, 0, 0, 0.7); + border-radius: 3px; +} +trix-editor .attachment__metadata .attachment__name { + display: inline-block; + max-width: 100%; + vertical-align: bottom; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +trix-editor .attachment__metadata .attachment__size { + margin-left: 0.2em; + white-space: nowrap; +} +.trix-content { + line-height: 1.5; +} +.trix-content * { + box-sizing: border-box; + margin: 0; + padding: 0; +} +.trix-content h1 { + font-size: 1.2em; + line-height: 1.2; +} +.trix-content blockquote { + border: 0 solid #ccc; + border-left-width: 0.3em; + margin-left: 0.3em; + padding-left: 0.6em; +} +.trix-content [dir=rtl] blockquote, +.trix-content blockquote[dir=rtl] { + border-width: 0; + border-right-width: 0.3em; + margin-right: 0.3em; + padding-right: 0.6em; +} +.trix-content li { + margin-left: 1em; +} +.trix-content [dir=rtl] li { + margin-right: 1em; +} +.trix-content pre { + display: inline-block; + width: 100%; + vertical-align: top; + font-family: monospace; + font-size: 0.9em; + padding: 0.5em; + white-space: pre; + background-color: #eee; + overflow-x: auto; +} +.trix-content img { + max-width: 100%; + height: auto; +} +.trix-content .attachment { + display: inline-block; + position: relative; + max-width: 100%; +} +.trix-content .attachment a { + color: inherit; + text-decoration: none; +} +.trix-content .attachment a:hover, +.trix-content .attachment a:visited:hover { + color: inherit; +} +.trix-content .attachment__caption { + text-align: center; +} +.trix-content .attachment__caption .attachment__name + .attachment__size::before { + content: " \b7 "; +} +.trix-content .attachment--preview { + width: 100%; + text-align: center; +} +.trix-content .attachment--preview .attachment__caption { + color: #666; + font-size: 0.9em; + line-height: 1.2; +} +.trix-content .attachment--file { + color: #333; + line-height: 1; + margin: 0 2px 2px 2px; + padding: 0.4em 1em; + border: 1px solid #bbb; + border-radius: 5px; +} +.trix-content .attachment-gallery { + display: flex; + flex-wrap: wrap; + position: relative; +} +.trix-content .attachment-gallery .attachment { + flex: 1 0 33%; + padding: 0 0.5em; + max-width: 33%; +} +.trix-content .attachment-gallery.attachment-gallery--2 .attachment, +.trix-content .attachment-gallery.attachment-gallery--4 .attachment { + flex-basis: 50%; + max-width: 50%; +} + +/* packages/forms/resources/css/components/file-upload.css */ +.filepond--root { + margin-bottom: 0; +} diff --git a/packages/forms/dist/module.esm.js b/packages/forms/dist/module.esm.js new file mode 100644 index 0000000000..a96b8b79b7 --- /dev/null +++ b/packages/forms/dist/module.esm.js @@ -0,0 +1,24483 @@ +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __markAsModule = (target) => __defProp(target, "__esModule", {value: true}); +var __commonJS = (callback, module) => () => { + if (!module) { + module = {exports: {}}; + callback(module.exports, module); + } + return module.exports; +}; +var __exportStar = (target, module, desc) => { + if (module && typeof module === "object" || typeof module === "function") { + for (let key of __getOwnPropNames(module)) + if (!__hasOwnProp.call(target, key) && key !== "default") + __defProp(target, key, {get: () => module[key], enumerable: !(desc = __getOwnPropDesc(module, key)) || desc.enumerable}); + } + return target; +}; +var __toModule = (module) => { + return __exportStar(__markAsModule(__defProp(module != null ? __create(__getProtoOf(module)) : {}, "default", module && module.__esModule && "default" in module ? {get: () => module.default, enumerable: true} : {value: module, enumerable: true})), module); +}; + +// node_modules/dayjs/plugin/customParseFormat.js +var require_customParseFormat = __commonJS((exports, module) => { + !function(t2, e2) { + typeof exports == "object" && typeof module != "undefined" ? module.exports = e2() : typeof define == "function" && define.amd ? define(e2) : (t2 = typeof globalThis != "undefined" ? globalThis : t2 || self).dayjs_plugin_customParseFormat = e2(); + }(exports, function() { + "use strict"; + var t2 = {LTS: "h:mm:ss A", LT: "h:mm A", L: "MM/DD/YYYY", LL: "MMMM D, YYYY", LLL: "MMMM D, YYYY h:mm A", LLLL: "dddd, MMMM D, YYYY h:mm A"}, e2 = /(\[[^[]*\])|([-:/.()\s]+)|(A|a|YYYY|YY?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g, n2 = /\d\d/, r2 = /\d\d?/, i = /\d*[^\s\d-_:/()]+/, o2 = {}, s2 = function(t3) { + return (t3 = +t3) + (t3 > 68 ? 1900 : 2e3); + }; + var a2 = function(t3) { + return function(e3) { + this[t3] = +e3; + }; + }, f = [/[+-]\d\d:?(\d\d)?|Z/, function(t3) { + (this.zone || (this.zone = {})).offset = function(t4) { + if (!t4) + return 0; + if (t4 === "Z") + return 0; + var e3 = t4.match(/([+-]|\d\d)/g), n3 = 60 * e3[1] + (+e3[2] || 0); + return n3 === 0 ? 0 : e3[0] === "+" ? -n3 : n3; + }(t3); + }], u = function(t3) { + var e3 = o2[t3]; + return e3 && (e3.indexOf ? e3 : e3.s.concat(e3.f)); + }, h = function(t3, e3) { + var n3, r3 = o2.meridiem; + if (r3) { + for (var i2 = 1; i2 <= 24; i2 += 1) + if (t3.indexOf(r3(i2, 0, e3)) > -1) { + n3 = i2 > 12; + break; + } + } else + n3 = t3 === (e3 ? "pm" : "PM"); + return n3; + }, d = {A: [i, function(t3) { + this.afternoon = h(t3, false); + }], a: [i, function(t3) { + this.afternoon = h(t3, true); + }], S: [/\d/, function(t3) { + this.milliseconds = 100 * +t3; + }], SS: [n2, function(t3) { + this.milliseconds = 10 * +t3; + }], SSS: [/\d{3}/, function(t3) { + this.milliseconds = +t3; + }], s: [r2, a2("seconds")], ss: [r2, a2("seconds")], m: [r2, a2("minutes")], mm: [r2, a2("minutes")], H: [r2, a2("hours")], h: [r2, a2("hours")], HH: [r2, a2("hours")], hh: [r2, a2("hours")], D: [r2, a2("day")], DD: [n2, a2("day")], Do: [i, function(t3) { + var e3 = o2.ordinal, n3 = t3.match(/\d+/); + if (this.day = n3[0], e3) + for (var r3 = 1; r3 <= 31; r3 += 1) + e3(r3).replace(/\[|\]/g, "") === t3 && (this.day = r3); + }], M: [r2, a2("month")], MM: [n2, a2("month")], MMM: [i, function(t3) { + var e3 = u("months"), n3 = (u("monthsShort") || e3.map(function(t4) { + return t4.substr(0, 3); + })).indexOf(t3) + 1; + if (n3 < 1) + throw new Error(); + this.month = n3 % 12 || n3; + }], MMMM: [i, function(t3) { + var e3 = u("months").indexOf(t3) + 1; + if (e3 < 1) + throw new Error(); + this.month = e3 % 12 || e3; + }], Y: [/[+-]?\d+/, a2("year")], YY: [n2, function(t3) { + this.year = s2(t3); + }], YYYY: [/\d{4}/, a2("year")], Z: f, ZZ: f}; + function c2(n3) { + var r3, i2; + r3 = n3, i2 = o2 && o2.formats; + for (var s3 = (n3 = r3.replace(/(\[[^\]]+])|(LTS?|l{1,4}|L{1,4})/g, function(e3, n4, r4) { + var o3 = r4 && r4.toUpperCase(); + return n4 || i2[r4] || t2[r4] || i2[o3].replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g, function(t3, e4, n5) { + return e4 || n5.slice(1); + }); + })).match(e2), a3 = s3.length, f2 = 0; f2 < a3; f2 += 1) { + var u2 = s3[f2], h2 = d[u2], c3 = h2 && h2[0], l = h2 && h2[1]; + s3[f2] = l ? {regex: c3, parser: l} : u2.replace(/^\[|\]$/g, ""); + } + return function(t3) { + for (var e3 = {}, n4 = 0, r4 = 0; n4 < a3; n4 += 1) { + var i3 = s3[n4]; + if (typeof i3 == "string") + r4 += i3.length; + else { + var o3 = i3.regex, f3 = i3.parser, u3 = t3.substr(r4), h3 = o3.exec(u3)[0]; + f3.call(e3, h3), t3 = t3.replace(h3, ""); + } + } + return function(t4) { + var e4 = t4.afternoon; + if (e4 !== void 0) { + var n5 = t4.hours; + e4 ? n5 < 12 && (t4.hours += 12) : n5 === 12 && (t4.hours = 0), delete t4.afternoon; + } + }(e3), e3; + }; + } + return function(t3, e3, n3) { + n3.p.customParseFormat = true, t3 && t3.parseTwoDigitYear && (s2 = t3.parseTwoDigitYear); + var r3 = e3.prototype, i2 = r3.parse; + r3.parse = function(t4) { + var e4 = t4.date, r4 = t4.utc, s3 = t4.args; + this.$u = r4; + var a3 = s3[1]; + if (typeof a3 == "string") { + var f2 = s3[2] === true, u2 = s3[3] === true, h2 = f2 || u2, d2 = s3[2]; + u2 && (d2 = s3[2]), o2 = this.$locale(), !f2 && d2 && (o2 = n3.Ls[d2]), this.$d = function(t5, e5, n4) { + try { + if (["x", "X"].indexOf(e5) > -1) + return new Date((e5 === "X" ? 1e3 : 1) * t5); + var r5 = c2(e5)(t5), i3 = r5.year, o3 = r5.month, s4 = r5.day, a4 = r5.hours, f3 = r5.minutes, u3 = r5.seconds, h3 = r5.milliseconds, d3 = r5.zone, l2 = new Date(), m2 = s4 || (i3 || o3 ? 1 : l2.getDate()), M3 = i3 || l2.getFullYear(), Y2 = 0; + i3 && !o3 || (Y2 = o3 > 0 ? o3 - 1 : l2.getMonth()); + var p2 = a4 || 0, v = f3 || 0, D2 = u3 || 0, g = h3 || 0; + return d3 ? new Date(Date.UTC(M3, Y2, m2, p2, v, D2, g + 60 * d3.offset * 1e3)) : n4 ? new Date(Date.UTC(M3, Y2, m2, p2, v, D2, g)) : new Date(M3, Y2, m2, p2, v, D2, g); + } catch (t6) { + return new Date(""); + } + }(e4, a3, r4), this.init(), d2 && d2 !== true && (this.$L = this.locale(d2).$L), h2 && e4 != this.format(a3) && (this.$d = new Date("")), o2 = {}; + } else if (a3 instanceof Array) + for (var l = a3.length, m = 1; m <= l; m += 1) { + s3[1] = a3[m - 1]; + var M2 = n3.apply(this, s3); + if (M2.isValid()) { + this.$d = M2.$d, this.$L = M2.$L, this.init(); + break; + } + m === l && (this.$d = new Date("")); + } + else + i2.call(this, t4); + }; + }; + }); +}); + +// node_modules/dayjs/plugin/localeData.js +var require_localeData = __commonJS((exports, module) => { + !function(n2, e2) { + typeof exports == "object" && typeof module != "undefined" ? module.exports = e2() : typeof define == "function" && define.amd ? define(e2) : (n2 = typeof globalThis != "undefined" ? globalThis : n2 || self).dayjs_plugin_localeData = e2(); + }(exports, function() { + "use strict"; + return function(n2, e2, t2) { + var r2 = e2.prototype, o2 = function(n3) { + return n3 && (n3.indexOf ? n3 : n3.s); + }, u = function(n3, e3, t3, r3, u2) { + var i2 = n3.name ? n3 : n3.$locale(), a3 = o2(i2[e3]), s3 = o2(i2[t3]), f = a3 || s3.map(function(n4) { + return n4.substr(0, r3); + }); + if (!u2) + return f; + var d = i2.weekStart; + return f.map(function(n4, e4) { + return f[(e4 + (d || 0)) % 7]; + }); + }, i = function() { + return t2.Ls[t2.locale()]; + }, a2 = function(n3, e3) { + return n3.formats[e3] || function(n4) { + return n4.replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g, function(n5, e4, t3) { + return e4 || t3.slice(1); + }); + }(n3.formats[e3.toUpperCase()]); + }, s2 = function() { + var n3 = this; + return {months: function(e3) { + return e3 ? e3.format("MMMM") : u(n3, "months"); + }, monthsShort: function(e3) { + return e3 ? e3.format("MMM") : u(n3, "monthsShort", "months", 3); + }, firstDayOfWeek: function() { + return n3.$locale().weekStart || 0; + }, weekdays: function(e3) { + return e3 ? e3.format("dddd") : u(n3, "weekdays"); + }, weekdaysMin: function(e3) { + return e3 ? e3.format("dd") : u(n3, "weekdaysMin", "weekdays", 2); + }, weekdaysShort: function(e3) { + return e3 ? e3.format("ddd") : u(n3, "weekdaysShort", "weekdays", 3); + }, longDateFormat: function(e3) { + return a2(n3.$locale(), e3); + }, meridiem: this.$locale().meridiem, ordinal: this.$locale().ordinal}; + }; + r2.localeData = function() { + return s2.bind(this)(); + }, t2.localeData = function() { + var n3 = i(); + return {firstDayOfWeek: function() { + return n3.weekStart || 0; + }, weekdays: function() { + return t2.weekdays(); + }, weekdaysShort: function() { + return t2.weekdaysShort(); + }, weekdaysMin: function() { + return t2.weekdaysMin(); + }, months: function() { + return t2.months(); + }, monthsShort: function() { + return t2.monthsShort(); + }, longDateFormat: function(e3) { + return a2(n3, e3); + }, meridiem: n3.meridiem, ordinal: n3.ordinal}; + }, t2.months = function() { + return u(i(), "months"); + }, t2.monthsShort = function() { + return u(i(), "monthsShort", "months", 3); + }, t2.weekdays = function(n3) { + return u(i(), "weekdays", null, null, n3); + }, t2.weekdaysShort = function(n3) { + return u(i(), "weekdaysShort", "weekdays", 3, n3); + }, t2.weekdaysMin = function(n3) { + return u(i(), "weekdaysMin", "weekdays", 2, n3); + }; + }; + }); +}); + +// node_modules/dayjs/plugin/timezone.js +var require_timezone = __commonJS((exports, module) => { + !function(t2, e2) { + typeof exports == "object" && typeof module != "undefined" ? module.exports = e2() : typeof define == "function" && define.amd ? define(e2) : (t2 = typeof globalThis != "undefined" ? globalThis : t2 || self).dayjs_plugin_timezone = e2(); + }(exports, function() { + "use strict"; + var t2 = {year: 0, month: 1, day: 2, hour: 3, minute: 4, second: 5}, e2 = {}; + return function(n2, i, o2) { + var r2, a2 = function(t3, n3, i2) { + i2 === void 0 && (i2 = {}); + var o3 = new Date(t3); + return function(t4, n4) { + n4 === void 0 && (n4 = {}); + var i3 = n4.timeZoneName || "short", o4 = t4 + "|" + i3, r3 = e2[o4]; + return r3 || (r3 = new Intl.DateTimeFormat("en-US", {hour12: false, timeZone: t4, year: "numeric", month: "2-digit", day: "2-digit", hour: "2-digit", minute: "2-digit", second: "2-digit", timeZoneName: i3}), e2[o4] = r3), r3; + }(n3, i2).formatToParts(o3); + }, u = function(e3, n3) { + for (var i2 = a2(e3, n3), r3 = [], u2 = 0; u2 < i2.length; u2 += 1) { + var f2 = i2[u2], s3 = f2.type, m = f2.value, c2 = t2[s3]; + c2 >= 0 && (r3[c2] = parseInt(m, 10)); + } + var d = r3[3], l = d === 24 ? 0 : d, v = r3[0] + "-" + r3[1] + "-" + r3[2] + " " + l + ":" + r3[4] + ":" + r3[5] + ":000", h = +e3; + return (o2.utc(v).valueOf() - (h -= h % 1e3)) / 6e4; + }, f = i.prototype; + f.tz = function(t3, e3) { + t3 === void 0 && (t3 = r2); + var n3 = this.utcOffset(), i2 = this.toDate(), a3 = i2.toLocaleString("en-US", {timeZone: t3}), u2 = Math.round((i2 - new Date(a3)) / 1e3 / 60), f2 = o2(a3).$set("millisecond", this.$ms).utcOffset(15 * -Math.round(i2.getTimezoneOffset() / 15) - u2, true); + if (e3) { + var s3 = f2.utcOffset(); + f2 = f2.add(n3 - s3, "minute"); + } + return f2.$x.$timezone = t3, f2; + }, f.offsetName = function(t3) { + var e3 = this.$x.$timezone || o2.tz.guess(), n3 = a2(this.valueOf(), e3, {timeZoneName: t3}).find(function(t4) { + return t4.type.toLowerCase() === "timezonename"; + }); + return n3 && n3.value; + }; + var s2 = f.startOf; + f.startOf = function(t3, e3) { + if (!this.$x || !this.$x.$timezone) + return s2.call(this, t3, e3); + var n3 = o2(this.format("YYYY-MM-DD HH:mm:ss:SSS")); + return s2.call(n3, t3, e3).tz(this.$x.$timezone, true); + }, o2.tz = function(t3, e3, n3) { + var i2 = n3 && e3, a3 = n3 || e3 || r2, f2 = u(+o2(), a3); + if (typeof t3 != "string") + return o2(t3).tz(a3); + var s3 = function(t4, e4, n4) { + var i3 = t4 - 60 * e4 * 1e3, o3 = u(i3, n4); + if (e4 === o3) + return [i3, e4]; + var r3 = u(i3 -= 60 * (o3 - e4) * 1e3, n4); + return o3 === r3 ? [i3, o3] : [t4 - 60 * Math.min(o3, r3) * 1e3, Math.max(o3, r3)]; + }(o2.utc(t3, i2).valueOf(), f2, a3), m = s3[0], c2 = s3[1], d = o2(m).utcOffset(c2); + return d.$x.$timezone = a3, d; + }, o2.tz.guess = function() { + return Intl.DateTimeFormat().resolvedOptions().timeZone; + }, o2.tz.setDefault = function(t3) { + r2 = t3; + }; + }; + }); +}); + +// node_modules/dayjs/plugin/utc.js +var require_utc = __commonJS((exports, module) => { + !function(t2, i) { + typeof exports == "object" && typeof module != "undefined" ? module.exports = i() : typeof define == "function" && define.amd ? define(i) : (t2 = typeof globalThis != "undefined" ? globalThis : t2 || self).dayjs_plugin_utc = i(); + }(exports, function() { + "use strict"; + var t2 = "minute", i = /[+-]\d\d(?::?\d\d)?/g, e2 = /([+-]|\d\d)/g; + return function(s2, f, n2) { + var u = f.prototype; + n2.utc = function(t3) { + var i2 = {date: t3, utc: true, args: arguments}; + return new f(i2); + }, u.utc = function(i2) { + var e3 = n2(this.toDate(), {locale: this.$L, utc: true}); + return i2 ? e3.add(this.utcOffset(), t2) : e3; + }, u.local = function() { + return n2(this.toDate(), {locale: this.$L, utc: false}); + }; + var o2 = u.parse; + u.parse = function(t3) { + t3.utc && (this.$u = true), this.$utils().u(t3.$offset) || (this.$offset = t3.$offset), o2.call(this, t3); + }; + var r2 = u.init; + u.init = function() { + if (this.$u) { + var t3 = this.$d; + this.$y = t3.getUTCFullYear(), this.$M = t3.getUTCMonth(), this.$D = t3.getUTCDate(), this.$W = t3.getUTCDay(), this.$H = t3.getUTCHours(), this.$m = t3.getUTCMinutes(), this.$s = t3.getUTCSeconds(), this.$ms = t3.getUTCMilliseconds(); + } else + r2.call(this); + }; + var a2 = u.utcOffset; + u.utcOffset = function(s3, f2) { + var n3 = this.$utils().u; + if (n3(s3)) + return this.$u ? 0 : n3(this.$offset) ? a2.call(this) : this.$offset; + if (typeof s3 == "string" && (s3 = function(t3) { + t3 === void 0 && (t3 = ""); + var s4 = t3.match(i); + if (!s4) + return null; + var f3 = ("" + s4[0]).match(e2) || ["-", 0, 0], n4 = f3[0], u3 = 60 * +f3[1] + +f3[2]; + return u3 === 0 ? 0 : n4 === "+" ? u3 : -u3; + }(s3)) === null) + return this; + var u2 = Math.abs(s3) <= 16 ? 60 * s3 : s3, o3 = this; + if (f2) + return o3.$offset = u2, o3.$u = s3 === 0, o3; + if (s3 !== 0) { + var r3 = this.$u ? this.toDate().getTimezoneOffset() : -1 * this.utcOffset(); + (o3 = this.local().add(u2 + r3, t2)).$offset = u2, o3.$x.$localOffset = r3; + } else + o3 = this.utc(); + return o3; + }; + var h = u.format; + u.format = function(t3) { + var i2 = t3 || (this.$u ? "YYYY-MM-DDTHH:mm:ss[Z]" : ""); + return h.call(this, i2); + }, u.valueOf = function() { + var t3 = this.$utils().u(this.$offset) ? 0 : this.$offset + (this.$x.$localOffset || new Date().getTimezoneOffset()); + return this.$d.valueOf() - 6e4 * t3; + }, u.isUTC = function() { + return !!this.$u; + }, u.toISOString = function() { + return this.toDate().toISOString(); + }, u.toString = function() { + return this.toDate().toUTCString(); + }; + var l = u.toDate; + u.toDate = function(t3) { + return t3 === "s" && this.$offset ? n2(this.format("YYYY-MM-DD HH:mm:ss:SSS")).toDate() : l.call(this); + }; + var c2 = u.diff; + u.diff = function(t3, i2, e3) { + if (t3 && this.$u === t3.$u) + return c2.call(this, t3, i2, e3); + var s3 = this.local(), f2 = n2(t3).local(); + return c2.call(s3, f2, i2, e3); + }; + }; + }); +}); + +// node_modules/trix/dist/trix.js +var require_trix = __commonJS((exports, module) => { + (function() { + }).call(exports), function() { + var t2; + window.Set == null && (window.Set = t2 = function() { + function t3() { + this.clear(); + } + return t3.prototype.clear = function() { + return this.values = []; + }, t3.prototype.has = function(t4) { + return this.values.indexOf(t4) !== -1; + }, t3.prototype.add = function(t4) { + return this.has(t4) || this.values.push(t4), this; + }, t3.prototype["delete"] = function(t4) { + var e2; + return (e2 = this.values.indexOf(t4)) === -1 ? false : (this.values.splice(e2, 1), true); + }, t3.prototype.forEach = function() { + var t4; + return (t4 = this.values).forEach.apply(t4, arguments); + }, t3; + }()); + }.call(exports), function(t2) { + function e2() { + } + function n2(t3, e3) { + return function() { + t3.apply(e3, arguments); + }; + } + function i(t3) { + if (typeof this != "object") + throw new TypeError("Promises must be constructed via new"); + if (typeof t3 != "function") + throw new TypeError("not a function"); + this._state = 0, this._handled = false, this._value = void 0, this._deferreds = [], c2(t3, this); + } + function o2(t3, e3) { + for (; t3._state === 3; ) + t3 = t3._value; + return t3._state === 0 ? void t3._deferreds.push(e3) : (t3._handled = true, void h(function() { + var n3 = t3._state === 1 ? e3.onFulfilled : e3.onRejected; + if (n3 === null) + return void (t3._state === 1 ? r2 : s2)(e3.promise, t3._value); + var i2; + try { + i2 = n3(t3._value); + } catch (o3) { + return void s2(e3.promise, o3); + } + r2(e3.promise, i2); + })); + } + function r2(t3, e3) { + try { + if (e3 === t3) + throw new TypeError("A promise cannot be resolved with itself."); + if (e3 && (typeof e3 == "object" || typeof e3 == "function")) { + var o3 = e3.then; + if (e3 instanceof i) + return t3._state = 3, t3._value = e3, void a2(t3); + if (typeof o3 == "function") + return void c2(n2(o3, e3), t3); + } + t3._state = 1, t3._value = e3, a2(t3); + } catch (r3) { + s2(t3, r3); + } + } + function s2(t3, e3) { + t3._state = 2, t3._value = e3, a2(t3); + } + function a2(t3) { + t3._state === 2 && t3._deferreds.length === 0 && setTimeout(function() { + t3._handled || p2(t3._value); + }, 1); + for (var e3 = 0, n3 = t3._deferreds.length; n3 > e3; e3++) + o2(t3, t3._deferreds[e3]); + t3._deferreds = null; + } + function u(t3, e3, n3) { + this.onFulfilled = typeof t3 == "function" ? t3 : null, this.onRejected = typeof e3 == "function" ? e3 : null, this.promise = n3; + } + function c2(t3, e3) { + var n3 = false; + try { + t3(function(t4) { + n3 || (n3 = true, r2(e3, t4)); + }, function(t4) { + n3 || (n3 = true, s2(e3, t4)); + }); + } catch (i2) { + if (n3) + return; + n3 = true, s2(e3, i2); + } + } + var l = setTimeout, h = typeof setImmediate == "function" && setImmediate || function(t3) { + l(t3, 1); + }, p2 = function(t3) { + typeof console != "undefined" && console && console.warn("Possible Unhandled Promise Rejection:", t3); + }; + i.prototype["catch"] = function(t3) { + return this.then(null, t3); + }, i.prototype.then = function(t3, n3) { + var r3 = new i(e2); + return o2(this, new u(t3, n3, r3)), r3; + }, i.all = function(t3) { + var e3 = Array.prototype.slice.call(t3); + return new i(function(t4, n3) { + function i2(r4, s3) { + try { + if (s3 && (typeof s3 == "object" || typeof s3 == "function")) { + var a3 = s3.then; + if (typeof a3 == "function") + return void a3.call(s3, function(t5) { + i2(r4, t5); + }, n3); + } + e3[r4] = s3, --o3 === 0 && t4(e3); + } catch (u2) { + n3(u2); + } + } + if (e3.length === 0) + return t4([]); + for (var o3 = e3.length, r3 = 0; r3 < e3.length; r3++) + i2(r3, e3[r3]); + }); + }, i.resolve = function(t3) { + return t3 && typeof t3 == "object" && t3.constructor === i ? t3 : new i(function(e3) { + e3(t3); + }); + }, i.reject = function(t3) { + return new i(function(e3, n3) { + n3(t3); + }); + }, i.race = function(t3) { + return new i(function(e3, n3) { + for (var i2 = 0, o3 = t3.length; o3 > i2; i2++) + t3[i2].then(e3, n3); + }); + }, i._setImmediateFn = function(t3) { + h = t3; + }, i._setUnhandledRejectionFn = function(t3) { + p2 = t3; + }, typeof module != "undefined" && module.exports ? module.exports = i : t2.Promise || (t2.Promise = i); + }(exports), function() { + var t2 = typeof window.customElements == "object", e2 = typeof document.registerElement == "function", n2 = t2 || e2; + n2 || (typeof WeakMap == "undefined" && !function() { + var t3 = Object.defineProperty, e3 = Date.now() % 1e9, n3 = function() { + this.name = "__st" + (1e9 * Math.random() >>> 0) + (e3++ + "__"); + }; + n3.prototype = {set: function(e4, n4) { + var i = e4[this.name]; + return i && i[0] === e4 ? i[1] = n4 : t3(e4, this.name, {value: [e4, n4], writable: true}), this; + }, get: function(t4) { + var e4; + return (e4 = t4[this.name]) && e4[0] === t4 ? e4[1] : void 0; + }, delete: function(t4) { + var e4 = t4[this.name]; + return e4 && e4[0] === t4 ? (e4[0] = e4[1] = void 0, true) : false; + }, has: function(t4) { + var e4 = t4[this.name]; + return e4 ? e4[0] === t4 : false; + }}, window.WeakMap = n3; + }(), function(t3) { + function e3(t4) { + A.push(t4), b || (b = true, g(i)); + } + function n3(t4) { + return window.ShadowDOMPolyfill && window.ShadowDOMPolyfill.wrapIfNeeded(t4) || t4; + } + function i() { + b = false; + var t4 = A; + A = [], t4.sort(function(t5, e5) { + return t5.uid_ - e5.uid_; + }); + var e4 = false; + t4.forEach(function(t5) { + var n4 = t5.takeRecords(); + o2(t5), n4.length && (t5.callback_(n4, t5), e4 = true); + }), e4 && i(); + } + function o2(t4) { + t4.nodes_.forEach(function(e4) { + var n4 = m.get(e4); + n4 && n4.forEach(function(e5) { + e5.observer === t4 && e5.removeTransientObservers(); + }); + }); + } + function r2(t4, e4) { + for (var n4 = t4; n4; n4 = n4.parentNode) { + var i2 = m.get(n4); + if (i2) + for (var o3 = 0; o3 < i2.length; o3++) { + var r3 = i2[o3], s3 = r3.options; + if (n4 === t4 || s3.subtree) { + var a3 = e4(s3); + a3 && r3.enqueue(a3); + } + } + } + } + function s2(t4) { + this.callback_ = t4, this.nodes_ = [], this.records_ = [], this.uid_ = ++C3; + } + function a2(t4, e4) { + this.type = t4, this.target = e4, this.addedNodes = [], this.removedNodes = [], this.previousSibling = null, this.nextSibling = null, this.attributeName = null, this.attributeNamespace = null, this.oldValue = null; + } + function u(t4) { + var e4 = new a2(t4.type, t4.target); + return e4.addedNodes = t4.addedNodes.slice(), e4.removedNodes = t4.removedNodes.slice(), e4.previousSibling = t4.previousSibling, e4.nextSibling = t4.nextSibling, e4.attributeName = t4.attributeName, e4.attributeNamespace = t4.attributeNamespace, e4.oldValue = t4.oldValue, e4; + } + function c2(t4, e4) { + return x = new a2(t4, e4); + } + function l(t4) { + return w ? w : (w = u(x), w.oldValue = t4, w); + } + function h() { + x = w = void 0; + } + function p2(t4) { + return t4 === w || t4 === x; + } + function d(t4, e4) { + return t4 === e4 ? t4 : w && p2(t4) ? w : null; + } + function f(t4, e4, n4) { + this.observer = t4, this.target = e4, this.options = n4, this.transientObservedNodes = []; + } + if (!t3.JsMutationObserver) { + var g, m = new WeakMap(); + if (/Trident|Edge/.test(navigator.userAgent)) + g = setTimeout; + else if (window.setImmediate) + g = window.setImmediate; + else { + var v = [], y = String(Math.random()); + window.addEventListener("message", function(t4) { + if (t4.data === y) { + var e4 = v; + v = [], e4.forEach(function(t5) { + t5(); + }); + } + }), g = function(t4) { + v.push(t4), window.postMessage(y, "*"); + }; + } + var b = false, A = [], C3 = 0; + s2.prototype = {observe: function(t4, e4) { + if (t4 = n3(t4), !e4.childList && !e4.attributes && !e4.characterData || e4.attributeOldValue && !e4.attributes || e4.attributeFilter && e4.attributeFilter.length && !e4.attributes || e4.characterDataOldValue && !e4.characterData) + throw new SyntaxError(); + var i2 = m.get(t4); + i2 || m.set(t4, i2 = []); + for (var o3, r3 = 0; r3 < i2.length; r3++) + if (i2[r3].observer === this) { + o3 = i2[r3], o3.removeListeners(), o3.options = e4; + break; + } + o3 || (o3 = new f(this, t4, e4), i2.push(o3), this.nodes_.push(t4)), o3.addListeners(); + }, disconnect: function() { + this.nodes_.forEach(function(t4) { + for (var e4 = m.get(t4), n4 = 0; n4 < e4.length; n4++) { + var i2 = e4[n4]; + if (i2.observer === this) { + i2.removeListeners(), e4.splice(n4, 1); + break; + } + } + }, this), this.records_ = []; + }, takeRecords: function() { + var t4 = this.records_; + return this.records_ = [], t4; + }}; + var x, w; + f.prototype = {enqueue: function(t4) { + var n4 = this.observer.records_, i2 = n4.length; + if (n4.length > 0) { + var o3 = n4[i2 - 1], r3 = d(o3, t4); + if (r3) + return void (n4[i2 - 1] = r3); + } else + e3(this.observer); + n4[i2] = t4; + }, addListeners: function() { + this.addListeners_(this.target); + }, addListeners_: function(t4) { + var e4 = this.options; + e4.attributes && t4.addEventListener("DOMAttrModified", this, true), e4.characterData && t4.addEventListener("DOMCharacterDataModified", this, true), e4.childList && t4.addEventListener("DOMNodeInserted", this, true), (e4.childList || e4.subtree) && t4.addEventListener("DOMNodeRemoved", this, true); + }, removeListeners: function() { + this.removeListeners_(this.target); + }, removeListeners_: function(t4) { + var e4 = this.options; + e4.attributes && t4.removeEventListener("DOMAttrModified", this, true), e4.characterData && t4.removeEventListener("DOMCharacterDataModified", this, true), e4.childList && t4.removeEventListener("DOMNodeInserted", this, true), (e4.childList || e4.subtree) && t4.removeEventListener("DOMNodeRemoved", this, true); + }, addTransientObserver: function(t4) { + if (t4 !== this.target) { + this.addListeners_(t4), this.transientObservedNodes.push(t4); + var e4 = m.get(t4); + e4 || m.set(t4, e4 = []), e4.push(this); + } + }, removeTransientObservers: function() { + var t4 = this.transientObservedNodes; + this.transientObservedNodes = [], t4.forEach(function(t5) { + this.removeListeners_(t5); + for (var e4 = m.get(t5), n4 = 0; n4 < e4.length; n4++) + if (e4[n4] === this) { + e4.splice(n4, 1); + break; + } + }, this); + }, handleEvent: function(t4) { + switch (t4.stopImmediatePropagation(), t4.type) { + case "DOMAttrModified": + var e4 = t4.attrName, n4 = t4.relatedNode.namespaceURI, i2 = t4.target, o3 = new c2("attributes", i2); + o3.attributeName = e4, o3.attributeNamespace = n4; + var s3 = t4.attrChange === MutationEvent.ADDITION ? null : t4.prevValue; + r2(i2, function(t5) { + return !t5.attributes || t5.attributeFilter && t5.attributeFilter.length && t5.attributeFilter.indexOf(e4) === -1 && t5.attributeFilter.indexOf(n4) === -1 ? void 0 : t5.attributeOldValue ? l(s3) : o3; + }); + break; + case "DOMCharacterDataModified": + var i2 = t4.target, o3 = c2("characterData", i2), s3 = t4.prevValue; + r2(i2, function(t5) { + return t5.characterData ? t5.characterDataOldValue ? l(s3) : o3 : void 0; + }); + break; + case "DOMNodeRemoved": + this.addTransientObserver(t4.target); + case "DOMNodeInserted": + var a3, u2, p3 = t4.target; + t4.type === "DOMNodeInserted" ? (a3 = [p3], u2 = []) : (a3 = [], u2 = [p3]); + var d2 = p3.previousSibling, f2 = p3.nextSibling, o3 = c2("childList", t4.target.parentNode); + o3.addedNodes = a3, o3.removedNodes = u2, o3.previousSibling = d2, o3.nextSibling = f2, r2(t4.relatedNode, function(t5) { + return t5.childList ? o3 : void 0; + }); + } + h(); + }}, t3.JsMutationObserver = s2, t3.MutationObserver || (t3.MutationObserver = s2, s2._isPolyfilled = true); + } + }(self), function() { + "use strict"; + if (!window.performance || !window.performance.now) { + var t3 = Date.now(); + window.performance = {now: function() { + return Date.now() - t3; + }}; + } + window.requestAnimationFrame || (window.requestAnimationFrame = function() { + var t4 = window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame; + return t4 ? function(e4) { + return t4(function() { + e4(performance.now()); + }); + } : function(t5) { + return window.setTimeout(t5, 1e3 / 60); + }; + }()), window.cancelAnimationFrame || (window.cancelAnimationFrame = function() { + return window.webkitCancelAnimationFrame || window.mozCancelAnimationFrame || function(t4) { + clearTimeout(t4); + }; + }()); + var e3 = function() { + var t4 = document.createEvent("Event"); + return t4.initEvent("foo", true, true), t4.preventDefault(), t4.defaultPrevented; + }(); + if (!e3) { + var n3 = Event.prototype.preventDefault; + Event.prototype.preventDefault = function() { + this.cancelable && (n3.call(this), Object.defineProperty(this, "defaultPrevented", {get: function() { + return true; + }, configurable: true})); + }; + } + var i = /Trident/.test(navigator.userAgent); + if ((!window.CustomEvent || i && typeof window.CustomEvent != "function") && (window.CustomEvent = function(t4, e4) { + e4 = e4 || {}; + var n4 = document.createEvent("CustomEvent"); + return n4.initCustomEvent(t4, Boolean(e4.bubbles), Boolean(e4.cancelable), e4.detail), n4; + }, window.CustomEvent.prototype = window.Event.prototype), !window.Event || i && typeof window.Event != "function") { + var o2 = window.Event; + window.Event = function(t4, e4) { + e4 = e4 || {}; + var n4 = document.createEvent("Event"); + return n4.initEvent(t4, Boolean(e4.bubbles), Boolean(e4.cancelable)), n4; + }, window.Event.prototype = o2.prototype; + } + }(window.WebComponents), window.CustomElements = window.CustomElements || {flags: {}}, function(t3) { + var e3 = t3.flags, n3 = [], i = function(t4) { + n3.push(t4); + }, o2 = function() { + n3.forEach(function(e4) { + e4(t3); + }); + }; + t3.addModule = i, t3.initializeModules = o2, t3.hasNative = Boolean(document.registerElement), t3.isIE = /Trident/.test(navigator.userAgent), t3.useNative = !e3.register && t3.hasNative && !window.ShadowDOMPolyfill && (!window.HTMLImports || window.HTMLImports.useNative); + }(window.CustomElements), window.CustomElements.addModule(function(t3) { + function e3(t4, e4) { + n3(t4, function(t5) { + return e4(t5) ? true : void i(t5, e4); + }), i(t4, e4); + } + function n3(t4, e4, i2) { + var o3 = t4.firstElementChild; + if (!o3) + for (o3 = t4.firstChild; o3 && o3.nodeType !== Node.ELEMENT_NODE; ) + o3 = o3.nextSibling; + for (; o3; ) + e4(o3, i2) !== true && n3(o3, e4, i2), o3 = o3.nextElementSibling; + return null; + } + function i(t4, n4) { + for (var i2 = t4.shadowRoot; i2; ) + e3(i2, n4), i2 = i2.olderShadowRoot; + } + function o2(t4, e4) { + r2(t4, e4, []); + } + function r2(t4, e4, n4) { + if (t4 = window.wrap(t4), !(n4.indexOf(t4) >= 0)) { + n4.push(t4); + for (var i2, o3 = t4.querySelectorAll("link[rel=" + s2 + "]"), a2 = 0, u = o3.length; u > a2 && (i2 = o3[a2]); a2++) + i2.import && r2(i2.import, e4, n4); + e4(t4); + } + } + var s2 = window.HTMLImports ? window.HTMLImports.IMPORT_LINK_TYPE : "none"; + t3.forDocumentTree = o2, t3.forSubtree = e3; + }), window.CustomElements.addModule(function(t3) { + function e3(t4, e4) { + return n3(t4, e4) || i(t4, e4); + } + function n3(e4, n4) { + return t3.upgrade(e4, n4) ? true : void (n4 && s2(e4)); + } + function i(t4, e4) { + b(t4, function(t5) { + return n3(t5, e4) ? true : void 0; + }); + } + function o2(t4) { + w.push(t4), x || (x = true, setTimeout(r2)); + } + function r2() { + x = false; + for (var t4, e4 = w, n4 = 0, i2 = e4.length; i2 > n4 && (t4 = e4[n4]); n4++) + t4(); + w = []; + } + function s2(t4) { + C3 ? o2(function() { + a2(t4); + }) : a2(t4); + } + function a2(t4) { + t4.__upgraded__ && !t4.__attached && (t4.__attached = true, t4.attachedCallback && t4.attachedCallback()); + } + function u(t4) { + c2(t4), b(t4, function(t5) { + c2(t5); + }); + } + function c2(t4) { + C3 ? o2(function() { + l(t4); + }) : l(t4); + } + function l(t4) { + t4.__upgraded__ && t4.__attached && (t4.__attached = false, t4.detachedCallback && t4.detachedCallback()); + } + function h(t4) { + for (var e4 = t4, n4 = window.wrap(document); e4; ) { + if (e4 == n4) + return true; + e4 = e4.parentNode || e4.nodeType === Node.DOCUMENT_FRAGMENT_NODE && e4.host; + } + } + function p2(t4) { + if (t4.shadowRoot && !t4.shadowRoot.__watched) { + y.dom && console.log("watching shadow-root for: ", t4.localName); + for (var e4 = t4.shadowRoot; e4; ) + g(e4), e4 = e4.olderShadowRoot; + } + } + function d(t4, n4) { + if (y.dom) { + var i2 = n4[0]; + if (i2 && i2.type === "childList" && i2.addedNodes && i2.addedNodes) { + for (var o3 = i2.addedNodes[0]; o3 && o3 !== document && !o3.host; ) + o3 = o3.parentNode; + var r3 = o3 && (o3.URL || o3._URL || o3.host && o3.host.localName) || ""; + r3 = r3.split("/?").shift().split("/").pop(); + } + console.group("mutations (%d) [%s]", n4.length, r3 || ""); + } + var s3 = h(t4); + n4.forEach(function(t5) { + t5.type === "childList" && (E(t5.addedNodes, function(t6) { + t6.localName && e3(t6, s3); + }), E(t5.removedNodes, function(t6) { + t6.localName && u(t6); + })); + }), y.dom && console.groupEnd(); + } + function f(t4) { + for (t4 = window.wrap(t4), t4 || (t4 = window.wrap(document)); t4.parentNode; ) + t4 = t4.parentNode; + var e4 = t4.__observer; + e4 && (d(t4, e4.takeRecords()), r2()); + } + function g(t4) { + if (!t4.__observer) { + var e4 = new MutationObserver(d.bind(this, t4)); + e4.observe(t4, {childList: true, subtree: true}), t4.__observer = e4; + } + } + function m(t4) { + t4 = window.wrap(t4), y.dom && console.group("upgradeDocument: ", t4.baseURI.split("/").pop()); + var n4 = t4 === window.wrap(document); + e3(t4, n4), g(t4), y.dom && console.groupEnd(); + } + function v(t4) { + A(t4, m); + } + var y = t3.flags, b = t3.forSubtree, A = t3.forDocumentTree, C3 = window.MutationObserver._isPolyfilled && y["throttle-attached"]; + t3.hasPolyfillMutations = C3, t3.hasThrottledAttached = C3; + var x = false, w = [], E = Array.prototype.forEach.call.bind(Array.prototype.forEach), S2 = Element.prototype.createShadowRoot; + S2 && (Element.prototype.createShadowRoot = function() { + var t4 = S2.call(this); + return window.CustomElements.watchShadow(this), t4; + }), t3.watchShadow = p2, t3.upgradeDocumentTree = v, t3.upgradeDocument = m, t3.upgradeSubtree = i, t3.upgradeAll = e3, t3.attached = s2, t3.takeRecords = f; + }), window.CustomElements.addModule(function(t3) { + function e3(e4, i2) { + if (e4.localName === "template" && window.HTMLTemplateElement && HTMLTemplateElement.decorate && HTMLTemplateElement.decorate(e4), !e4.__upgraded__ && e4.nodeType === Node.ELEMENT_NODE) { + var o3 = e4.getAttribute("is"), r3 = t3.getRegisteredDefinition(e4.localName) || t3.getRegisteredDefinition(o3); + if (r3 && (o3 && r3.tag == e4.localName || !o3 && !r3.extends)) + return n3(e4, r3, i2); + } + } + function n3(e4, n4, o3) { + return s2.upgrade && console.group("upgrade:", e4.localName), n4.is && e4.setAttribute("is", n4.is), i(e4, n4), e4.__upgraded__ = true, r2(e4), o3 && t3.attached(e4), t3.upgradeSubtree(e4, o3), s2.upgrade && console.groupEnd(), e4; + } + function i(t4, e4) { + Object.__proto__ ? t4.__proto__ = e4.prototype : (o2(t4, e4.prototype, e4.native), t4.__proto__ = e4.prototype); + } + function o2(t4, e4, n4) { + for (var i2 = {}, o3 = e4; o3 !== n4 && o3 !== HTMLElement.prototype; ) { + for (var r3, s3 = Object.getOwnPropertyNames(o3), a2 = 0; r3 = s3[a2]; a2++) + i2[r3] || (Object.defineProperty(t4, r3, Object.getOwnPropertyDescriptor(o3, r3)), i2[r3] = 1); + o3 = Object.getPrototypeOf(o3); + } + } + function r2(t4) { + t4.createdCallback && t4.createdCallback(); + } + var s2 = t3.flags; + t3.upgrade = e3, t3.upgradeWithDefinition = n3, t3.implementPrototype = i; + }), window.CustomElements.addModule(function(t3) { + function e3(e4, i2) { + var u2 = i2 || {}; + if (!e4) + throw new Error("document.registerElement: first argument `name` must not be empty"); + if (e4.indexOf("-") < 0) + throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '" + String(e4) + "'."); + if (o2(e4)) + throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '" + String(e4) + "'. The type name is invalid."); + if (c2(e4)) + throw new Error("DuplicateDefinitionError: a type with name '" + String(e4) + "' is already registered"); + return u2.prototype || (u2.prototype = Object.create(HTMLElement.prototype)), u2.__name = e4.toLowerCase(), u2.extends && (u2.extends = u2.extends.toLowerCase()), u2.lifecycle = u2.lifecycle || {}, u2.ancestry = r2(u2.extends), s2(u2), a2(u2), n3(u2.prototype), l(u2.__name, u2), u2.ctor = h(u2), u2.ctor.prototype = u2.prototype, u2.prototype.constructor = u2.ctor, t3.ready && m(document), u2.ctor; + } + function n3(t4) { + if (!t4.setAttribute._polyfilled) { + var e4 = t4.setAttribute; + t4.setAttribute = function(t5, n5) { + i.call(this, t5, n5, e4); + }; + var n4 = t4.removeAttribute; + t4.removeAttribute = function(t5) { + i.call(this, t5, null, n4); + }, t4.setAttribute._polyfilled = true; + } + } + function i(t4, e4, n4) { + t4 = t4.toLowerCase(); + var i2 = this.getAttribute(t4); + n4.apply(this, arguments); + var o3 = this.getAttribute(t4); + this.attributeChangedCallback && o3 !== i2 && this.attributeChangedCallback(t4, i2, o3); + } + function o2(t4) { + for (var e4 = 0; e4 < C3.length; e4++) + if (t4 === C3[e4]) + return true; + } + function r2(t4) { + var e4 = c2(t4); + return e4 ? r2(e4.extends).concat([e4]) : []; + } + function s2(t4) { + for (var e4, n4 = t4.extends, i2 = 0; e4 = t4.ancestry[i2]; i2++) + n4 = e4.is && e4.tag; + t4.tag = n4 || t4.__name, n4 && (t4.is = t4.__name); + } + function a2(t4) { + if (!Object.__proto__) { + var e4 = HTMLElement.prototype; + if (t4.is) { + var n4 = document.createElement(t4.tag); + e4 = Object.getPrototypeOf(n4); + } + for (var i2, o3 = t4.prototype, r3 = false; o3; ) + o3 == e4 && (r3 = true), i2 = Object.getPrototypeOf(o3), i2 && (o3.__proto__ = i2), o3 = i2; + r3 || console.warn(t4.tag + " prototype not found in prototype chain for " + t4.is), t4.native = e4; + } + } + function u(t4) { + return y(E(t4.tag), t4); + } + function c2(t4) { + return t4 ? x[t4.toLowerCase()] : void 0; + } + function l(t4, e4) { + x[t4] = e4; + } + function h(t4) { + return function() { + return u(t4); + }; + } + function p2(t4, e4, n4) { + return t4 === w ? d(e4, n4) : S2(t4, e4); + } + function d(t4, e4) { + t4 && (t4 = t4.toLowerCase()), e4 && (e4 = e4.toLowerCase()); + var n4 = c2(e4 || t4); + if (n4) { + if (t4 == n4.tag && e4 == n4.is) + return new n4.ctor(); + if (!e4 && !n4.is) + return new n4.ctor(); + } + var i2; + return e4 ? (i2 = d(t4), i2.setAttribute("is", e4), i2) : (i2 = E(t4), t4.indexOf("-") >= 0 && b(i2, HTMLElement), i2); + } + function f(t4, e4) { + var n4 = t4[e4]; + t4[e4] = function() { + var t5 = n4.apply(this, arguments); + return v(t5), t5; + }; + } + var g, m = (t3.isIE, t3.upgradeDocumentTree), v = t3.upgradeAll, y = t3.upgradeWithDefinition, b = t3.implementPrototype, A = t3.useNative, C3 = ["annotation-xml", "color-profile", "font-face", "font-face-src", "font-face-uri", "font-face-format", "font-face-name", "missing-glyph"], x = {}, w = "http://www.w3.org/1999/xhtml", E = document.createElement.bind(document), S2 = document.createElementNS.bind(document); + g = Object.__proto__ || A ? function(t4, e4) { + return t4 instanceof e4; + } : function(t4, e4) { + if (t4 instanceof e4) + return true; + for (var n4 = t4; n4; ) { + if (n4 === e4.prototype) + return true; + n4 = n4.__proto__; + } + return false; + }, f(Node.prototype, "cloneNode"), f(document, "importNode"), document.registerElement = e3, document.createElement = d, document.createElementNS = p2, t3.registry = x, t3.instanceof = g, t3.reservedTagList = C3, t3.getRegisteredDefinition = c2, document.register = document.registerElement; + }), function(t3) { + function e3() { + r2(window.wrap(document)), window.CustomElements.ready = true; + var t4 = window.requestAnimationFrame || function(t5) { + setTimeout(t5, 16); + }; + t4(function() { + setTimeout(function() { + window.CustomElements.readyTime = Date.now(), window.HTMLImports && (window.CustomElements.elapsed = window.CustomElements.readyTime - window.HTMLImports.readyTime), document.dispatchEvent(new CustomEvent("WebComponentsReady", {bubbles: true})); + }); + }); + } + var n3 = t3.useNative, i = t3.initializeModules; + if (t3.isIE, n3) { + var o2 = function() { + }; + t3.watchShadow = o2, t3.upgrade = o2, t3.upgradeAll = o2, t3.upgradeDocumentTree = o2, t3.upgradeSubtree = o2, t3.takeRecords = o2, t3.instanceof = function(t4, e4) { + return t4 instanceof e4; + }; + } else + i(); + var r2 = t3.upgradeDocumentTree, s2 = t3.upgradeDocument; + if (window.wrap || (window.ShadowDOMPolyfill ? (window.wrap = window.ShadowDOMPolyfill.wrapIfNeeded, window.unwrap = window.ShadowDOMPolyfill.unwrapIfNeeded) : window.wrap = window.unwrap = function(t4) { + return t4; + }), window.HTMLImports && (window.HTMLImports.__importsParsingHook = function(t4) { + t4.import && s2(wrap(t4.import)); + }), document.readyState === "complete" || t3.flags.eager) + e3(); + else if (document.readyState !== "interactive" || window.attachEvent || window.HTMLImports && !window.HTMLImports.ready) { + var a2 = window.HTMLImports && !window.HTMLImports.ready ? "HTMLImportsLoaded" : "DOMContentLoaded"; + window.addEventListener(a2, e3); + } else + e3(); + }(window.CustomElements)); + }.call(exports), function() { + }.call(exports), function() { + var t2 = this; + (function() { + (function() { + this.Trix = {VERSION: "1.3.1", ZERO_WIDTH_SPACE: "\uFEFF", NON_BREAKING_SPACE: "\xA0", OBJECT_REPLACEMENT_CHARACTER: "\uFFFC", browser: {composesExistingText: /Android.*Chrome/.test(navigator.userAgent), forcesObjectResizing: /Trident.*rv:11/.test(navigator.userAgent), supportsInputEvents: function() { + var t3, e3, n2, i; + if (typeof InputEvent == "undefined") + return false; + for (i = ["data", "getTargetRanges", "inputType"], t3 = 0, e3 = i.length; e3 > t3; t3++) + if (n2 = i[t3], !(n2 in InputEvent.prototype)) + return false; + return true; + }()}, config: {}}; + }).call(this); + }).call(t2); + var e2 = t2.Trix; + (function() { + (function() { + e2.BasicObject = function() { + function t3() { + } + var e3, n2, i; + return t3.proxyMethod = function(t4) { + var i2, o2, r2, s2, a2; + return r2 = n2(t4), i2 = r2.name, s2 = r2.toMethod, a2 = r2.toProperty, o2 = r2.optional, this.prototype[i2] = function() { + var t5, n3; + return t5 = s2 != null ? o2 ? typeof this[s2] == "function" ? this[s2]() : void 0 : this[s2]() : a2 != null ? this[a2] : void 0, o2 ? (n3 = t5 != null ? t5[i2] : void 0, n3 != null ? e3.call(n3, t5, arguments) : void 0) : (n3 = t5[i2], e3.call(n3, t5, arguments)); + }; + }, n2 = function(t4) { + var e4, n3; + if (!(n3 = t4.match(i))) + throw new Error("can't parse @proxyMethod expression: " + t4); + return e4 = {name: n3[4]}, n3[2] != null ? e4.toMethod = n3[1] : e4.toProperty = n3[1], n3[3] != null && (e4.optional = true), e4; + }, e3 = Function.prototype.apply, i = /^(.+?)(\(\))?(\?)?\.(.+?)$/, t3; + }(); + }).call(this), function() { + var t3 = function(t4, e3) { + function i() { + this.constructor = t4; + } + for (var o2 in e3) + n2.call(e3, o2) && (t4[o2] = e3[o2]); + return i.prototype = e3.prototype, t4.prototype = new i(), t4.__super__ = e3.prototype, t4; + }, n2 = {}.hasOwnProperty; + e2.Object = function(n3) { + function i() { + this.id = ++o2; + } + var o2; + return t3(i, n3), o2 = 0, i.fromJSONString = function(t4) { + return this.fromJSON(JSON.parse(t4)); + }, i.prototype.hasSameConstructorAs = function(t4) { + return this.constructor === (t4 != null ? t4.constructor : void 0); + }, i.prototype.isEqualTo = function(t4) { + return this === t4; + }, i.prototype.inspect = function() { + var t4, e3, n4; + return t4 = function() { + var t5, i2, o3; + i2 = (t5 = this.contentsForInspection()) != null ? t5 : {}, o3 = []; + for (e3 in i2) + n4 = i2[e3], o3.push(e3 + "=" + n4); + return o3; + }.call(this), "#<" + this.constructor.name + ":" + this.id + (t4.length ? " " + t4.join(", ") : "") + ">"; + }, i.prototype.contentsForInspection = function() { + }, i.prototype.toJSONString = function() { + return JSON.stringify(this); + }, i.prototype.toUTF16String = function() { + return e2.UTF16String.box(this); + }, i.prototype.getCacheKey = function() { + return this.id.toString(); + }, i; + }(e2.BasicObject); + }.call(this), function() { + e2.extend = function(t3) { + var e3, n2; + for (e3 in t3) + n2 = t3[e3], this[e3] = n2; + return this; + }; + }.call(this), function() { + e2.extend({defer: function(t3) { + return setTimeout(t3, 1); + }}); + }.call(this), function() { + var t3, n2; + e2.extend({normalizeSpaces: function(t4) { + return t4.replace(RegExp("" + e2.ZERO_WIDTH_SPACE, "g"), "").replace(RegExp("" + e2.NON_BREAKING_SPACE, "g"), " "); + }, normalizeNewlines: function(t4) { + return t4.replace(/\r\n/g, "\n"); + }, breakableWhitespacePattern: RegExp("[^\\S" + e2.NON_BREAKING_SPACE + "]"), squishBreakableWhitespace: function(t4) { + return t4.replace(RegExp("" + e2.breakableWhitespacePattern.source, "g"), " ").replace(/\ {2,}/g, " "); + }, summarizeStringChange: function(t4, i) { + var o2, r2, s2, a2; + return t4 = e2.UTF16String.box(t4), i = e2.UTF16String.box(i), i.length < t4.length ? (r2 = n2(t4, i), a2 = r2[0], o2 = r2[1]) : (s2 = n2(i, t4), o2 = s2[0], a2 = s2[1]), {added: o2, removed: a2}; + }}), n2 = function(n3, i) { + var o2, r2, s2, a2, u; + return n3.isEqualTo(i) ? ["", ""] : (r2 = t3(n3, i), a2 = r2.utf16String.length, s2 = a2 ? (u = r2.offset, r2, o2 = n3.codepoints.slice(0, u).concat(n3.codepoints.slice(u + a2)), t3(i, e2.UTF16String.fromCodepoints(o2))) : t3(i, n3), [r2.utf16String.toString(), s2.utf16String.toString()]); + }, t3 = function(t4, e3) { + var n3, i, o2; + for (n3 = 0, i = t4.length, o2 = e3.length; i > n3 && t4.charAt(n3).isEqualTo(e3.charAt(n3)); ) + n3++; + for (; i > n3 + 1 && t4.charAt(i - 1).isEqualTo(e3.charAt(o2 - 1)); ) + i--, o2--; + return {utf16String: t4.slice(n3, i), offset: n3}; + }; + }.call(this), function() { + e2.extend({copyObject: function(t3) { + var e3, n2, i; + t3 == null && (t3 = {}), n2 = {}; + for (e3 in t3) + i = t3[e3], n2[e3] = i; + return n2; + }, objectsAreEqual: function(t3, e3) { + var n2, i; + if (t3 == null && (t3 = {}), e3 == null && (e3 = {}), Object.keys(t3).length !== Object.keys(e3).length) + return false; + for (n2 in t3) + if (i = t3[n2], i !== e3[n2]) + return false; + return true; + }}); + }.call(this), function() { + var t3 = [].slice; + e2.extend({arraysAreEqual: function(t4, e3) { + var n2, i, o2, r2; + if (t4 == null && (t4 = []), e3 == null && (e3 = []), t4.length !== e3.length) + return false; + for (i = n2 = 0, o2 = t4.length; o2 > n2; i = ++n2) + if (r2 = t4[i], r2 !== e3[i]) + return false; + return true; + }, arrayStartsWith: function(t4, n2) { + return t4 == null && (t4 = []), n2 == null && (n2 = []), e2.arraysAreEqual(t4.slice(0, n2.length), n2); + }, spliceArray: function() { + var e3, n2, i; + return n2 = arguments[0], e3 = 2 <= arguments.length ? t3.call(arguments, 1) : [], i = n2.slice(0), i.splice.apply(i, e3), i; + }, summarizeArrayChange: function(t4, e3) { + var n2, i, o2, r2, s2, a2, u, c2, l, h, p2; + for (t4 == null && (t4 = []), e3 == null && (e3 = []), n2 = [], h = [], o2 = new Set(), r2 = 0, u = t4.length; u > r2; r2++) + p2 = t4[r2], o2.add(p2); + for (i = new Set(), s2 = 0, c2 = e3.length; c2 > s2; s2++) + p2 = e3[s2], i.add(p2), o2.has(p2) || n2.push(p2); + for (a2 = 0, l = t4.length; l > a2; a2++) + p2 = t4[a2], i.has(p2) || h.push(p2); + return {added: n2, removed: h}; + }}); + }.call(this), function() { + var t3, n2, i, o2; + t3 = null, n2 = null, o2 = null, i = null, e2.extend({getAllAttributeNames: function() { + return t3 != null ? t3 : t3 = e2.getTextAttributeNames().concat(e2.getBlockAttributeNames()); + }, getBlockConfig: function(t4) { + return e2.config.blockAttributes[t4]; + }, getBlockAttributeNames: function() { + return n2 != null ? n2 : n2 = Object.keys(e2.config.blockAttributes); + }, getTextConfig: function(t4) { + return e2.config.textAttributes[t4]; + }, getTextAttributeNames: function() { + return o2 != null ? o2 : o2 = Object.keys(e2.config.textAttributes); + }, getListAttributeNames: function() { + var t4, n3; + return i != null ? i : i = function() { + var i2, o3; + i2 = e2.config.blockAttributes, o3 = []; + for (t4 in i2) + n3 = i2[t4].listAttribute, n3 != null && o3.push(n3); + return o3; + }(); + }}); + }.call(this), function() { + var t3, n2, i, o2, r2, s2 = [].indexOf || function(t4) { + for (var e3 = 0, n3 = this.length; n3 > e3; e3++) + if (e3 in this && this[e3] === t4) + return e3; + return -1; + }; + t3 = document.documentElement, n2 = (i = (o2 = (r2 = t3.matchesSelector) != null ? r2 : t3.webkitMatchesSelector) != null ? o2 : t3.msMatchesSelector) != null ? i : t3.mozMatchesSelector, e2.extend({handleEvent: function(n3, i2) { + var o3, r3, s3, a2, u, c2, l, h, p2, d, f, g; + return h = i2 != null ? i2 : {}, c2 = h.onElement, u = h.matchingSelector, g = h.withCallback, a2 = h.inPhase, l = h.preventDefault, d = h.times, r3 = c2 != null ? c2 : t3, p2 = u, o3 = g, f = a2 === "capturing", s3 = function(t4) { + var n4; + return d != null && --d === 0 && s3.destroy(), n4 = e2.findClosestElementFromNode(t4.target, {matchingSelector: p2}), n4 != null && (g != null && g.call(n4, t4, n4), l) ? t4.preventDefault() : void 0; + }, s3.destroy = function() { + return r3.removeEventListener(n3, s3, f); + }, r3.addEventListener(n3, s3, f), s3; + }, handleEventOnce: function(t4, n3) { + return n3 == null && (n3 = {}), n3.times = 1, e2.handleEvent(t4, n3); + }, triggerEvent: function(n3, i2) { + var o3, r3, s3, a2, u, c2, l; + return l = i2 != null ? i2 : {}, c2 = l.onElement, r3 = l.bubbles, s3 = l.cancelable, o3 = l.attributes, a2 = c2 != null ? c2 : t3, r3 = r3 !== false, s3 = s3 !== false, u = document.createEvent("Events"), u.initEvent(n3, r3, s3), o3 != null && e2.extend.call(u, o3), a2.dispatchEvent(u); + }, elementMatchesSelector: function(t4, e3) { + return (t4 != null ? t4.nodeType : void 0) === 1 ? n2.call(t4, e3) : void 0; + }, findClosestElementFromNode: function(t4, n3) { + var i2, o3, r3; + for (o3 = n3 != null ? n3 : {}, i2 = o3.matchingSelector, r3 = o3.untilNode; t4 != null && t4.nodeType !== Node.ELEMENT_NODE; ) + t4 = t4.parentNode; + if (t4 != null) { + if (i2 == null) + return t4; + if (t4.closest && r3 == null) + return t4.closest(i2); + for (; t4 && t4 !== r3; ) { + if (e2.elementMatchesSelector(t4, i2)) + return t4; + t4 = t4.parentNode; + } + } + }, findInnerElement: function(t4) { + for (; t4 != null ? t4.firstElementChild : void 0; ) + t4 = t4.firstElementChild; + return t4; + }, innerElementIsActive: function(t4) { + return document.activeElement !== t4 && e2.elementContainsNode(t4, document.activeElement); + }, elementContainsNode: function(t4, e3) { + if (t4 && e3) + for (; e3; ) { + if (e3 === t4) + return true; + e3 = e3.parentNode; + } + }, findNodeFromContainerAndOffset: function(t4, e3) { + var n3; + if (t4) + return t4.nodeType === Node.TEXT_NODE ? t4 : e3 === 0 ? (n3 = t4.firstChild) != null ? n3 : t4 : t4.childNodes.item(e3 - 1); + }, findElementFromContainerAndOffset: function(t4, n3) { + var i2; + return i2 = e2.findNodeFromContainerAndOffset(t4, n3), e2.findClosestElementFromNode(i2); + }, findChildIndexOfNode: function(t4) { + var e3; + if (t4 != null ? t4.parentNode : void 0) { + for (e3 = 0; t4 = t4.previousSibling; ) + e3++; + return e3; + } + }, removeNode: function(t4) { + var e3; + return t4 != null && (e3 = t4.parentNode) != null ? e3.removeChild(t4) : void 0; + }, walkTree: function(t4, e3) { + var n3, i2, o3, r3, s3; + return o3 = e3 != null ? e3 : {}, i2 = o3.onlyNodesOfType, r3 = o3.usingFilter, n3 = o3.expandEntityReferences, s3 = function() { + switch (i2) { + case "element": + return NodeFilter.SHOW_ELEMENT; + case "text": + return NodeFilter.SHOW_TEXT; + case "comment": + return NodeFilter.SHOW_COMMENT; + default: + return NodeFilter.SHOW_ALL; + } + }(), document.createTreeWalker(t4, s3, r3 != null ? r3 : null, n3 === true); + }, tagName: function(t4) { + var e3; + return t4 != null && (e3 = t4.tagName) != null ? e3.toLowerCase() : void 0; + }, makeElement: function(t4, e3) { + var n3, i2, o3, r3, s3, a2, u, c2, l, h, p2, d, f, g; + if (e3 == null && (e3 = {}), typeof t4 == "object" ? (e3 = t4, t4 = e3.tagName) : e3 = {attributes: e3}, o3 = document.createElement(t4), e3.editable != null && (e3.attributes == null && (e3.attributes = {}), e3.attributes.contenteditable = e3.editable), e3.attributes) { + l = e3.attributes; + for (a2 in l) + g = l[a2], o3.setAttribute(a2, g); + } + if (e3.style) { + h = e3.style; + for (a2 in h) + g = h[a2], o3.style[a2] = g; + } + if (e3.data) { + p2 = e3.data; + for (a2 in p2) + g = p2[a2], o3.dataset[a2] = g; + } + if (e3.className) + for (d = e3.className.split(" "), r3 = 0, u = d.length; u > r3; r3++) + i2 = d[r3], o3.classList.add(i2); + if (e3.textContent && (o3.textContent = e3.textContent), e3.childNodes) + for (f = [].concat(e3.childNodes), s3 = 0, c2 = f.length; c2 > s3; s3++) + n3 = f[s3], o3.appendChild(n3); + return o3; + }, getBlockTagNames: function() { + var t4, n3; + return e2.blockTagNames != null ? e2.blockTagNames : e2.blockTagNames = function() { + var i2, o3; + i2 = e2.config.blockAttributes, o3 = []; + for (t4 in i2) + n3 = i2[t4].tagName, n3 && o3.push(n3); + return o3; + }(); + }, nodeIsBlockContainer: function(t4) { + return e2.nodeIsBlockStartComment(t4 != null ? t4.firstChild : void 0); + }, nodeProbablyIsBlockContainer: function(t4) { + var n3, i2; + return n3 = e2.tagName(t4), s2.call(e2.getBlockTagNames(), n3) >= 0 && (i2 = e2.tagName(t4.firstChild), s2.call(e2.getBlockTagNames(), i2) < 0); + }, nodeIsBlockStart: function(t4, n3) { + var i2; + return i2 = (n3 != null ? n3 : {strict: true}).strict, i2 ? e2.nodeIsBlockStartComment(t4) : e2.nodeIsBlockStartComment(t4) || !e2.nodeIsBlockStartComment(t4.firstChild) && e2.nodeProbablyIsBlockContainer(t4); + }, nodeIsBlockStartComment: function(t4) { + return e2.nodeIsCommentNode(t4) && (t4 != null ? t4.data : void 0) === "block"; + }, nodeIsCommentNode: function(t4) { + return (t4 != null ? t4.nodeType : void 0) === Node.COMMENT_NODE; + }, nodeIsCursorTarget: function(t4, n3) { + var i2; + return i2 = (n3 != null ? n3 : {}).name, t4 ? e2.nodeIsTextNode(t4) ? t4.data === e2.ZERO_WIDTH_SPACE ? i2 ? t4.parentNode.dataset.trixCursorTarget === i2 : true : void 0 : e2.nodeIsCursorTarget(t4.firstChild) : void 0; + }, nodeIsAttachmentElement: function(t4) { + return e2.elementMatchesSelector(t4, e2.AttachmentView.attachmentSelector); + }, nodeIsEmptyTextNode: function(t4) { + return e2.nodeIsTextNode(t4) && (t4 != null ? t4.data : void 0) === ""; + }, nodeIsTextNode: function(t4) { + return (t4 != null ? t4.nodeType : void 0) === Node.TEXT_NODE; + }}); + }.call(this), function() { + var t3, n2, i, o2, r2; + t3 = e2.copyObject, o2 = e2.objectsAreEqual, e2.extend({normalizeRange: i = function(t4) { + var e3; + if (t4 != null) + return Array.isArray(t4) || (t4 = [t4, t4]), [n2(t4[0]), n2((e3 = t4[1]) != null ? e3 : t4[0])]; + }, rangeIsCollapsed: function(t4) { + var e3, n3, o3; + if (t4 != null) + return n3 = i(t4), o3 = n3[0], e3 = n3[1], r2(o3, e3); + }, rangesAreEqual: function(t4, e3) { + var n3, o3, s2, a2, u, c2; + if (t4 != null && e3 != null) + return s2 = i(t4), o3 = s2[0], n3 = s2[1], a2 = i(e3), c2 = a2[0], u = a2[1], r2(o3, c2) && r2(n3, u); + }}), n2 = function(e3) { + return typeof e3 == "number" ? e3 : t3(e3); + }, r2 = function(t4, e3) { + return typeof t4 == "number" ? t4 === e3 : o2(t4, e3); + }; + }.call(this), function() { + var t3, n2, i, o2, r2, s2, a2; + e2.registerElement = function(t4, e3) { + var n3, i2; + return e3 == null && (e3 = {}), t4 = t4.toLowerCase(), e3 = a2(e3), i2 = s2(e3), (n3 = i2.defaultCSS) && (delete i2.defaultCSS, o2(n3, t4)), r2(t4, i2); + }, o2 = function(t4, e3) { + var n3; + return n3 = i(e3), n3.textContent = t4.replace(/%t/g, e3); + }, i = function(e3) { + var n3, i2; + return n3 = document.createElement("style"), n3.setAttribute("type", "text/css"), n3.setAttribute("data-tag-name", e3.toLowerCase()), (i2 = t3()) && n3.setAttribute("nonce", i2), document.head.insertBefore(n3, document.head.firstChild), n3; + }, t3 = function() { + var t4; + return (t4 = n2("trix-csp-nonce") || n2("csp-nonce")) ? t4.getAttribute("content") : void 0; + }, n2 = function(t4) { + return document.head.querySelector("meta[name=" + t4 + "]"); + }, s2 = function(t4) { + var e3, n3, i2; + n3 = {}; + for (e3 in t4) + i2 = t4[e3], n3[e3] = typeof i2 == "function" ? {value: i2} : i2; + return n3; + }, a2 = function() { + var t4; + return t4 = function(t5) { + var e3, n3, i2, o3, r3; + for (e3 = {}, r3 = ["initialize", "connect", "disconnect"], n3 = 0, o3 = r3.length; o3 > n3; n3++) + i2 = r3[n3], e3[i2] = t5[i2], delete t5[i2]; + return e3; + }, window.customElements ? function(e3) { + var n3, i2, o3, r3, s3; + return s3 = t4(e3), o3 = s3.initialize, n3 = s3.connect, i2 = s3.disconnect, o3 && (r3 = n3, n3 = function() { + return this.initialized || (this.initialized = true, o3.call(this)), r3 != null ? r3.call(this) : void 0; + }), n3 && (e3.connectedCallback = n3), i2 && (e3.disconnectedCallback = i2), e3; + } : function(e3) { + var n3, i2, o3, r3; + return r3 = t4(e3), o3 = r3.initialize, n3 = r3.connect, i2 = r3.disconnect, o3 && (e3.createdCallback = o3), n3 && (e3.attachedCallback = n3), i2 && (e3.detachedCallback = i2), e3; + }; + }(), r2 = function() { + return window.customElements ? function(t4, e3) { + var n3; + return n3 = function() { + return typeof Reflect == "object" ? Reflect.construct(HTMLElement, [], n3) : HTMLElement.apply(this); + }, Object.setPrototypeOf(n3.prototype, HTMLElement.prototype), Object.setPrototypeOf(n3, HTMLElement), Object.defineProperties(n3.prototype, e3), window.customElements.define(t4, n3), n3; + } : function(t4, e3) { + var n3, i2; + return i2 = Object.create(HTMLElement.prototype, e3), n3 = document.registerElement(t4, {prototype: i2}), Object.defineProperty(i2, "constructor", {value: n3}), n3; + }; + }(); + }.call(this), function() { + var t3, n2; + e2.extend({getDOMSelection: function() { + var t4; + return t4 = window.getSelection(), t4.rangeCount > 0 ? t4 : void 0; + }, getDOMRange: function() { + var n3, i; + return (n3 = (i = e2.getDOMSelection()) != null ? i.getRangeAt(0) : void 0) && !t3(n3) ? n3 : void 0; + }, setDOMRange: function(t4) { + var n3; + return n3 = window.getSelection(), n3.removeAllRanges(), n3.addRange(t4), e2.selectionChangeObserver.update(); + }}), t3 = function(t4) { + return n2(t4.startContainer) || n2(t4.endContainer); + }, n2 = function(t4) { + return !Object.getPrototypeOf(t4); + }; + }.call(this), function() { + var t3; + t3 = {"application/x-trix-feature-detection": "test"}, e2.extend({dataTransferIsPlainText: function(t4) { + var e3, n2, i; + return i = t4.getData("text/plain"), n2 = t4.getData("text/html"), i && n2 ? (e3 = new DOMParser().parseFromString(n2, "text/html").body, e3.textContent === i ? !e3.querySelector("*") : void 0) : i != null ? i.length : void 0; + }, dataTransferIsWritable: function(e3) { + var n2, i; + if ((e3 != null ? e3.setData : void 0) != null) { + for (n2 in t3) + if (i = t3[n2], !function() { + try { + return e3.setData(n2, i), e3.getData(n2) === i; + } catch (t4) { + } + }()) + return; + return true; + } + }, keyEventIsKeyboardCommand: function() { + return /Mac|^iP/.test(navigator.platform) ? function(t4) { + return t4.metaKey; + } : function(t4) { + return t4.ctrlKey; + }; + }()}); + }.call(this), function() { + e2.extend({RTL_PATTERN: /[\u05BE\u05C0\u05C3\u05D0-\u05EA\u05F0-\u05F4\u061B\u061F\u0621-\u063A\u0640-\u064A\u066D\u0671-\u06B7\u06BA-\u06BE\u06C0-\u06CE\u06D0-\u06D5\u06E5\u06E6\u200F\u202B\u202E\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE72\uFE74\uFE76-\uFEFC]/, getDirection: function() { + var t3, n2, i, o2; + return n2 = e2.makeElement("input", {dir: "auto", name: "x", dirName: "x.dir"}), t3 = e2.makeElement("form"), t3.appendChild(n2), i = function() { + try { + return new FormData(t3).has(n2.dirName); + } catch (e3) { + } + }(), o2 = function() { + try { + return n2.matches(":dir(ltr),:dir(rtl)"); + } catch (t4) { + } + }(), i ? function(e3) { + return n2.value = e3, new FormData(t3).get(n2.dirName); + } : o2 ? function(t4) { + return n2.value = t4, n2.matches(":dir(rtl)") ? "rtl" : "ltr"; + } : function(t4) { + var n3; + return n3 = t4.trim().charAt(0), e2.RTL_PATTERN.test(n3) ? "rtl" : "ltr"; + }; + }()}); + }.call(this), function() { + }.call(this), function() { + var t3, n2 = function(t4, e3) { + function n3() { + this.constructor = t4; + } + for (var o2 in e3) + i.call(e3, o2) && (t4[o2] = e3[o2]); + return n3.prototype = e3.prototype, t4.prototype = new n3(), t4.__super__ = e3.prototype, t4; + }, i = {}.hasOwnProperty; + t3 = e2.arraysAreEqual, e2.Hash = function(i2) { + function o2(t4) { + t4 == null && (t4 = {}), this.values = s2(t4), o2.__super__.constructor.apply(this, arguments); + } + var r2, s2, a2, u, c2; + return n2(o2, i2), o2.fromCommonAttributesOfObjects = function(t4) { + var e3, n3, i3, o3, s3, a3; + if (t4 == null && (t4 = []), !t4.length) + return new this(); + for (e3 = r2(t4[0]), i3 = e3.getKeys(), a3 = t4.slice(1), n3 = 0, o3 = a3.length; o3 > n3; n3++) + s3 = a3[n3], i3 = e3.getKeysCommonToHash(r2(s3)), e3 = e3.slice(i3); + return e3; + }, o2.box = function(t4) { + return r2(t4); + }, o2.prototype.add = function(t4, e3) { + return this.merge(u(t4, e3)); + }, o2.prototype.remove = function(t4) { + return new e2.Hash(s2(this.values, t4)); + }, o2.prototype.get = function(t4) { + return this.values[t4]; + }, o2.prototype.has = function(t4) { + return t4 in this.values; + }, o2.prototype.merge = function(t4) { + return new e2.Hash(a2(this.values, c2(t4))); + }, o2.prototype.slice = function(t4) { + var n3, i3, o3, r3; + for (r3 = {}, n3 = 0, o3 = t4.length; o3 > n3; n3++) + i3 = t4[n3], this.has(i3) && (r3[i3] = this.values[i3]); + return new e2.Hash(r3); + }, o2.prototype.getKeys = function() { + return Object.keys(this.values); + }, o2.prototype.getKeysCommonToHash = function(t4) { + var e3, n3, i3, o3, s3; + for (t4 = r2(t4), o3 = this.getKeys(), s3 = [], e3 = 0, i3 = o3.length; i3 > e3; e3++) + n3 = o3[e3], this.values[n3] === t4.values[n3] && s3.push(n3); + return s3; + }, o2.prototype.isEqualTo = function(e3) { + return t3(this.toArray(), r2(e3).toArray()); + }, o2.prototype.isEmpty = function() { + return this.getKeys().length === 0; + }, o2.prototype.toArray = function() { + var t4, e3, n3; + return (this.array != null ? this.array : this.array = function() { + var i3; + e3 = [], i3 = this.values; + for (t4 in i3) + n3 = i3[t4], e3.push(t4, n3); + return e3; + }.call(this)).slice(0); + }, o2.prototype.toObject = function() { + return s2(this.values); + }, o2.prototype.toJSON = function() { + return this.toObject(); + }, o2.prototype.contentsForInspection = function() { + return {values: JSON.stringify(this.values)}; + }, u = function(t4, e3) { + var n3; + return n3 = {}, n3[t4] = e3, n3; + }, a2 = function(t4, e3) { + var n3, i3, o3; + i3 = s2(t4); + for (n3 in e3) + o3 = e3[n3], i3[n3] = o3; + return i3; + }, s2 = function(t4, e3) { + var n3, i3, o3, r3, s3; + for (r3 = {}, s3 = Object.keys(t4).sort(), n3 = 0, o3 = s3.length; o3 > n3; n3++) + i3 = s3[n3], i3 !== e3 && (r3[i3] = t4[i3]); + return r3; + }, r2 = function(t4) { + return t4 instanceof e2.Hash ? t4 : new e2.Hash(t4); + }, c2 = function(t4) { + return t4 instanceof e2.Hash ? t4.values : t4; + }, o2; + }(e2.Object); + }.call(this), function() { + e2.ObjectGroup = function() { + function t3(t4, e3) { + var n2, i; + this.objects = t4 != null ? t4 : [], i = e3.depth, n2 = e3.asTree, n2 && (this.depth = i, this.objects = this.constructor.groupObjects(this.objects, {asTree: n2, depth: this.depth + 1})); + } + return t3.groupObjects = function(t4, e3) { + var n2, i, o2, r2, s2, a2, u, c2, l; + for (t4 == null && (t4 = []), l = e3 != null ? e3 : {}, o2 = l.depth, n2 = l.asTree, n2 && o2 == null && (o2 = 0), c2 = [], s2 = 0, a2 = t4.length; a2 > s2; s2++) { + if (u = t4[s2], r2) { + if ((typeof u.canBeGrouped == "function" ? u.canBeGrouped(o2) : void 0) && (typeof (i = r2[r2.length - 1]).canBeGroupedWith == "function" ? i.canBeGroupedWith(u, o2) : void 0)) { + r2.push(u); + continue; + } + c2.push(new this(r2, {depth: o2, asTree: n2})), r2 = null; + } + (typeof u.canBeGrouped == "function" ? u.canBeGrouped(o2) : void 0) ? r2 = [u] : c2.push(u); + } + return r2 && c2.push(new this(r2, {depth: o2, asTree: n2})), c2; + }, t3.prototype.getObjects = function() { + return this.objects; + }, t3.prototype.getDepth = function() { + return this.depth; + }, t3.prototype.getCacheKey = function() { + var t4, e3, n2, i, o2; + for (e3 = ["objectGroup"], o2 = this.getObjects(), t4 = 0, n2 = o2.length; n2 > t4; t4++) + i = o2[t4], e3.push(i.getCacheKey()); + return e3.join("/"); + }, t3; + }(); + }.call(this), function() { + var t3 = function(t4, e3) { + function i() { + this.constructor = t4; + } + for (var o2 in e3) + n2.call(e3, o2) && (t4[o2] = e3[o2]); + return i.prototype = e3.prototype, t4.prototype = new i(), t4.__super__ = e3.prototype, t4; + }, n2 = {}.hasOwnProperty; + e2.ObjectMap = function(e3) { + function n3(t4) { + var e4, n4, i, o2, r2; + for (t4 == null && (t4 = []), this.objects = {}, i = 0, o2 = t4.length; o2 > i; i++) + r2 = t4[i], n4 = JSON.stringify(r2), (e4 = this.objects)[n4] == null && (e4[n4] = r2); + } + return t3(n3, e3), n3.prototype.find = function(t4) { + var e4; + return e4 = JSON.stringify(t4), this.objects[e4]; + }, n3; + }(e2.BasicObject); + }.call(this), function() { + e2.ElementStore = function() { + function t3(t4) { + this.reset(t4); + } + var e3; + return t3.prototype.add = function(t4) { + var n2; + return n2 = e3(t4), this.elements[n2] = t4; + }, t3.prototype.remove = function(t4) { + var n2, i; + return n2 = e3(t4), (i = this.elements[n2]) ? (delete this.elements[n2], i) : void 0; + }, t3.prototype.reset = function(t4) { + var e4, n2, i; + for (t4 == null && (t4 = []), this.elements = {}, n2 = 0, i = t4.length; i > n2; n2++) + e4 = t4[n2], this.add(e4); + return t4; + }, e3 = function(t4) { + return t4.dataset.trixStoreKey; + }, t3; + }(); + }.call(this), function() { + }.call(this), function() { + var t3 = function(t4, e3) { + function i() { + this.constructor = t4; + } + for (var o2 in e3) + n2.call(e3, o2) && (t4[o2] = e3[o2]); + return i.prototype = e3.prototype, t4.prototype = new i(), t4.__super__ = e3.prototype, t4; + }, n2 = {}.hasOwnProperty; + e2.Operation = function(e3) { + function n3() { + return n3.__super__.constructor.apply(this, arguments); + } + return t3(n3, e3), n3.prototype.isPerforming = function() { + return this.performing === true; + }, n3.prototype.hasPerformed = function() { + return this.performed === true; + }, n3.prototype.hasSucceeded = function() { + return this.performed && this.succeeded; + }, n3.prototype.hasFailed = function() { + return this.performed && !this.succeeded; + }, n3.prototype.getPromise = function() { + return this.promise != null ? this.promise : this.promise = new Promise(function(t4) { + return function(e4, n4) { + return t4.performing = true, t4.perform(function(i, o2) { + return t4.succeeded = i, t4.performing = false, t4.performed = true, t4.succeeded ? e4(o2) : n4(o2); + }); + }; + }(this)); + }, n3.prototype.perform = function(t4) { + return t4(false); + }, n3.prototype.release = function() { + var t4; + return (t4 = this.promise) != null && typeof t4.cancel == "function" && t4.cancel(), this.promise = null, this.performing = null, this.performed = null, this.succeeded = null; + }, n3.proxyMethod("getPromise().then"), n3.proxyMethod("getPromise().catch"), n3; + }(e2.BasicObject); + }.call(this), function() { + var t3, n2, i, o2, r2, s2 = function(t4, e3) { + function n3() { + this.constructor = t4; + } + for (var i2 in e3) + a2.call(e3, i2) && (t4[i2] = e3[i2]); + return n3.prototype = e3.prototype, t4.prototype = new n3(), t4.__super__ = e3.prototype, t4; + }, a2 = {}.hasOwnProperty; + e2.UTF16String = function(t4) { + function e3(t5, e4) { + this.ucs2String = t5, this.codepoints = e4, this.length = this.codepoints.length, this.ucs2Length = this.ucs2String.length; + } + return s2(e3, t4), e3.box = function(t5) { + return t5 == null && (t5 = ""), t5 instanceof this ? t5 : this.fromUCS2String(t5 != null ? t5.toString() : void 0); + }, e3.fromUCS2String = function(t5) { + return new this(t5, o2(t5)); + }, e3.fromCodepoints = function(t5) { + return new this(r2(t5), t5); + }, e3.prototype.offsetToUCS2Offset = function(t5) { + return r2(this.codepoints.slice(0, Math.max(0, t5))).length; + }, e3.prototype.offsetFromUCS2Offset = function(t5) { + return o2(this.ucs2String.slice(0, Math.max(0, t5))).length; + }, e3.prototype.slice = function() { + var t5; + return this.constructor.fromCodepoints((t5 = this.codepoints).slice.apply(t5, arguments)); + }, e3.prototype.charAt = function(t5) { + return this.slice(t5, t5 + 1); + }, e3.prototype.isEqualTo = function(t5) { + return this.constructor.box(t5).ucs2String === this.ucs2String; + }, e3.prototype.toJSON = function() { + return this.ucs2String; + }, e3.prototype.getCacheKey = function() { + return this.ucs2String; + }, e3.prototype.toString = function() { + return this.ucs2String; + }, e3; + }(e2.BasicObject), t3 = (typeof Array.from == "function" ? Array.from("\u{1F47C}").length : void 0) === 1, n2 = (typeof " ".codePointAt == "function" ? " ".codePointAt(0) : void 0) != null, i = (typeof String.fromCodePoint == "function" ? String.fromCodePoint(32, 128124) : void 0) === " \u{1F47C}", o2 = t3 && n2 ? function(t4) { + return Array.from(t4).map(function(t5) { + return t5.codePointAt(0); + }); + } : function(t4) { + var e3, n3, i2, o3, r3; + for (o3 = [], e3 = 0, i2 = t4.length; i2 > e3; ) + r3 = t4.charCodeAt(e3++), r3 >= 55296 && 56319 >= r3 && i2 > e3 && (n3 = t4.charCodeAt(e3++), (64512 & n3) === 56320 ? r3 = ((1023 & r3) << 10) + (1023 & n3) + 65536 : e3--), o3.push(r3); + return o3; + }, r2 = i ? function(t4) { + return String.fromCodePoint.apply(String, t4); + } : function(t4) { + var e3, n3, i2; + return e3 = function() { + var e4, o3, r3; + for (r3 = [], e4 = 0, o3 = t4.length; o3 > e4; e4++) + i2 = t4[e4], n3 = "", i2 > 65535 && (i2 -= 65536, n3 += String.fromCharCode(i2 >>> 10 & 1023 | 55296), i2 = 56320 | 1023 & i2), r3.push(n3 + String.fromCharCode(i2)); + return r3; + }(), e3.join(""); + }; + }.call(this), function() { + }.call(this), function() { + }.call(this), function() { + e2.config.lang = {attachFiles: "Attach Files", bold: "Bold", bullets: "Bullets", byte: "Byte", bytes: "Bytes", captionPlaceholder: "Add a caption\u2026", code: "Code", heading1: "Heading", indent: "Increase Level", italic: "Italic", link: "Link", numbers: "Numbers", outdent: "Decrease Level", quote: "Quote", redo: "Redo", remove: "Remove", strike: "Strikethrough", undo: "Undo", unlink: "Unlink", url: "URL", urlPlaceholder: "Enter a URL\u2026", GB: "GB", KB: "KB", MB: "MB", PB: "PB", TB: "TB"}; + }.call(this), function() { + e2.config.css = {attachment: "attachment", attachmentCaption: "attachment__caption", attachmentCaptionEditor: "attachment__caption-editor", attachmentMetadata: "attachment__metadata", attachmentMetadataContainer: "attachment__metadata-container", attachmentName: "attachment__name", attachmentProgress: "attachment__progress", attachmentSize: "attachment__size", attachmentToolbar: "attachment__toolbar", attachmentGallery: "attachment-gallery"}; + }.call(this), function() { + var t3; + e2.config.blockAttributes = t3 = {default: {tagName: "div", parse: false}, quote: {tagName: "blockquote", nestable: true}, heading1: {tagName: "h1", terminal: true, breakOnReturn: true, group: false}, code: {tagName: "pre", terminal: true, text: {plaintext: true}}, bulletList: {tagName: "ul", parse: false}, bullet: {tagName: "li", listAttribute: "bulletList", group: false, nestable: true, test: function(n2) { + return e2.tagName(n2.parentNode) === t3[this.listAttribute].tagName; + }}, numberList: {tagName: "ol", parse: false}, number: {tagName: "li", listAttribute: "numberList", group: false, nestable: true, test: function(n2) { + return e2.tagName(n2.parentNode) === t3[this.listAttribute].tagName; + }}, attachmentGallery: {tagName: "div", exclusive: true, terminal: true, parse: false, group: false}}; + }.call(this), function() { + var t3, n2; + t3 = e2.config.lang, n2 = [t3.bytes, t3.KB, t3.MB, t3.GB, t3.TB, t3.PB], e2.config.fileSize = {prefix: "IEC", precision: 2, formatter: function(e3) { + var i, o2, r2, s2, a2; + switch (e3) { + case 0: + return "0 " + t3.bytes; + case 1: + return "1 " + t3.byte; + default: + return i = function() { + switch (this.prefix) { + case "SI": + return 1e3; + case "IEC": + return 1024; + } + }.call(this), o2 = Math.floor(Math.log(e3) / Math.log(i)), r2 = e3 / Math.pow(i, o2), s2 = r2.toFixed(this.precision), a2 = s2.replace(/0*$/, "").replace(/\.$/, ""), a2 + " " + n2[o2]; + } + }}; + }.call(this), function() { + e2.config.textAttributes = {bold: {tagName: "strong", inheritable: true, parser: function(t3) { + var e3; + return e3 = window.getComputedStyle(t3), e3.fontWeight === "bold" || e3.fontWeight >= 600; + }}, italic: {tagName: "em", inheritable: true, parser: function(t3) { + var e3; + return e3 = window.getComputedStyle(t3), e3.fontStyle === "italic"; + }}, href: {groupTagName: "a", parser: function(t3) { + var n2, i, o2; + return n2 = e2.AttachmentView.attachmentSelector, o2 = "a:not(" + n2 + ")", (i = e2.findClosestElementFromNode(t3, {matchingSelector: o2})) ? i.getAttribute("href") : void 0; + }}, strike: {tagName: "del", inheritable: true}, frozen: {style: {backgroundColor: "highlight"}}}; + }.call(this), function() { + var t3, n2, i, o2, r2; + r2 = "[data-trix-serialize=false]", o2 = ["contenteditable", "data-trix-id", "data-trix-store-key", "data-trix-mutable", "data-trix-placeholder", "tabindex"], n2 = "data-trix-serialized-attributes", i = "[" + n2 + "]", t3 = new RegExp("", "g"), e2.extend({serializers: {"application/json": function(t4) { + var n3; + if (t4 instanceof e2.Document) + n3 = t4; + else { + if (!(t4 instanceof HTMLElement)) + throw new Error("unserializable object"); + n3 = e2.Document.fromHTML(t4.innerHTML); + } + return n3.toSerializableDocument().toJSONString(); + }, "text/html": function(s2) { + var a2, u, c2, l, h, p2, d, f, g, m, v, y, b, A, C3, x, w; + if (s2 instanceof e2.Document) + l = e2.DocumentView.render(s2); + else { + if (!(s2 instanceof HTMLElement)) + throw new Error("unserializable object"); + l = s2.cloneNode(true); + } + for (A = l.querySelectorAll(r2), h = 0, g = A.length; g > h; h++) + c2 = A[h], e2.removeNode(c2); + for (p2 = 0, m = o2.length; m > p2; p2++) + for (a2 = o2[p2], C3 = l.querySelectorAll("[" + a2 + "]"), d = 0, v = C3.length; v > d; d++) + c2 = C3[d], c2.removeAttribute(a2); + for (x = l.querySelectorAll(i), f = 0, y = x.length; y > f; f++) { + c2 = x[f]; + try { + u = JSON.parse(c2.getAttribute(n2)), c2.removeAttribute(n2); + for (b in u) + w = u[b], c2.setAttribute(b, w); + } catch (E) { + } + } + return l.innerHTML.replace(t3, ""); + }}, deserializers: {"application/json": function(t4) { + return e2.Document.fromJSONString(t4); + }, "text/html": function(t4) { + return e2.Document.fromHTML(t4); + }}, serializeToContentType: function(t4, n3) { + var i2; + if (i2 = e2.serializers[n3]) + return i2(t4); + throw new Error("unknown content type: " + n3); + }, deserializeFromContentType: function(t4, n3) { + var i2; + if (i2 = e2.deserializers[n3]) + return i2(t4); + throw new Error("unknown content type: " + n3); + }}); + }.call(this), function() { + var t3; + t3 = e2.config.lang, e2.config.toolbar = {getDefaultHTML: function() { + return '
    \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n\n \n \n \n\n \n\n \n \n \n \n
    \n\n
    \n \n
    '; + }}; + }.call(this), function() { + e2.config.undoInterval = 5e3; + }.call(this), function() { + e2.config.attachments = {preview: {presentation: "gallery", caption: {name: true, size: true}}, file: {caption: {size: true}}}; + }.call(this), function() { + e2.config.keyNames = {8: "backspace", 9: "tab", 13: "return", 27: "escape", 37: "left", 39: "right", 46: "delete", 68: "d", 72: "h", 79: "o"}; + }.call(this), function() { + e2.config.input = {level2Enabled: true, getLevel: function() { + return this.level2Enabled && e2.browser.supportsInputEvents ? 2 : 0; + }, pickFiles: function(t3) { + var n2; + return n2 = e2.makeElement("input", {type: "file", multiple: true, hidden: true, id: this.fileInputId}), n2.addEventListener("change", function() { + return t3(n2.files), e2.removeNode(n2); + }), e2.removeNode(document.getElementById(this.fileInputId)), document.body.appendChild(n2), n2.click(); + }, fileInputId: "trix-file-input-" + Date.now().toString(16)}; + }.call(this), function() { + }.call(this), function() { + e2.registerElement("trix-toolbar", {defaultCSS: "%t {\n display: block;\n}\n\n%t {\n white-space: nowrap;\n}\n\n%t [data-trix-dialog] {\n display: none;\n}\n\n%t [data-trix-dialog][data-trix-active] {\n display: block;\n}\n\n%t [data-trix-dialog] [data-trix-validate]:invalid {\n background-color: #ffdddd;\n}", initialize: function() { + return this.innerHTML === "" ? this.innerHTML = e2.config.toolbar.getDefaultHTML() : void 0; + }}); + }.call(this), function() { + var t3 = function(t4, e3) { + function i2() { + this.constructor = t4; + } + for (var o2 in e3) + n2.call(e3, o2) && (t4[o2] = e3[o2]); + return i2.prototype = e3.prototype, t4.prototype = new i2(), t4.__super__ = e3.prototype, t4; + }, n2 = {}.hasOwnProperty, i = [].indexOf || function(t4) { + for (var e3 = 0, n3 = this.length; n3 > e3; e3++) + if (e3 in this && this[e3] === t4) + return e3; + return -1; + }; + e2.ObjectView = function(n3) { + function o2(t4, e3) { + this.object = t4, this.options = e3 != null ? e3 : {}, this.childViews = [], this.rootView = this; + } + return t3(o2, n3), o2.prototype.getNodes = function() { + var t4, e3, n4, i2, o3; + for (this.nodes == null && (this.nodes = this.createNodes()), i2 = this.nodes, o3 = [], t4 = 0, e3 = i2.length; e3 > t4; t4++) + n4 = i2[t4], o3.push(n4.cloneNode(true)); + return o3; + }, o2.prototype.invalidate = function() { + var t4; + return this.nodes = null, this.childViews = [], (t4 = this.parentView) != null ? t4.invalidate() : void 0; + }, o2.prototype.invalidateViewForObject = function(t4) { + var e3; + return (e3 = this.findViewForObject(t4)) != null ? e3.invalidate() : void 0; + }, o2.prototype.findOrCreateCachedChildView = function(t4, e3) { + var n4; + return (n4 = this.getCachedViewForObject(e3)) ? this.recordChildView(n4) : (n4 = this.createChildView.apply(this, arguments), this.cacheViewForObject(n4, e3)), n4; + }, o2.prototype.createChildView = function(t4, n4, i2) { + var o3; + return i2 == null && (i2 = {}), n4 instanceof e2.ObjectGroup && (i2.viewClass = t4, t4 = e2.ObjectGroupView), o3 = new t4(n4, i2), this.recordChildView(o3); + }, o2.prototype.recordChildView = function(t4) { + return t4.parentView = this, t4.rootView = this.rootView, this.childViews.push(t4), t4; + }, o2.prototype.getAllChildViews = function() { + var t4, e3, n4, i2, o3; + for (o3 = [], i2 = this.childViews, e3 = 0, n4 = i2.length; n4 > e3; e3++) + t4 = i2[e3], o3.push(t4), o3 = o3.concat(t4.getAllChildViews()); + return o3; + }, o2.prototype.findElement = function() { + return this.findElementForObject(this.object); + }, o2.prototype.findElementForObject = function(t4) { + var e3; + return (e3 = t4 != null ? t4.id : void 0) ? this.rootView.element.querySelector("[data-trix-id='" + e3 + "']") : void 0; + }, o2.prototype.findViewForObject = function(t4) { + var e3, n4, i2, o3; + for (i2 = this.getAllChildViews(), e3 = 0, n4 = i2.length; n4 > e3; e3++) + if (o3 = i2[e3], o3.object === t4) + return o3; + }, o2.prototype.getViewCache = function() { + return this.rootView !== this ? this.rootView.getViewCache() : this.isViewCachingEnabled() ? this.viewCache != null ? this.viewCache : this.viewCache = {} : void 0; + }, o2.prototype.isViewCachingEnabled = function() { + return this.shouldCacheViews !== false; + }, o2.prototype.enableViewCaching = function() { + return this.shouldCacheViews = true; + }, o2.prototype.disableViewCaching = function() { + return this.shouldCacheViews = false; + }, o2.prototype.getCachedViewForObject = function(t4) { + var e3; + return (e3 = this.getViewCache()) != null ? e3[t4.getCacheKey()] : void 0; + }, o2.prototype.cacheViewForObject = function(t4, e3) { + var n4; + return (n4 = this.getViewCache()) != null ? n4[e3.getCacheKey()] = t4 : void 0; + }, o2.prototype.garbageCollectCachedViews = function() { + var t4, e3, n4, o3, r2, s2; + if (t4 = this.getViewCache()) { + s2 = this.getAllChildViews().concat(this), n4 = function() { + var t5, e4, n5; + for (n5 = [], t5 = 0, e4 = s2.length; e4 > t5; t5++) + r2 = s2[t5], n5.push(r2.object.getCacheKey()); + return n5; + }(), o3 = []; + for (e3 in t4) + i.call(n4, e3) < 0 && o3.push(delete t4[e3]); + return o3; + } + }, o2; + }(e2.BasicObject); + }.call(this), function() { + var t3 = function(t4, e3) { + function i() { + this.constructor = t4; + } + for (var o2 in e3) + n2.call(e3, o2) && (t4[o2] = e3[o2]); + return i.prototype = e3.prototype, t4.prototype = new i(), t4.__super__ = e3.prototype, t4; + }, n2 = {}.hasOwnProperty; + e2.ObjectGroupView = function(e3) { + function n3() { + n3.__super__.constructor.apply(this, arguments), this.objectGroup = this.object, this.viewClass = this.options.viewClass, delete this.options.viewClass; + } + return t3(n3, e3), n3.prototype.getChildViews = function() { + var t4, e4, n4, i; + if (!this.childViews.length) + for (i = this.objectGroup.getObjects(), t4 = 0, e4 = i.length; e4 > t4; t4++) + n4 = i[t4], this.findOrCreateCachedChildView(this.viewClass, n4, this.options); + return this.childViews; + }, n3.prototype.createNodes = function() { + var t4, e4, n4, i, o2, r2, s2, a2, u; + for (t4 = this.createContainerElement(), s2 = this.getChildViews(), e4 = 0, i = s2.length; i > e4; e4++) + for (u = s2[e4], a2 = u.getNodes(), n4 = 0, o2 = a2.length; o2 > n4; n4++) + r2 = a2[n4], t4.appendChild(r2); + return [t4]; + }, n3.prototype.createContainerElement = function(t4) { + return t4 == null && (t4 = this.objectGroup.getDepth()), this.getChildViews()[0].createContainerElement(t4); + }, n3; + }(e2.ObjectView); + }.call(this), function() { + var t3 = function(t4, e3) { + function i() { + this.constructor = t4; + } + for (var o2 in e3) + n2.call(e3, o2) && (t4[o2] = e3[o2]); + return i.prototype = e3.prototype, t4.prototype = new i(), t4.__super__ = e3.prototype, t4; + }, n2 = {}.hasOwnProperty; + e2.Controller = function(e3) { + function n3() { + return n3.__super__.constructor.apply(this, arguments); + } + return t3(n3, e3), n3; + }(e2.BasicObject); + }.call(this), function() { + var t3, n2, i, o2, r2, s2, a2 = function(t4, e3) { + return function() { + return t4.apply(e3, arguments); + }; + }, u = function(t4, e3) { + function n3() { + this.constructor = t4; + } + for (var i2 in e3) + c2.call(e3, i2) && (t4[i2] = e3[i2]); + return n3.prototype = e3.prototype, t4.prototype = new n3(), t4.__super__ = e3.prototype, t4; + }, c2 = {}.hasOwnProperty, l = [].indexOf || function(t4) { + for (var e3 = 0, n3 = this.length; n3 > e3; e3++) + if (e3 in this && this[e3] === t4) + return e3; + return -1; + }; + t3 = e2.findClosestElementFromNode, i = e2.nodeIsEmptyTextNode, n2 = e2.nodeIsBlockStartComment, o2 = e2.normalizeSpaces, r2 = e2.summarizeStringChange, s2 = e2.tagName, e2.MutationObserver = function(e3) { + function c3(t4) { + this.element = t4, this.didMutate = a2(this.didMutate, this), this.observer = new window.MutationObserver(this.didMutate), this.start(); + } + var h, p2, d, f; + return u(c3, e3), p2 = "data-trix-mutable", d = "[" + p2 + "]", f = {attributes: true, childList: true, characterData: true, characterDataOldValue: true, subtree: true}, c3.prototype.start = function() { + return this.reset(), this.observer.observe(this.element, f); + }, c3.prototype.stop = function() { + return this.observer.disconnect(); + }, c3.prototype.didMutate = function(t4) { + var e4, n3; + return (e4 = this.mutations).push.apply(e4, this.findSignificantMutations(t4)), this.mutations.length ? ((n3 = this.delegate) != null && typeof n3.elementDidMutate == "function" && n3.elementDidMutate(this.getMutationSummary()), this.reset()) : void 0; + }, c3.prototype.reset = function() { + return this.mutations = []; + }, c3.prototype.findSignificantMutations = function(t4) { + var e4, n3, i2, o3; + for (o3 = [], e4 = 0, n3 = t4.length; n3 > e4; e4++) + i2 = t4[e4], this.mutationIsSignificant(i2) && o3.push(i2); + return o3; + }, c3.prototype.mutationIsSignificant = function(t4) { + var e4, n3, i2, o3; + if (this.nodeIsMutable(t4.target)) + return false; + for (o3 = this.nodesModifiedByMutation(t4), e4 = 0, n3 = o3.length; n3 > e4; e4++) + if (i2 = o3[e4], this.nodeIsSignificant(i2)) + return true; + return false; + }, c3.prototype.nodeIsSignificant = function(t4) { + return t4 !== this.element && !this.nodeIsMutable(t4) && !i(t4); + }, c3.prototype.nodeIsMutable = function(e4) { + return t3(e4, {matchingSelector: d}); + }, c3.prototype.nodesModifiedByMutation = function(t4) { + var e4; + switch (e4 = [], t4.type) { + case "attributes": + t4.attributeName !== p2 && e4.push(t4.target); + break; + case "characterData": + e4.push(t4.target.parentNode), e4.push(t4.target); + break; + case "childList": + e4.push.apply(e4, t4.addedNodes), e4.push.apply(e4, t4.removedNodes); + } + return e4; + }, c3.prototype.getMutationSummary = function() { + return this.getTextMutationSummary(); + }, c3.prototype.getTextMutationSummary = function() { + var t4, e4, n3, i2, o3, r3, s3, a3, u2, c4, h2; + for (a3 = this.getTextChangesFromCharacterData(), n3 = a3.additions, o3 = a3.deletions, h2 = this.getTextChangesFromChildList(), u2 = h2.additions, r3 = 0, s3 = u2.length; s3 > r3; r3++) + e4 = u2[r3], l.call(n3, e4) < 0 && n3.push(e4); + return o3.push.apply(o3, h2.deletions), c4 = {}, (t4 = n3.join("")) && (c4.textAdded = t4), (i2 = o3.join("")) && (c4.textDeleted = i2), c4; + }, c3.prototype.getMutationsByType = function(t4) { + var e4, n3, i2, o3, r3; + for (o3 = this.mutations, r3 = [], e4 = 0, n3 = o3.length; n3 > e4; e4++) + i2 = o3[e4], i2.type === t4 && r3.push(i2); + return r3; + }, c3.prototype.getTextChangesFromChildList = function() { + var t4, e4, i2, r3, s3, a3, u2, c4, l2, p3, d2; + for (t4 = [], u2 = [], a3 = this.getMutationsByType("childList"), e4 = 0, r3 = a3.length; r3 > e4; e4++) + s3 = a3[e4], t4.push.apply(t4, s3.addedNodes), u2.push.apply(u2, s3.removedNodes); + return c4 = t4.length === 0 && u2.length === 1 && n2(u2[0]), c4 ? (p3 = [], d2 = ["\n"]) : (p3 = h(t4), d2 = h(u2)), {additions: function() { + var t5, e5, n3; + for (n3 = [], i2 = t5 = 0, e5 = p3.length; e5 > t5; i2 = ++t5) + l2 = p3[i2], l2 !== d2[i2] && n3.push(o2(l2)); + return n3; + }(), deletions: function() { + var t5, e5, n3; + for (n3 = [], i2 = t5 = 0, e5 = d2.length; e5 > t5; i2 = ++t5) + l2 = d2[i2], l2 !== p3[i2] && n3.push(o2(l2)); + return n3; + }()}; + }, c3.prototype.getTextChangesFromCharacterData = function() { + var t4, e4, n3, i2, s3, a3, u2, c4; + return e4 = this.getMutationsByType("characterData"), e4.length && (c4 = e4[0], n3 = e4[e4.length - 1], s3 = o2(c4.oldValue), i2 = o2(n3.target.data), a3 = r2(s3, i2), t4 = a3.added, u2 = a3.removed), {additions: t4 ? [t4] : [], deletions: u2 ? [u2] : []}; + }, h = function(t4) { + var e4, n3, i2, o3; + for (t4 == null && (t4 = []), o3 = [], e4 = 0, n3 = t4.length; n3 > e4; e4++) + switch (i2 = t4[e4], i2.nodeType) { + case Node.TEXT_NODE: + o3.push(i2.data); + break; + case Node.ELEMENT_NODE: + s2(i2) === "br" ? o3.push("\n") : o3.push.apply(o3, h(i2.childNodes)); + } + return o3; + }, c3; + }(e2.BasicObject); + }.call(this), function() { + var t3 = function(t4, e3) { + function i() { + this.constructor = t4; + } + for (var o2 in e3) + n2.call(e3, o2) && (t4[o2] = e3[o2]); + return i.prototype = e3.prototype, t4.prototype = new i(), t4.__super__ = e3.prototype, t4; + }, n2 = {}.hasOwnProperty; + e2.FileVerificationOperation = function(e3) { + function n3(t4) { + this.file = t4; + } + return t3(n3, e3), n3.prototype.perform = function(t4) { + var e4; + return e4 = new FileReader(), e4.onerror = function() { + return t4(false); + }, e4.onload = function(n4) { + return function() { + e4.onerror = null; + try { + e4.abort(); + } catch (i) { + } + return t4(true, n4.file); + }; + }(this), e4.readAsArrayBuffer(this.file); + }, n3; + }(e2.Operation); + }.call(this), function() { + var t3, n2, i = function(t4, e3) { + function n3() { + this.constructor = t4; + } + for (var i2 in e3) + o2.call(e3, i2) && (t4[i2] = e3[i2]); + return n3.prototype = e3.prototype, t4.prototype = new n3(), t4.__super__ = e3.prototype, t4; + }, o2 = {}.hasOwnProperty; + t3 = e2.handleEvent, n2 = e2.innerElementIsActive, e2.InputController = function(o3) { + function r2(n3) { + var i2; + this.element = n3, this.mutationObserver = new e2.MutationObserver(this.element), this.mutationObserver.delegate = this; + for (i2 in this.events) + t3(i2, {onElement: this.element, withCallback: this.handlerFor(i2)}); + } + return i(r2, o3), r2.prototype.events = {}, r2.prototype.elementDidMutate = function() { + }, r2.prototype.editorWillSyncDocumentView = function() { + return this.mutationObserver.stop(); + }, r2.prototype.editorDidSyncDocumentView = function() { + return this.mutationObserver.start(); + }, r2.prototype.requestRender = function() { + var t4; + return (t4 = this.delegate) != null && typeof t4.inputControllerDidRequestRender == "function" ? t4.inputControllerDidRequestRender() : void 0; + }, r2.prototype.requestReparse = function() { + var t4; + return (t4 = this.delegate) != null && typeof t4.inputControllerDidRequestReparse == "function" && t4.inputControllerDidRequestReparse(), this.requestRender(); + }, r2.prototype.attachFiles = function(t4) { + var n3, i2; + return i2 = function() { + var i3, o4, r3; + for (r3 = [], i3 = 0, o4 = t4.length; o4 > i3; i3++) + n3 = t4[i3], r3.push(new e2.FileVerificationOperation(n3)); + return r3; + }(), Promise.all(i2).then(function(t5) { + return function(e3) { + return t5.handleInput(function() { + var t6, n4; + return (t6 = this.delegate) != null && t6.inputControllerWillAttachFiles(), (n4 = this.responder) != null && n4.insertFiles(e3), this.requestRender(); + }); + }; + }(this)); + }, r2.prototype.handlerFor = function(t4) { + return function(e3) { + return function(i2) { + return i2.defaultPrevented ? void 0 : e3.handleInput(function() { + return n2(this.element) ? void 0 : (this.eventName = t4, this.events[t4].call(this, i2)); + }); + }; + }(this); + }, r2.prototype.handleInput = function(t4) { + var e3, n3; + try { + return (e3 = this.delegate) != null && e3.inputControllerWillHandleInput(), t4.call(this); + } finally { + (n3 = this.delegate) != null && n3.inputControllerDidHandleInput(); + } + }, r2.prototype.createLinkHTML = function(t4, e3) { + var n3; + return n3 = document.createElement("a"), n3.href = t4, n3.textContent = e3 != null ? e3 : t4, n3.outerHTML; + }, r2; + }(e2.BasicObject); + }.call(this), function() { + var t3, n2, i, o2, r2, s2, a2, u, c2, l, h, p2, d, f = function(t4, e3) { + function n3() { + this.constructor = t4; + } + for (var i2 in e3) + g.call(e3, i2) && (t4[i2] = e3[i2]); + return n3.prototype = e3.prototype, t4.prototype = new n3(), t4.__super__ = e3.prototype, t4; + }, g = {}.hasOwnProperty, m = [].indexOf || function(t4) { + for (var e3 = 0, n3 = this.length; n3 > e3; e3++) + if (e3 in this && this[e3] === t4) + return e3; + return -1; + }; + c2 = e2.makeElement, l = e2.objectsAreEqual, d = e2.tagName, n2 = e2.browser, a2 = e2.keyEventIsKeyboardCommand, o2 = e2.dataTransferIsWritable, i = e2.dataTransferIsPlainText, u = e2.config.keyNames, e2.Level0InputController = function(n3) { + function s3() { + s3.__super__.constructor.apply(this, arguments), this.resetInputSummary(); + } + var d2; + return f(s3, n3), d2 = 0, s3.prototype.setInputSummary = function(t4) { + var e3, n4; + t4 == null && (t4 = {}), this.inputSummary.eventName = this.eventName; + for (e3 in t4) + n4 = t4[e3], this.inputSummary[e3] = n4; + return this.inputSummary; + }, s3.prototype.resetInputSummary = function() { + return this.inputSummary = {}; + }, s3.prototype.reset = function() { + return this.resetInputSummary(), e2.selectionChangeObserver.reset(); + }, s3.prototype.elementDidMutate = function(t4) { + var e3; + return this.isComposing() ? (e3 = this.delegate) != null && typeof e3.inputControllerDidAllowUnhandledInput == "function" ? e3.inputControllerDidAllowUnhandledInput() : void 0 : this.handleInput(function() { + return this.mutationIsSignificant(t4) && (this.mutationIsExpected(t4) ? this.requestRender() : this.requestReparse()), this.reset(); + }); + }, s3.prototype.mutationIsExpected = function(t4) { + var e3, n4, i2, o3, r3, s4, a3, u2, c3, l2; + return a3 = t4.textAdded, u2 = t4.textDeleted, this.inputSummary.preferDocument ? true : (e3 = a3 != null ? a3 === this.inputSummary.textAdded : !this.inputSummary.textAdded, n4 = u2 != null ? this.inputSummary.didDelete : !this.inputSummary.didDelete, c3 = (a3 === "\n" || a3 === " \n") && !e3, l2 = u2 === "\n" && !n4, s4 = c3 && !l2 || l2 && !c3, s4 && (o3 = this.getSelectedRange()) && (i2 = c3 ? a3.replace(/\n$/, "").length || -1 : (a3 != null ? a3.length : void 0) || 1, (r3 = this.responder) != null ? r3.positionIsBlockBreak(o3[1] + i2) : void 0) ? true : e3 && n4); + }, s3.prototype.mutationIsSignificant = function(t4) { + var e3, n4, i2; + return i2 = Object.keys(t4).length > 0, e3 = ((n4 = this.compositionInput) != null ? n4.getEndData() : void 0) === "", i2 || !e3; + }, s3.prototype.events = {keydown: function(t4) { + var n4, i2, o3, r3, s4, c3, l2, h2, p3; + if (this.isComposing() || this.resetInputSummary(), this.inputSummary.didInput = true, r3 = u[t4.keyCode]) { + for (i2 = this.keys, h2 = ["ctrl", "alt", "shift", "meta"], o3 = 0, c3 = h2.length; c3 > o3; o3++) + l2 = h2[o3], t4[l2 + "Key"] && (l2 === "ctrl" && (l2 = "control"), i2 = i2 != null ? i2[l2] : void 0); + (i2 != null ? i2[r3] : void 0) != null && (this.setInputSummary({keyName: r3}), e2.selectionChangeObserver.reset(), i2[r3].call(this, t4)); + } + return a2(t4) && (n4 = String.fromCharCode(t4.keyCode).toLowerCase()) && (s4 = function() { + var e3, n5, i3, o4; + for (i3 = ["alt", "shift"], o4 = [], e3 = 0, n5 = i3.length; n5 > e3; e3++) + l2 = i3[e3], t4[l2 + "Key"] && o4.push(l2); + return o4; + }(), s4.push(n4), (p3 = this.delegate) != null ? p3.inputControllerDidReceiveKeyboardCommand(s4) : void 0) ? t4.preventDefault() : void 0; + }, keypress: function(t4) { + var e3, n4, i2; + if (this.inputSummary.eventName == null && !t4.metaKey && (!t4.ctrlKey || t4.altKey)) + return (i2 = p2(t4)) ? ((e3 = this.delegate) != null && e3.inputControllerWillPerformTyping(), (n4 = this.responder) != null && n4.insertString(i2), this.setInputSummary({textAdded: i2, didDelete: this.selectionIsExpanded()})) : void 0; + }, textInput: function(t4) { + var e3, n4, i2, o3; + return e3 = t4.data, o3 = this.inputSummary.textAdded, o3 && o3 !== e3 && o3.toUpperCase() === e3 ? (n4 = this.getSelectedRange(), this.setSelectedRange([n4[0], n4[1] + o3.length]), (i2 = this.responder) != null && i2.insertString(e3), this.setInputSummary({textAdded: e3}), this.setSelectedRange(n4)) : void 0; + }, dragenter: function(t4) { + return t4.preventDefault(); + }, dragstart: function(t4) { + var e3, n4; + return n4 = t4.target, this.serializeSelectionToDataTransfer(t4.dataTransfer), this.draggedRange = this.getSelectedRange(), (e3 = this.delegate) != null && typeof e3.inputControllerDidStartDrag == "function" ? e3.inputControllerDidStartDrag() : void 0; + }, dragover: function(t4) { + var e3, n4; + return !this.draggedRange && !this.canAcceptDataTransfer(t4.dataTransfer) || (t4.preventDefault(), e3 = {x: t4.clientX, y: t4.clientY}, l(e3, this.draggingPoint)) ? void 0 : (this.draggingPoint = e3, (n4 = this.delegate) != null && typeof n4.inputControllerDidReceiveDragOverPoint == "function" ? n4.inputControllerDidReceiveDragOverPoint(this.draggingPoint) : void 0); + }, dragend: function() { + var t4; + return (t4 = this.delegate) != null && typeof t4.inputControllerDidCancelDrag == "function" && t4.inputControllerDidCancelDrag(), this.draggedRange = null, this.draggingPoint = null; + }, drop: function(t4) { + var n4, i2, o3, r3, s4, a3, u2, c3, l2; + return t4.preventDefault(), o3 = (s4 = t4.dataTransfer) != null ? s4.files : void 0, r3 = {x: t4.clientX, y: t4.clientY}, (a3 = this.responder) != null && a3.setLocationRangeFromPointRange(r3), (o3 != null ? o3.length : void 0) ? this.attachFiles(o3) : this.draggedRange ? ((u2 = this.delegate) != null && u2.inputControllerWillMoveText(), (c3 = this.responder) != null && c3.moveTextFromRange(this.draggedRange), this.draggedRange = null, this.requestRender()) : (i2 = t4.dataTransfer.getData("application/x-trix-document")) && (n4 = e2.Document.fromJSONString(i2), (l2 = this.responder) != null && l2.insertDocument(n4), this.requestRender()), this.draggedRange = null, this.draggingPoint = null; + }, cut: function(t4) { + var e3, n4; + return ((e3 = this.responder) != null ? e3.selectionIsExpanded() : void 0) && (this.serializeSelectionToDataTransfer(t4.clipboardData) && t4.preventDefault(), (n4 = this.delegate) != null && n4.inputControllerWillCutText(), this.deleteInDirection("backward"), t4.defaultPrevented) ? this.requestRender() : void 0; + }, copy: function(t4) { + var e3; + return ((e3 = this.responder) != null ? e3.selectionIsExpanded() : void 0) && this.serializeSelectionToDataTransfer(t4.clipboardData) ? t4.preventDefault() : void 0; + }, paste: function(t4) { + var n4, o3, s4, a3, u2, c3, l2, p3, f2, g2, v, y, b, A, C3, x, w, E, S2, R, k, D2, L2; + return n4 = (p3 = t4.clipboardData) != null ? p3 : t4.testClipboardData, l2 = {clipboard: n4}, n4 == null || h(t4) ? void this.getPastedHTMLUsingHiddenElement(function(t5) { + return function(e3) { + var n5, i2, o4; + return l2.type = "text/html", l2.html = e3, (n5 = t5.delegate) != null && n5.inputControllerWillPaste(l2), (i2 = t5.responder) != null && i2.insertHTML(l2.html), t5.requestRender(), (o4 = t5.delegate) != null ? o4.inputControllerDidPaste(l2) : void 0; + }; + }(this)) : ((a3 = n4.getData("URL")) ? (l2.type = "text/html", L2 = (c3 = n4.getData("public.url-name")) ? e2.squishBreakableWhitespace(c3).trim() : a3, l2.html = this.createLinkHTML(a3, L2), (f2 = this.delegate) != null && f2.inputControllerWillPaste(l2), this.setInputSummary({textAdded: L2, didDelete: this.selectionIsExpanded()}), (C3 = this.responder) != null && C3.insertHTML(l2.html), this.requestRender(), (x = this.delegate) != null && x.inputControllerDidPaste(l2)) : i(n4) ? (l2.type = "text/plain", l2.string = n4.getData("text/plain"), (w = this.delegate) != null && w.inputControllerWillPaste(l2), this.setInputSummary({textAdded: l2.string, didDelete: this.selectionIsExpanded()}), (E = this.responder) != null && E.insertString(l2.string), this.requestRender(), (S2 = this.delegate) != null && S2.inputControllerDidPaste(l2)) : (u2 = n4.getData("text/html")) ? (l2.type = "text/html", l2.html = u2, (R = this.delegate) != null && R.inputControllerWillPaste(l2), (k = this.responder) != null && k.insertHTML(l2.html), this.requestRender(), (D2 = this.delegate) != null && D2.inputControllerDidPaste(l2)) : m.call(n4.types, "Files") >= 0 && (s4 = (g2 = n4.items) != null && (v = g2[0]) != null && typeof v.getAsFile == "function" ? v.getAsFile() : void 0) && (!s4.name && (o3 = r2(s4)) && (s4.name = "pasted-file-" + ++d2 + "." + o3), l2.type = "File", l2.file = s4, (y = this.delegate) != null && y.inputControllerWillAttachFiles(), (b = this.responder) != null && b.insertFile(l2.file), this.requestRender(), (A = this.delegate) != null && A.inputControllerDidPaste(l2)), t4.preventDefault()); + }, compositionstart: function(t4) { + return this.getCompositionInput().start(t4.data); + }, compositionupdate: function(t4) { + return this.getCompositionInput().update(t4.data); + }, compositionend: function(t4) { + return this.getCompositionInput().end(t4.data); + }, beforeinput: function() { + return this.inputSummary.didInput = true; + }, input: function(t4) { + return this.inputSummary.didInput = true, t4.stopPropagation(); + }}, s3.prototype.keys = {backspace: function(t4) { + var e3; + return (e3 = this.delegate) != null && e3.inputControllerWillPerformTyping(), this.deleteInDirection("backward", t4); + }, delete: function(t4) { + var e3; + return (e3 = this.delegate) != null && e3.inputControllerWillPerformTyping(), this.deleteInDirection("forward", t4); + }, return: function() { + var t4, e3; + return this.setInputSummary({preferDocument: true}), (t4 = this.delegate) != null && t4.inputControllerWillPerformTyping(), (e3 = this.responder) != null ? e3.insertLineBreak() : void 0; + }, tab: function(t4) { + var e3, n4; + return ((e3 = this.responder) != null ? e3.canIncreaseNestingLevel() : void 0) ? ((n4 = this.responder) != null && n4.increaseNestingLevel(), this.requestRender(), t4.preventDefault()) : void 0; + }, left: function(t4) { + var e3; + return this.selectionIsInCursorTarget() ? (t4.preventDefault(), (e3 = this.responder) != null ? e3.moveCursorInDirection("backward") : void 0) : void 0; + }, right: function(t4) { + var e3; + return this.selectionIsInCursorTarget() ? (t4.preventDefault(), (e3 = this.responder) != null ? e3.moveCursorInDirection("forward") : void 0) : void 0; + }, control: {d: function(t4) { + var e3; + return (e3 = this.delegate) != null && e3.inputControllerWillPerformTyping(), this.deleteInDirection("forward", t4); + }, h: function(t4) { + var e3; + return (e3 = this.delegate) != null && e3.inputControllerWillPerformTyping(), this.deleteInDirection("backward", t4); + }, o: function(t4) { + var e3, n4; + return t4.preventDefault(), (e3 = this.delegate) != null && e3.inputControllerWillPerformTyping(), (n4 = this.responder) != null && n4.insertString("\n", {updatePosition: false}), this.requestRender(); + }}, shift: {return: function(t4) { + var e3, n4; + return (e3 = this.delegate) != null && e3.inputControllerWillPerformTyping(), (n4 = this.responder) != null && n4.insertString("\n"), this.requestRender(), t4.preventDefault(); + }, tab: function(t4) { + var e3, n4; + return ((e3 = this.responder) != null ? e3.canDecreaseNestingLevel() : void 0) ? ((n4 = this.responder) != null && n4.decreaseNestingLevel(), this.requestRender(), t4.preventDefault()) : void 0; + }, left: function(t4) { + return this.selectionIsInCursorTarget() ? (t4.preventDefault(), this.expandSelectionInDirection("backward")) : void 0; + }, right: function(t4) { + return this.selectionIsInCursorTarget() ? (t4.preventDefault(), this.expandSelectionInDirection("forward")) : void 0; + }}, alt: {backspace: function() { + var t4; + return this.setInputSummary({preferDocument: false}), (t4 = this.delegate) != null ? t4.inputControllerWillPerformTyping() : void 0; + }}, meta: {backspace: function() { + var t4; + return this.setInputSummary({preferDocument: false}), (t4 = this.delegate) != null ? t4.inputControllerWillPerformTyping() : void 0; + }}}, s3.prototype.getCompositionInput = function() { + return this.isComposing() ? this.compositionInput : this.compositionInput = new t3(this); + }, s3.prototype.isComposing = function() { + return this.compositionInput != null && !this.compositionInput.isEnded(); + }, s3.prototype.deleteInDirection = function(t4, e3) { + var n4; + return ((n4 = this.responder) != null ? n4.deleteInDirection(t4) : void 0) !== false ? this.setInputSummary({didDelete: true}) : e3 ? (e3.preventDefault(), this.requestRender()) : void 0; + }, s3.prototype.serializeSelectionToDataTransfer = function(t4) { + var n4, i2; + if (o2(t4)) + return n4 = (i2 = this.responder) != null ? i2.getSelectedDocument().toSerializableDocument() : void 0, t4.setData("application/x-trix-document", JSON.stringify(n4)), t4.setData("text/html", e2.DocumentView.render(n4).innerHTML), t4.setData("text/plain", n4.toString().replace(/\n$/, "")), true; + }, s3.prototype.canAcceptDataTransfer = function(t4) { + var e3, n4, i2, o3, r3, s4; + for (s4 = {}, o3 = (i2 = t4 != null ? t4.types : void 0) != null ? i2 : [], e3 = 0, n4 = o3.length; n4 > e3; e3++) + r3 = o3[e3], s4[r3] = true; + return s4.Files || s4["application/x-trix-document"] || s4["text/html"] || s4["text/plain"]; + }, s3.prototype.getPastedHTMLUsingHiddenElement = function(t4) { + var n4, i2, o3; + return i2 = this.getSelectedRange(), o3 = {position: "absolute", left: window.pageXOffset + "px", top: window.pageYOffset + "px", opacity: 0}, n4 = c2({style: o3, tagName: "div", editable: true}), document.body.appendChild(n4), n4.focus(), requestAnimationFrame(function(o4) { + return function() { + var r3; + return r3 = n4.innerHTML, e2.removeNode(n4), o4.setSelectedRange(i2), t4(r3); + }; + }(this)); + }, s3.proxyMethod("responder?.getSelectedRange"), s3.proxyMethod("responder?.setSelectedRange"), s3.proxyMethod("responder?.expandSelectionInDirection"), s3.proxyMethod("responder?.selectionIsInCursorTarget"), s3.proxyMethod("responder?.selectionIsExpanded"), s3; + }(e2.InputController), r2 = function(t4) { + var e3, n3; + return (e3 = t4.type) != null && (n3 = e3.match(/\/(\w+)$/)) != null ? n3[1] : void 0; + }, s2 = (typeof " ".codePointAt == "function" ? " ".codePointAt(0) : void 0) != null, p2 = function(t4) { + var n3; + return t4.key && s2 && t4.key.codePointAt(0) === t4.keyCode ? t4.key : (t4.which === null ? n3 = t4.keyCode : t4.which !== 0 && t4.charCode !== 0 && (n3 = t4.charCode), n3 != null && u[n3] !== "escape" ? e2.UTF16String.fromCodepoints([n3]).toString() : void 0); + }, h = function(t4) { + var e3, n3, i2, o3, r3, s3, a3, u2, c3, l2; + if (u2 = t4.clipboardData) { + if (m.call(u2.types, "text/html") >= 0) { + for (c3 = u2.types, i2 = 0, s3 = c3.length; s3 > i2; i2++) + if (l2 = c3[i2], e3 = /^CorePasteboardFlavorType/.test(l2), n3 = /^dyn\./.test(l2) && u2.getData(l2), a3 = e3 || n3) + return true; + return false; + } + return o3 = m.call(u2.types, "com.apple.webarchive") >= 0, r3 = m.call(u2.types, "com.apple.flat-rtfd") >= 0, o3 || r3; + } + }, t3 = function(t4) { + function e3(t5) { + var e4; + this.inputController = t5, e4 = this.inputController, this.responder = e4.responder, this.delegate = e4.delegate, this.inputSummary = e4.inputSummary, this.data = {}; + } + return f(e3, t4), e3.prototype.start = function(t5) { + var e4, n3; + return this.data.start = t5, this.isSignificant() ? (this.inputSummary.eventName === "keypress" && this.inputSummary.textAdded && (e4 = this.responder) != null && e4.deleteInDirection("left"), this.selectionIsExpanded() || (this.insertPlaceholder(), this.requestRender()), this.range = (n3 = this.responder) != null ? n3.getSelectedRange() : void 0) : void 0; + }, e3.prototype.update = function(t5) { + var e4; + return this.data.update = t5, this.isSignificant() && (e4 = this.selectPlaceholder()) ? (this.forgetPlaceholder(), this.range = e4) : void 0; + }, e3.prototype.end = function(t5) { + var e4, n3, i2, o3; + return this.data.end = t5, this.isSignificant() ? (this.forgetPlaceholder(), this.canApplyToDocument() ? (this.setInputSummary({preferDocument: true, didInput: false}), (e4 = this.delegate) != null && e4.inputControllerWillPerformTyping(), (n3 = this.responder) != null && n3.setSelectedRange(this.range), (i2 = this.responder) != null && i2.insertString(this.data.end), (o3 = this.responder) != null ? o3.setSelectedRange(this.range[0] + this.data.end.length) : void 0) : this.data.start != null || this.data.update != null ? (this.requestReparse(), this.inputController.reset()) : void 0) : this.inputController.reset(); + }, e3.prototype.getEndData = function() { + return this.data.end; + }, e3.prototype.isEnded = function() { + return this.getEndData() != null; + }, e3.prototype.isSignificant = function() { + return n2.composesExistingText ? this.inputSummary.didInput : true; + }, e3.prototype.canApplyToDocument = function() { + var t5, e4; + return ((t5 = this.data.start) != null ? t5.length : void 0) === 0 && ((e4 = this.data.end) != null ? e4.length : void 0) > 0 && this.range != null; + }, e3.proxyMethod("inputController.setInputSummary"), e3.proxyMethod("inputController.requestRender"), e3.proxyMethod("inputController.requestReparse"), e3.proxyMethod("responder?.selectionIsExpanded"), e3.proxyMethod("responder?.insertPlaceholder"), e3.proxyMethod("responder?.selectPlaceholder"), e3.proxyMethod("responder?.forgetPlaceholder"), e3; + }(e2.BasicObject); + }.call(this), function() { + var t3, n2, i, o2 = function(t4, e3) { + return function() { + return t4.apply(e3, arguments); + }; + }, r2 = function(t4, e3) { + function n3() { + this.constructor = t4; + } + for (var i2 in e3) + s2.call(e3, i2) && (t4[i2] = e3[i2]); + return n3.prototype = e3.prototype, t4.prototype = new n3(), t4.__super__ = e3.prototype, t4; + }, s2 = {}.hasOwnProperty, a2 = [].indexOf || function(t4) { + for (var e3 = 0, n3 = this.length; n3 > e3; e3++) + if (e3 in this && this[e3] === t4) + return e3; + return -1; + }; + t3 = e2.dataTransferIsPlainText, n2 = e2.keyEventIsKeyboardCommand, i = e2.objectsAreEqual, e2.Level2InputController = function(s3) { + function u() { + return this.render = o2(this.render, this), u.__super__.constructor.apply(this, arguments); + } + var c2, l, h, p2, d, f; + return r2(u, s3), u.prototype.elementDidMutate = function() { + var t4; + return this.scheduledRender ? this.composing && (t4 = this.delegate) != null && typeof t4.inputControllerDidAllowUnhandledInput == "function" ? t4.inputControllerDidAllowUnhandledInput() : void 0 : this.reparse(); + }, u.prototype.scheduleRender = function() { + return this.scheduledRender != null ? this.scheduledRender : this.scheduledRender = requestAnimationFrame(this.render); + }, u.prototype.render = function() { + var t4; + return cancelAnimationFrame(this.scheduledRender), this.scheduledRender = null, this.composing || (t4 = this.delegate) != null && t4.render(), typeof this.afterRender == "function" && this.afterRender(), this.afterRender = null; + }, u.prototype.reparse = function() { + var t4; + return (t4 = this.delegate) != null ? t4.reparse() : void 0; + }, u.prototype.events = {keydown: function(t4) { + var e3, i2, o3, r3; + if (n2(t4)) { + if (e3 = l(t4), (r3 = this.delegate) != null ? r3.inputControllerDidReceiveKeyboardCommand(e3) : void 0) + return t4.preventDefault(); + } else if (o3 = t4.key, t4.altKey && (o3 += "+Alt"), t4.shiftKey && (o3 += "+Shift"), i2 = this.keys[o3]) + return this.withEvent(t4, i2); + }, paste: function(t4) { + var e3, n3, i2, o3, r3, s4, a3, u2, c3; + return h(t4) ? (t4.preventDefault(), this.attachFiles(t4.clipboardData.files)) : p2(t4) ? (t4.preventDefault(), n3 = {type: "text/plain", string: t4.clipboardData.getData("text/plain")}, (i2 = this.delegate) != null && i2.inputControllerWillPaste(n3), (o3 = this.responder) != null && o3.insertString(n3.string), this.render(), (r3 = this.delegate) != null ? r3.inputControllerDidPaste(n3) : void 0) : (e3 = (s4 = t4.clipboardData) != null ? s4.getData("URL") : void 0) ? (t4.preventDefault(), n3 = {type: "text/html", html: this.createLinkHTML(e3)}, (a3 = this.delegate) != null && a3.inputControllerWillPaste(n3), (u2 = this.responder) != null && u2.insertHTML(n3.html), this.render(), (c3 = this.delegate) != null ? c3.inputControllerDidPaste(n3) : void 0) : void 0; + }, beforeinput: function(t4) { + var e3; + return (e3 = this.inputTypes[t4.inputType]) ? (this.withEvent(t4, e3), this.scheduleRender()) : void 0; + }, input: function() { + return e2.selectionChangeObserver.reset(); + }, dragstart: function(t4) { + var e3, n3; + return ((e3 = this.responder) != null ? e3.selectionContainsAttachments() : void 0) ? (t4.dataTransfer.setData("application/x-trix-dragging", true), this.dragging = {range: (n3 = this.responder) != null ? n3.getSelectedRange() : void 0, point: d(t4)}) : void 0; + }, dragenter: function(t4) { + return c2(t4) ? t4.preventDefault() : void 0; + }, dragover: function(t4) { + var e3, n3; + if (this.dragging) { + if (t4.preventDefault(), e3 = d(t4), !i(e3, this.dragging.point)) + return this.dragging.point = e3, (n3 = this.responder) != null ? n3.setLocationRangeFromPointRange(e3) : void 0; + } else if (c2(t4)) + return t4.preventDefault(); + }, drop: function(t4) { + var e3, n3, i2, o3; + return this.dragging ? (t4.preventDefault(), (n3 = this.delegate) != null && n3.inputControllerWillMoveText(), (i2 = this.responder) != null && i2.moveTextFromRange(this.dragging.range), this.dragging = null, this.scheduleRender()) : c2(t4) ? (t4.preventDefault(), e3 = d(t4), (o3 = this.responder) != null && o3.setLocationRangeFromPointRange(e3), this.attachFiles(t4.dataTransfer.files)) : void 0; + }, dragend: function() { + var t4; + return this.dragging ? ((t4 = this.responder) != null && t4.setSelectedRange(this.dragging.range), this.dragging = null) : void 0; + }, compositionend: function() { + return this.composing ? (this.composing = false, this.scheduleRender()) : void 0; + }}, u.prototype.keys = {ArrowLeft: function() { + var t4, e3; + return ((t4 = this.responder) != null ? t4.shouldManageMovingCursorInDirection("backward") : void 0) ? (this.event.preventDefault(), (e3 = this.responder) != null ? e3.moveCursorInDirection("backward") : void 0) : void 0; + }, ArrowRight: function() { + var t4, e3; + return ((t4 = this.responder) != null ? t4.shouldManageMovingCursorInDirection("forward") : void 0) ? (this.event.preventDefault(), (e3 = this.responder) != null ? e3.moveCursorInDirection("forward") : void 0) : void 0; + }, Backspace: function() { + var t4, e3, n3; + return ((t4 = this.responder) != null ? t4.shouldManageDeletingInDirection("backward") : void 0) ? (this.event.preventDefault(), (e3 = this.delegate) != null && e3.inputControllerWillPerformTyping(), (n3 = this.responder) != null && n3.deleteInDirection("backward"), this.render()) : void 0; + }, Tab: function() { + var t4, e3; + return ((t4 = this.responder) != null ? t4.canIncreaseNestingLevel() : void 0) ? (this.event.preventDefault(), (e3 = this.responder) != null && e3.increaseNestingLevel(), this.render()) : void 0; + }, "Tab+Shift": function() { + var t4, e3; + return ((t4 = this.responder) != null ? t4.canDecreaseNestingLevel() : void 0) ? (this.event.preventDefault(), (e3 = this.responder) != null && e3.decreaseNestingLevel(), this.render()) : void 0; + }}, u.prototype.inputTypes = {deleteByComposition: function() { + return this.deleteInDirection("backward", {recordUndoEntry: false}); + }, deleteByCut: function() { + return this.deleteInDirection("backward"); + }, deleteByDrag: function() { + return this.event.preventDefault(), this.withTargetDOMRange(function() { + var t4; + return this.deleteByDragRange = (t4 = this.responder) != null ? t4.getSelectedRange() : void 0; + }); + }, deleteCompositionText: function() { + return this.deleteInDirection("backward", {recordUndoEntry: false}); + }, deleteContent: function() { + return this.deleteInDirection("backward"); + }, deleteContentBackward: function() { + return this.deleteInDirection("backward"); + }, deleteContentForward: function() { + return this.deleteInDirection("forward"); + }, deleteEntireSoftLine: function() { + return this.deleteInDirection("forward"); + }, deleteHardLineBackward: function() { + return this.deleteInDirection("backward"); + }, deleteHardLineForward: function() { + return this.deleteInDirection("forward"); + }, deleteSoftLineBackward: function() { + return this.deleteInDirection("backward"); + }, deleteSoftLineForward: function() { + return this.deleteInDirection("forward"); + }, deleteWordBackward: function() { + return this.deleteInDirection("backward"); + }, deleteWordForward: function() { + return this.deleteInDirection("forward"); + }, formatBackColor: function() { + return this.activateAttributeIfSupported("backgroundColor", this.event.data); + }, formatBold: function() { + return this.toggleAttributeIfSupported("bold"); + }, formatFontColor: function() { + return this.activateAttributeIfSupported("color", this.event.data); + }, formatFontName: function() { + return this.activateAttributeIfSupported("font", this.event.data); + }, formatIndent: function() { + var t4; + return ((t4 = this.responder) != null ? t4.canIncreaseNestingLevel() : void 0) ? this.withTargetDOMRange(function() { + var t5; + return (t5 = this.responder) != null ? t5.increaseNestingLevel() : void 0; + }) : void 0; + }, formatItalic: function() { + return this.toggleAttributeIfSupported("italic"); + }, formatJustifyCenter: function() { + return this.toggleAttributeIfSupported("justifyCenter"); + }, formatJustifyFull: function() { + return this.toggleAttributeIfSupported("justifyFull"); + }, formatJustifyLeft: function() { + return this.toggleAttributeIfSupported("justifyLeft"); + }, formatJustifyRight: function() { + return this.toggleAttributeIfSupported("justifyRight"); + }, formatOutdent: function() { + var t4; + return ((t4 = this.responder) != null ? t4.canDecreaseNestingLevel() : void 0) ? this.withTargetDOMRange(function() { + var t5; + return (t5 = this.responder) != null ? t5.decreaseNestingLevel() : void 0; + }) : void 0; + }, formatRemove: function() { + return this.withTargetDOMRange(function() { + var t4, e3, n3, i2; + i2 = []; + for (t4 in (e3 = this.responder) != null ? e3.getCurrentAttributes() : void 0) + i2.push((n3 = this.responder) != null ? n3.removeCurrentAttribute(t4) : void 0); + return i2; + }); + }, formatSetBlockTextDirection: function() { + return this.activateAttributeIfSupported("blockDir", this.event.data); + }, formatSetInlineTextDirection: function() { + return this.activateAttributeIfSupported("textDir", this.event.data); + }, formatStrikeThrough: function() { + return this.toggleAttributeIfSupported("strike"); + }, formatSubscript: function() { + return this.toggleAttributeIfSupported("sub"); + }, formatSuperscript: function() { + return this.toggleAttributeIfSupported("sup"); + }, formatUnderline: function() { + return this.toggleAttributeIfSupported("underline"); + }, historyRedo: function() { + var t4; + return (t4 = this.delegate) != null ? t4.inputControllerWillPerformRedo() : void 0; + }, historyUndo: function() { + var t4; + return (t4 = this.delegate) != null ? t4.inputControllerWillPerformUndo() : void 0; + }, insertCompositionText: function() { + return this.composing = true, this.insertString(this.event.data); + }, insertFromComposition: function() { + return this.composing = false, this.insertString(this.event.data); + }, insertFromDrop: function() { + var t4, e3; + return (t4 = this.deleteByDragRange) ? (this.deleteByDragRange = null, (e3 = this.delegate) != null && e3.inputControllerWillMoveText(), this.withTargetDOMRange(function() { + var e4; + return (e4 = this.responder) != null ? e4.moveTextFromRange(t4) : void 0; + })) : void 0; + }, insertFromPaste: function() { + var n3, i2, o3, r3, s4, a3, u2, c3, l2, h2, p3; + return n3 = this.event.dataTransfer, s4 = {dataTransfer: n3}, (i2 = n3.getData("URL")) ? (this.event.preventDefault(), s4.type = "text/html", p3 = (r3 = n3.getData("public.url-name")) ? e2.squishBreakableWhitespace(r3).trim() : i2, s4.html = this.createLinkHTML(i2, p3), (a3 = this.delegate) != null && a3.inputControllerWillPaste(s4), this.withTargetDOMRange(function() { + var t4; + return (t4 = this.responder) != null ? t4.insertHTML(s4.html) : void 0; + }), this.afterRender = function(t4) { + return function() { + var e3; + return (e3 = t4.delegate) != null ? e3.inputControllerDidPaste(s4) : void 0; + }; + }(this)) : t3(n3) ? (s4.type = "text/plain", s4.string = n3.getData("text/plain"), (u2 = this.delegate) != null && u2.inputControllerWillPaste(s4), this.withTargetDOMRange(function() { + var t4; + return (t4 = this.responder) != null ? t4.insertString(s4.string) : void 0; + }), this.afterRender = function(t4) { + return function() { + var e3; + return (e3 = t4.delegate) != null ? e3.inputControllerDidPaste(s4) : void 0; + }; + }(this)) : (o3 = n3.getData("text/html")) ? (this.event.preventDefault(), s4.type = "text/html", s4.html = o3, (c3 = this.delegate) != null && c3.inputControllerWillPaste(s4), this.withTargetDOMRange(function() { + var t4; + return (t4 = this.responder) != null ? t4.insertHTML(s4.html) : void 0; + }), this.afterRender = function(t4) { + return function() { + var e3; + return (e3 = t4.delegate) != null ? e3.inputControllerDidPaste(s4) : void 0; + }; + }(this)) : ((l2 = n3.files) != null ? l2.length : void 0) ? (s4.type = "File", s4.file = n3.files[0], (h2 = this.delegate) != null && h2.inputControllerWillPaste(s4), this.withTargetDOMRange(function() { + var t4; + return (t4 = this.responder) != null ? t4.insertFile(s4.file) : void 0; + }), this.afterRender = function(t4) { + return function() { + var e3; + return (e3 = t4.delegate) != null ? e3.inputControllerDidPaste(s4) : void 0; + }; + }(this)) : void 0; + }, insertFromYank: function() { + return this.insertString(this.event.data); + }, insertLineBreak: function() { + return this.insertString("\n"); + }, insertLink: function() { + return this.activateAttributeIfSupported("href", this.event.data); + }, insertOrderedList: function() { + return this.toggleAttributeIfSupported("number"); + }, insertParagraph: function() { + var t4; + return (t4 = this.delegate) != null && t4.inputControllerWillPerformTyping(), this.withTargetDOMRange(function() { + var t5; + return (t5 = this.responder) != null ? t5.insertLineBreak() : void 0; + }); + }, insertReplacementText: function() { + return this.insertString(this.event.dataTransfer.getData("text/plain"), {updatePosition: false}); + }, insertText: function() { + var t4, e3; + return this.insertString((t4 = this.event.data) != null ? t4 : (e3 = this.event.dataTransfer) != null ? e3.getData("text/plain") : void 0); + }, insertTranspose: function() { + return this.insertString(this.event.data); + }, insertUnorderedList: function() { + return this.toggleAttributeIfSupported("bullet"); + }}, u.prototype.insertString = function(t4, e3) { + var n3; + return t4 == null && (t4 = ""), (n3 = this.delegate) != null && n3.inputControllerWillPerformTyping(), this.withTargetDOMRange(function() { + var n4; + return (n4 = this.responder) != null ? n4.insertString(t4, e3) : void 0; + }); + }, u.prototype.toggleAttributeIfSupported = function(t4) { + var n3; + return a2.call(e2.getAllAttributeNames(), t4) >= 0 ? ((n3 = this.delegate) != null && n3.inputControllerWillPerformFormatting(t4), this.withTargetDOMRange(function() { + var e3; + return (e3 = this.responder) != null ? e3.toggleCurrentAttribute(t4) : void 0; + })) : void 0; + }, u.prototype.activateAttributeIfSupported = function(t4, n3) { + var i2; + return a2.call(e2.getAllAttributeNames(), t4) >= 0 ? ((i2 = this.delegate) != null && i2.inputControllerWillPerformFormatting(t4), this.withTargetDOMRange(function() { + var e3; + return (e3 = this.responder) != null ? e3.setCurrentAttribute(t4, n3) : void 0; + })) : void 0; + }, u.prototype.deleteInDirection = function(t4, e3) { + var n3, i2, o3, r3; + return o3 = (e3 != null ? e3 : {recordUndoEntry: true}).recordUndoEntry, o3 && (r3 = this.delegate) != null && r3.inputControllerWillPerformTyping(), i2 = function(e4) { + return function() { + var n4; + return (n4 = e4.responder) != null ? n4.deleteInDirection(t4) : void 0; + }; + }(this), (n3 = this.getTargetDOMRange({minLength: 2})) ? this.withTargetDOMRange(n3, i2) : i2(); + }, u.prototype.withTargetDOMRange = function(t4, n3) { + var i2; + return typeof t4 == "function" && (n3 = t4, t4 = this.getTargetDOMRange()), t4 ? (i2 = this.responder) != null ? i2.withTargetDOMRange(t4, n3.bind(this)) : void 0 : (e2.selectionChangeObserver.reset(), n3.call(this)); + }, u.prototype.getTargetDOMRange = function(t4) { + var e3, n3, i2, o3; + return i2 = (t4 != null ? t4 : {minLength: 0}).minLength, (o3 = typeof (e3 = this.event).getTargetRanges == "function" ? e3.getTargetRanges() : void 0) && o3.length && (n3 = f(o3[0]), i2 === 0 || n3.toString().length >= i2) ? n3 : void 0; + }, f = function(t4) { + var e3; + return e3 = document.createRange(), e3.setStart(t4.startContainer, t4.startOffset), e3.setEnd(t4.endContainer, t4.endOffset), e3; + }, u.prototype.withEvent = function(t4, e3) { + var n3; + this.event = t4; + try { + n3 = e3.call(this); + } finally { + this.event = null; + } + return n3; + }, c2 = function(t4) { + var e3, n3; + return a2.call((e3 = (n3 = t4.dataTransfer) != null ? n3.types : void 0) != null ? e3 : [], "Files") >= 0; + }, h = function(t4) { + var e3; + return (e3 = t4.clipboardData) ? a2.call(e3.types, "Files") >= 0 && e3.types.length === 1 && e3.files.length >= 1 : void 0; + }, p2 = function(t4) { + var e3; + return (e3 = t4.clipboardData) ? a2.call(e3.types, "text/plain") >= 0 && e3.types.length === 1 : void 0; + }, l = function(t4) { + var e3; + return e3 = [], t4.altKey && e3.push("alt"), t4.shiftKey && e3.push("shift"), e3.push(t4.key), e3; + }, d = function(t4) { + return {x: t4.clientX, y: t4.clientY}; + }, u; + }(e2.InputController); + }.call(this), function() { + var t3, n2, i, o2, r2, s2, a2, u, c2 = function(t4, e3) { + return function() { + return t4.apply(e3, arguments); + }; + }, l = function(t4, e3) { + function n3() { + this.constructor = t4; + } + for (var i2 in e3) + h.call(e3, i2) && (t4[i2] = e3[i2]); + return n3.prototype = e3.prototype, t4.prototype = new n3(), t4.__super__ = e3.prototype, t4; + }, h = {}.hasOwnProperty; + n2 = e2.defer, i = e2.handleEvent, s2 = e2.makeElement, u = e2.tagName, a2 = e2.config, r2 = a2.lang, t3 = a2.css, o2 = a2.keyNames, e2.AttachmentEditorController = function(a3) { + function h2(t4, e3, n3, i2) { + this.attachmentPiece = t4, this.element = e3, this.container = n3, this.options = i2 != null ? i2 : {}, this.didBlurCaption = c2(this.didBlurCaption, this), this.didChangeCaption = c2(this.didChangeCaption, this), this.didInputCaption = c2(this.didInputCaption, this), this.didKeyDownCaption = c2(this.didKeyDownCaption, this), this.didClickActionButton = c2(this.didClickActionButton, this), this.didClickToolbar = c2(this.didClickToolbar, this), this.attachment = this.attachmentPiece.attachment, u(this.element) === "a" && (this.element = this.element.firstChild), this.install(); + } + var p2; + return l(h2, a3), p2 = function(t4) { + return function() { + var e3; + return e3 = t4.apply(this, arguments), e3["do"](), this.undos == null && (this.undos = []), this.undos.push(e3.undo); + }; + }, h2.prototype.install = function() { + return this.makeElementMutable(), this.addToolbar(), this.attachment.isPreviewable() ? this.installCaptionEditor() : void 0; + }, h2.prototype.uninstall = function() { + var t4, e3; + for (this.savePendingCaption(); e3 = this.undos.pop(); ) + e3(); + return (t4 = this.delegate) != null ? t4.didUninstallAttachmentEditor(this) : void 0; + }, h2.prototype.savePendingCaption = function() { + var t4, e3, n3; + return this.pendingCaption != null ? (t4 = this.pendingCaption, this.pendingCaption = null, t4 ? (e3 = this.delegate) != null && typeof e3.attachmentEditorDidRequestUpdatingAttributesForAttachment == "function" ? e3.attachmentEditorDidRequestUpdatingAttributesForAttachment({caption: t4}, this.attachment) : void 0 : (n3 = this.delegate) != null && typeof n3.attachmentEditorDidRequestRemovingAttributeForAttachment == "function" ? n3.attachmentEditorDidRequestRemovingAttributeForAttachment("caption", this.attachment) : void 0) : void 0; + }, h2.prototype.makeElementMutable = p2(function() { + return {do: function(t4) { + return function() { + return t4.element.dataset.trixMutable = true; + }; + }(this), undo: function(t4) { + return function() { + return delete t4.element.dataset.trixMutable; + }; + }(this)}; + }), h2.prototype.addToolbar = p2(function() { + var n3; + return n3 = s2({tagName: "div", className: t3.attachmentToolbar, data: {trixMutable: true}, childNodes: s2({tagName: "div", className: "trix-button-row", childNodes: s2({tagName: "span", className: "trix-button-group trix-button-group--actions", childNodes: s2({tagName: "button", className: "trix-button trix-button--remove", textContent: r2.remove, attributes: {title: r2.remove}, data: {trixAction: "remove"}})})})}), this.attachment.isPreviewable() && n3.appendChild(s2({tagName: "div", className: t3.attachmentMetadataContainer, childNodes: s2({tagName: "span", className: t3.attachmentMetadata, childNodes: [s2({tagName: "span", className: t3.attachmentName, textContent: this.attachment.getFilename(), attributes: {title: this.attachment.getFilename()}}), s2({tagName: "span", className: t3.attachmentSize, textContent: this.attachment.getFormattedFilesize()})]})})), i("click", {onElement: n3, withCallback: this.didClickToolbar}), i("click", {onElement: n3, matchingSelector: "[data-trix-action]", withCallback: this.didClickActionButton}), {do: function(t4) { + return function() { + return t4.element.appendChild(n3); + }; + }(this), undo: function() { + return function() { + return e2.removeNode(n3); + }; + }(this)}; + }), h2.prototype.installCaptionEditor = p2(function() { + var o3, a4, u2, c3, l2; + return c3 = s2({tagName: "textarea", className: t3.attachmentCaptionEditor, attributes: {placeholder: r2.captionPlaceholder}, data: {trixMutable: true}}), c3.value = this.attachmentPiece.getCaption(), l2 = c3.cloneNode(), l2.classList.add("trix-autoresize-clone"), l2.tabIndex = -1, o3 = function() { + return l2.value = c3.value, c3.style.height = l2.scrollHeight + "px"; + }, i("input", {onElement: c3, withCallback: o3}), i("input", {onElement: c3, withCallback: this.didInputCaption}), i("keydown", {onElement: c3, withCallback: this.didKeyDownCaption}), i("change", {onElement: c3, withCallback: this.didChangeCaption}), i("blur", {onElement: c3, withCallback: this.didBlurCaption}), u2 = this.element.querySelector("figcaption"), a4 = u2.cloneNode(), {do: function(e3) { + return function() { + return u2.style.display = "none", a4.appendChild(c3), a4.appendChild(l2), a4.classList.add(t3.attachmentCaption + "--editing"), u2.parentElement.insertBefore(a4, u2), o3(), e3.options.editCaption ? n2(function() { + return c3.focus(); + }) : void 0; + }; + }(this), undo: function() { + return e2.removeNode(a4), u2.style.display = null; + }}; + }), h2.prototype.didClickToolbar = function(t4) { + return t4.preventDefault(), t4.stopPropagation(); + }, h2.prototype.didClickActionButton = function(t4) { + var e3, n3; + switch (e3 = t4.target.getAttribute("data-trix-action")) { + case "remove": + return (n3 = this.delegate) != null ? n3.attachmentEditorDidRequestRemovalOfAttachment(this.attachment) : void 0; + } + }, h2.prototype.didKeyDownCaption = function(t4) { + var e3; + return o2[t4.keyCode] === "return" ? (t4.preventDefault(), this.savePendingCaption(), (e3 = this.delegate) != null && typeof e3.attachmentEditorDidRequestDeselectingAttachment == "function" ? e3.attachmentEditorDidRequestDeselectingAttachment(this.attachment) : void 0) : void 0; + }, h2.prototype.didInputCaption = function(t4) { + return this.pendingCaption = t4.target.value.replace(/\s/g, " ").trim(); + }, h2.prototype.didChangeCaption = function() { + return this.savePendingCaption(); + }, h2.prototype.didBlurCaption = function() { + return this.savePendingCaption(); + }, h2; + }(e2.BasicObject); + }.call(this), function() { + var t3, n2, i, o2 = function(t4, e3) { + function n3() { + this.constructor = t4; + } + for (var i2 in e3) + r2.call(e3, i2) && (t4[i2] = e3[i2]); + return n3.prototype = e3.prototype, t4.prototype = new n3(), t4.__super__ = e3.prototype, t4; + }, r2 = {}.hasOwnProperty; + i = e2.makeElement, t3 = e2.config.css, e2.AttachmentView = function(r3) { + function s2() { + s2.__super__.constructor.apply(this, arguments), this.attachment = this.object, this.attachment.uploadProgressDelegate = this, this.attachmentPiece = this.options.piece; + } + var a2; + return o2(s2, r3), s2.attachmentSelector = "[data-trix-attachment]", s2.prototype.createContentNodes = function() { + return []; + }, s2.prototype.createNodes = function() { + var e3, n3, o3, r4, s3, u, c2; + if (e3 = r4 = i({tagName: "figure", className: this.getClassName(), data: this.getData(), editable: false}), (n3 = this.getHref()) && (r4 = i({tagName: "a", editable: false, attributes: {href: n3, tabindex: -1}}), e3.appendChild(r4)), this.attachment.hasContent()) + r4.innerHTML = this.attachment.getContent(); + else + for (c2 = this.createContentNodes(), o3 = 0, s3 = c2.length; s3 > o3; o3++) + u = c2[o3], r4.appendChild(u); + return r4.appendChild(this.createCaptionElement()), this.attachment.isPending() && (this.progressElement = i({tagName: "progress", attributes: {class: t3.attachmentProgress, value: this.attachment.getUploadProgress(), max: 100}, data: {trixMutable: true, trixStoreKey: ["progressElement", this.attachment.id].join("/")}}), e3.appendChild(this.progressElement)), [a2("left"), e3, a2("right")]; + }, s2.prototype.createCaptionElement = function() { + var e3, n3, o3, r4, s3, a3, u; + return o3 = i({tagName: "figcaption", className: t3.attachmentCaption}), (e3 = this.attachmentPiece.getCaption()) ? (o3.classList.add(t3.attachmentCaption + "--edited"), o3.textContent = e3) : (n3 = this.getCaptionConfig(), n3.name && (r4 = this.attachment.getFilename()), n3.size && (a3 = this.attachment.getFormattedFilesize()), r4 && (s3 = i({tagName: "span", className: t3.attachmentName, textContent: r4}), o3.appendChild(s3)), a3 && (r4 && o3.appendChild(document.createTextNode(" ")), u = i({tagName: "span", className: t3.attachmentSize, textContent: a3}), o3.appendChild(u))), o3; + }, s2.prototype.getClassName = function() { + var e3, n3; + return n3 = [t3.attachment, t3.attachment + "--" + this.attachment.getType()], (e3 = this.attachment.getExtension()) && n3.push(t3.attachment + "--" + e3), n3.join(" "); + }, s2.prototype.getData = function() { + var t4, e3; + return e3 = {trixAttachment: JSON.stringify(this.attachment), trixContentType: this.attachment.getContentType(), trixId: this.attachment.id}, t4 = this.attachmentPiece.attributes, t4.isEmpty() || (e3.trixAttributes = JSON.stringify(t4)), this.attachment.isPending() && (e3.trixSerialize = false), e3; + }, s2.prototype.getHref = function() { + return n2(this.attachment.getContent(), "a") ? void 0 : this.attachment.getHref(); + }, s2.prototype.getCaptionConfig = function() { + var t4, n3, i2; + return i2 = this.attachment.getType(), t4 = e2.copyObject((n3 = e2.config.attachments[i2]) != null ? n3.caption : void 0), i2 === "file" && (t4.name = true), t4; + }, s2.prototype.findProgressElement = function() { + var t4; + return (t4 = this.findElement()) != null ? t4.querySelector("progress") : void 0; + }, a2 = function(t4) { + return i({tagName: "span", textContent: e2.ZERO_WIDTH_SPACE, data: {trixCursorTarget: t4, trixSerialize: false}}); + }, s2.prototype.attachmentDidChangeUploadProgress = function() { + var t4, e3; + return e3 = this.attachment.getUploadProgress(), (t4 = this.findProgressElement()) != null ? t4.value = e3 : void 0; + }, s2; + }(e2.ObjectView), n2 = function(t4, e3) { + var n3; + return n3 = i("div"), n3.innerHTML = t4 != null ? t4 : "", n3.querySelector(e3); + }; + }.call(this), function() { + var t3, n2 = function(t4, e3) { + function n3() { + this.constructor = t4; + } + for (var o2 in e3) + i.call(e3, o2) && (t4[o2] = e3[o2]); + return n3.prototype = e3.prototype, t4.prototype = new n3(), t4.__super__ = e3.prototype, t4; + }, i = {}.hasOwnProperty; + t3 = e2.makeElement, e2.PreviewableAttachmentView = function(i2) { + function o2() { + o2.__super__.constructor.apply(this, arguments), this.attachment.previewDelegate = this; + } + return n2(o2, i2), o2.prototype.createContentNodes = function() { + return this.image = t3({tagName: "img", attributes: {src: ""}, data: {trixMutable: true}}), this.refresh(this.image), [this.image]; + }, o2.prototype.createCaptionElement = function() { + var t4; + return t4 = o2.__super__.createCaptionElement.apply(this, arguments), t4.textContent || t4.setAttribute("data-trix-placeholder", e2.config.lang.captionPlaceholder), t4; + }, o2.prototype.refresh = function(t4) { + var e3; + return t4 == null && (t4 = (e3 = this.findElement()) != null ? e3.querySelector("img") : void 0), t4 ? this.updateAttributesForImage(t4) : void 0; + }, o2.prototype.updateAttributesForImage = function(t4) { + var e3, n3, i3, o3, r2, s2; + return r2 = this.attachment.getURL(), n3 = this.attachment.getPreviewURL(), t4.src = n3 || r2, n3 === r2 ? t4.removeAttribute("data-trix-serialized-attributes") : (i3 = JSON.stringify({src: r2}), t4.setAttribute("data-trix-serialized-attributes", i3)), s2 = this.attachment.getWidth(), e3 = this.attachment.getHeight(), s2 != null && (t4.width = s2), e3 != null && (t4.height = e3), o3 = ["imageElement", this.attachment.id, t4.src, t4.width, t4.height].join("/"), t4.dataset.trixStoreKey = o3; + }, o2.prototype.attachmentDidChangeAttributes = function() { + return this.refresh(this.image), this.refresh(); + }, o2; + }(e2.AttachmentView); + }.call(this), function() { + var t3, n2, i, o2 = function(t4, e3) { + function n3() { + this.constructor = t4; + } + for (var i2 in e3) + r2.call(e3, i2) && (t4[i2] = e3[i2]); + return n3.prototype = e3.prototype, t4.prototype = new n3(), t4.__super__ = e3.prototype, t4; + }, r2 = {}.hasOwnProperty; + i = e2.makeElement, t3 = e2.findInnerElement, n2 = e2.getTextConfig, e2.PieceView = function(r3) { + function s2() { + var t4; + s2.__super__.constructor.apply(this, arguments), this.piece = this.object, this.attributes = this.piece.getAttributes(), t4 = this.options, this.textConfig = t4.textConfig, this.context = t4.context, this.piece.attachment ? this.attachment = this.piece.attachment : this.string = this.piece.toString(); + } + var a2; + return o2(s2, r3), s2.prototype.createNodes = function() { + var e3, n3, i2, o3, r4, s3; + if (s3 = this.attachment ? this.createAttachmentNodes() : this.createStringNodes(), e3 = this.createElement()) { + for (i2 = t3(e3), n3 = 0, o3 = s3.length; o3 > n3; n3++) + r4 = s3[n3], i2.appendChild(r4); + s3 = [e3]; + } + return s3; + }, s2.prototype.createAttachmentNodes = function() { + var t4, n3; + return t4 = this.attachment.isPreviewable() ? e2.PreviewableAttachmentView : e2.AttachmentView, n3 = this.createChildView(t4, this.piece.attachment, {piece: this.piece}), n3.getNodes(); + }, s2.prototype.createStringNodes = function() { + var t4, e3, n3, o3, r4, s3, a3, u, c2, l; + if ((u = this.textConfig) != null ? u.plaintext : void 0) + return [document.createTextNode(this.string)]; + for (a3 = [], c2 = this.string.split("\n"), n3 = e3 = 0, o3 = c2.length; o3 > e3; n3 = ++e3) + l = c2[n3], n3 > 0 && (t4 = i("br"), a3.push(t4)), (r4 = l.length) && (s3 = document.createTextNode(this.preserveSpaces(l)), a3.push(s3)); + return a3; + }, s2.prototype.createElement = function() { + var t4, e3, o3, r4, s3, a3, u, c2, l; + c2 = {}, a3 = this.attributes; + for (r4 in a3) + if (l = a3[r4], (t4 = n2(r4)) && (t4.tagName && (s3 = i(t4.tagName), o3 ? (o3.appendChild(s3), o3 = s3) : e3 = o3 = s3), t4.styleProperty && (c2[t4.styleProperty] = l), t4.style)) { + u = t4.style; + for (r4 in u) + l = u[r4], c2[r4] = l; + } + if (Object.keys(c2).length) { + e3 == null && (e3 = i("span")); + for (r4 in c2) + l = c2[r4], e3.style[r4] = l; + } + return e3; + }, s2.prototype.createContainerElement = function() { + var t4, e3, o3, r4, s3; + r4 = this.attributes; + for (o3 in r4) + if (s3 = r4[o3], (e3 = n2(o3)) && e3.groupTagName) + return t4 = {}, t4[o3] = s3, i(e3.groupTagName, t4); + }, a2 = e2.NON_BREAKING_SPACE, s2.prototype.preserveSpaces = function(t4) { + return this.context.isLast && (t4 = t4.replace(/\ $/, a2)), t4 = t4.replace(/(\S)\ {3}(\S)/g, "$1 " + a2 + " $2").replace(/\ {2}/g, a2 + " ").replace(/\ {2}/g, " " + a2), (this.context.isFirst || this.context.followsWhitespace) && (t4 = t4.replace(/^\ /, a2)), t4; + }, s2; + }(e2.ObjectView); + }.call(this), function() { + var t3 = function(t4, e3) { + function i() { + this.constructor = t4; + } + for (var o2 in e3) + n2.call(e3, o2) && (t4[o2] = e3[o2]); + return i.prototype = e3.prototype, t4.prototype = new i(), t4.__super__ = e3.prototype, t4; + }, n2 = {}.hasOwnProperty; + e2.TextView = function(n3) { + function i() { + i.__super__.constructor.apply(this, arguments), this.text = this.object, this.textConfig = this.options.textConfig; + } + var o2; + return t3(i, n3), i.prototype.createNodes = function() { + var t4, n4, i2, r2, s2, a2, u, c2, l, h; + for (a2 = [], c2 = e2.ObjectGroup.groupObjects(this.getPieces()), r2 = c2.length - 1, i2 = n4 = 0, s2 = c2.length; s2 > n4; i2 = ++n4) + u = c2[i2], t4 = {}, i2 === 0 && (t4.isFirst = true), i2 === r2 && (t4.isLast = true), o2(l) && (t4.followsWhitespace = true), h = this.findOrCreateCachedChildView(e2.PieceView, u, {textConfig: this.textConfig, context: t4}), a2.push.apply(a2, h.getNodes()), l = u; + return a2; + }, i.prototype.getPieces = function() { + var t4, e3, n4, i2, o3; + for (i2 = this.text.getPieces(), o3 = [], t4 = 0, e3 = i2.length; e3 > t4; t4++) + n4 = i2[t4], n4.hasAttribute("blockBreak") || o3.push(n4); + return o3; + }, o2 = function(t4) { + return /\s$/.test(t4 != null ? t4.toString() : void 0); + }, i; + }(e2.ObjectView); + }.call(this), function() { + var t3, n2, i, o2 = function(t4, e3) { + function n3() { + this.constructor = t4; + } + for (var i2 in e3) + r2.call(e3, i2) && (t4[i2] = e3[i2]); + return n3.prototype = e3.prototype, t4.prototype = new n3(), t4.__super__ = e3.prototype, t4; + }, r2 = {}.hasOwnProperty; + i = e2.makeElement, n2 = e2.getBlockConfig, t3 = e2.config.css, e2.BlockView = function(r3) { + function s2() { + s2.__super__.constructor.apply(this, arguments), this.block = this.object, this.attributes = this.block.getAttributes(); + } + return o2(s2, r3), s2.prototype.createNodes = function() { + var t4, o3, r4, s3, a2, u, c2, l, h, p2, d; + if (o3 = document.createComment("block"), c2 = [o3], this.block.isEmpty() ? c2.push(i("br")) : (p2 = (l = n2(this.block.getLastAttribute())) != null ? l.text : void 0, d = this.findOrCreateCachedChildView(e2.TextView, this.block.text, {textConfig: p2}), c2.push.apply(c2, d.getNodes()), this.shouldAddExtraNewlineElement() && c2.push(i("br"))), this.attributes.length) + return c2; + for (h = e2.config.blockAttributes["default"].tagName, this.block.isRTL() && (t4 = {dir: "rtl"}), r4 = i({tagName: h, attributes: t4}), s3 = 0, a2 = c2.length; a2 > s3; s3++) + u = c2[s3], r4.appendChild(u); + return [r4]; + }, s2.prototype.createContainerElement = function(e3) { + var o3, r4, s3, a2, u; + return o3 = this.attributes[e3], u = n2(o3).tagName, e3 === 0 && this.block.isRTL() && (r4 = {dir: "rtl"}), o3 === "attachmentGallery" && (a2 = this.block.getBlockBreakPosition(), s3 = t3.attachmentGallery + " " + t3.attachmentGallery + "--" + a2), i({tagName: u, className: s3, attributes: r4}); + }, s2.prototype.shouldAddExtraNewlineElement = function() { + return /\n\n$/.test(this.block.toString()); + }, s2; + }(e2.ObjectView); + }.call(this), function() { + var t3, n2, i = function(t4, e3) { + function n3() { + this.constructor = t4; + } + for (var i2 in e3) + o2.call(e3, i2) && (t4[i2] = e3[i2]); + return n3.prototype = e3.prototype, t4.prototype = new n3(), t4.__super__ = e3.prototype, t4; + }, o2 = {}.hasOwnProperty; + t3 = e2.defer, n2 = e2.makeElement, e2.DocumentView = function(o3) { + function r2() { + r2.__super__.constructor.apply(this, arguments), this.element = this.options.element, this.elementStore = new e2.ElementStore(), this.setDocument(this.object); + } + var s2, a2, u; + return i(r2, o3), r2.render = function(t4) { + var e3, i2; + return e3 = n2("div"), i2 = new this(t4, {element: e3}), i2.render(), i2.sync(), e3; + }, r2.prototype.setDocument = function(t4) { + return t4.isEqualTo(this.document) ? void 0 : this.document = this.object = t4; + }, r2.prototype.render = function() { + var t4, i2, o4, r3, s3, a3, u2; + if (this.childViews = [], this.shadowElement = n2("div"), !this.document.isEmpty()) { + for (s3 = e2.ObjectGroup.groupObjects(this.document.getBlocks(), {asTree: true}), a3 = [], t4 = 0, i2 = s3.length; i2 > t4; t4++) + r3 = s3[t4], u2 = this.findOrCreateCachedChildView(e2.BlockView, r3), a3.push(function() { + var t5, e3, n3, i3; + for (n3 = u2.getNodes(), i3 = [], t5 = 0, e3 = n3.length; e3 > t5; t5++) + o4 = n3[t5], i3.push(this.shadowElement.appendChild(o4)); + return i3; + }.call(this)); + return a3; + } + }, r2.prototype.isSynced = function() { + return s2(this.shadowElement, this.element); + }, r2.prototype.sync = function() { + var t4; + for (t4 = this.createDocumentFragmentForSync(); this.element.lastChild; ) + this.element.removeChild(this.element.lastChild); + return this.element.appendChild(t4), this.didSync(); + }, r2.prototype.didSync = function() { + return this.elementStore.reset(a2(this.element)), t3(function(t4) { + return function() { + return t4.garbageCollectCachedViews(); + }; + }(this)); + }, r2.prototype.createDocumentFragmentForSync = function() { + var t4, e3, n3, i2, o4, r3, s3, u2, c2, l; + for (e3 = document.createDocumentFragment(), u2 = this.shadowElement.childNodes, n3 = 0, o4 = u2.length; o4 > n3; n3++) + s3 = u2[n3], e3.appendChild(s3.cloneNode(true)); + for (c2 = a2(e3), i2 = 0, r3 = c2.length; r3 > i2; i2++) + t4 = c2[i2], (l = this.elementStore.remove(t4)) && t4.parentNode.replaceChild(l, t4); + return e3; + }, a2 = function(t4) { + return t4.querySelectorAll("[data-trix-store-key]"); + }, s2 = function(t4, e3) { + return u(t4.innerHTML) === u(e3.innerHTML); + }, u = function(t4) { + return t4.replace(/ /g, " "); + }, r2; + }(e2.ObjectView); + }.call(this), function() { + var t3, n2, i, o2, r2, s2 = function(t4, e3) { + return function() { + return t4.apply(e3, arguments); + }; + }, a2 = function(t4, e3) { + function n3() { + this.constructor = t4; + } + for (var i2 in e3) + u.call(e3, i2) && (t4[i2] = e3[i2]); + return n3.prototype = e3.prototype, t4.prototype = new n3(), t4.__super__ = e3.prototype, t4; + }, u = {}.hasOwnProperty; + i = e2.findClosestElementFromNode, o2 = e2.handleEvent, r2 = e2.innerElementIsActive, n2 = e2.defer, t3 = e2.AttachmentView.attachmentSelector, e2.CompositionController = function(u2) { + function c2(n3, i2) { + this.element = n3, this.composition = i2, this.didClickAttachment = s2(this.didClickAttachment, this), this.didBlur = s2(this.didBlur, this), this.didFocus = s2(this.didFocus, this), this.documentView = new e2.DocumentView(this.composition.document, {element: this.element}), o2("focus", {onElement: this.element, withCallback: this.didFocus}), o2("blur", {onElement: this.element, withCallback: this.didBlur}), o2("click", {onElement: this.element, matchingSelector: "a[contenteditable=false]", preventDefault: true}), o2("mousedown", {onElement: this.element, matchingSelector: t3, withCallback: this.didClickAttachment}), o2("click", {onElement: this.element, matchingSelector: "a" + t3, preventDefault: true}); + } + return a2(c2, u2), c2.prototype.didFocus = function() { + var t4, e3, n3; + return t4 = function(t5) { + return function() { + var e4; + return t5.focused ? void 0 : (t5.focused = true, (e4 = t5.delegate) != null && typeof e4.compositionControllerDidFocus == "function" ? e4.compositionControllerDidFocus() : void 0); + }; + }(this), (e3 = (n3 = this.blurPromise) != null ? n3.then(t4) : void 0) != null ? e3 : t4(); + }, c2.prototype.didBlur = function() { + return this.blurPromise = new Promise(function(t4) { + return function(e3) { + return n2(function() { + var n3; + return r2(t4.element) || (t4.focused = null, (n3 = t4.delegate) != null && typeof n3.compositionControllerDidBlur == "function" && n3.compositionControllerDidBlur()), t4.blurPromise = null, e3(); + }); + }; + }(this)); + }, c2.prototype.didClickAttachment = function(t4, e3) { + var n3, o3, r3; + return n3 = this.findAttachmentForElement(e3), o3 = i(t4.target, {matchingSelector: "figcaption"}) != null, (r3 = this.delegate) != null && typeof r3.compositionControllerDidSelectAttachment == "function" ? r3.compositionControllerDidSelectAttachment(n3, {editCaption: o3}) : void 0; + }, c2.prototype.getSerializableElement = function() { + return this.isEditingAttachment() ? this.documentView.shadowElement : this.element; + }, c2.prototype.render = function() { + var t4, e3, n3; + return this.revision !== this.composition.revision && (this.documentView.setDocument(this.composition.document), this.documentView.render(), this.revision = this.composition.revision), this.canSyncDocumentView() && !this.documentView.isSynced() && ((t4 = this.delegate) != null && typeof t4.compositionControllerWillSyncDocumentView == "function" && t4.compositionControllerWillSyncDocumentView(), this.documentView.sync(), (e3 = this.delegate) != null && typeof e3.compositionControllerDidSyncDocumentView == "function" && e3.compositionControllerDidSyncDocumentView()), (n3 = this.delegate) != null && typeof n3.compositionControllerDidRender == "function" ? n3.compositionControllerDidRender() : void 0; + }, c2.prototype.rerenderViewForObject = function(t4) { + return this.invalidateViewForObject(t4), this.render(); + }, c2.prototype.invalidateViewForObject = function(t4) { + return this.documentView.invalidateViewForObject(t4); + }, c2.prototype.isViewCachingEnabled = function() { + return this.documentView.isViewCachingEnabled(); + }, c2.prototype.enableViewCaching = function() { + return this.documentView.enableViewCaching(); + }, c2.prototype.disableViewCaching = function() { + return this.documentView.disableViewCaching(); + }, c2.prototype.refreshViewCache = function() { + return this.documentView.garbageCollectCachedViews(); + }, c2.prototype.isEditingAttachment = function() { + return this.attachmentEditor != null; + }, c2.prototype.installAttachmentEditorForAttachment = function(t4, n3) { + var i2, o3, r3; + if (((r3 = this.attachmentEditor) != null ? r3.attachment : void 0) !== t4 && (o3 = this.documentView.findElementForObject(t4))) + return this.uninstallAttachmentEditor(), i2 = this.composition.document.getAttachmentPieceForAttachment(t4), this.attachmentEditor = new e2.AttachmentEditorController(i2, o3, this.element, n3), this.attachmentEditor.delegate = this; + }, c2.prototype.uninstallAttachmentEditor = function() { + var t4; + return (t4 = this.attachmentEditor) != null ? t4.uninstall() : void 0; + }, c2.prototype.didUninstallAttachmentEditor = function() { + return this.attachmentEditor = null, this.render(); + }, c2.prototype.attachmentEditorDidRequestUpdatingAttributesForAttachment = function(t4, e3) { + var n3; + return (n3 = this.delegate) != null && typeof n3.compositionControllerWillUpdateAttachment == "function" && n3.compositionControllerWillUpdateAttachment(e3), this.composition.updateAttributesForAttachment(t4, e3); + }, c2.prototype.attachmentEditorDidRequestRemovingAttributeForAttachment = function(t4, e3) { + var n3; + return (n3 = this.delegate) != null && typeof n3.compositionControllerWillUpdateAttachment == "function" && n3.compositionControllerWillUpdateAttachment(e3), this.composition.removeAttributeForAttachment(t4, e3); + }, c2.prototype.attachmentEditorDidRequestRemovalOfAttachment = function(t4) { + var e3; + return (e3 = this.delegate) != null && typeof e3.compositionControllerDidRequestRemovalOfAttachment == "function" ? e3.compositionControllerDidRequestRemovalOfAttachment(t4) : void 0; + }, c2.prototype.attachmentEditorDidRequestDeselectingAttachment = function(t4) { + var e3; + return (e3 = this.delegate) != null && typeof e3.compositionControllerDidRequestDeselectingAttachment == "function" ? e3.compositionControllerDidRequestDeselectingAttachment(t4) : void 0; + }, c2.prototype.canSyncDocumentView = function() { + return !this.isEditingAttachment(); + }, c2.prototype.findAttachmentForElement = function(t4) { + return this.composition.document.getAttachmentById(parseInt(t4.dataset.trixId, 10)); + }, c2; + }(e2.BasicObject); + }.call(this), function() { + var t3, n2, i, o2 = function(t4, e3) { + return function() { + return t4.apply(e3, arguments); + }; + }, r2 = function(t4, e3) { + function n3() { + this.constructor = t4; + } + for (var i2 in e3) + s2.call(e3, i2) && (t4[i2] = e3[i2]); + return n3.prototype = e3.prototype, t4.prototype = new n3(), t4.__super__ = e3.prototype, t4; + }, s2 = {}.hasOwnProperty; + n2 = e2.handleEvent, i = e2.triggerEvent, t3 = e2.findClosestElementFromNode, e2.ToolbarController = function(e3) { + function s3(t4) { + this.element = t4, this.didKeyDownDialogInput = o2(this.didKeyDownDialogInput, this), this.didClickDialogButton = o2(this.didClickDialogButton, this), this.didClickAttributeButton = o2(this.didClickAttributeButton, this), this.didClickActionButton = o2(this.didClickActionButton, this), this.attributes = {}, this.actions = {}, this.resetDialogInputs(), n2("mousedown", {onElement: this.element, matchingSelector: a2, withCallback: this.didClickActionButton}), n2("mousedown", {onElement: this.element, matchingSelector: c2, withCallback: this.didClickAttributeButton}), n2("click", {onElement: this.element, matchingSelector: v, preventDefault: true}), n2("click", {onElement: this.element, matchingSelector: l, withCallback: this.didClickDialogButton}), n2("keydown", {onElement: this.element, matchingSelector: h, withCallback: this.didKeyDownDialogInput}); + } + var a2, u, c2, l, h, p2, d, f, g, m, v; + return r2(s3, e3), c2 = "[data-trix-attribute]", a2 = "[data-trix-action]", v = c2 + ", " + a2, p2 = "[data-trix-dialog]", u = p2 + "[data-trix-active]", l = p2 + " [data-trix-method]", h = p2 + " [data-trix-input]", s3.prototype.didClickActionButton = function(t4, e4) { + var n3, i2, o3; + return (i2 = this.delegate) != null && i2.toolbarDidClickButton(), t4.preventDefault(), n3 = d(e4), this.getDialog(n3) ? this.toggleDialog(n3) : (o3 = this.delegate) != null ? o3.toolbarDidInvokeAction(n3) : void 0; + }, s3.prototype.didClickAttributeButton = function(t4, e4) { + var n3, i2, o3; + return (i2 = this.delegate) != null && i2.toolbarDidClickButton(), t4.preventDefault(), n3 = f(e4), this.getDialog(n3) ? this.toggleDialog(n3) : (o3 = this.delegate) != null && o3.toolbarDidToggleAttribute(n3), this.refreshAttributeButtons(); + }, s3.prototype.didClickDialogButton = function(e4, n3) { + var i2, o3; + return i2 = t3(n3, {matchingSelector: p2}), o3 = n3.getAttribute("data-trix-method"), this[o3].call(this, i2); + }, s3.prototype.didKeyDownDialogInput = function(t4, e4) { + var n3, i2; + return t4.keyCode === 13 && (t4.preventDefault(), n3 = e4.getAttribute("name"), i2 = this.getDialog(n3), this.setAttribute(i2)), t4.keyCode === 27 ? (t4.preventDefault(), this.hideDialog()) : void 0; + }, s3.prototype.updateActions = function(t4) { + return this.actions = t4, this.refreshActionButtons(); + }, s3.prototype.refreshActionButtons = function() { + return this.eachActionButton(function(t4) { + return function(e4, n3) { + return e4.disabled = t4.actions[n3] === false; + }; + }(this)); + }, s3.prototype.eachActionButton = function(t4) { + var e4, n3, i2, o3, r3; + for (o3 = this.element.querySelectorAll(a2), r3 = [], n3 = 0, i2 = o3.length; i2 > n3; n3++) + e4 = o3[n3], r3.push(t4(e4, d(e4))); + return r3; + }, s3.prototype.updateAttributes = function(t4) { + return this.attributes = t4, this.refreshAttributeButtons(); + }, s3.prototype.refreshAttributeButtons = function() { + return this.eachAttributeButton(function(t4) { + return function(e4, n3) { + return e4.disabled = t4.attributes[n3] === false, t4.attributes[n3] || t4.dialogIsVisible(n3) ? (e4.setAttribute("data-trix-active", ""), e4.classList.add("trix-active")) : (e4.removeAttribute("data-trix-active"), e4.classList.remove("trix-active")); + }; + }(this)); + }, s3.prototype.eachAttributeButton = function(t4) { + var e4, n3, i2, o3, r3; + for (o3 = this.element.querySelectorAll(c2), r3 = [], n3 = 0, i2 = o3.length; i2 > n3; n3++) + e4 = o3[n3], r3.push(t4(e4, f(e4))); + return r3; + }, s3.prototype.applyKeyboardCommand = function(t4) { + var e4, n3, o3, r3, s4, a3, u2; + for (s4 = JSON.stringify(t4.sort()), u2 = this.element.querySelectorAll("[data-trix-key]"), r3 = 0, a3 = u2.length; a3 > r3; r3++) + if (e4 = u2[r3], o3 = e4.getAttribute("data-trix-key").split("+"), n3 = JSON.stringify(o3.sort()), n3 === s4) + return i("mousedown", {onElement: e4}), true; + return false; + }, s3.prototype.dialogIsVisible = function(t4) { + var e4; + return (e4 = this.getDialog(t4)) ? e4.hasAttribute("data-trix-active") : void 0; + }, s3.prototype.toggleDialog = function(t4) { + return this.dialogIsVisible(t4) ? this.hideDialog() : this.showDialog(t4); + }, s3.prototype.showDialog = function(t4) { + var e4, n3, i2, o3, r3, s4, a3, u2, c3, l2; + for (this.hideDialog(), (a3 = this.delegate) != null && a3.toolbarWillShowDialog(), i2 = this.getDialog(t4), i2.setAttribute("data-trix-active", ""), i2.classList.add("trix-active"), u2 = i2.querySelectorAll("input[disabled]"), o3 = 0, s4 = u2.length; s4 > o3; o3++) + n3 = u2[o3], n3.removeAttribute("disabled"); + return (e4 = f(i2)) && (r3 = m(i2, t4)) && (r3.value = (c3 = this.attributes[e4]) != null ? c3 : "", r3.select()), (l2 = this.delegate) != null ? l2.toolbarDidShowDialog(t4) : void 0; + }, s3.prototype.setAttribute = function(t4) { + var e4, n3, i2; + return e4 = f(t4), n3 = m(t4, e4), n3.willValidate && !n3.checkValidity() ? (n3.setAttribute("data-trix-validate", ""), n3.classList.add("trix-validate"), n3.focus()) : ((i2 = this.delegate) != null && i2.toolbarDidUpdateAttribute(e4, n3.value), this.hideDialog()); + }, s3.prototype.removeAttribute = function(t4) { + var e4, n3; + return e4 = f(t4), (n3 = this.delegate) != null && n3.toolbarDidRemoveAttribute(e4), this.hideDialog(); + }, s3.prototype.hideDialog = function() { + var t4, e4; + return (t4 = this.element.querySelector(u)) ? (t4.removeAttribute("data-trix-active"), t4.classList.remove("trix-active"), this.resetDialogInputs(), (e4 = this.delegate) != null ? e4.toolbarDidHideDialog(g(t4)) : void 0) : void 0; + }, s3.prototype.resetDialogInputs = function() { + var t4, e4, n3, i2, o3; + for (i2 = this.element.querySelectorAll(h), o3 = [], t4 = 0, n3 = i2.length; n3 > t4; t4++) + e4 = i2[t4], e4.setAttribute("disabled", "disabled"), e4.removeAttribute("data-trix-validate"), o3.push(e4.classList.remove("trix-validate")); + return o3; + }, s3.prototype.getDialog = function(t4) { + return this.element.querySelector("[data-trix-dialog=" + t4 + "]"); + }, m = function(t4, e4) { + return e4 == null && (e4 = f(t4)), t4.querySelector("[data-trix-input][name='" + e4 + "']"); + }, d = function(t4) { + return t4.getAttribute("data-trix-action"); + }, f = function(t4) { + var e4; + return (e4 = t4.getAttribute("data-trix-attribute")) != null ? e4 : t4.getAttribute("data-trix-dialog-attribute"); + }, g = function(t4) { + return t4.getAttribute("data-trix-dialog"); + }, s3; + }(e2.BasicObject); + }.call(this), function() { + var t3 = function(t4, e3) { + function i() { + this.constructor = t4; + } + for (var o2 in e3) + n2.call(e3, o2) && (t4[o2] = e3[o2]); + return i.prototype = e3.prototype, t4.prototype = new i(), t4.__super__ = e3.prototype, t4; + }, n2 = {}.hasOwnProperty; + e2.ImagePreloadOperation = function(e3) { + function n3(t4) { + this.url = t4; + } + return t3(n3, e3), n3.prototype.perform = function(t4) { + var e4; + return e4 = new Image(), e4.onload = function(n4) { + return function() { + return e4.width = n4.width = e4.naturalWidth, e4.height = n4.height = e4.naturalHeight, t4(true, e4); + }; + }(this), e4.onerror = function() { + return t4(false); + }, e4.src = this.url; + }, n3; + }(e2.Operation); + }.call(this), function() { + var t3 = function(t4, e3) { + return function() { + return t4.apply(e3, arguments); + }; + }, n2 = function(t4, e3) { + function n3() { + this.constructor = t4; + } + for (var o2 in e3) + i.call(e3, o2) && (t4[o2] = e3[o2]); + return n3.prototype = e3.prototype, t4.prototype = new n3(), t4.__super__ = e3.prototype, t4; + }, i = {}.hasOwnProperty; + e2.Attachment = function(i2) { + function o2(n3) { + n3 == null && (n3 = {}), this.releaseFile = t3(this.releaseFile, this), o2.__super__.constructor.apply(this, arguments), this.attributes = e2.Hash.box(n3), this.didChangeAttributes(); + } + return n2(o2, i2), o2.previewablePattern = /^image(\/(gif|png|jpe?g)|$)/, o2.attachmentForFile = function(t4) { + var e3, n3; + return n3 = this.attributesForFile(t4), e3 = new this(n3), e3.setFile(t4), e3; + }, o2.attributesForFile = function(t4) { + return new e2.Hash({filename: t4.name, filesize: t4.size, contentType: t4.type}); + }, o2.fromJSON = function(t4) { + return new this(t4); + }, o2.prototype.getAttribute = function(t4) { + return this.attributes.get(t4); + }, o2.prototype.hasAttribute = function(t4) { + return this.attributes.has(t4); + }, o2.prototype.getAttributes = function() { + return this.attributes.toObject(); + }, o2.prototype.setAttributes = function(t4) { + var e3, n3, i3; + return t4 == null && (t4 = {}), e3 = this.attributes.merge(t4), this.attributes.isEqualTo(e3) ? void 0 : (this.attributes = e3, this.didChangeAttributes(), (n3 = this.previewDelegate) != null && typeof n3.attachmentDidChangeAttributes == "function" && n3.attachmentDidChangeAttributes(this), (i3 = this.delegate) != null && typeof i3.attachmentDidChangeAttributes == "function" ? i3.attachmentDidChangeAttributes(this) : void 0); + }, o2.prototype.didChangeAttributes = function() { + return this.isPreviewable() ? this.preloadURL() : void 0; + }, o2.prototype.isPending = function() { + return this.file != null && !(this.getURL() || this.getHref()); + }, o2.prototype.isPreviewable = function() { + return this.attributes.has("previewable") ? this.attributes.get("previewable") : this.constructor.previewablePattern.test(this.getContentType()); + }, o2.prototype.getType = function() { + return this.hasContent() ? "content" : this.isPreviewable() ? "preview" : "file"; + }, o2.prototype.getURL = function() { + return this.attributes.get("url"); + }, o2.prototype.getHref = function() { + return this.attributes.get("href"); + }, o2.prototype.getFilename = function() { + var t4; + return (t4 = this.attributes.get("filename")) != null ? t4 : ""; + }, o2.prototype.getFilesize = function() { + return this.attributes.get("filesize"); + }, o2.prototype.getFormattedFilesize = function() { + var t4; + return t4 = this.attributes.get("filesize"), typeof t4 == "number" ? e2.config.fileSize.formatter(t4) : ""; + }, o2.prototype.getExtension = function() { + var t4; + return (t4 = this.getFilename().match(/\.(\w+)$/)) != null ? t4[1].toLowerCase() : void 0; + }, o2.prototype.getContentType = function() { + return this.attributes.get("contentType"); + }, o2.prototype.hasContent = function() { + return this.attributes.has("content"); + }, o2.prototype.getContent = function() { + return this.attributes.get("content"); + }, o2.prototype.getWidth = function() { + return this.attributes.get("width"); + }, o2.prototype.getHeight = function() { + return this.attributes.get("height"); + }, o2.prototype.getFile = function() { + return this.file; + }, o2.prototype.setFile = function(t4) { + return this.file = t4, this.isPreviewable() ? this.preloadFile() : void 0; + }, o2.prototype.releaseFile = function() { + return this.releasePreloadedFile(), this.file = null; + }, o2.prototype.getUploadProgress = function() { + var t4; + return (t4 = this.uploadProgress) != null ? t4 : 0; + }, o2.prototype.setUploadProgress = function(t4) { + var e3; + return this.uploadProgress !== t4 ? (this.uploadProgress = t4, (e3 = this.uploadProgressDelegate) != null && typeof e3.attachmentDidChangeUploadProgress == "function" ? e3.attachmentDidChangeUploadProgress(this) : void 0) : void 0; + }, o2.prototype.toJSON = function() { + return this.getAttributes(); + }, o2.prototype.getCacheKey = function() { + return [o2.__super__.getCacheKey.apply(this, arguments), this.attributes.getCacheKey(), this.getPreviewURL()].join("/"); + }, o2.prototype.getPreviewURL = function() { + return this.previewURL || this.preloadingURL; + }, o2.prototype.setPreviewURL = function(t4) { + var e3, n3; + return t4 !== this.getPreviewURL() ? (this.previewURL = t4, (e3 = this.previewDelegate) != null && typeof e3.attachmentDidChangeAttributes == "function" && e3.attachmentDidChangeAttributes(this), (n3 = this.delegate) != null && typeof n3.attachmentDidChangePreviewURL == "function" ? n3.attachmentDidChangePreviewURL(this) : void 0) : void 0; + }, o2.prototype.preloadURL = function() { + return this.preload(this.getURL(), this.releaseFile); + }, o2.prototype.preloadFile = function() { + return this.file ? (this.fileObjectURL = URL.createObjectURL(this.file), this.preload(this.fileObjectURL)) : void 0; + }, o2.prototype.releasePreloadedFile = function() { + return this.fileObjectURL ? (URL.revokeObjectURL(this.fileObjectURL), this.fileObjectURL = null) : void 0; + }, o2.prototype.preload = function(t4, n3) { + var i3; + return t4 && t4 !== this.getPreviewURL() ? (this.preloadingURL = t4, i3 = new e2.ImagePreloadOperation(t4), i3.then(function(e3) { + return function(i4) { + var o3, r2; + return r2 = i4.width, o3 = i4.height, e3.getWidth() && e3.getHeight() || e3.setAttributes({width: r2, height: o3}), e3.preloadingURL = null, e3.setPreviewURL(t4), typeof n3 == "function" ? n3() : void 0; + }; + }(this))["catch"](function(t5) { + return function() { + return t5.preloadingURL = null, typeof n3 == "function" ? n3() : void 0; + }; + }(this))) : void 0; + }, o2; + }(e2.Object); + }.call(this), function() { + var t3 = function(t4, e3) { + function i() { + this.constructor = t4; + } + for (var o2 in e3) + n2.call(e3, o2) && (t4[o2] = e3[o2]); + return i.prototype = e3.prototype, t4.prototype = new i(), t4.__super__ = e3.prototype, t4; + }, n2 = {}.hasOwnProperty; + e2.Piece = function(n3) { + function i(t4, n4) { + n4 == null && (n4 = {}), i.__super__.constructor.apply(this, arguments), this.attributes = e2.Hash.box(n4); + } + return t3(i, n3), i.types = {}, i.registerType = function(t4, e3) { + return e3.type = t4, this.types[t4] = e3; + }, i.fromJSON = function(t4) { + var e3; + return (e3 = this.types[t4.type]) ? e3.fromJSON(t4) : void 0; + }, i.prototype.copyWithAttributes = function(t4) { + return new this.constructor(this.getValue(), t4); + }, i.prototype.copyWithAdditionalAttributes = function(t4) { + return this.copyWithAttributes(this.attributes.merge(t4)); + }, i.prototype.copyWithoutAttribute = function(t4) { + return this.copyWithAttributes(this.attributes.remove(t4)); + }, i.prototype.copy = function() { + return this.copyWithAttributes(this.attributes); + }, i.prototype.getAttribute = function(t4) { + return this.attributes.get(t4); + }, i.prototype.getAttributesHash = function() { + return this.attributes; + }, i.prototype.getAttributes = function() { + return this.attributes.toObject(); + }, i.prototype.getCommonAttributes = function() { + var t4, e3, n4; + return (n4 = pieceList.getPieceAtIndex(0)) ? (t4 = n4.attributes, e3 = t4.getKeys(), pieceList.eachPiece(function(n5) { + return e3 = t4.getKeysCommonToHash(n5.attributes), t4 = t4.slice(e3); + }), t4.toObject()) : {}; + }, i.prototype.hasAttribute = function(t4) { + return this.attributes.has(t4); + }, i.prototype.hasSameStringValueAsPiece = function(t4) { + return t4 != null && this.toString() === t4.toString(); + }, i.prototype.hasSameAttributesAsPiece = function(t4) { + return t4 != null && (this.attributes === t4.attributes || this.attributes.isEqualTo(t4.attributes)); + }, i.prototype.isBlockBreak = function() { + return false; + }, i.prototype.isEqualTo = function(t4) { + return i.__super__.isEqualTo.apply(this, arguments) || this.hasSameConstructorAs(t4) && this.hasSameStringValueAsPiece(t4) && this.hasSameAttributesAsPiece(t4); + }, i.prototype.isEmpty = function() { + return this.length === 0; + }, i.prototype.isSerializable = function() { + return true; + }, i.prototype.toJSON = function() { + return {type: this.constructor.type, attributes: this.getAttributes()}; + }, i.prototype.contentsForInspection = function() { + return {type: this.constructor.type, attributes: this.attributes.inspect()}; + }, i.prototype.canBeGrouped = function() { + return this.hasAttribute("href"); + }, i.prototype.canBeGroupedWith = function(t4) { + return this.getAttribute("href") === t4.getAttribute("href"); + }, i.prototype.getLength = function() { + return this.length; + }, i.prototype.canBeConsolidatedWith = function() { + return false; + }, i; + }(e2.Object); + }.call(this), function() { + var t3 = function(t4, e3) { + function i() { + this.constructor = t4; + } + for (var o2 in e3) + n2.call(e3, o2) && (t4[o2] = e3[o2]); + return i.prototype = e3.prototype, t4.prototype = new i(), t4.__super__ = e3.prototype, t4; + }, n2 = {}.hasOwnProperty; + e2.Piece.registerType("attachment", e2.AttachmentPiece = function(n3) { + function i(t4) { + this.attachment = t4, i.__super__.constructor.apply(this, arguments), this.length = 1, this.ensureAttachmentExclusivelyHasAttribute("href"), this.attachment.hasContent() || this.removeProhibitedAttributes(); + } + return t3(i, n3), i.fromJSON = function(t4) { + return new this(e2.Attachment.fromJSON(t4.attachment), t4.attributes); + }, i.permittedAttributes = ["caption", "presentation"], i.prototype.ensureAttachmentExclusivelyHasAttribute = function(t4) { + return this.hasAttribute(t4) ? (this.attachment.hasAttribute(t4) || this.attachment.setAttributes(this.attributes.slice(t4)), this.attributes = this.attributes.remove(t4)) : void 0; + }, i.prototype.removeProhibitedAttributes = function() { + var t4; + return t4 = this.attributes.slice(this.constructor.permittedAttributes), t4.isEqualTo(this.attributes) ? void 0 : this.attributes = t4; + }, i.prototype.getValue = function() { + return this.attachment; + }, i.prototype.isSerializable = function() { + return !this.attachment.isPending(); + }, i.prototype.getCaption = function() { + var t4; + return (t4 = this.attributes.get("caption")) != null ? t4 : ""; + }, i.prototype.isEqualTo = function(t4) { + var e3; + return i.__super__.isEqualTo.apply(this, arguments) && this.attachment.id === (t4 != null && (e3 = t4.attachment) != null ? e3.id : void 0); + }, i.prototype.toString = function() { + return e2.OBJECT_REPLACEMENT_CHARACTER; + }, i.prototype.toJSON = function() { + var t4; + return t4 = i.__super__.toJSON.apply(this, arguments), t4.attachment = this.attachment, t4; + }, i.prototype.getCacheKey = function() { + return [i.__super__.getCacheKey.apply(this, arguments), this.attachment.getCacheKey()].join("/"); + }, i.prototype.toConsole = function() { + return JSON.stringify(this.toString()); + }, i; + }(e2.Piece)); + }.call(this), function() { + var t3, n2 = function(t4, e3) { + function n3() { + this.constructor = t4; + } + for (var o2 in e3) + i.call(e3, o2) && (t4[o2] = e3[o2]); + return n3.prototype = e3.prototype, t4.prototype = new n3(), t4.__super__ = e3.prototype, t4; + }, i = {}.hasOwnProperty; + t3 = e2.normalizeNewlines, e2.Piece.registerType("string", e2.StringPiece = function(e3) { + function i2(e4) { + i2.__super__.constructor.apply(this, arguments), this.string = t3(e4), this.length = this.string.length; + } + return n2(i2, e3), i2.fromJSON = function(t4) { + return new this(t4.string, t4.attributes); + }, i2.prototype.getValue = function() { + return this.string; + }, i2.prototype.toString = function() { + return this.string.toString(); + }, i2.prototype.isBlockBreak = function() { + return this.toString() === "\n" && this.getAttribute("blockBreak") === true; + }, i2.prototype.toJSON = function() { + var t4; + return t4 = i2.__super__.toJSON.apply(this, arguments), t4.string = this.string, t4; + }, i2.prototype.canBeConsolidatedWith = function(t4) { + return t4 != null && this.hasSameConstructorAs(t4) && this.hasSameAttributesAsPiece(t4); + }, i2.prototype.consolidateWith = function(t4) { + return new this.constructor(this.toString() + t4.toString(), this.attributes); + }, i2.prototype.splitAtOffset = function(t4) { + var e4, n3; + return t4 === 0 ? (e4 = null, n3 = this) : t4 === this.length ? (e4 = this, n3 = null) : (e4 = new this.constructor(this.string.slice(0, t4), this.attributes), n3 = new this.constructor(this.string.slice(t4), this.attributes)), [e4, n3]; + }, i2.prototype.toConsole = function() { + var t4; + return t4 = this.string, t4.length > 15 && (t4 = t4.slice(0, 14) + "\u2026"), JSON.stringify(t4.toString()); + }, i2; + }(e2.Piece)); + }.call(this), function() { + var t3, n2 = function(t4, e3) { + function n3() { + this.constructor = t4; + } + for (var o3 in e3) + i.call(e3, o3) && (t4[o3] = e3[o3]); + return n3.prototype = e3.prototype, t4.prototype = new n3(), t4.__super__ = e3.prototype, t4; + }, i = {}.hasOwnProperty, o2 = [].slice; + t3 = e2.spliceArray, e2.SplittableList = function(e3) { + function i2(t4) { + t4 == null && (t4 = []), i2.__super__.constructor.apply(this, arguments), this.objects = t4.slice(0), this.length = this.objects.length; + } + var r2, s2, a2; + return n2(i2, e3), i2.box = function(t4) { + return t4 instanceof this ? t4 : new this(t4); + }, i2.prototype.indexOf = function(t4) { + return this.objects.indexOf(t4); + }, i2.prototype.splice = function() { + var e4; + return e4 = 1 <= arguments.length ? o2.call(arguments, 0) : [], new this.constructor(t3.apply(null, [this.objects].concat(o2.call(e4)))); + }, i2.prototype.eachObject = function(t4) { + var e4, n3, i3, o3, r3, s3; + for (r3 = this.objects, s3 = [], n3 = e4 = 0, i3 = r3.length; i3 > e4; n3 = ++e4) + o3 = r3[n3], s3.push(t4(o3, n3)); + return s3; + }, i2.prototype.insertObjectAtIndex = function(t4, e4) { + return this.splice(e4, 0, t4); + }, i2.prototype.insertSplittableListAtIndex = function(t4, e4) { + return this.splice.apply(this, [e4, 0].concat(o2.call(t4.objects))); + }, i2.prototype.insertSplittableListAtPosition = function(t4, e4) { + var n3, i3, o3; + return o3 = this.splitObjectAtPosition(e4), i3 = o3[0], n3 = o3[1], new this.constructor(i3).insertSplittableListAtIndex(t4, n3); + }, i2.prototype.editObjectAtIndex = function(t4, e4) { + return this.replaceObjectAtIndex(e4(this.objects[t4]), t4); + }, i2.prototype.replaceObjectAtIndex = function(t4, e4) { + return this.splice(e4, 1, t4); + }, i2.prototype.removeObjectAtIndex = function(t4) { + return this.splice(t4, 1); + }, i2.prototype.getObjectAtIndex = function(t4) { + return this.objects[t4]; + }, i2.prototype.getSplittableListInRange = function(t4) { + var e4, n3, i3, o3; + return i3 = this.splitObjectsAtRange(t4), n3 = i3[0], e4 = i3[1], o3 = i3[2], new this.constructor(n3.slice(e4, o3 + 1)); + }, i2.prototype.selectSplittableList = function(t4) { + var e4, n3; + return n3 = function() { + var n4, i3, o3, r3; + for (o3 = this.objects, r3 = [], n4 = 0, i3 = o3.length; i3 > n4; n4++) + e4 = o3[n4], t4(e4) && r3.push(e4); + return r3; + }.call(this), new this.constructor(n3); + }, i2.prototype.removeObjectsInRange = function(t4) { + var e4, n3, i3, o3; + return i3 = this.splitObjectsAtRange(t4), n3 = i3[0], e4 = i3[1], o3 = i3[2], new this.constructor(n3).splice(e4, o3 - e4 + 1); + }, i2.prototype.transformObjectsInRange = function(t4, e4) { + var n3, i3, o3, r3, s3, a3, u; + return s3 = this.splitObjectsAtRange(t4), r3 = s3[0], i3 = s3[1], a3 = s3[2], u = function() { + var t5, s4, u2; + for (u2 = [], n3 = t5 = 0, s4 = r3.length; s4 > t5; n3 = ++t5) + o3 = r3[n3], u2.push(n3 >= i3 && a3 >= n3 ? e4(o3) : o3); + return u2; + }(), new this.constructor(u); + }, i2.prototype.splitObjectsAtRange = function(t4) { + var e4, n3, i3, o3, s3, u; + return o3 = this.splitObjectAtPosition(a2(t4)), n3 = o3[0], e4 = o3[1], i3 = o3[2], s3 = new this.constructor(n3).splitObjectAtPosition(r2(t4) + i3), n3 = s3[0], u = s3[1], [n3, e4, u - 1]; + }, i2.prototype.getObjectAtPosition = function(t4) { + var e4, n3, i3; + return i3 = this.findIndexAndOffsetAtPosition(t4), e4 = i3.index, n3 = i3.offset, this.objects[e4]; + }, i2.prototype.splitObjectAtPosition = function(t4) { + var e4, n3, i3, o3, r3, s3, a3, u, c2, l; + return s3 = this.findIndexAndOffsetAtPosition(t4), e4 = s3.index, r3 = s3.offset, o3 = this.objects.slice(0), e4 != null ? r3 === 0 ? (c2 = e4, l = 0) : (i3 = this.getObjectAtIndex(e4), a3 = i3.splitAtOffset(r3), n3 = a3[0], u = a3[1], o3.splice(e4, 1, n3, u), c2 = e4 + 1, l = n3.getLength() - r3) : (c2 = o3.length, l = 0), [o3, c2, l]; + }, i2.prototype.consolidate = function() { + var t4, e4, n3, i3, o3, r3; + for (i3 = [], o3 = this.objects[0], r3 = this.objects.slice(1), t4 = 0, e4 = r3.length; e4 > t4; t4++) + n3 = r3[t4], (typeof o3.canBeConsolidatedWith == "function" ? o3.canBeConsolidatedWith(n3) : void 0) ? o3 = o3.consolidateWith(n3) : (i3.push(o3), o3 = n3); + return o3 != null && i3.push(o3), new this.constructor(i3); + }, i2.prototype.consolidateFromIndexToIndex = function(t4, e4) { + var n3, i3, r3; + return i3 = this.objects.slice(0), r3 = i3.slice(t4, e4 + 1), n3 = new this.constructor(r3).consolidate().toArray(), this.splice.apply(this, [t4, r3.length].concat(o2.call(n3))); + }, i2.prototype.findIndexAndOffsetAtPosition = function(t4) { + var e4, n3, i3, o3, r3, s3, a3; + for (e4 = 0, a3 = this.objects, i3 = n3 = 0, o3 = a3.length; o3 > n3; i3 = ++n3) { + if (s3 = a3[i3], r3 = e4 + s3.getLength(), t4 >= e4 && r3 > t4) + return {index: i3, offset: t4 - e4}; + e4 = r3; + } + return {index: null, offset: null}; + }, i2.prototype.findPositionAtIndexAndOffset = function(t4, e4) { + var n3, i3, o3, r3, s3, a3; + for (s3 = 0, a3 = this.objects, n3 = i3 = 0, o3 = a3.length; o3 > i3; n3 = ++i3) + if (r3 = a3[n3], t4 > n3) + s3 += r3.getLength(); + else if (n3 === t4) { + s3 += e4; + break; + } + return s3; + }, i2.prototype.getEndPosition = function() { + var t4, e4; + return this.endPosition != null ? this.endPosition : this.endPosition = function() { + var n3, i3, o3; + for (e4 = 0, o3 = this.objects, n3 = 0, i3 = o3.length; i3 > n3; n3++) + t4 = o3[n3], e4 += t4.getLength(); + return e4; + }.call(this); + }, i2.prototype.toString = function() { + return this.objects.join(""); + }, i2.prototype.toArray = function() { + return this.objects.slice(0); + }, i2.prototype.toJSON = function() { + return this.toArray(); + }, i2.prototype.isEqualTo = function(t4) { + return i2.__super__.isEqualTo.apply(this, arguments) || s2(this.objects, t4 != null ? t4.objects : void 0); + }, s2 = function(t4, e4) { + var n3, i3, o3, r3, s3; + if (e4 == null && (e4 = []), t4.length !== e4.length) + return false; + for (s3 = true, i3 = n3 = 0, o3 = t4.length; o3 > n3; i3 = ++n3) + r3 = t4[i3], s3 && !r3.isEqualTo(e4[i3]) && (s3 = false); + return s3; + }, i2.prototype.contentsForInspection = function() { + var t4; + return {objects: "[" + function() { + var e4, n3, i3, o3; + for (i3 = this.objects, o3 = [], e4 = 0, n3 = i3.length; n3 > e4; e4++) + t4 = i3[e4], o3.push(t4.inspect()); + return o3; + }.call(this).join(", ") + "]"}; + }, a2 = function(t4) { + return t4[0]; + }, r2 = function(t4) { + return t4[1]; + }, i2; + }(e2.Object); + }.call(this), function() { + var t3 = function(t4, e3) { + function i() { + this.constructor = t4; + } + for (var o2 in e3) + n2.call(e3, o2) && (t4[o2] = e3[o2]); + return i.prototype = e3.prototype, t4.prototype = new i(), t4.__super__ = e3.prototype, t4; + }, n2 = {}.hasOwnProperty; + e2.Text = function(n3) { + function i(t4) { + var n4; + t4 == null && (t4 = []), i.__super__.constructor.apply(this, arguments), this.pieceList = new e2.SplittableList(function() { + var e3, i2, o2; + for (o2 = [], e3 = 0, i2 = t4.length; i2 > e3; e3++) + n4 = t4[e3], n4.isEmpty() || o2.push(n4); + return o2; + }()); + } + return t3(i, n3), i.textForAttachmentWithAttributes = function(t4, n4) { + var i2; + return i2 = new e2.AttachmentPiece(t4, n4), new this([i2]); + }, i.textForStringWithAttributes = function(t4, n4) { + var i2; + return i2 = new e2.StringPiece(t4, n4), new this([i2]); + }, i.fromJSON = function(t4) { + var n4, i2; + return i2 = function() { + var i3, o2, r2; + for (r2 = [], i3 = 0, o2 = t4.length; o2 > i3; i3++) + n4 = t4[i3], r2.push(e2.Piece.fromJSON(n4)); + return r2; + }(), new this(i2); + }, i.prototype.copy = function() { + return this.copyWithPieceList(this.pieceList); + }, i.prototype.copyWithPieceList = function(t4) { + return new this.constructor(t4.consolidate().toArray()); + }, i.prototype.copyUsingObjectMap = function(t4) { + var e3, n4; + return n4 = function() { + var n5, i2, o2, r2, s2; + for (o2 = this.getPieces(), s2 = [], n5 = 0, i2 = o2.length; i2 > n5; n5++) + e3 = o2[n5], s2.push((r2 = t4.find(e3)) != null ? r2 : e3); + return s2; + }.call(this), new this.constructor(n4); + }, i.prototype.appendText = function(t4) { + return this.insertTextAtPosition(t4, this.getLength()); + }, i.prototype.insertTextAtPosition = function(t4, e3) { + return this.copyWithPieceList(this.pieceList.insertSplittableListAtPosition(t4.pieceList, e3)); + }, i.prototype.removeTextAtRange = function(t4) { + return this.copyWithPieceList(this.pieceList.removeObjectsInRange(t4)); + }, i.prototype.replaceTextAtRange = function(t4, e3) { + return this.removeTextAtRange(e3).insertTextAtPosition(t4, e3[0]); + }, i.prototype.moveTextFromRangeToPosition = function(t4, e3) { + var n4, i2; + if (!(t4[0] <= e3 && e3 <= t4[1])) + return i2 = this.getTextAtRange(t4), n4 = i2.getLength(), t4[0] < e3 && (e3 -= n4), this.removeTextAtRange(t4).insertTextAtPosition(i2, e3); + }, i.prototype.addAttributeAtRange = function(t4, e3, n4) { + var i2; + return i2 = {}, i2[t4] = e3, this.addAttributesAtRange(i2, n4); + }, i.prototype.addAttributesAtRange = function(t4, e3) { + return this.copyWithPieceList(this.pieceList.transformObjectsInRange(e3, function(e4) { + return e4.copyWithAdditionalAttributes(t4); + })); + }, i.prototype.removeAttributeAtRange = function(t4, e3) { + return this.copyWithPieceList(this.pieceList.transformObjectsInRange(e3, function(e4) { + return e4.copyWithoutAttribute(t4); + })); + }, i.prototype.setAttributesAtRange = function(t4, e3) { + return this.copyWithPieceList(this.pieceList.transformObjectsInRange(e3, function(e4) { + return e4.copyWithAttributes(t4); + })); + }, i.prototype.getAttributesAtPosition = function(t4) { + var e3, n4; + return (e3 = (n4 = this.pieceList.getObjectAtPosition(t4)) != null ? n4.getAttributes() : void 0) != null ? e3 : {}; + }, i.prototype.getCommonAttributes = function() { + var t4, n4; + return t4 = function() { + var t5, e3, i2, o2; + for (i2 = this.pieceList.toArray(), o2 = [], t5 = 0, e3 = i2.length; e3 > t5; t5++) + n4 = i2[t5], o2.push(n4.getAttributes()); + return o2; + }.call(this), e2.Hash.fromCommonAttributesOfObjects(t4).toObject(); + }, i.prototype.getCommonAttributesAtRange = function(t4) { + var e3; + return (e3 = this.getTextAtRange(t4).getCommonAttributes()) != null ? e3 : {}; + }, i.prototype.getExpandedRangeForAttributeAtOffset = function(t4, e3) { + var n4, i2, o2; + for (n4 = o2 = e3, i2 = this.getLength(); n4 > 0 && this.getCommonAttributesAtRange([n4 - 1, o2])[t4]; ) + n4--; + for (; i2 > o2 && this.getCommonAttributesAtRange([e3, o2 + 1])[t4]; ) + o2++; + return [n4, o2]; + }, i.prototype.getTextAtRange = function(t4) { + return this.copyWithPieceList(this.pieceList.getSplittableListInRange(t4)); + }, i.prototype.getStringAtRange = function(t4) { + return this.pieceList.getSplittableListInRange(t4).toString(); + }, i.prototype.getStringAtPosition = function(t4) { + return this.getStringAtRange([t4, t4 + 1]); + }, i.prototype.startsWithString = function(t4) { + return this.getStringAtRange([0, t4.length]) === t4; + }, i.prototype.endsWithString = function(t4) { + var e3; + return e3 = this.getLength(), this.getStringAtRange([e3 - t4.length, e3]) === t4; + }, i.prototype.getAttachmentPieces = function() { + var t4, e3, n4, i2, o2; + for (i2 = this.pieceList.toArray(), o2 = [], t4 = 0, e3 = i2.length; e3 > t4; t4++) + n4 = i2[t4], n4.attachment != null && o2.push(n4); + return o2; + }, i.prototype.getAttachments = function() { + var t4, e3, n4, i2, o2; + for (i2 = this.getAttachmentPieces(), o2 = [], t4 = 0, e3 = i2.length; e3 > t4; t4++) + n4 = i2[t4], o2.push(n4.attachment); + return o2; + }, i.prototype.getAttachmentAndPositionById = function(t4) { + var e3, n4, i2, o2, r2, s2; + for (o2 = 0, r2 = this.pieceList.toArray(), e3 = 0, n4 = r2.length; n4 > e3; e3++) { + if (i2 = r2[e3], ((s2 = i2.attachment) != null ? s2.id : void 0) === t4) + return {attachment: i2.attachment, position: o2}; + o2 += i2.length; + } + return {attachment: null, position: null}; + }, i.prototype.getAttachmentById = function(t4) { + var e3, n4, i2; + return i2 = this.getAttachmentAndPositionById(t4), e3 = i2.attachment, n4 = i2.position, e3; + }, i.prototype.getRangeOfAttachment = function(t4) { + var e3, n4; + return n4 = this.getAttachmentAndPositionById(t4.id), t4 = n4.attachment, e3 = n4.position, t4 != null ? [e3, e3 + 1] : void 0; + }, i.prototype.updateAttributesForAttachment = function(t4, e3) { + var n4; + return (n4 = this.getRangeOfAttachment(e3)) ? this.addAttributesAtRange(t4, n4) : this; + }, i.prototype.getLength = function() { + return this.pieceList.getEndPosition(); + }, i.prototype.isEmpty = function() { + return this.getLength() === 0; + }, i.prototype.isEqualTo = function(t4) { + var e3; + return i.__super__.isEqualTo.apply(this, arguments) || (t4 != null && (e3 = t4.pieceList) != null ? e3.isEqualTo(this.pieceList) : void 0); + }, i.prototype.isBlockBreak = function() { + return this.getLength() === 1 && this.pieceList.getObjectAtIndex(0).isBlockBreak(); + }, i.prototype.eachPiece = function(t4) { + return this.pieceList.eachObject(t4); + }, i.prototype.getPieces = function() { + return this.pieceList.toArray(); + }, i.prototype.getPieceAtPosition = function(t4) { + return this.pieceList.getObjectAtPosition(t4); + }, i.prototype.contentsForInspection = function() { + return {pieceList: this.pieceList.inspect()}; + }, i.prototype.toSerializableText = function() { + var t4; + return t4 = this.pieceList.selectSplittableList(function(t5) { + return t5.isSerializable(); + }), this.copyWithPieceList(t4); + }, i.prototype.toString = function() { + return this.pieceList.toString(); + }, i.prototype.toJSON = function() { + return this.pieceList.toJSON(); + }, i.prototype.toConsole = function() { + var t4; + return JSON.stringify(function() { + var e3, n4, i2, o2; + for (i2 = this.pieceList.toArray(), o2 = [], e3 = 0, n4 = i2.length; n4 > e3; e3++) + t4 = i2[e3], o2.push(JSON.parse(t4.toConsole())); + return o2; + }.call(this)); + }, i.prototype.getDirection = function() { + return e2.getDirection(this.toString()); + }, i.prototype.isRTL = function() { + return this.getDirection() === "rtl"; + }, i; + }(e2.Object); + }.call(this), function() { + var t3, n2, i, o2, r2, s2 = function(t4, e3) { + function n3() { + this.constructor = t4; + } + for (var i2 in e3) + a2.call(e3, i2) && (t4[i2] = e3[i2]); + return n3.prototype = e3.prototype, t4.prototype = new n3(), t4.__super__ = e3.prototype, t4; + }, a2 = {}.hasOwnProperty, u = [].indexOf || function(t4) { + for (var e3 = 0, n3 = this.length; n3 > e3; e3++) + if (e3 in this && this[e3] === t4) + return e3; + return -1; + }, c2 = [].slice; + t3 = e2.arraysAreEqual, r2 = e2.spliceArray, i = e2.getBlockConfig, n2 = e2.getBlockAttributeNames, o2 = e2.getListAttributeNames, e2.Block = function(n3) { + function a3(t4, n4) { + t4 == null && (t4 = new e2.Text()), n4 == null && (n4 = []), a3.__super__.constructor.apply(this, arguments), this.text = h(t4), this.attributes = n4; + } + var l, h, p2, d, f, g, m, v, y; + return s2(a3, n3), a3.fromJSON = function(t4) { + var n4; + return n4 = e2.Text.fromJSON(t4.text), new this(n4, t4.attributes); + }, a3.prototype.isEmpty = function() { + return this.text.isBlockBreak(); + }, a3.prototype.isEqualTo = function(e3) { + return a3.__super__.isEqualTo.apply(this, arguments) || this.text.isEqualTo(e3 != null ? e3.text : void 0) && t3(this.attributes, e3 != null ? e3.attributes : void 0); + }, a3.prototype.copyWithText = function(t4) { + return new this.constructor(t4, this.attributes); + }, a3.prototype.copyWithoutText = function() { + return this.copyWithText(null); + }, a3.prototype.copyWithAttributes = function(t4) { + return new this.constructor(this.text, t4); + }, a3.prototype.copyWithoutAttributes = function() { + return this.copyWithAttributes(null); + }, a3.prototype.copyUsingObjectMap = function(t4) { + var e3; + return this.copyWithText((e3 = t4.find(this.text)) ? e3 : this.text.copyUsingObjectMap(t4)); + }, a3.prototype.addAttribute = function(t4) { + var e3; + return e3 = this.attributes.concat(d(t4)), this.copyWithAttributes(e3); + }, a3.prototype.removeAttribute = function(t4) { + var e3, n4; + return n4 = i(t4).listAttribute, e3 = g(g(this.attributes, t4), n4), this.copyWithAttributes(e3); + }, a3.prototype.removeLastAttribute = function() { + return this.removeAttribute(this.getLastAttribute()); + }, a3.prototype.getLastAttribute = function() { + return f(this.attributes); + }, a3.prototype.getAttributes = function() { + return this.attributes.slice(0); + }, a3.prototype.getAttributeLevel = function() { + return this.attributes.length; + }, a3.prototype.getAttributeAtLevel = function(t4) { + return this.attributes[t4 - 1]; + }, a3.prototype.hasAttribute = function(t4) { + return u.call(this.attributes, t4) >= 0; + }, a3.prototype.hasAttributes = function() { + return this.getAttributeLevel() > 0; + }, a3.prototype.getLastNestableAttribute = function() { + return f(this.getNestableAttributes()); + }, a3.prototype.getNestableAttributes = function() { + var t4, e3, n4, o3, r3; + for (o3 = this.attributes, r3 = [], e3 = 0, n4 = o3.length; n4 > e3; e3++) + t4 = o3[e3], i(t4).nestable && r3.push(t4); + return r3; + }, a3.prototype.getNestingLevel = function() { + return this.getNestableAttributes().length; + }, a3.prototype.decreaseNestingLevel = function() { + var t4; + return (t4 = this.getLastNestableAttribute()) ? this.removeAttribute(t4) : this; + }, a3.prototype.increaseNestingLevel = function() { + var t4, e3, n4; + return (t4 = this.getLastNestableAttribute()) ? (n4 = this.attributes.lastIndexOf(t4), e3 = r2.apply(null, [this.attributes, n4 + 1, 0].concat(c2.call(d(t4)))), this.copyWithAttributes(e3)) : this; + }, a3.prototype.getListItemAttributes = function() { + var t4, e3, n4, o3, r3; + for (o3 = this.attributes, r3 = [], e3 = 0, n4 = o3.length; n4 > e3; e3++) + t4 = o3[e3], i(t4).listAttribute && r3.push(t4); + return r3; + }, a3.prototype.isListItem = function() { + var t4; + return (t4 = i(this.getLastAttribute())) != null ? t4.listAttribute : void 0; + }, a3.prototype.isTerminalBlock = function() { + var t4; + return (t4 = i(this.getLastAttribute())) != null ? t4.terminal : void 0; + }, a3.prototype.breaksOnReturn = function() { + var t4; + return (t4 = i(this.getLastAttribute())) != null ? t4.breakOnReturn : void 0; + }, a3.prototype.findLineBreakInDirectionFromPosition = function(t4, e3) { + var n4, i2; + return i2 = this.toString(), n4 = function() { + switch (t4) { + case "forward": + return i2.indexOf("\n", e3); + case "backward": + return i2.slice(0, e3).lastIndexOf("\n"); + } + }(), n4 !== -1 ? n4 : void 0; + }, a3.prototype.contentsForInspection = function() { + return {text: this.text.inspect(), attributes: this.attributes}; + }, a3.prototype.toString = function() { + return this.text.toString(); + }, a3.prototype.toJSON = function() { + return {text: this.text, attributes: this.attributes}; + }, a3.prototype.getDirection = function() { + return this.text.getDirection(); + }, a3.prototype.isRTL = function() { + return this.text.isRTL(); + }, a3.prototype.getLength = function() { + return this.text.getLength(); + }, a3.prototype.canBeConsolidatedWith = function(t4) { + return !this.hasAttributes() && !t4.hasAttributes() && this.getDirection() === t4.getDirection(); + }, a3.prototype.consolidateWith = function(t4) { + var n4, i2; + return n4 = e2.Text.textForStringWithAttributes("\n"), i2 = this.getTextWithoutBlockBreak().appendText(n4), this.copyWithText(i2.appendText(t4.text)); + }, a3.prototype.splitAtOffset = function(t4) { + var e3, n4; + return t4 === 0 ? (e3 = null, n4 = this) : t4 === this.getLength() ? (e3 = this, n4 = null) : (e3 = this.copyWithText(this.text.getTextAtRange([0, t4])), n4 = this.copyWithText(this.text.getTextAtRange([t4, this.getLength()]))), [e3, n4]; + }, a3.prototype.getBlockBreakPosition = function() { + return this.text.getLength() - 1; + }, a3.prototype.getTextWithoutBlockBreak = function() { + return m(this.text) ? this.text.getTextAtRange([0, this.getBlockBreakPosition()]) : this.text.copy(); + }, a3.prototype.canBeGrouped = function(t4) { + return this.attributes[t4]; + }, a3.prototype.canBeGroupedWith = function(t4, e3) { + var n4, r3, s3, a4; + return s3 = t4.getAttributes(), r3 = s3[e3], n4 = this.attributes[e3], !(n4 !== r3 || i(n4).group === false && (a4 = s3[e3 + 1], u.call(o2(), a4) < 0) || this.getDirection() !== t4.getDirection() && !t4.isEmpty()); + }, h = function(t4) { + return t4 = y(t4), t4 = l(t4); + }, y = function(t4) { + var n4, i2, o3, r3, s3, a4; + return r3 = false, a4 = t4.getPieces(), i2 = 2 <= a4.length ? c2.call(a4, 0, n4 = a4.length - 1) : (n4 = 0, []), o3 = a4[n4++], o3 == null ? t4 : (i2 = function() { + var t5, e3, n5; + for (n5 = [], t5 = 0, e3 = i2.length; e3 > t5; t5++) + s3 = i2[t5], s3.isBlockBreak() ? (r3 = true, n5.push(v(s3))) : n5.push(s3); + return n5; + }(), r3 ? new e2.Text(c2.call(i2).concat([o3])) : t4); + }, p2 = e2.Text.textForStringWithAttributes("\n", {blockBreak: true}), l = function(t4) { + return m(t4) ? t4 : t4.appendText(p2); + }, m = function(t4) { + var e3, n4; + return n4 = t4.getLength(), n4 === 0 ? false : (e3 = t4.getTextAtRange([n4 - 1, n4]), e3.isBlockBreak()); + }, v = function(t4) { + return t4.copyWithoutAttribute("blockBreak"); + }, d = function(t4) { + var e3; + return e3 = i(t4).listAttribute, e3 != null ? [e3, t4] : [t4]; + }, f = function(t4) { + return t4.slice(-1)[0]; + }, g = function(t4, e3) { + var n4; + return n4 = t4.lastIndexOf(e3), n4 === -1 ? t4 : r2(t4, n4, 1); + }, a3; + }(e2.Object); + }.call(this), function() { + var t3, n2, i, o2 = function(t4, e3) { + function n3() { + this.constructor = t4; + } + for (var i2 in e3) + r2.call(e3, i2) && (t4[i2] = e3[i2]); + return n3.prototype = e3.prototype, t4.prototype = new n3(), t4.__super__ = e3.prototype, t4; + }, r2 = {}.hasOwnProperty, s2 = [].indexOf || function(t4) { + for (var e3 = 0, n3 = this.length; n3 > e3; e3++) + if (e3 in this && this[e3] === t4) + return e3; + return -1; + }, a2 = [].slice; + n2 = e2.tagName, i = e2.walkTree, t3 = e2.nodeIsAttachmentElement, e2.HTMLSanitizer = function(r3) { + function u(t4, e3) { + var n3; + n3 = e3 != null ? e3 : {}, this.allowedAttributes = n3.allowedAttributes, this.forbiddenProtocols = n3.forbiddenProtocols, this.forbiddenElements = n3.forbiddenElements, this.allowedAttributes == null && (this.allowedAttributes = c2), this.forbiddenProtocols == null && (this.forbiddenProtocols = h), this.forbiddenElements == null && (this.forbiddenElements = l), this.body = p2(t4); + } + var c2, l, h, p2; + return o2(u, r3), c2 = "style href src width height class".split(" "), h = "javascript:".split(" "), l = "script iframe".split(" "), u.sanitize = function(t4, e3) { + var n3; + return n3 = new this(t4, e3), n3.sanitize(), n3; + }, u.prototype.sanitize = function() { + return this.sanitizeElements(), this.normalizeListElementNesting(); + }, u.prototype.getHTML = function() { + return this.body.innerHTML; + }, u.prototype.getBody = function() { + return this.body; + }, u.prototype.sanitizeElements = function() { + var t4, n3, o3, r4, s3; + for (s3 = i(this.body), r4 = []; s3.nextNode(); ) + switch (o3 = s3.currentNode, o3.nodeType) { + case Node.ELEMENT_NODE: + this.elementIsRemovable(o3) ? r4.push(o3) : this.sanitizeElement(o3); + break; + case Node.COMMENT_NODE: + r4.push(o3); + } + for (t4 = 0, n3 = r4.length; n3 > t4; t4++) + o3 = r4[t4], e2.removeNode(o3); + return this.body; + }, u.prototype.sanitizeElement = function(t4) { + var e3, n3, i2, o3, r4; + for (t4.hasAttribute("href") && (o3 = t4.protocol, s2.call(this.forbiddenProtocols, o3) >= 0 && t4.removeAttribute("href")), r4 = a2.call(t4.attributes), e3 = 0, n3 = r4.length; n3 > e3; e3++) + i2 = r4[e3].name, s2.call(this.allowedAttributes, i2) >= 0 || i2.indexOf("data-trix") === 0 || t4.removeAttribute(i2); + return t4; + }, u.prototype.normalizeListElementNesting = function() { + var t4, e3, i2, o3, r4; + for (r4 = a2.call(this.body.querySelectorAll("ul,ol")), t4 = 0, e3 = r4.length; e3 > t4; t4++) + i2 = r4[t4], (o3 = i2.previousElementSibling) && n2(o3) === "li" && o3.appendChild(i2); + return this.body; + }, u.prototype.elementIsRemovable = function(t4) { + return (t4 != null ? t4.nodeType : void 0) === Node.ELEMENT_NODE ? this.elementIsForbidden(t4) || this.elementIsntSerializable(t4) : void 0; + }, u.prototype.elementIsForbidden = function(t4) { + var e3; + return e3 = n2(t4), s2.call(this.forbiddenElements, e3) >= 0; + }, u.prototype.elementIsntSerializable = function(e3) { + return e3.getAttribute("data-trix-serialize") === "false" && !t3(e3); + }, p2 = function(t4) { + var e3, n3, i2, o3, r4; + for (t4 == null && (t4 = ""), t4 = t4.replace(/<\/html[^>]*>[^]*$/i, ""), e3 = document.implementation.createHTMLDocument(""), e3.documentElement.innerHTML = t4, r4 = e3.head.querySelectorAll("style"), i2 = 0, o3 = r4.length; o3 > i2; i2++) + n3 = r4[i2], e3.body.appendChild(n3); + return e3.body; + }, u; + }(e2.BasicObject); + }.call(this), function() { + var t3, n2, i, o2, r2, s2, a2, u, c2, l, h, p2 = function(t4, e3) { + function n3() { + this.constructor = t4; + } + for (var i2 in e3) + d.call(e3, i2) && (t4[i2] = e3[i2]); + return n3.prototype = e3.prototype, t4.prototype = new n3(), t4.__super__ = e3.prototype, t4; + }, d = {}.hasOwnProperty, f = [].indexOf || function(t4) { + for (var e3 = 0, n3 = this.length; n3 > e3; e3++) + if (e3 in this && this[e3] === t4) + return e3; + return -1; + }; + t3 = e2.arraysAreEqual, s2 = e2.makeElement, l = e2.tagName, r2 = e2.getBlockTagNames, h = e2.walkTree, o2 = e2.findClosestElementFromNode, i = e2.elementContainsNode, a2 = e2.nodeIsAttachmentElement, u = e2.normalizeSpaces, n2 = e2.breakableWhitespacePattern, c2 = e2.squishBreakableWhitespace, e2.HTMLParser = function(d2) { + function g(t4, e3) { + this.html = t4, this.referenceElement = (e3 != null ? e3 : {}).referenceElement, this.blocks = [], this.blockElements = [], this.processedElements = []; + } + var m, v, y, b, A, C3, x, w, E, S2, R, k; + return p2(g, d2), g.parse = function(t4, e3) { + var n3; + return n3 = new this(t4, e3), n3.parse(), n3; + }, g.prototype.getDocument = function() { + return e2.Document.fromJSON(this.blocks); + }, g.prototype.parse = function() { + var t4, n3; + try { + for (this.createHiddenContainer(), t4 = e2.HTMLSanitizer.sanitize(this.html).getHTML(), this.containerElement.innerHTML = t4, n3 = h(this.containerElement, {usingFilter: x}); n3.nextNode(); ) + this.processNode(n3.currentNode); + return this.translateBlockElementMarginsToNewlines(); + } finally { + this.removeHiddenContainer(); + } + }, g.prototype.createHiddenContainer = function() { + return this.referenceElement ? (this.containerElement = this.referenceElement.cloneNode(false), this.containerElement.removeAttribute("id"), this.containerElement.setAttribute("data-trix-internal", ""), this.containerElement.style.display = "none", this.referenceElement.parentNode.insertBefore(this.containerElement, this.referenceElement.nextSibling)) : (this.containerElement = s2({tagName: "div", style: {display: "none"}}), document.body.appendChild(this.containerElement)); + }, g.prototype.removeHiddenContainer = function() { + return e2.removeNode(this.containerElement); + }, x = function(t4) { + return l(t4) === "style" ? NodeFilter.FILTER_REJECT : NodeFilter.FILTER_ACCEPT; + }, g.prototype.processNode = function(t4) { + switch (t4.nodeType) { + case Node.TEXT_NODE: + if (!this.isInsignificantTextNode(t4)) + return this.appendBlockForTextNode(t4), this.processTextNode(t4); + break; + case Node.ELEMENT_NODE: + return this.appendBlockForElement(t4), this.processElement(t4); + } + }, g.prototype.appendBlockForTextNode = function(e3) { + var n3, i2, o3; + return i2 = e3.parentNode, i2 === this.currentBlockElement && this.isBlockElement(e3.previousSibling) ? this.appendStringWithAttributes("\n") : i2 !== this.containerElement && !this.isBlockElement(i2) || (n3 = this.getBlockAttributes(i2), t3(n3, (o3 = this.currentBlock) != null ? o3.attributes : void 0)) ? void 0 : (this.currentBlock = this.appendBlockForAttributesWithElement(n3, i2), this.currentBlockElement = i2); + }, g.prototype.appendBlockForElement = function(e3) { + var n3, o3, r3, s3; + if (r3 = this.isBlockElement(e3), o3 = i(this.currentBlockElement, e3), r3 && !this.isBlockElement(e3.firstChild)) { + if ((!this.isInsignificantTextNode(e3.firstChild) || !this.isBlockElement(e3.firstElementChild)) && (n3 = this.getBlockAttributes(e3), e3.firstChild)) + return o3 && t3(n3, this.currentBlock.attributes) ? this.appendStringWithAttributes("\n") : (this.currentBlock = this.appendBlockForAttributesWithElement(n3, e3), this.currentBlockElement = e3); + } else if (this.currentBlockElement && !o3 && !r3) + return (s3 = this.findParentBlockElement(e3)) ? this.appendBlockForElement(s3) : (this.currentBlock = this.appendEmptyBlock(), this.currentBlockElement = null); + }, g.prototype.findParentBlockElement = function(t4) { + var e3; + for (e3 = t4.parentElement; e3 && e3 !== this.containerElement; ) { + if (this.isBlockElement(e3) && f.call(this.blockElements, e3) >= 0) + return e3; + e3 = e3.parentElement; + } + return null; + }, g.prototype.processTextNode = function(t4) { + var e3, n3; + return n3 = t4.data, v(t4.parentNode) || (n3 = c2(n3), R((e3 = t4.previousSibling) != null ? e3.textContent : void 0) && (n3 = A(n3))), this.appendStringWithAttributes(n3, this.getTextAttributes(t4.parentNode)); + }, g.prototype.processElement = function(t4) { + var e3, n3, i2, o3, r3; + if (a2(t4)) + return e3 = w(t4, "attachment"), Object.keys(e3).length && (o3 = this.getTextAttributes(t4), this.appendAttachmentWithAttributes(e3, o3), t4.innerHTML = ""), this.processedElements.push(t4); + switch (l(t4)) { + case "br": + return this.isExtraBR(t4) || this.isBlockElement(t4.nextSibling) || this.appendStringWithAttributes("\n", this.getTextAttributes(t4)), this.processedElements.push(t4); + case "img": + e3 = {url: t4.getAttribute("src"), contentType: "image"}, i2 = b(t4); + for (n3 in i2) + r3 = i2[n3], e3[n3] = r3; + return this.appendAttachmentWithAttributes(e3, this.getTextAttributes(t4)), this.processedElements.push(t4); + case "tr": + if (t4.parentNode.firstChild !== t4) + return this.appendStringWithAttributes("\n"); + break; + case "td": + if (t4.parentNode.firstChild !== t4) + return this.appendStringWithAttributes(" | "); + } + }, g.prototype.appendBlockForAttributesWithElement = function(t4, e3) { + var n3; + return this.blockElements.push(e3), n3 = m(t4), this.blocks.push(n3), n3; + }, g.prototype.appendEmptyBlock = function() { + return this.appendBlockForAttributesWithElement([], null); + }, g.prototype.appendStringWithAttributes = function(t4, e3) { + return this.appendPiece(S2(t4, e3)); + }, g.prototype.appendAttachmentWithAttributes = function(t4, e3) { + return this.appendPiece(E(t4, e3)); + }, g.prototype.appendPiece = function(t4) { + return this.blocks.length === 0 && this.appendEmptyBlock(), this.blocks[this.blocks.length - 1].text.push(t4); + }, g.prototype.appendStringToTextAtIndex = function(t4, e3) { + var n3, i2; + return i2 = this.blocks[e3].text, n3 = i2[i2.length - 1], (n3 != null ? n3.type : void 0) === "string" ? n3.string += t4 : i2.push(S2(t4)); + }, g.prototype.prependStringToTextAtIndex = function(t4, e3) { + var n3, i2; + return i2 = this.blocks[e3].text, n3 = i2[0], (n3 != null ? n3.type : void 0) === "string" ? n3.string = t4 + n3.string : i2.unshift(S2(t4)); + }, S2 = function(t4, e3) { + var n3; + return e3 == null && (e3 = {}), n3 = "string", t4 = u(t4), {string: t4, attributes: e3, type: n3}; + }, E = function(t4, e3) { + var n3; + return e3 == null && (e3 = {}), n3 = "attachment", {attachment: t4, attributes: e3, type: n3}; + }, m = function(t4) { + var e3; + return t4 == null && (t4 = {}), e3 = [], {text: e3, attributes: t4}; + }, g.prototype.getTextAttributes = function(t4) { + var n3, i2, r3, s3, u2, c3, l2, h2, p3, d3, f2, g2; + r3 = {}, p3 = e2.config.textAttributes; + for (n3 in p3) + if (u2 = p3[n3], u2.tagName && o2(t4, {matchingSelector: u2.tagName, untilNode: this.containerElement})) + r3[n3] = true; + else if (u2.parser) { + if (g2 = u2.parser(t4)) { + for (i2 = false, d3 = this.findBlockElementAncestors(t4), c3 = 0, h2 = d3.length; h2 > c3; c3++) + if (s3 = d3[c3], u2.parser(s3) === g2) { + i2 = true; + break; + } + i2 || (r3[n3] = g2); + } + } else + u2.styleProperty && (g2 = t4.style[u2.styleProperty]) && (r3[n3] = g2); + if (a2(t4)) { + f2 = w(t4, "attributes"); + for (l2 in f2) + g2 = f2[l2], r3[l2] = g2; + } + return r3; + }, g.prototype.getBlockAttributes = function(t4) { + var n3, i2, o3, r3; + for (i2 = []; t4 && t4 !== this.containerElement; ) { + r3 = e2.config.blockAttributes; + for (n3 in r3) + o3 = r3[n3], o3.parse !== false && l(t4) === o3.tagName && ((typeof o3.test == "function" ? o3.test(t4) : void 0) || !o3.test) && (i2.push(n3), o3.listAttribute && i2.push(o3.listAttribute)); + t4 = t4.parentNode; + } + return i2.reverse(); + }, g.prototype.findBlockElementAncestors = function(t4) { + var e3, n3; + for (e3 = []; t4 && t4 !== this.containerElement; ) + n3 = l(t4), f.call(r2(), n3) >= 0 && e3.push(t4), t4 = t4.parentNode; + return e3; + }, w = function(t4, e3) { + try { + return JSON.parse(t4.getAttribute("data-trix-" + e3)); + } catch (n3) { + return {}; + } + }, b = function(t4) { + var e3, n3, i2; + return i2 = t4.getAttribute("width"), n3 = t4.getAttribute("height"), e3 = {}, i2 && (e3.width = parseInt(i2, 10)), n3 && (e3.height = parseInt(n3, 10)), e3; + }, g.prototype.isBlockElement = function(t4) { + var e3; + if ((t4 != null ? t4.nodeType : void 0) === Node.ELEMENT_NODE && !a2(t4) && !o2(t4, {matchingSelector: "td", untilNode: this.containerElement})) + return e3 = l(t4), f.call(r2(), e3) >= 0 || window.getComputedStyle(t4).display === "block"; + }, g.prototype.isInsignificantTextNode = function(t4) { + var e3, n3, i2; + if ((t4 != null ? t4.nodeType : void 0) === Node.TEXT_NODE && k(t4.data) && (n3 = t4.parentNode, i2 = t4.previousSibling, e3 = t4.nextSibling, (!C3(n3.previousSibling) || this.isBlockElement(n3.previousSibling)) && !v(n3))) + return !i2 || this.isBlockElement(i2) || !e3 || this.isBlockElement(e3); + }, g.prototype.isExtraBR = function(t4) { + return l(t4) === "br" && this.isBlockElement(t4.parentNode) && t4.parentNode.lastChild === t4; + }, v = function(t4) { + var e3; + return e3 = window.getComputedStyle(t4).whiteSpace, e3 === "pre" || e3 === "pre-wrap" || e3 === "pre-line"; + }, C3 = function(t4) { + return t4 && !R(t4.textContent); + }, g.prototype.translateBlockElementMarginsToNewlines = function() { + var t4, e3, n3, i2, o3, r3, s3, a3; + for (e3 = this.getMarginOfDefaultBlockElement(), s3 = this.blocks, a3 = [], i2 = n3 = 0, o3 = s3.length; o3 > n3; i2 = ++n3) + t4 = s3[i2], (r3 = this.getMarginOfBlockElementAtIndex(i2)) && (r3.top > 2 * e3.top && this.prependStringToTextAtIndex("\n", i2), a3.push(r3.bottom > 2 * e3.bottom ? this.appendStringToTextAtIndex("\n", i2) : void 0)); + return a3; + }, g.prototype.getMarginOfBlockElementAtIndex = function(t4) { + var e3, n3; + return !(e3 = this.blockElements[t4]) || !e3.textContent || (n3 = l(e3), f.call(r2(), n3) >= 0 || f.call(this.processedElements, e3) >= 0) ? void 0 : y(e3); + }, g.prototype.getMarginOfDefaultBlockElement = function() { + var t4; + return t4 = s2(e2.config.blockAttributes["default"].tagName), this.containerElement.appendChild(t4), y(t4); + }, y = function(t4) { + var e3; + return e3 = window.getComputedStyle(t4), e3.display === "block" ? {top: parseInt(e3.marginTop), bottom: parseInt(e3.marginBottom)} : void 0; + }, A = function(t4) { + return t4.replace(RegExp("^" + n2.source + "+"), ""); + }, k = function(t4) { + return RegExp("^" + n2.source + "*$").test(t4); + }, R = function(t4) { + return /\s$/.test(t4); + }, g; + }(e2.BasicObject); + }.call(this), function() { + var t3, n2, i, o2, r2 = function(t4, e3) { + function n3() { + this.constructor = t4; + } + for (var i2 in e3) + s2.call(e3, i2) && (t4[i2] = e3[i2]); + return n3.prototype = e3.prototype, t4.prototype = new n3(), t4.__super__ = e3.prototype, t4; + }, s2 = {}.hasOwnProperty, a2 = [].slice, u = [].indexOf || function(t4) { + for (var e3 = 0, n3 = this.length; n3 > e3; e3++) + if (e3 in this && this[e3] === t4) + return e3; + return -1; + }; + t3 = e2.arraysAreEqual, i = e2.normalizeRange, o2 = e2.rangeIsCollapsed, n2 = e2.getBlockConfig, e2.Document = function(s3) { + function c2(t4) { + t4 == null && (t4 = []), c2.__super__.constructor.apply(this, arguments), t4.length === 0 && (t4 = [new e2.Block()]), this.blockList = e2.SplittableList.box(t4); + } + var l; + return r2(c2, s3), c2.fromJSON = function(t4) { + var n3, i2; + return i2 = function() { + var i3, o3, r3; + for (r3 = [], i3 = 0, o3 = t4.length; o3 > i3; i3++) + n3 = t4[i3], r3.push(e2.Block.fromJSON(n3)); + return r3; + }(), new this(i2); + }, c2.fromHTML = function(t4, n3) { + return e2.HTMLParser.parse(t4, n3).getDocument(); + }, c2.fromString = function(t4, n3) { + var i2; + return i2 = e2.Text.textForStringWithAttributes(t4, n3), new this([new e2.Block(i2)]); + }, c2.prototype.isEmpty = function() { + var t4; + return this.blockList.length === 1 && (t4 = this.getBlockAtIndex(0), t4.isEmpty() && !t4.hasAttributes()); + }, c2.prototype.copy = function(t4) { + var e3; + return t4 == null && (t4 = {}), e3 = t4.consolidateBlocks ? this.blockList.consolidate().toArray() : this.blockList.toArray(), new this.constructor(e3); + }, c2.prototype.copyUsingObjectsFromDocument = function(t4) { + var n3; + return n3 = new e2.ObjectMap(t4.getObjects()), this.copyUsingObjectMap(n3); + }, c2.prototype.copyUsingObjectMap = function(t4) { + var e3, n3, i2; + return n3 = function() { + var n4, o3, r3, s4; + for (r3 = this.getBlocks(), s4 = [], n4 = 0, o3 = r3.length; o3 > n4; n4++) + e3 = r3[n4], s4.push((i2 = t4.find(e3)) ? i2 : e3.copyUsingObjectMap(t4)); + return s4; + }.call(this), new this.constructor(n3); + }, c2.prototype.copyWithBaseBlockAttributes = function(t4) { + var e3, n3, i2; + return t4 == null && (t4 = []), i2 = function() { + var i3, o3, r3, s4; + for (r3 = this.getBlocks(), s4 = [], i3 = 0, o3 = r3.length; o3 > i3; i3++) + n3 = r3[i3], e3 = t4.concat(n3.getAttributes()), s4.push(n3.copyWithAttributes(e3)); + return s4; + }.call(this), new this.constructor(i2); + }, c2.prototype.replaceBlock = function(t4, e3) { + var n3; + return n3 = this.blockList.indexOf(t4), n3 === -1 ? this : new this.constructor(this.blockList.replaceObjectAtIndex(e3, n3)); + }, c2.prototype.insertDocumentAtRange = function(t4, e3) { + var n3, r3, s4, a3, u2, c3, l2; + return r3 = t4.blockList, u2 = (e3 = i(e3))[0], c3 = this.locationFromPosition(u2), s4 = c3.index, a3 = c3.offset, l2 = this, n3 = this.getBlockAtPosition(u2), o2(e3) && n3.isEmpty() && !n3.hasAttributes() ? l2 = new this.constructor(l2.blockList.removeObjectAtIndex(s4)) : n3.getBlockBreakPosition() === a3 && u2++, l2 = l2.removeTextAtRange(e3), new this.constructor(l2.blockList.insertSplittableListAtPosition(r3, u2)); + }, c2.prototype.mergeDocumentAtRange = function(e3, n3) { + var o3, r3, s4, a3, u2, c3, l2, h, p2, d, f, g; + return f = (n3 = i(n3))[0], d = this.locationFromPosition(f), r3 = this.getBlockAtIndex(d.index).getAttributes(), o3 = e3.getBaseBlockAttributes(), g = r3.slice(-o3.length), t3(o3, g) ? (l2 = r3.slice(0, -o3.length), c3 = e3.copyWithBaseBlockAttributes(l2)) : c3 = e3.copy({consolidateBlocks: true}).copyWithBaseBlockAttributes(r3), s4 = c3.getBlockCount(), a3 = c3.getBlockAtIndex(0), t3(r3, a3.getAttributes()) ? (u2 = a3.getTextWithoutBlockBreak(), p2 = this.insertTextAtRange(u2, n3), s4 > 1 && (c3 = new this.constructor(c3.getBlocks().slice(1)), h = f + u2.getLength(), p2 = p2.insertDocumentAtRange(c3, h))) : p2 = this.insertDocumentAtRange(c3, n3), p2; + }, c2.prototype.insertTextAtRange = function(t4, e3) { + var n3, o3, r3, s4, a3; + return a3 = (e3 = i(e3))[0], s4 = this.locationFromPosition(a3), o3 = s4.index, r3 = s4.offset, n3 = this.removeTextAtRange(e3), new this.constructor(n3.blockList.editObjectAtIndex(o3, function(e4) { + return e4.copyWithText(e4.text.insertTextAtPosition(t4, r3)); + })); + }, c2.prototype.removeTextAtRange = function(t4) { + var e3, n3, r3, s4, a3, u2, c3, l2, h, p2, d, f, g, m, v, y, b, A, C3, x, w; + return p2 = t4 = i(t4), l2 = p2[0], A = p2[1], o2(t4) ? this : (d = this.locationRangeFromRange(t4), u2 = d[0], y = d[1], a3 = u2.index, c3 = u2.offset, s4 = this.getBlockAtIndex(a3), v = y.index, b = y.offset, m = this.getBlockAtIndex(v), f = A - l2 === 1 && s4.getBlockBreakPosition() === c3 && m.getBlockBreakPosition() !== b && m.text.getStringAtPosition(b) === "\n", f ? r3 = this.blockList.editObjectAtIndex(v, function(t5) { + return t5.copyWithText(t5.text.removeTextAtRange([b, b + 1])); + }) : (h = s4.text.getTextAtRange([0, c3]), C3 = m.text.getTextAtRange([b, m.getLength()]), x = h.appendText(C3), g = a3 !== v && c3 === 0, w = g && s4.getAttributeLevel() >= m.getAttributeLevel(), n3 = w ? m.copyWithText(x) : s4.copyWithText(x), e3 = v + 1 - a3, r3 = this.blockList.splice(a3, e3, n3)), new this.constructor(r3)); + }, c2.prototype.moveTextFromRangeToPosition = function(t4, e3) { + var n3, o3, r3, s4, u2, c3, l2, h, p2, d; + return c3 = t4 = i(t4), p2 = c3[0], r3 = c3[1], e3 >= p2 && r3 >= e3 ? this : (o3 = this.getDocumentAtRange(t4), h = this.removeTextAtRange(t4), u2 = e3 > p2, u2 && (e3 -= o3.getLength()), l2 = o3.getBlocks(), s4 = l2[0], n3 = 2 <= l2.length ? a2.call(l2, 1) : [], n3.length === 0 ? (d = s4.getTextWithoutBlockBreak(), u2 && (e3 += 1)) : d = s4.text, h = h.insertTextAtRange(d, e3), n3.length === 0 ? h : (o3 = new this.constructor(n3), e3 += d.getLength(), h.insertDocumentAtRange(o3, e3))); + }, c2.prototype.addAttributeAtRange = function(t4, e3, i2) { + var o3; + return o3 = this.blockList, this.eachBlockAtRange(i2, function(i3, r3, s4) { + return o3 = o3.editObjectAtIndex(s4, function() { + return n2(t4) ? i3.addAttribute(t4, e3) : r3[0] === r3[1] ? i3 : i3.copyWithText(i3.text.addAttributeAtRange(t4, e3, r3)); + }); + }), new this.constructor(o3); + }, c2.prototype.addAttribute = function(t4, e3) { + var n3; + return n3 = this.blockList, this.eachBlock(function(i2, o3) { + return n3 = n3.editObjectAtIndex(o3, function() { + return i2.addAttribute(t4, e3); + }); + }), new this.constructor(n3); + }, c2.prototype.removeAttributeAtRange = function(t4, e3) { + var i2; + return i2 = this.blockList, this.eachBlockAtRange(e3, function(e4, o3, r3) { + return n2(t4) ? i2 = i2.editObjectAtIndex(r3, function() { + return e4.removeAttribute(t4); + }) : o3[0] !== o3[1] ? i2 = i2.editObjectAtIndex(r3, function() { + return e4.copyWithText(e4.text.removeAttributeAtRange(t4, o3)); + }) : void 0; + }), new this.constructor(i2); + }, c2.prototype.updateAttributesForAttachment = function(t4, e3) { + var n3, i2, o3, r3; + return o3 = (i2 = this.getRangeOfAttachment(e3))[0], n3 = this.locationFromPosition(o3).index, r3 = this.getTextAtIndex(n3), new this.constructor(this.blockList.editObjectAtIndex(n3, function(n4) { + return n4.copyWithText(r3.updateAttributesForAttachment(t4, e3)); + })); + }, c2.prototype.removeAttributeForAttachment = function(t4, e3) { + var n3; + return n3 = this.getRangeOfAttachment(e3), this.removeAttributeAtRange(t4, n3); + }, c2.prototype.insertBlockBreakAtRange = function(t4) { + var n3, o3, r3, s4; + return s4 = (t4 = i(t4))[0], r3 = this.locationFromPosition(s4).offset, o3 = this.removeTextAtRange(t4), r3 === 0 && (n3 = [new e2.Block()]), new this.constructor(o3.blockList.insertSplittableListAtPosition(new e2.SplittableList(n3), s4)); + }, c2.prototype.applyBlockAttributeAtRange = function(t4, e3, i2) { + var o3, r3, s4, a3; + return s4 = this.expandRangeToLineBreaksAndSplitBlocks(i2), r3 = s4.document, i2 = s4.range, o3 = n2(t4), o3.listAttribute ? (r3 = r3.removeLastListAttributeAtRange(i2, {exceptAttributeName: t4}), a3 = r3.convertLineBreaksToBlockBreaksInRange(i2), r3 = a3.document, i2 = a3.range) : r3 = o3.exclusive ? r3.removeBlockAttributesAtRange(i2) : o3.terminal ? r3.removeLastTerminalAttributeAtRange(i2) : r3.consolidateBlocksAtRange(i2), r3.addAttributeAtRange(t4, e3, i2); + }, c2.prototype.removeLastListAttributeAtRange = function(t4, e3) { + var i2; + return e3 == null && (e3 = {}), i2 = this.blockList, this.eachBlockAtRange(t4, function(t5, o3, r3) { + var s4; + if ((s4 = t5.getLastAttribute()) && n2(s4).listAttribute && s4 !== e3.exceptAttributeName) + return i2 = i2.editObjectAtIndex(r3, function() { + return t5.removeAttribute(s4); + }); + }), new this.constructor(i2); + }, c2.prototype.removeLastTerminalAttributeAtRange = function(t4) { + var e3; + return e3 = this.blockList, this.eachBlockAtRange(t4, function(t5, i2, o3) { + var r3; + if ((r3 = t5.getLastAttribute()) && n2(r3).terminal) + return e3 = e3.editObjectAtIndex(o3, function() { + return t5.removeAttribute(r3); + }); + }), new this.constructor(e3); + }, c2.prototype.removeBlockAttributesAtRange = function(t4) { + var e3; + return e3 = this.blockList, this.eachBlockAtRange(t4, function(t5, n3, i2) { + return t5.hasAttributes() ? e3 = e3.editObjectAtIndex(i2, function() { + return t5.copyWithoutAttributes(); + }) : void 0; + }), new this.constructor(e3); + }, c2.prototype.expandRangeToLineBreaksAndSplitBlocks = function(t4) { + var e3, n3, o3, r3, s4, a3, u2, c3, l2; + return a3 = t4 = i(t4), l2 = a3[0], r3 = a3[1], c3 = this.locationFromPosition(l2), o3 = this.locationFromPosition(r3), e3 = this, u2 = e3.getBlockAtIndex(c3.index), (c3.offset = u2.findLineBreakInDirectionFromPosition("backward", c3.offset)) != null && (s4 = e3.positionFromLocation(c3), e3 = e3.insertBlockBreakAtRange([s4, s4 + 1]), o3.index += 1, o3.offset -= e3.getBlockAtIndex(c3.index).getLength(), c3.index += 1), c3.offset = 0, o3.offset === 0 && o3.index > c3.index ? (o3.index -= 1, o3.offset = e3.getBlockAtIndex(o3.index).getBlockBreakPosition()) : (n3 = e3.getBlockAtIndex(o3.index), n3.text.getStringAtRange([o3.offset - 1, o3.offset]) === "\n" ? o3.offset -= 1 : o3.offset = n3.findLineBreakInDirectionFromPosition("forward", o3.offset), o3.offset !== n3.getBlockBreakPosition() && (s4 = e3.positionFromLocation(o3), e3 = e3.insertBlockBreakAtRange([s4, s4 + 1]))), l2 = e3.positionFromLocation(c3), r3 = e3.positionFromLocation(o3), t4 = i([l2, r3]), {document: e3, range: t4}; + }, c2.prototype.convertLineBreaksToBlockBreaksInRange = function(t4) { + var e3, n3, o3; + return n3 = (t4 = i(t4))[0], o3 = this.getStringAtRange(t4).slice(0, -1), e3 = this, o3.replace(/.*?\n/g, function(t5) { + return n3 += t5.length, e3 = e3.insertBlockBreakAtRange([n3 - 1, n3]); + }), {document: e3, range: t4}; + }, c2.prototype.consolidateBlocksAtRange = function(t4) { + var e3, n3, o3, r3, s4; + return o3 = t4 = i(t4), s4 = o3[0], n3 = o3[1], r3 = this.locationFromPosition(s4).index, e3 = this.locationFromPosition(n3).index, new this.constructor(this.blockList.consolidateFromIndexToIndex(r3, e3)); + }, c2.prototype.getDocumentAtRange = function(t4) { + var e3; + return t4 = i(t4), e3 = this.blockList.getSplittableListInRange(t4).toArray(), new this.constructor(e3); + }, c2.prototype.getStringAtRange = function(t4) { + var e3, n3, o3; + return o3 = t4 = i(t4), n3 = o3[o3.length - 1], n3 !== this.getLength() && (e3 = -1), this.getDocumentAtRange(t4).toString().slice(0, e3); + }, c2.prototype.getBlockAtIndex = function(t4) { + return this.blockList.getObjectAtIndex(t4); + }, c2.prototype.getBlockAtPosition = function(t4) { + var e3; + return e3 = this.locationFromPosition(t4).index, this.getBlockAtIndex(e3); + }, c2.prototype.getTextAtIndex = function(t4) { + var e3; + return (e3 = this.getBlockAtIndex(t4)) != null ? e3.text : void 0; + }, c2.prototype.getTextAtPosition = function(t4) { + var e3; + return e3 = this.locationFromPosition(t4).index, this.getTextAtIndex(e3); + }, c2.prototype.getPieceAtPosition = function(t4) { + var e3, n3, i2; + return i2 = this.locationFromPosition(t4), e3 = i2.index, n3 = i2.offset, this.getTextAtIndex(e3).getPieceAtPosition(n3); + }, c2.prototype.getCharacterAtPosition = function(t4) { + var e3, n3, i2; + return i2 = this.locationFromPosition(t4), e3 = i2.index, n3 = i2.offset, this.getTextAtIndex(e3).getStringAtRange([n3, n3 + 1]); + }, c2.prototype.getLength = function() { + return this.blockList.getEndPosition(); + }, c2.prototype.getBlocks = function() { + return this.blockList.toArray(); + }, c2.prototype.getBlockCount = function() { + return this.blockList.length; + }, c2.prototype.getEditCount = function() { + return this.editCount; + }, c2.prototype.eachBlock = function(t4) { + return this.blockList.eachObject(t4); + }, c2.prototype.eachBlockAtRange = function(t4, e3) { + var n3, o3, r3, s4, a3, u2, c3, l2, h, p2, d, f; + if (u2 = t4 = i(t4), d = u2[0], r3 = u2[1], p2 = this.locationFromPosition(d), o3 = this.locationFromPosition(r3), p2.index === o3.index) + return n3 = this.getBlockAtIndex(p2.index), f = [p2.offset, o3.offset], e3(n3, f, p2.index); + for (h = [], a3 = s4 = c3 = p2.index, l2 = o3.index; l2 >= c3 ? l2 >= s4 : s4 >= l2; a3 = l2 >= c3 ? ++s4 : --s4) + (n3 = this.getBlockAtIndex(a3)) ? (f = function() { + switch (a3) { + case p2.index: + return [p2.offset, n3.text.getLength()]; + case o3.index: + return [0, o3.offset]; + default: + return [0, n3.text.getLength()]; + } + }(), h.push(e3(n3, f, a3))) : h.push(void 0); + return h; + }, c2.prototype.getCommonAttributesAtRange = function(t4) { + var n3, r3, s4; + return r3 = (t4 = i(t4))[0], o2(t4) ? this.getCommonAttributesAtPosition(r3) : (s4 = [], n3 = [], this.eachBlockAtRange(t4, function(t5, e3) { + return e3[0] !== e3[1] ? (s4.push(t5.text.getCommonAttributesAtRange(e3)), n3.push(l(t5))) : void 0; + }), e2.Hash.fromCommonAttributesOfObjects(s4).merge(e2.Hash.fromCommonAttributesOfObjects(n3)).toObject()); + }, c2.prototype.getCommonAttributesAtPosition = function(t4) { + var n3, i2, o3, r3, s4, a3, c3, h, p2, d; + if (p2 = this.locationFromPosition(t4), s4 = p2.index, h = p2.offset, o3 = this.getBlockAtIndex(s4), !o3) + return {}; + r3 = l(o3), n3 = o3.text.getAttributesAtPosition(h), i2 = o3.text.getAttributesAtPosition(h - 1), a3 = function() { + var t5, n4; + t5 = e2.config.textAttributes, n4 = []; + for (c3 in t5) + d = t5[c3], d.inheritable && n4.push(c3); + return n4; + }(); + for (c3 in i2) + d = i2[c3], (d === n3[c3] || u.call(a3, c3) >= 0) && (r3[c3] = d); + return r3; + }, c2.prototype.getRangeOfCommonAttributeAtPosition = function(t4, e3) { + var n3, o3, r3, s4, a3, u2, c3, l2, h; + return a3 = this.locationFromPosition(e3), r3 = a3.index, s4 = a3.offset, h = this.getTextAtIndex(r3), u2 = h.getExpandedRangeForAttributeAtOffset(t4, s4), l2 = u2[0], o3 = u2[1], c3 = this.positionFromLocation({index: r3, offset: l2}), n3 = this.positionFromLocation({index: r3, offset: o3}), i([c3, n3]); + }, c2.prototype.getBaseBlockAttributes = function() { + var t4, e3, n3, i2, o3, r3, s4; + for (t4 = this.getBlockAtIndex(0).getAttributes(), n3 = i2 = 1, s4 = this.getBlockCount(); s4 >= 1 ? s4 > i2 : i2 > s4; n3 = s4 >= 1 ? ++i2 : --i2) + e3 = this.getBlockAtIndex(n3).getAttributes(), r3 = Math.min(t4.length, e3.length), t4 = function() { + var n4, i3, s5; + for (s5 = [], o3 = n4 = 0, i3 = r3; (i3 >= 0 ? i3 > n4 : n4 > i3) && e3[o3] === t4[o3]; o3 = i3 >= 0 ? ++n4 : --n4) + s5.push(e3[o3]); + return s5; + }(); + return t4; + }, l = function(t4) { + var e3, n3; + return n3 = {}, (e3 = t4.getLastAttribute()) && (n3[e3] = true), n3; + }, c2.prototype.getAttachmentById = function(t4) { + var e3, n3, i2, o3; + for (o3 = this.getAttachments(), n3 = 0, i2 = o3.length; i2 > n3; n3++) + if (e3 = o3[n3], e3.id === t4) + return e3; + }, c2.prototype.getAttachmentPieces = function() { + var t4; + return t4 = [], this.blockList.eachObject(function(e3) { + var n3; + return n3 = e3.text, t4 = t4.concat(n3.getAttachmentPieces()); + }), t4; + }, c2.prototype.getAttachments = function() { + var t4, e3, n3, i2, o3; + for (i2 = this.getAttachmentPieces(), o3 = [], t4 = 0, e3 = i2.length; e3 > t4; t4++) + n3 = i2[t4], o3.push(n3.attachment); + return o3; + }, c2.prototype.getRangeOfAttachment = function(t4) { + var e3, n3, o3, r3, s4, a3, u2; + for (r3 = 0, s4 = this.blockList.toArray(), n3 = e3 = 0, o3 = s4.length; o3 > e3; n3 = ++e3) { + if (a3 = s4[n3].text, u2 = a3.getRangeOfAttachment(t4)) + return i([r3 + u2[0], r3 + u2[1]]); + r3 += a3.getLength(); + } + }, c2.prototype.getLocationRangeOfAttachment = function(t4) { + var e3; + return e3 = this.getRangeOfAttachment(t4), this.locationRangeFromRange(e3); + }, c2.prototype.getAttachmentPieceForAttachment = function(t4) { + var e3, n3, i2, o3; + for (o3 = this.getAttachmentPieces(), e3 = 0, n3 = o3.length; n3 > e3; e3++) + if (i2 = o3[e3], i2.attachment === t4) + return i2; + }, c2.prototype.findRangesForBlockAttribute = function(t4) { + var e3, n3, i2, o3, r3, s4, a3; + for (r3 = 0, s4 = [], a3 = this.getBlocks(), n3 = 0, i2 = a3.length; i2 > n3; n3++) + e3 = a3[n3], o3 = e3.getLength(), e3.hasAttribute(t4) && s4.push([r3, r3 + o3]), r3 += o3; + return s4; + }, c2.prototype.findRangesForTextAttribute = function(t4, e3) { + var n3, i2, o3, r3, s4, a3, u2, c3, l2, h; + for (h = (e3 != null ? e3 : {}).withValue, a3 = 0, u2 = [], c3 = [], r3 = function(e4) { + return h != null ? e4.getAttribute(t4) === h : e4.hasAttribute(t4); + }, l2 = this.getPieces(), n3 = 0, i2 = l2.length; i2 > n3; n3++) + s4 = l2[n3], o3 = s4.getLength(), r3(s4) && (u2[1] === a3 ? u2[1] = a3 + o3 : c3.push(u2 = [a3, a3 + o3])), a3 += o3; + return c3; + }, c2.prototype.locationFromPosition = function(t4) { + var e3, n3; + return n3 = this.blockList.findIndexAndOffsetAtPosition(Math.max(0, t4)), n3.index != null ? n3 : (e3 = this.getBlocks(), {index: e3.length - 1, offset: e3[e3.length - 1].getLength()}); + }, c2.prototype.positionFromLocation = function(t4) { + return this.blockList.findPositionAtIndexAndOffset(t4.index, t4.offset); + }, c2.prototype.locationRangeFromPosition = function(t4) { + return i(this.locationFromPosition(t4)); + }, c2.prototype.locationRangeFromRange = function(t4) { + var e3, n3, o3, r3; + if (t4 = i(t4)) + return r3 = t4[0], n3 = t4[1], o3 = this.locationFromPosition(r3), e3 = this.locationFromPosition(n3), i([o3, e3]); + }, c2.prototype.rangeFromLocationRange = function(t4) { + var e3, n3; + return t4 = i(t4), e3 = this.positionFromLocation(t4[0]), o2(t4) || (n3 = this.positionFromLocation(t4[1])), i([e3, n3]); + }, c2.prototype.isEqualTo = function(t4) { + return this.blockList.isEqualTo(t4 != null ? t4.blockList : void 0); + }, c2.prototype.getTexts = function() { + var t4, e3, n3, i2, o3; + for (i2 = this.getBlocks(), o3 = [], e3 = 0, n3 = i2.length; n3 > e3; e3++) + t4 = i2[e3], o3.push(t4.text); + return o3; + }, c2.prototype.getPieces = function() { + var t4, e3, n3, i2, o3; + for (n3 = [], i2 = this.getTexts(), t4 = 0, e3 = i2.length; e3 > t4; t4++) + o3 = i2[t4], n3.push.apply(n3, o3.getPieces()); + return n3; + }, c2.prototype.getObjects = function() { + return this.getBlocks().concat(this.getTexts()).concat(this.getPieces()); + }, c2.prototype.toSerializableDocument = function() { + var t4; + return t4 = [], this.blockList.eachObject(function(e3) { + return t4.push(e3.copyWithText(e3.text.toSerializableText())); + }), new this.constructor(t4); + }, c2.prototype.toString = function() { + return this.blockList.toString(); + }, c2.prototype.toJSON = function() { + return this.blockList.toJSON(); + }, c2.prototype.toConsole = function() { + var t4; + return JSON.stringify(function() { + var e3, n3, i2, o3; + for (i2 = this.blockList.toArray(), o3 = [], e3 = 0, n3 = i2.length; n3 > e3; e3++) + t4 = i2[e3], o3.push(JSON.parse(t4.text.toConsole())); + return o3; + }.call(this)); + }, c2; + }(e2.Object); + }.call(this), function() { + e2.LineBreakInsertion = function() { + function t3(t4) { + var e3; + this.composition = t4, this.document = this.composition.document, e3 = this.composition.getSelectedRange(), this.startPosition = e3[0], this.endPosition = e3[1], this.startLocation = this.document.locationFromPosition(this.startPosition), this.endLocation = this.document.locationFromPosition(this.endPosition), this.block = this.document.getBlockAtIndex(this.endLocation.index), this.breaksOnReturn = this.block.breaksOnReturn(), this.previousCharacter = this.block.text.getStringAtPosition(this.endLocation.offset - 1), this.nextCharacter = this.block.text.getStringAtPosition(this.endLocation.offset); + } + return t3.prototype.shouldInsertBlockBreak = function() { + return this.block.hasAttributes() && this.block.isListItem() && !this.block.isEmpty() ? this.startLocation.offset !== 0 : this.breaksOnReturn && this.nextCharacter !== "\n"; + }, t3.prototype.shouldBreakFormattedBlock = function() { + return this.block.hasAttributes() && !this.block.isListItem() && (this.breaksOnReturn && this.nextCharacter === "\n" || this.previousCharacter === "\n"); + }, t3.prototype.shouldDecreaseListLevel = function() { + return this.block.hasAttributes() && this.block.isListItem() && this.block.isEmpty(); + }, t3.prototype.shouldPrependListItem = function() { + return this.block.isListItem() && this.startLocation.offset === 0 && !this.block.isEmpty(); + }, t3.prototype.shouldRemoveLastBlockAttribute = function() { + return this.block.hasAttributes() && !this.block.isListItem() && this.block.isEmpty(); + }, t3; + }(); + }.call(this), function() { + var t3, n2, i, o2, r2, s2, a2, u, c2, l, h = function(t4, e3) { + function n3() { + this.constructor = t4; + } + for (var i2 in e3) + p2.call(e3, i2) && (t4[i2] = e3[i2]); + return n3.prototype = e3.prototype, t4.prototype = new n3(), t4.__super__ = e3.prototype, t4; + }, p2 = {}.hasOwnProperty; + s2 = e2.normalizeRange, c2 = e2.rangesAreEqual, u = e2.rangeIsCollapsed, a2 = e2.objectsAreEqual, t3 = e2.arrayStartsWith, l = e2.summarizeArrayChange, i = e2.getAllAttributeNames, o2 = e2.getBlockConfig, r2 = e2.getTextConfig, n2 = e2.extend, e2.Composition = function(p3) { + function d() { + this.document = new e2.Document(), this.attachments = [], this.currentAttributes = {}, this.revision = 0; + } + var f; + return h(d, p3), d.prototype.setDocument = function(t4) { + var e3; + return t4.isEqualTo(this.document) ? void 0 : (this.document = t4, this.refreshAttachments(), this.revision++, (e3 = this.delegate) != null && typeof e3.compositionDidChangeDocument == "function" ? e3.compositionDidChangeDocument(t4) : void 0); + }, d.prototype.getSnapshot = function() { + return {document: this.document, selectedRange: this.getSelectedRange()}; + }, d.prototype.loadSnapshot = function(t4) { + var n3, i2, o3, r3; + return n3 = t4.document, r3 = t4.selectedRange, (i2 = this.delegate) != null && typeof i2.compositionWillLoadSnapshot == "function" && i2.compositionWillLoadSnapshot(), this.setDocument(n3 != null ? n3 : new e2.Document()), this.setSelection(r3 != null ? r3 : [0, 0]), (o3 = this.delegate) != null && typeof o3.compositionDidLoadSnapshot == "function" ? o3.compositionDidLoadSnapshot() : void 0; + }, d.prototype.insertText = function(t4, e3) { + var n3, i2, o3, r3; + return r3 = (e3 != null ? e3 : {updatePosition: true}).updatePosition, i2 = this.getSelectedRange(), this.setDocument(this.document.insertTextAtRange(t4, i2)), o3 = i2[0], n3 = o3 + t4.getLength(), r3 && this.setSelection(n3), this.notifyDelegateOfInsertionAtRange([o3, n3]); + }, d.prototype.insertBlock = function(t4) { + var n3; + return t4 == null && (t4 = new e2.Block()), n3 = new e2.Document([t4]), this.insertDocument(n3); + }, d.prototype.insertDocument = function(t4) { + var n3, i2, o3; + return t4 == null && (t4 = new e2.Document()), i2 = this.getSelectedRange(), this.setDocument(this.document.insertDocumentAtRange(t4, i2)), o3 = i2[0], n3 = o3 + t4.getLength(), this.setSelection(n3), this.notifyDelegateOfInsertionAtRange([o3, n3]); + }, d.prototype.insertString = function(t4, n3) { + var i2, o3; + return i2 = this.getCurrentTextAttributes(), o3 = e2.Text.textForStringWithAttributes(t4, i2), this.insertText(o3, n3); + }, d.prototype.insertBlockBreak = function() { + var t4, e3, n3; + return e3 = this.getSelectedRange(), this.setDocument(this.document.insertBlockBreakAtRange(e3)), n3 = e3[0], t4 = n3 + 1, this.setSelection(t4), this.notifyDelegateOfInsertionAtRange([n3, t4]); + }, d.prototype.insertLineBreak = function() { + var t4, n3; + return n3 = new e2.LineBreakInsertion(this), n3.shouldDecreaseListLevel() ? (this.decreaseListLevel(), this.setSelection(n3.startPosition)) : n3.shouldPrependListItem() ? (t4 = new e2.Document([n3.block.copyWithoutText()]), this.insertDocument(t4)) : n3.shouldInsertBlockBreak() ? this.insertBlockBreak() : n3.shouldRemoveLastBlockAttribute() ? this.removeLastBlockAttribute() : n3.shouldBreakFormattedBlock() ? this.breakFormattedBlock(n3) : this.insertString("\n"); + }, d.prototype.insertHTML = function(t4) { + var n3, i2, o3, r3; + return n3 = e2.Document.fromHTML(t4), o3 = this.getSelectedRange(), this.setDocument(this.document.mergeDocumentAtRange(n3, o3)), r3 = o3[0], i2 = r3 + n3.getLength() - 1, this.setSelection(i2), this.notifyDelegateOfInsertionAtRange([r3, i2]); + }, d.prototype.replaceHTML = function(t4) { + var n3, i2, o3; + return n3 = e2.Document.fromHTML(t4).copyUsingObjectsFromDocument(this.document), i2 = this.getLocationRange({strict: false}), o3 = this.document.rangeFromLocationRange(i2), this.setDocument(n3), this.setSelection(o3); + }, d.prototype.insertFile = function(t4) { + return this.insertFiles([t4]); + }, d.prototype.insertFiles = function(t4) { + var n3, i2, o3, r3, s3, a3; + for (i2 = [], r3 = 0, s3 = t4.length; s3 > r3; r3++) + o3 = t4[r3], ((a3 = this.delegate) != null ? a3.compositionShouldAcceptFile(o3) : void 0) && (n3 = e2.Attachment.attachmentForFile(o3), i2.push(n3)); + return this.insertAttachments(i2); + }, d.prototype.insertAttachment = function(t4) { + return this.insertAttachments([t4]); + }, d.prototype.insertAttachments = function(t4) { + var n3, i2, o3, r3, s3, a3, u2, c3, l2; + for (c3 = new e2.Text(), r3 = 0, s3 = t4.length; s3 > r3; r3++) + n3 = t4[r3], l2 = n3.getType(), a3 = (u2 = e2.config.attachments[l2]) != null ? u2.presentation : void 0, o3 = this.getCurrentTextAttributes(), a3 && (o3.presentation = a3), i2 = e2.Text.textForAttachmentWithAttributes(n3, o3), c3 = c3.appendText(i2); + return this.insertText(c3); + }, d.prototype.shouldManageDeletingInDirection = function(t4) { + var e3; + if (e3 = this.getLocationRange(), u(e3)) { + if (t4 === "backward" && e3[0].offset === 0) + return true; + if (this.shouldManageMovingCursorInDirection(t4)) + return true; + } else if (e3[0].index !== e3[1].index) + return true; + return false; + }, d.prototype.deleteInDirection = function(t4, e3) { + var n3, i2, o3, r3, s3, a3, c3, l2; + return r3 = (e3 != null ? e3 : {}).length, s3 = this.getLocationRange(), a3 = this.getSelectedRange(), c3 = u(a3), c3 ? o3 = t4 === "backward" && s3[0].offset === 0 : l2 = s3[0].index !== s3[1].index, o3 && this.canDecreaseBlockAttributeLevel() && (i2 = this.getBlock(), i2.isListItem() ? this.decreaseListLevel() : this.decreaseBlockAttributeLevel(), this.setSelection(a3[0]), i2.isEmpty()) ? false : (c3 && (a3 = this.getExpandedRangeInDirection(t4, {length: r3}), t4 === "backward" && (n3 = this.getAttachmentAtRange(a3))), n3 ? (this.editAttachment(n3), false) : (this.setDocument(this.document.removeTextAtRange(a3)), this.setSelection(a3[0]), o3 || l2 ? false : void 0)); + }, d.prototype.moveTextFromRange = function(t4) { + var e3; + return e3 = this.getSelectedRange()[0], this.setDocument(this.document.moveTextFromRangeToPosition(t4, e3)), this.setSelection(e3); + }, d.prototype.removeAttachment = function(t4) { + var e3; + return (e3 = this.document.getRangeOfAttachment(t4)) ? (this.stopEditingAttachment(), this.setDocument(this.document.removeTextAtRange(e3)), this.setSelection(e3[0])) : void 0; + }, d.prototype.removeLastBlockAttribute = function() { + var t4, e3, n3, i2; + return n3 = this.getSelectedRange(), i2 = n3[0], e3 = n3[1], t4 = this.document.getBlockAtPosition(e3), this.removeCurrentAttribute(t4.getLastAttribute()), this.setSelection(i2); + }, f = " ", d.prototype.insertPlaceholder = function() { + return this.placeholderPosition = this.getPosition(), this.insertString(f); + }, d.prototype.selectPlaceholder = function() { + return this.placeholderPosition != null ? (this.setSelectedRange([this.placeholderPosition, this.placeholderPosition + f.length]), this.getSelectedRange()) : void 0; + }, d.prototype.forgetPlaceholder = function() { + return this.placeholderPosition = null; + }, d.prototype.hasCurrentAttribute = function(t4) { + var e3; + return e3 = this.currentAttributes[t4], e3 != null && e3 !== false; + }, d.prototype.toggleCurrentAttribute = function(t4) { + var e3; + return (e3 = !this.currentAttributes[t4]) ? this.setCurrentAttribute(t4, e3) : this.removeCurrentAttribute(t4); + }, d.prototype.canSetCurrentAttribute = function(t4) { + return o2(t4) ? this.canSetCurrentBlockAttribute(t4) : this.canSetCurrentTextAttribute(t4); + }, d.prototype.canSetCurrentTextAttribute = function() { + var t4, e3, n3, i2, o3; + if (e3 = this.getSelectedDocument()) { + for (o3 = e3.getAttachments(), n3 = 0, i2 = o3.length; i2 > n3; n3++) + if (t4 = o3[n3], !t4.hasContent()) + return false; + return true; + } + }, d.prototype.canSetCurrentBlockAttribute = function() { + var t4; + if (t4 = this.getBlock()) + return !t4.isTerminalBlock(); + }, d.prototype.setCurrentAttribute = function(t4, e3) { + return o2(t4) ? this.setBlockAttribute(t4, e3) : (this.setTextAttribute(t4, e3), this.currentAttributes[t4] = e3, this.notifyDelegateOfCurrentAttributesChange()); + }, d.prototype.setTextAttribute = function(t4, n3) { + var i2, o3, r3, s3; + if (o3 = this.getSelectedRange()) + return r3 = o3[0], i2 = o3[1], r3 !== i2 ? this.setDocument(this.document.addAttributeAtRange(t4, n3, o3)) : t4 === "href" ? (s3 = e2.Text.textForStringWithAttributes(n3, {href: n3}), this.insertText(s3)) : void 0; + }, d.prototype.setBlockAttribute = function(t4, e3) { + var n3, i2; + if (i2 = this.getSelectedRange()) + return this.canSetCurrentAttribute(t4) ? (n3 = this.getBlock(), this.setDocument(this.document.applyBlockAttributeAtRange(t4, e3, i2)), this.setSelection(i2)) : void 0; + }, d.prototype.removeCurrentAttribute = function(t4) { + return o2(t4) ? (this.removeBlockAttribute(t4), this.updateCurrentAttributes()) : (this.removeTextAttribute(t4), delete this.currentAttributes[t4], this.notifyDelegateOfCurrentAttributesChange()); + }, d.prototype.removeTextAttribute = function(t4) { + var e3; + if (e3 = this.getSelectedRange()) + return this.setDocument(this.document.removeAttributeAtRange(t4, e3)); + }, d.prototype.removeBlockAttribute = function(t4) { + var e3; + if (e3 = this.getSelectedRange()) + return this.setDocument(this.document.removeAttributeAtRange(t4, e3)); + }, d.prototype.canDecreaseNestingLevel = function() { + var t4; + return ((t4 = this.getBlock()) != null ? t4.getNestingLevel() : void 0) > 0; + }, d.prototype.canIncreaseNestingLevel = function() { + var e3, n3, i2; + if (e3 = this.getBlock()) + return ((i2 = o2(e3.getLastNestableAttribute())) != null ? i2.listAttribute : 0) ? (n3 = this.getPreviousBlock()) ? t3(n3.getListItemAttributes(), e3.getListItemAttributes()) : void 0 : e3.getNestingLevel() > 0; + }, d.prototype.decreaseNestingLevel = function() { + var t4; + if (t4 = this.getBlock()) + return this.setDocument(this.document.replaceBlock(t4, t4.decreaseNestingLevel())); + }, d.prototype.increaseNestingLevel = function() { + var t4; + if (t4 = this.getBlock()) + return this.setDocument(this.document.replaceBlock(t4, t4.increaseNestingLevel())); + }, d.prototype.canDecreaseBlockAttributeLevel = function() { + var t4; + return ((t4 = this.getBlock()) != null ? t4.getAttributeLevel() : void 0) > 0; + }, d.prototype.decreaseBlockAttributeLevel = function() { + var t4, e3; + return (t4 = (e3 = this.getBlock()) != null ? e3.getLastAttribute() : void 0) ? this.removeCurrentAttribute(t4) : void 0; + }, d.prototype.decreaseListLevel = function() { + var t4, e3, n3, i2, o3, r3; + for (r3 = this.getSelectedRange()[0], o3 = this.document.locationFromPosition(r3).index, n3 = o3, t4 = this.getBlock().getAttributeLevel(); (e3 = this.document.getBlockAtIndex(n3 + 1)) && e3.isListItem() && e3.getAttributeLevel() > t4; ) + n3++; + return r3 = this.document.positionFromLocation({index: o3, offset: 0}), i2 = this.document.positionFromLocation({index: n3, offset: 0}), this.setDocument(this.document.removeLastListAttributeAtRange([r3, i2])); + }, d.prototype.updateCurrentAttributes = function() { + var t4, e3, n3, o3, r3, s3; + if (s3 = this.getSelectedRange({ignoreLock: true})) { + for (e3 = this.document.getCommonAttributesAtRange(s3), r3 = i(), n3 = 0, o3 = r3.length; o3 > n3; n3++) + t4 = r3[n3], e3[t4] || this.canSetCurrentAttribute(t4) || (e3[t4] = false); + if (!a2(e3, this.currentAttributes)) + return this.currentAttributes = e3, this.notifyDelegateOfCurrentAttributesChange(); + } + }, d.prototype.getCurrentAttributes = function() { + return n2.call({}, this.currentAttributes); + }, d.prototype.getCurrentTextAttributes = function() { + var t4, e3, n3, i2; + t4 = {}, n3 = this.currentAttributes; + for (e3 in n3) + i2 = n3[e3], i2 !== false && r2(e3) && (t4[e3] = i2); + return t4; + }, d.prototype.freezeSelection = function() { + return this.setCurrentAttribute("frozen", true); + }, d.prototype.thawSelection = function() { + return this.removeCurrentAttribute("frozen"); + }, d.prototype.hasFrozenSelection = function() { + return this.hasCurrentAttribute("frozen"); + }, d.proxyMethod("getSelectionManager().getPointRange"), d.proxyMethod("getSelectionManager().setLocationRangeFromPointRange"), d.proxyMethod("getSelectionManager().createLocationRangeFromDOMRange"), d.proxyMethod("getSelectionManager().locationIsCursorTarget"), d.proxyMethod("getSelectionManager().selectionIsExpanded"), d.proxyMethod("delegate?.getSelectionManager"), d.prototype.setSelection = function(t4) { + var e3, n3; + return e3 = this.document.locationRangeFromRange(t4), (n3 = this.delegate) != null ? n3.compositionDidRequestChangingSelectionToLocationRange(e3) : void 0; + }, d.prototype.getSelectedRange = function() { + var t4; + return (t4 = this.getLocationRange()) ? this.document.rangeFromLocationRange(t4) : void 0; + }, d.prototype.setSelectedRange = function(t4) { + var e3; + return e3 = this.document.locationRangeFromRange(t4), this.getSelectionManager().setLocationRange(e3); + }, d.prototype.getPosition = function() { + var t4; + return (t4 = this.getLocationRange()) ? this.document.positionFromLocation(t4[0]) : void 0; + }, d.prototype.getLocationRange = function(t4) { + var e3, n3; + return (e3 = (n3 = this.targetLocationRange) != null ? n3 : this.getSelectionManager().getLocationRange(t4)) != null ? e3 : s2({index: 0, offset: 0}); + }, d.prototype.withTargetLocationRange = function(t4, e3) { + var n3; + this.targetLocationRange = t4; + try { + n3 = e3(); + } finally { + this.targetLocationRange = null; + } + return n3; + }, d.prototype.withTargetRange = function(t4, e3) { + var n3; + return n3 = this.document.locationRangeFromRange(t4), this.withTargetLocationRange(n3, e3); + }, d.prototype.withTargetDOMRange = function(t4, e3) { + var n3; + return n3 = this.createLocationRangeFromDOMRange(t4, {strict: false}), this.withTargetLocationRange(n3, e3); + }, d.prototype.getExpandedRangeInDirection = function(t4, e3) { + var n3, i2, o3, r3; + return i2 = (e3 != null ? e3 : {}).length, o3 = this.getSelectedRange(), r3 = o3[0], n3 = o3[1], t4 === "backward" ? i2 ? r3 -= i2 : r3 = this.translateUTF16PositionFromOffset(r3, -1) : i2 ? n3 += i2 : n3 = this.translateUTF16PositionFromOffset(n3, 1), s2([r3, n3]); + }, d.prototype.shouldManageMovingCursorInDirection = function(t4) { + var e3; + return this.editingAttachment ? true : (e3 = this.getExpandedRangeInDirection(t4), this.getAttachmentAtRange(e3) != null); + }, d.prototype.moveCursorInDirection = function(t4) { + var e3, n3, i2, o3; + return this.editingAttachment ? i2 = this.document.getRangeOfAttachment(this.editingAttachment) : (o3 = this.getSelectedRange(), i2 = this.getExpandedRangeInDirection(t4), n3 = !c2(o3, i2)), this.setSelectedRange(t4 === "backward" ? i2[0] : i2[1]), n3 && (e3 = this.getAttachmentAtRange(i2)) ? this.editAttachment(e3) : void 0; + }, d.prototype.expandSelectionInDirection = function(t4, e3) { + var n3, i2; + return n3 = (e3 != null ? e3 : {}).length, i2 = this.getExpandedRangeInDirection(t4, {length: n3}), this.setSelectedRange(i2); + }, d.prototype.expandSelectionForEditing = function() { + return this.hasCurrentAttribute("href") ? this.expandSelectionAroundCommonAttribute("href") : void 0; + }, d.prototype.expandSelectionAroundCommonAttribute = function(t4) { + var e3, n3; + return e3 = this.getPosition(), n3 = this.document.getRangeOfCommonAttributeAtPosition(t4, e3), this.setSelectedRange(n3); + }, d.prototype.selectionContainsAttachments = function() { + var t4; + return ((t4 = this.getSelectedAttachments()) != null ? t4.length : void 0) > 0; + }, d.prototype.selectionIsInCursorTarget = function() { + return this.editingAttachment || this.positionIsCursorTarget(this.getPosition()); + }, d.prototype.positionIsCursorTarget = function(t4) { + var e3; + return (e3 = this.document.locationFromPosition(t4)) ? this.locationIsCursorTarget(e3) : void 0; + }, d.prototype.positionIsBlockBreak = function(t4) { + var e3; + return (e3 = this.document.getPieceAtPosition(t4)) != null ? e3.isBlockBreak() : void 0; + }, d.prototype.getSelectedDocument = function() { + var t4; + return (t4 = this.getSelectedRange()) ? this.document.getDocumentAtRange(t4) : void 0; + }, d.prototype.getSelectedAttachments = function() { + var t4; + return (t4 = this.getSelectedDocument()) != null ? t4.getAttachments() : void 0; + }, d.prototype.getAttachments = function() { + return this.attachments.slice(0); + }, d.prototype.refreshAttachments = function() { + var t4, e3, n3, i2, o3, r3, s3, a3, u2, c3, h2, p4; + for (n3 = this.document.getAttachments(), a3 = l(this.attachments, n3), t4 = a3.added, h2 = a3.removed, this.attachments = n3, i2 = 0, r3 = h2.length; r3 > i2; i2++) + e3 = h2[i2], e3.delegate = null, (u2 = this.delegate) != null && typeof u2.compositionDidRemoveAttachment == "function" && u2.compositionDidRemoveAttachment(e3); + for (p4 = [], o3 = 0, s3 = t4.length; s3 > o3; o3++) + e3 = t4[o3], e3.delegate = this, p4.push((c3 = this.delegate) != null && typeof c3.compositionDidAddAttachment == "function" ? c3.compositionDidAddAttachment(e3) : void 0); + return p4; + }, d.prototype.attachmentDidChangeAttributes = function(t4) { + var e3; + return this.revision++, (e3 = this.delegate) != null && typeof e3.compositionDidEditAttachment == "function" ? e3.compositionDidEditAttachment(t4) : void 0; + }, d.prototype.attachmentDidChangePreviewURL = function(t4) { + var e3; + return this.revision++, (e3 = this.delegate) != null && typeof e3.compositionDidChangeAttachmentPreviewURL == "function" ? e3.compositionDidChangeAttachmentPreviewURL(t4) : void 0; + }, d.prototype.editAttachment = function(t4, e3) { + var n3; + if (t4 !== this.editingAttachment) + return this.stopEditingAttachment(), this.editingAttachment = t4, (n3 = this.delegate) != null && typeof n3.compositionDidStartEditingAttachment == "function" ? n3.compositionDidStartEditingAttachment(this.editingAttachment, e3) : void 0; + }, d.prototype.stopEditingAttachment = function() { + var t4; + if (this.editingAttachment) + return (t4 = this.delegate) != null && typeof t4.compositionDidStopEditingAttachment == "function" && t4.compositionDidStopEditingAttachment(this.editingAttachment), this.editingAttachment = null; + }, d.prototype.updateAttributesForAttachment = function(t4, e3) { + return this.setDocument(this.document.updateAttributesForAttachment(t4, e3)); + }, d.prototype.removeAttributeForAttachment = function(t4, e3) { + return this.setDocument(this.document.removeAttributeForAttachment(t4, e3)); + }, d.prototype.breakFormattedBlock = function(t4) { + var n3, i2, o3, r3, s3; + return i2 = t4.document, n3 = t4.block, r3 = t4.startPosition, s3 = [r3 - 1, r3], n3.getBlockBreakPosition() === t4.startLocation.offset ? (n3.breaksOnReturn() && t4.nextCharacter === "\n" ? r3 += 1 : i2 = i2.removeTextAtRange(s3), s3 = [r3, r3]) : t4.nextCharacter === "\n" ? t4.previousCharacter === "\n" ? s3 = [r3 - 1, r3 + 1] : (s3 = [r3, r3 + 1], r3 += 1) : t4.startLocation.offset - 1 !== 0 && (r3 += 1), o3 = new e2.Document([n3.removeLastAttribute().copyWithoutText()]), this.setDocument(i2.insertDocumentAtRange(o3, s3)), this.setSelection(r3); + }, d.prototype.getPreviousBlock = function() { + var t4, e3; + return (e3 = this.getLocationRange()) && (t4 = e3[0].index, t4 > 0) ? this.document.getBlockAtIndex(t4 - 1) : void 0; + }, d.prototype.getBlock = function() { + var t4; + return (t4 = this.getLocationRange()) ? this.document.getBlockAtIndex(t4[0].index) : void 0; + }, d.prototype.getAttachmentAtRange = function(t4) { + var n3; + return n3 = this.document.getDocumentAtRange(t4), n3.toString() === e2.OBJECT_REPLACEMENT_CHARACTER + "\n" ? n3.getAttachments()[0] : void 0; + }, d.prototype.notifyDelegateOfCurrentAttributesChange = function() { + var t4; + return (t4 = this.delegate) != null && typeof t4.compositionDidChangeCurrentAttributes == "function" ? t4.compositionDidChangeCurrentAttributes(this.currentAttributes) : void 0; + }, d.prototype.notifyDelegateOfInsertionAtRange = function(t4) { + var e3; + return (e3 = this.delegate) != null && typeof e3.compositionDidPerformInsertionAtRange == "function" ? e3.compositionDidPerformInsertionAtRange(t4) : void 0; + }, d.prototype.translateUTF16PositionFromOffset = function(t4, e3) { + var n3, i2; + return i2 = this.document.toUTF16String(), n3 = i2.offsetFromUCS2Offset(t4), i2.offsetToUCS2Offset(n3 + e3); + }, d; + }(e2.BasicObject); + }.call(this), function() { + var t3 = function(t4, e3) { + function i() { + this.constructor = t4; + } + for (var o2 in e3) + n2.call(e3, o2) && (t4[o2] = e3[o2]); + return i.prototype = e3.prototype, t4.prototype = new i(), t4.__super__ = e3.prototype, t4; + }, n2 = {}.hasOwnProperty; + e2.UndoManager = function(e3) { + function n3(t4) { + this.composition = t4, this.undoEntries = [], this.redoEntries = []; + } + var i; + return t3(n3, e3), n3.prototype.recordUndoEntry = function(t4, e4) { + var n4, o2, r2, s2, a2; + return s2 = e4 != null ? e4 : {}, o2 = s2.context, n4 = s2.consolidatable, r2 = this.undoEntries.slice(-1)[0], n4 && i(r2, t4, o2) ? void 0 : (a2 = this.createEntry({description: t4, context: o2}), this.undoEntries.push(a2), this.redoEntries = []); + }, n3.prototype.undo = function() { + var t4, e4; + return (e4 = this.undoEntries.pop()) ? (t4 = this.createEntry(e4), this.redoEntries.push(t4), this.composition.loadSnapshot(e4.snapshot)) : void 0; + }, n3.prototype.redo = function() { + var t4, e4; + return (t4 = this.redoEntries.pop()) ? (e4 = this.createEntry(t4), this.undoEntries.push(e4), this.composition.loadSnapshot(t4.snapshot)) : void 0; + }, n3.prototype.canUndo = function() { + return this.undoEntries.length > 0; + }, n3.prototype.canRedo = function() { + return this.redoEntries.length > 0; + }, n3.prototype.createEntry = function(t4) { + var e4, n4, i2; + return i2 = t4 != null ? t4 : {}, n4 = i2.description, e4 = i2.context, {description: n4 != null ? n4.toString() : void 0, context: JSON.stringify(e4), snapshot: this.composition.getSnapshot()}; + }, i = function(t4, e4, n4) { + return (t4 != null ? t4.description : void 0) === (e4 != null ? e4.toString() : void 0) && (t4 != null ? t4.context : void 0) === JSON.stringify(n4); + }, n3; + }(e2.BasicObject); + }.call(this), function() { + var t3; + e2.attachmentGalleryFilter = function(e3) { + var n2; + return n2 = new t3(e3), n2.perform(), n2.getSnapshot(); + }, t3 = function() { + function t4(t5) { + this.document = t5.document, this.selectedRange = t5.selectedRange; + } + var e3, n2, i; + return e3 = "attachmentGallery", n2 = "presentation", i = "gallery", t4.prototype.perform = function() { + return this.removeBlockAttribute(), this.applyBlockAttribute(); + }, t4.prototype.getSnapshot = function() { + return {document: this.document, selectedRange: this.selectedRange}; + }, t4.prototype.removeBlockAttribute = function() { + var t5, n3, i2, o2, r2; + for (o2 = this.findRangesOfBlocks(), r2 = [], t5 = 0, n3 = o2.length; n3 > t5; t5++) + i2 = o2[t5], r2.push(this.document = this.document.removeAttributeAtRange(e3, i2)); + return r2; + }, t4.prototype.applyBlockAttribute = function() { + var t5, n3, i2, o2, r2, s2; + for (i2 = 0, r2 = this.findRangesOfPieces(), s2 = [], t5 = 0, n3 = r2.length; n3 > t5; t5++) + o2 = r2[t5], o2[1] - o2[0] > 1 && (o2[0] += i2, o2[1] += i2, this.document.getCharacterAtPosition(o2[1]) !== "\n" && (this.document = this.document.insertBlockBreakAtRange(o2[1]), o2[1] < this.selectedRange[1] && this.moveSelectedRangeForward(), o2[1]++, i2++), o2[0] !== 0 && this.document.getCharacterAtPosition(o2[0] - 1) !== "\n" && (this.document = this.document.insertBlockBreakAtRange(o2[0]), o2[0] < this.selectedRange[0] && this.moveSelectedRangeForward(), o2[0]++, i2++), s2.push(this.document = this.document.applyBlockAttributeAtRange(e3, true, o2))); + return s2; + }, t4.prototype.findRangesOfBlocks = function() { + return this.document.findRangesForBlockAttribute(e3); + }, t4.prototype.findRangesOfPieces = function() { + return this.document.findRangesForTextAttribute(n2, {withValue: i}); + }, t4.prototype.moveSelectedRangeForward = function() { + return this.selectedRange[0] += 1, this.selectedRange[1] += 1; + }, t4; + }(); + }.call(this), function() { + var t3 = function(t4, e3) { + return function() { + return t4.apply(e3, arguments); + }; + }; + e2.Editor = function() { + function n2(n3, o2, r2) { + this.composition = n3, this.selectionManager = o2, this.element = r2, this.insertFiles = t3(this.insertFiles, this), this.undoManager = new e2.UndoManager(this.composition), this.filters = i.slice(0); + } + var i; + return i = [e2.attachmentGalleryFilter], n2.prototype.loadDocument = function(t4) { + return this.loadSnapshot({document: t4, selectedRange: [0, 0]}); + }, n2.prototype.loadHTML = function(t4) { + return t4 == null && (t4 = ""), this.loadDocument(e2.Document.fromHTML(t4, {referenceElement: this.element})); + }, n2.prototype.loadJSON = function(t4) { + var n3, i2; + return n3 = t4.document, i2 = t4.selectedRange, n3 = e2.Document.fromJSON(n3), this.loadSnapshot({document: n3, selectedRange: i2}); + }, n2.prototype.loadSnapshot = function(t4) { + return this.undoManager = new e2.UndoManager(this.composition), this.composition.loadSnapshot(t4); + }, n2.prototype.getDocument = function() { + return this.composition.document; + }, n2.prototype.getSelectedDocument = function() { + return this.composition.getSelectedDocument(); + }, n2.prototype.getSnapshot = function() { + return this.composition.getSnapshot(); + }, n2.prototype.toJSON = function() { + return this.getSnapshot(); + }, n2.prototype.deleteInDirection = function(t4) { + return this.composition.deleteInDirection(t4); + }, n2.prototype.insertAttachment = function(t4) { + return this.composition.insertAttachment(t4); + }, n2.prototype.insertAttachments = function(t4) { + return this.composition.insertAttachments(t4); + }, n2.prototype.insertDocument = function(t4) { + return this.composition.insertDocument(t4); + }, n2.prototype.insertFile = function(t4) { + return this.composition.insertFile(t4); + }, n2.prototype.insertFiles = function(t4) { + return this.composition.insertFiles(t4); + }, n2.prototype.insertHTML = function(t4) { + return this.composition.insertHTML(t4); + }, n2.prototype.insertString = function(t4) { + return this.composition.insertString(t4); + }, n2.prototype.insertText = function(t4) { + return this.composition.insertText(t4); + }, n2.prototype.insertLineBreak = function() { + return this.composition.insertLineBreak(); + }, n2.prototype.getSelectedRange = function() { + return this.composition.getSelectedRange(); + }, n2.prototype.getPosition = function() { + return this.composition.getPosition(); + }, n2.prototype.getClientRectAtPosition = function(t4) { + var e3; + return e3 = this.getDocument().locationRangeFromRange([t4, t4 + 1]), this.selectionManager.getClientRectAtLocationRange(e3); + }, n2.prototype.expandSelectionInDirection = function(t4) { + return this.composition.expandSelectionInDirection(t4); + }, n2.prototype.moveCursorInDirection = function(t4) { + return this.composition.moveCursorInDirection(t4); + }, n2.prototype.setSelectedRange = function(t4) { + return this.composition.setSelectedRange(t4); + }, n2.prototype.activateAttribute = function(t4, e3) { + return e3 == null && (e3 = true), this.composition.setCurrentAttribute(t4, e3); + }, n2.prototype.attributeIsActive = function(t4) { + return this.composition.hasCurrentAttribute(t4); + }, n2.prototype.canActivateAttribute = function(t4) { + return this.composition.canSetCurrentAttribute(t4); + }, n2.prototype.deactivateAttribute = function(t4) { + return this.composition.removeCurrentAttribute(t4); + }, n2.prototype.canDecreaseNestingLevel = function() { + return this.composition.canDecreaseNestingLevel(); + }, n2.prototype.canIncreaseNestingLevel = function() { + return this.composition.canIncreaseNestingLevel(); + }, n2.prototype.decreaseNestingLevel = function() { + return this.canDecreaseNestingLevel() ? this.composition.decreaseNestingLevel() : void 0; + }, n2.prototype.increaseNestingLevel = function() { + return this.canIncreaseNestingLevel() ? this.composition.increaseNestingLevel() : void 0; + }, n2.prototype.canRedo = function() { + return this.undoManager.canRedo(); + }, n2.prototype.canUndo = function() { + return this.undoManager.canUndo(); + }, n2.prototype.recordUndoEntry = function(t4, e3) { + var n3, i2, o2; + return o2 = e3 != null ? e3 : {}, i2 = o2.context, n3 = o2.consolidatable, this.undoManager.recordUndoEntry(t4, {context: i2, consolidatable: n3}); + }, n2.prototype.redo = function() { + return this.canRedo() ? this.undoManager.redo() : void 0; + }, n2.prototype.undo = function() { + return this.canUndo() ? this.undoManager.undo() : void 0; + }, n2; + }(); + }.call(this), function() { + var t3 = function(t4, e3) { + function i() { + this.constructor = t4; + } + for (var o2 in e3) + n2.call(e3, o2) && (t4[o2] = e3[o2]); + return i.prototype = e3.prototype, t4.prototype = new i(), t4.__super__ = e3.prototype, t4; + }, n2 = {}.hasOwnProperty; + e2.ManagedAttachment = function(e3) { + function n3(t4, e4) { + var n4; + this.attachmentManager = t4, this.attachment = e4, n4 = this.attachment, this.id = n4.id, this.file = n4.file; + } + return t3(n3, e3), n3.prototype.remove = function() { + return this.attachmentManager.requestRemovalOfAttachment(this.attachment); + }, n3.proxyMethod("attachment.getAttribute"), n3.proxyMethod("attachment.hasAttribute"), n3.proxyMethod("attachment.setAttribute"), n3.proxyMethod("attachment.getAttributes"), n3.proxyMethod("attachment.setAttributes"), n3.proxyMethod("attachment.isPending"), n3.proxyMethod("attachment.isPreviewable"), n3.proxyMethod("attachment.getURL"), n3.proxyMethod("attachment.getHref"), n3.proxyMethod("attachment.getFilename"), n3.proxyMethod("attachment.getFilesize"), n3.proxyMethod("attachment.getFormattedFilesize"), n3.proxyMethod("attachment.getExtension"), n3.proxyMethod("attachment.getContentType"), n3.proxyMethod("attachment.getFile"), n3.proxyMethod("attachment.setFile"), n3.proxyMethod("attachment.releaseFile"), n3.proxyMethod("attachment.getUploadProgress"), n3.proxyMethod("attachment.setUploadProgress"), n3; + }(e2.BasicObject); + }.call(this), function() { + var t3 = function(t4, e3) { + function i() { + this.constructor = t4; + } + for (var o2 in e3) + n2.call(e3, o2) && (t4[o2] = e3[o2]); + return i.prototype = e3.prototype, t4.prototype = new i(), t4.__super__ = e3.prototype, t4; + }, n2 = {}.hasOwnProperty; + e2.AttachmentManager = function(n3) { + function i(t4) { + var e3, n4, i2; + for (t4 == null && (t4 = []), this.managedAttachments = {}, n4 = 0, i2 = t4.length; i2 > n4; n4++) + e3 = t4[n4], this.manageAttachment(e3); + } + return t3(i, n3), i.prototype.getAttachments = function() { + var t4, e3, n4, i2; + n4 = this.managedAttachments, i2 = []; + for (e3 in n4) + t4 = n4[e3], i2.push(t4); + return i2; + }, i.prototype.manageAttachment = function(t4) { + var n4, i2; + return (n4 = this.managedAttachments)[i2 = t4.id] != null ? n4[i2] : n4[i2] = new e2.ManagedAttachment(this, t4); + }, i.prototype.attachmentIsManaged = function(t4) { + return t4.id in this.managedAttachments; + }, i.prototype.requestRemovalOfAttachment = function(t4) { + var e3; + return this.attachmentIsManaged(t4) && (e3 = this.delegate) != null && typeof e3.attachmentManagerDidRequestRemovalOfAttachment == "function" ? e3.attachmentManagerDidRequestRemovalOfAttachment(t4) : void 0; + }, i.prototype.unmanageAttachment = function(t4) { + var e3; + return e3 = this.managedAttachments[t4.id], delete this.managedAttachments[t4.id], e3; + }, i; + }(e2.BasicObject); + }.call(this), function() { + var t3, n2, i, o2, r2, s2, a2, u, c2, l, h; + t3 = e2.elementContainsNode, n2 = e2.findChildIndexOfNode, r2 = e2.nodeIsBlockStart, s2 = e2.nodeIsBlockStartComment, o2 = e2.nodeIsBlockContainer, a2 = e2.nodeIsCursorTarget, u = e2.nodeIsEmptyTextNode, c2 = e2.nodeIsTextNode, i = e2.nodeIsAttachmentElement, l = e2.tagName, h = e2.walkTree, e2.LocationMapper = function() { + function e3(t4) { + this.element = t4; + } + var p2, d, f, g; + return e3.prototype.findLocationFromContainerAndOffset = function(e4, i2, o3) { + var s3, u2, l2, p3, g2, m, v; + for (m = (o3 != null ? o3 : {strict: true}).strict, u2 = 0, l2 = false, p3 = {index: 0, offset: 0}, (s3 = this.findAttachmentElementParentForNode(e4)) && (e4 = s3.parentNode, i2 = n2(s3)), v = h(this.element, {usingFilter: f}); v.nextNode(); ) { + if (g2 = v.currentNode, g2 === e4 && c2(e4)) { + a2(g2) || (p3.offset += i2); + break; + } + if (g2.parentNode === e4) { + if (u2++ === i2) + break; + } else if (!t3(e4, g2) && u2 > 0) + break; + r2(g2, {strict: m}) ? (l2 && p3.index++, p3.offset = 0, l2 = true) : p3.offset += d(g2); + } + return p3; + }, e3.prototype.findContainerAndOffsetFromLocation = function(t4) { + var e4, i2, s3, u2, l2; + if (t4.index === 0 && t4.offset === 0) { + for (e4 = this.element, u2 = 0; e4.firstChild; ) + if (e4 = e4.firstChild, o2(e4)) { + u2 = 1; + break; + } + return [e4, u2]; + } + if (l2 = this.findNodeAndOffsetFromLocation(t4), i2 = l2[0], s3 = l2[1], i2) { + if (c2(i2)) + d(i2) === 0 ? (e4 = i2.parentNode.parentNode, u2 = n2(i2.parentNode), a2(i2, {name: "right"}) && u2++) : (e4 = i2, u2 = t4.offset - s3); + else { + if (e4 = i2.parentNode, !r2(i2.previousSibling) && !o2(e4)) + for (; i2 === e4.lastChild && (i2 = e4, e4 = e4.parentNode, !o2(e4)); ) + ; + u2 = n2(i2), t4.offset !== 0 && u2++; + } + return [e4, u2]; + } + }, e3.prototype.findNodeAndOffsetFromLocation = function(t4) { + var e4, n3, i2, o3, r3, s3, u2, l2; + for (u2 = 0, l2 = this.getSignificantNodesForIndex(t4.index), n3 = 0, i2 = l2.length; i2 > n3; n3++) { + if (e4 = l2[n3], o3 = d(e4), t4.offset <= u2 + o3) + if (c2(e4)) { + if (r3 = e4, s3 = u2, t4.offset === s3 && a2(r3)) + break; + } else + r3 || (r3 = e4, s3 = u2); + if (u2 += o3, u2 > t4.offset) + break; + } + return [r3, s3]; + }, e3.prototype.findAttachmentElementParentForNode = function(t4) { + for (; t4 && t4 !== this.element; ) { + if (i(t4)) + return t4; + t4 = t4.parentNode; + } + }, e3.prototype.getSignificantNodesForIndex = function(t4) { + var e4, n3, i2, o3, r3; + for (i2 = [], r3 = h(this.element, {usingFilter: p2}), o3 = false; r3.nextNode(); ) + if (n3 = r3.currentNode, s2(n3)) { + if (typeof e4 != "undefined" && e4 !== null ? e4++ : e4 = 0, e4 === t4) + o3 = true; + else if (o3) + break; + } else + o3 && i2.push(n3); + return i2; + }, d = function(t4) { + var e4; + return t4.nodeType === Node.TEXT_NODE ? a2(t4) ? 0 : (e4 = t4.textContent, e4.length) : l(t4) === "br" || i(t4) ? 1 : 0; + }, p2 = function(t4) { + return g(t4) === NodeFilter.FILTER_ACCEPT ? f(t4) : NodeFilter.FILTER_REJECT; + }, g = function(t4) { + return u(t4) ? NodeFilter.FILTER_REJECT : NodeFilter.FILTER_ACCEPT; + }, f = function(t4) { + return i(t4.parentNode) ? NodeFilter.FILTER_REJECT : NodeFilter.FILTER_ACCEPT; + }, e3; + }(); + }.call(this), function() { + var t3, n2, i = [].slice; + t3 = e2.getDOMRange, n2 = e2.setDOMRange, e2.PointMapper = function() { + function e3() { + } + return e3.prototype.createDOMRangeFromPoint = function(e4) { + var i2, o2, r2, s2, a2, u, c2, l; + if (c2 = e4.x, l = e4.y, document.caretPositionFromPoint) + return a2 = document.caretPositionFromPoint(c2, l), r2 = a2.offsetNode, o2 = a2.offset, i2 = document.createRange(), i2.setStart(r2, o2), i2; + if (document.caretRangeFromPoint) + return document.caretRangeFromPoint(c2, l); + if (document.body.createTextRange) { + s2 = t3(); + try { + u = document.body.createTextRange(), u.moveToPoint(c2, l), u.select(); + } catch (h) { + } + return i2 = t3(), n2(s2), i2; + } + }, e3.prototype.getClientRectsForDOMRange = function(t4) { + var e4, n3, o2; + return n3 = i.call(t4.getClientRects()), o2 = n3[0], e4 = n3[n3.length - 1], [o2, e4]; + }, e3; + }(); + }.call(this), function() { + var t3, n2 = function(t4, e3) { + return function() { + return t4.apply(e3, arguments); + }; + }, i = function(t4, e3) { + function n3() { + this.constructor = t4; + } + for (var i2 in e3) + o2.call(e3, i2) && (t4[i2] = e3[i2]); + return n3.prototype = e3.prototype, t4.prototype = new n3(), t4.__super__ = e3.prototype, t4; + }, o2 = {}.hasOwnProperty, r2 = [].indexOf || function(t4) { + for (var e3 = 0, n3 = this.length; n3 > e3; e3++) + if (e3 in this && this[e3] === t4) + return e3; + return -1; + }; + t3 = e2.getDOMRange, e2.SelectionChangeObserver = function(e3) { + function o3() { + this.run = n2(this.run, this), this.update = n2(this.update, this), this.selectionManagers = []; + } + var s2; + return i(o3, e3), o3.prototype.start = function() { + return this.started ? void 0 : (this.started = true, "onselectionchange" in document ? document.addEventListener("selectionchange", this.update, true) : this.run()); + }, o3.prototype.stop = function() { + return this.started ? (this.started = false, document.removeEventListener("selectionchange", this.update, true)) : void 0; + }, o3.prototype.registerSelectionManager = function(t4) { + return r2.call(this.selectionManagers, t4) < 0 ? (this.selectionManagers.push(t4), this.start()) : void 0; + }, o3.prototype.unregisterSelectionManager = function(t4) { + var e4; + return this.selectionManagers = function() { + var n3, i2, o4, r3; + for (o4 = this.selectionManagers, r3 = [], n3 = 0, i2 = o4.length; i2 > n3; n3++) + e4 = o4[n3], e4 !== t4 && r3.push(e4); + return r3; + }.call(this), this.selectionManagers.length === 0 ? this.stop() : void 0; + }, o3.prototype.notifySelectionManagersOfSelectionChange = function() { + var t4, e4, n3, i2, o4; + for (n3 = this.selectionManagers, i2 = [], t4 = 0, e4 = n3.length; e4 > t4; t4++) + o4 = n3[t4], i2.push(o4.selectionDidChange()); + return i2; + }, o3.prototype.update = function() { + var e4; + return e4 = t3(), s2(e4, this.domRange) ? void 0 : (this.domRange = e4, this.notifySelectionManagersOfSelectionChange()); + }, o3.prototype.reset = function() { + return this.domRange = null, this.update(); + }, o3.prototype.run = function() { + return this.started ? (this.update(), requestAnimationFrame(this.run)) : void 0; + }, s2 = function(t4, e4) { + return (t4 != null ? t4.startContainer : void 0) === (e4 != null ? e4.startContainer : void 0) && (t4 != null ? t4.startOffset : void 0) === (e4 != null ? e4.startOffset : void 0) && (t4 != null ? t4.endContainer : void 0) === (e4 != null ? e4.endContainer : void 0) && (t4 != null ? t4.endOffset : void 0) === (e4 != null ? e4.endOffset : void 0); + }, o3; + }(e2.BasicObject), e2.selectionChangeObserver == null && (e2.selectionChangeObserver = new e2.SelectionChangeObserver()); + }.call(this), function() { + var t3, n2, i, o2, r2, s2, a2, u, c2, l, h = function(t4, e3) { + return function() { + return t4.apply(e3, arguments); + }; + }, p2 = function(t4, e3) { + function n3() { + this.constructor = t4; + } + for (var i2 in e3) + d.call(e3, i2) && (t4[i2] = e3[i2]); + return n3.prototype = e3.prototype, t4.prototype = new n3(), t4.__super__ = e3.prototype, t4; + }, d = {}.hasOwnProperty; + i = e2.getDOMSelection, n2 = e2.getDOMRange, l = e2.setDOMRange, t3 = e2.elementContainsNode, s2 = e2.nodeIsCursorTarget, r2 = e2.innerElementIsActive, o2 = e2.handleEvent, a2 = e2.normalizeRange, u = e2.rangeIsCollapsed, c2 = e2.rangesAreEqual, e2.SelectionManager = function(d2) { + function f(t4) { + this.element = t4, this.selectionDidChange = h(this.selectionDidChange, this), this.didMouseDown = h(this.didMouseDown, this), this.locationMapper = new e2.LocationMapper(this.element), this.pointMapper = new e2.PointMapper(), this.lockCount = 0, o2("mousedown", {onElement: this.element, withCallback: this.didMouseDown}); + } + return p2(f, d2), f.prototype.getLocationRange = function(t4) { + var e3, i2; + return t4 == null && (t4 = {}), e3 = t4.strict === false ? this.createLocationRangeFromDOMRange(n2(), {strict: false}) : t4.ignoreLock ? this.currentLocationRange : (i2 = this.lockedLocationRange) != null ? i2 : this.currentLocationRange; + }, f.prototype.setLocationRange = function(t4) { + var e3; + if (!this.lockedLocationRange) + return t4 = a2(t4), (e3 = this.createDOMRangeFromLocationRange(t4)) ? (l(e3), this.updateCurrentLocationRange(t4)) : void 0; + }, f.prototype.setLocationRangeFromPointRange = function(t4) { + var e3, n3; + return t4 = a2(t4), n3 = this.getLocationAtPoint(t4[0]), e3 = this.getLocationAtPoint(t4[1]), this.setLocationRange([n3, e3]); + }, f.prototype.getClientRectAtLocationRange = function(t4) { + var e3; + return (e3 = this.createDOMRangeFromLocationRange(t4)) ? this.getClientRectsForDOMRange(e3)[1] : void 0; + }, f.prototype.locationIsCursorTarget = function(t4) { + var e3, n3, i2; + return i2 = this.findNodeAndOffsetFromLocation(t4), e3 = i2[0], n3 = i2[1], s2(e3); + }, f.prototype.lock = function() { + return this.lockCount++ === 0 ? (this.updateCurrentLocationRange(), this.lockedLocationRange = this.getLocationRange()) : void 0; + }, f.prototype.unlock = function() { + var t4; + return --this.lockCount === 0 && (t4 = this.lockedLocationRange, this.lockedLocationRange = null, t4 != null) ? this.setLocationRange(t4) : void 0; + }, f.prototype.clearSelection = function() { + var t4; + return (t4 = i()) != null ? t4.removeAllRanges() : void 0; + }, f.prototype.selectionIsCollapsed = function() { + var t4; + return ((t4 = n2()) != null ? t4.collapsed : void 0) === true; + }, f.prototype.selectionIsExpanded = function() { + return !this.selectionIsCollapsed(); + }, f.prototype.createLocationRangeFromDOMRange = function(t4, e3) { + var n3, i2; + if (t4 != null && this.domRangeWithinElement(t4) && (i2 = this.findLocationFromContainerAndOffset(t4.startContainer, t4.startOffset, e3))) + return t4.collapsed || (n3 = this.findLocationFromContainerAndOffset(t4.endContainer, t4.endOffset, e3)), a2([i2, n3]); + }, f.proxyMethod("locationMapper.findLocationFromContainerAndOffset"), f.proxyMethod("locationMapper.findContainerAndOffsetFromLocation"), f.proxyMethod("locationMapper.findNodeAndOffsetFromLocation"), f.proxyMethod("pointMapper.createDOMRangeFromPoint"), f.proxyMethod("pointMapper.getClientRectsForDOMRange"), f.prototype.didMouseDown = function() { + return this.pauseTemporarily(); + }, f.prototype.pauseTemporarily = function() { + var e3, n3, i2, r3; + return this.paused = true, n3 = function(e4) { + return function() { + var n4, o3, s3; + for (e4.paused = false, clearTimeout(r3), o3 = 0, s3 = i2.length; s3 > o3; o3++) + n4 = i2[o3], n4.destroy(); + return t3(document, e4.element) ? e4.selectionDidChange() : void 0; + }; + }(this), r3 = setTimeout(n3, 200), i2 = function() { + var t4, i3, r4, s3; + for (r4 = ["mousemove", "keydown"], s3 = [], t4 = 0, i3 = r4.length; i3 > t4; t4++) + e3 = r4[t4], s3.push(o2(e3, {onElement: document, withCallback: n3})); + return s3; + }(); + }, f.prototype.selectionDidChange = function() { + return this.paused || r2(this.element) ? void 0 : this.updateCurrentLocationRange(); + }, f.prototype.updateCurrentLocationRange = function(t4) { + var e3; + return (t4 != null ? t4 : t4 = this.createLocationRangeFromDOMRange(n2())) && !c2(t4, this.currentLocationRange) ? (this.currentLocationRange = t4, (e3 = this.delegate) != null && typeof e3.locationRangeDidChange == "function" ? e3.locationRangeDidChange(this.currentLocationRange.slice(0)) : void 0) : void 0; + }, f.prototype.createDOMRangeFromLocationRange = function(t4) { + var e3, n3, i2, o3; + return i2 = this.findContainerAndOffsetFromLocation(t4[0]), n3 = u(t4) ? i2 : (o3 = this.findContainerAndOffsetFromLocation(t4[1])) != null ? o3 : i2, i2 != null && n3 != null ? (e3 = document.createRange(), e3.setStart.apply(e3, i2), e3.setEnd.apply(e3, n3), e3) : void 0; + }, f.prototype.getLocationAtPoint = function(t4) { + var e3, n3; + return (e3 = this.createDOMRangeFromPoint(t4)) && (n3 = this.createLocationRangeFromDOMRange(e3)) != null ? n3[0] : void 0; + }, f.prototype.domRangeWithinElement = function(e3) { + return e3.collapsed ? t3(this.element, e3.startContainer) : t3(this.element, e3.startContainer) && t3(this.element, e3.endContainer); + }, f; + }(e2.BasicObject); + }.call(this), function() { + var t3, n2, i, o2, r2 = function(t4, e3) { + function n3() { + this.constructor = t4; + } + for (var i2 in e3) + s2.call(e3, i2) && (t4[i2] = e3[i2]); + return n3.prototype = e3.prototype, t4.prototype = new n3(), t4.__super__ = e3.prototype, t4; + }, s2 = {}.hasOwnProperty, a2 = [].slice; + i = e2.rangeIsCollapsed, o2 = e2.rangesAreEqual, n2 = e2.objectsAreEqual, t3 = e2.getBlockConfig, e2.EditorController = function(s3) { + function u(t4) { + var n3, i2; + this.editorElement = t4.editorElement, n3 = t4.document, i2 = t4.html, this.selectionManager = new e2.SelectionManager(this.editorElement), this.selectionManager.delegate = this, this.composition = new e2.Composition(), this.composition.delegate = this, this.attachmentManager = new e2.AttachmentManager(this.composition.getAttachments()), this.attachmentManager.delegate = this, this.inputController = new e2["Level" + e2.config.input.getLevel() + "InputController"](this.editorElement), this.inputController.delegate = this, this.inputController.responder = this.composition, this.compositionController = new e2.CompositionController(this.editorElement, this.composition), this.compositionController.delegate = this, this.toolbarController = new e2.ToolbarController(this.editorElement.toolbarElement), this.toolbarController.delegate = this, this.editor = new e2.Editor(this.composition, this.selectionManager, this.editorElement), n3 != null ? this.editor.loadDocument(n3) : this.editor.loadHTML(i2); + } + var c2; + return r2(u, s3), u.prototype.registerSelectionManager = function() { + return e2.selectionChangeObserver.registerSelectionManager(this.selectionManager); + }, u.prototype.unregisterSelectionManager = function() { + return e2.selectionChangeObserver.unregisterSelectionManager(this.selectionManager); + }, u.prototype.render = function() { + return this.compositionController.render(); + }, u.prototype.reparse = function() { + return this.composition.replaceHTML(this.editorElement.innerHTML); + }, u.prototype.compositionDidChangeDocument = function() { + return this.notifyEditorElement("document-change"), this.handlingInput ? void 0 : this.render(); + }, u.prototype.compositionDidChangeCurrentAttributes = function(t4) { + return this.currentAttributes = t4, this.toolbarController.updateAttributes(this.currentAttributes), this.updateCurrentActions(), this.notifyEditorElement("attributes-change", {attributes: this.currentAttributes}); + }, u.prototype.compositionDidPerformInsertionAtRange = function(t4) { + return this.pasting ? this.pastedRange = t4 : void 0; + }, u.prototype.compositionShouldAcceptFile = function(t4) { + return this.notifyEditorElement("file-accept", {file: t4}); + }, u.prototype.compositionDidAddAttachment = function(t4) { + var e3; + return e3 = this.attachmentManager.manageAttachment(t4), this.notifyEditorElement("attachment-add", {attachment: e3}); + }, u.prototype.compositionDidEditAttachment = function(t4) { + var e3; + return this.compositionController.rerenderViewForObject(t4), e3 = this.attachmentManager.manageAttachment(t4), this.notifyEditorElement("attachment-edit", {attachment: e3}), this.notifyEditorElement("change"); + }, u.prototype.compositionDidChangeAttachmentPreviewURL = function(t4) { + return this.compositionController.invalidateViewForObject(t4), this.notifyEditorElement("change"); + }, u.prototype.compositionDidRemoveAttachment = function(t4) { + var e3; + return e3 = this.attachmentManager.unmanageAttachment(t4), this.notifyEditorElement("attachment-remove", {attachment: e3}); + }, u.prototype.compositionDidStartEditingAttachment = function(t4, e3) { + return this.attachmentLocationRange = this.composition.document.getLocationRangeOfAttachment(t4), this.compositionController.installAttachmentEditorForAttachment(t4, e3), this.selectionManager.setLocationRange(this.attachmentLocationRange); + }, u.prototype.compositionDidStopEditingAttachment = function() { + return this.compositionController.uninstallAttachmentEditor(), this.attachmentLocationRange = null; + }, u.prototype.compositionDidRequestChangingSelectionToLocationRange = function(t4) { + return !this.loadingSnapshot || this.isFocused() ? (this.requestedLocationRange = t4, this.compositionRevisionWhenLocationRangeRequested = this.composition.revision, this.handlingInput ? void 0 : this.render()) : void 0; + }, u.prototype.compositionWillLoadSnapshot = function() { + return this.loadingSnapshot = true; + }, u.prototype.compositionDidLoadSnapshot = function() { + return this.compositionController.refreshViewCache(), this.render(), this.loadingSnapshot = false; + }, u.prototype.getSelectionManager = function() { + return this.selectionManager; + }, u.proxyMethod("getSelectionManager().setLocationRange"), u.proxyMethod("getSelectionManager().getLocationRange"), u.prototype.attachmentManagerDidRequestRemovalOfAttachment = function(t4) { + return this.removeAttachment(t4); + }, u.prototype.compositionControllerWillSyncDocumentView = function() { + return this.inputController.editorWillSyncDocumentView(), this.selectionManager.lock(), this.selectionManager.clearSelection(); + }, u.prototype.compositionControllerDidSyncDocumentView = function() { + return this.inputController.editorDidSyncDocumentView(), this.selectionManager.unlock(), this.updateCurrentActions(), this.notifyEditorElement("sync"); + }, u.prototype.compositionControllerDidRender = function() { + return this.requestedLocationRange != null && (this.compositionRevisionWhenLocationRangeRequested === this.composition.revision && this.selectionManager.setLocationRange(this.requestedLocationRange), this.requestedLocationRange = null, this.compositionRevisionWhenLocationRangeRequested = null), this.renderedCompositionRevision !== this.composition.revision && (this.runEditorFilters(), this.composition.updateCurrentAttributes(), this.notifyEditorElement("render")), this.renderedCompositionRevision = this.composition.revision; + }, u.prototype.compositionControllerDidFocus = function() { + return this.isFocusedInvisibly() && this.setLocationRange({index: 0, offset: 0}), this.toolbarController.hideDialog(), this.notifyEditorElement("focus"); + }, u.prototype.compositionControllerDidBlur = function() { + return this.notifyEditorElement("blur"); + }, u.prototype.compositionControllerDidSelectAttachment = function(t4, e3) { + return this.toolbarController.hideDialog(), this.composition.editAttachment(t4, e3); + }, u.prototype.compositionControllerDidRequestDeselectingAttachment = function(t4) { + var e3, n3; + return e3 = (n3 = this.attachmentLocationRange) != null ? n3 : this.composition.document.getLocationRangeOfAttachment(t4), this.selectionManager.setLocationRange(e3[1]); + }, u.prototype.compositionControllerWillUpdateAttachment = function(t4) { + return this.editor.recordUndoEntry("Edit Attachment", {context: t4.id, consolidatable: true}); + }, u.prototype.compositionControllerDidRequestRemovalOfAttachment = function(t4) { + return this.removeAttachment(t4); + }, u.prototype.inputControllerWillHandleInput = function() { + return this.handlingInput = true, this.requestedRender = false; + }, u.prototype.inputControllerDidRequestRender = function() { + return this.requestedRender = true; + }, u.prototype.inputControllerDidHandleInput = function() { + return this.handlingInput = false, this.requestedRender ? (this.requestedRender = false, this.render()) : void 0; + }, u.prototype.inputControllerDidAllowUnhandledInput = function() { + return this.notifyEditorElement("change"); + }, u.prototype.inputControllerDidRequestReparse = function() { + return this.reparse(); + }, u.prototype.inputControllerWillPerformTyping = function() { + return this.recordTypingUndoEntry(); + }, u.prototype.inputControllerWillPerformFormatting = function(t4) { + return this.recordFormattingUndoEntry(t4); + }, u.prototype.inputControllerWillCutText = function() { + return this.editor.recordUndoEntry("Cut"); + }, u.prototype.inputControllerWillPaste = function(t4) { + return this.editor.recordUndoEntry("Paste"), this.pasting = true, this.notifyEditorElement("before-paste", {paste: t4}); + }, u.prototype.inputControllerDidPaste = function(t4) { + return t4.range = this.pastedRange, this.pastedRange = null, this.pasting = null, this.notifyEditorElement("paste", {paste: t4}); + }, u.prototype.inputControllerWillMoveText = function() { + return this.editor.recordUndoEntry("Move"); + }, u.prototype.inputControllerWillAttachFiles = function() { + return this.editor.recordUndoEntry("Drop Files"); + }, u.prototype.inputControllerWillPerformUndo = function() { + return this.editor.undo(); + }, u.prototype.inputControllerWillPerformRedo = function() { + return this.editor.redo(); + }, u.prototype.inputControllerDidReceiveKeyboardCommand = function(t4) { + return this.toolbarController.applyKeyboardCommand(t4); + }, u.prototype.inputControllerDidStartDrag = function() { + return this.locationRangeBeforeDrag = this.selectionManager.getLocationRange(); + }, u.prototype.inputControllerDidReceiveDragOverPoint = function(t4) { + return this.selectionManager.setLocationRangeFromPointRange(t4); + }, u.prototype.inputControllerDidCancelDrag = function() { + return this.selectionManager.setLocationRange(this.locationRangeBeforeDrag), this.locationRangeBeforeDrag = null; + }, u.prototype.locationRangeDidChange = function(t4) { + return this.composition.updateCurrentAttributes(), this.updateCurrentActions(), this.attachmentLocationRange && !o2(this.attachmentLocationRange, t4) && this.composition.stopEditingAttachment(), this.notifyEditorElement("selection-change"); + }, u.prototype.toolbarDidClickButton = function() { + return this.getLocationRange() ? void 0 : this.setLocationRange({index: 0, offset: 0}); + }, u.prototype.toolbarDidInvokeAction = function(t4) { + return this.invokeAction(t4); + }, u.prototype.toolbarDidToggleAttribute = function(t4) { + return this.recordFormattingUndoEntry(t4), this.composition.toggleCurrentAttribute(t4), this.render(), this.selectionFrozen ? void 0 : this.editorElement.focus(); + }, u.prototype.toolbarDidUpdateAttribute = function(t4, e3) { + return this.recordFormattingUndoEntry(t4), this.composition.setCurrentAttribute(t4, e3), this.render(), this.selectionFrozen ? void 0 : this.editorElement.focus(); + }, u.prototype.toolbarDidRemoveAttribute = function(t4) { + return this.recordFormattingUndoEntry(t4), this.composition.removeCurrentAttribute(t4), this.render(), this.selectionFrozen ? void 0 : this.editorElement.focus(); + }, u.prototype.toolbarWillShowDialog = function() { + return this.composition.expandSelectionForEditing(), this.freezeSelection(); + }, u.prototype.toolbarDidShowDialog = function(t4) { + return this.notifyEditorElement("toolbar-dialog-show", {dialogName: t4}); + }, u.prototype.toolbarDidHideDialog = function(t4) { + return this.thawSelection(), this.editorElement.focus(), this.notifyEditorElement("toolbar-dialog-hide", {dialogName: t4}); + }, u.prototype.freezeSelection = function() { + return this.selectionFrozen ? void 0 : (this.selectionManager.lock(), this.composition.freezeSelection(), this.selectionFrozen = true, this.render()); + }, u.prototype.thawSelection = function() { + return this.selectionFrozen ? (this.composition.thawSelection(), this.selectionManager.unlock(), this.selectionFrozen = false, this.render()) : void 0; + }, u.prototype.actions = {undo: {test: function() { + return this.editor.canUndo(); + }, perform: function() { + return this.editor.undo(); + }}, redo: {test: function() { + return this.editor.canRedo(); + }, perform: function() { + return this.editor.redo(); + }}, link: {test: function() { + return this.editor.canActivateAttribute("href"); + }}, increaseNestingLevel: {test: function() { + return this.editor.canIncreaseNestingLevel(); + }, perform: function() { + return this.editor.increaseNestingLevel() && this.render(); + }}, decreaseNestingLevel: {test: function() { + return this.editor.canDecreaseNestingLevel(); + }, perform: function() { + return this.editor.decreaseNestingLevel() && this.render(); + }}, attachFiles: {test: function() { + return true; + }, perform: function() { + return e2.config.input.pickFiles(this.editor.insertFiles); + }}}, u.prototype.canInvokeAction = function(t4) { + var e3, n3; + return this.actionIsExternal(t4) ? true : !!((e3 = this.actions[t4]) != null && (n3 = e3.test) != null ? n3.call(this) : void 0); + }, u.prototype.invokeAction = function(t4) { + var e3, n3; + return this.actionIsExternal(t4) ? this.notifyEditorElement("action-invoke", {actionName: t4}) : (e3 = this.actions[t4]) != null && (n3 = e3.perform) != null ? n3.call(this) : void 0; + }, u.prototype.actionIsExternal = function(t4) { + return /^x-./.test(t4); + }, u.prototype.getCurrentActions = function() { + var t4, e3; + e3 = {}; + for (t4 in this.actions) + e3[t4] = this.canInvokeAction(t4); + return e3; + }, u.prototype.updateCurrentActions = function() { + var t4; + return t4 = this.getCurrentActions(), n2(t4, this.currentActions) ? void 0 : (this.currentActions = t4, this.toolbarController.updateActions(this.currentActions), this.notifyEditorElement("actions-change", {actions: this.currentActions})); + }, u.prototype.runEditorFilters = function() { + var t4, e3, n3, i2, o3, r3, s4, a3; + for (a3 = this.composition.getSnapshot(), o3 = this.editor.filters, n3 = 0, i2 = o3.length; i2 > n3; n3++) + e3 = o3[n3], t4 = a3.document, s4 = a3.selectedRange, a3 = (r3 = e3.call(this.editor, a3)) != null ? r3 : {}, a3.document == null && (a3.document = t4), a3.selectedRange == null && (a3.selectedRange = s4); + return c2(a3, this.composition.getSnapshot()) ? void 0 : this.composition.loadSnapshot(a3); + }, c2 = function(t4, e3) { + return o2(t4.selectedRange, e3.selectedRange) && t4.document.isEqualTo(e3.document); + }, u.prototype.updateInputElement = function() { + var t4, n3; + return t4 = this.compositionController.getSerializableElement(), n3 = e2.serializeToContentType(t4, "text/html"), this.editorElement.setInputElementValue(n3); + }, u.prototype.notifyEditorElement = function(t4, e3) { + switch (t4) { + case "document-change": + this.documentChangedSinceLastRender = true; + break; + case "render": + this.documentChangedSinceLastRender && (this.documentChangedSinceLastRender = false, this.notifyEditorElement("change")); + break; + case "change": + case "attachment-add": + case "attachment-edit": + case "attachment-remove": + this.updateInputElement(); + } + return this.editorElement.notify(t4, e3); + }, u.prototype.removeAttachment = function(t4) { + return this.editor.recordUndoEntry("Delete Attachment"), this.composition.removeAttachment(t4), this.render(); + }, u.prototype.recordFormattingUndoEntry = function(e3) { + var n3, o3; + return n3 = t3(e3), o3 = this.selectionManager.getLocationRange(), n3 || !i(o3) ? this.editor.recordUndoEntry("Formatting", {context: this.getUndoContext(), consolidatable: true}) : void 0; + }, u.prototype.recordTypingUndoEntry = function() { + return this.editor.recordUndoEntry("Typing", {context: this.getUndoContext(this.currentAttributes), consolidatable: true}); + }, u.prototype.getUndoContext = function() { + var t4; + return t4 = 1 <= arguments.length ? a2.call(arguments, 0) : [], [this.getLocationContext(), this.getTimeContext()].concat(a2.call(t4)); + }, u.prototype.getLocationContext = function() { + var t4; + return t4 = this.selectionManager.getLocationRange(), i(t4) ? t4[0].index : t4; + }, u.prototype.getTimeContext = function() { + return e2.config.undoInterval > 0 ? Math.floor(new Date().getTime() / e2.config.undoInterval) : 0; + }, u.prototype.isFocused = function() { + var t4; + return this.editorElement === ((t4 = this.editorElement.ownerDocument) != null ? t4.activeElement : void 0); + }, u.prototype.isFocusedInvisibly = function() { + return this.isFocused() && !this.getLocationRange(); + }, u; + }(e2.Controller); + }.call(this), function() { + var t3, n2, i, o2, r2, s2, a2, u = [].indexOf || function(t4) { + for (var e3 = 0, n3 = this.length; n3 > e3; e3++) + if (e3 in this && this[e3] === t4) + return e3; + return -1; + }; + n2 = e2.browser, s2 = e2.makeElement, a2 = e2.triggerEvent, o2 = e2.handleEvent, r2 = e2.handleEventOnce, i = e2.findClosestElementFromNode, t3 = e2.AttachmentView.attachmentSelector, e2.registerElement("trix-editor", function() { + var c2, l, h, p2, d, f, g, m, v; + return g = 0, l = function(t4) { + return !document.querySelector(":focus") && t4.hasAttribute("autofocus") && document.querySelector("[autofocus]") === t4 ? t4.focus() : void 0; + }, m = function(t4) { + return t4.hasAttribute("contenteditable") ? void 0 : (t4.setAttribute("contenteditable", ""), r2("focus", {onElement: t4, withCallback: function() { + return h(t4); + }})); + }, h = function(t4) { + return d(t4), v(t4); + }, d = function(t4) { + return (typeof document.queryCommandSupported == "function" ? document.queryCommandSupported("enableObjectResizing") : void 0) ? (document.execCommand("enableObjectResizing", false, false), o2("mscontrolselect", {onElement: t4, preventDefault: true})) : void 0; + }, v = function() { + var t4; + return (typeof document.queryCommandSupported == "function" ? document.queryCommandSupported("DefaultParagraphSeparator") : void 0) && (t4 = e2.config.blockAttributes["default"].tagName, t4 === "div" || t4 === "p") ? document.execCommand("DefaultParagraphSeparator", false, t4) : void 0; + }, c2 = function(t4) { + return t4.hasAttribute("role") ? void 0 : t4.setAttribute("role", "textbox"); + }, f = function(t4) { + var e3; + if (!t4.hasAttribute("aria-label") && !t4.hasAttribute("aria-labelledby")) + return (e3 = function() { + var e4, n3, i2; + return i2 = function() { + var n4, i3, o3, r3; + for (o3 = t4.labels, r3 = [], n4 = 0, i3 = o3.length; i3 > n4; n4++) + e4 = o3[n4], e4.contains(t4) || r3.push(e4.textContent); + return r3; + }(), (n3 = i2.join(" ")) ? t4.setAttribute("aria-label", n3) : t4.removeAttribute("aria-label"); + })(), o2("focus", {onElement: t4, withCallback: e3}); + }, p2 = function() { + return n2.forcesObjectResizing ? {display: "inline", width: "auto"} : {display: "inline-block", width: "1px"}; + }(), {defaultCSS: "%t {\n display: block;\n}\n\n%t:empty:not(:focus)::before {\n content: attr(placeholder);\n color: graytext;\n cursor: text;\n pointer-events: none;\n}\n\n%t a[contenteditable=false] {\n cursor: text;\n}\n\n%t img {\n max-width: 100%;\n height: auto;\n}\n\n%t " + t3 + " figcaption textarea {\n resize: none;\n}\n\n%t " + t3 + " figcaption textarea.trix-autoresize-clone {\n position: absolute;\n left: -9999px;\n max-height: 0px;\n}\n\n%t " + t3 + " figcaption[data-trix-placeholder]:empty::before {\n content: attr(data-trix-placeholder);\n color: graytext;\n}\n\n%t [data-trix-cursor-target] {\n display: " + p2.display + " !important;\n width: " + p2.width + " !important;\n padding: 0 !important;\n margin: 0 !important;\n border: none !important;\n}\n\n%t [data-trix-cursor-target=left] {\n vertical-align: top !important;\n margin-left: -1px !important;\n}\n\n%t [data-trix-cursor-target=right] {\n vertical-align: bottom !important;\n margin-right: -1px !important;\n}", trixId: {get: function() { + return this.hasAttribute("trix-id") ? this.getAttribute("trix-id") : (this.setAttribute("trix-id", ++g), this.trixId); + }}, labels: {get: function() { + var t4, e3, n3; + return e3 = [], this.id && this.ownerDocument && e3.push.apply(e3, this.ownerDocument.querySelectorAll("label[for='" + this.id + "']")), (t4 = i(this, {matchingSelector: "label"})) && ((n3 = t4.control) === this || n3 === null) && e3.push(t4), e3; + }}, toolbarElement: {get: function() { + var t4, e3, n3; + return this.hasAttribute("toolbar") ? (e3 = this.ownerDocument) != null ? e3.getElementById(this.getAttribute("toolbar")) : void 0 : this.parentNode ? (n3 = "trix-toolbar-" + this.trixId, this.setAttribute("toolbar", n3), t4 = s2("trix-toolbar", {id: n3}), this.parentNode.insertBefore(t4, this), t4) : void 0; + }}, inputElement: {get: function() { + var t4, e3, n3; + return this.hasAttribute("input") ? (n3 = this.ownerDocument) != null ? n3.getElementById(this.getAttribute("input")) : void 0 : this.parentNode ? (e3 = "trix-input-" + this.trixId, this.setAttribute("input", e3), t4 = s2("input", {type: "hidden", id: e3}), this.parentNode.insertBefore(t4, this.nextElementSibling), t4) : void 0; + }}, editor: {get: function() { + var t4; + return (t4 = this.editorController) != null ? t4.editor : void 0; + }}, name: {get: function() { + var t4; + return (t4 = this.inputElement) != null ? t4.name : void 0; + }}, value: {get: function() { + var t4; + return (t4 = this.inputElement) != null ? t4.value : void 0; + }, set: function(t4) { + var e3; + return this.defaultValue = t4, (e3 = this.editor) != null ? e3.loadHTML(this.defaultValue) : void 0; + }}, notify: function(t4, e3) { + return this.editorController ? a2("trix-" + t4, {onElement: this, attributes: e3}) : void 0; + }, setInputElementValue: function(t4) { + var e3; + return (e3 = this.inputElement) != null ? e3.value = t4 : void 0; + }, initialize: function() { + return this.hasAttribute("data-trix-internal") ? void 0 : (m(this), c2(this), f(this)); + }, connect: function() { + return this.hasAttribute("data-trix-internal") ? void 0 : (this.editorController || (a2("trix-before-initialize", {onElement: this}), this.editorController = new e2.EditorController({editorElement: this, html: this.defaultValue = this.value}), requestAnimationFrame(function(t4) { + return function() { + return a2("trix-initialize", {onElement: t4}); + }; + }(this))), this.editorController.registerSelectionManager(), this.registerResetListener(), this.registerClickListener(), l(this)); + }, disconnect: function() { + var t4; + return (t4 = this.editorController) != null && t4.unregisterSelectionManager(), this.unregisterResetListener(), this.unregisterClickListener(); + }, registerResetListener: function() { + return this.resetListener = this.resetBubbled.bind(this), window.addEventListener("reset", this.resetListener, false); + }, unregisterResetListener: function() { + return window.removeEventListener("reset", this.resetListener, false); + }, registerClickListener: function() { + return this.clickListener = this.clickBubbled.bind(this), window.addEventListener("click", this.clickListener, false); + }, unregisterClickListener: function() { + return window.removeEventListener("click", this.clickListener, false); + }, resetBubbled: function(t4) { + var e3; + if (!t4.defaultPrevented && t4.target === ((e3 = this.inputElement) != null ? e3.form : void 0)) + return this.reset(); + }, clickBubbled: function(t4) { + var e3; + if (!(t4.defaultPrevented || this.contains(t4.target) || !(e3 = i(t4.target, {matchingSelector: "label"})) || u.call(this.labels, e3) < 0)) + return this.focus(); + }, reset: function() { + return this.value = this.defaultValue; + }}; + }()); + }.call(this), function() { + }.call(this); + }).call(this), typeof module == "object" && module.exports ? module.exports = e2 : typeof define == "function" && define.amd && define(e2); + }.call(exports); +}); + +// node_modules/dayjs/esm/constant.js +var SECONDS_A_MINUTE = 60; +var SECONDS_A_HOUR = SECONDS_A_MINUTE * 60; +var SECONDS_A_DAY = SECONDS_A_HOUR * 24; +var SECONDS_A_WEEK = SECONDS_A_DAY * 7; +var MILLISECONDS_A_SECOND = 1e3; +var MILLISECONDS_A_MINUTE = SECONDS_A_MINUTE * MILLISECONDS_A_SECOND; +var MILLISECONDS_A_HOUR = SECONDS_A_HOUR * MILLISECONDS_A_SECOND; +var MILLISECONDS_A_DAY = SECONDS_A_DAY * MILLISECONDS_A_SECOND; +var MILLISECONDS_A_WEEK = SECONDS_A_WEEK * MILLISECONDS_A_SECOND; +var MS = "millisecond"; +var S = "second"; +var MIN = "minute"; +var H = "hour"; +var D = "day"; +var W = "week"; +var M = "month"; +var Q = "quarter"; +var Y = "year"; +var DATE = "date"; +var FORMAT_DEFAULT = "YYYY-MM-DDTHH:mm:ssZ"; +var INVALID_DATE_STRING = "Invalid Date"; +var REGEX_PARSE = /^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/; +var REGEX_FORMAT = /\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g; + +// node_modules/dayjs/esm/locale/en.js +var en_default = { + name: "en", + weekdays: "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"), + months: "January_February_March_April_May_June_July_August_September_October_November_December".split("_") +}; + +// node_modules/dayjs/esm/utils.js +var padStart = function padStart2(string, length, pad) { + var s2 = String(string); + if (!s2 || s2.length >= length) + return string; + return "" + Array(length + 1 - s2.length).join(pad) + string; +}; +var padZoneStr = function padZoneStr2(instance) { + var negMinutes = -instance.utcOffset(); + var minutes = Math.abs(negMinutes); + var hourOffset = Math.floor(minutes / 60); + var minuteOffset = minutes % 60; + return "" + (negMinutes <= 0 ? "+" : "-") + padStart(hourOffset, 2, "0") + ":" + padStart(minuteOffset, 2, "0"); +}; +var monthDiff = function monthDiff2(a2, b) { + if (a2.date() < b.date()) + return -monthDiff2(b, a2); + var wholeMonthDiff = (b.year() - a2.year()) * 12 + (b.month() - a2.month()); + var anchor = a2.clone().add(wholeMonthDiff, M); + var c2 = b - anchor < 0; + var anchor2 = a2.clone().add(wholeMonthDiff + (c2 ? -1 : 1), M); + return +(-(wholeMonthDiff + (b - anchor) / (c2 ? anchor - anchor2 : anchor2 - anchor)) || 0); +}; +var absFloor = function absFloor2(n2) { + return n2 < 0 ? Math.ceil(n2) || 0 : Math.floor(n2); +}; +var prettyUnit = function prettyUnit2(u) { + var special = { + M, + y: Y, + w: W, + d: D, + D: DATE, + h: H, + m: MIN, + s: S, + ms: MS, + Q + }; + return special[u] || String(u || "").toLowerCase().replace(/s$/, ""); +}; +var isUndefined = function isUndefined2(s2) { + return s2 === void 0; +}; +var utils_default = { + s: padStart, + z: padZoneStr, + m: monthDiff, + a: absFloor, + p: prettyUnit, + u: isUndefined +}; + +// node_modules/dayjs/esm/index.js +var L = "en"; +var Ls = {}; +Ls[L] = en_default; +var isDayjs = function isDayjs2(d) { + return d instanceof Dayjs; +}; +var parseLocale = function parseLocale2(preset, object, isLocal) { + var l; + if (!preset) + return L; + if (typeof preset === "string") { + if (Ls[preset]) { + l = preset; + } + if (object) { + Ls[preset] = object; + l = preset; + } + } else { + var name2 = preset.name; + Ls[name2] = preset; + l = name2; + } + if (!isLocal && l) + L = l; + return l || !isLocal && L; +}; +var dayjs = function dayjs2(date, c2) { + if (isDayjs(date)) { + return date.clone(); + } + var cfg = typeof c2 === "object" ? c2 : {}; + cfg.date = date; + cfg.args = arguments; + return new Dayjs(cfg); +}; +var wrapper = function wrapper2(date, instance) { + return dayjs(date, { + locale: instance.$L, + utc: instance.$u, + x: instance.$x, + $offset: instance.$offset + }); +}; +var Utils = utils_default; +Utils.l = parseLocale; +Utils.i = isDayjs; +Utils.w = wrapper; +var parseDate = function parseDate2(cfg) { + var date = cfg.date, utc2 = cfg.utc; + if (date === null) + return new Date(NaN); + if (Utils.u(date)) + return new Date(); + if (date instanceof Date) + return new Date(date); + if (typeof date === "string" && !/Z$/i.test(date)) { + var d = date.match(REGEX_PARSE); + if (d) { + var m = d[2] - 1 || 0; + var ms = (d[7] || "0").substring(0, 3); + if (utc2) { + return new Date(Date.UTC(d[1], m, d[3] || 1, d[4] || 0, d[5] || 0, d[6] || 0, ms)); + } + return new Date(d[1], m, d[3] || 1, d[4] || 0, d[5] || 0, d[6] || 0, ms); + } + } + return new Date(date); +}; +var Dayjs = /* @__PURE__ */ function() { + function Dayjs2(cfg) { + this.$L = parseLocale(cfg.locale, null, true); + this.parse(cfg); + } + var _proto = Dayjs2.prototype; + _proto.parse = function parse5(cfg) { + this.$d = parseDate(cfg); + this.$x = cfg.x || {}; + this.init(); + }; + _proto.init = function init() { + var $d = this.$d; + this.$y = $d.getFullYear(); + this.$M = $d.getMonth(); + this.$D = $d.getDate(); + this.$W = $d.getDay(); + this.$H = $d.getHours(); + this.$m = $d.getMinutes(); + this.$s = $d.getSeconds(); + this.$ms = $d.getMilliseconds(); + }; + _proto.$utils = function $utils() { + return Utils; + }; + _proto.isValid = function isValid() { + return !(this.$d.toString() === INVALID_DATE_STRING); + }; + _proto.isSame = function isSame(that, units) { + var other = dayjs(that); + return this.startOf(units) <= other && other <= this.endOf(units); + }; + _proto.isAfter = function isAfter(that, units) { + return dayjs(that) < this.startOf(units); + }; + _proto.isBefore = function isBefore(that, units) { + return this.endOf(units) < dayjs(that); + }; + _proto.$g = function $g(input, get, set2) { + if (Utils.u(input)) + return this[get]; + return this.set(set2, input); + }; + _proto.unix = function unix() { + return Math.floor(this.valueOf() / 1e3); + }; + _proto.valueOf = function valueOf() { + return this.$d.getTime(); + }; + _proto.startOf = function startOf(units, _startOf) { + var _this = this; + var isStartOf = !Utils.u(_startOf) ? _startOf : true; + var unit = Utils.p(units); + var instanceFactory = function instanceFactory2(d, m) { + var ins = Utils.w(_this.$u ? Date.UTC(_this.$y, m, d) : new Date(_this.$y, m, d), _this); + return isStartOf ? ins : ins.endOf(D); + }; + var instanceFactorySet = function instanceFactorySet2(method, slice) { + var argumentStart = [0, 0, 0, 0]; + var argumentEnd = [23, 59, 59, 999]; + return Utils.w(_this.toDate()[method].apply(_this.toDate("s"), (isStartOf ? argumentStart : argumentEnd).slice(slice)), _this); + }; + var $W = this.$W, $M = this.$M, $D = this.$D; + var utcPad = "set" + (this.$u ? "UTC" : ""); + switch (unit) { + case Y: + return isStartOf ? instanceFactory(1, 0) : instanceFactory(31, 11); + case M: + return isStartOf ? instanceFactory(1, $M) : instanceFactory(0, $M + 1); + case W: { + var weekStart = this.$locale().weekStart || 0; + var gap = ($W < weekStart ? $W + 7 : $W) - weekStart; + return instanceFactory(isStartOf ? $D - gap : $D + (6 - gap), $M); + } + case D: + case DATE: + return instanceFactorySet(utcPad + "Hours", 0); + case H: + return instanceFactorySet(utcPad + "Minutes", 1); + case MIN: + return instanceFactorySet(utcPad + "Seconds", 2); + case S: + return instanceFactorySet(utcPad + "Milliseconds", 3); + default: + return this.clone(); + } + }; + _proto.endOf = function endOf(arg) { + return this.startOf(arg, false); + }; + _proto.$set = function $set(units, _int) { + var _C$D$C$DATE$C$M$C$Y$C; + var unit = Utils.p(units); + var utcPad = "set" + (this.$u ? "UTC" : ""); + var name2 = (_C$D$C$DATE$C$M$C$Y$C = {}, _C$D$C$DATE$C$M$C$Y$C[D] = utcPad + "Date", _C$D$C$DATE$C$M$C$Y$C[DATE] = utcPad + "Date", _C$D$C$DATE$C$M$C$Y$C[M] = utcPad + "Month", _C$D$C$DATE$C$M$C$Y$C[Y] = utcPad + "FullYear", _C$D$C$DATE$C$M$C$Y$C[H] = utcPad + "Hours", _C$D$C$DATE$C$M$C$Y$C[MIN] = utcPad + "Minutes", _C$D$C$DATE$C$M$C$Y$C[S] = utcPad + "Seconds", _C$D$C$DATE$C$M$C$Y$C[MS] = utcPad + "Milliseconds", _C$D$C$DATE$C$M$C$Y$C)[unit]; + var arg = unit === D ? this.$D + (_int - this.$W) : _int; + if (unit === M || unit === Y) { + var date = this.clone().set(DATE, 1); + date.$d[name2](arg); + date.init(); + this.$d = date.set(DATE, Math.min(this.$D, date.daysInMonth())).$d; + } else if (name2) + this.$d[name2](arg); + this.init(); + return this; + }; + _proto.set = function set2(string, _int2) { + return this.clone().$set(string, _int2); + }; + _proto.get = function get(unit) { + return this[Utils.p(unit)](); + }; + _proto.add = function add(number, units) { + var _this2 = this, _C$MIN$C$H$C$S$unit; + number = Number(number); + var unit = Utils.p(units); + var instanceFactorySet = function instanceFactorySet2(n2) { + var d = dayjs(_this2); + return Utils.w(d.date(d.date() + Math.round(n2 * number)), _this2); + }; + if (unit === M) { + return this.set(M, this.$M + number); + } + if (unit === Y) { + return this.set(Y, this.$y + number); + } + if (unit === D) { + return instanceFactorySet(1); + } + if (unit === W) { + return instanceFactorySet(7); + } + var step = (_C$MIN$C$H$C$S$unit = {}, _C$MIN$C$H$C$S$unit[MIN] = MILLISECONDS_A_MINUTE, _C$MIN$C$H$C$S$unit[H] = MILLISECONDS_A_HOUR, _C$MIN$C$H$C$S$unit[S] = MILLISECONDS_A_SECOND, _C$MIN$C$H$C$S$unit)[unit] || 1; + var nextTimeStamp = this.$d.getTime() + number * step; + return Utils.w(nextTimeStamp, this); + }; + _proto.subtract = function subtract(number, string) { + return this.add(number * -1, string); + }; + _proto.format = function format3(formatStr) { + var _this3 = this; + var locale = this.$locale(); + if (!this.isValid()) + return locale.invalidDate || INVALID_DATE_STRING; + var str = formatStr || FORMAT_DEFAULT; + var zoneStr = Utils.z(this); + var $H = this.$H, $m = this.$m, $M = this.$M; + var weekdays = locale.weekdays, months = locale.months, meridiem = locale.meridiem; + var getShort = function getShort2(arr, index2, full, length) { + return arr && (arr[index2] || arr(_this3, str)) || full[index2].substr(0, length); + }; + var get$H = function get$H2(num) { + return Utils.s($H % 12 || 12, num, "0"); + }; + var meridiemFunc = meridiem || function(hour, minute, isLowercase) { + var m = hour < 12 ? "AM" : "PM"; + return isLowercase ? m.toLowerCase() : m; + }; + var matches2 = { + YY: String(this.$y).slice(-2), + YYYY: this.$y, + M: $M + 1, + MM: Utils.s($M + 1, 2, "0"), + MMM: getShort(locale.monthsShort, $M, months, 3), + MMMM: getShort(months, $M), + D: this.$D, + DD: Utils.s(this.$D, 2, "0"), + d: String(this.$W), + dd: getShort(locale.weekdaysMin, this.$W, weekdays, 2), + ddd: getShort(locale.weekdaysShort, this.$W, weekdays, 3), + dddd: weekdays[this.$W], + H: String($H), + HH: Utils.s($H, 2, "0"), + h: get$H(1), + hh: get$H(2), + a: meridiemFunc($H, $m, true), + A: meridiemFunc($H, $m, false), + m: String($m), + mm: Utils.s($m, 2, "0"), + s: String(this.$s), + ss: Utils.s(this.$s, 2, "0"), + SSS: Utils.s(this.$ms, 3, "0"), + Z: zoneStr + }; + return str.replace(REGEX_FORMAT, function(match, $1) { + return $1 || matches2[match] || zoneStr.replace(":", ""); + }); + }; + _proto.utcOffset = function utcOffset() { + return -Math.round(this.$d.getTimezoneOffset() / 15) * 15; + }; + _proto.diff = function diff(input, units, _float) { + var _C$Y$C$M$C$Q$C$W$C$D$; + var unit = Utils.p(units); + var that = dayjs(input); + var zoneDelta = (that.utcOffset() - this.utcOffset()) * MILLISECONDS_A_MINUTE; + var diff2 = this - that; + var result = Utils.m(this, that); + result = (_C$Y$C$M$C$Q$C$W$C$D$ = {}, _C$Y$C$M$C$Q$C$W$C$D$[Y] = result / 12, _C$Y$C$M$C$Q$C$W$C$D$[M] = result, _C$Y$C$M$C$Q$C$W$C$D$[Q] = result / 3, _C$Y$C$M$C$Q$C$W$C$D$[W] = (diff2 - zoneDelta) / MILLISECONDS_A_WEEK, _C$Y$C$M$C$Q$C$W$C$D$[D] = (diff2 - zoneDelta) / MILLISECONDS_A_DAY, _C$Y$C$M$C$Q$C$W$C$D$[H] = diff2 / MILLISECONDS_A_HOUR, _C$Y$C$M$C$Q$C$W$C$D$[MIN] = diff2 / MILLISECONDS_A_MINUTE, _C$Y$C$M$C$Q$C$W$C$D$[S] = diff2 / MILLISECONDS_A_SECOND, _C$Y$C$M$C$Q$C$W$C$D$)[unit] || diff2; + return _float ? result : Utils.a(result); + }; + _proto.daysInMonth = function daysInMonth() { + return this.endOf(M).$D; + }; + _proto.$locale = function $locale() { + return Ls[this.$L]; + }; + _proto.locale = function locale(preset, object) { + if (!preset) + return this.$L; + var that = this.clone(); + var nextLocaleName = parseLocale(preset, object, true); + if (nextLocaleName) + that.$L = nextLocaleName; + return that; + }; + _proto.clone = function clone2() { + return Utils.w(this.$d, this); + }; + _proto.toDate = function toDate() { + return new Date(this.valueOf()); + }; + _proto.toJSON = function toJSON() { + return this.isValid() ? this.toISOString() : null; + }; + _proto.toISOString = function toISOString() { + return this.$d.toISOString(); + }; + _proto.toString = function toString2() { + return this.$d.toUTCString(); + }; + return Dayjs2; +}(); +var proto = Dayjs.prototype; +dayjs.prototype = proto; +[["$ms", MS], ["$s", S], ["$m", MIN], ["$H", H], ["$W", D], ["$M", M], ["$y", Y], ["$D", DATE]].forEach(function(g) { + proto[g[1]] = function(input) { + return this.$g(input, g[0], g[1]); + }; +}); +dayjs.extend = function(plugin8, option3) { + if (!plugin8.$i) { + plugin8(option3, Dayjs, dayjs); + plugin8.$i = true; + } + return dayjs; +}; +dayjs.locale = parseLocale; +dayjs.isDayjs = isDayjs; +dayjs.unix = function(timestamp) { + return dayjs(timestamp * 1e3); +}; +dayjs.en = Ls[L]; +dayjs.Ls = Ls; +dayjs.p = {}; +var esm_default = dayjs; + +// packages/forms/resources/js/components/date-time-picker.js +var import_customParseFormat = __toModule(require_customParseFormat()); +var import_localeData = __toModule(require_localeData()); +var import_timezone = __toModule(require_timezone()); +var import_utc = __toModule(require_utc()); +esm_default.extend(import_customParseFormat.default); +esm_default.extend(import_localeData.default); +esm_default.extend(import_timezone.default); +esm_default.extend(import_utc.default); +window.dayjs = esm_default; +var date_time_picker_default = (Alpine) => { + Alpine.data("dateTimePickerFormComponent", ({ + displayFormat, + firstDayOfWeek, + format: format3, + isAutofocused, + maxDate, + minDate, + state: state2 + }) => { + const timezone2 = esm_default.tz.guess(); + esm_default.locale(window.dayjs_locale); + return { + daysInFocusedMonth: [], + displayText: "", + emptyDaysInFocusedMonth: [], + focusedDate: null, + focusedMonth: null, + focusedYear: null, + hour: null, + maxDate, + minDate, + minute: null, + open: false, + second: null, + state: state2, + init: function() { + this.maxDate = esm_default(this.maxDate); + if (!this.maxDate.isValid()) { + this.maxDate = null; + } + this.minDate = esm_default(this.minDate); + if (!this.minDate.isValid()) { + this.minDate = null; + } + let date = this.getSelectedDate() ?? esm_default().tz(timezone2).hour(0).minute(0).second(0); + if (this.maxDate !== null && date.isAfter(this.maxDate)) { + date = null; + } + if (this.minDate !== null && date.isBefore(this.minDate)) { + date = null; + } + this.hour = date?.hour() ?? 0; + this.minute = date?.minute() ?? 0; + this.second = date?.second() ?? 0; + this.setDisplayText(); + if (isAutofocused) { + this.openPicker(); + } + this.$watch("focusedMonth", () => { + this.focusedMonth = +this.focusedMonth; + if (this.focusedDate.month() === this.focusedMonth) { + return; + } + this.focusedDate = this.focusedDate.month(this.focusedMonth); + }); + this.$watch("focusedYear", () => { + this.focusedYear = Number.isInteger(+this.focusedYear) ? +this.focusedYear : esm_default().year(); + if (this.focusedDate.year() === this.focusedYear) { + return; + } + this.focusedDate = this.focusedDate.year(this.focusedYear); + }); + this.$watch("focusedDate", () => { + this.focusedMonth = this.focusedDate.month(); + this.focusedYear = this.focusedDate.year(); + this.setupDaysGrid(); + this.$nextTick(() => { + this.evaluatePosition(); + }); + }); + this.$watch("hour", () => { + let hour = +this.hour; + if (!Number.isInteger(hour)) { + this.hour = 0; + } else if (hour > 23) { + this.hour = 0; + } else if (hour < 0) { + this.hour = 23; + } else { + this.hour = hour; + } + let date2 = this.getSelectedDate() ?? this.focusedDate; + this.setState(date2.hour(this.hour ?? 0)); + }); + this.$watch("minute", () => { + let minute = +this.minute; + if (!Number.isInteger(minute)) { + this.minute = 0; + } else if (minute > 59) { + this.minute = 0; + } else if (minute < 0) { + this.minute = 59; + } else { + this.minute = minute; + } + let date2 = this.getSelectedDate() ?? this.focusedDate; + this.setState(date2.minute(this.minute ?? 0)); + }); + this.$watch("second", () => { + let second = +this.second; + if (!Number.isInteger(second)) { + this.second = 0; + } else if (second > 59) { + this.second = 0; + } else if (second < 0) { + this.second = 59; + } else { + this.second = second; + } + let date2 = this.getSelectedDate() ?? this.focusedDate; + this.setState(date2.second(this.second ?? 0)); + }); + this.$watch("state", () => { + let date2 = this.getSelectedDate(); + if (this.maxDate !== null && date2.isAfter(this.maxDate)) { + date2 = null; + } + if (this.minDate !== null && date2.isBefore(this.minDate)) { + date2 = null; + } + this.hour = date2?.hour() ?? 0; + this.minute = date2?.minute() ?? 0; + this.second = date2?.second() ?? 0; + this.setDisplayText(); + }); + }, + clearState: function() { + this.setState(null); + this.closePicker(); + }, + closePicker: function() { + this.open = false; + }, + dateIsDisabled: function(date) { + if (this.maxDate && date.isAfter(this.maxDate)) { + return true; + } + if (this.minDate && date.isBefore(this.minDate)) { + return true; + } + return false; + }, + dayIsDisabled: function(day) { + return this.dateIsDisabled(this.focusedDate.date(day)); + }, + dayIsSelected: function(day) { + let selectedDate = this.getSelectedDate(); + if (selectedDate === null) { + return false; + } + return selectedDate.date() === day && selectedDate.month() === this.focusedDate.month() && selectedDate.year() === this.focusedDate.year(); + }, + dayIsToday: function(day) { + let date = esm_default().tz(timezone2); + return date.date() === day && date.month() === this.focusedDate.month() && date.year() === this.focusedDate.year(); + }, + evaluatePosition: function() { + let availableHeight = window.innerHeight - this.$refs.button.offsetHeight; + let element = this.$refs.button; + while (element) { + availableHeight -= element.offsetTop; + element = element.offsetParent; + } + if (this.$refs.picker.offsetHeight <= availableHeight) { + this.$refs.picker.style.bottom = "auto"; + return; + } + this.$refs.picker.style.bottom = `${this.$refs.button.offsetHeight}px`; + }, + focusPreviousDay: function() { + this.focusedDate = this.focusedDate.subtract(1, "day"); + }, + focusPreviousWeek: function() { + this.focusedDate = this.focusedDate.subtract(1, "week"); + }, + focusNextDay: function() { + this.focusedDate = this.focusedDate.add(1, "day"); + }, + focusNextWeek: function() { + this.focusedDate = this.focusedDate.add(1, "week"); + }, + getDayLabels: function() { + const labels = esm_default.weekdaysShort(); + if (firstDayOfWeek === 0) { + return labels; + } + return [ + ...labels.slice(firstDayOfWeek), + ...labels.slice(0, firstDayOfWeek) + ]; + }, + getSelectedDate: function() { + let date = esm_default(this.state, format3); + if (!date.isValid()) { + return null; + } + return date; + }, + openPicker: function() { + this.focusedDate = this.getSelectedDate() ?? esm_default().tz(timezone2); + this.setupDaysGrid(); + this.open = true; + this.$nextTick(() => { + this.evaluatePosition(); + }); + }, + selectDate: function(day = null) { + if (day) { + this.setFocusedDay(day); + } + this.setState(this.focusedDate); + }, + setDisplayText: function() { + this.displayText = this.getSelectedDate() ? this.getSelectedDate().format(displayFormat) : ""; + }, + setupDaysGrid: function() { + this.emptyDaysInFocusedMonth = Array.from({ + length: this.focusedDate.date(8 - firstDayOfWeek).day() + }, (_, i) => i + 1); + this.daysInFocusedMonth = Array.from({ + length: this.focusedDate.daysInMonth() + }, (_, i) => i + 1); + }, + setFocusedDay: function(day) { + this.focusedDate = this.focusedDate.date(day); + }, + setState: function(date) { + if (date === null) { + this.state = null; + this.setDisplayText(); + return; + } else { + if (this.dateIsDisabled(date)) { + return; + } + } + this.state = date.hour(this.hour ?? 0).minute(this.minute ?? 0).second(this.second ?? 0).format(format3); + this.setDisplayText(); + }, + togglePickerVisibility: function() { + if (this.open) { + this.closePicker(); + return; + } + this.openPicker(); + } + }; + }); +}; + +// node_modules/filepond/dist/filepond.esm.js +/*! + * FilePond 4.30.3 + * Licensed under MIT, https://opensource.org/licenses/MIT/ + * Please visit https://pqina.nl/filepond/ for details. + */ +var isNode = (value) => value instanceof HTMLElement; +var createStore = (initialState, queries2 = [], actions2 = []) => { + const state2 = { + ...initialState + }; + const actionQueue = []; + const dispatchQueue = []; + const getState = () => ({...state2}); + const processActionQueue = () => { + const queue = [...actionQueue]; + actionQueue.length = 0; + return queue; + }; + const processDispatchQueue = () => { + const queue = [...dispatchQueue]; + dispatchQueue.length = 0; + queue.forEach(({type, data: data3}) => { + dispatch2(type, data3); + }); + }; + const dispatch2 = (type, data3, isBlocking) => { + if (isBlocking && !document.hidden) { + dispatchQueue.push({type, data: data3}); + return; + } + if (actionHandlers[type]) { + actionHandlers[type](data3); + } + actionQueue.push({ + type, + data: data3 + }); + }; + const query = (str, ...args) => queryHandles[str] ? queryHandles[str](...args) : null; + const api = { + getState, + processActionQueue, + processDispatchQueue, + dispatch: dispatch2, + query + }; + let queryHandles = {}; + queries2.forEach((query2) => { + queryHandles = { + ...query2(state2), + ...queryHandles + }; + }); + let actionHandlers = {}; + actions2.forEach((action) => { + actionHandlers = { + ...action(dispatch2, query, state2), + ...actionHandlers + }; + }); + return api; +}; +var defineProperty = (obj, property, definition) => { + if (typeof definition === "function") { + obj[property] = definition; + return; + } + Object.defineProperty(obj, property, {...definition}); +}; +var forin = (obj, cb) => { + for (const key in obj) { + if (!obj.hasOwnProperty(key)) { + continue; + } + cb(key, obj[key]); + } +}; +var createObject = (definition) => { + const obj = {}; + forin(definition, (property) => { + defineProperty(obj, property, definition[property]); + }); + return obj; +}; +var attr = (node, name2, value = null) => { + if (value === null) { + return node.getAttribute(name2) || node.hasAttribute(name2); + } + node.setAttribute(name2, value); +}; +var ns = "http://www.w3.org/2000/svg"; +var svgElements = ["svg", "path"]; +var isSVGElement = (tag) => svgElements.includes(tag); +var createElement = (tag, className, attributes = {}) => { + if (typeof className === "object") { + attributes = className; + className = null; + } + const element = isSVGElement(tag) ? document.createElementNS(ns, tag) : document.createElement(tag); + if (className) { + if (isSVGElement(tag)) { + attr(element, "class", className); + } else { + element.className = className; + } + } + forin(attributes, (name2, value) => { + attr(element, name2, value); + }); + return element; +}; +var appendChild = (parent) => (child, index2) => { + if (typeof index2 !== "undefined" && parent.children[index2]) { + parent.insertBefore(child, parent.children[index2]); + } else { + parent.appendChild(child); + } +}; +var appendChildView = (parent, childViews) => (view, index2) => { + if (typeof index2 !== "undefined") { + childViews.splice(index2, 0, view); + } else { + childViews.push(view); + } + return view; +}; +var removeChildView = (parent, childViews) => (view) => { + childViews.splice(childViews.indexOf(view), 1); + if (view.element.parentNode) { + parent.removeChild(view.element); + } + return view; +}; +var IS_BROWSER = (() => typeof window !== "undefined" && typeof window.document !== "undefined")(); +var isBrowser = () => IS_BROWSER; +var testElement = isBrowser() ? createElement("svg") : {}; +var getChildCount = "children" in testElement ? (el) => el.children.length : (el) => el.childNodes.length; +var getViewRect = (elementRect, childViews, offset, scale) => { + const left = offset[0] || elementRect.left; + const top = offset[1] || elementRect.top; + const right = left + elementRect.width; + const bottom = top + elementRect.height * (scale[1] || 1); + const rect = { + element: { + ...elementRect + }, + inner: { + left: elementRect.left, + top: elementRect.top, + right: elementRect.right, + bottom: elementRect.bottom + }, + outer: { + left, + top, + right, + bottom + } + }; + childViews.filter((childView) => !childView.isRectIgnored()).map((childView) => childView.rect).forEach((childViewRect) => { + expandRect(rect.inner, {...childViewRect.inner}); + expandRect(rect.outer, {...childViewRect.outer}); + }); + calculateRectSize(rect.inner); + rect.outer.bottom += rect.element.marginBottom; + rect.outer.right += rect.element.marginRight; + calculateRectSize(rect.outer); + return rect; +}; +var expandRect = (parent, child) => { + child.top += parent.top; + child.right += parent.left; + child.bottom += parent.top; + child.left += parent.left; + if (child.bottom > parent.bottom) { + parent.bottom = child.bottom; + } + if (child.right > parent.right) { + parent.right = child.right; + } +}; +var calculateRectSize = (rect) => { + rect.width = rect.right - rect.left; + rect.height = rect.bottom - rect.top; +}; +var isNumber = (value) => typeof value === "number"; +var thereYet = (position, destination, velocity, errorMargin = 1e-3) => { + return Math.abs(position - destination) < errorMargin && Math.abs(velocity) < errorMargin; +}; +var spring = ({stiffness = 0.5, damping = 0.75, mass = 10} = {}) => { + let target = null; + let position = null; + let velocity = 0; + let resting = false; + const interpolate = (ts, skipToEndState) => { + if (resting) + return; + if (!(isNumber(target) && isNumber(position))) { + resting = true; + velocity = 0; + return; + } + const f = -(position - target) * stiffness; + velocity += f / mass; + position += velocity; + velocity *= damping; + if (thereYet(position, target, velocity) || skipToEndState) { + position = target; + velocity = 0; + resting = true; + api.onupdate(position); + api.oncomplete(position); + } else { + api.onupdate(position); + } + }; + const setTarget = (value) => { + if (isNumber(value) && !isNumber(position)) { + position = value; + } + if (target === null) { + target = value; + position = value; + } + target = value; + if (position === target || typeof target === "undefined") { + resting = true; + velocity = 0; + api.onupdate(position); + api.oncomplete(position); + return; + } + resting = false; + }; + const api = createObject({ + interpolate, + target: { + set: setTarget, + get: () => target + }, + resting: { + get: () => resting + }, + onupdate: (value) => { + }, + oncomplete: (value) => { + } + }); + return api; +}; +var easeInOutQuad = (t2) => t2 < 0.5 ? 2 * t2 * t2 : -1 + (4 - 2 * t2) * t2; +var tween = ({duration = 500, easing = easeInOutQuad, delay = 0} = {}) => { + let start = null; + let t2; + let p2; + let resting = true; + let reverse = false; + let target = null; + const interpolate = (ts, skipToEndState) => { + if (resting || target === null) + return; + if (start === null) { + start = ts; + } + if (ts - start < delay) + return; + t2 = ts - start - delay; + if (t2 >= duration || skipToEndState) { + t2 = 1; + p2 = reverse ? 0 : 1; + api.onupdate(p2 * target); + api.oncomplete(p2 * target); + resting = true; + } else { + p2 = t2 / duration; + api.onupdate((t2 >= 0 ? easing(reverse ? 1 - p2 : p2) : 0) * target); + } + }; + const api = createObject({ + interpolate, + target: { + get: () => reverse ? 0 : target, + set: (value) => { + if (target === null) { + target = value; + api.onupdate(value); + api.oncomplete(value); + return; + } + if (value < target) { + target = 1; + reverse = true; + } else { + reverse = false; + target = value; + } + resting = false; + start = null; + } + }, + resting: { + get: () => resting + }, + onupdate: (value) => { + }, + oncomplete: (value) => { + } + }); + return api; +}; +var animator = { + spring, + tween +}; +var createAnimator = (definition, category, property) => { + const def = definition[category] && typeof definition[category][property] === "object" ? definition[category][property] : definition[category] || definition; + const type = typeof def === "string" ? def : def.type; + const props = typeof def === "object" ? {...def} : {}; + return animator[type] ? animator[type](props) : null; +}; +var addGetSet = (keys, obj, props, overwrite = false) => { + obj = Array.isArray(obj) ? obj : [obj]; + obj.forEach((o2) => { + keys.forEach((key) => { + let name2 = key; + let getter = () => props[key]; + let setter = (value) => props[key] = value; + if (typeof key === "object") { + name2 = key.key; + getter = key.getter || getter; + setter = key.setter || setter; + } + if (o2[name2] && !overwrite) { + return; + } + o2[name2] = { + get: getter, + set: setter + }; + }); + }); +}; +var animations = ({mixinConfig, viewProps, viewInternalAPI, viewExternalAPI}) => { + const initialProps = {...viewProps}; + const animations2 = []; + forin(mixinConfig, (property, animation) => { + const animator2 = createAnimator(animation); + if (!animator2) { + return; + } + animator2.onupdate = (value) => { + viewProps[property] = value; + }; + animator2.target = initialProps[property]; + const prop = { + key: property, + setter: (value) => { + if (animator2.target === value) { + return; + } + animator2.target = value; + }, + getter: () => viewProps[property] + }; + addGetSet([prop], [viewInternalAPI, viewExternalAPI], viewProps, true); + animations2.push(animator2); + }); + return { + write: (ts) => { + let skipToEndState = document.hidden; + let resting = true; + animations2.forEach((animation) => { + if (!animation.resting) + resting = false; + animation.interpolate(ts, skipToEndState); + }); + return resting; + }, + destroy: () => { + } + }; +}; +var addEvent = (element) => (type, fn2) => { + element.addEventListener(type, fn2); +}; +var removeEvent = (element) => (type, fn2) => { + element.removeEventListener(type, fn2); +}; +var listeners = ({ + mixinConfig, + viewProps, + viewInternalAPI, + viewExternalAPI, + viewState, + view +}) => { + const events = []; + const add = addEvent(view.element); + const remove = removeEvent(view.element); + viewExternalAPI.on = (type, fn2) => { + events.push({ + type, + fn: fn2 + }); + add(type, fn2); + }; + viewExternalAPI.off = (type, fn2) => { + events.splice(events.findIndex((event) => event.type === type && event.fn === fn2), 1); + remove(type, fn2); + }; + return { + write: () => { + return true; + }, + destroy: () => { + events.forEach((event) => { + remove(event.type, event.fn); + }); + } + }; +}; +var apis = ({mixinConfig, viewProps, viewExternalAPI}) => { + addGetSet(mixinConfig, viewExternalAPI, viewProps); +}; +var isDefined = (value) => value != null; +var defaults = { + opacity: 1, + scaleX: 1, + scaleY: 1, + translateX: 0, + translateY: 0, + rotateX: 0, + rotateY: 0, + rotateZ: 0, + originX: 0, + originY: 0 +}; +var styles = ({mixinConfig, viewProps, viewInternalAPI, viewExternalAPI, view}) => { + const initialProps = {...viewProps}; + const currentProps = {}; + addGetSet(mixinConfig, [viewInternalAPI, viewExternalAPI], viewProps); + const getOffset = () => [viewProps["translateX"] || 0, viewProps["translateY"] || 0]; + const getScale = () => [viewProps["scaleX"] || 0, viewProps["scaleY"] || 0]; + const getRect2 = () => view.rect ? getViewRect(view.rect, view.childViews, getOffset(), getScale()) : null; + viewInternalAPI.rect = {get: getRect2}; + viewExternalAPI.rect = {get: getRect2}; + mixinConfig.forEach((key) => { + viewProps[key] = typeof initialProps[key] === "undefined" ? defaults[key] : initialProps[key]; + }); + return { + write: () => { + if (!propsHaveChanged(currentProps, viewProps)) { + return; + } + applyStyles(view.element, viewProps); + Object.assign(currentProps, {...viewProps}); + return true; + }, + destroy: () => { + } + }; +}; +var propsHaveChanged = (currentProps, newProps) => { + if (Object.keys(currentProps).length !== Object.keys(newProps).length) { + return true; + } + for (const prop in newProps) { + if (newProps[prop] !== currentProps[prop]) { + return true; + } + } + return false; +}; +var applyStyles = (element, { + opacity, + perspective, + translateX, + translateY, + scaleX, + scaleY, + rotateX, + rotateY, + rotateZ, + originX, + originY, + width, + height +}) => { + let transforms2 = ""; + let styles3 = ""; + if (isDefined(originX) || isDefined(originY)) { + styles3 += `transform-origin: ${originX || 0}px ${originY || 0}px;`; + } + if (isDefined(perspective)) { + transforms2 += `perspective(${perspective}px) `; + } + if (isDefined(translateX) || isDefined(translateY)) { + transforms2 += `translate3d(${translateX || 0}px, ${translateY || 0}px, 0) `; + } + if (isDefined(scaleX) || isDefined(scaleY)) { + transforms2 += `scale3d(${isDefined(scaleX) ? scaleX : 1}, ${isDefined(scaleY) ? scaleY : 1}, 1) `; + } + if (isDefined(rotateZ)) { + transforms2 += `rotateZ(${rotateZ}rad) `; + } + if (isDefined(rotateX)) { + transforms2 += `rotateX(${rotateX}rad) `; + } + if (isDefined(rotateY)) { + transforms2 += `rotateY(${rotateY}rad) `; + } + if (transforms2.length) { + styles3 += `transform:${transforms2};`; + } + if (isDefined(opacity)) { + styles3 += `opacity:${opacity};`; + if (opacity === 0) { + styles3 += `visibility:hidden;`; + } + if (opacity < 1) { + styles3 += `pointer-events:none;`; + } + } + if (isDefined(height)) { + styles3 += `height:${height}px;`; + } + if (isDefined(width)) { + styles3 += `width:${width}px;`; + } + const elementCurrentStyle = element.elementCurrentStyle || ""; + if (styles3.length !== elementCurrentStyle.length || styles3 !== elementCurrentStyle) { + element.style.cssText = styles3; + element.elementCurrentStyle = styles3; + } +}; +var Mixins = { + styles, + listeners, + animations, + apis +}; +var updateRect = (rect = {}, element = {}, style = {}) => { + if (!element.layoutCalculated) { + rect.paddingTop = parseInt(style.paddingTop, 10) || 0; + rect.marginTop = parseInt(style.marginTop, 10) || 0; + rect.marginRight = parseInt(style.marginRight, 10) || 0; + rect.marginBottom = parseInt(style.marginBottom, 10) || 0; + rect.marginLeft = parseInt(style.marginLeft, 10) || 0; + element.layoutCalculated = true; + } + rect.left = element.offsetLeft || 0; + rect.top = element.offsetTop || 0; + rect.width = element.offsetWidth || 0; + rect.height = element.offsetHeight || 0; + rect.right = rect.left + rect.width; + rect.bottom = rect.top + rect.height; + rect.scrollTop = element.scrollTop; + rect.hidden = element.offsetParent === null; + return rect; +}; +var createView = ({ + tag = "div", + name: name2 = null, + attributes = {}, + read = () => { + }, + write: write2 = () => { + }, + create: create2 = () => { + }, + destroy: destroy3 = () => { + }, + filterFrameActionsForChild = (child, actions2) => actions2, + didCreateView = () => { + }, + didWriteView = () => { + }, + ignoreRect = false, + ignoreRectUpdate = false, + mixins = [] +} = {}) => (store, props = {}) => { + const element = createElement(tag, `filepond--${name2}`, attributes); + const style = window.getComputedStyle(element, null); + const rect = updateRect(); + let frameRect = null; + let isResting = false; + const childViews = []; + const activeMixins = []; + const ref = {}; + const state2 = {}; + const writers = [ + write2 + ]; + const readers = [ + read + ]; + const destroyers = [ + destroy3 + ]; + const getElement = () => element; + const getChildViews = () => childViews.concat(); + const getReference = () => ref; + const createChildView = (store2) => (view, props2) => view(store2, props2); + const getRect2 = () => { + if (frameRect) { + return frameRect; + } + frameRect = getViewRect(rect, childViews, [0, 0], [1, 1]); + return frameRect; + }; + const getStyle = () => style; + const _read = () => { + frameRect = null; + childViews.forEach((child) => child._read()); + const shouldUpdate = !(ignoreRectUpdate && rect.width && rect.height); + if (shouldUpdate) { + updateRect(rect, element, style); + } + const api = {root: internalAPI, props, rect}; + readers.forEach((reader) => reader(api)); + }; + const _write = (ts, frameActions, shouldOptimize) => { + let resting = frameActions.length === 0; + writers.forEach((writer) => { + const writerResting = writer({ + props, + root: internalAPI, + actions: frameActions, + timestamp: ts, + shouldOptimize + }); + if (writerResting === false) { + resting = false; + } + }); + activeMixins.forEach((mixin) => { + const mixinResting = mixin.write(ts); + if (mixinResting === false) { + resting = false; + } + }); + childViews.filter((child) => !!child.element.parentNode).forEach((child) => { + const childResting = child._write(ts, filterFrameActionsForChild(child, frameActions), shouldOptimize); + if (!childResting) { + resting = false; + } + }); + childViews.forEach((child, index2) => { + if (child.element.parentNode) { + return; + } + internalAPI.appendChild(child.element, index2); + child._read(); + child._write(ts, filterFrameActionsForChild(child, frameActions), shouldOptimize); + resting = false; + }); + isResting = resting; + didWriteView({ + props, + root: internalAPI, + actions: frameActions, + timestamp: ts + }); + return resting; + }; + const _destroy = () => { + activeMixins.forEach((mixin) => mixin.destroy()); + destroyers.forEach((destroyer) => { + destroyer({root: internalAPI, props}); + }); + childViews.forEach((child) => child._destroy()); + }; + const sharedAPIDefinition = { + element: { + get: getElement + }, + style: { + get: getStyle + }, + childViews: { + get: getChildViews + } + }; + const internalAPIDefinition = { + ...sharedAPIDefinition, + rect: { + get: getRect2 + }, + ref: { + get: getReference + }, + is: (needle) => name2 === needle, + appendChild: appendChild(element), + createChildView: createChildView(store), + linkView: (view) => { + childViews.push(view); + return view; + }, + unlinkView: (view) => { + childViews.splice(childViews.indexOf(view), 1); + }, + appendChildView: appendChildView(element, childViews), + removeChildView: removeChildView(element, childViews), + registerWriter: (writer) => writers.push(writer), + registerReader: (reader) => readers.push(reader), + registerDestroyer: (destroyer) => destroyers.push(destroyer), + invalidateLayout: () => element.layoutCalculated = false, + dispatch: store.dispatch, + query: store.query + }; + const externalAPIDefinition = { + element: { + get: getElement + }, + childViews: { + get: getChildViews + }, + rect: { + get: getRect2 + }, + resting: { + get: () => isResting + }, + isRectIgnored: () => ignoreRect, + _read, + _write, + _destroy + }; + const mixinAPIDefinition = { + ...sharedAPIDefinition, + rect: { + get: () => rect + } + }; + Object.keys(mixins).sort((a2, b) => { + if (a2 === "styles") { + return 1; + } else if (b === "styles") { + return -1; + } + return 0; + }).forEach((key) => { + const mixinAPI = Mixins[key]({ + mixinConfig: mixins[key], + viewProps: props, + viewState: state2, + viewInternalAPI: internalAPIDefinition, + viewExternalAPI: externalAPIDefinition, + view: createObject(mixinAPIDefinition) + }); + if (mixinAPI) { + activeMixins.push(mixinAPI); + } + }); + const internalAPI = createObject(internalAPIDefinition); + create2({ + root: internalAPI, + props + }); + const childCount = getChildCount(element); + childViews.forEach((child, index2) => { + internalAPI.appendChild(child.element, childCount + index2); + }); + didCreateView(internalAPI); + return createObject(externalAPIDefinition); +}; +var createPainter = (read, write2, fps = 60) => { + const name2 = "__framePainter"; + if (window[name2]) { + window[name2].readers.push(read); + window[name2].writers.push(write2); + return; + } + window[name2] = { + readers: [read], + writers: [write2] + }; + const painter = window[name2]; + const interval = 1e3 / fps; + let last = null; + let id = null; + let requestTick = null; + let cancelTick = null; + const setTimerType = () => { + if (document.hidden) { + requestTick = () => window.setTimeout(() => tick(performance.now()), interval); + cancelTick = () => window.clearTimeout(id); + } else { + requestTick = () => window.requestAnimationFrame(tick); + cancelTick = () => window.cancelAnimationFrame(id); + } + }; + document.addEventListener("visibilitychange", () => { + if (cancelTick) + cancelTick(); + setTimerType(); + tick(performance.now()); + }); + const tick = (ts) => { + id = requestTick(tick); + if (!last) { + last = ts; + } + const delta = ts - last; + if (delta <= interval) { + return; + } + last = ts - delta % interval; + painter.readers.forEach((read2) => read2()); + painter.writers.forEach((write3) => write3(ts)); + }; + setTimerType(); + tick(performance.now()); + return { + pause: () => { + cancelTick(id); + } + }; +}; +var createRoute = (routes, fn2) => ({root: root2, props, actions: actions2 = [], timestamp, shouldOptimize}) => { + actions2.filter((action) => routes[action.type]).forEach((action) => routes[action.type]({root: root2, props, action: action.data, timestamp, shouldOptimize})); + if (fn2) { + fn2({root: root2, props, actions: actions2, timestamp, shouldOptimize}); + } +}; +var insertBefore = (newNode, referenceNode) => referenceNode.parentNode.insertBefore(newNode, referenceNode); +var insertAfter = (newNode, referenceNode) => { + return referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling); +}; +var isArray = (value) => Array.isArray(value); +var isEmpty = (value) => value == null; +var trim = (str) => str.trim(); +var toString = (value) => "" + value; +var toArray = (value, splitter = ",") => { + if (isEmpty(value)) { + return []; + } + if (isArray(value)) { + return value; + } + return toString(value).split(splitter).map(trim).filter((str) => str.length); +}; +var isBoolean = (value) => typeof value === "boolean"; +var toBoolean = (value) => isBoolean(value) ? value : value === "true"; +var isString = (value) => typeof value === "string"; +var toNumber = (value) => isNumber(value) ? value : isString(value) ? toString(value).replace(/[a-z]+/gi, "") : 0; +var toInt = (value) => parseInt(toNumber(value), 10); +var toFloat = (value) => parseFloat(toNumber(value)); +var isInt = (value) => isNumber(value) && isFinite(value) && Math.floor(value) === value; +var toBytes = (value, base = 1e3) => { + if (isInt(value)) { + return value; + } + let naturalFileSize = toString(value).trim(); + if (/MB$/i.test(naturalFileSize)) { + naturalFileSize = naturalFileSize.replace(/MB$i/, "").trim(); + return toInt(naturalFileSize) * base * base; + } + if (/KB/i.test(naturalFileSize)) { + naturalFileSize = naturalFileSize.replace(/KB$i/, "").trim(); + return toInt(naturalFileSize) * base; + } + return toInt(naturalFileSize); +}; +var isFunction = (value) => typeof value === "function"; +var toFunctionReference = (string) => { + let ref = self; + let levels = string.split("."); + let level = null; + while (level = levels.shift()) { + ref = ref[level]; + if (!ref) { + return null; + } + } + return ref; +}; +var methods = { + process: "POST", + patch: "PATCH", + revert: "DELETE", + fetch: "GET", + restore: "GET", + load: "GET" +}; +var createServerAPI = (outline) => { + const api = {}; + api.url = isString(outline) ? outline : outline.url || ""; + api.timeout = outline.timeout ? parseInt(outline.timeout, 10) : 0; + api.headers = outline.headers ? outline.headers : {}; + forin(methods, (key) => { + api[key] = createAction(key, outline[key], methods[key], api.timeout, api.headers); + }); + api.process = outline.process || isString(outline) || outline.url ? api.process : null; + api.remove = outline.remove || null; + delete api.headers; + return api; +}; +var createAction = (name2, outline, method, timeout, headers) => { + if (outline === null) { + return null; + } + if (typeof outline === "function") { + return outline; + } + const action = { + url: method === "GET" || method === "PATCH" ? `?${name2}=` : "", + method, + headers, + withCredentials: false, + timeout, + onload: null, + ondata: null, + onerror: null + }; + if (isString(outline)) { + action.url = outline; + return action; + } + Object.assign(action, outline); + if (isString(action.headers)) { + const parts = action.headers.split(/:(.+)/); + action.headers = { + header: parts[0], + value: parts[1] + }; + } + action.withCredentials = toBoolean(action.withCredentials); + return action; +}; +var toServerAPI = (value) => createServerAPI(value); +var isNull = (value) => value === null; +var isObject = (value) => typeof value === "object" && value !== null; +var isAPI = (value) => { + return isObject(value) && isString(value.url) && isObject(value.process) && isObject(value.revert) && isObject(value.restore) && isObject(value.fetch); +}; +var getType = (value) => { + if (isArray(value)) { + return "array"; + } + if (isNull(value)) { + return "null"; + } + if (isInt(value)) { + return "int"; + } + if (/^[0-9]+ ?(?:GB|MB|KB)$/gi.test(value)) { + return "bytes"; + } + if (isAPI(value)) { + return "api"; + } + return typeof value; +}; +var replaceSingleQuotes = (str) => str.replace(/{\s*'/g, '{"').replace(/'\s*}/g, '"}').replace(/'\s*:/g, '":').replace(/:\s*'/g, ':"').replace(/,\s*'/g, ',"').replace(/'\s*,/g, '",'); +var conversionTable = { + array: toArray, + boolean: toBoolean, + int: (value) => getType(value) === "bytes" ? toBytes(value) : toInt(value), + number: toFloat, + float: toFloat, + bytes: toBytes, + string: (value) => isFunction(value) ? value : toString(value), + function: (value) => toFunctionReference(value), + serverapi: toServerAPI, + object: (value) => { + try { + return JSON.parse(replaceSingleQuotes(value)); + } catch (e2) { + return null; + } + } +}; +var convertTo = (value, type) => conversionTable[type](value); +var getValueByType = (newValue, defaultValue, valueType) => { + if (newValue === defaultValue) { + return newValue; + } + let newValueType = getType(newValue); + if (newValueType !== valueType) { + const convertedValue = convertTo(newValue, valueType); + newValueType = getType(convertedValue); + if (convertedValue === null) { + throw `Trying to assign value with incorrect type to "${option}", allowed type: "${valueType}"`; + } else { + newValue = convertedValue; + } + } + return newValue; +}; +var createOption = (defaultValue, valueType) => { + let currentValue = defaultValue; + return { + enumerable: true, + get: () => currentValue, + set: (newValue) => { + currentValue = getValueByType(newValue, defaultValue, valueType); + } + }; +}; +var createOptions = (options) => { + const obj = {}; + forin(options, (prop) => { + const optionDefinition = options[prop]; + obj[prop] = createOption(optionDefinition[0], optionDefinition[1]); + }); + return createObject(obj); +}; +var createInitialState = (options) => ({ + items: [], + listUpdateTimeout: null, + itemUpdateTimeout: null, + processingQueue: [], + options: createOptions(options) +}); +var fromCamels = (string, separator = "-") => string.split(/(?=[A-Z])/).map((part) => part.toLowerCase()).join(separator); +var createOptionAPI = (store, options) => { + const obj = {}; + forin(options, (key) => { + obj[key] = { + get: () => store.getState().options[key], + set: (value) => { + store.dispatch(`SET_${fromCamels(key, "_").toUpperCase()}`, { + value + }); + } + }; + }); + return obj; +}; +var createOptionActions = (options) => (dispatch2, query, state2) => { + const obj = {}; + forin(options, (key) => { + const name2 = fromCamels(key, "_").toUpperCase(); + obj[`SET_${name2}`] = (action) => { + try { + state2.options[key] = action.value; + } catch (e2) { + } + dispatch2(`DID_SET_${name2}`, {value: state2.options[key]}); + }; + }); + return obj; +}; +var createOptionQueries = (options) => (state2) => { + const obj = {}; + forin(options, (key) => { + obj[`GET_${fromCamels(key, "_").toUpperCase()}`] = (action) => state2.options[key]; + }); + return obj; +}; +var InteractionMethod = { + API: 1, + DROP: 2, + BROWSE: 3, + PASTE: 4, + NONE: 5 +}; +var getUniqueId = () => Math.random().toString(36).substr(2, 9); +var arrayRemove = (arr, index2) => arr.splice(index2, 1); +var run = (cb, sync) => { + if (sync) { + cb(); + } else if (document.hidden) { + Promise.resolve(1).then(cb); + } else { + setTimeout(cb, 0); + } +}; +var on = () => { + const listeners2 = []; + const off2 = (event, cb) => { + arrayRemove(listeners2, listeners2.findIndex((listener) => listener.event === event && (listener.cb === cb || !cb))); + }; + const fire = (event, args, sync) => { + listeners2.filter((listener) => listener.event === event).map((listener) => listener.cb).forEach((cb) => run(() => cb(...args), sync)); + }; + return { + fireSync: (event, ...args) => { + fire(event, args, true); + }, + fire: (event, ...args) => { + fire(event, args, false); + }, + on: (event, cb) => { + listeners2.push({event, cb}); + }, + onOnce: (event, cb) => { + listeners2.push({ + event, + cb: (...args) => { + off2(event, cb); + cb(...args); + } + }); + }, + off: off2 + }; +}; +var copyObjectPropertiesToObject = (src, target, excluded) => { + Object.getOwnPropertyNames(src).filter((property) => !excluded.includes(property)).forEach((key) => Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(src, key))); +}; +var PRIVATE = [ + "fire", + "process", + "revert", + "load", + "on", + "off", + "onOnce", + "retryLoad", + "extend", + "archive", + "archived", + "release", + "released", + "requestProcessing", + "freeze" +]; +var createItemAPI = (item2) => { + const api = {}; + copyObjectPropertiesToObject(item2, api, PRIVATE); + return api; +}; +var removeReleasedItems = (items) => { + items.forEach((item2, index2) => { + if (item2.released) { + arrayRemove(items, index2); + } + }); +}; +var ItemStatus = { + INIT: 1, + IDLE: 2, + PROCESSING_QUEUED: 9, + PROCESSING: 3, + PROCESSING_COMPLETE: 5, + PROCESSING_ERROR: 6, + PROCESSING_REVERT_ERROR: 10, + LOADING: 7, + LOAD_ERROR: 8 +}; +var FileOrigin = { + INPUT: 1, + LIMBO: 2, + LOCAL: 3 +}; +var getNonNumeric = (str) => /[^0-9]+/.exec(str); +var getDecimalSeparator = () => getNonNumeric(1.1 .toLocaleString())[0]; +var getThousandsSeparator = () => { + const decimalSeparator = getDecimalSeparator(); + const thousandsStringWithSeparator = 1e3 .toLocaleString(); + const thousandsStringWithoutSeparator = 1e3 .toString(); + if (thousandsStringWithSeparator !== thousandsStringWithoutSeparator) { + return getNonNumeric(thousandsStringWithSeparator)[0]; + } + return decimalSeparator === "." ? "," : "."; +}; +var Type = { + BOOLEAN: "boolean", + INT: "int", + NUMBER: "number", + STRING: "string", + ARRAY: "array", + OBJECT: "object", + FUNCTION: "function", + ACTION: "action", + SERVER_API: "serverapi", + REGEX: "regex" +}; +var filters = []; +var applyFilterChain = (key, value, utils) => new Promise((resolve, reject) => { + const matchingFilters = filters.filter((f) => f.key === key).map((f) => f.cb); + if (matchingFilters.length === 0) { + resolve(value); + return; + } + const initialFilter = matchingFilters.shift(); + matchingFilters.reduce((current, next) => current.then((value2) => next(value2, utils)), initialFilter(value, utils)).then((value2) => resolve(value2)).catch((error2) => reject(error2)); +}); +var applyFilters = (key, value, utils) => filters.filter((f) => f.key === key).map((f) => f.cb(value, utils)); +var addFilter = (key, cb) => filters.push({key, cb}); +var extendDefaultOptions = (additionalOptions) => Object.assign(defaultOptions, additionalOptions); +var getOptions = () => ({...defaultOptions}); +var setOptions = (opts) => { + forin(opts, (key, value) => { + if (!defaultOptions[key]) { + return; + } + defaultOptions[key][0] = getValueByType(value, defaultOptions[key][0], defaultOptions[key][1]); + }); +}; +var defaultOptions = { + id: [null, Type.STRING], + name: ["filepond", Type.STRING], + disabled: [false, Type.BOOLEAN], + className: [null, Type.STRING], + required: [false, Type.BOOLEAN], + captureMethod: [null, Type.STRING], + allowSyncAcceptAttribute: [true, Type.BOOLEAN], + allowDrop: [true, Type.BOOLEAN], + allowBrowse: [true, Type.BOOLEAN], + allowPaste: [true, Type.BOOLEAN], + allowMultiple: [false, Type.BOOLEAN], + allowReplace: [true, Type.BOOLEAN], + allowRevert: [true, Type.BOOLEAN], + allowRemove: [true, Type.BOOLEAN], + allowProcess: [true, Type.BOOLEAN], + allowReorder: [false, Type.BOOLEAN], + allowDirectoriesOnly: [false, Type.BOOLEAN], + storeAsFile: [false, Type.BOOLEAN], + forceRevert: [false, Type.BOOLEAN], + maxFiles: [null, Type.INT], + checkValidity: [false, Type.BOOLEAN], + itemInsertLocationFreedom: [true, Type.BOOLEAN], + itemInsertLocation: ["before", Type.STRING], + itemInsertInterval: [75, Type.INT], + dropOnPage: [false, Type.BOOLEAN], + dropOnElement: [true, Type.BOOLEAN], + dropValidation: [false, Type.BOOLEAN], + ignoredFiles: [[".ds_store", "thumbs.db", "desktop.ini"], Type.ARRAY], + instantUpload: [true, Type.BOOLEAN], + maxParallelUploads: [2, Type.INT], + allowMinimumUploadDuration: [true, Type.BOOLEAN], + chunkUploads: [false, Type.BOOLEAN], + chunkForce: [false, Type.BOOLEAN], + chunkSize: [5e6, Type.INT], + chunkRetryDelays: [[500, 1e3, 3e3], Type.ARRAY], + server: [null, Type.SERVER_API], + fileSizeBase: [1e3, Type.INT], + labelFileSizeBytes: ["bytes", Type.STRING], + labelFileSizeKilobytes: ["KB", Type.STRING], + labelFileSizeMegabytes: ["MB", Type.STRING], + labelFileSizeGigabytes: ["GB", Type.STRING], + labelDecimalSeparator: [getDecimalSeparator(), Type.STRING], + labelThousandsSeparator: [getThousandsSeparator(), Type.STRING], + labelIdle: [ + 'Drag & Drop your files or Browse', + Type.STRING + ], + labelInvalidField: ["Field contains invalid files", Type.STRING], + labelFileWaitingForSize: ["Waiting for size", Type.STRING], + labelFileSizeNotAvailable: ["Size not available", Type.STRING], + labelFileCountSingular: ["file in list", Type.STRING], + labelFileCountPlural: ["files in list", Type.STRING], + labelFileLoading: ["Loading", Type.STRING], + labelFileAdded: ["Added", Type.STRING], + labelFileLoadError: ["Error during load", Type.STRING], + labelFileRemoved: ["Removed", Type.STRING], + labelFileRemoveError: ["Error during remove", Type.STRING], + labelFileProcessing: ["Uploading", Type.STRING], + labelFileProcessingComplete: ["Upload complete", Type.STRING], + labelFileProcessingAborted: ["Upload cancelled", Type.STRING], + labelFileProcessingError: ["Error during upload", Type.STRING], + labelFileProcessingRevertError: ["Error during revert", Type.STRING], + labelTapToCancel: ["tap to cancel", Type.STRING], + labelTapToRetry: ["tap to retry", Type.STRING], + labelTapToUndo: ["tap to undo", Type.STRING], + labelButtonRemoveItem: ["Remove", Type.STRING], + labelButtonAbortItemLoad: ["Abort", Type.STRING], + labelButtonRetryItemLoad: ["Retry", Type.STRING], + labelButtonAbortItemProcessing: ["Cancel", Type.STRING], + labelButtonUndoItemProcessing: ["Undo", Type.STRING], + labelButtonRetryItemProcessing: ["Retry", Type.STRING], + labelButtonProcessItem: ["Upload", Type.STRING], + iconRemove: [ + '', + Type.STRING + ], + iconProcess: [ + '', + Type.STRING + ], + iconRetry: [ + '', + Type.STRING + ], + iconUndo: [ + '', + Type.STRING + ], + iconDone: [ + '', + Type.STRING + ], + oninit: [null, Type.FUNCTION], + onwarning: [null, Type.FUNCTION], + onerror: [null, Type.FUNCTION], + onactivatefile: [null, Type.FUNCTION], + oninitfile: [null, Type.FUNCTION], + onaddfilestart: [null, Type.FUNCTION], + onaddfileprogress: [null, Type.FUNCTION], + onaddfile: [null, Type.FUNCTION], + onprocessfilestart: [null, Type.FUNCTION], + onprocessfileprogress: [null, Type.FUNCTION], + onprocessfileabort: [null, Type.FUNCTION], + onprocessfilerevert: [null, Type.FUNCTION], + onprocessfile: [null, Type.FUNCTION], + onprocessfiles: [null, Type.FUNCTION], + onremovefile: [null, Type.FUNCTION], + onpreparefile: [null, Type.FUNCTION], + onupdatefiles: [null, Type.FUNCTION], + onreorderfiles: [null, Type.FUNCTION], + beforeDropFile: [null, Type.FUNCTION], + beforeAddFile: [null, Type.FUNCTION], + beforeRemoveFile: [null, Type.FUNCTION], + beforePrepareFile: [null, Type.FUNCTION], + stylePanelLayout: [null, Type.STRING], + stylePanelAspectRatio: [null, Type.STRING], + styleItemPanelAspectRatio: [null, Type.STRING], + styleButtonRemoveItemPosition: ["left", Type.STRING], + styleButtonProcessItemPosition: ["right", Type.STRING], + styleLoadIndicatorPosition: ["right", Type.STRING], + styleProgressIndicatorPosition: ["right", Type.STRING], + styleButtonRemoveItemAlign: [false, Type.BOOLEAN], + files: [[], Type.ARRAY], + credits: [["https://pqina.nl/", "Powered by PQINA"], Type.ARRAY] +}; +var getItemByQuery = (items, query) => { + if (isEmpty(query)) { + return items[0] || null; + } + if (isInt(query)) { + return items[query] || null; + } + if (typeof query === "object") { + query = query.id; + } + return items.find((item2) => item2.id === query) || null; +}; +var getNumericAspectRatioFromString = (aspectRatio) => { + if (isEmpty(aspectRatio)) { + return aspectRatio; + } + if (/:/.test(aspectRatio)) { + const parts = aspectRatio.split(":"); + return parts[1] / parts[0]; + } + return parseFloat(aspectRatio); +}; +var getActiveItems = (items) => items.filter((item2) => !item2.archived); +var Status = { + EMPTY: 0, + IDLE: 1, + ERROR: 2, + BUSY: 3, + READY: 4 +}; +var res = null; +var canUpdateFileInput = () => { + if (res === null) { + try { + const dataTransfer = new DataTransfer(); + dataTransfer.items.add(new File(["hello world"], "This_Works.txt")); + const el = document.createElement("input"); + el.setAttribute("type", "file"); + el.files = dataTransfer.files; + res = el.files.length === 1; + } catch (err) { + res = false; + } + } + return res; +}; +var ITEM_ERROR = [ + ItemStatus.LOAD_ERROR, + ItemStatus.PROCESSING_ERROR, + ItemStatus.PROCESSING_REVERT_ERROR +]; +var ITEM_BUSY = [ + ItemStatus.LOADING, + ItemStatus.PROCESSING, + ItemStatus.PROCESSING_QUEUED, + ItemStatus.INIT +]; +var ITEM_READY = [ItemStatus.PROCESSING_COMPLETE]; +var isItemInErrorState = (item2) => ITEM_ERROR.includes(item2.status); +var isItemInBusyState = (item2) => ITEM_BUSY.includes(item2.status); +var isItemInReadyState = (item2) => ITEM_READY.includes(item2.status); +var isAsync = (state2) => isObject(state2.options.server) && (isObject(state2.options.server.process) || isFunction(state2.options.server.process)); +var queries = (state2) => ({ + GET_STATUS: () => { + const items = getActiveItems(state2.items); + const {EMPTY, ERROR, BUSY, IDLE, READY} = Status; + if (items.length === 0) + return EMPTY; + if (items.some(isItemInErrorState)) + return ERROR; + if (items.some(isItemInBusyState)) + return BUSY; + if (items.some(isItemInReadyState)) + return READY; + return IDLE; + }, + GET_ITEM: (query) => getItemByQuery(state2.items, query), + GET_ACTIVE_ITEM: (query) => getItemByQuery(getActiveItems(state2.items), query), + GET_ACTIVE_ITEMS: () => getActiveItems(state2.items), + GET_ITEMS: () => state2.items, + GET_ITEM_NAME: (query) => { + const item2 = getItemByQuery(state2.items, query); + return item2 ? item2.filename : null; + }, + GET_ITEM_SIZE: (query) => { + const item2 = getItemByQuery(state2.items, query); + return item2 ? item2.fileSize : null; + }, + GET_STYLES: () => Object.keys(state2.options).filter((key) => /^style/.test(key)).map((option3) => ({ + name: option3, + value: state2.options[option3] + })), + GET_PANEL_ASPECT_RATIO: () => { + const isShapeCircle = /circle/.test(state2.options.stylePanelLayout); + const aspectRatio = isShapeCircle ? 1 : getNumericAspectRatioFromString(state2.options.stylePanelAspectRatio); + return aspectRatio; + }, + GET_ITEM_PANEL_ASPECT_RATIO: () => state2.options.styleItemPanelAspectRatio, + GET_ITEMS_BY_STATUS: (status) => getActiveItems(state2.items).filter((item2) => item2.status === status), + GET_TOTAL_ITEMS: () => getActiveItems(state2.items).length, + SHOULD_UPDATE_FILE_INPUT: () => state2.options.storeAsFile && canUpdateFileInput() && !isAsync(state2), + IS_ASYNC: () => isAsync(state2), + GET_FILE_SIZE_LABELS: (query) => ({ + labelBytes: query("GET_LABEL_FILE_SIZE_BYTES") || void 0, + labelKilobytes: query("GET_LABEL_FILE_SIZE_KILOBYTES") || void 0, + labelMegabytes: query("GET_LABEL_FILE_SIZE_MEGABYTES") || void 0, + labelGigabytes: query("GET_LABEL_FILE_SIZE_GIGABYTES") || void 0 + }) +}); +var hasRoomForItem = (state2) => { + const count = getActiveItems(state2.items).length; + if (!state2.options.allowMultiple) { + return count === 0; + } + const maxFileCount = state2.options.maxFiles; + if (maxFileCount === null) { + return true; + } + if (count < maxFileCount) { + return true; + } + return false; +}; +var limit = (value, min, max) => Math.max(Math.min(max, value), min); +var arrayInsert = (arr, index2, item2) => arr.splice(index2, 0, item2); +var insertItem = (items, item2, index2) => { + if (isEmpty(item2)) { + return null; + } + if (typeof index2 === "undefined") { + items.push(item2); + return item2; + } + index2 = limit(index2, 0, items.length); + arrayInsert(items, index2, item2); + return item2; +}; +var isBase64DataURI = (str) => /^\s*data:([a-z]+\/[a-z0-9-+.]+(;[a-z-]+=[a-z0-9-]+)?)?(;base64)?,([a-z0-9!$&',()*+;=\-._~:@\/?%\s]*)\s*$/i.test(str); +var getFilenameFromURL = (url) => url.split("/").pop().split("?").shift(); +var getExtensionFromFilename = (name2) => name2.split(".").pop(); +var guesstimateExtension = (type) => { + if (typeof type !== "string") { + return ""; + } + const subtype = type.split("/").pop(); + if (/svg/.test(subtype)) { + return "svg"; + } + if (/zip|compressed/.test(subtype)) { + return "zip"; + } + if (/plain/.test(subtype)) { + return "txt"; + } + if (/msword/.test(subtype)) { + return "doc"; + } + if (/[a-z]+/.test(subtype)) { + if (subtype === "jpeg") { + return "jpg"; + } + return subtype; + } + return ""; +}; +var leftPad = (value, padding = "") => (padding + value).slice(-padding.length); +var getDateString = (date = new Date()) => `${date.getFullYear()}-${leftPad(date.getMonth() + 1, "00")}-${leftPad(date.getDate(), "00")}_${leftPad(date.getHours(), "00")}-${leftPad(date.getMinutes(), "00")}-${leftPad(date.getSeconds(), "00")}`; +var getFileFromBlob = (blob2, filename, type = null, extension = null) => { + const file2 = typeof type === "string" ? blob2.slice(0, blob2.size, type) : blob2.slice(0, blob2.size, blob2.type); + file2.lastModifiedDate = new Date(); + if (blob2._relativePath) + file2._relativePath = blob2._relativePath; + if (!isString(filename)) { + filename = getDateString(); + } + if (filename && extension === null && getExtensionFromFilename(filename)) { + file2.name = filename; + } else { + extension = extension || guesstimateExtension(file2.type); + file2.name = filename + (extension ? "." + extension : ""); + } + return file2; +}; +var getBlobBuilder = () => { + return window.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder; +}; +var createBlob = (arrayBuffer, mimeType) => { + const BB = getBlobBuilder(); + if (BB) { + const bb = new BB(); + bb.append(arrayBuffer); + return bb.getBlob(mimeType); + } + return new Blob([arrayBuffer], { + type: mimeType + }); +}; +var getBlobFromByteStringWithMimeType = (byteString, mimeType) => { + const ab = new ArrayBuffer(byteString.length); + const ia = new Uint8Array(ab); + for (let i = 0; i < byteString.length; i++) { + ia[i] = byteString.charCodeAt(i); + } + return createBlob(ab, mimeType); +}; +var getMimeTypeFromBase64DataURI = (dataURI) => { + return (/^data:(.+);/.exec(dataURI) || [])[1] || null; +}; +var getBase64DataFromBase64DataURI = (dataURI) => { + const data3 = dataURI.split(",")[1]; + return data3.replace(/\s/g, ""); +}; +var getByteStringFromBase64DataURI = (dataURI) => { + return atob(getBase64DataFromBase64DataURI(dataURI)); +}; +var getBlobFromBase64DataURI = (dataURI) => { + const mimeType = getMimeTypeFromBase64DataURI(dataURI); + const byteString = getByteStringFromBase64DataURI(dataURI); + return getBlobFromByteStringWithMimeType(byteString, mimeType); +}; +var getFileFromBase64DataURI = (dataURI, filename, extension) => { + return getFileFromBlob(getBlobFromBase64DataURI(dataURI), filename, null, extension); +}; +var getFileNameFromHeader = (header) => { + if (!/^content-disposition:/i.test(header)) + return null; + const matches2 = header.split(/filename=|filename\*=.+''/).splice(1).map((name2) => name2.trim().replace(/^["']|[;"']{0,2}$/g, "")).filter((name2) => name2.length); + return matches2.length ? decodeURI(matches2[matches2.length - 1]) : null; +}; +var getFileSizeFromHeader = (header) => { + if (/content-length:/i.test(header)) { + const size = header.match(/[0-9]+/)[0]; + return size ? parseInt(size, 10) : null; + } + return null; +}; +var getTranfserIdFromHeader = (header) => { + if (/x-content-transfer-id:/i.test(header)) { + const id = (header.split(":")[1] || "").trim(); + return id || null; + } + return null; +}; +var getFileInfoFromHeaders = (headers) => { + const info = { + source: null, + name: null, + size: null + }; + const rows = headers.split("\n"); + for (let header of rows) { + const name2 = getFileNameFromHeader(header); + if (name2) { + info.name = name2; + continue; + } + const size = getFileSizeFromHeader(header); + if (size) { + info.size = size; + continue; + } + const source = getTranfserIdFromHeader(header); + if (source) { + info.source = source; + continue; + } + } + return info; +}; +var createFileLoader = (fetchFn) => { + const state2 = { + source: null, + complete: false, + progress: 0, + size: null, + timestamp: null, + duration: 0, + request: null + }; + const getProgress = () => state2.progress; + const abort = () => { + if (state2.request && state2.request.abort) { + state2.request.abort(); + } + }; + const load = () => { + const source = state2.source; + api.fire("init", source); + if (source instanceof File) { + api.fire("load", source); + } else if (source instanceof Blob) { + api.fire("load", getFileFromBlob(source, source.name)); + } else if (isBase64DataURI(source)) { + api.fire("load", getFileFromBase64DataURI(source)); + } else { + loadURL(source); + } + }; + const loadURL = (url) => { + if (!fetchFn) { + api.fire("error", { + type: "error", + body: "Can't load URL", + code: 400 + }); + return; + } + state2.timestamp = Date.now(); + state2.request = fetchFn(url, (response) => { + state2.duration = Date.now() - state2.timestamp; + state2.complete = true; + if (response instanceof Blob) { + response = getFileFromBlob(response, response.name || getFilenameFromURL(url)); + } + api.fire("load", response instanceof Blob ? response : response ? response.body : null); + }, (error2) => { + api.fire("error", typeof error2 === "string" ? { + type: "error", + code: 0, + body: error2 + } : error2); + }, (computable, current, total) => { + if (total) { + state2.size = total; + } + state2.duration = Date.now() - state2.timestamp; + if (!computable) { + state2.progress = null; + return; + } + state2.progress = current / total; + api.fire("progress", state2.progress); + }, () => { + api.fire("abort"); + }, (response) => { + const fileinfo = getFileInfoFromHeaders(typeof response === "string" ? response : response.headers); + api.fire("meta", { + size: state2.size || fileinfo.size, + filename: fileinfo.name, + source: fileinfo.source + }); + }); + }; + const api = { + ...on(), + setSource: (source) => state2.source = source, + getProgress, + abort, + load + }; + return api; +}; +var isGet = (method) => /GET|HEAD/.test(method); +var sendRequest = (data3, url, options) => { + const api = { + onheaders: () => { + }, + onprogress: () => { + }, + onload: () => { + }, + ontimeout: () => { + }, + onerror: () => { + }, + onabort: () => { + }, + abort: () => { + aborted = true; + xhr.abort(); + } + }; + let aborted = false; + let headersReceived = false; + options = { + method: "POST", + headers: {}, + withCredentials: false, + ...options + }; + url = encodeURI(url); + if (isGet(options.method) && data3) { + url = `${url}${encodeURIComponent(typeof data3 === "string" ? data3 : JSON.stringify(data3))}`; + } + const xhr = new XMLHttpRequest(); + const process = isGet(options.method) ? xhr : xhr.upload; + process.onprogress = (e2) => { + if (aborted) { + return; + } + api.onprogress(e2.lengthComputable, e2.loaded, e2.total); + }; + xhr.onreadystatechange = () => { + if (xhr.readyState < 2) { + return; + } + if (xhr.readyState === 4 && xhr.status === 0) { + return; + } + if (headersReceived) { + return; + } + headersReceived = true; + api.onheaders(xhr); + }; + xhr.onload = () => { + if (xhr.status >= 200 && xhr.status < 300) { + api.onload(xhr); + } else { + api.onerror(xhr); + } + }; + xhr.onerror = () => api.onerror(xhr); + xhr.onabort = () => { + aborted = true; + api.onabort(); + }; + xhr.ontimeout = () => api.ontimeout(xhr); + xhr.open(options.method, url, true); + if (isInt(options.timeout)) { + xhr.timeout = options.timeout; + } + Object.keys(options.headers).forEach((key) => { + const value = unescape(encodeURIComponent(options.headers[key])); + xhr.setRequestHeader(key, value); + }); + if (options.responseType) { + xhr.responseType = options.responseType; + } + if (options.withCredentials) { + xhr.withCredentials = true; + } + xhr.send(data3); + return api; +}; +var createResponse = (type, code, body, headers) => ({ + type, + code, + body, + headers +}); +var createTimeoutResponse = (cb) => (xhr) => { + cb(createResponse("error", 0, "Timeout", xhr.getAllResponseHeaders())); +}; +var hasQS = (str) => /\?/.test(str); +var buildURL = (...parts) => { + let url = ""; + parts.forEach((part) => { + url += hasQS(url) && hasQS(part) ? part.replace(/\?/, "&") : part; + }); + return url; +}; +var createFetchFunction = (apiUrl = "", action) => { + if (typeof action === "function") { + return action; + } + if (!action || !isString(action.url)) { + return null; + } + const onload = action.onload || ((res2) => res2); + const onerror = action.onerror || ((res2) => null); + return (url, load, error2, progress, abort, headers) => { + const request = sendRequest(url, buildURL(apiUrl, action.url), { + ...action, + responseType: "blob" + }); + request.onload = (xhr) => { + const headers2 = xhr.getAllResponseHeaders(); + const filename = getFileInfoFromHeaders(headers2).name || getFilenameFromURL(url); + load(createResponse("load", xhr.status, action.method === "HEAD" ? null : getFileFromBlob(onload(xhr.response), filename), headers2)); + }; + request.onerror = (xhr) => { + error2(createResponse("error", xhr.status, onerror(xhr.response) || xhr.statusText, xhr.getAllResponseHeaders())); + }; + request.onheaders = (xhr) => { + headers(createResponse("headers", xhr.status, null, xhr.getAllResponseHeaders())); + }; + request.ontimeout = createTimeoutResponse(error2); + request.onprogress = progress; + request.onabort = abort; + return request; + }; +}; +var ChunkStatus = { + QUEUED: 0, + COMPLETE: 1, + PROCESSING: 2, + ERROR: 3, + WAITING: 4 +}; +var processFileChunked = (apiUrl, action, name2, file2, metadata, load, error2, progress, abort, transfer, options) => { + const chunks = []; + const {chunkTransferId, chunkServer, chunkSize, chunkRetryDelays} = options; + const state2 = { + serverId: chunkTransferId, + aborted: false + }; + const ondata = action.ondata || ((fd) => fd); + const onload = action.onload || ((xhr, method) => method === "HEAD" ? xhr.getResponseHeader("Upload-Offset") : xhr.response); + const onerror = action.onerror || ((res2) => null); + const requestTransferId = (cb) => { + const formData = new FormData(); + if (isObject(metadata)) + formData.append(name2, JSON.stringify(metadata)); + const headers = typeof action.headers === "function" ? action.headers(file2, metadata) : { + ...action.headers, + "Upload-Length": file2.size + }; + const requestParams = { + ...action, + headers + }; + const request = sendRequest(ondata(formData), buildURL(apiUrl, action.url), requestParams); + request.onload = (xhr) => cb(onload(xhr, requestParams.method)); + request.onerror = (xhr) => error2(createResponse("error", xhr.status, onerror(xhr.response) || xhr.statusText, xhr.getAllResponseHeaders())); + request.ontimeout = createTimeoutResponse(error2); + }; + const requestTransferOffset = (cb) => { + const requestUrl = buildURL(apiUrl, chunkServer.url, state2.serverId); + const headers = typeof action.headers === "function" ? action.headers(state2.serverId) : { + ...action.headers + }; + const requestParams = { + headers, + method: "HEAD" + }; + const request = sendRequest(null, requestUrl, requestParams); + request.onload = (xhr) => cb(onload(xhr, requestParams.method)); + request.onerror = (xhr) => error2(createResponse("error", xhr.status, onerror(xhr.response) || xhr.statusText, xhr.getAllResponseHeaders())); + request.ontimeout = createTimeoutResponse(error2); + }; + const lastChunkIndex = Math.floor(file2.size / chunkSize); + for (let i = 0; i <= lastChunkIndex; i++) { + const offset = i * chunkSize; + const data3 = file2.slice(offset, offset + chunkSize, "application/offset+octet-stream"); + chunks[i] = { + index: i, + size: data3.size, + offset, + data: data3, + file: file2, + progress: 0, + retries: [...chunkRetryDelays], + status: ChunkStatus.QUEUED, + error: null, + request: null, + timeout: null + }; + } + const completeProcessingChunks = () => load(state2.serverId); + const canProcessChunk = (chunk) => chunk.status === ChunkStatus.QUEUED || chunk.status === ChunkStatus.ERROR; + const processChunk = (chunk) => { + if (state2.aborted) + return; + chunk = chunk || chunks.find(canProcessChunk); + if (!chunk) { + if (chunks.every((chunk2) => chunk2.status === ChunkStatus.COMPLETE)) { + completeProcessingChunks(); + } + return; + } + chunk.status = ChunkStatus.PROCESSING; + chunk.progress = null; + const ondata2 = chunkServer.ondata || ((fd) => fd); + const onerror2 = chunkServer.onerror || ((res2) => null); + const requestUrl = buildURL(apiUrl, chunkServer.url, state2.serverId); + const headers = typeof chunkServer.headers === "function" ? chunkServer.headers(chunk) : { + ...chunkServer.headers, + "Content-Type": "application/offset+octet-stream", + "Upload-Offset": chunk.offset, + "Upload-Length": file2.size, + "Upload-Name": file2.name + }; + const request = chunk.request = sendRequest(ondata2(chunk.data), requestUrl, { + ...chunkServer, + headers + }); + request.onload = () => { + chunk.status = ChunkStatus.COMPLETE; + chunk.request = null; + processChunks(); + }; + request.onprogress = (lengthComputable, loaded, total) => { + chunk.progress = lengthComputable ? loaded : null; + updateTotalProgress(); + }; + request.onerror = (xhr) => { + chunk.status = ChunkStatus.ERROR; + chunk.request = null; + chunk.error = onerror2(xhr.response) || xhr.statusText; + if (!retryProcessChunk(chunk)) { + error2(createResponse("error", xhr.status, onerror2(xhr.response) || xhr.statusText, xhr.getAllResponseHeaders())); + } + }; + request.ontimeout = (xhr) => { + chunk.status = ChunkStatus.ERROR; + chunk.request = null; + if (!retryProcessChunk(chunk)) { + createTimeoutResponse(error2)(xhr); + } + }; + request.onabort = () => { + chunk.status = ChunkStatus.QUEUED; + chunk.request = null; + abort(); + }; + }; + const retryProcessChunk = (chunk) => { + if (chunk.retries.length === 0) + return false; + chunk.status = ChunkStatus.WAITING; + clearTimeout(chunk.timeout); + chunk.timeout = setTimeout(() => { + processChunk(chunk); + }, chunk.retries.shift()); + return true; + }; + const updateTotalProgress = () => { + const totalBytesTransfered = chunks.reduce((p2, chunk) => { + if (p2 === null || chunk.progress === null) + return null; + return p2 + chunk.progress; + }, 0); + if (totalBytesTransfered === null) + return progress(false, 0, 0); + const totalSize = chunks.reduce((total, chunk) => total + chunk.size, 0); + progress(true, totalBytesTransfered, totalSize); + }; + const processChunks = () => { + const totalProcessing = chunks.filter((chunk) => chunk.status === ChunkStatus.PROCESSING).length; + if (totalProcessing >= 1) + return; + processChunk(); + }; + const abortChunks = () => { + chunks.forEach((chunk) => { + clearTimeout(chunk.timeout); + if (chunk.request) { + chunk.request.abort(); + } + }); + }; + if (!state2.serverId) { + requestTransferId((serverId) => { + if (state2.aborted) + return; + transfer(serverId); + state2.serverId = serverId; + processChunks(); + }); + } else { + requestTransferOffset((offset) => { + if (state2.aborted) + return; + chunks.filter((chunk) => chunk.offset < offset).forEach((chunk) => { + chunk.status = ChunkStatus.COMPLETE; + chunk.progress = chunk.size; + }); + processChunks(); + }); + } + return { + abort: () => { + state2.aborted = true; + abortChunks(); + } + }; +}; +var createFileProcessorFunction = (apiUrl, action, name2, options) => (file2, metadata, load, error2, progress, abort, transfer) => { + if (!file2) + return; + const canChunkUpload = options.chunkUploads; + const shouldChunkUpload = canChunkUpload && file2.size > options.chunkSize; + const willChunkUpload = canChunkUpload && (shouldChunkUpload || options.chunkForce); + if (file2 instanceof Blob && willChunkUpload) + return processFileChunked(apiUrl, action, name2, file2, metadata, load, error2, progress, abort, transfer, options); + const ondata = action.ondata || ((fd) => fd); + const onload = action.onload || ((res2) => res2); + const onerror = action.onerror || ((res2) => null); + const headers = typeof action.headers === "function" ? action.headers(file2, metadata) || {} : { + ...action.headers + }; + const requestParams = { + ...action, + headers + }; + var formData = new FormData(); + if (isObject(metadata)) { + formData.append(name2, JSON.stringify(metadata)); + } + (file2 instanceof Blob ? [{name: null, file: file2}] : file2).forEach((item2) => { + formData.append(name2, item2.file, item2.name === null ? item2.file.name : `${item2.name}${item2.file.name}`); + }); + const request = sendRequest(ondata(formData), buildURL(apiUrl, action.url), requestParams); + request.onload = (xhr) => { + load(createResponse("load", xhr.status, onload(xhr.response), xhr.getAllResponseHeaders())); + }; + request.onerror = (xhr) => { + error2(createResponse("error", xhr.status, onerror(xhr.response) || xhr.statusText, xhr.getAllResponseHeaders())); + }; + request.ontimeout = createTimeoutResponse(error2); + request.onprogress = progress; + request.onabort = abort; + return request; +}; +var createProcessorFunction = (apiUrl = "", action, name2, options) => { + if (typeof action === "function") + return (...params) => action(name2, ...params, options); + if (!action || !isString(action.url)) + return null; + return createFileProcessorFunction(apiUrl, action, name2, options); +}; +var createRevertFunction = (apiUrl = "", action) => { + if (typeof action === "function") { + return action; + } + if (!action || !isString(action.url)) { + return (uniqueFileId, load) => load(); + } + const onload = action.onload || ((res2) => res2); + const onerror = action.onerror || ((res2) => null); + return (uniqueFileId, load, error2) => { + const request = sendRequest(uniqueFileId, apiUrl + action.url, action); + request.onload = (xhr) => { + load(createResponse("load", xhr.status, onload(xhr.response), xhr.getAllResponseHeaders())); + }; + request.onerror = (xhr) => { + error2(createResponse("error", xhr.status, onerror(xhr.response) || xhr.statusText, xhr.getAllResponseHeaders())); + }; + request.ontimeout = createTimeoutResponse(error2); + return request; + }; +}; +var getRandomNumber = (min = 0, max = 1) => min + Math.random() * (max - min); +var createPerceivedPerformanceUpdater = (cb, duration = 1e3, offset = 0, tickMin = 25, tickMax = 250) => { + let timeout = null; + const start = Date.now(); + const tick = () => { + let runtime = Date.now() - start; + let delay = getRandomNumber(tickMin, tickMax); + if (runtime + delay > duration) { + delay = runtime + delay - duration; + } + let progress = runtime / duration; + if (progress >= 1 || document.hidden) { + cb(1); + return; + } + cb(progress); + timeout = setTimeout(tick, delay); + }; + if (duration > 0) + tick(); + return { + clear: () => { + clearTimeout(timeout); + } + }; +}; +var createFileProcessor = (processFn, options) => { + const state2 = { + complete: false, + perceivedProgress: 0, + perceivedPerformanceUpdater: null, + progress: null, + timestamp: null, + perceivedDuration: 0, + duration: 0, + request: null, + response: null + }; + const {allowMinimumUploadDuration} = options; + const process = (file2, metadata) => { + const progressFn = () => { + if (state2.duration === 0 || state2.progress === null) + return; + api.fire("progress", api.getProgress()); + }; + const completeFn = () => { + state2.complete = true; + api.fire("load-perceived", state2.response.body); + }; + api.fire("start"); + state2.timestamp = Date.now(); + state2.perceivedPerformanceUpdater = createPerceivedPerformanceUpdater((progress) => { + state2.perceivedProgress = progress; + state2.perceivedDuration = Date.now() - state2.timestamp; + progressFn(); + if (state2.response && state2.perceivedProgress === 1 && !state2.complete) { + completeFn(); + } + }, allowMinimumUploadDuration ? getRandomNumber(750, 1500) : 0); + state2.request = processFn(file2, metadata, (response) => { + state2.response = isObject(response) ? response : { + type: "load", + code: 200, + body: `${response}`, + headers: {} + }; + state2.duration = Date.now() - state2.timestamp; + state2.progress = 1; + api.fire("load", state2.response.body); + if (!allowMinimumUploadDuration || allowMinimumUploadDuration && state2.perceivedProgress === 1) { + completeFn(); + } + }, (error2) => { + state2.perceivedPerformanceUpdater.clear(); + api.fire("error", isObject(error2) ? error2 : { + type: "error", + code: 0, + body: `${error2}` + }); + }, (computable, current, total) => { + state2.duration = Date.now() - state2.timestamp; + state2.progress = computable ? current / total : null; + progressFn(); + }, () => { + state2.perceivedPerformanceUpdater.clear(); + api.fire("abort", state2.response ? state2.response.body : null); + }, (transferId) => { + api.fire("transfer", transferId); + }); + }; + const abort = () => { + if (!state2.request) + return; + state2.perceivedPerformanceUpdater.clear(); + if (state2.request.abort) + state2.request.abort(); + state2.complete = true; + }; + const reset = () => { + abort(); + state2.complete = false; + state2.perceivedProgress = 0; + state2.progress = 0; + state2.timestamp = null; + state2.perceivedDuration = 0; + state2.duration = 0; + state2.request = null; + state2.response = null; + }; + const getProgress = allowMinimumUploadDuration ? () => state2.progress ? Math.min(state2.progress, state2.perceivedProgress) : null : () => state2.progress || null; + const getDuration = allowMinimumUploadDuration ? () => Math.min(state2.duration, state2.perceivedDuration) : () => state2.duration; + const api = { + ...on(), + process, + abort, + getProgress, + getDuration, + reset + }; + return api; +}; +var getFilenameWithoutExtension = (name2) => name2.substr(0, name2.lastIndexOf(".")) || name2; +var createFileStub = (source) => { + let data3 = [source.name, source.size, source.type]; + if (source instanceof Blob || isBase64DataURI(source)) { + data3[0] = source.name || getDateString(); + } else if (isBase64DataURI(source)) { + data3[1] = source.length; + data3[2] = getMimeTypeFromBase64DataURI(source); + } else if (isString(source)) { + data3[0] = getFilenameFromURL(source); + data3[1] = 0; + data3[2] = "application/octet-stream"; + } + return { + name: data3[0], + size: data3[1], + type: data3[2] + }; +}; +var isFile = (value) => !!(value instanceof File || value instanceof Blob && value.name); +var deepCloneObject = (src) => { + if (!isObject(src)) + return src; + const target = isArray(src) ? [] : {}; + for (const key in src) { + if (!src.hasOwnProperty(key)) + continue; + const v = src[key]; + target[key] = v && isObject(v) ? deepCloneObject(v) : v; + } + return target; +}; +var createItem = (origin = null, serverFileReference = null, file2 = null) => { + const id = getUniqueId(); + const state2 = { + archived: false, + frozen: false, + released: false, + source: null, + file: file2, + serverFileReference, + transferId: null, + processingAborted: false, + status: serverFileReference ? ItemStatus.PROCESSING_COMPLETE : ItemStatus.INIT, + activeLoader: null, + activeProcessor: null + }; + let abortProcessingRequestComplete = null; + const metadata = {}; + const setStatus = (status) => state2.status = status; + const fire = (event, ...params) => { + if (state2.released || state2.frozen) + return; + api.fire(event, ...params); + }; + const getFileExtension = () => getExtensionFromFilename(state2.file.name); + const getFileType = () => state2.file.type; + const getFileSize = () => state2.file.size; + const getFile2 = () => state2.file; + const load = (source, loader, onload) => { + state2.source = source; + api.fireSync("init"); + if (state2.file) { + api.fireSync("load-skip"); + return; + } + state2.file = createFileStub(source); + loader.on("init", () => { + fire("load-init"); + }); + loader.on("meta", (meta) => { + state2.file.size = meta.size; + state2.file.filename = meta.filename; + if (meta.source) { + origin = FileOrigin.LIMBO; + state2.serverFileReference = meta.source; + state2.status = ItemStatus.PROCESSING_COMPLETE; + } + fire("load-meta"); + }); + loader.on("progress", (progress) => { + setStatus(ItemStatus.LOADING); + fire("load-progress", progress); + }); + loader.on("error", (error2) => { + setStatus(ItemStatus.LOAD_ERROR); + fire("load-request-error", error2); + }); + loader.on("abort", () => { + setStatus(ItemStatus.INIT); + fire("load-abort"); + }); + loader.on("load", (file3) => { + state2.activeLoader = null; + const success = (result) => { + state2.file = isFile(result) ? result : state2.file; + if (origin === FileOrigin.LIMBO && state2.serverFileReference) { + setStatus(ItemStatus.PROCESSING_COMPLETE); + } else { + setStatus(ItemStatus.IDLE); + } + fire("load"); + }; + const error2 = (result) => { + state2.file = file3; + fire("load-meta"); + setStatus(ItemStatus.LOAD_ERROR); + fire("load-file-error", result); + }; + if (state2.serverFileReference) { + success(file3); + return; + } + onload(file3, success, error2); + }); + loader.setSource(source); + state2.activeLoader = loader; + loader.load(); + }; + const retryLoad = () => { + if (!state2.activeLoader) { + return; + } + state2.activeLoader.load(); + }; + const abortLoad = () => { + if (state2.activeLoader) { + state2.activeLoader.abort(); + return; + } + setStatus(ItemStatus.INIT); + fire("load-abort"); + }; + const process = (processor, onprocess) => { + if (state2.processingAborted) { + state2.processingAborted = false; + return; + } + setStatus(ItemStatus.PROCESSING); + abortProcessingRequestComplete = null; + if (!(state2.file instanceof Blob)) { + api.on("load", () => { + process(processor, onprocess); + }); + return; + } + processor.on("load", (serverFileReference2) => { + state2.transferId = null; + state2.serverFileReference = serverFileReference2; + }); + processor.on("transfer", (transferId) => { + state2.transferId = transferId; + }); + processor.on("load-perceived", (serverFileReference2) => { + state2.activeProcessor = null; + state2.transferId = null; + state2.serverFileReference = serverFileReference2; + setStatus(ItemStatus.PROCESSING_COMPLETE); + fire("process-complete", serverFileReference2); + }); + processor.on("start", () => { + fire("process-start"); + }); + processor.on("error", (error3) => { + state2.activeProcessor = null; + setStatus(ItemStatus.PROCESSING_ERROR); + fire("process-error", error3); + }); + processor.on("abort", (serverFileReference2) => { + state2.activeProcessor = null; + state2.serverFileReference = serverFileReference2; + setStatus(ItemStatus.IDLE); + fire("process-abort"); + if (abortProcessingRequestComplete) { + abortProcessingRequestComplete(); + } + }); + processor.on("progress", (progress) => { + fire("process-progress", progress); + }); + const success = (file3) => { + if (state2.archived) + return; + processor.process(file3, {...metadata}); + }; + const error2 = console.error; + onprocess(state2.file, success, error2); + state2.activeProcessor = processor; + }; + const requestProcessing = () => { + state2.processingAborted = false; + setStatus(ItemStatus.PROCESSING_QUEUED); + }; + const abortProcessing = () => new Promise((resolve) => { + if (!state2.activeProcessor) { + state2.processingAborted = true; + setStatus(ItemStatus.IDLE); + fire("process-abort"); + resolve(); + return; + } + abortProcessingRequestComplete = () => { + resolve(); + }; + state2.activeProcessor.abort(); + }); + const revert = (revertFileUpload, forceRevert) => new Promise((resolve, reject) => { + const serverTransferId = state2.serverFileReference !== null ? state2.serverFileReference : state2.transferId; + if (serverTransferId === null) { + resolve(); + return; + } + revertFileUpload(serverTransferId, () => { + state2.serverFileReference = null; + state2.transferId = null; + resolve(); + }, (error2) => { + if (!forceRevert) { + resolve(); + return; + } + setStatus(ItemStatus.PROCESSING_REVERT_ERROR); + fire("process-revert-error"); + reject(error2); + }); + setStatus(ItemStatus.IDLE); + fire("process-revert"); + }); + const setMetadata = (key, value, silent) => { + const keys = key.split("."); + const root2 = keys[0]; + const last = keys.pop(); + let data3 = metadata; + keys.forEach((key2) => data3 = data3[key2]); + if (JSON.stringify(data3[last]) === JSON.stringify(value)) + return; + data3[last] = value; + fire("metadata-update", { + key: root2, + value: metadata[root2], + silent + }); + }; + const getMetadata = (key) => deepCloneObject(key ? metadata[key] : metadata); + const api = { + id: {get: () => id}, + origin: {get: () => origin, set: (value) => origin = value}, + serverId: {get: () => state2.serverFileReference}, + transferId: {get: () => state2.transferId}, + status: {get: () => state2.status}, + filename: {get: () => state2.file.name}, + filenameWithoutExtension: {get: () => getFilenameWithoutExtension(state2.file.name)}, + fileExtension: {get: getFileExtension}, + fileType: {get: getFileType}, + fileSize: {get: getFileSize}, + file: {get: getFile2}, + relativePath: {get: () => state2.file._relativePath}, + source: {get: () => state2.source}, + getMetadata, + setMetadata: (key, value, silent) => { + if (isObject(key)) { + const data3 = key; + Object.keys(data3).forEach((key2) => { + setMetadata(key2, data3[key2], value); + }); + return key; + } + setMetadata(key, value, silent); + return value; + }, + extend: (name2, handler) => itemAPI[name2] = handler, + abortLoad, + retryLoad, + requestProcessing, + abortProcessing, + load, + process, + revert, + ...on(), + freeze: () => state2.frozen = true, + release: () => state2.released = true, + released: {get: () => state2.released}, + archive: () => state2.archived = true, + archived: {get: () => state2.archived} + }; + const itemAPI = createObject(api); + return itemAPI; +}; +var getItemIndexByQuery = (items, query) => { + if (isEmpty(query)) { + return 0; + } + if (!isString(query)) { + return -1; + } + return items.findIndex((item2) => item2.id === query); +}; +var getItemById = (items, itemId) => { + const index2 = getItemIndexByQuery(items, itemId); + if (index2 < 0) { + return; + } + return items[index2] || null; +}; +var fetchBlob = (url, load, error2, progress, abort, headers) => { + const request = sendRequest(null, url, { + method: "GET", + responseType: "blob" + }); + request.onload = (xhr) => { + const headers2 = xhr.getAllResponseHeaders(); + const filename = getFileInfoFromHeaders(headers2).name || getFilenameFromURL(url); + load(createResponse("load", xhr.status, getFileFromBlob(xhr.response, filename), headers2)); + }; + request.onerror = (xhr) => { + error2(createResponse("error", xhr.status, xhr.statusText, xhr.getAllResponseHeaders())); + }; + request.onheaders = (xhr) => { + headers(createResponse("headers", xhr.status, null, xhr.getAllResponseHeaders())); + }; + request.ontimeout = createTimeoutResponse(error2); + request.onprogress = progress; + request.onabort = abort; + return request; +}; +var getDomainFromURL = (url) => { + if (url.indexOf("//") === 0) { + url = location.protocol + url; + } + return url.toLowerCase().replace("blob:", "").replace(/([a-z])?:\/\//, "$1").split("/")[0]; +}; +var isExternalURL = (url) => (url.indexOf(":") > -1 || url.indexOf("//") > -1) && getDomainFromURL(location.href) !== getDomainFromURL(url); +var dynamicLabel = (label) => (...params) => isFunction(label) ? label(...params) : label; +var isMockItem = (item2) => !isFile(item2.file); +var listUpdated = (dispatch2, state2) => { + clearTimeout(state2.listUpdateTimeout); + state2.listUpdateTimeout = setTimeout(() => { + dispatch2("DID_UPDATE_ITEMS", {items: getActiveItems(state2.items)}); + }, 0); +}; +var optionalPromise = (fn2, ...params) => new Promise((resolve) => { + if (!fn2) { + return resolve(true); + } + const result = fn2(...params); + if (result == null) { + return resolve(true); + } + if (typeof result === "boolean") { + return resolve(result); + } + if (typeof result.then === "function") { + result.then(resolve); + } +}); +var sortItems = (state2, compare) => { + state2.items.sort((a2, b) => compare(createItemAPI(a2), createItemAPI(b))); +}; +var getItemByQueryFromState = (state2, itemHandler) => ({ + query, + success = () => { + }, + failure = () => { + }, + ...options +} = {}) => { + const item2 = getItemByQuery(state2.items, query); + if (!item2) { + failure({ + error: createResponse("error", 0, "Item not found"), + file: null + }); + return; + } + itemHandler(item2, success, failure, options || {}); +}; +var actions = (dispatch2, query, state2) => ({ + ABORT_ALL: () => { + getActiveItems(state2.items).forEach((item2) => { + item2.freeze(); + item2.abortLoad(); + item2.abortProcessing(); + }); + }, + DID_SET_FILES: ({value = []}) => { + const files = value.map((file2) => ({ + source: file2.source ? file2.source : file2, + options: file2.options + })); + let activeItems = getActiveItems(state2.items); + activeItems.forEach((item2) => { + if (!files.find((file2) => file2.source === item2.source || file2.source === item2.file)) { + dispatch2("REMOVE_ITEM", {query: item2, remove: false}); + } + }); + activeItems = getActiveItems(state2.items); + files.forEach((file2, index2) => { + if (activeItems.find((item2) => item2.source === file2.source || item2.file === file2.source)) + return; + dispatch2("ADD_ITEM", { + ...file2, + interactionMethod: InteractionMethod.NONE, + index: index2 + }); + }); + }, + DID_UPDATE_ITEM_METADATA: ({id, action, change}) => { + if (change.silent) + return; + clearTimeout(state2.itemUpdateTimeout); + state2.itemUpdateTimeout = setTimeout(() => { + const item2 = getItemById(state2.items, id); + if (!query("IS_ASYNC")) { + applyFilterChain("SHOULD_PREPARE_OUTPUT", false, { + item: item2, + query, + action, + change + }).then((shouldPrepareOutput) => { + const beforePrepareFile = query("GET_BEFORE_PREPARE_FILE"); + if (beforePrepareFile) + shouldPrepareOutput = beforePrepareFile(item2, shouldPrepareOutput); + if (!shouldPrepareOutput) + return; + dispatch2("REQUEST_PREPARE_OUTPUT", { + query: id, + item: item2, + success: (file2) => { + dispatch2("DID_PREPARE_OUTPUT", {id, file: file2}); + } + }, true); + }); + return; + } + if (item2.origin === FileOrigin.LOCAL) { + dispatch2("DID_LOAD_ITEM", { + id: item2.id, + error: null, + serverFileReference: item2.source + }); + } + const upload = () => { + setTimeout(() => { + dispatch2("REQUEST_ITEM_PROCESSING", {query: id}); + }, 32); + }; + const revert = (doUpload) => { + item2.revert(createRevertFunction(state2.options.server.url, state2.options.server.revert), query("GET_FORCE_REVERT")).then(doUpload ? upload : () => { + }).catch(() => { + }); + }; + const abort = (doUpload) => { + item2.abortProcessing().then(doUpload ? upload : () => { + }); + }; + if (item2.status === ItemStatus.PROCESSING_COMPLETE) { + return revert(state2.options.instantUpload); + } + if (item2.status === ItemStatus.PROCESSING) { + return abort(state2.options.instantUpload); + } + if (state2.options.instantUpload) { + upload(); + } + }, 0); + }, + MOVE_ITEM: ({query: query2, index: index2}) => { + const item2 = getItemByQuery(state2.items, query2); + if (!item2) + return; + const currentIndex = state2.items.indexOf(item2); + index2 = limit(index2, 0, state2.items.length - 1); + if (currentIndex === index2) + return; + state2.items.splice(index2, 0, state2.items.splice(currentIndex, 1)[0]); + }, + SORT: ({compare}) => { + sortItems(state2, compare); + dispatch2("DID_SORT_ITEMS", { + items: query("GET_ACTIVE_ITEMS") + }); + }, + ADD_ITEMS: ({items, index: index2, interactionMethod, success = () => { + }, failure = () => { + }}) => { + let currentIndex = index2; + if (index2 === -1 || typeof index2 === "undefined") { + const insertLocation = query("GET_ITEM_INSERT_LOCATION"); + const totalItems = query("GET_TOTAL_ITEMS"); + currentIndex = insertLocation === "before" ? 0 : totalItems; + } + const ignoredFiles = query("GET_IGNORED_FILES"); + const isValidFile = (source) => isFile(source) ? !ignoredFiles.includes(source.name.toLowerCase()) : !isEmpty(source); + const validItems = items.filter(isValidFile); + const promises = validItems.map((source) => new Promise((resolve, reject) => { + dispatch2("ADD_ITEM", { + interactionMethod, + source: source.source || source, + success: resolve, + failure: reject, + index: currentIndex++, + options: source.options || {} + }); + })); + Promise.all(promises).then(success).catch(failure); + }, + ADD_ITEM: ({ + source, + index: index2 = -1, + interactionMethod, + success = () => { + }, + failure = () => { + }, + options = {} + }) => { + if (isEmpty(source)) { + failure({ + error: createResponse("error", 0, "No source"), + file: null + }); + return; + } + if (isFile(source) && state2.options.ignoredFiles.includes(source.name.toLowerCase())) { + return; + } + if (!hasRoomForItem(state2)) { + if (state2.options.allowMultiple || !state2.options.allowMultiple && !state2.options.allowReplace) { + const error2 = createResponse("warning", 0, "Max files"); + dispatch2("DID_THROW_MAX_FILES", { + source, + error: error2 + }); + failure({error: error2, file: null}); + return; + } + const item3 = getActiveItems(state2.items)[0]; + if (item3.status === ItemStatus.PROCESSING_COMPLETE || item3.status === ItemStatus.PROCESSING_REVERT_ERROR) { + const forceRevert = query("GET_FORCE_REVERT"); + item3.revert(createRevertFunction(state2.options.server.url, state2.options.server.revert), forceRevert).then(() => { + if (!forceRevert) + return; + dispatch2("ADD_ITEM", { + source, + index: index2, + interactionMethod, + success, + failure, + options + }); + }).catch(() => { + }); + if (forceRevert) + return; + } + dispatch2("REMOVE_ITEM", {query: item3.id}); + } + const origin = options.type === "local" ? FileOrigin.LOCAL : options.type === "limbo" ? FileOrigin.LIMBO : FileOrigin.INPUT; + const item2 = createItem(origin, origin === FileOrigin.INPUT ? null : source, options.file); + Object.keys(options.metadata || {}).forEach((key) => { + item2.setMetadata(key, options.metadata[key]); + }); + applyFilters("DID_CREATE_ITEM", item2, {query, dispatch: dispatch2}); + const itemInsertLocation = query("GET_ITEM_INSERT_LOCATION"); + if (!state2.options.itemInsertLocationFreedom) { + index2 = itemInsertLocation === "before" ? -1 : state2.items.length; + } + insertItem(state2.items, item2, index2); + if (isFunction(itemInsertLocation) && source) { + sortItems(state2, itemInsertLocation); + } + const id = item2.id; + item2.on("init", () => { + dispatch2("DID_INIT_ITEM", {id}); + }); + item2.on("load-init", () => { + dispatch2("DID_START_ITEM_LOAD", {id}); + }); + item2.on("load-meta", () => { + dispatch2("DID_UPDATE_ITEM_META", {id}); + }); + item2.on("load-progress", (progress) => { + dispatch2("DID_UPDATE_ITEM_LOAD_PROGRESS", {id, progress}); + }); + item2.on("load-request-error", (error2) => { + const mainStatus = dynamicLabel(state2.options.labelFileLoadError)(error2); + if (error2.code >= 400 && error2.code < 500) { + dispatch2("DID_THROW_ITEM_INVALID", { + id, + error: error2, + status: { + main: mainStatus, + sub: `${error2.code} (${error2.body})` + } + }); + failure({error: error2, file: createItemAPI(item2)}); + return; + } + dispatch2("DID_THROW_ITEM_LOAD_ERROR", { + id, + error: error2, + status: { + main: mainStatus, + sub: state2.options.labelTapToRetry + } + }); + }); + item2.on("load-file-error", (error2) => { + dispatch2("DID_THROW_ITEM_INVALID", { + id, + error: error2.status, + status: error2.status + }); + failure({error: error2.status, file: createItemAPI(item2)}); + }); + item2.on("load-abort", () => { + dispatch2("REMOVE_ITEM", {query: id}); + }); + item2.on("load-skip", () => { + dispatch2("COMPLETE_LOAD_ITEM", { + query: id, + item: item2, + data: { + source, + success + } + }); + }); + item2.on("load", () => { + const handleAdd = (shouldAdd) => { + if (!shouldAdd) { + dispatch2("REMOVE_ITEM", { + query: id + }); + return; + } + item2.on("metadata-update", (change) => { + dispatch2("DID_UPDATE_ITEM_METADATA", {id, change}); + }); + applyFilterChain("SHOULD_PREPARE_OUTPUT", false, {item: item2, query}).then((shouldPrepareOutput) => { + const beforePrepareFile = query("GET_BEFORE_PREPARE_FILE"); + if (beforePrepareFile) + shouldPrepareOutput = beforePrepareFile(item2, shouldPrepareOutput); + const loadComplete = () => { + dispatch2("COMPLETE_LOAD_ITEM", { + query: id, + item: item2, + data: { + source, + success + } + }); + listUpdated(dispatch2, state2); + }; + if (shouldPrepareOutput) { + dispatch2("REQUEST_PREPARE_OUTPUT", { + query: id, + item: item2, + success: (file2) => { + dispatch2("DID_PREPARE_OUTPUT", {id, file: file2}); + loadComplete(); + } + }, true); + return; + } + loadComplete(); + }); + }; + applyFilterChain("DID_LOAD_ITEM", item2, {query, dispatch: dispatch2}).then(() => { + optionalPromise(query("GET_BEFORE_ADD_FILE"), createItemAPI(item2)).then(handleAdd); + }).catch((e2) => { + if (!e2 || !e2.error || !e2.status) + return handleAdd(false); + dispatch2("DID_THROW_ITEM_INVALID", { + id, + error: e2.error, + status: e2.status + }); + }); + }); + item2.on("process-start", () => { + dispatch2("DID_START_ITEM_PROCESSING", {id}); + }); + item2.on("process-progress", (progress) => { + dispatch2("DID_UPDATE_ITEM_PROCESS_PROGRESS", {id, progress}); + }); + item2.on("process-error", (error2) => { + dispatch2("DID_THROW_ITEM_PROCESSING_ERROR", { + id, + error: error2, + status: { + main: dynamicLabel(state2.options.labelFileProcessingError)(error2), + sub: state2.options.labelTapToRetry + } + }); + }); + item2.on("process-revert-error", (error2) => { + dispatch2("DID_THROW_ITEM_PROCESSING_REVERT_ERROR", { + id, + error: error2, + status: { + main: dynamicLabel(state2.options.labelFileProcessingRevertError)(error2), + sub: state2.options.labelTapToRetry + } + }); + }); + item2.on("process-complete", (serverFileReference) => { + dispatch2("DID_COMPLETE_ITEM_PROCESSING", { + id, + error: null, + serverFileReference + }); + dispatch2("DID_DEFINE_VALUE", {id, value: serverFileReference}); + }); + item2.on("process-abort", () => { + dispatch2("DID_ABORT_ITEM_PROCESSING", {id}); + }); + item2.on("process-revert", () => { + dispatch2("DID_REVERT_ITEM_PROCESSING", {id}); + dispatch2("DID_DEFINE_VALUE", {id, value: null}); + }); + dispatch2("DID_ADD_ITEM", {id, index: index2, interactionMethod}); + listUpdated(dispatch2, state2); + const {url, load, restore, fetch: fetch2} = state2.options.server || {}; + item2.load(source, createFileLoader(origin === FileOrigin.INPUT ? isString(source) && isExternalURL(source) ? fetch2 ? createFetchFunction(url, fetch2) : fetchBlob : fetchBlob : origin === FileOrigin.LIMBO ? createFetchFunction(url, restore) : createFetchFunction(url, load)), (file2, success2, error2) => { + applyFilterChain("LOAD_FILE", file2, {query}).then(success2).catch(error2); + }); + }, + REQUEST_PREPARE_OUTPUT: ({item: item2, success, failure = () => { + }}) => { + const err = { + error: createResponse("error", 0, "Item not found"), + file: null + }; + if (item2.archived) + return failure(err); + applyFilterChain("PREPARE_OUTPUT", item2.file, {query, item: item2}).then((result) => { + applyFilterChain("COMPLETE_PREPARE_OUTPUT", result, {query, item: item2}).then((result2) => { + if (item2.archived) + return failure(err); + success(result2); + }); + }); + }, + COMPLETE_LOAD_ITEM: ({item: item2, data: data3}) => { + const {success, source} = data3; + const itemInsertLocation = query("GET_ITEM_INSERT_LOCATION"); + if (isFunction(itemInsertLocation) && source) { + sortItems(state2, itemInsertLocation); + } + dispatch2("DID_LOAD_ITEM", { + id: item2.id, + error: null, + serverFileReference: item2.origin === FileOrigin.INPUT ? null : source + }); + success(createItemAPI(item2)); + if (item2.origin === FileOrigin.LOCAL) { + dispatch2("DID_LOAD_LOCAL_ITEM", {id: item2.id}); + return; + } + if (item2.origin === FileOrigin.LIMBO) { + dispatch2("DID_COMPLETE_ITEM_PROCESSING", { + id: item2.id, + error: null, + serverFileReference: source + }); + dispatch2("DID_DEFINE_VALUE", { + id: item2.id, + value: item2.serverId || source + }); + return; + } + if (query("IS_ASYNC") && state2.options.instantUpload) { + dispatch2("REQUEST_ITEM_PROCESSING", {query: item2.id}); + } + }, + RETRY_ITEM_LOAD: getItemByQueryFromState(state2, (item2) => { + item2.retryLoad(); + }), + REQUEST_ITEM_PREPARE: getItemByQueryFromState(state2, (item2, success, failure) => { + dispatch2("REQUEST_PREPARE_OUTPUT", { + query: item2.id, + item: item2, + success: (file2) => { + dispatch2("DID_PREPARE_OUTPUT", {id: item2.id, file: file2}); + success({ + file: item2, + output: file2 + }); + }, + failure + }, true); + }), + REQUEST_ITEM_PROCESSING: getItemByQueryFromState(state2, (item2, success, failure) => { + const itemCanBeQueuedForProcessing = item2.status === ItemStatus.IDLE || item2.status === ItemStatus.PROCESSING_ERROR; + if (!itemCanBeQueuedForProcessing) { + const processNow = () => dispatch2("REQUEST_ITEM_PROCESSING", {query: item2, success, failure}); + const process = () => document.hidden ? processNow() : setTimeout(processNow, 32); + if (item2.status === ItemStatus.PROCESSING_COMPLETE || item2.status === ItemStatus.PROCESSING_REVERT_ERROR) { + item2.revert(createRevertFunction(state2.options.server.url, state2.options.server.revert), query("GET_FORCE_REVERT")).then(process).catch(() => { + }); + } else if (item2.status === ItemStatus.PROCESSING) { + item2.abortProcessing().then(process); + } + return; + } + if (item2.status === ItemStatus.PROCESSING_QUEUED) + return; + item2.requestProcessing(); + dispatch2("DID_REQUEST_ITEM_PROCESSING", {id: item2.id}); + dispatch2("PROCESS_ITEM", {query: item2, success, failure}, true); + }), + PROCESS_ITEM: getItemByQueryFromState(state2, (item2, success, failure) => { + const maxParallelUploads = query("GET_MAX_PARALLEL_UPLOADS"); + const totalCurrentUploads = query("GET_ITEMS_BY_STATUS", ItemStatus.PROCESSING).length; + if (totalCurrentUploads === maxParallelUploads) { + state2.processingQueue.push({ + id: item2.id, + success, + failure + }); + return; + } + if (item2.status === ItemStatus.PROCESSING) + return; + const processNext = () => { + const queueEntry = state2.processingQueue.shift(); + if (!queueEntry) + return; + const {id, success: success2, failure: failure2} = queueEntry; + const itemReference = getItemByQuery(state2.items, id); + if (!itemReference || itemReference.archived) { + processNext(); + return; + } + dispatch2("PROCESS_ITEM", {query: id, success: success2, failure: failure2}, true); + }; + item2.onOnce("process-complete", () => { + success(createItemAPI(item2)); + processNext(); + const server = state2.options.server; + const instantUpload = state2.options.instantUpload; + if (instantUpload && item2.origin === FileOrigin.LOCAL && isFunction(server.remove)) { + const noop = () => { + }; + item2.origin = FileOrigin.LIMBO; + state2.options.server.remove(item2.source, noop, noop); + } + const allItemsProcessed = query("GET_ITEMS_BY_STATUS", ItemStatus.PROCESSING_COMPLETE).length === state2.items.length; + if (allItemsProcessed) { + dispatch2("DID_COMPLETE_ITEM_PROCESSING_ALL"); + } + }); + item2.onOnce("process-error", (error2) => { + failure({error: error2, file: createItemAPI(item2)}); + processNext(); + }); + const options = state2.options; + item2.process(createFileProcessor(createProcessorFunction(options.server.url, options.server.process, options.name, { + chunkTransferId: item2.transferId, + chunkServer: options.server.patch, + chunkUploads: options.chunkUploads, + chunkForce: options.chunkForce, + chunkSize: options.chunkSize, + chunkRetryDelays: options.chunkRetryDelays + }), { + allowMinimumUploadDuration: query("GET_ALLOW_MINIMUM_UPLOAD_DURATION") + }), (file2, success2, error2) => { + applyFilterChain("PREPARE_OUTPUT", file2, {query, item: item2}).then((file3) => { + dispatch2("DID_PREPARE_OUTPUT", {id: item2.id, file: file3}); + success2(file3); + }).catch(error2); + }); + }), + RETRY_ITEM_PROCESSING: getItemByQueryFromState(state2, (item2) => { + dispatch2("REQUEST_ITEM_PROCESSING", {query: item2}); + }), + REQUEST_REMOVE_ITEM: getItemByQueryFromState(state2, (item2) => { + optionalPromise(query("GET_BEFORE_REMOVE_FILE"), createItemAPI(item2)).then((shouldRemove) => { + if (!shouldRemove) { + return; + } + dispatch2("REMOVE_ITEM", {query: item2}); + }); + }), + RELEASE_ITEM: getItemByQueryFromState(state2, (item2) => { + item2.release(); + }), + REMOVE_ITEM: getItemByQueryFromState(state2, (item2, success, failure, options) => { + const removeFromView = () => { + const id = item2.id; + getItemById(state2.items, id).archive(); + dispatch2("DID_REMOVE_ITEM", {error: null, id, item: item2}); + listUpdated(dispatch2, state2); + success(createItemAPI(item2)); + }; + const server = state2.options.server; + if (item2.origin === FileOrigin.LOCAL && server && isFunction(server.remove) && options.remove !== false) { + dispatch2("DID_START_ITEM_REMOVE", {id: item2.id}); + server.remove(item2.source, () => removeFromView(), (status) => { + dispatch2("DID_THROW_ITEM_REMOVE_ERROR", { + id: item2.id, + error: createResponse("error", 0, status, null), + status: { + main: dynamicLabel(state2.options.labelFileRemoveError)(status), + sub: state2.options.labelTapToRetry + } + }); + }); + } else { + if (options.revert && item2.origin !== FileOrigin.LOCAL && item2.serverId !== null || state2.options.chunkUploads && item2.file.size > state2.options.chunkSize || state2.options.chunkUploads && state2.options.chunkForce) { + item2.revert(createRevertFunction(state2.options.server.url, state2.options.server.revert), query("GET_FORCE_REVERT")); + } + removeFromView(); + } + }), + ABORT_ITEM_LOAD: getItemByQueryFromState(state2, (item2) => { + item2.abortLoad(); + }), + ABORT_ITEM_PROCESSING: getItemByQueryFromState(state2, (item2) => { + if (item2.serverId) { + dispatch2("REVERT_ITEM_PROCESSING", {id: item2.id}); + return; + } + item2.abortProcessing().then(() => { + const shouldRemove = state2.options.instantUpload; + if (shouldRemove) { + dispatch2("REMOVE_ITEM", {query: item2.id}); + } + }); + }), + REQUEST_REVERT_ITEM_PROCESSING: getItemByQueryFromState(state2, (item2) => { + if (!state2.options.instantUpload) { + dispatch2("REVERT_ITEM_PROCESSING", {query: item2}); + return; + } + const handleRevert2 = (shouldRevert) => { + if (!shouldRevert) + return; + dispatch2("REVERT_ITEM_PROCESSING", {query: item2}); + }; + const fn2 = query("GET_BEFORE_REMOVE_FILE"); + if (!fn2) { + return handleRevert2(true); + } + const requestRemoveResult = fn2(createItemAPI(item2)); + if (requestRemoveResult == null) { + return handleRevert2(true); + } + if (typeof requestRemoveResult === "boolean") { + return handleRevert2(requestRemoveResult); + } + if (typeof requestRemoveResult.then === "function") { + requestRemoveResult.then(handleRevert2); + } + }), + REVERT_ITEM_PROCESSING: getItemByQueryFromState(state2, (item2) => { + item2.revert(createRevertFunction(state2.options.server.url, state2.options.server.revert), query("GET_FORCE_REVERT")).then(() => { + const shouldRemove = state2.options.instantUpload || isMockItem(item2); + if (shouldRemove) { + dispatch2("REMOVE_ITEM", {query: item2.id}); + } + }).catch(() => { + }); + }), + SET_OPTIONS: ({options}) => { + const optionKeys = Object.keys(options); + const prioritizedOptionKeys = PrioritizedOptions.filter((key) => optionKeys.includes(key)); + const orderedOptionKeys = [ + ...prioritizedOptionKeys, + ...Object.keys(options).filter((key) => !prioritizedOptionKeys.includes(key)) + ]; + orderedOptionKeys.forEach((key) => { + dispatch2(`SET_${fromCamels(key, "_").toUpperCase()}`, { + value: options[key] + }); + }); + } +}); +var PrioritizedOptions = [ + "server" +]; +var formatFilename = (name2) => name2; +var createElement$1 = (tagName) => { + return document.createElement(tagName); +}; +var text = (node, value) => { + let textNode = node.childNodes[0]; + if (!textNode) { + textNode = document.createTextNode(value); + node.appendChild(textNode); + } else if (value !== textNode.nodeValue) { + textNode.nodeValue = value; + } +}; +var polarToCartesian = (centerX, centerY, radius, angleInDegrees) => { + const angleInRadians = (angleInDegrees % 360 - 90) * Math.PI / 180; + return { + x: centerX + radius * Math.cos(angleInRadians), + y: centerY + radius * Math.sin(angleInRadians) + }; +}; +var describeArc = (x, y, radius, startAngle, endAngle, arcSweep) => { + const start = polarToCartesian(x, y, radius, endAngle); + const end = polarToCartesian(x, y, radius, startAngle); + return ["M", start.x, start.y, "A", radius, radius, 0, arcSweep, 0, end.x, end.y].join(" "); +}; +var percentageArc = (x, y, radius, from, to) => { + let arcSweep = 1; + if (to > from && to - from <= 0.5) { + arcSweep = 0; + } + if (from > to && from - to >= 0.5) { + arcSweep = 0; + } + return describeArc(x, y, radius, Math.min(0.9999, from) * 360, Math.min(0.9999, to) * 360, arcSweep); +}; +var create = ({root: root2, props}) => { + props.spin = false; + props.progress = 0; + props.opacity = 0; + const svg3 = createElement("svg"); + root2.ref.path = createElement("path", { + "stroke-width": 2, + "stroke-linecap": "round" + }); + svg3.appendChild(root2.ref.path); + root2.ref.svg = svg3; + root2.appendChild(svg3); +}; +var write = ({root: root2, props}) => { + if (props.opacity === 0) { + return; + } + if (props.align) { + root2.element.dataset.align = props.align; + } + const ringStrokeWidth = parseInt(attr(root2.ref.path, "stroke-width"), 10); + const size = root2.rect.element.width * 0.5; + let ringFrom = 0; + let ringTo = 0; + if (props.spin) { + ringFrom = 0; + ringTo = 0.5; + } else { + ringFrom = 0; + ringTo = props.progress; + } + const coordinates = percentageArc(size, size, size - ringStrokeWidth, ringFrom, ringTo); + attr(root2.ref.path, "d", coordinates); + attr(root2.ref.path, "stroke-opacity", props.spin || props.progress > 0 ? 1 : 0); +}; +var progressIndicator = createView({ + tag: "div", + name: "progress-indicator", + ignoreRectUpdate: true, + ignoreRect: true, + create, + write, + mixins: { + apis: ["progress", "spin", "align"], + styles: ["opacity"], + animations: { + opacity: {type: "tween", duration: 500}, + progress: { + type: "spring", + stiffness: 0.95, + damping: 0.65, + mass: 10 + } + } + } +}); +var create$1 = ({root: root2, props}) => { + root2.element.innerHTML = (props.icon || "") + `${props.label}`; + props.isDisabled = false; +}; +var write$1 = ({root: root2, props}) => { + const {isDisabled} = props; + const shouldDisable = root2.query("GET_DISABLED") || props.opacity === 0; + if (shouldDisable && !isDisabled) { + props.isDisabled = true; + attr(root2.element, "disabled", "disabled"); + } else if (!shouldDisable && isDisabled) { + props.isDisabled = false; + root2.element.removeAttribute("disabled"); + } +}; +var fileActionButton = createView({ + tag: "button", + attributes: { + type: "button" + }, + ignoreRect: true, + ignoreRectUpdate: true, + name: "file-action-button", + mixins: { + apis: ["label"], + styles: ["translateX", "translateY", "scaleX", "scaleY", "opacity"], + animations: { + scaleX: "spring", + scaleY: "spring", + translateX: "spring", + translateY: "spring", + opacity: {type: "tween", duration: 250} + }, + listeners: true + }, + create: create$1, + write: write$1 +}); +var toNaturalFileSize = (bytes, decimalSeparator = ".", base = 1e3, options = {}) => { + const { + labelBytes = "bytes", + labelKilobytes = "KB", + labelMegabytes = "MB", + labelGigabytes = "GB" + } = options; + bytes = Math.round(Math.abs(bytes)); + const KB = base; + const MB = base * base; + const GB = base * base * base; + if (bytes < KB) { + return `${bytes} ${labelBytes}`; + } + if (bytes < MB) { + return `${Math.floor(bytes / KB)} ${labelKilobytes}`; + } + if (bytes < GB) { + return `${removeDecimalsWhenZero(bytes / MB, 1, decimalSeparator)} ${labelMegabytes}`; + } + return `${removeDecimalsWhenZero(bytes / GB, 2, decimalSeparator)} ${labelGigabytes}`; +}; +var removeDecimalsWhenZero = (value, decimalCount, separator) => { + return value.toFixed(decimalCount).split(".").filter((part) => part !== "0").join(separator); +}; +var create$2 = ({root: root2, props}) => { + const fileName = createElement$1("span"); + fileName.className = "filepond--file-info-main"; + attr(fileName, "aria-hidden", "true"); + root2.appendChild(fileName); + root2.ref.fileName = fileName; + const fileSize = createElement$1("span"); + fileSize.className = "filepond--file-info-sub"; + root2.appendChild(fileSize); + root2.ref.fileSize = fileSize; + text(fileSize, root2.query("GET_LABEL_FILE_WAITING_FOR_SIZE")); + text(fileName, formatFilename(root2.query("GET_ITEM_NAME", props.id))); +}; +var updateFile = ({root: root2, props}) => { + text(root2.ref.fileSize, toNaturalFileSize(root2.query("GET_ITEM_SIZE", props.id), ".", root2.query("GET_FILE_SIZE_BASE"), root2.query("GET_FILE_SIZE_LABELS", root2.query))); + text(root2.ref.fileName, formatFilename(root2.query("GET_ITEM_NAME", props.id))); +}; +var updateFileSizeOnError = ({root: root2, props}) => { + if (isInt(root2.query("GET_ITEM_SIZE", props.id))) { + updateFile({root: root2, props}); + return; + } + text(root2.ref.fileSize, root2.query("GET_LABEL_FILE_SIZE_NOT_AVAILABLE")); +}; +var fileInfo = createView({ + name: "file-info", + ignoreRect: true, + ignoreRectUpdate: true, + write: createRoute({ + DID_LOAD_ITEM: updateFile, + DID_UPDATE_ITEM_META: updateFile, + DID_THROW_ITEM_LOAD_ERROR: updateFileSizeOnError, + DID_THROW_ITEM_INVALID: updateFileSizeOnError + }), + didCreateView: (root2) => { + applyFilters("CREATE_VIEW", {...root2, view: root2}); + }, + create: create$2, + mixins: { + styles: ["translateX", "translateY"], + animations: { + translateX: "spring", + translateY: "spring" + } + } +}); +var toPercentage = (value) => Math.round(value * 100); +var create$3 = ({root: root2}) => { + const main = createElement$1("span"); + main.className = "filepond--file-status-main"; + root2.appendChild(main); + root2.ref.main = main; + const sub = createElement$1("span"); + sub.className = "filepond--file-status-sub"; + root2.appendChild(sub); + root2.ref.sub = sub; + didSetItemLoadProgress({root: root2, action: {progress: null}}); +}; +var didSetItemLoadProgress = ({root: root2, action}) => { + const title = action.progress === null ? root2.query("GET_LABEL_FILE_LOADING") : `${root2.query("GET_LABEL_FILE_LOADING")} ${toPercentage(action.progress)}%`; + text(root2.ref.main, title); + text(root2.ref.sub, root2.query("GET_LABEL_TAP_TO_CANCEL")); +}; +var didSetItemProcessProgress = ({root: root2, action}) => { + const title = action.progress === null ? root2.query("GET_LABEL_FILE_PROCESSING") : `${root2.query("GET_LABEL_FILE_PROCESSING")} ${toPercentage(action.progress)}%`; + text(root2.ref.main, title); + text(root2.ref.sub, root2.query("GET_LABEL_TAP_TO_CANCEL")); +}; +var didRequestItemProcessing = ({root: root2}) => { + text(root2.ref.main, root2.query("GET_LABEL_FILE_PROCESSING")); + text(root2.ref.sub, root2.query("GET_LABEL_TAP_TO_CANCEL")); +}; +var didAbortItemProcessing = ({root: root2}) => { + text(root2.ref.main, root2.query("GET_LABEL_FILE_PROCESSING_ABORTED")); + text(root2.ref.sub, root2.query("GET_LABEL_TAP_TO_RETRY")); +}; +var didCompleteItemProcessing = ({root: root2}) => { + text(root2.ref.main, root2.query("GET_LABEL_FILE_PROCESSING_COMPLETE")); + text(root2.ref.sub, root2.query("GET_LABEL_TAP_TO_UNDO")); +}; +var clear = ({root: root2}) => { + text(root2.ref.main, ""); + text(root2.ref.sub, ""); +}; +var error = ({root: root2, action}) => { + text(root2.ref.main, action.status.main); + text(root2.ref.sub, action.status.sub); +}; +var fileStatus = createView({ + name: "file-status", + ignoreRect: true, + ignoreRectUpdate: true, + write: createRoute({ + DID_LOAD_ITEM: clear, + DID_REVERT_ITEM_PROCESSING: clear, + DID_REQUEST_ITEM_PROCESSING: didRequestItemProcessing, + DID_ABORT_ITEM_PROCESSING: didAbortItemProcessing, + DID_COMPLETE_ITEM_PROCESSING: didCompleteItemProcessing, + DID_UPDATE_ITEM_PROCESS_PROGRESS: didSetItemProcessProgress, + DID_UPDATE_ITEM_LOAD_PROGRESS: didSetItemLoadProgress, + DID_THROW_ITEM_LOAD_ERROR: error, + DID_THROW_ITEM_INVALID: error, + DID_THROW_ITEM_PROCESSING_ERROR: error, + DID_THROW_ITEM_PROCESSING_REVERT_ERROR: error, + DID_THROW_ITEM_REMOVE_ERROR: error + }), + didCreateView: (root2) => { + applyFilters("CREATE_VIEW", {...root2, view: root2}); + }, + create: create$3, + mixins: { + styles: ["translateX", "translateY", "opacity"], + animations: { + opacity: {type: "tween", duration: 250}, + translateX: "spring", + translateY: "spring" + } + } +}); +var Buttons = { + AbortItemLoad: { + label: "GET_LABEL_BUTTON_ABORT_ITEM_LOAD", + action: "ABORT_ITEM_LOAD", + className: "filepond--action-abort-item-load", + align: "LOAD_INDICATOR_POSITION" + }, + RetryItemLoad: { + label: "GET_LABEL_BUTTON_RETRY_ITEM_LOAD", + action: "RETRY_ITEM_LOAD", + icon: "GET_ICON_RETRY", + className: "filepond--action-retry-item-load", + align: "BUTTON_PROCESS_ITEM_POSITION" + }, + RemoveItem: { + label: "GET_LABEL_BUTTON_REMOVE_ITEM", + action: "REQUEST_REMOVE_ITEM", + icon: "GET_ICON_REMOVE", + className: "filepond--action-remove-item", + align: "BUTTON_REMOVE_ITEM_POSITION" + }, + ProcessItem: { + label: "GET_LABEL_BUTTON_PROCESS_ITEM", + action: "REQUEST_ITEM_PROCESSING", + icon: "GET_ICON_PROCESS", + className: "filepond--action-process-item", + align: "BUTTON_PROCESS_ITEM_POSITION" + }, + AbortItemProcessing: { + label: "GET_LABEL_BUTTON_ABORT_ITEM_PROCESSING", + action: "ABORT_ITEM_PROCESSING", + className: "filepond--action-abort-item-processing", + align: "BUTTON_PROCESS_ITEM_POSITION" + }, + RetryItemProcessing: { + label: "GET_LABEL_BUTTON_RETRY_ITEM_PROCESSING", + action: "RETRY_ITEM_PROCESSING", + icon: "GET_ICON_RETRY", + className: "filepond--action-retry-item-processing", + align: "BUTTON_PROCESS_ITEM_POSITION" + }, + RevertItemProcessing: { + label: "GET_LABEL_BUTTON_UNDO_ITEM_PROCESSING", + action: "REQUEST_REVERT_ITEM_PROCESSING", + icon: "GET_ICON_UNDO", + className: "filepond--action-revert-item-processing", + align: "BUTTON_PROCESS_ITEM_POSITION" + } +}; +var ButtonKeys = []; +forin(Buttons, (key) => { + ButtonKeys.push(key); +}); +var calculateFileInfoOffset = (root2) => { + if (getRemoveIndicatorAligment(root2) === "right") + return 0; + const buttonRect = root2.ref.buttonRemoveItem.rect.element; + return buttonRect.hidden ? null : buttonRect.width + buttonRect.left; +}; +var calculateButtonWidth = (root2) => { + const buttonRect = root2.ref.buttonAbortItemLoad.rect.element; + return buttonRect.width; +}; +var calculateFileVerticalCenterOffset = (root2) => Math.floor(root2.ref.buttonRemoveItem.rect.element.height / 4); +var calculateFileHorizontalCenterOffset = (root2) => Math.floor(root2.ref.buttonRemoveItem.rect.element.left / 2); +var getLoadIndicatorAlignment = (root2) => root2.query("GET_STYLE_LOAD_INDICATOR_POSITION"); +var getProcessIndicatorAlignment = (root2) => root2.query("GET_STYLE_PROGRESS_INDICATOR_POSITION"); +var getRemoveIndicatorAligment = (root2) => root2.query("GET_STYLE_BUTTON_REMOVE_ITEM_POSITION"); +var DefaultStyle = { + buttonAbortItemLoad: {opacity: 0}, + buttonRetryItemLoad: {opacity: 0}, + buttonRemoveItem: {opacity: 0}, + buttonProcessItem: {opacity: 0}, + buttonAbortItemProcessing: {opacity: 0}, + buttonRetryItemProcessing: {opacity: 0}, + buttonRevertItemProcessing: {opacity: 0}, + loadProgressIndicator: {opacity: 0, align: getLoadIndicatorAlignment}, + processProgressIndicator: {opacity: 0, align: getProcessIndicatorAlignment}, + processingCompleteIndicator: {opacity: 0, scaleX: 0.75, scaleY: 0.75}, + info: {translateX: 0, translateY: 0, opacity: 0}, + status: {translateX: 0, translateY: 0, opacity: 0} +}; +var IdleStyle = { + buttonRemoveItem: {opacity: 1}, + buttonProcessItem: {opacity: 1}, + info: {translateX: calculateFileInfoOffset}, + status: {translateX: calculateFileInfoOffset} +}; +var ProcessingStyle = { + buttonAbortItemProcessing: {opacity: 1}, + processProgressIndicator: {opacity: 1}, + status: {opacity: 1} +}; +var StyleMap = { + DID_THROW_ITEM_INVALID: { + buttonRemoveItem: {opacity: 1}, + info: {translateX: calculateFileInfoOffset}, + status: {translateX: calculateFileInfoOffset, opacity: 1} + }, + DID_START_ITEM_LOAD: { + buttonAbortItemLoad: {opacity: 1}, + loadProgressIndicator: {opacity: 1}, + status: {opacity: 1} + }, + DID_THROW_ITEM_LOAD_ERROR: { + buttonRetryItemLoad: {opacity: 1}, + buttonRemoveItem: {opacity: 1}, + info: {translateX: calculateFileInfoOffset}, + status: {opacity: 1} + }, + DID_START_ITEM_REMOVE: { + processProgressIndicator: {opacity: 1, align: getRemoveIndicatorAligment}, + info: {translateX: calculateFileInfoOffset}, + status: {opacity: 0} + }, + DID_THROW_ITEM_REMOVE_ERROR: { + processProgressIndicator: {opacity: 0, align: getRemoveIndicatorAligment}, + buttonRemoveItem: {opacity: 1}, + info: {translateX: calculateFileInfoOffset}, + status: {opacity: 1, translateX: calculateFileInfoOffset} + }, + DID_LOAD_ITEM: IdleStyle, + DID_LOAD_LOCAL_ITEM: { + buttonRemoveItem: {opacity: 1}, + info: {translateX: calculateFileInfoOffset}, + status: {translateX: calculateFileInfoOffset} + }, + DID_START_ITEM_PROCESSING: ProcessingStyle, + DID_REQUEST_ITEM_PROCESSING: ProcessingStyle, + DID_UPDATE_ITEM_PROCESS_PROGRESS: ProcessingStyle, + DID_COMPLETE_ITEM_PROCESSING: { + buttonRevertItemProcessing: {opacity: 1}, + info: {opacity: 1}, + status: {opacity: 1} + }, + DID_THROW_ITEM_PROCESSING_ERROR: { + buttonRemoveItem: {opacity: 1}, + buttonRetryItemProcessing: {opacity: 1}, + status: {opacity: 1}, + info: {translateX: calculateFileInfoOffset} + }, + DID_THROW_ITEM_PROCESSING_REVERT_ERROR: { + buttonRevertItemProcessing: {opacity: 1}, + status: {opacity: 1}, + info: {opacity: 1} + }, + DID_ABORT_ITEM_PROCESSING: { + buttonRemoveItem: {opacity: 1}, + buttonProcessItem: {opacity: 1}, + info: {translateX: calculateFileInfoOffset}, + status: {opacity: 1} + }, + DID_REVERT_ITEM_PROCESSING: IdleStyle +}; +var processingCompleteIndicatorView = createView({ + create: ({root: root2}) => { + root2.element.innerHTML = root2.query("GET_ICON_DONE"); + }, + name: "processing-complete-indicator", + ignoreRect: true, + mixins: { + styles: ["scaleX", "scaleY", "opacity"], + animations: { + scaleX: "spring", + scaleY: "spring", + opacity: {type: "tween", duration: 250} + } + } +}); +var create$4 = ({root: root2, props}) => { + const LocalButtons = Object.keys(Buttons).reduce((prev, curr) => { + prev[curr] = {...Buttons[curr]}; + return prev; + }, {}); + const {id} = props; + const allowRevert = root2.query("GET_ALLOW_REVERT"); + const allowRemove = root2.query("GET_ALLOW_REMOVE"); + const allowProcess = root2.query("GET_ALLOW_PROCESS"); + const instantUpload = root2.query("GET_INSTANT_UPLOAD"); + const isAsync2 = root2.query("IS_ASYNC"); + const alignRemoveItemButton = root2.query("GET_STYLE_BUTTON_REMOVE_ITEM_ALIGN"); + let buttonFilter; + if (isAsync2) { + if (allowProcess && !allowRevert) { + buttonFilter = (key) => !/RevertItemProcessing/.test(key); + } else if (!allowProcess && allowRevert) { + buttonFilter = (key) => !/ProcessItem|RetryItemProcessing|AbortItemProcessing/.test(key); + } else if (!allowProcess && !allowRevert) { + buttonFilter = (key) => !/Process/.test(key); + } + } else { + buttonFilter = (key) => !/Process/.test(key); + } + const enabledButtons = buttonFilter ? ButtonKeys.filter(buttonFilter) : ButtonKeys.concat(); + if (instantUpload && allowRevert) { + LocalButtons["RevertItemProcessing"].label = "GET_LABEL_BUTTON_REMOVE_ITEM"; + LocalButtons["RevertItemProcessing"].icon = "GET_ICON_REMOVE"; + } + if (isAsync2 && !allowRevert) { + const map2 = StyleMap["DID_COMPLETE_ITEM_PROCESSING"]; + map2.info.translateX = calculateFileHorizontalCenterOffset; + map2.info.translateY = calculateFileVerticalCenterOffset; + map2.status.translateY = calculateFileVerticalCenterOffset; + map2.processingCompleteIndicator = {opacity: 1, scaleX: 1, scaleY: 1}; + } + if (isAsync2 && !allowProcess) { + [ + "DID_START_ITEM_PROCESSING", + "DID_REQUEST_ITEM_PROCESSING", + "DID_UPDATE_ITEM_PROCESS_PROGRESS", + "DID_THROW_ITEM_PROCESSING_ERROR" + ].forEach((key) => { + StyleMap[key].status.translateY = calculateFileVerticalCenterOffset; + }); + StyleMap["DID_THROW_ITEM_PROCESSING_ERROR"].status.translateX = calculateButtonWidth; + } + if (alignRemoveItemButton && allowRevert) { + LocalButtons["RevertItemProcessing"].align = "BUTTON_REMOVE_ITEM_POSITION"; + const map2 = StyleMap["DID_COMPLETE_ITEM_PROCESSING"]; + map2.info.translateX = calculateFileInfoOffset; + map2.status.translateY = calculateFileVerticalCenterOffset; + map2.processingCompleteIndicator = {opacity: 1, scaleX: 1, scaleY: 1}; + } + if (!allowRemove) { + LocalButtons["RemoveItem"].disabled = true; + } + forin(LocalButtons, (key, definition) => { + const buttonView = root2.createChildView(fileActionButton, { + label: root2.query(definition.label), + icon: root2.query(definition.icon), + opacity: 0 + }); + if (enabledButtons.includes(key)) { + root2.appendChildView(buttonView); + } + if (definition.disabled) { + buttonView.element.setAttribute("disabled", "disabled"); + buttonView.element.setAttribute("hidden", "hidden"); + } + buttonView.element.dataset.align = root2.query(`GET_STYLE_${definition.align}`); + buttonView.element.classList.add(definition.className); + buttonView.on("click", (e2) => { + e2.stopPropagation(); + if (definition.disabled) + return; + root2.dispatch(definition.action, {query: id}); + }); + root2.ref[`button${key}`] = buttonView; + }); + root2.ref.processingCompleteIndicator = root2.appendChildView(root2.createChildView(processingCompleteIndicatorView)); + root2.ref.processingCompleteIndicator.element.dataset.align = root2.query(`GET_STYLE_BUTTON_PROCESS_ITEM_POSITION`); + root2.ref.info = root2.appendChildView(root2.createChildView(fileInfo, {id})); + root2.ref.status = root2.appendChildView(root2.createChildView(fileStatus, {id})); + const loadIndicatorView = root2.appendChildView(root2.createChildView(progressIndicator, { + opacity: 0, + align: root2.query(`GET_STYLE_LOAD_INDICATOR_POSITION`) + })); + loadIndicatorView.element.classList.add("filepond--load-indicator"); + root2.ref.loadProgressIndicator = loadIndicatorView; + const progressIndicatorView = root2.appendChildView(root2.createChildView(progressIndicator, { + opacity: 0, + align: root2.query(`GET_STYLE_PROGRESS_INDICATOR_POSITION`) + })); + progressIndicatorView.element.classList.add("filepond--process-indicator"); + root2.ref.processProgressIndicator = progressIndicatorView; + root2.ref.activeStyles = []; +}; +var write$2 = ({root: root2, actions: actions2, props}) => { + route({root: root2, actions: actions2, props}); + let action = actions2.concat().filter((action2) => /^DID_/.test(action2.type)).reverse().find((action2) => StyleMap[action2.type]); + if (action) { + root2.ref.activeStyles = []; + const stylesToApply = StyleMap[action.type]; + forin(DefaultStyle, (name2, defaultStyles) => { + const control = root2.ref[name2]; + forin(defaultStyles, (key, defaultValue) => { + const value = stylesToApply[name2] && typeof stylesToApply[name2][key] !== "undefined" ? stylesToApply[name2][key] : defaultValue; + root2.ref.activeStyles.push({control, key, value}); + }); + }); + } + root2.ref.activeStyles.forEach(({control, key, value}) => { + control[key] = typeof value === "function" ? value(root2) : value; + }); +}; +var route = createRoute({ + DID_SET_LABEL_BUTTON_ABORT_ITEM_PROCESSING: ({root: root2, action}) => { + root2.ref.buttonAbortItemProcessing.label = action.value; + }, + DID_SET_LABEL_BUTTON_ABORT_ITEM_LOAD: ({root: root2, action}) => { + root2.ref.buttonAbortItemLoad.label = action.value; + }, + DID_SET_LABEL_BUTTON_ABORT_ITEM_REMOVAL: ({root: root2, action}) => { + root2.ref.buttonAbortItemRemoval.label = action.value; + }, + DID_REQUEST_ITEM_PROCESSING: ({root: root2}) => { + root2.ref.processProgressIndicator.spin = true; + root2.ref.processProgressIndicator.progress = 0; + }, + DID_START_ITEM_LOAD: ({root: root2}) => { + root2.ref.loadProgressIndicator.spin = true; + root2.ref.loadProgressIndicator.progress = 0; + }, + DID_START_ITEM_REMOVE: ({root: root2}) => { + root2.ref.processProgressIndicator.spin = true; + root2.ref.processProgressIndicator.progress = 0; + }, + DID_UPDATE_ITEM_LOAD_PROGRESS: ({root: root2, action}) => { + root2.ref.loadProgressIndicator.spin = false; + root2.ref.loadProgressIndicator.progress = action.progress; + }, + DID_UPDATE_ITEM_PROCESS_PROGRESS: ({root: root2, action}) => { + root2.ref.processProgressIndicator.spin = false; + root2.ref.processProgressIndicator.progress = action.progress; + } +}); +var file = createView({ + create: create$4, + write: write$2, + didCreateView: (root2) => { + applyFilters("CREATE_VIEW", {...root2, view: root2}); + }, + name: "file" +}); +var create$5 = ({root: root2, props}) => { + root2.ref.fileName = createElement$1("legend"); + root2.appendChild(root2.ref.fileName); + root2.ref.file = root2.appendChildView(root2.createChildView(file, {id: props.id})); + root2.ref.data = false; +}; +var didLoadItem = ({root: root2, props}) => { + text(root2.ref.fileName, formatFilename(root2.query("GET_ITEM_NAME", props.id))); +}; +var fileWrapper = createView({ + create: create$5, + ignoreRect: true, + write: createRoute({ + DID_LOAD_ITEM: didLoadItem + }), + didCreateView: (root2) => { + applyFilters("CREATE_VIEW", {...root2, view: root2}); + }, + tag: "fieldset", + name: "file-wrapper" +}); +var PANEL_SPRING_PROPS = {type: "spring", damping: 0.6, mass: 7}; +var create$6 = ({root: root2, props}) => { + [ + { + name: "top" + }, + { + name: "center", + props: { + translateY: null, + scaleY: null + }, + mixins: { + animations: { + scaleY: PANEL_SPRING_PROPS + }, + styles: ["translateY", "scaleY"] + } + }, + { + name: "bottom", + props: { + translateY: null + }, + mixins: { + animations: { + translateY: PANEL_SPRING_PROPS + }, + styles: ["translateY"] + } + } + ].forEach((section) => { + createSection(root2, section, props.name); + }); + root2.element.classList.add(`filepond--${props.name}`); + root2.ref.scalable = null; +}; +var createSection = (root2, section, className) => { + const viewConstructor = createView({ + name: `panel-${section.name} filepond--${className}`, + mixins: section.mixins, + ignoreRectUpdate: true + }); + const view = root2.createChildView(viewConstructor, section.props); + root2.ref[section.name] = root2.appendChildView(view); +}; +var write$3 = ({root: root2, props}) => { + if (root2.ref.scalable === null || props.scalable !== root2.ref.scalable) { + root2.ref.scalable = isBoolean(props.scalable) ? props.scalable : true; + root2.element.dataset.scalable = root2.ref.scalable; + } + if (!props.height) + return; + const topRect = root2.ref.top.rect.element; + const bottomRect = root2.ref.bottom.rect.element; + const height = Math.max(topRect.height + bottomRect.height, props.height); + root2.ref.center.translateY = topRect.height; + root2.ref.center.scaleY = (height - topRect.height - bottomRect.height) / 100; + root2.ref.bottom.translateY = height - bottomRect.height; +}; +var panel = createView({ + name: "panel", + read: ({root: root2, props}) => props.heightCurrent = root2.ref.bottom.translateY, + write: write$3, + create: create$6, + ignoreRect: true, + mixins: { + apis: ["height", "heightCurrent", "scalable"] + } +}); +var createDragHelper = (items) => { + const itemIds = items.map((item2) => item2.id); + let prevIndex = void 0; + return { + setIndex: (index2) => { + prevIndex = index2; + }, + getIndex: () => prevIndex, + getItemIndex: (item2) => itemIds.indexOf(item2.id) + }; +}; +var ITEM_TRANSLATE_SPRING = { + type: "spring", + stiffness: 0.75, + damping: 0.45, + mass: 10 +}; +var ITEM_SCALE_SPRING = "spring"; +var StateMap = { + DID_START_ITEM_LOAD: "busy", + DID_UPDATE_ITEM_LOAD_PROGRESS: "loading", + DID_THROW_ITEM_INVALID: "load-invalid", + DID_THROW_ITEM_LOAD_ERROR: "load-error", + DID_LOAD_ITEM: "idle", + DID_THROW_ITEM_REMOVE_ERROR: "remove-error", + DID_START_ITEM_REMOVE: "busy", + DID_START_ITEM_PROCESSING: "busy processing", + DID_REQUEST_ITEM_PROCESSING: "busy processing", + DID_UPDATE_ITEM_PROCESS_PROGRESS: "processing", + DID_COMPLETE_ITEM_PROCESSING: "processing-complete", + DID_THROW_ITEM_PROCESSING_ERROR: "processing-error", + DID_THROW_ITEM_PROCESSING_REVERT_ERROR: "processing-revert-error", + DID_ABORT_ITEM_PROCESSING: "cancelled", + DID_REVERT_ITEM_PROCESSING: "idle" +}; +var create$7 = ({root: root2, props}) => { + root2.ref.handleClick = (e2) => root2.dispatch("DID_ACTIVATE_ITEM", {id: props.id}); + root2.element.id = `filepond--item-${props.id}`; + root2.element.addEventListener("click", root2.ref.handleClick); + root2.ref.container = root2.appendChildView(root2.createChildView(fileWrapper, {id: props.id})); + root2.ref.panel = root2.appendChildView(root2.createChildView(panel, {name: "item-panel"})); + root2.ref.panel.height = null; + props.markedForRemoval = false; + if (!root2.query("GET_ALLOW_REORDER")) + return; + root2.element.dataset.dragState = "idle"; + const grab = (e2) => { + if (!e2.isPrimary) + return; + let removedActivateListener = false; + const origin = { + x: e2.pageX, + y: e2.pageY + }; + props.dragOrigin = { + x: root2.translateX, + y: root2.translateY + }; + props.dragCenter = { + x: e2.offsetX, + y: e2.offsetY + }; + const dragState = createDragHelper(root2.query("GET_ACTIVE_ITEMS")); + root2.dispatch("DID_GRAB_ITEM", {id: props.id, dragState}); + const drag = (e3) => { + if (!e3.isPrimary) + return; + e3.stopPropagation(); + e3.preventDefault(); + props.dragOffset = { + x: e3.pageX - origin.x, + y: e3.pageY - origin.y + }; + const dist = props.dragOffset.x * props.dragOffset.x + props.dragOffset.y * props.dragOffset.y; + if (dist > 16 && !removedActivateListener) { + removedActivateListener = true; + root2.element.removeEventListener("click", root2.ref.handleClick); + } + root2.dispatch("DID_DRAG_ITEM", {id: props.id, dragState}); + }; + const drop4 = (e3) => { + if (!e3.isPrimary) + return; + document.removeEventListener("pointermove", drag); + document.removeEventListener("pointerup", drop4); + props.dragOffset = { + x: e3.pageX - origin.x, + y: e3.pageY - origin.y + }; + root2.dispatch("DID_DROP_ITEM", {id: props.id, dragState}); + if (removedActivateListener) { + setTimeout(() => root2.element.addEventListener("click", root2.ref.handleClick), 0); + } + }; + document.addEventListener("pointermove", drag); + document.addEventListener("pointerup", drop4); + }; + root2.element.addEventListener("pointerdown", grab); +}; +var route$1 = createRoute({ + DID_UPDATE_PANEL_HEIGHT: ({root: root2, action}) => { + root2.height = action.height; + } +}); +var write$4 = createRoute({ + DID_GRAB_ITEM: ({root: root2, props}) => { + props.dragOrigin = { + x: root2.translateX, + y: root2.translateY + }; + }, + DID_DRAG_ITEM: ({root: root2}) => { + root2.element.dataset.dragState = "drag"; + }, + DID_DROP_ITEM: ({root: root2, props}) => { + props.dragOffset = null; + props.dragOrigin = null; + root2.element.dataset.dragState = "drop"; + } +}, ({root: root2, actions: actions2, props, shouldOptimize}) => { + if (root2.element.dataset.dragState === "drop") { + if (root2.scaleX <= 1) { + root2.element.dataset.dragState = "idle"; + } + } + let action = actions2.concat().filter((action2) => /^DID_/.test(action2.type)).reverse().find((action2) => StateMap[action2.type]); + if (action && action.type !== props.currentState) { + props.currentState = action.type; + root2.element.dataset.filepondItemState = StateMap[props.currentState] || ""; + } + const aspectRatio = root2.query("GET_ITEM_PANEL_ASPECT_RATIO") || root2.query("GET_PANEL_ASPECT_RATIO"); + if (!aspectRatio) { + route$1({root: root2, actions: actions2, props}); + if (!root2.height && root2.ref.container.rect.element.height > 0) { + root2.height = root2.ref.container.rect.element.height; + } + } else if (!shouldOptimize) { + root2.height = root2.rect.element.width * aspectRatio; + } + if (shouldOptimize) { + root2.ref.panel.height = null; + } + root2.ref.panel.height = root2.height; +}); +var item = createView({ + create: create$7, + write: write$4, + destroy: ({root: root2, props}) => { + root2.element.removeEventListener("click", root2.ref.handleClick); + root2.dispatch("RELEASE_ITEM", {query: props.id}); + }, + tag: "li", + name: "item", + mixins: { + apis: [ + "id", + "interactionMethod", + "markedForRemoval", + "spawnDate", + "dragCenter", + "dragOrigin", + "dragOffset" + ], + styles: ["translateX", "translateY", "scaleX", "scaleY", "opacity", "height"], + animations: { + scaleX: ITEM_SCALE_SPRING, + scaleY: ITEM_SCALE_SPRING, + translateX: ITEM_TRANSLATE_SPRING, + translateY: ITEM_TRANSLATE_SPRING, + opacity: {type: "tween", duration: 150} + } + } +}); +var getItemsPerRow = (horizontalSpace, itemWidth) => { + return Math.max(1, Math.floor((horizontalSpace + 1) / itemWidth)); +}; +var getItemIndexByPosition = (view, children, positionInView) => { + if (!positionInView) + return; + const horizontalSpace = view.rect.element.width; + const l = children.length; + let last = null; + if (l === 0 || positionInView.top < children[0].rect.element.top) + return -1; + const item2 = children[0]; + const itemRect = item2.rect.element; + const itemHorizontalMargin = itemRect.marginLeft + itemRect.marginRight; + const itemWidth = itemRect.width + itemHorizontalMargin; + const itemsPerRow = getItemsPerRow(horizontalSpace, itemWidth); + if (itemsPerRow === 1) { + for (let index2 = 0; index2 < l; index2++) { + const child = children[index2]; + const childMid = child.rect.outer.top + child.rect.element.height * 0.5; + if (positionInView.top < childMid) { + return index2; + } + } + return l; + } + const itemVerticalMargin = itemRect.marginTop + itemRect.marginBottom; + const itemHeight = itemRect.height + itemVerticalMargin; + for (let index2 = 0; index2 < l; index2++) { + const indexX = index2 % itemsPerRow; + const indexY = Math.floor(index2 / itemsPerRow); + const offsetX = indexX * itemWidth; + const offsetY = indexY * itemHeight; + const itemTop = offsetY - itemRect.marginTop; + const itemRight = offsetX + itemWidth; + const itemBottom = offsetY + itemHeight + itemRect.marginBottom; + if (positionInView.top < itemBottom && positionInView.top > itemTop) { + if (positionInView.left < itemRight) { + return index2; + } else if (index2 !== l - 1) { + last = index2; + } else { + last = null; + } + } + } + if (last !== null) { + return last; + } + return l; +}; +var dropAreaDimensions = { + height: 0, + width: 0, + get getHeight() { + return this.height; + }, + set setHeight(val) { + if (this.height === 0 || val === 0) + this.height = val; + }, + get getWidth() { + return this.width; + }, + set setWidth(val) { + if (this.width === 0 || val === 0) + this.width = val; + }, + setDimensions: function(height, width) { + if (this.height === 0 || height === 0) + this.height = height; + if (this.width === 0 || width === 0) + this.width = width; + } +}; +var create$8 = ({root: root2}) => { + attr(root2.element, "role", "list"); + root2.ref.lastItemSpanwDate = Date.now(); +}; +var addItemView = ({root: root2, action}) => { + const {id, index: index2, interactionMethod} = action; + root2.ref.addIndex = index2; + const now = Date.now(); + let spawnDate = now; + let opacity = 1; + if (interactionMethod !== InteractionMethod.NONE) { + opacity = 0; + const cooldown = root2.query("GET_ITEM_INSERT_INTERVAL"); + const dist = now - root2.ref.lastItemSpanwDate; + spawnDate = dist < cooldown ? now + (cooldown - dist) : now; + } + root2.ref.lastItemSpanwDate = spawnDate; + root2.appendChildView(root2.createChildView(item, { + spawnDate, + id, + opacity, + interactionMethod + }), index2); +}; +var moveItem = (item2, x, y, vx = 0, vy = 1) => { + if (item2.dragOffset) { + item2.translateX = null; + item2.translateY = null; + item2.translateX = item2.dragOrigin.x + item2.dragOffset.x; + item2.translateY = item2.dragOrigin.y + item2.dragOffset.y; + item2.scaleX = 1.025; + item2.scaleY = 1.025; + } else { + item2.translateX = x; + item2.translateY = y; + if (Date.now() > item2.spawnDate) { + if (item2.opacity === 0) { + introItemView(item2, x, y, vx, vy); + } + item2.scaleX = 1; + item2.scaleY = 1; + item2.opacity = 1; + } + } +}; +var introItemView = (item2, x, y, vx, vy) => { + if (item2.interactionMethod === InteractionMethod.NONE) { + item2.translateX = null; + item2.translateX = x; + item2.translateY = null; + item2.translateY = y; + } else if (item2.interactionMethod === InteractionMethod.DROP) { + item2.translateX = null; + item2.translateX = x - vx * 20; + item2.translateY = null; + item2.translateY = y - vy * 10; + item2.scaleX = 0.8; + item2.scaleY = 0.8; + } else if (item2.interactionMethod === InteractionMethod.BROWSE) { + item2.translateY = null; + item2.translateY = y - 30; + } else if (item2.interactionMethod === InteractionMethod.API) { + item2.translateX = null; + item2.translateX = x - 30; + item2.translateY = null; + } +}; +var removeItemView = ({root: root2, action}) => { + const {id} = action; + const view = root2.childViews.find((child) => child.id === id); + if (!view) { + return; + } + view.scaleX = 0.9; + view.scaleY = 0.9; + view.opacity = 0; + view.markedForRemoval = true; +}; +var getItemHeight = (child) => child.rect.element.height + child.rect.element.marginBottom * 0.5 + child.rect.element.marginTop * 0.5; +var getItemWidth = (child) => child.rect.element.width + child.rect.element.marginLeft * 0.5 + child.rect.element.marginRight * 0.5; +var dragItem = ({root: root2, action}) => { + const {id, dragState} = action; + const item2 = root2.query("GET_ITEM", {id}); + const view = root2.childViews.find((child) => child.id === id); + const numItems = root2.childViews.length; + const oldIndex2 = dragState.getItemIndex(item2); + if (!view) + return; + const dragPosition = { + x: view.dragOrigin.x + view.dragOffset.x + view.dragCenter.x, + y: view.dragOrigin.y + view.dragOffset.y + view.dragCenter.y + }; + const dragHeight = getItemHeight(view); + const dragWidth = getItemWidth(view); + let cols = Math.floor(root2.rect.outer.width / dragWidth); + if (cols > numItems) + cols = numItems; + const rows = Math.floor(numItems / cols + 1); + dropAreaDimensions.setHeight = dragHeight * rows; + dropAreaDimensions.setWidth = dragWidth * cols; + var location2 = { + y: Math.floor(dragPosition.y / dragHeight), + x: Math.floor(dragPosition.x / dragWidth), + getGridIndex: function getGridIndex() { + if (dragPosition.y > dropAreaDimensions.getHeight || dragPosition.y < 0 || dragPosition.x > dropAreaDimensions.getWidth || dragPosition.x < 0) + return oldIndex2; + return this.y * cols + this.x; + }, + getColIndex: function getColIndex() { + const items = root2.query("GET_ACTIVE_ITEMS"); + const visibleChildren = root2.childViews.filter((child) => child.rect.element.height); + const children = items.map((item3) => visibleChildren.find((childView) => childView.id === item3.id)); + const currentIndex2 = children.findIndex((child) => child === view); + const dragHeight2 = getItemHeight(view); + const l = children.length; + let idx = l; + let childHeight = 0; + let childBottom = 0; + let childTop = 0; + for (let i = 0; i < l; i++) { + childHeight = getItemHeight(children[i]); + childTop = childBottom; + childBottom = childTop + childHeight; + if (dragPosition.y < childBottom) { + if (currentIndex2 > i) { + if (dragPosition.y < childTop + dragHeight2) { + idx = i; + break; + } + continue; + } + idx = i; + break; + } + } + return idx; + } + }; + const index2 = cols > 1 ? location2.getGridIndex() : location2.getColIndex(); + root2.dispatch("MOVE_ITEM", {query: view, index: index2}); + const currentIndex = dragState.getIndex(); + if (currentIndex === void 0 || currentIndex !== index2) { + dragState.setIndex(index2); + if (currentIndex === void 0) + return; + root2.dispatch("DID_REORDER_ITEMS", { + items: root2.query("GET_ACTIVE_ITEMS"), + origin: oldIndex2, + target: index2 + }); + } +}; +var route$2 = createRoute({ + DID_ADD_ITEM: addItemView, + DID_REMOVE_ITEM: removeItemView, + DID_DRAG_ITEM: dragItem +}); +var write$5 = ({root: root2, props, actions: actions2, shouldOptimize}) => { + route$2({root: root2, props, actions: actions2}); + const {dragCoordinates} = props; + const horizontalSpace = root2.rect.element.width; + const visibleChildren = root2.childViews.filter((child) => child.rect.element.height); + const children = root2.query("GET_ACTIVE_ITEMS").map((item2) => visibleChildren.find((child) => child.id === item2.id)).filter((item2) => item2); + const dragIndex = dragCoordinates ? getItemIndexByPosition(root2, children, dragCoordinates) : null; + const addIndex = root2.ref.addIndex || null; + root2.ref.addIndex = null; + let dragIndexOffset = 0; + let removeIndexOffset = 0; + let addIndexOffset = 0; + if (children.length === 0) + return; + const childRect = children[0].rect.element; + const itemVerticalMargin = childRect.marginTop + childRect.marginBottom; + const itemHorizontalMargin = childRect.marginLeft + childRect.marginRight; + const itemWidth = childRect.width + itemHorizontalMargin; + const itemHeight = childRect.height + itemVerticalMargin; + const itemsPerRow = getItemsPerRow(horizontalSpace, itemWidth); + if (itemsPerRow === 1) { + let offsetY = 0; + let dragOffset = 0; + children.forEach((child, index2) => { + if (dragIndex) { + let dist = index2 - dragIndex; + if (dist === -2) { + dragOffset = -itemVerticalMargin * 0.25; + } else if (dist === -1) { + dragOffset = -itemVerticalMargin * 0.75; + } else if (dist === 0) { + dragOffset = itemVerticalMargin * 0.75; + } else if (dist === 1) { + dragOffset = itemVerticalMargin * 0.25; + } else { + dragOffset = 0; + } + } + if (shouldOptimize) { + child.translateX = null; + child.translateY = null; + } + if (!child.markedForRemoval) { + moveItem(child, 0, offsetY + dragOffset); + } + let itemHeight2 = child.rect.element.height + itemVerticalMargin; + let visualHeight = itemHeight2 * (child.markedForRemoval ? child.opacity : 1); + offsetY += visualHeight; + }); + } else { + let prevX = 0; + let prevY = 0; + children.forEach((child, index2) => { + if (index2 === dragIndex) { + dragIndexOffset = 1; + } + if (index2 === addIndex) { + addIndexOffset += 1; + } + if (child.markedForRemoval && child.opacity < 0.5) { + removeIndexOffset -= 1; + } + const visualIndex = index2 + addIndexOffset + dragIndexOffset + removeIndexOffset; + const indexX = visualIndex % itemsPerRow; + const indexY = Math.floor(visualIndex / itemsPerRow); + const offsetX = indexX * itemWidth; + const offsetY = indexY * itemHeight; + const vectorX = Math.sign(offsetX - prevX); + const vectorY = Math.sign(offsetY - prevY); + prevX = offsetX; + prevY = offsetY; + if (child.markedForRemoval) + return; + if (shouldOptimize) { + child.translateX = null; + child.translateY = null; + } + moveItem(child, offsetX, offsetY, vectorX, vectorY); + }); + } +}; +var filterSetItemActions = (child, actions2) => actions2.filter((action) => { + if (action.data && action.data.id) { + return child.id === action.data.id; + } + return true; +}); +var list = createView({ + create: create$8, + write: write$5, + tag: "ul", + name: "list", + didWriteView: ({root: root2}) => { + root2.childViews.filter((view) => view.markedForRemoval && view.opacity === 0 && view.resting).forEach((view) => { + view._destroy(); + root2.removeChildView(view); + }); + }, + filterFrameActionsForChild: filterSetItemActions, + mixins: { + apis: ["dragCoordinates"] + } +}); +var create$9 = ({root: root2, props}) => { + root2.ref.list = root2.appendChildView(root2.createChildView(list)); + props.dragCoordinates = null; + props.overflowing = false; +}; +var storeDragCoordinates = ({root: root2, props, action}) => { + if (!root2.query("GET_ITEM_INSERT_LOCATION_FREEDOM")) + return; + props.dragCoordinates = { + left: action.position.scopeLeft - root2.ref.list.rect.element.left, + top: action.position.scopeTop - (root2.rect.outer.top + root2.rect.element.marginTop + root2.rect.element.scrollTop) + }; +}; +var clearDragCoordinates = ({props}) => { + props.dragCoordinates = null; +}; +var route$3 = createRoute({ + DID_DRAG: storeDragCoordinates, + DID_END_DRAG: clearDragCoordinates +}); +var write$6 = ({root: root2, props, actions: actions2}) => { + route$3({root: root2, props, actions: actions2}); + root2.ref.list.dragCoordinates = props.dragCoordinates; + if (props.overflowing && !props.overflow) { + props.overflowing = false; + root2.element.dataset.state = ""; + root2.height = null; + } + if (props.overflow) { + const newHeight = Math.round(props.overflow); + if (newHeight !== root2.height) { + props.overflowing = true; + root2.element.dataset.state = "overflow"; + root2.height = newHeight; + } + } +}; +var listScroller = createView({ + create: create$9, + write: write$6, + name: "list-scroller", + mixins: { + apis: ["overflow", "dragCoordinates"], + styles: ["height", "translateY"], + animations: { + translateY: "spring" + } + } +}); +var attrToggle = (element, name2, state2, enabledValue = "") => { + if (state2) { + attr(element, name2, enabledValue); + } else { + element.removeAttribute(name2); + } +}; +var resetFileInput = (input) => { + if (!input || input.value === "") { + return; + } + try { + input.value = ""; + } catch (err) { + } + if (input.value) { + const form = createElement$1("form"); + const parentNode = input.parentNode; + const ref = input.nextSibling; + form.appendChild(input); + form.reset(); + if (ref) { + parentNode.insertBefore(input, ref); + } else { + parentNode.appendChild(input); + } + } +}; +var create$a = ({root: root2, props}) => { + root2.element.id = `filepond--browser-${props.id}`; + attr(root2.element, "name", root2.query("GET_NAME")); + attr(root2.element, "aria-controls", `filepond--assistant-${props.id}`); + attr(root2.element, "aria-labelledby", `filepond--drop-label-${props.id}`); + setAcceptedFileTypes({root: root2, action: {value: root2.query("GET_ACCEPTED_FILE_TYPES")}}); + toggleAllowMultiple({root: root2, action: {value: root2.query("GET_ALLOW_MULTIPLE")}}); + toggleDirectoryFilter({root: root2, action: {value: root2.query("GET_ALLOW_DIRECTORIES_ONLY")}}); + toggleDisabled({root: root2}); + toggleRequired({root: root2, action: {value: root2.query("GET_REQUIRED")}}); + setCaptureMethod({root: root2, action: {value: root2.query("GET_CAPTURE_METHOD")}}); + root2.ref.handleChange = (e2) => { + if (!root2.element.value) { + return; + } + const files = Array.from(root2.element.files).map((file2) => { + file2._relativePath = file2.webkitRelativePath; + return file2; + }); + setTimeout(() => { + props.onload(files); + resetFileInput(root2.element); + }, 250); + }; + root2.element.addEventListener("change", root2.ref.handleChange); +}; +var setAcceptedFileTypes = ({root: root2, action}) => { + if (!root2.query("GET_ALLOW_SYNC_ACCEPT_ATTRIBUTE")) + return; + attrToggle(root2.element, "accept", !!action.value, action.value ? action.value.join(",") : ""); +}; +var toggleAllowMultiple = ({root: root2, action}) => { + attrToggle(root2.element, "multiple", action.value); +}; +var toggleDirectoryFilter = ({root: root2, action}) => { + attrToggle(root2.element, "webkitdirectory", action.value); +}; +var toggleDisabled = ({root: root2}) => { + const isDisabled = root2.query("GET_DISABLED"); + const doesAllowBrowse = root2.query("GET_ALLOW_BROWSE"); + const disableField = isDisabled || !doesAllowBrowse; + attrToggle(root2.element, "disabled", disableField); +}; +var toggleRequired = ({root: root2, action}) => { + if (!action.value) { + attrToggle(root2.element, "required", false); + } else if (root2.query("GET_TOTAL_ITEMS") === 0) { + attrToggle(root2.element, "required", true); + } +}; +var setCaptureMethod = ({root: root2, action}) => { + attrToggle(root2.element, "capture", !!action.value, action.value === true ? "" : action.value); +}; +var updateRequiredStatus = ({root: root2}) => { + const {element} = root2; + if (root2.query("GET_TOTAL_ITEMS") > 0) { + attrToggle(element, "required", false); + attrToggle(element, "name", false); + } else { + attrToggle(element, "name", true, root2.query("GET_NAME")); + const shouldCheckValidity = root2.query("GET_CHECK_VALIDITY"); + if (shouldCheckValidity) { + element.setCustomValidity(""); + } + if (root2.query("GET_REQUIRED")) { + attrToggle(element, "required", true); + } + } +}; +var updateFieldValidityStatus = ({root: root2}) => { + const shouldCheckValidity = root2.query("GET_CHECK_VALIDITY"); + if (!shouldCheckValidity) + return; + root2.element.setCustomValidity(root2.query("GET_LABEL_INVALID_FIELD")); +}; +var browser = createView({ + tag: "input", + name: "browser", + ignoreRect: true, + ignoreRectUpdate: true, + attributes: { + type: "file" + }, + create: create$a, + destroy: ({root: root2}) => { + root2.element.removeEventListener("change", root2.ref.handleChange); + }, + write: createRoute({ + DID_LOAD_ITEM: updateRequiredStatus, + DID_REMOVE_ITEM: updateRequiredStatus, + DID_THROW_ITEM_INVALID: updateFieldValidityStatus, + DID_SET_DISABLED: toggleDisabled, + DID_SET_ALLOW_BROWSE: toggleDisabled, + DID_SET_ALLOW_DIRECTORIES_ONLY: toggleDirectoryFilter, + DID_SET_ALLOW_MULTIPLE: toggleAllowMultiple, + DID_SET_ACCEPTED_FILE_TYPES: setAcceptedFileTypes, + DID_SET_CAPTURE_METHOD: setCaptureMethod, + DID_SET_REQUIRED: toggleRequired + }) +}); +var Key = { + ENTER: 13, + SPACE: 32 +}; +var create$b = ({root: root2, props}) => { + const label = createElement$1("label"); + attr(label, "for", `filepond--browser-${props.id}`); + attr(label, "id", `filepond--drop-label-${props.id}`); + attr(label, "aria-hidden", "true"); + root2.ref.handleKeyDown = (e2) => { + const isActivationKey = e2.keyCode === Key.ENTER || e2.keyCode === Key.SPACE; + if (!isActivationKey) + return; + e2.preventDefault(); + root2.ref.label.click(); + }; + root2.ref.handleClick = (e2) => { + const isLabelClick = e2.target === label || label.contains(e2.target); + if (isLabelClick) + return; + root2.ref.label.click(); + }; + label.addEventListener("keydown", root2.ref.handleKeyDown); + root2.element.addEventListener("click", root2.ref.handleClick); + updateLabelValue(label, props.caption); + root2.appendChild(label); + root2.ref.label = label; +}; +var updateLabelValue = (label, value) => { + label.innerHTML = value; + const clickable = label.querySelector(".filepond--label-action"); + if (clickable) { + attr(clickable, "tabindex", "0"); + } + return value; +}; +var dropLabel = createView({ + name: "drop-label", + ignoreRect: true, + create: create$b, + destroy: ({root: root2}) => { + root2.ref.label.addEventListener("keydown", root2.ref.handleKeyDown); + root2.element.removeEventListener("click", root2.ref.handleClick); + }, + write: createRoute({ + DID_SET_LABEL_IDLE: ({root: root2, action}) => { + updateLabelValue(root2.ref.label, action.value); + } + }), + mixins: { + styles: ["opacity", "translateX", "translateY"], + animations: { + opacity: {type: "tween", duration: 150}, + translateX: "spring", + translateY: "spring" + } + } +}); +var blob = createView({ + name: "drip-blob", + ignoreRect: true, + mixins: { + styles: ["translateX", "translateY", "scaleX", "scaleY", "opacity"], + animations: { + scaleX: "spring", + scaleY: "spring", + translateX: "spring", + translateY: "spring", + opacity: {type: "tween", duration: 250} + } + } +}); +var addBlob = ({root: root2}) => { + const centerX = root2.rect.element.width * 0.5; + const centerY = root2.rect.element.height * 0.5; + root2.ref.blob = root2.appendChildView(root2.createChildView(blob, { + opacity: 0, + scaleX: 2.5, + scaleY: 2.5, + translateX: centerX, + translateY: centerY + })); +}; +var moveBlob = ({root: root2, action}) => { + if (!root2.ref.blob) { + addBlob({root: root2}); + return; + } + root2.ref.blob.translateX = action.position.scopeLeft; + root2.ref.blob.translateY = action.position.scopeTop; + root2.ref.blob.scaleX = 1; + root2.ref.blob.scaleY = 1; + root2.ref.blob.opacity = 1; +}; +var hideBlob = ({root: root2}) => { + if (!root2.ref.blob) { + return; + } + root2.ref.blob.opacity = 0; +}; +var explodeBlob = ({root: root2}) => { + if (!root2.ref.blob) { + return; + } + root2.ref.blob.scaleX = 2.5; + root2.ref.blob.scaleY = 2.5; + root2.ref.blob.opacity = 0; +}; +var write$7 = ({root: root2, props, actions: actions2}) => { + route$4({root: root2, props, actions: actions2}); + const {blob: blob2} = root2.ref; + if (actions2.length === 0 && blob2 && blob2.opacity === 0) { + root2.removeChildView(blob2); + root2.ref.blob = null; + } +}; +var route$4 = createRoute({ + DID_DRAG: moveBlob, + DID_DROP: explodeBlob, + DID_END_DRAG: hideBlob +}); +var drip = createView({ + ignoreRect: true, + ignoreRectUpdate: true, + name: "drip", + write: write$7 +}); +var setInputFiles = (element, files) => { + try { + const dataTransfer = new DataTransfer(); + files.forEach((file2) => { + if (file2 instanceof File) { + dataTransfer.items.add(file2); + } else { + dataTransfer.items.add(new File([file2], file2.name, { + type: file2.type + })); + } + }); + element.files = dataTransfer.files; + } catch (err) { + return false; + } + return true; +}; +var create$c = ({root: root2}) => root2.ref.fields = {}; +var getField = (root2, id) => root2.ref.fields[id]; +var syncFieldPositionsWithItems = (root2) => { + root2.query("GET_ACTIVE_ITEMS").forEach((item2) => { + if (!root2.ref.fields[item2.id]) + return; + root2.element.appendChild(root2.ref.fields[item2.id]); + }); +}; +var didReorderItems = ({root: root2}) => syncFieldPositionsWithItems(root2); +var didAddItem = ({root: root2, action}) => { + const fileItem = root2.query("GET_ITEM", action.id); + const isLocalFile = fileItem.origin === FileOrigin.LOCAL; + const shouldUseFileInput = !isLocalFile && root2.query("SHOULD_UPDATE_FILE_INPUT"); + const dataContainer = createElement$1("input"); + dataContainer.type = shouldUseFileInput ? "file" : "hidden"; + dataContainer.name = root2.query("GET_NAME"); + dataContainer.disabled = root2.query("GET_DISABLED"); + root2.ref.fields[action.id] = dataContainer; + syncFieldPositionsWithItems(root2); +}; +var didLoadItem$1 = ({root: root2, action}) => { + const field = getField(root2, action.id); + if (!field) + return; + if (action.serverFileReference !== null) + field.value = action.serverFileReference; + if (!root2.query("SHOULD_UPDATE_FILE_INPUT")) + return; + const fileItem = root2.query("GET_ITEM", action.id); + setInputFiles(field, [fileItem.file]); +}; +var didPrepareOutput = ({root: root2, action}) => { + if (!root2.query("SHOULD_UPDATE_FILE_INPUT")) + return; + setTimeout(() => { + const field = getField(root2, action.id); + if (!field) + return; + setInputFiles(field, [action.file]); + }, 0); +}; +var didSetDisabled = ({root: root2}) => { + root2.element.disabled = root2.query("GET_DISABLED"); +}; +var didRemoveItem = ({root: root2, action}) => { + const field = getField(root2, action.id); + if (!field) + return; + if (field.parentNode) + field.parentNode.removeChild(field); + delete root2.ref.fields[action.id]; +}; +var didDefineValue = ({root: root2, action}) => { + const field = getField(root2, action.id); + if (!field) + return; + if (action.value === null) { + field.removeAttribute("value"); + } else { + field.value = action.value; + } + syncFieldPositionsWithItems(root2); +}; +var write$8 = createRoute({ + DID_SET_DISABLED: didSetDisabled, + DID_ADD_ITEM: didAddItem, + DID_LOAD_ITEM: didLoadItem$1, + DID_REMOVE_ITEM: didRemoveItem, + DID_DEFINE_VALUE: didDefineValue, + DID_PREPARE_OUTPUT: didPrepareOutput, + DID_REORDER_ITEMS: didReorderItems, + DID_SORT_ITEMS: didReorderItems +}); +var data2 = createView({ + tag: "fieldset", + name: "data", + create: create$c, + write: write$8, + ignoreRect: true +}); +var getRootNode = (element) => "getRootNode" in element ? element.getRootNode() : document; +var images = ["jpg", "jpeg", "png", "gif", "bmp", "webp", "svg", "tiff"]; +var text$1 = ["css", "csv", "html", "txt"]; +var map = { + zip: "zip|compressed", + epub: "application/epub+zip" +}; +var guesstimateMimeType = (extension = "") => { + extension = extension.toLowerCase(); + if (images.includes(extension)) { + return "image/" + (extension === "jpg" ? "jpeg" : extension === "svg" ? "svg+xml" : extension); + } + if (text$1.includes(extension)) { + return "text/" + extension; + } + return map[extension] || ""; +}; +var requestDataTransferItems = (dataTransfer) => new Promise((resolve, reject) => { + const links = getLinks(dataTransfer); + if (links.length && !hasFiles(dataTransfer)) { + return resolve(links); + } + getFiles(dataTransfer).then(resolve); +}); +var hasFiles = (dataTransfer) => { + if (dataTransfer.files) + return dataTransfer.files.length > 0; + return false; +}; +var getFiles = (dataTransfer) => new Promise((resolve, reject) => { + const promisedFiles = (dataTransfer.items ? Array.from(dataTransfer.items) : []).filter((item2) => isFileSystemItem(item2)).map((item2) => getFilesFromItem(item2)); + if (!promisedFiles.length) { + resolve(dataTransfer.files ? Array.from(dataTransfer.files) : []); + return; + } + Promise.all(promisedFiles).then((returnedFileGroups) => { + const files = []; + returnedFileGroups.forEach((group) => { + files.push.apply(files, group); + }); + resolve(files.filter((file2) => file2).map((file2) => { + if (!file2._relativePath) + file2._relativePath = file2.webkitRelativePath; + return file2; + })); + }).catch(console.error); +}); +var isFileSystemItem = (item2) => { + if (isEntry(item2)) { + const entry = getAsEntry(item2); + if (entry) { + return entry.isFile || entry.isDirectory; + } + } + return item2.kind === "file"; +}; +var getFilesFromItem = (item2) => new Promise((resolve, reject) => { + if (isDirectoryEntry(item2)) { + getFilesInDirectory(getAsEntry(item2)).then(resolve).catch(reject); + return; + } + resolve([item2.getAsFile()]); +}); +var getFilesInDirectory = (entry) => new Promise((resolve, reject) => { + const files = []; + let dirCounter = 0; + let fileCounter = 0; + const resolveIfDone = () => { + if (fileCounter === 0 && dirCounter === 0) { + resolve(files); + } + }; + const readEntries = (dirEntry) => { + dirCounter++; + const directoryReader = dirEntry.createReader(); + const readBatch = () => { + directoryReader.readEntries((entries) => { + if (entries.length === 0) { + dirCounter--; + resolveIfDone(); + return; + } + entries.forEach((entry2) => { + if (entry2.isDirectory) { + readEntries(entry2); + } else { + fileCounter++; + entry2.file((file2) => { + const correctedFile = correctMissingFileType(file2); + if (entry2.fullPath) + correctedFile._relativePath = entry2.fullPath; + files.push(correctedFile); + fileCounter--; + resolveIfDone(); + }); + } + }); + readBatch(); + }, reject); + }; + readBatch(); + }; + readEntries(entry); +}); +var correctMissingFileType = (file2) => { + if (file2.type.length) + return file2; + const date = file2.lastModifiedDate; + const name2 = file2.name; + const type = guesstimateMimeType(getExtensionFromFilename(file2.name)); + if (!type.length) + return file2; + file2 = file2.slice(0, file2.size, type); + file2.name = name2; + file2.lastModifiedDate = date; + return file2; +}; +var isDirectoryEntry = (item2) => isEntry(item2) && (getAsEntry(item2) || {}).isDirectory; +var isEntry = (item2) => "webkitGetAsEntry" in item2; +var getAsEntry = (item2) => item2.webkitGetAsEntry(); +var getLinks = (dataTransfer) => { + let links = []; + try { + links = getLinksFromTransferMetaData(dataTransfer); + if (links.length) { + return links; + } + links = getLinksFromTransferURLData(dataTransfer); + } catch (e2) { + } + return links; +}; +var getLinksFromTransferURLData = (dataTransfer) => { + let data3 = dataTransfer.getData("url"); + if (typeof data3 === "string" && data3.length) { + return [data3]; + } + return []; +}; +var getLinksFromTransferMetaData = (dataTransfer) => { + let data3 = dataTransfer.getData("text/html"); + if (typeof data3 === "string" && data3.length) { + const matches2 = data3.match(/src\s*=\s*"(.+?)"/); + if (matches2) { + return [matches2[1]]; + } + } + return []; +}; +var dragNDropObservers = []; +var eventPosition = (e2) => ({ + pageLeft: e2.pageX, + pageTop: e2.pageY, + scopeLeft: e2.offsetX || e2.layerX, + scopeTop: e2.offsetY || e2.layerY +}); +var createDragNDropClient = (element, scopeToObserve, filterElement) => { + const observer = getDragNDropObserver(scopeToObserve); + const client = { + element, + filterElement, + state: null, + ondrop: () => { + }, + onenter: () => { + }, + ondrag: () => { + }, + onexit: () => { + }, + onload: () => { + }, + allowdrop: () => { + } + }; + client.destroy = observer.addListener(client); + return client; +}; +var getDragNDropObserver = (element) => { + const observer = dragNDropObservers.find((item2) => item2.element === element); + if (observer) { + return observer; + } + const newObserver = createDragNDropObserver(element); + dragNDropObservers.push(newObserver); + return newObserver; +}; +var createDragNDropObserver = (element) => { + const clients = []; + const routes = { + dragenter, + dragover, + dragleave, + drop + }; + const handlers = {}; + forin(routes, (event, createHandler) => { + handlers[event] = createHandler(element, clients); + element.addEventListener(event, handlers[event], false); + }); + const observer = { + element, + addListener: (client) => { + clients.push(client); + return () => { + clients.splice(clients.indexOf(client), 1); + if (clients.length === 0) { + dragNDropObservers.splice(dragNDropObservers.indexOf(observer), 1); + forin(routes, (event) => { + element.removeEventListener(event, handlers[event], false); + }); + } + }; + } + }; + return observer; +}; +var elementFromPoint = (root2, point) => { + if (!("elementFromPoint" in root2)) { + root2 = document; + } + return root2.elementFromPoint(point.x, point.y); +}; +var isEventTarget = (e2, target) => { + const root2 = getRootNode(target); + const elementAtPosition = elementFromPoint(root2, { + x: e2.pageX - window.pageXOffset, + y: e2.pageY - window.pageYOffset + }); + return elementAtPosition === target || target.contains(elementAtPosition); +}; +var initialTarget = null; +var setDropEffect = (dataTransfer, effect) => { + try { + dataTransfer.dropEffect = effect; + } catch (e2) { + } +}; +var dragenter = (root2, clients) => (e2) => { + e2.preventDefault(); + initialTarget = e2.target; + clients.forEach((client) => { + const {element, onenter} = client; + if (isEventTarget(e2, element)) { + client.state = "enter"; + onenter(eventPosition(e2)); + } + }); +}; +var dragover = (root2, clients) => (e2) => { + e2.preventDefault(); + const dataTransfer = e2.dataTransfer; + requestDataTransferItems(dataTransfer).then((items) => { + let overDropTarget = false; + clients.some((client) => { + const {filterElement, element, onenter, onexit, ondrag, allowdrop} = client; + setDropEffect(dataTransfer, "copy"); + const allowsTransfer = allowdrop(items); + if (!allowsTransfer) { + setDropEffect(dataTransfer, "none"); + return; + } + if (isEventTarget(e2, element)) { + overDropTarget = true; + if (client.state === null) { + client.state = "enter"; + onenter(eventPosition(e2)); + return; + } + client.state = "over"; + if (filterElement && !allowsTransfer) { + setDropEffect(dataTransfer, "none"); + return; + } + ondrag(eventPosition(e2)); + } else { + if (filterElement && !overDropTarget) { + setDropEffect(dataTransfer, "none"); + } + if (client.state) { + client.state = null; + onexit(eventPosition(e2)); + } + } + }); + }); +}; +var drop = (root2, clients) => (e2) => { + e2.preventDefault(); + const dataTransfer = e2.dataTransfer; + requestDataTransferItems(dataTransfer).then((items) => { + clients.forEach((client) => { + const {filterElement, element, ondrop, onexit, allowdrop} = client; + client.state = null; + if (filterElement && !isEventTarget(e2, element)) + return; + if (!allowdrop(items)) + return onexit(eventPosition(e2)); + ondrop(eventPosition(e2), items); + }); + }); +}; +var dragleave = (root2, clients) => (e2) => { + if (initialTarget !== e2.target) { + return; + } + clients.forEach((client) => { + const {onexit} = client; + client.state = null; + onexit(eventPosition(e2)); + }); +}; +var createHopper = (scope, validateItems, options) => { + scope.classList.add("filepond--hopper"); + const {catchesDropsOnPage, requiresDropOnElement, filterItems = (items) => items} = options; + const client = createDragNDropClient(scope, catchesDropsOnPage ? document.documentElement : scope, requiresDropOnElement); + let lastState = ""; + let currentState = ""; + client.allowdrop = (items) => { + return validateItems(filterItems(items)); + }; + client.ondrop = (position, items) => { + const filteredItems = filterItems(items); + if (!validateItems(filteredItems)) { + api.ondragend(position); + return; + } + currentState = "drag-drop"; + api.onload(filteredItems, position); + }; + client.ondrag = (position) => { + api.ondrag(position); + }; + client.onenter = (position) => { + currentState = "drag-over"; + api.ondragstart(position); + }; + client.onexit = (position) => { + currentState = "drag-exit"; + api.ondragend(position); + }; + const api = { + updateHopperState: () => { + if (lastState !== currentState) { + scope.dataset.hopperState = currentState; + lastState = currentState; + } + }, + onload: () => { + }, + ondragstart: () => { + }, + ondrag: () => { + }, + ondragend: () => { + }, + destroy: () => { + client.destroy(); + } + }; + return api; +}; +var listening = false; +var listeners$1 = []; +var handlePaste = (e2) => { + const activeEl = document.activeElement; + if (activeEl && /textarea|input/i.test(activeEl.nodeName)) { + let inScope = false; + let element = activeEl; + while (element !== document.body) { + if (element.classList.contains("filepond--root")) { + inScope = true; + break; + } + element = element.parentNode; + } + if (!inScope) + return; + } + requestDataTransferItems(e2.clipboardData).then((files) => { + if (!files.length) { + return; + } + listeners$1.forEach((listener) => listener(files)); + }); +}; +var listen = (cb) => { + if (listeners$1.includes(cb)) { + return; + } + listeners$1.push(cb); + if (listening) { + return; + } + listening = true; + document.addEventListener("paste", handlePaste); +}; +var unlisten = (listener) => { + arrayRemove(listeners$1, listeners$1.indexOf(listener)); + if (listeners$1.length === 0) { + document.removeEventListener("paste", handlePaste); + listening = false; + } +}; +var createPaster = () => { + const cb = (files) => { + api.onload(files); + }; + const api = { + destroy: () => { + unlisten(cb); + }, + onload: () => { + } + }; + listen(cb); + return api; +}; +var create$d = ({root: root2, props}) => { + root2.element.id = `filepond--assistant-${props.id}`; + attr(root2.element, "role", "status"); + attr(root2.element, "aria-live", "polite"); + attr(root2.element, "aria-relevant", "additions"); +}; +var addFilesNotificationTimeout = null; +var notificationClearTimeout = null; +var filenames = []; +var assist = (root2, message) => { + root2.element.textContent = message; +}; +var clear$1 = (root2) => { + root2.element.textContent = ""; +}; +var listModified = (root2, filename, label) => { + const total = root2.query("GET_TOTAL_ITEMS"); + assist(root2, `${label} ${filename}, ${total} ${total === 1 ? root2.query("GET_LABEL_FILE_COUNT_SINGULAR") : root2.query("GET_LABEL_FILE_COUNT_PLURAL")}`); + clearTimeout(notificationClearTimeout); + notificationClearTimeout = setTimeout(() => { + clear$1(root2); + }, 1500); +}; +var isUsingFilePond = (root2) => root2.element.parentNode.contains(document.activeElement); +var itemAdded = ({root: root2, action}) => { + if (!isUsingFilePond(root2)) { + return; + } + root2.element.textContent = ""; + const item2 = root2.query("GET_ITEM", action.id); + filenames.push(item2.filename); + clearTimeout(addFilesNotificationTimeout); + addFilesNotificationTimeout = setTimeout(() => { + listModified(root2, filenames.join(", "), root2.query("GET_LABEL_FILE_ADDED")); + filenames.length = 0; + }, 750); +}; +var itemRemoved = ({root: root2, action}) => { + if (!isUsingFilePond(root2)) { + return; + } + const item2 = action.item; + listModified(root2, item2.filename, root2.query("GET_LABEL_FILE_REMOVED")); +}; +var itemProcessed = ({root: root2, action}) => { + const item2 = root2.query("GET_ITEM", action.id); + const filename = item2.filename; + const label = root2.query("GET_LABEL_FILE_PROCESSING_COMPLETE"); + assist(root2, `${filename} ${label}`); +}; +var itemProcessedUndo = ({root: root2, action}) => { + const item2 = root2.query("GET_ITEM", action.id); + const filename = item2.filename; + const label = root2.query("GET_LABEL_FILE_PROCESSING_ABORTED"); + assist(root2, `${filename} ${label}`); +}; +var itemError = ({root: root2, action}) => { + const item2 = root2.query("GET_ITEM", action.id); + const filename = item2.filename; + assist(root2, `${action.status.main} ${filename} ${action.status.sub}`); +}; +var assistant = createView({ + create: create$d, + ignoreRect: true, + ignoreRectUpdate: true, + write: createRoute({ + DID_LOAD_ITEM: itemAdded, + DID_REMOVE_ITEM: itemRemoved, + DID_COMPLETE_ITEM_PROCESSING: itemProcessed, + DID_ABORT_ITEM_PROCESSING: itemProcessedUndo, + DID_REVERT_ITEM_PROCESSING: itemProcessedUndo, + DID_THROW_ITEM_REMOVE_ERROR: itemError, + DID_THROW_ITEM_LOAD_ERROR: itemError, + DID_THROW_ITEM_INVALID: itemError, + DID_THROW_ITEM_PROCESSING_ERROR: itemError + }), + tag: "span", + name: "assistant" +}); +var toCamels = (string, separator = "-") => string.replace(new RegExp(`${separator}.`, "g"), (sub) => sub.charAt(1).toUpperCase()); +var debounce = (func, interval = 16, immidiateOnly = true) => { + let last = Date.now(); + let timeout = null; + return (...args) => { + clearTimeout(timeout); + const dist = Date.now() - last; + const fn2 = () => { + last = Date.now(); + func(...args); + }; + if (dist < interval) { + if (!immidiateOnly) { + timeout = setTimeout(fn2, interval - dist); + } + } else { + fn2(); + } + }; +}; +var MAX_FILES_LIMIT = 1e6; +var prevent = (e2) => e2.preventDefault(); +var create$e = ({root: root2, props}) => { + const id = root2.query("GET_ID"); + if (id) { + root2.element.id = id; + } + const className = root2.query("GET_CLASS_NAME"); + if (className) { + className.split(" ").filter((name2) => name2.length).forEach((name2) => { + root2.element.classList.add(name2); + }); + } + root2.ref.label = root2.appendChildView(root2.createChildView(dropLabel, { + ...props, + translateY: null, + caption: root2.query("GET_LABEL_IDLE") + })); + root2.ref.list = root2.appendChildView(root2.createChildView(listScroller, {translateY: null})); + root2.ref.panel = root2.appendChildView(root2.createChildView(panel, {name: "panel-root"})); + root2.ref.assistant = root2.appendChildView(root2.createChildView(assistant, {...props})); + root2.ref.data = root2.appendChildView(root2.createChildView(data2, {...props})); + root2.ref.measure = createElement$1("div"); + root2.ref.measure.style.height = "100%"; + root2.element.appendChild(root2.ref.measure); + root2.ref.bounds = null; + root2.query("GET_STYLES").filter((style) => !isEmpty(style.value)).map(({name: name2, value}) => { + root2.element.dataset[name2] = value; + }); + root2.ref.widthPrevious = null; + root2.ref.widthUpdated = debounce(() => { + root2.ref.updateHistory = []; + root2.dispatch("DID_RESIZE_ROOT"); + }, 250); + root2.ref.previousAspectRatio = null; + root2.ref.updateHistory = []; + const canHover = window.matchMedia("(pointer: fine) and (hover: hover)").matches; + const hasPointerEvents = "PointerEvent" in window; + if (root2.query("GET_ALLOW_REORDER") && hasPointerEvents && !canHover) { + root2.element.addEventListener("touchmove", prevent, {passive: false}); + root2.element.addEventListener("gesturestart", prevent); + } + const credits = root2.query("GET_CREDITS"); + const hasCredits = credits.length === 2; + if (hasCredits) { + const frag = document.createElement("a"); + frag.className = "filepond--credits"; + frag.setAttribute("aria-hidden", "true"); + frag.href = credits[0]; + frag.tabindex = -1; + frag.target = "_blank"; + frag.rel = "noopener noreferrer"; + frag.textContent = credits[1]; + root2.element.appendChild(frag); + root2.ref.credits = frag; + } +}; +var write$9 = ({root: root2, props, actions: actions2}) => { + route$5({root: root2, props, actions: actions2}); + actions2.filter((action) => /^DID_SET_STYLE_/.test(action.type)).filter((action) => !isEmpty(action.data.value)).map(({type, data: data3}) => { + const name2 = toCamels(type.substr(8).toLowerCase(), "_"); + root2.element.dataset[name2] = data3.value; + root2.invalidateLayout(); + }); + if (root2.rect.element.hidden) + return; + if (root2.rect.element.width !== root2.ref.widthPrevious) { + root2.ref.widthPrevious = root2.rect.element.width; + root2.ref.widthUpdated(); + } + let bounds = root2.ref.bounds; + if (!bounds) { + bounds = root2.ref.bounds = calculateRootBoundingBoxHeight(root2); + root2.element.removeChild(root2.ref.measure); + root2.ref.measure = null; + } + const {hopper, label, list: list2, panel: panel2} = root2.ref; + if (hopper) { + hopper.updateHopperState(); + } + const aspectRatio = root2.query("GET_PANEL_ASPECT_RATIO"); + const isMultiItem = root2.query("GET_ALLOW_MULTIPLE"); + const totalItems = root2.query("GET_TOTAL_ITEMS"); + const maxItems = isMultiItem ? root2.query("GET_MAX_FILES") || MAX_FILES_LIMIT : 1; + const atMaxCapacity = totalItems === maxItems; + const addAction = actions2.find((action) => action.type === "DID_ADD_ITEM"); + if (atMaxCapacity && addAction) { + const interactionMethod = addAction.data.interactionMethod; + label.opacity = 0; + if (isMultiItem) { + label.translateY = -40; + } else { + if (interactionMethod === InteractionMethod.API) { + label.translateX = 40; + } else if (interactionMethod === InteractionMethod.BROWSE) { + label.translateY = 40; + } else { + label.translateY = 30; + } + } + } else if (!atMaxCapacity) { + label.opacity = 1; + label.translateX = 0; + label.translateY = 0; + } + const listItemMargin = calculateListItemMargin(root2); + const listHeight = calculateListHeight(root2); + const labelHeight = label.rect.element.height; + const currentLabelHeight = !isMultiItem || atMaxCapacity ? 0 : labelHeight; + const listMarginTop = atMaxCapacity ? list2.rect.element.marginTop : 0; + const listMarginBottom = totalItems === 0 ? 0 : list2.rect.element.marginBottom; + const visualHeight = currentLabelHeight + listMarginTop + listHeight.visual + listMarginBottom; + const boundsHeight = currentLabelHeight + listMarginTop + listHeight.bounds + listMarginBottom; + list2.translateY = Math.max(0, currentLabelHeight - list2.rect.element.marginTop) - listItemMargin.top; + if (aspectRatio) { + const width = root2.rect.element.width; + const height = width * aspectRatio; + if (aspectRatio !== root2.ref.previousAspectRatio) { + root2.ref.previousAspectRatio = aspectRatio; + root2.ref.updateHistory = []; + } + const history = root2.ref.updateHistory; + history.push(width); + const MAX_BOUNCES = 2; + if (history.length > MAX_BOUNCES * 2) { + const l = history.length; + const bottom = l - 10; + let bounces = 0; + for (let i = l; i >= bottom; i--) { + if (history[i] === history[i - 2]) { + bounces++; + } + if (bounces >= MAX_BOUNCES) { + return; + } + } + } + panel2.scalable = false; + panel2.height = height; + const listAvailableHeight = height - currentLabelHeight - (listMarginBottom - listItemMargin.bottom) - (atMaxCapacity ? listMarginTop : 0); + if (listHeight.visual > listAvailableHeight) { + list2.overflow = listAvailableHeight; + } else { + list2.overflow = null; + } + root2.height = height; + } else if (bounds.fixedHeight) { + panel2.scalable = false; + const listAvailableHeight = bounds.fixedHeight - currentLabelHeight - (listMarginBottom - listItemMargin.bottom) - (atMaxCapacity ? listMarginTop : 0); + if (listHeight.visual > listAvailableHeight) { + list2.overflow = listAvailableHeight; + } else { + list2.overflow = null; + } + } else if (bounds.cappedHeight) { + const isCappedHeight = visualHeight >= bounds.cappedHeight; + const panelHeight = Math.min(bounds.cappedHeight, visualHeight); + panel2.scalable = true; + panel2.height = isCappedHeight ? panelHeight : panelHeight - listItemMargin.top - listItemMargin.bottom; + const listAvailableHeight = panelHeight - currentLabelHeight - (listMarginBottom - listItemMargin.bottom) - (atMaxCapacity ? listMarginTop : 0); + if (visualHeight > bounds.cappedHeight && listHeight.visual > listAvailableHeight) { + list2.overflow = listAvailableHeight; + } else { + list2.overflow = null; + } + root2.height = Math.min(bounds.cappedHeight, boundsHeight - listItemMargin.top - listItemMargin.bottom); + } else { + const itemMargin = totalItems > 0 ? listItemMargin.top + listItemMargin.bottom : 0; + panel2.scalable = true; + panel2.height = Math.max(labelHeight, visualHeight - itemMargin); + root2.height = Math.max(labelHeight, boundsHeight - itemMargin); + } + if (root2.ref.credits && panel2.heightCurrent) + root2.ref.credits.style.transform = `translateY(${panel2.heightCurrent}px)`; +}; +var calculateListItemMargin = (root2) => { + const item2 = root2.ref.list.childViews[0].childViews[0]; + return item2 ? { + top: item2.rect.element.marginTop, + bottom: item2.rect.element.marginBottom + } : { + top: 0, + bottom: 0 + }; +}; +var calculateListHeight = (root2) => { + let visual = 0; + let bounds = 0; + const scrollList = root2.ref.list; + const itemList = scrollList.childViews[0]; + const visibleChildren = itemList.childViews.filter((child) => child.rect.element.height); + const children = root2.query("GET_ACTIVE_ITEMS").map((item2) => visibleChildren.find((child) => child.id === item2.id)).filter((item2) => item2); + if (children.length === 0) + return {visual, bounds}; + const horizontalSpace = itemList.rect.element.width; + const dragIndex = getItemIndexByPosition(itemList, children, scrollList.dragCoordinates); + const childRect = children[0].rect.element; + const itemVerticalMargin = childRect.marginTop + childRect.marginBottom; + const itemHorizontalMargin = childRect.marginLeft + childRect.marginRight; + const itemWidth = childRect.width + itemHorizontalMargin; + const itemHeight = childRect.height + itemVerticalMargin; + const newItem = typeof dragIndex !== "undefined" && dragIndex >= 0 ? 1 : 0; + const removedItem = children.find((child) => child.markedForRemoval && child.opacity < 0.45) ? -1 : 0; + const verticalItemCount = children.length + newItem + removedItem; + const itemsPerRow = getItemsPerRow(horizontalSpace, itemWidth); + if (itemsPerRow === 1) { + children.forEach((item2) => { + const height = item2.rect.element.height + itemVerticalMargin; + bounds += height; + visual += height * item2.opacity; + }); + } else { + bounds = Math.ceil(verticalItemCount / itemsPerRow) * itemHeight; + visual = bounds; + } + return {visual, bounds}; +}; +var calculateRootBoundingBoxHeight = (root2) => { + const height = root2.ref.measureHeight || null; + const cappedHeight = parseInt(root2.style.maxHeight, 10) || null; + const fixedHeight = height === 0 ? null : height; + return { + cappedHeight, + fixedHeight + }; +}; +var exceedsMaxFiles = (root2, items) => { + const allowReplace = root2.query("GET_ALLOW_REPLACE"); + const allowMultiple = root2.query("GET_ALLOW_MULTIPLE"); + const totalItems = root2.query("GET_TOTAL_ITEMS"); + let maxItems = root2.query("GET_MAX_FILES"); + const totalBrowseItems = items.length; + if (!allowMultiple && totalBrowseItems > 1) { + return true; + } + maxItems = allowMultiple ? maxItems : allowReplace ? maxItems : 1; + const hasMaxItems = isInt(maxItems); + if (hasMaxItems && totalItems + totalBrowseItems > maxItems) { + root2.dispatch("DID_THROW_MAX_FILES", { + source: items, + error: createResponse("warning", 0, "Max files") + }); + return true; + } + return false; +}; +var getDragIndex = (list2, children, position) => { + const itemList = list2.childViews[0]; + return getItemIndexByPosition(itemList, children, { + left: position.scopeLeft - itemList.rect.element.left, + top: position.scopeTop - (list2.rect.outer.top + list2.rect.element.marginTop + list2.rect.element.scrollTop) + }); +}; +var toggleDrop = (root2) => { + const isAllowed = root2.query("GET_ALLOW_DROP"); + const isDisabled = root2.query("GET_DISABLED"); + const enabled = isAllowed && !isDisabled; + if (enabled && !root2.ref.hopper) { + const hopper = createHopper(root2.element, (items) => { + const beforeDropFile = root2.query("GET_BEFORE_DROP_FILE") || (() => true); + const dropValidation = root2.query("GET_DROP_VALIDATION"); + return dropValidation ? items.every((item2) => applyFilters("ALLOW_HOPPER_ITEM", item2, { + query: root2.query + }).every((result) => result === true) && beforeDropFile(item2)) : true; + }, { + filterItems: (items) => { + const ignoredFiles = root2.query("GET_IGNORED_FILES"); + return items.filter((item2) => { + if (isFile(item2)) { + return !ignoredFiles.includes(item2.name.toLowerCase()); + } + return true; + }); + }, + catchesDropsOnPage: root2.query("GET_DROP_ON_PAGE"), + requiresDropOnElement: root2.query("GET_DROP_ON_ELEMENT") + }); + hopper.onload = (items, position) => { + const list2 = root2.ref.list.childViews[0]; + const visibleChildren = list2.childViews.filter((child) => child.rect.element.height); + const children = root2.query("GET_ACTIVE_ITEMS").map((item2) => visibleChildren.find((child) => child.id === item2.id)).filter((item2) => item2); + applyFilterChain("ADD_ITEMS", items, {dispatch: root2.dispatch}).then((queue) => { + if (exceedsMaxFiles(root2, queue)) + return false; + root2.dispatch("ADD_ITEMS", { + items: queue, + index: getDragIndex(root2.ref.list, children, position), + interactionMethod: InteractionMethod.DROP + }); + }); + root2.dispatch("DID_DROP", {position}); + root2.dispatch("DID_END_DRAG", {position}); + }; + hopper.ondragstart = (position) => { + root2.dispatch("DID_START_DRAG", {position}); + }; + hopper.ondrag = debounce((position) => { + root2.dispatch("DID_DRAG", {position}); + }); + hopper.ondragend = (position) => { + root2.dispatch("DID_END_DRAG", {position}); + }; + root2.ref.hopper = hopper; + root2.ref.drip = root2.appendChildView(root2.createChildView(drip)); + } else if (!enabled && root2.ref.hopper) { + root2.ref.hopper.destroy(); + root2.ref.hopper = null; + root2.removeChildView(root2.ref.drip); + } +}; +var toggleBrowse = (root2, props) => { + const isAllowed = root2.query("GET_ALLOW_BROWSE"); + const isDisabled = root2.query("GET_DISABLED"); + const enabled = isAllowed && !isDisabled; + if (enabled && !root2.ref.browser) { + root2.ref.browser = root2.appendChildView(root2.createChildView(browser, { + ...props, + onload: (items) => { + applyFilterChain("ADD_ITEMS", items, { + dispatch: root2.dispatch + }).then((queue) => { + if (exceedsMaxFiles(root2, queue)) + return false; + root2.dispatch("ADD_ITEMS", { + items: queue, + index: -1, + interactionMethod: InteractionMethod.BROWSE + }); + }); + } + }), 0); + } else if (!enabled && root2.ref.browser) { + root2.removeChildView(root2.ref.browser); + root2.ref.browser = null; + } +}; +var togglePaste = (root2) => { + const isAllowed = root2.query("GET_ALLOW_PASTE"); + const isDisabled = root2.query("GET_DISABLED"); + const enabled = isAllowed && !isDisabled; + if (enabled && !root2.ref.paster) { + root2.ref.paster = createPaster(); + root2.ref.paster.onload = (items) => { + applyFilterChain("ADD_ITEMS", items, {dispatch: root2.dispatch}).then((queue) => { + if (exceedsMaxFiles(root2, queue)) + return false; + root2.dispatch("ADD_ITEMS", { + items: queue, + index: -1, + interactionMethod: InteractionMethod.PASTE + }); + }); + }; + } else if (!enabled && root2.ref.paster) { + root2.ref.paster.destroy(); + root2.ref.paster = null; + } +}; +var route$5 = createRoute({ + DID_SET_ALLOW_BROWSE: ({root: root2, props}) => { + toggleBrowse(root2, props); + }, + DID_SET_ALLOW_DROP: ({root: root2}) => { + toggleDrop(root2); + }, + DID_SET_ALLOW_PASTE: ({root: root2}) => { + togglePaste(root2); + }, + DID_SET_DISABLED: ({root: root2, props}) => { + toggleDrop(root2); + togglePaste(root2); + toggleBrowse(root2, props); + const isDisabled = root2.query("GET_DISABLED"); + if (isDisabled) { + root2.element.dataset.disabled = "disabled"; + } else { + root2.element.removeAttribute("data-disabled"); + } + } +}); +var root = createView({ + name: "root", + read: ({root: root2}) => { + if (root2.ref.measure) { + root2.ref.measureHeight = root2.ref.measure.offsetHeight; + } + }, + create: create$e, + write: write$9, + destroy: ({root: root2}) => { + if (root2.ref.paster) { + root2.ref.paster.destroy(); + } + if (root2.ref.hopper) { + root2.ref.hopper.destroy(); + } + root2.element.removeEventListener("touchmove", prevent); + root2.element.removeEventListener("gesturestart", prevent); + }, + mixins: { + styles: ["height"] + } +}); +var createApp = (initialOptions = {}) => { + let originalElement = null; + const defaultOptions2 = getOptions(); + const store = createStore(createInitialState(defaultOptions2), [queries, createOptionQueries(defaultOptions2)], [actions, createOptionActions(defaultOptions2)]); + store.dispatch("SET_OPTIONS", {options: initialOptions}); + const visibilityHandler = () => { + if (document.hidden) + return; + store.dispatch("KICK"); + }; + document.addEventListener("visibilitychange", visibilityHandler); + let resizeDoneTimer = null; + let isResizing = false; + let isResizingHorizontally = false; + let initialWindowWidth = null; + let currentWindowWidth = null; + const resizeHandler = () => { + if (!isResizing) { + isResizing = true; + } + clearTimeout(resizeDoneTimer); + resizeDoneTimer = setTimeout(() => { + isResizing = false; + initialWindowWidth = null; + currentWindowWidth = null; + if (isResizingHorizontally) { + isResizingHorizontally = false; + store.dispatch("DID_STOP_RESIZE"); + } + }, 500); + }; + window.addEventListener("resize", resizeHandler); + const view = root(store, {id: getUniqueId()}); + let isResting = false; + let isHidden = false; + const readWriteApi = { + _read: () => { + if (isResizing) { + currentWindowWidth = window.innerWidth; + if (!initialWindowWidth) { + initialWindowWidth = currentWindowWidth; + } + if (!isResizingHorizontally && currentWindowWidth !== initialWindowWidth) { + store.dispatch("DID_START_RESIZE"); + isResizingHorizontally = true; + } + } + if (isHidden && isResting) { + isResting = view.element.offsetParent === null; + } + if (isResting) + return; + view._read(); + isHidden = view.rect.element.hidden; + }, + _write: (ts) => { + const actions2 = store.processActionQueue().filter((action) => !/^SET_/.test(action.type)); + if (isResting && !actions2.length) + return; + routeActionsToEvents(actions2); + isResting = view._write(ts, actions2, isResizingHorizontally); + removeReleasedItems(store.query("GET_ITEMS")); + if (isResting) { + store.processDispatchQueue(); + } + } + }; + const createEvent = (name2) => (data3) => { + const event = { + type: name2 + }; + if (!data3) { + return event; + } + if (data3.hasOwnProperty("error")) { + event.error = data3.error ? {...data3.error} : null; + } + if (data3.status) { + event.status = {...data3.status}; + } + if (data3.file) { + event.output = data3.file; + } + if (data3.source) { + event.file = data3.source; + } else if (data3.item || data3.id) { + const item2 = data3.item ? data3.item : store.query("GET_ITEM", data3.id); + event.file = item2 ? createItemAPI(item2) : null; + } + if (data3.items) { + event.items = data3.items.map(createItemAPI); + } + if (/progress/.test(name2)) { + event.progress = data3.progress; + } + if (data3.hasOwnProperty("origin") && data3.hasOwnProperty("target")) { + event.origin = data3.origin; + event.target = data3.target; + } + return event; + }; + const eventRoutes = { + DID_DESTROY: createEvent("destroy"), + DID_INIT: createEvent("init"), + DID_THROW_MAX_FILES: createEvent("warning"), + DID_INIT_ITEM: createEvent("initfile"), + DID_START_ITEM_LOAD: createEvent("addfilestart"), + DID_UPDATE_ITEM_LOAD_PROGRESS: createEvent("addfileprogress"), + DID_LOAD_ITEM: createEvent("addfile"), + DID_THROW_ITEM_INVALID: [createEvent("error"), createEvent("addfile")], + DID_THROW_ITEM_LOAD_ERROR: [createEvent("error"), createEvent("addfile")], + DID_THROW_ITEM_REMOVE_ERROR: [createEvent("error"), createEvent("removefile")], + DID_PREPARE_OUTPUT: createEvent("preparefile"), + DID_START_ITEM_PROCESSING: createEvent("processfilestart"), + DID_UPDATE_ITEM_PROCESS_PROGRESS: createEvent("processfileprogress"), + DID_ABORT_ITEM_PROCESSING: createEvent("processfileabort"), + DID_COMPLETE_ITEM_PROCESSING: createEvent("processfile"), + DID_COMPLETE_ITEM_PROCESSING_ALL: createEvent("processfiles"), + DID_REVERT_ITEM_PROCESSING: createEvent("processfilerevert"), + DID_THROW_ITEM_PROCESSING_ERROR: [createEvent("error"), createEvent("processfile")], + DID_REMOVE_ITEM: createEvent("removefile"), + DID_UPDATE_ITEMS: createEvent("updatefiles"), + DID_ACTIVATE_ITEM: createEvent("activatefile"), + DID_REORDER_ITEMS: createEvent("reorderfiles") + }; + const exposeEvent = (event) => { + const detail = {pond: exports, ...event}; + delete detail.type; + view.element.dispatchEvent(new CustomEvent(`FilePond:${event.type}`, { + detail, + bubbles: true, + cancelable: true, + composed: true + })); + const params = []; + if (event.hasOwnProperty("error")) { + params.push(event.error); + } + if (event.hasOwnProperty("file")) { + params.push(event.file); + } + const filtered = ["type", "error", "file"]; + Object.keys(event).filter((key) => !filtered.includes(key)).forEach((key) => params.push(event[key])); + exports.fire(event.type, ...params); + const handler = store.query(`GET_ON${event.type.toUpperCase()}`); + if (handler) { + handler(...params); + } + }; + const routeActionsToEvents = (actions2) => { + if (!actions2.length) + return; + actions2.filter((action) => eventRoutes[action.type]).forEach((action) => { + const routes = eventRoutes[action.type]; + (Array.isArray(routes) ? routes : [routes]).forEach((route2) => { + if (action.type === "DID_INIT_ITEM") { + exposeEvent(route2(action.data)); + } else { + setTimeout(() => { + exposeEvent(route2(action.data)); + }, 0); + } + }); + }); + }; + const setOptions2 = (options) => store.dispatch("SET_OPTIONS", {options}); + const getFile2 = (query) => store.query("GET_ACTIVE_ITEM", query); + const prepareFile = (query) => new Promise((resolve, reject) => { + store.dispatch("REQUEST_ITEM_PREPARE", { + query, + success: (item2) => { + resolve(item2); + }, + failure: (error2) => { + reject(error2); + } + }); + }); + const addFile = (source, options = {}) => new Promise((resolve, reject) => { + addFiles([{source, options}], {index: options.index}).then((items) => resolve(items && items[0])).catch(reject); + }); + const isFilePondFile = (obj) => obj.file && obj.id; + const removeFile = (query, options) => { + if (typeof query === "object" && !isFilePondFile(query) && !options) { + options = query; + query = void 0; + } + store.dispatch("REMOVE_ITEM", {...options, query}); + return store.query("GET_ACTIVE_ITEM", query) === null; + }; + const addFiles = (...args) => new Promise((resolve, reject) => { + const sources = []; + const options = {}; + if (isArray(args[0])) { + sources.push.apply(sources, args[0]); + Object.assign(options, args[1] || {}); + } else { + const lastArgument = args[args.length - 1]; + if (typeof lastArgument === "object" && !(lastArgument instanceof Blob)) { + Object.assign(options, args.pop()); + } + sources.push(...args); + } + store.dispatch("ADD_ITEMS", { + items: sources, + index: options.index, + interactionMethod: InteractionMethod.API, + success: resolve, + failure: reject + }); + }); + const getFiles2 = () => store.query("GET_ACTIVE_ITEMS"); + const processFile = (query) => new Promise((resolve, reject) => { + store.dispatch("REQUEST_ITEM_PROCESSING", { + query, + success: (item2) => { + resolve(item2); + }, + failure: (error2) => { + reject(error2); + } + }); + }); + const prepareFiles = (...args) => { + const queries2 = Array.isArray(args[0]) ? args[0] : args; + const items = queries2.length ? queries2 : getFiles2(); + return Promise.all(items.map(prepareFile)); + }; + const processFiles = (...args) => { + const queries2 = Array.isArray(args[0]) ? args[0] : args; + if (!queries2.length) { + const files = getFiles2().filter((item2) => !(item2.status === ItemStatus.IDLE && item2.origin === FileOrigin.LOCAL) && item2.status !== ItemStatus.PROCESSING && item2.status !== ItemStatus.PROCESSING_COMPLETE && item2.status !== ItemStatus.PROCESSING_REVERT_ERROR); + return Promise.all(files.map(processFile)); + } + return Promise.all(queries2.map(processFile)); + }; + const removeFiles = (...args) => { + const queries2 = Array.isArray(args[0]) ? args[0] : args; + let options; + if (typeof queries2[queries2.length - 1] === "object") { + options = queries2.pop(); + } else if (Array.isArray(args[0])) { + options = args[1]; + } + const files = getFiles2(); + if (!queries2.length) + return Promise.all(files.map((file2) => removeFile(file2, options))); + const mappedQueries = queries2.map((query) => isNumber(query) ? files[query] ? files[query].id : null : query).filter((query) => query); + return mappedQueries.map((q) => removeFile(q, options)); + }; + const exports = { + ...on(), + ...readWriteApi, + ...createOptionAPI(store, defaultOptions2), + setOptions: setOptions2, + addFile, + addFiles, + getFile: getFile2, + processFile, + prepareFile, + removeFile, + moveFile: (query, index2) => store.dispatch("MOVE_ITEM", {query, index: index2}), + getFiles: getFiles2, + processFiles, + removeFiles, + prepareFiles, + sort: (compare) => store.dispatch("SORT", {compare}), + browse: () => { + var input = view.element.querySelector("input[type=file]"); + if (input) { + input.click(); + } + }, + destroy: () => { + exports.fire("destroy", view.element); + store.dispatch("ABORT_ALL"); + view._destroy(); + window.removeEventListener("resize", resizeHandler); + document.removeEventListener("visibilitychange", visibilityHandler); + store.dispatch("DID_DESTROY"); + }, + insertBefore: (element) => insertBefore(view.element, element), + insertAfter: (element) => insertAfter(view.element, element), + appendTo: (element) => element.appendChild(view.element), + replaceElement: (element) => { + insertBefore(view.element, element); + element.parentNode.removeChild(element); + originalElement = element; + }, + restoreElement: () => { + if (!originalElement) { + return; + } + insertAfter(originalElement, view.element); + view.element.parentNode.removeChild(view.element); + originalElement = null; + }, + isAttachedTo: (element) => view.element === element || originalElement === element, + element: { + get: () => view.element + }, + status: { + get: () => store.query("GET_STATUS") + } + }; + store.dispatch("DID_INIT"); + return createObject(exports); +}; +var createAppObject = (customOptions = {}) => { + const defaultOptions2 = {}; + forin(getOptions(), (key, value) => { + defaultOptions2[key] = value[0]; + }); + const app = createApp({ + ...defaultOptions2, + ...customOptions + }); + return app; +}; +var lowerCaseFirstLetter = (string) => string.charAt(0).toLowerCase() + string.slice(1); +var attributeNameToPropertyName = (attributeName) => toCamels(attributeName.replace(/^data-/, "")); +var mapObject = (object, propertyMap) => { + forin(propertyMap, (selector, mapping) => { + forin(object, (property, value) => { + const selectorRegExp = new RegExp(selector); + const matches2 = selectorRegExp.test(property); + if (!matches2) { + return; + } + delete object[property]; + if (mapping === false) { + return; + } + if (isString(mapping)) { + object[mapping] = value; + return; + } + const group = mapping.group; + if (isObject(mapping) && !object[group]) { + object[group] = {}; + } + object[group][lowerCaseFirstLetter(property.replace(selectorRegExp, ""))] = value; + }); + if (mapping.mapping) { + mapObject(object[mapping.group], mapping.mapping); + } + }); +}; +var getAttributesAsObject = (node, attributeMapping = {}) => { + const attributes = []; + forin(node.attributes, (index2) => { + attributes.push(node.attributes[index2]); + }); + const output = attributes.filter((attribute) => attribute.name).reduce((obj, attribute) => { + const value = attr(node, attribute.name); + obj[attributeNameToPropertyName(attribute.name)] = value === attribute.name ? true : value; + return obj; + }, {}); + mapObject(output, attributeMapping); + return output; +}; +var createAppAtElement = (element, options = {}) => { + const attributeMapping = { + "^class$": "className", + "^multiple$": "allowMultiple", + "^capture$": "captureMethod", + "^webkitdirectory$": "allowDirectoriesOnly", + "^server": { + group: "server", + mapping: { + "^process": { + group: "process" + }, + "^revert": { + group: "revert" + }, + "^fetch": { + group: "fetch" + }, + "^restore": { + group: "restore" + }, + "^load": { + group: "load" + } + } + }, + "^type$": false, + "^files$": false + }; + applyFilters("SET_ATTRIBUTE_TO_OPTION_MAP", attributeMapping); + const mergedOptions = { + ...options + }; + const attributeOptions = getAttributesAsObject(element.nodeName === "FIELDSET" ? element.querySelector("input[type=file]") : element, attributeMapping); + Object.keys(attributeOptions).forEach((key) => { + if (isObject(attributeOptions[key])) { + if (!isObject(mergedOptions[key])) { + mergedOptions[key] = {}; + } + Object.assign(mergedOptions[key], attributeOptions[key]); + } else { + mergedOptions[key] = attributeOptions[key]; + } + }); + mergedOptions.files = (options.files || []).concat(Array.from(element.querySelectorAll("input:not([type=file])")).map((input) => ({ + source: input.value, + options: { + type: input.dataset.type + } + }))); + const app = createAppObject(mergedOptions); + if (element.files) { + Array.from(element.files).forEach((file2) => { + app.addFile(file2); + }); + } + app.replaceElement(element); + return app; +}; +var createApp$1 = (...args) => isNode(args[0]) ? createAppAtElement(...args) : createAppObject(...args); +var PRIVATE_METHODS = ["fire", "_read", "_write"]; +var createAppAPI = (app) => { + const api = {}; + copyObjectPropertiesToObject(app, api, PRIVATE_METHODS); + return api; +}; +var replaceInString = (string, replacements) => string.replace(/(?:{([a-zA-Z]+)})/g, (match, group) => replacements[group]); +var createWorker = (fn2) => { + const workerBlob = new Blob(["(", fn2.toString(), ")()"], { + type: "application/javascript" + }); + const workerURL = URL.createObjectURL(workerBlob); + const worker = new Worker(workerURL); + return { + transfer: (message, cb) => { + }, + post: (message, cb, transferList) => { + const id = getUniqueId(); + worker.onmessage = (e2) => { + if (e2.data.id === id) { + cb(e2.data.message); + } + }; + worker.postMessage({ + id, + message + }, transferList); + }, + terminate: () => { + worker.terminate(); + URL.revokeObjectURL(workerURL); + } + }; +}; +var loadImage = (url) => new Promise((resolve, reject) => { + const img = new Image(); + img.onload = () => { + resolve(img); + }; + img.onerror = (e2) => { + reject(e2); + }; + img.src = url; +}); +var renameFile = (file2, name2) => { + const renamedFile = file2.slice(0, file2.size, file2.type); + renamedFile.lastModifiedDate = file2.lastModifiedDate; + renamedFile.name = name2; + return renamedFile; +}; +var copyFile = (file2) => renameFile(file2, file2.name); +var registeredPlugins = []; +var createAppPlugin = (plugin8) => { + if (registeredPlugins.includes(plugin8)) { + return; + } + registeredPlugins.push(plugin8); + const pluginOutline = plugin8({ + addFilter, + utils: { + Type, + forin, + isString, + isFile, + toNaturalFileSize, + replaceInString, + getExtensionFromFilename, + getFilenameWithoutExtension, + guesstimateMimeType, + getFileFromBlob, + getFilenameFromURL, + createRoute, + createWorker, + createView, + createItemAPI, + loadImage, + copyFile, + renameFile, + createBlob, + applyFilterChain, + text, + getNumericAspectRatioFromString + }, + views: { + fileActionButton + } + }); + extendDefaultOptions(pluginOutline.options); +}; +var isOperaMini = () => Object.prototype.toString.call(window.operamini) === "[object OperaMini]"; +var hasPromises = () => "Promise" in window; +var hasBlobSlice = () => "slice" in Blob.prototype; +var hasCreateObjectURL = () => "URL" in window && "createObjectURL" in window.URL; +var hasVisibility = () => "visibilityState" in document; +var hasTiming = () => "performance" in window; +var hasCSSSupports = () => "supports" in (window.CSS || {}); +var isIE11 = () => /MSIE|Trident/.test(window.navigator.userAgent); +var supported = (() => { + const isSupported = isBrowser() && !isOperaMini() && hasVisibility() && hasPromises() && hasBlobSlice() && hasCreateObjectURL() && hasTiming() && (hasCSSSupports() || isIE11()); + return () => isSupported; +})(); +var state = { + apps: [] +}; +var name = "filepond"; +var fn = () => { +}; +var Status$1 = {}; +var FileStatus = {}; +var FileOrigin$1 = {}; +var OptionTypes = {}; +var create$f = fn; +var destroy = fn; +var parse = fn; +var find = fn; +var registerPlugin = fn; +var getOptions$1 = fn; +var setOptions$1 = fn; +if (supported()) { + createPainter(() => { + state.apps.forEach((app) => app._read()); + }, (ts) => { + state.apps.forEach((app) => app._write(ts)); + }); + const dispatch2 = () => { + document.dispatchEvent(new CustomEvent("FilePond:loaded", { + detail: { + supported, + create: create$f, + destroy, + parse, + find, + registerPlugin, + setOptions: setOptions$1 + } + })); + document.removeEventListener("DOMContentLoaded", dispatch2); + }; + if (document.readyState !== "loading") { + setTimeout(() => dispatch2(), 0); + } else { + document.addEventListener("DOMContentLoaded", dispatch2); + } + const updateOptionTypes = () => forin(getOptions(), (key, value) => { + OptionTypes[key] = value[1]; + }); + Status$1 = {...Status}; + FileOrigin$1 = {...FileOrigin}; + FileStatus = {...ItemStatus}; + OptionTypes = {}; + updateOptionTypes(); + create$f = (...args) => { + const app = createApp$1(...args); + app.on("destroy", destroy); + state.apps.push(app); + return createAppAPI(app); + }; + destroy = (hook) => { + const indexToRemove = state.apps.findIndex((app) => app.isAttachedTo(hook)); + if (indexToRemove >= 0) { + const app = state.apps.splice(indexToRemove, 1)[0]; + app.restoreElement(); + return true; + } + return false; + }; + parse = (context) => { + const matchedHooks = Array.from(context.querySelectorAll(`.${name}`)); + const newHooks = matchedHooks.filter((newHook) => !state.apps.find((app) => app.isAttachedTo(newHook))); + return newHooks.map((hook) => create$f(hook)); + }; + find = (hook) => { + const app = state.apps.find((app2) => app2.isAttachedTo(hook)); + if (!app) { + return null; + } + return createAppAPI(app); + }; + registerPlugin = (...plugins2) => { + plugins2.forEach(createAppPlugin); + updateOptionTypes(); + }; + getOptions$1 = () => { + const opts = {}; + forin(getOptions(), (key, value) => { + opts[key] = value[0]; + }); + return opts; + }; + setOptions$1 = (opts) => { + if (isObject(opts)) { + state.apps.forEach((app) => { + app.setOptions(opts); + }); + setOptions(opts); + } + return getOptions$1(); + }; +} + +// node_modules/filepond-plugin-file-validate-size/dist/filepond-plugin-file-validate-size.esm.js +/*! + * FilePondPluginFileValidateSize 2.2.5 + * Licensed under MIT, https://opensource.org/licenses/MIT/ + * Please visit https://pqina.nl/filepond/ for details. + */ +var plugin = ({addFilter: addFilter2, utils}) => { + const {Type: Type2, replaceInString: replaceInString2, toNaturalFileSize: toNaturalFileSize2} = utils; + addFilter2("ALLOW_HOPPER_ITEM", (file2, {query}) => { + if (!query("GET_ALLOW_FILE_SIZE_VALIDATION")) { + return true; + } + const sizeMax = query("GET_MAX_FILE_SIZE"); + if (sizeMax !== null && file2.size >= sizeMax) { + return false; + } + const sizeMin = query("GET_MIN_FILE_SIZE"); + if (sizeMin !== null && file2.size <= sizeMin) { + return false; + } + return true; + }); + addFilter2("LOAD_FILE", (file2, {query}) => new Promise((resolve, reject) => { + if (!query("GET_ALLOW_FILE_SIZE_VALIDATION")) { + return resolve(file2); + } + const fileFilter = query("GET_FILE_VALIDATE_SIZE_FILTER"); + if (fileFilter && !fileFilter(file2)) { + return resolve(file2); + } + const sizeMax = query("GET_MAX_FILE_SIZE"); + if (sizeMax !== null && file2.size >= sizeMax) { + reject({ + status: { + main: query("GET_LABEL_MAX_FILE_SIZE_EXCEEDED"), + sub: replaceInString2(query("GET_LABEL_MAX_FILE_SIZE"), { + filesize: toNaturalFileSize2(sizeMax, ".", query("GET_FILE_SIZE_BASE"), query("GET_FILE_SIZE_LABELS", query)) + }) + } + }); + return; + } + const sizeMin = query("GET_MIN_FILE_SIZE"); + if (sizeMin !== null && file2.size <= sizeMin) { + reject({ + status: { + main: query("GET_LABEL_MIN_FILE_SIZE_EXCEEDED"), + sub: replaceInString2(query("GET_LABEL_MIN_FILE_SIZE"), { + filesize: toNaturalFileSize2(sizeMin, ".", query("GET_FILE_SIZE_BASE"), query("GET_FILE_SIZE_LABELS", query)) + }) + } + }); + return; + } + const totalSizeMax = query("GET_MAX_TOTAL_FILE_SIZE"); + if (totalSizeMax !== null) { + const currentTotalSize = query("GET_ACTIVE_ITEMS").reduce((total, item2) => { + return total + item2.fileSize; + }, 0); + if (currentTotalSize > totalSizeMax) { + reject({ + status: { + main: query("GET_LABEL_MAX_TOTAL_FILE_SIZE_EXCEEDED"), + sub: replaceInString2(query("GET_LABEL_MAX_TOTAL_FILE_SIZE"), { + filesize: toNaturalFileSize2(totalSizeMax, ".", query("GET_FILE_SIZE_BASE"), query("GET_FILE_SIZE_LABELS", query)) + }) + } + }); + return; + } + } + resolve(file2); + })); + return { + options: { + allowFileSizeValidation: [true, Type2.BOOLEAN], + maxFileSize: [null, Type2.INT], + minFileSize: [null, Type2.INT], + maxTotalFileSize: [null, Type2.INT], + fileValidateSizeFilter: [null, Type2.FUNCTION], + labelMinFileSizeExceeded: ["File is too small", Type2.STRING], + labelMinFileSize: ["Minimum file size is {filesize}", Type2.STRING], + labelMaxFileSizeExceeded: ["File is too large", Type2.STRING], + labelMaxFileSize: ["Maximum file size is {filesize}", Type2.STRING], + labelMaxTotalFileSizeExceeded: ["Maximum total size exceeded", Type2.STRING], + labelMaxTotalFileSize: ["Maximum total file size is {filesize}", Type2.STRING] + } + }; +}; +var isBrowser2 = typeof window !== "undefined" && typeof window.document !== "undefined"; +if (isBrowser2) { + document.dispatchEvent(new CustomEvent("FilePond:pluginloaded", {detail: plugin})); +} +var filepond_plugin_file_validate_size_esm_default = plugin; + +// node_modules/filepond-plugin-file-validate-type/dist/filepond-plugin-file-validate-type.esm.js +/*! + * FilePondPluginFileValidateType 1.2.6 + * Licensed under MIT, https://opensource.org/licenses/MIT/ + * Please visit https://pqina.nl/filepond/ for details. + */ +var plugin2 = ({addFilter: addFilter2, utils}) => { + const { + Type: Type2, + isString: isString3, + replaceInString: replaceInString2, + guesstimateMimeType: guesstimateMimeType2, + getExtensionFromFilename: getExtensionFromFilename2, + getFilenameFromURL: getFilenameFromURL2 + } = utils; + const mimeTypeMatchesWildCard = (mimeType, wildcard) => { + const mimeTypeGroup = (/^[^/]+/.exec(mimeType) || []).pop(); + const wildcardGroup = wildcard.slice(0, -2); + return mimeTypeGroup === wildcardGroup; + }; + const isValidMimeType = (acceptedTypes, userInputType) => acceptedTypes.some((acceptedType) => { + if (/\*$/.test(acceptedType)) { + return mimeTypeMatchesWildCard(userInputType, acceptedType); + } + return acceptedType === userInputType; + }); + const getItemType = (item2) => { + let type = ""; + if (isString3(item2)) { + const filename = getFilenameFromURL2(item2); + const extension = getExtensionFromFilename2(filename); + if (extension) { + type = guesstimateMimeType2(extension); + } + } else { + type = item2.type; + } + return type; + }; + const validateFile = (item2, acceptedFileTypes, typeDetector) => { + if (acceptedFileTypes.length === 0) { + return true; + } + const type = getItemType(item2); + if (!typeDetector) { + return isValidMimeType(acceptedFileTypes, type); + } + return new Promise((resolve, reject) => { + typeDetector(item2, type).then((detectedType) => { + if (isValidMimeType(acceptedFileTypes, detectedType)) { + resolve(); + } else { + reject(); + } + }).catch(reject); + }); + }; + const applyMimeTypeMap = (map2) => (acceptedFileType) => map2[acceptedFileType] === null ? false : map2[acceptedFileType] || acceptedFileType; + addFilter2("SET_ATTRIBUTE_TO_OPTION_MAP", (map2) => Object.assign(map2, { + accept: "acceptedFileTypes" + })); + addFilter2("ALLOW_HOPPER_ITEM", (file2, {query}) => { + if (!query("GET_ALLOW_FILE_TYPE_VALIDATION")) { + return true; + } + return validateFile(file2, query("GET_ACCEPTED_FILE_TYPES")); + }); + addFilter2("LOAD_FILE", (file2, {query}) => new Promise((resolve, reject) => { + if (!query("GET_ALLOW_FILE_TYPE_VALIDATION")) { + resolve(file2); + return; + } + const acceptedFileTypes = query("GET_ACCEPTED_FILE_TYPES"); + const typeDetector = query("GET_FILE_VALIDATE_TYPE_DETECT_TYPE"); + const validationResult = validateFile(file2, acceptedFileTypes, typeDetector); + const handleRejection = () => { + const acceptedFileTypesMapped = acceptedFileTypes.map(applyMimeTypeMap(query("GET_FILE_VALIDATE_TYPE_LABEL_EXPECTED_TYPES_MAP"))).filter((label) => label !== false); + reject({ + status: { + main: query("GET_LABEL_FILE_TYPE_NOT_ALLOWED"), + sub: replaceInString2(query("GET_FILE_VALIDATE_TYPE_LABEL_EXPECTED_TYPES"), { + allTypes: acceptedFileTypesMapped.join(", "), + allButLastType: acceptedFileTypesMapped.slice(0, -1).join(", "), + lastType: acceptedFileTypesMapped[acceptedFileTypesMapped.length - 1] + }) + } + }); + }; + if (typeof validationResult === "boolean") { + if (!validationResult) { + return handleRejection(); + } + return resolve(file2); + } + validationResult.then(() => { + resolve(file2); + }).catch(handleRejection); + })); + return { + options: { + allowFileTypeValidation: [true, Type2.BOOLEAN], + acceptedFileTypes: [[], Type2.ARRAY], + labelFileTypeNotAllowed: ["File is of invalid type", Type2.STRING], + fileValidateTypeLabelExpectedTypes: [ + "Expects {allButLastType} or {lastType}", + Type2.STRING + ], + fileValidateTypeLabelExpectedTypesMap: [{}, Type2.OBJECT], + fileValidateTypeDetectType: [null, Type2.FUNCTION] + } + }; +}; +var isBrowser3 = typeof window !== "undefined" && typeof window.document !== "undefined"; +if (isBrowser3) { + document.dispatchEvent(new CustomEvent("FilePond:pluginloaded", {detail: plugin2})); +} +var filepond_plugin_file_validate_type_esm_default = plugin2; + +// node_modules/filepond-plugin-image-crop/dist/filepond-plugin-image-crop.esm.js +/*! + * FilePondPluginImageCrop 2.0.6 + * Licensed under MIT, https://opensource.org/licenses/MIT/ + * Please visit https://pqina.nl/filepond/ for details. + */ +var isImage = (file2) => /^image/.test(file2.type); +var plugin3 = ({addFilter: addFilter2, utils}) => { + const {Type: Type2, isFile: isFile2, getNumericAspectRatioFromString: getNumericAspectRatioFromString2} = utils; + const allowCrop = (item2, query) => !(!isImage(item2.file) || !query("GET_ALLOW_IMAGE_CROP")); + const isObject2 = (value) => typeof value === "object"; + const isNumber2 = (value) => typeof value === "number"; + const updateCrop = (item2, obj) => item2.setMetadata("crop", Object.assign({}, item2.getMetadata("crop"), obj)); + addFilter2("DID_CREATE_ITEM", (item2, {query}) => { + item2.extend("setImageCrop", (crop) => { + if (!allowCrop(item2, query) || !isObject2(center)) + return; + item2.setMetadata("crop", crop); + return crop; + }); + item2.extend("setImageCropCenter", (center2) => { + if (!allowCrop(item2, query) || !isObject2(center2)) + return; + return updateCrop(item2, {center: center2}); + }); + item2.extend("setImageCropZoom", (zoom) => { + if (!allowCrop(item2, query) || !isNumber2(zoom)) + return; + return updateCrop(item2, {zoom: Math.max(1, zoom)}); + }); + item2.extend("setImageCropRotation", (rotation) => { + if (!allowCrop(item2, query) || !isNumber2(rotation)) + return; + return updateCrop(item2, {rotation}); + }); + item2.extend("setImageCropFlip", (flip) => { + if (!allowCrop(item2, query) || !isObject2(flip)) + return; + return updateCrop(item2, {flip}); + }); + item2.extend("setImageCropAspectRatio", (newAspectRatio) => { + if (!allowCrop(item2, query) || typeof newAspectRatio === "undefined") + return; + const currentCrop = item2.getMetadata("crop"); + const aspectRatio = getNumericAspectRatioFromString2(newAspectRatio); + const newCrop = { + center: { + x: 0.5, + y: 0.5 + }, + flip: currentCrop ? Object.assign({}, currentCrop.flip) : { + horizontal: false, + vertical: false + }, + rotation: 0, + zoom: 1, + aspectRatio + }; + item2.setMetadata("crop", newCrop); + return newCrop; + }); + }); + addFilter2("DID_LOAD_ITEM", (item2, {query}) => new Promise((resolve, reject) => { + const file2 = item2.file; + if (!isFile2(file2) || !isImage(file2) || !query("GET_ALLOW_IMAGE_CROP")) { + return resolve(item2); + } + const crop = item2.getMetadata("crop"); + if (crop) { + return resolve(item2); + } + const humanAspectRatio = query("GET_IMAGE_CROP_ASPECT_RATIO"); + item2.setMetadata("crop", { + center: { + x: 0.5, + y: 0.5 + }, + flip: { + horizontal: false, + vertical: false + }, + rotation: 0, + zoom: 1, + aspectRatio: humanAspectRatio ? getNumericAspectRatioFromString2(humanAspectRatio) : null + }); + resolve(item2); + })); + return { + options: { + allowImageCrop: [true, Type2.BOOLEAN], + imageCropAspectRatio: [null, Type2.STRING] + } + }; +}; +var isBrowser4 = typeof window !== "undefined" && typeof window.document !== "undefined"; +if (isBrowser4) { + document.dispatchEvent(new CustomEvent("FilePond:pluginloaded", {detail: plugin3})); +} +var filepond_plugin_image_crop_esm_default = plugin3; + +// node_modules/filepond-plugin-image-exif-orientation/dist/filepond-plugin-image-exif-orientation.esm.js +/*! + * FilePondPluginImageExifOrientation 1.0.11 + * Licensed under MIT, https://opensource.org/licenses/MIT/ + * Please visit https://pqina.nl/filepond/ for details. + */ +var isJPEG = (file2) => /^image\/jpeg/.test(file2.type); +var Marker = { + JPEG: 65496, + APP1: 65505, + EXIF: 1165519206, + TIFF: 18761, + Orientation: 274, + Unknown: 65280 +}; +var getUint16 = (view, offset, little = false) => view.getUint16(offset, little); +var getUint32 = (view, offset, little = false) => view.getUint32(offset, little); +var getImageOrientation = (file2) => new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.onload = function(e2) { + const view = new DataView(e2.target.result); + if (getUint16(view, 0) !== Marker.JPEG) { + resolve(-1); + return; + } + const length = view.byteLength; + let offset = 2; + while (offset < length) { + const marker = getUint16(view, offset); + offset += 2; + if (marker === Marker.APP1) { + if (getUint32(view, offset += 2) !== Marker.EXIF) { + break; + } + const little = getUint16(view, offset += 6) === Marker.TIFF; + offset += getUint32(view, offset + 4, little); + const tags = getUint16(view, offset, little); + offset += 2; + for (let i = 0; i < tags; i++) { + if (getUint16(view, offset + i * 12, little) === Marker.Orientation) { + resolve(getUint16(view, offset + i * 12 + 8, little)); + return; + } + } + } else if ((marker & Marker.Unknown) !== Marker.Unknown) { + break; + } else { + offset += getUint16(view, offset); + } + } + resolve(-1); + }; + reader.readAsArrayBuffer(file2.slice(0, 64 * 1024)); +}); +var IS_BROWSER2 = (() => typeof window !== "undefined" && typeof window.document !== "undefined")(); +var isBrowser5 = () => IS_BROWSER2; +var testSrc = "data:image/jpg;base64,/9j/4AAQSkZJRgABAQEASABIAAD/4QA6RXhpZgAATU0AKgAAAAgAAwESAAMAAAABAAYAAAEoAAMAAAABAAIAAAITAAMAAAABAAEAAAAAAAD/2wBDAP//////////////////////////////////////////////////////////////////////////////////////wAALCAABAAIBASIA/8QAJgABAAAAAAAAAAAAAAAAAAAAAxABAAAAAAAAAAAAAAAAAAAAAP/aAAgBAQAAPwBH/9k="; +var shouldCorrect = void 0; +var testImage = isBrowser5() ? new Image() : {}; +testImage.onload = () => shouldCorrect = testImage.naturalWidth > testImage.naturalHeight; +testImage.src = testSrc; +var shouldCorrectImageExifOrientation = () => shouldCorrect; +var plugin4 = ({addFilter: addFilter2, utils}) => { + const {Type: Type2, isFile: isFile2} = utils; + addFilter2("DID_LOAD_ITEM", (item2, {query}) => new Promise((resolve, reject) => { + const file2 = item2.file; + if (!isFile2(file2) || !isJPEG(file2) || !query("GET_ALLOW_IMAGE_EXIF_ORIENTATION") || !shouldCorrectImageExifOrientation()) { + return resolve(item2); + } + getImageOrientation(file2).then((orientation) => { + item2.setMetadata("exif", {orientation}); + resolve(item2); + }); + })); + return { + options: { + allowImageExifOrientation: [true, Type2.BOOLEAN] + } + }; +}; +var isBrowser$1 = typeof window !== "undefined" && typeof window.document !== "undefined"; +if (isBrowser$1) { + document.dispatchEvent(new CustomEvent("FilePond:pluginloaded", {detail: plugin4})); +} +var filepond_plugin_image_exif_orientation_esm_default = plugin4; + +// node_modules/filepond-plugin-image-preview/dist/filepond-plugin-image-preview.esm.js +/*! + * FilePondPluginImagePreview 4.6.10 + * Licensed under MIT, https://opensource.org/licenses/MIT/ + * Please visit https://pqina.nl/filepond/ for details. + */ +var isPreviewableImage = (file2) => /^image/.test(file2.type); +var vectorMultiply = (v, amount) => createVector(v.x * amount, v.y * amount); +var vectorAdd = (a2, b) => createVector(a2.x + b.x, a2.y + b.y); +var vectorNormalize = (v) => { + const l = Math.sqrt(v.x * v.x + v.y * v.y); + if (l === 0) { + return { + x: 0, + y: 0 + }; + } + return createVector(v.x / l, v.y / l); +}; +var vectorRotate = (v, radians, origin) => { + const cos = Math.cos(radians); + const sin = Math.sin(radians); + const t2 = createVector(v.x - origin.x, v.y - origin.y); + return createVector(origin.x + cos * t2.x - sin * t2.y, origin.y + sin * t2.x + cos * t2.y); +}; +var createVector = (x = 0, y = 0) => ({x, y}); +var getMarkupValue = (value, size, scalar = 1, axis) => { + if (typeof value === "string") { + return parseFloat(value) * scalar; + } + if (typeof value === "number") { + return value * (axis ? size[axis] : Math.min(size.width, size.height)); + } + return; +}; +var getMarkupStyles = (markup, size, scale) => { + const lineStyle = markup.borderStyle || markup.lineStyle || "solid"; + const fill = markup.backgroundColor || markup.fontColor || "transparent"; + const stroke = markup.borderColor || markup.lineColor || "transparent"; + const strokeWidth = getMarkupValue(markup.borderWidth || markup.lineWidth, size, scale); + const lineCap = markup.lineCap || "round"; + const lineJoin = markup.lineJoin || "round"; + const dashes = typeof lineStyle === "string" ? "" : lineStyle.map((v) => getMarkupValue(v, size, scale)).join(","); + const opacity = markup.opacity || 1; + return { + "stroke-linecap": lineCap, + "stroke-linejoin": lineJoin, + "stroke-width": strokeWidth || 0, + "stroke-dasharray": dashes, + stroke, + fill, + opacity + }; +}; +var isDefined2 = (value) => value != null; +var getMarkupRect = (rect, size, scalar = 1) => { + let left = getMarkupValue(rect.x, size, scalar, "width") || getMarkupValue(rect.left, size, scalar, "width"); + let top = getMarkupValue(rect.y, size, scalar, "height") || getMarkupValue(rect.top, size, scalar, "height"); + let width = getMarkupValue(rect.width, size, scalar, "width"); + let height = getMarkupValue(rect.height, size, scalar, "height"); + let right = getMarkupValue(rect.right, size, scalar, "width"); + let bottom = getMarkupValue(rect.bottom, size, scalar, "height"); + if (!isDefined2(top)) { + if (isDefined2(height) && isDefined2(bottom)) { + top = size.height - height - bottom; + } else { + top = bottom; + } + } + if (!isDefined2(left)) { + if (isDefined2(width) && isDefined2(right)) { + left = size.width - width - right; + } else { + left = right; + } + } + if (!isDefined2(width)) { + if (isDefined2(left) && isDefined2(right)) { + width = size.width - left - right; + } else { + width = 0; + } + } + if (!isDefined2(height)) { + if (isDefined2(top) && isDefined2(bottom)) { + height = size.height - top - bottom; + } else { + height = 0; + } + } + return { + x: left || 0, + y: top || 0, + width: width || 0, + height: height || 0 + }; +}; +var pointsToPathShape = (points) => points.map((point, index2) => `${index2 === 0 ? "M" : "L"} ${point.x} ${point.y}`).join(" "); +var setAttributes = (element, attr2) => Object.keys(attr2).forEach((key) => element.setAttribute(key, attr2[key])); +var ns2 = "http://www.w3.org/2000/svg"; +var svg = (tag, attr2) => { + const element = document.createElementNS(ns2, tag); + if (attr2) { + setAttributes(element, attr2); + } + return element; +}; +var updateRect2 = (element) => setAttributes(element, { + ...element.rect, + ...element.styles +}); +var updateEllipse = (element) => { + const cx = element.rect.x + element.rect.width * 0.5; + const cy = element.rect.y + element.rect.height * 0.5; + const rx = element.rect.width * 0.5; + const ry = element.rect.height * 0.5; + return setAttributes(element, { + cx, + cy, + rx, + ry, + ...element.styles + }); +}; +var IMAGE_FIT_STYLE = { + contain: "xMidYMid meet", + cover: "xMidYMid slice" +}; +var updateImage = (element, markup) => { + setAttributes(element, { + ...element.rect, + ...element.styles, + preserveAspectRatio: IMAGE_FIT_STYLE[markup.fit] || "none" + }); +}; +var TEXT_ANCHOR = { + left: "start", + center: "middle", + right: "end" +}; +var updateText = (element, markup, size, scale) => { + const fontSize = getMarkupValue(markup.fontSize, size, scale); + const fontFamily = markup.fontFamily || "sans-serif"; + const fontWeight = markup.fontWeight || "normal"; + const textAlign = TEXT_ANCHOR[markup.textAlign] || "start"; + setAttributes(element, { + ...element.rect, + ...element.styles, + "stroke-width": 0, + "font-weight": fontWeight, + "font-size": fontSize, + "font-family": fontFamily, + "text-anchor": textAlign + }); + if (element.text !== markup.text) { + element.text = markup.text; + element.textContent = markup.text.length ? markup.text : " "; + } +}; +var updateLine = (element, markup, size, scale) => { + setAttributes(element, { + ...element.rect, + ...element.styles, + fill: "none" + }); + const line = element.childNodes[0]; + const begin = element.childNodes[1]; + const end = element.childNodes[2]; + const origin = element.rect; + const target = { + x: element.rect.x + element.rect.width, + y: element.rect.y + element.rect.height + }; + setAttributes(line, { + x1: origin.x, + y1: origin.y, + x2: target.x, + y2: target.y + }); + if (!markup.lineDecoration) + return; + begin.style.display = "none"; + end.style.display = "none"; + const v = vectorNormalize({ + x: target.x - origin.x, + y: target.y - origin.y + }); + const l = getMarkupValue(0.05, size, scale); + if (markup.lineDecoration.indexOf("arrow-begin") !== -1) { + const arrowBeginRotationPoint = vectorMultiply(v, l); + const arrowBeginCenter = vectorAdd(origin, arrowBeginRotationPoint); + const arrowBeginA = vectorRotate(origin, 2, arrowBeginCenter); + const arrowBeginB = vectorRotate(origin, -2, arrowBeginCenter); + setAttributes(begin, { + style: "display:block;", + d: `M${arrowBeginA.x},${arrowBeginA.y} L${origin.x},${origin.y} L${arrowBeginB.x},${arrowBeginB.y}` + }); + } + if (markup.lineDecoration.indexOf("arrow-end") !== -1) { + const arrowEndRotationPoint = vectorMultiply(v, -l); + const arrowEndCenter = vectorAdd(target, arrowEndRotationPoint); + const arrowEndA = vectorRotate(target, 2, arrowEndCenter); + const arrowEndB = vectorRotate(target, -2, arrowEndCenter); + setAttributes(end, { + style: "display:block;", + d: `M${arrowEndA.x},${arrowEndA.y} L${target.x},${target.y} L${arrowEndB.x},${arrowEndB.y}` + }); + } +}; +var updatePath = (element, markup, size, scale) => { + setAttributes(element, { + ...element.styles, + fill: "none", + d: pointsToPathShape(markup.points.map((point) => ({ + x: getMarkupValue(point.x, size, scale, "width"), + y: getMarkupValue(point.y, size, scale, "height") + }))) + }); +}; +var createShape = (node) => (markup) => svg(node, {id: markup.id}); +var createImage = (markup) => { + const shape = svg("image", { + id: markup.id, + "stroke-linecap": "round", + "stroke-linejoin": "round", + opacity: "0" + }); + shape.onload = () => { + shape.setAttribute("opacity", markup.opacity || 1); + }; + shape.setAttributeNS("http://www.w3.org/1999/xlink", "xlink:href", markup.src); + return shape; +}; +var createLine = (markup) => { + const shape = svg("g", { + id: markup.id, + "stroke-linecap": "round", + "stroke-linejoin": "round" + }); + const line = svg("line"); + shape.appendChild(line); + const begin = svg("path"); + shape.appendChild(begin); + const end = svg("path"); + shape.appendChild(end); + return shape; +}; +var CREATE_TYPE_ROUTES = { + image: createImage, + rect: createShape("rect"), + ellipse: createShape("ellipse"), + text: createShape("text"), + path: createShape("path"), + line: createLine +}; +var UPDATE_TYPE_ROUTES = { + rect: updateRect2, + ellipse: updateEllipse, + image: updateImage, + text: updateText, + path: updatePath, + line: updateLine +}; +var createMarkupByType = (type, markup) => CREATE_TYPE_ROUTES[type](markup); +var updateMarkupByType = (element, type, markup, size, scale) => { + if (type !== "path") { + element.rect = getMarkupRect(markup, size, scale); + } + element.styles = getMarkupStyles(markup, size, scale); + UPDATE_TYPE_ROUTES[type](element, markup, size, scale); +}; +var MARKUP_RECT = [ + "x", + "y", + "left", + "top", + "right", + "bottom", + "width", + "height" +]; +var toOptionalFraction = (value) => typeof value === "string" && /%/.test(value) ? parseFloat(value) / 100 : value; +var prepareMarkup = (markup) => { + const [type, props] = markup; + const rect = props.points ? {} : MARKUP_RECT.reduce((prev, curr) => { + prev[curr] = toOptionalFraction(props[curr]); + return prev; + }, {}); + return [ + type, + { + zIndex: 0, + ...props, + ...rect + } + ]; +}; +var sortMarkupByZIndex = (a2, b) => { + if (a2[1].zIndex > b[1].zIndex) { + return 1; + } + if (a2[1].zIndex < b[1].zIndex) { + return -1; + } + return 0; +}; +var createMarkupView = (_) => _.utils.createView({ + name: "image-preview-markup", + tag: "svg", + ignoreRect: true, + mixins: { + apis: ["width", "height", "crop", "markup", "resize", "dirty"] + }, + write: ({root: root2, props}) => { + if (!props.dirty) + return; + const {crop, resize, markup} = props; + const viewWidth = props.width; + const viewHeight = props.height; + let cropWidth = crop.width; + let cropHeight = crop.height; + if (resize) { + const {size: size2} = resize; + let outputWidth = size2 && size2.width; + let outputHeight = size2 && size2.height; + const outputFit = resize.mode; + const outputUpscale = resize.upscale; + if (outputWidth && !outputHeight) + outputHeight = outputWidth; + if (outputHeight && !outputWidth) + outputWidth = outputHeight; + const shouldUpscale = cropWidth < outputWidth && cropHeight < outputHeight; + if (!shouldUpscale || shouldUpscale && outputUpscale) { + let scalarWidth = outputWidth / cropWidth; + let scalarHeight = outputHeight / cropHeight; + if (outputFit === "force") { + cropWidth = outputWidth; + cropHeight = outputHeight; + } else { + let scalar; + if (outputFit === "cover") { + scalar = Math.max(scalarWidth, scalarHeight); + } else if (outputFit === "contain") { + scalar = Math.min(scalarWidth, scalarHeight); + } + cropWidth = cropWidth * scalar; + cropHeight = cropHeight * scalar; + } + } + } + const size = { + width: viewWidth, + height: viewHeight + }; + root2.element.setAttribute("width", size.width); + root2.element.setAttribute("height", size.height); + const scale = Math.min(viewWidth / cropWidth, viewHeight / cropHeight); + root2.element.innerHTML = ""; + const markupFilter = root2.query("GET_IMAGE_PREVIEW_MARKUP_FILTER"); + markup.filter(markupFilter).map(prepareMarkup).sort(sortMarkupByZIndex).forEach((markup2) => { + const [type, settings] = markup2; + const element = createMarkupByType(type, settings); + updateMarkupByType(element, type, settings, size, scale); + root2.element.appendChild(element); + }); + } +}); +var createVector$1 = (x, y) => ({x, y}); +var vectorDot = (a2, b) => a2.x * b.x + a2.y * b.y; +var vectorSubtract = (a2, b) => createVector$1(a2.x - b.x, a2.y - b.y); +var vectorDistanceSquared = (a2, b) => vectorDot(vectorSubtract(a2, b), vectorSubtract(a2, b)); +var vectorDistance = (a2, b) => Math.sqrt(vectorDistanceSquared(a2, b)); +var getOffsetPointOnEdge = (length, rotation) => { + const a2 = length; + const A = 1.5707963267948966; + const B = rotation; + const C3 = 1.5707963267948966 - rotation; + const sinA = Math.sin(A); + const sinB = Math.sin(B); + const sinC = Math.sin(C3); + const cosC = Math.cos(C3); + const ratio = a2 / sinA; + const b = ratio * sinB; + const c2 = ratio * sinC; + return createVector$1(cosC * b, cosC * c2); +}; +var getRotatedRectSize = (rect, rotation) => { + const w = rect.width; + const h = rect.height; + const hor = getOffsetPointOnEdge(w, rotation); + const ver = getOffsetPointOnEdge(h, rotation); + const tl = createVector$1(rect.x + Math.abs(hor.x), rect.y - Math.abs(hor.y)); + const tr = createVector$1(rect.x + rect.width + Math.abs(ver.y), rect.y + Math.abs(ver.x)); + const bl = createVector$1(rect.x - Math.abs(ver.y), rect.y + rect.height - Math.abs(ver.x)); + return { + width: vectorDistance(tl, tr), + height: vectorDistance(tl, bl) + }; +}; +var calculateCanvasSize = (image, canvasAspectRatio, zoom = 1) => { + const imageAspectRatio = image.height / image.width; + let canvasWidth = 1; + let canvasHeight = canvasAspectRatio; + let imgWidth = 1; + let imgHeight = imageAspectRatio; + if (imgHeight > canvasHeight) { + imgHeight = canvasHeight; + imgWidth = imgHeight / imageAspectRatio; + } + const scalar = Math.max(canvasWidth / imgWidth, canvasHeight / imgHeight); + const width = image.width / (zoom * scalar * imgWidth); + const height = width * canvasAspectRatio; + return { + width, + height + }; +}; +var getImageRectZoomFactor = (imageRect, cropRect, rotation, center2) => { + const cx = center2.x > 0.5 ? 1 - center2.x : center2.x; + const cy = center2.y > 0.5 ? 1 - center2.y : center2.y; + const imageWidth = cx * 2 * imageRect.width; + const imageHeight = cy * 2 * imageRect.height; + const rotatedCropSize = getRotatedRectSize(cropRect, rotation); + return Math.max(rotatedCropSize.width / imageWidth, rotatedCropSize.height / imageHeight); +}; +var getCenteredCropRect = (container, aspectRatio) => { + let width = container.width; + let height = width * aspectRatio; + if (height > container.height) { + height = container.height; + width = height / aspectRatio; + } + const x = (container.width - width) * 0.5; + const y = (container.height - height) * 0.5; + return { + x, + y, + width, + height + }; +}; +var getCurrentCropSize = (imageSize, crop = {}) => { + let {zoom, rotation, center: center2, aspectRatio} = crop; + if (!aspectRatio) + aspectRatio = imageSize.height / imageSize.width; + const canvasSize = calculateCanvasSize(imageSize, aspectRatio, zoom); + const canvasCenter = { + x: canvasSize.width * 0.5, + y: canvasSize.height * 0.5 + }; + const stage = { + x: 0, + y: 0, + width: canvasSize.width, + height: canvasSize.height, + center: canvasCenter + }; + const shouldLimit = typeof crop.scaleToFit === "undefined" || crop.scaleToFit; + const stageZoomFactor = getImageRectZoomFactor(imageSize, getCenteredCropRect(stage, aspectRatio), rotation, shouldLimit ? center2 : {x: 0.5, y: 0.5}); + const scale = zoom * stageZoomFactor; + return { + widthFloat: canvasSize.width / scale, + heightFloat: canvasSize.height / scale, + width: Math.round(canvasSize.width / scale), + height: Math.round(canvasSize.height / scale) + }; +}; +var IMAGE_SCALE_SPRING_PROPS = { + type: "spring", + stiffness: 0.5, + damping: 0.45, + mass: 10 +}; +var createBitmapView = (_) => _.utils.createView({ + name: "image-bitmap", + ignoreRect: true, + mixins: {styles: ["scaleX", "scaleY"]}, + create: ({root: root2, props}) => { + root2.appendChild(props.image); + } +}); +var createImageCanvasWrapper = (_) => _.utils.createView({ + name: "image-canvas-wrapper", + tag: "div", + ignoreRect: true, + mixins: { + apis: ["crop", "width", "height"], + styles: [ + "originX", + "originY", + "translateX", + "translateY", + "scaleX", + "scaleY", + "rotateZ" + ], + animations: { + originX: IMAGE_SCALE_SPRING_PROPS, + originY: IMAGE_SCALE_SPRING_PROPS, + scaleX: IMAGE_SCALE_SPRING_PROPS, + scaleY: IMAGE_SCALE_SPRING_PROPS, + translateX: IMAGE_SCALE_SPRING_PROPS, + translateY: IMAGE_SCALE_SPRING_PROPS, + rotateZ: IMAGE_SCALE_SPRING_PROPS + } + }, + create: ({root: root2, props}) => { + props.width = props.image.width; + props.height = props.image.height; + root2.ref.bitmap = root2.appendChildView(root2.createChildView(createBitmapView(_), {image: props.image})); + }, + write: ({root: root2, props}) => { + const {flip} = props.crop; + const {bitmap} = root2.ref; + bitmap.scaleX = flip.horizontal ? -1 : 1; + bitmap.scaleY = flip.vertical ? -1 : 1; + } +}); +var createClipView = (_) => _.utils.createView({ + name: "image-clip", + tag: "div", + ignoreRect: true, + mixins: { + apis: [ + "crop", + "markup", + "resize", + "width", + "height", + "dirty", + "background" + ], + styles: ["width", "height", "opacity"], + animations: { + opacity: {type: "tween", duration: 250} + } + }, + didWriteView: function({root: root2, props}) { + if (!props.background) + return; + root2.element.style.backgroundColor = props.background; + }, + create: ({root: root2, props}) => { + root2.ref.image = root2.appendChildView(root2.createChildView(createImageCanvasWrapper(_), Object.assign({}, props))); + root2.ref.createMarkup = () => { + if (root2.ref.markup) + return; + root2.ref.markup = root2.appendChildView(root2.createChildView(createMarkupView(_), Object.assign({}, props))); + }; + root2.ref.destroyMarkup = () => { + if (!root2.ref.markup) + return; + root2.removeChildView(root2.ref.markup); + root2.ref.markup = null; + }; + const transparencyIndicator = root2.query("GET_IMAGE_PREVIEW_TRANSPARENCY_INDICATOR"); + if (transparencyIndicator === null) + return; + if (transparencyIndicator === "grid") { + root2.element.dataset.transparencyIndicator = transparencyIndicator; + } else { + root2.element.dataset.transparencyIndicator = "color"; + } + }, + write: ({root: root2, props, shouldOptimize}) => { + const {crop, markup, resize, dirty, width, height} = props; + root2.ref.image.crop = crop; + const stage = { + x: 0, + y: 0, + width, + height, + center: { + x: width * 0.5, + y: height * 0.5 + } + }; + const image = { + width: root2.ref.image.width, + height: root2.ref.image.height + }; + const origin = { + x: crop.center.x * image.width, + y: crop.center.y * image.height + }; + const translation = { + x: stage.center.x - image.width * crop.center.x, + y: stage.center.y - image.height * crop.center.y + }; + const rotation = Math.PI * 2 + crop.rotation % (Math.PI * 2); + const cropAspectRatio = crop.aspectRatio || image.height / image.width; + const shouldLimit = typeof crop.scaleToFit === "undefined" || crop.scaleToFit; + const stageZoomFactor = getImageRectZoomFactor(image, getCenteredCropRect(stage, cropAspectRatio), rotation, shouldLimit ? crop.center : {x: 0.5, y: 0.5}); + const scale = crop.zoom * stageZoomFactor; + if (markup && markup.length) { + root2.ref.createMarkup(); + root2.ref.markup.width = width; + root2.ref.markup.height = height; + root2.ref.markup.resize = resize; + root2.ref.markup.dirty = dirty; + root2.ref.markup.markup = markup; + root2.ref.markup.crop = getCurrentCropSize(image, crop); + } else if (root2.ref.markup) { + root2.ref.destroyMarkup(); + } + const imageView = root2.ref.image; + if (shouldOptimize) { + imageView.originX = null; + imageView.originY = null; + imageView.translateX = null; + imageView.translateY = null; + imageView.rotateZ = null; + imageView.scaleX = null; + imageView.scaleY = null; + return; + } + imageView.originX = origin.x; + imageView.originY = origin.y; + imageView.translateX = translation.x; + imageView.translateY = translation.y; + imageView.rotateZ = rotation; + imageView.scaleX = scale; + imageView.scaleY = scale; + } +}); +var createImageView = (_) => _.utils.createView({ + name: "image-preview", + tag: "div", + ignoreRect: true, + mixins: { + apis: ["image", "crop", "markup", "resize", "dirty", "background"], + styles: ["translateY", "scaleX", "scaleY", "opacity"], + animations: { + scaleX: IMAGE_SCALE_SPRING_PROPS, + scaleY: IMAGE_SCALE_SPRING_PROPS, + translateY: IMAGE_SCALE_SPRING_PROPS, + opacity: {type: "tween", duration: 400} + } + }, + create: ({root: root2, props}) => { + root2.ref.clip = root2.appendChildView(root2.createChildView(createClipView(_), { + id: props.id, + image: props.image, + crop: props.crop, + markup: props.markup, + resize: props.resize, + dirty: props.dirty, + background: props.background + })); + }, + write: ({root: root2, props, shouldOptimize}) => { + const {clip} = root2.ref; + const {image, crop, markup, resize, dirty} = props; + clip.crop = crop; + clip.markup = markup; + clip.resize = resize; + clip.dirty = dirty; + clip.opacity = shouldOptimize ? 0 : 1; + if (shouldOptimize || root2.rect.element.hidden) + return; + const imageAspectRatio = image.height / image.width; + let aspectRatio = crop.aspectRatio || imageAspectRatio; + const containerWidth = root2.rect.inner.width; + const containerHeight = root2.rect.inner.height; + let fixedPreviewHeight = root2.query("GET_IMAGE_PREVIEW_HEIGHT"); + const minPreviewHeight = root2.query("GET_IMAGE_PREVIEW_MIN_HEIGHT"); + const maxPreviewHeight = root2.query("GET_IMAGE_PREVIEW_MAX_HEIGHT"); + const panelAspectRatio = root2.query("GET_PANEL_ASPECT_RATIO"); + const allowMultiple = root2.query("GET_ALLOW_MULTIPLE"); + if (panelAspectRatio && !allowMultiple) { + fixedPreviewHeight = containerWidth * panelAspectRatio; + aspectRatio = panelAspectRatio; + } + let clipHeight = fixedPreviewHeight !== null ? fixedPreviewHeight : Math.max(minPreviewHeight, Math.min(containerWidth * aspectRatio, maxPreviewHeight)); + let clipWidth = clipHeight / aspectRatio; + if (clipWidth > containerWidth) { + clipWidth = containerWidth; + clipHeight = clipWidth * aspectRatio; + } + if (clipHeight > containerHeight) { + clipHeight = containerHeight; + clipWidth = containerHeight / aspectRatio; + } + clip.width = clipWidth; + clip.height = clipHeight; + } +}); +var SVG_MASK = ` + + + + + + + + + + + + + + + + + +`; +var SVGMaskUniqueId = 0; +var createImageOverlayView = (fpAPI) => fpAPI.utils.createView({ + name: "image-preview-overlay", + tag: "div", + ignoreRect: true, + create: ({root: root2, props}) => { + let mask = SVG_MASK; + if (document.querySelector("base")) { + const url = window.location.href.replace(window.location.hash, ""); + mask = mask.replace(/url\(\#/g, "url(" + url + "#"); + } + SVGMaskUniqueId++; + root2.element.classList.add(`filepond--image-preview-overlay-${props.status}`); + root2.element.innerHTML = mask.replace(/__UID__/g, SVGMaskUniqueId); + }, + mixins: { + styles: ["opacity"], + animations: { + opacity: {type: "spring", mass: 25} + } + } +}); +var BitmapWorker = function() { + self.onmessage = (e2) => { + createImageBitmap(e2.data.message.file).then((bitmap) => { + self.postMessage({id: e2.data.id, message: bitmap}, [bitmap]); + }); + }; +}; +var ColorMatrixWorker = function() { + self.onmessage = (e2) => { + const imageData = e2.data.message.imageData; + const matrix2 = e2.data.message.colorMatrix; + const data3 = imageData.data; + const l = data3.length; + const m11 = matrix2[0]; + const m12 = matrix2[1]; + const m13 = matrix2[2]; + const m14 = matrix2[3]; + const m15 = matrix2[4]; + const m21 = matrix2[5]; + const m22 = matrix2[6]; + const m23 = matrix2[7]; + const m24 = matrix2[8]; + const m25 = matrix2[9]; + const m31 = matrix2[10]; + const m32 = matrix2[11]; + const m33 = matrix2[12]; + const m34 = matrix2[13]; + const m35 = matrix2[14]; + const m41 = matrix2[15]; + const m42 = matrix2[16]; + const m43 = matrix2[17]; + const m44 = matrix2[18]; + const m45 = matrix2[19]; + let index2 = 0, r2 = 0, g = 0, b = 0, a2 = 0; + for (; index2 < l; index2 += 4) { + r2 = data3[index2] / 255; + g = data3[index2 + 1] / 255; + b = data3[index2 + 2] / 255; + a2 = data3[index2 + 3] / 255; + data3[index2] = Math.max(0, Math.min((r2 * m11 + g * m12 + b * m13 + a2 * m14 + m15) * 255, 255)); + data3[index2 + 1] = Math.max(0, Math.min((r2 * m21 + g * m22 + b * m23 + a2 * m24 + m25) * 255, 255)); + data3[index2 + 2] = Math.max(0, Math.min((r2 * m31 + g * m32 + b * m33 + a2 * m34 + m35) * 255, 255)); + data3[index2 + 3] = Math.max(0, Math.min((r2 * m41 + g * m42 + b * m43 + a2 * m44 + m45) * 255, 255)); + } + self.postMessage({id: e2.data.id, message: imageData}, [ + imageData.data.buffer + ]); + }; +}; +var getImageSize = (url, cb) => { + let image = new Image(); + image.onload = () => { + const width = image.naturalWidth; + const height = image.naturalHeight; + image = null; + cb(width, height); + }; + image.src = url; +}; +var transforms = { + 1: () => [1, 0, 0, 1, 0, 0], + 2: (width) => [-1, 0, 0, 1, width, 0], + 3: (width, height) => [-1, 0, 0, -1, width, height], + 4: (width, height) => [1, 0, 0, -1, 0, height], + 5: () => [0, 1, 1, 0, 0, 0], + 6: (width, height) => [0, 1, -1, 0, height, 0], + 7: (width, height) => [0, -1, -1, 0, height, width], + 8: (width) => [0, -1, 1, 0, 0, width] +}; +var fixImageOrientation = (ctx, width, height, orientation) => { + if (orientation === -1) { + return; + } + ctx.transform.apply(ctx, transforms[orientation](width, height)); +}; +var createPreviewImage = (data3, width, height, orientation) => { + width = Math.round(width); + height = Math.round(height); + const canvas = document.createElement("canvas"); + canvas.width = width; + canvas.height = height; + const ctx = canvas.getContext("2d"); + if (orientation >= 5 && orientation <= 8) { + [width, height] = [height, width]; + } + fixImageOrientation(ctx, width, height, orientation); + ctx.drawImage(data3, 0, 0, width, height); + return canvas; +}; +var isBitmap = (file2) => /^image/.test(file2.type) && !/svg/.test(file2.type); +var MAX_WIDTH = 10; +var MAX_HEIGHT = 10; +var calculateAverageColor = (image) => { + const scalar = Math.min(MAX_WIDTH / image.width, MAX_HEIGHT / image.height); + const canvas = document.createElement("canvas"); + const ctx = canvas.getContext("2d"); + const width = canvas.width = Math.ceil(image.width * scalar); + const height = canvas.height = Math.ceil(image.height * scalar); + ctx.drawImage(image, 0, 0, width, height); + let data3 = null; + try { + data3 = ctx.getImageData(0, 0, width, height).data; + } catch (e2) { + return null; + } + const l = data3.length; + let r2 = 0; + let g = 0; + let b = 0; + let i = 0; + for (; i < l; i += 4) { + r2 += data3[i] * data3[i]; + g += data3[i + 1] * data3[i + 1]; + b += data3[i + 2] * data3[i + 2]; + } + r2 = averageColor(r2, l); + g = averageColor(g, l); + b = averageColor(b, l); + return {r: r2, g, b}; +}; +var averageColor = (c2, l) => Math.floor(Math.sqrt(c2 / (l / 4))); +var cloneCanvas = (origin, target) => { + target = target || document.createElement("canvas"); + target.width = origin.width; + target.height = origin.height; + const ctx = target.getContext("2d"); + ctx.drawImage(origin, 0, 0); + return target; +}; +var cloneImageData = (imageData) => { + let id; + try { + id = new ImageData(imageData.width, imageData.height); + } catch (e2) { + const canvas = document.createElement("canvas"); + const ctx = canvas.getContext("2d"); + id = ctx.createImageData(imageData.width, imageData.height); + } + id.data.set(new Uint8ClampedArray(imageData.data)); + return id; +}; +var loadImage2 = (url) => new Promise((resolve, reject) => { + const img = new Image(); + img.crossOrigin = "Anonymous"; + img.onload = () => { + resolve(img); + }; + img.onerror = (e2) => { + reject(e2); + }; + img.src = url; +}); +var createImageWrapperView = (_) => { + const OverlayView = createImageOverlayView(_); + const ImageView = createImageView(_); + const {createWorker: createWorker3} = _.utils; + const applyFilter = (root2, filter, target) => new Promise((resolve) => { + if (!root2.ref.imageData) { + root2.ref.imageData = target.getContext("2d").getImageData(0, 0, target.width, target.height); + } + const imageData = cloneImageData(root2.ref.imageData); + if (!filter || filter.length !== 20) { + target.getContext("2d").putImageData(imageData, 0, 0); + return resolve(); + } + const worker = createWorker3(ColorMatrixWorker); + worker.post({ + imageData, + colorMatrix: filter + }, (response) => { + target.getContext("2d").putImageData(response, 0, 0); + worker.terminate(); + resolve(); + }, [imageData.data.buffer]); + }); + const removeImageView = (root2, imageView) => { + root2.removeChildView(imageView); + imageView.image.width = 1; + imageView.image.height = 1; + imageView._destroy(); + }; + const shiftImage = ({root: root2}) => { + const imageView = root2.ref.images.shift(); + imageView.opacity = 0; + imageView.translateY = -15; + root2.ref.imageViewBin.push(imageView); + return imageView; + }; + const pushImage = ({root: root2, props, image}) => { + const id = props.id; + const item2 = root2.query("GET_ITEM", {id}); + if (!item2) + return; + const crop = item2.getMetadata("crop") || { + center: { + x: 0.5, + y: 0.5 + }, + flip: { + horizontal: false, + vertical: false + }, + zoom: 1, + rotation: 0, + aspectRatio: null + }; + const background = root2.query("GET_IMAGE_TRANSFORM_CANVAS_BACKGROUND_COLOR"); + let markup; + let resize; + let dirty = false; + if (root2.query("GET_IMAGE_PREVIEW_MARKUP_SHOW")) { + markup = item2.getMetadata("markup") || []; + resize = item2.getMetadata("resize"); + dirty = true; + } + const imageView = root2.appendChildView(root2.createChildView(ImageView, { + id, + image, + crop, + resize, + markup, + dirty, + background, + opacity: 0, + scaleX: 1.15, + scaleY: 1.15, + translateY: 15 + }), root2.childViews.length); + root2.ref.images.push(imageView); + imageView.opacity = 1; + imageView.scaleX = 1; + imageView.scaleY = 1; + imageView.translateY = 0; + setTimeout(() => { + root2.dispatch("DID_IMAGE_PREVIEW_SHOW", {id}); + }, 250); + }; + const updateImage3 = ({root: root2, props}) => { + const item2 = root2.query("GET_ITEM", {id: props.id}); + if (!item2) + return; + const imageView = root2.ref.images[root2.ref.images.length - 1]; + imageView.crop = item2.getMetadata("crop"); + imageView.background = root2.query("GET_IMAGE_TRANSFORM_CANVAS_BACKGROUND_COLOR"); + if (root2.query("GET_IMAGE_PREVIEW_MARKUP_SHOW")) { + imageView.dirty = true; + imageView.resize = item2.getMetadata("resize"); + imageView.markup = item2.getMetadata("markup"); + } + }; + const didUpdateItemMetadata = ({root: root2, props, action}) => { + if (!/crop|filter|markup|resize/.test(action.change.key)) + return; + if (!root2.ref.images.length) + return; + const item2 = root2.query("GET_ITEM", {id: props.id}); + if (!item2) + return; + if (/filter/.test(action.change.key)) { + const imageView = root2.ref.images[root2.ref.images.length - 1]; + applyFilter(root2, action.change.value, imageView.image); + return; + } + if (/crop|markup|resize/.test(action.change.key)) { + const crop = item2.getMetadata("crop"); + const image = root2.ref.images[root2.ref.images.length - 1]; + if (crop && crop.aspectRatio && image.crop && image.crop.aspectRatio && Math.abs(crop.aspectRatio - image.crop.aspectRatio) > 1e-5) { + const imageView = shiftImage({root: root2}); + pushImage({root: root2, props, image: cloneCanvas(imageView.image)}); + } else { + updateImage3({root: root2, props}); + } + } + }; + const canCreateImageBitmap = (file2) => { + const userAgent2 = window.navigator.userAgent; + const isFirefox = userAgent2.match(/Firefox\/([0-9]+)\./); + const firefoxVersion = isFirefox ? parseInt(isFirefox[1]) : null; + if (firefoxVersion <= 58) + return false; + return "createImageBitmap" in window && isBitmap(file2); + }; + const didCreatePreviewContainer = ({root: root2, props}) => { + const {id} = props; + const item2 = root2.query("GET_ITEM", id); + if (!item2) + return; + const fileURL = URL.createObjectURL(item2.file); + getImageSize(fileURL, (width, height) => { + root2.dispatch("DID_IMAGE_PREVIEW_CALCULATE_SIZE", { + id, + width, + height + }); + }); + }; + const drawPreview = ({root: root2, props}) => { + const {id} = props; + const item2 = root2.query("GET_ITEM", id); + if (!item2) + return; + const fileURL = URL.createObjectURL(item2.file); + const loadPreviewFallback = () => { + loadImage2(fileURL).then(previewImageLoaded); + }; + const previewImageLoaded = (imageData) => { + URL.revokeObjectURL(fileURL); + const exif = item2.getMetadata("exif") || {}; + const orientation = exif.orientation || -1; + let {width, height} = imageData; + if (!width || !height) + return; + if (orientation >= 5 && orientation <= 8) { + [width, height] = [height, width]; + } + const pixelDensityFactor = Math.max(1, window.devicePixelRatio * 0.75); + const zoomFactor = root2.query("GET_IMAGE_PREVIEW_ZOOM_FACTOR"); + const scaleFactor = zoomFactor * pixelDensityFactor; + const previewImageRatio = height / width; + const previewContainerWidth = root2.rect.element.width; + const previewContainerHeight = root2.rect.element.height; + let imageWidth = previewContainerWidth; + let imageHeight = imageWidth * previewImageRatio; + if (previewImageRatio > 1) { + imageWidth = Math.min(width, previewContainerWidth * scaleFactor); + imageHeight = imageWidth * previewImageRatio; + } else { + imageHeight = Math.min(height, previewContainerHeight * scaleFactor); + imageWidth = imageHeight / previewImageRatio; + } + const previewImage = createPreviewImage(imageData, imageWidth, imageHeight, orientation); + const done = () => { + const averageColor2 = root2.query("GET_IMAGE_PREVIEW_CALCULATE_AVERAGE_IMAGE_COLOR") ? calculateAverageColor(data) : null; + item2.setMetadata("color", averageColor2, true); + if ("close" in imageData) { + imageData.close(); + } + root2.ref.overlayShadow.opacity = 1; + pushImage({root: root2, props, image: previewImage}); + }; + const filter = item2.getMetadata("filter"); + if (filter) { + applyFilter(root2, filter, previewImage).then(done); + } else { + done(); + } + }; + if (canCreateImageBitmap(item2.file)) { + const worker = createWorker3(BitmapWorker); + worker.post({ + file: item2.file + }, (imageBitmap) => { + worker.terminate(); + if (!imageBitmap) { + loadPreviewFallback(); + return; + } + previewImageLoaded(imageBitmap); + }); + } else { + loadPreviewFallback(); + } + }; + const didDrawPreview = ({root: root2}) => { + const image = root2.ref.images[root2.ref.images.length - 1]; + image.translateY = 0; + image.scaleX = 1; + image.scaleY = 1; + image.opacity = 1; + }; + const restoreOverlay = ({root: root2}) => { + root2.ref.overlayShadow.opacity = 1; + root2.ref.overlayError.opacity = 0; + root2.ref.overlaySuccess.opacity = 0; + }; + const didThrowError = ({root: root2}) => { + root2.ref.overlayShadow.opacity = 0.25; + root2.ref.overlayError.opacity = 1; + }; + const didCompleteProcessing = ({root: root2}) => { + root2.ref.overlayShadow.opacity = 0.25; + root2.ref.overlaySuccess.opacity = 1; + }; + const create2 = ({root: root2}) => { + root2.ref.images = []; + root2.ref.imageData = null; + root2.ref.imageViewBin = []; + root2.ref.overlayShadow = root2.appendChildView(root2.createChildView(OverlayView, { + opacity: 0, + status: "idle" + })); + root2.ref.overlaySuccess = root2.appendChildView(root2.createChildView(OverlayView, { + opacity: 0, + status: "success" + })); + root2.ref.overlayError = root2.appendChildView(root2.createChildView(OverlayView, { + opacity: 0, + status: "failure" + })); + }; + return _.utils.createView({ + name: "image-preview-wrapper", + create: create2, + styles: ["height"], + apis: ["height"], + destroy: ({root: root2}) => { + root2.ref.images.forEach((imageView) => { + imageView.image.width = 1; + imageView.image.height = 1; + }); + }, + didWriteView: ({root: root2}) => { + root2.ref.images.forEach((imageView) => { + imageView.dirty = false; + }); + }, + write: _.utils.createRoute({ + DID_IMAGE_PREVIEW_DRAW: didDrawPreview, + DID_IMAGE_PREVIEW_CONTAINER_CREATE: didCreatePreviewContainer, + DID_FINISH_CALCULATE_PREVIEWSIZE: drawPreview, + DID_UPDATE_ITEM_METADATA: didUpdateItemMetadata, + DID_THROW_ITEM_LOAD_ERROR: didThrowError, + DID_THROW_ITEM_PROCESSING_ERROR: didThrowError, + DID_THROW_ITEM_INVALID: didThrowError, + DID_COMPLETE_ITEM_PROCESSING: didCompleteProcessing, + DID_START_ITEM_PROCESSING: restoreOverlay, + DID_REVERT_ITEM_PROCESSING: restoreOverlay + }, ({root: root2}) => { + const viewsToRemove = root2.ref.imageViewBin.filter((imageView) => imageView.opacity === 0); + root2.ref.imageViewBin = root2.ref.imageViewBin.filter((imageView) => imageView.opacity > 0); + viewsToRemove.forEach((imageView) => removeImageView(root2, imageView)); + viewsToRemove.length = 0; + }) + }); +}; +var plugin5 = (fpAPI) => { + const {addFilter: addFilter2, utils} = fpAPI; + const {Type: Type2, createRoute: createRoute2, isFile: isFile2} = utils; + const imagePreviewView = createImageWrapperView(fpAPI); + addFilter2("CREATE_VIEW", (viewAPI) => { + const {is: is2, view, query} = viewAPI; + if (!is2("file") || !query("GET_ALLOW_IMAGE_PREVIEW")) + return; + const didLoadItem2 = ({root: root2, props}) => { + const {id} = props; + const item2 = query("GET_ITEM", id); + if (!item2 || !isFile2(item2.file) || item2.archived) + return; + const file2 = item2.file; + if (!isPreviewableImage(file2)) + return; + if (!query("GET_IMAGE_PREVIEW_FILTER_ITEM")(item2)) + return; + const supportsCreateImageBitmap = "createImageBitmap" in (window || {}); + const maxPreviewFileSize = query("GET_IMAGE_PREVIEW_MAX_FILE_SIZE"); + if (!supportsCreateImageBitmap && (maxPreviewFileSize && file2.size > maxPreviewFileSize)) + return; + root2.ref.imagePreview = view.appendChildView(view.createChildView(imagePreviewView, {id})); + const fixedPreviewHeight = root2.query("GET_IMAGE_PREVIEW_HEIGHT"); + if (fixedPreviewHeight) { + root2.dispatch("DID_UPDATE_PANEL_HEIGHT", { + id: item2.id, + height: fixedPreviewHeight + }); + } + const queue = !supportsCreateImageBitmap && file2.size > query("GET_IMAGE_PREVIEW_MAX_INSTANT_PREVIEW_FILE_SIZE"); + root2.dispatch("DID_IMAGE_PREVIEW_CONTAINER_CREATE", {id}, queue); + }; + const rescaleItem = (root2, props) => { + if (!root2.ref.imagePreview) + return; + let {id} = props; + const item2 = root2.query("GET_ITEM", {id}); + if (!item2) + return; + const panelAspectRatio = root2.query("GET_PANEL_ASPECT_RATIO"); + const itemPanelAspectRatio = root2.query("GET_ITEM_PANEL_ASPECT_RATIO"); + const fixedHeight = root2.query("GET_IMAGE_PREVIEW_HEIGHT"); + if (panelAspectRatio || itemPanelAspectRatio || fixedHeight) + return; + let {imageWidth, imageHeight} = root2.ref; + if (!imageWidth || !imageHeight) + return; + const minPreviewHeight = root2.query("GET_IMAGE_PREVIEW_MIN_HEIGHT"); + const maxPreviewHeight = root2.query("GET_IMAGE_PREVIEW_MAX_HEIGHT"); + const exif = item2.getMetadata("exif") || {}; + const orientation = exif.orientation || -1; + if (orientation >= 5 && orientation <= 8) + [imageWidth, imageHeight] = [imageHeight, imageWidth]; + if (!isBitmap(item2.file) || root2.query("GET_IMAGE_PREVIEW_UPSCALE")) { + const scalar = 2048 / imageWidth; + imageWidth *= scalar; + imageHeight *= scalar; + } + const imageAspectRatio = imageHeight / imageWidth; + const previewAspectRatio = (item2.getMetadata("crop") || {}).aspectRatio || imageAspectRatio; + let previewHeightMax = Math.max(minPreviewHeight, Math.min(imageHeight, maxPreviewHeight)); + const itemWidth = root2.rect.element.width; + const previewHeight = Math.min(itemWidth * previewAspectRatio, previewHeightMax); + root2.dispatch("DID_UPDATE_PANEL_HEIGHT", { + id: item2.id, + height: previewHeight + }); + }; + const didResizeView = ({root: root2}) => { + root2.ref.shouldRescale = true; + }; + const didUpdateItemMetadata = ({root: root2, action}) => { + if (action.change.key !== "crop") + return; + root2.ref.shouldRescale = true; + }; + const didCalculatePreviewSize = ({root: root2, action}) => { + root2.ref.imageWidth = action.width; + root2.ref.imageHeight = action.height; + root2.ref.shouldRescale = true; + root2.ref.shouldDrawPreview = true; + root2.dispatch("KICK"); + }; + view.registerWriter(createRoute2({ + DID_RESIZE_ROOT: didResizeView, + DID_STOP_RESIZE: didResizeView, + DID_LOAD_ITEM: didLoadItem2, + DID_IMAGE_PREVIEW_CALCULATE_SIZE: didCalculatePreviewSize, + DID_UPDATE_ITEM_METADATA: didUpdateItemMetadata + }, ({root: root2, props}) => { + if (!root2.ref.imagePreview) + return; + if (root2.rect.element.hidden) + return; + if (root2.ref.shouldRescale) { + rescaleItem(root2, props); + root2.ref.shouldRescale = false; + } + if (root2.ref.shouldDrawPreview) { + requestAnimationFrame(() => { + requestAnimationFrame(() => { + root2.dispatch("DID_FINISH_CALCULATE_PREVIEWSIZE", { + id: props.id + }); + }); + }); + root2.ref.shouldDrawPreview = false; + } + })); + }); + return { + options: { + allowImagePreview: [true, Type2.BOOLEAN], + imagePreviewFilterItem: [() => true, Type2.FUNCTION], + imagePreviewHeight: [null, Type2.INT], + imagePreviewMinHeight: [44, Type2.INT], + imagePreviewMaxHeight: [256, Type2.INT], + imagePreviewMaxFileSize: [null, Type2.INT], + imagePreviewZoomFactor: [2, Type2.INT], + imagePreviewUpscale: [false, Type2.BOOLEAN], + imagePreviewMaxInstantPreviewFileSize: [1e6, Type2.INT], + imagePreviewTransparencyIndicator: [null, Type2.STRING], + imagePreviewCalculateAverageImageColor: [false, Type2.BOOLEAN], + imagePreviewMarkupShow: [true, Type2.BOOLEAN], + imagePreviewMarkupFilter: [() => true, Type2.FUNCTION] + } + }; +}; +var isBrowser6 = typeof window !== "undefined" && typeof window.document !== "undefined"; +if (isBrowser6) { + document.dispatchEvent(new CustomEvent("FilePond:pluginloaded", {detail: plugin5})); +} +var filepond_plugin_image_preview_esm_default = plugin5; + +// node_modules/filepond-plugin-image-resize/dist/filepond-plugin-image-resize.esm.js +/*! + * FilePondPluginImageResize 2.0.10 + * Licensed under MIT, https://opensource.org/licenses/MIT/ + * Please visit https://pqina.nl/filepond/ for details. + */ +var isImage2 = (file2) => /^image/.test(file2.type); +var getImageSize2 = (url, cb) => { + let image = new Image(); + image.onload = () => { + const width = image.naturalWidth; + const height = image.naturalHeight; + image = null; + cb({width, height}); + }; + image.onerror = () => cb(null); + image.src = url; +}; +var plugin6 = ({addFilter: addFilter2, utils}) => { + const {Type: Type2} = utils; + addFilter2("DID_LOAD_ITEM", (item2, {query}) => new Promise((resolve, reject) => { + const file2 = item2.file; + if (!isImage2(file2) || !query("GET_ALLOW_IMAGE_RESIZE")) { + return resolve(item2); + } + const mode = query("GET_IMAGE_RESIZE_MODE"); + const width = query("GET_IMAGE_RESIZE_TARGET_WIDTH"); + const height = query("GET_IMAGE_RESIZE_TARGET_HEIGHT"); + const upscale = query("GET_IMAGE_RESIZE_UPSCALE"); + if (width === null && height === null) + return resolve(item2); + const targetWidth = width === null ? height : width; + const targetHeight = height === null ? targetWidth : height; + const fileURL = URL.createObjectURL(file2); + getImageSize2(fileURL, (size) => { + URL.revokeObjectURL(fileURL); + if (!size) + return resolve(item2); + let {width: imageWidth, height: imageHeight} = size; + const orientation = (item2.getMetadata("exif") || {}).orientation || -1; + if (orientation >= 5 && orientation <= 8) { + [imageWidth, imageHeight] = [imageHeight, imageWidth]; + } + if (imageWidth === targetWidth && imageHeight === targetHeight) + return resolve(item2); + if (!upscale) { + if (mode === "cover") { + if (imageWidth <= targetWidth || imageHeight <= targetHeight) + return resolve(item2); + } else if (imageWidth <= targetWidth && imageHeight <= targetWidth) { + return resolve(item2); + } + } + item2.setMetadata("resize", { + mode, + upscale, + size: { + width: targetWidth, + height: targetHeight + } + }); + resolve(item2); + }); + })); + return { + options: { + allowImageResize: [true, Type2.BOOLEAN], + imageResizeMode: ["cover", Type2.STRING], + imageResizeUpscale: [true, Type2.BOOLEAN], + imageResizeTargetWidth: [null, Type2.INT], + imageResizeTargetHeight: [null, Type2.INT] + } + }; +}; +var isBrowser7 = typeof window !== "undefined" && typeof window.document !== "undefined"; +if (isBrowser7) { + document.dispatchEvent(new CustomEvent("FilePond:pluginloaded", {detail: plugin6})); +} +var filepond_plugin_image_resize_esm_default = plugin6; + +// node_modules/filepond-plugin-image-transform/dist/filepond-plugin-image-transform.esm.js +/*! + * FilePondPluginImageTransform 3.8.7 + * Licensed under MIT, https://opensource.org/licenses/MIT/ + * Please visit https://pqina.nl/filepond/ for details. + */ +var isImage3 = (file2) => /^image/.test(file2.type); +var getFilenameWithoutExtension2 = (name2) => name2.substr(0, name2.lastIndexOf(".")) || name2; +var ExtensionMap = { + jpeg: "jpg", + "svg+xml": "svg" +}; +var renameFileToMatchMimeType = (filename, mimeType) => { + const name2 = getFilenameWithoutExtension2(filename); + const type = mimeType.split("/")[1]; + const extension = ExtensionMap[type] || type; + return `${name2}.${extension}`; +}; +var getValidOutputMimeType = (type) => /jpeg|png|svg\+xml/.test(type) ? type : "image/jpeg"; +var isImage$1 = (file2) => /^image/.test(file2.type); +var MATRICES = { + 1: () => [1, 0, 0, 1, 0, 0], + 2: (width) => [-1, 0, 0, 1, width, 0], + 3: (width, height) => [-1, 0, 0, -1, width, height], + 4: (width, height) => [1, 0, 0, -1, 0, height], + 5: () => [0, 1, 1, 0, 0, 0], + 6: (width, height) => [0, 1, -1, 0, height, 0], + 7: (width, height) => [0, -1, -1, 0, height, width], + 8: (width) => [0, -1, 1, 0, 0, width] +}; +var getImageOrientationMatrix = (width, height, orientation) => { + if (orientation === -1) { + orientation = 1; + } + return MATRICES[orientation](width, height); +}; +var createVector2 = (x, y) => ({x, y}); +var vectorDot2 = (a2, b) => a2.x * b.x + a2.y * b.y; +var vectorSubtract2 = (a2, b) => createVector2(a2.x - b.x, a2.y - b.y); +var vectorDistanceSquared2 = (a2, b) => vectorDot2(vectorSubtract2(a2, b), vectorSubtract2(a2, b)); +var vectorDistance2 = (a2, b) => Math.sqrt(vectorDistanceSquared2(a2, b)); +var getOffsetPointOnEdge2 = (length, rotation) => { + const a2 = length; + const A = 1.5707963267948966; + const B = rotation; + const C3 = 1.5707963267948966 - rotation; + const sinA = Math.sin(A); + const sinB = Math.sin(B); + const sinC = Math.sin(C3); + const cosC = Math.cos(C3); + const ratio = a2 / sinA; + const b = ratio * sinB; + const c2 = ratio * sinC; + return createVector2(cosC * b, cosC * c2); +}; +var getRotatedRectSize2 = (rect, rotation) => { + const w = rect.width; + const h = rect.height; + const hor = getOffsetPointOnEdge2(w, rotation); + const ver = getOffsetPointOnEdge2(h, rotation); + const tl = createVector2(rect.x + Math.abs(hor.x), rect.y - Math.abs(hor.y)); + const tr = createVector2(rect.x + rect.width + Math.abs(ver.y), rect.y + Math.abs(ver.x)); + const bl = createVector2(rect.x - Math.abs(ver.y), rect.y + rect.height - Math.abs(ver.x)); + return { + width: vectorDistance2(tl, tr), + height: vectorDistance2(tl, bl) + }; +}; +var getImageRectZoomFactor2 = (imageRect, cropRect, rotation = 0, center2 = {x: 0.5, y: 0.5}) => { + const cx = center2.x > 0.5 ? 1 - center2.x : center2.x; + const cy = center2.y > 0.5 ? 1 - center2.y : center2.y; + const imageWidth = cx * 2 * imageRect.width; + const imageHeight = cy * 2 * imageRect.height; + const rotatedCropSize = getRotatedRectSize2(cropRect, rotation); + return Math.max(rotatedCropSize.width / imageWidth, rotatedCropSize.height / imageHeight); +}; +var getCenteredCropRect2 = (container, aspectRatio) => { + let width = container.width; + let height = width * aspectRatio; + if (height > container.height) { + height = container.height; + width = height / aspectRatio; + } + const x = (container.width - width) * 0.5; + const y = (container.height - height) * 0.5; + return { + x, + y, + width, + height + }; +}; +var calculateCanvasSize2 = (image, canvasAspectRatio, zoom = 1) => { + const imageAspectRatio = image.height / image.width; + let canvasWidth = 1; + let canvasHeight = canvasAspectRatio; + let imgWidth = 1; + let imgHeight = imageAspectRatio; + if (imgHeight > canvasHeight) { + imgHeight = canvasHeight; + imgWidth = imgHeight / imageAspectRatio; + } + const scalar = Math.max(canvasWidth / imgWidth, canvasHeight / imgHeight); + const width = image.width / (zoom * scalar * imgWidth); + const height = width * canvasAspectRatio; + return { + width, + height + }; +}; +var canvasRelease = (canvas) => { + canvas.width = 1; + canvas.height = 1; + const ctx = canvas.getContext("2d"); + ctx.clearRect(0, 0, 1, 1); +}; +var isFlipped = (flip) => flip && (flip.horizontal || flip.vertical); +var getBitmap = (image, orientation, flip) => { + if (orientation <= 1 && !isFlipped(flip)) { + image.width = image.naturalWidth; + image.height = image.naturalHeight; + return image; + } + const canvas = document.createElement("canvas"); + const width = image.naturalWidth; + const height = image.naturalHeight; + const swapped = orientation >= 5 && orientation <= 8; + if (swapped) { + canvas.width = height; + canvas.height = width; + } else { + canvas.width = width; + canvas.height = height; + } + const ctx = canvas.getContext("2d"); + if (orientation) { + ctx.transform.apply(ctx, getImageOrientationMatrix(width, height, orientation)); + } + if (isFlipped(flip)) { + const matrix2 = [1, 0, 0, 1, 0, 0]; + if (!swapped && flip.horizontal || swapped & flip.vertical) { + matrix2[0] = -1; + matrix2[4] = width; + } + if (!swapped && flip.vertical || swapped && flip.horizontal) { + matrix2[3] = -1; + matrix2[5] = height; + } + ctx.transform(...matrix2); + } + ctx.drawImage(image, 0, 0, width, height); + return canvas; +}; +var imageToImageData = (imageElement, orientation, crop = {}, options = {}) => { + const {canvasMemoryLimit, background = null} = options; + const zoom = crop.zoom || 1; + const bitmap = getBitmap(imageElement, orientation, crop.flip); + const imageSize = { + width: bitmap.width, + height: bitmap.height + }; + const aspectRatio = crop.aspectRatio || imageSize.height / imageSize.width; + let canvasSize = calculateCanvasSize2(imageSize, aspectRatio, zoom); + if (canvasMemoryLimit) { + const requiredMemory = canvasSize.width * canvasSize.height; + if (requiredMemory > canvasMemoryLimit) { + const scalar = Math.sqrt(canvasMemoryLimit) / Math.sqrt(requiredMemory); + imageSize.width = Math.floor(imageSize.width * scalar); + imageSize.height = Math.floor(imageSize.height * scalar); + canvasSize = calculateCanvasSize2(imageSize, aspectRatio, zoom); + } + } + const canvas = document.createElement("canvas"); + const canvasCenter = { + x: canvasSize.width * 0.5, + y: canvasSize.height * 0.5 + }; + const stage = { + x: 0, + y: 0, + width: canvasSize.width, + height: canvasSize.height, + center: canvasCenter + }; + const shouldLimit = typeof crop.scaleToFit === "undefined" || crop.scaleToFit; + const scale = zoom * getImageRectZoomFactor2(imageSize, getCenteredCropRect2(stage, aspectRatio), crop.rotation, shouldLimit ? crop.center : {x: 0.5, y: 0.5}); + canvas.width = Math.round(canvasSize.width / scale); + canvas.height = Math.round(canvasSize.height / scale); + canvasCenter.x /= scale; + canvasCenter.y /= scale; + const imageOffset = { + x: canvasCenter.x - imageSize.width * (crop.center ? crop.center.x : 0.5), + y: canvasCenter.y - imageSize.height * (crop.center ? crop.center.y : 0.5) + }; + const ctx = canvas.getContext("2d"); + if (background) { + ctx.fillStyle = background; + ctx.fillRect(0, 0, canvas.width, canvas.height); + } + ctx.translate(canvasCenter.x, canvasCenter.y); + ctx.rotate(crop.rotation || 0); + ctx.drawImage(bitmap, imageOffset.x - canvasCenter.x, imageOffset.y - canvasCenter.y, imageSize.width, imageSize.height); + const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); + canvasRelease(canvas); + return imageData; +}; +var IS_BROWSER3 = (() => typeof window !== "undefined" && typeof window.document !== "undefined")(); +if (IS_BROWSER3) { + if (!HTMLCanvasElement.prototype.toBlob) { + Object.defineProperty(HTMLCanvasElement.prototype, "toBlob", { + value: function(callback, type, quality) { + var dataURL = this.toDataURL(type, quality).split(",")[1]; + setTimeout(function() { + var binStr = atob(dataURL); + var len = binStr.length; + var arr = new Uint8Array(len); + for (var i = 0; i < len; i++) { + arr[i] = binStr.charCodeAt(i); + } + callback(new Blob([arr], {type: type || "image/png"})); + }); + } + }); + } +} +var canvasToBlob = (canvas, options, beforeCreateBlob = null) => new Promise((resolve) => { + const promisedImage = beforeCreateBlob ? beforeCreateBlob(canvas) : canvas; + Promise.resolve(promisedImage).then((canvas2) => { + canvas2.toBlob(resolve, options.type, options.quality); + }); +}); +var vectorMultiply2 = (v, amount) => createVector$12(v.x * amount, v.y * amount); +var vectorAdd2 = (a2, b) => createVector$12(a2.x + b.x, a2.y + b.y); +var vectorNormalize2 = (v) => { + const l = Math.sqrt(v.x * v.x + v.y * v.y); + if (l === 0) { + return { + x: 0, + y: 0 + }; + } + return createVector$12(v.x / l, v.y / l); +}; +var vectorRotate2 = (v, radians, origin) => { + const cos = Math.cos(radians); + const sin = Math.sin(radians); + const t2 = createVector$12(v.x - origin.x, v.y - origin.y); + return createVector$12(origin.x + cos * t2.x - sin * t2.y, origin.y + sin * t2.x + cos * t2.y); +}; +var createVector$12 = (x = 0, y = 0) => ({x, y}); +var getMarkupValue2 = (value, size, scalar = 1, axis) => { + if (typeof value === "string") { + return parseFloat(value) * scalar; + } + if (typeof value === "number") { + return value * (axis ? size[axis] : Math.min(size.width, size.height)); + } + return; +}; +var getMarkupStyles2 = (markup, size, scale) => { + const lineStyle = markup.borderStyle || markup.lineStyle || "solid"; + const fill = markup.backgroundColor || markup.fontColor || "transparent"; + const stroke = markup.borderColor || markup.lineColor || "transparent"; + const strokeWidth = getMarkupValue2(markup.borderWidth || markup.lineWidth, size, scale); + const lineCap = markup.lineCap || "round"; + const lineJoin = markup.lineJoin || "round"; + const dashes = typeof lineStyle === "string" ? "" : lineStyle.map((v) => getMarkupValue2(v, size, scale)).join(","); + const opacity = markup.opacity || 1; + return { + "stroke-linecap": lineCap, + "stroke-linejoin": lineJoin, + "stroke-width": strokeWidth || 0, + "stroke-dasharray": dashes, + stroke, + fill, + opacity + }; +}; +var isDefined3 = (value) => value != null; +var getMarkupRect2 = (rect, size, scalar = 1) => { + let left = getMarkupValue2(rect.x, size, scalar, "width") || getMarkupValue2(rect.left, size, scalar, "width"); + let top = getMarkupValue2(rect.y, size, scalar, "height") || getMarkupValue2(rect.top, size, scalar, "height"); + let width = getMarkupValue2(rect.width, size, scalar, "width"); + let height = getMarkupValue2(rect.height, size, scalar, "height"); + let right = getMarkupValue2(rect.right, size, scalar, "width"); + let bottom = getMarkupValue2(rect.bottom, size, scalar, "height"); + if (!isDefined3(top)) { + if (isDefined3(height) && isDefined3(bottom)) { + top = size.height - height - bottom; + } else { + top = bottom; + } + } + if (!isDefined3(left)) { + if (isDefined3(width) && isDefined3(right)) { + left = size.width - width - right; + } else { + left = right; + } + } + if (!isDefined3(width)) { + if (isDefined3(left) && isDefined3(right)) { + width = size.width - left - right; + } else { + width = 0; + } + } + if (!isDefined3(height)) { + if (isDefined3(top) && isDefined3(bottom)) { + height = size.height - top - bottom; + } else { + height = 0; + } + } + return { + x: left || 0, + y: top || 0, + width: width || 0, + height: height || 0 + }; +}; +var pointsToPathShape2 = (points) => points.map((point, index2) => `${index2 === 0 ? "M" : "L"} ${point.x} ${point.y}`).join(" "); +var setAttributes2 = (element, attr2) => Object.keys(attr2).forEach((key) => element.setAttribute(key, attr2[key])); +var ns3 = "http://www.w3.org/2000/svg"; +var svg2 = (tag, attr2) => { + const element = document.createElementNS(ns3, tag); + if (attr2) { + setAttributes2(element, attr2); + } + return element; +}; +var updateRect3 = (element) => setAttributes2(element, { + ...element.rect, + ...element.styles +}); +var updateEllipse2 = (element) => { + const cx = element.rect.x + element.rect.width * 0.5; + const cy = element.rect.y + element.rect.height * 0.5; + const rx = element.rect.width * 0.5; + const ry = element.rect.height * 0.5; + return setAttributes2(element, { + cx, + cy, + rx, + ry, + ...element.styles + }); +}; +var IMAGE_FIT_STYLE2 = { + contain: "xMidYMid meet", + cover: "xMidYMid slice" +}; +var updateImage2 = (element, markup) => { + setAttributes2(element, { + ...element.rect, + ...element.styles, + preserveAspectRatio: IMAGE_FIT_STYLE2[markup.fit] || "none" + }); +}; +var TEXT_ANCHOR2 = { + left: "start", + center: "middle", + right: "end" +}; +var updateText2 = (element, markup, size, scale) => { + const fontSize = getMarkupValue2(markup.fontSize, size, scale); + const fontFamily = markup.fontFamily || "sans-serif"; + const fontWeight = markup.fontWeight || "normal"; + const textAlign = TEXT_ANCHOR2[markup.textAlign] || "start"; + setAttributes2(element, { + ...element.rect, + ...element.styles, + "stroke-width": 0, + "font-weight": fontWeight, + "font-size": fontSize, + "font-family": fontFamily, + "text-anchor": textAlign + }); + if (element.text !== markup.text) { + element.text = markup.text; + element.textContent = markup.text.length ? markup.text : " "; + } +}; +var updateLine2 = (element, markup, size, scale) => { + setAttributes2(element, { + ...element.rect, + ...element.styles, + fill: "none" + }); + const line = element.childNodes[0]; + const begin = element.childNodes[1]; + const end = element.childNodes[2]; + const origin = element.rect; + const target = { + x: element.rect.x + element.rect.width, + y: element.rect.y + element.rect.height + }; + setAttributes2(line, { + x1: origin.x, + y1: origin.y, + x2: target.x, + y2: target.y + }); + if (!markup.lineDecoration) + return; + begin.style.display = "none"; + end.style.display = "none"; + const v = vectorNormalize2({ + x: target.x - origin.x, + y: target.y - origin.y + }); + const l = getMarkupValue2(0.05, size, scale); + if (markup.lineDecoration.indexOf("arrow-begin") !== -1) { + const arrowBeginRotationPoint = vectorMultiply2(v, l); + const arrowBeginCenter = vectorAdd2(origin, arrowBeginRotationPoint); + const arrowBeginA = vectorRotate2(origin, 2, arrowBeginCenter); + const arrowBeginB = vectorRotate2(origin, -2, arrowBeginCenter); + setAttributes2(begin, { + style: "display:block;", + d: `M${arrowBeginA.x},${arrowBeginA.y} L${origin.x},${origin.y} L${arrowBeginB.x},${arrowBeginB.y}` + }); + } + if (markup.lineDecoration.indexOf("arrow-end") !== -1) { + const arrowEndRotationPoint = vectorMultiply2(v, -l); + const arrowEndCenter = vectorAdd2(target, arrowEndRotationPoint); + const arrowEndA = vectorRotate2(target, 2, arrowEndCenter); + const arrowEndB = vectorRotate2(target, -2, arrowEndCenter); + setAttributes2(end, { + style: "display:block;", + d: `M${arrowEndA.x},${arrowEndA.y} L${target.x},${target.y} L${arrowEndB.x},${arrowEndB.y}` + }); + } +}; +var updatePath2 = (element, markup, size, scale) => { + setAttributes2(element, { + ...element.styles, + fill: "none", + d: pointsToPathShape2(markup.points.map((point) => ({ + x: getMarkupValue2(point.x, size, scale, "width"), + y: getMarkupValue2(point.y, size, scale, "height") + }))) + }); +}; +var createShape2 = (node) => (markup) => svg2(node, {id: markup.id}); +var createImage2 = (markup) => { + const shape = svg2("image", { + id: markup.id, + "stroke-linecap": "round", + "stroke-linejoin": "round", + opacity: "0" + }); + shape.onload = () => { + shape.setAttribute("opacity", markup.opacity || 1); + }; + shape.setAttributeNS("http://www.w3.org/1999/xlink", "xlink:href", markup.src); + return shape; +}; +var createLine2 = (markup) => { + const shape = svg2("g", { + id: markup.id, + "stroke-linecap": "round", + "stroke-linejoin": "round" + }); + const line = svg2("line"); + shape.appendChild(line); + const begin = svg2("path"); + shape.appendChild(begin); + const end = svg2("path"); + shape.appendChild(end); + return shape; +}; +var CREATE_TYPE_ROUTES2 = { + image: createImage2, + rect: createShape2("rect"), + ellipse: createShape2("ellipse"), + text: createShape2("text"), + path: createShape2("path"), + line: createLine2 +}; +var UPDATE_TYPE_ROUTES2 = { + rect: updateRect3, + ellipse: updateEllipse2, + image: updateImage2, + text: updateText2, + path: updatePath2, + line: updateLine2 +}; +var createMarkupByType2 = (type, markup) => CREATE_TYPE_ROUTES2[type](markup); +var updateMarkupByType2 = (element, type, markup, size, scale) => { + if (type !== "path") { + element.rect = getMarkupRect2(markup, size, scale); + } + element.styles = getMarkupStyles2(markup, size, scale); + UPDATE_TYPE_ROUTES2[type](element, markup, size, scale); +}; +var sortMarkupByZIndex2 = (a2, b) => { + if (a2[1].zIndex > b[1].zIndex) { + return 1; + } + if (a2[1].zIndex < b[1].zIndex) { + return -1; + } + return 0; +}; +var cropSVG = (blob2, crop = {}, markup, options) => new Promise((resolve) => { + const {background = null} = options; + const fr = new FileReader(); + fr.onloadend = () => { + const text2 = fr.result; + const original = document.createElement("div"); + original.style.cssText = `position:absolute;pointer-events:none;width:0;height:0;visibility:hidden;`; + original.innerHTML = text2; + const originalNode = original.querySelector("svg"); + document.body.appendChild(original); + const bBox = originalNode.getBBox(); + original.parentNode.removeChild(original); + const titleNode = original.querySelector("title"); + const viewBoxAttribute = originalNode.getAttribute("viewBox") || ""; + const widthAttribute = originalNode.getAttribute("width") || ""; + const heightAttribute = originalNode.getAttribute("height") || ""; + let width = parseFloat(widthAttribute) || null; + let height = parseFloat(heightAttribute) || null; + const widthUnits = (widthAttribute.match(/[a-z]+/) || [])[0] || ""; + const heightUnits = (heightAttribute.match(/[a-z]+/) || [])[0] || ""; + const viewBoxList = viewBoxAttribute.split(" ").map(parseFloat); + const viewBox = viewBoxList.length ? { + x: viewBoxList[0], + y: viewBoxList[1], + width: viewBoxList[2], + height: viewBoxList[3] + } : bBox; + let imageWidth = width != null ? width : viewBox.width; + let imageHeight = height != null ? height : viewBox.height; + originalNode.style.overflow = "visible"; + originalNode.setAttribute("width", imageWidth); + originalNode.setAttribute("height", imageHeight); + let markupSVG = ""; + if (markup && markup.length) { + const size = { + width: imageWidth, + height: imageHeight + }; + markupSVG = markup.sort(sortMarkupByZIndex2).reduce((prev, shape) => { + const el = createMarkupByType2(shape[0], shape[1]); + updateMarkupByType2(el, shape[0], shape[1], size); + el.removeAttribute("id"); + if (el.getAttribute("opacity") === 1) { + el.removeAttribute("opacity"); + } + return prev + "\n" + el.outerHTML + "\n"; + }, ""); + markupSVG = ` + +${markupSVG.replace(/ /g, " ")} + +`; + } + const aspectRatio = crop.aspectRatio || imageHeight / imageWidth; + const canvasWidth = imageWidth; + const canvasHeight = canvasWidth * aspectRatio; + const shouldLimit = typeof crop.scaleToFit === "undefined" || crop.scaleToFit; + const cropCenterX = crop.center ? crop.center.x : 0.5; + const cropCenterY = crop.center ? crop.center.y : 0.5; + const canvasZoomFactor = getImageRectZoomFactor2({ + width: imageWidth, + height: imageHeight + }, getCenteredCropRect2({ + width: canvasWidth, + height: canvasHeight + }, aspectRatio), crop.rotation, shouldLimit ? {x: cropCenterX, y: cropCenterY} : { + x: 0.5, + y: 0.5 + }); + const scale = crop.zoom * canvasZoomFactor; + const rotation = crop.rotation * (180 / Math.PI); + const canvasCenter = { + x: canvasWidth * 0.5, + y: canvasHeight * 0.5 + }; + const imageOffset = { + x: canvasCenter.x - imageWidth * cropCenterX, + y: canvasCenter.y - imageHeight * cropCenterY + }; + const cropTransforms = [ + `rotate(${rotation} ${canvasCenter.x} ${canvasCenter.y})`, + `translate(${canvasCenter.x} ${canvasCenter.y})`, + `scale(${scale})`, + `translate(${-canvasCenter.x} ${-canvasCenter.y})`, + `translate(${imageOffset.x} ${imageOffset.y})` + ]; + const cropFlipHorizontal = crop.flip && crop.flip.horizontal; + const cropFlipVertical = crop.flip && crop.flip.vertical; + const flipTransforms = [ + `scale(${cropFlipHorizontal ? -1 : 1} ${cropFlipVertical ? -1 : 1})`, + `translate(${cropFlipHorizontal ? -imageWidth : 0} ${cropFlipVertical ? -imageHeight : 0})` + ]; + const transformed = ` + + +${titleNode ? titleNode.textContent : ""} + + +${originalNode.outerHTML}${markupSVG} + + +`; + resolve(transformed); + }; + fr.readAsText(blob2); +}); +var objectToImageData = (obj) => { + let imageData; + try { + imageData = new ImageData(obj.width, obj.height); + } catch (e2) { + const canvas = document.createElement("canvas"); + imageData = canvas.getContext("2d").createImageData(obj.width, obj.height); + } + imageData.data.set(obj.data); + return imageData; +}; +var TransformWorker = () => { + const TRANSFORMS = {resize, filter}; + const applyTransforms = (transforms2, imageData) => { + transforms2.forEach((transform2) => { + imageData = TRANSFORMS[transform2.type](imageData, transform2.data); + }); + return imageData; + }; + const transform = (data3, cb) => { + let transforms2 = data3.transforms; + let filterTransform = null; + transforms2.forEach((transform2) => { + if (transform2.type === "filter") { + filterTransform = transform2; + } + }); + if (filterTransform) { + let resizeTransform = null; + transforms2.forEach((transform2) => { + if (transform2.type === "resize") { + resizeTransform = transform2; + } + }); + if (resizeTransform) { + resizeTransform.data.matrix = filterTransform.data; + transforms2 = transforms2.filter((transform2) => transform2.type !== "filter"); + } + } + cb(applyTransforms(transforms2, data3.imageData)); + }; + self.onmessage = (e2) => { + transform(e2.data.message, (response) => { + self.postMessage({id: e2.data.id, message: response}, [response.data.buffer]); + }); + }; + const br = 1; + const bg = 1; + const bb = 1; + function applyFilterMatrix(index2, data3, m) { + const ir = data3[index2] / 255; + const ig = data3[index2 + 1] / 255; + const ib = data3[index2 + 2] / 255; + const ia = data3[index2 + 3] / 255; + const mr = ir * m[0] + ig * m[1] + ib * m[2] + ia * m[3] + m[4]; + const mg = ir * m[5] + ig * m[6] + ib * m[7] + ia * m[8] + m[9]; + const mb = ir * m[10] + ig * m[11] + ib * m[12] + ia * m[13] + m[14]; + const ma = ir * m[15] + ig * m[16] + ib * m[17] + ia * m[18] + m[19]; + const or = Math.max(0, mr * ma) + br * (1 - ma); + const og = Math.max(0, mg * ma) + bg * (1 - ma); + const ob = Math.max(0, mb * ma) + bb * (1 - ma); + data3[index2] = Math.max(0, Math.min(1, or)) * 255; + data3[index2 + 1] = Math.max(0, Math.min(1, og)) * 255; + data3[index2 + 2] = Math.max(0, Math.min(1, ob)) * 255; + } + const identityMatrix = self.JSON.stringify([ + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1, + 0 + ]); + function isIdentityMatrix(filter2) { + return self.JSON.stringify(filter2 || []) === identityMatrix; + } + function filter(imageData, matrix2) { + if (!matrix2 || isIdentityMatrix(matrix2)) + return imageData; + const data3 = imageData.data; + const l = data3.length; + const m11 = matrix2[0]; + const m12 = matrix2[1]; + const m13 = matrix2[2]; + const m14 = matrix2[3]; + const m15 = matrix2[4]; + const m21 = matrix2[5]; + const m22 = matrix2[6]; + const m23 = matrix2[7]; + const m24 = matrix2[8]; + const m25 = matrix2[9]; + const m31 = matrix2[10]; + const m32 = matrix2[11]; + const m33 = matrix2[12]; + const m34 = matrix2[13]; + const m35 = matrix2[14]; + const m41 = matrix2[15]; + const m42 = matrix2[16]; + const m43 = matrix2[17]; + const m44 = matrix2[18]; + const m45 = matrix2[19]; + let index2 = 0, r2 = 0, g = 0, b = 0, a2 = 0, mr = 0, mg = 0, mb = 0, ma = 0, or = 0, og = 0, ob = 0; + for (; index2 < l; index2 += 4) { + r2 = data3[index2] / 255; + g = data3[index2 + 1] / 255; + b = data3[index2 + 2] / 255; + a2 = data3[index2 + 3] / 255; + mr = r2 * m11 + g * m12 + b * m13 + a2 * m14 + m15; + mg = r2 * m21 + g * m22 + b * m23 + a2 * m24 + m25; + mb = r2 * m31 + g * m32 + b * m33 + a2 * m34 + m35; + ma = r2 * m41 + g * m42 + b * m43 + a2 * m44 + m45; + or = Math.max(0, mr * ma) + br * (1 - ma); + og = Math.max(0, mg * ma) + bg * (1 - ma); + ob = Math.max(0, mb * ma) + bb * (1 - ma); + data3[index2] = Math.max(0, Math.min(1, or)) * 255; + data3[index2 + 1] = Math.max(0, Math.min(1, og)) * 255; + data3[index2 + 2] = Math.max(0, Math.min(1, ob)) * 255; + } + return imageData; + } + function resize(imageData, data3) { + let {mode = "contain", upscale = false, width, height, matrix: matrix2} = data3; + matrix2 = !matrix2 || isIdentityMatrix(matrix2) ? null : matrix2; + if (!width && !height) { + return filter(imageData, matrix2); + } + if (width === null) { + width = height; + } else if (height === null) { + height = width; + } + if (mode !== "force") { + let scalarWidth = width / imageData.width; + let scalarHeight = height / imageData.height; + let scalar = 1; + if (mode === "cover") { + scalar = Math.max(scalarWidth, scalarHeight); + } else if (mode === "contain") { + scalar = Math.min(scalarWidth, scalarHeight); + } + if (scalar > 1 && upscale === false) { + return filter(imageData, matrix2); + } + width = imageData.width * scalar; + height = imageData.height * scalar; + } + const originWidth = imageData.width; + const originHeight = imageData.height; + const targetWidth = Math.round(width); + const targetHeight = Math.round(height); + const inputData = imageData.data; + const outputData = new Uint8ClampedArray(targetWidth * targetHeight * 4); + const ratioWidth = originWidth / targetWidth; + const ratioHeight = originHeight / targetHeight; + const ratioWidthHalf = Math.ceil(ratioWidth * 0.5); + const ratioHeightHalf = Math.ceil(ratioHeight * 0.5); + for (let j = 0; j < targetHeight; j++) { + for (let i = 0; i < targetWidth; i++) { + let x2 = (i + j * targetWidth) * 4; + let weight = 0; + let weights = 0; + let weightsAlpha = 0; + let r2 = 0; + let g = 0; + let b = 0; + let a2 = 0; + let centerY = (j + 0.5) * ratioHeight; + for (let yy = Math.floor(j * ratioHeight); yy < (j + 1) * ratioHeight; yy++) { + let dy = Math.abs(centerY - (yy + 0.5)) / ratioHeightHalf; + let centerX = (i + 0.5) * ratioWidth; + let w0 = dy * dy; + for (let xx = Math.floor(i * ratioWidth); xx < (i + 1) * ratioWidth; xx++) { + let dx = Math.abs(centerX - (xx + 0.5)) / ratioWidthHalf; + let w = Math.sqrt(w0 + dx * dx); + if (w >= -1 && w <= 1) { + weight = 2 * w * w * w - 3 * w * w + 1; + if (weight > 0) { + dx = 4 * (xx + yy * originWidth); + let ref = inputData[dx + 3]; + a2 += weight * ref; + weightsAlpha += weight; + if (ref < 255) { + weight = weight * ref / 250; + } + r2 += weight * inputData[dx]; + g += weight * inputData[dx + 1]; + b += weight * inputData[dx + 2]; + weights += weight; + } + } + } + } + outputData[x2] = r2 / weights; + outputData[x2 + 1] = g / weights; + outputData[x2 + 2] = b / weights; + outputData[x2 + 3] = a2 / weightsAlpha; + matrix2 && applyFilterMatrix(x2, outputData, matrix2); + } + } + return { + data: outputData, + width: targetWidth, + height: targetHeight + }; + } +}; +var correctOrientation = (view, offset) => { + if (view.getUint32(offset + 4, false) !== 1165519206) + return; + offset += 4; + const intelByteAligned = view.getUint16(offset += 6, false) === 18761; + offset += view.getUint32(offset + 4, intelByteAligned); + const tags = view.getUint16(offset, intelByteAligned); + offset += 2; + for (let i = 0; i < tags; i++) { + if (view.getUint16(offset + i * 12, intelByteAligned) === 274) { + view.setUint16(offset + i * 12 + 8, 1, intelByteAligned); + return true; + } + } + return false; +}; +var readData = (data3) => { + const view = new DataView(data3); + if (view.getUint16(0) !== 65496) + return null; + let offset = 2; + let marker; + let markerLength; + let orientationCorrected = false; + while (offset < view.byteLength) { + marker = view.getUint16(offset, false); + markerLength = view.getUint16(offset + 2, false) + 2; + const isData = marker >= 65504 && marker <= 65519 || marker === 65534; + if (!isData) { + break; + } + if (!orientationCorrected) { + orientationCorrected = correctOrientation(view, offset, markerLength); + } + if (offset + markerLength > view.byteLength) { + break; + } + offset += markerLength; + } + return data3.slice(0, offset); +}; +var getImageHead = (file2) => new Promise((resolve) => { + const reader = new FileReader(); + reader.onload = () => resolve(readData(reader.result) || null); + reader.readAsArrayBuffer(file2.slice(0, 256 * 1024)); +}); +var getBlobBuilder2 = () => { + return window.BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder; +}; +var createBlob2 = (arrayBuffer, mimeType) => { + const BB = getBlobBuilder2(); + if (BB) { + const bb = new BB(); + bb.append(arrayBuffer); + return bb.getBlob(mimeType); + } + return new Blob([arrayBuffer], { + type: mimeType + }); +}; +var getUniqueId2 = () => Math.random().toString(36).substr(2, 9); +var createWorker2 = (fn2) => { + const workerBlob = new Blob(["(", fn2.toString(), ")()"], {type: "application/javascript"}); + const workerURL = URL.createObjectURL(workerBlob); + const worker = new Worker(workerURL); + const trips = []; + return { + transfer: () => { + }, + post: (message, cb, transferList) => { + const id = getUniqueId2(); + trips[id] = cb; + worker.onmessage = (e2) => { + const cb2 = trips[e2.data.id]; + if (!cb2) + return; + cb2(e2.data.message); + delete trips[e2.data.id]; + }; + worker.postMessage({ + id, + message + }, transferList); + }, + terminate: () => { + worker.terminate(); + URL.revokeObjectURL(workerURL); + } + }; +}; +var loadImage3 = (url) => new Promise((resolve, reject) => { + const img = new Image(); + img.onload = () => { + resolve(img); + }; + img.onerror = (e2) => { + reject(e2); + }; + img.src = url; +}); +var chain = (funcs) => funcs.reduce((promise, func) => promise.then((result) => func().then(Array.prototype.concat.bind(result))), Promise.resolve([])); +var canvasApplyMarkup = (canvas, markup) => new Promise((resolve) => { + const size = { + width: canvas.width, + height: canvas.height + }; + const ctx = canvas.getContext("2d"); + const drawers = markup.sort(sortMarkupByZIndex2).map((item2) => () => new Promise((resolve2) => { + const result = TYPE_DRAW_ROUTES[item2[0]](ctx, size, item2[1], resolve2); + if (result) + resolve2(); + })); + chain(drawers).then(() => resolve(canvas)); +}); +var applyMarkupStyles = (ctx, styles3) => { + ctx.beginPath(); + ctx.lineCap = styles3["stroke-linecap"]; + ctx.lineJoin = styles3["stroke-linejoin"]; + ctx.lineWidth = styles3["stroke-width"]; + if (styles3["stroke-dasharray"].length) { + ctx.setLineDash(styles3["stroke-dasharray"].split(",")); + } + ctx.fillStyle = styles3["fill"]; + ctx.strokeStyle = styles3["stroke"]; + ctx.globalAlpha = styles3.opacity || 1; +}; +var drawMarkupStyles = (ctx) => { + ctx.fill(); + ctx.stroke(); + ctx.globalAlpha = 1; +}; +var drawRect = (ctx, size, markup) => { + const rect = getMarkupRect2(markup, size); + const styles3 = getMarkupStyles2(markup, size); + applyMarkupStyles(ctx, styles3); + ctx.rect(rect.x, rect.y, rect.width, rect.height); + drawMarkupStyles(ctx, styles3); + return true; +}; +var drawEllipse = (ctx, size, markup) => { + const rect = getMarkupRect2(markup, size); + const styles3 = getMarkupStyles2(markup, size); + applyMarkupStyles(ctx, styles3); + const x = rect.x, y = rect.y, w = rect.width, h = rect.height, kappa = 0.5522848, ox = w / 2 * kappa, oy = h / 2 * kappa, xe = x + w, ye = y + h, xm = x + w / 2, ym = y + h / 2; + ctx.moveTo(x, ym); + ctx.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); + ctx.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym); + ctx.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye); + ctx.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym); + drawMarkupStyles(ctx, styles3); + return true; +}; +var drawImage = (ctx, size, markup, done) => { + const rect = getMarkupRect2(markup, size); + const styles3 = getMarkupStyles2(markup, size); + applyMarkupStyles(ctx, styles3); + const image = new Image(); + const isCrossOriginImage = new URL(markup.src, window.location.href).origin !== window.location.origin; + if (isCrossOriginImage) + image.crossOrigin = ""; + image.onload = () => { + if (markup.fit === "cover") { + const ar = rect.width / rect.height; + const width = ar > 1 ? image.width : image.height * ar; + const height = ar > 1 ? image.width / ar : image.height; + const x = image.width * 0.5 - width * 0.5; + const y = image.height * 0.5 - height * 0.5; + ctx.drawImage(image, x, y, width, height, rect.x, rect.y, rect.width, rect.height); + } else if (markup.fit === "contain") { + const scalar = Math.min(rect.width / image.width, rect.height / image.height); + const width = scalar * image.width; + const height = scalar * image.height; + const x = rect.x + rect.width * 0.5 - width * 0.5; + const y = rect.y + rect.height * 0.5 - height * 0.5; + ctx.drawImage(image, 0, 0, image.width, image.height, x, y, width, height); + } else { + ctx.drawImage(image, 0, 0, image.width, image.height, rect.x, rect.y, rect.width, rect.height); + } + drawMarkupStyles(ctx, styles3); + done(); + }; + image.src = markup.src; +}; +var drawText = (ctx, size, markup) => { + const rect = getMarkupRect2(markup, size); + const styles3 = getMarkupStyles2(markup, size); + applyMarkupStyles(ctx, styles3); + const fontSize = getMarkupValue2(markup.fontSize, size); + const fontFamily = markup.fontFamily || "sans-serif"; + const fontWeight = markup.fontWeight || "normal"; + const textAlign = markup.textAlign || "left"; + ctx.font = `${fontWeight} ${fontSize}px ${fontFamily}`; + ctx.textAlign = textAlign; + ctx.fillText(markup.text, rect.x, rect.y); + drawMarkupStyles(ctx, styles3); + return true; +}; +var drawPath = (ctx, size, markup) => { + const styles3 = getMarkupStyles2(markup, size); + applyMarkupStyles(ctx, styles3); + ctx.beginPath(); + const points = markup.points.map((point) => ({ + x: getMarkupValue2(point.x, size, 1, "width"), + y: getMarkupValue2(point.y, size, 1, "height") + })); + ctx.moveTo(points[0].x, points[0].y); + const l = points.length; + for (let i = 1; i < l; i++) { + ctx.lineTo(points[i].x, points[i].y); + } + drawMarkupStyles(ctx, styles3); + return true; +}; +var drawLine = (ctx, size, markup) => { + const rect = getMarkupRect2(markup, size); + const styles3 = getMarkupStyles2(markup, size); + applyMarkupStyles(ctx, styles3); + ctx.beginPath(); + const origin = { + x: rect.x, + y: rect.y + }; + const target = { + x: rect.x + rect.width, + y: rect.y + rect.height + }; + ctx.moveTo(origin.x, origin.y); + ctx.lineTo(target.x, target.y); + const v = vectorNormalize2({ + x: target.x - origin.x, + y: target.y - origin.y + }); + const l = 0.04 * Math.min(size.width, size.height); + if (markup.lineDecoration.indexOf("arrow-begin") !== -1) { + const arrowBeginRotationPoint = vectorMultiply2(v, l); + const arrowBeginCenter = vectorAdd2(origin, arrowBeginRotationPoint); + const arrowBeginA = vectorRotate2(origin, 2, arrowBeginCenter); + const arrowBeginB = vectorRotate2(origin, -2, arrowBeginCenter); + ctx.moveTo(arrowBeginA.x, arrowBeginA.y); + ctx.lineTo(origin.x, origin.y); + ctx.lineTo(arrowBeginB.x, arrowBeginB.y); + } + if (markup.lineDecoration.indexOf("arrow-end") !== -1) { + const arrowEndRotationPoint = vectorMultiply2(v, -l); + const arrowEndCenter = vectorAdd2(target, arrowEndRotationPoint); + const arrowEndA = vectorRotate2(target, 2, arrowEndCenter); + const arrowEndB = vectorRotate2(target, -2, arrowEndCenter); + ctx.moveTo(arrowEndA.x, arrowEndA.y); + ctx.lineTo(target.x, target.y); + ctx.lineTo(arrowEndB.x, arrowEndB.y); + } + drawMarkupStyles(ctx, styles3); + return true; +}; +var TYPE_DRAW_ROUTES = { + rect: drawRect, + ellipse: drawEllipse, + image: drawImage, + text: drawText, + line: drawLine, + path: drawPath +}; +var imageDataToCanvas = (imageData) => { + const image = document.createElement("canvas"); + image.width = imageData.width; + image.height = imageData.height; + const ctx = image.getContext("2d"); + ctx.putImageData(imageData, 0, 0); + return image; +}; +var transformImage = (file2, instructions, options = {}) => new Promise((resolve, reject) => { + if (!file2 || !isImage$1(file2)) + return reject({status: "not an image file", file: file2}); + const {stripImageHead, beforeCreateBlob, afterCreateBlob, canvasMemoryLimit} = options; + const {crop, size, filter, markup, output} = instructions; + const orientation = instructions.image && instructions.image.orientation ? Math.max(1, Math.min(8, instructions.image.orientation)) : null; + const qualityAsPercentage = output && output.quality; + const quality = qualityAsPercentage === null ? null : qualityAsPercentage / 100; + const type = output && output.type || null; + const background = output && output.background || null; + const transforms2 = []; + if (size && (typeof size.width === "number" || typeof size.height === "number")) { + transforms2.push({type: "resize", data: size}); + } + if (filter && filter.length === 20) { + transforms2.push({type: "filter", data: filter}); + } + const resolveWithBlob = (blob2) => { + const promisedBlob = afterCreateBlob ? afterCreateBlob(blob2) : blob2; + Promise.resolve(promisedBlob).then(resolve); + }; + const toBlob = (imageData, options2) => { + const canvas = imageDataToCanvas(imageData); + const promisedCanvas = markup.length ? canvasApplyMarkup(canvas, markup) : canvas; + Promise.resolve(promisedCanvas).then((canvas2) => { + canvasToBlob(canvas2, options2, beforeCreateBlob).then((blob2) => { + canvasRelease(canvas2); + if (stripImageHead) + return resolveWithBlob(blob2); + getImageHead(file2).then((imageHead) => { + if (imageHead !== null) { + blob2 = new Blob([imageHead, blob2.slice(20)], {type: blob2.type}); + } + resolveWithBlob(blob2); + }); + }).catch(reject); + }); + }; + if (/svg/.test(file2.type) && type === null) { + return cropSVG(file2, crop, markup, {background}).then((text2) => { + resolve(createBlob2(text2, "image/svg+xml")); + }); + } + const url = URL.createObjectURL(file2); + loadImage3(url).then((image) => { + URL.revokeObjectURL(url); + const imageData = imageToImageData(image, orientation, crop, { + canvasMemoryLimit, + background + }); + const outputFormat = { + quality, + type: type || file2.type + }; + if (!transforms2.length) { + return toBlob(imageData, outputFormat); + } + const worker = createWorker2(TransformWorker); + worker.post({ + transforms: transforms2, + imageData + }, (response) => { + toBlob(objectToImageData(response), outputFormat); + worker.terminate(); + }, [imageData.data.buffer]); + }).catch(reject); +}); +var MARKUP_RECT2 = ["x", "y", "left", "top", "right", "bottom", "width", "height"]; +var toOptionalFraction2 = (value) => typeof value === "string" && /%/.test(value) ? parseFloat(value) / 100 : value; +var prepareMarkup2 = (markup) => { + const [type, props] = markup; + const rect = props.points ? {} : MARKUP_RECT2.reduce((prev, curr) => { + prev[curr] = toOptionalFraction2(props[curr]); + return prev; + }, {}); + return [ + type, + { + zIndex: 0, + ...props, + ...rect + } + ]; +}; +var getImageSize3 = (file2) => new Promise((resolve, reject) => { + const imageElement = new Image(); + imageElement.src = URL.createObjectURL(file2); + const measure = () => { + const width = imageElement.naturalWidth; + const height = imageElement.naturalHeight; + const hasSize = width && height; + if (!hasSize) + return; + URL.revokeObjectURL(imageElement.src); + clearInterval(intervalId); + resolve({width, height}); + }; + imageElement.onerror = (err) => { + URL.revokeObjectURL(imageElement.src); + clearInterval(intervalId); + reject(err); + }; + const intervalId = setInterval(measure, 1); + measure(); +}); +if (typeof window !== "undefined" && typeof window.document !== "undefined") { + if (!HTMLCanvasElement.prototype.toBlob) { + Object.defineProperty(HTMLCanvasElement.prototype, "toBlob", { + value: function(cb, type, quality) { + const canvas = this; + setTimeout(() => { + const dataURL = canvas.toDataURL(type, quality).split(",")[1]; + const binStr = atob(dataURL); + let index2 = binStr.length; + const data3 = new Uint8Array(index2); + while (index2--) { + data3[index2] = binStr.charCodeAt(index2); + } + cb(new Blob([data3], {type: type || "image/png"})); + }); + } + }); + } +} +var isBrowser8 = typeof window !== "undefined" && typeof window.document !== "undefined"; +var isIOS = isBrowser8 && /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream; +var plugin7 = ({addFilter: addFilter2, utils}) => { + const {Type: Type2, forin: forin2, getFileFromBlob: getFileFromBlob2, isFile: isFile2} = utils; + const TRANSFORM_LIST = ["crop", "resize", "filter", "markup", "output"]; + const createVariantCreator = (updateMetadata) => (transform, file2, metadata) => transform(file2, updateMetadata ? updateMetadata(metadata) : metadata); + const isDefaultCrop = (crop) => crop.aspectRatio === null && crop.rotation === 0 && crop.zoom === 1 && crop.center && crop.center.x === 0.5 && crop.center.y === 0.5 && crop.flip && crop.flip.horizontal === false && crop.flip.vertical === false; + addFilter2("SHOULD_PREPARE_OUTPUT", (shouldPrepareOutput, {query}) => new Promise((resolve) => { + resolve(!query("IS_ASYNC")); + })); + const shouldTransformFile = (query, file2, item2) => new Promise((resolve) => { + if (!query("GET_ALLOW_IMAGE_TRANSFORM") || item2.archived || !isFile2(file2) || !isImage3(file2)) { + return resolve(false); + } + getImageSize3(file2).then(() => { + const fn2 = query("GET_IMAGE_TRANSFORM_IMAGE_FILTER"); + if (fn2) { + const filterResult = fn2(file2); + if (filterResult == null) { + return handleRevert(true); + } + if (typeof filterResult === "boolean") { + return resolve(filterResult); + } + if (typeof filterResult.then === "function") { + return filterResult.then(resolve); + } + } + resolve(true); + }).catch((err) => { + resolve(false); + }); + }); + addFilter2("DID_CREATE_ITEM", (item2, {query, dispatch: dispatch2}) => { + if (!query("GET_ALLOW_IMAGE_TRANSFORM")) + return; + item2.extend("requestPrepare", () => new Promise((resolve, reject) => { + dispatch2("REQUEST_PREPARE_OUTPUT", { + query: item2.id, + item: item2, + success: resolve, + failure: reject + }, true); + })); + }); + addFilter2("PREPARE_OUTPUT", (file2, {query, item: item2}) => new Promise((resolve) => { + shouldTransformFile(query, file2, item2).then((shouldTransform) => { + if (!shouldTransform) + return resolve(file2); + const variants = []; + if (query("GET_IMAGE_TRANSFORM_VARIANTS_INCLUDE_ORIGINAL")) { + variants.push(() => new Promise((resolve2) => { + resolve2({ + name: query("GET_IMAGE_TRANSFORM_VARIANTS_ORIGINAL_NAME"), + file: file2 + }); + })); + } + if (query("GET_IMAGE_TRANSFORM_VARIANTS_INCLUDE_DEFAULT")) { + variants.push((transform2, file3, metadata) => new Promise((resolve2) => { + transform2(file3, metadata).then((file4) => resolve2({ + name: query("GET_IMAGE_TRANSFORM_VARIANTS_DEFAULT_NAME"), + file: file4 + })); + })); + } + const variantsDefinition = query("GET_IMAGE_TRANSFORM_VARIANTS") || {}; + forin2(variantsDefinition, (key, fn2) => { + const createVariant = createVariantCreator(fn2); + variants.push((transform2, file3, metadata) => new Promise((resolve2) => { + createVariant(transform2, file3, metadata).then((file4) => resolve2({name: key, file: file4})); + })); + }); + const qualityAsPercentage = query("GET_IMAGE_TRANSFORM_OUTPUT_QUALITY"); + const qualityMode = query("GET_IMAGE_TRANSFORM_OUTPUT_QUALITY_MODE"); + const quality = qualityAsPercentage === null ? null : qualityAsPercentage / 100; + const type = query("GET_IMAGE_TRANSFORM_OUTPUT_MIME_TYPE"); + const clientTransforms = query("GET_IMAGE_TRANSFORM_CLIENT_TRANSFORMS") || TRANSFORM_LIST; + item2.setMetadata("output", { + type, + quality, + client: clientTransforms + }, true); + const transform = (file3, metadata) => new Promise((resolve2, reject) => { + const filteredMetadata = {...metadata}; + Object.keys(filteredMetadata).filter((instruction) => instruction !== "exif").forEach((instruction) => { + if (clientTransforms.indexOf(instruction) === -1) { + delete filteredMetadata[instruction]; + } + }); + const {resize, exif, output, crop, filter, markup} = filteredMetadata; + const instructions = { + image: { + orientation: exif ? exif.orientation : null + }, + output: output && (output.type || typeof output.quality === "number" || output.background) ? { + type: output.type, + quality: typeof output.quality === "number" ? output.quality * 100 : null, + background: output.background || query("GET_IMAGE_TRANSFORM_CANVAS_BACKGROUND_COLOR") || null + } : void 0, + size: resize && (resize.size.width || resize.size.height) ? { + mode: resize.mode, + upscale: resize.upscale, + ...resize.size + } : void 0, + crop: crop && !isDefaultCrop(crop) ? { + ...crop + } : void 0, + markup: markup && markup.length ? markup.map(prepareMarkup2) : [], + filter + }; + if (instructions.output) { + const willChangeType = output.type ? output.type !== file3.type : false; + const canChangeQuality = /\/jpe?g$/.test(file3.type); + const willChangeQuality = output.quality !== null ? canChangeQuality && qualityMode === "always" : false; + const willModifyImageData = !!(instructions.size || instructions.crop || instructions.filter || willChangeType || willChangeQuality); + if (!willModifyImageData) + return resolve2(file3); + } + const options = { + beforeCreateBlob: query("GET_IMAGE_TRANSFORM_BEFORE_CREATE_BLOB"), + afterCreateBlob: query("GET_IMAGE_TRANSFORM_AFTER_CREATE_BLOB"), + canvasMemoryLimit: query("GET_IMAGE_TRANSFORM_CANVAS_MEMORY_LIMIT"), + stripImageHead: query("GET_IMAGE_TRANSFORM_OUTPUT_STRIP_IMAGE_HEAD") + }; + transformImage(file3, instructions, options).then((blob2) => { + const out = getFileFromBlob2(blob2, renameFileToMatchMimeType(file3.name, getValidOutputMimeType(blob2.type))); + resolve2(out); + }).catch(reject); + }); + const variantPromises = variants.map((create2) => create2(transform, file2, item2.getMetadata())); + Promise.all(variantPromises).then((files) => { + resolve(files.length === 1 && files[0].name === null ? files[0].file : files); + }); + }); + })); + return { + options: { + allowImageTransform: [true, Type2.BOOLEAN], + imageTransformImageFilter: [null, Type2.FUNCTION], + imageTransformOutputMimeType: [null, Type2.STRING], + imageTransformOutputQuality: [null, Type2.INT], + imageTransformOutputStripImageHead: [true, Type2.BOOLEAN], + imageTransformClientTransforms: [null, Type2.ARRAY], + imageTransformOutputQualityMode: ["always", Type2.STRING], + imageTransformVariants: [null, Type2.OBJECT], + imageTransformVariantsIncludeDefault: [true, Type2.BOOLEAN], + imageTransformVariantsDefaultName: [null, Type2.STRING], + imageTransformVariantsIncludeOriginal: [false, Type2.BOOLEAN], + imageTransformVariantsOriginalName: ["original_", Type2.STRING], + imageTransformBeforeCreateBlob: [null, Type2.FUNCTION], + imageTransformAfterCreateBlob: [null, Type2.FUNCTION], + imageTransformCanvasMemoryLimit: [isBrowser8 && isIOS ? 4096 * 4096 : null, Type2.INT], + imageTransformCanvasBackgroundColor: [null, Type2.STRING] + } + }; +}; +if (isBrowser8) { + document.dispatchEvent(new CustomEvent("FilePond:pluginloaded", {detail: plugin7})); +} +var filepond_plugin_image_transform_esm_default = plugin7; + +// packages/forms/resources/js/components/file-upload.js +registerPlugin(filepond_plugin_file_validate_size_esm_default); +registerPlugin(filepond_plugin_file_validate_type_esm_default); +registerPlugin(filepond_plugin_image_crop_esm_default); +registerPlugin(filepond_plugin_image_exif_orientation_esm_default); +registerPlugin(filepond_plugin_image_preview_esm_default); +registerPlugin(filepond_plugin_image_resize_esm_default); +registerPlugin(filepond_plugin_image_transform_esm_default); +var file_upload_default = (Alpine) => { + Alpine.data("fileUploadFormComponent", ({ + acceptedFileTypes, + getUploadedFileUrlUsing, + imageCropAspectRatio, + imagePreviewHeight, + imageResizeTargetHeight, + imageResizeTargetWidth, + loadingIndicatorPosition, + panelAspectRatio, + panelLayout, + placeholder, + maxSize, + minSize, + removeUploadedFileButtonPosition, + removeUploadedFileUsing, + state: state2, + uploadButtonPosition, + uploadProgressIndicatorPosition, + uploadUsing + }) => { + return { + files: [], + pond: null, + state: state2, + init: async function() { + let uploadedFileUrl = await getUploadedFileUrlUsing(); + if (uploadedFileUrl) { + this.files = [{ + source: uploadedFileUrl, + options: { + type: "local" + } + }]; + } + this.pond = create$f(this.$refs.input, { + acceptedFileTypes, + credits: false, + files: this.files, + imageCropAspectRatio, + imagePreviewHeight, + imageResizeTargetHeight, + imageResizeTargetWidth, + ...placeholder && {labelIdle: placeholder}, + maxFileSize: maxSize, + minFileSize: minSize, + styleButtonProcessItemPosition: uploadButtonPosition, + styleButtonRemoveItemPosition: removeUploadedFileButtonPosition, + styleLoadIndicatorPosition: loadingIndicatorPosition, + stylePanelAspectRatio: panelAspectRatio, + stylePanelLayout: panelLayout, + styleProgressIndicatorPosition: uploadProgressIndicatorPosition, + server: { + load: async (source, load) => { + let response = await fetch(source); + let blob2 = await response.blob(); + load(blob2); + }, + process: (fieldName, file2, metadata, load, error2, progress) => { + uploadUsing(file2, load, error2, progress); + }, + remove: async (source, load) => { + await removeUploadedFileUsing(); + load(); + }, + revert: async (uniqueFileId, load) => { + await removeUploadedFileUsing(uniqueFileId); + load(); + } + } + }); + this.$watch("state", async () => { + if (!this.state) { + this.pond.removeFiles(); + return; + } + if (this.state.startsWith("livewire-file:")) { + return; + } + let uploadedFileUrl2 = await getUploadedFileUrlUsing(); + if (uploadedFileUrl2) { + this.pond.files = [{ + source: uploadedFileUrl2, + options: { + type: "local" + } + }]; + } else { + this.pond.files = []; + } + }); + } + }; + }); +}; + +// node_modules/sortablejs/modular/sortable.esm.js +/**! + * Sortable 1.14.0 + * @author RubaXa + * @author owenm + * @license MIT + */ +function ownKeys(object, enumerableOnly) { + var keys = Object.keys(object); + if (Object.getOwnPropertySymbols) { + var symbols = Object.getOwnPropertySymbols(object); + if (enumerableOnly) { + symbols = symbols.filter(function(sym) { + return Object.getOwnPropertyDescriptor(object, sym).enumerable; + }); + } + keys.push.apply(keys, symbols); + } + return keys; +} +function _objectSpread2(target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i] != null ? arguments[i] : {}; + if (i % 2) { + ownKeys(Object(source), true).forEach(function(key) { + _defineProperty(target, key, source[key]); + }); + } else if (Object.getOwnPropertyDescriptors) { + Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); + } else { + ownKeys(Object(source)).forEach(function(key) { + Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); + }); + } + } + return target; +} +function _typeof(obj) { + "@babel/helpers - typeof"; + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof = function(obj2) { + return typeof obj2; + }; + } else { + _typeof = function(obj2) { + return obj2 && typeof Symbol === "function" && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2; + }; + } + return _typeof(obj); +} +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + return obj; +} +function _extends() { + _extends = Object.assign || function(target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + return target; + }; + return _extends.apply(this, arguments); +} +function _objectWithoutPropertiesLoose(source, excluded) { + if (source == null) + return {}; + var target = {}; + var sourceKeys = Object.keys(source); + var key, i; + for (i = 0; i < sourceKeys.length; i++) { + key = sourceKeys[i]; + if (excluded.indexOf(key) >= 0) + continue; + target[key] = source[key]; + } + return target; +} +function _objectWithoutProperties(source, excluded) { + if (source == null) + return {}; + var target = _objectWithoutPropertiesLoose(source, excluded); + var key, i; + if (Object.getOwnPropertySymbols) { + var sourceSymbolKeys = Object.getOwnPropertySymbols(source); + for (i = 0; i < sourceSymbolKeys.length; i++) { + key = sourceSymbolKeys[i]; + if (excluded.indexOf(key) >= 0) + continue; + if (!Object.prototype.propertyIsEnumerable.call(source, key)) + continue; + target[key] = source[key]; + } + } + return target; +} +var version = "1.14.0"; +function userAgent(pattern) { + if (typeof window !== "undefined" && window.navigator) { + return !!/* @__PURE__ */ navigator.userAgent.match(pattern); + } +} +var IE11OrLess = userAgent(/(?:Trident.*rv[ :]?11\.|msie|iemobile|Windows Phone)/i); +var Edge = userAgent(/Edge/i); +var FireFox = userAgent(/firefox/i); +var Safari = userAgent(/safari/i) && !userAgent(/chrome/i) && !userAgent(/android/i); +var IOS = userAgent(/iP(ad|od|hone)/i); +var ChromeForAndroid = userAgent(/chrome/i) && userAgent(/android/i); +var captureMode = { + capture: false, + passive: false +}; +function on2(el, event, fn2) { + el.addEventListener(event, fn2, !IE11OrLess && captureMode); +} +function off(el, event, fn2) { + el.removeEventListener(event, fn2, !IE11OrLess && captureMode); +} +function matches(el, selector) { + if (!selector) + return; + selector[0] === ">" && (selector = selector.substring(1)); + if (el) { + try { + if (el.matches) { + return el.matches(selector); + } else if (el.msMatchesSelector) { + return el.msMatchesSelector(selector); + } else if (el.webkitMatchesSelector) { + return el.webkitMatchesSelector(selector); + } + } catch (_) { + return false; + } + } + return false; +} +function getParentOrHost(el) { + return el.host && el !== document && el.host.nodeType ? el.host : el.parentNode; +} +function closest(el, selector, ctx, includeCTX) { + if (el) { + ctx = ctx || document; + do { + if (selector != null && (selector[0] === ">" ? el.parentNode === ctx && matches(el, selector) : matches(el, selector)) || includeCTX && el === ctx) { + return el; + } + if (el === ctx) + break; + } while (el = getParentOrHost(el)); + } + return null; +} +var R_SPACE = /\s+/g; +function toggleClass(el, name2, state2) { + if (el && name2) { + if (el.classList) { + el.classList[state2 ? "add" : "remove"](name2); + } else { + var className = (" " + el.className + " ").replace(R_SPACE, " ").replace(" " + name2 + " ", " "); + el.className = (className + (state2 ? " " + name2 : "")).replace(R_SPACE, " "); + } + } +} +function css(el, prop, val) { + var style = el && el.style; + if (style) { + if (val === void 0) { + if (document.defaultView && document.defaultView.getComputedStyle) { + val = document.defaultView.getComputedStyle(el, ""); + } else if (el.currentStyle) { + val = el.currentStyle; + } + return prop === void 0 ? val : val[prop]; + } else { + if (!(prop in style) && prop.indexOf("webkit") === -1) { + prop = "-webkit-" + prop; + } + style[prop] = val + (typeof val === "string" ? "" : "px"); + } + } +} +function matrix(el, selfOnly) { + var appliedTransforms = ""; + if (typeof el === "string") { + appliedTransforms = el; + } else { + do { + var transform = css(el, "transform"); + if (transform && transform !== "none") { + appliedTransforms = transform + " " + appliedTransforms; + } + } while (!selfOnly && (el = el.parentNode)); + } + var matrixFn = window.DOMMatrix || window.WebKitCSSMatrix || window.CSSMatrix || window.MSCSSMatrix; + return matrixFn && new matrixFn(appliedTransforms); +} +function find2(ctx, tagName, iterator) { + if (ctx) { + var list2 = ctx.getElementsByTagName(tagName), i = 0, n2 = list2.length; + if (iterator) { + for (; i < n2; i++) { + iterator(list2[i], i); + } + } + return list2; + } + return []; +} +function getWindowScrollingElement() { + var scrollingElement = document.scrollingElement; + if (scrollingElement) { + return scrollingElement; + } else { + return document.documentElement; + } +} +function getRect(el, relativeToContainingBlock, relativeToNonStaticParent, undoScale, container) { + if (!el.getBoundingClientRect && el !== window) + return; + var elRect, top, left, bottom, right, height, width; + if (el !== window && el.parentNode && el !== getWindowScrollingElement()) { + elRect = el.getBoundingClientRect(); + top = elRect.top; + left = elRect.left; + bottom = elRect.bottom; + right = elRect.right; + height = elRect.height; + width = elRect.width; + } else { + top = 0; + left = 0; + bottom = window.innerHeight; + right = window.innerWidth; + height = window.innerHeight; + width = window.innerWidth; + } + if ((relativeToContainingBlock || relativeToNonStaticParent) && el !== window) { + container = container || el.parentNode; + if (!IE11OrLess) { + do { + if (container && container.getBoundingClientRect && (css(container, "transform") !== "none" || relativeToNonStaticParent && css(container, "position") !== "static")) { + var containerRect = container.getBoundingClientRect(); + top -= containerRect.top + parseInt(css(container, "border-top-width")); + left -= containerRect.left + parseInt(css(container, "border-left-width")); + bottom = top + elRect.height; + right = left + elRect.width; + break; + } + } while (container = container.parentNode); + } + } + if (undoScale && el !== window) { + var elMatrix = matrix(container || el), scaleX = elMatrix && elMatrix.a, scaleY = elMatrix && elMatrix.d; + if (elMatrix) { + top /= scaleY; + left /= scaleX; + width /= scaleX; + height /= scaleY; + bottom = top + height; + right = left + width; + } + } + return { + top, + left, + bottom, + right, + width, + height + }; +} +function isScrolledPast(el, elSide, parentSide) { + var parent = getParentAutoScrollElement(el, true), elSideVal = getRect(el)[elSide]; + while (parent) { + var parentSideVal = getRect(parent)[parentSide], visible2 = void 0; + if (parentSide === "top" || parentSide === "left") { + visible2 = elSideVal >= parentSideVal; + } else { + visible2 = elSideVal <= parentSideVal; + } + if (!visible2) + return parent; + if (parent === getWindowScrollingElement()) + break; + parent = getParentAutoScrollElement(parent, false); + } + return false; +} +function getChild(el, childNum, options, includeDragEl) { + var currentChild = 0, i = 0, children = el.children; + while (i < children.length) { + if (children[i].style.display !== "none" && children[i] !== Sortable.ghost && (includeDragEl || children[i] !== Sortable.dragged) && closest(children[i], options.draggable, el, false)) { + if (currentChild === childNum) { + return children[i]; + } + currentChild++; + } + i++; + } + return null; +} +function lastChild(el, selector) { + var last = el.lastElementChild; + while (last && (last === Sortable.ghost || css(last, "display") === "none" || selector && !matches(last, selector))) { + last = last.previousElementSibling; + } + return last || null; +} +function index(el, selector) { + var index2 = 0; + if (!el || !el.parentNode) { + return -1; + } + while (el = el.previousElementSibling) { + if (el.nodeName.toUpperCase() !== "TEMPLATE" && el !== Sortable.clone && (!selector || matches(el, selector))) { + index2++; + } + } + return index2; +} +function getRelativeScrollOffset(el) { + var offsetLeft = 0, offsetTop = 0, winScroller = getWindowScrollingElement(); + if (el) { + do { + var elMatrix = matrix(el), scaleX = elMatrix.a, scaleY = elMatrix.d; + offsetLeft += el.scrollLeft * scaleX; + offsetTop += el.scrollTop * scaleY; + } while (el !== winScroller && (el = el.parentNode)); + } + return [offsetLeft, offsetTop]; +} +function indexOfObject(arr, obj) { + for (var i in arr) { + if (!arr.hasOwnProperty(i)) + continue; + for (var key in obj) { + if (obj.hasOwnProperty(key) && obj[key] === arr[i][key]) + return Number(i); + } + } + return -1; +} +function getParentAutoScrollElement(el, includeSelf) { + if (!el || !el.getBoundingClientRect) + return getWindowScrollingElement(); + var elem = el; + var gotSelf = false; + do { + if (elem.clientWidth < elem.scrollWidth || elem.clientHeight < elem.scrollHeight) { + var elemCSS = css(elem); + if (elem.clientWidth < elem.scrollWidth && (elemCSS.overflowX == "auto" || elemCSS.overflowX == "scroll") || elem.clientHeight < elem.scrollHeight && (elemCSS.overflowY == "auto" || elemCSS.overflowY == "scroll")) { + if (!elem.getBoundingClientRect || elem === document.body) + return getWindowScrollingElement(); + if (gotSelf || includeSelf) + return elem; + gotSelf = true; + } + } + } while (elem = elem.parentNode); + return getWindowScrollingElement(); +} +function extend(dst, src) { + if (dst && src) { + for (var key in src) { + if (src.hasOwnProperty(key)) { + dst[key] = src[key]; + } + } + } + return dst; +} +function isRectEqual(rect1, rect2) { + return Math.round(rect1.top) === Math.round(rect2.top) && Math.round(rect1.left) === Math.round(rect2.left) && Math.round(rect1.height) === Math.round(rect2.height) && Math.round(rect1.width) === Math.round(rect2.width); +} +var _throttleTimeout; +function throttle(callback, ms) { + return function() { + if (!_throttleTimeout) { + var args = arguments, _this = this; + if (args.length === 1) { + callback.call(_this, args[0]); + } else { + callback.apply(_this, args); + } + _throttleTimeout = setTimeout(function() { + _throttleTimeout = void 0; + }, ms); + } + }; +} +function cancelThrottle() { + clearTimeout(_throttleTimeout); + _throttleTimeout = void 0; +} +function scrollBy(el, x, y) { + el.scrollLeft += x; + el.scrollTop += y; +} +function clone(el) { + var Polymer = window.Polymer; + var $ = window.jQuery || window.Zepto; + if (Polymer && Polymer.dom) { + return Polymer.dom(el).cloneNode(true); + } else if ($) { + return $(el).clone(true)[0]; + } else { + return el.cloneNode(true); + } +} +var expando = "Sortable" + new Date().getTime(); +function AnimationStateManager() { + var animationStates = [], animationCallbackId; + return { + captureAnimationState: function captureAnimationState() { + animationStates = []; + if (!this.options.animation) + return; + var children = [].slice.call(this.el.children); + children.forEach(function(child) { + if (css(child, "display") === "none" || child === Sortable.ghost) + return; + animationStates.push({ + target: child, + rect: getRect(child) + }); + var fromRect = _objectSpread2({}, animationStates[animationStates.length - 1].rect); + if (child.thisAnimationDuration) { + var childMatrix = matrix(child, true); + if (childMatrix) { + fromRect.top -= childMatrix.f; + fromRect.left -= childMatrix.e; + } + } + child.fromRect = fromRect; + }); + }, + addAnimationState: function addAnimationState(state2) { + animationStates.push(state2); + }, + removeAnimationState: function removeAnimationState(target) { + animationStates.splice(indexOfObject(animationStates, { + target + }), 1); + }, + animateAll: function animateAll(callback) { + var _this = this; + if (!this.options.animation) { + clearTimeout(animationCallbackId); + if (typeof callback === "function") + callback(); + return; + } + var animating = false, animationTime = 0; + animationStates.forEach(function(state2) { + var time = 0, target = state2.target, fromRect = target.fromRect, toRect = getRect(target), prevFromRect = target.prevFromRect, prevToRect = target.prevToRect, animatingRect = state2.rect, targetMatrix = matrix(target, true); + if (targetMatrix) { + toRect.top -= targetMatrix.f; + toRect.left -= targetMatrix.e; + } + target.toRect = toRect; + if (target.thisAnimationDuration) { + if (isRectEqual(prevFromRect, toRect) && !isRectEqual(fromRect, toRect) && (animatingRect.top - toRect.top) / (animatingRect.left - toRect.left) === (fromRect.top - toRect.top) / (fromRect.left - toRect.left)) { + time = calculateRealTime(animatingRect, prevFromRect, prevToRect, _this.options); + } + } + if (!isRectEqual(toRect, fromRect)) { + target.prevFromRect = fromRect; + target.prevToRect = toRect; + if (!time) { + time = _this.options.animation; + } + _this.animate(target, animatingRect, toRect, time); + } + if (time) { + animating = true; + animationTime = Math.max(animationTime, time); + clearTimeout(target.animationResetTimer); + target.animationResetTimer = setTimeout(function() { + target.animationTime = 0; + target.prevFromRect = null; + target.fromRect = null; + target.prevToRect = null; + target.thisAnimationDuration = null; + }, time); + target.thisAnimationDuration = time; + } + }); + clearTimeout(animationCallbackId); + if (!animating) { + if (typeof callback === "function") + callback(); + } else { + animationCallbackId = setTimeout(function() { + if (typeof callback === "function") + callback(); + }, animationTime); + } + animationStates = []; + }, + animate: function animate(target, currentRect, toRect, duration) { + if (duration) { + css(target, "transition", ""); + css(target, "transform", ""); + var elMatrix = matrix(this.el), scaleX = elMatrix && elMatrix.a, scaleY = elMatrix && elMatrix.d, translateX = (currentRect.left - toRect.left) / (scaleX || 1), translateY = (currentRect.top - toRect.top) / (scaleY || 1); + target.animatingX = !!translateX; + target.animatingY = !!translateY; + css(target, "transform", "translate3d(" + translateX + "px," + translateY + "px,0)"); + this.forRepaintDummy = repaint(target); + css(target, "transition", "transform " + duration + "ms" + (this.options.easing ? " " + this.options.easing : "")); + css(target, "transform", "translate3d(0,0,0)"); + typeof target.animated === "number" && clearTimeout(target.animated); + target.animated = setTimeout(function() { + css(target, "transition", ""); + css(target, "transform", ""); + target.animated = false; + target.animatingX = false; + target.animatingY = false; + }, duration); + } + } + }; +} +function repaint(target) { + return target.offsetWidth; +} +function calculateRealTime(animatingRect, fromRect, toRect, options) { + return Math.sqrt(Math.pow(fromRect.top - animatingRect.top, 2) + Math.pow(fromRect.left - animatingRect.left, 2)) / Math.sqrt(Math.pow(fromRect.top - toRect.top, 2) + Math.pow(fromRect.left - toRect.left, 2)) * options.animation; +} +var plugins = []; +var defaults2 = { + initializeByDefault: true +}; +var PluginManager = { + mount: function mount(plugin8) { + for (var option3 in defaults2) { + if (defaults2.hasOwnProperty(option3) && !(option3 in plugin8)) { + plugin8[option3] = defaults2[option3]; + } + } + plugins.forEach(function(p2) { + if (p2.pluginName === plugin8.pluginName) { + throw "Sortable: Cannot mount plugin ".concat(plugin8.pluginName, " more than once"); + } + }); + plugins.push(plugin8); + }, + pluginEvent: function pluginEvent(eventName, sortable, evt) { + var _this = this; + this.eventCanceled = false; + evt.cancel = function() { + _this.eventCanceled = true; + }; + var eventNameGlobal = eventName + "Global"; + plugins.forEach(function(plugin8) { + if (!sortable[plugin8.pluginName]) + return; + if (sortable[plugin8.pluginName][eventNameGlobal]) { + sortable[plugin8.pluginName][eventNameGlobal](_objectSpread2({ + sortable + }, evt)); + } + if (sortable.options[plugin8.pluginName] && sortable[plugin8.pluginName][eventName]) { + sortable[plugin8.pluginName][eventName](_objectSpread2({ + sortable + }, evt)); + } + }); + }, + initializePlugins: function initializePlugins(sortable, el, defaults4, options) { + plugins.forEach(function(plugin8) { + var pluginName = plugin8.pluginName; + if (!sortable.options[pluginName] && !plugin8.initializeByDefault) + return; + var initialized = new plugin8(sortable, el, sortable.options); + initialized.sortable = sortable; + initialized.options = sortable.options; + sortable[pluginName] = initialized; + _extends(defaults4, initialized.defaults); + }); + for (var option3 in sortable.options) { + if (!sortable.options.hasOwnProperty(option3)) + continue; + var modified = this.modifyOption(sortable, option3, sortable.options[option3]); + if (typeof modified !== "undefined") { + sortable.options[option3] = modified; + } + } + }, + getEventProperties: function getEventProperties(name2, sortable) { + var eventProperties = {}; + plugins.forEach(function(plugin8) { + if (typeof plugin8.eventProperties !== "function") + return; + _extends(eventProperties, plugin8.eventProperties.call(sortable[plugin8.pluginName], name2)); + }); + return eventProperties; + }, + modifyOption: function modifyOption(sortable, name2, value) { + var modifiedValue; + plugins.forEach(function(plugin8) { + if (!sortable[plugin8.pluginName]) + return; + if (plugin8.optionListeners && typeof plugin8.optionListeners[name2] === "function") { + modifiedValue = plugin8.optionListeners[name2].call(sortable[plugin8.pluginName], value); + } + }); + return modifiedValue; + } +}; +function dispatchEvent(_ref) { + var sortable = _ref.sortable, rootEl2 = _ref.rootEl, name2 = _ref.name, targetEl = _ref.targetEl, cloneEl2 = _ref.cloneEl, toEl = _ref.toEl, fromEl = _ref.fromEl, oldIndex2 = _ref.oldIndex, newIndex2 = _ref.newIndex, oldDraggableIndex2 = _ref.oldDraggableIndex, newDraggableIndex2 = _ref.newDraggableIndex, originalEvent = _ref.originalEvent, putSortable2 = _ref.putSortable, extraEventProperties = _ref.extraEventProperties; + sortable = sortable || rootEl2 && rootEl2[expando]; + if (!sortable) + return; + var evt, options = sortable.options, onName = "on" + name2.charAt(0).toUpperCase() + name2.substr(1); + if (window.CustomEvent && !IE11OrLess && !Edge) { + evt = new CustomEvent(name2, { + bubbles: true, + cancelable: true + }); + } else { + evt = document.createEvent("Event"); + evt.initEvent(name2, true, true); + } + evt.to = toEl || rootEl2; + evt.from = fromEl || rootEl2; + evt.item = targetEl || rootEl2; + evt.clone = cloneEl2; + evt.oldIndex = oldIndex2; + evt.newIndex = newIndex2; + evt.oldDraggableIndex = oldDraggableIndex2; + evt.newDraggableIndex = newDraggableIndex2; + evt.originalEvent = originalEvent; + evt.pullMode = putSortable2 ? putSortable2.lastPutMode : void 0; + var allEventProperties = _objectSpread2(_objectSpread2({}, extraEventProperties), PluginManager.getEventProperties(name2, sortable)); + for (var option3 in allEventProperties) { + evt[option3] = allEventProperties[option3]; + } + if (rootEl2) { + rootEl2.dispatchEvent(evt); + } + if (options[onName]) { + options[onName].call(sortable, evt); + } +} +var _excluded = ["evt"]; +var pluginEvent2 = function pluginEvent3(eventName, sortable) { + var _ref = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {}, originalEvent = _ref.evt, data3 = _objectWithoutProperties(_ref, _excluded); + PluginManager.pluginEvent.bind(Sortable)(eventName, sortable, _objectSpread2({ + dragEl, + parentEl, + ghostEl, + rootEl, + nextEl, + lastDownEl, + cloneEl, + cloneHidden, + dragStarted: moved, + putSortable, + activeSortable: Sortable.active, + originalEvent, + oldIndex, + oldDraggableIndex, + newIndex, + newDraggableIndex, + hideGhostForTarget: _hideGhostForTarget, + unhideGhostForTarget: _unhideGhostForTarget, + cloneNowHidden: function cloneNowHidden() { + cloneHidden = true; + }, + cloneNowShown: function cloneNowShown() { + cloneHidden = false; + }, + dispatchSortableEvent: function dispatchSortableEvent(name2) { + _dispatchEvent({ + sortable, + name: name2, + originalEvent + }); + } + }, data3)); +}; +function _dispatchEvent(info) { + dispatchEvent(_objectSpread2({ + putSortable, + cloneEl, + targetEl: dragEl, + rootEl, + oldIndex, + oldDraggableIndex, + newIndex, + newDraggableIndex + }, info)); +} +var dragEl; +var parentEl; +var ghostEl; +var rootEl; +var nextEl; +var lastDownEl; +var cloneEl; +var cloneHidden; +var oldIndex; +var newIndex; +var oldDraggableIndex; +var newDraggableIndex; +var activeGroup; +var putSortable; +var awaitingDragStarted = false; +var ignoreNextClick = false; +var sortables = []; +var tapEvt; +var touchEvt; +var lastDx; +var lastDy; +var tapDistanceLeft; +var tapDistanceTop; +var moved; +var lastTarget; +var lastDirection; +var pastFirstInvertThresh = false; +var isCircumstantialInvert = false; +var targetMoveDistance; +var ghostRelativeParent; +var ghostRelativeParentInitialScroll = []; +var _silent = false; +var savedInputChecked = []; +var documentExists = typeof document !== "undefined"; +var PositionGhostAbsolutely = IOS; +var CSSFloatProperty = Edge || IE11OrLess ? "cssFloat" : "float"; +var supportDraggable = documentExists && !ChromeForAndroid && !IOS && "draggable" in document.createElement("div"); +var supportCssPointerEvents = function() { + if (!documentExists) + return; + if (IE11OrLess) { + return false; + } + var el = document.createElement("x"); + el.style.cssText = "pointer-events:auto"; + return el.style.pointerEvents === "auto"; +}(); +var _detectDirection = function _detectDirection2(el, options) { + var elCSS = css(el), elWidth = parseInt(elCSS.width) - parseInt(elCSS.paddingLeft) - parseInt(elCSS.paddingRight) - parseInt(elCSS.borderLeftWidth) - parseInt(elCSS.borderRightWidth), child1 = getChild(el, 0, options), child2 = getChild(el, 1, options), firstChildCSS = child1 && css(child1), secondChildCSS = child2 && css(child2), firstChildWidth = firstChildCSS && parseInt(firstChildCSS.marginLeft) + parseInt(firstChildCSS.marginRight) + getRect(child1).width, secondChildWidth = secondChildCSS && parseInt(secondChildCSS.marginLeft) + parseInt(secondChildCSS.marginRight) + getRect(child2).width; + if (elCSS.display === "flex") { + return elCSS.flexDirection === "column" || elCSS.flexDirection === "column-reverse" ? "vertical" : "horizontal"; + } + if (elCSS.display === "grid") { + return elCSS.gridTemplateColumns.split(" ").length <= 1 ? "vertical" : "horizontal"; + } + if (child1 && firstChildCSS["float"] && firstChildCSS["float"] !== "none") { + var touchingSideChild2 = firstChildCSS["float"] === "left" ? "left" : "right"; + return child2 && (secondChildCSS.clear === "both" || secondChildCSS.clear === touchingSideChild2) ? "vertical" : "horizontal"; + } + return child1 && (firstChildCSS.display === "block" || firstChildCSS.display === "flex" || firstChildCSS.display === "table" || firstChildCSS.display === "grid" || firstChildWidth >= elWidth && elCSS[CSSFloatProperty] === "none" || child2 && elCSS[CSSFloatProperty] === "none" && firstChildWidth + secondChildWidth > elWidth) ? "vertical" : "horizontal"; +}; +var _dragElInRowColumn = function _dragElInRowColumn2(dragRect, targetRect, vertical) { + var dragElS1Opp = vertical ? dragRect.left : dragRect.top, dragElS2Opp = vertical ? dragRect.right : dragRect.bottom, dragElOppLength = vertical ? dragRect.width : dragRect.height, targetS1Opp = vertical ? targetRect.left : targetRect.top, targetS2Opp = vertical ? targetRect.right : targetRect.bottom, targetOppLength = vertical ? targetRect.width : targetRect.height; + return dragElS1Opp === targetS1Opp || dragElS2Opp === targetS2Opp || dragElS1Opp + dragElOppLength / 2 === targetS1Opp + targetOppLength / 2; +}; +var _detectNearestEmptySortable = function _detectNearestEmptySortable2(x, y) { + var ret; + sortables.some(function(sortable) { + var threshold = sortable[expando].options.emptyInsertThreshold; + if (!threshold || lastChild(sortable)) + return; + var rect = getRect(sortable), insideHorizontally = x >= rect.left - threshold && x <= rect.right + threshold, insideVertically = y >= rect.top - threshold && y <= rect.bottom + threshold; + if (insideHorizontally && insideVertically) { + return ret = sortable; + } + }); + return ret; +}; +var _prepareGroup = function _prepareGroup2(options) { + function toFn(value, pull) { + return function(to, from, dragEl2, evt) { + var sameGroup = to.options.group.name && from.options.group.name && to.options.group.name === from.options.group.name; + if (value == null && (pull || sameGroup)) { + return true; + } else if (value == null || value === false) { + return false; + } else if (pull && value === "clone") { + return value; + } else if (typeof value === "function") { + return toFn(value(to, from, dragEl2, evt), pull)(to, from, dragEl2, evt); + } else { + var otherGroup = (pull ? to : from).options.group.name; + return value === true || typeof value === "string" && value === otherGroup || value.join && value.indexOf(otherGroup) > -1; + } + }; + } + var group = {}; + var originalGroup = options.group; + if (!originalGroup || _typeof(originalGroup) != "object") { + originalGroup = { + name: originalGroup + }; + } + group.name = originalGroup.name; + group.checkPull = toFn(originalGroup.pull, true); + group.checkPut = toFn(originalGroup.put); + group.revertClone = originalGroup.revertClone; + options.group = group; +}; +var _hideGhostForTarget = function _hideGhostForTarget2() { + if (!supportCssPointerEvents && ghostEl) { + css(ghostEl, "display", "none"); + } +}; +var _unhideGhostForTarget = function _unhideGhostForTarget2() { + if (!supportCssPointerEvents && ghostEl) { + css(ghostEl, "display", ""); + } +}; +if (documentExists) { + document.addEventListener("click", function(evt) { + if (ignoreNextClick) { + evt.preventDefault(); + evt.stopPropagation && evt.stopPropagation(); + evt.stopImmediatePropagation && evt.stopImmediatePropagation(); + ignoreNextClick = false; + return false; + } + }, true); +} +var nearestEmptyInsertDetectEvent = function nearestEmptyInsertDetectEvent2(evt) { + if (dragEl) { + evt = evt.touches ? evt.touches[0] : evt; + var nearest = _detectNearestEmptySortable(evt.clientX, evt.clientY); + if (nearest) { + var event = {}; + for (var i in evt) { + if (evt.hasOwnProperty(i)) { + event[i] = evt[i]; + } + } + event.target = event.rootEl = nearest; + event.preventDefault = void 0; + event.stopPropagation = void 0; + nearest[expando]._onDragOver(event); + } + } +}; +var _checkOutsideTargetEl = function _checkOutsideTargetEl2(evt) { + if (dragEl) { + dragEl.parentNode[expando]._isOutsideThisEl(evt.target); + } +}; +function Sortable(el, options) { + if (!(el && el.nodeType && el.nodeType === 1)) { + throw "Sortable: `el` must be an HTMLElement, not ".concat({}.toString.call(el)); + } + this.el = el; + this.options = options = _extends({}, options); + el[expando] = this; + var defaults4 = { + group: null, + sort: true, + disabled: false, + store: null, + handle: null, + draggable: /^[uo]l$/i.test(el.nodeName) ? ">li" : ">*", + swapThreshold: 1, + invertSwap: false, + invertedSwapThreshold: null, + removeCloneOnHide: true, + direction: function direction() { + return _detectDirection(el, this.options); + }, + ghostClass: "sortable-ghost", + chosenClass: "sortable-chosen", + dragClass: "sortable-drag", + ignore: "a, img", + filter: null, + preventOnFilter: true, + animation: 0, + easing: null, + setData: function setData(dataTransfer, dragEl2) { + dataTransfer.setData("Text", dragEl2.textContent); + }, + dropBubble: false, + dragoverBubble: false, + dataIdAttr: "data-id", + delay: 0, + delayOnTouchOnly: false, + touchStartThreshold: (Number.parseInt ? Number : window).parseInt(window.devicePixelRatio, 10) || 1, + forceFallback: false, + fallbackClass: "sortable-fallback", + fallbackOnBody: false, + fallbackTolerance: 0, + fallbackOffset: { + x: 0, + y: 0 + }, + supportPointer: Sortable.supportPointer !== false && "PointerEvent" in window && !Safari, + emptyInsertThreshold: 5 + }; + PluginManager.initializePlugins(this, el, defaults4); + for (var name2 in defaults4) { + !(name2 in options) && (options[name2] = defaults4[name2]); + } + _prepareGroup(options); + for (var fn2 in this) { + if (fn2.charAt(0) === "_" && typeof this[fn2] === "function") { + this[fn2] = this[fn2].bind(this); + } + } + this.nativeDraggable = options.forceFallback ? false : supportDraggable; + if (this.nativeDraggable) { + this.options.touchStartThreshold = 1; + } + if (options.supportPointer) { + on2(el, "pointerdown", this._onTapStart); + } else { + on2(el, "mousedown", this._onTapStart); + on2(el, "touchstart", this._onTapStart); + } + if (this.nativeDraggable) { + on2(el, "dragover", this); + on2(el, "dragenter", this); + } + sortables.push(this.el); + options.store && options.store.get && this.sort(options.store.get(this) || []); + _extends(this, AnimationStateManager()); +} +Sortable.prototype = { + constructor: Sortable, + _isOutsideThisEl: function _isOutsideThisEl(target) { + if (!this.el.contains(target) && target !== this.el) { + lastTarget = null; + } + }, + _getDirection: function _getDirection(evt, target) { + return typeof this.options.direction === "function" ? this.options.direction.call(this, evt, target, dragEl) : this.options.direction; + }, + _onTapStart: function _onTapStart(evt) { + if (!evt.cancelable) + return; + var _this = this, el = this.el, options = this.options, preventOnFilter = options.preventOnFilter, type = evt.type, touch = evt.touches && evt.touches[0] || evt.pointerType && evt.pointerType === "touch" && evt, target = (touch || evt).target, originalTarget = evt.target.shadowRoot && (evt.path && evt.path[0] || evt.composedPath && evt.composedPath()[0]) || target, filter = options.filter; + _saveInputCheckedState(el); + if (dragEl) { + return; + } + if (/mousedown|pointerdown/.test(type) && evt.button !== 0 || options.disabled) { + return; + } + if (originalTarget.isContentEditable) { + return; + } + if (!this.nativeDraggable && Safari && target && target.tagName.toUpperCase() === "SELECT") { + return; + } + target = closest(target, options.draggable, el, false); + if (target && target.animated) { + return; + } + if (lastDownEl === target) { + return; + } + oldIndex = index(target); + oldDraggableIndex = index(target, options.draggable); + if (typeof filter === "function") { + if (filter.call(this, evt, target, this)) { + _dispatchEvent({ + sortable: _this, + rootEl: originalTarget, + name: "filter", + targetEl: target, + toEl: el, + fromEl: el + }); + pluginEvent2("filter", _this, { + evt + }); + preventOnFilter && evt.cancelable && evt.preventDefault(); + return; + } + } else if (filter) { + filter = filter.split(",").some(function(criteria) { + criteria = closest(originalTarget, criteria.trim(), el, false); + if (criteria) { + _dispatchEvent({ + sortable: _this, + rootEl: criteria, + name: "filter", + targetEl: target, + fromEl: el, + toEl: el + }); + pluginEvent2("filter", _this, { + evt + }); + return true; + } + }); + if (filter) { + preventOnFilter && evt.cancelable && evt.preventDefault(); + return; + } + } + if (options.handle && !closest(originalTarget, options.handle, el, false)) { + return; + } + this._prepareDragStart(evt, touch, target); + }, + _prepareDragStart: function _prepareDragStart(evt, touch, target) { + var _this = this, el = _this.el, options = _this.options, ownerDocument = el.ownerDocument, dragStartFn; + if (target && !dragEl && target.parentNode === el) { + var dragRect = getRect(target); + rootEl = el; + dragEl = target; + parentEl = dragEl.parentNode; + nextEl = dragEl.nextSibling; + lastDownEl = target; + activeGroup = options.group; + Sortable.dragged = dragEl; + tapEvt = { + target: dragEl, + clientX: (touch || evt).clientX, + clientY: (touch || evt).clientY + }; + tapDistanceLeft = tapEvt.clientX - dragRect.left; + tapDistanceTop = tapEvt.clientY - dragRect.top; + this._lastX = (touch || evt).clientX; + this._lastY = (touch || evt).clientY; + dragEl.style["will-change"] = "all"; + dragStartFn = function dragStartFn2() { + pluginEvent2("delayEnded", _this, { + evt + }); + if (Sortable.eventCanceled) { + _this._onDrop(); + return; + } + _this._disableDelayedDragEvents(); + if (!FireFox && _this.nativeDraggable) { + dragEl.draggable = true; + } + _this._triggerDragStart(evt, touch); + _dispatchEvent({ + sortable: _this, + name: "choose", + originalEvent: evt + }); + toggleClass(dragEl, options.chosenClass, true); + }; + options.ignore.split(",").forEach(function(criteria) { + find2(dragEl, criteria.trim(), _disableDraggable); + }); + on2(ownerDocument, "dragover", nearestEmptyInsertDetectEvent); + on2(ownerDocument, "mousemove", nearestEmptyInsertDetectEvent); + on2(ownerDocument, "touchmove", nearestEmptyInsertDetectEvent); + on2(ownerDocument, "mouseup", _this._onDrop); + on2(ownerDocument, "touchend", _this._onDrop); + on2(ownerDocument, "touchcancel", _this._onDrop); + if (FireFox && this.nativeDraggable) { + this.options.touchStartThreshold = 4; + dragEl.draggable = true; + } + pluginEvent2("delayStart", this, { + evt + }); + if (options.delay && (!options.delayOnTouchOnly || touch) && (!this.nativeDraggable || !(Edge || IE11OrLess))) { + if (Sortable.eventCanceled) { + this._onDrop(); + return; + } + on2(ownerDocument, "mouseup", _this._disableDelayedDrag); + on2(ownerDocument, "touchend", _this._disableDelayedDrag); + on2(ownerDocument, "touchcancel", _this._disableDelayedDrag); + on2(ownerDocument, "mousemove", _this._delayedDragTouchMoveHandler); + on2(ownerDocument, "touchmove", _this._delayedDragTouchMoveHandler); + options.supportPointer && on2(ownerDocument, "pointermove", _this._delayedDragTouchMoveHandler); + _this._dragStartTimer = setTimeout(dragStartFn, options.delay); + } else { + dragStartFn(); + } + } + }, + _delayedDragTouchMoveHandler: function _delayedDragTouchMoveHandler(e2) { + var touch = e2.touches ? e2.touches[0] : e2; + if (Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) >= Math.floor(this.options.touchStartThreshold / (this.nativeDraggable && window.devicePixelRatio || 1))) { + this._disableDelayedDrag(); + } + }, + _disableDelayedDrag: function _disableDelayedDrag() { + dragEl && _disableDraggable(dragEl); + clearTimeout(this._dragStartTimer); + this._disableDelayedDragEvents(); + }, + _disableDelayedDragEvents: function _disableDelayedDragEvents() { + var ownerDocument = this.el.ownerDocument; + off(ownerDocument, "mouseup", this._disableDelayedDrag); + off(ownerDocument, "touchend", this._disableDelayedDrag); + off(ownerDocument, "touchcancel", this._disableDelayedDrag); + off(ownerDocument, "mousemove", this._delayedDragTouchMoveHandler); + off(ownerDocument, "touchmove", this._delayedDragTouchMoveHandler); + off(ownerDocument, "pointermove", this._delayedDragTouchMoveHandler); + }, + _triggerDragStart: function _triggerDragStart(evt, touch) { + touch = touch || evt.pointerType == "touch" && evt; + if (!this.nativeDraggable || touch) { + if (this.options.supportPointer) { + on2(document, "pointermove", this._onTouchMove); + } else if (touch) { + on2(document, "touchmove", this._onTouchMove); + } else { + on2(document, "mousemove", this._onTouchMove); + } + } else { + on2(dragEl, "dragend", this); + on2(rootEl, "dragstart", this._onDragStart); + } + try { + if (document.selection) { + _nextTick(function() { + document.selection.empty(); + }); + } else { + window.getSelection().removeAllRanges(); + } + } catch (err) { + } + }, + _dragStarted: function _dragStarted(fallback, evt) { + awaitingDragStarted = false; + if (rootEl && dragEl) { + pluginEvent2("dragStarted", this, { + evt + }); + if (this.nativeDraggable) { + on2(document, "dragover", _checkOutsideTargetEl); + } + var options = this.options; + !fallback && toggleClass(dragEl, options.dragClass, false); + toggleClass(dragEl, options.ghostClass, true); + Sortable.active = this; + fallback && this._appendGhost(); + _dispatchEvent({ + sortable: this, + name: "start", + originalEvent: evt + }); + } else { + this._nulling(); + } + }, + _emulateDragOver: function _emulateDragOver() { + if (touchEvt) { + this._lastX = touchEvt.clientX; + this._lastY = touchEvt.clientY; + _hideGhostForTarget(); + var target = document.elementFromPoint(touchEvt.clientX, touchEvt.clientY); + var parent = target; + while (target && target.shadowRoot) { + target = target.shadowRoot.elementFromPoint(touchEvt.clientX, touchEvt.clientY); + if (target === parent) + break; + parent = target; + } + dragEl.parentNode[expando]._isOutsideThisEl(target); + if (parent) { + do { + if (parent[expando]) { + var inserted = void 0; + inserted = parent[expando]._onDragOver({ + clientX: touchEvt.clientX, + clientY: touchEvt.clientY, + target, + rootEl: parent + }); + if (inserted && !this.options.dragoverBubble) { + break; + } + } + target = parent; + } while (parent = parent.parentNode); + } + _unhideGhostForTarget(); + } + }, + _onTouchMove: function _onTouchMove(evt) { + if (tapEvt) { + var options = this.options, fallbackTolerance = options.fallbackTolerance, fallbackOffset = options.fallbackOffset, touch = evt.touches ? evt.touches[0] : evt, ghostMatrix = ghostEl && matrix(ghostEl, true), scaleX = ghostEl && ghostMatrix && ghostMatrix.a, scaleY = ghostEl && ghostMatrix && ghostMatrix.d, relativeScrollOffset = PositionGhostAbsolutely && ghostRelativeParent && getRelativeScrollOffset(ghostRelativeParent), dx = (touch.clientX - tapEvt.clientX + fallbackOffset.x) / (scaleX || 1) + (relativeScrollOffset ? relativeScrollOffset[0] - ghostRelativeParentInitialScroll[0] : 0) / (scaleX || 1), dy = (touch.clientY - tapEvt.clientY + fallbackOffset.y) / (scaleY || 1) + (relativeScrollOffset ? relativeScrollOffset[1] - ghostRelativeParentInitialScroll[1] : 0) / (scaleY || 1); + if (!Sortable.active && !awaitingDragStarted) { + if (fallbackTolerance && Math.max(Math.abs(touch.clientX - this._lastX), Math.abs(touch.clientY - this._lastY)) < fallbackTolerance) { + return; + } + this._onDragStart(evt, true); + } + if (ghostEl) { + if (ghostMatrix) { + ghostMatrix.e += dx - (lastDx || 0); + ghostMatrix.f += dy - (lastDy || 0); + } else { + ghostMatrix = { + a: 1, + b: 0, + c: 0, + d: 1, + e: dx, + f: dy + }; + } + var cssMatrix = "matrix(".concat(ghostMatrix.a, ",").concat(ghostMatrix.b, ",").concat(ghostMatrix.c, ",").concat(ghostMatrix.d, ",").concat(ghostMatrix.e, ",").concat(ghostMatrix.f, ")"); + css(ghostEl, "webkitTransform", cssMatrix); + css(ghostEl, "mozTransform", cssMatrix); + css(ghostEl, "msTransform", cssMatrix); + css(ghostEl, "transform", cssMatrix); + lastDx = dx; + lastDy = dy; + touchEvt = touch; + } + evt.cancelable && evt.preventDefault(); + } + }, + _appendGhost: function _appendGhost() { + if (!ghostEl) { + var container = this.options.fallbackOnBody ? document.body : rootEl, rect = getRect(dragEl, true, PositionGhostAbsolutely, true, container), options = this.options; + if (PositionGhostAbsolutely) { + ghostRelativeParent = container; + while (css(ghostRelativeParent, "position") === "static" && css(ghostRelativeParent, "transform") === "none" && ghostRelativeParent !== document) { + ghostRelativeParent = ghostRelativeParent.parentNode; + } + if (ghostRelativeParent !== document.body && ghostRelativeParent !== document.documentElement) { + if (ghostRelativeParent === document) + ghostRelativeParent = getWindowScrollingElement(); + rect.top += ghostRelativeParent.scrollTop; + rect.left += ghostRelativeParent.scrollLeft; + } else { + ghostRelativeParent = getWindowScrollingElement(); + } + ghostRelativeParentInitialScroll = getRelativeScrollOffset(ghostRelativeParent); + } + ghostEl = dragEl.cloneNode(true); + toggleClass(ghostEl, options.ghostClass, false); + toggleClass(ghostEl, options.fallbackClass, true); + toggleClass(ghostEl, options.dragClass, true); + css(ghostEl, "transition", ""); + css(ghostEl, "transform", ""); + css(ghostEl, "box-sizing", "border-box"); + css(ghostEl, "margin", 0); + css(ghostEl, "top", rect.top); + css(ghostEl, "left", rect.left); + css(ghostEl, "width", rect.width); + css(ghostEl, "height", rect.height); + css(ghostEl, "opacity", "0.8"); + css(ghostEl, "position", PositionGhostAbsolutely ? "absolute" : "fixed"); + css(ghostEl, "zIndex", "100000"); + css(ghostEl, "pointerEvents", "none"); + Sortable.ghost = ghostEl; + container.appendChild(ghostEl); + css(ghostEl, "transform-origin", tapDistanceLeft / parseInt(ghostEl.style.width) * 100 + "% " + tapDistanceTop / parseInt(ghostEl.style.height) * 100 + "%"); + } + }, + _onDragStart: function _onDragStart(evt, fallback) { + var _this = this; + var dataTransfer = evt.dataTransfer; + var options = _this.options; + pluginEvent2("dragStart", this, { + evt + }); + if (Sortable.eventCanceled) { + this._onDrop(); + return; + } + pluginEvent2("setupClone", this); + if (!Sortable.eventCanceled) { + cloneEl = clone(dragEl); + cloneEl.draggable = false; + cloneEl.style["will-change"] = ""; + this._hideClone(); + toggleClass(cloneEl, this.options.chosenClass, false); + Sortable.clone = cloneEl; + } + _this.cloneId = _nextTick(function() { + pluginEvent2("clone", _this); + if (Sortable.eventCanceled) + return; + if (!_this.options.removeCloneOnHide) { + rootEl.insertBefore(cloneEl, dragEl); + } + _this._hideClone(); + _dispatchEvent({ + sortable: _this, + name: "clone" + }); + }); + !fallback && toggleClass(dragEl, options.dragClass, true); + if (fallback) { + ignoreNextClick = true; + _this._loopId = setInterval(_this._emulateDragOver, 50); + } else { + off(document, "mouseup", _this._onDrop); + off(document, "touchend", _this._onDrop); + off(document, "touchcancel", _this._onDrop); + if (dataTransfer) { + dataTransfer.effectAllowed = "move"; + options.setData && options.setData.call(_this, dataTransfer, dragEl); + } + on2(document, "drop", _this); + css(dragEl, "transform", "translateZ(0)"); + } + awaitingDragStarted = true; + _this._dragStartId = _nextTick(_this._dragStarted.bind(_this, fallback, evt)); + on2(document, "selectstart", _this); + moved = true; + if (Safari) { + css(document.body, "user-select", "none"); + } + }, + _onDragOver: function _onDragOver(evt) { + var el = this.el, target = evt.target, dragRect, targetRect, revert, options = this.options, group = options.group, activeSortable = Sortable.active, isOwner = activeGroup === group, canSort = options.sort, fromSortable = putSortable || activeSortable, vertical, _this = this, completedFired = false; + if (_silent) + return; + function dragOverEvent(name2, extra) { + pluginEvent2(name2, _this, _objectSpread2({ + evt, + isOwner, + axis: vertical ? "vertical" : "horizontal", + revert, + dragRect, + targetRect, + canSort, + fromSortable, + target, + completed, + onMove: function onMove(target2, after2) { + return _onMove(rootEl, el, dragEl, dragRect, target2, getRect(target2), evt, after2); + }, + changed + }, extra)); + } + function capture() { + dragOverEvent("dragOverAnimationCapture"); + _this.captureAnimationState(); + if (_this !== fromSortable) { + fromSortable.captureAnimationState(); + } + } + function completed(insertion) { + dragOverEvent("dragOverCompleted", { + insertion + }); + if (insertion) { + if (isOwner) { + activeSortable._hideClone(); + } else { + activeSortable._showClone(_this); + } + if (_this !== fromSortable) { + toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : activeSortable.options.ghostClass, false); + toggleClass(dragEl, options.ghostClass, true); + } + if (putSortable !== _this && _this !== Sortable.active) { + putSortable = _this; + } else if (_this === Sortable.active && putSortable) { + putSortable = null; + } + if (fromSortable === _this) { + _this._ignoreWhileAnimating = target; + } + _this.animateAll(function() { + dragOverEvent("dragOverAnimationComplete"); + _this._ignoreWhileAnimating = null; + }); + if (_this !== fromSortable) { + fromSortable.animateAll(); + fromSortable._ignoreWhileAnimating = null; + } + } + if (target === dragEl && !dragEl.animated || target === el && !target.animated) { + lastTarget = null; + } + if (!options.dragoverBubble && !evt.rootEl && target !== document) { + dragEl.parentNode[expando]._isOutsideThisEl(evt.target); + !insertion && nearestEmptyInsertDetectEvent(evt); + } + !options.dragoverBubble && evt.stopPropagation && evt.stopPropagation(); + return completedFired = true; + } + function changed() { + newIndex = index(dragEl); + newDraggableIndex = index(dragEl, options.draggable); + _dispatchEvent({ + sortable: _this, + name: "change", + toEl: el, + newIndex, + newDraggableIndex, + originalEvent: evt + }); + } + if (evt.preventDefault !== void 0) { + evt.cancelable && evt.preventDefault(); + } + target = closest(target, options.draggable, el, true); + dragOverEvent("dragOver"); + if (Sortable.eventCanceled) + return completedFired; + if (dragEl.contains(evt.target) || target.animated && target.animatingX && target.animatingY || _this._ignoreWhileAnimating === target) { + return completed(false); + } + ignoreNextClick = false; + if (activeSortable && !options.disabled && (isOwner ? canSort || (revert = parentEl !== rootEl) : putSortable === this || (this.lastPutMode = activeGroup.checkPull(this, activeSortable, dragEl, evt)) && group.checkPut(this, activeSortable, dragEl, evt))) { + vertical = this._getDirection(evt, target) === "vertical"; + dragRect = getRect(dragEl); + dragOverEvent("dragOverValid"); + if (Sortable.eventCanceled) + return completedFired; + if (revert) { + parentEl = rootEl; + capture(); + this._hideClone(); + dragOverEvent("revert"); + if (!Sortable.eventCanceled) { + if (nextEl) { + rootEl.insertBefore(dragEl, nextEl); + } else { + rootEl.appendChild(dragEl); + } + } + return completed(true); + } + var elLastChild = lastChild(el, options.draggable); + if (!elLastChild || _ghostIsLast(evt, vertical, this) && !elLastChild.animated) { + if (elLastChild === dragEl) { + return completed(false); + } + if (elLastChild && el === evt.target) { + target = elLastChild; + } + if (target) { + targetRect = getRect(target); + } + if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, !!target) !== false) { + capture(); + el.appendChild(dragEl); + parentEl = el; + changed(); + return completed(true); + } + } else if (elLastChild && _ghostIsFirst(evt, vertical, this)) { + var firstChild = getChild(el, 0, options, true); + if (firstChild === dragEl) { + return completed(false); + } + target = firstChild; + targetRect = getRect(target); + if (_onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, false) !== false) { + capture(); + el.insertBefore(dragEl, firstChild); + parentEl = el; + changed(); + return completed(true); + } + } else if (target.parentNode === el) { + targetRect = getRect(target); + var direction = 0, targetBeforeFirstSwap, differentLevel = dragEl.parentNode !== el, differentRowCol = !_dragElInRowColumn(dragEl.animated && dragEl.toRect || dragRect, target.animated && target.toRect || targetRect, vertical), side1 = vertical ? "top" : "left", scrolledPastTop = isScrolledPast(target, "top", "top") || isScrolledPast(dragEl, "top", "top"), scrollBefore = scrolledPastTop ? scrolledPastTop.scrollTop : void 0; + if (lastTarget !== target) { + targetBeforeFirstSwap = targetRect[side1]; + pastFirstInvertThresh = false; + isCircumstantialInvert = !differentRowCol && options.invertSwap || differentLevel; + } + direction = _getSwapDirection(evt, target, targetRect, vertical, differentRowCol ? 1 : options.swapThreshold, options.invertedSwapThreshold == null ? options.swapThreshold : options.invertedSwapThreshold, isCircumstantialInvert, lastTarget === target); + var sibling; + if (direction !== 0) { + var dragIndex = index(dragEl); + do { + dragIndex -= direction; + sibling = parentEl.children[dragIndex]; + } while (sibling && (css(sibling, "display") === "none" || sibling === ghostEl)); + } + if (direction === 0 || sibling === target) { + return completed(false); + } + lastTarget = target; + lastDirection = direction; + var nextSibling = target.nextElementSibling, after = false; + after = direction === 1; + var moveVector = _onMove(rootEl, el, dragEl, dragRect, target, targetRect, evt, after); + if (moveVector !== false) { + if (moveVector === 1 || moveVector === -1) { + after = moveVector === 1; + } + _silent = true; + setTimeout(_unsilent, 30); + capture(); + if (after && !nextSibling) { + el.appendChild(dragEl); + } else { + target.parentNode.insertBefore(dragEl, after ? nextSibling : target); + } + if (scrolledPastTop) { + scrollBy(scrolledPastTop, 0, scrollBefore - scrolledPastTop.scrollTop); + } + parentEl = dragEl.parentNode; + if (targetBeforeFirstSwap !== void 0 && !isCircumstantialInvert) { + targetMoveDistance = Math.abs(targetBeforeFirstSwap - getRect(target)[side1]); + } + changed(); + return completed(true); + } + } + if (el.contains(dragEl)) { + return completed(false); + } + } + return false; + }, + _ignoreWhileAnimating: null, + _offMoveEvents: function _offMoveEvents() { + off(document, "mousemove", this._onTouchMove); + off(document, "touchmove", this._onTouchMove); + off(document, "pointermove", this._onTouchMove); + off(document, "dragover", nearestEmptyInsertDetectEvent); + off(document, "mousemove", nearestEmptyInsertDetectEvent); + off(document, "touchmove", nearestEmptyInsertDetectEvent); + }, + _offUpEvents: function _offUpEvents() { + var ownerDocument = this.el.ownerDocument; + off(ownerDocument, "mouseup", this._onDrop); + off(ownerDocument, "touchend", this._onDrop); + off(ownerDocument, "pointerup", this._onDrop); + off(ownerDocument, "touchcancel", this._onDrop); + off(document, "selectstart", this); + }, + _onDrop: function _onDrop(evt) { + var el = this.el, options = this.options; + newIndex = index(dragEl); + newDraggableIndex = index(dragEl, options.draggable); + pluginEvent2("drop", this, { + evt + }); + parentEl = dragEl && dragEl.parentNode; + newIndex = index(dragEl); + newDraggableIndex = index(dragEl, options.draggable); + if (Sortable.eventCanceled) { + this._nulling(); + return; + } + awaitingDragStarted = false; + isCircumstantialInvert = false; + pastFirstInvertThresh = false; + clearInterval(this._loopId); + clearTimeout(this._dragStartTimer); + _cancelNextTick(this.cloneId); + _cancelNextTick(this._dragStartId); + if (this.nativeDraggable) { + off(document, "drop", this); + off(el, "dragstart", this._onDragStart); + } + this._offMoveEvents(); + this._offUpEvents(); + if (Safari) { + css(document.body, "user-select", ""); + } + css(dragEl, "transform", ""); + if (evt) { + if (moved) { + evt.cancelable && evt.preventDefault(); + !options.dropBubble && evt.stopPropagation(); + } + ghostEl && ghostEl.parentNode && ghostEl.parentNode.removeChild(ghostEl); + if (rootEl === parentEl || putSortable && putSortable.lastPutMode !== "clone") { + cloneEl && cloneEl.parentNode && cloneEl.parentNode.removeChild(cloneEl); + } + if (dragEl) { + if (this.nativeDraggable) { + off(dragEl, "dragend", this); + } + _disableDraggable(dragEl); + dragEl.style["will-change"] = ""; + if (moved && !awaitingDragStarted) { + toggleClass(dragEl, putSortable ? putSortable.options.ghostClass : this.options.ghostClass, false); + } + toggleClass(dragEl, this.options.chosenClass, false); + _dispatchEvent({ + sortable: this, + name: "unchoose", + toEl: parentEl, + newIndex: null, + newDraggableIndex: null, + originalEvent: evt + }); + if (rootEl !== parentEl) { + if (newIndex >= 0) { + _dispatchEvent({ + rootEl: parentEl, + name: "add", + toEl: parentEl, + fromEl: rootEl, + originalEvent: evt + }); + _dispatchEvent({ + sortable: this, + name: "remove", + toEl: parentEl, + originalEvent: evt + }); + _dispatchEvent({ + rootEl: parentEl, + name: "sort", + toEl: parentEl, + fromEl: rootEl, + originalEvent: evt + }); + _dispatchEvent({ + sortable: this, + name: "sort", + toEl: parentEl, + originalEvent: evt + }); + } + putSortable && putSortable.save(); + } else { + if (newIndex !== oldIndex) { + if (newIndex >= 0) { + _dispatchEvent({ + sortable: this, + name: "update", + toEl: parentEl, + originalEvent: evt + }); + _dispatchEvent({ + sortable: this, + name: "sort", + toEl: parentEl, + originalEvent: evt + }); + } + } + } + if (Sortable.active) { + if (newIndex == null || newIndex === -1) { + newIndex = oldIndex; + newDraggableIndex = oldDraggableIndex; + } + _dispatchEvent({ + sortable: this, + name: "end", + toEl: parentEl, + originalEvent: evt + }); + this.save(); + } + } + } + this._nulling(); + }, + _nulling: function _nulling() { + pluginEvent2("nulling", this); + rootEl = dragEl = parentEl = ghostEl = nextEl = cloneEl = lastDownEl = cloneHidden = tapEvt = touchEvt = moved = newIndex = newDraggableIndex = oldIndex = oldDraggableIndex = lastTarget = lastDirection = putSortable = activeGroup = Sortable.dragged = Sortable.ghost = Sortable.clone = Sortable.active = null; + savedInputChecked.forEach(function(el) { + el.checked = true; + }); + savedInputChecked.length = lastDx = lastDy = 0; + }, + handleEvent: function handleEvent(evt) { + switch (evt.type) { + case "drop": + case "dragend": + this._onDrop(evt); + break; + case "dragenter": + case "dragover": + if (dragEl) { + this._onDragOver(evt); + _globalDragOver(evt); + } + break; + case "selectstart": + evt.preventDefault(); + break; + } + }, + toArray: function toArray2() { + var order = [], el, children = this.el.children, i = 0, n2 = children.length, options = this.options; + for (; i < n2; i++) { + el = children[i]; + if (closest(el, options.draggable, this.el, false)) { + order.push(el.getAttribute(options.dataIdAttr) || _generateId(el)); + } + } + return order; + }, + sort: function sort(order, useAnimation) { + var items = {}, rootEl2 = this.el; + this.toArray().forEach(function(id, i) { + var el = rootEl2.children[i]; + if (closest(el, this.options.draggable, rootEl2, false)) { + items[id] = el; + } + }, this); + useAnimation && this.captureAnimationState(); + order.forEach(function(id) { + if (items[id]) { + rootEl2.removeChild(items[id]); + rootEl2.appendChild(items[id]); + } + }); + useAnimation && this.animateAll(); + }, + save: function save() { + var store = this.options.store; + store && store.set && store.set(this); + }, + closest: function closest$1(el, selector) { + return closest(el, selector || this.options.draggable, this.el, false); + }, + option: function option2(name2, value) { + var options = this.options; + if (value === void 0) { + return options[name2]; + } else { + var modifiedValue = PluginManager.modifyOption(this, name2, value); + if (typeof modifiedValue !== "undefined") { + options[name2] = modifiedValue; + } else { + options[name2] = value; + } + if (name2 === "group") { + _prepareGroup(options); + } + } + }, + destroy: function destroy2() { + pluginEvent2("destroy", this); + var el = this.el; + el[expando] = null; + off(el, "mousedown", this._onTapStart); + off(el, "touchstart", this._onTapStart); + off(el, "pointerdown", this._onTapStart); + if (this.nativeDraggable) { + off(el, "dragover", this); + off(el, "dragenter", this); + } + Array.prototype.forEach.call(el.querySelectorAll("[draggable]"), function(el2) { + el2.removeAttribute("draggable"); + }); + this._onDrop(); + this._disableDelayedDragEvents(); + sortables.splice(sortables.indexOf(this.el), 1); + this.el = el = null; + }, + _hideClone: function _hideClone() { + if (!cloneHidden) { + pluginEvent2("hideClone", this); + if (Sortable.eventCanceled) + return; + css(cloneEl, "display", "none"); + if (this.options.removeCloneOnHide && cloneEl.parentNode) { + cloneEl.parentNode.removeChild(cloneEl); + } + cloneHidden = true; + } + }, + _showClone: function _showClone(putSortable2) { + if (putSortable2.lastPutMode !== "clone") { + this._hideClone(); + return; + } + if (cloneHidden) { + pluginEvent2("showClone", this); + if (Sortable.eventCanceled) + return; + if (dragEl.parentNode == rootEl && !this.options.group.revertClone) { + rootEl.insertBefore(cloneEl, dragEl); + } else if (nextEl) { + rootEl.insertBefore(cloneEl, nextEl); + } else { + rootEl.appendChild(cloneEl); + } + if (this.options.group.revertClone) { + this.animate(dragEl, cloneEl); + } + css(cloneEl, "display", ""); + cloneHidden = false; + } + } +}; +function _globalDragOver(evt) { + if (evt.dataTransfer) { + evt.dataTransfer.dropEffect = "move"; + } + evt.cancelable && evt.preventDefault(); +} +function _onMove(fromEl, toEl, dragEl2, dragRect, targetEl, targetRect, originalEvent, willInsertAfter) { + var evt, sortable = fromEl[expando], onMoveFn = sortable.options.onMove, retVal; + if (window.CustomEvent && !IE11OrLess && !Edge) { + evt = new CustomEvent("move", { + bubbles: true, + cancelable: true + }); + } else { + evt = document.createEvent("Event"); + evt.initEvent("move", true, true); + } + evt.to = toEl; + evt.from = fromEl; + evt.dragged = dragEl2; + evt.draggedRect = dragRect; + evt.related = targetEl || toEl; + evt.relatedRect = targetRect || getRect(toEl); + evt.willInsertAfter = willInsertAfter; + evt.originalEvent = originalEvent; + fromEl.dispatchEvent(evt); + if (onMoveFn) { + retVal = onMoveFn.call(sortable, evt, originalEvent); + } + return retVal; +} +function _disableDraggable(el) { + el.draggable = false; +} +function _unsilent() { + _silent = false; +} +function _ghostIsFirst(evt, vertical, sortable) { + var rect = getRect(getChild(sortable.el, 0, sortable.options, true)); + var spacer = 10; + return vertical ? evt.clientX < rect.left - spacer || evt.clientY < rect.top && evt.clientX < rect.right : evt.clientY < rect.top - spacer || evt.clientY < rect.bottom && evt.clientX < rect.left; +} +function _ghostIsLast(evt, vertical, sortable) { + var rect = getRect(lastChild(sortable.el, sortable.options.draggable)); + var spacer = 10; + return vertical ? evt.clientX > rect.right + spacer || evt.clientX <= rect.right && evt.clientY > rect.bottom && evt.clientX >= rect.left : evt.clientX > rect.right && evt.clientY > rect.top || evt.clientX <= rect.right && evt.clientY > rect.bottom + spacer; +} +function _getSwapDirection(evt, target, targetRect, vertical, swapThreshold, invertedSwapThreshold, invertSwap, isLastTarget) { + var mouseOnAxis = vertical ? evt.clientY : evt.clientX, targetLength = vertical ? targetRect.height : targetRect.width, targetS1 = vertical ? targetRect.top : targetRect.left, targetS2 = vertical ? targetRect.bottom : targetRect.right, invert = false; + if (!invertSwap) { + if (isLastTarget && targetMoveDistance < targetLength * swapThreshold) { + if (!pastFirstInvertThresh && (lastDirection === 1 ? mouseOnAxis > targetS1 + targetLength * invertedSwapThreshold / 2 : mouseOnAxis < targetS2 - targetLength * invertedSwapThreshold / 2)) { + pastFirstInvertThresh = true; + } + if (!pastFirstInvertThresh) { + if (lastDirection === 1 ? mouseOnAxis < targetS1 + targetMoveDistance : mouseOnAxis > targetS2 - targetMoveDistance) { + return -lastDirection; + } + } else { + invert = true; + } + } else { + if (mouseOnAxis > targetS1 + targetLength * (1 - swapThreshold) / 2 && mouseOnAxis < targetS2 - targetLength * (1 - swapThreshold) / 2) { + return _getInsertDirection(target); + } + } + } + invert = invert || invertSwap; + if (invert) { + if (mouseOnAxis < targetS1 + targetLength * invertedSwapThreshold / 2 || mouseOnAxis > targetS2 - targetLength * invertedSwapThreshold / 2) { + return mouseOnAxis > targetS1 + targetLength / 2 ? 1 : -1; + } + } + return 0; +} +function _getInsertDirection(target) { + if (index(dragEl) < index(target)) { + return 1; + } else { + return -1; + } +} +function _generateId(el) { + var str = el.tagName + el.className + el.src + el.href + el.textContent, i = str.length, sum = 0; + while (i--) { + sum += str.charCodeAt(i); + } + return sum.toString(36); +} +function _saveInputCheckedState(root2) { + savedInputChecked.length = 0; + var inputs = root2.getElementsByTagName("input"); + var idx = inputs.length; + while (idx--) { + var el = inputs[idx]; + el.checked && savedInputChecked.push(el); + } +} +function _nextTick(fn2) { + return setTimeout(fn2, 0); +} +function _cancelNextTick(id) { + return clearTimeout(id); +} +if (documentExists) { + on2(document, "touchmove", function(evt) { + if ((Sortable.active || awaitingDragStarted) && evt.cancelable) { + evt.preventDefault(); + } + }); +} +Sortable.utils = { + on: on2, + off, + css, + find: find2, + is: function is(el, selector) { + return !!closest(el, selector, el, false); + }, + extend, + throttle, + closest, + toggleClass, + clone, + index, + nextTick: _nextTick, + cancelNextTick: _cancelNextTick, + detectDirection: _detectDirection, + getChild +}; +Sortable.get = function(element) { + return element[expando]; +}; +Sortable.mount = function() { + for (var _len = arguments.length, plugins2 = new Array(_len), _key = 0; _key < _len; _key++) { + plugins2[_key] = arguments[_key]; + } + if (plugins2[0].constructor === Array) + plugins2 = plugins2[0]; + plugins2.forEach(function(plugin8) { + if (!plugin8.prototype || !plugin8.prototype.constructor) { + throw "Sortable: Mounted plugin must be a constructor function, not ".concat({}.toString.call(plugin8)); + } + if (plugin8.utils) + Sortable.utils = _objectSpread2(_objectSpread2({}, Sortable.utils), plugin8.utils); + PluginManager.mount(plugin8); + }); +}; +Sortable.create = function(el, options) { + return new Sortable(el, options); +}; +Sortable.version = version; +var autoScrolls = []; +var scrollEl; +var scrollRootEl; +var scrolling = false; +var lastAutoScrollX; +var lastAutoScrollY; +var touchEvt$1; +var pointerElemChangedInterval; +function AutoScrollPlugin() { + function AutoScroll() { + this.defaults = { + scroll: true, + forceAutoScrollFallback: false, + scrollSensitivity: 30, + scrollSpeed: 10, + bubbleScroll: true + }; + for (var fn2 in this) { + if (fn2.charAt(0) === "_" && typeof this[fn2] === "function") { + this[fn2] = this[fn2].bind(this); + } + } + } + AutoScroll.prototype = { + dragStarted: function dragStarted(_ref) { + var originalEvent = _ref.originalEvent; + if (this.sortable.nativeDraggable) { + on2(document, "dragover", this._handleAutoScroll); + } else { + if (this.options.supportPointer) { + on2(document, "pointermove", this._handleFallbackAutoScroll); + } else if (originalEvent.touches) { + on2(document, "touchmove", this._handleFallbackAutoScroll); + } else { + on2(document, "mousemove", this._handleFallbackAutoScroll); + } + } + }, + dragOverCompleted: function dragOverCompleted(_ref2) { + var originalEvent = _ref2.originalEvent; + if (!this.options.dragOverBubble && !originalEvent.rootEl) { + this._handleAutoScroll(originalEvent); + } + }, + drop: function drop4() { + if (this.sortable.nativeDraggable) { + off(document, "dragover", this._handleAutoScroll); + } else { + off(document, "pointermove", this._handleFallbackAutoScroll); + off(document, "touchmove", this._handleFallbackAutoScroll); + off(document, "mousemove", this._handleFallbackAutoScroll); + } + clearPointerElemChangedInterval(); + clearAutoScrolls(); + cancelThrottle(); + }, + nulling: function nulling() { + touchEvt$1 = scrollRootEl = scrollEl = scrolling = pointerElemChangedInterval = lastAutoScrollX = lastAutoScrollY = null; + autoScrolls.length = 0; + }, + _handleFallbackAutoScroll: function _handleFallbackAutoScroll(evt) { + this._handleAutoScroll(evt, true); + }, + _handleAutoScroll: function _handleAutoScroll(evt, fallback) { + var _this = this; + var x = (evt.touches ? evt.touches[0] : evt).clientX, y = (evt.touches ? evt.touches[0] : evt).clientY, elem = document.elementFromPoint(x, y); + touchEvt$1 = evt; + if (fallback || this.options.forceAutoScrollFallback || Edge || IE11OrLess || Safari) { + autoScroll(evt, this.options, elem, fallback); + var ogElemScroller = getParentAutoScrollElement(elem, true); + if (scrolling && (!pointerElemChangedInterval || x !== lastAutoScrollX || y !== lastAutoScrollY)) { + pointerElemChangedInterval && clearPointerElemChangedInterval(); + pointerElemChangedInterval = setInterval(function() { + var newElem = getParentAutoScrollElement(document.elementFromPoint(x, y), true); + if (newElem !== ogElemScroller) { + ogElemScroller = newElem; + clearAutoScrolls(); + } + autoScroll(evt, _this.options, newElem, fallback); + }, 10); + lastAutoScrollX = x; + lastAutoScrollY = y; + } + } else { + if (!this.options.bubbleScroll || getParentAutoScrollElement(elem, true) === getWindowScrollingElement()) { + clearAutoScrolls(); + return; + } + autoScroll(evt, this.options, getParentAutoScrollElement(elem, false), false); + } + } + }; + return _extends(AutoScroll, { + pluginName: "scroll", + initializeByDefault: true + }); +} +function clearAutoScrolls() { + autoScrolls.forEach(function(autoScroll2) { + clearInterval(autoScroll2.pid); + }); + autoScrolls = []; +} +function clearPointerElemChangedInterval() { + clearInterval(pointerElemChangedInterval); +} +var autoScroll = throttle(function(evt, options, rootEl2, isFallback) { + if (!options.scroll) + return; + var x = (evt.touches ? evt.touches[0] : evt).clientX, y = (evt.touches ? evt.touches[0] : evt).clientY, sens = options.scrollSensitivity, speed = options.scrollSpeed, winScroller = getWindowScrollingElement(); + var scrollThisInstance = false, scrollCustomFn; + if (scrollRootEl !== rootEl2) { + scrollRootEl = rootEl2; + clearAutoScrolls(); + scrollEl = options.scroll; + scrollCustomFn = options.scrollFn; + if (scrollEl === true) { + scrollEl = getParentAutoScrollElement(rootEl2, true); + } + } + var layersOut = 0; + var currentParent = scrollEl; + do { + var el = currentParent, rect = getRect(el), top = rect.top, bottom = rect.bottom, left = rect.left, right = rect.right, width = rect.width, height = rect.height, canScrollX = void 0, canScrollY = void 0, scrollWidth = el.scrollWidth, scrollHeight = el.scrollHeight, elCSS = css(el), scrollPosX = el.scrollLeft, scrollPosY = el.scrollTop; + if (el === winScroller) { + canScrollX = width < scrollWidth && (elCSS.overflowX === "auto" || elCSS.overflowX === "scroll" || elCSS.overflowX === "visible"); + canScrollY = height < scrollHeight && (elCSS.overflowY === "auto" || elCSS.overflowY === "scroll" || elCSS.overflowY === "visible"); + } else { + canScrollX = width < scrollWidth && (elCSS.overflowX === "auto" || elCSS.overflowX === "scroll"); + canScrollY = height < scrollHeight && (elCSS.overflowY === "auto" || elCSS.overflowY === "scroll"); + } + var vx = canScrollX && (Math.abs(right - x) <= sens && scrollPosX + width < scrollWidth) - (Math.abs(left - x) <= sens && !!scrollPosX); + var vy = canScrollY && (Math.abs(bottom - y) <= sens && scrollPosY + height < scrollHeight) - (Math.abs(top - y) <= sens && !!scrollPosY); + if (!autoScrolls[layersOut]) { + for (var i = 0; i <= layersOut; i++) { + if (!autoScrolls[i]) { + autoScrolls[i] = {}; + } + } + } + if (autoScrolls[layersOut].vx != vx || autoScrolls[layersOut].vy != vy || autoScrolls[layersOut].el !== el) { + autoScrolls[layersOut].el = el; + autoScrolls[layersOut].vx = vx; + autoScrolls[layersOut].vy = vy; + clearInterval(autoScrolls[layersOut].pid); + if (vx != 0 || vy != 0) { + scrollThisInstance = true; + autoScrolls[layersOut].pid = setInterval(function() { + if (isFallback && this.layer === 0) { + Sortable.active._onTouchMove(touchEvt$1); + } + var scrollOffsetY = autoScrolls[this.layer].vy ? autoScrolls[this.layer].vy * speed : 0; + var scrollOffsetX = autoScrolls[this.layer].vx ? autoScrolls[this.layer].vx * speed : 0; + if (typeof scrollCustomFn === "function") { + if (scrollCustomFn.call(Sortable.dragged.parentNode[expando], scrollOffsetX, scrollOffsetY, evt, touchEvt$1, autoScrolls[this.layer].el) !== "continue") { + return; + } + } + scrollBy(autoScrolls[this.layer].el, scrollOffsetX, scrollOffsetY); + }.bind({ + layer: layersOut + }), 24); + } + } + layersOut++; + } while (options.bubbleScroll && currentParent !== winScroller && (currentParent = getParentAutoScrollElement(currentParent, false))); + scrolling = scrollThisInstance; +}, 30); +var drop2 = function drop3(_ref) { + var originalEvent = _ref.originalEvent, putSortable2 = _ref.putSortable, dragEl2 = _ref.dragEl, activeSortable = _ref.activeSortable, dispatchSortableEvent = _ref.dispatchSortableEvent, hideGhostForTarget = _ref.hideGhostForTarget, unhideGhostForTarget = _ref.unhideGhostForTarget; + if (!originalEvent) + return; + var toSortable = putSortable2 || activeSortable; + hideGhostForTarget(); + var touch = originalEvent.changedTouches && originalEvent.changedTouches.length ? originalEvent.changedTouches[0] : originalEvent; + var target = document.elementFromPoint(touch.clientX, touch.clientY); + unhideGhostForTarget(); + if (toSortable && !toSortable.el.contains(target)) { + dispatchSortableEvent("spill"); + this.onSpill({ + dragEl: dragEl2, + putSortable: putSortable2 + }); + } +}; +function Revert() { +} +Revert.prototype = { + startIndex: null, + dragStart: function dragStart(_ref2) { + var oldDraggableIndex2 = _ref2.oldDraggableIndex; + this.startIndex = oldDraggableIndex2; + }, + onSpill: function onSpill(_ref3) { + var dragEl2 = _ref3.dragEl, putSortable2 = _ref3.putSortable; + this.sortable.captureAnimationState(); + if (putSortable2) { + putSortable2.captureAnimationState(); + } + var nextSibling = getChild(this.sortable.el, this.startIndex, this.options); + if (nextSibling) { + this.sortable.el.insertBefore(dragEl2, nextSibling); + } else { + this.sortable.el.appendChild(dragEl2); + } + this.sortable.animateAll(); + if (putSortable2) { + putSortable2.animateAll(); + } + }, + drop: drop2 +}; +_extends(Revert, { + pluginName: "revertOnSpill" +}); +function Remove() { +} +Remove.prototype = { + onSpill: function onSpill2(_ref4) { + var dragEl2 = _ref4.dragEl, putSortable2 = _ref4.putSortable; + var parentSortable = putSortable2 || this.sortable; + parentSortable.captureAnimationState(); + dragEl2.parentNode && dragEl2.parentNode.removeChild(dragEl2); + parentSortable.animateAll(); + }, + drop: drop2 +}; +_extends(Remove, { + pluginName: "removeOnSpill" +}); +Sortable.mount(new AutoScrollPlugin()); +Sortable.mount(Remove, Revert); +var sortable_esm_default = Sortable; + +// packages/forms/resources/js/components/key-value.js +var key_value_default = (Alpine) => { + Alpine.data("keyValueFormComponent", ({ + canAddRows, + canDeleteRows, + isSortable, + state: state2 + }) => ({ + canAddRows, + canDeleteRows, + isSortable, + state: state2, + rows: [], + init: function() { + for (let [value, key] of Object.entries(this.state ?? {})) { + this.rows.push({ + key, + value + }); + } + if (this.rows.length <= 0) { + this.addRow(); + } + if (this.isSortable) { + new sortable_esm_default(this.$refs.tableBody, { + onEnd: (event) => { + this.moveRow(event.oldIndex, event.newIndex); + } + }); + } + }, + addRow: function() { + if (!this.canAddRows) { + return; + } + this.rows.push({key: "", value: ""}); + this.updateState(); + }, + deleteRow: function(index2) { + if (!this.canDeleteRows) { + return; + } + this.rows.splice(index2, 1); + if (this.rows.length <= 0) { + this.addRow(); + } + this.updateState(); + }, + updateState: function() { + let state3 = {}; + this.rows.forEach((row) => { + state3[row.key] = row.value; + }); + this.state = state3; + } + })); +}; + +// node_modules/@github/file-attachment-element/dist/index.js +var Attachment = class { + constructor(file2, directory) { + this.file = file2; + this.directory = directory; + this.state = "pending"; + this.id = null; + this.href = null; + this.name = null; + this.percent = 0; + } + static traverse(transfer, directory) { + return transferredFiles(transfer, directory); + } + static from(files) { + const result = []; + for (const file2 of files) { + if (file2 instanceof File) { + result.push(new Attachment(file2)); + } else if (file2 instanceof Attachment) { + result.push(file2); + } else { + throw new Error("Unexpected type"); + } + } + return result; + } + get fullPath() { + return this.directory ? `${this.directory}/${this.file.name}` : this.file.name; + } + isImage() { + return ["image/gif", "image/png", "image/jpg", "image/jpeg"].indexOf(this.file.type) > -1; + } + saving(percent) { + if (this.state !== "pending" && this.state !== "saving") { + throw new Error(`Unexpected transition from ${this.state} to saving`); + } + this.state = "saving"; + this.percent = percent; + } + saved(attributes) { + var _a, _b, _c; + if (this.state !== "pending" && this.state !== "saving") { + throw new Error(`Unexpected transition from ${this.state} to saved`); + } + this.state = "saved"; + this.id = (_a = attributes === null || attributes === void 0 ? void 0 : attributes.id) !== null && _a !== void 0 ? _a : null; + this.href = (_b = attributes === null || attributes === void 0 ? void 0 : attributes.href) !== null && _b !== void 0 ? _b : null; + this.name = (_c = attributes === null || attributes === void 0 ? void 0 : attributes.name) !== null && _c !== void 0 ? _c : null; + } + isPending() { + return this.state === "pending"; + } + isSaving() { + return this.state === "saving"; + } + isSaved() { + return this.state === "saved"; + } +}; +function transferredFiles(transfer, directory) { + if (directory && isDirectory(transfer)) { + return traverse("", roots(transfer)); + } + return Promise.resolve(visible(Array.from(transfer.files || [])).map((f) => new Attachment(f))); +} +function hidden(file2) { + return file2.name.startsWith("."); +} +function visible(files) { + return Array.from(files).filter((file2) => !hidden(file2)); +} +function getFile(entry) { + return new Promise(function(resolve, reject) { + entry.file(resolve, reject); + }); +} +function getEntries(entry) { + return new Promise(function(resolve, reject) { + const result = []; + const reader = entry.createReader(); + const read = () => { + reader.readEntries((entries) => { + if (entries.length > 0) { + result.push(...entries); + read(); + } else { + resolve(result); + } + }, reject); + }; + read(); + }); +} +async function traverse(path, entries) { + const results = []; + for (const entry of visible(entries)) { + if (entry.isDirectory) { + results.push(...await traverse(entry.fullPath, await getEntries(entry))); + } else { + const file2 = await getFile(entry); + results.push(new Attachment(file2, path)); + } + } + return results; +} +function isDirectory(transfer) { + return transfer.items && Array.from(transfer.items).some((item2) => { + const entry = item2.webkitGetAsEntry && item2.webkitGetAsEntry(); + return entry && entry.isDirectory; + }); +} +function roots(transfer) { + return Array.from(transfer.items).map((item2) => item2.webkitGetAsEntry()).filter((entry) => entry != null); +} +var FileAttachmentElement = class extends HTMLElement { + connectedCallback() { + this.addEventListener("dragenter", onDragenter); + this.addEventListener("dragover", onDragenter); + this.addEventListener("dragleave", onDragleave); + this.addEventListener("drop", onDrop); + this.addEventListener("paste", onPaste); + this.addEventListener("change", onChange); + } + disconnectedCallback() { + this.removeEventListener("dragenter", onDragenter); + this.removeEventListener("dragover", onDragenter); + this.removeEventListener("dragleave", onDragleave); + this.removeEventListener("drop", onDrop); + this.removeEventListener("paste", onPaste); + this.removeEventListener("change", onChange); + } + get directory() { + return this.hasAttribute("directory"); + } + set directory(value) { + if (value) { + this.setAttribute("directory", ""); + } else { + this.removeAttribute("directory"); + } + } + async attach(transferred) { + const attachments = transferred instanceof DataTransfer ? await Attachment.traverse(transferred, this.directory) : Attachment.from(transferred); + const accepted = this.dispatchEvent(new CustomEvent("file-attachment-accept", { + bubbles: true, + cancelable: true, + detail: {attachments} + })); + if (accepted && attachments.length) { + this.dispatchEvent(new CustomEvent("file-attachment-accepted", { + bubbles: true, + detail: {attachments} + })); + } + } +}; +function hasFile(transfer) { + return Array.from(transfer.types).indexOf("Files") >= 0; +} +var dragging = null; +function onDragenter(event) { + const target = event.currentTarget; + if (dragging) { + clearTimeout(dragging); + } + dragging = window.setTimeout(() => target.removeAttribute("hover"), 200); + const transfer = event.dataTransfer; + if (!transfer || !hasFile(transfer)) + return; + transfer.dropEffect = "copy"; + target.setAttribute("hover", ""); + event.stopPropagation(); + event.preventDefault(); +} +function onDragleave(event) { + if (event.dataTransfer) { + event.dataTransfer.dropEffect = "none"; + } + const target = event.currentTarget; + target.removeAttribute("hover"); + event.stopPropagation(); + event.preventDefault(); +} +function onDrop(event) { + const container = event.currentTarget; + if (!(container instanceof FileAttachmentElement)) + return; + container.removeAttribute("hover"); + const transfer = event.dataTransfer; + if (!transfer || !hasFile(transfer)) + return; + container.attach(transfer); + event.stopPropagation(); + event.preventDefault(); +} +var images2 = /^image\/(gif|png|jpeg)$/; +function pastedFile(items) { + for (const item2 of items) { + if (images2.test(item2.type)) { + return item2.getAsFile(); + } + } + return null; +} +function onPaste(event) { + if (!event.clipboardData) + return; + if (!event.clipboardData.items) + return; + const container = event.currentTarget; + if (!(container instanceof FileAttachmentElement)) + return; + const file2 = pastedFile(event.clipboardData.items); + if (!file2) + return; + const files = [file2]; + container.attach(files); + event.preventDefault(); +} +function onChange(event) { + const container = event.currentTarget; + if (!(container instanceof FileAttachmentElement)) + return; + const input = event.target; + if (!(input instanceof HTMLInputElement)) + return; + const id = container.getAttribute("input"); + if (id && input.id !== id) + return; + const files = input.files; + if (!files || files.length === 0) + return; + container.attach(files); + input.value = ""; +} +if (!window.customElements.get("file-attachment")) { + window.FileAttachmentElement = FileAttachmentElement; + window.customElements.define("file-attachment", FileAttachmentElement); +} + +// node_modules/@github/markdown-toolbar-element/dist/index.js +var buttonSelectors = [ + "[data-md-button]", + "md-header", + "md-bold", + "md-italic", + "md-quote", + "md-code", + "md-link", + "md-image", + "md-unordered-list", + "md-ordered-list", + "md-task-list", + "md-mention", + "md-ref", + "md-strikethrough" +]; +function getButtons(toolbar) { + const els = []; + for (const button of toolbar.querySelectorAll(buttonSelectors.join(", "))) { + if (button.hidden || button.offsetWidth <= 0 && button.offsetHeight <= 0) + continue; + if (button.closest("markdown-toolbar") === toolbar) + els.push(button); + } + return els; +} +function keydown(fn2) { + return function(event) { + if (event.key === " " || event.key === "Enter") { + event.preventDefault(); + fn2(event); + } + }; +} +var styles2 = new WeakMap(); +var MarkdownButtonElement = class extends HTMLElement { + constructor() { + super(); + const apply = () => { + const style = styles2.get(this); + if (!style) + return; + applyStyle(this, style); + }; + this.addEventListener("keydown", keydown(apply)); + this.addEventListener("click", apply); + } + connectedCallback() { + if (!this.hasAttribute("role")) { + this.setAttribute("role", "button"); + } + } + click() { + const style = styles2.get(this); + if (!style) + return; + applyStyle(this, style); + } +}; +var MarkdownHeaderButtonElement = class extends MarkdownButtonElement { + constructor() { + super(); + const level = parseInt(this.getAttribute("level") || "3", 10); + if (level < 1 || level > 6) { + return; + } + const prefix = `${"#".repeat(level)} `; + styles2.set(this, { + prefix + }); + } +}; +if (!window.customElements.get("md-header")) { + window.MarkdownHeaderButtonElement = MarkdownHeaderButtonElement; + window.customElements.define("md-header", MarkdownHeaderButtonElement); +} +var MarkdownBoldButtonElement = class extends MarkdownButtonElement { + constructor() { + super(); + styles2.set(this, {prefix: "**", suffix: "**", trimFirst: true}); + } + connectedCallback() { + super.connectedCallback(); + this.setAttribute("hotkey", "b"); + } +}; +if (!window.customElements.get("md-bold")) { + window.MarkdownBoldButtonElement = MarkdownBoldButtonElement; + window.customElements.define("md-bold", MarkdownBoldButtonElement); +} +var MarkdownItalicButtonElement = class extends MarkdownButtonElement { + constructor() { + super(); + styles2.set(this, {prefix: "_", suffix: "_", trimFirst: true}); + } + connectedCallback() { + super.connectedCallback(); + this.setAttribute("hotkey", "i"); + } +}; +if (!window.customElements.get("md-italic")) { + window.MarkdownItalicButtonElement = MarkdownItalicButtonElement; + window.customElements.define("md-italic", MarkdownItalicButtonElement); +} +var MarkdownQuoteButtonElement = class extends MarkdownButtonElement { + constructor() { + super(); + styles2.set(this, {prefix: "> ", multiline: true, surroundWithNewlines: true}); + } + connectedCallback() { + super.connectedCallback(); + this.setAttribute("hotkey", "."); + this.setAttribute("hotkey-requires-shift", "true"); + } +}; +if (!window.customElements.get("md-quote")) { + window.MarkdownQuoteButtonElement = MarkdownQuoteButtonElement; + window.customElements.define("md-quote", MarkdownQuoteButtonElement); +} +var MarkdownCodeButtonElement = class extends MarkdownButtonElement { + constructor() { + super(); + styles2.set(this, {prefix: "`", suffix: "`", blockPrefix: "```", blockSuffix: "```"}); + } + connectedCallback() { + super.connectedCallback(); + this.setAttribute("hotkey", "e"); + } +}; +if (!window.customElements.get("md-code")) { + window.MarkdownCodeButtonElement = MarkdownCodeButtonElement; + window.customElements.define("md-code", MarkdownCodeButtonElement); +} +var MarkdownLinkButtonElement = class extends MarkdownButtonElement { + constructor() { + super(); + styles2.set(this, {prefix: "[", suffix: "](url)", replaceNext: "url", scanFor: "https?://"}); + } + connectedCallback() { + super.connectedCallback(); + this.setAttribute("hotkey", "k"); + } +}; +if (!window.customElements.get("md-link")) { + window.MarkdownLinkButtonElement = MarkdownLinkButtonElement; + window.customElements.define("md-link", MarkdownLinkButtonElement); +} +var MarkdownImageButtonElement = class extends MarkdownButtonElement { + constructor() { + super(); + styles2.set(this, {prefix: "![", suffix: "](url)", replaceNext: "url", scanFor: "https?://"}); + } +}; +if (!window.customElements.get("md-image")) { + window.MarkdownImageButtonElement = MarkdownImageButtonElement; + window.customElements.define("md-image", MarkdownImageButtonElement); +} +var MarkdownUnorderedListButtonElement = class extends MarkdownButtonElement { + constructor() { + super(); + styles2.set(this, {prefix: "- ", multiline: true, surroundWithNewlines: true}); + } + connectedCallback() { + super.connectedCallback(); + this.setAttribute("hotkey", "8"); + this.setAttribute("hotkey-requires-shift", "true"); + } +}; +if (!window.customElements.get("md-unordered-list")) { + window.MarkdownUnorderedListButtonElement = MarkdownUnorderedListButtonElement; + window.customElements.define("md-unordered-list", MarkdownUnorderedListButtonElement); +} +var MarkdownOrderedListButtonElement = class extends MarkdownButtonElement { + constructor() { + super(); + styles2.set(this, {prefix: "1. ", multiline: true, orderedList: true}); + } + connectedCallback() { + super.connectedCallback(); + this.setAttribute("hotkey", "7"); + this.setAttribute("hotkey-requires-shift", "true"); + } +}; +if (!window.customElements.get("md-ordered-list")) { + window.MarkdownOrderedListButtonElement = MarkdownOrderedListButtonElement; + window.customElements.define("md-ordered-list", MarkdownOrderedListButtonElement); +} +var MarkdownTaskListButtonElement = class extends MarkdownButtonElement { + constructor() { + super(); + styles2.set(this, {prefix: "- [ ] ", multiline: true, surroundWithNewlines: true}); + } + connectedCallback() { + super.connectedCallback(); + this.setAttribute("hotkey", "L"); + } +}; +if (!window.customElements.get("md-task-list")) { + window.MarkdownTaskListButtonElement = MarkdownTaskListButtonElement; + window.customElements.define("md-task-list", MarkdownTaskListButtonElement); +} +var MarkdownMentionButtonElement = class extends MarkdownButtonElement { + constructor() { + super(); + styles2.set(this, {prefix: "@", prefixSpace: true}); + } +}; +if (!window.customElements.get("md-mention")) { + window.MarkdownMentionButtonElement = MarkdownMentionButtonElement; + window.customElements.define("md-mention", MarkdownMentionButtonElement); +} +var MarkdownRefButtonElement = class extends MarkdownButtonElement { + constructor() { + super(); + styles2.set(this, {prefix: "#", prefixSpace: true}); + } +}; +if (!window.customElements.get("md-ref")) { + window.MarkdownRefButtonElement = MarkdownRefButtonElement; + window.customElements.define("md-ref", MarkdownRefButtonElement); +} +var MarkdownStrikethroughButtonElement = class extends MarkdownButtonElement { + constructor() { + super(); + styles2.set(this, {prefix: "~~", suffix: "~~", trimFirst: true}); + } +}; +if (!window.customElements.get("md-strikethrough")) { + window.MarkdownStrikethroughButtonElement = MarkdownStrikethroughButtonElement; + window.customElements.define("md-strikethrough", MarkdownStrikethroughButtonElement); +} +var modifierKey = navigator.userAgent.match(/Macintosh/) ? "Meta" : "Control"; +var MarkdownToolbarElement = class extends HTMLElement { + constructor() { + super(); + } + connectedCallback() { + if (!this.hasAttribute("role")) { + this.setAttribute("role", "toolbar"); + } + this.addEventListener("keydown", focusKeydown); + const fn2 = shortcut.bind(null, this); + if (this.field) { + this.field.addEventListener("keydown", fn2); + shortcutListeners.set(this, fn2); + } + this.setAttribute("tabindex", "0"); + this.addEventListener("focus", onToolbarFocus, {once: true}); + } + disconnectedCallback() { + const fn2 = shortcutListeners.get(this); + if (fn2 && this.field) { + this.field.removeEventListener("keydown", fn2); + shortcutListeners.delete(this); + } + this.removeEventListener("keydown", focusKeydown); + } + get field() { + const id = this.getAttribute("for"); + if (!id) + return null; + const root2 = "getRootNode" in this ? this.getRootNode() : document; + let field; + if (root2 instanceof Document || root2 instanceof ShadowRoot) { + field = root2.getElementById(id); + } + return field instanceof HTMLTextAreaElement ? field : null; + } +}; +function onToolbarFocus({target}) { + if (!(target instanceof Element)) + return; + target.removeAttribute("tabindex"); + let tabindex = "0"; + for (const button of getButtons(target)) { + button.setAttribute("tabindex", tabindex); + if (tabindex === "0") { + button.focus(); + tabindex = "-1"; + } + } +} +function focusKeydown(event) { + const key = event.key; + if (key !== "ArrowRight" && key !== "ArrowLeft" && key !== "Home" && key !== "End") + return; + const toolbar = event.currentTarget; + if (!(toolbar instanceof HTMLElement)) + return; + const buttons = getButtons(toolbar); + const index2 = buttons.indexOf(event.target); + const length = buttons.length; + if (index2 === -1) + return; + let n2 = 0; + if (key === "ArrowLeft") + n2 = index2 - 1; + if (key === "ArrowRight") + n2 = index2 + 1; + if (key === "End") + n2 = length - 1; + if (n2 < 0) + n2 = length - 1; + if (n2 > length - 1) + n2 = 0; + for (let i = 0; i < length; i += 1) { + buttons[i].setAttribute("tabindex", i === n2 ? "0" : "-1"); + } + event.preventDefault(); + buttons[n2].focus(); +} +var shortcutListeners = new WeakMap(); +function elementHotkeyRequiresShift(element) { + return element.hasAttribute("hotkey-requires-shift") && element.getAttribute("hotkey-requires-shift") !== "false"; +} +function findHotkey(toolbar, key, shiftPressed) { + for (const el of toolbar.querySelectorAll("[hotkey]")) { + if (el.getAttribute("hotkey") === key && (!elementHotkeyRequiresShift(el) || shiftPressed)) { + return el; + } + } + return null; +} +function shortcut(toolbar, event) { + if (event.metaKey && modifierKey === "Meta" || event.ctrlKey && modifierKey === "Control") { + const key = event.shiftKey ? event.key.toUpperCase() : event.key; + const button = findHotkey(toolbar, key, event.shiftKey); + if (button) { + button.click(); + event.preventDefault(); + } + } +} +if (!window.customElements.get("markdown-toolbar")) { + window.MarkdownToolbarElement = MarkdownToolbarElement; + window.customElements.define("markdown-toolbar", MarkdownToolbarElement); +} +function isMultipleLines(string) { + return string.trim().split("\n").length > 1; +} +function repeat(string, n2) { + return Array(n2 + 1).join(string); +} +function wordSelectionStart(text2, i) { + let index2 = i; + while (text2[index2] && text2[index2 - 1] != null && !text2[index2 - 1].match(/\s/)) { + index2--; + } + return index2; +} +function wordSelectionEnd(text2, i, multiline) { + let index2 = i; + const breakpoint = multiline ? /\n/ : /\s/; + while (text2[index2] && !text2[index2].match(breakpoint)) { + index2++; + } + return index2; +} +var canInsertText = null; +function insertText(textarea, {text: text2, selectionStart, selectionEnd}) { + const originalSelectionStart = textarea.selectionStart; + const before = textarea.value.slice(0, originalSelectionStart); + const after = textarea.value.slice(textarea.selectionEnd); + if (canInsertText === null || canInsertText === true) { + textarea.contentEditable = "true"; + try { + canInsertText = document.execCommand("insertText", false, text2); + } catch (error2) { + canInsertText = false; + } + textarea.contentEditable = "false"; + } + if (canInsertText && !textarea.value.slice(0, textarea.selectionStart).endsWith(text2)) { + canInsertText = false; + } + if (!canInsertText) { + try { + document.execCommand("ms-beginUndoUnit"); + } catch (e2) { + } + textarea.value = before + text2 + after; + try { + document.execCommand("ms-endUndoUnit"); + } catch (e2) { + } + textarea.dispatchEvent(new CustomEvent("input", {bubbles: true, cancelable: true})); + } + if (selectionStart != null && selectionEnd != null) { + textarea.setSelectionRange(selectionStart, selectionEnd); + } else { + textarea.setSelectionRange(originalSelectionStart, textarea.selectionEnd); + } +} +function styleSelectedText(textarea, styleArgs) { + const text2 = textarea.value.slice(textarea.selectionStart, textarea.selectionEnd); + let result; + if (styleArgs.orderedList) { + result = orderedList(textarea); + } else if (styleArgs.multiline && isMultipleLines(text2)) { + result = multilineStyle(textarea, styleArgs); + } else { + result = blockStyle(textarea, styleArgs); + } + insertText(textarea, result); +} +function expandSelectedText(textarea, prefixToUse, suffixToUse, multiline = false) { + if (textarea.selectionStart === textarea.selectionEnd) { + textarea.selectionStart = wordSelectionStart(textarea.value, textarea.selectionStart); + textarea.selectionEnd = wordSelectionEnd(textarea.value, textarea.selectionEnd, multiline); + } else { + const expandedSelectionStart = textarea.selectionStart - prefixToUse.length; + const expandedSelectionEnd = textarea.selectionEnd + suffixToUse.length; + const beginsWithPrefix = textarea.value.slice(expandedSelectionStart, textarea.selectionStart) === prefixToUse; + const endsWithSuffix = textarea.value.slice(textarea.selectionEnd, expandedSelectionEnd) === suffixToUse; + if (beginsWithPrefix && endsWithSuffix) { + textarea.selectionStart = expandedSelectionStart; + textarea.selectionEnd = expandedSelectionEnd; + } + } + return textarea.value.slice(textarea.selectionStart, textarea.selectionEnd); +} +function newlinesToSurroundSelectedText(textarea) { + const beforeSelection = textarea.value.slice(0, textarea.selectionStart); + const afterSelection = textarea.value.slice(textarea.selectionEnd); + const breaksBefore = beforeSelection.match(/\n*$/); + const breaksAfter = afterSelection.match(/^\n*/); + const newlinesBeforeSelection = breaksBefore ? breaksBefore[0].length : 0; + const newlinesAfterSelection = breaksAfter ? breaksAfter[0].length : 0; + let newlinesToAppend; + let newlinesToPrepend; + if (beforeSelection.match(/\S/) && newlinesBeforeSelection < 2) { + newlinesToAppend = repeat("\n", 2 - newlinesBeforeSelection); + } + if (afterSelection.match(/\S/) && newlinesAfterSelection < 2) { + newlinesToPrepend = repeat("\n", 2 - newlinesAfterSelection); + } + if (newlinesToAppend == null) { + newlinesToAppend = ""; + } + if (newlinesToPrepend == null) { + newlinesToPrepend = ""; + } + return {newlinesToAppend, newlinesToPrepend}; +} +function blockStyle(textarea, arg) { + let newlinesToAppend; + let newlinesToPrepend; + const {prefix, suffix, blockPrefix, blockSuffix, replaceNext, prefixSpace, scanFor, surroundWithNewlines} = arg; + const originalSelectionStart = textarea.selectionStart; + const originalSelectionEnd = textarea.selectionEnd; + let selectedText = textarea.value.slice(textarea.selectionStart, textarea.selectionEnd); + let prefixToUse = isMultipleLines(selectedText) && blockPrefix.length > 0 ? `${blockPrefix} +` : prefix; + let suffixToUse = isMultipleLines(selectedText) && blockSuffix.length > 0 ? ` +${blockSuffix}` : suffix; + if (prefixSpace) { + const beforeSelection = textarea.value[textarea.selectionStart - 1]; + if (textarea.selectionStart !== 0 && beforeSelection != null && !beforeSelection.match(/\s/)) { + prefixToUse = ` ${prefixToUse}`; + } + } + selectedText = expandSelectedText(textarea, prefixToUse, suffixToUse, arg.multiline); + let selectionStart = textarea.selectionStart; + let selectionEnd = textarea.selectionEnd; + const hasReplaceNext = replaceNext.length > 0 && suffixToUse.indexOf(replaceNext) > -1 && selectedText.length > 0; + if (surroundWithNewlines) { + const ref = newlinesToSurroundSelectedText(textarea); + newlinesToAppend = ref.newlinesToAppend; + newlinesToPrepend = ref.newlinesToPrepend; + prefixToUse = newlinesToAppend + prefix; + suffixToUse += newlinesToPrepend; + } + if (selectedText.startsWith(prefixToUse) && selectedText.endsWith(suffixToUse)) { + const replacementText = selectedText.slice(prefixToUse.length, selectedText.length - suffixToUse.length); + if (originalSelectionStart === originalSelectionEnd) { + let position = originalSelectionStart - prefixToUse.length; + position = Math.max(position, selectionStart); + position = Math.min(position, selectionStart + replacementText.length); + selectionStart = selectionEnd = position; + } else { + selectionEnd = selectionStart + replacementText.length; + } + return {text: replacementText, selectionStart, selectionEnd}; + } else if (!hasReplaceNext) { + let replacementText = prefixToUse + selectedText + suffixToUse; + selectionStart = originalSelectionStart + prefixToUse.length; + selectionEnd = originalSelectionEnd + prefixToUse.length; + const whitespaceEdges = selectedText.match(/^\s*|\s*$/g); + if (arg.trimFirst && whitespaceEdges) { + const leadingWhitespace = whitespaceEdges[0] || ""; + const trailingWhitespace = whitespaceEdges[1] || ""; + replacementText = leadingWhitespace + prefixToUse + selectedText.trim() + suffixToUse + trailingWhitespace; + selectionStart += leadingWhitespace.length; + selectionEnd -= trailingWhitespace.length; + } + return {text: replacementText, selectionStart, selectionEnd}; + } else if (scanFor.length > 0 && selectedText.match(scanFor)) { + suffixToUse = suffixToUse.replace(replaceNext, selectedText); + const replacementText = prefixToUse + suffixToUse; + selectionStart = selectionEnd = selectionStart + prefixToUse.length; + return {text: replacementText, selectionStart, selectionEnd}; + } else { + const replacementText = prefixToUse + selectedText + suffixToUse; + selectionStart = selectionStart + prefixToUse.length + selectedText.length + suffixToUse.indexOf(replaceNext); + selectionEnd = selectionStart + replaceNext.length; + return {text: replacementText, selectionStart, selectionEnd}; + } +} +function multilineStyle(textarea, arg) { + const {prefix, suffix, surroundWithNewlines} = arg; + let text2 = textarea.value.slice(textarea.selectionStart, textarea.selectionEnd); + let selectionStart = textarea.selectionStart; + let selectionEnd = textarea.selectionEnd; + const lines = text2.split("\n"); + const undoStyle = lines.every((line) => line.startsWith(prefix) && line.endsWith(suffix)); + if (undoStyle) { + text2 = lines.map((line) => line.slice(prefix.length, line.length - suffix.length)).join("\n"); + selectionEnd = selectionStart + text2.length; + } else { + text2 = lines.map((line) => prefix + line + suffix).join("\n"); + if (surroundWithNewlines) { + const {newlinesToAppend, newlinesToPrepend} = newlinesToSurroundSelectedText(textarea); + selectionStart += newlinesToAppend.length; + selectionEnd = selectionStart + text2.length; + text2 = newlinesToAppend + text2 + newlinesToPrepend; + } + } + return {text: text2, selectionStart, selectionEnd}; +} +function orderedList(textarea) { + const orderedListRegex = /^\d+\.\s+/; + const noInitialSelection = textarea.selectionStart === textarea.selectionEnd; + let selectionEnd; + let selectionStart; + let text2 = textarea.value.slice(textarea.selectionStart, textarea.selectionEnd); + let textToUnstyle = text2; + let lines = text2.split("\n"); + let startOfLine, endOfLine; + if (noInitialSelection) { + const linesBefore = textarea.value.slice(0, textarea.selectionStart).split(/\n/); + startOfLine = textarea.selectionStart - linesBefore[linesBefore.length - 1].length; + endOfLine = wordSelectionEnd(textarea.value, textarea.selectionStart, true); + textToUnstyle = textarea.value.slice(startOfLine, endOfLine); + } + const linesToUnstyle = textToUnstyle.split("\n"); + const undoStyling = linesToUnstyle.every((line) => orderedListRegex.test(line)); + if (undoStyling) { + lines = linesToUnstyle.map((line) => line.replace(orderedListRegex, "")); + text2 = lines.join("\n"); + if (noInitialSelection && startOfLine && endOfLine) { + const lengthDiff = linesToUnstyle[0].length - lines[0].length; + selectionStart = selectionEnd = textarea.selectionStart - lengthDiff; + textarea.selectionStart = startOfLine; + textarea.selectionEnd = endOfLine; + } + } else { + lines = numberedLines(lines); + text2 = lines.join("\n"); + const {newlinesToAppend, newlinesToPrepend} = newlinesToSurroundSelectedText(textarea); + selectionStart = textarea.selectionStart + newlinesToAppend.length; + selectionEnd = selectionStart + text2.length; + if (noInitialSelection) + selectionStart = selectionEnd; + text2 = newlinesToAppend + text2 + newlinesToPrepend; + } + return {text: text2, selectionStart, selectionEnd}; +} +function numberedLines(lines) { + let i; + let len; + let index2; + const results = []; + for (index2 = i = 0, len = lines.length; i < len; index2 = ++i) { + const line = lines[index2]; + results.push(`${index2 + 1}. ${line}`); + } + return results; +} +function applyStyle(button, stylesToApply) { + const toolbar = button.closest("markdown-toolbar"); + if (!(toolbar instanceof MarkdownToolbarElement)) + return; + const defaults4 = { + prefix: "", + suffix: "", + blockPrefix: "", + blockSuffix: "", + multiline: false, + replaceNext: "", + prefixSpace: false, + scanFor: "", + surroundWithNewlines: false, + orderedList: false, + trimFirst: false + }; + const style = Object.assign(Object.assign({}, defaults4), stylesToApply); + const field = toolbar.field; + if (field) { + field.focus(); + styleSelectedText(field, style); + } +} + +// node_modules/marked/lib/marked.esm.js +var esmEntry$1 = {exports: {}}; +var defaults$5 = {exports: {}}; +function getDefaults$1() { + return { + baseUrl: null, + breaks: false, + extensions: null, + gfm: true, + headerIds: true, + headerPrefix: "", + highlight: null, + langPrefix: "language-", + mangle: true, + pedantic: false, + renderer: null, + sanitize: false, + sanitizer: null, + silent: false, + smartLists: false, + smartypants: false, + tokenizer: null, + walkTokens: null, + xhtml: false + }; +} +function changeDefaults$1(newDefaults) { + defaults$5.exports.defaults = newDefaults; +} +defaults$5.exports = { + defaults: getDefaults$1(), + getDefaults: getDefaults$1, + changeDefaults: changeDefaults$1 +}; +var escapeTest = /[&<>"']/; +var escapeReplace = /[&<>"']/g; +var escapeTestNoEncode = /[<>"']|&(?!#?\w+;)/; +var escapeReplaceNoEncode = /[<>"']|&(?!#?\w+;)/g; +var escapeReplacements = { + "&": "&", + "<": "<", + ">": ">", + '"': """, + "'": "'" +}; +var getEscapeReplacement = (ch) => escapeReplacements[ch]; +function escape$3(html, encode) { + if (encode) { + if (escapeTest.test(html)) { + return html.replace(escapeReplace, getEscapeReplacement); + } + } else { + if (escapeTestNoEncode.test(html)) { + return html.replace(escapeReplaceNoEncode, getEscapeReplacement); + } + } + return html; +} +var unescapeTest = /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig; +function unescape$1(html) { + return html.replace(unescapeTest, (_, n2) => { + n2 = n2.toLowerCase(); + if (n2 === "colon") + return ":"; + if (n2.charAt(0) === "#") { + return n2.charAt(1) === "x" ? String.fromCharCode(parseInt(n2.substring(2), 16)) : String.fromCharCode(+n2.substring(1)); + } + return ""; + }); +} +var caret = /(^|[^\[])\^/g; +function edit$1(regex, opt) { + regex = regex.source || regex; + opt = opt || ""; + const obj = { + replace: (name2, val) => { + val = val.source || val; + val = val.replace(caret, "$1"); + regex = regex.replace(name2, val); + return obj; + }, + getRegex: () => { + return new RegExp(regex, opt); + } + }; + return obj; +} +var nonWordAndColonTest = /[^\w:]/g; +var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i; +function cleanUrl$1(sanitize, base, href) { + if (sanitize) { + let prot; + try { + prot = decodeURIComponent(unescape$1(href)).replace(nonWordAndColonTest, "").toLowerCase(); + } catch (e2) { + return null; + } + if (prot.indexOf("javascript:") === 0 || prot.indexOf("vbscript:") === 0 || prot.indexOf("data:") === 0) { + return null; + } + } + if (base && !originIndependentUrl.test(href)) { + href = resolveUrl(base, href); + } + try { + href = encodeURI(href).replace(/%25/g, "%"); + } catch (e2) { + return null; + } + return href; +} +var baseUrls = {}; +var justDomain = /^[^:]+:\/*[^/]*$/; +var protocol = /^([^:]+:)[\s\S]*$/; +var domain = /^([^:]+:\/*[^/]*)[\s\S]*$/; +function resolveUrl(base, href) { + if (!baseUrls[" " + base]) { + if (justDomain.test(base)) { + baseUrls[" " + base] = base + "/"; + } else { + baseUrls[" " + base] = rtrim$1(base, "/", true); + } + } + base = baseUrls[" " + base]; + const relativeBase = base.indexOf(":") === -1; + if (href.substring(0, 2) === "//") { + if (relativeBase) { + return href; + } + return base.replace(protocol, "$1") + href; + } else if (href.charAt(0) === "/") { + if (relativeBase) { + return href; + } + return base.replace(domain, "$1") + href; + } else { + return base + href; + } +} +var noopTest$1 = {exec: function noopTest() { +}}; +function merge$2(obj) { + let i = 1, target, key; + for (; i < arguments.length; i++) { + target = arguments[i]; + for (key in target) { + if (Object.prototype.hasOwnProperty.call(target, key)) { + obj[key] = target[key]; + } + } + } + return obj; +} +function splitCells$1(tableRow, count) { + const row = tableRow.replace(/\|/g, (match, offset, str) => { + let escaped = false, curr = offset; + while (--curr >= 0 && str[curr] === "\\") + escaped = !escaped; + if (escaped) { + return "|"; + } else { + return " |"; + } + }), cells = row.split(/ \|/); + let i = 0; + if (!cells[0].trim()) { + cells.shift(); + } + if (!cells[cells.length - 1].trim()) { + cells.pop(); + } + if (cells.length > count) { + cells.splice(count); + } else { + while (cells.length < count) + cells.push(""); + } + for (; i < cells.length; i++) { + cells[i] = cells[i].trim().replace(/\\\|/g, "|"); + } + return cells; +} +function rtrim$1(str, c2, invert) { + const l = str.length; + if (l === 0) { + return ""; + } + let suffLen = 0; + while (suffLen < l) { + const currChar = str.charAt(l - suffLen - 1); + if (currChar === c2 && !invert) { + suffLen++; + } else if (currChar !== c2 && invert) { + suffLen++; + } else { + break; + } + } + return str.substr(0, l - suffLen); +} +function findClosingBracket$1(str, b) { + if (str.indexOf(b[1]) === -1) { + return -1; + } + const l = str.length; + let level = 0, i = 0; + for (; i < l; i++) { + if (str[i] === "\\") { + i++; + } else if (str[i] === b[0]) { + level++; + } else if (str[i] === b[1]) { + level--; + if (level < 0) { + return i; + } + } + } + return -1; +} +function checkSanitizeDeprecation$1(opt) { + if (opt && opt.sanitize && !opt.silent) { + console.warn("marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options"); + } +} +function repeatString$1(pattern, count) { + if (count < 1) { + return ""; + } + let result = ""; + while (count > 1) { + if (count & 1) { + result += pattern; + } + count >>= 1; + pattern += pattern; + } + return result + pattern; +} +var helpers = { + escape: escape$3, + unescape: unescape$1, + edit: edit$1, + cleanUrl: cleanUrl$1, + resolveUrl, + noopTest: noopTest$1, + merge: merge$2, + splitCells: splitCells$1, + rtrim: rtrim$1, + findClosingBracket: findClosingBracket$1, + checkSanitizeDeprecation: checkSanitizeDeprecation$1, + repeatString: repeatString$1 +}; +var {defaults: defaults$4} = defaults$5.exports; +var { + rtrim, + splitCells, + escape: escape$2, + findClosingBracket +} = helpers; +function outputLink(cap, link, raw, lexer2) { + const href = link.href; + const title = link.title ? escape$2(link.title) : null; + const text2 = cap[1].replace(/\\([\[\]])/g, "$1"); + if (cap[0].charAt(0) !== "!") { + lexer2.state.inLink = true; + const token = { + type: "link", + raw, + href, + title, + text: text2, + tokens: lexer2.inlineTokens(text2, []) + }; + lexer2.state.inLink = false; + return token; + } else { + return { + type: "image", + raw, + href, + title, + text: escape$2(text2) + }; + } +} +function indentCodeCompensation(raw, text2) { + const matchIndentToCode = raw.match(/^(\s+)(?:```)/); + if (matchIndentToCode === null) { + return text2; + } + const indentToCode = matchIndentToCode[1]; + return text2.split("\n").map((node) => { + const matchIndentInNode = node.match(/^\s+/); + if (matchIndentInNode === null) { + return node; + } + const [indentInNode] = matchIndentInNode; + if (indentInNode.length >= indentToCode.length) { + return node.slice(indentToCode.length); + } + return node; + }).join("\n"); +} +var Tokenizer_1$1 = class Tokenizer { + constructor(options) { + this.options = options || defaults$4; + } + space(src) { + const cap = this.rules.block.newline.exec(src); + if (cap) { + if (cap[0].length > 1) { + return { + type: "space", + raw: cap[0] + }; + } + return {raw: "\n"}; + } + } + code(src) { + const cap = this.rules.block.code.exec(src); + if (cap) { + const text2 = cap[0].replace(/^ {1,4}/gm, ""); + return { + type: "code", + raw: cap[0], + codeBlockStyle: "indented", + text: !this.options.pedantic ? rtrim(text2, "\n") : text2 + }; + } + } + fences(src) { + const cap = this.rules.block.fences.exec(src); + if (cap) { + const raw = cap[0]; + const text2 = indentCodeCompensation(raw, cap[3] || ""); + return { + type: "code", + raw, + lang: cap[2] ? cap[2].trim() : cap[2], + text: text2 + }; + } + } + heading(src) { + const cap = this.rules.block.heading.exec(src); + if (cap) { + let text2 = cap[2].trim(); + if (/#$/.test(text2)) { + const trimmed = rtrim(text2, "#"); + if (this.options.pedantic) { + text2 = trimmed.trim(); + } else if (!trimmed || / $/.test(trimmed)) { + text2 = trimmed.trim(); + } + } + const token = { + type: "heading", + raw: cap[0], + depth: cap[1].length, + text: text2, + tokens: [] + }; + this.lexer.inline(token.text, token.tokens); + return token; + } + } + hr(src) { + const cap = this.rules.block.hr.exec(src); + if (cap) { + return { + type: "hr", + raw: cap[0] + }; + } + } + blockquote(src) { + const cap = this.rules.block.blockquote.exec(src); + if (cap) { + const text2 = cap[0].replace(/^ *> ?/gm, ""); + return { + type: "blockquote", + raw: cap[0], + tokens: this.lexer.blockTokens(text2, []), + text: text2 + }; + } + } + list(src) { + let cap = this.rules.block.list.exec(src); + if (cap) { + let raw, istask, ischecked, indent, i, blankLine, endsWithBlankLine, line, lines, itemContents; + let bull = cap[1].trim(); + const isordered = bull.length > 1; + const list2 = { + type: "list", + raw: "", + ordered: isordered, + start: isordered ? +bull.slice(0, -1) : "", + loose: false, + items: [] + }; + bull = isordered ? `\\d{1,9}\\${bull.slice(-1)}` : `\\${bull}`; + if (this.options.pedantic) { + bull = isordered ? bull : "[*+-]"; + } + const itemRegex = new RegExp(`^( {0,3}${bull})((?: [^\\n]*| *)(?:\\n[^\\n]*)*(?:\\n|$))`); + while (src) { + if (this.rules.block.hr.test(src)) { + break; + } + if (!(cap = itemRegex.exec(src))) { + break; + } + lines = cap[2].split("\n"); + if (this.options.pedantic) { + indent = 2; + itemContents = lines[0].trimLeft(); + } else { + indent = cap[2].search(/[^ ]/); + indent = cap[1].length + (indent > 4 ? 1 : indent); + itemContents = lines[0].slice(indent - cap[1].length); + } + blankLine = false; + raw = cap[0]; + if (!lines[0] && /^ *$/.test(lines[1])) { + raw = cap[1] + lines.slice(0, 2).join("\n") + "\n"; + list2.loose = true; + lines = []; + } + const nextBulletRegex = new RegExp(`^ {0,${Math.min(3, indent - 1)}}(?:[*+-]|\\d{1,9}[.)])`); + for (i = 1; i < lines.length; i++) { + line = lines[i]; + if (this.options.pedantic) { + line = line.replace(/^ {1,4}(?=( {4})*[^ ])/g, " "); + } + if (nextBulletRegex.test(line)) { + raw = cap[1] + lines.slice(0, i).join("\n") + "\n"; + break; + } + if (!blankLine) { + if (!line.trim()) { + blankLine = true; + } + if (line.search(/[^ ]/) >= indent) { + itemContents += "\n" + line.slice(indent); + } else { + itemContents += "\n" + line; + } + continue; + } + if (line.search(/[^ ]/) >= indent || !line.trim()) { + itemContents += "\n" + line.slice(indent); + continue; + } else { + raw = cap[1] + lines.slice(0, i).join("\n") + "\n"; + break; + } + } + if (!list2.loose) { + if (endsWithBlankLine) { + list2.loose = true; + } else if (/\n *\n *$/.test(raw)) { + endsWithBlankLine = true; + } + } + if (this.options.gfm) { + istask = /^\[[ xX]\] /.exec(itemContents); + if (istask) { + ischecked = istask[0] !== "[ ] "; + itemContents = itemContents.replace(/^\[[ xX]\] +/, ""); + } + } + list2.items.push({ + type: "list_item", + raw, + task: !!istask, + checked: ischecked, + loose: false, + text: itemContents + }); + list2.raw += raw; + src = src.slice(raw.length); + } + list2.items[list2.items.length - 1].raw = raw.trimRight(); + list2.items[list2.items.length - 1].text = itemContents.trimRight(); + list2.raw = list2.raw.trimRight(); + const l = list2.items.length; + for (i = 0; i < l; i++) { + this.lexer.state.top = false; + list2.items[i].tokens = this.lexer.blockTokens(list2.items[i].text, []); + if (list2.items[i].tokens.some((t2) => t2.type === "space")) { + list2.loose = true; + list2.items[i].loose = true; + } + } + return list2; + } + } + html(src) { + const cap = this.rules.block.html.exec(src); + if (cap) { + const token = { + type: "html", + raw: cap[0], + pre: !this.options.sanitizer && (cap[1] === "pre" || cap[1] === "script" || cap[1] === "style"), + text: cap[0] + }; + if (this.options.sanitize) { + token.type = "paragraph"; + token.text = this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape$2(cap[0]); + token.tokens = []; + this.lexer.inline(token.text, token.tokens); + } + return token; + } + } + def(src) { + const cap = this.rules.block.def.exec(src); + if (cap) { + if (cap[3]) + cap[3] = cap[3].substring(1, cap[3].length - 1); + const tag = cap[1].toLowerCase().replace(/\s+/g, " "); + return { + type: "def", + tag, + raw: cap[0], + href: cap[2], + title: cap[3] + }; + } + } + table(src) { + const cap = this.rules.block.table.exec(src); + if (cap) { + const item2 = { + type: "table", + header: splitCells(cap[1]).map((c2) => { + return {text: c2}; + }), + align: cap[2].replace(/^ *|\| *$/g, "").split(/ *\| */), + rows: cap[3] ? cap[3].replace(/\n$/, "").split("\n") : [] + }; + if (item2.header.length === item2.align.length) { + item2.raw = cap[0]; + let l = item2.align.length; + let i, j, k, row; + for (i = 0; i < l; i++) { + if (/^ *-+: *$/.test(item2.align[i])) { + item2.align[i] = "right"; + } else if (/^ *:-+: *$/.test(item2.align[i])) { + item2.align[i] = "center"; + } else if (/^ *:-+ *$/.test(item2.align[i])) { + item2.align[i] = "left"; + } else { + item2.align[i] = null; + } + } + l = item2.rows.length; + for (i = 0; i < l; i++) { + item2.rows[i] = splitCells(item2.rows[i], item2.header.length).map((c2) => { + return {text: c2}; + }); + } + l = item2.header.length; + for (j = 0; j < l; j++) { + item2.header[j].tokens = []; + this.lexer.inlineTokens(item2.header[j].text, item2.header[j].tokens); + } + l = item2.rows.length; + for (j = 0; j < l; j++) { + row = item2.rows[j]; + for (k = 0; k < row.length; k++) { + row[k].tokens = []; + this.lexer.inlineTokens(row[k].text, row[k].tokens); + } + } + return item2; + } + } + } + lheading(src) { + const cap = this.rules.block.lheading.exec(src); + if (cap) { + const token = { + type: "heading", + raw: cap[0], + depth: cap[2].charAt(0) === "=" ? 1 : 2, + text: cap[1], + tokens: [] + }; + this.lexer.inline(token.text, token.tokens); + return token; + } + } + paragraph(src) { + const cap = this.rules.block.paragraph.exec(src); + if (cap) { + const token = { + type: "paragraph", + raw: cap[0], + text: cap[1].charAt(cap[1].length - 1) === "\n" ? cap[1].slice(0, -1) : cap[1], + tokens: [] + }; + this.lexer.inline(token.text, token.tokens); + return token; + } + } + text(src) { + const cap = this.rules.block.text.exec(src); + if (cap) { + const token = { + type: "text", + raw: cap[0], + text: cap[0], + tokens: [] + }; + this.lexer.inline(token.text, token.tokens); + return token; + } + } + escape(src) { + const cap = this.rules.inline.escape.exec(src); + if (cap) { + return { + type: "escape", + raw: cap[0], + text: escape$2(cap[1]) + }; + } + } + tag(src) { + const cap = this.rules.inline.tag.exec(src); + if (cap) { + if (!this.lexer.state.inLink && /^/i.test(cap[0])) { + this.lexer.state.inLink = false; + } + if (!this.lexer.state.inRawBlock && /^<(pre|code|kbd|script)(\s|>)/i.test(cap[0])) { + this.lexer.state.inRawBlock = true; + } else if (this.lexer.state.inRawBlock && /^<\/(pre|code|kbd|script)(\s|>)/i.test(cap[0])) { + this.lexer.state.inRawBlock = false; + } + return { + type: this.options.sanitize ? "text" : "html", + raw: cap[0], + inLink: this.lexer.state.inLink, + inRawBlock: this.lexer.state.inRawBlock, + text: this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape$2(cap[0]) : cap[0] + }; + } + } + link(src) { + const cap = this.rules.inline.link.exec(src); + if (cap) { + const trimmedUrl = cap[2].trim(); + if (!this.options.pedantic && /^$/.test(trimmedUrl)) { + return; + } + const rtrimSlash = rtrim(trimmedUrl.slice(0, -1), "\\"); + if ((trimmedUrl.length - rtrimSlash.length) % 2 === 0) { + return; + } + } else { + const lastParenIndex = findClosingBracket(cap[2], "()"); + if (lastParenIndex > -1) { + const start = cap[0].indexOf("!") === 0 ? 5 : 4; + const linkLen = start + cap[1].length + lastParenIndex; + cap[2] = cap[2].substring(0, lastParenIndex); + cap[0] = cap[0].substring(0, linkLen).trim(); + cap[3] = ""; + } + } + let href = cap[2]; + let title = ""; + if (this.options.pedantic) { + const link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href); + if (link) { + href = link[1]; + title = link[3]; + } + } else { + title = cap[3] ? cap[3].slice(1, -1) : ""; + } + href = href.trim(); + if (/^$/.test(trimmedUrl)) { + href = href.slice(1); + } else { + href = href.slice(1, -1); + } + } + return outputLink(cap, { + href: href ? href.replace(this.rules.inline._escapes, "$1") : href, + title: title ? title.replace(this.rules.inline._escapes, "$1") : title + }, cap[0], this.lexer); + } + } + reflink(src, links) { + let cap; + if ((cap = this.rules.inline.reflink.exec(src)) || (cap = this.rules.inline.nolink.exec(src))) { + let link = (cap[2] || cap[1]).replace(/\s+/g, " "); + link = links[link.toLowerCase()]; + if (!link || !link.href) { + const text2 = cap[0].charAt(0); + return { + type: "text", + raw: text2, + text: text2 + }; + } + return outputLink(cap, link, cap[0], this.lexer); + } + } + emStrong(src, maskedSrc, prevChar = "") { + let match = this.rules.inline.emStrong.lDelim.exec(src); + if (!match) + return; + if (match[3] && prevChar.match(/[\p{L}\p{N}]/u)) + return; + const nextChar = match[1] || match[2] || ""; + if (!nextChar || nextChar && (prevChar === "" || this.rules.inline.punctuation.exec(prevChar))) { + const lLength = match[0].length - 1; + let rDelim, rLength, delimTotal = lLength, midDelimTotal = 0; + const endReg = match[0][0] === "*" ? this.rules.inline.emStrong.rDelimAst : this.rules.inline.emStrong.rDelimUnd; + endReg.lastIndex = 0; + maskedSrc = maskedSrc.slice(-1 * src.length + lLength); + while ((match = endReg.exec(maskedSrc)) != null) { + rDelim = match[1] || match[2] || match[3] || match[4] || match[5] || match[6]; + if (!rDelim) + continue; + rLength = rDelim.length; + if (match[3] || match[4]) { + delimTotal += rLength; + continue; + } else if (match[5] || match[6]) { + if (lLength % 3 && !((lLength + rLength) % 3)) { + midDelimTotal += rLength; + continue; + } + } + delimTotal -= rLength; + if (delimTotal > 0) + continue; + rLength = Math.min(rLength, rLength + delimTotal + midDelimTotal); + if (Math.min(lLength, rLength) % 2) { + const text3 = src.slice(1, lLength + match.index + rLength); + return { + type: "em", + raw: src.slice(0, lLength + match.index + rLength + 1), + text: text3, + tokens: this.lexer.inlineTokens(text3, []) + }; + } + const text2 = src.slice(2, lLength + match.index + rLength - 1); + return { + type: "strong", + raw: src.slice(0, lLength + match.index + rLength + 1), + text: text2, + tokens: this.lexer.inlineTokens(text2, []) + }; + } + } + } + codespan(src) { + const cap = this.rules.inline.code.exec(src); + if (cap) { + let text2 = cap[2].replace(/\n/g, " "); + const hasNonSpaceChars = /[^ ]/.test(text2); + const hasSpaceCharsOnBothEnds = /^ /.test(text2) && / $/.test(text2); + if (hasNonSpaceChars && hasSpaceCharsOnBothEnds) { + text2 = text2.substring(1, text2.length - 1); + } + text2 = escape$2(text2, true); + return { + type: "codespan", + raw: cap[0], + text: text2 + }; + } + } + br(src) { + const cap = this.rules.inline.br.exec(src); + if (cap) { + return { + type: "br", + raw: cap[0] + }; + } + } + del(src) { + const cap = this.rules.inline.del.exec(src); + if (cap) { + return { + type: "del", + raw: cap[0], + text: cap[2], + tokens: this.lexer.inlineTokens(cap[2], []) + }; + } + } + autolink(src, mangle2) { + const cap = this.rules.inline.autolink.exec(src); + if (cap) { + let text2, href; + if (cap[2] === "@") { + text2 = escape$2(this.options.mangle ? mangle2(cap[1]) : cap[1]); + href = "mailto:" + text2; + } else { + text2 = escape$2(cap[1]); + href = text2; + } + return { + type: "link", + raw: cap[0], + text: text2, + href, + tokens: [ + { + type: "text", + raw: text2, + text: text2 + } + ] + }; + } + } + url(src, mangle2) { + let cap; + if (cap = this.rules.inline.url.exec(src)) { + let text2, href; + if (cap[2] === "@") { + text2 = escape$2(this.options.mangle ? mangle2(cap[0]) : cap[0]); + href = "mailto:" + text2; + } else { + let prevCapZero; + do { + prevCapZero = cap[0]; + cap[0] = this.rules.inline._backpedal.exec(cap[0])[0]; + } while (prevCapZero !== cap[0]); + text2 = escape$2(cap[0]); + if (cap[1] === "www.") { + href = "http://" + text2; + } else { + href = text2; + } + } + return { + type: "link", + raw: cap[0], + text: text2, + href, + tokens: [ + { + type: "text", + raw: text2, + text: text2 + } + ] + }; + } + } + inlineText(src, smartypants2) { + const cap = this.rules.inline.text.exec(src); + if (cap) { + let text2; + if (this.lexer.state.inRawBlock) { + text2 = this.options.sanitize ? this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape$2(cap[0]) : cap[0]; + } else { + text2 = escape$2(this.options.smartypants ? smartypants2(cap[0]) : cap[0]); + } + return { + type: "text", + raw: cap[0], + text: text2 + }; + } + } +}; +var { + noopTest: noopTest2, + edit, + merge: merge$1 +} = helpers; +var block$1 = { + newline: /^(?: *(?:\n|$))+/, + code: /^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/, + fences: /^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?=\n|$)|$)/, + hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/, + heading: /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/, + blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/, + list: /^( {0,3}bull)( [^\n]+?)?(?:\n|$)/, + html: "^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n *)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$))", + def: /^ {0,3}\[(label)\]: *\n? *]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/, + table: noopTest2, + lheading: /^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/, + _paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html| +\n)[^\n]+)*)/, + text: /^[^\n]+/ +}; +block$1._label = /(?!\s*\])(?:\\[\[\]]|[^\[\]])+/; +block$1._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/; +block$1.def = edit(block$1.def).replace("label", block$1._label).replace("title", block$1._title).getRegex(); +block$1.bullet = /(?:[*+-]|\d{1,9}[.)])/; +block$1.listItemStart = edit(/^( *)(bull) */).replace("bull", block$1.bullet).getRegex(); +block$1.list = edit(block$1.list).replace(/bull/g, block$1.bullet).replace("hr", "\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))").replace("def", "\\n+(?=" + block$1.def.source + ")").getRegex(); +block$1._tag = "address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul"; +block$1._comment = /|$)/; +block$1.html = edit(block$1.html, "i").replace("comment", block$1._comment).replace("tag", block$1._tag).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(); +block$1.paragraph = edit(block$1._paragraph).replace("hr", block$1.hr).replace("heading", " {0,3}#{1,6} ").replace("|lheading", "").replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", block$1._tag).getRegex(); +block$1.blockquote = edit(block$1.blockquote).replace("paragraph", block$1.paragraph).getRegex(); +block$1.normal = merge$1({}, block$1); +block$1.gfm = merge$1({}, block$1.normal, { + table: "^ *([^\\n ].*\\|.*)\\n {0,3}(?:\\| *)?(:?-+:? *(?:\\| *:?-+:? *)*)(?:\\| *)?(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)" +}); +block$1.gfm.table = edit(block$1.gfm.table).replace("hr", block$1.hr).replace("heading", " {0,3}#{1,6} ").replace("blockquote", " {0,3}>").replace("code", " {4}[^\\n]").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", block$1._tag).getRegex(); +block$1.pedantic = merge$1({}, block$1.normal, { + html: edit(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment", block$1._comment).replace(/tag/g, "(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(), + def: /^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/, + heading: /^(#{1,6})(.*)(?:\n+|$)/, + fences: noopTest2, + paragraph: edit(block$1.normal._paragraph).replace("hr", block$1.hr).replace("heading", " *#{1,6} *[^\n]").replace("lheading", block$1.lheading).replace("blockquote", " {0,3}>").replace("|fences", "").replace("|list", "").replace("|html", "").getRegex() +}); +var inline$1 = { + escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/, + autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/, + url: noopTest2, + tag: "^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^", + link: /^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/, + reflink: /^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/, + nolink: /^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/, + reflinkSearch: "reflink|nolink(?!\\()", + emStrong: { + lDelim: /^(?:\*+(?:([punct_])|[^\s*]))|^_+(?:([punct*])|([^\s_]))/, + rDelimAst: /^[^_*]*?\_\_[^_*]*?\*[^_*]*?(?=\_\_)|[punct_](\*+)(?=[\s]|$)|[^punct*_\s](\*+)(?=[punct_\s]|$)|[punct_\s](\*+)(?=[^punct*_\s])|[\s](\*+)(?=[punct_])|[punct_](\*+)(?=[punct_])|[^punct*_\s](\*+)(?=[^punct*_\s])/, + rDelimUnd: /^[^_*]*?\*\*[^_*]*?\_[^_*]*?(?=\*\*)|[punct*](\_+)(?=[\s]|$)|[^punct*_\s](\_+)(?=[punct*\s]|$)|[punct*\s](\_+)(?=[^punct*_\s])|[\s](\_+)(?=[punct*])|[punct*](\_+)(?=[punct*])/ + }, + code: /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/, + br: /^( {2,}|\\)\n(?!\s*$)/, + del: noopTest2, + text: /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\?@\\[\\]`^{|}~"; +inline$1.punctuation = edit(inline$1.punctuation).replace(/punctuation/g, inline$1._punctuation).getRegex(); +inline$1.blockSkip = /\[[^\]]*?\]\([^\)]*?\)|`[^`]*?`|<[^>]*?>/g; +inline$1.escapedEmSt = /\\\*|\\_/g; +inline$1._comment = edit(block$1._comment).replace("(?:-->|$)", "-->").getRegex(); +inline$1.emStrong.lDelim = edit(inline$1.emStrong.lDelim).replace(/punct/g, inline$1._punctuation).getRegex(); +inline$1.emStrong.rDelimAst = edit(inline$1.emStrong.rDelimAst, "g").replace(/punct/g, inline$1._punctuation).getRegex(); +inline$1.emStrong.rDelimUnd = edit(inline$1.emStrong.rDelimUnd, "g").replace(/punct/g, inline$1._punctuation).getRegex(); +inline$1._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g; +inline$1._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/; +inline$1._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/; +inline$1.autolink = edit(inline$1.autolink).replace("scheme", inline$1._scheme).replace("email", inline$1._email).getRegex(); +inline$1._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/; +inline$1.tag = edit(inline$1.tag).replace("comment", inline$1._comment).replace("attribute", inline$1._attribute).getRegex(); +inline$1._label = /(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/; +inline$1._href = /<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/; +inline$1._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/; +inline$1.link = edit(inline$1.link).replace("label", inline$1._label).replace("href", inline$1._href).replace("title", inline$1._title).getRegex(); +inline$1.reflink = edit(inline$1.reflink).replace("label", inline$1._label).getRegex(); +inline$1.reflinkSearch = edit(inline$1.reflinkSearch, "g").replace("reflink", inline$1.reflink).replace("nolink", inline$1.nolink).getRegex(); +inline$1.normal = merge$1({}, inline$1); +inline$1.pedantic = merge$1({}, inline$1.normal, { + strong: { + start: /^__|\*\*/, + middle: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/, + endAst: /\*\*(?!\*)/g, + endUnd: /__(?!_)/g + }, + em: { + start: /^_|\*/, + middle: /^()\*(?=\S)([\s\S]*?\S)\*(?!\*)|^_(?=\S)([\s\S]*?\S)_(?!_)/, + endAst: /\*(?!\*)/g, + endUnd: /_(?!_)/g + }, + link: edit(/^!?\[(label)\]\((.*?)\)/).replace("label", inline$1._label).getRegex(), + reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", inline$1._label).getRegex() +}); +inline$1.gfm = merge$1({}, inline$1.normal, { + escape: edit(inline$1.escape).replace("])", "~|])").getRegex(), + _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/, + url: /^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/, + _backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/, + del: /^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/, + text: /^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\ 0.5) { + ch = "x" + ch.toString(16); + } + out += "&#" + ch + ";"; + } + return out; +} +var Lexer_1$1 = class Lexer { + constructor(options) { + this.tokens = []; + this.tokens.links = Object.create(null); + this.options = options || defaults$3; + this.options.tokenizer = this.options.tokenizer || new Tokenizer$2(); + this.tokenizer = this.options.tokenizer; + this.tokenizer.options = this.options; + this.tokenizer.lexer = this; + this.inlineQueue = []; + this.state = { + inLink: false, + inRawBlock: false, + top: true + }; + const rules2 = { + block: block.normal, + inline: inline.normal + }; + if (this.options.pedantic) { + rules2.block = block.pedantic; + rules2.inline = inline.pedantic; + } else if (this.options.gfm) { + rules2.block = block.gfm; + if (this.options.breaks) { + rules2.inline = inline.breaks; + } else { + rules2.inline = inline.gfm; + } + } + this.tokenizer.rules = rules2; + } + static get rules() { + return { + block, + inline + }; + } + static lex(src, options) { + const lexer2 = new Lexer(options); + return lexer2.lex(src); + } + static lexInline(src, options) { + const lexer2 = new Lexer(options); + return lexer2.inlineTokens(src); + } + lex(src) { + src = src.replace(/\r\n|\r/g, "\n").replace(/\t/g, " "); + this.blockTokens(src, this.tokens); + let next; + while (next = this.inlineQueue.shift()) { + this.inlineTokens(next.src, next.tokens); + } + return this.tokens; + } + blockTokens(src, tokens = []) { + if (this.options.pedantic) { + src = src.replace(/^ +$/gm, ""); + } + let token, lastToken, cutSrc, lastParagraphClipped; + while (src) { + if (this.options.extensions && this.options.extensions.block && this.options.extensions.block.some((extTokenizer) => { + if (token = extTokenizer.call({lexer: this}, src, tokens)) { + src = src.substring(token.raw.length); + tokens.push(token); + return true; + } + return false; + })) { + continue; + } + if (token = this.tokenizer.space(src)) { + src = src.substring(token.raw.length); + if (token.type) { + tokens.push(token); + } + continue; + } + if (token = this.tokenizer.code(src)) { + src = src.substring(token.raw.length); + lastToken = tokens[tokens.length - 1]; + if (lastToken && (lastToken.type === "paragraph" || lastToken.type === "text")) { + lastToken.raw += "\n" + token.raw; + lastToken.text += "\n" + token.text; + this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text; + } else { + tokens.push(token); + } + continue; + } + if (token = this.tokenizer.fences(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.heading(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.hr(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.blockquote(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.list(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.html(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.def(src)) { + src = src.substring(token.raw.length); + lastToken = tokens[tokens.length - 1]; + if (lastToken && (lastToken.type === "paragraph" || lastToken.type === "text")) { + lastToken.raw += "\n" + token.raw; + lastToken.text += "\n" + token.raw; + this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text; + } else if (!this.tokens.links[token.tag]) { + this.tokens.links[token.tag] = { + href: token.href, + title: token.title + }; + } + continue; + } + if (token = this.tokenizer.table(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.lheading(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + cutSrc = src; + if (this.options.extensions && this.options.extensions.startBlock) { + let startIndex = Infinity; + const tempSrc = src.slice(1); + let tempStart; + this.options.extensions.startBlock.forEach(function(getStartIndex) { + tempStart = getStartIndex.call({lexer: this}, tempSrc); + if (typeof tempStart === "number" && tempStart >= 0) { + startIndex = Math.min(startIndex, tempStart); + } + }); + if (startIndex < Infinity && startIndex >= 0) { + cutSrc = src.substring(0, startIndex + 1); + } + } + if (this.state.top && (token = this.tokenizer.paragraph(cutSrc))) { + lastToken = tokens[tokens.length - 1]; + if (lastParagraphClipped && lastToken.type === "paragraph") { + lastToken.raw += "\n" + token.raw; + lastToken.text += "\n" + token.text; + this.inlineQueue.pop(); + this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text; + } else { + tokens.push(token); + } + lastParagraphClipped = cutSrc.length !== src.length; + src = src.substring(token.raw.length); + continue; + } + if (token = this.tokenizer.text(src)) { + src = src.substring(token.raw.length); + lastToken = tokens[tokens.length - 1]; + if (lastToken && lastToken.type === "text") { + lastToken.raw += "\n" + token.raw; + lastToken.text += "\n" + token.text; + this.inlineQueue.pop(); + this.inlineQueue[this.inlineQueue.length - 1].src = lastToken.text; + } else { + tokens.push(token); + } + continue; + } + if (src) { + const errMsg = "Infinite loop on byte: " + src.charCodeAt(0); + if (this.options.silent) { + console.error(errMsg); + break; + } else { + throw new Error(errMsg); + } + } + } + this.state.top = true; + return tokens; + } + inline(src, tokens) { + this.inlineQueue.push({src, tokens}); + } + inlineTokens(src, tokens = []) { + let token, lastToken, cutSrc; + let maskedSrc = src; + let match; + let keepPrevChar, prevChar; + if (this.tokens.links) { + const links = Object.keys(this.tokens.links); + if (links.length > 0) { + while ((match = this.tokenizer.rules.inline.reflinkSearch.exec(maskedSrc)) != null) { + if (links.includes(match[0].slice(match[0].lastIndexOf("[") + 1, -1))) { + maskedSrc = maskedSrc.slice(0, match.index) + "[" + repeatString("a", match[0].length - 2) + "]" + maskedSrc.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex); + } + } + } + } + while ((match = this.tokenizer.rules.inline.blockSkip.exec(maskedSrc)) != null) { + maskedSrc = maskedSrc.slice(0, match.index) + "[" + repeatString("a", match[0].length - 2) + "]" + maskedSrc.slice(this.tokenizer.rules.inline.blockSkip.lastIndex); + } + while ((match = this.tokenizer.rules.inline.escapedEmSt.exec(maskedSrc)) != null) { + maskedSrc = maskedSrc.slice(0, match.index) + "++" + maskedSrc.slice(this.tokenizer.rules.inline.escapedEmSt.lastIndex); + } + while (src) { + if (!keepPrevChar) { + prevChar = ""; + } + keepPrevChar = false; + if (this.options.extensions && this.options.extensions.inline && this.options.extensions.inline.some((extTokenizer) => { + if (token = extTokenizer.call({lexer: this}, src, tokens)) { + src = src.substring(token.raw.length); + tokens.push(token); + return true; + } + return false; + })) { + continue; + } + if (token = this.tokenizer.escape(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.tag(src)) { + src = src.substring(token.raw.length); + lastToken = tokens[tokens.length - 1]; + if (lastToken && token.type === "text" && lastToken.type === "text") { + lastToken.raw += token.raw; + lastToken.text += token.text; + } else { + tokens.push(token); + } + continue; + } + if (token = this.tokenizer.link(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.reflink(src, this.tokens.links)) { + src = src.substring(token.raw.length); + lastToken = tokens[tokens.length - 1]; + if (lastToken && token.type === "text" && lastToken.type === "text") { + lastToken.raw += token.raw; + lastToken.text += token.text; + } else { + tokens.push(token); + } + continue; + } + if (token = this.tokenizer.emStrong(src, maskedSrc, prevChar)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.codespan(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.br(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.del(src)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (token = this.tokenizer.autolink(src, mangle)) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + if (!this.state.inLink && (token = this.tokenizer.url(src, mangle))) { + src = src.substring(token.raw.length); + tokens.push(token); + continue; + } + cutSrc = src; + if (this.options.extensions && this.options.extensions.startInline) { + let startIndex = Infinity; + const tempSrc = src.slice(1); + let tempStart; + this.options.extensions.startInline.forEach(function(getStartIndex) { + tempStart = getStartIndex.call({lexer: this}, tempSrc); + if (typeof tempStart === "number" && tempStart >= 0) { + startIndex = Math.min(startIndex, tempStart); + } + }); + if (startIndex < Infinity && startIndex >= 0) { + cutSrc = src.substring(0, startIndex + 1); + } + } + if (token = this.tokenizer.inlineText(cutSrc, smartypants)) { + src = src.substring(token.raw.length); + if (token.raw.slice(-1) !== "_") { + prevChar = token.raw.slice(-1); + } + keepPrevChar = true; + lastToken = tokens[tokens.length - 1]; + if (lastToken && lastToken.type === "text") { + lastToken.raw += token.raw; + lastToken.text += token.text; + } else { + tokens.push(token); + } + continue; + } + if (src) { + const errMsg = "Infinite loop on byte: " + src.charCodeAt(0); + if (this.options.silent) { + console.error(errMsg); + break; + } else { + throw new Error(errMsg); + } + } + } + return tokens; + } +}; +var {defaults: defaults$2} = defaults$5.exports; +var { + cleanUrl, + escape: escape$1 +} = helpers; +var Renderer_1$1 = class Renderer { + constructor(options) { + this.options = options || defaults$2; + } + code(code, infostring, escaped) { + const lang = (infostring || "").match(/\S*/)[0]; + if (this.options.highlight) { + const out = this.options.highlight(code, lang); + if (out != null && out !== code) { + escaped = true; + code = out; + } + } + code = code.replace(/\n$/, "") + "\n"; + if (!lang) { + return "
    " + (escaped ? code : escape$1(code, true)) + "
    \n"; + } + return '
    ' + (escaped ? code : escape$1(code, true)) + "
    \n"; + } + blockquote(quote) { + return "
    \n" + quote + "
    \n"; + } + html(html) { + return html; + } + heading(text2, level, raw, slugger) { + if (this.options.headerIds) { + return "' + text2 + "\n"; + } + return "" + text2 + "\n"; + } + hr() { + return this.options.xhtml ? "
    \n" : "
    \n"; + } + list(body, ordered, start) { + const type = ordered ? "ol" : "ul", startatt = ordered && start !== 1 ? ' start="' + start + '"' : ""; + return "<" + type + startatt + ">\n" + body + "\n"; + } + listitem(text2) { + return "
  • " + text2 + "
  • \n"; + } + checkbox(checked) { + return " "; + } + paragraph(text2) { + return "

    " + text2 + "

    \n"; + } + table(header, body) { + if (body) + body = "" + body + ""; + return "\n\n" + header + "\n" + body + "
    \n"; + } + tablerow(content) { + return "\n" + content + "\n"; + } + tablecell(content, flags) { + const type = flags.header ? "th" : "td"; + const tag = flags.align ? "<" + type + ' align="' + flags.align + '">' : "<" + type + ">"; + return tag + content + "\n"; + } + strong(text2) { + return "" + text2 + ""; + } + em(text2) { + return "" + text2 + ""; + } + codespan(text2) { + return "" + text2 + ""; + } + br() { + return this.options.xhtml ? "
    " : "
    "; + } + del(text2) { + return "" + text2 + ""; + } + link(href, title, text2) { + href = cleanUrl(this.options.sanitize, this.options.baseUrl, href); + if (href === null) { + return text2; + } + let out = '
    "; + return out; + } + image(href, title, text2) { + href = cleanUrl(this.options.sanitize, this.options.baseUrl, href); + if (href === null) { + return text2; + } + let out = '' + text2 + '" : ">"; + return out; + } + text(text2) { + return text2; + } +}; +var TextRenderer_1$1 = class TextRenderer { + strong(text2) { + return text2; + } + em(text2) { + return text2; + } + codespan(text2) { + return text2; + } + del(text2) { + return text2; + } + html(text2) { + return text2; + } + text(text2) { + return text2; + } + link(href, title, text2) { + return "" + text2; + } + image(href, title, text2) { + return "" + text2; + } + br() { + return ""; + } +}; +var Slugger_1$1 = class Slugger { + constructor() { + this.seen = {}; + } + serialize(value) { + return value.toLowerCase().trim().replace(/<[!\/a-z].*?>/ig, "").replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g, "").replace(/\s/g, "-"); + } + getNextSafeSlug(originalSlug, isDryRun) { + let slug = originalSlug; + let occurenceAccumulator = 0; + if (this.seen.hasOwnProperty(slug)) { + occurenceAccumulator = this.seen[originalSlug]; + do { + occurenceAccumulator++; + slug = originalSlug + "-" + occurenceAccumulator; + } while (this.seen.hasOwnProperty(slug)); + } + if (!isDryRun) { + this.seen[originalSlug] = occurenceAccumulator; + this.seen[slug] = 0; + } + return slug; + } + slug(value, options = {}) { + const slug = this.serialize(value); + return this.getNextSafeSlug(slug, options.dryrun); + } +}; +var Renderer$2 = Renderer_1$1; +var TextRenderer$2 = TextRenderer_1$1; +var Slugger$2 = Slugger_1$1; +var {defaults: defaults$1} = defaults$5.exports; +var { + unescape: unescape2 +} = helpers; +var Parser_1$1 = class Parser { + constructor(options) { + this.options = options || defaults$1; + this.options.renderer = this.options.renderer || new Renderer$2(); + this.renderer = this.options.renderer; + this.renderer.options = this.options; + this.textRenderer = new TextRenderer$2(); + this.slugger = new Slugger$2(); + } + static parse(tokens, options) { + const parser2 = new Parser(options); + return parser2.parse(tokens); + } + static parseInline(tokens, options) { + const parser2 = new Parser(options); + return parser2.parseInline(tokens); + } + parse(tokens, top = true) { + let out = "", i, j, k, l2, l3, row, cell, header, body, token, ordered, start, loose, itemBody, item2, checked, task, checkbox, ret; + const l = tokens.length; + for (i = 0; i < l; i++) { + token = tokens[i]; + if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) { + ret = this.options.extensions.renderers[token.type].call({parser: this}, token); + if (ret !== false || !["space", "hr", "heading", "code", "table", "blockquote", "list", "html", "paragraph", "text"].includes(token.type)) { + out += ret || ""; + continue; + } + } + switch (token.type) { + case "space": { + continue; + } + case "hr": { + out += this.renderer.hr(); + continue; + } + case "heading": { + out += this.renderer.heading(this.parseInline(token.tokens), token.depth, unescape2(this.parseInline(token.tokens, this.textRenderer)), this.slugger); + continue; + } + case "code": { + out += this.renderer.code(token.text, token.lang, token.escaped); + continue; + } + case "table": { + header = ""; + cell = ""; + l2 = token.header.length; + for (j = 0; j < l2; j++) { + cell += this.renderer.tablecell(this.parseInline(token.header[j].tokens), {header: true, align: token.align[j]}); + } + header += this.renderer.tablerow(cell); + body = ""; + l2 = token.rows.length; + for (j = 0; j < l2; j++) { + row = token.rows[j]; + cell = ""; + l3 = row.length; + for (k = 0; k < l3; k++) { + cell += this.renderer.tablecell(this.parseInline(row[k].tokens), {header: false, align: token.align[k]}); + } + body += this.renderer.tablerow(cell); + } + out += this.renderer.table(header, body); + continue; + } + case "blockquote": { + body = this.parse(token.tokens); + out += this.renderer.blockquote(body); + continue; + } + case "list": { + ordered = token.ordered; + start = token.start; + loose = token.loose; + l2 = token.items.length; + body = ""; + for (j = 0; j < l2; j++) { + item2 = token.items[j]; + checked = item2.checked; + task = item2.task; + itemBody = ""; + if (item2.task) { + checkbox = this.renderer.checkbox(checked); + if (loose) { + if (item2.tokens.length > 0 && item2.tokens[0].type === "paragraph") { + item2.tokens[0].text = checkbox + " " + item2.tokens[0].text; + if (item2.tokens[0].tokens && item2.tokens[0].tokens.length > 0 && item2.tokens[0].tokens[0].type === "text") { + item2.tokens[0].tokens[0].text = checkbox + " " + item2.tokens[0].tokens[0].text; + } + } else { + item2.tokens.unshift({ + type: "text", + text: checkbox + }); + } + } else { + itemBody += checkbox; + } + } + itemBody += this.parse(item2.tokens, loose); + body += this.renderer.listitem(itemBody, task, checked); + } + out += this.renderer.list(body, ordered, start); + continue; + } + case "html": { + out += this.renderer.html(token.text); + continue; + } + case "paragraph": { + out += this.renderer.paragraph(this.parseInline(token.tokens)); + continue; + } + case "text": { + body = token.tokens ? this.parseInline(token.tokens) : token.text; + while (i + 1 < l && tokens[i + 1].type === "text") { + token = tokens[++i]; + body += "\n" + (token.tokens ? this.parseInline(token.tokens) : token.text); + } + out += top ? this.renderer.paragraph(body) : body; + continue; + } + default: { + const errMsg = 'Token with "' + token.type + '" type was not found.'; + if (this.options.silent) { + console.error(errMsg); + return; + } else { + throw new Error(errMsg); + } + } + } + } + return out; + } + parseInline(tokens, renderer) { + renderer = renderer || this.renderer; + let out = "", i, token, ret; + const l = tokens.length; + for (i = 0; i < l; i++) { + token = tokens[i]; + if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[token.type]) { + ret = this.options.extensions.renderers[token.type].call({parser: this}, token); + if (ret !== false || !["escape", "html", "link", "image", "strong", "em", "codespan", "br", "del", "text"].includes(token.type)) { + out += ret || ""; + continue; + } + } + switch (token.type) { + case "escape": { + out += renderer.text(token.text); + break; + } + case "html": { + out += renderer.html(token.text); + break; + } + case "link": { + out += renderer.link(token.href, token.title, this.parseInline(token.tokens, renderer)); + break; + } + case "image": { + out += renderer.image(token.href, token.title, token.text); + break; + } + case "strong": { + out += renderer.strong(this.parseInline(token.tokens, renderer)); + break; + } + case "em": { + out += renderer.em(this.parseInline(token.tokens, renderer)); + break; + } + case "codespan": { + out += renderer.codespan(token.text); + break; + } + case "br": { + out += renderer.br(); + break; + } + case "del": { + out += renderer.del(this.parseInline(token.tokens, renderer)); + break; + } + case "text": { + out += renderer.text(token.text); + break; + } + default: { + const errMsg = 'Token with "' + token.type + '" type was not found.'; + if (this.options.silent) { + console.error(errMsg); + return; + } else { + throw new Error(errMsg); + } + } + } + } + return out; + } +}; +var Lexer$1 = Lexer_1$1; +var Parser$1 = Parser_1$1; +var Tokenizer$1 = Tokenizer_1$1; +var Renderer$1 = Renderer_1$1; +var TextRenderer$1 = TextRenderer_1$1; +var Slugger$1 = Slugger_1$1; +var { + merge, + checkSanitizeDeprecation, + escape +} = helpers; +var { + getDefaults, + changeDefaults, + defaults: defaults3 +} = defaults$5.exports; +function marked$1(src, opt, callback) { + if (typeof src === "undefined" || src === null) { + throw new Error("marked(): input parameter is undefined or null"); + } + if (typeof src !== "string") { + throw new Error("marked(): input parameter is of type " + Object.prototype.toString.call(src) + ", string expected"); + } + if (typeof opt === "function") { + callback = opt; + opt = null; + } + opt = merge({}, marked$1.defaults, opt || {}); + checkSanitizeDeprecation(opt); + if (callback) { + const highlight = opt.highlight; + let tokens; + try { + tokens = Lexer$1.lex(src, opt); + } catch (e2) { + return callback(e2); + } + const done = function(err) { + let out; + if (!err) { + try { + if (opt.walkTokens) { + marked$1.walkTokens(tokens, opt.walkTokens); + } + out = Parser$1.parse(tokens, opt); + } catch (e2) { + err = e2; + } + } + opt.highlight = highlight; + return err ? callback(err) : callback(null, out); + }; + if (!highlight || highlight.length < 3) { + return done(); + } + delete opt.highlight; + if (!tokens.length) + return done(); + let pending = 0; + marked$1.walkTokens(tokens, function(token) { + if (token.type === "code") { + pending++; + setTimeout(() => { + highlight(token.text, token.lang, function(err, code) { + if (err) { + return done(err); + } + if (code != null && code !== token.text) { + token.text = code; + token.escaped = true; + } + pending--; + if (pending === 0) { + done(); + } + }); + }, 0); + } + }); + if (pending === 0) { + done(); + } + return; + } + try { + const tokens = Lexer$1.lex(src, opt); + if (opt.walkTokens) { + marked$1.walkTokens(tokens, opt.walkTokens); + } + return Parser$1.parse(tokens, opt); + } catch (e2) { + e2.message += "\nPlease report this to https://github.com/markedjs/marked."; + if (opt.silent) { + return "

    An error occurred:

    " + escape(e2.message + "", true) + "
    "; + } + throw e2; + } +} +marked$1.options = marked$1.setOptions = function(opt) { + merge(marked$1.defaults, opt); + changeDefaults(marked$1.defaults); + return marked$1; +}; +marked$1.getDefaults = getDefaults; +marked$1.defaults = defaults3; +marked$1.use = function(...args) { + const opts = merge({}, ...args); + const extensions = marked$1.defaults.extensions || {renderers: {}, childTokens: {}}; + let hasExtensions; + args.forEach((pack) => { + if (pack.extensions) { + hasExtensions = true; + pack.extensions.forEach((ext) => { + if (!ext.name) { + throw new Error("extension name required"); + } + if (ext.renderer) { + const prevRenderer = extensions.renderers ? extensions.renderers[ext.name] : null; + if (prevRenderer) { + extensions.renderers[ext.name] = function(...args2) { + let ret = ext.renderer.apply(this, args2); + if (ret === false) { + ret = prevRenderer.apply(this, args2); + } + return ret; + }; + } else { + extensions.renderers[ext.name] = ext.renderer; + } + } + if (ext.tokenizer) { + if (!ext.level || ext.level !== "block" && ext.level !== "inline") { + throw new Error("extension level must be 'block' or 'inline'"); + } + if (extensions[ext.level]) { + extensions[ext.level].unshift(ext.tokenizer); + } else { + extensions[ext.level] = [ext.tokenizer]; + } + if (ext.start) { + if (ext.level === "block") { + if (extensions.startBlock) { + extensions.startBlock.push(ext.start); + } else { + extensions.startBlock = [ext.start]; + } + } else if (ext.level === "inline") { + if (extensions.startInline) { + extensions.startInline.push(ext.start); + } else { + extensions.startInline = [ext.start]; + } + } + } + } + if (ext.childTokens) { + extensions.childTokens[ext.name] = ext.childTokens; + } + }); + } + if (pack.renderer) { + const renderer = marked$1.defaults.renderer || new Renderer$1(); + for (const prop in pack.renderer) { + const prevRenderer = renderer[prop]; + renderer[prop] = (...args2) => { + let ret = pack.renderer[prop].apply(renderer, args2); + if (ret === false) { + ret = prevRenderer.apply(renderer, args2); + } + return ret; + }; + } + opts.renderer = renderer; + } + if (pack.tokenizer) { + const tokenizer = marked$1.defaults.tokenizer || new Tokenizer$1(); + for (const prop in pack.tokenizer) { + const prevTokenizer = tokenizer[prop]; + tokenizer[prop] = (...args2) => { + let ret = pack.tokenizer[prop].apply(tokenizer, args2); + if (ret === false) { + ret = prevTokenizer.apply(tokenizer, args2); + } + return ret; + }; + } + opts.tokenizer = tokenizer; + } + if (pack.walkTokens) { + const walkTokens = marked$1.defaults.walkTokens; + opts.walkTokens = function(token) { + pack.walkTokens.call(this, token); + if (walkTokens) { + walkTokens.call(this, token); + } + }; + } + if (hasExtensions) { + opts.extensions = extensions; + } + marked$1.setOptions(opts); + }); +}; +marked$1.walkTokens = function(tokens, callback) { + for (const token of tokens) { + callback.call(marked$1, token); + switch (token.type) { + case "table": { + for (const cell of token.header) { + marked$1.walkTokens(cell.tokens, callback); + } + for (const row of token.rows) { + for (const cell of row) { + marked$1.walkTokens(cell.tokens, callback); + } + } + break; + } + case "list": { + marked$1.walkTokens(token.items, callback); + break; + } + default: { + if (marked$1.defaults.extensions && marked$1.defaults.extensions.childTokens && marked$1.defaults.extensions.childTokens[token.type]) { + marked$1.defaults.extensions.childTokens[token.type].forEach(function(childTokens) { + marked$1.walkTokens(token[childTokens], callback); + }); + } else if (token.tokens) { + marked$1.walkTokens(token.tokens, callback); + } + } + } + } +}; +marked$1.parseInline = function(src, opt) { + if (typeof src === "undefined" || src === null) { + throw new Error("marked.parseInline(): input parameter is undefined or null"); + } + if (typeof src !== "string") { + throw new Error("marked.parseInline(): input parameter is of type " + Object.prototype.toString.call(src) + ", string expected"); + } + opt = merge({}, marked$1.defaults, opt || {}); + checkSanitizeDeprecation(opt); + try { + const tokens = Lexer$1.lexInline(src, opt); + if (opt.walkTokens) { + marked$1.walkTokens(tokens, opt.walkTokens); + } + return Parser$1.parseInline(tokens, opt); + } catch (e2) { + e2.message += "\nPlease report this to https://github.com/markedjs/marked."; + if (opt.silent) { + return "

    An error occurred:

    " + escape(e2.message + "", true) + "
    "; + } + throw e2; + } +}; +marked$1.Parser = Parser$1; +marked$1.parser = Parser$1.parse; +marked$1.Renderer = Renderer$1; +marked$1.TextRenderer = TextRenderer$1; +marked$1.Lexer = Lexer$1; +marked$1.lexer = Lexer$1.lex; +marked$1.Tokenizer = Tokenizer$1; +marked$1.Slugger = Slugger$1; +marked$1.parse = marked$1; +var marked_1 = marked$1; +var marked = marked_1; +var Lexer2 = Lexer_1$1; +var Parser2 = Parser_1$1; +var Tokenizer2 = Tokenizer_1$1; +var Renderer2 = Renderer_1$1; +var TextRenderer2 = TextRenderer_1$1; +var Slugger2 = Slugger_1$1; +esmEntry$1.exports = marked; +var parse2 = esmEntry$1.exports.parse = marked; +var Parser_1 = esmEntry$1.exports.Parser = Parser2; +var parser = esmEntry$1.exports.parser = Parser2.parse; +var Renderer_1 = esmEntry$1.exports.Renderer = Renderer2; +var TextRenderer_1 = esmEntry$1.exports.TextRenderer = TextRenderer2; +var Lexer_1 = esmEntry$1.exports.Lexer = Lexer2; +var lexer = esmEntry$1.exports.lexer = Lexer2.lex; +var Tokenizer_1 = esmEntry$1.exports.Tokenizer = Tokenizer2; +var Slugger_1 = esmEntry$1.exports.Slugger = Slugger2; +var esmEntry = esmEntry$1.exports; + +// node_modules/mdhl/dist/mdhl.esm.js +function e(e2) { + return e2.replace(/&/g, "&").replace(//g, ">").replace(/"/g, """).replace(/'/g, "'"); +} +var n = {space: /^\n+/, blockCode: /^( {4}[^\n]+\n*)+/, fences: /^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)(\n)(|[\s\S]*?\n)( {0,3}\1[~`]* *(?:\n+|$)|$)/, heading: /^#{1,6} [^\n]+(\n|$)/, lheading: /^[^\n]+\n {0,3}(=+|-+) *(\n+|$)/, hr: /^(([-_*]) *){3,}(\n+|$)/, list: /^( {0})((?:[*+-]|\d{1,9}\.)) [\s\S]+?(?:\n+(?! )(?!\1(?:[*+-]|\d{1,9}\.) )\n*|\s*$)/, blockquote: /^( {0,3}> ?([^\n]*)(?:\n|$))+/, html: /^ {0,3}(?:<(script|pre|style)[\s>][\s\S]*?(?:<\/\1>[^\n]*\n+|$)|[^\n]*(\n+|$)|<\/?(\w+)(?: +|\n|\/?>)[\s\S]*?(?:\n{2,}|$))/, paragraph: /^[^\n]+/}; +var t = {strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/, em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/, inlineCode: /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/, link: /^!?\[([\s\S]+)\]\(\s*([\s\S]+)(?:\s+([\s\S]+))?\s*\)/, text: /^(`+|[^`])(?:[\s\S]*?(?:(?=[\\ `<${e2} class="mdhl-${t2}">${n2}`; +var s = {codeInFences: (n2, t2) => r("span", e(n2), "codeInFences"), heading: (e2, n2, t2) => r("b", t2(e2.text, n2), e2.type), lheading: (e2, n2, t2) => r("b", t2(e2.text, n2), "heading"), paragraph: (e2, n2, t2) => r("span", t2(e2.text, n2), e2.type), list: (e2, n2, t2) => { + const s2 = e2.text.split("\n").map((e3) => { + const s3 = e3.substr(0, 1), c2 = e3.substr(1), o2 = t2(c2, n2); + return `${r("span", s3, "bullet")}${o2}`; + }).join("\n"); + return r("span", s2, "list"); +}, fences: (n2, t2) => { + const [, r2, s2, c2, o2, p2] = n2.cap, a2 = t2.codeInFences(o2, s2); + return `${r2}${e(s2)}${c2}${a2}${p2}`; +}, space: (e2) => e2.text, text: (e2) => e2.text, em: (e2) => r("i", e2.text, e2.type), strong: (e2) => r("b", e2.text, e2.type), defaultInlineRenderer: (e2) => r("span", e2.text, e2.type), defaultBlockRenderer: (n2) => r("span", e(n2.text), n2.type)}; +function c(n2, r2) { + let s2 = ""; + for (; n2; ) + if (!Object.keys(t).some((o2) => { + const p2 = t[o2].exec(n2); + if (p2) { + const t2 = p2[0]; + n2 = n2.substring(t2.length); + const a2 = e(t2); + return s2 += (r2[o2] || r2.defaultInlineRenderer)({type: o2, text: a2, cap: p2}, r2, c), true; + } + return false; + })) + throw new Error("Infinite loop on byte: " + n2.charCodeAt(0)); + return s2; +} +function o(e2) { + const t2 = []; + for (e2 = e2.replace(/^ +$/gm, ""); e2; ) + if (!Object.keys(n).some((r2) => { + const s2 = n[r2].exec(e2); + if (s2) { + const n2 = s2[0]; + return e2 = e2.substring(n2.length), t2.push({text: n2, type: r2, cap: s2}), true; + } + return false; + })) + throw new Error("Infinite loop on byte: " + e2.charCodeAt(0)); + return t2; +} +function p(e2, n2) { + return e2.map((e3) => (n2[e3.type] || n2.defaultBlockRenderer)(e3, n2, c)).join("").replace(/\n/g, "
    "); +} +function a(e2, n2 = s) { + return p(o(e2), n2); +} + +// packages/forms/resources/js/components/markdown-editor.js +var markdown_editor_default = (Alpine) => { + Alpine.data("markdownEditorFormComponent", ({ + state: state2, + tab + }) => { + return { + attachment: null, + overlay: null, + preview: "", + state: state2, + tab, + init: function() { + if (this.state !== null) { + this.render(); + } + this.$watch("state", () => { + this.render(); + }); + }, + render: function() { + if (this.$refs.textarea.scrollHeight > 0) { + this.$refs.overlay.style.height = "150px"; + this.$refs.overlay.style.height = this.$refs.textarea.scrollHeight + "px"; + } + this.overlay = null; + this.overlay = a(this.state); + this.preview = null; + this.preview = esmEntry(this.state); + }, + checkForAutoInsertion($event) { + const lines = this.$refs.textarea.value.split("\n"); + const currentLine = this.$refs.textarea.value.substring(0, this.$refs.textarea.value.selectionStart).split("\n").length; + const previousLine = lines[currentLine - 2]; + if (!previousLine.match(/^(\*\s|-\s)|^(\d)+\./)) { + return; + } + if (previousLine.match(/^(\*\s)/)) { + if (previousLine.trim().length > 1) { + lines[currentLine - 1] = "* "; + } else { + delete lines[currentLine - 2]; + } + } else if (previousLine.match(/^(-\s)/)) { + if (previousLine.trim().length > 1) { + lines[currentLine - 1] = "- "; + } else { + delete lines[currentLine - 2]; + } + } else { + const matches2 = previousLine.match(/^(\d)+/); + const number = matches2[0]; + if (previousLine.trim().length > number.length + 2) { + lines[currentLine - 1] = `${parseInt(number) + 1}. `; + } else { + delete lines[currentLine - 2]; + } + } + this.state = lines.join("\n"); + this.render(); + } + }; + }); +}; + +// packages/forms/resources/js/components/multi-select.js +var multi_select_default = (Alpine) => { + Alpine.data("multiSelectFormComponent", ({ + getOptionLabelsUsing, + getSearchResultsUsing, + isAutofocused, + options, + state: state2 + }) => { + return { + focusedOptionIndex: null, + isLoading: false, + isOpen: false, + labels: [], + options, + search: "", + state: state2, + init: async function() { + if (isAutofocused) { + this.openListbox(); + } + if (!this.state) { + this.state = []; + } + this.state = this.state.map((value) => value.toString()); + this.labels = await getOptionLabelsUsing(); + this.$watch("search", async () => { + if (!this.isOpen || this.search === "" || this.search === null) { + this.options = options; + this.focusedOptionIndex = 0; + return; + } + if (Object.keys(options).length) { + this.options = {}; + let search = this.search.trim().toLowerCase(); + for (let key in options) { + if (options[key].trim().toLowerCase().includes(search)) { + this.options[key] = options[key]; + } + } + this.focusedOptionIndex = 0; + } else { + this.isLoading = true; + this.options = await getSearchResultsUsing(this.search); + this.focusedOptionIndex = 0; + this.isLoading = false; + } + }); + this.$watch("state", async () => { + this.labels = await getOptionLabelsUsing(); + }); + }, + clearState: function() { + this.state = []; + this.labels = []; + this.closeListbox(); + }, + closeListbox: function() { + this.isOpen = false; + this.focusedOptionIndex = null; + this.search = ""; + }, + evaluatePosition: function() { + let availableHeight = window.innerHeight - this.$refs.button.offsetHeight; + let element = this.$refs.button; + while (element) { + availableHeight -= element.offsetTop; + element = element.offsetParent; + } + if (this.$refs.listbox.offsetHeight <= availableHeight) { + this.$refs.listbox.style.bottom = "auto"; + return; + } + this.$refs.listbox.style.bottom = `${this.$refs.button.offsetHeight}px`; + }, + focusNextOption: function() { + if (this.focusedOptionIndex === null) { + this.focusedOptionIndex = Object.keys(this.options).length - 1; + return; + } + if (this.focusedOptionIndex + 1 >= Object.keys(this.options).length) { + return; + } + this.focusedOptionIndex++; + this.$refs.listboxOptionsList.children[this.focusedOptionIndex].scrollIntoView({ + block: "center" + }); + }, + focusPreviousOption: function() { + if (this.focusedOptionIndex === null) { + this.focusedOptionIndex = 0; + return; + } + if (this.focusedOptionIndex <= 0) { + return; + } + this.focusedOptionIndex--; + this.$refs.listboxOptionsList.children[this.focusedOptionIndex].scrollIntoView({ + block: "center" + }); + }, + openListbox: function() { + this.focusedOptionIndex = 0; + this.isOpen = true; + this.$nextTick(() => { + this.$refs.search.focus(); + this.evaluatePosition(); + this.$refs.listboxOptionsList.children[this.focusedOptionIndex].scrollIntoView({ + block: "center" + }); + }); + }, + selectOption: function(index2 = null) { + if (!this.isOpen) { + this.closeListbox(); + return; + } + let value = Object.keys(this.options)[index2 ?? this.focusedOptionIndex]; + if (this.state.indexOf(value) < 0) { + this.state.push(value); + } else { + this.deselectOption(value); + } + this.closeListbox(); + }, + deselectOption: function(optionToDeselect) { + this.state = this.state.filter((option3) => option3 !== optionToDeselect); + }, + toggleListboxVisibility: function() { + if (this.isOpen) { + this.closeListbox(); + return; + } + this.openListbox(); + } + }; + }); +}; + +// packages/forms/resources/js/components/rich-editor.js +var import_trix = __toModule(require_trix()); +import_trix.default.config.blockAttributes.heading = { + tagName: "h2", + terminal: true, + breakOnReturn: true, + group: false +}; +import_trix.default.config.blockAttributes.subHeading = { + tagName: "h3", + terminal: true, + breakOnReturn: true, + group: false +}; +var rich_editor_default = (Alpine) => { + Alpine.data("richEditorFormComponent", ({ + state: state2 + }) => { + return { + state: state2, + init: function() { + this.$refs.trix?.editor?.loadHTML(this.state); + this.$watch("state", () => { + if (document.activeElement === this.$refs.trix) { + return; + } + this.$refs.trix?.editor?.loadHTML(this.state); + }); + } + }; + }); +}; + +// packages/forms/resources/js/components/select.js +var select_default = (Alpine) => { + Alpine.data("selectFormComponent", ({ + getOptionLabelUsing, + getSearchResultsUsing, + isAutofocused, + options, + state: state2 + }) => { + return { + focusedOptionIndex: null, + isLoading: false, + isOpen: false, + label: null, + options, + search: "", + state: state2, + init: async function() { + if (isAutofocused) { + this.openListbox(); + } + this.label = await getOptionLabelUsing(); + if (this.state !== null) { + this.state = this.state.toString(); + } + this.$watch("search", async () => { + if (!this.isOpen || this.search === "" || this.search === null) { + this.options = options; + this.focusedOptionIndex = 0; + return; + } + if (Object.keys(options).length) { + this.options = {}; + let search = this.search.trim().toLowerCase(); + for (let key in options) { + if (options[key].trim().toLowerCase().includes(search)) { + this.options[key] = options[key]; + } + } + this.focusedOptionIndex = 0; + } else { + this.isLoading = true; + this.options = await getSearchResultsUsing(this.search); + this.focusedOptionIndex = 0; + this.isLoading = false; + } + }); + this.$watch("state", async () => { + this.label = await getOptionLabelUsing(); + }); + }, + clearState: function() { + this.state = null; + this.label = null; + this.closeListbox(); + }, + closeListbox: function() { + this.isOpen = false; + this.focusedOptionIndex = null; + this.search = ""; + }, + evaluatePosition: function() { + let availableHeight = window.innerHeight - this.$refs.button.offsetHeight; + let element = this.$refs.button; + while (element) { + availableHeight -= element.offsetTop; + element = element.offsetParent; + } + if (this.$refs.listbox.offsetHeight <= availableHeight) { + this.$refs.listbox.style.bottom = "auto"; + return; + } + this.$refs.listbox.style.bottom = `${this.$refs.button.offsetHeight}px`; + }, + focusNextOption: function() { + if (this.focusedOptionIndex === null) { + this.focusedOptionIndex = Object.keys(this.options).length - 1; + return; + } + if (this.focusedOptionIndex + 1 >= Object.keys(this.options).length) { + return; + } + this.focusedOptionIndex++; + this.$refs.listboxOptionsList.children[this.focusedOptionIndex].scrollIntoView({ + block: "center" + }); + }, + focusPreviousOption: function() { + if (this.focusedOptionIndex === null) { + this.focusedOptionIndex = 0; + return; + } + if (this.focusedOptionIndex <= 0) { + return; + } + this.focusedOptionIndex--; + this.$refs.listboxOptionsList.children[this.focusedOptionIndex].scrollIntoView({ + block: "center" + }); + }, + openListbox: function() { + this.focusedOptionIndex = Object.keys(this.options).indexOf(this.state); + if (this.focusedOptionIndex < 0) { + this.focusedOptionIndex = 0; + } + this.isOpen = true; + this.$nextTick(() => { + this.$refs.search.focus(); + this.evaluatePosition(); + this.$refs.listboxOptionsList.children[this.focusedOptionIndex].scrollIntoView({ + block: "center" + }); + }); + }, + selectOption: function(index2 = null) { + if (!this.isOpen) { + this.closeListbox(); + return; + } + this.state = Object.keys(this.options)[index2 ?? this.focusedOptionIndex]; + this.label = this.options[this.state]; + this.closeListbox(); + }, + toggleListboxVisibility: function() { + if (this.isOpen) { + this.closeListbox(); + return; + } + this.openListbox(); + } + }; + }); +}; + +// packages/forms/resources/js/components/tags-input.js +var tags_input_default = (Alpine) => { + Alpine.data("tagsInputFormComponent", ({ + state: state2 + }) => { + return { + newTag: "", + state: state2, + createTag: function() { + this.newTag = this.newTag.trim(); + if (this.newTag === "") { + return; + } + if (this.state.includes(this.newTag)) { + this.newTag = ""; + return; + } + this.state.push(this.newTag); + this.newTag = ""; + }, + deleteTag: function(tagToDelete) { + this.state = this.state.filter((tag) => tag !== tagToDelete); + } + }; + }); +}; + +// node_modules/imask/esm/_rollupPluginBabelHelpers-a0b34764.js +function _typeof2(obj) { + "@babel/helpers - typeof"; + if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { + _typeof2 = function(obj2) { + return typeof obj2; + }; + } else { + _typeof2 = function(obj2) { + return obj2 && typeof Symbol === "function" && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2; + }; + } + return _typeof2(obj); +} +function _classCallCheck(instance, Constructor) { + if (!(instance instanceof Constructor)) { + throw new TypeError("Cannot call a class as a function"); + } +} +function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) + descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } +} +function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) + _defineProperties(Constructor.prototype, protoProps); + if (staticProps) + _defineProperties(Constructor, staticProps); + return Constructor; +} +function _defineProperty2(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + return obj; +} +function _inherits(subClass, superClass) { + if (typeof superClass !== "function" && superClass !== null) { + throw new TypeError("Super expression must either be null or a function"); + } + subClass.prototype = Object.create(superClass && superClass.prototype, { + constructor: { + value: subClass, + writable: true, + configurable: true + } + }); + if (superClass) + _setPrototypeOf(subClass, superClass); +} +function _getPrototypeOf(o2) { + _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf2(o3) { + return o3.__proto__ || Object.getPrototypeOf(o3); + }; + return _getPrototypeOf(o2); +} +function _setPrototypeOf(o2, p2) { + _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf2(o3, p3) { + o3.__proto__ = p3; + return o3; + }; + return _setPrototypeOf(o2, p2); +} +function _isNativeReflectConstruct() { + if (typeof Reflect === "undefined" || !Reflect.construct) + return false; + if (Reflect.construct.sham) + return false; + if (typeof Proxy === "function") + return true; + try { + Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() { + })); + return true; + } catch (e2) { + return false; + } +} +function _objectWithoutPropertiesLoose2(source, excluded) { + if (source == null) + return {}; + var target = {}; + var sourceKeys = Object.keys(source); + var key, i; + for (i = 0; i < sourceKeys.length; i++) { + key = sourceKeys[i]; + if (excluded.indexOf(key) >= 0) + continue; + target[key] = source[key]; + } + return target; +} +function _objectWithoutProperties2(source, excluded) { + if (source == null) + return {}; + var target = _objectWithoutPropertiesLoose2(source, excluded); + var key, i; + if (Object.getOwnPropertySymbols) { + var sourceSymbolKeys = Object.getOwnPropertySymbols(source); + for (i = 0; i < sourceSymbolKeys.length; i++) { + key = sourceSymbolKeys[i]; + if (excluded.indexOf(key) >= 0) + continue; + if (!Object.prototype.propertyIsEnumerable.call(source, key)) + continue; + target[key] = source[key]; + } + } + return target; +} +function _assertThisInitialized(self2) { + if (self2 === void 0) { + throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); + } + return self2; +} +function _possibleConstructorReturn(self2, call) { + if (call && (typeof call === "object" || typeof call === "function")) { + return call; + } else if (call !== void 0) { + throw new TypeError("Derived constructors may only return object or undefined"); + } + return _assertThisInitialized(self2); +} +function _createSuper(Derived) { + var hasNativeReflectConstruct = _isNativeReflectConstruct(); + return function _createSuperInternal() { + var Super = _getPrototypeOf(Derived), result; + if (hasNativeReflectConstruct) { + var NewTarget = _getPrototypeOf(this).constructor; + result = Reflect.construct(Super, arguments, NewTarget); + } else { + result = Super.apply(this, arguments); + } + return _possibleConstructorReturn(this, result); + }; +} +function _superPropBase(object, property) { + while (!Object.prototype.hasOwnProperty.call(object, property)) { + object = _getPrototypeOf(object); + if (object === null) + break; + } + return object; +} +function _get(target, property, receiver) { + if (typeof Reflect !== "undefined" && Reflect.get) { + _get = Reflect.get; + } else { + _get = function _get2(target2, property2, receiver2) { + var base = _superPropBase(target2, property2); + if (!base) + return; + var desc = Object.getOwnPropertyDescriptor(base, property2); + if (desc.get) { + return desc.get.call(receiver2); + } + return desc.value; + }; + } + return _get(target, property, receiver || target); +} +function set(target, property, value, receiver) { + if (typeof Reflect !== "undefined" && Reflect.set) { + set = Reflect.set; + } else { + set = function set2(target2, property2, value2, receiver2) { + var base = _superPropBase(target2, property2); + var desc; + if (base) { + desc = Object.getOwnPropertyDescriptor(base, property2); + if (desc.set) { + desc.set.call(receiver2, value2); + return true; + } else if (!desc.writable) { + return false; + } + } + desc = Object.getOwnPropertyDescriptor(receiver2, property2); + if (desc) { + if (!desc.writable) { + return false; + } + desc.value = value2; + Object.defineProperty(receiver2, property2, desc); + } else { + _defineProperty2(receiver2, property2, value2); + } + return true; + }; + } + return set(target, property, value, receiver); +} +function _set(target, property, value, receiver, isStrict) { + var s2 = set(target, property, value, receiver || target); + if (!s2 && isStrict) { + throw new Error("failed to set property"); + } + return value; +} +function _slicedToArray(arr, i) { + return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); +} +function _arrayWithHoles(arr) { + if (Array.isArray(arr)) + return arr; +} +function _iterableToArrayLimit(arr, i) { + var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; + if (_i == null) + return; + var _arr = []; + var _n = true; + var _d = false; + var _s, _e; + try { + for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { + _arr.push(_s.value); + if (i && _arr.length === i) + break; + } + } catch (err) { + _d = true; + _e = err; + } finally { + try { + if (!_n && _i["return"] != null) + _i["return"](); + } finally { + if (_d) + throw _e; + } + } + return _arr; +} +function _unsupportedIterableToArray(o2, minLen) { + if (!o2) + return; + if (typeof o2 === "string") + return _arrayLikeToArray(o2, minLen); + var n2 = Object.prototype.toString.call(o2).slice(8, -1); + if (n2 === "Object" && o2.constructor) + n2 = o2.constructor.name; + if (n2 === "Map" || n2 === "Set") + return Array.from(o2); + if (n2 === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n2)) + return _arrayLikeToArray(o2, minLen); +} +function _arrayLikeToArray(arr, len) { + if (len == null || len > arr.length) + len = arr.length; + for (var i = 0, arr2 = new Array(len); i < len; i++) + arr2[i] = arr[i]; + return arr2; +} +function _nonIterableRest() { + throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); +} + +// node_modules/imask/esm/core/utils.js +function isString2(str) { + return typeof str === "string" || str instanceof String; +} +var DIRECTION = { + NONE: "NONE", + LEFT: "LEFT", + FORCE_LEFT: "FORCE_LEFT", + RIGHT: "RIGHT", + FORCE_RIGHT: "FORCE_RIGHT" +}; +function forceDirection(direction) { + switch (direction) { + case DIRECTION.LEFT: + return DIRECTION.FORCE_LEFT; + case DIRECTION.RIGHT: + return DIRECTION.FORCE_RIGHT; + default: + return direction; + } +} +function escapeRegExp(str) { + return str.replace(/([.*+?^=!:${}()|[\]\/\\])/g, "\\$1"); +} +function objectIncludes(b, a2) { + if (a2 === b) + return true; + var arrA = Array.isArray(a2), arrB = Array.isArray(b), i; + if (arrA && arrB) { + if (a2.length != b.length) + return false; + for (i = 0; i < a2.length; i++) { + if (!objectIncludes(a2[i], b[i])) + return false; + } + return true; + } + if (arrA != arrB) + return false; + if (a2 && b && _typeof2(a2) === "object" && _typeof2(b) === "object") { + var dateA = a2 instanceof Date, dateB = b instanceof Date; + if (dateA && dateB) + return a2.getTime() == b.getTime(); + if (dateA != dateB) + return false; + var regexpA = a2 instanceof RegExp, regexpB = b instanceof RegExp; + if (regexpA && regexpB) + return a2.toString() == b.toString(); + if (regexpA != regexpB) + return false; + var keys = Object.keys(a2); + for (i = 0; i < keys.length; i++) { + if (!Object.prototype.hasOwnProperty.call(b, keys[i])) + return false; + } + for (i = 0; i < keys.length; i++) { + if (!objectIncludes(b[keys[i]], a2[keys[i]])) + return false; + } + return true; + } else if (a2 && b && typeof a2 === "function" && typeof b === "function") { + return a2.toString() === b.toString(); + } + return false; +} + +// node_modules/imask/esm/core/action-details.js +var ActionDetails = /* @__PURE__ */ function() { + function ActionDetails2(value, cursorPos, oldValue, oldSelection) { + _classCallCheck(this, ActionDetails2); + this.value = value; + this.cursorPos = cursorPos; + this.oldValue = oldValue; + this.oldSelection = oldSelection; + while (this.value.slice(0, this.startChangePos) !== this.oldValue.slice(0, this.startChangePos)) { + --this.oldSelection.start; + } + } + _createClass(ActionDetails2, [{ + key: "startChangePos", + get: function get() { + return Math.min(this.cursorPos, this.oldSelection.start); + } + }, { + key: "insertedCount", + get: function get() { + return this.cursorPos - this.startChangePos; + } + }, { + key: "inserted", + get: function get() { + return this.value.substr(this.startChangePos, this.insertedCount); + } + }, { + key: "removedCount", + get: function get() { + return Math.max(this.oldSelection.end - this.startChangePos || this.oldValue.length - this.value.length, 0); + } + }, { + key: "removed", + get: function get() { + return this.oldValue.substr(this.startChangePos, this.removedCount); + } + }, { + key: "head", + get: function get() { + return this.value.substring(0, this.startChangePos); + } + }, { + key: "tail", + get: function get() { + return this.value.substring(this.startChangePos + this.insertedCount); + } + }, { + key: "removeDirection", + get: function get() { + if (!this.removedCount || this.insertedCount) + return DIRECTION.NONE; + return this.oldSelection.end === this.cursorPos || this.oldSelection.start === this.cursorPos ? DIRECTION.RIGHT : DIRECTION.LEFT; + } + }]); + return ActionDetails2; +}(); + +// node_modules/imask/esm/core/change-details.js +var ChangeDetails = /* @__PURE__ */ function() { + function ChangeDetails2(details) { + _classCallCheck(this, ChangeDetails2); + Object.assign(this, { + inserted: "", + rawInserted: "", + skip: false, + tailShift: 0 + }, details); + } + _createClass(ChangeDetails2, [{ + key: "aggregate", + value: function aggregate(details) { + this.rawInserted += details.rawInserted; + this.skip = this.skip || details.skip; + this.inserted += details.inserted; + this.tailShift += details.tailShift; + return this; + } + }, { + key: "offset", + get: function get() { + return this.tailShift + this.inserted.length; + } + }]); + return ChangeDetails2; +}(); + +// node_modules/imask/esm/core/continuous-tail-details.js +var ContinuousTailDetails = /* @__PURE__ */ function() { + function ContinuousTailDetails2() { + var value = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : ""; + var from = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 0; + var stop = arguments.length > 2 ? arguments[2] : void 0; + _classCallCheck(this, ContinuousTailDetails2); + this.value = value; + this.from = from; + this.stop = stop; + } + _createClass(ContinuousTailDetails2, [{ + key: "toString", + value: function toString2() { + return this.value; + } + }, { + key: "extend", + value: function extend2(tail) { + this.value += String(tail); + } + }, { + key: "appendTo", + value: function appendTo(masked) { + return masked.append(this.toString(), { + tail: true + }).aggregate(masked._appendPlaceholder()); + } + }, { + key: "state", + get: function get() { + return { + value: this.value, + from: this.from, + stop: this.stop + }; + }, + set: function set2(state2) { + Object.assign(this, state2); + } + }, { + key: "shiftBefore", + value: function shiftBefore(pos) { + if (this.from >= pos || !this.value.length) + return ""; + var shiftChar = this.value[0]; + this.value = this.value.slice(1); + return shiftChar; + } + }]); + return ContinuousTailDetails2; +}(); + +// node_modules/imask/esm/core/holder.js +function IMask(el) { + var opts = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}; + return new IMask.InputMask(el, opts); +} + +// node_modules/imask/esm/masked/base.js +var Masked = /* @__PURE__ */ function() { + function Masked2(opts) { + _classCallCheck(this, Masked2); + this._value = ""; + this._update(Object.assign({}, Masked2.DEFAULTS, opts)); + this.isInitialized = true; + } + _createClass(Masked2, [{ + key: "updateOptions", + value: function updateOptions(opts) { + if (!Object.keys(opts).length) + return; + this.withValueRefresh(this._update.bind(this, opts)); + } + }, { + key: "_update", + value: function _update(opts) { + Object.assign(this, opts); + } + }, { + key: "state", + get: function get() { + return { + _value: this.value + }; + }, + set: function set2(state2) { + this._value = state2._value; + } + }, { + key: "reset", + value: function reset() { + this._value = ""; + } + }, { + key: "value", + get: function get() { + return this._value; + }, + set: function set2(value) { + this.resolve(value); + } + }, { + key: "resolve", + value: function resolve(value) { + this.reset(); + this.append(value, { + input: true + }, ""); + this.doCommit(); + return this.value; + } + }, { + key: "unmaskedValue", + get: function get() { + return this.value; + }, + set: function set2(value) { + this.reset(); + this.append(value, {}, ""); + this.doCommit(); + } + }, { + key: "typedValue", + get: function get() { + return this.doParse(this.value); + }, + set: function set2(value) { + this.value = this.doFormat(value); + } + }, { + key: "rawInputValue", + get: function get() { + return this.extractInput(0, this.value.length, { + raw: true + }); + }, + set: function set2(value) { + this.reset(); + this.append(value, { + raw: true + }, ""); + this.doCommit(); + } + }, { + key: "isComplete", + get: function get() { + return true; + } + }, { + key: "nearestInputPos", + value: function nearestInputPos(cursorPos, direction) { + return cursorPos; + } + }, { + key: "extractInput", + value: function extractInput() { + var fromPos = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 0; + var toPos = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : this.value.length; + return this.value.slice(fromPos, toPos); + } + }, { + key: "extractTail", + value: function extractTail() { + var fromPos = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 0; + var toPos = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : this.value.length; + return new ContinuousTailDetails(this.extractInput(fromPos, toPos), fromPos); + } + }, { + key: "appendTail", + value: function appendTail(tail) { + if (isString2(tail)) + tail = new ContinuousTailDetails(String(tail)); + return tail.appendTo(this); + } + }, { + key: "_appendCharRaw", + value: function _appendCharRaw(ch) { + if (!ch) + return new ChangeDetails(); + this._value += ch; + return new ChangeDetails({ + inserted: ch, + rawInserted: ch + }); + } + }, { + key: "_appendChar", + value: function _appendChar(ch) { + var flags = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}; + var checkTail = arguments.length > 2 ? arguments[2] : void 0; + var consistentState = this.state; + var details = this._appendCharRaw(this.doPrepare(ch, flags), flags); + if (details.inserted) { + var consistentTail; + var appended = this.doValidate(flags) !== false; + if (appended && checkTail != null) { + var beforeTailState = this.state; + if (this.overwrite) { + consistentTail = checkTail.state; + checkTail.shiftBefore(this.value.length); + } + var tailDetails = this.appendTail(checkTail); + appended = tailDetails.rawInserted === checkTail.toString(); + if (appended && tailDetails.inserted) + this.state = beforeTailState; + } + if (!appended) { + details = new ChangeDetails(); + this.state = consistentState; + if (checkTail && consistentTail) + checkTail.state = consistentTail; + } + } + return details; + } + }, { + key: "_appendPlaceholder", + value: function _appendPlaceholder() { + return new ChangeDetails(); + } + }, { + key: "append", + value: function append(str, flags, tail) { + if (!isString2(str)) + throw new Error("value should be string"); + var details = new ChangeDetails(); + var checkTail = isString2(tail) ? new ContinuousTailDetails(String(tail)) : tail; + if (flags && flags.tail) + flags._beforeTailState = this.state; + for (var ci = 0; ci < str.length; ++ci) { + details.aggregate(this._appendChar(str[ci], flags, checkTail)); + } + if (checkTail != null) { + details.tailShift += this.appendTail(checkTail).tailShift; + } + return details; + } + }, { + key: "remove", + value: function remove() { + var fromPos = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 0; + var toPos = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : this.value.length; + this._value = this.value.slice(0, fromPos) + this.value.slice(toPos); + return new ChangeDetails(); + } + }, { + key: "withValueRefresh", + value: function withValueRefresh(fn2) { + if (this._refreshing || !this.isInitialized) + return fn2(); + this._refreshing = true; + var rawInput = this.rawInputValue; + var value = this.value; + var ret = fn2(); + this.rawInputValue = rawInput; + if (this.value && this.value !== value && value.indexOf(this.value) === 0) { + this.append(value.slice(this.value.length), {}, ""); + } + delete this._refreshing; + return ret; + } + }, { + key: "runIsolated", + value: function runIsolated(fn2) { + if (this._isolated || !this.isInitialized) + return fn2(this); + this._isolated = true; + var state2 = this.state; + var ret = fn2(this); + this.state = state2; + delete this._isolated; + return ret; + } + }, { + key: "doPrepare", + value: function doPrepare(str) { + var flags = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}; + return this.prepare ? this.prepare(str, this, flags) : str; + } + }, { + key: "doValidate", + value: function doValidate(flags) { + return (!this.validate || this.validate(this.value, this, flags)) && (!this.parent || this.parent.doValidate(flags)); + } + }, { + key: "doCommit", + value: function doCommit() { + if (this.commit) + this.commit(this.value, this); + } + }, { + key: "doFormat", + value: function doFormat(value) { + return this.format ? this.format(value, this) : value; + } + }, { + key: "doParse", + value: function doParse(str) { + return this.parse ? this.parse(str, this) : str; + } + }, { + key: "splice", + value: function splice(start, deleteCount, inserted, removeDirection) { + var tailPos = start + deleteCount; + var tail = this.extractTail(tailPos); + var startChangePos = this.nearestInputPos(start, removeDirection); + var changeDetails = new ChangeDetails({ + tailShift: startChangePos - start + }).aggregate(this.remove(startChangePos)).aggregate(this.append(inserted, { + input: true + }, tail)); + return changeDetails; + } + }]); + return Masked2; +}(); +Masked.DEFAULTS = { + format: function format(v) { + return v; + }, + parse: function parse3(v) { + return v; + } +}; +IMask.Masked = Masked; + +// node_modules/imask/esm/masked/factory.js +function maskedClass(mask) { + if (mask == null) { + throw new Error("mask property should be defined"); + } + if (mask instanceof RegExp) + return IMask.MaskedRegExp; + if (isString2(mask)) + return IMask.MaskedPattern; + if (mask instanceof Date || mask === Date) + return IMask.MaskedDate; + if (mask instanceof Number || typeof mask === "number" || mask === Number) + return IMask.MaskedNumber; + if (Array.isArray(mask) || mask === Array) + return IMask.MaskedDynamic; + if (IMask.Masked && mask.prototype instanceof IMask.Masked) + return mask; + if (mask instanceof Function) + return IMask.MaskedFunction; + if (mask instanceof IMask.Masked) + return mask.constructor; + console.warn("Mask not found for mask", mask); + return IMask.Masked; +} +function createMask(opts) { + if (IMask.Masked && opts instanceof IMask.Masked) + return opts; + opts = Object.assign({}, opts); + var mask = opts.mask; + if (IMask.Masked && mask instanceof IMask.Masked) + return mask; + var MaskedClass = maskedClass(mask); + if (!MaskedClass) + throw new Error("Masked class is not found for provided mask, appropriate module needs to be import manually before creating mask."); + return new MaskedClass(opts); +} +IMask.createMask = createMask; + +// node_modules/imask/esm/masked/pattern/input-definition.js +var _excluded2 = ["mask"]; +var DEFAULT_INPUT_DEFINITIONS = { + "0": /\d/, + a: /[\u0041-\u005A\u0061-\u007A\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]/, + "*": /./ +}; +var PatternInputDefinition = /* @__PURE__ */ function() { + function PatternInputDefinition2(opts) { + _classCallCheck(this, PatternInputDefinition2); + var mask = opts.mask, blockOpts = _objectWithoutProperties2(opts, _excluded2); + this.masked = createMask({ + mask + }); + Object.assign(this, blockOpts); + } + _createClass(PatternInputDefinition2, [{ + key: "reset", + value: function reset() { + this._isFilled = false; + this.masked.reset(); + } + }, { + key: "remove", + value: function remove() { + var fromPos = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 0; + var toPos = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : this.value.length; + if (fromPos === 0 && toPos >= 1) { + this._isFilled = false; + return this.masked.remove(fromPos, toPos); + } + return new ChangeDetails(); + } + }, { + key: "value", + get: function get() { + return this.masked.value || (this._isFilled && !this.isOptional ? this.placeholderChar : ""); + } + }, { + key: "unmaskedValue", + get: function get() { + return this.masked.unmaskedValue; + } + }, { + key: "isComplete", + get: function get() { + return Boolean(this.masked.value) || this.isOptional; + } + }, { + key: "_appendChar", + value: function _appendChar(str) { + var flags = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}; + if (this._isFilled) + return new ChangeDetails(); + var state2 = this.masked.state; + var details = this.masked._appendChar(str, flags); + if (details.inserted && this.doValidate(flags) === false) { + details.inserted = details.rawInserted = ""; + this.masked.state = state2; + } + if (!details.inserted && !this.isOptional && !this.lazy && !flags.input) { + details.inserted = this.placeholderChar; + } + details.skip = !details.inserted && !this.isOptional; + this._isFilled = Boolean(details.inserted); + return details; + } + }, { + key: "append", + value: function append() { + var _this$masked; + return (_this$masked = this.masked).append.apply(_this$masked, arguments); + } + }, { + key: "_appendPlaceholder", + value: function _appendPlaceholder() { + var details = new ChangeDetails(); + if (this._isFilled || this.isOptional) + return details; + this._isFilled = true; + details.inserted = this.placeholderChar; + return details; + } + }, { + key: "extractTail", + value: function extractTail() { + var _this$masked2; + return (_this$masked2 = this.masked).extractTail.apply(_this$masked2, arguments); + } + }, { + key: "appendTail", + value: function appendTail() { + var _this$masked3; + return (_this$masked3 = this.masked).appendTail.apply(_this$masked3, arguments); + } + }, { + key: "extractInput", + value: function extractInput() { + var fromPos = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 0; + var toPos = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : this.value.length; + var flags = arguments.length > 2 ? arguments[2] : void 0; + return this.masked.extractInput(fromPos, toPos, flags); + } + }, { + key: "nearestInputPos", + value: function nearestInputPos(cursorPos) { + var direction = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : DIRECTION.NONE; + var minPos = 0; + var maxPos = this.value.length; + var boundPos = Math.min(Math.max(cursorPos, minPos), maxPos); + switch (direction) { + case DIRECTION.LEFT: + case DIRECTION.FORCE_LEFT: + return this.isComplete ? boundPos : minPos; + case DIRECTION.RIGHT: + case DIRECTION.FORCE_RIGHT: + return this.isComplete ? boundPos : maxPos; + case DIRECTION.NONE: + default: + return boundPos; + } + } + }, { + key: "doValidate", + value: function doValidate() { + var _this$masked4, _this$parent; + return (_this$masked4 = this.masked).doValidate.apply(_this$masked4, arguments) && (!this.parent || (_this$parent = this.parent).doValidate.apply(_this$parent, arguments)); + } + }, { + key: "doCommit", + value: function doCommit() { + this.masked.doCommit(); + } + }, { + key: "state", + get: function get() { + return { + masked: this.masked.state, + _isFilled: this._isFilled + }; + }, + set: function set2(state2) { + this.masked.state = state2.masked; + this._isFilled = state2._isFilled; + } + }]); + return PatternInputDefinition2; +}(); + +// node_modules/imask/esm/masked/pattern/fixed-definition.js +var PatternFixedDefinition = /* @__PURE__ */ function() { + function PatternFixedDefinition2(opts) { + _classCallCheck(this, PatternFixedDefinition2); + Object.assign(this, opts); + this._value = ""; + } + _createClass(PatternFixedDefinition2, [{ + key: "value", + get: function get() { + return this._value; + } + }, { + key: "unmaskedValue", + get: function get() { + return this.isUnmasking ? this.value : ""; + } + }, { + key: "reset", + value: function reset() { + this._isRawInput = false; + this._value = ""; + } + }, { + key: "remove", + value: function remove() { + var fromPos = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 0; + var toPos = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : this._value.length; + this._value = this._value.slice(0, fromPos) + this._value.slice(toPos); + if (!this._value) + this._isRawInput = false; + return new ChangeDetails(); + } + }, { + key: "nearestInputPos", + value: function nearestInputPos(cursorPos) { + var direction = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : DIRECTION.NONE; + var minPos = 0; + var maxPos = this._value.length; + switch (direction) { + case DIRECTION.LEFT: + case DIRECTION.FORCE_LEFT: + return minPos; + case DIRECTION.NONE: + case DIRECTION.RIGHT: + case DIRECTION.FORCE_RIGHT: + default: + return maxPos; + } + } + }, { + key: "extractInput", + value: function extractInput() { + var fromPos = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 0; + var toPos = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : this._value.length; + var flags = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {}; + return flags.raw && this._isRawInput && this._value.slice(fromPos, toPos) || ""; + } + }, { + key: "isComplete", + get: function get() { + return true; + } + }, { + key: "_appendChar", + value: function _appendChar(str) { + var flags = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}; + var details = new ChangeDetails(); + if (this._value) + return details; + var appended = this.char === str[0]; + var isResolved = appended && (this.isUnmasking || flags.input || flags.raw) && !flags.tail; + if (isResolved) + details.rawInserted = this.char; + this._value = details.inserted = this.char; + this._isRawInput = isResolved && (flags.raw || flags.input); + return details; + } + }, { + key: "_appendPlaceholder", + value: function _appendPlaceholder() { + var details = new ChangeDetails(); + if (this._value) + return details; + this._value = details.inserted = this.char; + return details; + } + }, { + key: "extractTail", + value: function extractTail() { + arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : this.value.length; + return new ContinuousTailDetails(""); + } + }, { + key: "appendTail", + value: function appendTail(tail) { + if (isString2(tail)) + tail = new ContinuousTailDetails(String(tail)); + return tail.appendTo(this); + } + }, { + key: "append", + value: function append(str, flags, tail) { + var details = this._appendChar(str, flags); + if (tail != null) { + details.tailShift += this.appendTail(tail).tailShift; + } + return details; + } + }, { + key: "doCommit", + value: function doCommit() { + } + }, { + key: "state", + get: function get() { + return { + _value: this._value, + _isRawInput: this._isRawInput + }; + }, + set: function set2(state2) { + Object.assign(this, state2); + } + }]); + return PatternFixedDefinition2; +}(); + +// node_modules/imask/esm/masked/pattern/chunk-tail-details.js +var _excluded3 = ["chunks"]; +var ChunksTailDetails = /* @__PURE__ */ function() { + function ChunksTailDetails2() { + var chunks = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : []; + var from = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 0; + _classCallCheck(this, ChunksTailDetails2); + this.chunks = chunks; + this.from = from; + } + _createClass(ChunksTailDetails2, [{ + key: "toString", + value: function toString2() { + return this.chunks.map(String).join(""); + } + }, { + key: "extend", + value: function extend2(tailChunk) { + if (!String(tailChunk)) + return; + if (isString2(tailChunk)) + tailChunk = new ContinuousTailDetails(String(tailChunk)); + var lastChunk = this.chunks[this.chunks.length - 1]; + var extendLast = lastChunk && (lastChunk.stop === tailChunk.stop || tailChunk.stop == null) && tailChunk.from === lastChunk.from + lastChunk.toString().length; + if (tailChunk instanceof ContinuousTailDetails) { + if (extendLast) { + lastChunk.extend(tailChunk.toString()); + } else { + this.chunks.push(tailChunk); + } + } else if (tailChunk instanceof ChunksTailDetails2) { + if (tailChunk.stop == null) { + var firstTailChunk; + while (tailChunk.chunks.length && tailChunk.chunks[0].stop == null) { + firstTailChunk = tailChunk.chunks.shift(); + firstTailChunk.from += tailChunk.from; + this.extend(firstTailChunk); + } + } + if (tailChunk.toString()) { + tailChunk.stop = tailChunk.blockIndex; + this.chunks.push(tailChunk); + } + } + } + }, { + key: "appendTo", + value: function appendTo(masked) { + if (!(masked instanceof IMask.MaskedPattern)) { + var tail = new ContinuousTailDetails(this.toString()); + return tail.appendTo(masked); + } + var details = new ChangeDetails(); + for (var ci = 0; ci < this.chunks.length && !details.skip; ++ci) { + var chunk = this.chunks[ci]; + var lastBlockIter = masked._mapPosToBlock(masked.value.length); + var stop = chunk.stop; + var chunkBlock = void 0; + if (stop != null && (!lastBlockIter || lastBlockIter.index <= stop)) { + if (chunk instanceof ChunksTailDetails2 || masked._stops.indexOf(stop) >= 0) { + details.aggregate(masked._appendPlaceholder(stop)); + } + chunkBlock = chunk instanceof ChunksTailDetails2 && masked._blocks[stop]; + } + if (chunkBlock) { + var tailDetails = chunkBlock.appendTail(chunk); + tailDetails.skip = false; + details.aggregate(tailDetails); + masked._value += tailDetails.inserted; + var remainChars = chunk.toString().slice(tailDetails.rawInserted.length); + if (remainChars) + details.aggregate(masked.append(remainChars, { + tail: true + })); + } else { + details.aggregate(masked.append(chunk.toString(), { + tail: true + })); + } + } + return details; + } + }, { + key: "state", + get: function get() { + return { + chunks: this.chunks.map(function(c2) { + return c2.state; + }), + from: this.from, + stop: this.stop, + blockIndex: this.blockIndex + }; + }, + set: function set2(state2) { + var chunks = state2.chunks, props = _objectWithoutProperties2(state2, _excluded3); + Object.assign(this, props); + this.chunks = chunks.map(function(cstate) { + var chunk = "chunks" in cstate ? new ChunksTailDetails2() : new ContinuousTailDetails(); + chunk.state = cstate; + return chunk; + }); + } + }, { + key: "shiftBefore", + value: function shiftBefore(pos) { + if (this.from >= pos || !this.chunks.length) + return ""; + var chunkShiftPos = pos - this.from; + var ci = 0; + while (ci < this.chunks.length) { + var chunk = this.chunks[ci]; + var shiftChar = chunk.shiftBefore(chunkShiftPos); + if (chunk.toString()) { + if (!shiftChar) + break; + ++ci; + } else { + this.chunks.splice(ci, 1); + } + if (shiftChar) + return shiftChar; + } + return ""; + } + }]); + return ChunksTailDetails2; +}(); + +// node_modules/imask/esm/masked/regexp.js +var MaskedRegExp = /* @__PURE__ */ function(_Masked) { + _inherits(MaskedRegExp2, _Masked); + var _super = _createSuper(MaskedRegExp2); + function MaskedRegExp2() { + _classCallCheck(this, MaskedRegExp2); + return _super.apply(this, arguments); + } + _createClass(MaskedRegExp2, [{ + key: "_update", + value: function _update(opts) { + if (opts.mask) + opts.validate = function(value) { + return value.search(opts.mask) >= 0; + }; + _get(_getPrototypeOf(MaskedRegExp2.prototype), "_update", this).call(this, opts); + } + }]); + return MaskedRegExp2; +}(Masked); +IMask.MaskedRegExp = MaskedRegExp; + +// node_modules/imask/esm/masked/pattern.js +var _excluded4 = ["_blocks"]; +var MaskedPattern = /* @__PURE__ */ function(_Masked) { + _inherits(MaskedPattern2, _Masked); + var _super = _createSuper(MaskedPattern2); + function MaskedPattern2() { + var opts = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}; + _classCallCheck(this, MaskedPattern2); + opts.definitions = Object.assign({}, DEFAULT_INPUT_DEFINITIONS, opts.definitions); + return _super.call(this, Object.assign({}, MaskedPattern2.DEFAULTS, opts)); + } + _createClass(MaskedPattern2, [{ + key: "_update", + value: function _update() { + var opts = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}; + opts.definitions = Object.assign({}, this.definitions, opts.definitions); + _get(_getPrototypeOf(MaskedPattern2.prototype), "_update", this).call(this, opts); + this._rebuildMask(); + } + }, { + key: "_rebuildMask", + value: function _rebuildMask() { + var _this = this; + var defs = this.definitions; + this._blocks = []; + this._stops = []; + this._maskedBlocks = {}; + var pattern = this.mask; + if (!pattern || !defs) + return; + var unmaskingBlock = false; + var optionalBlock = false; + for (var i = 0; i < pattern.length; ++i) { + if (this.blocks) { + var _ret = function() { + var p2 = pattern.slice(i); + var bNames = Object.keys(_this.blocks).filter(function(bName2) { + return p2.indexOf(bName2) === 0; + }); + bNames.sort(function(a2, b) { + return b.length - a2.length; + }); + var bName = bNames[0]; + if (bName) { + var maskedBlock = createMask(Object.assign({ + parent: _this, + lazy: _this.lazy, + placeholderChar: _this.placeholderChar, + overwrite: _this.overwrite + }, _this.blocks[bName])); + if (maskedBlock) { + _this._blocks.push(maskedBlock); + if (!_this._maskedBlocks[bName]) + _this._maskedBlocks[bName] = []; + _this._maskedBlocks[bName].push(_this._blocks.length - 1); + } + i += bName.length - 1; + return "continue"; + } + }(); + if (_ret === "continue") + continue; + } + var char = pattern[i]; + var _isInput = char in defs; + if (char === MaskedPattern2.STOP_CHAR) { + this._stops.push(this._blocks.length); + continue; + } + if (char === "{" || char === "}") { + unmaskingBlock = !unmaskingBlock; + continue; + } + if (char === "[" || char === "]") { + optionalBlock = !optionalBlock; + continue; + } + if (char === MaskedPattern2.ESCAPE_CHAR) { + ++i; + char = pattern[i]; + if (!char) + break; + _isInput = false; + } + var def = _isInput ? new PatternInputDefinition({ + parent: this, + lazy: this.lazy, + placeholderChar: this.placeholderChar, + mask: defs[char], + isOptional: optionalBlock + }) : new PatternFixedDefinition({ + char, + isUnmasking: unmaskingBlock + }); + this._blocks.push(def); + } + } + }, { + key: "state", + get: function get() { + return Object.assign({}, _get(_getPrototypeOf(MaskedPattern2.prototype), "state", this), { + _blocks: this._blocks.map(function(b) { + return b.state; + }) + }); + }, + set: function set2(state2) { + var _blocks = state2._blocks, maskedState = _objectWithoutProperties2(state2, _excluded4); + this._blocks.forEach(function(b, bi) { + return b.state = _blocks[bi]; + }); + _set(_getPrototypeOf(MaskedPattern2.prototype), "state", maskedState, this, true); + } + }, { + key: "reset", + value: function reset() { + _get(_getPrototypeOf(MaskedPattern2.prototype), "reset", this).call(this); + this._blocks.forEach(function(b) { + return b.reset(); + }); + } + }, { + key: "isComplete", + get: function get() { + return this._blocks.every(function(b) { + return b.isComplete; + }); + } + }, { + key: "doCommit", + value: function doCommit() { + this._blocks.forEach(function(b) { + return b.doCommit(); + }); + _get(_getPrototypeOf(MaskedPattern2.prototype), "doCommit", this).call(this); + } + }, { + key: "unmaskedValue", + get: function get() { + return this._blocks.reduce(function(str, b) { + return str += b.unmaskedValue; + }, ""); + }, + set: function set2(unmaskedValue) { + _set(_getPrototypeOf(MaskedPattern2.prototype), "unmaskedValue", unmaskedValue, this, true); + } + }, { + key: "value", + get: function get() { + return this._blocks.reduce(function(str, b) { + return str += b.value; + }, ""); + }, + set: function set2(value) { + _set(_getPrototypeOf(MaskedPattern2.prototype), "value", value, this, true); + } + }, { + key: "appendTail", + value: function appendTail(tail) { + return _get(_getPrototypeOf(MaskedPattern2.prototype), "appendTail", this).call(this, tail).aggregate(this._appendPlaceholder()); + } + }, { + key: "_appendCharRaw", + value: function _appendCharRaw(ch) { + var flags = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}; + var blockIter = this._mapPosToBlock(this.value.length); + var details = new ChangeDetails(); + if (!blockIter) + return details; + for (var bi = blockIter.index; ; ++bi) { + var _block = this._blocks[bi]; + if (!_block) + break; + var blockDetails = _block._appendChar(ch, flags); + var skip = blockDetails.skip; + details.aggregate(blockDetails); + if (skip || blockDetails.rawInserted) + break; + } + return details; + } + }, { + key: "extractTail", + value: function extractTail() { + var _this2 = this; + var fromPos = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 0; + var toPos = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : this.value.length; + var chunkTail = new ChunksTailDetails(); + if (fromPos === toPos) + return chunkTail; + this._forEachBlocksInRange(fromPos, toPos, function(b, bi, bFromPos, bToPos) { + var blockChunk = b.extractTail(bFromPos, bToPos); + blockChunk.stop = _this2._findStopBefore(bi); + blockChunk.from = _this2._blockStartPos(bi); + if (blockChunk instanceof ChunksTailDetails) + blockChunk.blockIndex = bi; + chunkTail.extend(blockChunk); + }); + return chunkTail; + } + }, { + key: "extractInput", + value: function extractInput() { + var fromPos = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 0; + var toPos = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : this.value.length; + var flags = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {}; + if (fromPos === toPos) + return ""; + var input = ""; + this._forEachBlocksInRange(fromPos, toPos, function(b, _, fromPos2, toPos2) { + input += b.extractInput(fromPos2, toPos2, flags); + }); + return input; + } + }, { + key: "_findStopBefore", + value: function _findStopBefore(blockIndex) { + var stopBefore; + for (var si = 0; si < this._stops.length; ++si) { + var stop = this._stops[si]; + if (stop <= blockIndex) + stopBefore = stop; + else + break; + } + return stopBefore; + } + }, { + key: "_appendPlaceholder", + value: function _appendPlaceholder(toBlockIndex) { + var _this3 = this; + var details = new ChangeDetails(); + if (this.lazy && toBlockIndex == null) + return details; + var startBlockIter = this._mapPosToBlock(this.value.length); + if (!startBlockIter) + return details; + var startBlockIndex = startBlockIter.index; + var endBlockIndex = toBlockIndex != null ? toBlockIndex : this._blocks.length; + this._blocks.slice(startBlockIndex, endBlockIndex).forEach(function(b) { + if (!b.lazy || toBlockIndex != null) { + var args = b._blocks != null ? [b._blocks.length] : []; + var bDetails = b._appendPlaceholder.apply(b, args); + _this3._value += bDetails.inserted; + details.aggregate(bDetails); + } + }); + return details; + } + }, { + key: "_mapPosToBlock", + value: function _mapPosToBlock(pos) { + var accVal = ""; + for (var bi = 0; bi < this._blocks.length; ++bi) { + var _block2 = this._blocks[bi]; + var blockStartPos = accVal.length; + accVal += _block2.value; + if (pos <= accVal.length) { + return { + index: bi, + offset: pos - blockStartPos + }; + } + } + } + }, { + key: "_blockStartPos", + value: function _blockStartPos(blockIndex) { + return this._blocks.slice(0, blockIndex).reduce(function(pos, b) { + return pos += b.value.length; + }, 0); + } + }, { + key: "_forEachBlocksInRange", + value: function _forEachBlocksInRange(fromPos) { + var toPos = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : this.value.length; + var fn2 = arguments.length > 2 ? arguments[2] : void 0; + var fromBlockIter = this._mapPosToBlock(fromPos); + if (fromBlockIter) { + var toBlockIter = this._mapPosToBlock(toPos); + var isSameBlock = toBlockIter && fromBlockIter.index === toBlockIter.index; + var fromBlockStartPos = fromBlockIter.offset; + var fromBlockEndPos = toBlockIter && isSameBlock ? toBlockIter.offset : this._blocks[fromBlockIter.index].value.length; + fn2(this._blocks[fromBlockIter.index], fromBlockIter.index, fromBlockStartPos, fromBlockEndPos); + if (toBlockIter && !isSameBlock) { + for (var bi = fromBlockIter.index + 1; bi < toBlockIter.index; ++bi) { + fn2(this._blocks[bi], bi, 0, this._blocks[bi].value.length); + } + fn2(this._blocks[toBlockIter.index], toBlockIter.index, 0, toBlockIter.offset); + } + } + } + }, { + key: "remove", + value: function remove() { + var fromPos = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 0; + var toPos = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : this.value.length; + var removeDetails = _get(_getPrototypeOf(MaskedPattern2.prototype), "remove", this).call(this, fromPos, toPos); + this._forEachBlocksInRange(fromPos, toPos, function(b, _, bFromPos, bToPos) { + removeDetails.aggregate(b.remove(bFromPos, bToPos)); + }); + return removeDetails; + } + }, { + key: "nearestInputPos", + value: function nearestInputPos(cursorPos) { + var direction = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : DIRECTION.NONE; + var beginBlockData = this._mapPosToBlock(cursorPos) || { + index: 0, + offset: 0 + }; + var beginBlockOffset = beginBlockData.offset, beginBlockIndex = beginBlockData.index; + var beginBlock = this._blocks[beginBlockIndex]; + if (!beginBlock) + return cursorPos; + var beginBlockCursorPos = beginBlockOffset; + if (beginBlockCursorPos !== 0 && beginBlockCursorPos < beginBlock.value.length) { + beginBlockCursorPos = beginBlock.nearestInputPos(beginBlockOffset, forceDirection(direction)); + } + var cursorAtRight = beginBlockCursorPos === beginBlock.value.length; + var cursorAtLeft = beginBlockCursorPos === 0; + if (!cursorAtLeft && !cursorAtRight) + return this._blockStartPos(beginBlockIndex) + beginBlockCursorPos; + var searchBlockIndex = cursorAtRight ? beginBlockIndex + 1 : beginBlockIndex; + if (direction === DIRECTION.NONE) { + if (searchBlockIndex > 0) { + var blockIndexAtLeft = searchBlockIndex - 1; + var blockAtLeft = this._blocks[blockIndexAtLeft]; + var blockInputPos = blockAtLeft.nearestInputPos(0, DIRECTION.NONE); + if (!blockAtLeft.value.length || blockInputPos !== blockAtLeft.value.length) { + return this._blockStartPos(searchBlockIndex); + } + } + var firstInputAtRight = searchBlockIndex; + for (var bi = firstInputAtRight; bi < this._blocks.length; ++bi) { + var blockAtRight = this._blocks[bi]; + var _blockInputPos = blockAtRight.nearestInputPos(0, DIRECTION.NONE); + if (!blockAtRight.value.length || _blockInputPos !== blockAtRight.value.length) { + return this._blockStartPos(bi) + _blockInputPos; + } + } + for (var _bi = searchBlockIndex - 1; _bi >= 0; --_bi) { + var _block3 = this._blocks[_bi]; + var _blockInputPos2 = _block3.nearestInputPos(0, DIRECTION.NONE); + if (!_block3.value.length || _blockInputPos2 !== _block3.value.length) { + return this._blockStartPos(_bi) + _block3.value.length; + } + } + return cursorPos; + } + if (direction === DIRECTION.LEFT || direction === DIRECTION.FORCE_LEFT) { + var firstFilledBlockIndexAtRight; + for (var _bi2 = searchBlockIndex; _bi2 < this._blocks.length; ++_bi2) { + if (this._blocks[_bi2].value) { + firstFilledBlockIndexAtRight = _bi2; + break; + } + } + if (firstFilledBlockIndexAtRight != null) { + var filledBlock = this._blocks[firstFilledBlockIndexAtRight]; + var _blockInputPos3 = filledBlock.nearestInputPos(0, DIRECTION.RIGHT); + if (_blockInputPos3 === 0 && filledBlock.unmaskedValue.length) { + return this._blockStartPos(firstFilledBlockIndexAtRight) + _blockInputPos3; + } + } + var firstFilledInputBlockIndex = -1; + var firstEmptyInputBlockIndex; + for (var _bi3 = searchBlockIndex - 1; _bi3 >= 0; --_bi3) { + var _block4 = this._blocks[_bi3]; + var _blockInputPos4 = _block4.nearestInputPos(_block4.value.length, DIRECTION.FORCE_LEFT); + if (!_block4.value || _blockInputPos4 !== 0) + firstEmptyInputBlockIndex = _bi3; + if (_blockInputPos4 !== 0) { + if (_blockInputPos4 !== _block4.value.length) { + return this._blockStartPos(_bi3) + _blockInputPos4; + } else { + firstFilledInputBlockIndex = _bi3; + break; + } + } + } + if (direction === DIRECTION.LEFT) { + for (var _bi4 = firstFilledInputBlockIndex + 1; _bi4 <= Math.min(searchBlockIndex, this._blocks.length - 1); ++_bi4) { + var _block5 = this._blocks[_bi4]; + var _blockInputPos5 = _block5.nearestInputPos(0, DIRECTION.NONE); + var blockAlignedPos = this._blockStartPos(_bi4) + _blockInputPos5; + if (blockAlignedPos > cursorPos) + break; + if (_blockInputPos5 !== _block5.value.length) + return blockAlignedPos; + } + } + if (firstFilledInputBlockIndex >= 0) { + return this._blockStartPos(firstFilledInputBlockIndex) + this._blocks[firstFilledInputBlockIndex].value.length; + } + if (direction === DIRECTION.FORCE_LEFT || this.lazy && !this.extractInput() && !isInput(this._blocks[searchBlockIndex])) { + return 0; + } + if (firstEmptyInputBlockIndex != null) { + return this._blockStartPos(firstEmptyInputBlockIndex); + } + for (var _bi5 = searchBlockIndex; _bi5 < this._blocks.length; ++_bi5) { + var _block6 = this._blocks[_bi5]; + var _blockInputPos6 = _block6.nearestInputPos(0, DIRECTION.NONE); + if (!_block6.value.length || _blockInputPos6 !== _block6.value.length) { + return this._blockStartPos(_bi5) + _blockInputPos6; + } + } + return 0; + } + if (direction === DIRECTION.RIGHT || direction === DIRECTION.FORCE_RIGHT) { + var firstInputBlockAlignedIndex; + var firstInputBlockAlignedPos; + for (var _bi6 = searchBlockIndex; _bi6 < this._blocks.length; ++_bi6) { + var _block7 = this._blocks[_bi6]; + var _blockInputPos7 = _block7.nearestInputPos(0, DIRECTION.NONE); + if (_blockInputPos7 !== _block7.value.length) { + firstInputBlockAlignedPos = this._blockStartPos(_bi6) + _blockInputPos7; + firstInputBlockAlignedIndex = _bi6; + break; + } + } + if (firstInputBlockAlignedIndex != null && firstInputBlockAlignedPos != null) { + for (var _bi7 = firstInputBlockAlignedIndex; _bi7 < this._blocks.length; ++_bi7) { + var _block8 = this._blocks[_bi7]; + var _blockInputPos8 = _block8.nearestInputPos(0, DIRECTION.FORCE_RIGHT); + if (_blockInputPos8 !== _block8.value.length) { + return this._blockStartPos(_bi7) + _blockInputPos8; + } + } + return direction === DIRECTION.FORCE_RIGHT ? this.value.length : firstInputBlockAlignedPos; + } + for (var _bi8 = Math.min(searchBlockIndex, this._blocks.length - 1); _bi8 >= 0; --_bi8) { + var _block9 = this._blocks[_bi8]; + var _blockInputPos9 = _block9.nearestInputPos(_block9.value.length, DIRECTION.LEFT); + if (_blockInputPos9 !== 0) { + var alignedPos = this._blockStartPos(_bi8) + _blockInputPos9; + if (alignedPos >= cursorPos) + return alignedPos; + break; + } + } + } + return cursorPos; + } + }, { + key: "maskedBlock", + value: function maskedBlock(name2) { + return this.maskedBlocks(name2)[0]; + } + }, { + key: "maskedBlocks", + value: function maskedBlocks(name2) { + var _this4 = this; + var indices = this._maskedBlocks[name2]; + if (!indices) + return []; + return indices.map(function(gi) { + return _this4._blocks[gi]; + }); + } + }]); + return MaskedPattern2; +}(Masked); +MaskedPattern.DEFAULTS = { + lazy: true, + placeholderChar: "_" +}; +MaskedPattern.STOP_CHAR = "`"; +MaskedPattern.ESCAPE_CHAR = "\\"; +MaskedPattern.InputDefinition = PatternInputDefinition; +MaskedPattern.FixedDefinition = PatternFixedDefinition; +function isInput(block2) { + if (!block2) + return false; + var value = block2.value; + return !value || block2.nearestInputPos(0, DIRECTION.NONE) !== value.length; +} +IMask.MaskedPattern = MaskedPattern; + +// node_modules/imask/esm/masked/range.js +var MaskedRange = /* @__PURE__ */ function(_MaskedPattern) { + _inherits(MaskedRange2, _MaskedPattern); + var _super = _createSuper(MaskedRange2); + function MaskedRange2() { + _classCallCheck(this, MaskedRange2); + return _super.apply(this, arguments); + } + _createClass(MaskedRange2, [{ + key: "_matchFrom", + get: function get() { + return this.maxLength - String(this.from).length; + } + }, { + key: "_update", + value: function _update(opts) { + opts = Object.assign({ + to: this.to || 0, + from: this.from || 0 + }, opts); + var maxLength = String(opts.to).length; + if (opts.maxLength != null) + maxLength = Math.max(maxLength, opts.maxLength); + opts.maxLength = maxLength; + var fromStr = String(opts.from).padStart(maxLength, "0"); + var toStr = String(opts.to).padStart(maxLength, "0"); + var sameCharsCount = 0; + while (sameCharsCount < toStr.length && toStr[sameCharsCount] === fromStr[sameCharsCount]) { + ++sameCharsCount; + } + opts.mask = toStr.slice(0, sameCharsCount).replace(/0/g, "\\0") + "0".repeat(maxLength - sameCharsCount); + _get(_getPrototypeOf(MaskedRange2.prototype), "_update", this).call(this, opts); + } + }, { + key: "isComplete", + get: function get() { + return _get(_getPrototypeOf(MaskedRange2.prototype), "isComplete", this) && Boolean(this.value); + } + }, { + key: "boundaries", + value: function boundaries(str) { + var minstr = ""; + var maxstr = ""; + var _ref = str.match(/^(\D*)(\d*)(\D*)/) || [], _ref2 = _slicedToArray(_ref, 3), placeholder = _ref2[1], num = _ref2[2]; + if (num) { + minstr = "0".repeat(placeholder.length) + num; + maxstr = "9".repeat(placeholder.length) + num; + } + minstr = minstr.padEnd(this.maxLength, "0"); + maxstr = maxstr.padEnd(this.maxLength, "9"); + return [minstr, maxstr]; + } + }, { + key: "doPrepare", + value: function doPrepare(str) { + var flags = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}; + str = _get(_getPrototypeOf(MaskedRange2.prototype), "doPrepare", this).call(this, str, flags).replace(/\D/g, ""); + if (!this.autofix) + return str; + var fromStr = String(this.from).padStart(this.maxLength, "0"); + var toStr = String(this.to).padStart(this.maxLength, "0"); + var val = this.value; + var prepStr = ""; + for (var ci = 0; ci < str.length; ++ci) { + var nextVal = val + prepStr + str[ci]; + var _this$boundaries = this.boundaries(nextVal), _this$boundaries2 = _slicedToArray(_this$boundaries, 2), minstr = _this$boundaries2[0], maxstr = _this$boundaries2[1]; + if (Number(maxstr) < this.from) + prepStr += fromStr[nextVal.length - 1]; + else if (Number(minstr) > this.to) + prepStr += toStr[nextVal.length - 1]; + else + prepStr += str[ci]; + } + return prepStr; + } + }, { + key: "doValidate", + value: function doValidate() { + var _get2; + var str = this.value; + var firstNonZero = str.search(/[^0]/); + if (firstNonZero === -1 && str.length <= this._matchFrom) + return true; + var _this$boundaries3 = this.boundaries(str), _this$boundaries4 = _slicedToArray(_this$boundaries3, 2), minstr = _this$boundaries4[0], maxstr = _this$boundaries4[1]; + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + return this.from <= Number(maxstr) && Number(minstr) <= this.to && (_get2 = _get(_getPrototypeOf(MaskedRange2.prototype), "doValidate", this)).call.apply(_get2, [this].concat(args)); + } + }]); + return MaskedRange2; +}(MaskedPattern); +IMask.MaskedRange = MaskedRange; + +// node_modules/imask/esm/masked/date.js +var MaskedDate = /* @__PURE__ */ function(_MaskedPattern) { + _inherits(MaskedDate2, _MaskedPattern); + var _super = _createSuper(MaskedDate2); + function MaskedDate2(opts) { + _classCallCheck(this, MaskedDate2); + return _super.call(this, Object.assign({}, MaskedDate2.DEFAULTS, opts)); + } + _createClass(MaskedDate2, [{ + key: "_update", + value: function _update(opts) { + if (opts.mask === Date) + delete opts.mask; + if (opts.pattern) + opts.mask = opts.pattern; + var blocks = opts.blocks; + opts.blocks = Object.assign({}, MaskedDate2.GET_DEFAULT_BLOCKS()); + if (opts.min) + opts.blocks.Y.from = opts.min.getFullYear(); + if (opts.max) + opts.blocks.Y.to = opts.max.getFullYear(); + if (opts.min && opts.max && opts.blocks.Y.from === opts.blocks.Y.to) { + opts.blocks.m.from = opts.min.getMonth() + 1; + opts.blocks.m.to = opts.max.getMonth() + 1; + if (opts.blocks.m.from === opts.blocks.m.to) { + opts.blocks.d.from = opts.min.getDate(); + opts.blocks.d.to = opts.max.getDate(); + } + } + Object.assign(opts.blocks, blocks); + Object.keys(opts.blocks).forEach(function(bk) { + var b = opts.blocks[bk]; + if (!("autofix" in b)) + b.autofix = opts.autofix; + }); + _get(_getPrototypeOf(MaskedDate2.prototype), "_update", this).call(this, opts); + } + }, { + key: "doValidate", + value: function doValidate() { + var _get2; + var date = this.date; + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + return (_get2 = _get(_getPrototypeOf(MaskedDate2.prototype), "doValidate", this)).call.apply(_get2, [this].concat(args)) && (!this.isComplete || this.isDateExist(this.value) && date != null && (this.min == null || this.min <= date) && (this.max == null || date <= this.max)); + } + }, { + key: "isDateExist", + value: function isDateExist(str) { + return this.format(this.parse(str, this), this).indexOf(str) >= 0; + } + }, { + key: "date", + get: function get() { + return this.typedValue; + }, + set: function set2(date) { + this.typedValue = date; + } + }, { + key: "typedValue", + get: function get() { + return this.isComplete ? _get(_getPrototypeOf(MaskedDate2.prototype), "typedValue", this) : null; + }, + set: function set2(value) { + _set(_getPrototypeOf(MaskedDate2.prototype), "typedValue", value, this, true); + } + }]); + return MaskedDate2; +}(MaskedPattern); +MaskedDate.DEFAULTS = { + pattern: "d{.}`m{.}`Y", + format: function format2(date) { + var day = String(date.getDate()).padStart(2, "0"); + var month = String(date.getMonth() + 1).padStart(2, "0"); + var year = date.getFullYear(); + return [day, month, year].join("."); + }, + parse: function parse4(str) { + var _str$split = str.split("."), _str$split2 = _slicedToArray(_str$split, 3), day = _str$split2[0], month = _str$split2[1], year = _str$split2[2]; + return new Date(year, month - 1, day); + } +}; +MaskedDate.GET_DEFAULT_BLOCKS = function() { + return { + d: { + mask: MaskedRange, + from: 1, + to: 31, + maxLength: 2 + }, + m: { + mask: MaskedRange, + from: 1, + to: 12, + maxLength: 2 + }, + Y: { + mask: MaskedRange, + from: 1900, + to: 9999 + } + }; +}; +IMask.MaskedDate = MaskedDate; + +// node_modules/imask/esm/controls/mask-element.js +var MaskElement = /* @__PURE__ */ function() { + function MaskElement2() { + _classCallCheck(this, MaskElement2); + } + _createClass(MaskElement2, [{ + key: "selectionStart", + get: function get() { + var start; + try { + start = this._unsafeSelectionStart; + } catch (e2) { + } + return start != null ? start : this.value.length; + } + }, { + key: "selectionEnd", + get: function get() { + var end; + try { + end = this._unsafeSelectionEnd; + } catch (e2) { + } + return end != null ? end : this.value.length; + } + }, { + key: "select", + value: function select(start, end) { + if (start == null || end == null || start === this.selectionStart && end === this.selectionEnd) + return; + try { + this._unsafeSelect(start, end); + } catch (e2) { + } + } + }, { + key: "_unsafeSelect", + value: function _unsafeSelect(start, end) { + } + }, { + key: "isActive", + get: function get() { + return false; + } + }, { + key: "bindEvents", + value: function bindEvents(handlers) { + } + }, { + key: "unbindEvents", + value: function unbindEvents() { + } + }]); + return MaskElement2; +}(); +IMask.MaskElement = MaskElement; + +// node_modules/imask/esm/controls/html-mask-element.js +var HTMLMaskElement = /* @__PURE__ */ function(_MaskElement) { + _inherits(HTMLMaskElement2, _MaskElement); + var _super = _createSuper(HTMLMaskElement2); + function HTMLMaskElement2(input) { + var _this; + _classCallCheck(this, HTMLMaskElement2); + _this = _super.call(this); + _this.input = input; + _this._handlers = {}; + return _this; + } + _createClass(HTMLMaskElement2, [{ + key: "rootElement", + get: function get() { + return this.input.getRootNode ? this.input.getRootNode() : document; + } + }, { + key: "isActive", + get: function get() { + return this.input === this.rootElement.activeElement; + } + }, { + key: "_unsafeSelectionStart", + get: function get() { + return this.input.selectionStart; + } + }, { + key: "_unsafeSelectionEnd", + get: function get() { + return this.input.selectionEnd; + } + }, { + key: "_unsafeSelect", + value: function _unsafeSelect(start, end) { + this.input.setSelectionRange(start, end); + } + }, { + key: "value", + get: function get() { + return this.input.value; + }, + set: function set2(value) { + this.input.value = value; + } + }, { + key: "bindEvents", + value: function bindEvents(handlers) { + var _this2 = this; + Object.keys(handlers).forEach(function(event) { + return _this2._toggleEventHandler(HTMLMaskElement2.EVENTS_MAP[event], handlers[event]); + }); + } + }, { + key: "unbindEvents", + value: function unbindEvents() { + var _this3 = this; + Object.keys(this._handlers).forEach(function(event) { + return _this3._toggleEventHandler(event); + }); + } + }, { + key: "_toggleEventHandler", + value: function _toggleEventHandler(event, handler) { + if (this._handlers[event]) { + this.input.removeEventListener(event, this._handlers[event]); + delete this._handlers[event]; + } + if (handler) { + this.input.addEventListener(event, handler); + this._handlers[event] = handler; + } + } + }]); + return HTMLMaskElement2; +}(MaskElement); +HTMLMaskElement.EVENTS_MAP = { + selectionChange: "keydown", + input: "input", + drop: "drop", + click: "click", + focus: "focus", + commit: "blur" +}; +IMask.HTMLMaskElement = HTMLMaskElement; + +// node_modules/imask/esm/controls/html-contenteditable-mask-element.js +var HTMLContenteditableMaskElement = /* @__PURE__ */ function(_HTMLMaskElement) { + _inherits(HTMLContenteditableMaskElement2, _HTMLMaskElement); + var _super = _createSuper(HTMLContenteditableMaskElement2); + function HTMLContenteditableMaskElement2() { + _classCallCheck(this, HTMLContenteditableMaskElement2); + return _super.apply(this, arguments); + } + _createClass(HTMLContenteditableMaskElement2, [{ + key: "_unsafeSelectionStart", + get: function get() { + var root2 = this.rootElement; + var selection = root2.getSelection && root2.getSelection(); + return selection && selection.anchorOffset; + } + }, { + key: "_unsafeSelectionEnd", + get: function get() { + var root2 = this.rootElement; + var selection = root2.getSelection && root2.getSelection(); + return selection && this._unsafeSelectionStart + String(selection).length; + } + }, { + key: "_unsafeSelect", + value: function _unsafeSelect(start, end) { + if (!this.rootElement.createRange) + return; + var range = this.rootElement.createRange(); + range.setStart(this.input.firstChild || this.input, start); + range.setEnd(this.input.lastChild || this.input, end); + var root2 = this.rootElement; + var selection = root2.getSelection && root2.getSelection(); + if (selection) { + selection.removeAllRanges(); + selection.addRange(range); + } + } + }, { + key: "value", + get: function get() { + return this.input.textContent; + }, + set: function set2(value) { + this.input.textContent = value; + } + }]); + return HTMLContenteditableMaskElement2; +}(HTMLMaskElement); +IMask.HTMLContenteditableMaskElement = HTMLContenteditableMaskElement; + +// node_modules/imask/esm/controls/input.js +var _excluded5 = ["mask"]; +var InputMask = /* @__PURE__ */ function() { + function InputMask2(el, opts) { + _classCallCheck(this, InputMask2); + this.el = el instanceof MaskElement ? el : el.isContentEditable && el.tagName !== "INPUT" && el.tagName !== "TEXTAREA" ? new HTMLContenteditableMaskElement(el) : new HTMLMaskElement(el); + this.masked = createMask(opts); + this._listeners = {}; + this._value = ""; + this._unmaskedValue = ""; + this._saveSelection = this._saveSelection.bind(this); + this._onInput = this._onInput.bind(this); + this._onChange = this._onChange.bind(this); + this._onDrop = this._onDrop.bind(this); + this._onFocus = this._onFocus.bind(this); + this._onClick = this._onClick.bind(this); + this.alignCursor = this.alignCursor.bind(this); + this.alignCursorFriendly = this.alignCursorFriendly.bind(this); + this._bindEvents(); + this.updateValue(); + this._onChange(); + } + _createClass(InputMask2, [{ + key: "mask", + get: function get() { + return this.masked.mask; + }, + set: function set2(mask) { + if (this.maskEquals(mask)) + return; + if (!(mask instanceof IMask.Masked) && this.masked.constructor === maskedClass(mask)) { + this.masked.updateOptions({ + mask + }); + return; + } + var masked = createMask({ + mask + }); + masked.unmaskedValue = this.masked.unmaskedValue; + this.masked = masked; + } + }, { + key: "maskEquals", + value: function maskEquals(mask) { + return mask == null || mask === this.masked.mask || mask === Date && this.masked instanceof MaskedDate; + } + }, { + key: "value", + get: function get() { + return this._value; + }, + set: function set2(str) { + this.masked.value = str; + this.updateControl(); + this.alignCursor(); + } + }, { + key: "unmaskedValue", + get: function get() { + return this._unmaskedValue; + }, + set: function set2(str) { + this.masked.unmaskedValue = str; + this.updateControl(); + this.alignCursor(); + } + }, { + key: "typedValue", + get: function get() { + return this.masked.typedValue; + }, + set: function set2(val) { + this.masked.typedValue = val; + this.updateControl(); + this.alignCursor(); + } + }, { + key: "_bindEvents", + value: function _bindEvents() { + this.el.bindEvents({ + selectionChange: this._saveSelection, + input: this._onInput, + drop: this._onDrop, + click: this._onClick, + focus: this._onFocus, + commit: this._onChange + }); + } + }, { + key: "_unbindEvents", + value: function _unbindEvents() { + if (this.el) + this.el.unbindEvents(); + } + }, { + key: "_fireEvent", + value: function _fireEvent(ev) { + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + var listeners2 = this._listeners[ev]; + if (!listeners2) + return; + listeners2.forEach(function(l) { + return l.apply(void 0, args); + }); + } + }, { + key: "selectionStart", + get: function get() { + return this._cursorChanging ? this._changingCursorPos : this.el.selectionStart; + } + }, { + key: "cursorPos", + get: function get() { + return this._cursorChanging ? this._changingCursorPos : this.el.selectionEnd; + }, + set: function set2(pos) { + if (!this.el || !this.el.isActive) + return; + this.el.select(pos, pos); + this._saveSelection(); + } + }, { + key: "_saveSelection", + value: function _saveSelection() { + if (this.value !== this.el.value) { + console.warn("Element value was changed outside of mask. Syncronize mask using `mask.updateValue()` to work properly."); + } + this._selection = { + start: this.selectionStart, + end: this.cursorPos + }; + } + }, { + key: "updateValue", + value: function updateValue() { + this.masked.value = this.el.value; + this._value = this.masked.value; + } + }, { + key: "updateControl", + value: function updateControl() { + var newUnmaskedValue = this.masked.unmaskedValue; + var newValue = this.masked.value; + var isChanged = this.unmaskedValue !== newUnmaskedValue || this.value !== newValue; + this._unmaskedValue = newUnmaskedValue; + this._value = newValue; + if (this.el.value !== newValue) + this.el.value = newValue; + if (isChanged) + this._fireChangeEvents(); + } + }, { + key: "updateOptions", + value: function updateOptions(opts) { + var mask = opts.mask, restOpts = _objectWithoutProperties2(opts, _excluded5); + var updateMask = !this.maskEquals(mask); + var updateOpts = !objectIncludes(this.masked, restOpts); + if (updateMask) + this.mask = mask; + if (updateOpts) + this.masked.updateOptions(restOpts); + if (updateMask || updateOpts) + this.updateControl(); + } + }, { + key: "updateCursor", + value: function updateCursor(cursorPos) { + if (cursorPos == null) + return; + this.cursorPos = cursorPos; + this._delayUpdateCursor(cursorPos); + } + }, { + key: "_delayUpdateCursor", + value: function _delayUpdateCursor(cursorPos) { + var _this = this; + this._abortUpdateCursor(); + this._changingCursorPos = cursorPos; + this._cursorChanging = setTimeout(function() { + if (!_this.el) + return; + _this.cursorPos = _this._changingCursorPos; + _this._abortUpdateCursor(); + }, 10); + } + }, { + key: "_fireChangeEvents", + value: function _fireChangeEvents() { + this._fireEvent("accept", this._inputEvent); + if (this.masked.isComplete) + this._fireEvent("complete", this._inputEvent); + } + }, { + key: "_abortUpdateCursor", + value: function _abortUpdateCursor() { + if (this._cursorChanging) { + clearTimeout(this._cursorChanging); + delete this._cursorChanging; + } + } + }, { + key: "alignCursor", + value: function alignCursor() { + this.cursorPos = this.masked.nearestInputPos(this.cursorPos, DIRECTION.LEFT); + } + }, { + key: "alignCursorFriendly", + value: function alignCursorFriendly() { + if (this.selectionStart !== this.cursorPos) + return; + this.alignCursor(); + } + }, { + key: "on", + value: function on3(ev, handler) { + if (!this._listeners[ev]) + this._listeners[ev] = []; + this._listeners[ev].push(handler); + return this; + } + }, { + key: "off", + value: function off2(ev, handler) { + if (!this._listeners[ev]) + return this; + if (!handler) { + delete this._listeners[ev]; + return this; + } + var hIndex = this._listeners[ev].indexOf(handler); + if (hIndex >= 0) + this._listeners[ev].splice(hIndex, 1); + return this; + } + }, { + key: "_onInput", + value: function _onInput(e2) { + this._inputEvent = e2; + this._abortUpdateCursor(); + if (!this._selection) + return this.updateValue(); + var details = new ActionDetails(this.el.value, this.cursorPos, this.value, this._selection); + var oldRawValue = this.masked.rawInputValue; + var offset = this.masked.splice(details.startChangePos, details.removed.length, details.inserted, details.removeDirection).offset; + var removeDirection = oldRawValue === this.masked.rawInputValue ? details.removeDirection : DIRECTION.NONE; + var cursorPos = this.masked.nearestInputPos(details.startChangePos + offset, removeDirection); + this.updateControl(); + this.updateCursor(cursorPos); + delete this._inputEvent; + } + }, { + key: "_onChange", + value: function _onChange() { + if (this.value !== this.el.value) { + this.updateValue(); + } + this.masked.doCommit(); + this.updateControl(); + this._saveSelection(); + } + }, { + key: "_onDrop", + value: function _onDrop2(ev) { + ev.preventDefault(); + ev.stopPropagation(); + } + }, { + key: "_onFocus", + value: function _onFocus(ev) { + this.alignCursorFriendly(); + } + }, { + key: "_onClick", + value: function _onClick(ev) { + this.alignCursorFriendly(); + } + }, { + key: "destroy", + value: function destroy3() { + this._unbindEvents(); + this._listeners.length = 0; + delete this.el; + } + }]); + return InputMask2; +}(); +IMask.InputMask = InputMask; + +// node_modules/imask/esm/masked/enum.js +var MaskedEnum = /* @__PURE__ */ function(_MaskedPattern) { + _inherits(MaskedEnum2, _MaskedPattern); + var _super = _createSuper(MaskedEnum2); + function MaskedEnum2() { + _classCallCheck(this, MaskedEnum2); + return _super.apply(this, arguments); + } + _createClass(MaskedEnum2, [{ + key: "_update", + value: function _update(opts) { + if (opts.enum) + opts.mask = "*".repeat(opts.enum[0].length); + _get(_getPrototypeOf(MaskedEnum2.prototype), "_update", this).call(this, opts); + } + }, { + key: "doValidate", + value: function doValidate() { + var _this = this, _get2; + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + return this.enum.some(function(e2) { + return e2.indexOf(_this.unmaskedValue) >= 0; + }) && (_get2 = _get(_getPrototypeOf(MaskedEnum2.prototype), "doValidate", this)).call.apply(_get2, [this].concat(args)); + } + }]); + return MaskedEnum2; +}(MaskedPattern); +IMask.MaskedEnum = MaskedEnum; + +// node_modules/imask/esm/masked/number.js +var MaskedNumber = /* @__PURE__ */ function(_Masked) { + _inherits(MaskedNumber2, _Masked); + var _super = _createSuper(MaskedNumber2); + function MaskedNumber2(opts) { + _classCallCheck(this, MaskedNumber2); + return _super.call(this, Object.assign({}, MaskedNumber2.DEFAULTS, opts)); + } + _createClass(MaskedNumber2, [{ + key: "_update", + value: function _update(opts) { + _get(_getPrototypeOf(MaskedNumber2.prototype), "_update", this).call(this, opts); + this._updateRegExps(); + } + }, { + key: "_updateRegExps", + value: function _updateRegExps() { + var start = "^" + (this.allowNegative ? "[+|\\-]?" : ""); + var midInput = "(0|([1-9]+\\d*))?"; + var mid = "\\d*"; + var end = (this.scale ? "(" + escapeRegExp(this.radix) + "\\d{0," + this.scale + "})?" : "") + "$"; + this._numberRegExpInput = new RegExp(start + midInput + end); + this._numberRegExp = new RegExp(start + mid + end); + this._mapToRadixRegExp = new RegExp("[" + this.mapToRadix.map(escapeRegExp).join("") + "]", "g"); + this._thousandsSeparatorRegExp = new RegExp(escapeRegExp(this.thousandsSeparator), "g"); + } + }, { + key: "_removeThousandsSeparators", + value: function _removeThousandsSeparators(value) { + return value.replace(this._thousandsSeparatorRegExp, ""); + } + }, { + key: "_insertThousandsSeparators", + value: function _insertThousandsSeparators(value) { + var parts = value.split(this.radix); + parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, this.thousandsSeparator); + return parts.join(this.radix); + } + }, { + key: "doPrepare", + value: function doPrepare(str) { + var _get2; + for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + args[_key - 1] = arguments[_key]; + } + return (_get2 = _get(_getPrototypeOf(MaskedNumber2.prototype), "doPrepare", this)).call.apply(_get2, [this, this._removeThousandsSeparators(str.replace(this._mapToRadixRegExp, this.radix))].concat(args)); + } + }, { + key: "_separatorsCount", + value: function _separatorsCount(to) { + var extendOnSeparators = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : false; + var count = 0; + for (var pos = 0; pos < to; ++pos) { + if (this._value.indexOf(this.thousandsSeparator, pos) === pos) { + ++count; + if (extendOnSeparators) + to += this.thousandsSeparator.length; + } + } + return count; + } + }, { + key: "_separatorsCountFromSlice", + value: function _separatorsCountFromSlice() { + var slice = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : this._value; + return this._separatorsCount(this._removeThousandsSeparators(slice).length, true); + } + }, { + key: "extractInput", + value: function extractInput() { + var fromPos = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 0; + var toPos = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : this.value.length; + var flags = arguments.length > 2 ? arguments[2] : void 0; + var _this$_adjustRangeWit = this._adjustRangeWithSeparators(fromPos, toPos); + var _this$_adjustRangeWit2 = _slicedToArray(_this$_adjustRangeWit, 2); + fromPos = _this$_adjustRangeWit2[0]; + toPos = _this$_adjustRangeWit2[1]; + return this._removeThousandsSeparators(_get(_getPrototypeOf(MaskedNumber2.prototype), "extractInput", this).call(this, fromPos, toPos, flags)); + } + }, { + key: "_appendCharRaw", + value: function _appendCharRaw(ch) { + var flags = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}; + if (!this.thousandsSeparator) + return _get(_getPrototypeOf(MaskedNumber2.prototype), "_appendCharRaw", this).call(this, ch, flags); + var prevBeforeTailValue = flags.tail && flags._beforeTailState ? flags._beforeTailState._value : this._value; + var prevBeforeTailSeparatorsCount = this._separatorsCountFromSlice(prevBeforeTailValue); + this._value = this._removeThousandsSeparators(this.value); + var appendDetails = _get(_getPrototypeOf(MaskedNumber2.prototype), "_appendCharRaw", this).call(this, ch, flags); + this._value = this._insertThousandsSeparators(this._value); + var beforeTailValue = flags.tail && flags._beforeTailState ? flags._beforeTailState._value : this._value; + var beforeTailSeparatorsCount = this._separatorsCountFromSlice(beforeTailValue); + appendDetails.tailShift += (beforeTailSeparatorsCount - prevBeforeTailSeparatorsCount) * this.thousandsSeparator.length; + appendDetails.skip = !appendDetails.rawInserted && ch === this.thousandsSeparator; + return appendDetails; + } + }, { + key: "_findSeparatorAround", + value: function _findSeparatorAround(pos) { + if (this.thousandsSeparator) { + var searchFrom = pos - this.thousandsSeparator.length + 1; + var separatorPos = this.value.indexOf(this.thousandsSeparator, searchFrom); + if (separatorPos <= pos) + return separatorPos; + } + return -1; + } + }, { + key: "_adjustRangeWithSeparators", + value: function _adjustRangeWithSeparators(from, to) { + var separatorAroundFromPos = this._findSeparatorAround(from); + if (separatorAroundFromPos >= 0) + from = separatorAroundFromPos; + var separatorAroundToPos = this._findSeparatorAround(to); + if (separatorAroundToPos >= 0) + to = separatorAroundToPos + this.thousandsSeparator.length; + return [from, to]; + } + }, { + key: "remove", + value: function remove() { + var fromPos = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 0; + var toPos = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : this.value.length; + var _this$_adjustRangeWit3 = this._adjustRangeWithSeparators(fromPos, toPos); + var _this$_adjustRangeWit4 = _slicedToArray(_this$_adjustRangeWit3, 2); + fromPos = _this$_adjustRangeWit4[0]; + toPos = _this$_adjustRangeWit4[1]; + var valueBeforePos = this.value.slice(0, fromPos); + var valueAfterPos = this.value.slice(toPos); + var prevBeforeTailSeparatorsCount = this._separatorsCount(valueBeforePos.length); + this._value = this._insertThousandsSeparators(this._removeThousandsSeparators(valueBeforePos + valueAfterPos)); + var beforeTailSeparatorsCount = this._separatorsCountFromSlice(valueBeforePos); + return new ChangeDetails({ + tailShift: (beforeTailSeparatorsCount - prevBeforeTailSeparatorsCount) * this.thousandsSeparator.length + }); + } + }, { + key: "nearestInputPos", + value: function nearestInputPos(cursorPos, direction) { + if (!this.thousandsSeparator) + return cursorPos; + switch (direction) { + case DIRECTION.NONE: + case DIRECTION.LEFT: + case DIRECTION.FORCE_LEFT: { + var separatorAtLeftPos = this._findSeparatorAround(cursorPos - 1); + if (separatorAtLeftPos >= 0) { + var separatorAtLeftEndPos = separatorAtLeftPos + this.thousandsSeparator.length; + if (cursorPos < separatorAtLeftEndPos || this.value.length <= separatorAtLeftEndPos || direction === DIRECTION.FORCE_LEFT) { + return separatorAtLeftPos; + } + } + break; + } + case DIRECTION.RIGHT: + case DIRECTION.FORCE_RIGHT: { + var separatorAtRightPos = this._findSeparatorAround(cursorPos); + if (separatorAtRightPos >= 0) { + return separatorAtRightPos + this.thousandsSeparator.length; + } + } + } + return cursorPos; + } + }, { + key: "doValidate", + value: function doValidate(flags) { + var regexp = flags.input ? this._numberRegExpInput : this._numberRegExp; + var valid = regexp.test(this._removeThousandsSeparators(this.value)); + if (valid) { + var number = this.number; + valid = valid && !isNaN(number) && (this.min == null || this.min >= 0 || this.min <= this.number) && (this.max == null || this.max <= 0 || this.number <= this.max); + } + return valid && _get(_getPrototypeOf(MaskedNumber2.prototype), "doValidate", this).call(this, flags); + } + }, { + key: "doCommit", + value: function doCommit() { + if (this.value) { + var number = this.number; + var validnum = number; + if (this.min != null) + validnum = Math.max(validnum, this.min); + if (this.max != null) + validnum = Math.min(validnum, this.max); + if (validnum !== number) + this.unmaskedValue = String(validnum); + var formatted = this.value; + if (this.normalizeZeros) + formatted = this._normalizeZeros(formatted); + if (this.padFractionalZeros) + formatted = this._padFractionalZeros(formatted); + this._value = formatted; + } + _get(_getPrototypeOf(MaskedNumber2.prototype), "doCommit", this).call(this); + } + }, { + key: "_normalizeZeros", + value: function _normalizeZeros(value) { + var parts = this._removeThousandsSeparators(value).split(this.radix); + parts[0] = parts[0].replace(/^(\D*)(0*)(\d*)/, function(match, sign, zeros, num) { + return sign + num; + }); + if (value.length && !/\d$/.test(parts[0])) + parts[0] = parts[0] + "0"; + if (parts.length > 1) { + parts[1] = parts[1].replace(/0*$/, ""); + if (!parts[1].length) + parts.length = 1; + } + return this._insertThousandsSeparators(parts.join(this.radix)); + } + }, { + key: "_padFractionalZeros", + value: function _padFractionalZeros(value) { + if (!value) + return value; + var parts = value.split(this.radix); + if (parts.length < 2) + parts.push(""); + parts[1] = parts[1].padEnd(this.scale, "0"); + return parts.join(this.radix); + } + }, { + key: "unmaskedValue", + get: function get() { + return this._removeThousandsSeparators(this._normalizeZeros(this.value)).replace(this.radix, "."); + }, + set: function set2(unmaskedValue) { + _set(_getPrototypeOf(MaskedNumber2.prototype), "unmaskedValue", unmaskedValue.replace(".", this.radix), this, true); + } + }, { + key: "typedValue", + get: function get() { + return Number(this.unmaskedValue); + }, + set: function set2(n2) { + _set(_getPrototypeOf(MaskedNumber2.prototype), "unmaskedValue", String(n2), this, true); + } + }, { + key: "number", + get: function get() { + return this.typedValue; + }, + set: function set2(number) { + this.typedValue = number; + } + }, { + key: "allowNegative", + get: function get() { + return this.signed || this.min != null && this.min < 0 || this.max != null && this.max < 0; + } + }]); + return MaskedNumber2; +}(Masked); +MaskedNumber.DEFAULTS = { + radix: ",", + thousandsSeparator: "", + mapToRadix: ["."], + scale: 2, + signed: false, + normalizeZeros: true, + padFractionalZeros: false +}; +IMask.MaskedNumber = MaskedNumber; + +// node_modules/imask/esm/masked/function.js +var MaskedFunction = /* @__PURE__ */ function(_Masked) { + _inherits(MaskedFunction2, _Masked); + var _super = _createSuper(MaskedFunction2); + function MaskedFunction2() { + _classCallCheck(this, MaskedFunction2); + return _super.apply(this, arguments); + } + _createClass(MaskedFunction2, [{ + key: "_update", + value: function _update(opts) { + if (opts.mask) + opts.validate = opts.mask; + _get(_getPrototypeOf(MaskedFunction2.prototype), "_update", this).call(this, opts); + } + }]); + return MaskedFunction2; +}(Masked); +IMask.MaskedFunction = MaskedFunction; + +// node_modules/imask/esm/masked/dynamic.js +var _excluded6 = ["compiledMasks", "currentMaskRef", "currentMask"]; +var MaskedDynamic = /* @__PURE__ */ function(_Masked) { + _inherits(MaskedDynamic2, _Masked); + var _super = _createSuper(MaskedDynamic2); + function MaskedDynamic2(opts) { + var _this; + _classCallCheck(this, MaskedDynamic2); + _this = _super.call(this, Object.assign({}, MaskedDynamic2.DEFAULTS, opts)); + _this.currentMask = null; + return _this; + } + _createClass(MaskedDynamic2, [{ + key: "_update", + value: function _update(opts) { + _get(_getPrototypeOf(MaskedDynamic2.prototype), "_update", this).call(this, opts); + if ("mask" in opts) { + this.compiledMasks = Array.isArray(opts.mask) ? opts.mask.map(function(m) { + return createMask(m); + }) : []; + } + } + }, { + key: "_appendCharRaw", + value: function _appendCharRaw(ch) { + var flags = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}; + var details = this._applyDispatch(ch, flags); + if (this.currentMask) { + details.aggregate(this.currentMask._appendChar(ch, flags)); + } + return details; + } + }, { + key: "_applyDispatch", + value: function _applyDispatch() { + var appended = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : ""; + var flags = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}; + var prevValueBeforeTail = flags.tail && flags._beforeTailState != null ? flags._beforeTailState._value : this.value; + var inputValue = this.rawInputValue; + var insertValue = flags.tail && flags._beforeTailState != null ? flags._beforeTailState._rawInputValue : inputValue; + var tailValue = inputValue.slice(insertValue.length); + var prevMask = this.currentMask; + var details = new ChangeDetails(); + var prevMaskState = prevMask && prevMask.state; + this.currentMask = this.doDispatch(appended, Object.assign({}, flags)); + if (this.currentMask) { + if (this.currentMask !== prevMask) { + this.currentMask.reset(); + if (insertValue) { + var d = this.currentMask.append(insertValue, { + raw: true + }); + details.tailShift = d.inserted.length - prevValueBeforeTail.length; + } + if (tailValue) { + details.tailShift += this.currentMask.append(tailValue, { + raw: true, + tail: true + }).tailShift; + } + } else { + this.currentMask.state = prevMaskState; + } + } + return details; + } + }, { + key: "_appendPlaceholder", + value: function _appendPlaceholder() { + var details = this._applyDispatch.apply(this, arguments); + if (this.currentMask) { + details.aggregate(this.currentMask._appendPlaceholder()); + } + return details; + } + }, { + key: "doDispatch", + value: function doDispatch(appended) { + var flags = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}; + return this.dispatch(appended, this, flags); + } + }, { + key: "doValidate", + value: function doValidate() { + var _get2, _this$currentMask; + for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { + args[_key] = arguments[_key]; + } + return (_get2 = _get(_getPrototypeOf(MaskedDynamic2.prototype), "doValidate", this)).call.apply(_get2, [this].concat(args)) && (!this.currentMask || (_this$currentMask = this.currentMask).doValidate.apply(_this$currentMask, args)); + } + }, { + key: "reset", + value: function reset() { + if (this.currentMask) + this.currentMask.reset(); + this.compiledMasks.forEach(function(m) { + return m.reset(); + }); + } + }, { + key: "value", + get: function get() { + return this.currentMask ? this.currentMask.value : ""; + }, + set: function set2(value) { + _set(_getPrototypeOf(MaskedDynamic2.prototype), "value", value, this, true); + } + }, { + key: "unmaskedValue", + get: function get() { + return this.currentMask ? this.currentMask.unmaskedValue : ""; + }, + set: function set2(unmaskedValue) { + _set(_getPrototypeOf(MaskedDynamic2.prototype), "unmaskedValue", unmaskedValue, this, true); + } + }, { + key: "typedValue", + get: function get() { + return this.currentMask ? this.currentMask.typedValue : ""; + }, + set: function set2(value) { + var unmaskedValue = String(value); + if (this.currentMask) { + this.currentMask.typedValue = value; + unmaskedValue = this.currentMask.unmaskedValue; + } + this.unmaskedValue = unmaskedValue; + } + }, { + key: "isComplete", + get: function get() { + return !!this.currentMask && this.currentMask.isComplete; + } + }, { + key: "remove", + value: function remove() { + var details = new ChangeDetails(); + if (this.currentMask) { + var _this$currentMask2; + details.aggregate((_this$currentMask2 = this.currentMask).remove.apply(_this$currentMask2, arguments)).aggregate(this._applyDispatch()); + } + return details; + } + }, { + key: "state", + get: function get() { + return Object.assign({}, _get(_getPrototypeOf(MaskedDynamic2.prototype), "state", this), { + _rawInputValue: this.rawInputValue, + compiledMasks: this.compiledMasks.map(function(m) { + return m.state; + }), + currentMaskRef: this.currentMask, + currentMask: this.currentMask && this.currentMask.state + }); + }, + set: function set2(state2) { + var compiledMasks = state2.compiledMasks, currentMaskRef = state2.currentMaskRef, currentMask = state2.currentMask, maskedState = _objectWithoutProperties2(state2, _excluded6); + this.compiledMasks.forEach(function(m, mi) { + return m.state = compiledMasks[mi]; + }); + if (currentMaskRef != null) { + this.currentMask = currentMaskRef; + this.currentMask.state = currentMask; + } + _set(_getPrototypeOf(MaskedDynamic2.prototype), "state", maskedState, this, true); + } + }, { + key: "extractInput", + value: function extractInput() { + var _this$currentMask3; + return this.currentMask ? (_this$currentMask3 = this.currentMask).extractInput.apply(_this$currentMask3, arguments) : ""; + } + }, { + key: "extractTail", + value: function extractTail() { + var _this$currentMask4, _get3; + for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + args[_key2] = arguments[_key2]; + } + return this.currentMask ? (_this$currentMask4 = this.currentMask).extractTail.apply(_this$currentMask4, args) : (_get3 = _get(_getPrototypeOf(MaskedDynamic2.prototype), "extractTail", this)).call.apply(_get3, [this].concat(args)); + } + }, { + key: "doCommit", + value: function doCommit() { + if (this.currentMask) + this.currentMask.doCommit(); + _get(_getPrototypeOf(MaskedDynamic2.prototype), "doCommit", this).call(this); + } + }, { + key: "nearestInputPos", + value: function nearestInputPos() { + var _this$currentMask5, _get4; + for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { + args[_key3] = arguments[_key3]; + } + return this.currentMask ? (_this$currentMask5 = this.currentMask).nearestInputPos.apply(_this$currentMask5, args) : (_get4 = _get(_getPrototypeOf(MaskedDynamic2.prototype), "nearestInputPos", this)).call.apply(_get4, [this].concat(args)); + } + }, { + key: "overwrite", + get: function get() { + return this.currentMask ? this.currentMask.overwrite : _get(_getPrototypeOf(MaskedDynamic2.prototype), "overwrite", this); + }, + set: function set2(overwrite) { + console.warn('"overwrite" option is not available in dynamic mask, use this option in siblings'); + } + }]); + return MaskedDynamic2; +}(Masked); +MaskedDynamic.DEFAULTS = { + dispatch: function dispatch(appended, masked, flags) { + if (!masked.compiledMasks.length) + return; + var inputValue = masked.rawInputValue; + var inputs = masked.compiledMasks.map(function(m, index2) { + m.reset(); + m.append(inputValue, { + raw: true + }); + m.append(appended, flags); + var weight = m.rawInputValue.length; + return { + weight, + index: index2 + }; + }); + inputs.sort(function(i1, i2) { + return i2.weight - i1.weight; + }); + return masked.compiledMasks[inputs[0].index]; + } +}; +IMask.MaskedDynamic = MaskedDynamic; + +// node_modules/imask/esm/masked/pipe.js +var PIPE_TYPE = { + MASKED: "value", + UNMASKED: "unmaskedValue", + TYPED: "typedValue" +}; +function createPipe(mask) { + var from = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : PIPE_TYPE.MASKED; + var to = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : PIPE_TYPE.MASKED; + var masked = createMask(mask); + return function(value) { + return masked.runIsolated(function(m) { + m[from] = value; + return m[to]; + }); + }; +} +function pipe(value) { + for (var _len = arguments.length, pipeArgs = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { + pipeArgs[_key - 1] = arguments[_key]; + } + return createPipe.apply(void 0, pipeArgs)(value); +} +IMask.PIPE_TYPE = PIPE_TYPE; +IMask.createPipe = createPipe; +IMask.pipe = pipe; + +// node_modules/imask/esm/index.js +try { + globalThis.IMask = IMask; +} catch (e2) { +} + +// packages/forms/resources/js/components/text-input.js +var text_input_default = (Alpine) => { + Alpine.data("textInputFormComponent", ({ + getMaskOptionsUsing, + state: state2 + }) => { + return { + mask: null, + state: state2, + init: function() { + if (!getMaskOptionsUsing) { + return; + } + if (this.state) { + this.$el.value = this.state?.valueOf(); + } + this.mask = IMask(this.$el, getMaskOptionsUsing(IMask)).on("accept", () => { + this.state = this.mask.unmaskedValue; + }); + this.$watch("state", () => { + this.mask.unmaskedValue = this.state?.valueOf(); + }); + } + }; + }); +}; + +// packages/forms/resources/js/components/textarea.js +var textarea_default = (Alpine) => { + Alpine.data("textareaFormComponent", () => ({ + init: function() { + this.render(); + }, + render: function() { + if (this.$el.scrollHeight > 0) { + this.$el.style.height = "150px"; + this.$el.style.height = this.$el.scrollHeight + "px"; + } + } + })); +}; + +// packages/forms/resources/js/index.js +var js_default = (Alpine) => { + Alpine.plugin(date_time_picker_default); + Alpine.plugin(file_upload_default); + Alpine.plugin(key_value_default); + Alpine.plugin(markdown_editor_default); + Alpine.plugin(multi_select_default); + Alpine.plugin(rich_editor_default); + Alpine.plugin(select_default); + Alpine.plugin(tags_input_default); + Alpine.plugin(text_input_default); + Alpine.plugin(textarea_default); +}; +export { + date_time_picker_default as DateTimePickerFormComponentAlpinePlugin, + file_upload_default as FileUploadFormComponentAlpinePlugin, + key_value_default as KeyValueFormComponentAlpinePlugin, + markdown_editor_default as MarkdownEditorFormComponentAlpinePlugin, + multi_select_default as MultiSelectFormComponentAlpinePlugin, + rich_editor_default as RichEditorFormComponentAlpinePlugin, + select_default as SelectFormComponentAlpinePlugin, + tags_input_default as TagsInputFormComponentAlpinePlugin, + text_input_default as TextInputFormComponentAlpinePlugin, + textarea_default as TextareaFormComponentAlpinePlugin, + js_default as default +}; diff --git a/packages/forms/docs/01-installation.md b/packages/forms/docs/01-installation.md new file mode 100644 index 0000000000..7fa5255fe8 --- /dev/null +++ b/packages/forms/docs/01-installation.md @@ -0,0 +1,173 @@ +--- +title: Installation +--- + +## Requirements + +Filament has a few requirements to run: + +- PHP 8.0+ +- Laravel v8.0+ +- Livewire v2.0+ + +The form builder comes pre-installed inside the [admin panel 2.x](/docs/admin/2.x), but you must still follow the installation instructions below if you're using it in the rest of your app. + +## New Laravel projects + + + +To get started with the form builder quickly, you can set up [Alpine.js](https://alpinejs.dev), [TailwindCSS](https://tailwindcss.com) and [Livewire](https://laravel-livewire.com) with these commands: + +```bash +composer require filament/forms +php artisan forms:install +npm install +npm run dev +``` + +> These commands will ruthlessly overwrite existing files in your application, hence why we only recommend using this method for new projects. + +You're now ready to start [building forms](getting-started)! + +## Existing Laravel projects + + + +You may download the form builder using Composer: + +```bash +composer require filament/forms +``` + +The package uses [Alpine.js](https://alpinejs.dev), [Tailwind CSS](https://tailwindcss.com), the Tailwind Forms plugin, and the Tailwind Typography plugin. You may install these through NPM: + +```bash +npm install alpinejs tailwindcss @tailwindcss/forms @tailwindcss/typography --save-dev +``` + +To finish installing Tailwind, you must create a new `tailwind.config.js` file in the root of your project. The easiest way to do this is by running `npm tailwindcss init`. + +In `tailwind.config.js`, enable JIT mode, register the plugins you installed, and add custom colors used by the form builder: + +```js +const colors = require('tailwindcss/colors') + +module.exports = { + mode: 'jit', + purge: [ + './resources/**/*.blade.php', // [tl! focus:start] + './vendor/filament/forms/resources/views/**/*.blade.php', // [tl! focus:end] + ], + theme: { + extend: { + colors: { // [tl! focus:start] + danger: colors.rose, + primary: colors.blue, + }, // [tl! focus:end] + }, + }, + plugins: [ + require('@tailwindcss/forms'), // [tl! focus:start] + require('@tailwindcss/typography'), // [tl! focus:end] + ], +} +``` + +Of course, you may specify your own custom `primary` and `danger` colors, which will be used instead. + +In your `webpack.mix.js` file, Register Tailwind CSS as a PostCSS plugin : + +```js +const mix = require('laravel-mix') + +mix.js('resources/js/app.js', 'public/js') + .postCss('resources/css/app.css', 'public/css', [ + require('tailwindcss'), // [tl! focus] + ]) +``` + +In `/resources/css/app.css`, import `filament/forms` vendor CSS and [TailwindCSS](https://tailwindcss.com): + +```css +@import '../../vendor/filament/forms/dist/module.esm.css'; + +@tailwind base; +@tailwind components; +@tailwind utilities; +``` + +In `/resources/js/app.js`, import [Alpine.js](https://alpinejs.dev), the `filament/forms` plugin, and register it: + +```js +import Alpine from 'alpinejs' +import FormsAlpinePlugin from '../../vendor/filament/forms/dist/module.esm' + +Alpine.plugin(FormsAlpinePlugin) + +window.Alpine = Alpine + +Alpine.start() +``` + +Compile your new CSS and JS assets using `npm run dev`. + +Finally, create a new `resources/views/layouts/app.blade.php` layout file for Livewire components: + +```blade + + + + + + + + + + {{ config('app.name') }} + + + + @livewireStyles + + + + @livewireScripts + + @stack('scripts') + + + + {{ $slot }} + + +``` + +You're now ready to start [building forms](getting-started)! + +## Publishing the configuration + +If you wish, you may publish the configuration of the package using: + +```bash +php artisan vendor:publish --tag=forms-config +``` + +## Upgrade Guide + +To upgrade the package to the latest version, you must run: + +```bash +composer update +php artisan config:clear +php artisan view:clear +``` + +To do this automatically, we recommend adding these commands to your `composer.json`'s `post-update-cmd`: + +```json +"post-update-cmd": [ + // ... + "@php artisan config:clear", + "@php artisan view:clear" +], +``` diff --git a/packages/forms/docs/02-getting-started.md b/packages/forms/docs/02-getting-started.md new file mode 100644 index 0000000000..9b344ba9cd --- /dev/null +++ b/packages/forms/docs/02-getting-started.md @@ -0,0 +1,731 @@ +--- +title: Getting Started +--- + + + +## Preparing your Livewire component + +Implement the `HasForms` interface and use the `InteractsWithForms` trait: + +```php + + {{ $this->form }} + +``` + +Finally, add any [fields](fields) and [layout components](layout) to the Livewire component's `getFormSchema()` method: + +```php +form->fill([ + 'title' => $this->post->title, + 'content' => $this->post->content, + ]); + } + + protected function getFormSchema(): array // [tl! focus:start] + { + return [ + Forms\Components\TextInput::make('title')->required(), + Forms\Components\MarkdownEditor::make('content'), + // ... + ]; + } // [tl! focus:end] + + public function render(): View + { + return view('edit-post'); + } +} +``` + +Visit your Livewire component in the browser, and you should see the form components from `getFormSchema()`. + +## Filling forms with data + +Often, you will need to prefill your form fields with data. In normal Livewire components, this is often done in the `mount()` method, as this is only run once, immediately after the component is instantiated. + +For your fields to hold data, they should have a corresponding property on your Livewire component, just as in Livewire normally. + +To fill a form with data, call the `fill()` method on your form, and pass an array of data to fill it with: + +```php +form->fill([ + 'title' => $this->post->title, + 'content' => $this->post->content, + ]); + } // [tl! focus:end] + + protected function getFormSchema(): array + { + return [ + Forms\Components\TextInput::make('title')->required(), + Forms\Components\MarkdownEditor::make('content'), + ]; + } + + public function render(): View + { + return view('edit-post'); + } +} +``` + +### Default data + +Fields can use a `default()` configuration method, which allows you to specify a default values to fill your form with. + +To fill a form with default values, call the `fill()` method on your form without any parameters: + +```php +form->fill(); + } // [tl! focus:end] + + protected function getFormSchema(): array + { + return [ + Forms\Components\TextInput::make('title') + ->default('Status Update') // [tl! focus] + ->required(), + Forms\Components\MarkdownEditor::make('content'), + ]; + } + + public function render(): View + { + return view('create-post'); + } +} +``` + +> You may customize what happens after fields are hydrated [using the `afterStateHydrated()` method](advanced#hydration). + +## Getting data from forms + +To get all form data in an array, call the `getState()` method on your form. + +```php +form->fill(); + } + + protected function getFormSchema(): array + { + return [ + Forms\Components\TextInput::make('title')->required(), + Forms\Components\MarkdownEditor::make('content'), + ]; + } + + public function create(): void // [tl! focus:start] + { + Post::create($this->form->getState()); + } // [tl! focus:end] + + public function render(): View + { + return view('create-post'); + } +} +``` + +When `getState()` is run: + +1) [Validation](#validation) rules are checked, and if errors are present, the form is not submitted. +2) Any pending file uploads are stored permanently in the filesystem. +3) [Field relationships](#field-relationships), if they are defined, are saved. + +> You may transform the value that is dehydrated from a field [using the `dehydrateStateUsing()` method](advanced#dehydration). + +## Validation + +You may add validation rules to any field using the `rules()` method: + +```php +TextInput::make('slug')->rules(['alpha_dash']) +``` + +A full list of validation rules may be found in the [Laravel documentation](https://laravel.com/docs/validation#available-validation-rules). + +### Dedicated methods + +There are also dedicated methods for some validation rules, some of which are able to add frontend validation as well as backend validation. + +We recommend that you use dedicated validation methods wherever possible. + +#### Different + +The field value must be different to another. [See the Laravel documentation](https://laravel.com/docs/validation#rule-different) + +```php +Field::make('backupEmail')->different('email') +``` + +#### Exists + +The field value must exist in the database. [See the Laravel documentation](https://laravel.com/docs/validation#rule-exists). + +```php +Field::make('invitation')->exists() +``` + +By default, the form's model will be searched, [if it is registered](#registering-a-model). You may specify a custom table name or model to search: + +```php +use App\Models\Invitation; + +Field::make('invitation')->exists(table: Invitation::class) +``` + +By default, the field name will be used as the column to search. You may specify a custom column to search: + +```php +Field::make('invitation')->exists(column: 'id') +``` + +#### Greater than + +The field value must be greater than another. [See the Laravel documentation](https://laravel.com/docs/validation#rule-gt) + +```php +Field::make('newNumber')->gt('oldNumber') +``` + +#### Greater than or equal to + +The field value must be greater than or equal to another. [See the Laravel documentation](https://laravel.com/docs/validation#rule-gte) + +```php +Field::make('newNumber')->gte('oldNumber') +``` + +#### Less than + +The field value must be less than another. [See the Laravel documentation](https://laravel.com/docs/validation#rule-lt) + +```php +Field::make('newNumber')->lt('oldNumber') +``` + +#### Less than or equal to + +The field value must be less than or equal to another. [See the Laravel documentation](https://laravel.com/docs/validation#rule-lte) + +```php +Field::make('newNumber')->lte('oldNumber') +``` + +#### Nullable + +The field value can be empty. This rule is applied by default if the `required` rule is not present. [See the Laravel documentation](https://laravel.com/docs/validation#rule-nullable) + +```php +Field::make('name')->nullable() +``` + +#### Required + +The field value must not be empty. [See the Laravel documentation](https://laravel.com/docs/validation#rule-required) + +```php +Field::make('name')->required() +``` + +#### Same + +The field value must be the same as another. [See the Laravel documentation](https://laravel.com/docs/validation#rule-same) + +```php +Field::make('password')->same('passwordConfirmation') +``` + +#### Unique + +The field value must not exist in the database. [See the Laravel documentation](https://laravel.com/docs/validation#rule-unique) + +```php +Field::make('email')->unique() +``` + +By default, the form's model will be searched, [if it is registered](#registering-a-model). You may specify a custom table name or model to search: + +```php +use App\Models\User; + +Field::make('email')->unique(table: User::class) +``` + +By default, the field name will be used as the column to search. You may specify a custom column to search: + +```php +Field::make('email')->unique(column: 'email_address') +``` + +Sometimes, you may wish to ignore a given model during unique validation. For example, consider an "update profile" form that includes the user's name, email address, and location. You will probably want to verify that the email address is unique. However, if the user only changes the name field and not the email field, you do not want a validation error to be thrown because the user is already the owner of the email address in question. + +```php +Field::make('email')->unique(ignorable: $ignoredUser) +``` + +## Registering a model + +You may register a model to a form. The form builder is able to use this model to unlock DX features, such as: +- Automatically retrieving the database table name when using database validation rules like `exists` and `unique`. +- Automatically attaching relationships to the model when the form is saved, when using fields such as the `BelongsToManyMultiSelect`, `SpatieMediaLibraryFileUpload`, or `SpatieTagsInput`. + +Pass a model instance to a form using the `getFormModel()` method: + +```php +form->fill([ + 'title' => $this->post->title, + 'content' => $this->post->content, + ]); + } + + protected function getFormSchema(): array + { + return [ + Forms\Components\TextInput::make('title')->required(), + Forms\Components\MarkdownEditor::make('content'), + Forms\Components\SpatieTagsInput::make('tags'), + ]; + } + + protected function getFormModel(): Post // [tl! focus:start] + { + return $this->post; + } // [tl! focus:end] + + public function render(): View + { + return view('edit-post'); + } +} +``` + +Alternatively, you may pass the model instance to the field that requires it directly, using the `model()` method: + +```php +form->fill([ + 'title' => $this->post->title, + 'content' => $this->post->content, + ]); + } + + protected function getFormSchema(): array + { + return [ + Forms\Components\TextInput::make('title')->required(), + Forms\Components\MarkdownEditor::make('content'), + Forms\Components\SpatieTagsInput::make('tags')->model($this->post), // [tl! focus] + ]; + } + + public function render(): View + { + return view('edit-post'); + } +} +``` + +You may now use [field relationships](#field-relationships); + +### Registering a model class + +In some cases, the model instance is not available until the form has been submitted. For example, in a form that creates a post, the post model instance cannot be passed to the form before it has been submitted. + +You may receive some of the same benefits of registering a model by registering its class instead: + +```php +form->fill(); + } + + protected function getFormSchema(): array + { + return [ + Forms\Components\TextInput::make('title')->required(), + Forms\Components\MarkdownEditor::make('content'), + Forms\Components\BelongsToManyMultiSelect::make('categories')->relationship('categories', 'name'), + ]; + } + + protected function getFormModel(): string // [tl! focus:start] + { + return Post::class; + } // [tl! focus:end] + + public function render(): View + { + return view('create-post'); + } +} +``` + +You may now use [field relationships](#field-relationships). + +## Field relationships + +Some fields, such as the `BelongsToSelect`, `BelongsToManyMultiSelect`, `SpatieMediaLibraryFileUpload`, or `SpatieTagsInput` are able to interact with model relationships. + +For example, `BelongsToManyMultiSelect` is a multi-select field that can be used to attach records to a `BelongstoMany` relationship. When [registering a model](#registering-a-model) to the form or component, these relationships will be automatically saved to the pivot table [when `getState()` is called](#getting-data-from-forms): + +```php +form->fill([ + 'title' => $this->post->title, + 'content' => $this->post->content, + ]); + } + + protected function getFormSchema(): array + { + return [ + Forms\Components\TextInput::make('title')->required(), + Forms\Components\MarkdownEditor::make('content'), + Forms\Components\BelongsToManyMultiSelect::make('categories')->relationship('categories', 'name'), + ]; + } + + protected function getFormModel(): Post // [tl! focus:start] + { + return $this->post; + } + + public function save(): void + { + $this->post->update( + $this->form->getState(), + ); + } // [tl! focus:end] + + public function render(): View + { + return view('edit-post'); + } +} +``` + +### Saving field relationships manually + +In some cases, the model instance is not available until the form has been submitted. For example, in a form that creates a post, the post model instance cannot be passed to the form before it has been submitted. In this case, you will [pass the model class](#registering-a-model-class) instead, but any field relationships will need to be saved manually after. + +In this situation, you may call the `model()` and `saveRelationships()` methods on the form after the instance has been created: + +```php +form->fill(); + } + + protected function getFormSchema(): array + { + return [ + Forms\Components\TextInput::make('title')->required(), + Forms\Components\MarkdownEditor::make('content'), + Forms\Components\SpatieTagsInput::make('tags'), + ]; + } + + protected function getFormModel(): string + { + return Post::class; + } + + public function create(): void + { + $post = Post::create($this->form->getState()); + + $this->form->model($post)->saveRelationships(); // [tl! focus] + } + + public function render(): View + { + return view('create-post'); + } +} +``` + +## Using multiple forms + +By default, the `InteractsWithForms` trait only handles one form per Livewire component. To change this, you can override the `getForms()` method to return more than one form, each with a unique name: + +```php +postForm->fill([ + 'title' => $this->post->title, + 'content' => $this->post->content, + ]); + + $this->authorForm->fill([ + 'name' => $this->author->name, + 'email' => $this->author->email, + ]); + } + + protected function getPostFormSchema(): array + { + return [ + Forms\Components\TextInput::make('title')->required(), + Forms\Components\MarkdownEditor::make('content'), + ]; + } + + protected function getAuthorFormSchema(): array + { + return [ + Forms\Components\TextInput::make('name')->required(), + Forms\Components\TextInput::make('email')->email()->required(), + ]; + } + + public function savePost(): void + { + $this->post->update( + $this->postForm->getState(), + ); + } + + public function saveAuthor(): void + { + $this->author->update( + $this->authorForm->getState(), + ); + } + + protected function getForms(): array // [tl! focus:start] + { + return [ + 'postForm' => $this->makeForm() + ->schema($this->getPostFormSchema()) + ->model($this->post), + 'authorForm' => $this->makeForm() + ->schema($this->getAuthorFormSchema()) + ->model($this->author), + ]; + } // [tl! focus:end] + + public function render(): View + { + return view('edit-post'); + } +} +``` diff --git a/packages/forms/docs/03-fields.md b/packages/forms/docs/03-fields.md new file mode 100644 index 0000000000..764e141bbf --- /dev/null +++ b/packages/forms/docs/03-fields.md @@ -0,0 +1,1181 @@ +--- +title: Fields +--- + +## Getting started + +Field classes can be found in the `Filament\Form\Components` namespace. + +They reside within the schema of your form, alongside any [layout components](layout): + +```php +protected function getFormSchema(): array +{ + return [ + // ... + ]; +} +``` + +Fields may be created using the static `make()` method, passing its name. The name of the field should correspond to a property on your Livewire component. You may use [Livewire's "dot syntax"](https://laravel-livewire.com/docs/properties#binding-nested-data) to bind fields to nested properties such as arrays and Eloquent models. + +```php +use Filament\Forms\Components\TextInput; + +TextInput::make('name') +``` + +### Setting a label + +By default, the label of the field will be automatically determined based on its name. To override the field's label, you may use the `label()` method. Customizing the label in this way is useful if you wish to use a [translation string for localization](https://laravel.com/docs/localization#retrieving-translation-strings): + +```php +use Filament\Forms\Components\TextInput; + +TextInput::make('name')->label(__('fields.name')) +``` + +### Setting an ID + +In the same way as labels, field IDs are also automatically determined based on their names. To override a field ID, use the `id()` method: + +```php +use Filament\Forms\Components\TextInput; + +TextInput::make('name')->id('name-field') +``` + +### Validation attributes + +When fields fail validation, their label is used in the error message. To customize the label used in field error messages, use the `validationAttribute()` method: + +```php +use Filament\Forms\Components\TextInput; + +TextInput::make('name')->validationAttribute('full name') +``` + +### Setting a default value + +Fields may have a default value. This will be filled if the [form's `fill()` method](getting-started#default-data) is called without any arguments. To define a default value, use the `default()` method: + +```php +use Filament\Forms\Components\TextInput; + +TextInput::make('name')->default('John') +``` + +### Helper messages and hints + +Sometimes, you may wish to provide extra information for the user of the form. For this purpose, you may use helper messages and hints. + +Help messages are displayed below the field. The `helperText()` method supports Markdown formatting: + +```php +use Filament\Forms\Components\TextInput; + +TextInput::make('name')->helperText('Your full name here, including any middle names.') +``` + +Hints can be used to display text adjacent to its label: + +```php +use Filament\Forms\Components\TextInput; + +TextInput::make('password')->hint('[Forgotten your password?](forgotten-password)') +``` + +### Custom attributes + +The HTML of fields can be customized even further, by passing an array of `extraAttributes()`: + +```php +use Filament\Forms\Components\TextInput; + +TextInput::make('name')->extraAttributes(['step' => 10]) +``` + +### Disabling + +You may disable a field to prevent it from being edited: + +```php +use Filament\Forms\Components\TextInput; + +TextInput::make('name')->disabled() +``` + +Optionally, you may pass a boolean value to control the disabled state: + +```php +use Filament\Forms\Components\Toggle; + +Toggle::make('is_admin')->disabled(! auth()->user()->isAdmin()) +``` + +### Autofocusing + +Most fields will be autofocusable. Typically, you should aim for the first significant field in your form to be autofocused for the best user experience. + +```php +use Filament\Forms\Components\TextInput; + +TextInput::make('name')->autofocus() +``` + +### Setting a placeholder + +Many fields will also include a placeholder value for when it has no value. You may customize this using the `placeholder()` method: + +```php +use Filament\Forms\Components\TextInput; + +TextInput::make('name')->placeholder('John Doe') +``` + +### Responsive layouts + +If your field is in a grid layout, you may specify the number of columns it spans at any breakpoint: + +```php +use Filament\Forms\Components\Grid; +use Filament\Forms\Components\TextInput; + +Grid::make([ + 'default' => 1, + 'sm' => 3, + 'xl' => 6, + '2xl' => 8, +]) + ->schema([ + TextInput::make('name') + ->columnSpan([ + 'sm' => 2, + 'xl' => 3, + '2xl' => 4, + ]), + // ... + ]) +``` + +> More information about grids is available in the [layout documentation](layout#grid). + +## Text input + +The text input allows you to interact with a string: + +```php +use Filament\Forms\Components\TextInput; + +TextInput::make('name') +``` + +You may set the type of string using a set of methods. Some, such as `email()`, also provide validation: + +```php +use Filament\Forms\Components\TextInput; + +TextInput::make('text') + ->email() + ->numeric() + ->password() + ->tel() + ->url() +``` + +You may instead use the `type()` method to pass another [HTML input type](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#input_types): + +```php +use Filament\Forms\Components\TextInput; + +TextInput::make('backgroundColor')->type('color') +``` + +You may place text before and after the input using the `prefix()` and `postfix()` methods: + +```php +use Filament\Forms\Components\TextInput; + +TextInput::make('domain') + ->url() + ->prefix('https://') + ->postfix('.com') +``` + +You may limit the length of the string by setting the `minLength()` and `maxLength()` methods. These methods add both frontend and backend validation: + +```php +use Filament\Forms\Components\TextInput; + +TextInput::make('name') + ->minLength(2) + ->maxLength(255) +``` + +In addition, you may validate the minimum and maximum value of the input by setting the `minValue()` and `maxValue()` methods: + +```php +use Filament\Forms\Components\TextInput; + +TextInput::make('number') + ->numeric() + ->minValue(1) + ->maxValue(100) +``` + +You may set the autocomplete configuration for the text field using the `autocomplete()` method: + +```php +use Filament\Forms\Components\TextInput; + +TextInput::make('password') + ->password() + ->autocomplete('new-password') +``` + +As a shortcut for `autocomplete="off"`, you may `disableAutocomplete()`: + +```php +use Filament\Forms\Components\TextInput; + +TextInput::make('password') + ->password() + ->disableAutocomplete() +``` + +For more complex autocomplete options, text inputs also support [datalists](#datalists). + +### Input masking + +Input masking is the practice of defining a format that the input value must conform to. + +In Filament, you may interact with the `Mask` object in the `mask()` method to configure your mask: + +```php +use Filament\Forms\Components\TextInput; + +TextInput::make('name') + ->mask(fn (TextInput\Mask $mask) => $mask->pattern('+{7}(000)000-00-00')) +``` + +Under the hood, masking is powered by [`imaskjs`](https://imask.js.org). The vast majority of its masking features are also available in Filament. Reading their [guide](https://imask.js.org/guide.html) first, and then approaching the same task using Filament is probably the easiest option. + +You may define and configure a [numeric mask](https://imask.js.org/guide.html#masked-number) to deal with numbers: + +```php +use Filament\Forms\Components\TextInput; + +TextInput::make('number') + ->numeric() + ->mask(fn (TextInput\Mask $mask) => $mask + ->numeric() + ->decimalPlaces(2) // Set the number of digits after the decimal point. + ->decimalSeparator(',') // Add a separator for decimal numbers. + ->integer() // Disallow decimal numbers. + ->mapToDecimalSeparator([',']) // Map additional characters to the decimal separator. + ->minValue(1) // Set a minimum and maximum value that the number can be. + ->minValue(100) // Set a minimum and maximum value that the number can be. + ->normalizeZeros() // Append or remove zeros at the end of the number. + ->padFractionalZeros() // Pad zeros at the end of the number to always maintain the maximum number of decimal places. + ->thousandsSeparator(','), // Add a separator for thousands. + ) +``` + +[Enum masks](https://imask.js.org/guide.html#enum) limit the options that the user can input: + +```php +use Filament\Forms\Components\TextInput; + +TextInput::make('code')->mask(fn (TextInput\Mask $mask) => $mask->enum(['F1', 'G2', 'H3'])) +``` + +[Range masks](https://imask.js.org/guide.html#masked-range) can be used to restrict input to a number range: + +```php +use Filament\Forms\Components\TextInput; + +TextInput::make('code')->mask(fn (TextInput\Mask $mask) => $mask + ->range() + ->from(1) // Set the lower limit. + ->to(100) // Set the upper limit. + ->maxValue(100), // Pad zeros at the start of smaller numbers. +) +``` + +In addition to simple pattens, you may also define multiple [pattern blocks](https://imask.js.org/guide.html#masked-pattern): + +```php +use Filament\Forms\Components\TextInput; + +TextInput::make('cost')->mask(fn (TextInput\Mask $mask) => $mask + ->patternBlocks([ + 'money' => fn (Mask $mask) => $mask + ->numeric() + ->thousandsSeparator(',') + ->decimalSeparator('.'), + ]) + ->pattern('$money'), +) +``` + +There is also a `money()` method that is able to define easier formatting for currency inputs. This example, the symbol prefix is `$`, there is a `,` thousands separator, and two decimal places: + +```php +use Filament\Forms\Components\TextInput; + +TextInput::make('cost')->mask(fn (TextInput\Mask $mask) => $mask->money('$', ',', 2)) +``` + +### Datalists + +You may specify [datalist](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/datalist) options for a text input using the `datalist()` method: + +```php +TextInput::make('manufacturer') + ->datalist([ + 'BWM', + 'Ford', + 'Mercedes-Benz', + 'Porsche', + 'Toyota', + 'Tesla', + 'Volkswagen', + ]) +``` + +Datalists provide autocomplete options to users when they use a text input. However, these are purely recommendations, and the user is still able to type any value into the input. If you're looking for strictly predefined options, check out [select fields](#select). + +## Select + +The select component allows you to select from a list of predefined options: + +```php +use Filament\Forms\Components\Select; + +Select::make('status') + ->options([ + 'draft' => 'Draft', + 'review' => 'In review', + 'published' => 'Published', + ]) +``` + +You may enable a search input to allow easier access to many options, using the `searchable()` method: + +```php +use App\Models\User; +use Filament\Forms\Components\Select; + +Select::make('authorId') + ->options(User::all()->pluck('name', 'id')) + ->searchable() +``` + +If you have lots of options and want to populate them based on a database search or other external data source, you can use the `getSearchResultsUsing()` and `getOptionLabelUsing()` methods instead of `options()`. + +The `getSearchResultsUsing()` method accepts a callback that returns search results in `$key => $value` format. + +The `getOptionLabelUsing()` method accepts a callback that transforms the selected option `$value` into a label. + +```php +Select::make('authorId') + ->searchable() + ->getSearchResultsUsing(fn (string $query) => User::where('name', 'like', "%{$query}%")->pluck('name', 'id')) + ->getOptionLabelUsing(fn ($value): ?string => User::find($value)?->name)), +``` + +### Dependant selects + +Commonly, you may desire "dependant" select inputs, which populate their options based on the state of another. + + + +Some of the techniques described in the [advanced forms](advanced) section are required to create dependant selects. These techniques can be applied across all form components for many dynamic customisation possibilities. + +### Populating automatically from a `belongsTo` relationship + +You may employ the `relationship()` method of the `BelongsToSelect` to configure a relationship to automatically retrieve and save options from: + +```php +use App\Models\Post; +use Filament\Forms\Components\BelongsToSelect; + +BelongsToSelect::make('authorId') + ->relationship('author', 'name') +``` + +> To set this functionality up, **you must also follow the instructions set out in the [field relationships](getting-started#field-relationships) section**. + +You may customise the database query that retrieves options using the third parameter of the `relationship()` method: + +```php +use App\Models\App; +use Filament\Forms\Components\BelongsToSelect; +use Illuminate\Database\Eloquent\Builder; + +BelongsToSelect::make('authorId') + ->relationship('author', 'name', fn (Builder $query) => $query->withTrashed()) +``` + +## Multi-select + +The multi-select component allows you to select multiple values from a list of predefined options: + +```php +use Filament\Forms\Components\MultiSelect; + +MultiSelect::make('technologies') + ->options([ + 'tailwind' => 'TailwindCSS', + 'alpine' => 'Alpine.js', + 'laravel' => 'Laravel', + 'livewire' => 'Laravel Livewire', + ]) +``` + +These options are returned in JSON format. If you're saving them using Eloquent, you should be sure to add an `array` [cast](https://laravel.com/docs/eloquent-mutators#array-and-json-casting) to the model property: + +```php +use Illuminate\Database\Eloquent\Model; + +class App extends Model +{ + protected $casts = [ + 'technologies' => 'array', + ]; + + // ... +} +``` + +### Populating automatically from a `belongsToMany` relationship + +You may employ the `relationship()` method of the `BelongsToManyMultiSelect` to configure a relationship to automatically retrieve and save options from: + +```php +use App\Models\App; +use Filament\Forms\Components\BelongsToManyMultiSelect; + +BelongsToManyMultiSelect::make('technologies') + ->relationship('technologies', 'name') +``` + +> To set this functionality up, **you must also follow the instructions set out in the [field relationships](getting-started#field-relationships) section**. + +You may customise the database query that retrieves options using the third parameter of the `relationship()` method: + +```php +use Filament\Forms\Components\BelongsToManyMultiSelect; +use Illuminate\Database\Eloquent\Builder; + +BelongsToManyMultiSelect::make('technologies') + ->relationship('technologies', 'name', fn (Builder $query) => $query->withTrashed()) +``` + +## Checkbox + +The checkbox component, similar to a [toggle](#toggle), allows you to interact a boolean value. + +```php +use Filament\Forms\Components\Checkbox; + +Checkbox::make('is_admin'), +``` + +Checkbox fields have two layout modes, inline and stacked. By default, they are inline. + +When the checkbox is inline, its label is adjacent to it: + +```php +use Filament\Forms\Components\Checkbox; + +Checkbox::make('is_admin')->inline() +``` + +When the checkbox is stacked, its label is above it: + +```php +use Filament\Forms\Components\Checkbox; + +Checkbox::make('is_admin')->stacked() +``` + +If you're saving the boolean value using Eloquent, you should be sure to add a `boolean` [cast](https://laravel.com/docs/eloquent-mutators#attribute-casting) to the model property: + +```php +use Illuminate\Database\Eloquent\Model; + +class User extends Model +{ + protected $casts = [ + 'is_admin' => 'boolean', + ]; + + // ... +} +``` + +## Toggle + +The toggle component, similar to a [checkbox](#checkbox), allows you to interact a boolean value. + +```php +use Filament\Forms\Components\Toggle; + +Toggle::make('is_admin') +``` + +Toggle fields have two layout modes, inline and stacked. By default, they are inline. + +When the toggle is inline, its label is adjacent to it: + +```php +use Filament\Forms\Components\Toggle; + +Toggle::make('is_admin')->inline() +``` + +When the toggle is stacked, its label is above it: + +```php +use Filament\Forms\Components\Toggle; + +Toggle::make('is_admin')->stacked() +``` + +Toggles may also use an "on icon" and an "off icon". These are displayed on its handle and could provide a greater indication to what your field represents. The parameter to each method must contain the name of a Blade icon component: + +```php +use Filament\Forms\Components\Toggle; + +Toggle::make('is_admin') + ->onIcon('heroicon-s-lightning-bolt'), + ->offIcon('heroicon-s-user') +``` + +If you're saving the boolean value using Eloquent, you should be sure to add a `boolean` [cast](https://laravel.com/docs/eloquent-mutators#attribute-casting) to the model property: + +```php +use Illuminate\Database\Eloquent\Model; + +class User extends Model +{ + protected $casts = [ + 'is_admin' => 'boolean', + ]; + + // ... +} +``` + +## Radio + +The radio input provides a radio button group for selecting a single value from a list of predefined options: + +```php +use Filament\Forms\Components\Radio; + +Radio::make('status') + ->options([ + 'draft' => 'Draft', + 'scheduled' => 'Scheduled', + 'published' => 'Published' + ]) +``` + +You can optionally provide descriptions to each option using the `descriptions()` method: + +```php +use Filament\Forms\Components\Radio; + +Radio::make('status') + ->options([ + 'draft' => 'Draft', + 'scheduled' => 'Scheduled', + 'published' => 'Published' + ]) + ->descriptions([ + 'draft' => 'Is not visible.', + 'scheduled' => 'Will be visible.', + 'published' => 'Is visible.' + ]) +``` + +Be sure to use the same `key` in the descriptions array as the `key` in the options array so the right description matches the right option. + +If you want a simple boolean radio button group, with "Yes" and "No" options, you can use the `boolean()` method: + +```php +Radio::make('feedback') + ->label('Do you like this post?') + ->boolean(); +``` + +## Date-time picker + +The date-time picker provides an interactive interface for selecting a date and a time. + +```php +use Filament\Forms\Components\DatePicker; +use Filament\Forms\Components\DateTimePicker; +use Filament\Forms\Components\TimePicker; + +DateTimePicker::make('published_at') +DatePicker::make('date_of_birth') +TimePicker::make('alarm_at') +``` + +You may restrict the minimum and maximum date that can be selected with the picker. The `minDate()` and `maxDate()` methods accept a `DateTime` instance (e.g. Carbon), or a string: + +```php +use Filament\Forms\Components\DatePicker; + +DatePicker::make('date_of_birth') + ->minDate(now()->subYears(150)) + ->maxDate(now()) +``` + +You may customize the format of the field when it is saved in your database, using the `format()` method. This accepts a string date format, using [PHP date formatting tokens](https://www.php.net/manual/en/datetime.format.php): + +```php +use Filament\Forms\Components\DatePicker; + +DatePicker::make('date_of_birth')->format('d/m/Y') +``` + +You may also customize the display format of the field, separately from the format used when it is saved in your database. For this, use the `displayFormat()` method, which also accepts a string date format, using [PHP date formatting tokens](https://www.php.net/manual/en/datetime.format.php): + +```php +use Filament\Forms\Components\DatePicker; + +DatePicker::make('date_of_birth')->displayFormat('d/m/Y') +``` + +When using the time picker, you may disable the seconds input using the `withoutSeconds()` method: + +```php +use Filament\Forms\Components\DateTimePicker; + +DateTimePicker::make('published_at')->withoutSeconds() +``` + +In some countries, the first day of the week is not Monday. To customize the first day of the week in the date picker, use the `forms.components.date_time_picker.first_day_of_week` config option, or the `firstDayOfWeek()` method on the component. 0 to 7 are accepted values, with Monday as 1 and Sunday as 7 or 0: + +```php +use Filament\Forms\Components\DateTimePicker; + +DateTimePicker::make('published_at')->firstDayOfWeek(7) +``` + +There are additionally convenient helper methods to set the first day of the week more semantically: + +```php +use Filament\Forms\Components\DateTimePicker; + +DateTimePicker::make('published_at')->weekStartsOnMonday() +DateTimePicker::make('published_at')->weekStartsOnSunday() +``` + +## File upload + +The file upload field is based on [Filepond](https://pqina.nl/filepond). + +```php +use Filament\Forms\Components\FileUpload; + +FileUpload::make('attachment'), +``` + +By default, files will be uploaded publicly to your default storage disk. + +To change the disk and directory that files are saved in, and their visibility, use the `disk()`, `directory()` and `visibility` methods: + +```php +use Filament\Forms\Components\FileUpload; + +FileUpload::make('attachment') + ->disk('s3') + ->directory('form-attachments') + ->visibility('private') +``` + +> Please note, it is the responsibility of the developer to delete these files from the disk if they are removed, as Filament is unaware if they are depended on elsewhere. One way to do this automatically is observing a [model event](https://laravel.com/docs/eloquent#events). + +You may restrict the types of files that may be uploaded using the `acceptedFileTypes()` method, and passing an array of MIME types. You may also use the `image()` method as shorthand to allow all image MIME types. + +```php +use Filament\Forms\Components\FileUpload; + +FileUpload::make('document')->acceptedFileTypes(['application/pdf']) +FileUpload::make('image')->image() +``` + +You may also restrict the size of uploaded files, in kilobytes: + +```php +use Filament\Forms\Components\FileUpload; + +FileUpload::make('attachment') + ->minSize(512) + ->maxSize(1024) +``` + +> To customize Livewire's default file upload validation rules, please refer to its [documentation](https://laravel-livewire.com/docs/file-uploads#global-validation). + +Filepond allows you to crop and resize images before they are uploaded. You can customize this behaviour using the `imageCropAspectRatio()`, `imageResizeTargetHeight()` and `imageResizeTargetWidth()` methods. + +```php +use Filament\Forms\Components\FileUpload; + +FileUpload::make('image') + ->image() + ->imageCropAspectRatio('16:9'), + ->imageResizeTargetWidth('1920'), + ->imageResizeTargetHeight('1080') +``` + +You may also alter the general appearance of the Filepond component. Available options for these methods are available on the [Filepond website](https://pqina.nl/filepond/docs/api/instance/properties/#styles). + +```php +use Filament\Forms\Components\FileUpload; + +FileUpload::make('attachment') + ->imagePreviewHeight('250') + ->loadingIndicatorPosition('left') + ->panelAspectRatio('2:1') + ->panelLayout('integrated') + ->removeUploadedFileButtonPosition('right') + ->uploadButtonPosition('left') + ->uploadProgressIndicatorPosition('left') +``` + +You may also upload multiple files, using the multiple file upload component. This stores URLs in JSON, but you may customize it to write to a relationship instead. + +```php +use Filament\Forms\Components\MultipleFileUpload; + +MultipleFileUpload::make('attachments') +``` + +You can customize the underlying file upload component by passing an instance of it to `uploadComponent()`. It must have the name `file`, but you can customize its label, ID and validation attribute to hide this if you wish: + +```php +use Filament\Forms\Components\FileUpload; +use Filament\Forms\Components\MultipleFileUpload; + +MultipleFileUpload::make('attachments') + ->uploadComponent( + FileUpload::make('file')->image(), + ) +``` + +> Filament also supports [`spatie/laravel-medialibrary`](https://github.com/spatie/laravel-medialibrary). See our [plugin documentation](/docs/spatie-laravel-media-library-plugin) for more information. + +## Rich editor + +The rich editor allows you to edit and preview HTML content, as well as upload images. + +```php +use Filament\Forms\Components\RichEditor; + +RichEditor::make('content') +``` + +You may enable / disable toolbar buttons using a range of convenient methods: + +```php +use Filament\Forms\Components\RichEditor; + +RichEditor::make('content') + ->toolbarButtons([ + 'attachFiles', + 'blockquote', + 'bold', + 'bulletList', + 'codeBlock', + 'h2', + 'h3', + 'italic', + 'link', + 'orderedList', + 'redo', + 'strike', + 'undo', + ]) +RichEditor::make('content') + ->disableToolbarButtons([ + 'attachFiles', + 'codeBlock', + ]) +RichEditor::make('content') + ->disableAllToolbarButtons() + ->enableToolbarButtons([ + 'bold', + 'bulletList', + 'italic', + 'strike', + ]) +``` + +You may customise how images are uploaded using configuration methods: + +```php +use Filament\Forms\Components\RichEditor; + +RichEditor::make('content') + ->fileAttachmentsDisk('s3') + ->fileAttachmentsDirectory('attachments') + ->fileAttachmentsVisibility('private') +``` + +## Markdown editor + +The markdown editor allows you to edit and preview markdown content, as well as upload images. + +```php +use Filament\Forms\Components\MarkdownEditor; + +MarkdownEditor::make('content') +``` + +You may enable / disable toolbar buttons using a range of convenient methods: + +```php +use Filament\Forms\Components\MarkdownEditor; + +MarkdownEditor::make('content') + ->toolbarButtons([ + 'attachFiles', + 'bold', + 'bulletList', + 'codeBlock', + 'edit', + 'italic', + 'link', + 'orderedList', + 'preview', + 'strike', + ]) +MarkdownEditor::make('content') + ->disableToolbarButtons([ + 'attachFiles', + 'codeBlock', + ]) +MarkdownEditor::make('content') + ->disableAllToolbarButtons() + ->enableToolbarButtons([ + 'bold', + 'bulletList', + 'edit', + 'italic', + 'preview', + 'strike', + ]) +``` + +You may customise how images are uploaded using configuration methods: + +```php +use Filament\Forms\Components\MarkdownEditor; + +MarkdownEditor::make('content') + ->fileAttachmentsDisk('s3') + ->fileAttachmentsDirectory('attachments') + ->fileAttachmentsVisibility('private') +``` + +## Hidden + +The hidden component allows you to create a hidden field in your form that holds a value. + +```php +use Filament\Forms\Components\Hidden; + +Hidden::make('token') +``` + +## Repeater + +The repeater component allows you to output a JSON array of repeated form components. + +```php +use Filament\Forms\Components\Repeater; +use Filament\Forms\Components\Select; +use Filament\Forms\Components\TextInput; + +Repeater::make('members') + ->schema([ + TextInput::make('name')->required(), + Select::make('role') + ->options([ + 'member' => 'Member', + 'administrator' => 'Administrator', + 'owner' => 'Owner', + ]) + ->required(), + ]) +``` + +As evident in the above example, the component schema can be defined within the `schema()` method of the component: + +```php +use Filament\Forms\Components\Repeater; +use Filament\Forms\Components\TextInput; + +Repeater::make('members') + ->schema([ + TextInput::make('name')->required(), + // ... + ]) +``` + +If you wish to define a repeater with multiple schema blocks that can be repeated in any order, please use the [builder](#builder). + +## Builder + +Similar to a [repeater](#repeater), the builder component allows you to output a JSON array of repeated form components. Unlike the repeater, which only defines one form schema to repeat, the builder allows you to define different schema "blocks", which you can repeat in any order. This makes it useful for building more advanced array structures. + +The primary use of the builder component is to build web page content using predefined blocks. The example below defines multiple blocks for different elements in the page content. On the frontend of your website, you could loop through each block in the JSON and format it how you wish. + +```php +use Filament\Forms\Components\Builder; +use Filament\Forms\Components\FileUpload; +use Filament\Forms\Components\MarkdownEditor; +use Filament\Forms\Components\Select; +use Filament\Forms\Components\TextInput; + +Builder::make('content') + ->blocks([ + Builder\Block::make('heading') + ->schema([ + TextInput::make('content')->required(), + Select::make('level') + ->options([ + 'h1' => 'Heading 1', + 'h2' => 'Heading 2', + 'h3' => 'Heading 3', + 'h4' => 'Heading 4', + 'h5' => 'Heading 5', + 'h6' => 'Heading 6', + ]) + ->required(), + ]), + Builder\Block::make('paragraph') + ->schema([ + MarkdownEditor::make('content')->required(), + ]), + Builder\Block::make('image') + ->schema([ + FileUpload::make('url') + ->image() + ->required(), + TextInput::make('alt') + ->label('Alt text') + ->required(), + ]), + ]) +``` + +As evident in the above example, blocks can be defined within the `blocks()` method of the component. Blocks are `Builder\Block` objects, and require a unique name, and a component schema: + +```php +use Filament\Forms\Components\Builder; +use Filament\Forms\Components\TextInput; + +Builder::make('content') + ->blocks([ + Builder\Block::make('heading') + ->schema([ + TextInput::make('content')->required(), + // ... + ]), + // ... + ]) +``` + +By default, the label of the block will be automatically determined based on its name. To override the block's label, you may use the `label()` method. Customizing the label in this way is useful if you wish to use a [translation string for localization](https://laravel.com/docs/localization#retrieving-translation-strings): + +```php +use Filament\Forms\Components\Builder; + +Builder\Block::make('heading')->label(__('blocks.heading')) +``` + +Blocks may also have an icon, which is displayed next to the label. The `icon()` method accepts the name of any Blade icon component: + +```php +use Filament\Forms\Components\Builder; + +Builder\Block::make('heading')->icon('heroicon-o-archive') +``` + +## Tags input + +The tags input component allows you to interact with a list of tags. + +By default, tags are stored in JSON: + +```php +use Filament\Forms\Components\TagsInput; + +TagsInput::make('tags') +``` + +If you're saving the JSON tags using Eloquent, you should be sure to add an `array` [cast](https://laravel.com/docs/eloquent-mutators#array-and-json-casting) to the model property: + +```php +use Illuminate\Database\Eloquent\Model; + +class Post extends Model +{ + protected $casts = [ + 'tags' => 'array', + ]; + + // ... +} +``` + +You may allow the tags to be stored in a separated string, instead of JSON. To set this up, pass the separating character to the `separator()` method: + +```php +use Filament\Forms\Components\TagsInput; + +TagsInput::make('tags')->separator(',') +``` + +> Filament also supports [`spatie/laravel-tags`](https://github.com/spatie/laravel-tags). See our [plugin documentation](/docs/spatie-laravel-tags-plugin) for more information. + +## Textarea + +The textarea allows you to interact with a multi-line string: + +```php +use Filament\Forms\Components\Textarea; + +Textarea::make('description') +``` + +You may change the size of the textarea by defining the `rows()` and `cols()` methods: + +```php +use Filament\Forms\Components\Textarea; + +Textarea::make('description') + ->rows(10) + ->cols(20) +``` + +You may limit the length of the string by setting the `minLength()` and `maxLength()` methods. These methods add both frontend and backend validation: + +```php +use Filament\Forms\Components\Textarea; + +Textarea::make('description') + ->minLength(50) + ->maxLength(500) +``` + +## Key-value + +The key-value field allows you to interact with one-dimensional JSON object: + +```php +use Filament\Forms\Components\KeyValue; + +KeyValue::make('meta') +``` + +You may customize the labels for the key and value fields using the `keyLabel()` and `valueLabel()` methods: + +```php +use Filament\Forms\Components\KeyValue; + +KeyValue::make('meta') + ->keyLabel('Property name') + ->valueLabel('Property value') +``` + +You may also prevent the user from adding rows, deleting rows, or editing keys: + +```php +use Filament\Forms\Components\KeyValue; + +KeyValue::make('meta') + ->disableAddingRows() + ->disableDeletingRows() + ->disableEditingKeys() +``` + +## View + +Aside from [building custom fields](#building-custom-fields), you may create "view" fields which allow you to create custom fields without extra PHP classes. + +```php +use Filament\Forms\Components\ViewField; + +ViewField::make('notifications')->view('filament.forms.components.range-slider') +``` + +Inside your view, you may interact with the state of the form component using Livewire and Alpine.js. + +The `$getStatePath()` callable may be used by the view to retrieve the Livewire property path of the field. You could use this to [`wire:model`](https://laravel-livewire.com/docs/properties#data-binding) a value, or [`$wire.entangle`](https://laravel-livewire.com/docs/alpine-js) it with Alpine.js: + +```blade + +
    + +
    +
    +``` + +## Building custom fields + +You may create your own custom field classes and views, which you can reuse across your project, and even release as a plugin to the community. + +> If you're just creating a simple custom field to use once, you could instead use a [view field](#view) to render any custom Blade file. + +To create a custom column class and view, you may use the following command: + +```bash +php artisan make:form-field RangeSlider +``` + +This will create the following field class: + +```php +use Filament\Forms\Components\Field; + +class RangeSlider extends Field +{ + protected string $view = 'filament.forms.components.range-slider'; +} +``` + +Inside your view, you may interact with the state of the form component using Livewire and Alpine.js. + +The `$getStatePath()` callable may be used by the view to retrieve the Livewire property path of the field. You could use this to [`wire:model`](https://laravel-livewire.com/docs/properties#data-binding) a value, or [`$wire.entangle`](https://laravel-livewire.com/docs/alpine-js) it with Alpine.js: + +```blade + +
    + +
    +
    +``` diff --git a/packages/forms/docs/04-layout.md b/packages/forms/docs/04-layout.md new file mode 100644 index 0000000000..9a7bad950b --- /dev/null +++ b/packages/forms/docs/04-layout.md @@ -0,0 +1,319 @@ +--- +title: Layout +--- + +## Getting started + +Layout component classes can be found in the `Filament\Form\Components` namespace. + +They reside within the schema of your form, alongside any [fields](fields): + +```php +protected function getFormSchema(): array +{ + return [ + // ... + ]; +} +``` + +Components may be created using the static `make()` method. Usually, you will then define the child component `schema()` to display inside: + +```php +use Filament\Forms\Components\Grid; + +Grid::make() + ->schema([ + // ... + ]) +``` + +### Columns + +You may create multiple columns within each layout component using the `columns()` method: + +```php +use Filament\Forms\Components\Card; + +Card::make()->columns(2) +``` + +> For more information about creating advanced, responsive column layouts, please see the [grid section](#grid). All column options in that section are also available in other layout components. + +### Setting an ID + +You may define an ID for the component using the `id()` method: + +```php +use Filament\Forms\Components\Card; + +Card::make()->id('main-card') +``` + +### Custom attributes + +The HTML of components can be customized even further, by passing an array of `extraAttributes()`: + +```php +use Filament\Forms\Components\Card; + +Card::make()->extraAttributes(['class' => 'bg-gray-50']) +``` + +## Grid + +Generally, form fields are stacked on top of each other in one column. To change this, you may use a grid component: + +```php +use Filament\Forms\Components\Grid; + +Grid::make() + ->schema([ + // ... + ]) +``` + +By default, grid components will create a two column grid for [the Tailwind `md` breakpoint](https://tailwindcss.com/docs/responsive-design#overview) and higher. + +To customize the number of columns in any grid at different [breakpoints](https://tailwindcss.com/docs/responsive-design#overview), you may pass an array of breakpoints and columns: + +```php +use Filament\Forms\Components\Grid; + +Grid::make([ + 'default' => 1, + 'sm' => 2, + 'md' => 3, + 'lg' => 4, + 'xl' => 6, + '2xl' => 8, +]) + ->schema([ + // ... + ]) +``` + +Since Tailwind is mobile-first, if you leave out a breakpoint, it will fall back to the one set below it: + +```php +use Filament\Forms\Components\Grid; + +Grid::make([ + 'sm' => 2, + 'xl' => 6, +]) + ->schema([ + // ... + ]) +``` + +You may specify the number of columns that any component may span, at any breakpoint in an identical way: + +```php +use Filament\Forms\Components\Grid; +use Filament\Forms\Components\TextInput; + +Grid::make([ + 'default' => 1, + 'sm' => 3, + 'xl' => 6, + '2xl' => 8, +]) + ->schema([ + TextInput::make('name') + ->columnSpan([ + 'sm' => 2, + 'xl' => 3, + '2xl' => 4, + ]), + // ... + ]) +``` + +## Fieldset + +You may want to group fields into a Fieldset. Each fieldset has a label, a border, and a two-column grid by default: + +```php +use Filament\Forms\Components\Fieldset; + +Fieldset::make('Label') + ->schema([ + // ... + ]) +``` + +You may use the `columns()` method to customize the [grid](#grid) within the fieldset: + +```php +use Filament\Forms\Components\Fieldset; + +Fieldset::make('Label') + ->schema([ + // ... + ]) + ->columns(3) +``` + +## Tabs + +Some forms can be long and complex. You may want to use tabs to reduce the number of components that are visible at once: + +```php +use Filament\Forms\Components\Tabs; + +Tabs::make('Heading') + ->tabs([ + Tabs\Tab::make('Label 1') + ->schema([ + // ... + ]), + Tabs\Tab::make('Label 2') + ->schema([ + // ... + ]), + Tabs\Tab::make('Label 3') + ->schema([ + // ... + ]), + ]) +``` + +## Section + +You may want to separate your fields into sections, each with a heading and description. To do this, you can use a section component: + +```php +use Filament\Forms\Components\Section; + +Section::make('Heading') + ->description('Description') + ->schema([ + // ... + ]) +``` + +You may use the `columns()` method to easily create a [grid](#grid) within the section: + +```php +use Filament\Forms\Components\Section; + +Section::make('Heading') + ->schema([ + // ... + ]) + ->columns(2) +``` + +Sections may be `collapsible()` to optionally hide content in long forms: + +```php +use Filament\Forms\Components\Section; + +Section::make('Heading') + ->schema([ + // ... + ]) + ->collapsible() +``` + +Your sections may be `collapsed()` by default: + +```php +use Filament\Forms\Components\Section; + +Section::make('Heading') + ->schema([ + // ... + ]) + ->collapsed() +``` + +## Placeholder + +Placeholders can be used to render text-only "fields" within your forms. Each placeholder has a state, which is cannot be changed by the user. + +```php +use Filament\Forms\Components\Placeholder; + +Placeholder::make('Label')->state('Value, displayed underneath the label') +``` + +## Card + +The card component may be used to render the form components inside a card: + +```php +use Filament\Forms\Components\Card; + +Card::make() + ->schema([ + // ... + ]) +``` + +You may use the `columns()` method to easily create a [grid](#grid) within the card: + +```php +use Filament\Forms\Components\Card; + +Card::make() + ->schema([ + // ... + ]) + ->columns(2) +``` + +## View + +Aside from [building custom layout components](#building-custom-layout-components), you may create "view" components which allow you to create custom layouts without extra PHP classes. + +```php +use Filament\Forms\Components\View; + +View::make('filament.forms.components.wizard') +``` + +Inside your view, you may render the component's `schema()` using the `$getChildComponentContainer()` callable: + +```blade +
    + {{ $getChildComponentContainer() }} +
    +``` + +## Building custom layout components + +You may create your own custom component classes and views, which you can reuse across your project, and even release as a plugin to the community. + +> If you're just creating a simple custom component to use once, you could instead use a [view component](#view) to render any custom Blade file. + +To create a custom column class and view, you may use the following command: + +```bash +php artisan make:form-layout Wizard +``` + +This will create the following layout component class: + +```php +use Filament\Forms\Components\Component; + +class Wizard extends Component +{ + protected string $view = 'filament.forms.components.wizard'; + + public static function make(): static + { + return new static(); + } +} +``` + +Inside your view, you may render the component's `schema()` using the `$getChildComponentContainer()` callable: + +```blade +
    + {{ $getChildComponentContainer() }} +
    +``` diff --git a/packages/forms/docs/05-advanced.md b/packages/forms/docs/05-advanced.md new file mode 100644 index 0000000000..788567b870 --- /dev/null +++ b/packages/forms/docs/05-advanced.md @@ -0,0 +1,189 @@ +--- +title: Advanced +--- + +## Using callback customisation + +All configuration methods for [fields](fields) and [layout components](layout) accept callback functions as parameters instead of hardcoded values: + +```php +use App\Models\User; +use Filament\Forms\Components\DatePicker; +use Filament\Forms\Components\Select; +use Filament\Forms\Components\TextInput; + +DatePicker::make('date_of_birth') + ->displayFormat(function () { + if (auth()->user()->country_id === 'us') { + return 'm/d/Y' + } else { + return 'd/m/Y' + } + }) + +Select::make('userId') + ->options(function () { + return User::all()->pluck('name', 'id'); + }) + +TextInput::make('middle_name') + ->required(function () { + return auth()->user()->hasMiddleName(); + }) +``` + +This alone unlocks many customization possibilities. + +The package is also able to inject many utilities to use inside these callback functions, as parameters. + +If you wish to access the current state (value) of the component, define a `$state` parameter: + +```php +function ($state) { + // ... +} +``` + +If you wish to access the current component instance, define a `$component` parameter: + +```php +use Filament\Forms\Components\Component; + +function (Component $component) { + // ... +} +``` + +If you wish to access the current Livewire component instance, define a `$livewire` parameter: + +```php +use Livewire\Component as Livewire; + +function (Livewire $livewire) { + // ... +} +``` + +If you have defined a form or component Eloquent model, define a `$model` parameter: + +```php +use Illuminate\Database\Eloquent\Model; + +function (Model $model) { + // ... +} +``` + +You may also retrieve the value of another field from within a callback, using a callable `$get` parameter: + +```php +function (callable $get) { + $email = $get('email'); // Store the value of the `email` field in the `$email` variable. + //... +} +``` + +In a similar way to `$get`, you may also set the value of another field from within a callback, using a callable `$set` parameter: + +```php +function (callable $set) { + $set('title', 'Blog Post'); // Set the `title` field to `Blog Post`. + //... +} +``` + +Callbacks are evaluated using Laravel's `app()->call()` under the hood, so you are able to combine multiple parameters in any order: + +```php +use Livewire\Component as Livewire; + +function (Livewire $livewire, callable $get, callable $set) { + // ... +} +``` + +### Reloading the form when a field is updated + +By default, forms are only reloaded when they are validated or submitted. You may allow a form to be reloaded when a field is changed, by using the `reactive()` method on that field: + +```php +use Filament\Forms\Components\TextInput; + +TextInput::make('title')->reactive() +``` + +A great example to give a use case for this is when you wish to generate a slug from a title field automatically: + + + +## Conditionally hiding components + +Sometimes, you may wish to conditionally hide any form component. You may do this with a `hidden()` method: + +```php +use Filament\Forms\Components\TextInput; + +TextInput::make('newPassword')->password() +TextInput::make('newPasswordConfirmation') + ->password() + ->hidden(fn (callable $get) => $get('newPassword') !== null) +``` + +## Field lifecycle + +### Hydration + +Hydration is the process which fill fields with data. It runs when you call the [form's `fill()` method](getting-started#filling-forms-with-data). You may customize what happens after a field is hydrated using the `afterStateHydrated()`. + +In this example, the `name` field will always be hydrated with the correctly capitalized name: + +```php +use Filament\Forms\Components\TextInput; + +TextInput::make('name') + ->afterStateHydrated(function (TextInput $component, callable $set, $state) { + $set($component, ucwords($state)); + }) +``` + +### Updates + +You may use the `afterStateHydrated()` method to customize what happens after a field is updated. + +In this example, the `slug` field is updated with the slug version of the `title` field automatically: + +```php +use Filament\Forms\Components\TextInput; +use Illuminate\Support\Str; + +TextInput::make('title') + ->reactive() + ->afterStateUpdated(function (callable $set, $state) { + $set('slug', Str::slug($state)); + }) +TextInput::make('slug') +``` + +### Dehydration + +Hydration is the process which gets data from fields, and transforms it. It runs when you call the [form's `getState()` method](getting-started#getting-data-from-forms). You may customize how the state is dehydrated from the form by returning the transformed state from the `afterStateHydrated()` callback. + +In this example, the `name` field will always be dehydrated with the correctly capitalized name: + +```php +use Filament\Forms\Components\TextInput; + +TextInput::make('name')->dehydrateStateUsing(fn ($state) => ucwords($state)) +``` + +You may also prevent the field from being dehydrated altogether by passing `false` to `dehydrated()`. + +In this example, the `passwordConfirmation` field will not be present in the array returned from `getData()`: + +```php +use Filament\Forms\Components\TextInput; + +TextInput::make('passwordConfirmation') + ->password() + ->dehydrated(false) +``` diff --git a/packages/forms/resources/css/components/file-upload.css b/packages/forms/resources/css/components/file-upload.css new file mode 100644 index 0000000000..6714f1a391 --- /dev/null +++ b/packages/forms/resources/css/components/file-upload.css @@ -0,0 +1,3 @@ +.filepond--root { + margin-bottom: 0; +} \ No newline at end of file diff --git a/packages/forms/resources/js/components/date-time-picker.js b/packages/forms/resources/js/components/date-time-picker.js new file mode 100644 index 0000000000..1ea36e0b4d --- /dev/null +++ b/packages/forms/resources/js/components/date-time-picker.js @@ -0,0 +1,367 @@ +import dayjs from 'dayjs/esm' +import customParseFormat from 'dayjs/plugin/customParseFormat' +import localeData from 'dayjs/plugin/localeData' +import timezone from 'dayjs/plugin/timezone' +import utc from 'dayjs/plugin/utc' + +dayjs.extend(customParseFormat) +dayjs.extend(localeData) +dayjs.extend(timezone) +dayjs.extend(utc) + +window.dayjs = dayjs + +export default (Alpine) => { + Alpine.data('dateTimePickerFormComponent', ({ + displayFormat, + firstDayOfWeek, + format, + isAutofocused, + maxDate, + minDate, + state, + }) => { + const timezone = dayjs.tz.guess() + + dayjs.locale(window.dayjs_locale) + + return { + daysInFocusedMonth: [], + + displayText: '', + + emptyDaysInFocusedMonth: [], + + focusedDate: null, + + focusedMonth: null, + + focusedYear: null, + + hour: null, + + maxDate, + + minDate, + + minute: null, + + open: false, + + second: null, + + state, + + init: function () { + this.maxDate = dayjs(this.maxDate) + if (! this.maxDate.isValid()) { + this.maxDate = null + } + + this.minDate = dayjs(this.minDate) + if (! this.minDate.isValid()) { + this.minDate = null + } + + let date = this.getSelectedDate() ?? dayjs().tz(timezone) + .hour(0) + .minute(0) + .second(0) + + if (this.maxDate !== null && date.isAfter(this.maxDate)) { + date = null + } + + if (this.minDate !== null && date.isBefore(this.minDate)) { + date = null + } + + this.hour = date?.hour() ?? 0 + this.minute = date?.minute() ?? 0 + this.second = date?.second() ?? 0 + + this.setDisplayText() + + if (isAutofocused) { + this.openPicker() + } + + this.$watch('focusedMonth', () => { + this.focusedMonth = +this.focusedMonth + + if (this.focusedDate.month() === this.focusedMonth) { + return + } + + this.focusedDate = this.focusedDate.month(this.focusedMonth) + }) + + this.$watch('focusedYear', () => { + this.focusedYear = Number.isInteger(+this.focusedYear) ? +this.focusedYear : dayjs().year() + + if (this.focusedDate.year() === this.focusedYear) { + return + } + + this.focusedDate = this.focusedDate.year(this.focusedYear) + }) + + this.$watch('focusedDate', () => { + this.focusedMonth = this.focusedDate.month() + this.focusedYear = this.focusedDate.year() + + this.setupDaysGrid() + + this.$nextTick(() => { + this.evaluatePosition() + }) + }) + + this.$watch('hour', () => { + let hour = +this.hour + + if (! Number.isInteger(hour)) { + this.hour = 0 + } else if (hour > 23) { + this.hour = 0 + } else if (hour < 0) { + this.hour = 23 + } else { + this.hour = hour + } + + let date = this.getSelectedDate() ?? this.focusedDate + + this.setState(date.hour(this.hour ?? 0)) + }) + + this.$watch('minute', () => { + let minute = +this.minute + + if (! Number.isInteger(minute)) { + this.minute = 0 + } else if (minute > 59) { + this.minute = 0 + } else if (minute < 0) { + this.minute = 59 + } else { + this.minute = minute + } + + let date = this.getSelectedDate() ?? this.focusedDate + + this.setState(date.minute(this.minute ?? 0)) + }) + + this.$watch('second', () => { + let second = +this.second + + if (! Number.isInteger(second)) { + this.second = 0 + } else if (second > 59) { + this.second = 0 + } else if (second < 0) { + this.second = 59 + } else { + this.second = second + } + + let date = this.getSelectedDate() ?? this.focusedDate + + this.setState(date.second(this.second ?? 0)) + }) + + this.$watch('state', () => { + let date = this.getSelectedDate() + + if (this.maxDate !== null && date.isAfter(this.maxDate)) { + date = null + } + if (this.minDate !== null && date.isBefore(this.minDate)) { + date = null + } + + this.hour = date?.hour() ?? 0 + this.minute = date?.minute() ?? 0 + this.second = date?.second() ?? 0 + + this.setDisplayText() + }) + }, + + clearState: function () { + this.setState(null) + + this.closePicker() + }, + + closePicker: function () { + this.open = false + }, + + dateIsDisabled: function (date) { + if (this.maxDate && date.isAfter(this.maxDate)) { + return true + } + if (this.minDate && date.isBefore(this.minDate)) { + return true + } + + return false + }, + + dayIsDisabled: function (day) { + return this.dateIsDisabled(this.focusedDate.date(day)) + }, + + dayIsSelected: function (day) { + let selectedDate = this.getSelectedDate() + + if (selectedDate === null) { + return false + } + + return selectedDate.date() === day && + selectedDate.month() === this.focusedDate.month() && + selectedDate.year() === this.focusedDate.year() + }, + + dayIsToday: function (day) { + let date = dayjs().tz(timezone) + + return date.date() === day && + date.month() === this.focusedDate.month() && + date.year() === this.focusedDate.year() + }, + + evaluatePosition: function () { + let availableHeight = window.innerHeight - this.$refs.button.offsetHeight + + let element = this.$refs.button + + while (element) { + availableHeight -= element.offsetTop + + element = element.offsetParent + } + + if (this.$refs.picker.offsetHeight <= availableHeight) { + this.$refs.picker.style.bottom = 'auto' + + return + } + + this.$refs.picker.style.bottom = `${this.$refs.button.offsetHeight}px` + }, + + focusPreviousDay: function () { + this.focusedDate = this.focusedDate.subtract(1, 'day') + }, + + focusPreviousWeek: function () { + this.focusedDate = this.focusedDate.subtract(1, 'week') + }, + + focusNextDay: function () { + this.focusedDate = this.focusedDate.add(1, 'day') + }, + + focusNextWeek: function () { + this.focusedDate = this.focusedDate.add(1, 'week') + }, + + getDayLabels: function () { + const labels = dayjs.weekdaysShort() + + if (firstDayOfWeek === 0) { + return labels + } + + return [ + ...labels.slice(firstDayOfWeek), + ...labels.slice(0, firstDayOfWeek), + ] + }, + + getSelectedDate: function () { + let date = dayjs(this.state, format) + + if (! date.isValid()) { + return null + } + + return date + }, + + openPicker: function () { + this.focusedDate = this.getSelectedDate() ?? dayjs().tz(timezone) + + this.setupDaysGrid() + + this.open = true + + this.$nextTick(() => { + this.evaluatePosition() + }) + }, + + selectDate: function (day = null) { + if (day) { + this.setFocusedDay(day) + } + + this.setState(this.focusedDate) + }, + + setDisplayText: function () { + this.displayText = this.getSelectedDate() ? this.getSelectedDate().format(displayFormat) : '' + }, + + setupDaysGrid: function () { + this.emptyDaysInFocusedMonth = Array.from({ + length: this.focusedDate.date(8 - firstDayOfWeek).day(), + }, (_, i) => i + 1) + + this.daysInFocusedMonth = Array.from({ + length: this.focusedDate.daysInMonth(), + }, (_, i) => i + 1) + }, + + setFocusedDay: function (day) { + this.focusedDate = this.focusedDate.date(day) + }, + + setState: function (date) { + if (date === null) { + this.state = null + + this.setDisplayText() + + return + } else { + if (this.dateIsDisabled(date)) { + return + } + } + + this.state = date + .hour(this.hour ?? 0) + .minute(this.minute ?? 0) + .second(this.second ?? 0) + .format(format) + + this.setDisplayText() + }, + + togglePickerVisibility: function () { + if (this.open) { + this.closePicker() + + return + } + + this.openPicker() + }, + } + }) +} diff --git a/packages/forms/resources/js/components/file-upload.js b/packages/forms/resources/js/components/file-upload.js new file mode 100644 index 0000000000..de5ff75db4 --- /dev/null +++ b/packages/forms/resources/js/components/file-upload.js @@ -0,0 +1,129 @@ +import * as FilePond from 'filepond' +import FilePondPluginFileValidateSize from 'filepond-plugin-file-validate-size' +import FilePondPluginFileValidateType from 'filepond-plugin-file-validate-type' +import FilePondPluginImageCrop from 'filepond-plugin-image-crop' +import FilePondPluginImageExifOrientation from 'filepond-plugin-image-exif-orientation' +import FilePondPluginImagePreview from 'filepond-plugin-image-preview' +import FilePondPluginImageResize from 'filepond-plugin-image-resize' +import FilePondPluginImageTransform from 'filepond-plugin-image-transform' + +import 'filepond/dist/filepond.min.css' +import 'filepond-plugin-image-preview/dist/filepond-plugin-image-preview.css' +import '../../css/components/file-upload.css' + +FilePond.registerPlugin(FilePondPluginFileValidateSize) +FilePond.registerPlugin(FilePondPluginFileValidateType) +FilePond.registerPlugin(FilePondPluginImageCrop) +FilePond.registerPlugin(FilePondPluginImageExifOrientation) +FilePond.registerPlugin(FilePondPluginImagePreview) +FilePond.registerPlugin(FilePondPluginImageResize) +FilePond.registerPlugin(FilePondPluginImageTransform) + +export default (Alpine) => { + Alpine.data('fileUploadFormComponent', ({ + acceptedFileTypes, + getUploadedFileUrlUsing, + imageCropAspectRatio, + imagePreviewHeight, + imageResizeTargetHeight, + imageResizeTargetWidth, + loadingIndicatorPosition, + panelAspectRatio, + panelLayout, + placeholder, + maxSize, + minSize, + removeUploadedFileButtonPosition, + removeUploadedFileUsing, + state, + uploadButtonPosition, + uploadProgressIndicatorPosition, + uploadUsing, + }) => { + return { + files: [], + + pond: null, + + state, + + init: async function () { + let uploadedFileUrl = await getUploadedFileUrlUsing() + + if (uploadedFileUrl) { + this.files = [{ + source: uploadedFileUrl, + options: { + type: 'local', + }, + }] + } + + this.pond = FilePond.create(this.$refs.input, { + acceptedFileTypes, + credits: false, + files: this.files, + imageCropAspectRatio, + imagePreviewHeight, + imageResizeTargetHeight, + imageResizeTargetWidth, + ...(placeholder && {labelIdle: placeholder}), + maxFileSize: maxSize, + minFileSize: minSize, + styleButtonProcessItemPosition: uploadButtonPosition, + styleButtonRemoveItemPosition: removeUploadedFileButtonPosition, + styleLoadIndicatorPosition: loadingIndicatorPosition, + stylePanelAspectRatio: panelAspectRatio, + stylePanelLayout: panelLayout, + styleProgressIndicatorPosition: uploadProgressIndicatorPosition, + server: { + load: async (source, load) => { + let response = await fetch(source) + let blob = await response.blob() + + load(blob) + }, + process: (fieldName, file, metadata, load, error, progress) => { + uploadUsing(file, load, error, progress) + }, + remove: async (source, load) => { + await removeUploadedFileUsing() + + load() + }, + revert: async (uniqueFileId, load) => { + await removeUploadedFileUsing(uniqueFileId) + + load() + }, + }, + }) + + this.$watch('state', async () => { + if (! this.state) { + this.pond.removeFiles() + + return + } + + if (this.state.startsWith('livewire-file:')) { + return + } + + let uploadedFileUrl = await getUploadedFileUrlUsing() + + if (uploadedFileUrl) { + this.pond.files = [{ + source: uploadedFileUrl, + options: { + type: 'local', + }, + }] + } else { + this.pond.files = [] + } + }) + } + } + }) +} diff --git a/packages/forms/resources/js/components/key-value.js b/packages/forms/resources/js/components/key-value.js new file mode 100644 index 0000000000..fd3b48d704 --- /dev/null +++ b/packages/forms/resources/js/components/key-value.js @@ -0,0 +1,56 @@ +import Sortable from 'sortablejs' + +export default (Alpine) => { + Alpine.data('keyValueFormComponent', ({ + canAddRows, + canDeleteRows, + state, + }) => ({ + canAddRows, + + canDeleteRows, + + state, + + rows: [], + + init: function () { + for (let [value, key] of Object.entries(this.state ?? {})) { + this.rows.push({ + key, + value, + }) + } + + if (this.rows.length <= 0) { + this.addRow() + } + }, + + addRow: function () { + this.rows.push({ key: '', value: '' }) + + this.updateState() + }, + + deleteRow: function (index) { + this.rows.splice(index, 1) + + if (this.rows.length <= 0) { + this.addRow() + } + + this.updateState() + }, + + updateState: function () { + let state = {} + + this.rows.forEach((row) => { + state[row.key] = row.value + }) + + this.state = state + }, + })) +} diff --git a/packages/forms/resources/js/components/markdown-editor.js b/packages/forms/resources/js/components/markdown-editor.js new file mode 100644 index 0000000000..5b898575e0 --- /dev/null +++ b/packages/forms/resources/js/components/markdown-editor.js @@ -0,0 +1,86 @@ +import '@github/file-attachment-element' +import '@github/markdown-toolbar-element' +import marked from 'marked' +import { highlight } from 'mdhl' + +export default (Alpine) => { + Alpine.data('markdownEditorFormComponent', ({ + state, + tab, + }) => { + return { + attachment: null, + + overlay: null, + + preview: '', + + state, + + tab, + + init: function () { + if (this.state !== null) { + this.render() + } + + this.$watch('state', () => { + this.render() + }) + }, + + render: function () { + if (this.$refs.textarea.scrollHeight > 0) { + this.$refs.overlay.style.height = '150px' + this.$refs.overlay.style.height = this.$refs.textarea.scrollHeight + 'px' + } + + this.overlay = null + this.overlay = highlight(this.state) + + this.preview = null + this.preview = marked(this.state) + }, + + checkForAutoInsertion($event) { + const lines = this.$refs.textarea.value.split("\n") + + const currentLine = this.$refs.textarea.value.substring( + 0, this.$refs.textarea.value.selectionStart + ).split("\n").length + const previousLine = lines[currentLine - 2] + + if (! previousLine.match(/^(\*\s|-\s)|^(\d)+\./)) { + return; + } + + if (previousLine.match(/^(\*\s)/)) { + if (previousLine.trim().length > 1) { + lines[currentLine - 1] = '* ' + } else { + delete lines[currentLine - 2] + } + } else if (previousLine.match(/^(-\s)/)) { + if (previousLine.trim().length > 1) { + lines[currentLine - 1] = '- ' + } else { + delete lines[currentLine - 2] + } + } else { + const matches = previousLine.match(/^(\d)+/) + const number = matches[0] + + if (previousLine.trim().length > (number.length + 2)) { + lines[currentLine - 1] = `${parseInt(number) + 1}. ` + } else { + delete lines[currentLine - 2] + } + } + + this.state = lines.join("\n") + + this.render() + }, + } + }) +} diff --git a/packages/forms/resources/js/components/multi-select.js b/packages/forms/resources/js/components/multi-select.js new file mode 100644 index 0000000000..9ec93a0af7 --- /dev/null +++ b/packages/forms/resources/js/components/multi-select.js @@ -0,0 +1,190 @@ +export default (Alpine) => { + Alpine.data('multiSelectFormComponent', ({ + getOptionLabelsUsing, + getSearchResultsUsing, + isAutofocused, + options, + state, + }) => { + return { + focusedOptionIndex: null, + + isLoading: false, + + isOpen: false, + + labels: [], + + options, + + search: '', + + state, + + init: async function () { + if (isAutofocused) { + this.openListbox() + } + + if (! this.state) { + this.state = [] + } + + this.state = this.state.map((value) => value.toString()) + + this.labels = await getOptionLabelsUsing() + + this.$watch('search', async () => { + if (! this.isOpen || this.search === '' || this.search === null) { + this.options = options + this.focusedOptionIndex = 0 + + return + } + + if (Object.keys(options).length) { + this.options = {} + + let search = this.search.trim().toLowerCase() + + for (let key in options) { + if (options[key].trim().toLowerCase().includes(search)) { + this.options[key] = options[key] + } + } + + this.focusedOptionIndex = 0 + } else { + this.isLoading = true + this.options = await getSearchResultsUsing(this.search) + this.focusedOptionIndex = 0 + this.isLoading = false + } + }) + + this.$watch('state', async () => { + this.labels = await getOptionLabelsUsing() + }) + }, + + clearState: function () { + this.state = [] + this.labels = [] + + this.closeListbox() + }, + + closeListbox: function () { + this.isOpen = false + + this.focusedOptionIndex = null + + this.search = '' + }, + + evaluatePosition: function () { + let availableHeight = window.innerHeight - this.$refs.button.offsetHeight + + let element = this.$refs.button + + while (element) { + availableHeight -= element.offsetTop + + element = element.offsetParent + } + + if (this.$refs.listbox.offsetHeight <= availableHeight) { + this.$refs.listbox.style.bottom = 'auto' + + return + } + + this.$refs.listbox.style.bottom = `${this.$refs.button.offsetHeight}px` + }, + + focusNextOption: function () { + if (this.focusedOptionIndex === null) { + this.focusedOptionIndex = Object.keys(this.options).length - 1 + + return + } + + if (this.focusedOptionIndex + 1 >= Object.keys(this.options).length) { + return + } + + this.focusedOptionIndex++ + + this.$refs.listboxOptionsList.children[this.focusedOptionIndex].scrollIntoView({ + block: 'center', + }) + }, + + focusPreviousOption: function () { + if (this.focusedOptionIndex === null) { + this.focusedOptionIndex = 0 + + return + } + + if (this.focusedOptionIndex <= 0) { + return + } + + this.focusedOptionIndex-- + + this.$refs.listboxOptionsList.children[this.focusedOptionIndex].scrollIntoView({ + block: 'center', + }) + }, + + openListbox: function () { + this.focusedOptionIndex = 0 + + this.isOpen = true + + this.$nextTick(() => { + this.$refs.search.focus() + + this.evaluatePosition() + + this.$refs.listboxOptionsList.children[this.focusedOptionIndex].scrollIntoView({ + block: 'center' + }) + }) + }, + + selectOption: function (index = null) { + if (! this.isOpen) { + this.closeListbox() + + return + } + + let value = Object.keys(this.options)[index ?? this.focusedOptionIndex] + + if (this.state.indexOf(value) < 0) { + this.state.push(value) + } else { + this.deselectOption(value) + } + + this.closeListbox() + }, + + deselectOption: function (optionToDeselect) { + this.state = this.state.filter((option) => option !== optionToDeselect) + }, + + toggleListboxVisibility: function () { + if (this.isOpen) { + this.closeListbox() + + return + } + + this.openListbox() + }, + } + }) +} diff --git a/packages/forms/resources/js/components/rich-editor.js b/packages/forms/resources/js/components/rich-editor.js new file mode 100644 index 0000000000..686ef1ef1a --- /dev/null +++ b/packages/forms/resources/js/components/rich-editor.js @@ -0,0 +1,39 @@ +import Trix from 'trix/dist/trix' + +import 'trix/dist/trix.css' + +Trix.config.blockAttributes.heading = { + tagName: "h2", + terminal: true, + breakOnReturn: true, + group: false +} + +Trix.config.blockAttributes.subHeading = { + tagName: "h3", + terminal: true, + breakOnReturn: true, + group: false +} + +export default (Alpine) => { + Alpine.data('richEditorFormComponent', ({ + state, + }) => { + return { + state, + + init: function () { + this.$refs.trix?.editor?.loadHTML(this.state) + + this.$watch('state', () => { + if (document.activeElement === this.$refs.trix) { + return + } + + this.$refs.trix?.editor?.loadHTML(this.state) + }) + } + } + }) +} diff --git a/packages/forms/resources/js/components/select.js b/packages/forms/resources/js/components/select.js new file mode 100644 index 0000000000..2a61a1c6f7 --- /dev/null +++ b/packages/forms/resources/js/components/select.js @@ -0,0 +1,183 @@ +export default (Alpine) => { + Alpine.data('selectFormComponent', ({ + getOptionLabelUsing, + getSearchResultsUsing, + isAutofocused, + options, + state, + }) => { + return { + focusedOptionIndex: null, + + isLoading: false, + + isOpen: false, + + label: null, + + options, + + search: '', + + state, + + init: async function () { + if (isAutofocused) { + this.openListbox() + } + + this.label = await getOptionLabelUsing() + + if (this.state !== null) { + this.state = this.state.toString() + } + + this.$watch('search', async () => { + if (! this.isOpen || this.search === '' || this.search === null) { + this.options = options + this.focusedOptionIndex = 0 + + return + } + + if (Object.keys(options).length) { + this.options = {} + + let search = this.search.trim().toLowerCase() + + for (let key in options) { + if (options[key].trim().toLowerCase().includes(search)) { + this.options[key] = options[key] + } + } + + this.focusedOptionIndex = 0 + } else { + this.isLoading = true + this.options = await getSearchResultsUsing(this.search) + this.focusedOptionIndex = 0 + this.isLoading = false + } + }) + + this.$watch('state', async () => { + this.label = await getOptionLabelUsing() + }) + }, + + clearState: function () { + this.state = null + this.label = null + + this.closeListbox() + }, + + closeListbox: function () { + this.isOpen = false + + this.focusedOptionIndex = null + + this.search = '' + }, + + evaluatePosition: function () { + let availableHeight = window.innerHeight - this.$refs.button.offsetHeight + + let element = this.$refs.button + + while (element) { + availableHeight -= element.offsetTop + + element = element.offsetParent + } + + if (this.$refs.listbox.offsetHeight <= availableHeight) { + this.$refs.listbox.style.bottom = 'auto' + + return + } + + this.$refs.listbox.style.bottom = `${this.$refs.button.offsetHeight}px` + }, + + focusNextOption: function () { + if (this.focusedOptionIndex === null) { + this.focusedOptionIndex = Object.keys(this.options).length - 1 + + return + } + + if (this.focusedOptionIndex + 1 >= Object.keys(this.options).length) { + return + } + + this.focusedOptionIndex++ + + this.$refs.listboxOptionsList.children[this.focusedOptionIndex].scrollIntoView({ + block: 'center', + }) + }, + + focusPreviousOption: function () { + if (this.focusedOptionIndex === null) { + this.focusedOptionIndex = 0 + + return + } + + if (this.focusedOptionIndex <= 0) { + return + } + + this.focusedOptionIndex-- + + this.$refs.listboxOptionsList.children[this.focusedOptionIndex].scrollIntoView({ + block: 'center', + }) + }, + + openListbox: function () { + this.focusedOptionIndex = Object.keys(this.options).indexOf(this.state) + + if (this.focusedOptionIndex < 0) { + this.focusedOptionIndex = 0 + } + + this.isOpen = true + + this.$nextTick(() => { + this.$refs.search.focus() + + this.evaluatePosition() + + this.$refs.listboxOptionsList.children[this.focusedOptionIndex].scrollIntoView({ + block: 'center' + }) + }) + }, + + selectOption: function (index = null) { + if (! this.isOpen) { + this.closeListbox() + + return + } + + this.state = Object.keys(this.options)[index ?? this.focusedOptionIndex] + this.label = this.options[this.state] + + this.closeListbox() + }, + + toggleListboxVisibility: function () { + if (this.isOpen) { + this.closeListbox() + + return + } + + this.openListbox() + }, + } + }) +} diff --git a/packages/forms/resources/js/components/tags-input.js b/packages/forms/resources/js/components/tags-input.js new file mode 100644 index 0000000000..6daa36536e --- /dev/null +++ b/packages/forms/resources/js/components/tags-input.js @@ -0,0 +1,33 @@ +export default (Alpine) => { + Alpine.data('tagsInputFormComponent', ({ + state, + }) => { + return { + newTag: '', + + state, + + createTag: function () { + this.newTag = this.newTag.trim() + + if (this.newTag === '') { + return + } + + if (this.state.includes(this.newTag)) { + this.newTag = '' + + return + } + + this.state.push(this.newTag) + + this.newTag = '' + }, + + deleteTag: function (tagToDelete) { + this.state = this.state.filter((tag) => tag !== tagToDelete) + }, + } + }) +} diff --git a/packages/forms/resources/js/components/text-input.js b/packages/forms/resources/js/components/text-input.js new file mode 100644 index 0000000000..6260aff033 --- /dev/null +++ b/packages/forms/resources/js/components/text-input.js @@ -0,0 +1,32 @@ +import IMask from 'imask' + +export default (Alpine) => { + Alpine.data('textInputFormComponent', ({ + getMaskOptionsUsing, + state, + }) => { + return { + mask: null, + + state, + + init: function () { + if (! getMaskOptionsUsing) { + return + } + + if (this.state) { + this.$el.value = this.state?.valueOf() + } + + this.mask = IMask(this.$el, getMaskOptionsUsing(IMask)).on('accept', () => { + this.state = this.mask.unmaskedValue + }) + + this.$watch('state', () => { + this.mask.unmaskedValue = this.state?.valueOf() + }) + } + } + }) +} diff --git a/packages/forms/resources/js/components/textarea.js b/packages/forms/resources/js/components/textarea.js new file mode 100644 index 0000000000..31c5770f6b --- /dev/null +++ b/packages/forms/resources/js/components/textarea.js @@ -0,0 +1,14 @@ +export default (Alpine) => { + Alpine.data('textareaFormComponent', () => ({ + init: function () { + this.render() + }, + + render: function () { + if (this.$el.scrollHeight > 0) { + this.$el.style.height = '150px' + this.$el.style.height = this.$el.scrollHeight + 'px' + } + }, + })) +} diff --git a/packages/forms/resources/js/index.js b/packages/forms/resources/js/index.js new file mode 100644 index 0000000000..e65d55a263 --- /dev/null +++ b/packages/forms/resources/js/index.js @@ -0,0 +1,36 @@ +import DateTimePickerFormComponentAlpinePlugin from './components/date-time-picker' +import FileUploadFormComponentAlpinePlugin from './components/file-upload' +import KeyValueFormComponentAlpinePlugin from './components/key-value' +import MarkdownEditorFormComponentAlpinePlugin from './components/markdown-editor' +import MultiSelectFormComponentAlpinePlugin from './components/multi-select' +import RichEditorFormComponentAlpinePlugin from './components/rich-editor' +import SelectFormComponentAlpinePlugin from './components/select' +import TagsInputFormComponentAlpinePlugin from './components/tags-input' +import TextInputFormComponentAlpinePlugin from './components/text-input' +import TextareaFormComponentAlpinePlugin from './components/textarea' + +export default (Alpine) => { + Alpine.plugin(DateTimePickerFormComponentAlpinePlugin) + Alpine.plugin(FileUploadFormComponentAlpinePlugin) + Alpine.plugin(KeyValueFormComponentAlpinePlugin) + Alpine.plugin(MarkdownEditorFormComponentAlpinePlugin) + Alpine.plugin(MultiSelectFormComponentAlpinePlugin) + Alpine.plugin(RichEditorFormComponentAlpinePlugin) + Alpine.plugin(SelectFormComponentAlpinePlugin) + Alpine.plugin(TagsInputFormComponentAlpinePlugin) + Alpine.plugin(TextInputFormComponentAlpinePlugin) + Alpine.plugin(TextareaFormComponentAlpinePlugin) +} + +export { + DateTimePickerFormComponentAlpinePlugin, + FileUploadFormComponentAlpinePlugin, + KeyValueFormComponentAlpinePlugin, + MarkdownEditorFormComponentAlpinePlugin, + MultiSelectFormComponentAlpinePlugin, + RichEditorFormComponentAlpinePlugin, + SelectFormComponentAlpinePlugin, + TagsInputFormComponentAlpinePlugin, + TextInputFormComponentAlpinePlugin, + TextareaFormComponentAlpinePlugin +} diff --git a/packages/forms/resources/lang/ar/components.php b/packages/forms/resources/lang/ar/components.php new file mode 100644 index 0000000000..1553e4e509 --- /dev/null +++ b/packages/forms/resources/lang/ar/components.php @@ -0,0 +1,59 @@ + [ + 'no_search_results_message' => 'لا توجد خيارات تطابق بحثك.', + 'placeholder' => 'إختر خيارًا', + 'search_prompt' => 'لا توجد خيارات للاختيار من بينها.', + ], + + 'rich_editor' => [ + + 'dialogs' => [ + + 'link' => [ + + 'buttons' => [ + 'link' => 'ربط', + 'unlink' => 'فصل', + ], + + 'label' => 'عنوان url', + + 'placeholder' => 'إدخل عنوان url', + + ], + + ], + + 'toolbar_buttons' => [ + 'attach_files' => 'إرفاق ملفات', + 'blockquote' => 'اقتباس', + 'bold' => 'عريض', + 'bullet_list' => 'نقاط', + 'code_block' => 'كود', + 'h1' => 'عنوان', + 'h2' => 'عنوان', + 'h3' => 'عنوان فرعي', + 'italic' => 'مائل', + 'link' => 'رابط', + 'ordered_list' => 'أرقام', + 'redo' => 'إعادة', + 'strike' => 'يتوسطه خط', + 'undo' => 'تراجع', + ], + + ], + + 'select' => [ + 'no_search_results_message' => 'لا توجد خيارات تطابق بحثك.', + 'placeholder' => 'إختر خيارًا', + 'search_prompt' => 'ابدأ الكتابة للبحث ...', + ], + + 'tags_input' => [ + 'placeholder' => 'كلمة مفتاحية جديدة', + ], + +]; diff --git a/packages/forms/resources/lang/ca/components.php b/packages/forms/resources/lang/ca/components.php new file mode 100644 index 0000000000..1f7835ac6c --- /dev/null +++ b/packages/forms/resources/lang/ca/components.php @@ -0,0 +1,59 @@ + [ + 'no_search_results_message' => 'No s\'ha trobat cap opció que coincideixi amb la vostra cerca.', + 'placeholder' => 'Trieu una opció', + 'search_prompt' => 'No hi ha opcions disponibles', + ], + + 'rich_editor' => [ + + 'dialogs' => [ + + 'link' => [ + + 'buttons' => [ + 'link' => 'Enllaç', + 'unlink' => 'Elimina l\'enllaç', + ], + + 'label' => 'URL', + + 'placeholder' => 'Escriu una adreça URL', + + ], + + ], + + 'toolbar_buttons' => [ + 'attach_files' => 'Adjuntar fitxers', + 'blockquote' => 'Bloc de cita', + 'bold' => 'Negreta', + 'bullet_list' => 'Bullets', + 'code_block' => 'Codi', + 'h1' => 'Títol', + 'h2' => 'Capçaleres', + 'h3' => 'Subtítol', + 'italic' => 'Cursiva', + 'link' => 'Enllaç', + 'ordered_list' => 'Números', + 'redo' => 'Refés', + 'strike' => 'Barrat', + 'undo' => 'Desfer', + ], + + ], + + 'select' => [ + 'no_search_results_message' => 'No s\'ha trobat cap opció que coincideixi amb la vostra cerca', + 'placeholder' => 'Trieu una opció', + 'search_prompt' => 'Comenceu a escriure per cercar...', + ], + + 'tags_input' => [ + 'placeholder' => 'Nova Etiqueta', + ], + +]; diff --git a/packages/forms/resources/lang/da/components.php b/packages/forms/resources/lang/da/components.php new file mode 100644 index 0000000000..6a5ea688ce --- /dev/null +++ b/packages/forms/resources/lang/da/components.php @@ -0,0 +1,59 @@ + [ + 'no_search_results_message' => 'Ingen resultater der matcher din søgning.', + 'placeholder' => 'Vælg en indstilling', + 'search_prompt' => 'Ingen muligheder at vælge imellem.', + ], + + 'rich_editor' => [ + + 'dialogs' => [ + + 'link' => [ + + 'buttons' => [ + 'link' => 'Link', + 'unlink' => 'Fjern link', + ], + + 'label' => 'URL', + + 'placeholder' => 'Indtast en URL', + + ], + + ], + + 'toolbar_buttons' => [ + 'attach_files' => 'Vedhæft filer', + 'blockquote' => 'Citere', + 'bold' => 'Fed', + 'bullet_list' => 'Punkter', + 'code_block' => 'Kode', + 'h1' => 'Titel', + 'h2' => 'Overskrift', + 'h3' => 'Underoverskrift', + 'italic' => 'Kursiv', + 'link' => 'Link', + 'ordered_list' => 'Tal', + 'redo' => 'Gentag', + 'strike' => 'Gennemstreget', + 'undo' => 'Fortryd', + ], + + ], + + 'select' => [ + 'no_search_results_message' => 'Ingen muligheder der matcher din søgning.', + 'placeholder' => 'Vælg en indstilling', + 'search_prompt' => 'Begynd at skrive for at søge ...', + ], + + 'tags_input' => [ + 'placeholder' => 'Ny mærkat', + ], + +]; diff --git a/packages/forms/resources/lang/de/components.php b/packages/forms/resources/lang/de/components.php new file mode 100644 index 0000000000..a23ef8ee1f --- /dev/null +++ b/packages/forms/resources/lang/de/components.php @@ -0,0 +1,59 @@ + [ + 'no_search_results_message' => 'Keine Optionen passen zu Ihrer Suche.', + 'placeholder' => 'Wählen Sie eine Option', + 'search_prompt' => 'Es stehen keine Optionen zur Auswahl.', + ], + + 'rich_editor' => [ + + 'dialogs' => [ + + 'link' => [ + + 'buttons' => [ + 'link' => 'Verlinken', + 'unlink' => 'Verlinkung aufheben', + ], + + 'label' => 'URL', + + 'placeholder' => 'URL eingeben', + + ], + + ], + + 'toolbar_buttons' => [ + 'attach_files' => 'Dateien anhängen', + 'blockquote' => 'Zitat', + 'bold' => 'Fett', + 'bullet_list' => 'Aufzählung', + 'code_block' => 'codeBlock', + 'h1' => 'Titel', + 'h2' => 'Überschrift', + 'h3' => 'Unterüberschrift', + 'italic' => 'kursiv', + 'link' => 'Link', + 'ordered_list' => 'Nummerierte Aufzählung', + 'redo' => 'Wiederholen', + 'strike' => 'Durchgestrichen', + 'undo' => 'Rückgängig', + ], + + ], + + 'select' => [ + 'no_search_results_message' => 'Keine Optionen passen zu Ihrer Suche.', + 'placeholder' => 'Wählen Sie eine Option', + 'search_prompt' => 'Beginnen Sie mit der Eingabe, um zu suchen...', + ], + + 'tags_input' => [ + 'placeholder' => 'Neues Etikett', + ], + +]; diff --git a/packages/forms/resources/lang/en/components.php b/packages/forms/resources/lang/en/components.php new file mode 100644 index 0000000000..5b1a2dc8ae --- /dev/null +++ b/packages/forms/resources/lang/en/components.php @@ -0,0 +1,156 @@ + [ + + 'buttons' => [ + + 'create_item' => [ + 'label' => 'Add to :label', + ], + + 'create_item_between' => [ + 'label' => 'Add between', + ], + + 'delete_item' => [ + 'label' => 'Delete', + ], + + 'move_item_down' => [ + 'label' => 'Move down', + ], + + 'move_item_up' => [ + 'label' => 'Move up', + ], + + ], + + ], + + 'key_value' => [ + + 'buttons' => [ + + 'add' => [ + 'label' => 'Add Row', + ], + + 'delete' => [ + 'label' => 'Delete Row', + ], + + ], + + 'fields' => [ + + 'key' => [ + 'label' => 'Key', + ], + + 'value' => [ + 'label' => 'Value', + ], + + ], + + ], + + 'markdown_editor' => [ + + 'toolbar_buttons' => [ + 'attach_files' => 'Attach files', + 'bold' => 'Bold', + 'bullet_list' => 'Bullet list', + 'code_block' => 'Code block', + 'edit' => 'Edit', + 'italic' => 'Italic', + 'link' => 'Link', + 'ordered_list' => 'Numbered list', + 'preview' => 'Preview', + 'strike' => 'Strikethrough', + ], + + ], + + 'multi_select' => [ + 'no_search_results_message' => 'No options match your search.', + 'placeholder' => 'Select an option', + 'search_prompt' => 'Start typing to search...', + ], + + 'repeater' => [ + + 'buttons' => [ + + 'create_item' => [ + 'label' => 'Add to :label', + ], + + 'delete_item' => [ + 'label' => 'Delete', + ], + + 'move_item_down' => [ + 'label' => 'Move down', + ], + + 'move_item_up' => [ + 'label' => 'Move up', + ], + + ], + + ], + + 'rich_editor' => [ + + 'dialogs' => [ + + 'link' => [ + + 'buttons' => [ + 'link' => 'Link', + 'unlink' => 'Unlink', + ], + + 'label' => 'URL', + + 'placeholder' => 'Enter a URL', + + ], + + ], + + 'toolbar_buttons' => [ + 'attach_files' => 'Attach files', + 'blockquote' => 'Blockquote', + 'bold' => 'Bold', + 'bullet_list' => 'Bullet list', + 'code_block' => 'Code block', + 'h1' => 'Title', + 'h2' => 'Heading', + 'h3' => 'Subheading', + 'italic' => 'Italic', + 'link' => 'Link', + 'ordered_list' => 'Numbered list', + 'redo' => 'Redo', + 'strike' => 'Strikethrough', + 'undo' => 'Undo', + ], + + ], + + 'select' => [ + 'no_search_results_message' => 'No options match your search.', + 'placeholder' => 'Select an option', + 'search_prompt' => 'Start typing to search...', + ], + + 'tags_input' => [ + 'placeholder' => 'New tag', + ], + +]; diff --git a/packages/forms/resources/lang/es/components.php b/packages/forms/resources/lang/es/components.php new file mode 100644 index 0000000000..58644474b4 --- /dev/null +++ b/packages/forms/resources/lang/es/components.php @@ -0,0 +1,104 @@ + [ + + 'buttons' => [ + + 'add' => [ + 'label' => 'Añadir Fila', + ], + + 'delete' => [ + 'label' => 'Eliminar Fila', + ], + + ], + + 'fields' => [ + + 'key' => [ + 'label' => 'Clave', + ], + + 'value' => [ + 'label' => 'Valor', + ], + + ], + + ], + + 'markdown_editor' => [ + + 'toolbar_buttons' => [ + 'attach_files' => 'Adjuntar archivos', + 'bold' => 'Negrita', + 'bullet_list' => 'Viñetas', + 'code_block' => 'Código', + 'edit' => 'Escribir', + 'italic' => 'Cursiva', + 'link' => 'Link', + 'ordered_list' => 'Números', + 'preview' => 'Vista previa', + 'strike' => 'Tachado', + ], + + ], + + 'multi_select' => [ + 'no_search_results_message' => 'No se encontranron coincidencias con su búsqueda.', + 'placeholder' => 'Seleccionar una opción', + 'search_prompt' => 'No hay opciones para elegir.', + ], + + 'rich_editor' => [ + + 'dialogs' => [ + + 'link' => [ + + 'buttons' => [ + 'link' => 'Link', + 'unlink' => 'Unlink', + ], + + 'label' => 'URL', + + 'placeholder' => 'Insertar una URL', + + ], + + ], + + 'toolbar_buttons' => [ + 'attach_files' => 'Adjuntar archivos', + 'blockquote' => 'Cita', + 'bold' => 'Negrita', + 'bullet_list' => 'Viñetas', + 'code_block' => 'Código', + 'h1' => 'Título', + 'h2' => 'Encabezado', + 'h3' => 'Subtítulo', + 'italic' => 'Cursiva', + 'link' => 'Link', + 'ordered_list' => 'Números', + 'redo' => 'Rehacer', + 'strike' => 'Tachado', + 'undo' => 'Deshacer', + ], + + ], + + 'select' => [ + 'no_search_results_message' => 'No se encontraron coincidencias con su búsqueda.', + 'placeholder' => 'Selecciona una opción', + 'search_prompt' => 'Escribe para buscar...', + ], + + 'tags_input' => [ + 'placeholder' => 'Nueva etiqueta', + ], + +]; diff --git a/packages/forms/resources/lang/fa/components.php b/packages/forms/resources/lang/fa/components.php new file mode 100644 index 0000000000..6a5db85404 --- /dev/null +++ b/packages/forms/resources/lang/fa/components.php @@ -0,0 +1,104 @@ + [ + + 'buttons' => [ + + 'add' => [ + 'label' => 'اضافه ردیف', + ], + + 'delete' => [ + 'label' => 'حذف ریدیف', + ], + + ], + + 'fields' => [ + + 'key' => [ + 'label' => 'کلید', + ], + + 'value' => [ + 'label' => 'مقدار', + ], + + ], + + ], + + 'markdown_editor' => [ + + 'toolbar_buttons' => [ + 'attach_files' => 'پوستن فایلها', + 'bold' => 'پر رنگ', + 'bullet_list' => 'گولوله', + 'code_block' => 'کود', + 'edit' => 'نوشتن', + 'italic' => 'خوابیده', + 'link' => 'ارتباط', + 'ordered_list' => 'اعداد', + 'preview' => 'پیش نمایش', + 'strike' => 'خط زده', + ], + + ], + + 'multi_select' => [ + 'no_search_results_message' => 'هیچ گزینه ای با جستجوی شما مطابقت ندارد', + 'placeholder' => 'یک گزینه را انتخاب کنید', + 'search_prompt' => 'برای جستجو تایپ کنید...', + ], + + 'rich_editor' => [ + + 'dialogs' => [ + + 'link' => [ + + 'buttons' => [ + 'link' => 'ارتباط', + 'unlink' => 'لغو ارتباط', + ], + + 'label' => 'آدرس انترنیتی', + + 'placeholder' => 'یک آدرس انترنیتی وارید کنید', + + ], + + ], + + 'toolbar_buttons' => [ + 'attach_files' => 'پیوستن فایلها', + 'blockquote' => 'نقل قول', + 'bold' => 'پررنگ', + 'bullet_list' => 'گولوله', + 'code_block' => 'کود', + 'h1' => 'عنوان', + 'h2' => 'عنوان برجسته', + 'h3' => 'زیرنویس', + 'italic' => 'خوابیده', + 'link' => 'ارتباط', + 'ordered_list' => 'اعداد', + 'redo' => 'انجام مجدد', + 'strike' => 'خط زده', + 'undo' => 'واگرد', + ], + + ], + + 'select' => [ + 'no_search_results_message' => 'هیچ گزینه ای با جستجوی شما مطابقت ندارد', + 'placeholder' => 'یک گزینه را انتخاب کنید', + 'search_prompt' => 'برای جستجو تایپ کنید...', + ], + + 'tags_input' => [ + 'placeholder' => 'تگ جدید', + ], + +]; diff --git a/packages/forms/resources/lang/fr/components.php b/packages/forms/resources/lang/fr/components.php new file mode 100644 index 0000000000..3c972f47a3 --- /dev/null +++ b/packages/forms/resources/lang/fr/components.php @@ -0,0 +1,59 @@ + [ + 'no_search_results_message' => 'Aucune option ne correspond à votre recherche.', + 'placeholder' => 'Sélectionnez une option', + 'search_prompt' => 'Aucune option à choisir.', + ], + + 'rich_editor' => [ + + 'dialogs' => [ + + 'link' => [ + + 'buttons' => [ + 'link' => 'Lien', + 'unlink' => 'Dissocier', + ], + + 'label' => 'URL', + + 'placeholder' => 'Entrez une URL', + + ], + + ], + + 'toolbar_buttons' => [ + 'attach_files' => 'Joindre fichiers', + 'blockquote' => 'Citation', + 'bold' => 'Gras', + 'bullet_list' => 'Points', + 'code_block' => 'codeBlock', + 'h1' => 'Titre', + 'h2' => 'Titre', + 'h3' => 'Sous-titre', + 'italic' => 'Italique', + 'link' => 'Lien', + 'ordered_list' => 'Nombres', + 'redo' => 'Refaire', + 'strike' => 'Barré', + 'undo' => 'Annuler', + ], + + ], + + 'select' => [ + 'no_search_results_message' => 'Aucune option ne correspond à votre recherche.', + 'placeholder' => 'Sélectionnez une option', + 'search_prompt' => 'Commencez à taper pour rechercher...', + ], + + 'tags_input' => [ + 'placeholder' => 'Nouveau tag', + ], + +]; diff --git a/packages/forms/resources/lang/id/components.php b/packages/forms/resources/lang/id/components.php new file mode 100644 index 0000000000..4162f66488 --- /dev/null +++ b/packages/forms/resources/lang/id/components.php @@ -0,0 +1,59 @@ + [ + 'no_search_results_message' => 'Tidak ada opsi yang sesuai pencarian anda.', + 'placeholder' => 'Pilih Opsi', + 'search_prompt' => 'Tidak ada opsi yang bisa dipilih.', + ], + + 'rich_editor' => [ + + 'dialogs' => [ + + 'link' => [ + + 'buttons' => [ + 'link' => 'Tautan', + 'unlink' => 'Batalkan tautan', + ], + + 'label' => 'Tautan', + + 'placeholder' => 'Masukkan tautan', + + ], + + ], + + 'toolbar_buttons' => [ + 'attach_files' => 'Lampirkan File', + 'blockquote' => 'Quote', + 'bold' => 'Bold', + 'bullet_list' => 'bullet_list', + 'code_block' => 'Kode', + 'h1' => 'Judul', + 'h2' => 'Judul', + 'h3' => 'Anak judul', + 'italic' => 'Italic', + 'link' => 'Tautan', + 'ordered_list' => 'Nomor', + 'redo' => 'Redo', + 'strike' => 'Coret', + 'undo' => 'Undo', + ], + + ], + + 'select' => [ + 'no_search_results_message' => 'Tidak ada opsi yang sesuai pencarian anda.', + 'placeholder' => 'Pilih salah satu opsi', + 'search_prompt' => 'Mulai mengetik untuk mencari...', + ], + + 'tags_input' => [ + 'placeholder' => 'Tag baru', + ], + +]; diff --git a/packages/forms/resources/lang/it/components.php b/packages/forms/resources/lang/it/components.php new file mode 100644 index 0000000000..f031073f65 --- /dev/null +++ b/packages/forms/resources/lang/it/components.php @@ -0,0 +1,59 @@ + [ + 'no_search_results_message' => 'Nessuna opzione trovata per la ricerca.', + 'placeholder' => 'Seleziona un\'opzione', + 'search_prompt' => 'Nessuna opzione disponibile.', + ], + + 'rich_editor' => [ + + 'dialogs' => [ + + 'link' => [ + + 'buttons' => [ + 'link' => 'Collega', + 'unlink' => 'Rimuovi', + ], + + 'label' => 'URL', + + 'placeholder' => 'Inserisci un URL', + + ], + + ], + + 'toolbar_buttons' => [ + 'attach_files' => 'Allega file', + 'blockquote' => 'Citazione', + 'bold' => 'Grassetto', + 'bullet_list' => 'Elenco puntato', + 'code_block' => 'Codice', + 'h1' => 'Titolo', + 'h2' => 'Testata', + 'h3' => 'Sottotestata', + 'italic' => 'Corsivo', + 'link' => 'Link', + 'ordered_list' => 'Numeri', + 'redo' => 'Rifai', + 'strike' => 'Barrato', + 'undo' => 'Annulla', + ], + + ], + + 'select' => [ + 'no_search_results_message' => 'Nessuna opzione trovata per la ricerca.', + 'placeholder' => 'Seleziona un\'opzione', + 'search_prompt' => 'Digita per cercare...', + ], + + 'tags_input' => [ + 'placeholder' => 'Nuovo tag', + ], + +]; diff --git a/packages/forms/resources/lang/ka/components.php b/packages/forms/resources/lang/ka/components.php new file mode 100644 index 0000000000..0b306219c0 --- /dev/null +++ b/packages/forms/resources/lang/ka/components.php @@ -0,0 +1,59 @@ + [ + 'no_search_results_message' => 'ამ პარამეტრებით არცერთი ჩანაწერი არ მოიძებნა.', + 'placeholder' => 'აირჩიეთ ჩანაწერი', + 'search_prompt' => 'ჩანაწერების სია ცარიელია.', + ], + + 'rich_editor' => [ + + 'dialogs' => [ + + 'link' => [ + + 'buttons' => [ + 'link' => 'დამატება', + 'unlink' => 'გაუქმება', + ], + + 'label' => 'ლინკი', + + 'placeholder' => 'ჩაწერეთ URL მისამართი', + + ], + + ], + + 'toolbar_buttons' => [ + 'attach_files' => 'ფაილების დამატება', + 'blockquote' => 'ციტატა', + 'bold' => 'მსხვილი', + 'bullet_list' => 'სია', + 'code_block' => 'კოდი', + 'h1' => 'სათაური', + 'h2' => 'სათაური', + 'h3' => 'ქვესათაური', + 'italic' => 'დახრილი', + 'link' => 'ლინკი', + 'ordered_list' => 'რიცხვები', + 'redo' => 'Redo', + 'strike' => 'ხაზგადასმული', + 'undo' => 'Undo', + ], + + ], + + 'select' => [ + 'no_search_results_message' => 'ამ პარამეტრებით არცერთი ჩანაწერი არ მოიძებნა.', + 'placeholder' => 'აირჩიეთ ჩანაწერი', + 'search_prompt' => 'ძიება...', + ], + + 'tags_input' => [ + 'placeholder' => 'ახალი ტეგი', + ], + +]; diff --git a/packages/forms/resources/lang/ku/components.php b/packages/forms/resources/lang/ku/components.php new file mode 100644 index 0000000000..914c81ff4e --- /dev/null +++ b/packages/forms/resources/lang/ku/components.php @@ -0,0 +1,104 @@ + [ + + 'buttons' => [ + + 'add' => [ + 'label' => 'زیادکردنی ڕیز', + ], + + 'delete' => [ + 'label' => 'سڕینەوەی ڕیز', + ], + + ], + + 'fields' => [ + + 'key' => [ + 'label' => 'کلیل', + ], + + 'value' => [ + 'label' => 'Value', + ], + + ], + + ], + + 'markdown_editor' => [ + + 'toolbar_buttons' => [ + 'attach_files' => 'لکاندنی فایل', + 'bold' => 'ڕەشکردن', + 'bullet_list' => 'خاڵ', + 'code_block' => 'جۆد', + 'edit' => 'نوسین', + 'italic' => 'لارکردنەوە', + 'link' => 'لینک', + 'ordered_list' => 'ژمارە', + 'preview' => 'بینین', + 'strike' => 'هێڵ بەسەردا', + ], + + ], + + 'multi_select' => [ + 'no_search_results_message' => 'هیچ هەڵبژاردەیەک نییە وەک گەڕانەکەت.', + 'placeholder' => 'هەڵبژاردەیەک دیاریبکە', + 'search_prompt' => 'هیچ هەڵبژاردەیەک نییە تا دیاریبکەیت', + ], + + 'rich_editor' => [ + + 'dialogs' => [ + + 'link' => [ + + 'buttons' => [ + 'link' => 'لینک', + 'unlink' => 'لیکن لابردن', + ], + + 'label' => 'لینک', + + 'placeholder' => 'لینکێک بنوسە', + + ], + + ], + + 'toolbar_buttons' => [ + 'attach_files' => 'لکاندنی فایل', + 'blockquote' => 'کۆت', + 'bold' => 'ڕەشکردن', + 'bullet_list' => 'خاڵ', + 'code_block' => 'کۆد', + 'h1' => 'ناونیشان', + 'h2' => 'هێدەر', + 'h3' => 'ژێر هێدەر', + 'italic' => 'لارکردنەوە', + 'link' => 'لینک', + 'ordered_list' => 'ژمارە', + 'redo' => 'بیکەرەوە', + 'strike' => 'هێڵ بەسەردا', + 'undo' => 'گەڕانەوە', + ], + + ], + + 'select' => [ + 'no_search_results_message' => 'هیچ هەڵبژاردەیەک نەدۆزرایەوە بۆ گەڕانەکەت.', + 'placeholder' => 'هەڵبژاردەیەک دیاری بکە', + 'search_prompt' => 'دەستبکە بە نوسین بۆ گەڕان ...', + ], + + 'tags_input' => [ + 'placeholder' => 'تاگی نوێ', + ], + +]; diff --git a/packages/forms/resources/lang/nl/components.php b/packages/forms/resources/lang/nl/components.php new file mode 100644 index 0000000000..03e6fd1b9b --- /dev/null +++ b/packages/forms/resources/lang/nl/components.php @@ -0,0 +1,59 @@ + [ + 'no_search_results_message' => 'Er zijn geen resultaten voor je zoekopdracht.', + 'placeholder' => 'Selecteer een optie', + 'search_prompt' => 'Geen opties om te selecteren.', + ], + + 'rich_editor' => [ + + 'dialogs' => [ + + 'link' => [ + + 'buttons' => [ + 'link' => 'Link', + 'unlink' => 'Unlink', + ], + + 'label' => 'URL', + + 'placeholder' => 'Voer een URL in', + + ], + + ], + + 'toolbar_buttons' => [ + 'attach_files' => 'Voeg bestanden toe', + 'blockquote' => 'Quote', + 'bold' => 'Dikgedrukt', + 'bullet_list' => 'Bullets', + 'code_block' => 'codeBlock', + 'h1' => 'Titel', + 'h2' => 'Hoofdtekst', + 'h3' => 'Sub hoofdtekst', + 'italic' => 'Schuingedrukt', + 'link' => 'Link', + 'ordered_list' => 'Nummers', + 'redo' => 'Opnieuw doen', + 'strike' => 'Doorgehaald', + 'undo' => 'Ongedaan maken', + ], + + ], + + 'select' => [ + 'no_search_results_message' => 'Er zijn geen resultaten voor je zoekopdracht.', + 'placeholder' => 'Selecteer een optie', + 'search_prompt' => 'Start met typen om te zoeken...', + ], + + 'tags_input' => [ + 'placeholder' => 'Nieuwe tag', + ], + +]; diff --git a/packages/forms/resources/lang/pt-br/components.php b/packages/forms/resources/lang/pt-br/components.php new file mode 100644 index 0000000000..f03bc5c220 --- /dev/null +++ b/packages/forms/resources/lang/pt-br/components.php @@ -0,0 +1,59 @@ + [ + 'no_search_results_message' => 'Nenhuma opção corresponde à sua pesquisa.', + 'placeholder' => 'Selecione uma opção', + 'search_prompt' => 'Sem opções disponívels.', + ], + + 'rich_editor' => [ + + 'dialogs' => [ + + 'link' => [ + + 'buttons' => [ + 'link' => 'Link', + 'unlink' => 'Unlink', + ], + + 'label' => 'URL', + + 'placeholder' => 'Digite uma URL', + + ], + + ], + + 'toolbar_buttons' => [ + 'attach_files' => 'Anexar arquivos', + 'blockquote' => 'Citar', + 'bold' => 'Negrito', + 'bullet_list' => 'Marcadores', + 'code_block' => 'codeBlock', + 'h1' => 'Título', + 'h2' => 'Cabeçalho', + 'h3' => 'Subtítulo', + 'italic' => 'Itálico', + 'link' => 'Link', + 'ordered_list' => 'Números', + 'redo' => 'Refazer', + 'strike' => 'Tachado', + 'undo' => 'Desfazer', + ], + + ], + + 'select' => [ + 'no_search_results_message' => 'Nenhuma opção corresponde à sua pesquisa.', + 'placeholder' => 'Selecione uma opção', + 'search_prompt' => 'Comece a digitar para pesquisar...', + ], + + 'tags_input' => [ + 'placeholder' => 'Novo rótulo', + ], + +]; diff --git a/packages/forms/resources/lang/ru/components.php b/packages/forms/resources/lang/ru/components.php new file mode 100644 index 0000000000..f568dbcd74 --- /dev/null +++ b/packages/forms/resources/lang/ru/components.php @@ -0,0 +1,59 @@ + [ + 'no_search_results_message' => 'не найдено результатов по вашему поиску.', + 'placeholder' => 'выберите опцию', + 'search_prompt' => 'не найдено вариантов для выбора.', + ], + + 'rich_editor' => [ + + 'dialogs' => [ + + 'link' => [ + + 'buttons' => [ + 'link' => 'ссылка', + 'unlink' => 'Убрать ссылку', + ], + + 'label' => 'URL', + + 'placeholder' => 'Введите URL', + + ], + + ], + + 'toolbar_buttons' => [ + 'attach_files' => 'Прикрепить файлы', + 'blockquote' => 'Цитата', + 'bold' => 'Жирный', + 'bullet_list' => 'маркировочный список', + 'code_block' => 'код', + 'h1' => 'заглавие', + 'h2' => 'заголовок', + 'h3' => 'подзаголовок', + 'italic' => 'Курсив', + 'link' => 'ссылка', + 'ordered_list' => 'нумерованный список', + 'redo' => 'Повторить', + 'strike' => 'Зачеркнутый', + 'undo' => 'Отменить', + ], + + ], + + 'select' => [ + 'no_search_results_message' => 'не найдено результатов по вашему поиску', + 'placeholder' => 'выберите опцию', + 'search_prompt' => 'введите текст для поиска', + ], + + 'tags_input' => [ + 'placeholder' => 'новый тег', + ], + +]; diff --git a/packages/forms/resources/lang/sv/components.php b/packages/forms/resources/lang/sv/components.php new file mode 100644 index 0000000000..ab2d9916d9 --- /dev/null +++ b/packages/forms/resources/lang/sv/components.php @@ -0,0 +1,104 @@ + [ + + 'buttons' => [ + + 'add' => [ + 'label' => 'Ny Rad', + ], + + 'delete' => [ + 'label' => 'Radera Rad', + ], + + ], + + 'fields' => [ + + 'key' => [ + 'label' => 'Namn', + ], + + 'value' => [ + 'label' => 'Värde', + ], + + ], + + ], + + 'markdown_editor' => [ + + 'toolbar_buttons' => [ + 'attach_files' => 'Lägg till filer', + 'bold' => 'Fet', + 'bullet_list' => 'Lista', + 'code_block' => 'Kod', + 'edit' => 'Skriv', + 'italic' => 'Kursiv', + 'link' => 'Länk', + 'ordered_list' => 'Nummer', + 'preview' => 'Förhandsvisa', + 'strike' => 'Överstruken', + ], + + ], + + 'multi_select' => [ + 'no_search_results_message' => 'Hittade inget som matchade din sökning.', + 'placeholder' => 'Välj ett alternativ', + 'search_prompt' => 'Finns inga alternativ.', + ], + + 'rich_editor' => [ + + 'dialogs' => [ + + 'link' => [ + + 'buttons' => [ + 'link' => 'Länka', + 'unlink' => 'Radera länk', + ], + + 'label' => 'URL', + + 'placeholder' => 'Ange en URL', + + ], + + ], + + 'toolbar_buttons' => [ + 'attach_files' => 'Lägg till filer', + 'blockquote' => 'Citat', + 'bold' => 'Fet', + 'bullet_list' => 'Lista', + 'code_block' => 'Kod', + 'h1' => 'Titel', + 'h2' => 'Rubrik', + 'h3' => 'Underrubrik', + 'italic' => 'Kursiv', + 'link' => 'Länk', + 'ordered_list' => 'Nummer', + 'redo' => 'Igen', + 'strike' => 'Överstruken', + 'undo' => 'Ångra', + ], + + ], + + 'select' => [ + 'no_search_results_message' => 'Hittar inget som matchar din sökning.', + 'placeholder' => 'Välj ett alternativ', + 'search_prompt' => 'Börja skriva för att söka...', + ], + + 'tags_input' => [ + 'placeholder' => 'Ny tagg', + ], + +]; diff --git a/packages/forms/resources/lang/zh-CN/components.php b/packages/forms/resources/lang/zh-CN/components.php new file mode 100644 index 0000000000..498744f63b --- /dev/null +++ b/packages/forms/resources/lang/zh-CN/components.php @@ -0,0 +1,104 @@ + [ + + 'buttons' => [ + + 'add' => [ + 'label' => '添加行', + ], + + 'delete' => [ + 'label' => '删除行', + ], + + ], + + 'fields' => [ + + 'key' => [ + 'label' => '键名', + ], + + 'value' => [ + 'label' => '值', + ], + + ], + + ], + + 'markdown_editor' => [ + + 'toolbar_buttons' => [ + 'attach_files' => '附件', + 'bold' => '加粗', + 'bullet_list' => '普通列表', + 'code_block' => '代码', + 'edit' => 'Edit', + 'italic' => '斜体', + 'link' => '链接', + 'ordered_list' => '数字列表', + 'preview' => '预览', + 'strike' => '文字中线', + ], + + ], + + 'multi_select' => [ + 'no_search_results_message' => '没有选项匹配您的搜索.', + 'placeholder' => '请选择', + 'search_prompt' => '没有可供选择的选项.', + ], + + 'rich_editor' => [ + + 'dialogs' => [ + + 'link' => [ + + 'buttons' => [ + 'link' => '链接', + 'unlink' => '取消链接', + ], + + 'label' => 'URL', + + 'placeholder' => '输入URL', + + ], + + ], + + 'toolbar_buttons' => [ + 'attach_files' => '附件', + 'blockquote' => '引用', + 'bold' => '加粗', + 'bullet_list' => '普通列表', + 'code_block' => '代码', + 'h1' => '标题', + 'h2' => '标题', + 'h3' => '副标题', + 'italic' => '斜体', + 'link' => '链接', + 'ordered_list' => '数字列表', + 'redo' => '下一步', + 'strike' => '文字中线', + 'undo' => '上一步', + ], + + ], + + 'select' => [ + 'no_search_results_message' => '没有选项匹配您的搜索.', + 'placeholder' => '请选择', + 'search_prompt' => '搜索...', + ], + + 'tags_input' => [ + 'placeholder' => '新标签', + ], + +]; diff --git a/packages/forms/resources/views/component-container.blade.php b/packages/forms/resources/views/component-container.blade.php new file mode 100644 index 0000000000..89ccbf2cdd --- /dev/null +++ b/packages/forms/resources/views/component-container.blade.php @@ -0,0 +1,177 @@ +
    $getColumns('default') === 1, + 'grid-cols-2' => $getColumns('default') === 2, + 'grid-cols-3' => $getColumns('default') === 3, + 'grid-cols-4' => $getColumns('default') === 4, + 'grid-cols-5' => $getColumns('default') === 5, + 'grid-cols-6' => $getColumns('default') === 6, + 'grid-cols-7' => $getColumns('default') === 7, + 'grid-cols-8' => $getColumns('default') === 8, + 'grid-cols-9' => $getColumns('default') === 9, + 'grid-cols-10' => $getColumns('default') === 10, + 'grid-cols-11' => $getColumns('default') === 11, + 'grid-cols-12' => $getColumns('default') === 12, + 'sm:grid-cols-1' => $getColumns('sm') === 1, + 'sm:grid-cols-2' => $getColumns('sm') === 2, + 'sm:grid-cols-3' => $getColumns('sm') === 3, + 'sm:grid-cols-4' => $getColumns('sm') === 4, + 'sm:grid-cols-5' => $getColumns('sm') === 5, + 'sm:grid-cols-6' => $getColumns('sm') === 6, + 'sm:grid-cols-7' => $getColumns('sm') === 7, + 'sm:grid-cols-8' => $getColumns('sm') === 8, + 'sm:grid-cols-9' => $getColumns('sm') === 9, + 'sm:grid-cols-10' => $getColumns('sm') === 10, + 'sm:grid-cols-11' => $getColumns('sm') === 11, + 'sm:grid-cols-12' => $getColumns('sm') === 12, + 'md:grid-cols-1' => $getColumns('md') === 1, + 'md:grid-cols-2' => $getColumns('md') === 2, + 'md:grid-cols-3' => $getColumns('md') === 3, + 'md:grid-cols-4' => $getColumns('md') === 4, + 'md:grid-cols-5' => $getColumns('md') === 5, + 'md:grid-cols-6' => $getColumns('md') === 6, + 'md:grid-cols-7' => $getColumns('md') === 7, + 'md:grid-cols-8' => $getColumns('md') === 8, + 'md:grid-cols-9' => $getColumns('md') === 9, + 'md:grid-cols-10' => $getColumns('md') === 10, + 'md:grid-cols-11' => $getColumns('md') === 11, + 'md:grid-cols-12' => $getColumns('md') === 12, + 'lg:grid-cols-1' => $getColumns('lg') === 1, + 'lg:grid-cols-2' => $getColumns('lg') === 2, + 'lg:grid-cols-3' => $getColumns('lg') === 3, + 'lg:grid-cols-4' => $getColumns('lg') === 4, + 'lg:grid-cols-5' => $getColumns('lg') === 5, + 'lg:grid-cols-6' => $getColumns('lg') === 6, + 'lg:grid-cols-7' => $getColumns('lg') === 7, + 'lg:grid-cols-8' => $getColumns('lg') === 8, + 'lg:grid-cols-9' => $getColumns('lg') === 9, + 'lg:grid-cols-10' => $getColumns('lg') === 10, + 'lg:grid-cols-11' => $getColumns('lg') === 11, + 'lg:grid-cols-12' => $getColumns('lg') === 12, + 'xl:grid-cols-1' => $getColumns('xl') === 1, + 'xl:grid-cols-2' => $getColumns('xl') === 2, + 'xl:grid-cols-3' => $getColumns('xl') === 3, + 'xl:grid-cols-4' => $getColumns('xl') === 4, + 'xl:grid-cols-5' => $getColumns('xl') === 5, + 'xl:grid-cols-6' => $getColumns('xl') === 6, + 'xl:grid-cols-7' => $getColumns('xl') === 7, + 'xl:grid-cols-8' => $getColumns('xl') === 8, + 'xl:grid-cols-9' => $getColumns('xl') === 9, + 'xl:grid-cols-10' => $getColumns('xl') === 10, + 'xl:grid-cols-11' => $getColumns('xl') === 11, + 'xl:grid-cols-12' => $getColumns('xl') === 12, + '2xl:grid-cols-1' => $getColumns('2xl') === 1, + '2xl:grid-cols-2' => $getColumns('2xl') === 2, + '2xl:grid-cols-3' => $getColumns('2xl') === 3, + '2xl:grid-cols-4' => $getColumns('2xl') === 4, + '2xl:grid-cols-5' => $getColumns('2xl') === 5, + '2xl:grid-cols-6' => $getColumns('2xl') === 6, + '2xl:grid-cols-7' => $getColumns('2xl') === 7, + '2xl:grid-cols-8' => $getColumns('2xl') === 8, + '2xl:grid-cols-9' => $getColumns('2xl') === 9, + '2xl:grid-cols-10' => $getColumns('2xl') === 10, + '2xl:grid-cols-11' => $getColumns('2xl') === 11, + '2xl:grid-cols-12' => $getColumns('2xl') === 12, +])> + @foreach ($getComponents() as $formComponent) +
    $formComponent->getMaxWidth() === 'xs', + 'max-w-sm' => $formComponent->getMaxWidth() === 'sm', + 'max-w-md' => $formComponent->getMaxWidth() === 'md', + 'max-w-lg' => $formComponent->getMaxWidth() === 'lg', + 'max-w-xl' => $formComponent->getMaxWidth() === 'xl', + 'max-w-2xl' => $formComponent->getMaxWidth() === '2xl', + 'max-w-3xl' => $formComponent->getMaxWidth() === '3xl', + 'max-w-4xl' => $formComponent->getMaxWidth() === '4xl', + 'max-w-5xl' => $formComponent->getMaxWidth() === '5xl', + 'max-w-6xl' => $formComponent->getMaxWidth() === '6xl', + 'max-w-7xl' => $formComponent->getMaxWidth() === '7xl', + 'col-span-1' => $formComponent->getColumnSpan('default') === 1, + 'col-span-2' => $formComponent->getColumnSpan('default') === 2, + 'col-span-3' => $formComponent->getColumnSpan('default') === 3, + 'col-span-4' => $formComponent->getColumnSpan('default') === 4, + 'col-span-5' => $formComponent->getColumnSpan('default') === 5, + 'col-span-6' => $formComponent->getColumnSpan('default') === 6, + 'col-span-7' => $formComponent->getColumnSpan('default') === 7, + 'col-span-8' => $formComponent->getColumnSpan('default') === 8, + 'col-span-9' => $formComponent->getColumnSpan('default') === 9, + 'col-span-10' => $formComponent->getColumnSpan('default') === 10, + 'col-span-11' => $formComponent->getColumnSpan('default') === 11, + 'col-span-12' => $formComponent->getColumnSpan('default') === 12, + 'col-span-full' => $formComponent->getColumnSpan('default') === 'full', + $classes = $formComponent->getColumnSpan('default') => is_string($classes) && $classes !== 'full', + 'sm:col-span-1' => $formComponent->getColumnSpan('sm') === 1, + 'sm:col-span-2' => $formComponent->getColumnSpan('sm') === 2, + 'sm:col-span-3' => $formComponent->getColumnSpan('sm') === 3, + 'sm:col-span-4' => $formComponent->getColumnSpan('sm') === 4, + 'sm:col-span-5' => $formComponent->getColumnSpan('sm') === 5, + 'sm:col-span-6' => $formComponent->getColumnSpan('sm') === 6, + 'sm:col-span-7' => $formComponent->getColumnSpan('sm') === 7, + 'sm:col-span-8' => $formComponent->getColumnSpan('sm') === 8, + 'sm:col-span-9' => $formComponent->getColumnSpan('sm') === 9, + 'sm:col-span-10' => $formComponent->getColumnSpan('sm') === 10, + 'sm:col-span-11' => $formComponent->getColumnSpan('sm') === 11, + 'sm:col-span-12' => $formComponent->getColumnSpan('sm') === 12, + 'sm:col-span-full' => $formComponent->getColumnSpan('sm') === 'full', + $classes = $formComponent->getColumnSpan('sm') => is_string($classes) && $classes !== 'full', + 'md:col-span-1' => $formComponent->getColumnSpan('md') === 1, + 'md:col-span-2' => $formComponent->getColumnSpan('md') === 2, + 'md:col-span-3' => $formComponent->getColumnSpan('md') === 3, + 'md:col-span-4' => $formComponent->getColumnSpan('md') === 4, + 'md:col-span-5' => $formComponent->getColumnSpan('md') === 5, + 'md:col-span-6' => $formComponent->getColumnSpan('md') === 6, + 'md:col-span-7' => $formComponent->getColumnSpan('md') === 7, + 'md:col-span-8' => $formComponent->getColumnSpan('md') === 8, + 'md:col-span-9' => $formComponent->getColumnSpan('md') === 9, + 'md:col-span-10' => $formComponent->getColumnSpan('md') === 10, + 'md:col-span-11' => $formComponent->getColumnSpan('md') === 11, + 'md:col-span-12' => $formComponent->getColumnSpan('md') === 12, + 'md:col-span-full' => $formComponent->getColumnSpan('md') === 'full', + $classes = $formComponent->getColumnSpan('md') => is_string($classes) && $classes !== 'full', + 'lg:col-span-1' => $formComponent->getColumnSpan('lg') === 1, + 'lg:col-span-2' => $formComponent->getColumnSpan('lg') === 2, + 'lg:col-span-3' => $formComponent->getColumnSpan('lg') === 3, + 'lg:col-span-4' => $formComponent->getColumnSpan('lg') === 4, + 'lg:col-span-5' => $formComponent->getColumnSpan('lg') === 5, + 'lg:col-span-6' => $formComponent->getColumnSpan('lg') === 6, + 'lg:col-span-7' => $formComponent->getColumnSpan('lg') === 7, + 'lg:col-span-8' => $formComponent->getColumnSpan('lg') === 8, + 'lg:col-span-9' => $formComponent->getColumnSpan('lg') === 9, + 'lg:col-span-10' => $formComponent->getColumnSpan('lg') === 10, + 'lg:col-span-11' => $formComponent->getColumnSpan('lg') === 11, + 'lg:col-span-12' => $formComponent->getColumnSpan('lg') === 12, + 'lg:col-span-full' => $formComponent->getColumnSpan('lg') === 'full', + $classes = $formComponent->getColumnSpan('lg') => is_string($classes) && $classes !== 'full', + 'xl:col-span-1' => $formComponent->getColumnSpan('xl') === 1, + 'xl:col-span-2' => $formComponent->getColumnSpan('xl') === 2, + 'xl:col-span-3' => $formComponent->getColumnSpan('xl') === 3, + 'xl:col-span-4' => $formComponent->getColumnSpan('xl') === 4, + 'xl:col-span-5' => $formComponent->getColumnSpan('xl') === 5, + 'xl:col-span-6' => $formComponent->getColumnSpan('xl') === 6, + 'xl:col-span-7' => $formComponent->getColumnSpan('xl') === 7, + 'xl:col-span-8' => $formComponent->getColumnSpan('xl') === 8, + 'xl:col-span-9' => $formComponent->getColumnSpan('xl') === 9, + 'xl:col-span-10' => $formComponent->getColumnSpan('xl') === 10, + 'xl:col-span-11' => $formComponent->getColumnSpan('xl') === 11, + 'xl:col-span-12' => $formComponent->getColumnSpan('xl') === 12, + 'xl:col-span-full' => $formComponent->getColumnSpan('xl') === 'full', + $classes = $formComponent->getColumnSpan('xl') => is_string($classes) && $classes !== 'full', + '2xl:col-span-1' => $formComponent->getColumnSpan('2xl') === 1, + '2xl:col-span-2' => $formComponent->getColumnSpan('2xl') === 2, + '2xl:col-span-3' => $formComponent->getColumnSpan('2xl') === 3, + '2xl:col-span-4' => $formComponent->getColumnSpan('2xl') === 4, + '2xl:col-span-5' => $formComponent->getColumnSpan('2xl') === 5, + '2xl:col-span-6' => $formComponent->getColumnSpan('2xl') === 6, + '2xl:col-span-7' => $formComponent->getColumnSpan('2xl') === 7, + '2xl:col-span-8' => $formComponent->getColumnSpan('2xl') === 8, + '2xl:col-span-9' => $formComponent->getColumnSpan('2xl') === 9, + '2xl:col-span-10' => $formComponent->getColumnSpan('2xl') === 10, + '2xl:col-span-11' => $formComponent->getColumnSpan('2xl') === 11, + '2xl:col-span-12' => $formComponent->getColumnSpan('2xl') === 12, + '2xl:col-span-full' => $formComponent->getColumnSpan('2xl') === 'full', + $classes = $formComponent->getColumnSpan('2xl') => is_string($classes) && $classes !== 'full', + ])> + {{ $formComponent }} +
    + @endforeach +
    diff --git a/packages/forms/resources/views/components/builder.blade.php b/packages/forms/resources/views/components/builder.blade.php new file mode 100644 index 0000000000..4628e56bd3 --- /dev/null +++ b/packages/forms/resources/views/components/builder.blade.php @@ -0,0 +1,163 @@ + +
    + @if (count($containers = $getChildComponentContainers())) +
      + @foreach ($containers as $uuid => $item) +
    • +
      +
      +
      + @unless ($loop->first || $isItemMovementDisabled()) + + @endunless + + @unless ($loop->last || $isItemMovementDisabled()) + + @endunless + + +
      +
      + +
      + {{ $item }} +
      +
      + + @unless ($loop->last) +
      +
      + + +
      +
        + @foreach ($getBlocks() as $block) +
      • + +
      • + @endforeach +
      +
      +
      +
      + @endunless +
    • + @endforeach +
    + @endif + +
    + + +
    +
      + @foreach ($getBlocks() as $block) +
    • + +
    • + @endforeach +
    +
    +
    +
    +
    diff --git a/packages/forms/resources/views/components/builder/block.blade.php b/packages/forms/resources/views/components/builder/block.blade.php new file mode 100644 index 0000000000..3ab6e50108 --- /dev/null +++ b/packages/forms/resources/views/components/builder/block.blade.php @@ -0,0 +1,3 @@ +
    + {{ $getChildComponentContainer() }} +
    diff --git a/packages/forms/resources/views/components/card.blade.php b/packages/forms/resources/views/components/card.blade.php new file mode 100644 index 0000000000..7571bf4787 --- /dev/null +++ b/packages/forms/resources/views/components/card.blade.php @@ -0,0 +1,6 @@ +
    merge($getExtraAttributes())->class(['p-6 bg-white shadow rounded-xl']) }} +> + {{ $getChildComponentContainer() }} +
    diff --git a/packages/forms/resources/views/components/checkbox.blade.php b/packages/forms/resources/views/components/checkbox.blade.php new file mode 100644 index 0000000000..cf6a48cf68 --- /dev/null +++ b/packages/forms/resources/views/components/checkbox.blade.php @@ -0,0 +1,29 @@ + + @if ($isInline()) + + @endif + merge($getExtraAttributes())->class([ + 'transition duration-75 rounded shadow-sm focus:border-primary-500 focus:ring-2 focus:ring-primary-500', + 'border-gray-300' => ! $errors->has($getStatePath()), + 'border-danger-300 ring-danger-500' => $errors->has($getStatePath()), + ]) }} + /> + @if ($isInline()) + + @endif + diff --git a/packages/forms/resources/views/components/date-time-picker.blade.php b/packages/forms/resources/views/components/date-time-picker.blade.php new file mode 100644 index 0000000000..5b5053ede3 --- /dev/null +++ b/packages/forms/resources/views/components/date-time-picker.blade.php @@ -0,0 +1,204 @@ +@once + @push('scripts') + + + + + @endpush +@endonce + + +
    merge($getExtraAttributes()) }} + > + + + @unless ($isDisabled()) +
    $hasDate(), + ]) + > +
    + @if ($hasDate()) +
    + + + +
    + +
    + +
    + +
    + + + +
    + @endif + + @if ($hasTime()) +
    $hasDate(), + ]) + > + $hasDate(), + ]) + /> + + $hasDate(), + ]) + >: + + $hasDate(), + ]) + /> + + @if ($hasSeconds()) + $hasDate(), + ]) + >: + + $hasDate(), + ]) + /> + @endif +
    + @endif +
    +
    + @endunless +
    +
    diff --git a/packages/forms/resources/views/components/field-wrapper/error-message.blade.php b/packages/forms/resources/views/components/field-wrapper/error-message.blade.php new file mode 100644 index 0000000000..cc6c5763fb --- /dev/null +++ b/packages/forms/resources/views/components/field-wrapper/error-message.blade.php @@ -0,0 +1,3 @@ +

    class(['text-sm text-danger-600']) }}> + {{ $slot }} +

    diff --git a/packages/forms/resources/views/components/field-wrapper/helper-text.blade.php b/packages/forms/resources/views/components/field-wrapper/helper-text.blade.php new file mode 100644 index 0000000000..e79574e98e --- /dev/null +++ b/packages/forms/resources/views/components/field-wrapper/helper-text.blade.php @@ -0,0 +1,3 @@ +
    class(['text-sm text-gray-600']) }}> + {{ $slot }} +
    diff --git a/packages/forms/resources/views/components/field-wrapper/hint.blade.php b/packages/forms/resources/views/components/field-wrapper/hint.blade.php new file mode 100644 index 0000000000..bf641c7c2e --- /dev/null +++ b/packages/forms/resources/views/components/field-wrapper/hint.blade.php @@ -0,0 +1,3 @@ +
    class(['text-xs leading-tight text-gray-500']) }}> + {{ $slot }} +
    diff --git a/packages/forms/resources/views/components/field-wrapper/index.blade.php b/packages/forms/resources/views/components/field-wrapper/index.blade.php new file mode 100644 index 0000000000..73e3784cbd --- /dev/null +++ b/packages/forms/resources/views/components/field-wrapper/index.blade.php @@ -0,0 +1,55 @@ +@props([ + 'id', + 'label' => null, + 'labelPrefix' => null, + 'labelSrOnly' => false, + 'helperText' => null, + 'hint' => null, + 'required' => false, + 'statePath', +]) + +
    + @if ($label && $labelSrOnly) + + @endif + +
    + @if (($label && ! $labelSrOnly) || $hint) +
    + @if ($label && ! $labelSrOnly) + + {{ $label }} + + @endif + + @if ($hint) + + {!! \Illuminate\Support\Str::markdown($hint) !!} + + @endif +
    + @endif + + {{ $slot }} + + @if ($errors->has($statePath)) + + {{ $errors->first($statePath) }} + + @endif + + @if ($helperText) + + {!! \Illuminate\Support\Str::markdown($helperText) !!} + + @endif +
    +
    diff --git a/packages/forms/resources/views/components/field-wrapper/label.blade.php b/packages/forms/resources/views/components/field-wrapper/label.blade.php new file mode 100644 index 0000000000..59096fabce --- /dev/null +++ b/packages/forms/resources/views/components/field-wrapper/label.blade.php @@ -0,0 +1,21 @@ +@props([ + 'error' => false, + 'prefix' => null, + 'required' => false, +]) + + diff --git a/packages/forms/resources/views/components/fieldset.blade.php b/packages/forms/resources/views/components/fieldset.blade.php new file mode 100644 index 0000000000..040c719078 --- /dev/null +++ b/packages/forms/resources/views/components/fieldset.blade.php @@ -0,0 +1,10 @@ +
    merge($getExtraAttributes())->class(['rounded-xl shadow-sm border border-gray-300 p-6']) }} +> + + {{ $getLabel() }} + + + {{ $getChildComponentContainer() }} +
    diff --git a/packages/forms/resources/views/components/file-upload.blade.php b/packages/forms/resources/views/components/file-upload.blade.php new file mode 100644 index 0000000000..25c9daae18 --- /dev/null +++ b/packages/forms/resources/views/components/file-upload.blade.php @@ -0,0 +1,50 @@ + +
    $isAvatar(), + ]) + x-data="fileUploadFormComponent({ + acceptedFileTypes: {{ json_encode($getAcceptedFileTypes()) }}, + getUploadedFileUrlUsing: async () => { + return await $wire.getUploadedFileUrl('{{ $getStatePath() }}') + }, + imageCropAspectRatio: {{ ($aspectRatio = $getImageCropAspectRatio()) ? "'{$aspectRatio}'" : 'null' }}, + imagePreviewHeight: {{ ($height = $getImagePreviewHeight()) ? "'{$height}'" : 'null' }}, + imageResizeTargetHeight: {{ ($height = $getImageResizeTargetHeight()) ? "'{$height}'" : 'null' }}, + imageResizeTargetWidth: {{ ($width = $getImageResizeTargetWidth()) ? "'{$width}'" : 'null' }}, + loadingIndicatorPosition: '{{ $getLoadingIndicatorPosition() }}', + panelAspectRatio: {{ ($aspectRatio = $getPanelAspectRatio()) ? "'{$aspectRatio}'" : 'null' }}, + panelLayout: {{ ($layout = $getPanelLayout()) ? "'{$layout}'" : 'null' }}, + placeholder: {{ ($placeholder = $getPlaceholder()) ? "'{$placeholder}'" : 'null' }}, + maxSize: {{ ($size = $getMaxSize()) ? "'{$size} KB'" : 'null' }}, + minSize: {{ ($size = $getMinSize()) ? "'{$size} KB'" : 'null' }}, + removeUploadedFileUsing: async (file = null) => { + return await $wire.removeUploadedFile('{{ $getStatePath() }}', file) + }, + removeUploadedFileButtonPosition: '{{ $getRemoveUploadedFileButtonPosition() }}', + state: $wire.{{ $applyStateBindingModifiers('entangle(\'' . $getStatePath() . '\')') }}, + uploadButtonPosition: '{{ $getUploadButtonPosition() }}', + uploadProgressIndicatorPosition: '{{ $getUploadProgressIndicatorPosition() }}', + uploadUsing: async (file, load, error, progress) => { + return await $wire.upload('{{ $getStatePath() }}', file, load, error, progress) + }, + })" + wire:ignore + {{ $attributes->merge($getExtraAttributes()) }} + > + +
    +
    diff --git a/packages/forms/resources/views/components/file-upload/input.blade.php b/packages/forms/resources/views/components/file-upload/input.blade.php new file mode 100644 index 0000000000..285f453e00 --- /dev/null +++ b/packages/forms/resources/views/components/file-upload/input.blade.php @@ -0,0 +1,36 @@ +
    + +
    diff --git a/packages/forms/resources/views/components/grid.blade.php b/packages/forms/resources/views/components/grid.blade.php new file mode 100644 index 0000000000..5c62e409e4 --- /dev/null +++ b/packages/forms/resources/views/components/grid.blade.php @@ -0,0 +1 @@ +{{ $getChildComponentContainer() }} \ No newline at end of file diff --git a/packages/forms/resources/views/components/group.blade.php b/packages/forms/resources/views/components/group.blade.php new file mode 100644 index 0000000000..5c62e409e4 --- /dev/null +++ b/packages/forms/resources/views/components/group.blade.php @@ -0,0 +1 @@ +{{ $getChildComponentContainer() }} \ No newline at end of file diff --git a/packages/forms/resources/views/components/hidden.blade.php b/packages/forms/resources/views/components/hidden.blade.php new file mode 100644 index 0000000000..50cc7383fe --- /dev/null +++ b/packages/forms/resources/views/components/hidden.blade.php @@ -0,0 +1,7 @@ +merge($getExtraAttributes()) }} +/> \ No newline at end of file diff --git a/packages/forms/resources/views/components/key-value.blade.php b/packages/forms/resources/views/components/key-value.blade.php new file mode 100644 index 0000000000..5a655801f7 --- /dev/null +++ b/packages/forms/resources/views/components/key-value.blade.php @@ -0,0 +1,105 @@ + +
    merge($getExtraAttributes()) }} + > +
    + + + + + + + + @if ($canDeleteRows() && $getDeleteButtonLabel()) + + @endif + + + + + + +
    + {{ $getKeyLabel() }} + + {{ $getValueLabel() }} + + + {{ $getDeleteButtonLabel() }} + +
    + + @if ($canAddRows() && $canEditKeys()) +
    + +
    + @endif +
    +
    +
    diff --git a/packages/forms/resources/views/components/markdown-editor.blade.php b/packages/forms/resources/views/components/markdown-editor.blade.php new file mode 100644 index 0000000000..59515efeea --- /dev/null +++ b/packages/forms/resources/views/components/markdown-editor.blade.php @@ -0,0 +1,204 @@ + +
    +
    + @unless ($isDisabled()) +
    + + @if ($hasToolbarButton(['bold', 'italic', 'strike'])) +
    + @if ($hasToolbarButton('bold')) + + + + + + @endif + + @if ($hasToolbarButton('italic')) + + + + + + @endif + + @if ($hasToolbarButton('strike')) + + + + + + @endif +
    + @endif + + @if ($hasToolbarButton(['link', 'attachFiles', 'codeBlock'])) +
    + @if ($hasToolbarButton('link')) + + + + + + @endif + + @if ($hasToolbarButton('attachFiles')) + + + + + + @endif + + @if ($hasToolbarButton('codeBlock')) + + + + + + @endif +
    + @endif + + @if ($hasToolbarButton(['bulletList', 'orderedList'])) +
    + @if ($hasToolbarButton('bulletList')) + + + + + + @endif + + @if ($hasToolbarButton('orderedList')) + + + + + + @endif +
    + @endif +
    + + @if ($hasToolbarButton(['edit', 'preview']) && ! $isDisabled()) +
    + @if ($hasToolbarButton('edit')) + + @endif + + @if ($hasToolbarButton('preview')) + + @endif +
    + @endif +
    + @endunless + +
    + + + + +
    +
    + +
    +
    +
    +
    +
    +
    diff --git a/packages/forms/resources/views/components/markdown-editor/toolbar-button.blade.php b/packages/forms/resources/views/components/markdown-editor/toolbar-button.blade.php new file mode 100644 index 0000000000..c3aec55cd2 --- /dev/null +++ b/packages/forms/resources/views/components/markdown-editor/toolbar-button.blade.php @@ -0,0 +1,7 @@ + diff --git a/packages/forms/resources/views/components/multi-select.blade.php b/packages/forms/resources/views/components/multi-select.blade.php new file mode 100644 index 0000000000..f09cb7cd4d --- /dev/null +++ b/packages/forms/resources/views/components/multi-select.blade.php @@ -0,0 +1,166 @@ + +
    merge($getExtraAttributes())->class([ + 'block w-full transition duration-75 divide-y rounded-lg shadow-sm border focus-within:border-primary-600 focus-within:ring-1 focus-within:ring-primary-600', + 'border-gray-300' => ! $errors->has($getStatePath()), + 'border-danger-600 ring-danger-600' => $errors->has($getStatePath()), + ]) }} + > + @unless ($isDisabled()) +
    +
    + + + + + + + + + + + + + +
    + +
    +
      + + +
      +
    +
    +
    + @endunless + +
    +
    + +
    +
    +
    +
    diff --git a/packages/forms/resources/views/components/multiple-file-upload.blade.php b/packages/forms/resources/views/components/multiple-file-upload.blade.php new file mode 100644 index 0000000000..f71afa1e30 --- /dev/null +++ b/packages/forms/resources/views/components/multiple-file-upload.blade.php @@ -0,0 +1,17 @@ + +
      + @foreach ($getChildComponentContainers() as $uuid => $item) +
    • + {{ $item }} +
    • + @endforeach +
    +
    diff --git a/packages/forms/resources/views/components/placeholder.blade.php b/packages/forms/resources/views/components/placeholder.blade.php new file mode 100644 index 0000000000..ff6dbfbdde --- /dev/null +++ b/packages/forms/resources/views/components/placeholder.blade.php @@ -0,0 +1,10 @@ + + {{ $getState() }} + diff --git a/packages/forms/resources/views/components/radio.blade.php b/packages/forms/resources/views/components/radio.blade.php new file mode 100644 index 0000000000..b3d35aec1c --- /dev/null +++ b/packages/forms/resources/views/components/radio.blade.php @@ -0,0 +1,47 @@ + +
    + @foreach ($getOptions() as $value => $label) +
    +
    + merge($getExtraAttributes())->class([ + 'focus:ring-primary-500 h-4 w-4 text-primary-600', + 'border-gray-300' => ! $errors->has($getStatePath()), + 'border-danger-600 ring-danger-600' => $errors->has($getStatePath()), + ]) }} + {!! $isOptionDisabled($value, $label) ? 'disabled' : null !!} + /> +
    + +
    + + + @if ($hasDescription($value)) +

    + {{ $getDescription($value) }} +

    + @endif +
    +
    + @endforeach +
    +
    diff --git a/packages/forms/resources/views/components/repeater.blade.php b/packages/forms/resources/views/components/repeater.blade.php new file mode 100644 index 0000000000..6bee2ac61a --- /dev/null +++ b/packages/forms/resources/views/components/repeater.blade.php @@ -0,0 +1,80 @@ + +
    + @if (count($containers = $getChildComponentContainers())) +
      + @foreach ($containers as $uuid => $item) +
    • +
      +
      + @unless ($loop->first || $isItemMovementDisabled()) + + @endunless + + @unless ($loop->last || $isItemMovementDisabled()) + + @endunless + + +
      +
      + +
      + {{ $item }} +
      +
    • + @endforeach +
    + @endif + + +
    +
    diff --git a/packages/forms/resources/views/components/rich-editor.blade.php b/packages/forms/resources/views/components/rich-editor.blade.php new file mode 100644 index 0000000000..b5f3bff769 --- /dev/null +++ b/packages/forms/resources/views/components/rich-editor.blade.php @@ -0,0 +1,287 @@ + +
    + @unless ($isDisabled()) + + + +
    + @if ($hasToolbarButton(['bold', 'italic', 'strike', 'link'])) + + @if ($hasToolbarButton('bold')) + + @endif + + @if ($hasToolbarButton('italic')) + + @endif + + @if ($hasToolbarButton('strike')) + + @endif + + @if ($hasToolbarButton('link')) + + @endif + + @endif + + @if ($hasToolbarButton(['h1', 'h2', 'h3'])) + + @if ($hasToolbarButton('h1')) + + @endif + + @if ($hasToolbarButton('h2')) + + @endif + + @if ($hasToolbarButton('h3')) + + @endif + + @endif + + @if ($hasToolbarButton(['blockquote', 'codeBlock', 'bulletList', 'orderedList'])) + + @if ($hasToolbarButton('blockquote')) + + @endif + + @if ($hasToolbarButton('codeBlock')) + + @endif + + @if ($hasToolbarButton('bulletList')) + + @endif + + @if ($hasToolbarButton('orderedList')) + + @endif + + @endif + + @if ($hasToolbarButton('attachFiles')) + + + + @endif + + @if ($hasToolbarButton(['undo', 'redo'])) + + + + @if ($hasToolbarButton('undo')) + + @endif + + @if ($hasToolbarButton('redo')) + + @endif + + @endif +
    + +
    + +
    +
    + + merge($getExtraAttributes())->class([ + 'block w-full transition duration-75 rounded-lg shadow-sm focus:border-primary-500 focus:ring-1 focus:ring-inset focus:ring-primary-600 prose max-w-none', + 'border-gray-300' => ! $errors->has($getStatePath()), + 'border-danger-600 ring-danger-600' => $errors->has($getStatePath()), + ]) }} + /> + @else +
    + @endunless +
    +
    diff --git a/packages/forms/resources/views/components/section.blade.php b/packages/forms/resources/views/components/section.blade.php new file mode 100644 index 0000000000..02e8d058e4 --- /dev/null +++ b/packages/forms/resources/views/components/section.blade.php @@ -0,0 +1,46 @@ +
    merge($getExtraAttributes())->class(['p-6 space-y-6 rounded-xl shadow-sm border border-gray-300']) }} +> +
    +
    +

    + {{ $getHeading() }} +

    + + @if ($description = $getDescription()) +

    + {{ $description }} +

    + @endif +
    + + @if ($isCollapsible()) + + @endif +
    + +
    + {{ $getChildComponentContainer() }} +
    +
    diff --git a/packages/forms/resources/views/components/select.blade.php b/packages/forms/resources/views/components/select.blade.php new file mode 100644 index 0000000000..fa3f08bd98 --- /dev/null +++ b/packages/forms/resources/views/components/select.blade.php @@ -0,0 +1,175 @@ + + @unless ($isSearchable()) + + @else +
    merge($getExtraAttributes()) }} + > +
    ! $errors->has($getStatePath()), + 'border-danger-600 ring-danger-600' => $errors->has($getStatePath()), + ]) + > + + + @unless ($isDisabled()) + + + + + + + + + + + + + + @endunless +
    + + @unless($isDisabled()) +
    +
      + + +
      +
    +
    + @endunless +
    + @endif +
    diff --git a/packages/forms/resources/views/components/tabs.blade.php b/packages/forms/resources/views/components/tabs.blade.php new file mode 100644 index 0000000000..136c85b261 --- /dev/null +++ b/packages/forms/resources/views/components/tabs.blade.php @@ -0,0 +1,32 @@ +
    merge($getExtraAttributes())->class(['rounded-xl shadow-sm border border-gray-300']) }} +> +
    + @foreach ($getTabsConfig() as $tabId => $tabLabel) + + @endforeach +
    + + @foreach ($getChildComponentContainer()->getComponents() as $tab) + {{ $tab }} + @endforeach +
    diff --git a/packages/forms/resources/views/components/tabs/tab.blade.php b/packages/forms/resources/views/components/tabs/tab.blade.php new file mode 100644 index 0000000000..c253550558 --- /dev/null +++ b/packages/forms/resources/views/components/tabs/tab.blade.php @@ -0,0 +1,10 @@ +
    + {{ $getChildComponentContainer() }} +
    \ No newline at end of file diff --git a/packages/forms/resources/views/components/tags-input.blade.php b/packages/forms/resources/views/components/tags-input.blade.php new file mode 100644 index 0000000000..6d5aef301e --- /dev/null +++ b/packages/forms/resources/views/components/tags-input.blade.php @@ -0,0 +1,64 @@ + +
    merge($getExtraAttributes()) }} + > +
    ! $errors->has($getStatePath()), + 'border-danger-600 ring-danger-600' => $errors->has($getStatePath()), + ]) + > + @unless ($isDisabled()) + + @endunless + +
    +
    + +
    +
    +
    +
    +
    diff --git a/packages/forms/resources/views/components/text-input.blade.php b/packages/forms/resources/views/components/text-input.blade.php new file mode 100644 index 0000000000..e8b5395e85 --- /dev/null +++ b/packages/forms/resources/views/components/text-input.blade.php @@ -0,0 +1,76 @@ +@php + $datalistOptions = $getDatalistOptions(); + + $sideLabelClasses = [ + 'whitespace-nowrap transition group-focus-within:text-primary-500', + 'text-gray-400' => ! $errors->has($getStatePath()), + 'text-danger-400' => $errors->has($getStatePath()), + ]; +@endphp + + +
    + @if ($label = $getPrefixLabel()) + + {{ $label }} + + @endif + +
    + ({$getJsonMaskConfiguration()})," : null }} + state: $wire.{{ $applyStateBindingModifiers('entangle(\'' . $getStatePath() . '\')') }}, + })" + type="text" + wire:ignore + @endunless + {!! ($autocapitalize = $getAutocapitalize()) ? "autocapitalize=\"{$autocapitalize}\"" : null !!} + {!! ($autocomplete = $getAutocomplete()) ? "autocomplete=\"{$autocomplete}\"" : null !!} + {!! $isAutofocused() ? 'autofocus' : null !!} + {!! $isDisabled() ? 'disabled' : null !!} + id="{{ $getId() }}" + {!! ($inputMode = $getInputMode()) ? "inputmode=\"{$inputMode}\"" : null !!} + {!! $datalistOptions ? "list=\"{$getId()}-list\"" : null !!} + {!! ($length = $getMaxLength()) ? "maxlength=\"{$length}\"" : null !!} + {!! ($value = $getMaxValue()) ? "max=\"{$value}\"" : null !!} + {!! ($length = $getMinLength()) ? "minlength=\"{$length}\"" : null !!} + {!! ($value = $getMinValue()) ? "min=\"{$value}\"" : null !!} + {!! ($placeholder = $getPlaceholder()) ? "placeholder=\"{$placeholder}\"" : null !!} + {!! ($interval = $getStep()) ? "step=\"{$interval}\"" : null !!} + {!! $isRequired() ? 'required' : null !!} + {{ $attributes->merge($getExtraAttributes())->class([ + 'block w-full h-10 transition duration-75 rounded-lg shadow-sm focus:border-primary-600 focus:ring-1 focus:ring-inset focus:ring-primary-600', + 'border-gray-300' => ! $errors->has($getStatePath()), + 'border-danger-600 ring-danger-600' => $errors->has($getStatePath()), + ]) }} + /> +
    + + @if ($label = $getPostfixLabel()) + + {{ $label }} + + @endif +
    + + @if ($datalistOptions) + + @foreach ($datalistOptions as $option) + + @endif +
    diff --git a/packages/forms/resources/views/components/textarea.blade.php b/packages/forms/resources/views/components/textarea.blade.php new file mode 100644 index 0000000000..67665e28e5 --- /dev/null +++ b/packages/forms/resources/views/components/textarea.blade.php @@ -0,0 +1,34 @@ + + + diff --git a/packages/forms/resources/views/components/toggle.blade.php b/packages/forms/resources/views/components/toggle.blade.php new file mode 100644 index 0000000000..0ba0f0d2d4 --- /dev/null +++ b/packages/forms/resources/views/components/toggle.blade.php @@ -0,0 +1,71 @@ + + @if ($isInline()) + + @endif + + @if ($isInline()) + + @endif + diff --git a/packages/forms/src/Commands/Aliases/MakeFieldCommand.php b/packages/forms/src/Commands/Aliases/MakeFieldCommand.php new file mode 100644 index 0000000000..ae9551d7b3 --- /dev/null +++ b/packages/forms/src/Commands/Aliases/MakeFieldCommand.php @@ -0,0 +1,12 @@ +fileExists($path)) { + $this->error("$path already exists, aborting."); + + return true; + } + } + + return false; + } + + protected function copyStubToApp(string $stub, string $targetPath, array $replacements = []): void + { + $filesystem = new Filesystem(); + + if (! $this->fileExists($stubPath = base_path("stubs/filament/{$stub}.stub"))) { + $stubPath = __DIR__ . "/../../../stubs/{$stub}.stub"; + } + + $stub = Str::of($filesystem->get($stubPath)); + + foreach ($replacements as $key => $replacement) { + $stub = $stub->replace("{{ {$key} }}", $replacement); + } + + $stub = (string) $stub; + + $this->writeFile($targetPath, $stub); + } + + protected function fileExists(string $path): bool + { + $filesystem = new Filesystem(); + + return $filesystem->exists($path); + } + + protected function writeFile(string $path, string $contents): void + { + $filesystem = new Filesystem(); + + $filesystem->ensureDirectoryExists( + (string) Str::of($path) + ->beforeLast('/'), + ); + + $filesystem->put($path, $contents); + } +} diff --git a/packages/forms/src/Commands/Concerns/CanValidateInput.php b/packages/forms/src/Commands/Concerns/CanValidateInput.php new file mode 100644 index 0000000000..2fa8fb3315 --- /dev/null +++ b/packages/forms/src/Commands/Concerns/CanValidateInput.php @@ -0,0 +1,31 @@ +validateInput(fn () => $this->ask($question), $field, ['required']); + } + + protected function validateInput(callable $callback, string $field, array $rules): string + { + $input = $callback(); + + $validator = Validator::make( + [$field => $input], + [$field => $rules], + ); + + if ($validator->fails()) { + $this->error($validator->errors()->first()); + + $input = $this->validateInput($callback, $field, $rules); + } + + return $input; + } +} diff --git a/packages/forms/src/Commands/InstallCommand.php b/packages/forms/src/Commands/InstallCommand.php new file mode 100644 index 0000000000..e1e90d683b --- /dev/null +++ b/packages/forms/src/Commands/InstallCommand.php @@ -0,0 +1,67 @@ +delete(resource_path('js/bootstrap.js')); + $filesystem->copyDirectory(__DIR__ . '/../../stubs/scaffolding', base_path()); + + $this->info('Scaffolding installed successfully.'); + + $this->comment('Please run `npm install && npm run dev` to compile your new assets.'); + + return static::SUCCESS; + } + + protected static function updateNpmPackages(bool $dev = true): void + { + if (! file_exists(base_path('package.json'))) { + return; + } + + $configurationKey = $dev ? 'devDependencies' : 'dependencies'; + + $packages = json_decode(file_get_contents(base_path('package.json')), true); + + $packages[$configurationKey] = static::updateNpmPackageArray( + array_key_exists($configurationKey, $packages) ? $packages[$configurationKey] : [] + ); + + ksort($packages[$configurationKey]); + + file_put_contents( + base_path('package.json'), + json_encode($packages, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT).PHP_EOL + ); + } + + protected static function updateNpmPackageArray(array $packages): array + { + return array_merge( + [ + '@tailwindcss/forms' => '^0.3', + '@tailwindcss/typography' => '^0.4', + 'alpinejs' => '^3.4', + 'tailwindcss' => '^2.2', + ], + Arr::except($packages, [ + 'axios', + 'lodash', + ]), + ); + } +} diff --git a/packages/forms/src/Commands/MakeFieldCommand.php b/packages/forms/src/Commands/MakeFieldCommand.php new file mode 100644 index 0000000000..75fb5537d1 --- /dev/null +++ b/packages/forms/src/Commands/MakeFieldCommand.php @@ -0,0 +1,68 @@ +argument('name') ?? $this->askRequired('Name (e.g. `RangeSlider`)', 'name')) + ->trim('/') + ->trim('\\') + ->trim(' ') + ->replace('/', '\\'); + $fieldClass = (string) Str::of($field)->afterLast('\\'); + $fieldNamespace = Str::of($field)->contains('\\') ? + (string) Str::of($field)->beforeLast('\\') : + ''; + + $view = Str::of($field) + ->prepend('forms\\components\\') + ->explode('\\') + ->map(fn ($segment) => Str::kebab($segment)) + ->implode('.'); + + $path = app_path( + (string) Str::of($field) + ->prepend('Forms\\Components\\') + ->replace('\\', '/') + ->append('.php'), + ); + $viewPath = resource_path( + (string) Str::of($view) + ->replace('.', '/') + ->prepend('views/') + ->append('.blade.php'), + ); + + if ($this->checkForCollision([ + $path, + ])) { + return static::INVALID; + } + + $this->copyStubToApp('Field', $path, [ + 'class' => $fieldClass, + 'namespace' => 'App\\Forms\\Components' . ($fieldNamespace !== '' ? "\\{$fieldNamespace}" : ''), + 'view' => $view, + ]); + + if (! $this->fileExists($viewPath)) { + $this->copyStubToApp('FieldView', $viewPath); + } + + $this->info("Successfully created {$field}!"); + + return static::SUCCESS; + } +} diff --git a/packages/forms/src/Commands/MakeLayoutComponentCommand.php b/packages/forms/src/Commands/MakeLayoutComponentCommand.php new file mode 100644 index 0000000000..7faa52499a --- /dev/null +++ b/packages/forms/src/Commands/MakeLayoutComponentCommand.php @@ -0,0 +1,68 @@ +argument('name') ?? $this->askRequired('Name (e.g. `Wizard`)', 'name')) + ->trim('/') + ->trim('\\') + ->trim(' ') + ->replace('/', '\\'); + $componentClass = (string) Str::of($component)->afterLast('\\'); + $componentNamespace = Str::of($component)->contains('\\') ? + (string) Str::of($component)->beforeLast('\\') : + ''; + + $view = Str::of($component) + ->prepend('forms\\components\\') + ->explode('\\') + ->map(fn ($segment) => Str::kebab($segment)) + ->implode('.'); + + $path = app_path( + (string) Str::of($component) + ->prepend('Forms\\Components\\') + ->replace('\\', '/') + ->append('.php'), + ); + $viewPath = resource_path( + (string) Str::of($view) + ->replace('.', '/') + ->prepend('views/') + ->append('.blade.php'), + ); + + if ($this->checkForCollision([ + $path, + ])) { + return static::INVALID; + } + + $this->copyStubToApp('LayoutComponent', $path, [ + 'class' => $componentClass, + 'namespace' => 'App\\Forms\\Components' . ($componentNamespace !== '' ? "\\{$componentNamespace}" : ''), + 'view' => $view, + ]); + + if (! $this->fileExists($viewPath)) { + $this->copyStubToApp('LayoutComponentView', $viewPath); + } + + $this->info("Successfully created {$component}!"); + + return static::SUCCESS; + } +} diff --git a/packages/forms/src/ComponentContainer.php b/packages/forms/src/ComponentContainer.php new file mode 100644 index 0000000000..580770464b --- /dev/null +++ b/packages/forms/src/ComponentContainer.php @@ -0,0 +1,56 @@ +livewire($livewire); + } + + public static function make(HasForms $livewire): static + { + return new static($livewire); + } + + public function toHtml(): string + { + return $this->render()->render(); + } + + public function render(): View + { + return view('forms::component-container', array_merge($this->data(), [ + 'container' => $this, + ])); + } +} diff --git a/packages/forms/src/Components/BelongsToManyMultiSelect.php b/packages/forms/src/Components/BelongsToManyMultiSelect.php new file mode 100644 index 0000000000..4ed82d912a --- /dev/null +++ b/packages/forms/src/Components/BelongsToManyMultiSelect.php @@ -0,0 +1,145 @@ +afterStateHydrated(function (BelongsToManyMultiSelect $component): void { + $relationship = $component->getRelationship(); + $relatedModels = $relationship->getResults(); + + if (! $relatedModels) { + return; + } + + $component->state( + $relatedModels->pluck( + $relationship->getRelatedKeyName(), + )->toArray(), + ); + }); + + $this->dehydrated(false); + } + + public function preload(bool | callable $condition = true): static + { + $this->isPreloaded = $condition; + + return $this; + } + + public function relationship(string | callable $relationshipName, string | callable $displayColumnName, ?callable $callback = null): static + { + $this->displayColumnName = $displayColumnName; + $this->relationship = $relationshipName; + + $this->getOptionLabelsUsing(function (BelongsToManyMultiSelect $component, array $values): array { + $relationship = $component->getRelationship(); + $relatedKeyName = $relationship->getRelatedKeyName(); + + return $relationship->getRelated() + ->whereIn($relatedKeyName, $values) + ->pluck($component->getDisplayColumnName(), $relatedKeyName) + ->toArray(); + }); + + $this->getSearchResultsUsing(function (BelongsToManyMultiSelect $component, ?string $query) use ($callback): array { + $relationship = $component->getRelationship(); + + $relationshipQuery = $relationship->getRelated()->orderBy($component->getDisplayColumnName()); + + if ($callback) { + $relationshipQuery = $callback($relationshipQuery); + } + + $query = strtolower($query); + $searchOperator = match ($relationshipQuery->getConnection()->getDriverName()) { + 'pgsql' => 'ilike', + default => 'like', + }; + + return $relationshipQuery + ->where($component->getDisplayColumnName(), $searchOperator, "%{$query}%") + ->pluck($component->getDisplayColumnName(), $relationship->getRelatedKeyName()) + ->toArray(); + }); + + $this->options(function (BelongsToManyMultiSelect $component) use ($callback): array { + if (! $component->isPreloaded()) { + return []; + } + + $relationship = $component->getRelationship(); + + $relationshipQuery = $relationship->getRelated()->orderBy($component->getDisplayColumnName()); + + if ($callback) { + $relationshipQuery = $callback($relationshipQuery); + } + + return $relationshipQuery + ->pluck($component->getDisplayColumnName(), $relationship->getRelatedKeyName()) + ->toArray(); + }); + + return $this; + } + + public function saveRelationships(): void + { + $this->getRelationship()->sync($this->getState()); + } + + public function getDisplayColumnName(): string + { + return $this->evaluate($this->displayColumnName); + } + + public function getLabel(): string + { + if ($this->label === null) { + return (string) Str::of($this->getRelationshipName()) + ->before('.') + ->kebab() + ->replace(['-', '_'], ' ') + ->ucfirst(); + } + + return parent::getLabel(); + } + + public function getRelationship(): BelongsToMany + { + $model = $this->getModel(); + + if (is_string($model)) { + $model = new $model(); + } + + return $model->{$this->getRelationshipName()}(); + } + + public function getRelationshipName(): string + { + return $this->evaluate($this->relationship); + } + + public function isPreloaded(): bool + { + return $this->evaluate($this->isPreloaded); + } +} diff --git a/packages/forms/src/Components/BelongsToSelect.php b/packages/forms/src/Components/BelongsToSelect.php new file mode 100644 index 0000000000..33888204df --- /dev/null +++ b/packages/forms/src/Components/BelongsToSelect.php @@ -0,0 +1,151 @@ +afterStateHydrated(function (BelongsToSelect $component): void { + $relationship = $component->getRelationship(); + $relatedModel = $relationship->getResults(); + + if (! $relatedModel) { + return; + } + + $component->state( + $relatedModel->getAttribute( + $relationship->getOwnerKeyName(), + ), + ); + }); + } + + public function preload(bool | callable $condition = true): static + { + $this->isPreloaded = $condition; + + return $this; + } + + public function relationship(string | callable $relationshipName, string | callable $displayColumnName, ?callable $callback = null): static + { + $this->displayColumnName = $displayColumnName; + $this->relationship = $relationshipName; + + $this->getOptionLabelUsing(function (BelongsToSelect $component, $value) { + $relationship = $component->getRelationship(); + + $record = $relationship->getRelated()->where($relationship->getOwnerKeyName(), $value)->first(); + + return $record ? $record->getAttributeValue($component->getDisplayColumnName()) : null; + }); + + $this->getSearchResultsUsing(function (BelongsToSelect $component, ?string $query) use ($callback): array { + $relationship = $component->getRelationship(); + + $relationshipQuery = $relationship->getRelated()->orderBy($component->getDisplayColumnName()); + + if ($callback) { + $relationshipQuery = $callback($relationshipQuery); + } + + $query = strtolower($query); + $searchOperator = match ($relationshipQuery->getConnection()->getDriverName()) { + 'pgsql' => 'ilike', + default => 'like', + }; + + return $relationshipQuery + ->where($component->getDisplayColumnName(), $searchOperator, "%{$query}%") + ->pluck($component->getDisplayColumnName(), $relationship->getOwnerKeyName()) + ->toArray(); + }); + + $this->options(function (BelongsToSelect $component) use ($callback): array { + if ($component->isSearchable() && ! $component->isPreloaded()) { + return []; + } + + $relationship = $component->getRelationship(); + + $relationshipQuery = $relationship->getRelated()->orderBy($component->getDisplayColumnName()); + + if ($callback) { + $relationshipQuery = $callback($relationshipQuery); + } + + return $relationshipQuery + ->pluck($component->getDisplayColumnName(), $relationship->getOwnerKeyName()) + ->toArray(); + }); + + $this->exists( + fn (BelongsToSelect $component): ?string => ($relationship = $component->getRelationship()) ? $relationship->getModel()::class : null, + fn (BelongsToSelect $component): string => $component->getRelationship()->getOwnerKeyName(), + ); + + return $this; + } + + public function saveRelationships(): void + { + $this->getRelationship()->associate($this->getState()); + $this->getModel()->save(); + } + + public function getDisplayColumnName(): string + { + return $this->evaluate($this->displayColumnName); + } + + public function getLabel(): string + { + if ($this->label === null) { + return (string) Str::of($this->getRelationshipName()) + ->before('.') + ->kebab() + ->replace(['-', '_'], ' ') + ->ucfirst(); + } + + return parent::getLabel(); + } + + public function getRelationship(): ?BelongsTo + { + $model = $this->getModel(); + + if (! $model) { + return null; + } + + if (is_string($model)) { + $model = new $model(); + } + + return $model->{$this->getRelationshipName()}(); + } + + public function getRelationshipName(): string + { + return $this->evaluate($this->relationship); + } + + public function isPreloaded(): bool + { + return $this->evaluate($this->isPreloaded); + } +} diff --git a/packages/forms/src/Components/Builder.php b/packages/forms/src/Components/Builder.php new file mode 100644 index 0000000000..060a94c193 --- /dev/null +++ b/packages/forms/src/Components/Builder.php @@ -0,0 +1,219 @@ +registerListeners([ + 'builder.createItem' => [ + function (Builder $component, string $statePath, string $block, ?string $afterUuid = null): void { + if ($component->isDisabled()) { + return; + } + + if ($statePath !== $component->getStatePath()) { + return; + } + + $livewire = $component->getLivewire(); + + $newUuid = (string) Str::uuid(); + $newItem = [ + 'type' => $block, + 'data' => [], + ]; + + if ($afterUuid) { + $newItems = []; + + foreach ($component->getNormalisedState() as $uuid => $item) { + $newItems[$uuid] = $item; + + if ($uuid === $afterUuid) { + $newItems[$newUuid] = $newItem; + } + } + + data_set($livewire, $statePath, $newItems); + } else { + data_set($livewire, "{$statePath}.{$newUuid}", $newItem); + } + + $component->hydrateDefaultItemState($newUuid); + }, + ], + 'builder.deleteItem' => [ + function (Builder $component, string $statePath, string $uuidToDelete): void { + if ($component->isDisabled()) { + return; + } + + if ($statePath !== $component->getStatePath()) { + return; + } + + $items = $component->getNormalisedState(); + + unset($items[$uuidToDelete]); + + $livewire = $component->getLivewire(); + data_set($livewire, $statePath, $items); + }, + ], + 'builder.moveItemDown' => [ + function (Builder $component, string $statePath, string $uuidToMoveDown): void { + if ($component->isDisabled()) { + return; + } + + if ($component->isItemMovementDisabled()) { + return; + } + + if ($statePath !== $component->getStatePath()) { + return; + } + + $items = Arr::moveElementAfter($component->getNormalisedState(), $uuidToMoveDown); + + $livewire = $component->getLivewire(); + data_set($livewire, $statePath, $items); + }, + ], + 'builder.moveItemUp' => [ + function (Builder $component, string $statePath, string $uuidToMoveUp): void { + if ($component->isDisabled()) { + return; + } + + if ($component->isItemMovementDisabled()) { + return; + } + + if ($statePath !== $component->getStatePath()) { + return; + } + + $items = Arr::moveElementBefore($component->getNormalisedState(), $uuidToMoveUp); + + $livewire = $component->getLivewire(); + data_set($livewire, $statePath, $items); + }, + ], + ]); + + $this->createItemBetweenButtonLabel(__('forms::components.builder.buttons.create_item_between.label')); + + $this->createItemButtonLabel(function (Builder $component) { + return __('forms::components.builder.buttons.create_item.label', [ + 'label' => lcfirst($component->getLabel()), + ]); + }); + } + + public function blocks(array $blocks): static + { + $this->childComponents($blocks); + + return $this; + } + + public function createItemBetweenButtonLabel(string | callable $label): static + { + $this->createItemBetweenButtonLabel = $label; + + return $this; + } + + public function createItemButtonLabel(string | callable $label): static + { + $this->createItemButtonLabel = $label; + + return $this; + } + + public function disableItemMovement(bool | callable $condition = true): static + { + $this->isItemMovementDisabled = $condition; + + return $this; + } + + public function hydrateDefaultItemState(string $uuid): void + { + $this->getChildComponentContainers()[$uuid]->hydrateDefaultState(); + } + + public function getBlock($name): ?Block + { + return Arr::first( + $this->getBlocks(), + fn (Block $block) => $block->getName() === $name, + ); + } + + public function getBlocks(): array + { + return $this->getChildComponentContainer()->getComponents(); + } + + public function getChildComponentContainers(): array + { + return collect($this->getNormalisedState()) + ->map(function ($item, $index): ComponentContainer { + return $this->getBlock($item['type']) + ->getChildComponentContainer() + ->getClone() + ->statePath("{$index}.data"); + })->toArray(); + } + + public function getCreateItemBetweenButtonLabel(): string + { + return $this->evaluate($this->createItemBetweenButtonLabel); + } + + public function getCreateItemButtonLabel(): string + { + return $this->evaluate($this->createItemButtonLabel); + } + + public function getNormalisedState(): array + { + if (! is_array($state = $this->getState())) { + return []; + } + + return array_filter( + $state, + fn ($item) => is_array($item) && $this->hasBlock($item['type'] ?? null), + ); + } + + public function hasBlock($name): bool + { + return (bool) $this->getBlock($name); + } + + public function isItemMovementDisabled(): bool + { + return $this->evaluate($this->isItemMovementDisabled); + } +} diff --git a/packages/forms/src/Components/Builder/Block.php b/packages/forms/src/Components/Builder/Block.php new file mode 100644 index 0000000000..f8527122cf --- /dev/null +++ b/packages/forms/src/Components/Builder/Block.php @@ -0,0 +1,46 @@ +name($name); + } + + public static function make(string $name): static + { + return new static($name); + } + + public function icon(string | callable $icon): static + { + $this->icon = $icon; + + return $this; + } + + public function getIcon(): ?string + { + return $this->evaluate($this->icon); + } + + public function getLabel(): string + { + return parent::getLabel() ?? (string) Str::of($this->getName()) + ->kebab() + ->replace(['-', '_'], ' ') + ->ucfirst(); + } +} diff --git a/packages/forms/src/Components/Card.php b/packages/forms/src/Components/Card.php new file mode 100644 index 0000000000..a711f691ab --- /dev/null +++ b/packages/forms/src/Components/Card.php @@ -0,0 +1,28 @@ +schema($schema); + } + + public static function make(array $schema = []): static + { + $static = new static($schema); + $static->setUp(); + + return $static; + } + + protected function setUp(): void + { + parent::setUp(); + + $this->columnSpan('full'); + } +} diff --git a/packages/forms/src/Components/Checkbox.php b/packages/forms/src/Components/Checkbox.php new file mode 100644 index 0000000000..a4488d89d7 --- /dev/null +++ b/packages/forms/src/Components/Checkbox.php @@ -0,0 +1,20 @@ +default(false); + + $this->rule('boolean'); + } +} diff --git a/packages/forms/src/Components/Component.php b/packages/forms/src/Components/Component.php new file mode 100644 index 0000000000..46491ec303 --- /dev/null +++ b/packages/forms/src/Components/Component.php @@ -0,0 +1,52 @@ +render()->render(); + } + + public function render(): View + { + return view($this->getView(), array_merge($this->data(), [ + 'component' => $this, + ])); + } +} diff --git a/packages/forms/src/Components/Concerns/BelongsToContainer.php b/packages/forms/src/Components/Concerns/BelongsToContainer.php new file mode 100644 index 0000000000..47d612eaa5 --- /dev/null +++ b/packages/forms/src/Components/Concerns/BelongsToContainer.php @@ -0,0 +1,28 @@ +container = $container; + + return $this; + } + + public function getContainer(): ComponentContainer + { + return $this->container; + } + + public function getLivewire(): HasForms + { + return $this->getContainer()->getLivewire(); + } +} diff --git a/packages/forms/src/Components/Concerns/BelongsToModel.php b/packages/forms/src/Components/Concerns/BelongsToModel.php new file mode 100644 index 0000000000..ea06551be5 --- /dev/null +++ b/packages/forms/src/Components/Concerns/BelongsToModel.php @@ -0,0 +1,45 @@ +model = $model; + + return $this; + } + + public function saveRelationships(): void + { + } + + public function getModel(): Model | string | null + { + if ($model = $this->evaluate($this->model)) { + return $model; + } + + return $this->getContainer()->getModel(); + } + + public function getModelClass(): string | null + { + $model = $this->getModel(); + + if (! $model) { + return null; + } + + if (is_string($model)) { + return $model; + } + + return $model::class; + } +} diff --git a/packages/forms/src/Components/Concerns/CanBeAccepted.php b/packages/forms/src/Components/Concerns/CanBeAccepted.php new file mode 100644 index 0000000000..4118d63106 --- /dev/null +++ b/packages/forms/src/Components/Concerns/CanBeAccepted.php @@ -0,0 +1,13 @@ +rule('accepted', $condition); + + return $this; + } +} diff --git a/packages/forms/src/Components/Concerns/CanBeAutocapitalized.php b/packages/forms/src/Components/Concerns/CanBeAutocapitalized.php new file mode 100644 index 0000000000..8961af132e --- /dev/null +++ b/packages/forms/src/Components/Concerns/CanBeAutocapitalized.php @@ -0,0 +1,29 @@ +autocapitalize = $autocapitalize; + + return $this; + } + + public function disableAutocapitalize(bool | callable $condition = true): static + { + $this->autocapitalize(function () use ($condition): ?string { + return $this->evaluate($condition) ? 'off' : null; + }); + + return $this; + } + + public function getAutocapitalize(): ?string + { + return $this->evaluate($this->autocapitalize); + } +} diff --git a/packages/forms/src/Components/Concerns/CanBeAutocompleted.php b/packages/forms/src/Components/Concerns/CanBeAutocompleted.php new file mode 100644 index 0000000000..c8f33f9ff7 --- /dev/null +++ b/packages/forms/src/Components/Concerns/CanBeAutocompleted.php @@ -0,0 +1,29 @@ +autocomplete = $autocomplete; + + return $this; + } + + public function disableAutocomplete(bool | callable $condition = true): static + { + $this->autocomplete(function () use ($condition): ?string { + return $this->evaluate($condition) ? 'off' : null; + }); + + return $this; + } + + public function getAutocomplete(): ?string + { + return $this->evaluate($this->autocomplete); + } +} diff --git a/packages/forms/src/Components/Concerns/CanBeAutofocused.php b/packages/forms/src/Components/Concerns/CanBeAutofocused.php new file mode 100644 index 0000000000..b47d12e2bd --- /dev/null +++ b/packages/forms/src/Components/Concerns/CanBeAutofocused.php @@ -0,0 +1,20 @@ +isAutofocused = $condition; + + return $this; + } + + public function isAutofocused(): bool + { + return (bool) $this->evaluate($this->isAutofocused); + } +} diff --git a/packages/forms/src/Components/Concerns/CanBeConcealed.php b/packages/forms/src/Components/Concerns/CanBeConcealed.php new file mode 100644 index 0000000000..ad68e41934 --- /dev/null +++ b/packages/forms/src/Components/Concerns/CanBeConcealed.php @@ -0,0 +1,24 @@ +getContainer()->getParentComponent(); + + if (! $parentComponent) { + return null; + } + + if (! $parentComponent instanceof CanConcealComponents) { + return $parentComponent->getConcealingComponent(); + } + + return $parentComponent; + } +} diff --git a/packages/forms/src/Components/Concerns/CanBeDisabled.php b/packages/forms/src/Components/Concerns/CanBeDisabled.php new file mode 100644 index 0000000000..5dab333541 --- /dev/null +++ b/packages/forms/src/Components/Concerns/CanBeDisabled.php @@ -0,0 +1,20 @@ +isDisabled = $condition; + + return $this; + } + + public function isDisabled(): bool + { + return $this->evaluate($this->isDisabled) || $this->getContainer()->isDisabled(); + } +} diff --git a/packages/forms/src/Components/Concerns/CanBeHidden.php b/packages/forms/src/Components/Concerns/CanBeHidden.php new file mode 100644 index 0000000000..716ff3b5da --- /dev/null +++ b/packages/forms/src/Components/Concerns/CanBeHidden.php @@ -0,0 +1,70 @@ +isHidden = $condition; + + return $this; + } + + public function when(bool | callable $condition = true): static + { + $this->visible($condition); + + return $this; + } + + public function whenTruthy(string | array $paths): static + { + $paths = Arr::wrap($paths); + + $this->hidden(function (callable $get) use ($paths): bool { + foreach ($paths as $path) { + if (! $get($path)) { + return true; + } + } + + return false; + }); + + return $this; + } + + public function whenFalsy(string | array $paths): static + { + $paths = Arr::wrap($paths); + + $this->hidden(function (callable $get) use ($paths): bool { + foreach ($paths as $path) { + if (! ! $get($path)) { + return true; + } + } + + return false; + }); + + return $this; + } + + public function visible(bool | callable $condition = true): static + { + $this->isHidden = fn (): bool => ! $this->evaluate($condition); + + return $this; + } + + public function isHidden(): bool + { + return (bool) $this->evaluate($this->isHidden); + } +} diff --git a/packages/forms/src/Components/Concerns/CanBeInline.php b/packages/forms/src/Components/Concerns/CanBeInline.php new file mode 100644 index 0000000000..c7cd48f7e0 --- /dev/null +++ b/packages/forms/src/Components/Concerns/CanBeInline.php @@ -0,0 +1,20 @@ +isInline = $condition; + + return $this; + } + + public function isInline(): bool + { + return (bool) $this->evaluate($this->isInline); + } +} diff --git a/packages/forms/src/Components/Concerns/CanBeLengthConstrained.php b/packages/forms/src/Components/Concerns/CanBeLengthConstrained.php new file mode 100644 index 0000000000..38cdda069f --- /dev/null +++ b/packages/forms/src/Components/Concerns/CanBeLengthConstrained.php @@ -0,0 +1,46 @@ +maxLength = $length; + + $this->rule(function (): string { + $length = $this->getMaxLength(); + + return "max:{$length}"; + }); + + return $this; + } + + public function minLength(int | callable $length): static + { + $this->minLength = $length; + + $this->rule(function (): string { + $length = $this->getMinLength(); + + return "min:{$length}"; + }); + + return $this; + } + + public function getMaxLength(): ?int + { + return $this->evaluate($this->maxLength); + } + + public function getMinLength(): ?int + { + return $this->evaluate($this->minLength); + } +} diff --git a/packages/forms/src/Components/Concerns/CanBeValidated.php b/packages/forms/src/Components/Concerns/CanBeValidated.php new file mode 100644 index 0000000000..b385297525 --- /dev/null +++ b/packages/forms/src/Components/Concerns/CanBeValidated.php @@ -0,0 +1,172 @@ +rule(function () use ($column, $table) { + $table = $this->evaluate($table) ?? $this->getModelClass(); + $column = $this->evaluate($column) ?? $this->getName(); + + return Rule::exists($table, $column); + }, fn (): bool => (bool) ($this->evaluate($table) ?? $this->getModelClass())); + + return $this; + } + + public function nullable(bool | callable $condition = true): static + { + $this->required(function () use ($condition): bool { + return ! $this->evaluate($condition); + }); + + return $this; + } + + public function required(bool | callable $condition = true): static + { + $this->isRequired = $condition; + + return $this; + } + + public function rule(string | object | callable $rule, bool | callable $condition = true): static + { + $this->rules = array_merge( + $this->rules, + [[$rule, $condition]], + ); + + return $this; + } + + public function rules(array $rules, bool | callable $condition = true): static + { + $this->rules = array_merge( + $this->rules, + array_map(fn (string | object | callable $rule) => [$rule, $condition], $rules), + ); + + return $this; + } + + public function different(string | callable $statePath, bool $isStatePathAbsolute = false): static + { + return $this->fieldComparisonRule('different', $statePath, $isStatePathAbsolute); + } + + public function gt(string | callable $statePath, bool $isStatePathAbsolute = false): static + { + return $this->fieldComparisonRule('gt', $statePath, $isStatePathAbsolute); + } + + public function gte(string | callable $statePath, bool $isStatePathAbsolute = false): static + { + return $this->fieldComparisonRule('gte', $statePath, $isStatePathAbsolute); + } + + public function lt(string | callable $statePath, bool $isStatePathAbsolute = false): static + { + return $this->fieldComparisonRule('lt', $statePath, $isStatePathAbsolute); + } + + public function lte(string | callable $statePath, bool $isStatePathAbsolute = false): static + { + return $this->fieldComparisonRule('lte', $statePath, $isStatePathAbsolute); + } + + public function same(string | callable $statePath, bool $isStatePathAbsolute = false): static + { + return $this->fieldComparisonRule('same', $statePath, $isStatePathAbsolute); + } + + public function unique(string | callable | null $table = null, string | callable | null $column = null, Model | callable $ignorable = null): static + { + $this->rule(function () use ($column, $ignorable, $table) { + $table = $this->evaluate($table) ?? $this->getModelClass(); + $column = $this->evaluate($column) ?? $this->getName(); + $ignorable = $this->evaluate($ignorable); + + return Rule::unique($table, $column) + ->when( + $ignorable, + fn (Unique $rule) => $rule->ignore( + $ignorable->getOriginal($ignorable->getKeyName()), + $ignorable->getKeyName(), + ), + ); + }, fn (): bool => (bool) ($this->evaluate($table) ?? $this->getModelClass())); + + return $this; + } + + public function validationAttribute(string | callable $label): static + { + $this->validationAttribute = $label; + + return $this; + } + + public function getRequiredValidationRule(): string + { + return $this->isRequired() ? 'required' : 'nullable'; + } + + public function getValidationAttribute(): string + { + return $this->evaluate($this->validationAttribute) ?? lcfirst($this->getLabel()); + } + + public function getValidationRules(): array + { + $rules = []; + + $rules[] = $this->getRequiredValidationRule(); + + foreach ($this->rules as [$rule, $condition]) { + if (is_numeric($rule)) { + $rules[] = $this->evaluate($condition); + } elseif ($this->evaluate($condition)) { + $rules[] = $this->evaluate($rule); + } + } + + return $rules; + } + + public function isRequired(): bool + { + return (bool) $this->evaluate($this->isRequired); + } + + protected function fieldComparisonRule(string $rule, string | callable $statePath, bool $isStatePathAbsolute = false): static + { + $this->rule(function () use ($isStatePathAbsolute, $rule, $statePath): string { + $statePath = $this->evaluate($statePath); + + if (! $isStatePathAbsolute) { + $containerStatePath = $this->getContainer()->getStatePath(); + + if ($containerStatePath) { + $statePath = "{$containerStatePath}.{$statePath}"; + } + } + + return "{$rule}:{$statePath}"; + }, fn (): bool => (bool) $this->evaluate($statePath)); + + return $this; + } +} diff --git a/packages/forms/src/Components/Concerns/CanSpanColumns.php b/packages/forms/src/Components/Concerns/CanSpanColumns.php new file mode 100644 index 0000000000..f08ed9ec77 --- /dev/null +++ b/packages/forms/src/Components/Concerns/CanSpanColumns.php @@ -0,0 +1,39 @@ + 1, + 'sm' => null, + 'md' => null, + 'lg' => null, + 'xl' => null, + '2xl' => null, + ]; + + public function columnSpan(array | int | string | null $span): static + { + if (! is_array($span)) { + $span = [ + 'default' => $span, + ]; + } + + $this->columnSpan = array_merge($this->columnSpan, $span); + + return $this; + } + + public function getColumnSpan($breakpoint = null): array | int | string | null + { + $span = $this->columnSpan; + + if ($breakpoint !== null) { + $span = $span[$breakpoint] ?? null; + } + + return $span; + } +} diff --git a/packages/forms/src/Components/Concerns/Cloneable.php b/packages/forms/src/Components/Concerns/Cloneable.php new file mode 100644 index 0000000000..5fb6e8c643 --- /dev/null +++ b/packages/forms/src/Components/Concerns/Cloneable.php @@ -0,0 +1,11 @@ +getModel(); + + return app()->call($value, array_merge([ + 'component' => $this, + 'get' => $this->getGetCallback(), + 'livewire' => $this->getLivewire(), + 'model' => $model, + 'record' => $model instanceof Model ? $model : null, + 'set' => $this->getSetCallback(), + 'state' => $this->getState(), + ], $parameters)); + } + + return $value; + } +} diff --git a/packages/forms/src/Components/Concerns/HasChildComponents.php b/packages/forms/src/Components/Concerns/HasChildComponents.php new file mode 100644 index 0000000000..5ab5d32e09 --- /dev/null +++ b/packages/forms/src/Components/Concerns/HasChildComponents.php @@ -0,0 +1,54 @@ +childComponents = $components; + + return $this; + } + + public function schema(array $components): static + { + $this->childComponents($components); + + return $this; + } + + public function getChildComponents(): array + { + return $this->childComponents; + } + + public function getChildComponentContainer(): ?ComponentContainer + { + if (! $this->hasChildComponentContainer()) { + return null; + } + + return ComponentContainer::make($this->getLivewire()) + ->parentComponent($this) + ->components($this->getChildComponents()); + } + + public function getChildComponentContainers(): array + { + if (! $this->hasChildComponentContainer()) { + return []; + } + + return [$this->getChildComponentContainer()]; + } + + public function hasChildComponentContainer(): bool + { + return ! $this->isHidden() && $this->getChildComponents() !== []; + } +} diff --git a/packages/forms/src/Components/Concerns/HasExtraAttributes.php b/packages/forms/src/Components/Concerns/HasExtraAttributes.php new file mode 100644 index 0000000000..f61eb6ab28 --- /dev/null +++ b/packages/forms/src/Components/Concerns/HasExtraAttributes.php @@ -0,0 +1,20 @@ +extraAttributes = $attributes; + + return $this; + } + + public function getExtraAttributes(): array + { + return $this->evaluate($this->extraAttributes); + } +} diff --git a/packages/forms/src/Components/Concerns/HasFileAttachments.php b/packages/forms/src/Components/Concerns/HasFileAttachments.php new file mode 100644 index 0000000000..355c15b1c7 --- /dev/null +++ b/packages/forms/src/Components/Concerns/HasFileAttachments.php @@ -0,0 +1,112 @@ +fileAttachmentsDirectory = $directory; + + return $this; + } + + public function fileAttachmentsDisk($name): static + { + $this->fileAttachmentsDiskName = $name; + + return $this; + } + + public function saveUploadedFileAttachment(SplFileInfo $attachment): ?string + { + if ($callback = $this->saveUploadedFileAttachmentsUsing) { + $file = $this->evaluate($callback, [ + 'file' => $attachment, + ]); + } else { + $file = $this->handleFileAttachmentUpload($attachment); + } + + if ($callback = $this->getUploadedAttachmentUrlUsing) { + return $this->evaluate($callback, [ + 'file' => $file, + ]); + } + + return $this->handleUploadedAttachmentUrlRetrieval($file); + } + + public function fileAttachmentsVisibility(string | callable $visibility): static + { + $this->fileAttachmentsVisibility = $visibility; + + return $this; + } + + public function getFileAttachmentsDirectory(): ?string + { + return $this->evaluate($this->fileAttachmentsDirectory); + } + + public function getFileAttachmentsDisk(): Filesystem + { + return Storage::disk($this->getFileAttachmentsDiskName()); + } + + public function getFileAttachmentsDiskName(): string + { + return $this->evaluate($this->fileAttachmentsDiskName) ?? config('forms.default_filesystem_disk'); + } + + public function getFileAttachmentsVisibility(): string + { + return $this->evaluate($this->fileAttachmentsVisibility); + } + + public function getUploadedAttachmentUrlUsing(callable $callback): static + { + $this->getUploadedAttachmentUrlUsing = $callback; + + return $this; + } + + protected function handleFileAttachmentUpload($file) + { + $storeMethod = $this->getFileAttachmentsVisibility() === 'public' ? 'storePublicly' : 'store'; + + return $file->{$storeMethod}($this->getFileAttachmentsDirectory(), $this->getFileAttachmentsDiskName()); + } + + protected function handleUploadedAttachmentUrlRetrieval($file): ?string + { + $storage = $this->getFileAttachmentsDisk(); + + if ( + $storage->getDriver()->getAdapter() instanceof AwsS3Adapter && + $storage->getVisibility($file) === 'private' + ) { + return $storage->temporaryUrl( + $file, + now()->addMinutes(5), + ); + } + + return $storage->url($file); + } +} diff --git a/packages/forms/src/Components/Concerns/HasHelperText.php b/packages/forms/src/Components/Concerns/HasHelperText.php new file mode 100644 index 0000000000..4483e6c584 --- /dev/null +++ b/packages/forms/src/Components/Concerns/HasHelperText.php @@ -0,0 +1,20 @@ +helperText = $text; + + return $this; + } + + public function getHelperText(): ?string + { + return $this->evaluate($this->helperText); + } +} diff --git a/packages/forms/src/Components/Concerns/HasHint.php b/packages/forms/src/Components/Concerns/HasHint.php new file mode 100644 index 0000000000..1924885943 --- /dev/null +++ b/packages/forms/src/Components/Concerns/HasHint.php @@ -0,0 +1,20 @@ +hint = $hint; + + return $this; + } + + public function getHint(): ?string + { + return $this->evaluate($this->hint); + } +} diff --git a/packages/forms/src/Components/Concerns/HasId.php b/packages/forms/src/Components/Concerns/HasId.php new file mode 100644 index 0000000000..53ab930ccb --- /dev/null +++ b/packages/forms/src/Components/Concerns/HasId.php @@ -0,0 +1,20 @@ +id = $id; + + return $this; + } + + public function getId(): ?string + { + return $this->evaluate($this->id); + } +} diff --git a/packages/forms/src/Components/Concerns/HasLabel.php b/packages/forms/src/Components/Concerns/HasLabel.php new file mode 100644 index 0000000000..fc73987f79 --- /dev/null +++ b/packages/forms/src/Components/Concerns/HasLabel.php @@ -0,0 +1,34 @@ +isLabelHidden = $condition; + + return $this; + } + + public function label(string | callable $label): static + { + $this->label = $label; + + return $this; + } + + public function getLabel(): ?string + { + return $this->evaluate($this->label); + } + + public function isLabelHidden(): bool + { + return $this->evaluate($this->isLabelHidden); + } +} diff --git a/packages/forms/src/Components/Concerns/HasMaxWidth.php b/packages/forms/src/Components/Concerns/HasMaxWidth.php new file mode 100644 index 0000000000..1be5902d40 --- /dev/null +++ b/packages/forms/src/Components/Concerns/HasMaxWidth.php @@ -0,0 +1,20 @@ +maxWidth = $width; + + return $this; + } + + public function getMaxWidth(): ?string + { + return $this->evaluate($this->maxWidth); + } +} diff --git a/packages/forms/src/Components/Concerns/HasMeta.php b/packages/forms/src/Components/Concerns/HasMeta.php new file mode 100644 index 0000000000..121b0ce869 --- /dev/null +++ b/packages/forms/src/Components/Concerns/HasMeta.php @@ -0,0 +1,35 @@ +meta[$key] = $value; + + return $this; + } + + public function getMeta(string | array | null $keys = null) + { + if (is_array($keys)) { + return Arr::only($this->meta, $keys); + } + + if (is_string($keys)) { + return Arr::get($this->meta, $keys); + } + + return $this->meta; + } + + public function hasMeta(string | array $keys): bool + { + return Arr::has($this->meta, $keys); + } +} diff --git a/packages/forms/src/Components/Concerns/HasName.php b/packages/forms/src/Components/Concerns/HasName.php new file mode 100644 index 0000000000..b873fd946a --- /dev/null +++ b/packages/forms/src/Components/Concerns/HasName.php @@ -0,0 +1,20 @@ +name = $name; + + return $this; + } + + public function getName(): string + { + return $this->name; + } +} diff --git a/packages/forms/src/Components/Concerns/HasPlaceholder.php b/packages/forms/src/Components/Concerns/HasPlaceholder.php new file mode 100644 index 0000000000..5ee8eea303 --- /dev/null +++ b/packages/forms/src/Components/Concerns/HasPlaceholder.php @@ -0,0 +1,20 @@ +placeholder = $placeholder; + + return $this; + } + + public function getPlaceholder(): ?string + { + return $this->evaluate($this->placeholder); + } +} diff --git a/packages/forms/src/Components/Concerns/HasState.php b/packages/forms/src/Components/Concerns/HasState.php new file mode 100644 index 0000000000..b47a4b8dc6 --- /dev/null +++ b/packages/forms/src/Components/Concerns/HasState.php @@ -0,0 +1,202 @@ +afterStateHydrated = $callback; + + return $this; + } + + public function afterStateUpdated(?callable $callback): static + { + $this->afterStateUpdated = $callback; + + return $this; + } + + public function beforeStateDehydrated(?callable $callback): static + { + $this->beforeStateDehydrated = $callback; + + return $this; + } + + public function callAfterStateHydrated(): static + { + if ($callback = $this->afterStateHydrated) { + $this->evaluate($callback); + } + + return $this; + } + + public function callAfterStateUpdated(): static + { + if ($callback = $this->afterStateUpdated) { + $this->evaluate($callback); + } + + return $this; + } + + public function callBeforeStateDehydrated(): static + { + if ($callback = $this->beforeStateDehydrated) { + $this->evaluate($callback); + } + + return $this; + } + + public function default($state): static + { + $this->defaultState = $state; + $this->hasDefaultState = true; + + return $this; + } + + public function dehydrated(bool | callable $condition = true): static + { + $this->isDehydrated = $condition; + + return $this; + } + + public function dehydrateState() + { + if ($callback = $this->dehydrateStateUsing) { + return $this->evaluate($callback); + } + + return $this->getState(); + } + + public function dehydrateStateUsing(?callable $callback): static + { + $this->dehydrateStateUsing = $callback; + + return $this; + } + + public function hydrateDefaultState(): static + { + if (! $this->hasDefaultState()) { + return $this; + } + + $this->state($this->getDefaultState()); + + return $this; + } + + public function state($state): static + { + $livewire = $this->getLivewire(); + + data_set($livewire, $this->getStatePath(), $this->evaluate($state)); + + return $this; + } + + public function statePath(string $path): static + { + $this->statePath = $path; + + return $this; + } + + public function getDefaultState() + { + return $this->evaluate($this->defaultState); + } + + public function getState() + { + return data_get($this->getLivewire(), $this->getStatePath()); + } + + public function getStatePath(bool $isAbsolute = true): string + { + $pathComponents = []; + + if ($isAbsolute && ($containerStatePath = $this->getContainer()->getStatePath())) { + $pathComponents[] = $containerStatePath; + } + + if (($statePath = $this->statePath) !== null) { + $pathComponents[] = $statePath; + } + + return implode('.', $pathComponents); + } + + protected function hasDefaultState(): bool + { + return $this->hasDefaultState; + } + + public function isDehydrated(): bool + { + return (bool) $this->evaluate($this->isDehydrated); + } + + protected function getGetCallback(): callable + { + return function (Component | string $path, bool $isAbsolute = false) { + if ($path instanceof Component) { + $path = $path->getStatePath(); + } elseif ( + (! $isAbsolute) && + ($containerPath = $this->getContainer()->getStatePath()) + ) { + $path = "{$containerPath}.{$path}"; + } + + $livewire = $this->getLivewire(); + + return data_get($livewire, $path); + }; + } + + protected function getSetCallback(): callable + { + return function (string | Component $path, $state, bool $isAbsolute = false) { + if ($path instanceof Component) { + $path = $path->getStatePath(); + } elseif ( + (! $isAbsolute) && + ($containerPath = $this->getContainer()->getStatePath()) + ) { + $path = "{$containerPath}.{$path}"; + } + + $livewire = $this->getLivewire(); + data_set($livewire, $path, $this->evaluate($state)); + + return $state; + }; + } +} diff --git a/packages/forms/src/Components/Concerns/HasView.php b/packages/forms/src/Components/Concerns/HasView.php new file mode 100644 index 0000000000..8fe28675c0 --- /dev/null +++ b/packages/forms/src/Components/Concerns/HasView.php @@ -0,0 +1,20 @@ +view = $view; + + return $this; + } + + public function getView(): string + { + return $this->view; + } +} diff --git a/packages/forms/src/Components/Concerns/InteractsWithToolbarButtons.php b/packages/forms/src/Components/Concerns/InteractsWithToolbarButtons.php new file mode 100644 index 0000000000..6b8bdbe2aa --- /dev/null +++ b/packages/forms/src/Components/Concerns/InteractsWithToolbarButtons.php @@ -0,0 +1,54 @@ +toolbarButtons = []; + } + + return $this; + } + + public function disableToolbarButtons(array $buttonsToDisable = []): static + { + $this->toolbarButtons = collect($this->getToolbarButtons()) + ->filter(fn ($button) => ! in_array($button, $buttonsToDisable)) + ->toArray(); + + return $this; + } + + public function enableToolbarButtons(array $buttonsToEnable = []): static + { + $this->toolbarButtons = array_merge($this->getToolbarButtons(), $buttonsToEnable); + + return $this; + } + + public function toolbarButtons(array | callable $buttons = []): static + { + $this->toolbarButtons = $buttons; + + return $this; + } + + public function getToolbarButtons(): array + { + return $this->evaluate($this->toolbarButtons); + } + + public function hasToolbarButton(string | array $button): bool + { + if (is_array($button)) { + $buttons = $button; + + return (bool) count(array_intersect($buttons, $this->getToolbarButtons())); + } + + return in_array($button, $this->getToolbarButtons()); + } +} diff --git a/packages/forms/src/Components/Concerns/ListensToEvents.php b/packages/forms/src/Components/Concerns/ListensToEvents.php new file mode 100644 index 0000000000..feba4a2046 --- /dev/null +++ b/packages/forms/src/Components/Concerns/ListensToEvents.php @@ -0,0 +1,37 @@ +getListeners($event) as $callback) { + $callback($this, ...$parameters); + } + + return $this; + } + + public function registerListeners(array $listeners): static + { + foreach ($listeners as $event => $callbacks) { + $this->listeners[$event] = array_merge($this->getListeners($event), $callbacks); + } + + return $this; + } + + public function getListeners(string $event = null): array + { + $listeners = $this->listeners; + + if ($event) { + return $listeners[$event] ?? []; + } + + return $listeners; + } +} diff --git a/packages/forms/src/Components/Contracts/CanConcealComponents.php b/packages/forms/src/Components/Contracts/CanConcealComponents.php new file mode 100644 index 0000000000..5d99032367 --- /dev/null +++ b/packages/forms/src/Components/Contracts/CanConcealComponents.php @@ -0,0 +1,7 @@ +afterStateHydrated(function (DateTimePicker $component, callable $set, $state): void { + if (! $state instanceof CarbonInterface) { + return; + } + + $state = $state->format($component->getFormat()); + + $set($component, $state); + }); + + $this->resetFirstDayOfWeek(); + + $this->rule('date', $this->hasDate()); + } + + public function displayFormat(string | callable $format): static + { + $this->displayFormat = $format; + + return $this; + } + + public function firstDayOfWeek(int | callable $day): static + { + if ($day < 0 || $day > 7) { + $day = $this->getDefaultFirstDayOfWeek(); + } + + $this->firstDayOfWeek = $day; + + return $this; + } + + public function format(string | callable $format): static + { + $this->format = $format; + + return $this; + } + + public function maxDate(DateTime | string | callable $date): static + { + $this->maxDate = $date; + + $this->rule(function () use ($date) { + $date = $this->evaluate($date); + + if ($date instanceof DateTime) { + $date = $date->format('Y-m-d'); + } + + return "before_or_equal:{$date}"; + }, fn (): bool => (bool) $this->evaluate($date)); + + return $this; + } + + public function minDate(DateTime | string | callable $date): static + { + $this->minDate = $date; + + $this->rule(function () use ($date) { + $date = $this->evaluate($date); + + if ($date instanceof DateTime) { + $date = $date->format('Y-m-d'); + } + + return "after_or_equal:{$date}"; + }, fn (): bool => (bool) $this->evaluate($date)); + + return $this; + } + + public function resetFirstDayOfWeek(): static + { + $this->firstDayOfWeek($this->getDefaultFirstDayOfWeek()); + + return $this; + } + + public function weekStartsOnMonday(): static + { + $this->firstDayOfWeek(1); + + return $this; + } + + public function weekStartsOnSunday(): static + { + $this->firstDayOfWeek(7); + + return $this; + } + + public function withoutDate(bool | callable $condition = true): static + { + $this->hasDate = fn (): bool => ! $this->evaluate($condition); + + return $this; + } + + public function withoutSeconds(bool | callable $condition = true): static + { + $this->hasSeconds = fn (): bool => ! $this->evaluate($condition); + + return $this; + } + + public function withoutTime(bool | callable $condition = true): static + { + $this->hasTime = fn (): bool => ! $this->evaluate($condition); + + return $this; + } + + public function getDisplayFormat(): string + { + $format = $this->evaluate($this->displayFormat); + + if ($format) { + return $format; + } + + $format = $this->hasDate() ? 'M j, Y' : ''; + + if (! $this->hasTime()) { + return $format; + } + + $format = $format ? "{$format} H:i" : 'H:i'; + + if (! $this->hasSeconds()) { + return $format; + } + + return "{$format}:s"; + } + + public function getFirstDayOfWeek(): int + { + return $this->evaluate($this->firstDayOfWeek); + } + + public function getFormat(): string + { + $format = $this->evaluate($this->format); + + if ($format) { + return $format; + } + + $format = $this->hasDate() ? 'Y-m-d' : ''; + + if (! $this->hasTime()) { + return $format; + } + + $format = $format ? "{$format} H:i" : 'H:i'; + + if (! $this->hasSeconds()) { + return $format; + } + + return "{$format}:s"; + } + + public function getMaxDate(): ?string + { + $date = $this->evaluate($this->maxDate); + + if ($date instanceof DateTime) { + $date = $date->format($this->getFormat()); + } + + return $date; + } + + public function getMinDate(): ?string + { + $date = $this->evaluate($this->minDate); + + if ($date instanceof DateTime) { + $date = $date->format($this->getFormat()); + } + + return $date; + } + + public function hasDate(): bool + { + return (bool) $this->evaluate($this->hasDate); + } + + public function hasSeconds(): bool + { + return (bool) $this->evaluate($this->hasSeconds); + } + + public function hasTime(): bool + { + return (bool) $this->evaluate($this->hasTime); + } + + protected function getDefaultFirstDayOfWeek(): int + { + return config('forms.components.date_time_picker.first_day_of_week', 1); + } +} diff --git a/packages/forms/src/Components/Field.php b/packages/forms/src/Components/Field.php new file mode 100644 index 0000000000..6c304af852 --- /dev/null +++ b/packages/forms/src/Components/Field.php @@ -0,0 +1,47 @@ +name($name); + $this->statePath($name); + } + + public static function make(string $name): static + { + $static = new static($name); + $static->setUp(); + + return $static; + } + + public function getId(): string + { + return parent::getId() ?? $this->getStatePath(); + } + + public function getLabel(): string + { + return parent::getLabel() ?? (string) Str::of($this->getName()) + ->afterLast('.') + ->kebab() + ->replace(['-', '_'], ' ') + ->ucfirst(); + } + + protected function hasDefaultState(): bool + { + return true; + } +} diff --git a/packages/forms/src/Components/Fieldset.php b/packages/forms/src/Components/Fieldset.php new file mode 100644 index 0000000000..329ae95bac --- /dev/null +++ b/packages/forms/src/Components/Fieldset.php @@ -0,0 +1,30 @@ +label($label); + } + + public static function make(string $label): static + { + $static = new static($label); + $static->setUp(); + + return $static; + } + + protected function setUp(): void + { + parent::setUp(); + + $this->columnSpan('full'); + + $this->columns(2); + } +} diff --git a/packages/forms/src/Components/FileUpload.php b/packages/forms/src/Components/FileUpload.php new file mode 100644 index 0000000000..468f5c57ae --- /dev/null +++ b/packages/forms/src/Components/FileUpload.php @@ -0,0 +1,487 @@ +beforeStateDehydrated(function (FileUpload $component): void { + $component->saveUploadedFile(); + }); + + $this->afterStateUpdated(function (FileUpload $component, $state): void { + if (! $component->isMultiple()) { + return; + } + + if (! $state) { + return; + } + + $component->getContainer()->getParentComponent()->appendNewUploadField(); + }); + } + + public function acceptedFileTypes(array | callable $types): static + { + $this->acceptedFileTypes = $types; + + $this->rule(function () { + $types = implode(',', $this->getAcceptedFileTypes()); + + return "mimetypes:{$types}"; + }, function () { + return $this->hasFileObjectState() && count($this->getAcceptedFileTypes()); + }); + + return $this; + } + + public function avatar(): static + { + $this->isAvatar = true; + + $this->image(); + $this->imageCropAspectRatio('1:1'); + $this->imageResizeTargetHeight('500'); + $this->imageResizeTargetWidth('500'); + $this->loadingIndicatorPosition('center bottom'); + $this->panelLayout('compact circle'); + $this->removeUploadedFileButtonPosition('center bottom'); + $this->uploadButtonPosition('center bottom'); + $this->uploadProgressIndicatorPosition('center bottom'); + + return $this; + } + + public function deleteUploadedFile($file = null): static + { + if (! $file) { + $file = $this->getState(); + } + + if ($callback = $this->deleteUploadedFileUsing) { + $this->evaluate($callback, [ + 'file' => $file, + ]); + } else { + $this->handleUploadedFileDeletion($file); + } + + return $this; + } + + public function deleteUploadedFileUsing(callable $callback): static + { + $this->deleteUploadedFileUsing = $callback; + + return $this; + } + + public function directory(string | callable $directory): static + { + $this->directory = $directory; + + return $this; + } + + public function disk($name): static + { + $this->diskName = $name; + + return $this; + } + + public function getUploadedFileUrl(): ?string + { + $file = $this->getState(); + + if (! $file) { + return null; + } + + if ($callback = $this->getUploadedFileUrlUsing) { + return $this->evaluate($callback, [ + 'file' => $file, + ]); + } + + return $this->handleUploadedFileUrlRetrieval($file); + } + + public function getUploadedFileUrlUsing(callable $callback): static + { + $this->getUploadedFileUrlUsing = $callback; + + return $this; + } + + public function idleLabel(string | callable $label): static + { + $this->placeholder($label); + + return $this; + } + + public function image(): static + { + $this->acceptedFileTypes([ + 'image/*', + ]); + + return $this; + } + + public function imageCropAspectRatio(string | callable $ratio): static + { + $this->imageCropAspectRatio = $ratio; + + return $this; + } + + public function imagePreviewHeight(string | callable $height): static + { + $this->imagePreviewHeight = $height; + + return $this; + } + + public function imageResizeTargetHeight(string | callable $height): static + { + $this->imageResizeTargetHeight = $height; + + return $this; + } + + public function imageResizeTargetWidth(string | callable $width): static + { + $this->imageResizeTargetWidth = $width; + + return $this; + } + + public function loadingIndicatorPosition(string | callable $position): static + { + $this->loadingIndicatorPosition = $position; + + return $this; + } + + public function maxSize(int | callable $size): static + { + $this->maxSize = $size; + + $this->rule(function (): string { + $size = $this->getMaxSize(); + + return "max:{$size}"; + }, function () { + return $this->hasFileObjectState(); + }); + + return $this; + } + + public function minSize(int | callable $size): static + { + $this->minSize = $size; + + $this->rule(function (): string { + $size = $this->getMaxSize(); + + return "min:{$size}"; + }, function () { + return $this->hasFileObjectState(); + }); + + return $this; + } + + public function panelAspectRatio(string | callable $ratio): static + { + $this->panelAspectRatio = $ratio; + + return $this; + } + + public function panelLayout(string | callable $layout): static + { + $this->panelLayout = $layout; + + return $this; + } + + public function removeUploadedFileButtonPosition(string | callable $position): static + { + $this->removeUploadedFileButtonPosition = $position; + + return $this; + } + + public function removeUploadedFile(): static + { + $file = $this->getState(); + + if ($callback = $this->removeUploadedFileUsing) { + $this->evaluate($callback, [ + 'file' => $file, + ]); + } else { + $this->handleUploadedFileRemoval($file); + } + + if ($this->isMultiple()) { + $container = $this->getContainer(); + $container->getParentComponent()->removeUploadedFile( + $container->getStatePath(isAbsolute: false), + ); + } + + return $this; + } + + public function removeUploadedFileUsing(callable $callback): static + { + $this->removeUploadedFileUsing = $callback; + + return $this; + } + + public function saveUploadedFile(): void + { + if (! $this->hasFileObjectState()) { + return; + } + + $file = $this->getState(); + + if (! $file) { + return; + } + + if ($callback = $this->saveUploadedFileUsing) { + $file = $this->evaluate($callback, [ + 'file' => $file, + ]); + } else { + $file = $this->handleUpload($file); + } + + $this->state($file); + } + + public function saveUploadedFileUsing(callable $callback): static + { + $this->saveUploadedFileUsing = $callback; + + return $this; + } + + public function uploadButtonPosition(string | callable $position): static + { + $this->uploadButtonPosition = $position; + + return $this; + } + + public function uploadProgressIndicatorPosition(string | callable $position): static + { + $this->uploadProgressIndicatorPosition = $position; + + return $this; + } + + public function visibility(string | callable $visibility): static + { + $this->visibility = $visibility; + + return $this; + } + + public function getAcceptedFileTypes(): array + { + return $this->evaluate($this->acceptedFileTypes); + } + + public function getDirectory(): ?string + { + return $this->evaluate($this->directory); + } + + public function getDisk(): Filesystem + { + return Storage::disk($this->getDiskName()); + } + + public function getDiskName(): string + { + return $this->evaluate($this->diskName) ?? config('forms.default_filesystem_disk'); + } + + public function getImageCropAspectRatio(): ?string + { + return $this->evaluate($this->imageCropAspectRatio); + } + + public function getImagePreviewHeight(): ?string + { + return $this->evaluate($this->imagePreviewHeight); + } + + public function getImageResizeTargetHeight(): ?string + { + return $this->evaluate($this->imageResizeTargetHeight); + } + + public function getImageResizeTargetWidth(): ?string + { + return $this->evaluate($this->imageResizeTargetWidth); + } + + public function getLoadingIndicatorPosition(): string + { + return $this->evaluate($this->loadingIndicatorPosition); + } + + public function getMaxSize(): ?int + { + return $this->evaluate($this->maxSize); + } + + public function getMinSize(): ?int + { + return $this->evaluate($this->minSize); + } + + public function getPanelAspectRatio(): ?string + { + return $this->evaluate($this->panelAspectRatio); + } + + public function getPanelLayout(): ?string + { + return $this->evaluate($this->panelLayout); + } + + public function getRemoveUploadedFileButtonPosition(): string + { + return $this->evaluate($this->removeUploadedFileButtonPosition); + } + + public function getUploadButtonPosition(): string + { + return $this->evaluate($this->uploadButtonPosition); + } + + public function getUploadProgressIndicatorPosition(): string + { + return $this->evaluate($this->uploadProgressIndicatorPosition); + } + + public function getVisibility(): string + { + return $this->evaluate($this->visibility); + } + + public function hasFileObjectState(): bool + { + return $this->getState() instanceof SplFileInfo; + } + + public function isAvatar(): bool + { + return (bool) $this->evaluate($this->isAvatar); + } + + public function isMultiple(): bool + { + return $this->getContainer()->getParentComponent() instanceof MultipleFileUpload; + } + + protected function handleUpload($file) + { + $storeMethod = $this->getVisibility() === 'public' ? 'storePublicly' : 'store'; + + return $file->{$storeMethod}($this->getDirectory(), $this->getDiskName()); + } + + protected function handleUploadedFileDeletion($file): void + { + } + + protected function handleUploadedFileRemoval($file): void + { + $this->state(null); + } + + protected function handleUploadedFileUrlRetrieval($file): ?string + { + $storage = $this->getDisk(); + + if ( + $storage->getDriver()->getAdapter() instanceof AwsS3Adapter && + $storage->getVisibility($file) === 'private' + ) { + return $storage->temporaryUrl( + $file, + now()->addMinutes(5), + ); + } + + return $storage->url($file); + } +} diff --git a/packages/forms/src/Components/Grid.php b/packages/forms/src/Components/Grid.php new file mode 100644 index 0000000000..2b60c715a7 --- /dev/null +++ b/packages/forms/src/Components/Grid.php @@ -0,0 +1,28 @@ +columns($columns); + } + + public static function make(array | int | null $columns = 2): static + { + $static = new static($columns); + $static->setUp(); + + return $static; + } + + protected function setUp(): void + { + parent::setUp(); + + $this->columnSpan('full'); + } +} diff --git a/packages/forms/src/Components/Group.php b/packages/forms/src/Components/Group.php new file mode 100644 index 0000000000..e9c4809375 --- /dev/null +++ b/packages/forms/src/Components/Group.php @@ -0,0 +1,21 @@ +schema($schema); + } + + public static function make(array $schema = []): static + { + $static = new static($schema); + $static->setUp(); + + return $static; + } +} diff --git a/packages/forms/src/Components/Hidden.php b/packages/forms/src/Components/Hidden.php new file mode 100644 index 0000000000..11a3a71cf5 --- /dev/null +++ b/packages/forms/src/Components/Hidden.php @@ -0,0 +1,8 @@ +addButtonLabel(__('forms::components.key_value.buttons.add.label')); + + $this->deleteButtonLabel(__('forms::components.key_value.buttons.delete.label')); + + $this->keyLabel(__('forms::components.key_value.fields.key.label')); + + $this->valueLabel(__('forms::components.key_value.fields.value.label')); + } + + public function addButtonLabel(string | callable $label): static + { + $this->addButtonLabel = $label; + + return $this; + } + + public function deleteButtonLabel(string | callable $label): static + { + $this->deleteButtonLabel = $label; + + return $this; + } + + public function disableAddingRows(bool | callable $condition = true): static + { + $this->canAddRows = fn (): bool => ! $this->evaluate($condition); + + return $this; + } + + public function disableDeletingRows(bool | callable $condition = true): static + { + $this->canDeleteRows = fn (): bool => ! $this->evaluate($condition); + + return $this; + } + + public function disableEditingKeys(bool | callable $condition = true): static + { + $this->canEditKeys = fn (): bool => ! $this->evaluate($condition); + + return $this; + } + + public function keyLabel(string | callable $label): static + { + $this->keyLabel = $label; + + return $this; + } + + public function valueLabel(string | callable $label): static + { + $this->valueLabel = $label; + + return $this; + } + + public function canAddRows(): bool + { + return $this->evaluate($this->canAddRows); + } + + public function canDeleteRows(): bool + { + return $this->evaluate($this->canDeleteRows); + } + + public function canEditKeys(): bool + { + return $this->evaluate($this->canEditKeys); + } + + public function getAddButtonLabel(): string + { + return $this->evaluate($this->addButtonLabel); + } + + public function getDeleteButtonLabel(): string + { + return $this->evaluate($this->deleteButtonLabel); + } + + public function getKeyLabel(): string + { + return $this->evaluate($this->keyLabel); + } + + public function getValueLabel(): string + { + return $this->evaluate($this->valueLabel); + } +} diff --git a/packages/forms/src/Components/MarkdownEditor.php b/packages/forms/src/Components/MarkdownEditor.php new file mode 100644 index 0000000000..bc68d5216e --- /dev/null +++ b/packages/forms/src/Components/MarkdownEditor.php @@ -0,0 +1,25 @@ +getOptionLabelsUsing(function (MultiSelect $component, array $values): array { + $options = $component->getOptions(); + + return collect($values) + ->mapWithKeys(fn ($value) => [$value => $options[$value] ?? $value]) + ->toArray(); + }); + + $this->noSearchResultsMessage(__('forms::components.multi_select.no_search_results_message')); + + $this->placeholder(__('forms::components.multi_select.placeholder')); + + $this->searchPrompt(__('forms::components.multi_select.search_prompt')); + } + + public function getOptionLabelsUsing(callable $callback): static + { + $this->getOptionLabelsUsing = $callback; + + return $this; + } + + public function getSearchResultsUsing(callable $callback): static + { + $this->getSearchResultsUsing = $callback; + + return $this; + } + + public function options(array | Arrayable | callable $options): static + { + $this->options = $options; + + return $this; + } + + public function noSearchResultsMessage(string | callable $message): static + { + $this->noSearchResultsMessage = $message; + + return $this; + } + + public function searchPrompt(string | callable $message): static + { + $this->searchPrompt = $message; + + return $this; + } + + public function getOptionLabels(): array + { + $labels = $this->evaluate($this->getOptionLabelsUsing, [ + 'values' => $this->getState(), + ]); + + if ($labels instanceof Arrayable) { + $labels = $labels->toArray(); + } + + return $labels; + } + + public function getOptions(): array + { + $options = $this->evaluate($this->options); + + if ($options instanceof Arrayable) { + $options = $options->toArray(); + } + + return $options; + } + + public function getNoSearchResultsMessage(): string + { + return $this->evaluate($this->noSearchResultsMessage); + } + + public function getSearchPrompt(): string + { + return $this->evaluate($this->searchPrompt); + } + + public function getSearchResults(string $query): array + { + if (! $this->getSearchResultsUsing) { + return []; + } + + $results = $this->evaluate($this->getSearchResultsUsing, [ + 'query' => $query, + ]); + + if ($results instanceof Arrayable) { + $results = $results->toArray(); + } + + return $results; + } + + public function getState(): array + { + $state = parent::getState(); + + if (! is_array($state)) { + return []; + } + + return $state; + } +} diff --git a/packages/forms/src/Components/MultipleFileUpload.php b/packages/forms/src/Components/MultipleFileUpload.php new file mode 100644 index 0000000000..950e15aadb --- /dev/null +++ b/packages/forms/src/Components/MultipleFileUpload.php @@ -0,0 +1,109 @@ +afterStateHydrated(function (MultipleFileUpload $component, $state) { + $files = $state; + + if (! is_array($files)) { + $files = []; + } + + $state = []; + + foreach ($files as $file) { + if ($file) { + $state[(string) Str::uuid()] = [ + 'file' => $file, + ]; + } + } + + $state[(string) Str::uuid()] = [ + 'file' => null, + ]; + + $component->state($state); + }); + + $this->dehydrateStateUsing(function ($state) { + $files = []; + + foreach ($state as $item) { + if ($file = $item['file'] ?? null) { + $files[] = $file; + } + } + + return $files; + }); + } + + public function appendNewUploadField(): void + { + $files = $this->getState(); + + $files[(string) Str::uuid()] = [ + 'file' => null, + ]; + + $this->state($files); + } + + public function removeUploadedFile(string $uuid): void + { + $files = $this->getState(); + + unset($files[$uuid]); + + $this->state($files); + } + + public function uploadComponent(Component | callable $component): static + { + $this->uploadComponent = $component; + + return $this; + } + + public function getChildComponentContainers(): array + { + return collect($this->getState()) + ->map(function ($item, $index): ComponentContainer { + return $this + ->getChildComponentContainer() + ->getClone() + ->statePath($index); + })->toArray(); + } + + public function getChildComponents(): array + { + return [ + $this->getUploadComponent(), + ]; + } + + public function getUploadComponent(): Component + { + return $this->evaluate($this->uploadComponent) ?? $this->getDefaultUploadComponent(); + } + + protected function getDefaultUploadComponent(): Component + { + return FileUpload::make('file'); + } +} diff --git a/packages/forms/src/Components/Placeholder.php b/packages/forms/src/Components/Placeholder.php new file mode 100644 index 0000000000..68ce8c7ab4 --- /dev/null +++ b/packages/forms/src/Components/Placeholder.php @@ -0,0 +1,62 @@ +name($name); + $this->statePath($name); + } + + public static function make(string $name): static + { + $static = new static($name); + $static->setUp(); + + return $static; + } + + protected function setUp(): void + { + parent::setUp(); + + $this->dehydrated(false); + } + + public function state($state): static + { + $this->state = $state; + + return $this; + } + + public function getId(): string + { + return parent::getId() ?? $this->getStatePath(); + } + + public function getLabel(): string + { + return parent::getLabel() ?? (string) Str::of($this->getName()) + ->kebab() + ->replace(['-', '_'], ' ') + ->ucfirst(); + } + + public function getState() + { + return $this->evaluate($this->state); + } +} diff --git a/packages/forms/src/Components/Radio.php b/packages/forms/src/Components/Radio.php new file mode 100644 index 0000000000..e28af8bd6f --- /dev/null +++ b/packages/forms/src/Components/Radio.php @@ -0,0 +1,96 @@ +options([ + 1 => $trueLabel, + 0 => $falseLabel, + ]); + + return $this; + } + + public function disableOptionWhen(bool | callable $callback): static + { + $this->isOptionDisabled = $callback; + + return $this; + } + + public function options(array | Arrayable | callable $options): static + { + $this->options = $options; + + return $this; + } + + public function descriptions(array | Arrayable | callable $descriptions): static + { + $this->descriptions = $descriptions; + + return $this; + } + + public function hasDescription($value): bool + { + return array_key_exists($value, $this->getDescriptions()); + } + + public function getDescription($value): ?string + { + return $this->getDescriptions()[$value] ?? null; + } + + public function getDescriptions(): array + { + $descriptions = $this->evaluate($this->descriptions); + + if ($descriptions instanceof Arrayable) { + $descriptions = $descriptions->toArray(); + } + + return $descriptions; + } + + public function getOptions(): array + { + $options = $this->evaluate($this->options); + + if ($options instanceof Arrayable) { + $options = $options->toArray(); + } + + return $options; + } + + public function isOptionDisabled($value, string $label): bool + { + if ($this->isOptionDisabled === null) { + return false; + } + + return (bool) $this->evaluate($this->isOptionDisabled, [ + 'label' => $label, + 'value' => $value, + ]); + } +} diff --git a/packages/forms/src/Components/Repeater.php b/packages/forms/src/Components/Repeater.php new file mode 100644 index 0000000000..cd7640719b --- /dev/null +++ b/packages/forms/src/Components/Repeater.php @@ -0,0 +1,172 @@ +registerListeners([ + 'repeater.createItem' => [ + function (Repeater $component, string $statePath): void { + if ($component->isDisabled()) { + return; + } + + if ($statePath !== $component->getStatePath()) { + return; + } + + $newUuid = (string) Str::uuid(); + + $livewire = $component->getLivewire(); + data_set($livewire, "{$statePath}.{$newUuid}", []); + + $component->hydrateDefaultItemState($newUuid); + }, + ], + 'repeater.deleteItem' => [ + function (Repeater $component, string $statePath, string $uuidToDelete): void { + if ($component->isDisabled()) { + return; + } + + if ($statePath !== $component->getStatePath()) { + return; + } + + $items = $component->getNormalisedState(); + + unset($items[$uuidToDelete]); + + $livewire = $component->getLivewire(); + data_set($livewire, $statePath, $items); + }, + ], + 'repeater.moveItemDown' => [ + function (Repeater $component, string $statePath, string $uuidToMoveDown): void { + if ($component->isDisabled()) { + return; + } + + if ($component->isItemMovementDisabled()) { + return; + } + + if ($statePath !== $component->getStatePath()) { + return; + } + + $items = Arr::moveElementAfter($component->getNormalisedState(), $uuidToMoveDown); + + $livewire = $component->getLivewire(); + data_set($livewire, $statePath, $items); + }, + ], + 'repeater.moveItemUp' => [ + function (Repeater $component, string $statePath, string $uuidToMoveUp): void { + if ($component->isDisabled()) { + return; + } + + if ($component->isItemMovementDisabled()) { + return; + } + + if ($statePath !== $component->getStatePath()) { + return; + } + + $items = Arr::moveElementBefore($component->getNormalisedState(), $uuidToMoveUp); + + $livewire = $component->getLivewire(); + data_set($livewire, $statePath, $items); + }, + ], + ]); + + $this->createItemButtonLabel(function (Repeater $component) { + return __('forms::components.repeater.buttons.create_item.label', [ + 'label' => lcfirst($component->getLabel()), + ]); + }); + } + + public function createItemButtonLabel(string | callable $label): static + { + $this->createItemButtonLabel = $label; + + return $this; + } + + public function defaultItems(int | callable $count): static + { + $this->default(function (Repeater $component) use ($count): array { + $items = []; + + foreach (range(1, $component->evaluate($count)) as $index) { + $items[(string) Str::uuid()] = []; + } + + return $items; + }); + + return $this; + } + + public function disableItemMovement(bool | callable $condition = true): static + { + $this->isItemMovementDisabled = $condition; + + return $this; + } + + public function hydrateDefaultItemState(string $uuid): void + { + $this->getChildComponentContainers()[$uuid]->hydrateDefaultState(); + } + + public function getChildComponentContainers(): array + { + return collect($this->getNormalisedState()) + ->map(function ($item, $index): ComponentContainer { + return $this + ->getChildComponentContainer() + ->getClone() + ->statePath($index); + })->toArray(); + } + + public function getCreateItemButtonLabel(): string + { + return $this->evaluate($this->createItemButtonLabel); + } + + public function getNormalisedState(): array + { + if (! is_array($state = $this->getState())) { + return []; + } + + return array_filter($state, fn ($item) => is_array($item)); + } + + public function isItemMovementDisabled(): bool + { + return $this->evaluate($this->isItemMovementDisabled); + } +} diff --git a/packages/forms/src/Components/RichEditor.php b/packages/forms/src/Components/RichEditor.php new file mode 100644 index 0000000000..b3e082359a --- /dev/null +++ b/packages/forms/src/Components/RichEditor.php @@ -0,0 +1,28 @@ +heading($heading); + } + + public static function make(string | callable $heading): static + { + $static = new static($heading); + $static->setUp(); + + return $static; + } + + protected function setUp(): void + { + parent::setUp(); + + $this->columnSpan('full'); + } + + public function collapsed(bool | callable $condition = true): static + { + $this->isCollapsed = $condition; + $this->collapsible(true); + + return $this; + } + + public function collapsible(bool | callable $condition = true): static + { + $this->isCollapsible = $condition; + + return $this; + } + + public function description(string | callable | null $description = null): static + { + $this->description = $description; + + return $this; + } + + public function heading(string | callable $heading): static + { + $this->heading = $heading; + + return $this; + } + + public function getDescription(): ?string + { + return $this->evaluate($this->description); + } + + public function getHeading(): string + { + return $this->evaluate($this->heading); + } + + public function getId(): ?string + { + $id = parent::getId(); + + if (! $id) { + $id = Str::slug($this->getHeading()); + + if ($statePath = $this->getStatePath()) { + $id = "{$statePath}.{$id}"; + } + } + + return $id; + } + + public function isCollapsed(): bool + { + return (bool) $this->evaluate($this->isCollapsed); + } + + public function isCollapsible(): bool + { + return (bool) $this->evaluate($this->isCollapsible); + } +} diff --git a/packages/forms/src/Components/Select.php b/packages/forms/src/Components/Select.php new file mode 100644 index 0000000000..b5924d2070 --- /dev/null +++ b/packages/forms/src/Components/Select.php @@ -0,0 +1,173 @@ +getOptionLabelUsing(function (Select $component, $value): ?string { + if (array_key_exists($value, $options = $component->getOptions())) { + return $options[$value]; + } + + return $value; + }); + + $this->noSearchResultsMessage(__('forms::components.select.no_search_results_message')); + + $this->placeholder(__('forms::components.select.placeholder')); + + $this->searchPrompt(__('forms::components.select.search_prompt')); + } + + public function boolean(string $trueLabel = 'Yes', string $falseLabel = 'No'): static + { + $this->options([ + 1 => $trueLabel, + 0 => $falseLabel, + ]); + + return $this; + } + + public function disableOptionWhen(bool | callable $callback): static + { + $this->isOptionDisabled = $callback; + + return $this; + } + + public function getOptionLabelUsing(callable $callback): static + { + $this->getOptionLabelUsing = $callback; + + return $this; + } + + public function getSearchResultsUsing(callable $callback): static + { + $this->getSearchResultsUsing = $callback; + + return $this; + } + + public function options(array | Arrayable | callable $options): static + { + $this->options = $options; + + return $this; + } + + public function searchable(bool | callable $condition = true): static + { + $this->isSearchable = $condition; + + return $this; + } + + public function searchPrompt(string | callable $message): static + { + $this->searchPrompt = $message; + + return $this; + } + + public function noSearchResultsMessage(string | callable $message): static + { + $this->noSearchResultsMessage = $message; + + return $this; + } + + public function getOptionLabel(): ?string + { + return $this->evaluate($this->getOptionLabelUsing, [ + 'value' => $this->getState(), + ]); + } + + public function getOptions(): array + { + $options = $this->evaluate($this->options); + + if ($options instanceof Arrayable) { + $options = $options->toArray(); + } + + return $options; + } + + public function getNoSearchResultsMessage(): string + { + return $this->evaluate($this->noSearchResultsMessage); + } + + public function getSearchPrompt(): string + { + return $this->evaluate($this->searchPrompt); + } + + public function getSearchResults(string $query): array + { + if (! $this->getSearchResultsUsing) { + return []; + } + + $results = $this->evaluate($this->getSearchResultsUsing, [ + 'query' => $query, + ]); + + if ($results instanceof Arrayable) { + $results = $results->toArray(); + } + + return $results; + } + + public function getState() + { + $state = parent::getState(); + + return $state !== '' ? $state : null; + } + + public function isOptionDisabled($value, string $label): bool + { + if ($this->isOptionDisabled === null) { + return false; + } + + return (bool) $this->evaluate($this->isOptionDisabled, [ + 'label' => $label, + 'value' => $value, + ]); + } + + public function isSearchable(): bool + { + return (bool) $this->evaluate($this->isSearchable); + } +} diff --git a/packages/forms/src/Components/Tabs.php b/packages/forms/src/Components/Tabs.php new file mode 100644 index 0000000000..77e9fcc97e --- /dev/null +++ b/packages/forms/src/Components/Tabs.php @@ -0,0 +1,38 @@ +label($label); + } + + public static function make(string $label): static + { + $static = new static($label); + $static->setUp(); + + return $static; + } + + public function tabs(array $tabs): static + { + $this->schema($tabs); + + return $this; + } + + public function getTabsConfig(): array + { + return collect($this->getChildComponentContainer()->getComponents()) + ->filter(fn (Tab $tab): bool => ! $tab->isHidden()) + ->mapWithKeys(fn (Tab $tab): array => [$tab->getId() => $tab->getLabel()]) + ->toArray(); + } +} diff --git a/packages/forms/src/Components/Tabs/Tab.php b/packages/forms/src/Components/Tabs/Tab.php new file mode 100644 index 0000000000..40510f6b6e --- /dev/null +++ b/packages/forms/src/Components/Tabs/Tab.php @@ -0,0 +1,31 @@ +label($label); + $this->id(Str::slug($label)); + } + + public static function make(string $label): static + { + $static = new static($label); + $static->setUp(); + + return $static; + } + + public function getId(): string + { + return $this->getContainer()->getParentComponent()->getId() . '-' . parent::getId() . '-tab'; + } +} diff --git a/packages/forms/src/Components/TagsInput.php b/packages/forms/src/Components/TagsInput.php new file mode 100644 index 0000000000..db6d9e88f6 --- /dev/null +++ b/packages/forms/src/Components/TagsInput.php @@ -0,0 +1,53 @@ +afterStateHydrated(function (TagsInput $component, $state): void { + if (is_array($state)) { + return; + } + + if ($separator = $component->getSeparator()) { + $component->state(explode($separator, $state)); + + return; + } + + $component->state([]); + }); + + $this->dehydrateStateUsing(function (TagsInput $component, $state) { + if ($separator = $component->getSeparator()) { + return implode($separator, $state); + } + + return $state; + }); + + $this->placeholder(__('forms::components.tags_input.placeholder')); + } + + public function separator(string | callable $separator = ','): static + { + $this->separator = $separator; + + return $this; + } + + public function getSeparator(): ?string + { + return $this->evaluate($this->separator); + } +} diff --git a/packages/forms/src/Components/TextInput.php b/packages/forms/src/Components/TextInput.php new file mode 100644 index 0000000000..59333ca3f9 --- /dev/null +++ b/packages/forms/src/Components/TextInput.php @@ -0,0 +1,284 @@ +rule('current_password', $condition); + + return $this; + } + + public function datalist(array | Arrayable | callable $options): static + { + $this->datalistOptions = $options; + + return $this; + } + + public function email(bool | callable $condition = true): static + { + $this->isEmail = $condition; + + $this->rule('email', $condition); + + return $this; + } + + public function inputMode(string | callable $mode): static + { + $this->inputMode = $mode; + + return $this; + } + + public function integer(bool | callable $condition = true): static + { + $this->numeric($condition); + $this->inputMode(fn (): ?string => $condition ? 'numeric' : null); + $this->step(fn (): ?int => $condition ? 1 : null); + + return $this; + } + + public function mask(?callable $configuration): static + { + $this->configureMaskUsing = $configuration; + + return $this; + } + + public function maxValue($value): static + { + $this->maxValue = $value; + + $this->rule(function (): string { + $value = $this->getMaxValue(); + + return "max:{$value}"; + }); + + return $this; + } + + public function minValue($value): static + { + $this->minValue = $value; + + $this->rule(function (): string { + $value = $this->getMinValue(); + + return "min:{$value}"; + }); + + return $this; + } + + public function numeric(bool | callable $condition = true): static + { + $this->isNumeric = $condition; + + $this->inputMode(fn (): ?string => $condition ? 'decimal' : null); + $this->rule('numeric', $condition); + $this->step(fn (): ?string => $condition ? 'any' : null); + + return $this; + } + + public function password(bool | callable $condition = true): static + { + $this->isPassword = $condition; + + return $this; + } + + public function prefix(string | callable $label): static + { + $this->prefixLabel = $label; + + return $this; + } + + public function postfix(string | callable $label): static + { + $this->postfixLabel = $label; + + return $this; + } + + public function step(int | float | string | callable $interval): static + { + $this->step = $interval; + + return $this; + } + + public function tel(bool | callable $condition = true): static + { + $this->isTel = $condition; + + return $this; + } + + public function type(string | callable $type): static + { + $this->type = $type; + + return $this; + } + + public function url(bool | callable $condition = true): static + { + $this->isUrl = $condition; + + $this->rule('url', $condition); + + return $this; + } + + public function getDatalistOptions(): ?array + { + $options = $this->evaluate($this->datalistOptions); + + if ($options instanceof Arrayable) { + $options = $options->toArray(); + } + + return $options; + } + + public function getInputMode(): ?string + { + return $this->evaluate($this->inputMode); + } + + public function getMask(): ?Mask + { + if (! $this->hasMask()) { + return null; + } + + return $this->evaluate($this->configureMaskUsing, [ + 'mask' => new TextInput\Mask(), + ]); + } + + public function getJsonMaskConfiguration(): ?string + { + return $this->getMask()?->toJson(); + } + + public function getMaxValue() + { + return $this->evaluate($this->maxValue); + } + + public function getMinValue() + { + return $this->evaluate($this->minValue); + } + + public function getPrefixLabel(): ?string + { + return $this->evaluate($this->prefixLabel); + } + + public function getPostfixLabel(): ?string + { + return $this->evaluate($this->postfixLabel); + } + + public function getStep(): int | float | string | null + { + return $this->evaluate($this->step); + } + + public function getType(): string + { + if ($type = $this->evaluate($this->type)) { + return $type; + } elseif ($this->isEmail()) { + return 'email'; + } elseif ($this->isNumeric()) { + return 'number'; + } elseif ($this->isPassword()) { + return 'password'; + } elseif ($this->isTel()) { + return 'tel'; + } elseif ($this->isUrl()) { + return 'url'; + } + + return 'text'; + } + + public function hasMask(): bool + { + return $this->configureMaskUsing !== null; + } + + public function isEmail(): bool + { + return (bool) $this->evaluate($this->isEmail); + } + + public function isNumeric(): bool + { + return (bool) $this->evaluate($this->isNumeric); + } + + public function isPassword(): bool + { + return (bool) $this->evaluate($this->isPassword); + } + + public function isTel(): bool + { + return (bool) $this->evaluate($this->isTel); + } + + public function isUrl(): bool + { + return (bool) $this->evaluate($this->isUrl); + } +} diff --git a/packages/forms/src/Components/TextInput/Mask.php b/packages/forms/src/Components/TextInput/Mask.php new file mode 100644 index 0000000000..47adcd4463 --- /dev/null +++ b/packages/forms/src/Components/TextInput/Mask.php @@ -0,0 +1,346 @@ +shouldAutofix = $condition; + + return $this; + } + + public function decimalPlaces(?int $places): static + { + $this->decimalPlaces = $places; + + return $this; + } + + public function decimalSeparator(?string $separator = '.'): static + { + $this->decimalSeparator = $separator; + + return $this; + } + + public function enum(array $values): static + { + $this->enum = $values; + + return $this; + } + + public function from(?int $value): static + { + $this->fromValue = $value; + + return $this; + } + + public function integer(): static + { + $this->decimalPlaces(0); + + return $this; + } + + public function jsonOptions(?string $json = null): static + { + $this->jsonOptions = $json; + + return $this; + } + + public function lazyPlaceholder(bool $condition = true): static + { + $this->hasLazyPlaceholder = $condition; + + return $this; + } + + public function mapToDecimalSeparator(array $characters): static + { + $this->mapToDecimalSeparator = $characters; + + return $this; + } + + public function maxLength(?int $value): static + { + $this->maxLength = $value; + + return $this; + } + + public function maxValue(?int $value): static + { + $this->maxValue = $value; + + return $this; + } + + public function minValue(?int $value): static + { + $this->minValue = $value; + + return $this; + } + + public function money(string $prefix = '$', string $thousandsSeparator = ',', int $decimalPlaces = 2): static + { + $this + ->patternBlocks([ + 'money' => fn (Mask $mask) => $mask + ->numeric() + ->thousandsSeparator($thousandsSeparator) + ->decimalPlaces($decimalPlaces), + ]) + ->pattern("{$prefix}money") + ->lazyPlaceholder(false); + + return $this; + } + + public function numeric(bool $condition = true): static + { + $this->isNumeric = $condition; + + return $this; + } + + public function normalizeZeros(bool $condition = true): static + { + $this->shouldNormalizeZeros = $condition; + + return $this; + } + + public function padFractionalZeros(bool $condition = true): static + { + $this->shouldPadFractionalZeros = $condition; + + return $this; + } + + public function pattern($pattern): static + { + $this->pattern = $pattern; + + return $this; + } + + public function patternBlocks(array $blocks): static + { + $this->patternBlocks = $blocks; + + return $this; + } + + public function patternDefinitions(array $definitions): static + { + $this->patternDefinitions = $definitions; + + return $this; + } + + public function placeholderCharacter(string $character): static + { + $this->placeholderCharacter = $character; + + return $this; + } + + public function positive(): static + { + $this->signed(false); + + return $this; + } + + public function range(bool $condition = true): static + { + $this->isRange = $condition; + + return $this; + } + + public function signed(bool $condition = true): static + { + $this->isSigned = $condition; + + return $this; + } + + public function thousandsSeparator(?string $separator = ','): static + { + $this->thousandsSeparator = $separator; + + return $this; + } + + public function to(?int $value): static + { + $this->toValue = $value; + + return $this; + } + + protected function getArrayableConfiguration(): array + { + $configuration = []; + + if ($this->pattern !== null) { + $configuration['mask'] = $this->pattern; + } elseif ($this->enum !== []) { + $configuration['mask'] = '{{ IMask.MaskedEnum }}'; + $configuration['enum'] = $this->enum; + } elseif ($this->isNumeric) { + $configuration['mask'] = '{{ Number }}'; + } elseif ($this->isRange) { + $configuration['mask'] = '{{ IMask.MaskedRange }}'; + } + + if ($this->shouldAutofix) { + $configuration['autofix'] = true; + } + + if ($this->patternBlocks !== []) { + $configuration['blocks'] = array_map( + fn (callable $configuration): array => $configuration(new static())->getArrayableConfiguration(), + $this->patternBlocks, + ); + } + + if ($this->patternDefinitions !== []) { + $configuration['definitions'] = $this->patternDefinitions; + } + + if ($this->fromValue !== null) { + $configuration['from'] = $this->toValue; + } + + if (! $this->hasLazyPlaceholder) { + $configuration['lazy'] = false; + } + + if ($this->mapToDecimalSeparator !== ['.']) { + $configuration['mapToRadix'] = $this->mapToDecimalSeparator; + } + + if ($this->maxLength !== null) { + $configuration['maxLength'] = $this->maxLength; + } + + if ($this->maxValue !== null) { + $configuration['max'] = $this->maxValue; + } + + if ($this->minValue !== null) { + $configuration['min'] = $this->minValue; + } + + if (! $this->shouldNormalizeZeros) { + $configuration['normalizeZeros'] = false; + } + + if ($this->shouldPadFractionalZeros) { + $configuration['padFractionalZeros'] = true; + } + + if ($this->toValue !== null) { + $configuration['to'] = $this->toValue; + } + + if ($this->placeholderCharacter !== '_') { + $configuration['placeholderChar'] = $this->placeholderCharacter; + } + + if ($this->decimalSeparator !== ',') { + $configuration['radix'] = $this->decimalSeparator; + } + + if ($this->decimalPlaces !== 2) { + $configuration['scale'] = $this->decimalPlaces; + } + + if (! $this->isSigned) { + $configuration['signed'] = false; + } + + if ($this->thousandsSeparator !== null) { + $configuration['thousandsSeparator'] = $this->thousandsSeparator; + } + + return $configuration; + } + + public function toJson($options = 0): string + { + if (filled($this->jsonOptions)) { + return $this->jsonOptions; + } + + $json = json_encode($this->getArrayableConfiguration(), JSON_UNESCAPED_SLASHES | $options); + + return str_replace( + [ + '"{{ ', + ' }}"', + ], + '', + $json, + ); + } +} diff --git a/packages/forms/src/Components/Textarea.php b/packages/forms/src/Components/Textarea.php new file mode 100644 index 0000000000..100865d5c3 --- /dev/null +++ b/packages/forms/src/Components/Textarea.php @@ -0,0 +1,55 @@ +shouldAutosize = $condition; + + return $this; + } + + public function cols(int | callable $cols): static + { + $this->cols = $cols; + + return $this; + } + + public function rows(int | callable $rows): static + { + $this->rows = $rows; + + return $this; + } + + public function getCols(): ?int + { + return $this->evaluate($this->cols); + } + + public function getRows(): ?int + { + return $this->evaluate($this->rows); + } + + public function shouldAutosize(): bool + { + return $this->rows === null || ((bool) $this->evaluate($this->shouldAutosize)); + } +} diff --git a/packages/forms/src/Components/TimePicker.php b/packages/forms/src/Components/TimePicker.php new file mode 100644 index 0000000000..edf96aeef1 --- /dev/null +++ b/packages/forms/src/Components/TimePicker.php @@ -0,0 +1,11 @@ +default(false); + + $this->rule('boolean'); + } + + public function offIcon(string | callable $icon): static + { + $this->offIcon = $icon; + + return $this; + } + + public function onIcon(string | callable $icon): static + { + $this->onIcon = $icon; + + return $this; + } + + public function getOffIcon(): ?string + { + return $this->evaluate($this->offIcon); + } + + public function getOnIcon(): ?string + { + return $this->evaluate($this->onIcon); + } + + public function hasOffIcon(): bool + { + return (bool) $this->getOffIcon(); + } + + public function hasOnIcon(): bool + { + return (bool) $this->getOnIcon(); + } +} diff --git a/packages/forms/src/Components/View.php b/packages/forms/src/Components/View.php new file mode 100644 index 0000000000..3a507c6f06 --- /dev/null +++ b/packages/forms/src/Components/View.php @@ -0,0 +1,16 @@ +view($view); + } + + public static function make(string $view): static + { + return new static($view); + } +} diff --git a/packages/forms/src/Components/ViewField.php b/packages/forms/src/Components/ViewField.php new file mode 100644 index 0000000000..03bc7e4336 --- /dev/null +++ b/packages/forms/src/Components/ViewField.php @@ -0,0 +1,7 @@ +livewire = $livewire; + + return $this; + } + + public function getLivewire(): HasForms + { + return $this->livewire; + } +} diff --git a/packages/forms/src/Concerns/BelongsToModel.php b/packages/forms/src/Concerns/BelongsToModel.php new file mode 100644 index 0000000000..3aa9bb7503 --- /dev/null +++ b/packages/forms/src/Concerns/BelongsToModel.php @@ -0,0 +1,43 @@ +model = $model; + + return $this; + } + + public function saveRelationships(): void + { + foreach ($this->getComponents() as $component) { + if ($component->getModel()) { + $component->saveRelationships(); + } + + foreach ($component->getChildComponentContainers() as $container) { + if ($container->isHidden()) { + continue; + } + + $container->saveRelationships(); + } + } + } + + public function getModel(): Model | string | null + { + if ($model = $this->model) { + return $model; + } + + return $this->getParentComponent()?->getModel(); + } +} diff --git a/packages/forms/src/Concerns/BelongsToParentComponent.php b/packages/forms/src/Concerns/BelongsToParentComponent.php new file mode 100644 index 0000000000..46c8c8bce5 --- /dev/null +++ b/packages/forms/src/Concerns/BelongsToParentComponent.php @@ -0,0 +1,22 @@ +parentComponent = $component; + + return $this; + } + + public function getParentComponent(): ?Component + { + return $this->parentComponent; + } +} diff --git a/packages/forms/src/Concerns/CanBeDisabled.php b/packages/forms/src/Concerns/CanBeDisabled.php new file mode 100644 index 0000000000..ac2236f68d --- /dev/null +++ b/packages/forms/src/Concerns/CanBeDisabled.php @@ -0,0 +1,20 @@ +isDisabled = $condition; + + return $this; + } + + public function isDisabled(): bool + { + return $this->isDisabled || $this->getParentComponent()?->isDisabled(); + } +} diff --git a/packages/forms/src/Concerns/CanBeHidden.php b/packages/forms/src/Concerns/CanBeHidden.php new file mode 100644 index 0000000000..41e110cb86 --- /dev/null +++ b/packages/forms/src/Concerns/CanBeHidden.php @@ -0,0 +1,11 @@ +getParentComponent()?->isHidden(); + } +} diff --git a/packages/forms/src/Concerns/CanBeValidated.php b/packages/forms/src/Concerns/CanBeValidated.php new file mode 100644 index 0000000000..6b9474ee9f --- /dev/null +++ b/packages/forms/src/Concerns/CanBeValidated.php @@ -0,0 +1,83 @@ +getComponents() as $component) { + if (in_array($component->getStatePath(), $statePaths)) { + return $component; + } + + foreach ($component->getChildComponentContainers() as $container) { + if ($container->isHidden()) { + continue; + } + + if ($componentToFocus = $container->getInvalidComponentToFocus($statePaths)) { + return $componentToFocus; + } + } + } + + return null; + } + + public function getValidationAttributes(): array + { + $attributes = []; + + foreach ($this->getComponents() as $component) { + if ($component instanceof Components\Contracts\HasValidationRules) { + $attributes[$component->getStatePath()] = $component->getValidationAttribute(); + } + + foreach ($component->getChildComponentContainers() as $container) { + if ($container->isHidden()) { + continue; + } + + $attributes = array_merge($attributes, $container->getValidationAttributes()); + } + } + + return $attributes; + } + + public function getValidationRules(): array + { + $rules = []; + + foreach ($this->getComponents() as $component) { + if ( + $component instanceof Components\Contracts\HasValidationRules && + count($componentRules = $component->getValidationRules()) + ) { + $rules[$component->getStatePath()] = $componentRules; + } + + foreach ($component->getChildComponentContainers() as $container) { + if ($container->isHidden()) { + continue; + } + + $rules = array_merge($rules, $container->getValidationRules()); + } + } + + return $rules; + } + + public function validate(): array + { + if (! count($this->getComponents())) { + return []; + } + + return $this->getLivewire()->validate($this->getValidationRules(), [], $this->getValidationAttributes()); + } +} diff --git a/packages/forms/src/Concerns/Cloneable.php b/packages/forms/src/Concerns/Cloneable.php new file mode 100644 index 0000000000..94544c2aba --- /dev/null +++ b/packages/forms/src/Concerns/Cloneable.php @@ -0,0 +1,25 @@ +getComponents() as $component) { + $components[] = $component->getClone(); + } + + return $this->components($components); + } + + public function getClone(): static + { + $clone = clone $this; + $clone->cloneComponents(); + + return $clone; + } +} diff --git a/packages/forms/src/Concerns/HasColumns.php b/packages/forms/src/Concerns/HasColumns.php new file mode 100644 index 0000000000..d80498e4a1 --- /dev/null +++ b/packages/forms/src/Concerns/HasColumns.php @@ -0,0 +1,45 @@ + 1, + 'sm' => null, + 'md' => null, + 'lg' => null, + 'xl' => null, + '2xl' => null, + ]; + + public function columns(array | int | null $columns = 2): static + { + if (! is_array($columns)) { + $columns = [ + 'lg' => $columns, + ]; + } + + $this->columns = array_merge($this->columns, $columns); + + return $this; + } + + public function getColumns($breakpoint = null): array | int | null + { + if ($this instanceof ComponentContainer && $this->getParentComponent()) { + $columns = $this->getParentComponent()->getColumns(); + } else { + $columns = $this->columns; + } + + if ($breakpoint !== null) { + $columns = $columns[$breakpoint] ?? null; + } + + return $columns; + } +} diff --git a/packages/forms/src/Concerns/HasComponents.php b/packages/forms/src/Concerns/HasComponents.php new file mode 100644 index 0000000000..f81051da88 --- /dev/null +++ b/packages/forms/src/Concerns/HasComponents.php @@ -0,0 +1,68 @@ +components = array_map(function (Component $component): Component { + $component->container($this); + + return $component; + }, $components); + + return $this; + } + + public function schema(array $components): static + { + $this->components($components); + + return $this; + } + + public function getComponent(string | callable $callback, bool $withHidden = false): ?Component + { + $callback = $callback instanceof Closure + ? $callback + : fn (Component $component): bool => $component instanceof Field && $component->getStatePath() === $callback; + + return collect($this->getFlatComponents($withHidden))->first($callback); + } + + public function getFlatComponents(bool $withHidden = false): array + { + return collect($this->getComponents($withHidden)) + ->map(function (Component $component) use ($withHidden) { + if ($component->hasChildComponentContainer()) { + return array_merge([$component], $component->getChildComponentContainer()->getFlatComponents($withHidden)); + } + + return $component; + }) + ->flatten() + ->all(); + } + + public function getFlatFields(bool $withHidden = false): array + { + return collect($this->getFlatComponents($withHidden)) + ->whereInstanceOf(Field::class) + ->mapWithKeys(fn (Field $field) => [ + $field->getName() => $field, + ]) + ->all(); + } + + public function getComponents(bool $withHidden = false): array + { + return array_filter($this->components, fn (Component $component) => $withHidden ?: ! $component->isHidden()); + } +} diff --git a/packages/forms/src/Concerns/HasState.php b/packages/forms/src/Concerns/HasState.php new file mode 100644 index 0000000000..30cf24faef --- /dev/null +++ b/packages/forms/src/Concerns/HasState.php @@ -0,0 +1,177 @@ +getComponents() as $component) { + $component->callAfterStateHydrated(); + + foreach ($component->getChildComponentContainers() as $container) { + if ($container->isHidden()) { + continue; + } + + $container->callAfterStateHydrated(); + } + } + } + + public function callAfterStateUpdated(string $path): bool + { + foreach ($this->getComponents() as $component) { + if ($component->getStatePath() === $path) { + $component->callAfterStateUpdated(); + + return true; + } + + foreach ($component->getChildComponentContainers() as $container) { + if ($container->isHidden()) { + continue; + } + + if ($container->callAfterStateUpdated($path)) { + return true; + } + } + } + + return false; + } + + public function callBeforeStateDehydrated(): void + { + foreach ($this->getComponents() as $component) { + $component->callBeforeStateDehydrated(); + + $componentModel = $component->getModel(); + + if ($componentModel instanceof Model && $componentModel->exists()) { + $component->saveRelationships(); + } + + foreach ($component->getChildComponentContainers() as $container) { + if ($container->isHidden()) { + continue; + } + + $container->callBeforeStateDehydrated(); + } + } + } + + public function dehydrateState(array &$state = []): array + { + $this->callBeforeStateDehydrated(); + + foreach ($this->getComponents() as $component) { + $componentStatePath = $component->getStatePath(); + + if ($component->isDehydrated()) { + if ($component->getStatePath(isAbsolute: false)) { + data_set($state, $componentStatePath, $component->dehydrateState()); + } + + foreach ($component->getChildComponentContainers() as $container) { + if ($container->isHidden()) { + continue; + } + + $container->dehydrateState($state); + } + } else { + Arr::forget($state, $componentStatePath); + } + } + + return $state; + } + + public function fill(?array $state = null): static + { + if ($state !== null) { + $livewire = $this->getLivewire(); + + if ($statePath = $this->getStatePath()) { + data_set($livewire, $statePath, $state); + } else { + foreach ($state as $key => $value) { + data_set($livewire, $key, $value); + } + } + + $this->callAfterStateHydrated(); + } else { + $this->hydrateDefaultState(); + } + + return $this; + } + + public function hydrateDefaultState(): static + { + foreach ($this->getComponents() as $component) { + $component->hydrateDefaultState(); + $component->callAfterStateHydrated(); + + foreach ($component->getChildComponentContainers() as $container) { + $container->hydrateDefaultState(); + } + } + + return $this; + } + + public function statePath(string $path): static + { + $this->statePath = $path; + + return $this; + } + + public function getState(): array + { + $state = $this->validate(); + + $this->dehydrateState($state); + + if ($statePath = $this->getStatePath()) { + return data_get($state, $statePath, []); + } + + return $state; + } + + public function getStateOnly(array $keys): array + { + return Arr::only($this->getState(), $keys); + } + + public function getStateExcept(array $keys): array + { + return Arr::except($this->getState(), $keys); + } + + public function getStatePath(bool $isAbsolute = true): string + { + $pathComponents = []; + + if ($isAbsolute && $parentComponentStatePath = $this->getParentComponent()?->getStatePath()) { + $pathComponents[] = $parentComponentStatePath; + } + + if (($statePath = $this->statePath) !== null) { + $pathComponents[] = $statePath; + } + + return implode('.', $pathComponents); + } +} diff --git a/packages/forms/src/Concerns/HasStateBindingModifiers.php b/packages/forms/src/Concerns/HasStateBindingModifiers.php new file mode 100644 index 0000000000..97de294b2f --- /dev/null +++ b/packages/forms/src/Concerns/HasStateBindingModifiers.php @@ -0,0 +1,55 @@ +stateBindingModifiers([]); + + return $this; + } + + public function lazy(): static + { + $this->stateBindingModifiers(['lazy']); + + return $this; + } + + public function stateBindingModifiers(array $modifiers): static + { + $this->stateBindingModifiers = $modifiers; + + return $this; + } + + public function applyStateBindingModifiers($expression): string + { + $modifiers = $this->getStateBindingModifiers(); + + return implode('.', array_merge([$expression], $modifiers)); + } + + public function getStateBindingModifiers(): array + { + if ($this->stateBindingModifiers !== null) { + return $this->stateBindingModifiers; + } + + if ($this instanceof Component) { + return $this->getContainer()->getStateBindingModifiers(); + } + + if ($this->getParentComponent()) { + return $this->getParentComponent()->getStateBindingModifiers(); + } + + return ['defer']; + } +} diff --git a/packages/forms/src/Concerns/InteractsWithForms.php b/packages/forms/src/Concerns/InteractsWithForms.php new file mode 100644 index 0000000000..d5927ffc9c --- /dev/null +++ b/packages/forms/src/Concerns/InteractsWithForms.php @@ -0,0 +1,248 @@ +isCachingForms && $form = $this->getCachedForm($property)) { + return $form; + } + + return parent::__get($property); + } + + public function dispatchFormEvent(...$args): void + { + foreach ($this->getCachedForms() as $form) { + $form->dispatchEvent(...$args); + } + } + + public function getComponentFileAttachment(string $statePath): ?SplFileInfo + { + return data_get($this->componentFileAttachments, $statePath); + } + + public function getComponentFileAttachmentUrl(string $statePath): ?string + { + foreach ($this->getCachedForms() as $form) { + if ($url = $form->getComponentFileAttachmentUrl($statePath)) { + return $url; + } + } + + return null; + } + + public function getMultiSelectOptionLabels(string $statePath): array + { + foreach ($this->getCachedForms() as $form) { + if ($labels = $form->getMultiSelectOptionLabels($statePath)) { + return $labels; + } + } + + return []; + } + + public function getMultiSelectSearchResults(string $statePath, string $query): array + { + foreach ($this->getCachedForms() as $form) { + if ($results = $form->getMultiSelectSearchResults($statePath, $query)) { + return $results; + } + } + + return []; + } + + public function getSelectOptionLabel(string $statePath): ?string + { + foreach ($this->getCachedForms() as $form) { + if ($label = $form->getSelectOptionLabel($statePath)) { + return $label; + } + } + + return null; + } + + public function getSelectSearchResults(string $statePath, string $query): array + { + foreach ($this->getCachedForms() as $form) { + if ($results = $form->getSelectSearchResults($statePath, $query)) { + return $results; + } + } + + return []; + } + + public function getUploadedFileUrl(string $statePath): ?string + { + foreach ($this->getCachedForms() as $form) { + if ($url = $form->getUploadedFileUrl($statePath)) { + return $url; + } + } + + return null; + } + + public function removeUploadedFile(string $statePath): void + { + foreach ($this->getCachedForms() as $form) { + $form->removeUploadedFile($statePath); + } + } + + public function validate($rules = null, $messages = [], $attributes = []) + { + try { + return parent::validate($rules, $messages, $attributes); + } catch (ValidationException $exception) { + $this->focusConcealedComponents(array_keys($exception->validator->failed())); + + throw $exception; + } + } + + public function validateOnly($field, $rules = null, $messages = [], $attributes = []) + { + try { + return parent::validateOnly($field, $rules, $messages, $attributes); + } catch (ValidationException $exception) { + $this->focusConcealedComponents(array_keys($exception->validator->failed())); + + throw $exception; + } + } + + protected function callBeforeAndAfterSyncHooks($name, $value, $callback): void + { + parent::callBeforeAndAfterSyncHooks($name, $value, $callback); + + foreach ($this->getCachedForms() as $form) { + $form->callAfterStateUpdated($name); + } + } + + protected function cacheForm(string $name): ComponentContainer + { + $this->isCachingForms = true; + + if ($this->cachedForms === null) { + $this->cacheForms(); + } else { + $this->cachedForms[$name] = $this->getForms()[$name]; + } + + $this->isCachingForms = false; + + return $this->cachedForms[$name]; + } + + protected function cacheForms(): array + { + $this->isCachingForms = true; + + $this->cachedForms = $this->getForms(); + + $this->isCachingForms = false; + + return $this->cachedForms; + } + + protected function focusConcealedComponents(array $statePaths): void + { + $componentToFocus = null; + + foreach ($this->getCachedForms() as $form) { + if ($componentToFocus = $form->getInvalidComponentToFocus($statePaths)) { + break; + } + } + + if ($concealingComponent = $componentToFocus?->getConcealingComponent()) { + $this->dispatchBrowserEvent('expand-concealing-component', [ + 'id' => $concealingComponent->getId(), + ]); + } + } + + protected function getCachedForm($name): ?ComponentContainer + { + return $this->getCachedForms()[$name] ?? null; + } + + protected function getCachedForms(): array + { + if ($this->cachedForms === null) { + return $this->cacheForms(); + } + + return $this->cachedForms; + } + + protected function getFormModel(): Model | string | null + { + return null; + } + + protected function getFormSchema(): array + { + return []; + } + + protected function getForms(): array + { + return [ + 'form' => $this->makeForm() + ->schema($this->getFormSchema()) + ->model($this->getFormModel()), + ]; + } + + protected function getRules(): array + { + $rules = []; + + foreach ($this->getCachedForms() as $form) { + $rules = array_merge($rules, $form->getValidationRules()); + } + + return $rules; + } + + protected function getValidationAttributes(): array + { + $attributes = []; + + foreach ($this->getCachedForms() as $form) { + $attributes = array_merge($attributes, $form->getValidationAttributes()); + } + + return $attributes; + } + + protected function makeForm(): ComponentContainer + { + return ComponentContainer::make($this); + } +} diff --git a/packages/forms/src/Concerns/ListensToEvents.php b/packages/forms/src/Concerns/ListensToEvents.php new file mode 100644 index 0000000000..41d95dba45 --- /dev/null +++ b/packages/forms/src/Concerns/ListensToEvents.php @@ -0,0 +1,23 @@ +getComponents() as $component) { + $component->dispatchEvent($event, ...$parameters); + + foreach ($component->getChildComponentContainers() as $container) { + if ($container->isHidden()) { + continue; + } + + $container->dispatchEvent($event, ...$parameters); + } + } + + return $this; + } +} diff --git a/packages/forms/src/Concerns/SupportsComponentFileAttachments.php b/packages/forms/src/Concerns/SupportsComponentFileAttachments.php new file mode 100644 index 0000000000..f8cc7aaada --- /dev/null +++ b/packages/forms/src/Concerns/SupportsComponentFileAttachments.php @@ -0,0 +1,35 @@ +getComponents() as $component) { + if ($component instanceof HasFileAttachments && $component->getStatePath() === $statePath) { + $attachment = $this->getLivewire()->getComponentFileAttachment($statePath); + + if (! $attachment) { + return null; + } + + return $component->saveUploadedFileAttachment($attachment); + } + + foreach ($component->getChildComponentContainers() as $container) { + if ($container->isHidden()) { + continue; + } + + if ($url = $container->getComponentFileAttachmentUrl($statePath)) { + return $url; + } + } + } + + return null; + } +} diff --git a/packages/forms/src/Concerns/SupportsFileUploadFields.php b/packages/forms/src/Concerns/SupportsFileUploadFields.php new file mode 100644 index 0000000000..f707dc19f9 --- /dev/null +++ b/packages/forms/src/Concerns/SupportsFileUploadFields.php @@ -0,0 +1,52 @@ +getComponents() as $component) { + if ($component instanceof FileUpload && $component->getStatePath() === $statePath) { + return $component->getUploadedFileUrl(); + } + + foreach ($component->getChildComponentContainers() as $container) { + if ($container->isHidden()) { + continue; + } + + if ($url = $container->getUploadedFileUrl($statePath)) { + return $url; + } + } + } + + return null; + } + + public function removeUploadedFile(string $statePath): bool + { + foreach ($this->getComponents() as $component) { + if ($component instanceof FileUpload && $component->getStatePath() === $statePath) { + $component->removeUploadedFile(); + + return true; + } + + foreach ($component->getChildComponentContainers() as $container) { + if ($container->isHidden()) { + continue; + } + + if ($container->removeUploadedFile($statePath)) { + return true; + } + } + } + + return false; + } +} diff --git a/packages/forms/src/Concerns/SupportsMultiSelectFields.php b/packages/forms/src/Concerns/SupportsMultiSelectFields.php new file mode 100644 index 0000000000..600819ea7e --- /dev/null +++ b/packages/forms/src/Concerns/SupportsMultiSelectFields.php @@ -0,0 +1,50 @@ +getComponents() as $component) { + if ($component instanceof MultiSelect && $component->getStatePath() === $statePath) { + return $component->getOptionLabels(); + } + + foreach ($component->getChildComponentContainers() as $container) { + if ($container->isHidden()) { + continue; + } + + if ($results = $container->getMultiSelectOptionLabels($statePath)) { + return $results; + } + } + } + + return []; + } + + public function getMultiSelectSearchResults(string $statePath, string $query): array + { + foreach ($this->getComponents() as $component) { + if ($component instanceof MultiSelect && $component->getStatePath() === $statePath) { + return $component->getSearchResults($query); + } + + foreach ($component->getChildComponentContainers() as $container) { + if ($container->isHidden()) { + continue; + } + + if ($results = $container->getMultiSelectSearchResults($statePath, $query)) { + return $results; + } + } + } + + return []; + } +} diff --git a/packages/forms/src/Concerns/SupportsSelectFields.php b/packages/forms/src/Concerns/SupportsSelectFields.php new file mode 100644 index 0000000000..bc48370032 --- /dev/null +++ b/packages/forms/src/Concerns/SupportsSelectFields.php @@ -0,0 +1,50 @@ +getComponents() as $component) { + if ($component instanceof Select && $component->getStatePath() === $statePath) { + return $component->getOptionLabel(); + } + + foreach ($component->getChildComponentContainers() as $container) { + if ($container->isHidden()) { + continue; + } + + if ($results = $container->getSelectOptionLabel($statePath)) { + return $results; + } + } + } + + return null; + } + + public function getSelectSearchResults(string $statePath, string $query): array + { + foreach ($this->getComponents() as $component) { + if ($component instanceof Select && $component->getStatePath() === $statePath) { + return $component->getSearchResults($query); + } + + foreach ($component->getChildComponentContainers() as $container) { + if ($container->isHidden()) { + continue; + } + + if ($results = $container->getSelectSearchResults($statePath, $query)) { + return $results; + } + } + } + + return []; + } +} diff --git a/packages/forms/src/Contracts/HasForms.php b/packages/forms/src/Contracts/HasForms.php new file mode 100644 index 0000000000..15d27b794c --- /dev/null +++ b/packages/forms/src/Contracts/HasForms.php @@ -0,0 +1,28 @@ +name('forms') + ->hasCommands($this->getCommands()) + ->hasConfigFile() + ->hasTranslations() + ->hasViews(); + } + + protected function getCommands(): array + { + $commands = [ + Commands\InstallCommand::class, + Commands\MakeFieldCommand::class, + Commands\MakeLayoutComponentCommand::class, + ]; + + $aliases = []; + + foreach ($commands as $command) { + $class = 'Filament\\Forms\\Commands\\Aliases\\' . class_basename($command); + + if (! class_exists($class)) { + continue; + } + + $aliases[] = $class; + } + + return array_merge($commands, $aliases); + } + + public function packageBooted(): void + { + Arr::macro('moveElementAfter', function (array $array, $keyToMoveAfter): array { + $keys = array_keys($array); + + $indexToMoveAfter = array_search($keyToMoveAfter, $keys); + $keyToMoveBefore = $keys[$indexToMoveAfter + 1]; + + $keys[$indexToMoveAfter + 1] = $keyToMoveAfter; + $keys[$indexToMoveAfter] = $keyToMoveBefore; + + $newArray = []; + + foreach ($keys as $key) { + $newArray[$key] = $array[$key]; + } + + return $newArray; + }); + + Arr::macro('moveElementBefore', function (array $array, $keyToMoveBefore): array { + $keys = array_keys($array); + + $indexToMoveBefore = array_search($keyToMoveBefore, $keys); + $keyToMoveAfter = $keys[$indexToMoveBefore - 1]; + + $keys[$indexToMoveBefore - 1] = $keyToMoveBefore; + $keys[$indexToMoveBefore] = $keyToMoveAfter; + + $newArray = []; + + foreach ($keys as $key) { + $newArray[$key] = $array[$key]; + } + + return $newArray; + }); + } +} diff --git a/packages/forms/stubs/Field.stub b/packages/forms/stubs/Field.stub new file mode 100644 index 0000000000..521e95cd66 --- /dev/null +++ b/packages/forms/stubs/Field.stub @@ -0,0 +1,10 @@ + +
    + +
    + diff --git a/packages/forms/stubs/LayoutComponent.stub b/packages/forms/stubs/LayoutComponent.stub new file mode 100644 index 0000000000..43d2e13d85 --- /dev/null +++ b/packages/forms/stubs/LayoutComponent.stub @@ -0,0 +1,15 @@ + + {{ $getChildComponentContainer() }} + diff --git a/packages/forms/stubs/scaffolding/resources/css/app.css b/packages/forms/stubs/scaffolding/resources/css/app.css new file mode 100644 index 0000000000..5fdcc74c06 --- /dev/null +++ b/packages/forms/stubs/scaffolding/resources/css/app.css @@ -0,0 +1,5 @@ +@import '../../vendor/filament/forms/dist/module.esm.css'; + +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/packages/forms/stubs/scaffolding/resources/js/app.js b/packages/forms/stubs/scaffolding/resources/js/app.js new file mode 100644 index 0000000000..e7d7ee7d50 --- /dev/null +++ b/packages/forms/stubs/scaffolding/resources/js/app.js @@ -0,0 +1,8 @@ +import Alpine from 'alpinejs' +import FormsAlpinePlugin from '../../vendor/filament/forms/dist/module.esm' + +Alpine.plugin(FormsAlpinePlugin) + +window.Alpine = Alpine + +Alpine.start() diff --git a/packages/forms/stubs/scaffolding/resources/views/layouts/app.blade.php b/packages/forms/stubs/scaffolding/resources/views/layouts/app.blade.php new file mode 100644 index 0000000000..1f2bdb9818 --- /dev/null +++ b/packages/forms/stubs/scaffolding/resources/views/layouts/app.blade.php @@ -0,0 +1,26 @@ + + + + + + + + + + {{ config('app.name') }} + + + + @livewireStyles + + + + @livewireScripts + + @stack('scripts') + + + + {{ $slot }} + + diff --git a/packages/forms/stubs/scaffolding/tailwind.config.js b/packages/forms/stubs/scaffolding/tailwind.config.js new file mode 100644 index 0000000000..213ad64644 --- /dev/null +++ b/packages/forms/stubs/scaffolding/tailwind.config.js @@ -0,0 +1,21 @@ +const colors = require('tailwindcss/colors') + +module.exports = { + mode: 'jit', + purge: [ + './resources/**/*.blade.php', + './vendor/filament/forms/resources/views/**/*.blade.php', + ], + theme: { + extend: { + colors: { + danger: colors.rose, + primary: colors.blue, + }, + }, + }, + plugins: [ + require('@tailwindcss/forms'), + require('@tailwindcss/typography'), + ], +} diff --git a/packages/forms/stubs/scaffolding/webpack.mix.js b/packages/forms/stubs/scaffolding/webpack.mix.js new file mode 100644 index 0000000000..f816fa231d --- /dev/null +++ b/packages/forms/stubs/scaffolding/webpack.mix.js @@ -0,0 +1,7 @@ +const mix = require('laravel-mix') + +mix.js('resources/js/app.js', 'public/js') + .postCss('resources/css/app.css', 'public/css', [ + require('tailwindcss'), + ]) + .version() diff --git a/packages/spatie-laravel-media-library-plugin/.gitignore b/packages/spatie-laravel-media-library-plugin/.gitignore new file mode 100644 index 0000000000..61ead86667 --- /dev/null +++ b/packages/spatie-laravel-media-library-plugin/.gitignore @@ -0,0 +1 @@ +/vendor diff --git a/packages/spatie-laravel-media-library-plugin/composer.json b/packages/spatie-laravel-media-library-plugin/composer.json new file mode 100644 index 0000000000..e6923c9d29 --- /dev/null +++ b/packages/spatie-laravel-media-library-plugin/composer.json @@ -0,0 +1,25 @@ +{ + "name": "filament/spatie-laravel-media-library-plugin", + "description": "Filament support for `spatie/laravel-medialibrary`.", + "license": "MIT", + "homepage": "https://github.com/laravel-filament/filament", + "support": { + "issues": "https://github.com/laravel-filament/filament/issues", + "source": "https://github.com/laravel-filament/filament" + }, + "require": { + "php": "^8.0", + "illuminate/support": "^8.6", + "spatie/laravel-medialibrary": "^9.0" + }, + "autoload": { + "psr-4": { + "Filament\\": "src" + } + }, + "config": { + "sort-packages": true + }, + "minimum-stability": "dev", + "prefer-stable": true +} diff --git a/packages/spatie-laravel-media-library-plugin/composer.lock b/packages/spatie-laravel-media-library-plugin/composer.lock new file mode 100644 index 0000000000..0e2e103b62 --- /dev/null +++ b/packages/spatie-laravel-media-library-plugin/composer.lock @@ -0,0 +1,2961 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "48aed77ea8691a754ea4bae9f00d154d", + "packages": [ + { + "name": "doctrine/inflector", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89", + "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^8.2", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpstan/phpstan-strict-rules": "^0.12", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "vimeo/psalm": "^4.10" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.4" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2021-10-22T20:16:43+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "089edd38f5b8abba6cb01567c2a8aaa47cec4c72" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/089edd38f5b8abba6cb01567c2a8aaa47cec4c72", + "reference": "089edd38f5b8abba6cb01567c2a8aaa47cec4c72", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^8.5.8 || ^9.3.10" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.1.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2021-10-06T17:43:30+00:00" + }, + { + "name": "illuminate/bus", + "version": "v8.70.2", + "source": { + "type": "git", + "url": "https://github.com/illuminate/bus.git", + "reference": "be400399687b97d5558a224e970060fd5d5f2735" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/bus/zipball/be400399687b97d5558a224e970060fd5d5f2735", + "reference": "be400399687b97d5558a224e970060fd5d5f2735", + "shasum": "" + }, + "require": { + "illuminate/collections": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/pipeline": "^8.0", + "illuminate/support": "^8.0", + "php": "^7.3|^8.0" + }, + "suggest": { + "illuminate/queue": "Required to use closures when chaining jobs (^7.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Bus\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Bus package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-10-21T19:19:36+00:00" + }, + { + "name": "illuminate/collections", + "version": "v8.70.2", + "source": { + "type": "git", + "url": "https://github.com/illuminate/collections.git", + "reference": "05f286ec5fd2dd286e8384577047efc375c8954c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/collections/zipball/05f286ec5fd2dd286e8384577047efc375c8954c", + "reference": "05f286ec5fd2dd286e8384577047efc375c8954c", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^8.0", + "illuminate/macroable": "^8.0", + "php": "^7.3|^8.0" + }, + "suggest": { + "symfony/var-dumper": "Required to use the dump method (^5.1.4)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + }, + "files": [ + "helpers.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Collections package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-10-22T18:01:46+00:00" + }, + { + "name": "illuminate/console", + "version": "v8.70.2", + "source": { + "type": "git", + "url": "https://github.com/illuminate/console.git", + "reference": "37194076192cc7bb50041b3605a177b73ffda2a6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/console/zipball/37194076192cc7bb50041b3605a177b73ffda2a6", + "reference": "37194076192cc7bb50041b3605a177b73ffda2a6", + "shasum": "" + }, + "require": { + "illuminate/collections": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/macroable": "^8.0", + "illuminate/support": "^8.0", + "php": "^7.3|^8.0", + "symfony/console": "^5.1.4", + "symfony/process": "^5.1.4" + }, + "suggest": { + "dragonmantank/cron-expression": "Required to use scheduler (^3.0.2).", + "guzzlehttp/guzzle": "Required to use the ping methods on schedules (^6.5.5|^7.0.1).", + "illuminate/bus": "Required to use the scheduled job dispatcher (^8.0).", + "illuminate/container": "Required to use the scheduler (^8.0).", + "illuminate/filesystem": "Required to use the generator command (^8.0).", + "illuminate/queue": "Required to use closures for scheduled jobs (^8.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Console\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Console package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-11-07T21:51:37+00:00" + }, + { + "name": "illuminate/container", + "version": "v8.70.2", + "source": { + "type": "git", + "url": "https://github.com/illuminate/container.git", + "reference": "ef73feb5216ef97ab7023cf59c0c8dbbd5505a9d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/container/zipball/ef73feb5216ef97ab7023cf59c0c8dbbd5505a9d", + "reference": "ef73feb5216ef97ab7023cf59c0c8dbbd5505a9d", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^8.0", + "php": "^7.3|^8.0", + "psr/container": "^1.0" + }, + "provide": { + "psr/container-implementation": "1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Container\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Container package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-09-15T14:32:50+00:00" + }, + { + "name": "illuminate/contracts", + "version": "v8.70.2", + "source": { + "type": "git", + "url": "https://github.com/illuminate/contracts.git", + "reference": "e76f4bce73a2a1656add24bd5210ebc4b8af49c0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/contracts/zipball/e76f4bce73a2a1656add24bd5210ebc4b8af49c0", + "reference": "e76f4bce73a2a1656add24bd5210ebc4b8af49c0", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0", + "psr/container": "^1.0", + "psr/simple-cache": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Contracts\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Contracts package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-10-22T18:01:46+00:00" + }, + { + "name": "illuminate/database", + "version": "v8.70.2", + "source": { + "type": "git", + "url": "https://github.com/illuminate/database.git", + "reference": "06a01de1d80a568079cab54b66ea710482c3ca29" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/database/zipball/06a01de1d80a568079cab54b66ea710482c3ca29", + "reference": "06a01de1d80a568079cab54b66ea710482c3ca29", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/collections": "^8.0", + "illuminate/container": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/macroable": "^8.0", + "illuminate/support": "^8.0", + "php": "^7.3|^8.0", + "symfony/console": "^5.1.4" + }, + "suggest": { + "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.13.3|^3.1.2).", + "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", + "illuminate/console": "Required to use the database commands (^8.0).", + "illuminate/events": "Required to use the observers with Eloquent (^8.0).", + "illuminate/filesystem": "Required to use the migrations (^8.0).", + "illuminate/pagination": "Required to paginate the result set (^8.0).", + "symfony/finder": "Required to use Eloquent model factories (^5.1.4)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Database\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Database package.", + "homepage": "https://laravel.com", + "keywords": [ + "database", + "laravel", + "orm", + "sql" + ], + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-11-09T22:47:38+00:00" + }, + { + "name": "illuminate/macroable", + "version": "v8.70.2", + "source": { + "type": "git", + "url": "https://github.com/illuminate/macroable.git", + "reference": "300aa13c086f25116b5f3cde3ca54ff5c822fb05" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/macroable/zipball/300aa13c086f25116b5f3cde3ca54ff5c822fb05", + "reference": "300aa13c086f25116b5f3cde3ca54ff5c822fb05", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Macroable package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2020-10-27T15:20:30+00:00" + }, + { + "name": "illuminate/pipeline", + "version": "v8.70.2", + "source": { + "type": "git", + "url": "https://github.com/illuminate/pipeline.git", + "reference": "23aeff5b26ae4aee3f370835c76bd0f4e93f71d2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/pipeline/zipball/23aeff5b26ae4aee3f370835c76bd0f4e93f71d2", + "reference": "23aeff5b26ae4aee3f370835c76bd0f4e93f71d2", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^8.0", + "illuminate/support": "^8.0", + "php": "^7.3|^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Pipeline\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Pipeline package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-03-26T18:39:16+00:00" + }, + { + "name": "illuminate/support", + "version": "v8.70.2", + "source": { + "type": "git", + "url": "https://github.com/illuminate/support.git", + "reference": "1ed88eed1d179e5a27171324e57692366449eca0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/support/zipball/1ed88eed1d179e5a27171324e57692366449eca0", + "reference": "1ed88eed1d179e5a27171324e57692366449eca0", + "shasum": "" + }, + "require": { + "doctrine/inflector": "^1.4|^2.0", + "ext-json": "*", + "ext-mbstring": "*", + "illuminate/collections": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/macroable": "^8.0", + "nesbot/carbon": "^2.53.1", + "php": "^7.3|^8.0", + "voku/portable-ascii": "^1.4.8" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "suggest": { + "illuminate/filesystem": "Required to use the composer class (^8.0).", + "league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^1.3|^2.0.2).", + "ramsey/uuid": "Required to use Str::uuid() (^4.2.2).", + "symfony/process": "Required to use the composer class (^5.1.4).", + "symfony/var-dumper": "Required to use the dd function (^5.1.4).", + "vlucas/phpdotenv": "Required to use the Env class and env helper (^5.2)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + }, + "files": [ + "helpers.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Support package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-11-09T17:40:38+00:00" + }, + { + "name": "intervention/image", + "version": "2.7.0", + "source": { + "type": "git", + "url": "https://github.com/Intervention/image.git", + "reference": "9a8cc99d30415ec0b3f7649e1647d03a55698545" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Intervention/image/zipball/9a8cc99d30415ec0b3f7649e1647d03a55698545", + "reference": "9a8cc99d30415ec0b3f7649e1647d03a55698545", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "guzzlehttp/psr7": "~1.1 || ^2.0", + "php": ">=5.4.0" + }, + "require-dev": { + "mockery/mockery": "~0.9.2", + "phpunit/phpunit": "^4.8 || ^5.7 || ^7.5.15" + }, + "suggest": { + "ext-gd": "to use GD library based image processing.", + "ext-imagick": "to use Imagick based image processing.", + "intervention/imagecache": "Caching extension for the Intervention Image library" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + }, + "laravel": { + "providers": [ + "Intervention\\Image\\ImageServiceProvider" + ], + "aliases": { + "Image": "Intervention\\Image\\Facades\\Image" + } + } + }, + "autoload": { + "psr-4": { + "Intervention\\Image\\": "src/Intervention/Image" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Oliver Vogel", + "email": "oliver@olivervogel.com", + "homepage": "http://olivervogel.com/" + } + ], + "description": "Image handling and manipulation library with support for Laravel integration", + "homepage": "http://image.intervention.io/", + "keywords": [ + "gd", + "image", + "imagick", + "laravel", + "thumbnail", + "watermark" + ], + "support": { + "issues": "https://github.com/Intervention/image/issues", + "source": "https://github.com/Intervention/image/tree/2.7.0" + }, + "funding": [ + { + "url": "https://www.paypal.me/interventionphp", + "type": "custom" + }, + { + "url": "https://github.com/Intervention", + "type": "github" + } + ], + "time": "2021-10-03T14:17:12+00:00" + }, + { + "name": "league/flysystem", + "version": "1.1.5", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "18634df356bfd4119fe3d6156bdb990c414c14ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/18634df356bfd4119fe3d6156bdb990c414c14ea", + "reference": "18634df356bfd4119fe3d6156bdb990c414c14ea", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "league/mime-type-detection": "^1.3", + "php": "^7.2.5 || ^8.0" + }, + "conflict": { + "league/flysystem-sftp": "<1.0.6" + }, + "require-dev": { + "phpspec/prophecy": "^1.11.1", + "phpunit/phpunit": "^8.5.8" + }, + "suggest": { + "ext-ftp": "Allows you to use FTP server storage", + "ext-openssl": "Allows you to use FTPS server storage", + "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2", + "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3", + "league/flysystem-azure": "Allows you to use Windows Azure Blob storage", + "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching", + "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem", + "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files", + "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib", + "league/flysystem-webdav": "Allows you to use WebDAV storage", + "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter", + "spatie/flysystem-dropbox": "Allows you to use Dropbox storage", + "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frenky.net" + } + ], + "description": "Filesystem abstraction: Many filesystems, one API.", + "keywords": [ + "Cloud Files", + "WebDAV", + "abstraction", + "aws", + "cloud", + "copy.com", + "dropbox", + "file systems", + "files", + "filesystem", + "filesystems", + "ftp", + "rackspace", + "remote", + "s3", + "sftp", + "storage" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem/issues", + "source": "https://github.com/thephpleague/flysystem/tree/1.1.5" + }, + "funding": [ + { + "url": "https://offset.earth/frankdejonge", + "type": "other" + } + ], + "time": "2021-08-17T13:49:42+00:00" + }, + { + "name": "league/glide", + "version": "1.7.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/glide.git", + "reference": "ae5e26700573cb678919d28e425a8b87bc71c546" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/glide/zipball/ae5e26700573cb678919d28e425a8b87bc71c546", + "reference": "ae5e26700573cb678919d28e425a8b87bc71c546", + "shasum": "" + }, + "require": { + "intervention/image": "^2.4", + "league/flysystem": "^1.0", + "php": "^7.2|^8.0", + "psr/http-message": "^1.0" + }, + "require-dev": { + "mockery/mockery": "^1.3.3", + "phpunit/php-token-stream": "^3.1|^4.0", + "phpunit/phpunit": "^8.5|^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Glide\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jonathan Reinink", + "email": "jonathan@reinink.ca", + "homepage": "http://reinink.ca" + } + ], + "description": "Wonderfully easy on-demand image manipulation library with an HTTP based API.", + "homepage": "http://glide.thephpleague.com", + "keywords": [ + "ImageMagick", + "editing", + "gd", + "image", + "imagick", + "league", + "manipulation", + "processing" + ], + "support": { + "issues": "https://github.com/thephpleague/glide/issues", + "source": "https://github.com/thephpleague/glide/tree/1.7.0" + }, + "time": "2020-11-05T17:34:03+00:00" + }, + { + "name": "league/mime-type-detection", + "version": "1.8.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "b38b25d7b372e9fddb00335400467b223349fd7e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/b38b25d7b372e9fddb00335400467b223349fd7e", + "reference": "b38b25d7b372e9fddb00335400467b223349fd7e", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.18", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\MimeTypeDetection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Mime-type detection for Flysystem", + "support": { + "issues": "https://github.com/thephpleague/mime-type-detection/issues", + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.8.0" + }, + "funding": [ + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2021-09-25T08:23:19+00:00" + }, + { + "name": "maennchen/zipstream-php", + "version": "2.1.0", + "source": { + "type": "git", + "url": "https://github.com/maennchen/ZipStream-PHP.git", + "reference": "c4c5803cc1f93df3d2448478ef79394a5981cc58" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/maennchen/ZipStream-PHP/zipball/c4c5803cc1f93df3d2448478ef79394a5981cc58", + "reference": "c4c5803cc1f93df3d2448478ef79394a5981cc58", + "shasum": "" + }, + "require": { + "myclabs/php-enum": "^1.5", + "php": ">= 7.1", + "psr/http-message": "^1.0", + "symfony/polyfill-mbstring": "^1.0" + }, + "require-dev": { + "ext-zip": "*", + "guzzlehttp/guzzle": ">= 6.3", + "mikey179/vfsstream": "^1.6", + "phpunit/phpunit": ">= 7.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "ZipStream\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Paul Duncan", + "email": "pabs@pablotron.org" + }, + { + "name": "Jonatan Männchen", + "email": "jonatan@maennchen.ch" + }, + { + "name": "Jesse Donat", + "email": "donatj@gmail.com" + }, + { + "name": "András Kolesár", + "email": "kolesar@kolesar.hu" + } + ], + "description": "ZipStream is a library for dynamically streaming dynamic zip files from PHP without writing to the disk at all on the server.", + "keywords": [ + "stream", + "zip" + ], + "support": { + "issues": "https://github.com/maennchen/ZipStream-PHP/issues", + "source": "https://github.com/maennchen/ZipStream-PHP/tree/master" + }, + "funding": [ + { + "url": "https://opencollective.com/zipstream", + "type": "open_collective" + } + ], + "time": "2020-05-30T13:11:16+00:00" + }, + { + "name": "myclabs/php-enum", + "version": "1.8.3", + "source": { + "type": "git", + "url": "https://github.com/myclabs/php-enum.git", + "reference": "b942d263c641ddb5190929ff840c68f78713e937" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/php-enum/zipball/b942d263c641ddb5190929ff840c68f78713e937", + "reference": "b942d263c641ddb5190929ff840c68f78713e937", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.3 || ^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5", + "squizlabs/php_codesniffer": "1.*", + "vimeo/psalm": "^4.6.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "MyCLabs\\Enum\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP Enum contributors", + "homepage": "https://github.com/myclabs/php-enum/graphs/contributors" + } + ], + "description": "PHP Enum implementation", + "homepage": "http://github.com/myclabs/php-enum", + "keywords": [ + "enum" + ], + "support": { + "issues": "https://github.com/myclabs/php-enum/issues", + "source": "https://github.com/myclabs/php-enum/tree/1.8.3" + }, + "funding": [ + { + "url": "https://github.com/mnapoli", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/php-enum", + "type": "tidelift" + } + ], + "time": "2021-07-05T08:18:36+00:00" + }, + { + "name": "nesbot/carbon", + "version": "2.54.0", + "source": { + "type": "git", + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "eed83939f1aed3eee517d03a33f5ec587ac529b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/eed83939f1aed3eee517d03a33f5ec587ac529b5", + "reference": "eed83939f1aed3eee517d03a33f5ec587ac529b5", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.1.8 || ^8.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation": "^3.4 || ^4.0 || ^5.0" + }, + "require-dev": { + "doctrine/dbal": "^2.0 || ^3.0", + "doctrine/orm": "^2.7", + "friendsofphp/php-cs-fixer": "^3.0", + "kylekatarnls/multi-tester": "^2.0", + "phpmd/phpmd": "^2.9", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12.54", + "phpunit/phpunit": "^7.5.20 || ^8.5.14", + "squizlabs/php_codesniffer": "^3.4" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-3.x": "3.x-dev", + "dev-master": "2.x-dev" + }, + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon" + }, + "funding": [ + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "time": "2021-11-01T21:22:20+00:00" + }, + { + "name": "psr/container", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.2" + }, + "time": "2021-11-05T16:50:12+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory/tree/master" + }, + "time": "2019-04-30T12:38:16+00:00" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/master" + }, + "time": "2016-08-06T14:39:51+00:00" + }, + { + "name": "psr/log", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/ef29f6d262798707a9edd554e2b82517ef3a9376", + "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/2.0.0" + }, + "time": "2021-07-14T16:41:46+00:00" + }, + { + "name": "psr/simple-cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/master" + }, + "time": "2017-10-23T01:57:42+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "spatie/image", + "version": "1.10.5", + "source": { + "type": "git", + "url": "https://github.com/spatie/image.git", + "reference": "63a963d0200fb26f2564bf7201fc7272d9b22933" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/image/zipball/63a963d0200fb26f2564bf7201fc7272d9b22933", + "reference": "63a963d0200fb26f2564bf7201fc7272d9b22933", + "shasum": "" + }, + "require": { + "ext-exif": "*", + "ext-json": "*", + "ext-mbstring": "*", + "league/glide": "^1.6", + "php": "^7.2|^8.0", + "spatie/image-optimizer": "^1.1", + "spatie/temporary-directory": "^1.0|^2.0", + "symfony/process": "^3.0|^4.0|^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.0|^9.0", + "symfony/var-dumper": "^4.0|^5.0", + "vimeo/psalm": "^4.6" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\Image\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Manipulate images with an expressive API", + "homepage": "https://github.com/spatie/image", + "keywords": [ + "image", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/image/issues", + "source": "https://github.com/spatie/image/tree/1.10.5" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + }, + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2021-04-07T08:42:24+00:00" + }, + { + "name": "spatie/image-optimizer", + "version": "1.5.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/image-optimizer.git", + "reference": "1b3585c3da2cc8872141fce40fbd17e07e6655d1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/image-optimizer/zipball/1b3585c3da2cc8872141fce40fbd17e07e6655d1", + "reference": "1b3585c3da2cc8872141fce40fbd17e07e6655d1", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.2|^8.0", + "psr/log": "^1.0 | ^2.0 | ^3.0", + "symfony/process": "^4.2|^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^8.0|^9.0", + "symfony/var-dumper": "^4.2|^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\ImageOptimizer\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Easily optimize images using PHP", + "homepage": "https://github.com/spatie/image-optimizer", + "keywords": [ + "image-optimizer", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/image-optimizer/issues", + "source": "https://github.com/spatie/image-optimizer/tree/1.5.0" + }, + "time": "2021-10-11T15:44:16+00:00" + }, + { + "name": "spatie/laravel-medialibrary", + "version": "9.8.3", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-medialibrary.git", + "reference": "687e769a7ba17e49d183947fe058e357ed3c615f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-medialibrary/zipball/687e769a7ba17e49d183947fe058e357ed3c615f", + "reference": "687e769a7ba17e49d183947fe058e357ed3c615f", + "shasum": "" + }, + "require": { + "ext-exif": "*", + "ext-fileinfo": "*", + "ext-json": "*", + "illuminate/bus": "^7.0|^8.0", + "illuminate/console": "^7.0|^8.0", + "illuminate/database": "^7.0|^8.0", + "illuminate/pipeline": "^7.0|^8.0", + "illuminate/support": "^7.0|^8.0", + "league/flysystem": "^1.0.64", + "maennchen/zipstream-php": "^1.0|^2.0", + "php": "^7.4|^8.0", + "spatie/image": "^1.4", + "spatie/temporary-directory": "^1.1|^2.0", + "symfony/console": "^4.4|^5.0" + }, + "conflict": { + "php-ffmpeg/php-ffmpeg": "<0.6.1" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.133.11", + "doctrine/dbal": "^2.12", + "ext-pdo_sqlite": "*", + "ext-zip": "*", + "guzzlehttp/guzzle": "^7.0", + "league/flysystem-aws-s3-v3": "^1.0.23", + "mockery/mockery": "^1.4", + "orchestra/testbench": "^5.0|^6.0", + "phpunit/phpunit": "^9.3", + "spatie/laravel-ray": "^1.24", + "spatie/pdf-to-image": "^2.0", + "spatie/phpunit-snapshot-assertions": "^4.0" + }, + "suggest": { + "league/flysystem-aws-s3-v3": "Required to use AWS S3 file storage", + "php-ffmpeg/php-ffmpeg": "Required for generating video thumbnails", + "spatie/pdf-to-image": "Required for generating thumbsnails of PDFs and SVGs" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\MediaLibrary\\MediaLibraryServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Spatie\\MediaLibrary\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Associate files with Eloquent models", + "homepage": "https://github.com/spatie/laravel-medialibrary", + "keywords": [ + "cms", + "conversion", + "downloads", + "images", + "laravel", + "laravel-medialibrary", + "media", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/laravel-medialibrary/issues", + "source": "https://github.com/spatie/laravel-medialibrary/tree/9.8.3" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + }, + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2021-10-18T22:57:53+00:00" + }, + { + "name": "spatie/temporary-directory", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/temporary-directory.git", + "reference": "06fe0f10d068fdf145c9b2235030e568c913bb61" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/temporary-directory/zipball/06fe0f10d068fdf145c9b2235030e568c913bb61", + "reference": "06fe0f10d068fdf145c9b2235030e568c913bb61", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\TemporaryDirectory\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alex Vanderbist", + "email": "alex@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Easily create, use and destroy temporary directories", + "homepage": "https://github.com/spatie/temporary-directory", + "keywords": [ + "php", + "spatie", + "temporary-directory" + ], + "support": { + "issues": "https://github.com/spatie/temporary-directory/issues", + "source": "https://github.com/spatie/temporary-directory/tree/2.0.0" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + }, + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2021-03-30T19:46:13+00:00" + }, + { + "name": "symfony/console", + "version": "v5.3.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "d4e409d9fbcfbf71af0e5a940abb7b0b4bad0bd3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/d4e409d9fbcfbf71af0e5a940abb7b0b4bad0bd3", + "reference": "d4e409d9fbcfbf71af0e5a940abb7b0b4bad0bd3", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.8", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2", + "symfony/string": "^5.1" + }, + "conflict": { + "psr/log": ">=3", + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", + "symfony/lock": "<4.4", + "symfony/process": "<4.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/log": "^1|^2", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/event-dispatcher": "^4.4|^5.0", + "symfony/lock": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0", + "symfony/var-dumper": "^4.4|^5.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v5.3.10" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-26T09:30:15+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-03-23T23:28:01+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-19T12:13:01+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.23.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "16880ba9c5ebe3642d1995ab866db29270b36535" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/16880ba9c5ebe3642d1995ab866db29270b36535", + "reference": "16880ba9c5ebe3642d1995ab866db29270b36535", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T12:26:48+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-19T12:13:01+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.23.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6", + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T12:26:48+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-19T12:13:01+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.23.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be", + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-07-28T13:41:28+00:00" + }, + { + "name": "symfony/process", + "version": "v5.3.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "38f26c7d6ed535217ea393e05634cb0b244a1967" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/38f26c7d6ed535217ea393e05634cb0b244a1967", + "reference": "38f26c7d6ed535217ea393e05634cb0b244a1967", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v5.3.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-08-04T21:20:46+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", + "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v2.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-04-01T10:43:52+00:00" + }, + { + "name": "symfony/string", + "version": "v5.3.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c", + "reference": "d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" + }, + "require-dev": { + "symfony/error-handler": "^4.4|^5.0", + "symfony/http-client": "^4.4|^5.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "files": [ + "Resources/functions.php" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v5.3.10" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-27T18:21:46+00:00" + }, + { + "name": "symfony/translation", + "version": "v5.3.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "6ef197aea2ac8b9cd63e0da7522b3771714035aa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/6ef197aea2ac8b9cd63e0da7522b3771714035aa", + "reference": "6ef197aea2ac8b9cd63e0da7522b3771714035aa", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation-contracts": "^2.3" + }, + "conflict": { + "symfony/config": "<4.4", + "symfony/dependency-injection": "<5.0", + "symfony/http-kernel": "<5.0", + "symfony/twig-bundle": "<5.0", + "symfony/yaml": "<4.4" + }, + "provide": { + "symfony/translation-implementation": "2.3" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^4.4|^5.0", + "symfony/console": "^4.4|^5.0", + "symfony/dependency-injection": "^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/http-kernel": "^5.0", + "symfony/intl": "^4.4|^5.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/service-contracts": "^1.1.2|^2", + "symfony/yaml": "^4.4|^5.0" + }, + "suggest": { + "psr/log-implementation": "To use logging capability in translator", + "symfony/config": "", + "symfony/yaml": "" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v5.3.10" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-10T06:43:24+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "95c812666f3e91db75385749fe219c5e494c7f95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/95c812666f3e91db75385749fe219c5e494c7f95", + "reference": "95c812666f3e91db75385749fe219c5e494c7f95", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "suggest": { + "symfony/translation-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v2.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-03-23T23:28:01+00:00" + }, + { + "name": "voku/portable-ascii", + "version": "1.5.6", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "80953678b19901e5165c56752d087fc11526017c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/80953678b19901e5165c56752d087fc11526017c", + "reference": "80953678b19901e5165c56752d087fc11526017c", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "http://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/1.5.6" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "time": "2020-11-12T00:07:28+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": [], + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": "^8.0" + }, + "platform-dev": [], + "plugin-api-version": "2.0.0" +} diff --git a/packages/spatie-laravel-media-library-plugin/docs/01-installation.md b/packages/spatie-laravel-media-library-plugin/docs/01-installation.md new file mode 100644 index 0000000000..80b55dc8e9 --- /dev/null +++ b/packages/spatie-laravel-media-library-plugin/docs/01-installation.md @@ -0,0 +1,31 @@ +--- +title: Installation +--- + +## Requirements + +Filament has a few requirements to run: + +- PHP 8.0+ +- Laravel v8.0+ +- Livewire v2.0+ + +This plugin is compatible with other Filament v2.x packages. + +## Installation + +Install the plugin with Composer: + +```bash +composer require filament/spatie-laravel-media-library-plugin +``` + +You're now ready to start using the [form components](form-components) and [table columns](table-columns)! + +## Upgrade Guide + +To upgrade the package to the latest version, you must run: + +```bash +composer update +``` diff --git a/packages/spatie-laravel-media-library-plugin/docs/02-form-components.md b/packages/spatie-laravel-media-library-plugin/docs/02-form-components.md new file mode 100644 index 0000000000..de1972a539 --- /dev/null +++ b/packages/spatie-laravel-media-library-plugin/docs/02-form-components.md @@ -0,0 +1,38 @@ +--- +title: Form Components +--- + +To use the media library file upload, you may pass a `model()` to the component: + +```php +use Filament\Forms\Components\SpatieMediaLibraryFileUpload; + +SpatieMediaLibraryFileUpload::make('avatar') + ->model(auth()->user()), +``` + +When a model instance is attached, files will automatically be populated [and saved](/docs/forms/getting-started#field-relationships) to that model. Alternatively, if you do not have access to a model instance, you may [attach the model instance after the form is saved](/docs/forms/getting-started#saving-field-relationships-manually). + +Optionally, you may pass a `collection()`: + +```php +use Filament\Forms\Components\SpatieMediaLibraryFileUpload; + +SpatieMediaLibraryFileUpload::make('avatar') + ->collection('avatars') + ->model(auth()->user()), +``` + +The [collection](https://spatie.be/docs/laravel-medialibrary/v9/working-with-media-collections/simple-media-collections) allows you to group files into categories. + +The media library file upload supports all the customization options of the [original file upload component](/docs/forms/fields#file-upload). + +You may also upload multiple files: + +```php +use Filament\Forms\Components\SpatieMediaLibraryMultipleFileUpload; + +SpatieMediaLibraryMultipleFileUpload::make('documents') + ->collection('documents') + ->model(auth()->user()), +``` diff --git a/packages/spatie-laravel-media-library-plugin/docs/03-table-columns.md b/packages/spatie-laravel-media-library-plugin/docs/03-table-columns.md new file mode 100644 index 0000000000..0933a3d06e --- /dev/null +++ b/packages/spatie-laravel-media-library-plugin/docs/03-table-columns.md @@ -0,0 +1,23 @@ +--- +title: Table Columns +--- + +To use the media library image column: + +```php +use Filament\Tables\Components\SpatieMediaLibraryImageColumn; + +SpatieMediaLibraryImageColumn::make('avatar'), +``` + +Optionally, you may pass a `collection()`: + +```php +use Filament\Tables\Components\SpatieMediaLibraryImageColumn; + +SpatieMediaLibraryImageColumn::make('avatar')->collection('avatars'), +``` + +The [collection](https://spatie.be/docs/laravel-medialibrary/v9/working-with-media-collections/simple-media-collections) you to group files into categories. + +The media library image column supports all the customization options of the [original image column](/docs/tables/columns#image-column). diff --git a/packages/spatie-laravel-media-library-plugin/src/Forms/Components/SpatieMediaLibraryFileUpload.php b/packages/spatie-laravel-media-library-plugin/src/Forms/Components/SpatieMediaLibraryFileUpload.php new file mode 100644 index 0000000000..a991ac1c5e --- /dev/null +++ b/packages/spatie-laravel-media-library-plugin/src/Forms/Components/SpatieMediaLibraryFileUpload.php @@ -0,0 +1,124 @@ +afterStateHydrated(function (SpatieMediaLibraryFileUpload $component) { + if ($component->isMultiple()) { + return; + } + + $component->state($component->getUploadedFile()); + }); + + $this->beforeStateDehydrated(null); + + $this->dehydrated(false); + } + + public function collection(string | callable $collection): static + { + $this->collection = $collection; + + return $this; + } + + public function getUploadedFile() + { + $state = $this->getState(); + + if ($state) { + return $state; + } + + $model = $this->getModel(); + + if (! $model instanceof HasMedia) { + return null; + } + + $media = $model + ->getMedia($this->getCollection()) + ->first(); + + if (! $media) { + return null; + } + + return $media->uuid; + } + + public function saveRelationships(): void + { + $this->saveUploadedFile(); + } + + public function getCollection(): ?string + { + if ($collection = $this->evaluate($this->collection)) { + return $collection; + } + + $containerParentComponent = $this->getContainer()->getParentComponent(); + + if (! $containerParentComponent instanceof SpatieMediaLibraryMultipleFileUpload) { + return 'default'; + } + + return $containerParentComponent->getCollection(); + } + + protected function handleUpload($file) + { + if (! ($model = $this->getModel())) { + return $file; + } + + $media = $model + ->addMediaFromString($file->get()) + ->usingFileName($file->getFilename()) + ->toMediaCollection($this->getCollection()); + + return $media->uuid; + } + + protected function handleUploadedFileDeletion($file): void + { + if (! $file) { + return; + } + + Media::findByUuid($file)?->delete(); + } + + protected function handleUploadedFileRemoval($file): void + { + $this->deleteUploadedFile(); + + $this->state(null); + } + + protected function handleUploadedFileUrlRetrieval($file): ?string + { + if (! $this->getModel()) { + return null; + } + + if ($file instanceof SplFileInfo) { + return null; + } + + return Media::findByUuid($file)?->getUrl(); + } +} diff --git a/packages/spatie-laravel-media-library-plugin/src/Forms/Components/SpatieMediaLibraryMultipleFileUpload.php b/packages/spatie-laravel-media-library-plugin/src/Forms/Components/SpatieMediaLibraryMultipleFileUpload.php new file mode 100644 index 0000000000..131ac188b9 --- /dev/null +++ b/packages/spatie-laravel-media-library-plugin/src/Forms/Components/SpatieMediaLibraryMultipleFileUpload.php @@ -0,0 +1,67 @@ +afterStateHydrated(function (SpatieMediaLibraryMultipleFileUpload $component) { + $state = $component->getUploadedFiles(); + + $state[(string) Str::uuid()] = [ + 'file' => null, + ]; + + $component->state($state); + }); + + $this->dehydrated(false); + } + + public function getUploadedFiles(): array + { + $collection = $this->getCollection(); + $model = $this->getModel(); + + if (! $model instanceof HasMedia) { + return []; + } + + $files = []; + + foreach ($model->getMedia($collection) as $file) { + $uuid = $file->uuid; + + $files[$uuid] = [ + 'file' => $uuid, + ]; + } + + return $files; + } + + public function collection(string | callable $collection): static + { + $this->collection = $collection; + + return $this; + } + + public function getCollection(): ?string + { + return $this->evaluate($this->collection) ?? 'default'; + } + + protected function getDefaultUploadComponent(): Component + { + return SpatieMediaLibraryFileUpload::make('file'); + } +} diff --git a/packages/spatie-laravel-media-library-plugin/src/Tables/Columns/SpatieMediaLibraryImageColumn.php b/packages/spatie-laravel-media-library-plugin/src/Tables/Columns/SpatieMediaLibraryImageColumn.php new file mode 100644 index 0000000000..e5698d8f71 --- /dev/null +++ b/packages/spatie-laravel-media-library-plugin/src/Tables/Columns/SpatieMediaLibraryImageColumn.php @@ -0,0 +1,46 @@ +collection = $collection; + + return $this; + } + + public function getCollection(): ?string + { + return $this->collection ?? 'default'; + } + + public function getImagePath(): ?string + { + $state = $this->getState(); + + if ($state) { + return $state; + } + + $media = $this->getRecord() + ->getMedia($this->getCollection()) + ->first(); + + return $media?->getUrl(); + } + + public function applyEagreLoading(Builder $query): Builder + { + if ($this->isHidden()) { + return $query; + } + + return $query->with(['media']); + } +} diff --git a/packages/spatie-laravel-settings-plugin/.gitignore b/packages/spatie-laravel-settings-plugin/.gitignore new file mode 100644 index 0000000000..61ead86667 --- /dev/null +++ b/packages/spatie-laravel-settings-plugin/.gitignore @@ -0,0 +1 @@ +/vendor diff --git a/packages/spatie-laravel-settings-plugin/composer.json b/packages/spatie-laravel-settings-plugin/composer.json new file mode 100644 index 0000000000..c5684acfd1 --- /dev/null +++ b/packages/spatie-laravel-settings-plugin/composer.json @@ -0,0 +1,32 @@ +{ + "name": "filament/spatie-laravel-settings-plugin", + "description": "Filament support for `spatie/laravel-settings`.", + "license": "MIT", + "homepage": "https://github.com/laravel-filament/filament", + "support": { + "issues": "https://github.com/laravel-filament/filament/issues", + "source": "https://github.com/laravel-filament/filament" + }, + "require": { + "php": "^8.0", + "filament/filament": "self.version", + "spatie/laravel-settings": "^2.2" + }, + "autoload": { + "psr-4": { + "Filament\\": "src" + } + }, + "extra": { + "laravel": { + "providers": [ + "Filament\\SpatieLaravelSettingsPluginServiceProvider" + ] + } + }, + "config": { + "sort-packages": true + }, + "minimum-stability": "dev", + "prefer-stable": true +} diff --git a/packages/spatie-laravel-settings-plugin/composer.lock b/packages/spatie-laravel-settings-plugin/composer.lock new file mode 100644 index 0000000000..7b8abf3284 --- /dev/null +++ b/packages/spatie-laravel-settings-plugin/composer.lock @@ -0,0 +1,3987 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "a290c6beaa666aa7b1d7b1785718b773", + "packages": [ + { + "name": "composer/package-versions-deprecated", + "version": "1.11.99.4", + "source": { + "type": "git", + "url": "https://github.com/composer/package-versions-deprecated.git", + "reference": "b174585d1fe49ceed21928a945138948cb394600" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/b174585d1fe49ceed21928a945138948cb394600", + "reference": "b174585d1fe49ceed21928a945138948cb394600", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.1.0 || ^2.0", + "php": "^7 || ^8" + }, + "replace": { + "ocramius/package-versions": "1.11.99" + }, + "require-dev": { + "composer/composer": "^1.9.3 || ^2.0@dev", + "ext-zip": "^1.13", + "phpunit/phpunit": "^6.5 || ^7" + }, + "type": "composer-plugin", + "extra": { + "class": "PackageVersions\\Installer", + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "PackageVersions\\": "src/PackageVersions" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be" + } + ], + "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", + "support": { + "issues": "https://github.com/composer/package-versions-deprecated/issues", + "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.4" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2021-09-13T08:41:34+00:00" + }, + { + "name": "danharrin/livewire-rate-limiting", + "version": "v0.3.0", + "source": { + "type": "git", + "url": "https://github.com/danharrin/livewire-rate-limiting.git", + "reference": "c97041cd4f94168d5077d4463062e681d057e00a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/danharrin/livewire-rate-limiting/zipball/c97041cd4f94168d5077d4463062e681d057e00a", + "reference": "c97041cd4f94168d5077d4463062e681d057e00a", + "shasum": "" + }, + "require": { + "illuminate/support": "^8.0", + "php": "^7.2|^8.0" + }, + "require-dev": { + "livewire/livewire": "^2.3", + "orchestra/testbench": "^6.2", + "phpunit/phpunit": "^9.4", + "symplify/monorepo-builder": "^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "DanHarrin\\LivewireRateLimiting\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dan Harrin", + "email": "dan@danharrin.com" + } + ], + "description": "Apply rate limiters to Laravel Livewire actions.", + "homepage": "https://github.com/danharrin/livewire-rate-limiting", + "support": { + "issues": "https://github.com/danharrin/livewire-rate-limiting/issues", + "source": "https://github.com/danharrin/livewire-rate-limiting" + }, + "funding": [ + { + "url": "https://github.com/danharrin", + "type": "github" + } + ], + "time": "2021-05-17T08:01:19+00:00" + }, + { + "name": "doctrine/cache", + "version": "2.1.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/cache.git", + "reference": "331b4d5dbaeab3827976273e9356b3b453c300ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/cache/zipball/331b4d5dbaeab3827976273e9356b3b453c300ce", + "reference": "331b4d5dbaeab3827976273e9356b3b453c300ce", + "shasum": "" + }, + "require": { + "php": "~7.1 || ^8.0" + }, + "conflict": { + "doctrine/common": ">2.2,<2.4" + }, + "require-dev": { + "alcaeus/mongo-php-adapter": "^1.1", + "cache/integration-tests": "dev-master", + "doctrine/coding-standard": "^8.0", + "mongodb/mongodb": "^1.1", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "predis/predis": "~1.0", + "psr/cache": "^1.0 || ^2.0 || ^3.0", + "symfony/cache": "^4.4 || ^5.2 || ^6.0@dev", + "symfony/var-exporter": "^4.4 || ^5.2 || ^6.0@dev" + }, + "suggest": { + "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.", + "homepage": "https://www.doctrine-project.org/projects/cache.html", + "keywords": [ + "abstraction", + "apcu", + "cache", + "caching", + "couchdb", + "memcached", + "php", + "redis", + "xcache" + ], + "support": { + "issues": "https://github.com/doctrine/cache/issues", + "source": "https://github.com/doctrine/cache/tree/2.1.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache", + "type": "tidelift" + } + ], + "time": "2021-07-17T14:49:29+00:00" + }, + { + "name": "doctrine/dbal", + "version": "3.1.4", + "source": { + "type": "git", + "url": "https://github.com/doctrine/dbal.git", + "reference": "821b4f01a36ce63ed36c090ea74767b72db367e9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/821b4f01a36ce63ed36c090ea74767b72db367e9", + "reference": "821b4f01a36ce63ed36c090ea74767b72db367e9", + "shasum": "" + }, + "require": { + "composer/package-versions-deprecated": "^1.11.99", + "doctrine/cache": "^1.0|^2.0", + "doctrine/deprecations": "^0.5.3", + "doctrine/event-manager": "^1.0", + "php": "^7.3 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "9.0.0", + "jetbrains/phpstorm-stubs": "2021.1", + "phpstan/phpstan": "1.1.1", + "phpstan/phpstan-strict-rules": "^1", + "phpunit/phpunit": "9.5.10", + "psalm/plugin-phpunit": "0.16.1", + "squizlabs/php_codesniffer": "3.6.1", + "symfony/cache": "^5.2|^6.0", + "symfony/console": "^2.0.5|^3.0|^4.0|^5.0|^6.0", + "vimeo/psalm": "4.12.0" + }, + "suggest": { + "symfony/console": "For helpful console commands such as SQL execution and import of files." + }, + "bin": [ + "bin/doctrine-dbal" + ], + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\DBAL\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + } + ], + "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.", + "homepage": "https://www.doctrine-project.org/projects/dbal.html", + "keywords": [ + "abstraction", + "database", + "db2", + "dbal", + "mariadb", + "mssql", + "mysql", + "oci8", + "oracle", + "pdo", + "pgsql", + "postgresql", + "queryobject", + "sasql", + "sql", + "sqlite", + "sqlserver", + "sqlsrv" + ], + "support": { + "issues": "https://github.com/doctrine/dbal/issues", + "source": "https://github.com/doctrine/dbal/tree/3.1.4" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdbal", + "type": "tidelift" + } + ], + "time": "2021-11-15T16:44:33+00:00" + }, + { + "name": "doctrine/deprecations", + "version": "v0.5.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "9504165960a1f83cc1480e2be1dd0a0478561314" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/9504165960a1f83cc1480e2be1dd0a0478561314", + "reference": "9504165960a1f83cc1480e2be1dd0a0478561314", + "shasum": "" + }, + "require": { + "php": "^7.1|^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0|^7.0|^8.0", + "phpunit/phpunit": "^7.0|^8.0|^9.0", + "psr/log": "^1.0" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/v0.5.3" + }, + "time": "2021-03-21T12:59:47+00:00" + }, + { + "name": "doctrine/event-manager", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/event-manager.git", + "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/event-manager/zipball/41370af6a30faa9dc0368c4a6814d596e81aba7f", + "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/common": "<2.9@dev" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "phpunit/phpunit": "^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\": "lib/Doctrine/Common" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + } + ], + "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.", + "homepage": "https://www.doctrine-project.org/projects/event-manager.html", + "keywords": [ + "event", + "event dispatcher", + "event manager", + "event system", + "events" + ], + "support": { + "issues": "https://github.com/doctrine/event-manager/issues", + "source": "https://github.com/doctrine/event-manager/tree/1.1.x" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fevent-manager", + "type": "tidelift" + } + ], + "time": "2020-05-29T18:28:51+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89", + "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^8.2", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpstan/phpstan-strict-rules": "^0.12", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "vimeo/psalm": "^4.10" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.4" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2021-10-22T20:16:43+00:00" + }, + { + "name": "doctrine/lexer", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042", + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "phpstan/phpstan": "^0.11.8", + "phpunit/phpunit": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/1.2.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2020-05-25T17:44:05+00:00" + }, + { + "name": "egulias/email-validator", + "version": "2.1.25", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/0dbf5d78455d4d6a41d186da50adc1122ec066f4", + "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^1.0.1", + "php": ">=5.5", + "symfony/polyfill-intl-idn": "^1.10" + }, + "require-dev": { + "dominicsayers/isemail": "^3.0.7", + "phpunit/phpunit": "^4.8.36|^7.5.15", + "satooshi/php-coveralls": "^1.0.1" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/2.1.25" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2020-12-29T14:50:06+00:00" + }, + { + "name": "filament/filament", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/laravel-filament/admin.git", + "reference": "fbe4c5d58ff3e07a2a3a017d9d082abca7c74227" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel-filament/admin/zipball/fbe4c5d58ff3e07a2a3a017d9d082abca7c74227", + "reference": "fbe4c5d58ff3e07a2a3a017d9d082abca7c74227", + "shasum": "" + }, + "require": { + "danharrin/livewire-rate-limiting": "^0.3.0", + "livewire/livewire": "^2.6", + "php": "^8.0", + "spatie/laravel-package-tools": "^1.9" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Filament\\FilamentServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Filament\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Effortlessly build TALL-powered admin panels.", + "homepage": "https://github.com/laravel-filament/filament", + "support": { + "issues": "https://github.com/laravel-filament/filament/issues", + "source": "https://github.com/laravel-filament/filament" + }, + "funding": [ + { + "url": "https://github.com/danharrin", + "type": "github" + } + ], + "time": "2021-11-18T16:38:58+00:00" + }, + { + "name": "illuminate/collections", + "version": "v8.73.2", + "source": { + "type": "git", + "url": "https://github.com/illuminate/collections.git", + "reference": "bfb57bc1863689058706eb41287b7ad523d74403" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/collections/zipball/bfb57bc1863689058706eb41287b7ad523d74403", + "reference": "bfb57bc1863689058706eb41287b7ad523d74403", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^8.0", + "illuminate/macroable": "^8.0", + "php": "^7.3|^8.0" + }, + "suggest": { + "symfony/var-dumper": "Required to use the dump method (^5.1.4)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + }, + "files": [ + "helpers.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Collections package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-11-15T14:44:56+00:00" + }, + { + "name": "illuminate/container", + "version": "v8.73.2", + "source": { + "type": "git", + "url": "https://github.com/illuminate/container.git", + "reference": "6ac391bb27391706c5f921b85060aa2c4ca03fae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/container/zipball/6ac391bb27391706c5f921b85060aa2c4ca03fae", + "reference": "6ac391bb27391706c5f921b85060aa2c4ca03fae", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^8.0", + "php": "^7.3|^8.0", + "psr/container": "^1.0" + }, + "provide": { + "psr/container-implementation": "1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Container\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Container package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-11-17T15:04:30+00:00" + }, + { + "name": "illuminate/contracts", + "version": "v8.73.2", + "source": { + "type": "git", + "url": "https://github.com/illuminate/contracts.git", + "reference": "b0886ec05a63b204634d64d0b39d5b78a7c06f81" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/contracts/zipball/b0886ec05a63b204634d64d0b39d5b78a7c06f81", + "reference": "b0886ec05a63b204634d64d0b39d5b78a7c06f81", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0", + "psr/container": "^1.0", + "psr/simple-cache": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Contracts\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Contracts package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-11-17T15:04:30+00:00" + }, + { + "name": "illuminate/database", + "version": "v8.73.2", + "source": { + "type": "git", + "url": "https://github.com/illuminate/database.git", + "reference": "f93e5370a3d321de697755f185395bdf75e0ccc4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/database/zipball/f93e5370a3d321de697755f185395bdf75e0ccc4", + "reference": "f93e5370a3d321de697755f185395bdf75e0ccc4", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/collections": "^8.0", + "illuminate/container": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/macroable": "^8.0", + "illuminate/support": "^8.0", + "php": "^7.3|^8.0", + "symfony/console": "^5.1.4" + }, + "suggest": { + "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.13.3|^3.1.4).", + "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", + "illuminate/console": "Required to use the database commands (^8.0).", + "illuminate/events": "Required to use the observers with Eloquent (^8.0).", + "illuminate/filesystem": "Required to use the migrations (^8.0).", + "illuminate/pagination": "Required to paginate the result set (^8.0).", + "symfony/finder": "Required to use Eloquent model factories (^5.1.4)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Database\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Database package.", + "homepage": "https://laravel.com", + "keywords": [ + "database", + "laravel", + "orm", + "sql" + ], + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-11-23T14:10:34+00:00" + }, + { + "name": "illuminate/filesystem", + "version": "v8.73.2", + "source": { + "type": "git", + "url": "https://github.com/illuminate/filesystem.git", + "reference": "a7bc30dac4e27dbeb37b026f3dbaee13bd578861" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/filesystem/zipball/a7bc30dac4e27dbeb37b026f3dbaee13bd578861", + "reference": "a7bc30dac4e27dbeb37b026f3dbaee13bd578861", + "shasum": "" + }, + "require": { + "illuminate/collections": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/macroable": "^8.0", + "illuminate/support": "^8.0", + "php": "^7.3|^8.0", + "symfony/finder": "^5.1.4" + }, + "suggest": { + "ext-ftp": "Required to use the Flysystem FTP driver.", + "illuminate/http": "Required for handling uploaded files (^7.0).", + "league/flysystem": "Required to use the Flysystem local and FTP drivers (^1.1).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^1.0).", + "league/flysystem-cached-adapter": "Required to use the Flysystem cache (^1.0).", + "league/flysystem-sftp": "Required to use the Flysystem SFTP driver (^1.0).", + "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^5.1.4).", + "symfony/mime": "Required to enable support for guessing extensions (^5.1.4)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Filesystem\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Filesystem package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-10-22T13:20:42+00:00" + }, + { + "name": "illuminate/macroable", + "version": "v8.73.2", + "source": { + "type": "git", + "url": "https://github.com/illuminate/macroable.git", + "reference": "aed81891a6e046fdee72edd497f822190f61c162" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/macroable/zipball/aed81891a6e046fdee72edd497f822190f61c162", + "reference": "aed81891a6e046fdee72edd497f822190f61c162", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Macroable package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-11-16T13:57:03+00:00" + }, + { + "name": "illuminate/support", + "version": "v8.73.2", + "source": { + "type": "git", + "url": "https://github.com/illuminate/support.git", + "reference": "ecb4d4fb01f9716b2decbb1bf584ea8164c3b222" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/support/zipball/ecb4d4fb01f9716b2decbb1bf584ea8164c3b222", + "reference": "ecb4d4fb01f9716b2decbb1bf584ea8164c3b222", + "shasum": "" + }, + "require": { + "doctrine/inflector": "^1.4|^2.0", + "ext-json": "*", + "ext-mbstring": "*", + "illuminate/collections": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/macroable": "^8.0", + "nesbot/carbon": "^2.53.1", + "php": "^7.3|^8.0", + "voku/portable-ascii": "^1.4.8" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "suggest": { + "illuminate/filesystem": "Required to use the composer class (^8.0).", + "league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^1.3|^2.0.2).", + "ramsey/uuid": "Required to use Str::uuid() (^4.2.2).", + "symfony/process": "Required to use the composer class (^5.1.4).", + "symfony/var-dumper": "Required to use the dd function (^5.1.4).", + "vlucas/phpdotenv": "Required to use the Env class and env helper (^5.2)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + }, + "files": [ + "helpers.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Support package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-11-23T14:10:18+00:00" + }, + { + "name": "illuminate/translation", + "version": "v8.73.2", + "source": { + "type": "git", + "url": "https://github.com/illuminate/translation.git", + "reference": "c10a68f37f590dc8c1c1fe5b6ad3f09381282137" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/translation/zipball/c10a68f37f590dc8c1c1fe5b6ad3f09381282137", + "reference": "c10a68f37f590dc8c1c1fe5b6ad3f09381282137", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/collections": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/filesystem": "^8.0", + "illuminate/macroable": "^8.0", + "illuminate/support": "^8.0", + "php": "^7.3|^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Translation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Translation package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-10-30T16:01:33+00:00" + }, + { + "name": "illuminate/validation", + "version": "v8.73.2", + "source": { + "type": "git", + "url": "https://github.com/illuminate/validation.git", + "reference": "0c6a37684edbeef8f231f192126f1eeee07449e0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/validation/zipball/0c6a37684edbeef8f231f192126f1eeee07449e0", + "reference": "0c6a37684edbeef8f231f192126f1eeee07449e0", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.10", + "ext-json": "*", + "illuminate/collections": "^8.0", + "illuminate/container": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/macroable": "^8.0", + "illuminate/support": "^8.0", + "illuminate/translation": "^8.0", + "php": "^7.3|^8.0", + "symfony/http-foundation": "^5.1.4", + "symfony/mime": "^5.1.4" + }, + "suggest": { + "ext-bcmath": "Required to use the multiple_of validation rule.", + "illuminate/database": "Required to use the database presence verifier (^8.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Validation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Validation package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-11-18T14:48:46+00:00" + }, + { + "name": "livewire/livewire", + "version": "v2.8.0", + "source": { + "type": "git", + "url": "https://github.com/livewire/livewire.git", + "reference": "fc8c315babf8d42c2a25f207b3931b1bc8eb5e70" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/livewire/livewire/zipball/fc8c315babf8d42c2a25f207b3931b1bc8eb5e70", + "reference": "fc8c315babf8d42c2a25f207b3931b1bc8eb5e70", + "shasum": "" + }, + "require": { + "illuminate/database": "^7.0|^8.0", + "illuminate/support": "^7.0|^8.0", + "illuminate/validation": "^7.0|^8.0", + "php": "^7.2.5|^8.0", + "symfony/http-kernel": "^5.0" + }, + "require-dev": { + "calebporzio/sushi": "^2.1", + "laravel/framework": "^7.0|^8.0", + "mockery/mockery": "^1.3.1", + "orchestra/testbench": "^5.0|^6.0", + "orchestra/testbench-dusk": "^5.2|^6.0", + "phpunit/phpunit": "^8.4|^9.0", + "psy/psysh": "@stable" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Livewire\\LivewireServiceProvider" + ], + "aliases": { + "Livewire": "Livewire\\Livewire" + } + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Livewire\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Caleb Porzio", + "email": "calebporzio@gmail.com" + } + ], + "description": "A front-end framework for Laravel.", + "support": { + "issues": "https://github.com/livewire/livewire/issues", + "source": "https://github.com/livewire/livewire/tree/v2.8.0" + }, + "funding": [ + { + "url": "https://github.com/livewire", + "type": "github" + } + ], + "time": "2021-11-24T04:33:15+00:00" + }, + { + "name": "nesbot/carbon", + "version": "2.54.0", + "source": { + "type": "git", + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "eed83939f1aed3eee517d03a33f5ec587ac529b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/eed83939f1aed3eee517d03a33f5ec587ac529b5", + "reference": "eed83939f1aed3eee517d03a33f5ec587ac529b5", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.1.8 || ^8.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation": "^3.4 || ^4.0 || ^5.0" + }, + "require-dev": { + "doctrine/dbal": "^2.0 || ^3.0", + "doctrine/orm": "^2.7", + "friendsofphp/php-cs-fixer": "^3.0", + "kylekatarnls/multi-tester": "^2.0", + "phpmd/phpmd": "^2.9", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12.54", + "phpunit/phpunit": "^7.5.20 || ^8.5.14", + "squizlabs/php_codesniffer": "^3.4" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-3.x": "3.x-dev", + "dev-master": "2.x-dev" + }, + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon" + }, + "funding": [ + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "time": "2021-11-01T21:22:20+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, + "time": "2020-06-27T09:03:43+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.5.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "a12f7e301eb7258bb68acd89d4aefa05c2906cae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/a12f7e301eb7258bb68acd89d4aefa05c2906cae", + "reference": "a12f7e301eb7258bb68acd89d4aefa05c2906cae", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.0" + }, + "require-dev": { + "ext-tokenizer": "*", + "psalm/phar": "^4.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.5.1" + }, + "time": "2021-10-02T14:08:47+00:00" + }, + { + "name": "psr/container", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.2" + }, + "time": "2021-11-05T16:50:12+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/log", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/ef29f6d262798707a9edd554e2b82517ef3a9376", + "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/2.0.0" + }, + "time": "2021-07-14T16:41:46+00:00" + }, + { + "name": "psr/simple-cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/master" + }, + "time": "2017-10-23T01:57:42+00:00" + }, + { + "name": "spatie/data-transfer-object", + "version": "3.7.2", + "source": { + "type": "git", + "url": "https://github.com/spatie/data-transfer-object.git", + "reference": "56fcac4ba39c9307a9514d49d3435f8a48409bee" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/data-transfer-object/zipball/56fcac4ba39c9307a9514d49d3435f8a48409bee", + "reference": "56fcac4ba39c9307a9514d49d3435f8a48409bee", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "illuminate/collections": "^8.36", + "jetbrains/phpstorm-attributes": "^1.0", + "larapack/dd": "^1.1", + "phpunit/phpunit": "^9.0" + }, + "suggest": { + "phpstan/phpstan": "Take advantage of checkUninitializedProperties with \\Spatie\\DataTransferObject\\PHPstan\\PropertiesAreAlwaysInitializedExtension" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\DataTransferObject\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brent Roose", + "email": "brent@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Data transfer objects with batteries included", + "homepage": "https://github.com/spatie/data-transfer-object", + "keywords": [ + "data-transfer-object", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/data-transfer-object/issues", + "source": "https://github.com/spatie/data-transfer-object/tree/3.7.2" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + }, + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2021-09-17T04:04:12+00:00" + }, + { + "name": "spatie/laravel-package-tools", + "version": "1.9.2", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-package-tools.git", + "reference": "f710fe196c126fb9e0aee67eb5af49ad8f13f528" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/f710fe196c126fb9e0aee67eb5af49ad8f13f528", + "reference": "f710fe196c126fb9e0aee67eb5af49ad8f13f528", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^7.0|^8.0", + "php": "^7.4|^8.0" + }, + "require-dev": { + "mockery/mockery": "^1.4", + "orchestra/testbench": "^5.0|^6.0", + "phpunit/phpunit": "^9.3", + "spatie/test-time": "^1.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\LaravelPackageTools\\": "src", + "Spatie\\LaravelPackageTools\\Database\\Factories\\": "database/factories" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "role": "Developer" + } + ], + "description": "Tools for creating Laravel packages", + "homepage": "https://github.com/spatie/laravel-package-tools", + "keywords": [ + "laravel-package-tools", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/laravel-package-tools/issues", + "source": "https://github.com/spatie/laravel-package-tools/tree/1.9.2" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2021-09-21T13:06:51+00:00" + }, + { + "name": "spatie/laravel-settings", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-settings.git", + "reference": "212ae74e67c0b9cc0907ffa15c73bc7a6efaa75e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-settings/zipball/212ae74e67c0b9cc0907ffa15c73bc7a6efaa75e", + "reference": "212ae74e67c0b9cc0907ffa15c73bc7a6efaa75e", + "shasum": "" + }, + "require": { + "doctrine/dbal": "^2.6|^3", + "ext-json": "*", + "illuminate/database": "^7.0|^8.24.0", + "php": "^7.4|^8.0", + "phpdocumentor/type-resolver": "^1.4", + "spatie/data-transfer-object": "^2.0|^3.0", + "spatie/temporary-directory": "^1.2|^2.0" + }, + "require-dev": { + "ext-redis": "*", + "mockery/mockery": "^1.4", + "orchestra/testbench": "^5.0|^6.0", + "phpunit/phpunit": "^9.1", + "psalm/plugin-laravel": "^1.4", + "spatie/phpunit-snapshot-assertions": "^4.2", + "vimeo/psalm": "^4.2" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\LaravelSettings\\LaravelSettingsServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Spatie\\LaravelSettings\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ruben Van Assche", + "email": "ruben@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Store your application settings", + "homepage": "https://github.com/spatie/laravel-settings", + "keywords": [ + "laravel-settings", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/laravel-settings/issues", + "source": "https://github.com/spatie/laravel-settings/tree/2.2.0" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + }, + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2021-10-22T11:55:01+00:00" + }, + { + "name": "spatie/temporary-directory", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/temporary-directory.git", + "reference": "06fe0f10d068fdf145c9b2235030e568c913bb61" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/temporary-directory/zipball/06fe0f10d068fdf145c9b2235030e568c913bb61", + "reference": "06fe0f10d068fdf145c9b2235030e568c913bb61", + "shasum": "" + }, + "require": { + "php": "^8.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\TemporaryDirectory\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alex Vanderbist", + "email": "alex@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Easily create, use and destroy temporary directories", + "homepage": "https://github.com/spatie/temporary-directory", + "keywords": [ + "php", + "spatie", + "temporary-directory" + ], + "support": { + "issues": "https://github.com/spatie/temporary-directory/issues", + "source": "https://github.com/spatie/temporary-directory/tree/2.0.0" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + }, + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2021-03-30T19:46:13+00:00" + }, + { + "name": "symfony/console", + "version": "v5.3.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "3e7ab8f5905058984899b05a4648096f558bfeba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/3e7ab8f5905058984899b05a4648096f558bfeba", + "reference": "3e7ab8f5905058984899b05a4648096f558bfeba", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.8", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2", + "symfony/string": "^5.1" + }, + "conflict": { + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", + "symfony/lock": "<4.4", + "symfony/process": "<4.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/log": "^1|^2", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/event-dispatcher": "^4.4|^5.0", + "symfony/lock": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0", + "symfony/var-dumper": "^4.4|^5.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v5.3.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-21T19:41:05+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v2.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "6f981ee24cf69ee7ce9736146d1c57c2780598a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/6f981ee24cf69ee7ce9736146d1c57c2780598a8", + "reference": "6f981ee24cf69ee7ce9736146d1c57c2780598a8", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-07-12T14:48:14+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v5.3.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "eec73dd7218713f48a7996583a741b3bae58c8d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/eec73dd7218713f48a7996583a741b3bae58c8d3", + "reference": "eec73dd7218713f48a7996583a741b3bae58c8d3", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^4.4|^5.0" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.1", + "symfony/http-kernel": "^4.4|^5.0", + "symfony/serializer": "^4.4|^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v5.3.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-13T13:42:37+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v5.3.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "661a7a6e085394f8513945669e31f7c1338a7e69" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/661a7a6e085394f8513945669e31f7c1338a7e69", + "reference": "661a7a6e085394f8513945669e31f7c1338a7e69", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/event-dispatcher-contracts": "^2", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/dependency-injection": "<4.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/error-handler": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/service-contracts": "^1.1|^2", + "symfony/stopwatch": "^4.4|^5.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v5.3.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-17T12:16:12+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v2.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "66bea3b09be61613cd3b4043a65a8ec48cfa6d2a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/66bea3b09be61613cd3b4043a65a8ec48cfa6d2a", + "reference": "66bea3b09be61613cd3b4043a65a8ec48cfa6d2a", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/event-dispatcher": "^1" + }, + "suggest": { + "symfony/event-dispatcher-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-07-12T14:48:14+00:00" + }, + { + "name": "symfony/finder", + "version": "v5.3.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/a10000ada1e600d109a6c7632e9ac42e8bf2fb93", + "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v5.3.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-08-04T21:20:46+00:00" + }, + { + "name": "symfony/http-client-contracts", + "version": "v2.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client-contracts.git", + "reference": "ec82e57b5b714dbb69300d348bd840b345e24166" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/ec82e57b5b714dbb69300d348bd840b345e24166", + "reference": "ec82e57b5b714dbb69300d348bd840b345e24166", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "suggest": { + "symfony/http-client-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\HttpClient\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to HTTP clients", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/http-client-contracts/tree/v2.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-03T09:24:47+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v5.3.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "d1e7059ebeb0b8f9fe5eb5b26eacd2e3c1f371cc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/d1e7059ebeb0b8f9fe5eb5b26eacd2e3c1f371cc", + "reference": "d1e7059ebeb0b8f9fe5eb5b26eacd2e3c1f371cc", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "predis/predis": "~1.0", + "symfony/cache": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/mime": "^4.4|^5.0" + }, + "suggest": { + "symfony/mime": "To use the file extension guesser" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v5.3.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-04T16:37:19+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v5.3.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "f53025cd1d91b1af85d6d9e17eefa98e31ee953b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/f53025cd1d91b1af85d6d9e17eefa98e31ee953b", + "reference": "f53025cd1d91b1af85d6d9e17eefa98e31ee953b", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/log": "^1|^2", + "symfony/deprecation-contracts": "^2.1", + "symfony/error-handler": "^4.4|^5.0", + "symfony/event-dispatcher": "^5.0", + "symfony/http-client-contracts": "^1.1|^2", + "symfony/http-foundation": "^5.3.7", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/browser-kit": "<4.4", + "symfony/cache": "<5.0", + "symfony/config": "<5.0", + "symfony/console": "<4.4", + "symfony/dependency-injection": "<5.3", + "symfony/doctrine-bridge": "<5.0", + "symfony/form": "<5.0", + "symfony/http-client": "<5.0", + "symfony/mailer": "<5.0", + "symfony/messenger": "<5.0", + "symfony/translation": "<5.0", + "symfony/twig-bridge": "<5.0", + "symfony/validator": "<5.0", + "twig/twig": "<2.13" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^4.4|^5.0", + "symfony/config": "^5.0", + "symfony/console": "^4.4|^5.0", + "symfony/css-selector": "^4.4|^5.0", + "symfony/dependency-injection": "^5.3", + "symfony/dom-crawler": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0", + "symfony/routing": "^4.4|^5.0", + "symfony/stopwatch": "^4.4|^5.0", + "symfony/translation": "^4.4|^5.0", + "symfony/translation-contracts": "^1.1|^2", + "twig/twig": "^2.13|^3.0.4" + }, + "suggest": { + "symfony/browser-kit": "", + "symfony/config": "", + "symfony/console": "", + "symfony/dependency-injection": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a structured process for converting a Request into a Response", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v5.3.12" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-24T08:46:46+00:00" + }, + { + "name": "symfony/mime", + "version": "v5.3.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "dffc0684f10526db12c52fcd6238c64695426d61" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/dffc0684f10526db12c52fcd6238c64695426d61", + "reference": "dffc0684f10526db12c52fcd6238c64695426d61", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/mailer": "<4.4" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/property-access": "^4.4|^5.1", + "symfony/property-info": "^4.4|^5.1", + "symfony/serializer": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v5.3.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-20T16:42:42+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-19T12:13:01+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.23.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "16880ba9c5ebe3642d1995ab866db29270b36535" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/16880ba9c5ebe3642d1995ab866db29270b36535", + "reference": "16880ba9c5ebe3642d1995ab866db29270b36535", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T12:26:48+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/65bd267525e82759e7d8c4e8ceea44f398838e65", + "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php72": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T09:27:20+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-19T12:13:01+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.23.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6", + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T12:26:48+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "9a142215a36a3888e30d0a9eeea9766764e96976" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9a142215a36a3888e30d0a9eeea9766764e96976", + "reference": "9a142215a36a3888e30d0a9eeea9766764e96976", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php72/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T09:17:38+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-19T12:13:01+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.23.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be", + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-07-28T13:41:28+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v2.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc", + "reference": "1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1", + "symfony/deprecation-contracts": "^2.1" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v2.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-04T16:48:04+00:00" + }, + { + "name": "symfony/string", + "version": "v5.3.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c", + "reference": "d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" + }, + "require-dev": { + "symfony/error-handler": "^4.4|^5.0", + "symfony/http-client": "^4.4|^5.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "files": [ + "Resources/functions.php" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v5.3.10" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-27T18:21:46+00:00" + }, + { + "name": "symfony/translation", + "version": "v5.3.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "17a965c8f3b1b348cf15d903ac53942984561f8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/17a965c8f3b1b348cf15d903ac53942984561f8a", + "reference": "17a965c8f3b1b348cf15d903ac53942984561f8a", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation-contracts": "^2.3" + }, + "conflict": { + "symfony/config": "<4.4", + "symfony/dependency-injection": "<5.0", + "symfony/http-kernel": "<5.0", + "symfony/twig-bundle": "<5.0", + "symfony/yaml": "<4.4" + }, + "provide": { + "symfony/translation-implementation": "2.3" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^4.4|^5.0", + "symfony/console": "^4.4|^5.0", + "symfony/dependency-injection": "^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/http-kernel": "^5.0", + "symfony/intl": "^4.4|^5.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/service-contracts": "^1.1.2|^2", + "symfony/yaml": "^4.4|^5.0" + }, + "suggest": { + "psr/log-implementation": "To use logging capability in translator", + "symfony/config": "", + "symfony/yaml": "" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v5.3.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-04T16:37:19+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v2.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "d28150f0f44ce854e942b671fc2620a98aae1b1e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/d28150f0f44ce854e942b671fc2620a98aae1b1e", + "reference": "d28150f0f44ce854e942b671fc2620a98aae1b1e", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "suggest": { + "symfony/translation-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v2.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-08-17T14:20:01+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v5.3.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "a029b3a11b757f9cc8693040339153b4745a913f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/a029b3a11b757f9cc8693040339153b4745a913f", + "reference": "a029b3a11b757f9cc8693040339153b4745a913f", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "phpunit/phpunit": "<5.4.3", + "symfony/console": "<4.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0", + "twig/twig": "^2.13|^3.0.4" + }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v5.3.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-12T11:38:27+00:00" + }, + { + "name": "voku/portable-ascii", + "version": "1.5.6", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "80953678b19901e5165c56752d087fc11526017c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/80953678b19901e5165c56752d087fc11526017c", + "reference": "80953678b19901e5165c56752d087fc11526017c", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "http://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/1.5.6" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "time": "2020-11-12T00:07:28+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": { + "filament/filament": 20 + }, + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": "^8.0" + }, + "platform-dev": [], + "plugin-api-version": "2.0.0" +} diff --git a/packages/spatie-laravel-settings-plugin/docs/01-installation.md b/packages/spatie-laravel-settings-plugin/docs/01-installation.md new file mode 100644 index 0000000000..f65b4016dc --- /dev/null +++ b/packages/spatie-laravel-settings-plugin/docs/01-installation.md @@ -0,0 +1,31 @@ +--- +title: Installation +--- + +## Requirements + +Filament has a few requirements to run: + +- PHP 8.0+ +- Laravel v8.0+ +- Livewire v2.0+ + +This plugin is compatible with other Filament v2.x packages. + +## Installation + +Install the plugin with Composer: + +```bash +composer require filament/spatie-laravel-settings-plugin +``` + +You're now ready to start building [settings pages](getting-started)! + +## Upgrade Guide + +To upgrade the package to the latest version, you must run: + +```bash +composer update +``` diff --git a/packages/spatie-laravel-settings-plugin/docs/02-getting-started.md b/packages/spatie-laravel-settings-plugin/docs/02-getting-started.md new file mode 100644 index 0000000000..a025de4d4e --- /dev/null +++ b/packages/spatie-laravel-settings-plugin/docs/02-getting-started.md @@ -0,0 +1,46 @@ +--- +title: Getting Started +--- + +## Preparing your page class + +Settings pages are Filament pages that extend the `Filament\Pages\SettingsPage` class. + +You can create a settings page using the following command: + +```bash +php artisan make:filament-settings-page ManageFooter FooterSettings +``` + +This command presumes that you have a `FooterSettings` class in your `app/Settings` directory: + +```php +protected static string $settings = FooterSettings::class; +``` + +## Building a form + +Since the [form builder](/docs/forms) is installed in the admin panel by default, you may use any form [fields](/docs/forms/fields) or [layout components](/docs/forms/layout) you like, including those from Filament plugins: + +```php +use Filament\Forms\Components\Repeater; +use Filament\Forms\Components\TextInput; + +protected function getFormSchema(): array +{ + return [ + TextInput::make('copyright') + ->label('Copyright notice') + ->required(), + Repeater::make('links') + ->schema([ + TextInput::make('label')->required(), + TextInput::make('url') + ->url() + ->required(), + ]), + ]; +} +``` + +The name of each form field must correspond with the name of the property on your settings class. diff --git a/packages/spatie-laravel-settings-plugin/resources/views/pages/settings-page.blade.php b/packages/spatie-laravel-settings-plugin/resources/views/pages/settings-page.blade.php new file mode 100644 index 0000000000..3e376088be --- /dev/null +++ b/packages/spatie-laravel-settings-plugin/resources/views/pages/settings-page.blade.php @@ -0,0 +1,7 @@ + + + {{ $this->form }} + + + + diff --git a/packages/spatie-laravel-settings-plugin/src/Commands/Aliases/MakeSettingsPageCommand.php b/packages/spatie-laravel-settings-plugin/src/Commands/Aliases/MakeSettingsPageCommand.php new file mode 100644 index 0000000000..6ab971741d --- /dev/null +++ b/packages/spatie-laravel-settings-plugin/src/Commands/Aliases/MakeSettingsPageCommand.php @@ -0,0 +1,12 @@ +argument('name') ?? $this->askRequired('Page name (e.g. `ManageFooter`)', 'name')) + ->trim('/') + ->trim('\\') + ->trim(' ') + ->replace('/', '\\'); + $pageClass = (string) Str::of($page)->afterLast('\\'); + $pageNamespace = Str::of($page)->contains('\\') ? + (string) Str::of($page)->beforeLast('\\') : + ''; + + $settingsClass = (string) Str::of($this->argument('settingsClass') ?? $this->askRequired('Settings class (e.g. `FooterSettings`)', 'settings class')) + ->trim('/') + ->trim('\\') + ->trim(' '); + + $path = app_path( + (string) Str::of($page) + ->prepend('Filament\\Pages\\') + ->replace('\\', '/') + ->append('.php'), + ); + + if ($this->checkForCollision([$path])) { + return static::INVALID; + } + + $this->copyStubToApp('SettingsPage', $path, [ + 'class' => $pageClass, + 'namespace' => 'App\\Filament\\Pages' . ($pageNamespace !== '' ? "\\{$pageNamespace}" : ''), + 'settingsClass' => $settingsClass, + ]); + + $this->info("Successfully created {$page}!"); + + return static::SUCCESS; + } + + protected function copyStubToApp(string $stub, string $targetPath, array $replacements = []): void + { + $filesystem = new Filesystem(); + + if (! $this->fileExists($stubPath = base_path("stubs/filament/{$stub}.stub"))) { + $stubPath = __DIR__ . "/../../stubs/{$stub}.stub"; + } + + $stub = Str::of($filesystem->get($stubPath)); + + foreach ($replacements as $key => $replacement) { + $stub = $stub->replace("{{ {$key} }}", $replacement); + } + + $stub = (string) $stub; + + $this->writeFile($targetPath, $stub); + } +} diff --git a/packages/spatie-laravel-settings-plugin/src/Pages/SettingsPage.php b/packages/spatie-laravel-settings-plugin/src/Pages/SettingsPage.php new file mode 100644 index 0000000000..d60b8c1c57 --- /dev/null +++ b/packages/spatie-laravel-settings-plugin/src/Pages/SettingsPage.php @@ -0,0 +1,90 @@ +fillForm(); + } + + protected function fillForm(): void + { + $this->callHook('beforeFill'); + + $settings = app(static::$settings); + + $this->form->fill($settings->toArray()); + + $this->callHook('afterFill'); + } + + public function save(): void + { + $this->callHook('beforeValidate'); + + $data = $this->form->getState(); + + $this->callHook('afterValidate'); + + $this->callHook('beforeSave'); + + $settings = app(static::$settings); + + $settings->fill($data); + $settings->save(); + + $this->callHook('afterSave'); + + if ($redirectUrl = $this->getRedirectUrl()) { + $this->redirect($redirectUrl); + } else { + $this->notify('success', 'Saved!'); + } + } + + protected function callHook(string $hook): void + { + if (! method_exists($this, $hook)) { + return; + } + + $this->{$hook}(); + } + + protected function getFormActions(): array + { + return [ + ButtonAction::make('save') + ->label('Save') + ->submit(), + ]; + } + + protected function getForms(): array + { + return [ + 'form' => $this->makeForm() + ->schema($this->getFormSchema()) + ->statePath('data') + ->columns(2), + ]; + } + + protected function getRedirectUrl(): ?string + { + return null; + } +} diff --git a/packages/spatie-laravel-settings-plugin/src/SpatieLaravelSettingsPluginServiceProvider.php b/packages/spatie-laravel-settings-plugin/src/SpatieLaravelSettingsPluginServiceProvider.php new file mode 100644 index 0000000000..1e0948d181 --- /dev/null +++ b/packages/spatie-laravel-settings-plugin/src/SpatieLaravelSettingsPluginServiceProvider.php @@ -0,0 +1,43 @@ +app->runningInConsole()) { + $this->commands($this->getCommands()); + + $this->publishes([ + __DIR__ . '/../resources/views' => resource_path('views/vendor/filament-spatie-laravel-settings-plugin'), + ]); + } + + $this->loadTranslationsFrom(__DIR__ . '/../resources/lang', 'filament-spatie-laravel-settings-plugin'); + $this->loadViewsFrom(__DIR__ . '/../resources/views', 'filament-spatie-laravel-settings-plugin'); + } + + protected function getCommands(): array + { + $commands = [ + Commands\MakeSettingsPageCommand::class, + ]; + + $aliases = []; + + foreach ($commands as $command) { + $class = 'Filament\\Commands\\Aliases\\' . class_basename($command); + + if (! class_exists($class)) { + continue; + } + + $aliases[] = $class; + } + + return array_merge($commands, $aliases); + } +} diff --git a/packages/spatie-laravel-settings-plugin/stubs/SettingsPage.stub b/packages/spatie-laravel-settings-plugin/stubs/SettingsPage.stub new file mode 100644 index 0000000000..9825bb4af0 --- /dev/null +++ b/packages/spatie-laravel-settings-plugin/stubs/SettingsPage.stub @@ -0,0 +1,20 @@ +=5.5", + "symfony/polyfill-intl-idn": "^1.10" + }, + "require-dev": { + "dominicsayers/isemail": "^3.0.7", + "phpunit/phpunit": "^4.8.36|^7.5.15", + "satooshi/php-coveralls": "^1.0.1" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/2.1.25" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2020-12-29T14:50:06+00:00" + }, + { + "name": "graham-campbell/result-type", + "version": "v1.0.3", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "296c015dc30ec4322168c5ad3ee5cc11dae827ac" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/296c015dc30ec4322168c5ad3ee5cc11dae827ac", + "reference": "296c015dc30ec4322168c5ad3ee5cc11dae827ac", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "phpoption/phpoption": "^1.8" + }, + "require-dev": { + "phpunit/phpunit": "^6.5.14 || ^7.5.20 || ^8.5.19 || ^9.5.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.0.3" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2021-10-17T19:48:54+00:00" + }, + { + "name": "laravel/framework", + "version": "v8.70.2", + "source": { + "type": "git", + "url": "https://github.com/laravel/framework.git", + "reference": "dec9524cd0f9fa35a6eb8e25d0b40f8bbc8ec225" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/framework/zipball/dec9524cd0f9fa35a6eb8e25d0b40f8bbc8ec225", + "reference": "dec9524cd0f9fa35a6eb8e25d0b40f8bbc8ec225", + "shasum": "" + }, + "require": { + "doctrine/inflector": "^1.4|^2.0", + "dragonmantank/cron-expression": "^3.0.2", + "egulias/email-validator": "^2.1.10", + "ext-json": "*", + "ext-mbstring": "*", + "ext-openssl": "*", + "laravel/serializable-closure": "^1.0", + "league/commonmark": "^1.3|^2.0.2", + "league/flysystem": "^1.1", + "monolog/monolog": "^2.0", + "nesbot/carbon": "^2.53.1", + "opis/closure": "^3.6", + "php": "^7.3|^8.0", + "psr/container": "^1.0", + "psr/log": "^1.0 || ^2.0", + "psr/simple-cache": "^1.0", + "ramsey/uuid": "^4.2.2", + "swiftmailer/swiftmailer": "^6.3", + "symfony/console": "^5.1.4", + "symfony/error-handler": "^5.1.4", + "symfony/finder": "^5.1.4", + "symfony/http-foundation": "^5.1.4", + "symfony/http-kernel": "^5.1.4", + "symfony/mime": "^5.1.4", + "symfony/process": "^5.1.4", + "symfony/routing": "^5.1.4", + "symfony/var-dumper": "^5.1.4", + "tijsverkoyen/css-to-inline-styles": "^2.2.2", + "vlucas/phpdotenv": "^5.2", + "voku/portable-ascii": "^1.4.8" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "provide": { + "psr/container-implementation": "1.0", + "psr/simple-cache-implementation": "1.0" + }, + "replace": { + "illuminate/auth": "self.version", + "illuminate/broadcasting": "self.version", + "illuminate/bus": "self.version", + "illuminate/cache": "self.version", + "illuminate/collections": "self.version", + "illuminate/config": "self.version", + "illuminate/console": "self.version", + "illuminate/container": "self.version", + "illuminate/contracts": "self.version", + "illuminate/cookie": "self.version", + "illuminate/database": "self.version", + "illuminate/encryption": "self.version", + "illuminate/events": "self.version", + "illuminate/filesystem": "self.version", + "illuminate/hashing": "self.version", + "illuminate/http": "self.version", + "illuminate/log": "self.version", + "illuminate/macroable": "self.version", + "illuminate/mail": "self.version", + "illuminate/notifications": "self.version", + "illuminate/pagination": "self.version", + "illuminate/pipeline": "self.version", + "illuminate/queue": "self.version", + "illuminate/redis": "self.version", + "illuminate/routing": "self.version", + "illuminate/session": "self.version", + "illuminate/support": "self.version", + "illuminate/testing": "self.version", + "illuminate/translation": "self.version", + "illuminate/validation": "self.version", + "illuminate/view": "self.version" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.198.1", + "doctrine/dbal": "^2.13.3|^3.1.2", + "filp/whoops": "^2.14.3", + "guzzlehttp/guzzle": "^6.5.5|^7.0.1", + "league/flysystem-cached-adapter": "^1.0", + "mockery/mockery": "^1.4.4", + "orchestra/testbench-core": "^6.23", + "pda/pheanstalk": "^4.0", + "phpunit/phpunit": "^8.5.19|^9.5.8", + "predis/predis": "^1.1.9", + "symfony/cache": "^5.1.4" + }, + "suggest": { + "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage and SES mail driver (^3.198.1).", + "brianium/paratest": "Required to run tests in parallel (^6.0).", + "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.13.3|^3.1.2).", + "ext-bcmath": "Required to use the multiple_of validation rule.", + "ext-ftp": "Required to use the Flysystem FTP driver.", + "ext-gd": "Required to use Illuminate\\Http\\Testing\\FileFactory::image().", + "ext-memcached": "Required to use the memcache cache driver.", + "ext-pcntl": "Required to use all features of the queue worker.", + "ext-posix": "Required to use all features of the queue worker.", + "ext-redis": "Required to use the Redis cache and queue drivers (^4.0|^5.0).", + "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", + "filp/whoops": "Required for friendly error pages in development (^2.14.3).", + "guzzlehttp/guzzle": "Required to use the HTTP Client, Mailgun mail driver and the ping methods on schedules (^6.5.5|^7.0.1).", + "laravel/tinker": "Required to use the tinker console command (^2.0).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^1.0).", + "league/flysystem-cached-adapter": "Required to use the Flysystem cache (^1.0).", + "league/flysystem-sftp": "Required to use the Flysystem SFTP driver (^1.0).", + "mockery/mockery": "Required to use mocking (^1.4.4).", + "nyholm/psr7": "Required to use PSR-7 bridging features (^1.2).", + "pda/pheanstalk": "Required to use the beanstalk queue driver (^4.0).", + "phpunit/phpunit": "Required to use assertions and run tests (^8.5.19|^9.5.8).", + "predis/predis": "Required to use the predis connector (^1.1.9).", + "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", + "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^4.0|^5.0|^6.0).", + "symfony/cache": "Required to PSR-6 cache bridge (^5.1.4).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^5.1.4).", + "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^2.0).", + "wildbit/swiftmailer-postmark": "Required to use Postmark mail driver (^3.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "files": [ + "src/Illuminate/Collections/helpers.php", + "src/Illuminate/Events/functions.php", + "src/Illuminate/Foundation/helpers.php", + "src/Illuminate/Support/helpers.php" + ], + "psr-4": { + "Illuminate\\": "src/Illuminate/", + "Illuminate\\Support\\": [ + "src/Illuminate/Macroable/", + "src/Illuminate/Collections/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Laravel Framework.", + "homepage": "https://laravel.com", + "keywords": [ + "framework", + "laravel" + ], + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-11-09T22:48:33+00:00" + }, + { + "name": "laravel/serializable-closure", + "version": "v1.0.3", + "source": { + "type": "git", + "url": "https://github.com/laravel/serializable-closure.git", + "reference": "6cfc678735f22ccedad761b8cae2bab14c3d8e5b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/6cfc678735f22ccedad761b8cae2bab14c3d8e5b", + "reference": "6cfc678735f22ccedad761b8cae2bab14c3d8e5b", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "require-dev": { + "pestphp/pest": "^1.18", + "phpstan/phpstan": "^0.12.98", + "symfony/var-dumper": "^5.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Laravel\\SerializableClosure\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + }, + { + "name": "Nuno Maduro", + "email": "nuno@laravel.com" + } + ], + "description": "Laravel Serializable Closure provides an easy and secure way to serialize closures in PHP.", + "keywords": [ + "closure", + "laravel", + "serializable" + ], + "support": { + "issues": "https://github.com/laravel/serializable-closure/issues", + "source": "https://github.com/laravel/serializable-closure" + }, + "time": "2021-10-07T14:00:57+00:00" + }, + { + "name": "league/commonmark", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/commonmark.git", + "reference": "2df87709f44b0dd733df86aef0830dce9b1f0f13" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/2df87709f44b0dd733df86aef0830dce9b1f0f13", + "reference": "2df87709f44b0dd733df86aef0830dce9b1f0f13", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "league/config": "^1.1.1", + "php": "^7.4 || ^8.0", + "psr/event-dispatcher": "^1.0", + "symfony/polyfill-php80": "^1.15" + }, + "require-dev": { + "cebe/markdown": "^1.0", + "commonmark/cmark": "0.30.0", + "commonmark/commonmark.js": "0.30.0", + "composer/package-versions-deprecated": "^1.8", + "erusev/parsedown": "^1.0", + "ext-json": "*", + "github/gfm": "0.29.0", + "michelf/php-markdown": "^1.4", + "phpstan/phpstan": "^0.12.88", + "phpunit/phpunit": "^9.5.5", + "scrutinizer/ocular": "^1.8.1", + "symfony/finder": "^5.3", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0", + "unleashedtech/php-coding-standard": "^3.1", + "vimeo/psalm": "^4.7.3" + }, + "suggest": { + "symfony/yaml": "v2.3+ required if using the Front Matter extension" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.1-dev" + } + }, + "autoload": { + "psr-4": { + "League\\CommonMark\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Highly-extensible PHP Markdown parser which fully supports the CommonMark spec and GitHub-Flavored Markdown (GFM)", + "homepage": "https://commonmark.thephpleague.com", + "keywords": [ + "commonmark", + "flavored", + "gfm", + "github", + "github-flavored", + "markdown", + "md", + "parser" + ], + "support": { + "docs": "https://commonmark.thephpleague.com/", + "forum": "https://github.com/thephpleague/commonmark/discussions", + "issues": "https://github.com/thephpleague/commonmark/issues", + "rss": "https://github.com/thephpleague/commonmark/releases.atom", + "source": "https://github.com/thephpleague/commonmark" + }, + "funding": [ + { + "url": "https://enjoy.gitstore.app/repositories/thephpleague/commonmark", + "type": "custom" + }, + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + }, + { + "url": "https://www.patreon.com/colinodell", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/commonmark", + "type": "tidelift" + } + ], + "time": "2021-08-14T14:06:04+00:00" + }, + { + "name": "league/config", + "version": "v1.1.1", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/config.git", + "reference": "a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/config/zipball/a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e", + "reference": "a9d39eeeb6cc49d10a6e6c36f22c4c1f4a767f3e", + "shasum": "" + }, + "require": { + "dflydev/dot-access-data": "^3.0.1", + "nette/schema": "^1.2", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^0.12.90", + "phpunit/phpunit": "^9.5.5", + "scrutinizer/ocular": "^1.8.1", + "unleashedtech/php-coding-standard": "^3.1", + "vimeo/psalm": "^4.7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Config\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Colin O'Dell", + "email": "colinodell@gmail.com", + "homepage": "https://www.colinodell.com", + "role": "Lead Developer" + } + ], + "description": "Define configuration arrays with strict schemas and access values with dot notation", + "homepage": "https://config.thephpleague.com", + "keywords": [ + "array", + "config", + "configuration", + "dot", + "dot-access", + "nested", + "schema" + ], + "support": { + "docs": "https://config.thephpleague.com/", + "issues": "https://github.com/thephpleague/config/issues", + "rss": "https://github.com/thephpleague/config/releases.atom", + "source": "https://github.com/thephpleague/config" + }, + "funding": [ + { + "url": "https://www.colinodell.com/sponsor", + "type": "custom" + }, + { + "url": "https://www.paypal.me/colinpodell/10.00", + "type": "custom" + }, + { + "url": "https://github.com/colinodell", + "type": "github" + } + ], + "time": "2021-08-14T12:15:32+00:00" + }, + { + "name": "league/flysystem", + "version": "1.1.5", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/flysystem.git", + "reference": "18634df356bfd4119fe3d6156bdb990c414c14ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/18634df356bfd4119fe3d6156bdb990c414c14ea", + "reference": "18634df356bfd4119fe3d6156bdb990c414c14ea", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "league/mime-type-detection": "^1.3", + "php": "^7.2.5 || ^8.0" + }, + "conflict": { + "league/flysystem-sftp": "<1.0.6" + }, + "require-dev": { + "phpspec/prophecy": "^1.11.1", + "phpunit/phpunit": "^8.5.8" + }, + "suggest": { + "ext-ftp": "Allows you to use FTP server storage", + "ext-openssl": "Allows you to use FTPS server storage", + "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2", + "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3", + "league/flysystem-azure": "Allows you to use Windows Azure Blob storage", + "league/flysystem-cached-adapter": "Flysystem adapter decorator for metadata caching", + "league/flysystem-eventable-filesystem": "Allows you to use EventableFilesystem", + "league/flysystem-rackspace": "Allows you to use Rackspace Cloud Files", + "league/flysystem-sftp": "Allows you to use SFTP server storage via phpseclib", + "league/flysystem-webdav": "Allows you to use WebDAV storage", + "league/flysystem-ziparchive": "Allows you to use ZipArchive adapter", + "spatie/flysystem-dropbox": "Allows you to use Dropbox storage", + "srmklive/flysystem-dropbox-v2": "Allows you to use Dropbox storage for PHP 5 applications" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1-dev" + } + }, + "autoload": { + "psr-4": { + "League\\Flysystem\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frenky.net" + } + ], + "description": "Filesystem abstraction: Many filesystems, one API.", + "keywords": [ + "Cloud Files", + "WebDAV", + "abstraction", + "aws", + "cloud", + "copy.com", + "dropbox", + "file systems", + "files", + "filesystem", + "filesystems", + "ftp", + "rackspace", + "remote", + "s3", + "sftp", + "storage" + ], + "support": { + "issues": "https://github.com/thephpleague/flysystem/issues", + "source": "https://github.com/thephpleague/flysystem/tree/1.1.5" + }, + "funding": [ + { + "url": "https://offset.earth/frankdejonge", + "type": "other" + } + ], + "time": "2021-08-17T13:49:42+00:00" + }, + { + "name": "league/mime-type-detection", + "version": "1.8.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/mime-type-detection.git", + "reference": "b38b25d7b372e9fddb00335400467b223349fd7e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/b38b25d7b372e9fddb00335400467b223349fd7e", + "reference": "b38b25d7b372e9fddb00335400467b223349fd7e", + "shasum": "" + }, + "require": { + "ext-fileinfo": "*", + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.18", + "phpstan/phpstan": "^0.12.68", + "phpunit/phpunit": "^8.5.8 || ^9.3" + }, + "type": "library", + "autoload": { + "psr-4": { + "League\\MimeTypeDetection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Frank de Jonge", + "email": "info@frankdejonge.nl" + } + ], + "description": "Mime-type detection for Flysystem", + "support": { + "issues": "https://github.com/thephpleague/mime-type-detection/issues", + "source": "https://github.com/thephpleague/mime-type-detection/tree/1.8.0" + }, + "funding": [ + { + "url": "https://github.com/frankdejonge", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/flysystem", + "type": "tidelift" + } + ], + "time": "2021-09-25T08:23:19+00:00" + }, + { + "name": "monolog/monolog", + "version": "2.3.5", + "source": { + "type": "git", + "url": "https://github.com/Seldaek/monolog.git", + "reference": "fd4380d6fc37626e2f799f29d91195040137eba9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/fd4380d6fc37626e2f799f29d91195040137eba9", + "reference": "fd4380d6fc37626e2f799f29d91195040137eba9", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "psr/log": "^1.0.1 || ^2.0 || ^3.0" + }, + "provide": { + "psr/log-implementation": "1.0.0 || 2.0.0 || 3.0.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^2.4.9 || ^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7", + "graylog2/gelf-php": "^1.4.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "php-console/php-console": "^3.1.3", + "phpspec/prophecy": "^1.6.1", + "phpstan/phpstan": "^0.12.91", + "phpunit/phpunit": "^8.5", + "predis/predis": "^1.1", + "rollbar/rollbar": "^1.3", + "ruflin/elastica": ">=0.90@dev", + "swiftmailer/swiftmailer": "^5.3|^6.0" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "php-console/php-console": "Allow sending log messages to Google Chrome", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be" + } + ], + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "support": { + "issues": "https://github.com/Seldaek/monolog/issues", + "source": "https://github.com/Seldaek/monolog/tree/2.3.5" + }, + "funding": [ + { + "url": "https://github.com/Seldaek", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog", + "type": "tidelift" + } + ], + "time": "2021-10-01T21:08:31+00:00" + }, + { + "name": "nesbot/carbon", + "version": "2.54.0", + "source": { + "type": "git", + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "eed83939f1aed3eee517d03a33f5ec587ac529b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/eed83939f1aed3eee517d03a33f5ec587ac529b5", + "reference": "eed83939f1aed3eee517d03a33f5ec587ac529b5", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.1.8 || ^8.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation": "^3.4 || ^4.0 || ^5.0" + }, + "require-dev": { + "doctrine/dbal": "^2.0 || ^3.0", + "doctrine/orm": "^2.7", + "friendsofphp/php-cs-fixer": "^3.0", + "kylekatarnls/multi-tester": "^2.0", + "phpmd/phpmd": "^2.9", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12.54", + "phpunit/phpunit": "^7.5.20 || ^8.5.14", + "squizlabs/php_codesniffer": "^3.4" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-3.x": "3.x-dev", + "dev-master": "2.x-dev" + }, + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon" + }, + "funding": [ + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "time": "2021-11-01T21:22:20+00:00" + }, + { + "name": "nette/schema", + "version": "v1.2.2", + "source": { + "type": "git", + "url": "https://github.com/nette/schema.git", + "reference": "9a39cef03a5b34c7de64f551538cbba05c2be5df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/schema/zipball/9a39cef03a5b34c7de64f551538cbba05c2be5df", + "reference": "9a39cef03a5b34c7de64f551538cbba05c2be5df", + "shasum": "" + }, + "require": { + "nette/utils": "^2.5.7 || ^3.1.5 || ^4.0", + "php": ">=7.1 <8.2" + }, + "require-dev": { + "nette/tester": "^2.3 || ^2.4", + "phpstan/phpstan-nette": "^0.12", + "tracy/tracy": "^2.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "📐 Nette Schema: validating data structures against a given Schema.", + "homepage": "https://nette.org", + "keywords": [ + "config", + "nette" + ], + "support": { + "issues": "https://github.com/nette/schema/issues", + "source": "https://github.com/nette/schema/tree/v1.2.2" + }, + "time": "2021-10-15T11:40:02+00:00" + }, + { + "name": "nette/utils", + "version": "v3.2.5", + "source": { + "type": "git", + "url": "https://github.com/nette/utils.git", + "reference": "9cd80396ca58d7969ab44fc7afcf03624dfa526e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nette/utils/zipball/9cd80396ca58d7969ab44fc7afcf03624dfa526e", + "reference": "9cd80396ca58d7969ab44fc7afcf03624dfa526e", + "shasum": "" + }, + "require": { + "php": ">=7.2 <8.2" + }, + "conflict": { + "nette/di": "<3.0.6" + }, + "require-dev": { + "nette/tester": "~2.0", + "phpstan/phpstan": "^0.12", + "tracy/tracy": "^2.3" + }, + "suggest": { + "ext-gd": "to use Image", + "ext-iconv": "to use Strings::webalize(), toAscii(), chr() and reverse()", + "ext-intl": "to use Strings::webalize(), toAscii(), normalize() and compare()", + "ext-json": "to use Nette\\Utils\\Json", + "ext-mbstring": "to use Strings::lower() etc...", + "ext-tokenizer": "to use Nette\\Utils\\Reflection::getUseStatements()", + "ext-xml": "to use Strings::length() etc. when mbstring is not available" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause", + "GPL-2.0-only", + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Grudl", + "homepage": "https://davidgrudl.com" + }, + { + "name": "Nette Community", + "homepage": "https://nette.org/contributors" + } + ], + "description": "🛠 Nette Utils: lightweight utilities for string & array manipulation, image handling, safe JSON encoding/decoding, validation, slug or strong password generating etc.", + "homepage": "https://nette.org", + "keywords": [ + "array", + "core", + "datetime", + "images", + "json", + "nette", + "paginator", + "password", + "slugify", + "string", + "unicode", + "utf-8", + "utility", + "validation" + ], + "support": { + "issues": "https://github.com/nette/utils/issues", + "source": "https://github.com/nette/utils/tree/v3.2.5" + }, + "time": "2021-09-20T10:50:11+00:00" + }, + { + "name": "opis/closure", + "version": "3.6.2", + "source": { + "type": "git", + "url": "https://github.com/opis/closure.git", + "reference": "06e2ebd25f2869e54a306dda991f7db58066f7f6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/opis/closure/zipball/06e2ebd25f2869e54a306dda991f7db58066f7f6", + "reference": "06e2ebd25f2869e54a306dda991f7db58066f7f6", + "shasum": "" + }, + "require": { + "php": "^5.4 || ^7.0 || ^8.0" + }, + "require-dev": { + "jeremeamia/superclosure": "^2.0", + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.6.x-dev" + } + }, + "autoload": { + "psr-4": { + "Opis\\Closure\\": "src/" + }, + "files": [ + "functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marius Sarca", + "email": "marius.sarca@gmail.com" + }, + { + "name": "Sorin Sarca", + "email": "sarca_sorin@hotmail.com" + } + ], + "description": "A library that can be used to serialize closures (anonymous functions) and arbitrary objects.", + "homepage": "https://opis.io/closure", + "keywords": [ + "anonymous functions", + "closure", + "function", + "serializable", + "serialization", + "serialize" + ], + "support": { + "issues": "https://github.com/opis/closure/issues", + "source": "https://github.com/opis/closure/tree/3.6.2" + }, + "time": "2021-04-09T13:42:10+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.8.0", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "5455cb38aed4523f99977c4a12ef19da4bfe2a28" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/5455cb38aed4523f99977c4a12ef19da4bfe2a28", + "reference": "5455cb38aed4523f99977c4a12ef19da4bfe2a28", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "phpunit/phpunit": "^6.5.14 || ^7.0.20 || ^8.5.19 || ^9.5.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8-dev" + } + }, + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.8.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2021-08-28T21:27:29+00:00" + }, + { + "name": "psr/container", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.2" + }, + "time": "2021-11-05T16:50:12+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/log", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/ef29f6d262798707a9edd554e2b82517ef3a9376", + "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/2.0.0" + }, + "time": "2021-07-14T16:41:46+00:00" + }, + { + "name": "psr/simple-cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/master" + }, + "time": "2017-10-23T01:57:42+00:00" + }, + { + "name": "ramsey/collection", + "version": "1.2.2", + "source": { + "type": "git", + "url": "https://github.com/ramsey/collection.git", + "reference": "cccc74ee5e328031b15640b51056ee8d3bb66c0a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/collection/zipball/cccc74ee5e328031b15640b51056ee8d3bb66c0a", + "reference": "cccc74ee5e328031b15640b51056ee8d3bb66c0a", + "shasum": "" + }, + "require": { + "php": "^7.3 || ^8", + "symfony/polyfill-php81": "^1.23" + }, + "require-dev": { + "captainhook/captainhook": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "ergebnis/composer-normalize": "^2.6", + "fakerphp/faker": "^1.5", + "hamcrest/hamcrest-php": "^2", + "jangregor/phpstan-prophecy": "^0.8", + "mockery/mockery": "^1.3", + "phpspec/prophecy-phpunit": "^2.0", + "phpstan/extension-installer": "^1", + "phpstan/phpstan": "^0.12.32", + "phpstan/phpstan-mockery": "^0.12.5", + "phpstan/phpstan-phpunit": "^0.12.11", + "phpunit/phpunit": "^8.5 || ^9", + "psy/psysh": "^0.10.4", + "slevomat/coding-standard": "^6.3", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Ramsey\\Collection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ben Ramsey", + "email": "ben@benramsey.com", + "homepage": "https://benramsey.com" + } + ], + "description": "A PHP library for representing and manipulating collections.", + "keywords": [ + "array", + "collection", + "hash", + "map", + "queue", + "set" + ], + "support": { + "issues": "https://github.com/ramsey/collection/issues", + "source": "https://github.com/ramsey/collection/tree/1.2.2" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/collection", + "type": "tidelift" + } + ], + "time": "2021-10-10T03:01:02+00:00" + }, + { + "name": "ramsey/uuid", + "version": "4.2.3", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df", + "reference": "fc9bb7fb5388691fd7373cd44dcb4d63bbcf24df", + "shasum": "" + }, + "require": { + "brick/math": "^0.8 || ^0.9", + "ext-json": "*", + "php": "^7.2 || ^8.0", + "ramsey/collection": "^1.0", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-php80": "^1.14" + }, + "replace": { + "rhumsaa/uuid": "self.version" + }, + "require-dev": { + "captainhook/captainhook": "^5.10", + "captainhook/plugin-composer": "^5.3", + "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0", + "doctrine/annotations": "^1.8", + "ergebnis/composer-normalize": "^2.15", + "mockery/mockery": "^1.3", + "moontoast/math": "^1.1", + "paragonie/random-lib": "^2", + "php-mock/php-mock": "^2.2", + "php-mock/php-mock-mockery": "^1.3", + "php-parallel-lint/php-parallel-lint": "^1.1", + "phpbench/phpbench": "^1.0", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-mockery": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpunit/phpunit": "^8.5 || ^9", + "slevomat/coding-standard": "^7.0", + "squizlabs/php_codesniffer": "^3.5", + "vimeo/psalm": "^4.9" + }, + "suggest": { + "ext-bcmath": "Enables faster math with arbitrary-precision integers using BCMath.", + "ext-ctype": "Enables faster processing of character classification using ctype functions.", + "ext-gmp": "Enables faster math with arbitrary-precision integers using GMP.", + "ext-uuid": "Enables the use of PeclUuidTimeGenerator and PeclUuidRandomGenerator.", + "paragonie/random-lib": "Provides RandomLib for use with the RandomLibAdapter", + "ramsey/uuid-doctrine": "Allows the use of Ramsey\\Uuid\\Uuid as Doctrine field type." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.x-dev" + }, + "captainhook": { + "force-install": true + } + }, + "autoload": { + "psr-4": { + "Ramsey\\Uuid\\": "src/" + }, + "files": [ + "src/functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A PHP library for generating and working with universally unique identifiers (UUIDs).", + "keywords": [ + "guid", + "identifier", + "uuid" + ], + "support": { + "issues": "https://github.com/ramsey/uuid/issues", + "source": "https://github.com/ramsey/uuid/tree/4.2.3" + }, + "funding": [ + { + "url": "https://github.com/ramsey", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/ramsey/uuid", + "type": "tidelift" + } + ], + "time": "2021-09-25T23:10:38+00:00" + }, + { + "name": "spatie/eloquent-sortable", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/spatie/eloquent-sortable.git", + "reference": "6b4ca608144153a69b6a9f457e15bd7eafbe97a9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/eloquent-sortable/zipball/6b4ca608144153a69b6a9f457e15bd7eafbe97a9", + "reference": "6b4ca608144153a69b6a9f457e15bd7eafbe97a9", + "shasum": "" + }, + "require": { + "illuminate/database": "^7.0|^8.0", + "illuminate/support": "^7.0|^8.0", + "php": "^8.0", + "spatie/laravel-package-tools": "^1.6" + }, + "require-dev": { + "orchestra/testbench": "^5.0|^6.0", + "phpunit/phpunit": "^8.0|^9.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\EloquentSortable\\EloquentSortableServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Spatie\\EloquentSortable\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be" + } + ], + "description": "Sortable behaviour for eloquent models", + "homepage": "https://github.com/spatie/eloquent-sortable", + "keywords": [ + "behaviour", + "eloquent", + "laravel", + "model", + "sort", + "sortable" + ], + "support": { + "issues": "https://github.com/spatie/eloquent-sortable/issues", + "source": "https://github.com/spatie/eloquent-sortable/tree/4.0.0" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + }, + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2021-03-31T14:07:53+00:00" + }, + { + "name": "spatie/laravel-package-tools", + "version": "1.9.2", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-package-tools.git", + "reference": "f710fe196c126fb9e0aee67eb5af49ad8f13f528" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/f710fe196c126fb9e0aee67eb5af49ad8f13f528", + "reference": "f710fe196c126fb9e0aee67eb5af49ad8f13f528", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^7.0|^8.0", + "php": "^7.4|^8.0" + }, + "require-dev": { + "mockery/mockery": "^1.4", + "orchestra/testbench": "^5.0|^6.0", + "phpunit/phpunit": "^9.3", + "spatie/test-time": "^1.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\LaravelPackageTools\\": "src", + "Spatie\\LaravelPackageTools\\Database\\Factories\\": "database/factories" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "role": "Developer" + } + ], + "description": "Tools for creating Laravel packages", + "homepage": "https://github.com/spatie/laravel-package-tools", + "keywords": [ + "laravel-package-tools", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/laravel-package-tools/issues", + "source": "https://github.com/spatie/laravel-package-tools/tree/1.9.2" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2021-09-21T13:06:51+00:00" + }, + { + "name": "spatie/laravel-tags", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-tags.git", + "reference": "b6ae5f9fdc323296509f486c81e7abbd14e85563" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-tags/zipball/b6ae5f9fdc323296509f486c81e7abbd14e85563", + "reference": "b6ae5f9fdc323296509f486c81e7abbd14e85563", + "shasum": "" + }, + "require": { + "laravel/framework": "^8.12", + "php": "^8.0", + "spatie/eloquent-sortable": "^3.10|^4.0", + "spatie/laravel-package-tools": "^1.4", + "spatie/laravel-translatable": "^4.6|^5.0" + }, + "require-dev": { + "orchestra/testbench": "^6.13", + "phpunit/phpunit": "^9.5.2" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\Tags\\TagsServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Spatie\\Tags\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + } + ], + "description": "Add tags and taggable behaviour to your Laravel app", + "homepage": "https://github.com/spatie/laravel-tags", + "keywords": [ + "laravel-tags", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/laravel-tags/issues", + "source": "https://github.com/spatie/laravel-tags/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2021-09-01T08:50:15+00:00" + }, + { + "name": "spatie/laravel-translatable", + "version": "5.0.3", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-translatable.git", + "reference": "06aa692efc2eed838ac47a6324dc179167a97b0b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-translatable/zipball/06aa692efc2eed838ac47a6324dc179167a97b0b", + "reference": "06aa692efc2eed838ac47a6324dc179167a97b0b", + "shasum": "" + }, + "require": { + "illuminate/database": "^7.0|^8.0", + "illuminate/support": "^7.0|^8.0", + "php": "^8.0", + "spatie/laravel-package-tools": "^1.6" + }, + "require-dev": { + "mockery/mockery": "^1.4", + "orchestra/testbench": "^5.0|^6.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\Translatable\\TranslatableServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Spatie\\Translatable\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + }, + { + "name": "Sebastian De Deyne", + "email": "sebastian@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + }, + { + "name": "Mohamed Said", + "email": "theMohamedSaid@gmail.com", + "role": "Original idea" + } + ], + "description": "A trait to make an Eloquent model hold translations", + "homepage": "https://github.com/spatie/laravel-translatable", + "keywords": [ + "eloquent", + "i8n", + "laravel-translatable", + "model", + "multilingual", + "spatie", + "translate" + ], + "support": { + "issues": "https://github.com/spatie/laravel-translatable/issues", + "source": "https://github.com/spatie/laravel-translatable/tree/5.0.3" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + } + ], + "time": "2021-10-04T14:59:49+00:00" + }, + { + "name": "swiftmailer/swiftmailer", + "version": "v6.3.0", + "source": { + "type": "git", + "url": "https://github.com/swiftmailer/swiftmailer.git", + "reference": "8a5d5072dca8f48460fce2f4131fcc495eec654c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/8a5d5072dca8f48460fce2f4131fcc495eec654c", + "reference": "8a5d5072dca8f48460fce2f4131fcc495eec654c", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.0|^3.1", + "php": ">=7.0.0", + "symfony/polyfill-iconv": "^1.0", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0" + }, + "require-dev": { + "mockery/mockery": "^1.0", + "symfony/phpunit-bridge": "^4.4|^5.4" + }, + "suggest": { + "ext-intl": "Needed to support internationalized email addresses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "6.2-dev" + } + }, + "autoload": { + "files": [ + "lib/swift_required.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Corbyn" + }, + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + } + ], + "description": "Swiftmailer, free feature-rich PHP mailer", + "homepage": "https://swiftmailer.symfony.com", + "keywords": [ + "email", + "mail", + "mailer" + ], + "support": { + "issues": "https://github.com/swiftmailer/swiftmailer/issues", + "source": "https://github.com/swiftmailer/swiftmailer/tree/v6.3.0" + }, + "funding": [ + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/swiftmailer/swiftmailer", + "type": "tidelift" + } + ], + "time": "2021-10-18T15:26:12+00:00" + }, + { + "name": "symfony/console", + "version": "v5.3.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "d4e409d9fbcfbf71af0e5a940abb7b0b4bad0bd3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/d4e409d9fbcfbf71af0e5a940abb7b0b4bad0bd3", + "reference": "d4e409d9fbcfbf71af0e5a940abb7b0b4bad0bd3", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.8", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2", + "symfony/string": "^5.1" + }, + "conflict": { + "psr/log": ">=3", + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", + "symfony/lock": "<4.4", + "symfony/process": "<4.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/log": "^1|^2", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/event-dispatcher": "^4.4|^5.0", + "symfony/lock": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0", + "symfony/var-dumper": "^4.4|^5.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v5.3.10" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-26T09:30:15+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v5.3.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "7fb120adc7f600a59027775b224c13a33530dd90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/7fb120adc7f600a59027775b224c13a33530dd90", + "reference": "7fb120adc7f600a59027775b224c13a33530dd90", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Converts CSS selectors to XPath expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/css-selector/tree/v5.3.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-07-21T12:38:00+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v2.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "6f981ee24cf69ee7ce9736146d1c57c2780598a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/6f981ee24cf69ee7ce9736146d1c57c2780598a8", + "reference": "6f981ee24cf69ee7ce9736146d1c57c2780598a8", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-07-12T14:48:14+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v5.3.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "eec73dd7218713f48a7996583a741b3bae58c8d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/eec73dd7218713f48a7996583a741b3bae58c8d3", + "reference": "eec73dd7218713f48a7996583a741b3bae58c8d3", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^4.4|^5.0" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.1", + "symfony/http-kernel": "^4.4|^5.0", + "symfony/serializer": "^4.4|^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v5.3.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-13T13:42:37+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v5.3.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "661a7a6e085394f8513945669e31f7c1338a7e69" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/661a7a6e085394f8513945669e31f7c1338a7e69", + "reference": "661a7a6e085394f8513945669e31f7c1338a7e69", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/event-dispatcher-contracts": "^2", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/dependency-injection": "<4.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/error-handler": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/service-contracts": "^1.1|^2", + "symfony/stopwatch": "^4.4|^5.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v5.3.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-17T12:16:12+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v2.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "66bea3b09be61613cd3b4043a65a8ec48cfa6d2a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/66bea3b09be61613cd3b4043a65a8ec48cfa6d2a", + "reference": "66bea3b09be61613cd3b4043a65a8ec48cfa6d2a", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/event-dispatcher": "^1" + }, + "suggest": { + "symfony/event-dispatcher-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-07-12T14:48:14+00:00" + }, + { + "name": "symfony/finder", + "version": "v5.3.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/a10000ada1e600d109a6c7632e9ac42e8bf2fb93", + "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v5.3.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-08-04T21:20:46+00:00" + }, + { + "name": "symfony/http-client-contracts", + "version": "v2.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client-contracts.git", + "reference": "ec82e57b5b714dbb69300d348bd840b345e24166" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/ec82e57b5b714dbb69300d348bd840b345e24166", + "reference": "ec82e57b5b714dbb69300d348bd840b345e24166", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "suggest": { + "symfony/http-client-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\HttpClient\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to HTTP clients", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/http-client-contracts/tree/v2.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-03T09:24:47+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v5.3.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "d1e7059ebeb0b8f9fe5eb5b26eacd2e3c1f371cc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/d1e7059ebeb0b8f9fe5eb5b26eacd2e3c1f371cc", + "reference": "d1e7059ebeb0b8f9fe5eb5b26eacd2e3c1f371cc", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "predis/predis": "~1.0", + "symfony/cache": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/mime": "^4.4|^5.0" + }, + "suggest": { + "symfony/mime": "To use the file extension guesser" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v5.3.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-04T16:37:19+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v5.3.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "f53025cd1d91b1af85d6d9e17eefa98e31ee953b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/f53025cd1d91b1af85d6d9e17eefa98e31ee953b", + "reference": "f53025cd1d91b1af85d6d9e17eefa98e31ee953b", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/log": "^1|^2", + "symfony/deprecation-contracts": "^2.1", + "symfony/error-handler": "^4.4|^5.0", + "symfony/event-dispatcher": "^5.0", + "symfony/http-client-contracts": "^1.1|^2", + "symfony/http-foundation": "^5.3.7", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/browser-kit": "<4.4", + "symfony/cache": "<5.0", + "symfony/config": "<5.0", + "symfony/console": "<4.4", + "symfony/dependency-injection": "<5.3", + "symfony/doctrine-bridge": "<5.0", + "symfony/form": "<5.0", + "symfony/http-client": "<5.0", + "symfony/mailer": "<5.0", + "symfony/messenger": "<5.0", + "symfony/translation": "<5.0", + "symfony/twig-bridge": "<5.0", + "symfony/validator": "<5.0", + "twig/twig": "<2.13" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^4.4|^5.0", + "symfony/config": "^5.0", + "symfony/console": "^4.4|^5.0", + "symfony/css-selector": "^4.4|^5.0", + "symfony/dependency-injection": "^5.3", + "symfony/dom-crawler": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0", + "symfony/routing": "^4.4|^5.0", + "symfony/stopwatch": "^4.4|^5.0", + "symfony/translation": "^4.4|^5.0", + "symfony/translation-contracts": "^1.1|^2", + "twig/twig": "^2.13|^3.0.4" + }, + "suggest": { + "symfony/browser-kit": "", + "symfony/config": "", + "symfony/console": "", + "symfony/dependency-injection": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a structured process for converting a Request into a Response", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v5.3.12" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-24T08:46:46+00:00" + }, + { + "name": "symfony/mime", + "version": "v5.3.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "dffc0684f10526db12c52fcd6238c64695426d61" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/dffc0684f10526db12c52fcd6238c64695426d61", + "reference": "dffc0684f10526db12c52fcd6238c64695426d61", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/mailer": "<4.4" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/property-access": "^4.4|^5.1", + "symfony/property-info": "^4.4|^5.1", + "symfony/serializer": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v5.3.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-20T16:42:42+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-19T12:13:01+00:00" + }, + { + "name": "symfony/polyfill-iconv", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-iconv.git", + "reference": "63b5bb7db83e5673936d6e3b8b3e022ff6474933" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/63b5bb7db83e5673936d6e3b8b3e022ff6474933", + "reference": "63b5bb7db83e5673936d6e3b8b3e022ff6474933", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-iconv": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Iconv\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Iconv extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "iconv", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-iconv/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T09:27:20+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.23.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "16880ba9c5ebe3642d1995ab866db29270b36535" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/16880ba9c5ebe3642d1995ab866db29270b36535", + "reference": "16880ba9c5ebe3642d1995ab866db29270b36535", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T12:26:48+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/65bd267525e82759e7d8c4e8ceea44f398838e65", + "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php72": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T09:27:20+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-19T12:13:01+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.23.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6", + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T12:26:48+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "9a142215a36a3888e30d0a9eeea9766764e96976" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9a142215a36a3888e30d0a9eeea9766764e96976", + "reference": "9a142215a36a3888e30d0a9eeea9766764e96976", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php72/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T09:17:38+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-19T12:13:01+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.23.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be", + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-07-28T13:41:28+00:00" + }, + { + "name": "symfony/polyfill-php81", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php81.git", + "reference": "e66119f3de95efc359483f810c4c3e6436279436" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php81/zipball/e66119f3de95efc359483f810c4c3e6436279436", + "reference": "e66119f3de95efc359483f810c4c3e6436279436", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php81\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.1+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php81/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-21T13:25:03+00:00" + }, + { + "name": "symfony/process", + "version": "v5.3.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "38f26c7d6ed535217ea393e05634cb0b244a1967" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/38f26c7d6ed535217ea393e05634cb0b244a1967", + "reference": "38f26c7d6ed535217ea393e05634cb0b244a1967", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v5.3.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-08-04T21:20:46+00:00" + }, + { + "name": "symfony/routing", + "version": "v5.3.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "be865017746fe869007d94220ad3f5297951811b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/be865017746fe869007d94220ad3f5297951811b", + "reference": "be865017746fe869007d94220ad3f5297951811b", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "doctrine/annotations": "<1.12", + "symfony/config": "<5.3", + "symfony/dependency-injection": "<4.4", + "symfony/yaml": "<4.4" + }, + "require-dev": { + "doctrine/annotations": "^1.12", + "psr/log": "^1|^2|^3", + "symfony/config": "^5.3", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/yaml": "^4.4|^5.0" + }, + "suggest": { + "symfony/config": "For using the all-in-one router or any loader", + "symfony/expression-language": "For using expression matching", + "symfony/http-foundation": "For using a Symfony Request object", + "symfony/yaml": "For using the YAML loader" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Maps an HTTP request to a set of configuration variables", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "support": { + "source": "https://github.com/symfony/routing/tree/v5.3.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-08-04T21:42:42+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", + "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v2.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-04-01T10:43:52+00:00" + }, + { + "name": "symfony/string", + "version": "v5.3.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c", + "reference": "d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" + }, + "require-dev": { + "symfony/error-handler": "^4.4|^5.0", + "symfony/http-client": "^4.4|^5.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "files": [ + "Resources/functions.php" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v5.3.10" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-27T18:21:46+00:00" + }, + { + "name": "symfony/translation", + "version": "v5.3.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "6ef197aea2ac8b9cd63e0da7522b3771714035aa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/6ef197aea2ac8b9cd63e0da7522b3771714035aa", + "reference": "6ef197aea2ac8b9cd63e0da7522b3771714035aa", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation-contracts": "^2.3" + }, + "conflict": { + "symfony/config": "<4.4", + "symfony/dependency-injection": "<5.0", + "symfony/http-kernel": "<5.0", + "symfony/twig-bundle": "<5.0", + "symfony/yaml": "<4.4" + }, + "provide": { + "symfony/translation-implementation": "2.3" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^4.4|^5.0", + "symfony/console": "^4.4|^5.0", + "symfony/dependency-injection": "^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/http-kernel": "^5.0", + "symfony/intl": "^4.4|^5.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/service-contracts": "^1.1.2|^2", + "symfony/yaml": "^4.4|^5.0" + }, + "suggest": { + "psr/log-implementation": "To use logging capability in translator", + "symfony/config": "", + "symfony/yaml": "" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v5.3.10" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-10T06:43:24+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "95c812666f3e91db75385749fe219c5e494c7f95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/95c812666f3e91db75385749fe219c5e494c7f95", + "reference": "95c812666f3e91db75385749fe219c5e494c7f95", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "suggest": { + "symfony/translation-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v2.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-03-23T23:28:01+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v5.3.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "a029b3a11b757f9cc8693040339153b4745a913f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/a029b3a11b757f9cc8693040339153b4745a913f", + "reference": "a029b3a11b757f9cc8693040339153b4745a913f", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "phpunit/phpunit": "<5.4.3", + "symfony/console": "<4.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0", + "twig/twig": "^2.13|^3.0.4" + }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v5.3.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-12T11:38:27+00:00" + }, + { + "name": "tijsverkoyen/css-to-inline-styles", + "version": "2.2.3", + "source": { + "type": "git", + "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", + "reference": "b43b05cf43c1b6d849478965062b6ef73e223bb5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/b43b05cf43c1b6d849478965062b6ef73e223bb5", + "reference": "b43b05cf43c1b6d849478965062b6ef73e223bb5", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "php": "^5.5 || ^7.0 || ^8.0", + "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^7.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "TijsVerkoyen\\CssToInlineStyles\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Tijs Verkoyen", + "email": "css_to_inline_styles@verkoyen.eu", + "role": "Developer" + } + ], + "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", + "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", + "support": { + "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/2.2.3" + }, + "time": "2020-07-13T06:12:54+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v5.4.0", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "d4394d044ed69a8f244f3445bcedf8a0d7fe2403" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/d4394d044ed69a8f244f3445bcedf8a0d7fe2403", + "reference": "d4394d044ed69a8f244f3445bcedf8a0d7fe2403", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.0.2", + "php": "^7.1.3 || ^8.0", + "phpoption/phpoption": "^1.8", + "symfony/polyfill-ctype": "^1.23", + "symfony/polyfill-mbstring": "^1.23.1", + "symfony/polyfill-php80": "^1.23.1" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "ext-filter": "*", + "phpunit/phpunit": "^7.5.20 || ^8.5.21 || ^9.5.10" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.4-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.4.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2021-11-10T01:08:39+00:00" + }, + { + "name": "voku/portable-ascii", + "version": "1.5.6", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "80953678b19901e5165c56752d087fc11526017c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/80953678b19901e5165c56752d087fc11526017c", + "reference": "80953678b19901e5165c56752d087fc11526017c", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "http://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/1.5.6" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "time": "2020-11-12T00:07:28+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.10.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/6964c76c7804814a842473e0c8fd15bab0f18e25", + "reference": "6964c76c7804814a842473e0c8fd15bab0f18e25", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.10.0" + }, + "time": "2021-03-09T10:59:23+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": [], + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": "^8.0" + }, + "platform-dev": [], + "plugin-api-version": "2.1.0" +} diff --git a/packages/spatie-laravel-tags-plugin/docs/01-installation.md b/packages/spatie-laravel-tags-plugin/docs/01-installation.md new file mode 100644 index 0000000000..e18e4bd8fb --- /dev/null +++ b/packages/spatie-laravel-tags-plugin/docs/01-installation.md @@ -0,0 +1,31 @@ +--- +title: Installation +--- + +## Requirements + +Filament has a few requirements to run: + +- PHP 8.0+ +- Laravel v8.0+ +- Livewire v2.0+ + +This plugin is compatible with other Filament v2.x packages. + +## Installation + +Install the plugin with Composer: + +```bash +composer require filament/spatie-laravel-tags-plugin +``` + +You're now ready to start using the [form components](form-components)! + +## Upgrade Guide + +To upgrade the package to the latest version, you must run: + +```bash +composer update +``` diff --git a/packages/spatie-laravel-tags-plugin/docs/02-form-components.md b/packages/spatie-laravel-tags-plugin/docs/02-form-components.md new file mode 100644 index 0000000000..7117c537de --- /dev/null +++ b/packages/spatie-laravel-tags-plugin/docs/02-form-components.md @@ -0,0 +1,30 @@ +--- +title: Form Components +--- + +## Tags input + +To use the tags input, you may pass a `model()` to the component: + +```php +use Filament\Forms\Components\SpatieTagsInput; + +SpatieTagsInput::make('tags') + ->model(Post::find(1)), +``` + +When a model instance is attached, tags will automatically be populated [and saved](/docs/forms/getting-started#field-relationships) to that model. Alternatively, if you do not have access to a model instance, you may [attach the model instance after the form is saved](/docs/forms/getting-started#saving-field-relationships-manually). + +Optionally, you may pass a `type()`: + +```php +use Filament\Forms\Components\SpatieTagsInput; + +SpatieTagsInput::make('tags') + ->type('categories') + ->model(Post::find(1)), +``` + +The [type](https://spatie.be/docs/laravel-tags/v4/advanced-usage/using-types) allows you to group tags into collections. + +The tags input supports all the customization options of the [original tags input component](/docs/forms/fields#tags-input). diff --git a/packages/spatie-laravel-tags-plugin/src/Forms/Components/SpatieTagsInput.php b/packages/spatie-laravel-tags-plugin/src/Forms/Components/SpatieTagsInput.php new file mode 100644 index 0000000000..9f57cdcf91 --- /dev/null +++ b/packages/spatie-laravel-tags-plugin/src/Forms/Components/SpatieTagsInput.php @@ -0,0 +1,59 @@ +afterStateHydrated(function (SpatieTagsInput $component, Model|string|null $model): void { + if (! $model || is_string($model)) { + $component->state([]); + + return; + } + + if ($type = $component->getType()) { + $tags = $model->tagsWithType($type); + } else { + $tags = $model->tags; + } + + $component->state($tags->pluck('name')); + }); + + $this->dehydrated(false); + } + + public function saveRelationships(): void + { + $model = $this->getModel(); + $tags = $this->getState(); + + if ($type = $this->getType()) { + $model->syncTagsWithType($tags, $type); + + return; + } + + $model->syncTags($tags); + } + + public function type(string | callable $type): static + { + $this->type = $type; + + return $this; + } + + public function getType(): ?string + { + return $this->evaluate($this->type); + } +} diff --git a/packages/spatie-laravel-translatable-plugin/.gitignore b/packages/spatie-laravel-translatable-plugin/.gitignore new file mode 100644 index 0000000000..61ead86667 --- /dev/null +++ b/packages/spatie-laravel-translatable-plugin/.gitignore @@ -0,0 +1 @@ +/vendor diff --git a/packages/spatie-laravel-translatable-plugin/composer.json b/packages/spatie-laravel-translatable-plugin/composer.json new file mode 100644 index 0000000000..c11239c8e5 --- /dev/null +++ b/packages/spatie-laravel-translatable-plugin/composer.json @@ -0,0 +1,32 @@ +{ + "name": "filament/spatie-laravel-translatable-plugin", + "description": "Filament support for `spatie/laravel-translatable`.", + "license": "MIT", + "homepage": "https://github.com/laravel-filament/filament", + "support": { + "issues": "https://github.com/laravel-filament/filament/issues", + "source": "https://github.com/laravel-filament/filament" + }, + "require": { + "php": "^8.0", + "filament/filament": "self.version", + "spatie/laravel-translatable": "^5.0" + }, + "autoload": { + "psr-4": { + "Filament\\": "src" + } + }, + "extra": { + "laravel": { + "providers": [ + "Filament\\SpatieLaravelTranslatablePluginServiceProvider" + ] + } + }, + "config": { + "sort-packages": true + }, + "minimum-stability": "dev", + "prefer-stable": true +} diff --git a/packages/spatie-laravel-translatable-plugin/composer.lock b/packages/spatie-laravel-translatable-plugin/composer.lock new file mode 100644 index 0000000000..1eaf745731 --- /dev/null +++ b/packages/spatie-laravel-translatable-plugin/composer.lock @@ -0,0 +1,3343 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "00791898b0e2ac5471263b8dd1d39743", + "packages": [ + { + "name": "danharrin/livewire-rate-limiting", + "version": "v0.3.0", + "source": { + "type": "git", + "url": "https://github.com/danharrin/livewire-rate-limiting.git", + "reference": "c97041cd4f94168d5077d4463062e681d057e00a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/danharrin/livewire-rate-limiting/zipball/c97041cd4f94168d5077d4463062e681d057e00a", + "reference": "c97041cd4f94168d5077d4463062e681d057e00a", + "shasum": "" + }, + "require": { + "illuminate/support": "^8.0", + "php": "^7.2|^8.0" + }, + "require-dev": { + "livewire/livewire": "^2.3", + "orchestra/testbench": "^6.2", + "phpunit/phpunit": "^9.4", + "symplify/monorepo-builder": "^9.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "DanHarrin\\LivewireRateLimiting\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dan Harrin", + "email": "dan@danharrin.com" + } + ], + "description": "Apply rate limiters to Laravel Livewire actions.", + "homepage": "https://github.com/danharrin/livewire-rate-limiting", + "support": { + "issues": "https://github.com/danharrin/livewire-rate-limiting/issues", + "source": "https://github.com/danharrin/livewire-rate-limiting" + }, + "funding": [ + { + "url": "https://github.com/danharrin", + "type": "github" + } + ], + "time": "2021-05-17T08:01:19+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89", + "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^8.2", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpstan/phpstan-strict-rules": "^0.12", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "vimeo/psalm": "^4.10" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.4" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2021-10-22T20:16:43+00:00" + }, + { + "name": "doctrine/lexer", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042", + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "phpstan/phpstan": "^0.11.8", + "phpunit/phpunit": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/1.2.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2020-05-25T17:44:05+00:00" + }, + { + "name": "egulias/email-validator", + "version": "2.1.25", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/0dbf5d78455d4d6a41d186da50adc1122ec066f4", + "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^1.0.1", + "php": ">=5.5", + "symfony/polyfill-intl-idn": "^1.10" + }, + "require-dev": { + "dominicsayers/isemail": "^3.0.7", + "phpunit/phpunit": "^4.8.36|^7.5.15", + "satooshi/php-coveralls": "^1.0.1" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/2.1.25" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2020-12-29T14:50:06+00:00" + }, + { + "name": "filament/filament", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/laravel-filament/admin.git", + "reference": "c295a7fa1278a74bc8e2cb31fa195563325ca6da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel-filament/admin/zipball/c295a7fa1278a74bc8e2cb31fa195563325ca6da", + "reference": "c295a7fa1278a74bc8e2cb31fa195563325ca6da", + "shasum": "" + }, + "require": { + "danharrin/livewire-rate-limiting": "^0.3.0", + "livewire/livewire": "^2.6", + "php": "^8.0", + "spatie/laravel-package-tools": "^1.9" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Filament\\FilamentServiceProvider" + ] + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Filament\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Effortlessly build TALL-powered admin panels.", + "homepage": "https://github.com/laravel-filament/filament", + "support": { + "issues": "https://github.com/laravel-filament/filament/issues", + "source": "https://github.com/laravel-filament/filament" + }, + "funding": [ + { + "url": "https://github.com/danharrin", + "type": "github" + } + ], + "time": "2021-11-27T07:47:18+00:00" + }, + { + "name": "illuminate/collections", + "version": "v8.73.2", + "source": { + "type": "git", + "url": "https://github.com/illuminate/collections.git", + "reference": "bfb57bc1863689058706eb41287b7ad523d74403" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/collections/zipball/bfb57bc1863689058706eb41287b7ad523d74403", + "reference": "bfb57bc1863689058706eb41287b7ad523d74403", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^8.0", + "illuminate/macroable": "^8.0", + "php": "^7.3|^8.0" + }, + "suggest": { + "symfony/var-dumper": "Required to use the dump method (^5.1.4)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + }, + "files": [ + "helpers.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Collections package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-11-15T14:44:56+00:00" + }, + { + "name": "illuminate/container", + "version": "v8.73.2", + "source": { + "type": "git", + "url": "https://github.com/illuminate/container.git", + "reference": "6ac391bb27391706c5f921b85060aa2c4ca03fae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/container/zipball/6ac391bb27391706c5f921b85060aa2c4ca03fae", + "reference": "6ac391bb27391706c5f921b85060aa2c4ca03fae", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^8.0", + "php": "^7.3|^8.0", + "psr/container": "^1.0" + }, + "provide": { + "psr/container-implementation": "1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Container\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Container package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-11-17T15:04:30+00:00" + }, + { + "name": "illuminate/contracts", + "version": "v8.73.2", + "source": { + "type": "git", + "url": "https://github.com/illuminate/contracts.git", + "reference": "b0886ec05a63b204634d64d0b39d5b78a7c06f81" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/contracts/zipball/b0886ec05a63b204634d64d0b39d5b78a7c06f81", + "reference": "b0886ec05a63b204634d64d0b39d5b78a7c06f81", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0", + "psr/container": "^1.0", + "psr/simple-cache": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Contracts\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Contracts package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-11-17T15:04:30+00:00" + }, + { + "name": "illuminate/database", + "version": "v8.73.2", + "source": { + "type": "git", + "url": "https://github.com/illuminate/database.git", + "reference": "f93e5370a3d321de697755f185395bdf75e0ccc4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/database/zipball/f93e5370a3d321de697755f185395bdf75e0ccc4", + "reference": "f93e5370a3d321de697755f185395bdf75e0ccc4", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/collections": "^8.0", + "illuminate/container": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/macroable": "^8.0", + "illuminate/support": "^8.0", + "php": "^7.3|^8.0", + "symfony/console": "^5.1.4" + }, + "suggest": { + "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.13.3|^3.1.4).", + "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", + "illuminate/console": "Required to use the database commands (^8.0).", + "illuminate/events": "Required to use the observers with Eloquent (^8.0).", + "illuminate/filesystem": "Required to use the migrations (^8.0).", + "illuminate/pagination": "Required to paginate the result set (^8.0).", + "symfony/finder": "Required to use Eloquent model factories (^5.1.4)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Database\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Database package.", + "homepage": "https://laravel.com", + "keywords": [ + "database", + "laravel", + "orm", + "sql" + ], + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-11-23T14:10:34+00:00" + }, + { + "name": "illuminate/filesystem", + "version": "v8.73.2", + "source": { + "type": "git", + "url": "https://github.com/illuminate/filesystem.git", + "reference": "a7bc30dac4e27dbeb37b026f3dbaee13bd578861" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/filesystem/zipball/a7bc30dac4e27dbeb37b026f3dbaee13bd578861", + "reference": "a7bc30dac4e27dbeb37b026f3dbaee13bd578861", + "shasum": "" + }, + "require": { + "illuminate/collections": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/macroable": "^8.0", + "illuminate/support": "^8.0", + "php": "^7.3|^8.0", + "symfony/finder": "^5.1.4" + }, + "suggest": { + "ext-ftp": "Required to use the Flysystem FTP driver.", + "illuminate/http": "Required for handling uploaded files (^7.0).", + "league/flysystem": "Required to use the Flysystem local and FTP drivers (^1.1).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^1.0).", + "league/flysystem-cached-adapter": "Required to use the Flysystem cache (^1.0).", + "league/flysystem-sftp": "Required to use the Flysystem SFTP driver (^1.0).", + "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^5.1.4).", + "symfony/mime": "Required to enable support for guessing extensions (^5.1.4)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Filesystem\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Filesystem package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-10-22T13:20:42+00:00" + }, + { + "name": "illuminate/macroable", + "version": "v8.73.2", + "source": { + "type": "git", + "url": "https://github.com/illuminate/macroable.git", + "reference": "aed81891a6e046fdee72edd497f822190f61c162" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/macroable/zipball/aed81891a6e046fdee72edd497f822190f61c162", + "reference": "aed81891a6e046fdee72edd497f822190f61c162", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Macroable package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-11-16T13:57:03+00:00" + }, + { + "name": "illuminate/support", + "version": "v8.73.2", + "source": { + "type": "git", + "url": "https://github.com/illuminate/support.git", + "reference": "ecb4d4fb01f9716b2decbb1bf584ea8164c3b222" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/support/zipball/ecb4d4fb01f9716b2decbb1bf584ea8164c3b222", + "reference": "ecb4d4fb01f9716b2decbb1bf584ea8164c3b222", + "shasum": "" + }, + "require": { + "doctrine/inflector": "^1.4|^2.0", + "ext-json": "*", + "ext-mbstring": "*", + "illuminate/collections": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/macroable": "^8.0", + "nesbot/carbon": "^2.53.1", + "php": "^7.3|^8.0", + "voku/portable-ascii": "^1.4.8" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "suggest": { + "illuminate/filesystem": "Required to use the composer class (^8.0).", + "league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^1.3|^2.0.2).", + "ramsey/uuid": "Required to use Str::uuid() (^4.2.2).", + "symfony/process": "Required to use the composer class (^5.1.4).", + "symfony/var-dumper": "Required to use the dd function (^5.1.4).", + "vlucas/phpdotenv": "Required to use the Env class and env helper (^5.2)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + }, + "files": [ + "helpers.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Support package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-11-23T14:10:18+00:00" + }, + { + "name": "illuminate/translation", + "version": "v8.73.2", + "source": { + "type": "git", + "url": "https://github.com/illuminate/translation.git", + "reference": "c10a68f37f590dc8c1c1fe5b6ad3f09381282137" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/translation/zipball/c10a68f37f590dc8c1c1fe5b6ad3f09381282137", + "reference": "c10a68f37f590dc8c1c1fe5b6ad3f09381282137", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/collections": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/filesystem": "^8.0", + "illuminate/macroable": "^8.0", + "illuminate/support": "^8.0", + "php": "^7.3|^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Translation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Translation package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-10-30T16:01:33+00:00" + }, + { + "name": "illuminate/validation", + "version": "v8.73.2", + "source": { + "type": "git", + "url": "https://github.com/illuminate/validation.git", + "reference": "0c6a37684edbeef8f231f192126f1eeee07449e0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/validation/zipball/0c6a37684edbeef8f231f192126f1eeee07449e0", + "reference": "0c6a37684edbeef8f231f192126f1eeee07449e0", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.10", + "ext-json": "*", + "illuminate/collections": "^8.0", + "illuminate/container": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/macroable": "^8.0", + "illuminate/support": "^8.0", + "illuminate/translation": "^8.0", + "php": "^7.3|^8.0", + "symfony/http-foundation": "^5.1.4", + "symfony/mime": "^5.1.4" + }, + "suggest": { + "ext-bcmath": "Required to use the multiple_of validation rule.", + "illuminate/database": "Required to use the database presence verifier (^8.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Validation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Validation package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-11-18T14:48:46+00:00" + }, + { + "name": "livewire/livewire", + "version": "v2.8.0", + "source": { + "type": "git", + "url": "https://github.com/livewire/livewire.git", + "reference": "fc8c315babf8d42c2a25f207b3931b1bc8eb5e70" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/livewire/livewire/zipball/fc8c315babf8d42c2a25f207b3931b1bc8eb5e70", + "reference": "fc8c315babf8d42c2a25f207b3931b1bc8eb5e70", + "shasum": "" + }, + "require": { + "illuminate/database": "^7.0|^8.0", + "illuminate/support": "^7.0|^8.0", + "illuminate/validation": "^7.0|^8.0", + "php": "^7.2.5|^8.0", + "symfony/http-kernel": "^5.0" + }, + "require-dev": { + "calebporzio/sushi": "^2.1", + "laravel/framework": "^7.0|^8.0", + "mockery/mockery": "^1.3.1", + "orchestra/testbench": "^5.0|^6.0", + "orchestra/testbench-dusk": "^5.2|^6.0", + "phpunit/phpunit": "^8.4|^9.0", + "psy/psysh": "@stable" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Livewire\\LivewireServiceProvider" + ], + "aliases": { + "Livewire": "Livewire\\Livewire" + } + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Livewire\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Caleb Porzio", + "email": "calebporzio@gmail.com" + } + ], + "description": "A front-end framework for Laravel.", + "support": { + "issues": "https://github.com/livewire/livewire/issues", + "source": "https://github.com/livewire/livewire/tree/v2.8.0" + }, + "funding": [ + { + "url": "https://github.com/livewire", + "type": "github" + } + ], + "time": "2021-11-24T04:33:15+00:00" + }, + { + "name": "nesbot/carbon", + "version": "2.54.0", + "source": { + "type": "git", + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "eed83939f1aed3eee517d03a33f5ec587ac529b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/eed83939f1aed3eee517d03a33f5ec587ac529b5", + "reference": "eed83939f1aed3eee517d03a33f5ec587ac529b5", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.1.8 || ^8.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation": "^3.4 || ^4.0 || ^5.0" + }, + "require-dev": { + "doctrine/dbal": "^2.0 || ^3.0", + "doctrine/orm": "^2.7", + "friendsofphp/php-cs-fixer": "^3.0", + "kylekatarnls/multi-tester": "^2.0", + "phpmd/phpmd": "^2.9", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12.54", + "phpunit/phpunit": "^7.5.20 || ^8.5.14", + "squizlabs/php_codesniffer": "^3.4" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-3.x": "3.x-dev", + "dev-master": "2.x-dev" + }, + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon" + }, + "funding": [ + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "time": "2021-11-01T21:22:20+00:00" + }, + { + "name": "psr/container", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.2" + }, + "time": "2021-11-05T16:50:12+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/log", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/ef29f6d262798707a9edd554e2b82517ef3a9376", + "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/2.0.0" + }, + "time": "2021-07-14T16:41:46+00:00" + }, + { + "name": "psr/simple-cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/master" + }, + "time": "2017-10-23T01:57:42+00:00" + }, + { + "name": "spatie/laravel-package-tools", + "version": "1.9.2", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-package-tools.git", + "reference": "f710fe196c126fb9e0aee67eb5af49ad8f13f528" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/f710fe196c126fb9e0aee67eb5af49ad8f13f528", + "reference": "f710fe196c126fb9e0aee67eb5af49ad8f13f528", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^7.0|^8.0", + "php": "^7.4|^8.0" + }, + "require-dev": { + "mockery/mockery": "^1.4", + "orchestra/testbench": "^5.0|^6.0", + "phpunit/phpunit": "^9.3", + "spatie/test-time": "^1.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\LaravelPackageTools\\": "src", + "Spatie\\LaravelPackageTools\\Database\\Factories\\": "database/factories" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "role": "Developer" + } + ], + "description": "Tools for creating Laravel packages", + "homepage": "https://github.com/spatie/laravel-package-tools", + "keywords": [ + "laravel-package-tools", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/laravel-package-tools/issues", + "source": "https://github.com/spatie/laravel-package-tools/tree/1.9.2" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2021-09-21T13:06:51+00:00" + }, + { + "name": "spatie/laravel-translatable", + "version": "5.0.3", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-translatable.git", + "reference": "06aa692efc2eed838ac47a6324dc179167a97b0b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-translatable/zipball/06aa692efc2eed838ac47a6324dc179167a97b0b", + "reference": "06aa692efc2eed838ac47a6324dc179167a97b0b", + "shasum": "" + }, + "require": { + "illuminate/database": "^7.0|^8.0", + "illuminate/support": "^7.0|^8.0", + "php": "^8.0", + "spatie/laravel-package-tools": "^1.6" + }, + "require-dev": { + "mockery/mockery": "^1.4", + "orchestra/testbench": "^5.0|^6.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Spatie\\Translatable\\TranslatableServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Spatie\\Translatable\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + }, + { + "name": "Sebastian De Deyne", + "email": "sebastian@spatie.be", + "homepage": "https://spatie.be", + "role": "Developer" + }, + { + "name": "Mohamed Said", + "email": "theMohamedSaid@gmail.com", + "role": "Original idea" + } + ], + "description": "A trait to make an Eloquent model hold translations", + "homepage": "https://github.com/spatie/laravel-translatable", + "keywords": [ + "eloquent", + "i8n", + "laravel-translatable", + "model", + "multilingual", + "spatie", + "translate" + ], + "support": { + "issues": "https://github.com/spatie/laravel-translatable/issues", + "source": "https://github.com/spatie/laravel-translatable/tree/5.0.3" + }, + "funding": [ + { + "url": "https://spatie.be/open-source/support-us", + "type": "custom" + } + ], + "time": "2021-10-04T14:59:49+00:00" + }, + { + "name": "symfony/console", + "version": "v5.3.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "3e7ab8f5905058984899b05a4648096f558bfeba" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/3e7ab8f5905058984899b05a4648096f558bfeba", + "reference": "3e7ab8f5905058984899b05a4648096f558bfeba", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.8", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2", + "symfony/string": "^5.1" + }, + "conflict": { + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", + "symfony/lock": "<4.4", + "symfony/process": "<4.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/log": "^1|^2", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/event-dispatcher": "^4.4|^5.0", + "symfony/lock": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0", + "symfony/var-dumper": "^4.4|^5.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v5.3.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-21T19:41:05+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v2.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "6f981ee24cf69ee7ce9736146d1c57c2780598a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/6f981ee24cf69ee7ce9736146d1c57c2780598a8", + "reference": "6f981ee24cf69ee7ce9736146d1c57c2780598a8", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-07-12T14:48:14+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v5.3.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "eec73dd7218713f48a7996583a741b3bae58c8d3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/eec73dd7218713f48a7996583a741b3bae58c8d3", + "reference": "eec73dd7218713f48a7996583a741b3bae58c8d3", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^4.4|^5.0" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.1", + "symfony/http-kernel": "^4.4|^5.0", + "symfony/serializer": "^4.4|^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v5.3.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-13T13:42:37+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v5.3.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "661a7a6e085394f8513945669e31f7c1338a7e69" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/661a7a6e085394f8513945669e31f7c1338a7e69", + "reference": "661a7a6e085394f8513945669e31f7c1338a7e69", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/event-dispatcher-contracts": "^2", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/dependency-injection": "<4.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/error-handler": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/service-contracts": "^1.1|^2", + "symfony/stopwatch": "^4.4|^5.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v5.3.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-17T12:16:12+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v2.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "66bea3b09be61613cd3b4043a65a8ec48cfa6d2a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/66bea3b09be61613cd3b4043a65a8ec48cfa6d2a", + "reference": "66bea3b09be61613cd3b4043a65a8ec48cfa6d2a", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/event-dispatcher": "^1" + }, + "suggest": { + "symfony/event-dispatcher-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-07-12T14:48:14+00:00" + }, + { + "name": "symfony/finder", + "version": "v5.3.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/a10000ada1e600d109a6c7632e9ac42e8bf2fb93", + "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v5.3.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-08-04T21:20:46+00:00" + }, + { + "name": "symfony/http-client-contracts", + "version": "v2.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client-contracts.git", + "reference": "ec82e57b5b714dbb69300d348bd840b345e24166" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/ec82e57b5b714dbb69300d348bd840b345e24166", + "reference": "ec82e57b5b714dbb69300d348bd840b345e24166", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "suggest": { + "symfony/http-client-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\HttpClient\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to HTTP clients", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/http-client-contracts/tree/v2.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-03T09:24:47+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v5.3.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "d1e7059ebeb0b8f9fe5eb5b26eacd2e3c1f371cc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/d1e7059ebeb0b8f9fe5eb5b26eacd2e3c1f371cc", + "reference": "d1e7059ebeb0b8f9fe5eb5b26eacd2e3c1f371cc", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "predis/predis": "~1.0", + "symfony/cache": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/mime": "^4.4|^5.0" + }, + "suggest": { + "symfony/mime": "To use the file extension guesser" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v5.3.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-04T16:37:19+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v5.3.12", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "f53025cd1d91b1af85d6d9e17eefa98e31ee953b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/f53025cd1d91b1af85d6d9e17eefa98e31ee953b", + "reference": "f53025cd1d91b1af85d6d9e17eefa98e31ee953b", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/log": "^1|^2", + "symfony/deprecation-contracts": "^2.1", + "symfony/error-handler": "^4.4|^5.0", + "symfony/event-dispatcher": "^5.0", + "symfony/http-client-contracts": "^1.1|^2", + "symfony/http-foundation": "^5.3.7", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/browser-kit": "<4.4", + "symfony/cache": "<5.0", + "symfony/config": "<5.0", + "symfony/console": "<4.4", + "symfony/dependency-injection": "<5.3", + "symfony/doctrine-bridge": "<5.0", + "symfony/form": "<5.0", + "symfony/http-client": "<5.0", + "symfony/mailer": "<5.0", + "symfony/messenger": "<5.0", + "symfony/translation": "<5.0", + "symfony/twig-bridge": "<5.0", + "symfony/validator": "<5.0", + "twig/twig": "<2.13" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^4.4|^5.0", + "symfony/config": "^5.0", + "symfony/console": "^4.4|^5.0", + "symfony/css-selector": "^4.4|^5.0", + "symfony/dependency-injection": "^5.3", + "symfony/dom-crawler": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0", + "symfony/routing": "^4.4|^5.0", + "symfony/stopwatch": "^4.4|^5.0", + "symfony/translation": "^4.4|^5.0", + "symfony/translation-contracts": "^1.1|^2", + "twig/twig": "^2.13|^3.0.4" + }, + "suggest": { + "symfony/browser-kit": "", + "symfony/config": "", + "symfony/console": "", + "symfony/dependency-injection": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a structured process for converting a Request into a Response", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v5.3.12" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-24T08:46:46+00:00" + }, + { + "name": "symfony/mime", + "version": "v5.3.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "dffc0684f10526db12c52fcd6238c64695426d61" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/dffc0684f10526db12c52fcd6238c64695426d61", + "reference": "dffc0684f10526db12c52fcd6238c64695426d61", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/mailer": "<4.4" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/property-access": "^4.4|^5.1", + "symfony/property-info": "^4.4|^5.1", + "symfony/serializer": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v5.3.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-20T16:42:42+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-19T12:13:01+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.23.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "16880ba9c5ebe3642d1995ab866db29270b36535" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/16880ba9c5ebe3642d1995ab866db29270b36535", + "reference": "16880ba9c5ebe3642d1995ab866db29270b36535", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T12:26:48+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/65bd267525e82759e7d8c4e8ceea44f398838e65", + "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php72": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T09:27:20+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-19T12:13:01+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.23.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6", + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T12:26:48+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "9a142215a36a3888e30d0a9eeea9766764e96976" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9a142215a36a3888e30d0a9eeea9766764e96976", + "reference": "9a142215a36a3888e30d0a9eeea9766764e96976", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php72/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T09:17:38+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-19T12:13:01+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.23.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be", + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-07-28T13:41:28+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v2.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc", + "reference": "1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1", + "symfony/deprecation-contracts": "^2.1" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v2.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-04T16:48:04+00:00" + }, + { + "name": "symfony/string", + "version": "v5.3.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c", + "reference": "d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" + }, + "require-dev": { + "symfony/error-handler": "^4.4|^5.0", + "symfony/http-client": "^4.4|^5.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "files": [ + "Resources/functions.php" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v5.3.10" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-27T18:21:46+00:00" + }, + { + "name": "symfony/translation", + "version": "v5.3.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "17a965c8f3b1b348cf15d903ac53942984561f8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/17a965c8f3b1b348cf15d903ac53942984561f8a", + "reference": "17a965c8f3b1b348cf15d903ac53942984561f8a", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation-contracts": "^2.3" + }, + "conflict": { + "symfony/config": "<4.4", + "symfony/dependency-injection": "<5.0", + "symfony/http-kernel": "<5.0", + "symfony/twig-bundle": "<5.0", + "symfony/yaml": "<4.4" + }, + "provide": { + "symfony/translation-implementation": "2.3" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^4.4|^5.0", + "symfony/console": "^4.4|^5.0", + "symfony/dependency-injection": "^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/http-kernel": "^5.0", + "symfony/intl": "^4.4|^5.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/service-contracts": "^1.1.2|^2", + "symfony/yaml": "^4.4|^5.0" + }, + "suggest": { + "psr/log-implementation": "To use logging capability in translator", + "symfony/config": "", + "symfony/yaml": "" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v5.3.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-04T16:37:19+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v2.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "d28150f0f44ce854e942b671fc2620a98aae1b1e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/d28150f0f44ce854e942b671fc2620a98aae1b1e", + "reference": "d28150f0f44ce854e942b671fc2620a98aae1b1e", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "suggest": { + "symfony/translation-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v2.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-08-17T14:20:01+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v5.3.11", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "a029b3a11b757f9cc8693040339153b4745a913f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/a029b3a11b757f9cc8693040339153b4745a913f", + "reference": "a029b3a11b757f9cc8693040339153b4745a913f", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "phpunit/phpunit": "<5.4.3", + "symfony/console": "<4.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0", + "twig/twig": "^2.13|^3.0.4" + }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v5.3.11" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-12T11:38:27+00:00" + }, + { + "name": "voku/portable-ascii", + "version": "1.5.6", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "80953678b19901e5165c56752d087fc11526017c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/80953678b19901e5165c56752d087fc11526017c", + "reference": "80953678b19901e5165c56752d087fc11526017c", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "http://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/1.5.6" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "time": "2020-11-12T00:07:28+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": { + "filament/filament": 20 + }, + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": "^8.0" + }, + "platform-dev": [], + "plugin-api-version": "2.0.0" +} diff --git a/packages/spatie-laravel-translatable-plugin/config/filament-spatie-laravel-translatable-plugin.php b/packages/spatie-laravel-translatable-plugin/config/filament-spatie-laravel-translatable-plugin.php new file mode 100644 index 0000000000..12f19dd547 --- /dev/null +++ b/packages/spatie-laravel-translatable-plugin/config/filament-spatie-laravel-translatable-plugin.php @@ -0,0 +1,18 @@ + [config('app.locale')], + +]; diff --git a/packages/spatie-laravel-translatable-plugin/docs/01-installation.md b/packages/spatie-laravel-translatable-plugin/docs/01-installation.md new file mode 100644 index 0000000000..fbf37b9a4e --- /dev/null +++ b/packages/spatie-laravel-translatable-plugin/docs/01-installation.md @@ -0,0 +1,39 @@ +--- +title: Installation +--- + +## Requirements + +Filament has a few requirements to run: + +- PHP 8.0+ +- Laravel v8.0+ +- Livewire v2.0+ + +This plugin is compatible with other Filament v2.x packages. + +## Installation + +Install the plugin with Composer: + +```bash +composer require filament/spatie-laravel-translatable-plugin +``` + +You're now ready to start [translating resources](getting-started)! + +## Publishing the configuration + +If you wish, you may publish the configuration of the package using: + +```bash +php artisan vendor:publish --tag=filament-spatie-laravel-translatable-plugin-config +``` + +## Upgrade Guide + +To upgrade the package to the latest version, you must run: + +```bash +composer update +``` diff --git a/packages/spatie-laravel-translatable-plugin/docs/02-getting-started.md b/packages/spatie-laravel-translatable-plugin/docs/02-getting-started.md new file mode 100644 index 0000000000..36b1b57433 --- /dev/null +++ b/packages/spatie-laravel-translatable-plugin/docs/02-getting-started.md @@ -0,0 +1,78 @@ +--- +title: Getting Started +--- + +This guide assumes that you've already set up your model to be translatable as per [Spatie's documentation](https://github.com/spatie/laravel-translatable#making-a-model-translatable). + +## Preparing your resource class + +First, you must apply the `Filament\Resources\Concerns\Translatable` trait to your resource class. This adds a `getTranslatableLocales()` method, which you may override to return an array of locales that the resource can be translated into: + +```php +use Filament\Resources\Concerns\Translatable; +use Filament\Resources\Resource; + +class BlogPostResource extends Resource +{ + use Translatable; + + // ... + + public static function getTranslatableLocales(): array + { + return ['en', 'es']; + } +} +``` + +You may [publish the package's configuration file](installation#publishing-the-configuration) to set the `default_locales` for all resources at once. + +## Making resource pages translatable + +After [preparing your resource class](#preparing-your-resource-class), you must make each of your resource's pages translatable too. You can find your resource's pages in the `Pages` directory of each resource folder: + +```php +use Filament\Resources\Pages\ListRecords; + +class ListBlogPosts extends ListRecords +{ + use ListRecords\Concerns\Translatable; + + // ... +} +``` + +```php +use Filament\Resources\Pages\CreateRecord; + +class CreateBlogPost extends CreateRecord +{ + use CreateRecord\Concerns\Translatable; + + // ... +} +``` + +```php +use Filament\Resources\Pages\EditRecord; + +class EditBlogPost extends EditRecord +{ + use EditRecord\Concerns\Translatable; + + // ... +} +``` + +And if you have a `ViewRecord` page for your resource: + +```php +use Filament\Resources\Pages\ViewRecord; + +class ViewBlogPost extends ViewRecord +{ + use ViewRecord\Concerns\Translatable; + + // ... +} +``` diff --git a/packages/spatie-laravel-translatable-plugin/resources/lang/actions.php b/packages/spatie-laravel-translatable-plugin/resources/lang/actions.php new file mode 100644 index 0000000000..9694267df8 --- /dev/null +++ b/packages/spatie-laravel-translatable-plugin/resources/lang/actions.php @@ -0,0 +1,9 @@ + [ + 'label' => 'Locale', + ], + +]; diff --git a/packages/spatie-laravel-translatable-plugin/src/Resources/Concerns/Translatable.php b/packages/spatie-laravel-translatable-plugin/src/Resources/Concerns/Translatable.php new file mode 100644 index 0000000000..2ebae0e344 --- /dev/null +++ b/packages/spatie-laravel-translatable-plugin/src/Resources/Concerns/Translatable.php @@ -0,0 +1,33 @@ +getTranslatableAttributes(); + + if (! count($attributes)) { + throw new Exception("Model [{$model}] must have [\$translatable] properties defined."); + } + + return $attributes; + } + + public static function getTranslatableLocales(): array + { + return config('filament-spatie-laravel-translatable-plugin.default_locales'); + } +} diff --git a/packages/spatie-laravel-translatable-plugin/src/Resources/Pages/Concerns/HasActiveFormLocaleSelect.php b/packages/spatie-laravel-translatable-plugin/src/Resources/Pages/Concerns/HasActiveFormLocaleSelect.php new file mode 100644 index 0000000000..1f2835e254 --- /dev/null +++ b/packages/spatie-laravel-translatable-plugin/src/Resources/Pages/Concerns/HasActiveFormLocaleSelect.php @@ -0,0 +1,23 @@ +label(__('filament-spatie-laravel-translatable-plugin::actions.active_form_locale.label')) + ->options( + collect(static::getResource()::getTranslatableLocales()) + ->mapWithKeys(function (string $locale): array { + return [$locale => $locale]; + }) + ->toArray(), + ); + } +} diff --git a/packages/spatie-laravel-translatable-plugin/src/Resources/Pages/CreateRecord/Concerns/Translatable.php b/packages/spatie-laravel-translatable-plugin/src/Resources/Pages/CreateRecord/Concerns/Translatable.php new file mode 100644 index 0000000000..2f522e9e3c --- /dev/null +++ b/packages/spatie-laravel-translatable-plugin/src/Resources/Pages/CreateRecord/Concerns/Translatable.php @@ -0,0 +1,67 @@ +setActiveFormLocale(); + + $this->fillForm(); + } + + protected function setActiveFormLocale(): void + { + $this->activeFormLocale = static::getResource()::getDefaultTranslatableLocale(); + } + + public function create(bool $another = false): void + { + $this->callHook('beforeValidate'); + + $data = $this->form->getState(); + + $this->callHook('afterValidate'); + + $this->callHook('beforeCreate'); + + $this->record = static::getModel()::usingLocale( + $this->activeFormLocale, + )->fill($data); + + $this->record->save(); + + $this->form->model($this->record)->saveRelationships(); + + $this->callHook('afterCreate'); + + if ($another) { + $this->fillForm(); + + $this->notify('success', __('filament::resources/pages/create-record.messages.created')); + + return; + } + + if ($redirectUrl = $this->getRedirectUrl()) { + $this->redirect($redirectUrl); + } + } + + protected function getActions(): array + { + return array_merge( + [$this->getActiveFormLocaleSelectAction()], + parent::getActions() ?? [], + ); + } +} diff --git a/packages/spatie-laravel-translatable-plugin/src/Resources/Pages/EditRecord/Concerns/Translatable.php b/packages/spatie-laravel-translatable-plugin/src/Resources/Pages/EditRecord/Concerns/Translatable.php new file mode 100644 index 0000000000..410ce0d602 --- /dev/null +++ b/packages/spatie-laravel-translatable-plugin/src/Resources/Pages/EditRecord/Concerns/Translatable.php @@ -0,0 +1,82 @@ +callHook('beforeFill'); + + if ($this->activeFormLocale === null) { + $this->setActiveFormLocale(); + } + + $data = $this->record->toArray(); + + foreach (static::getResource()::getTranslatableAttributes() as $attribute) { + $data[$attribute] = $this->record->getTranslation($attribute, $this->activeFormLocale); + } + + $this->form->fill($data); + + $this->callHook('afterFill'); + } + + protected function setActiveFormLocale(): void + { + $resource = static::getResource(); + + $availableLocales = array_keys($this->record->getTranslations($resource::getTranslatableAttributes()[0])); + $resourceLocales = $resource::getTranslatableLocales(); + $defaultLocale = $resource::getDefaultTranslatableLocale(); + + $this->activeFormLocale = in_array($defaultLocale, $availableLocales) ? $defaultLocale : array_intersect($availableLocales, $resourceLocales)[0]; + $this->record->setLocale($this->activeFormLocale); + } + + public function save(bool $shouldRedirect = true): void + { + $this->callHook('beforeValidate'); + + $data = $this->form->getState(); + + $this->callHook('afterValidate'); + + $this->callHook('beforeSave'); + + $this->record->setLocale($this->activeFormLocale)->fill($data)->save(); + + $this->callHook('afterSave'); + + if ($shouldRedirect && ($redirectUrl = $this->getRedirectUrl())) { + $this->redirect($redirectUrl); + } else { + $this->notify('success', __('filament::resources/pages/edit-record.messages.saved')); + } + } + + public function updatedActiveFormLocale(): void + { + $this->fillForm(); + } + + public function updatingActiveFormLocale(): void + { + $this->save(shouldRedirect: false); + } + + protected function getActions(): array + { + return array_merge( + [$this->getActiveFormLocaleSelectAction()], + parent::getActions(), + ); + } +} diff --git a/packages/spatie-laravel-translatable-plugin/src/Resources/Pages/ListRecords/Concerns/Translatable.php b/packages/spatie-laravel-translatable-plugin/src/Resources/Pages/ListRecords/Concerns/Translatable.php new file mode 100644 index 0000000000..e4aa413a74 --- /dev/null +++ b/packages/spatie-laravel-translatable-plugin/src/Resources/Pages/ListRecords/Concerns/Translatable.php @@ -0,0 +1,7 @@ +callHook('beforeFill'); + + if ($this->activeFormLocale === null) { + $this->setActiveFormLocale(); + } + + $data = $this->record->toArray(); + + foreach (static::getResource()::getTranslatableAttributes() as $attribute) { + $data[$attribute] = $this->record->getTranslation($attribute, $this->activeFormLocale); + } + + $this->form->fill($data); + + $this->callHook('afterFill'); + } + + protected function setActiveFormLocale(): void + { + $resource = static::getResource(); + + $availableLocales = array_keys($this->record->getTranslations($resource::getTranslatableAttributes()[0])); + $resourceLocales = $resource::getTranslatableLocales(); + $defaultLocale = $resource::getDefaultTranslatableLocale(); + + $this->activeFormLocale = in_array($defaultLocale, $availableLocales) ? $defaultLocale : array_intersect($availableLocales, $resourceLocales)[0]; + $this->record->setLocale($this->activeFormLocale); + } + + public function updatedActiveFormLocale(): void + { + $this->fillForm(); + } + + protected function getActions(): array + { + return array_merge( + [$this->getActiveFormLocaleSelectAction()], + parent::getActions(), + ); + } +} diff --git a/packages/spatie-laravel-translatable-plugin/src/SpatieLaravelTranslatablePluginServiceProvider.php b/packages/spatie-laravel-translatable-plugin/src/SpatieLaravelTranslatablePluginServiceProvider.php new file mode 100644 index 0000000000..19601dd7d0 --- /dev/null +++ b/packages/spatie-laravel-translatable-plugin/src/SpatieLaravelTranslatablePluginServiceProvider.php @@ -0,0 +1,63 @@ +mergeConfigFrom(__DIR__ . '/../config/filament-spatie-laravel-translatable-plugin.php', 'filament-spatie-laravel-translatable-plugin'); + } + + public function boot(): void + { + if ($this->app->runningInConsole()) { + $this->publishes([ + __DIR__ . '/../config/filament-spatie-laravel-translatable-plugin.php' => config_path('filament-spatie-laravel-translatable-plugin.php'), + ], 'filament-spatie-laravel-translatable-plugin-config'); + + $this->publishes([ + __DIR__ . '/../resources/lang' => resource_path('lang/vendor/filament-spatie-laravel-translatable-plugin-translations'), + ], 'filament-spatie-laravel-translatable-plugin-translations'); + } + + $this->loadTranslationsFrom(__DIR__ . '/../resources/lang', 'filament-spatie-laravel-translatable-plugin'); + } + + protected function mergeConfig(array $original, array $merging): array + { + $array = array_merge($original, $merging); + + foreach ($original as $key => $value) { + if (! is_array($value)) { + continue; + } + + if (! Arr::exists($merging, $key)) { + continue; + } + + if (is_numeric($key)) { + continue; + } + + if ($key === 'middleware' || $key === 'register') { + continue; + } + + $array[$key] = $this->mergeConfig($value, $merging[$key]); + } + + return $array; + } + + protected function mergeConfigFrom($path, $key): void + { + $config = $this->app['config']->get($key, []); + + $this->app['config']->set($key, $this->mergeConfig(require $path, $config)); + } +} diff --git a/packages/spatie-laravel-translatable-plugin/stubs/SettingsPage.stub b/packages/spatie-laravel-translatable-plugin/stubs/SettingsPage.stub new file mode 100644 index 0000000000..9825bb4af0 --- /dev/null +++ b/packages/spatie-laravel-translatable-plugin/stubs/SettingsPage.stub @@ -0,0 +1,20 @@ +=5.4", + "illuminate/view": ">=5.4", + "php": ">=5.6.4" + }, + "require-dev": { + "mockery/mockery": ">=1.0", + "phpunit/phpunit": ">=5.7" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Akaunting\\Money\\Provider" + ] + } + }, + "autoload": { + "psr-4": { + "Akaunting\\Money\\": "./src" + }, + "files": [ + "src/helpers.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Denis Duliçi", + "email": "info@akaunting.com", + "homepage": "https://akaunting.com", + "role": "Developer" + } + ], + "description": "Currency formatting and conversion package for Laravel", + "keywords": [ + "convert", + "currency", + "format", + "laravel", + "money" + ], + "support": { + "issues": "https://github.com/akaunting/laravel-money/issues", + "source": "https://github.com/akaunting/laravel-money/tree/1.2.3" + }, + "time": "2021-09-28T06:19:54+00:00" + }, + { + "name": "blade-ui-kit/blade-heroicons", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/blade-ui-kit/blade-heroicons.git", + "reference": "99d82616a72e36492edc9b95c6a2112d8632e9a7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/blade-ui-kit/blade-heroicons/zipball/99d82616a72e36492edc9b95c6a2112d8632e9a7", + "reference": "99d82616a72e36492edc9b95c6a2112d8632e9a7", + "shasum": "" + }, + "require": { + "blade-ui-kit/blade-icons": "^1.0", + "illuminate/support": "^8.0", + "php": "^7.4|^8.0" + }, + "require-dev": { + "orchestra/testbench": "^6.0", + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "BladeUI\\Heroicons\\BladeHeroiconsServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "BladeUI\\Heroicons\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dries Vints", + "homepage": "https://driesvints.com" + } + ], + "description": "A package to easily make use of Heroicons in your Laravel Blade views.", + "homepage": "https://github.com/blade-ui-kit/blade-heroicons", + "keywords": [ + "Heroicons", + "blade", + "laravel" + ], + "support": { + "issues": "https://github.com/blade-ui-kit/blade-heroicons/issues", + "source": "https://github.com/blade-ui-kit/blade-heroicons/tree/1.2.0" + }, + "funding": [ + { + "url": "https://github.com/caneco", + "type": "github" + }, + { + "url": "https://github.com/driesvints", + "type": "github" + } + ], + "time": "2021-05-05T14:59:46+00:00" + }, + { + "name": "blade-ui-kit/blade-icons", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/blade-ui-kit/blade-icons.git", + "reference": "548869bc820a25f803530c82028482aefe08115f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/blade-ui-kit/blade-icons/zipball/548869bc820a25f803530c82028482aefe08115f", + "reference": "548869bc820a25f803530c82028482aefe08115f", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^8.0", + "illuminate/filesystem": "^8.0", + "illuminate/support": "^8.0", + "illuminate/view": "^8.0", + "php": "^7.4|^8.0", + "symfony/console": "^5.3", + "symfony/finder": "^5.3" + }, + "require-dev": { + "mockery/mockery": "^1.3", + "orchestra/testbench": "^6.0", + "phpunit/phpunit": "^9.0" + }, + "bin": [ + "bin/blade-icons-generate" + ], + "type": "library", + "extra": { + "laravel": { + "providers": [ + "BladeUI\\Icons\\BladeIconsServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "BladeUI\\Icons\\": "src" + }, + "files": [ + "src/helpers.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dries Vints", + "homepage": "https://driesvints.com" + } + ], + "description": "A package to easily make use of icons in your Laravel Blade views.", + "homepage": "https://github.com/blade-ui-kit/blade-icons", + "keywords": [ + "blade", + "icons", + "laravel", + "svg" + ], + "support": { + "issues": "https://github.com/blade-ui-kit/blade-icons/issues", + "source": "https://github.com/blade-ui-kit/blade-icons" + }, + "funding": [ + { + "url": "https://github.com/caneco", + "type": "github" + }, + { + "url": "https://github.com/driesvints", + "type": "github" + } + ], + "time": "2021-08-11T10:09:06+00:00" + }, + { + "name": "danharrin/date-format-converter", + "version": "v0.2.0", + "source": { + "type": "git", + "url": "https://github.com/danharrin/date-format-converter.git", + "reference": "ee448ab0cbe2ea36edb886a01670fc760e388f19" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/danharrin/date-format-converter/zipball/ee448ab0cbe2ea36edb886a01670fc760e388f19", + "reference": "ee448ab0cbe2ea36edb886a01670fc760e388f19", + "shasum": "" + }, + "require": { + "php": "^7.2|^8.0" + }, + "type": "library", + "autoload": { + "files": [ + "src/helpers.php", + "src/standards.php" + ], + "psr-4": { + "DanHarrin\\DateFormatConverter\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dan Harrin", + "email": "dan@danharrin.com" + } + ], + "description": "Convert token-based date formats between standards.", + "homepage": "https://github.com/danharrin/date-format-converter", + "support": { + "issues": "https://github.com/danharrin/date-format-converter/issues", + "source": "https://github.com/danharrin/date-format-converter" + }, + "funding": [ + { + "url": "https://github.com/danharrin", + "type": "github" + } + ], + "time": "2021-02-10T23:58:47+00:00" + }, + { + "name": "doctrine/inflector", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/doctrine/inflector.git", + "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89", + "reference": "8b7ff3e4b7de6b2c84da85637b59fd2880ecaa89", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^8.2", + "phpstan/phpstan": "^0.12", + "phpstan/phpstan-phpunit": "^0.12", + "phpstan/phpstan-strict-rules": "^0.12", + "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0", + "vimeo/psalm": "^4.10" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Inflector\\": "lib/Doctrine/Inflector" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Benjamin Eberlei", + "email": "kontakt@beberlei.de" + }, + { + "name": "Jonathan Wage", + "email": "jonwage@gmail.com" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Inflector is a small library that can perform string manipulations with regard to upper/lowercase and singular/plural forms of words.", + "homepage": "https://www.doctrine-project.org/projects/inflector.html", + "keywords": [ + "inflection", + "inflector", + "lowercase", + "manipulation", + "php", + "plural", + "singular", + "strings", + "uppercase", + "words" + ], + "support": { + "issues": "https://github.com/doctrine/inflector/issues", + "source": "https://github.com/doctrine/inflector/tree/2.0.4" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finflector", + "type": "tidelift" + } + ], + "time": "2021-10-22T20:16:43+00:00" + }, + { + "name": "doctrine/lexer", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/lexer.git", + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/lexer/zipball/e864bbf5904cb8f5bb334f99209b48018522f042", + "reference": "e864bbf5904cb8f5bb334f99209b48018522f042", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^6.0", + "phpstan/phpstan": "^0.11.8", + "phpunit/phpunit": "^8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Doctrine\\Common\\Lexer\\": "lib/Doctrine/Common/Lexer" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Guilherme Blanco", + "email": "guilhermeblanco@gmail.com" + }, + { + "name": "Roman Borschel", + "email": "roman@code-factory.org" + }, + { + "name": "Johannes Schmitt", + "email": "schmittjoh@gmail.com" + } + ], + "description": "PHP Doctrine Lexer parser library that can be used in Top-Down, Recursive Descent Parsers.", + "homepage": "https://www.doctrine-project.org/projects/lexer.html", + "keywords": [ + "annotations", + "docblock", + "lexer", + "parser", + "php" + ], + "support": { + "issues": "https://github.com/doctrine/lexer/issues", + "source": "https://github.com/doctrine/lexer/tree/1.2.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Flexer", + "type": "tidelift" + } + ], + "time": "2020-05-25T17:44:05+00:00" + }, + { + "name": "egulias/email-validator", + "version": "2.1.25", + "source": { + "type": "git", + "url": "https://github.com/egulias/EmailValidator.git", + "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/egulias/EmailValidator/zipball/0dbf5d78455d4d6a41d186da50adc1122ec066f4", + "reference": "0dbf5d78455d4d6a41d186da50adc1122ec066f4", + "shasum": "" + }, + "require": { + "doctrine/lexer": "^1.0.1", + "php": ">=5.5", + "symfony/polyfill-intl-idn": "^1.10" + }, + "require-dev": { + "dominicsayers/isemail": "^3.0.7", + "phpunit/phpunit": "^4.8.36|^7.5.15", + "satooshi/php-coveralls": "^1.0.1" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "support": { + "issues": "https://github.com/egulias/EmailValidator/issues", + "source": "https://github.com/egulias/EmailValidator/tree/2.1.25" + }, + "funding": [ + { + "url": "https://github.com/egulias", + "type": "github" + } + ], + "time": "2020-12-29T14:50:06+00:00" + }, + { + "name": "filament/forms", + "version": "2.x-dev", + "source": { + "type": "git", + "url": "https://github.com/laravel-filament/forms.git", + "reference": "c40c91e895d5c58afa5728dafea0d60ba5ad87c0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel-filament/forms/zipball/c40c91e895d5c58afa5728dafea0d60ba5ad87c0", + "reference": "c40c91e895d5c58afa5728dafea0d60ba5ad87c0", + "shasum": "" + }, + "require": { + "blade-ui-kit/blade-heroicons": "^1.2", + "danharrin/date-format-converter": "^0.2", + "illuminate/console": "^8.6", + "illuminate/contracts": "^8.6", + "illuminate/database": "^8.6", + "illuminate/filesystem": "^8.6", + "illuminate/support": "^8.6", + "illuminate/validation": "^8.6", + "illuminate/view": "^8.6", + "laravel/ui": "^3.3", + "livewire/livewire": "^2.6", + "php": "^8.0", + "spatie/laravel-package-tools": "^1.9" + }, + "default-branch": true, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Filament\\Forms\\FormsServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Filament\\Forms\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Effortlessly build TALL-powered forms.", + "homepage": "https://github.com/laravel-filament/filament", + "support": { + "issues": "https://github.com/laravel-filament/filament/issues", + "source": "https://github.com/laravel-filament/filament" + }, + "time": "2021-11-05T10:08:24+00:00" + }, + { + "name": "illuminate/bus", + "version": "v8.69.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/bus.git", + "reference": "be400399687b97d5558a224e970060fd5d5f2735" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/bus/zipball/be400399687b97d5558a224e970060fd5d5f2735", + "reference": "be400399687b97d5558a224e970060fd5d5f2735", + "shasum": "" + }, + "require": { + "illuminate/collections": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/pipeline": "^8.0", + "illuminate/support": "^8.0", + "php": "^7.3|^8.0" + }, + "suggest": { + "illuminate/queue": "Required to use closures when chaining jobs (^7.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Bus\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Bus package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-10-21T19:19:36+00:00" + }, + { + "name": "illuminate/collections", + "version": "v8.69.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/collections.git", + "reference": "05f286ec5fd2dd286e8384577047efc375c8954c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/collections/zipball/05f286ec5fd2dd286e8384577047efc375c8954c", + "reference": "05f286ec5fd2dd286e8384577047efc375c8954c", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^8.0", + "illuminate/macroable": "^8.0", + "php": "^7.3|^8.0" + }, + "suggest": { + "symfony/var-dumper": "Required to use the dump method (^5.1.4)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + }, + "files": [ + "helpers.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Collections package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-10-22T18:01:46+00:00" + }, + { + "name": "illuminate/console", + "version": "v8.69.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/console.git", + "reference": "9c66af18f7a491d45dc7527837f22a175776870a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/console/zipball/9c66af18f7a491d45dc7527837f22a175776870a", + "reference": "9c66af18f7a491d45dc7527837f22a175776870a", + "shasum": "" + }, + "require": { + "illuminate/collections": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/macroable": "^8.0", + "illuminate/support": "^8.0", + "php": "^7.3|^8.0", + "symfony/console": "^5.1.4", + "symfony/process": "^5.1.4" + }, + "suggest": { + "dragonmantank/cron-expression": "Required to use scheduler (^3.0.2).", + "guzzlehttp/guzzle": "Required to use the ping methods on schedules (^6.5.5|^7.0.1).", + "illuminate/bus": "Required to use the scheduled job dispatcher (^8.0).", + "illuminate/container": "Required to use the scheduler (^8.0).", + "illuminate/filesystem": "Required to use the generator command (^8.0).", + "illuminate/queue": "Required to use closures for scheduled jobs (^8.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Console\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Console package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-10-21T19:19:36+00:00" + }, + { + "name": "illuminate/container", + "version": "v8.69.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/container.git", + "reference": "ef73feb5216ef97ab7023cf59c0c8dbbd5505a9d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/container/zipball/ef73feb5216ef97ab7023cf59c0c8dbbd5505a9d", + "reference": "ef73feb5216ef97ab7023cf59c0c8dbbd5505a9d", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^8.0", + "php": "^7.3|^8.0", + "psr/container": "^1.0" + }, + "provide": { + "psr/container-implementation": "1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Container\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Container package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-09-15T14:32:50+00:00" + }, + { + "name": "illuminate/contracts", + "version": "v8.69.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/contracts.git", + "reference": "e76f4bce73a2a1656add24bd5210ebc4b8af49c0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/contracts/zipball/e76f4bce73a2a1656add24bd5210ebc4b8af49c0", + "reference": "e76f4bce73a2a1656add24bd5210ebc4b8af49c0", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0", + "psr/container": "^1.0", + "psr/simple-cache": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Contracts\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Contracts package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-10-22T18:01:46+00:00" + }, + { + "name": "illuminate/database", + "version": "v8.69.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/database.git", + "reference": "43c7ffb6299ae55b000b286cf1278afd268ef29f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/database/zipball/43c7ffb6299ae55b000b286cf1278afd268ef29f", + "reference": "43c7ffb6299ae55b000b286cf1278afd268ef29f", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/collections": "^8.0", + "illuminate/container": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/macroable": "^8.0", + "illuminate/support": "^8.0", + "php": "^7.3|^8.0", + "symfony/console": "^5.1.4" + }, + "suggest": { + "doctrine/dbal": "Required to rename columns and drop SQLite columns (^2.13.3|^3.1.2).", + "fakerphp/faker": "Required to use the eloquent factory builder (^1.9.1).", + "illuminate/console": "Required to use the database commands (^8.0).", + "illuminate/events": "Required to use the observers with Eloquent (^8.0).", + "illuminate/filesystem": "Required to use the migrations (^8.0).", + "illuminate/pagination": "Required to paginate the result set (^8.0).", + "symfony/finder": "Required to use Eloquent model factories (^5.1.4)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Database\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Database package.", + "homepage": "https://laravel.com", + "keywords": [ + "database", + "laravel", + "orm", + "sql" + ], + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-10-29T19:46:53+00:00" + }, + { + "name": "illuminate/events", + "version": "v8.69.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/events.git", + "reference": "b7f06cafb6c09581617f2ca05d69e9b159e5a35d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/events/zipball/b7f06cafb6c09581617f2ca05d69e9b159e5a35d", + "reference": "b7f06cafb6c09581617f2ca05d69e9b159e5a35d", + "shasum": "" + }, + "require": { + "illuminate/bus": "^8.0", + "illuminate/collections": "^8.0", + "illuminate/container": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/macroable": "^8.0", + "illuminate/support": "^8.0", + "php": "^7.3|^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Events\\": "" + }, + "files": [ + "functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Events package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-09-15T14:32:50+00:00" + }, + { + "name": "illuminate/filesystem", + "version": "v8.69.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/filesystem.git", + "reference": "a7bc30dac4e27dbeb37b026f3dbaee13bd578861" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/filesystem/zipball/a7bc30dac4e27dbeb37b026f3dbaee13bd578861", + "reference": "a7bc30dac4e27dbeb37b026f3dbaee13bd578861", + "shasum": "" + }, + "require": { + "illuminate/collections": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/macroable": "^8.0", + "illuminate/support": "^8.0", + "php": "^7.3|^8.0", + "symfony/finder": "^5.1.4" + }, + "suggest": { + "ext-ftp": "Required to use the Flysystem FTP driver.", + "illuminate/http": "Required for handling uploaded files (^7.0).", + "league/flysystem": "Required to use the Flysystem local and FTP drivers (^1.1).", + "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (^1.0).", + "league/flysystem-cached-adapter": "Required to use the Flysystem cache (^1.0).", + "league/flysystem-sftp": "Required to use the Flysystem SFTP driver (^1.0).", + "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^5.1.4).", + "symfony/mime": "Required to enable support for guessing extensions (^5.1.4)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Filesystem\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Filesystem package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-10-22T13:20:42+00:00" + }, + { + "name": "illuminate/macroable", + "version": "v8.69.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/macroable.git", + "reference": "300aa13c086f25116b5f3cde3ca54ff5c822fb05" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/macroable/zipball/300aa13c086f25116b5f3cde3ca54ff5c822fb05", + "reference": "300aa13c086f25116b5f3cde3ca54ff5c822fb05", + "shasum": "" + }, + "require": { + "php": "^7.3|^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Macroable package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2020-10-27T15:20:30+00:00" + }, + { + "name": "illuminate/pipeline", + "version": "v8.69.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/pipeline.git", + "reference": "23aeff5b26ae4aee3f370835c76bd0f4e93f71d2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/pipeline/zipball/23aeff5b26ae4aee3f370835c76bd0f4e93f71d2", + "reference": "23aeff5b26ae4aee3f370835c76bd0f4e93f71d2", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^8.0", + "illuminate/support": "^8.0", + "php": "^7.3|^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Pipeline\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Pipeline package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-03-26T18:39:16+00:00" + }, + { + "name": "illuminate/support", + "version": "v8.69.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/support.git", + "reference": "a8851b7001530d3c11626a81449ed9b63dd10db7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/support/zipball/a8851b7001530d3c11626a81449ed9b63dd10db7", + "reference": "a8851b7001530d3c11626a81449ed9b63dd10db7", + "shasum": "" + }, + "require": { + "doctrine/inflector": "^1.4|^2.0", + "ext-json": "*", + "ext-mbstring": "*", + "illuminate/collections": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/macroable": "^8.0", + "nesbot/carbon": "^2.53.1", + "php": "^7.3|^8.0", + "voku/portable-ascii": "^1.4.8" + }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, + "suggest": { + "illuminate/filesystem": "Required to use the composer class (^8.0).", + "league/commonmark": "Required to use Str::markdown() and Stringable::markdown() (^1.3|^2.0.2).", + "ramsey/uuid": "Required to use Str::uuid() (^4.2.2).", + "symfony/process": "Required to use the composer class (^5.1.4).", + "symfony/var-dumper": "Required to use the dd function (^5.1.4).", + "vlucas/phpdotenv": "Required to use the Env class and env helper (^5.2)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Support\\": "" + }, + "files": [ + "helpers.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Support package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-10-29T13:34:03+00:00" + }, + { + "name": "illuminate/translation", + "version": "v8.69.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/translation.git", + "reference": "c10a68f37f590dc8c1c1fe5b6ad3f09381282137" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/translation/zipball/c10a68f37f590dc8c1c1fe5b6ad3f09381282137", + "reference": "c10a68f37f590dc8c1c1fe5b6ad3f09381282137", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/collections": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/filesystem": "^8.0", + "illuminate/macroable": "^8.0", + "illuminate/support": "^8.0", + "php": "^7.3|^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Translation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Translation package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-10-30T16:01:33+00:00" + }, + { + "name": "illuminate/validation", + "version": "v8.69.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/validation.git", + "reference": "f2426f5578af420a3cffbf07969bc96b2399f56b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/validation/zipball/f2426f5578af420a3cffbf07969bc96b2399f56b", + "reference": "f2426f5578af420a3cffbf07969bc96b2399f56b", + "shasum": "" + }, + "require": { + "egulias/email-validator": "^2.1.10", + "ext-json": "*", + "illuminate/collections": "^8.0", + "illuminate/container": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/macroable": "^8.0", + "illuminate/support": "^8.0", + "illuminate/translation": "^8.0", + "php": "^7.3|^8.0", + "symfony/http-foundation": "^5.1.4", + "symfony/mime": "^5.1.4" + }, + "suggest": { + "ext-bcmath": "Required to use the multiple_of validation rule.", + "illuminate/database": "Required to use the database presence verifier (^8.0)." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\Validation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate Validation package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-11-01T17:23:09+00:00" + }, + { + "name": "illuminate/view", + "version": "v8.69.0", + "source": { + "type": "git", + "url": "https://github.com/illuminate/view.git", + "reference": "75b13b241cd5841039dd3a0fe63309f9e4b4c24c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/illuminate/view/zipball/75b13b241cd5841039dd3a0fe63309f9e4b4c24c", + "reference": "75b13b241cd5841039dd3a0fe63309f9e4b4c24c", + "shasum": "" + }, + "require": { + "ext-json": "*", + "illuminate/collections": "^8.0", + "illuminate/container": "^8.0", + "illuminate/contracts": "^8.0", + "illuminate/events": "^8.0", + "illuminate/filesystem": "^8.0", + "illuminate/macroable": "^8.0", + "illuminate/support": "^8.0", + "php": "^7.3|^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "8.x-dev" + } + }, + "autoload": { + "psr-4": { + "Illuminate\\View\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "The Illuminate View package.", + "homepage": "https://laravel.com", + "support": { + "issues": "https://github.com/laravel/framework/issues", + "source": "https://github.com/laravel/framework" + }, + "time": "2021-10-26T18:50:42+00:00" + }, + { + "name": "laravel/ui", + "version": "v3.3.2", + "source": { + "type": "git", + "url": "https://github.com/laravel/ui.git", + "reference": "28f3d190fe270b6dcd6fdab4a77a392e693ceca5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/ui/zipball/28f3d190fe270b6dcd6fdab4a77a392e693ceca5", + "reference": "28f3d190fe270b6dcd6fdab4a77a392e693ceca5", + "shasum": "" + }, + "require": { + "illuminate/console": "^8.42", + "illuminate/filesystem": "^8.42", + "illuminate/support": "^8.42", + "illuminate/validation": "^8.42", + "php": "^7.3|^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + }, + "laravel": { + "providers": [ + "Laravel\\Ui\\UiServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Laravel\\Ui\\": "src/", + "Illuminate\\Foundation\\Auth\\": "auth-backend/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Taylor Otwell", + "email": "taylor@laravel.com" + } + ], + "description": "Laravel UI utilities and presets.", + "keywords": [ + "laravel", + "ui" + ], + "support": { + "source": "https://github.com/laravel/ui/tree/v3.3.2" + }, + "time": "2021-11-05T08:25:44+00:00" + }, + { + "name": "livewire/livewire", + "version": "v2.7.2", + "source": { + "type": "git", + "url": "https://github.com/livewire/livewire.git", + "reference": "991e5bd8a48e450d23cd55336964f916e92a6464" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/livewire/livewire/zipball/991e5bd8a48e450d23cd55336964f916e92a6464", + "reference": "991e5bd8a48e450d23cd55336964f916e92a6464", + "shasum": "" + }, + "require": { + "illuminate/database": "^7.0|^8.0", + "illuminate/support": "^7.0|^8.0", + "illuminate/validation": "^7.0|^8.0", + "php": "^7.2.5|^8.0", + "symfony/http-kernel": "^5.0" + }, + "require-dev": { + "calebporzio/sushi": "^2.1", + "laravel/framework": "^7.0|^8.0", + "mockery/mockery": "^1.3.1", + "orchestra/testbench": "^5.0|^6.0", + "orchestra/testbench-dusk": "^5.2|^6.0", + "phpunit/phpunit": "^8.4|^9.0", + "psy/psysh": "@stable" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Livewire\\LivewireServiceProvider" + ], + "aliases": { + "Livewire": "Livewire\\Livewire" + } + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Livewire\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Caleb Porzio", + "email": "calebporzio@gmail.com" + } + ], + "description": "A front-end framework for Laravel.", + "support": { + "issues": "https://github.com/livewire/livewire/issues", + "source": "https://github.com/livewire/livewire/tree/v2.7.2" + }, + "funding": [ + { + "url": "https://github.com/calebporzio", + "type": "github" + } + ], + "time": "2021-10-20T02:27:35+00:00" + }, + { + "name": "nesbot/carbon", + "version": "2.54.0", + "source": { + "type": "git", + "url": "https://github.com/briannesbitt/Carbon.git", + "reference": "eed83939f1aed3eee517d03a33f5ec587ac529b5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/eed83939f1aed3eee517d03a33f5ec587ac529b5", + "reference": "eed83939f1aed3eee517d03a33f5ec587ac529b5", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": "^7.1.8 || ^8.0", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation": "^3.4 || ^4.0 || ^5.0" + }, + "require-dev": { + "doctrine/dbal": "^2.0 || ^3.0", + "doctrine/orm": "^2.7", + "friendsofphp/php-cs-fixer": "^3.0", + "kylekatarnls/multi-tester": "^2.0", + "phpmd/phpmd": "^2.9", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^0.12.54", + "phpunit/phpunit": "^7.5.20 || ^8.5.14", + "squizlabs/php_codesniffer": "^3.4" + }, + "bin": [ + "bin/carbon" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-3.x": "3.x-dev", + "dev-master": "2.x-dev" + }, + "laravel": { + "providers": [ + "Carbon\\Laravel\\ServiceProvider" + ] + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Carbon\\": "src/Carbon/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Brian Nesbitt", + "email": "brian@nesbot.com", + "homepage": "https://markido.com" + }, + { + "name": "kylekatarnls", + "homepage": "https://github.com/kylekatarnls" + } + ], + "description": "An API extension for DateTime that supports 281 different languages.", + "homepage": "https://carbon.nesbot.com", + "keywords": [ + "date", + "datetime", + "time" + ], + "support": { + "issues": "https://github.com/briannesbitt/Carbon/issues", + "source": "https://github.com/briannesbitt/Carbon" + }, + "funding": [ + { + "url": "https://opencollective.com/Carbon", + "type": "open_collective" + }, + { + "url": "https://tidelift.com/funding/github/packagist/nesbot/carbon", + "type": "tidelift" + } + ], + "time": "2021-11-01T21:22:20+00:00" + }, + { + "name": "psr/container", + "version": "1.1.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.1" + }, + "time": "2021-03-05T17:36:06+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/log", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/ef29f6d262798707a9edd554e2b82517ef3a9376", + "reference": "ef29f6d262798707a9edd554e2b82517ef3a9376", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/2.0.0" + }, + "time": "2021-07-14T16:41:46+00:00" + }, + { + "name": "psr/simple-cache", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "support": { + "source": "https://github.com/php-fig/simple-cache/tree/master" + }, + "time": "2017-10-23T01:57:42+00:00" + }, + { + "name": "spatie/laravel-package-tools", + "version": "1.9.2", + "source": { + "type": "git", + "url": "https://github.com/spatie/laravel-package-tools.git", + "reference": "f710fe196c126fb9e0aee67eb5af49ad8f13f528" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/f710fe196c126fb9e0aee67eb5af49ad8f13f528", + "reference": "f710fe196c126fb9e0aee67eb5af49ad8f13f528", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^7.0|^8.0", + "php": "^7.4|^8.0" + }, + "require-dev": { + "mockery/mockery": "^1.4", + "orchestra/testbench": "^5.0|^6.0", + "phpunit/phpunit": "^9.3", + "spatie/test-time": "^1.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Spatie\\LaravelPackageTools\\": "src", + "Spatie\\LaravelPackageTools\\Database\\Factories\\": "database/factories" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Freek Van der Herten", + "email": "freek@spatie.be", + "role": "Developer" + } + ], + "description": "Tools for creating Laravel packages", + "homepage": "https://github.com/spatie/laravel-package-tools", + "keywords": [ + "laravel-package-tools", + "spatie" + ], + "support": { + "issues": "https://github.com/spatie/laravel-package-tools/issues", + "source": "https://github.com/spatie/laravel-package-tools/tree/1.9.2" + }, + "funding": [ + { + "url": "https://github.com/spatie", + "type": "github" + } + ], + "time": "2021-09-21T13:06:51+00:00" + }, + { + "name": "symfony/console", + "version": "v5.3.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "d4e409d9fbcfbf71af0e5a940abb7b0b4bad0bd3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/d4e409d9fbcfbf71af0e5a940abb7b0b4bad0bd3", + "reference": "d4e409d9fbcfbf71af0e5a940abb7b0b4bad0bd3", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.8", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2", + "symfony/string": "^5.1" + }, + "conflict": { + "psr/log": ">=3", + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", + "symfony/lock": "<4.4", + "symfony/process": "<4.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/log": "^1|^2", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/event-dispatcher": "^4.4|^5.0", + "symfony/lock": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0", + "symfony/var-dumper": "^4.4|^5.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v5.3.10" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-26T09:30:15+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-03-23T23:28:01+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v5.3.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "3bc60d0fba00ae8d1eaa9eb5ab11a2bbdd1fc321" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/3bc60d0fba00ae8d1eaa9eb5ab11a2bbdd1fc321", + "reference": "3bc60d0fba00ae8d1eaa9eb5ab11a2bbdd1fc321", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^4.4|^5.0" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.1", + "symfony/http-kernel": "^4.4|^5.0", + "symfony/serializer": "^4.4|^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v5.3.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-08-28T15:07:08+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v5.3.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "ce7b20d69c66a20939d8952b617506a44d102130" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/ce7b20d69c66a20939d8952b617506a44d102130", + "reference": "ce7b20d69c66a20939d8952b617506a44d102130", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/event-dispatcher-contracts": "^2", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/dependency-injection": "<4.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^4.4|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/error-handler": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/http-foundation": "^4.4|^5.0", + "symfony/service-contracts": "^1.1|^2", + "symfony/stopwatch": "^4.4|^5.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v5.3.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-08-04T21:20:46+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "69fee1ad2332a7cbab3aca13591953da9cdb7a11" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/69fee1ad2332a7cbab3aca13591953da9cdb7a11", + "reference": "69fee1ad2332a7cbab3aca13591953da9cdb7a11", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/event-dispatcher": "^1" + }, + "suggest": { + "symfony/event-dispatcher-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-03-23T23:28:01+00:00" + }, + { + "name": "symfony/finder", + "version": "v5.3.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/a10000ada1e600d109a6c7632e9ac42e8bf2fb93", + "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v5.3.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-08-04T21:20:46+00:00" + }, + { + "name": "symfony/http-client-contracts", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client-contracts.git", + "reference": "7e82f6084d7cae521a75ef2cb5c9457bbda785f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/7e82f6084d7cae521a75ef2cb5c9457bbda785f4", + "reference": "7e82f6084d7cae521a75ef2cb5c9457bbda785f4", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "suggest": { + "symfony/http-client-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\HttpClient\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to HTTP clients", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/http-client-contracts/tree/v2.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-04-11T23:07:08+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v5.3.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "9f34f02e8a5fdc7a56bafe011cea1ce97300e54c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/9f34f02e8a5fdc7a56bafe011cea1ce97300e54c", + "reference": "9f34f02e8a5fdc7a56bafe011cea1ce97300e54c", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "predis/predis": "~1.0", + "symfony/cache": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/mime": "^4.4|^5.0" + }, + "suggest": { + "symfony/mime": "To use the file extension guesser" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v5.3.10" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-11T15:41:55+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v5.3.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "703e4079920468e9522b72cf47fd76ce8d795e86" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/703e4079920468e9522b72cf47fd76ce8d795e86", + "reference": "703e4079920468e9522b72cf47fd76ce8d795e86", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/log": "^1|^2", + "symfony/deprecation-contracts": "^2.1", + "symfony/error-handler": "^4.4|^5.0", + "symfony/event-dispatcher": "^5.0", + "symfony/http-client-contracts": "^1.1|^2", + "symfony/http-foundation": "^5.3.7", + "symfony/polyfill-ctype": "^1.8", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/browser-kit": "<4.4", + "symfony/cache": "<5.0", + "symfony/config": "<5.0", + "symfony/console": "<4.4", + "symfony/dependency-injection": "<5.3", + "symfony/doctrine-bridge": "<5.0", + "symfony/form": "<5.0", + "symfony/http-client": "<5.0", + "symfony/mailer": "<5.0", + "symfony/messenger": "<5.0", + "symfony/translation": "<5.0", + "symfony/twig-bridge": "<5.0", + "symfony/validator": "<5.0", + "twig/twig": "<2.13" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^4.4|^5.0", + "symfony/config": "^5.0", + "symfony/console": "^4.4|^5.0", + "symfony/css-selector": "^4.4|^5.0", + "symfony/dependency-injection": "^5.3", + "symfony/dom-crawler": "^4.4|^5.0", + "symfony/expression-language": "^4.4|^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0", + "symfony/routing": "^4.4|^5.0", + "symfony/stopwatch": "^4.4|^5.0", + "symfony/translation": "^4.4|^5.0", + "symfony/translation-contracts": "^1.1|^2", + "twig/twig": "^2.13|^3.0.4" + }, + "suggest": { + "symfony/browser-kit": "", + "symfony/config": "", + "symfony/console": "", + "symfony/dependency-injection": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a structured process for converting a Request into a Response", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v5.3.10" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-29T08:36:48+00:00" + }, + { + "name": "symfony/mime", + "version": "v5.3.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/mime.git", + "reference": "a756033d0a7e53db389618653ae991eba5a19a11" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/mime/zipball/a756033d0a7e53db389618653ae991eba5a19a11", + "reference": "a756033d0a7e53db389618653ae991eba5a19a11", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-intl-idn": "^1.10", + "symfony/polyfill-mbstring": "^1.0", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "egulias/email-validator": "~3.0.0", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/mailer": "<4.4" + }, + "require-dev": { + "egulias/email-validator": "^2.1.10|^3.1", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "symfony/dependency-injection": "^4.4|^5.0", + "symfony/property-access": "^4.4|^5.1", + "symfony/property-info": "^4.4|^5.1", + "symfony/serializer": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Mime\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows manipulating MIME messages", + "homepage": "https://symfony.com", + "keywords": [ + "mime", + "mime-type" + ], + "support": { + "source": "https://github.com/symfony/mime/tree/v5.3.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-09-10T12:30:38+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "reference": "46cd95797e9df938fdd2b03693b5fca5e64b01ce", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-19T12:13:01+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.23.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "16880ba9c5ebe3642d1995ab866db29270b36535" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/16880ba9c5ebe3642d1995ab866db29270b36535", + "reference": "16880ba9c5ebe3642d1995ab866db29270b36535", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T12:26:48+00:00" + }, + { + "name": "symfony/polyfill-intl-idn", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-idn.git", + "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/65bd267525e82759e7d8c4e8ceea44f398838e65", + "reference": "65bd267525e82759e7d8c4e8ceea44f398838e65", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "symfony/polyfill-intl-normalizer": "^1.10", + "symfony/polyfill-php72": "^1.10" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Idn\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Laurent Bassin", + "email": "laurent@bassin.info" + }, + { + "name": "Trevor Rowbotham", + "email": "trevor.rowbotham@pm.me" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's idn_to_ascii and idn_to_utf8 functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "idn", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T09:27:20+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-19T12:13:01+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.23.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9174a3d80210dca8daa7f31fec659150bbeabfc6", + "reference": "9174a3d80210dca8daa7f31fec659150bbeabfc6", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T12:26:48+00:00" + }, + { + "name": "symfony/polyfill-php72", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "9a142215a36a3888e30d0a9eeea9766764e96976" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/9a142215a36a3888e30d0a9eeea9766764e96976", + "reference": "9a142215a36a3888e30d0a9eeea9766764e96976", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php72\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php72/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-05-27T09:17:38+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "v1.23.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fba8933c384d6476ab14fb7b8526e5287ca7e010", + "reference": "fba8933c384d6476ab14fb7b8526e5287ca7e010", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-19T12:13:01+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.23.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/1100343ed1a92e3a38f9ae122fc0eb21602547be", + "reference": "1100343ed1a92e3a38f9ae122fc0eb21602547be", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-07-28T13:41:28+00:00" + }, + { + "name": "symfony/process", + "version": "v5.3.7", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "38f26c7d6ed535217ea393e05634cb0b244a1967" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/38f26c7d6ed535217ea393e05634cb0b244a1967", + "reference": "38f26c7d6ed535217ea393e05634cb0b244a1967", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v5.3.7" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-08-04T21:20:46+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", + "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v2.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-04-01T10:43:52+00:00" + }, + { + "name": "symfony/string", + "version": "v5.3.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c", + "reference": "d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" + }, + "require-dev": { + "symfony/error-handler": "^4.4|^5.0", + "symfony/http-client": "^4.4|^5.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "files": [ + "Resources/functions.php" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v5.3.10" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-27T18:21:46+00:00" + }, + { + "name": "symfony/translation", + "version": "v5.3.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation.git", + "reference": "6ef197aea2ac8b9cd63e0da7522b3771714035aa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation/zipball/6ef197aea2ac8b9cd63e0da7522b3771714035aa", + "reference": "6ef197aea2ac8b9cd63e0da7522b3771714035aa", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16", + "symfony/translation-contracts": "^2.3" + }, + "conflict": { + "symfony/config": "<4.4", + "symfony/dependency-injection": "<5.0", + "symfony/http-kernel": "<5.0", + "symfony/twig-bundle": "<5.0", + "symfony/yaml": "<4.4" + }, + "provide": { + "symfony/translation-implementation": "2.3" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^4.4|^5.0", + "symfony/console": "^4.4|^5.0", + "symfony/dependency-injection": "^5.0", + "symfony/finder": "^4.4|^5.0", + "symfony/http-kernel": "^5.0", + "symfony/intl": "^4.4|^5.0", + "symfony/polyfill-intl-icu": "^1.21", + "symfony/service-contracts": "^1.1.2|^2", + "symfony/yaml": "^4.4|^5.0" + }, + "suggest": { + "psr/log-implementation": "To use logging capability in translator", + "symfony/config": "", + "symfony/yaml": "" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\Translation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to internationalize your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/translation/tree/v5.3.10" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-10T06:43:24+00:00" + }, + { + "name": "symfony/translation-contracts", + "version": "v2.4.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/translation-contracts.git", + "reference": "95c812666f3e91db75385749fe219c5e494c7f95" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/95c812666f3e91db75385749fe219c5e494c7f95", + "reference": "95c812666f3e91db75385749fe219c5e494c7f95", + "shasum": "" + }, + "require": { + "php": ">=7.2.5" + }, + "suggest": { + "symfony/translation-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.4-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Translation\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to translation", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/translation-contracts/tree/v2.4.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-03-23T23:28:01+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v5.3.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "875432adb5f5570fff21036fd22aee244636b7d1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/875432adb5f5570fff21036fd22aee244636b7d1", + "reference": "875432adb5f5570fff21036fd22aee244636b7d1", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "phpunit/phpunit": "<5.4.3", + "symfony/console": "<4.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^4.4|^5.0", + "symfony/process": "^4.4|^5.0", + "twig/twig": "^2.13|^3.0.4" + }, + "suggest": { + "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", + "ext-intl": "To show region name in time zone dump", + "symfony/console": "To use the ServerDumpCommand and/or the bin/var-dump-server script" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v5.3.10" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-26T09:30:15+00:00" + }, + { + "name": "voku/portable-ascii", + "version": "1.5.6", + "source": { + "type": "git", + "url": "https://github.com/voku/portable-ascii.git", + "reference": "80953678b19901e5165c56752d087fc11526017c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/voku/portable-ascii/zipball/80953678b19901e5165c56752d087fc11526017c", + "reference": "80953678b19901e5165c56752d087fc11526017c", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~6.0 || ~7.0 || ~9.0" + }, + "suggest": { + "ext-intl": "Use Intl for transliterator_transliterate() support" + }, + "type": "library", + "autoload": { + "psr-4": { + "voku\\": "src/voku/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Lars Moelleken", + "homepage": "http://www.moelleken.org/" + } + ], + "description": "Portable ASCII library - performance optimized (ascii) string functions for php.", + "homepage": "https://github.com/voku/portable-ascii", + "keywords": [ + "ascii", + "clean", + "php" + ], + "support": { + "issues": "https://github.com/voku/portable-ascii/issues", + "source": "https://github.com/voku/portable-ascii/tree/1.5.6" + }, + "funding": [ + { + "url": "https://www.paypal.me/moelleken", + "type": "custom" + }, + { + "url": "https://github.com/voku", + "type": "github" + }, + { + "url": "https://opencollective.com/portable-ascii", + "type": "open_collective" + }, + { + "url": "https://www.patreon.com/voku", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/voku/portable-ascii", + "type": "tidelift" + } + ], + "time": "2020-11-12T00:07:28+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": { + "filament/forms": 20 + }, + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": "^8.0" + }, + "platform-dev": [], + "plugin-api-version": "2.0.0" +} diff --git a/packages/tables/config/tables.php b/packages/tables/config/tables.php new file mode 100644 index 0000000000..ad1778cc7c --- /dev/null +++ b/packages/tables/config/tables.php @@ -0,0 +1,7 @@ + env('TABLES_FILESYSTEM_DRIVER', 'public'), + +]; diff --git a/packages/tables/docs/01-installation.md b/packages/tables/docs/01-installation.md new file mode 100644 index 0000000000..dcd4ea7100 --- /dev/null +++ b/packages/tables/docs/01-installation.md @@ -0,0 +1,173 @@ +--- +title: Installation +--- + +## Requirements + +Filament has a few requirements to run: + +- PHP 8.0+ +- Laravel v8.0+ +- Livewire v2.0+ + +The table builder comes pre-installed inside the [admin panel 2.x](/docs/admin/2.x), but you must still follow the installation instructions below if you're using it in the rest of your app. + +## New Laravel projects + +To get started with the table builder quickly, you can set up [Alpine.js](https://alpinejs.dev), [TailwindCSS](https://tailwindcss.com) and [Livewire](https://laravel-livewire.com) with these commands: + +```bash +composer require filament/tables +php artisan tables:install +npm install +npm run dev +``` + +> These commands will ruthlessly overwrite existing files in your application, hence why we only recommend using this method for new projects. + +You're now ready to start [building tables](getting-started)! + +## Existing Laravel projects + +You may download the table builder using Composer: + +```bash +composer require filament/tables +``` + +The package uses [Alpine.js](https://alpinejs.dev), [Tailwind CSS](https://tailwindcss.com), the Tailwind Forms plugin, and the Tailwind Typography plugin. You may install these through NPM: + +```bash +npm install alpinejs @alpinejs/trap tailwindcss @tailwindcss/forms @tailwindcss/typography --save-dev +``` + +To finish installing Tailwind, you must create a new `tailwind.config.js` file in the root of your project. The easiest way to do this is by running `npm tailwindcss init`. + +In `tailwind.config.js`, enable JIT mode, register the plugins you installed, and add custom colors used by the table builder: + +```js +const colors = require('tailwindcss/colors') + +module.exports = { + mode: 'jit', + purge: [ + './resources/**/*.blade.php', // [tl! focus:start] + './vendor/filament/forms/resources/views/**/*.blade.php', // [tl! focus:end] + './vendor/filament/tables/resources/views/**/*.blade.php', // [tl! focus:end] + ], + theme: { + extend: { + colors: { // [tl! focus:start] + danger: colors.rose, + primary: colors.blue, + success: colors.green, + warning: colors.yellow, + }, // [tl! focus:end] + }, + }, + plugins: [ + require('@tailwindcss/forms'), // [tl! focus:start] + require('@tailwindcss/typography'), // [tl! focus:end] + ], +} +``` + +Of course, you may specify your own custom `primary` and `danger` colors, which will be used instead. + +In your `webpack.mix.js` file, Register Tailwind CSS as a PostCSS plugin : + +```js +const mix = require('laravel-mix') + +mix.js('resources/js/app.js', 'public/js') + .postCss('resources/css/app.css', 'public/css', [ + require('tailwindcss'), // [tl! focus] + ]) +``` + +In `/resources/css/app.css`, import `filament/forms` vendor CSS and [TailwindCSS](https://tailwindcss.com): + +```css +@import '../../vendor/filament/forms/dist/module.esm.css'; + +@tailwind base; +@tailwind components; +@tailwind utilities; +``` + +In `/resources/js/app.js`, import [Alpine.js](https://alpinejs.dev), the `filament/forms` and `@alpinejs/trap` plugins, and register them: +```js +import Alpine from 'alpinejs' +import FormsAlpinePlugin from '../../vendor/filament/forms/dist/module.esm' +import Trap from '@alpinejs/trap' + +Alpine.plugin(FormsAlpinePlugin) +Alpine.plugin(Trap) + +window.Alpine = Alpine + +Alpine.start() +``` + +Compile your new CSS and JS assets using `npm run dev`. + +Finally, create a new `resources/views/layouts/app.blade.php` layout file for Livewire components: + +```blade + + + + + + + + + + {{ config('app.name') }} + + + + @livewireStyles + + + + @livewireScripts + + @stack('scripts') + + + + {{ $slot }} + + +``` + +You're now ready to start [building tables](getting-started)! + +## Publishing the configuration + +If you wish, you may publish the configuration of the package using: + +```bash +php artisan vendor:publish --tag=tables-config +``` + +## Upgrade Guide + +To upgrade the package to the latest version, you must run: + +```bash +composer update +php artisan config:clear +php artisan view:clear +``` + +To do this automatically, we recommend adding these commands to your `composer.json`'s `post-update-cmd`: + +```json +"post-update-cmd": [ + // ... + "@php artisan config:clear", + "@php artisan view:clear" +], +``` diff --git a/packages/tables/docs/02-getting-started.md b/packages/tables/docs/02-getting-started.md new file mode 100644 index 0000000000..6f1d7334c7 --- /dev/null +++ b/packages/tables/docs/02-getting-started.md @@ -0,0 +1,500 @@ +--- +title: Getting Started +--- + +## Preparing your Livewire component + +Implement the `HasTable` interface and use the `InteractsWithTable` trait: + +```php + + {{ $this->table }} + +``` + +Next, add the Eloquent query you would like the table to be based upon in the `getTableQuery()` method: + +```php +size(40) + ->rounded(), + Tables\Columns\TextColumn::make('title'), + Tables\Columns\TextColumn::make('author.name'), + Tables\Columns\BadgeColumn::make('status') + ->colors([ + 'danger' => 'draft', + 'warning' => 'reviewing', + 'success' => 'published', + ]), + Tables\Columns\BooleanColumn::make('is_featured'), + ]; // [tl! collapse:end] + } + + protected function getTableFilters(): array + { + return [ // [tl! collapse:start] + Tables\Filters\Filter::make('published') + ->query(fn (Builder $query): $query => $query->where('is_published', true)), + Tables\Filters\SelectFilter::make('status') + ->options([ + 'draft' => 'Draft', + 'in_review' => 'In Review', + 'approved' => 'Approved', + ]), + ]; // [tl! collapse:end] + } + + protected function getTableActions(): array + { + return [ // [tl! collapse:start] + Tables\Actions\LinkAction::make('edit') + ->url(fn (Post $record): string => route('posts.edit', $record)), + ]; // [tl! collapse:end] + } + + protected function getTableBulkActions(): array + { + return [ // [tl! collapse:start] + Tables\Actions\BulkAction::make('delete') + ->label('Delete selected') + ->color('danger') + ->action(function (Collection $records): void { + $records->each->delete(); + }) + ->requiresConfirmation(), + ]; // [tl! collapse:end] + } // [tl! focus:end] + + public function render(): View + { + return view('list-posts'); + } +} +``` + +Visit your Livewire component in the browser, and you should see the table. + +## Pagination + +By default, tables will be paginated. To disable this, you should override the `isTablePaginationEnabled()` method on your Livewire component: + +```php + route('posts.edit', ['record' => $record]); +} +``` + +In this example, clicking on each post will take you to the `posts.edit` route. + +If you'd like to [override the URL](columns#opening-urls) for a specific column, or instead [run a Livewire action](columns#running-actions) when a column is clicked, see the [columns documentation](columns#opening-urls). + +## Empty state + +By default, an "empty state" card will be rendered when the table is empty. To customize this, you may define methods on your Livewire component: + +```php +size(40) + ->rounded(), + Tables\Columns\TextColumn::make('title'), + Tables\Columns\TextColumn::make('author.name'), + Tables\Columns\BadgeColumn::make('status') + ->colors([ + 'danger' => 'draft', + 'warning' => 'reviewing', + 'success' => 'published', + ]), + Tables\Columns\BooleanColumn::make('is_featured'), + ]; // [tl! collapse:end] + } + + protected function getTableEmptyStateIcon(): ?string // [tl! focus:start] + { + return 'heroicon-o-bookmark'; + } + + protected function getTableEmptyStateHeading(): ?string + { + return 'No posts yet'; + } + + protected function getTableEmptyStateDescription(): ?string + { + return 'You may create a post using the button below.'; + } + + protected function getTableEmptyStateActions(): array + { + return [ + Tables\Actions\ButtonAction::make('create') + ->label('Create post') + ->url(route('posts.create')) + ->icon('heroicon-o-plus'), + ]; + } // [tl! focus:end] + + public function render(): View + { + return view('list-posts'); + } +} +``` + +## Query string + +Livewire ships with a feature to store data in the URL's query string, to access across requests. + +With Filament, this allows you to store your table's sort, search and pagination state in the URL. + +To store the sort and search state of your table in the query string: + +```php +protected $queryString = [ + 'tableSortColumn', + 'tableSortDirection', + 'tableSearchQuery' => ['except' => ''], +]; +``` + +## Using the form builder + +Internally, the table builder uses the [form builder](/docs/forms) to implement filtering, actions, and bulk actions. Because of this, the form builder is already set up on your Livewire component and ready to use with your own custom forms. + +You may use the default `form` out of the box: + +```php +form->fill(); + } + + protected function getFormSchema(): array + { + return [ + // ... + ]; + } + + protected function getTableQuery(): Builder // [tl! collapse:start] + { + return Post::query(); + } + + protected function getTableColumns(): array + { + return [ + Tables\Columns\ImageColumn::make('author.avatar') + ->size(40) + ->rounded(), + Tables\Columns\TextColumn::make('title'), + Tables\Columns\TextColumn::make('author.name'), + Tables\Columns\BadgeColumn::make('status') + ->colors([ + 'danger' => 'draft', + 'warning' => 'reviewing', + 'success' => 'published', + ]), + Tables\Columns\BooleanColumn::make('is_featured'), + ]; + } // [tl! collapse:end] + + public function render(): View + { + return view('list-posts'); + } +} +``` + +You may also [register multiple custom forms](/docs/forms/getting-started#using-multiple-forms) on your component: + +```php +createPostForm->fill(); + } + + protected function getCreatePostFormSchema(): array + { + return [ + // ... + ]; + } + + protected function getEditPostFormSchema(): array + { + return [ + // ... + ]; + } + + protected function getForms(): array + { + return array_merge($this->getTableForms(), [ + 'createPostForm' => $this->makeForm() + ->schema($this->getCreatePostFormSchema()) + ->model(Post::class), + 'editPostForm' => $this->makeForm() + ->schema($this->getEditPostFormSchema()) + ->model($this->postToEdit), + ]); + } + + protected function getTableQuery(): Builder // [tl! collapse:start] + { + return Post::query(); + } + + protected function getTableColumns(): array + { + return [ + Tables\Columns\ImageColumn::make('author.avatar') + ->size(40) + ->rounded(), + Tables\Columns\TextColumn::make('title'), + Tables\Columns\TextColumn::make('author.name'), + Tables\Columns\BadgeColumn::make('status') + ->colors([ + 'danger' => 'draft', + 'warning' => 'reviewing', + 'success' => 'published', + ]), + Tables\Columns\BooleanColumn::make('is_featured'), + ]; + } // [tl! collapse:end] + + public function render(): View + { + return view('list-posts'); + } +} +``` diff --git a/packages/tables/docs/03-columns.md b/packages/tables/docs/03-columns.md new file mode 100644 index 0000000000..3f96ae53bf --- /dev/null +++ b/packages/tables/docs/03-columns.md @@ -0,0 +1,389 @@ +--- +title: Columns +--- + +## Getting started + +Column classes can be found in the `Filament\Tables\Columns` namespace. + +They reside within the `getTableColumns()` method of your Livewire component: + +```php +protected function getTableColumns(): array +{ + return [ + // ... + ]; +} +``` + +Columns may be created using the static `make()` method, passing its name. The name of the column should correspond to a column or accessor on your model. You may use "dot syntax" to access columns within relationships. + +```php +use Filament\Tables\Columns\TextColumn; + +TextColumn::make('title') + +TextColumn::make('author.name') +``` + +### Setting a label + +By default, the label of the column, which is displayed in the header of the table, is generated from the name of the column. You may customize this using the `label()` method: + +```php +use Filament\Tables\Columns\TextColumn; + +TextColumn::make('title')->label('Post title') +``` + +### Sorting + +Columns may be sortable, by clicking on the column label. To make a column sortable, you must use the `sortable()` method: + +```php +use Filament\Tables\Columns\TextColumn; + +TextColumn::make('title')->sortable() +``` + +If you're using an accessor column, you may pass `sortable()` an array of database columns to sort by: + +```php +use Filament\Tables\Columns\TextColumn; + +TextColumn::make('full_name')->sortable(['first_name', 'last_name']) +``` + +### Searching + +Columns may be searchable, by using the text input in the top right of the table. To make a column searchable, you must use the `searchable()` method: + +```php +use Filament\Tables\Columns\TextColumn; + +TextColumn::make('title')->searchable() +``` + +If you're using an accessor column, you may pass `searchable()` an array of database columns to search within: + +```php +use Filament\Tables\Columns\TextColumn; + +TextColumn::make('full_name')->searchable(['first_name', 'last_name']) +``` + +### Cell actions and URLs + +When a cell is clicked, you may run an "action", or open a URL. + +#### Running actions + +To run an action, you may use the `action()` method, passing a callback or the name of a Livewire method to run. Each method accepts a `$record` parameter which you may use to customize the behaviour of the action: + +```php +use Filament\Tables\Columns\TextColumn; + +TextColumn::make('title') + ->action(function (Post $record): void { + $this->dispatchBrowserEvent('open-post-edit-modal', [ + 'post' => $record->getKey(), + ]); + }) +``` + +#### Opening URLs + +To open a URL, you may use the `url()` method, passing a callback or static URL to open. Callbacks accept a `$record` parameter which you may use to customize the URL: + +```php +use Filament\Tables\Columns\TextColumn; + +TextColumn::make('title') + ->url(fn (Post $record): string => route('posts.edit', ['post' => $record])) +``` + +You may also choose to open the URL in a new tab: + +```php +use Filament\Tables\Columns\TextColumn; + +TextColumn::make('title') + ->url(fn (Post $record): string => route('posts.edit', ['post' => $record])) + ->openUrlInNewTab() +``` + +### Setting a default value + +To set a default value for fields with a `null` state, you may use the `default()` method: + +```php +use Filament\Tables\Columns\TextColumn; + +TextColumn::make('title')->default('Untitled') +``` + +### Responsive layouts + +You may choose to show and hide columns based on the responsive [breakpoint](https://tailwindcss.com/docs/responsive-design#overview) of the browser. To do this, you may use a `visibleFrom()` or `hiddenFrom()` method: + +```php +use Filament\Tables\Columns\TextColumn; + +TextColumn::make('slug')->visibleFrom('md') +``` + +## Text column + +You may use the `date()` and `dateTime()` methods to format the column's state using [PHP date formatting tokens](https://www.php.net/manual/en/datetime.format.php): + +```php +use Filament\Tables\Columns\TextColumn; + +TextColumn::make('created_at')->dateTime() +``` + +The `money()` method allows you to easily format monetary values, in any currency. This functionality uses [`akaunting/laravel-money`](https://github.com/akaunting/laravel-money) internally: + +```php +use Filament\Tables\Columns\TextColumn; + +TextColumn::make('price')->money('eur') +``` + +You may `limit()` the length of the cell's value: + +```php +use Filament\Tables\Columns\TextColumn; + +TextColumn::make('description')->limit('50') +``` + +You may also transform a set of known cell values using the `enum()` method: + +```php +use Filament\Tables\Columns\TextColumn; + +TextColumn::make('status')->enum([ + 'draft' => 'Draft', + 'reviewing' => 'Reviewing', + 'published' => 'Published', +]) +``` + +You may instead pass a custom formatting callback to `formatStateUsing()`, which accepts the `$state` of the cell, and optionally its `$record`: + +```php +use Filament\Tables\Columns\TextColumn; + +TextColumn::make('status') + ->formatStateUsing(fn (string $state): string => __("statuses.{$state}")) +``` + +## Boolean column + +Boolean columns render a check or cross icon representing their state: + +```php +use Filament\Tables\Columns\BooleanColumn; + +BooleanColumn::make('is_featured') +``` + +You may customize the icon representing each state. Icons are the name of a Blade component present. By default, [Heroicons](https://heroicons.com) are installed: + +```php +use Filament\Tables\Columns\BooleanColumn; + +BooleanColumn::make('is_featured') + ->trueIcon('heroicon-o-badge-check') + ->falseIcon('heroicon-o-x-circle') +``` + +You may customize the icon color representing each state. These may be either `primary`, `secondary`, `success`, `warning` or `danger`: + +```php +use Filament\Tables\Columns\BooleanColumn; + +BooleanColumn::make('is_featured') + ->trueColor('primary') + ->falseColor('warning') +``` + +## Image column + +```php +use Filament\Tables\Columns\ImageColumn; + +ImageColumn::make('header_image') +``` + +You may make the image fully `rounded()`, which is useful for rendering avatars: + +```php +use Filament\Tables\Columns\ImageColumn; + +ImageColumn::make('author.avatar')->rounded() +``` + +You may customize the image size by passing a `width()` and `height()`, or both with `size()`: + +```php +use Filament\Tables\Columns\ImageColumn; + +ImageColumn::make('header_image')->width(200) + +ImageColumn::make('header_image')->height(50) + +ImageColumn::make('author.avatar')->size(40) +``` + +By default, the `public` disk will be used to retrieve images. You may pass a custom disk name to the `disk()` method: + +```php +use Filament\Tables\Columns\ImageColumn; + +ImageColumn::make('header_image')->disk('s3') +``` + +## Icon column + +Icon columns render a Blade icon component representing their state: + +```php +use Filament\Tables\Columns\IconColumn; + +IconColumn::make('is_featured') + ->options([ + 'heroicon-o-x-circle', + 'heroicon-o-pencil' => 'draft', + 'heroicon-o-clock' => 'reviewing', + 'heroicon-o-check-circle' => 'published', + ]) +``` + +You may also pass a callback to activate an option, accepting the cell's `$state`: + +```php +use Filament\Tables\Columns\IconColumn; + +IconColumn::make('is_featured') + ->options([ + 'heroicon-o-x-circle', + 'heroicon-o-pencil' => fn ($state): bool => $state === 'draft', + 'heroicon-o-clock' => fn ($state): bool => $state === 'reviewing', + 'heroicon-o-check-circle' => fn ($state): bool => $state === 'published', + ]) +``` + +Icon columns may also have a set of icon colors, using the same syntax. They may be either `primary`, `secondary`, `success`, `warning` or `danger`: + +```php +use Filament\Tables\Columns\IconColumn; + +IconColumn::make('is_featured') + ->options([ + 'heroicon-o-x-circle', + 'heroicon-o-pencil' => 'draft', + 'heroicon-o-clock' => 'reviewing', + 'heroicon-o-check-circle' => 'published', + ]) + ->colors([ + 'secondary', + 'danger' => 'draft', + 'warning' => 'reviewing', + 'success' => 'published', + ]) +``` + +## Badge column + +Icon columns render a colored badge representing their state. The badge contains the state of the cell. You may use the same formatting methods as for [text columns](#text-column): + +```php +use Filament\Tables\Columns\BadgeColumn; + +BadgeColumn::make('status') + ->enum([ + 'draft' => 'Draft', + 'reviewing' => 'Reviewing', + 'published' => 'Published', + ]) +``` + +Badges may have a color. It may be either `primary`, `secondary`, `success`, `warning` or `danger`: + +```php +use Filament\Tables\Columns\BadgeColumn; + +BadgeColumn::make('status') + ->colors([ + 'secondary', + 'danger' => 'draft', + 'warning' => 'reviewing', + 'success' => 'published', + ]) +``` + +You may instead activate a color using a callback, accepting the cell's `$state`: + +```php +use Filament\Tables\Columns\BadgeColumn; + +BadgeColumn::make('status') + ->colors([ + 'secondary', + 'danger' => fn ($state): bool => $state === 'draft', + 'warning' => fn ($state): bool => $state === 'reviewing', + 'success' => fn ($state): bool => $state === 'published', + ]) +``` + +## View column + +You may render a custom view for a cell using the `view()` method: + +```php +use Filament\Tables\Columns\ViewColumn; + +ViewColumn::make('status')->view('filament.tables.columns.status-switcher') +``` + +Inside your view, you may retrieve the state of the cell using the `$getState()` method: + +```blade +
    + {{ $getState() }} +
    +``` + +## Building custom columns + +You may create your own custom column classes and cell views, which you can reuse across your project, and even release as a plugin to the community. + +> If you're just creating a simple custom column to use once, you could instead use a [view column](#view-column) to render any custom Blade file. + +To create a custom column class and view, you may use the following command: + +```bash +php artisan make:table-column StatusSwitcher +``` + +This will create the following column class: + +```php +use Filament\Tables\Columns\Column; + +class StatusSwitcher extends Column +{ + protected string $view = 'filament.tables.columns.status-switcher'; +} +``` + +Inside your view, you may retrieve the state of the cell using the `$getState()` method: + +```blade +
    + {{ $getState() }} +
    +``` diff --git a/packages/tables/docs/04-filters.md b/packages/tables/docs/04-filters.md new file mode 100644 index 0000000000..f76d6a7dd3 --- /dev/null +++ b/packages/tables/docs/04-filters.md @@ -0,0 +1,146 @@ +--- +title: Filters +--- + +## Getting started + +Filters allow you to scope the Eloquent query as a way to reduce the number of records in a table. + +They reside within the `getTableFilters()` method of your Livewire component: + +```php +protected function getTableFilters(): array +{ + return [ + // ... + ]; +} +``` + +Filters may be created using the static `make()` method, passing its name. The name of the filter should be unique. You should then pass a callback to `query()` which applies your filter's scope: + +```php +use Filament\Tables\Filters\Filter; +use Illuminate\Database\Eloquent\Builder; + +Filter::make('is_featured') + ->query(fn (Builder $query): Builder => $query->where('is_featured', true)) +``` + +### Setting a label + +By default, the label of the filter, which is displayed in the filter form, is generated from the name of the filter. You may customize this using the `label()` method: + +```php +use Filament\Tables\Filters\Filter; + +Filter::make('is_featured')->label('Featured') +``` + +### Default filters + +You may set a filter to be enabled by default, using the `default()` method: + +```php +use Filament\Tables\Filters\Filter; + +Filter::make('is_featured')->label('Featured')->default() +``` + +## Filter forms + +By default, filters have two states: enabled and disabled. When the filter is enabled, it is applied to the query. When it is disabled it is not. This is controlled through a checkbox. However, some filters may require extra data input to narrow down the results further. You may use a custom filter form to collect this data. + +### Select filters + +Select filters allow you to quickly create a filter that allows the user to select an option to apply the filter to their table. For example, a status filter may present the user with a few status options to pick from and filter the table using: + +```php +use Filament\Tables\Filters\SelectFilter; + +SelectFilter::make('status') + ->options([ + 'draft' => 'Draft', + 'reviewing' => 'Reviewing', + 'published' => 'Published', + ]) +``` + +Select filters do not require a custom `query()` method. The column name used to scope the query is the name of the filter. To customize this, you may use the `column()` method: + +```php +use Filament\Tables\Filters\SelectFilter; + +SelectFilter::make('status') + ->options([ + 'draft' => 'Draft', + 'reviewing' => 'Reviewing', + 'published' => 'Published', + ]) + ->column('status_id') +``` + +### Custom filter forms + +You may use components from the [Form Builder](/docs/forms/fields) to create custom filter forms. The data from the custom filter form is available in the `$data` array of the `query()` callback: + +```php +use Filament\Forms; +use Filament\Tables\Filters\Filter; +use Illuminate\Database\Eloquent\Builder; + +Filter::make('created_at') + ->form([ + Forms\Components\DatePicker::make('created_from'), + Forms\Components\DatePicker::make('created_until'), + ]) + ->query(function (Builder $query, array $data): Builder { + return $query + ->when( + $data['created_from'], + fn (Builder $query, $date): Builder => $query->whereDate('created_at', '>=', $date), + ) + ->when( + $data['created_until'], + fn (Builder $query, $date): Builder => $query->whereDate('created_at', '<=', $date), + ); + }) +``` + +### Setting default values + +If you wish to set a default filter value, you may use the `default()` method on the form component: + +```php +use Filament\Forms; +use Filament\Tables\Filters\Filter; +use Illuminate\Database\Eloquent\Builder; + +Filter::make('created_at') + ->form([ + Forms\Components\DatePicker::make('created_from'), + Forms\Components\DatePicker::make('created_until')->default(now()), + ]) +``` + +## Customizing popover columns + +By default, filters are displayed in a thin popover on the right side of the table, in 1 column. + +To change the number of columns that filters may occupy, you may use the `getTableFiltersFormColumns()` method: + +```php +protected function getTableFiltersFormColumns(): int +{ + return 3; +} +``` + +Adding more columns to the filter form will automatically widen the popover. To customize the popover width, you may use the `getTableFiltersFormWidth()` method, and specify a width from `xs` to `7xl`: + +```php +protected function getTableFiltersFormWidth(): string +{ + return '4xl'; +} +``` diff --git a/packages/tables/docs/05-actions.md b/packages/tables/docs/05-actions.md new file mode 100644 index 0000000000..63d76bbe90 --- /dev/null +++ b/packages/tables/docs/05-actions.md @@ -0,0 +1,179 @@ +--- +title: Actions +--- + +## Getting started + +### Single actions + +Single actions may be registered in the `getTableActions()` method. Single action buttons are rendered at the end of each table row. + +```php +protected function getTableActions(): array +{ + return [ + // ... + ]; +} +``` + +Actions may be created using the static `make()` method, passing its name. The name of the action should be unique. You can then pass a callback to `action()` which executes the task, or a callback to `url()` which generates a link URL: + +```php +use App\Models\Post; +use Filament\Tables\Actions\LinkAction; + +LinkAction::make('edit') + ->url(fn (Post $record): string => route('posts.edit', $record)) +``` + +### Bulk actions + +Bulk actions may be registered in the `getTableBulkActions()` method. Bulk action buttons are visible when the user selects at least one record. + +```php +protected function getTableBulkActions(): array +{ + return [ + // ... + ]; +} +``` + +Bulk actions may be created using the static `make()` method, passing its name. The name of the action should be unique. You should then pass a callback to `action()` which executes the task: + +```php +use Filament\Tables\Actions\BulkAction; +use Illuminate\Database\Eloquent\Collection; + +BulkAction::make('delete') + ->action(fn (Collection $records) => $records->each->delete()) +``` + +You may deselect the records after a bulk action has been executed using the `deselectRecordsAfterCompletion()` method: + +```php +use Filament\Tables\Actions\BulkAction; +use Illuminate\Database\Eloquent\Collection; + +BulkAction::make('delete') + ->action(fn (Collection $records) => $records->each->delete()) + ->deselectRecordsAfterCompletion() +``` + +## Setting a label + +By default, the label of the action is generated from its name. You may customize this using the `label()` method: + +```php +use App\Models\Post; +use Filament\Tables\Actions\LinkAction; + +LinkAction::make('edit') + ->label('Edit post') + ->url(fn (Post $record): string => route('posts.edit', $record)) +``` + +## Setting a color + +Actions may have a color to indicate their significance. It may be either `primary`, `secondary`, `success`, `warning` or `danger`: + +```php +use Filament\Tables\Actions\BulkAction; +use Illuminate\Database\Eloquent\Collection; + +BulkAction::make('delete') + ->action(fn (Collection $records) => $records->each->delete()) + ->deselectRecordsAfterCompletion() + ->color('danger') +``` + +## Setting an icon + +Bulk actions and some single actions may also render a Blade icon component to indicate their purpose: + +```php +use App\Models\Post; +use Filament\Tables\Actions\BulkAction; +use Filament\Tables\Actions\ButtonAction; +use Filament\Tables\Actions\IconButtonAction; +use Illuminate\Database\Eloquent\Collection; + +BulkAction::make('delete') + ->action(fn (Collection $records) => $records->each->delete()) + ->deselectRecordsAfterCompletion() + ->color('danger') + ->icon('heroicon-o-trash') + +ButtonAction::make('edit') + ->label('Edit post') + ->url(fn (Post $record): string => route('posts.edit', $record)) + ->icon('heroicon-o-pencil') + +IconButtonAction::make('edit') + ->label('Edit post') + ->url(fn (Post $record): string => route('posts.edit', $record)) + ->icon('heroicon-o-pencil') +``` + +## Modals + +Actions and bulk actions may require additional confirmation or form information before they run. With the table builder, you may open a modal before an action is executed to do this. + +### Confirmation modals + +You may require confirmation before an action is run using the `requiresConfirmation()` method. This is useful for particularly destructive actions, such as those that delete records. + +```php +use Filament\Tables\Actions\BulkAction; +use Illuminate\Database\Eloquent\Collection; + +BulkAction::make('delete') + ->action(fn (Collection $records) => $records->each->delete()) + ->deselectRecordsAfterCompletion() + ->requiresConfirmation() +``` + +### Custom forms + +You may also render a form in this modal to collect extra information from the user before the action runs. + +You may use components from the [Form Builder](/docs/forms/fields) to create custom action modal forms. The data from the form is available in the `$data` array of the `action()` callback: + +```php +use App\Modals\User; +use Filament\Forms; +use Filament\Tables\Actions\BulkAction; +use Illuminate\Database\Eloquent\Collection; + +BulkAction::make('updateAuthor') + ->action(function (Collection $records, array $data): void { + foreach ($records as $record) { + $record->author()->associate($data['authorId']); + $record->save(); + } + }) + ->form([ + Forms\Components\Select::make('authorId') + ->label('Author') + ->options(User::query()->pluck('name', 'id')) + ->required(), + ]) +``` + +### Setting a modal heading, subheading, and button label + +You may customize the heading, subheading and button label of the modal: + +```php +use Filament\Tables\Actions\BulkAction; +use Illuminate\Database\Eloquent\Collection; + +BulkAction::make('delete') + ->action(fn (Collection $records) => $records->each->delete()) + ->deselectRecordsAfterCompletion() + ->requiresConfirmation() + ->modalHeading('Delete posts') + ->modalSubheading('Are you sure you\'d like to delete these posts? This cannot be undone.') + ->modalButton('Yes, delete them') +``` diff --git a/packages/tables/resources/lang/ar/table.php b/packages/tables/resources/lang/ar/table.php new file mode 100644 index 0000000000..0cfd519bd7 --- /dev/null +++ b/packages/tables/resources/lang/ar/table.php @@ -0,0 +1,96 @@ + [ + + 'search_query' => [ + 'label' => 'بحث', + 'placeholder' => 'بحث', + ], + + ], + + 'pagination' => [ + + 'label' => 'التنقل بين الصفحات', + + 'overview' => 'عرض :first إلي :last من :total النتائج', + + 'fields' => [ + + 'records_per_page' => [ + 'label' => 'لكل صفحة', + ], + + ], + + 'buttons' => [ + + 'go_to_page' => [ + 'label' => 'انتقل إلى صفحة :page', + ], + + 'next' => [ + 'label' => 'التالي', + ], + + 'previous' => [ + 'label' => 'السابق', + ], + + ], + + ], + + 'buttons' => [ + + 'filter' => [ + 'label' => 'تصفية', + ], + + 'open_actions' => [ + 'label' => 'Open actions', + ], + + ], + + 'actions' => [ + + 'modal' => [ + + 'requires_confirmation_subheading' => 'Are you sure you would like to do this?', + + 'buttons' => [ + + 'cancel' => [ + 'label' => 'إلغاء', + ], + + 'confirm' => [ + 'label' => 'Confirm', + ], + + 'submit' => [ + 'label' => 'Submit', + ], + + ], + + ], + + 'buttons' => [ + + 'select_all' => [ + 'label' => 'Select all :count records', + ], + + ], + + ], + + 'empty' => [ + 'heading' => 'لا توجد سجلات', + ], + +]; diff --git a/packages/tables/resources/lang/ca/table.php b/packages/tables/resources/lang/ca/table.php new file mode 100644 index 0000000000..6b9e671334 --- /dev/null +++ b/packages/tables/resources/lang/ca/table.php @@ -0,0 +1,96 @@ + [ + + 'search_query' => [ + 'label' => 'Cerca', + 'placeholder' => 'Cerca', + ], + + ], + + 'pagination' => [ + + 'label' => 'Paginació', + + 'overview' => 'Mostrant :first a :last de :total resultatss', + + 'fields' => [ + + 'records_per_page' => [ + 'label' => 'per pàgina', + ], + + ], + + 'buttons' => [ + + 'go_to_page' => [ + 'label' => 'Anar a la pàgina :page', + ], + + 'next' => [ + 'label' => 'Següent', + ], + + 'previous' => [ + 'label' => 'Anterior', + ], + + ], + + ], + + 'buttons' => [ + + 'filter' => [ + 'label' => 'Filtre', + ], + + 'open_actions' => [ + 'label' => 'Open actions', + ], + + ], + + 'actions' => [ + + 'modal' => [ + + 'requires_confirmation_subheading' => 'Are you sure you would like to do this?', + + 'buttons' => [ + + 'cancel' => [ + 'label' => 'Cancela', + ], + + 'confirm' => [ + 'label' => 'Confirm', + ], + + 'submit' => [ + 'label' => 'Submit', + ], + + ], + + ], + + 'buttons' => [ + + 'select_all' => [ + 'label' => 'Select all :count records', + ], + + ], + + ], + + 'empty' => [ + 'heading' => 'No s\'han trobat registres.', + ], + +]; diff --git a/packages/tables/resources/lang/da/table.php b/packages/tables/resources/lang/da/table.php new file mode 100644 index 0000000000..662f510294 --- /dev/null +++ b/packages/tables/resources/lang/da/table.php @@ -0,0 +1,96 @@ + [ + + 'search_query' => [ + 'label' => 'Søg', + 'placeholder' => 'Søg', + ], + + ], + + 'pagination' => [ + + 'label' => 'Paginering Navigation', + + 'overview' => 'Viser :first til :last af :total resultater', + + 'fields' => [ + + 'records_per_page' => [ + 'label' => 'per side', + ], + + ], + + 'buttons' => [ + + 'go_to_page' => [ + 'label' => 'Gå til side :page', + ], + + 'next' => [ + 'label' => 'Næste', + ], + + 'previous' => [ + 'label' => 'Forrige', + ], + + ], + + ], + + 'buttons' => [ + + 'filter' => [ + 'label' => 'Filtrer', + ], + + 'open_actions' => [ + 'label' => 'Åbn handlinger', + ], + + ], + + 'actions' => [ + + 'modal' => [ + + 'requires_confirmation_subheading' => 'Er du sikker på, at du gerne vil gøre dette?', + + 'buttons' => [ + + 'cancel' => [ + 'label' => 'Annuller', + ], + + 'confirm' => [ + 'label' => 'Bekræft', + ], + + 'submit' => [ + 'label' => 'Indsend', + ], + + ], + + ], + + 'buttons' => [ + + 'select_all' => [ + 'label' => 'Vælg alle :count poster', + ], + + ], + + ], + + 'empty' => [ + 'heading' => 'Ingen resultater', + ], + +]; diff --git a/packages/tables/resources/lang/de/table.php b/packages/tables/resources/lang/de/table.php new file mode 100644 index 0000000000..ba83b2a4da --- /dev/null +++ b/packages/tables/resources/lang/de/table.php @@ -0,0 +1,96 @@ + [ + + 'search_query' => [ + 'label' => 'Suche', + 'placeholder' => 'Suche', + ], + + ], + + 'pagination' => [ + + 'label' => 'Seitennavigation', + + 'overview' => 'Anzeigen von :first bis :last von :total Ergebnissen', + + 'fields' => [ + + 'records_per_page' => [ + 'label' => 'pro Seite', + ], + + ], + + 'buttons' => [ + + 'go_to_page' => [ + 'label' => 'Weiter zur Seite :page', + ], + + 'next' => [ + 'label' => 'Nächste', + ], + + 'previous' => [ + 'label' => 'Vorherige', + ], + + ], + + ], + + 'buttons' => [ + + 'filter' => [ + 'label' => 'Filtern', + ], + + 'open_actions' => [ + 'label' => 'Aktionen öffnen', + ], + + ], + + 'actions' => [ + + 'modal' => [ + + 'requires_confirmation_subheading' => 'Sind Sie sicher, dass Sie dies tun möchten?', + + 'buttons' => [ + + 'cancel' => [ + 'label' => 'Abbrechen', + ], + + 'confirm' => [ + 'label' => 'Bestätigen Sie', + ], + + 'submit' => [ + 'label' => 'Absenden', + ], + + ], + + ], + + 'buttons' => [ + + 'select_all' => [ + 'label' => 'Alle :count Datensätze auswählen', + ], + + ], + + ], + + 'empty' => [ + 'heading' => 'Keine Datensätze gefunden', + ], + +]; diff --git a/packages/tables/resources/lang/en/table.php b/packages/tables/resources/lang/en/table.php new file mode 100644 index 0000000000..8b4a28ce7a --- /dev/null +++ b/packages/tables/resources/lang/en/table.php @@ -0,0 +1,96 @@ + [ + + 'search_query' => [ + 'label' => 'Search', + 'placeholder' => 'Search', + ], + + ], + + 'pagination' => [ + + 'label' => 'Pagination Navigation', + + 'overview' => 'Showing :first to :last of :total results', + + 'fields' => [ + + 'records_per_page' => [ + 'label' => 'per page', + ], + + ], + + 'buttons' => [ + + 'go_to_page' => [ + 'label' => 'Go to page :page', + ], + + 'next' => [ + 'label' => 'Next', + ], + + 'previous' => [ + 'label' => 'Previous', + ], + + ], + + ], + + 'buttons' => [ + + 'filter' => [ + 'label' => 'Filter', + ], + + 'open_actions' => [ + 'label' => 'Open actions', + ], + + ], + + 'actions' => [ + + 'modal' => [ + + 'requires_confirmation_subheading' => 'Are you sure you would like to do this?', + + 'buttons' => [ + + 'cancel' => [ + 'label' => 'Cancel', + ], + + 'confirm' => [ + 'label' => 'Confirm', + ], + + 'submit' => [ + 'label' => 'Submit', + ], + + ], + + ], + + 'buttons' => [ + + 'select_all' => [ + 'label' => 'Select all :count records', + ], + + ], + + ], + + 'empty' => [ + 'heading' => 'No records found', + ], + +]; diff --git a/packages/tables/resources/lang/es/table.php b/packages/tables/resources/lang/es/table.php new file mode 100644 index 0000000000..796cfeb400 --- /dev/null +++ b/packages/tables/resources/lang/es/table.php @@ -0,0 +1,96 @@ + [ + + 'search_query' => [ + 'label' => 'Buscar', + 'placeholder' => 'Buscar', + ], + + ], + + 'pagination' => [ + + 'label' => 'Navegación de paginación', + + 'overview' => 'Mostrando :first a :last de :total resultados', + + 'fields' => [ + + 'records_per_page' => [ + 'label' => 'por página', + ], + + ], + + 'buttons' => [ + + 'go_to_page' => [ + 'label' => 'Ir a la página :page', + ], + + 'next' => [ + 'label' => 'Siguiente', + ], + + 'previous' => [ + 'label' => 'Anterior', + ], + + ], + + ], + + 'buttons' => [ + + 'filter' => [ + 'label' => 'Filtro', + ], + + 'open_actions' => [ + 'label' => 'Abrir acciones', + ], + + ], + + 'actions' => [ + + 'modal' => [ + + 'requires_confirmation_subheading' => '¿Estás seguro de que quieres hacer esto?', + + 'buttons' => [ + + 'cancel' => [ + 'label' => 'Cancelar', + ], + + 'confirm' => [ + 'label' => 'Confirmar', + ], + + 'submit' => [ + 'label' => 'Enviar', + ], + + ], + + ], + + 'buttons' => [ + + 'select_all' => [ + 'label' => 'Seleccione los :count registros', + ], + + ], + + ], + + 'empty' => [ + 'heading' => 'No se encontraron registros', + ], + +]; diff --git a/packages/tables/resources/lang/fa/table.php b/packages/tables/resources/lang/fa/table.php new file mode 100644 index 0000000000..9e6c2f373b --- /dev/null +++ b/packages/tables/resources/lang/fa/table.php @@ -0,0 +1,96 @@ + [ + + 'search_query' => [ + 'label' => 'جستجو', + 'placeholder' => 'جستجو', + ], + + ], + + 'pagination' => [ + + 'label' => 'جهت یابی صفحه بندی', + + 'overview' => 'در حال نمایش :first به :last از :total نتایج', + + 'fields' => [ + + 'records_per_page' => [ + 'label' => 'در هر صفحه', + ], + + ], + + 'buttons' => [ + + 'go_to_page' => [ + 'label' => 'برو به صفحه :page', + ], + + 'next' => [ + 'label' => 'بعدی', + ], + + 'previous' => [ + 'label' => 'قبلی', + ], + + ], + + ], + + 'buttons' => [ + + 'filter' => [ + 'label' => 'فلتر', + ], + + 'open_actions' => [ + 'label' => 'Open actions', + ], + + ], + + 'actions' => [ + + 'modal' => [ + + 'requires_confirmation_subheading' => 'Are you sure you would like to do this?', + + 'buttons' => [ + + 'cancel' => [ + 'label' => 'لغو', + ], + + 'confirm' => [ + 'label' => 'Confirm', + ], + + 'submit' => [ + 'label' => 'Submit', + ], + + ], + + ], + + 'buttons' => [ + + 'select_all' => [ + 'label' => 'Select all :count records', + ], + + ], + + ], + + 'empty' => [ + 'heading' => 'هیچ ریکارد دریافت نشد.', + ], + +]; diff --git a/packages/tables/resources/lang/fr/table.php b/packages/tables/resources/lang/fr/table.php new file mode 100644 index 0000000000..3151c774f0 --- /dev/null +++ b/packages/tables/resources/lang/fr/table.php @@ -0,0 +1,96 @@ + [ + + 'search_query' => [ + 'label' => 'Rechercher', + 'placeholder' => 'Rechercher', + ], + + ], + + 'pagination' => [ + + 'label' => 'Navigation par pagination', + + 'overview' => 'Montrer :first à :last de :total résultats', + + 'fields' => [ + + 'records_per_page' => [ + 'label' => 'par page', + ], + + ], + + 'buttons' => [ + + 'go_to_page' => [ + 'label' => 'Aller à la page :page', + ], + + 'next' => [ + 'label' => 'Suivant', + ], + + 'previous' => [ + 'label' => 'Précédent', + ], + + ], + + ], + + 'buttons' => [ + + 'filter' => [ + 'label' => 'Filtre', + ], + + 'open_actions' => [ + 'label' => 'Actions ouvertes', + ], + + ], + + 'actions' => [ + + 'modal' => [ + + 'requires_confirmation_subheading' => 'Êtes-vous sûr de vouloir faire ça?', + + 'buttons' => [ + + 'cancel' => [ + 'label' => 'Annuler', + ], + + 'confirm' => [ + 'label' => 'Confirmer', + ], + + 'submit' => [ + 'label' => 'Envoyer', + ], + + ], + + ], + + 'buttons' => [ + + 'select_all' => [ + 'label' => 'Sélectionner tous les enregistrements', + ], + + ], + + ], + + 'empty' => [ + 'heading' => 'Aucun document trouvé', + ], + +]; diff --git a/packages/tables/resources/lang/id/table.php b/packages/tables/resources/lang/id/table.php new file mode 100644 index 0000000000..9e59ffd5be --- /dev/null +++ b/packages/tables/resources/lang/id/table.php @@ -0,0 +1,96 @@ + [ + + 'search_query' => [ + 'label' => 'Cari', + 'placeholder' => 'Cari', + ], + + ], + + 'pagination' => [ + + 'label' => 'Navigasi halaman', + + 'overview' => 'Menampilkan :first sampai :last dari :total hasil', + + 'fields' => [ + + 'records_per_page' => [ + 'label' => 'per halaman', + ], + + ], + + 'buttons' => [ + + 'go_to_page' => [ + 'label' => 'Ke halaman :page', + ], + + 'next' => [ + 'label' => 'Selanjutnya', + ], + + 'previous' => [ + 'label' => 'Sebelumnya', + ], + + ], + + ], + + 'buttons' => [ + + 'filter' => [ + 'label' => 'Filter', + ], + + 'open_actions' => [ + 'label' => 'Open actions', + ], + + ], + + 'actions' => [ + + 'modal' => [ + + 'requires_confirmation_subheading' => 'Are you sure you would like to do this?', + + 'buttons' => [ + + 'cancel' => [ + 'label' => 'Batalkan', + ], + + 'confirm' => [ + 'label' => 'Confirm', + ], + + 'submit' => [ + 'label' => 'Submit', + ], + + ], + + ], + + 'buttons' => [ + + 'select_all' => [ + 'label' => 'Select all :count records', + ], + + ], + + ], + + 'empty' => [ + 'heading' => 'Data tidak ditemukan', + ], + +]; diff --git a/packages/tables/resources/lang/it/table.php b/packages/tables/resources/lang/it/table.php new file mode 100644 index 0000000000..642255a50c --- /dev/null +++ b/packages/tables/resources/lang/it/table.php @@ -0,0 +1,96 @@ + [ + + 'search_query' => [ + 'label' => 'Cerca', + 'placeholder' => 'Cerca', + ], + + ], + + 'pagination' => [ + + 'label' => 'Navigazione paginazione', + + 'overview' => 'Mostrati :first a :last di :total risultati', + + 'fields' => [ + + 'records_per_page' => [ + 'label' => 'per pagina', + ], + + ], + + 'buttons' => [ + + 'go_to_page' => [ + 'label' => 'Vai a pagina :page', + ], + + 'next' => [ + 'label' => 'Successivo', + ], + + 'previous' => [ + 'label' => 'Precedente', + ], + + ], + + ], + + 'buttons' => [ + + 'filter' => [ + 'label' => 'Filtra', + ], + + 'open_actions' => [ + 'label' => 'Azioni aperte', + ], + + ], + + 'actions' => [ + + 'modal' => [ + + 'requires_confirmation_subheading' => 'Sei sicuro di volerlo fare?', + + 'buttons' => [ + + 'cancel' => [ + 'label' => 'Annulla', + ], + + 'confirm' => [ + 'label' => 'Conferma', + ], + + 'submit' => [ + 'label' => 'Invia', + ], + + ], + + ], + + 'buttons' => [ + + 'select_all' => [ + 'label' => 'Seleziona tutti i :count record', + ], + + ], + + ], + + 'empty' => [ + 'heading' => 'Nessun valore trovato', + ], + +]; diff --git a/packages/tables/resources/lang/ka/table.php b/packages/tables/resources/lang/ka/table.php new file mode 100644 index 0000000000..cb02ad939d --- /dev/null +++ b/packages/tables/resources/lang/ka/table.php @@ -0,0 +1,96 @@ + [ + + 'search_query' => [ + 'label' => 'ძიება', + 'placeholder' => 'ძიება', + ], + + ], + + 'pagination' => [ + + 'label' => 'გვერდების ნავიგაცია', + + 'overview' => 'Showing :first to :last of :total results', + + 'fields' => [ + + 'records_per_page' => [ + 'label' => 'ჩანაწერი თითო გვერდზე', + ], + + ], + + 'buttons' => [ + + 'go_to_page' => [ + 'label' => ':page-ე გვერდზე გადასვლა', + ], + + 'next' => [ + 'label' => 'შემდეგი', + ], + + 'previous' => [ + 'label' => 'წინა', + ], + + ], + + ], + + 'buttons' => [ + + 'filter' => [ + 'label' => 'ფილტრი', + ], + + 'open_actions' => [ + 'label' => 'Open actions', + ], + + ], + + 'actions' => [ + + 'modal' => [ + + 'requires_confirmation_subheading' => 'Are you sure you would like to do this?', + + 'buttons' => [ + + 'cancel' => [ + 'label' => 'გაუქმება', + ], + + 'confirm' => [ + 'label' => 'Confirm', + ], + + 'submit' => [ + 'label' => 'Submit', + ], + + ], + + ], + + 'buttons' => [ + + 'select_all' => [ + 'label' => 'Select all :count records', + ], + + ], + + ], + + 'empty' => [ + 'heading' => 'ჩანაწერები არ არსებობს.', + ], + +]; diff --git a/packages/tables/resources/lang/ku/table.php b/packages/tables/resources/lang/ku/table.php new file mode 100644 index 0000000000..ebb88fbfd8 --- /dev/null +++ b/packages/tables/resources/lang/ku/table.php @@ -0,0 +1,96 @@ + [ + + 'search_query' => [ + 'label' => 'گەڕان', + 'placeholder' => 'گەڕان', + ], + + ], + + 'pagination' => [ + + 'label' => 'ڕێنوێیی پەڕەکردن', + + 'overview' => 'پیشاندان :first بۆ :last لە :total ئەنجام', + + 'fields' => [ + + 'records_per_page' => [ + 'label' => 'بۆ هەر پەڕەیەک', + ], + + ], + + 'buttons' => [ + + 'go_to_page' => [ + 'label' => 'بڕۆ بۆ پەیچی :page', + ], + + 'next' => [ + 'label' => 'داهاتو', + ], + + 'previous' => [ + 'label' => 'پێشتر', + ], + + ], + + ], + + 'buttons' => [ + + 'filter' => [ + 'label' => 'فیلتەر', + ], + + 'open_actions' => [ + 'label' => 'Open actions', + ], + + ], + + 'actions' => [ + + 'modal' => [ + + 'requires_confirmation_subheading' => 'Are you sure you would like to do this?', + + 'buttons' => [ + + 'cancel' => [ + 'label' => 'ڕەتکردنەوە', + ], + + 'confirm' => [ + 'label' => 'Confirm', + ], + + 'submit' => [ + 'label' => 'Submit', + ], + + ], + + ], + + 'buttons' => [ + + 'select_all' => [ + 'label' => 'Select all :count records', + ], + + ], + + ], + + 'empty' => [ + 'heading' => 'هیچ تۆمارێک نەدۆزرایەوە', + ], + +]; diff --git a/packages/tables/resources/lang/nl/table.php b/packages/tables/resources/lang/nl/table.php new file mode 100644 index 0000000000..1599e848d3 --- /dev/null +++ b/packages/tables/resources/lang/nl/table.php @@ -0,0 +1,97 @@ + [ + + 'search_query' => [ + 'label' => 'Zoeken', + 'placeholder' => 'Zoeken', + ], + + ], + + 'pagination' => [ + + 'label' => 'Paginatie navigatie', + + 'overview' => 'Toont :first tot :last van :total resultaten', + + 'fields' => [ + + 'records_per_page' => [ + 'label' => 'per pagina', + ], + + ], + + 'buttons' => [ + + 'go_to_page' => [ + 'label' => 'Ga naar pagina :page', + ], + + 'next' => [ + 'label' => 'Volgende', + ], + + 'previous' => [ + 'label' => 'Vorige', + ], + + ], + + ], + + 'buttons' => [ + + 'filter' => [ + 'label' => 'Filter', + ], + + 'open_actions' => [ + 'label' => 'Acties openen', + ], + + ], + + 'actions' => [ + + 'modal' => [ + + 'requires_confirmation_subheading' => 'Weet u zeker dat u dit wilt doen?', + + 'buttons' => [ + + 'cancel' => [ + 'label' => 'Annuleren', + ], + + 'confirm' => [ + 'label' => 'Bevestig', + ], + + 'submit' => [ + 'label' => 'Verzenden', + ], + + ], + + ], + + 'buttons' => [ + + 'select_all' => [ + 'label' => 'Selecteer alle :count records +', + ], + + ], + + ], + + 'empty' => [ + 'heading' => 'Geen resultaten gevonden', + ], + +]; diff --git a/packages/tables/resources/lang/pt-br/table.php b/packages/tables/resources/lang/pt-br/table.php new file mode 100644 index 0000000000..9ef2e889c2 --- /dev/null +++ b/packages/tables/resources/lang/pt-br/table.php @@ -0,0 +1,96 @@ + [ + + 'search_query' => [ + 'label' => 'Procurar', + 'placeholder' => 'Procurar', + ], + + ], + + 'pagination' => [ + + 'label' => 'Paginação', + + 'overview' => 'Exibindo :first a :last de :total resultados', + + 'fields' => [ + + 'records_per_page' => [ + 'label' => 'por página', + ], + + ], + + 'buttons' => [ + + 'go_to_page' => [ + 'label' => 'Ir para página :page', + ], + + 'next' => [ + 'label' => 'Próximo', + ], + + 'previous' => [ + 'label' => 'Anterior', + ], + + ], + + ], + + 'buttons' => [ + + 'filter' => [ + 'label' => 'Filtrar', + ], + + 'open_actions' => [ + 'label' => 'Ações abertas', + ], + + ], + + 'actions' => [ + + 'modal' => [ + + 'requires_confirmation_subheading' => 'Você tem certeza de que gostaria de fazer isso?', + + 'buttons' => [ + + 'cancel' => [ + 'label' => 'Cancelar', + ], + + 'confirm' => [ + 'label' => 'Confirme', + ], + + 'submit' => [ + 'label' => 'Enviar para', + ], + + ], + + ], + + 'buttons' => [ + + 'select_all' => [ + 'label' => 'Selecione todos os :count registros', + ], + + ], + + ], + + 'empty' => [ + 'heading' => 'Sem registros', + ], + +]; diff --git a/packages/tables/resources/lang/ru/table.php b/packages/tables/resources/lang/ru/table.php new file mode 100644 index 0000000000..b45c13042b --- /dev/null +++ b/packages/tables/resources/lang/ru/table.php @@ -0,0 +1,96 @@ + [ + + 'search_query' => [ + 'label' => 'Поиск', + 'placeholder' => 'Поиск', + ], + + ], + + 'pagination' => [ + + 'label' => 'навигация разбивки на страницы', + + 'overview' => 'показ :first до :last из :total результаты', + + 'fields' => [ + + 'records_per_page' => [ + 'label' => 'на страницу', + ], + + ], + + 'buttons' => [ + + 'go_to_page' => [ + 'label' => 'Перейти к странице :page', + ], + + 'next' => [ + 'label' => 'Следующая', + ], + + 'previous' => [ + 'label' => 'Предыдущая', + ], + + ], + + ], + + 'buttons' => [ + + 'filter' => [ + 'label' => 'Фильтр', + ], + + 'open_actions' => [ + 'label' => 'Open actions', + ], + + ], + + 'actions' => [ + + 'modal' => [ + + 'requires_confirmation_subheading' => 'Are you sure you would like to do this?', + + 'buttons' => [ + + 'cancel' => [ + 'label' => 'Отменить', + ], + + 'confirm' => [ + 'label' => 'Confirm', + ], + + 'submit' => [ + 'label' => 'Submit', + ], + + ], + + ], + + 'buttons' => [ + + 'select_all' => [ + 'label' => 'Select all :count records', + ], + + ], + + ], + + 'empty' => [ + 'heading' => 'не найдено записей', + ], + +]; diff --git a/packages/tables/resources/lang/sv/table.php b/packages/tables/resources/lang/sv/table.php new file mode 100644 index 0000000000..5b1d07381e --- /dev/null +++ b/packages/tables/resources/lang/sv/table.php @@ -0,0 +1,96 @@ + [ + + 'search_query' => [ + 'label' => 'Sök', + 'placeholder' => 'Sök', + ], + + ], + + 'pagination' => [ + + 'label' => 'Pagineringsmeny', + + 'overview' => 'Visar från :first till :last av :total totalt', + + 'fields' => [ + + 'records_per_page' => [ + 'label' => 'per sida', + ], + + ], + + 'buttons' => [ + + 'go_to_page' => [ + 'label' => 'Gå till :page', + ], + + 'next' => [ + 'label' => 'Nästa', + ], + + 'previous' => [ + 'label' => 'Föregående', + ], + + ], + + ], + + 'buttons' => [ + + 'filter' => [ + 'label' => 'Filter', + ], + + 'open_actions' => [ + 'label' => 'Öppna åtgärder', + ], + + ], + + 'actions' => [ + + 'modal' => [ + + 'requires_confirmation_subheading' => 'Är du säker på att du vill göra detta?', + + 'buttons' => [ + + 'cancel' => [ + 'label' => 'Ångra', + ], + + 'confirm' => [ + 'label' => 'Bekräfta', + ], + + 'submit' => [ + 'label' => 'Skicka in', + ], + + ], + + ], + + 'buttons' => [ + + 'select_all' => [ + 'label' => 'Välj alla :count poster', + ], + + ], + + ], + + 'empty' => [ + 'heading' => 'Finns inga rader', + ], + +]; diff --git a/packages/tables/resources/lang/zh-CN/table.php b/packages/tables/resources/lang/zh-CN/table.php new file mode 100644 index 0000000000..5941ac080c --- /dev/null +++ b/packages/tables/resources/lang/zh-CN/table.php @@ -0,0 +1,96 @@ + [ + + 'search_query' => [ + 'label' => '搜索', + 'placeholder' => '搜索', + ], + + ], + + 'pagination' => [ + + 'label' => '分页', + + 'overview' => '显示 :first 到 :last 的 :total 结果', + + 'fields' => [ + + 'records_per_page' => [ + 'label' => '每页', + ], + + ], + + 'buttons' => [ + + 'go_to_page' => [ + 'label' => '跳转到 :page', + ], + + 'next' => [ + 'label' => '下一页', + ], + + 'previous' => [ + 'label' => '上一页', + ], + + ], + + ], + + 'buttons' => [ + + 'filter' => [ + 'label' => '筛选', + ], + + 'open_actions' => [ + 'label' => 'Open actions', + ], + + ], + + 'actions' => [ + + 'modal' => [ + + 'requires_confirmation_subheading' => 'Are you sure you would like to do this?', + + 'buttons' => [ + + 'cancel' => [ + 'label' => '取消', + ], + + 'confirm' => [ + 'label' => 'Confirm', + ], + + 'submit' => [ + 'label' => 'Submit', + ], + + ], + + ], + + 'buttons' => [ + + 'select_all' => [ + 'label' => 'Select all :count records', + ], + + ], + + ], + + 'empty' => [ + 'heading' => '没有找到相关记录', + ], + +]; diff --git a/packages/tables/resources/views/actions/button-action.blade.php b/packages/tables/resources/views/actions/button-action.blade.php new file mode 100644 index 0000000000..0845d738bb --- /dev/null +++ b/packages/tables/resources/views/actions/button-action.blade.php @@ -0,0 +1,33 @@ +@php + $action = $getAction(); + $record = $getRecord(); + + $clickAction = null; + + if (is_string($action)) { + if ($record) { + $clickAction = "{$action}('{$record->getKey()}')"; + } else { + $clickAction = $action; + } + } elseif ($action instanceof \Closure) { + if ($record) { + $clickAction = "mountTableAction('{$getName()}', '{$record->getKey()}')"; + } else { + $clickAction = "mountTableAction('{$getName()}')"; + } + } +@endphp + + + {{ $getLabel() }} + diff --git a/packages/tables/resources/views/actions/icon-button-action.blade.php b/packages/tables/resources/views/actions/icon-button-action.blade.php new file mode 100644 index 0000000000..04ff450547 --- /dev/null +++ b/packages/tables/resources/views/actions/icon-button-action.blade.php @@ -0,0 +1,31 @@ +@php + $action = $getAction(); + $record = $getRecord(); + + $clickAction = null; + + if (is_string($action)) { + if ($record) { + $clickAction = "{$action}('{$record->getKey()}')"; + } else { + $clickAction = $action; + } + } elseif ($action instanceof \Closure) { + if ($record) { + $clickAction = "mountTableAction('{$getName()}', '{$record->getKey()}')"; + } else { + $clickAction = "mountTableAction('{$getName()}')"; + } + } +@endphp + + diff --git a/packages/tables/resources/views/actions/link-action.blade.php b/packages/tables/resources/views/actions/link-action.blade.php new file mode 100644 index 0000000000..baeafca2bd --- /dev/null +++ b/packages/tables/resources/views/actions/link-action.blade.php @@ -0,0 +1,31 @@ +@php + $action = $getAction(); + $record = $getRecord(); + + $clickAction = null; + + if (is_string($action)) { + if ($record) { + $clickAction = "{$action}('{$record->getKey()}')"; + } else { + $clickAction = $action; + } + } elseif ($action instanceof \Closure) { + if ($record) { + $clickAction = "mountTableAction('{$getName()}', '{$record->getKey()}')"; + } else { + $clickAction = "mountTableAction('{$getName()}')"; + } + } +@endphp + + + {{ $getLabel() }} + diff --git a/packages/tables/resources/views/actions/modal/actions/button-action.blade.php b/packages/tables/resources/views/actions/modal/actions/button-action.blade.php new file mode 100644 index 0000000000..55dcf25d33 --- /dev/null +++ b/packages/tables/resources/views/actions/modal/actions/button-action.blade.php @@ -0,0 +1,10 @@ + + {{ $getLabel() }} + diff --git a/packages/tables/resources/views/columns/badge-column.blade.php b/packages/tables/resources/views/columns/badge-column.blade.php new file mode 100644 index 0000000000..7dd6b3c6ed --- /dev/null +++ b/packages/tables/resources/views/columns/badge-column.blade.php @@ -0,0 +1,20 @@ +@php + $stateColor = match ($getStateColor()) { + 'danger' => 'text-danger-700 bg-danger-500/10', + 'primary' => 'text-primary-700 bg-primary-500/10', + 'success' => 'text-success-700 bg-success-500/10', + 'warning' => 'text-warning-700 bg-warning-500/10', + default => 'text-gray-700 bg-gray-500/10', + }; +@endphp + +
    + @if ($state = $getFormattedState()) + $stateColor, + ])> + {{ $state }} + + @endif +
    diff --git a/packages/tables/resources/views/columns/boolean-column.blade.php b/packages/tables/resources/views/columns/boolean-column.blade.php new file mode 100644 index 0000000000..03190bda1d --- /dev/null +++ b/packages/tables/resources/views/columns/boolean-column.blade.php @@ -0,0 +1,23 @@ +@php + $state = $getState(); + + $stateIcon = $getStateIcon() ?? ($state ? 'heroicon-o-check-circle' : 'heroicon-o-x-circle'); + $stateColor = $getStateColor() ?? ($state ? 'success' : 'danger'); + + $stateColor = match ($stateColor) { + 'danger' => 'text-danger-500', + 'primary' => 'text-primary-500', + 'success' => 'text-success-500', + 'warning' => 'text-warning-500', + default => 'text-gray-700', + }; +@endphp + +
    + @if ($state !== null) + + @endif +
    diff --git a/packages/tables/resources/views/columns/icon-column.blade.php b/packages/tables/resources/views/columns/icon-column.blade.php new file mode 100644 index 0000000000..f98310c453 --- /dev/null +++ b/packages/tables/resources/views/columns/icon-column.blade.php @@ -0,0 +1,18 @@ +@php + $stateColor = match ($getStateColor()) { + 'danger' => 'text-danger-500', + 'primary' => 'text-primary-500', + 'success' => 'text-success-500', + 'warning' => 'text-warning-500', + default => 'text-gray-700', + }; +@endphp + +
    + @if ($getStateIcon()) + + @endif +
    diff --git a/packages/tables/resources/views/columns/image-column.blade.php b/packages/tables/resources/views/columns/image-column.blade.php new file mode 100644 index 0000000000..36fa59866f --- /dev/null +++ b/packages/tables/resources/views/columns/image-column.blade.php @@ -0,0 +1,22 @@ +
    + @if ($path = $getImagePath()) + @if ($isRounded()) +
    + @else + + @endif + @endif +
    diff --git a/packages/tables/resources/views/columns/text-column.blade.php b/packages/tables/resources/views/columns/text-column.blade.php new file mode 100644 index 0000000000..b4750fb514 --- /dev/null +++ b/packages/tables/resources/views/columns/text-column.blade.php @@ -0,0 +1,3 @@ +
    + {{ $getFormattedState() }} +
    diff --git a/packages/tables/resources/views/components/actions-cell.blade.php b/packages/tables/resources/views/components/actions-cell.blade.php new file mode 100644 index 0000000000..84d7303268 --- /dev/null +++ b/packages/tables/resources/views/components/actions-cell.blade.php @@ -0,0 +1,14 @@ +@props([ + 'actions', + 'record', +]) + +class(['px-4 py-3 whitespace-nowrap']) }}> +
    + @foreach ($actions as $action) + @if (! $action->record($record)->isHidden()) + {{ $action }} + @endif + @endforeach +
    + diff --git a/packages/tables/resources/views/components/actions.blade.php b/packages/tables/resources/views/components/actions.blade.php new file mode 100644 index 0000000000..ab041b18e7 --- /dev/null +++ b/packages/tables/resources/views/components/actions.blade.php @@ -0,0 +1,9 @@ +@props([ + 'actions', +]) + +
    class(['flex flex-wrap items-center gap-4']) }}> + @foreach ($actions as $action) + {{ $action }} + @endforeach +
    diff --git a/packages/tables/resources/views/components/bulk-actions/index.blade.php b/packages/tables/resources/views/components/bulk-actions/index.blade.php new file mode 100644 index 0000000000..05424d680d --- /dev/null +++ b/packages/tables/resources/views/components/bulk-actions/index.blade.php @@ -0,0 +1,47 @@ +@props([ + 'actions', + 'allRecordsCount', + 'allRecordsSelected' => false, +]) + +
    class(['relative']) }} +> + + +
    +
      + @if (! $allRecordsSelected) + + {{ __('tables::table.actions.buttons.select_all.label', ['count' => $allRecordsCount]) }} + + + + @endif + + @foreach($actions as $action) + + {{ $action->getLabel() }} + + @endforeach +
    +
    +
    diff --git a/packages/tables/resources/views/components/bulk-actions/trigger.blade.php b/packages/tables/resources/views/components/bulk-actions/trigger.blade.php new file mode 100644 index 0000000000..93f3f5862e --- /dev/null +++ b/packages/tables/resources/views/components/bulk-actions/trigger.blade.php @@ -0,0 +1,6 @@ + diff --git a/packages/tables/resources/views/components/button.blade.php b/packages/tables/resources/views/components/button.blade.php new file mode 100644 index 0000000000..ec3d4b5cff --- /dev/null +++ b/packages/tables/resources/views/components/button.blade.php @@ -0,0 +1,64 @@ +@props([ + 'color' => 'primary', + 'icon' => null, + 'iconPosition' => 'before', + 'tag' => 'button', + 'type' => 'button', + 'size' => 'md', +]) + +@php + $buttonClasses = [ + 'inline-flex items-center justify-center font-medium tracking-tight transition rounded-lg focus:outline-none focus:ring-offset-2 focus:ring-2 focus:ring-inset', + 'bg-primary-600 hover:bg-primary-500 focus:bg-primary-700 focus:ring-offset-primary-700' => $color === 'primary', + 'h-9 px-4' => $size === 'md', + 'text-white shadow focus:ring-white' => $color !== 'secondary', + 'bg-danger-600 hover:bg-danger-500 focus:bg-danger-700 focus:ring-offset-danger-700' => $color === 'danger', + 'text-gray-800 bg-white border border-gray-300 hover:bg-gray-50 focus:ring-primary-600 focus:text-primary-600 focus:bg-primary-50 focus:border-primary-600' => $color === 'secondary', + 'bg-success-600 hover:bg-success-500 focus:bg-success-700 focus:ring-offset-success-700' => $color === 'success', + 'bg-warning-600 hover:bg-warning-500 focus:bg-warning-700 focus:ring-offset-warning-700' => $color === 'warning', + 'h-8 px-3 text-sm' => $size === 'sm', + 'h-11 px-6 text-xl' => $size === 'lg', + ]; + + $iconClasses = \Illuminate\Support\Arr::toCssClasses([ + 'w-6 h-6' => $size === 'md', + 'w-7 h-7' => $size === 'lg', + 'w-5 h-5' => $size === 'sm', + 'mr-1 -ml-2' => ($iconPosition === 'before') && ($size === 'md'), + 'mr-2 -ml-3' => ($iconPosition === 'before') && ($size === 'lg'), + 'mr-1 -ml-1.5' => ($iconPosition === 'before') && ($size === 'sm'), + 'ml-1 -mr-2' => ($iconPosition === 'after') && ($size === 'md'), + 'ml-2 -mr-3' => ($iconPosition === 'after') && ($size === 'lg'), + 'ml-1 -mr-1.5' => ($iconPosition === 'after') && ($size === 'sm'), + ]); +@endphp + +@if ($tag === 'button') + +@elseif ($tag === 'a') +
    class($buttonClasses) }}> + @if ($icon && $iconPosition === 'before') + + @endif + + {{ $slot }} + + @if ($icon && $iconPosition === 'after') + + @endif + +@endif diff --git a/packages/tables/resources/views/components/cell.blade.php b/packages/tables/resources/views/components/cell.blade.php new file mode 100644 index 0000000000..84baed5bf2 --- /dev/null +++ b/packages/tables/resources/views/components/cell.blade.php @@ -0,0 +1,33 @@ +@props([ + 'action' => null, + 'name', + 'record', + 'shouldOpenUrlInNewTab' => false, + 'url' => null, +]) + + + @if ($action) + + @elseif ($url) + + {{ $slot }} + + @else + {{ $slot }} + @endif + diff --git a/packages/tables/resources/views/components/checkbox-cell.blade.php b/packages/tables/resources/views/components/checkbox-cell.blade.php new file mode 100644 index 0000000000..41e52e19e3 --- /dev/null +++ b/packages/tables/resources/views/components/checkbox-cell.blade.php @@ -0,0 +1,13 @@ +@props([ + 'checked' => false, + 'onClick', +]) + +class(['w-4 px-4 whitespace-nowrap']) }}> + + diff --git a/packages/tables/resources/views/components/container.blade.php b/packages/tables/resources/views/components/container.blade.php new file mode 100644 index 0000000000..b185a1ad6a --- /dev/null +++ b/packages/tables/resources/views/components/container.blade.php @@ -0,0 +1,3 @@ +
    class(['border border-gray-300 shadow-sm bg-white rounded-xl']) }}> + {{ $slot }} +
    diff --git a/packages/tables/resources/views/components/dropdown/item.blade.php b/packages/tables/resources/views/components/dropdown/item.blade.php new file mode 100644 index 0000000000..78f34013db --- /dev/null +++ b/packages/tables/resources/views/components/dropdown/item.blade.php @@ -0,0 +1,42 @@ +@props([ + 'color' => 'primary', + 'detail' => null, + 'icon' => null, +]) + +
  • + +
  • diff --git a/packages/tables/resources/views/components/empty-state/description.blade.php b/packages/tables/resources/views/components/empty-state/description.blade.php new file mode 100644 index 0000000000..8aef096b6b --- /dev/null +++ b/packages/tables/resources/views/components/empty-state/description.blade.php @@ -0,0 +1,3 @@ +

    class(['text-sm font-medium text-gray-500']) }}> + {{ $slot }} +

    diff --git a/packages/tables/resources/views/components/empty-state/heading.blade.php b/packages/tables/resources/views/components/empty-state/heading.blade.php new file mode 100644 index 0000000000..15e3444714 --- /dev/null +++ b/packages/tables/resources/views/components/empty-state/heading.blade.php @@ -0,0 +1,3 @@ +

    class(['text-xl font-bold tracking-tight']) }}> + {{ $slot }} +

    diff --git a/packages/tables/resources/views/components/empty-state/index.blade.php b/packages/tables/resources/views/components/empty-state/index.blade.php new file mode 100644 index 0000000000..7dbf0008a0 --- /dev/null +++ b/packages/tables/resources/views/components/empty-state/index.blade.php @@ -0,0 +1,28 @@ +@props([ + 'actions' => null, + 'description' => null, + 'heading', + 'icon', +]) + +
    class(['flex flex-1 flex-col items-center justify-center p-6 mx-auto space-y-6 text-center bg-white']) }}> +
    + +
    + +
    + + {{ $heading }} + + + @if ($description) + + {{ $description }} + + @endif +
    + + @if ($actions) + + @endif +
    diff --git a/packages/tables/resources/views/components/filters/index.blade.php b/packages/tables/resources/views/components/filters/index.blade.php new file mode 100644 index 0000000000..b4a1206119 --- /dev/null +++ b/packages/tables/resources/views/components/filters/index.blade.php @@ -0,0 +1,43 @@ +@props([ + 'form', + 'width' => 'sm', +]) + +
    class(['relative inline-block']) }} +> + + +
    'max-w-xs', + 'md' => 'max-w-md', + 'lg' => 'max-w-lg', + 'xl' => 'max-w-xl', + '2xl' => 'max-w-2xl', + '3xl' => 'max-w-3xl', + '4xl' => 'max-w-4xl', + '5xl' => 'max-w-5xl', + '6xl' => 'max-w-6xl', + '7xl' => 'max-w-7xl', + default => 'max-w-sm', + }, + ]) + > +
    + {{ $form }} +
    +
    +
    diff --git a/packages/tables/resources/views/components/filters/trigger.blade.php b/packages/tables/resources/views/components/filters/trigger.blade.php new file mode 100644 index 0000000000..1368d0abe6 --- /dev/null +++ b/packages/tables/resources/views/components/filters/trigger.blade.php @@ -0,0 +1,6 @@ + diff --git a/packages/tables/resources/views/components/header-cell.blade.php b/packages/tables/resources/views/components/header-cell.blade.php new file mode 100644 index 0000000000..755af4e8a8 --- /dev/null +++ b/packages/tables/resources/views/components/header-cell.blade.php @@ -0,0 +1,33 @@ +@props([ + 'isSortColumn' => false, + 'name', + 'sortable' => false, + 'sortDirection', +]) + +class(['px-4 py-2']) }}> + + diff --git a/packages/tables/resources/views/components/header/description.blade.php b/packages/tables/resources/views/components/header/description.blade.php new file mode 100644 index 0000000000..0b9f5bd8ce --- /dev/null +++ b/packages/tables/resources/views/components/header/description.blade.php @@ -0,0 +1,3 @@ +

    class(['text-gray-900']) }}> + {{ $slot }} +

    diff --git a/packages/tables/resources/views/components/header/heading.blade.php b/packages/tables/resources/views/components/header/heading.blade.php new file mode 100644 index 0000000000..15e3444714 --- /dev/null +++ b/packages/tables/resources/views/components/header/heading.blade.php @@ -0,0 +1,3 @@ +

    class(['text-xl font-bold tracking-tight']) }}> + {{ $slot }} +

    diff --git a/packages/tables/resources/views/components/header/index.blade.php b/packages/tables/resources/views/components/header/index.blade.php new file mode 100644 index 0000000000..3c2e22e048 --- /dev/null +++ b/packages/tables/resources/views/components/header/index.blade.php @@ -0,0 +1,27 @@ +@props([ + 'actions' => [], + 'description' => null, + 'heading', +]) + +
    class(['px-4 py-2']) }}> +
    +
    + @if ($heading) + + {{ $heading }} + + @endif + + @if ($description) + + {{ $description }} + + @endif +
    + + @if (count($actions)) + + @endif +
    +
    diff --git a/packages/tables/resources/views/components/hr.blade.php b/packages/tables/resources/views/components/hr.blade.php new file mode 100644 index 0000000000..bf2a652112 --- /dev/null +++ b/packages/tables/resources/views/components/hr.blade.php @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/packages/tables/resources/views/components/icon-button.blade.php b/packages/tables/resources/views/components/icon-button.blade.php new file mode 100644 index 0000000000..3c25ab3f3d --- /dev/null +++ b/packages/tables/resources/views/components/icon-button.blade.php @@ -0,0 +1,45 @@ +@props([ + 'color' => 'primary', + 'icon' => null, + 'label' => null, + 'tag' => 'button', + 'type' => 'button', +]) + +@php + $buttonClasses = [ + 'flex items-center justify-center w-10 h-10 transition rounded-full hover:bg-gray-500/5 focus:outline-none', + 'text-primary-500 focus:bg-primary-500/10' => $color === 'primary', + 'text-danger-500 focus:bg-danger-500/10' => $color === 'danger', + 'text-gray-500 focus:bg-gray-500/10' => $color === 'secondary', + 'text-success-500 focus:bg-success-500/10' => $color === 'success', + 'text-warning-500 focus:bg-warning-500/10' => $color === 'warning', + ]; + + $iconClasses = 'w-5 h-5'; +@endphp + +@if ($tag === 'button') + +@elseif ($tag === 'a') + class($buttonClasses) }}> + @if ($label) + + {{ $label }} + + @endif + + + +@endif diff --git a/packages/tables/resources/views/components/link.blade.php b/packages/tables/resources/views/components/link.blade.php new file mode 100644 index 0000000000..7c63e40a6a --- /dev/null +++ b/packages/tables/resources/views/components/link.blade.php @@ -0,0 +1,29 @@ +@props([ + 'color' => 'primary', + 'tag' => 'a', + 'type' => 'button', +]) + +@php + $linkClasses = [ + 'transition hover:underline focus:outline-none focus:underline', + 'text-primary-600 hover:text-primary-500' => $color === 'primary', + 'text-danger-600 hover:text-danger-500' => $color === 'danger', + 'text-gray-600 hover:text-gray-500' => $color === 'secondary', + 'text-success-600 hover:text-success-500' => $color === 'success', + 'text-warning-600 hover:text-warning-500' => $color === 'warning', + ]; +@endphp + +@if ($tag === 'a') + class($linkClasses) }}> + {{ $slot }} + +@elseif ($tag === 'button') + +@endif diff --git a/packages/tables/resources/views/components/modal/actions.blade.php b/packages/tables/resources/views/components/modal/actions.blade.php new file mode 100644 index 0000000000..2b45de9a53 --- /dev/null +++ b/packages/tables/resources/views/components/modal/actions.blade.php @@ -0,0 +1,13 @@ +@props([ + 'align' => 'left', + 'fullWidth' => false, +]) + +
    class([ + 'flex flex-wrap items-center gap-4' => ! $fullWidth, + 'justify-end' => (! $fullWidth) && ($align === 'right'), + 'justify-center' => (! $fullWidth) && ($align === 'center'), + 'grid gap-2 grid-cols-[repeat(auto-fit,minmax(0,1fr))]' => $fullWidth, +]) }}> + {{ $slot }} +
    diff --git a/packages/tables/resources/views/components/modal/heading.blade.php b/packages/tables/resources/views/components/modal/heading.blade.php new file mode 100644 index 0000000000..15e3444714 --- /dev/null +++ b/packages/tables/resources/views/components/modal/heading.blade.php @@ -0,0 +1,3 @@ +

    class(['text-xl font-bold tracking-tight']) }}> + {{ $slot }} +

    diff --git a/packages/tables/resources/views/components/modal/index.blade.php b/packages/tables/resources/views/components/modal/index.blade.php new file mode 100644 index 0000000000..e920281d10 --- /dev/null +++ b/packages/tables/resources/views/components/modal/index.blade.php @@ -0,0 +1,128 @@ +@props([ + 'actions' => null, + 'ariaLabelledby' => null, + 'closeEventName' => 'close-modal', + 'displayClasses' => 'inline-block', + 'footer' => null, + 'header' => null, + 'heading' => null, + 'id' => null, + 'openEventName' => 'open-modal', + 'subheading' => null, + 'trigger' => null, + 'width' => 'sm', +]) + + diff --git a/packages/tables/resources/views/components/modal/subheading.blade.php b/packages/tables/resources/views/components/modal/subheading.blade.php new file mode 100644 index 0000000000..9c9072c89e --- /dev/null +++ b/packages/tables/resources/views/components/modal/subheading.blade.php @@ -0,0 +1,3 @@ +

    class(['text-gray-500']) }}> + {{ $slot }} +

    \ No newline at end of file diff --git a/packages/tables/resources/views/components/pagination/index.blade.php b/packages/tables/resources/views/components/pagination/index.blade.php new file mode 100644 index 0000000000..efee6c8a0b --- /dev/null +++ b/packages/tables/resources/views/components/pagination/index.blade.php @@ -0,0 +1,94 @@ +@props([ + 'paginator', + 'recordsPerPageSelectOptions', +]) + + diff --git a/packages/tables/resources/views/components/pagination/item.blade.php b/packages/tables/resources/views/components/pagination/item.blade.php new file mode 100644 index 0000000000..a1d0e010f5 --- /dev/null +++ b/packages/tables/resources/views/components/pagination/item.blade.php @@ -0,0 +1,30 @@ +@props([ + 'active' => false, + 'disabled' => false, + 'icon' => false, + 'label' => null, + 'separator' => false, +]) + +
  • + +
  • diff --git a/packages/tables/resources/views/components/pagination/records-per-page-selector.blade.php b/packages/tables/resources/views/components/pagination/records-per-page-selector.blade.php new file mode 100644 index 0000000000..843c8356db --- /dev/null +++ b/packages/tables/resources/views/components/pagination/records-per-page-selector.blade.php @@ -0,0 +1,15 @@ +@props([ + 'options', +]) + +
    + + + +
    diff --git a/packages/tables/resources/views/components/row.blade.php b/packages/tables/resources/views/components/row.blade.php new file mode 100644 index 0000000000..b16347f47e --- /dev/null +++ b/packages/tables/resources/views/components/row.blade.php @@ -0,0 +1,3 @@ + + {{ $slot }} + diff --git a/packages/tables/resources/views/components/search-input.blade.php b/packages/tables/resources/views/components/search-input.blade.php new file mode 100644 index 0000000000..aa5cc263fb --- /dev/null +++ b/packages/tables/resources/views/components/search-input.blade.php @@ -0,0 +1,19 @@ +
    + + +
    + + + + + +
    +
    diff --git a/packages/tables/resources/views/components/table.blade.php b/packages/tables/resources/views/components/table.blade.php new file mode 100644 index 0000000000..3cbe10f0d2 --- /dev/null +++ b/packages/tables/resources/views/components/table.blade.php @@ -0,0 +1,26 @@ +@props([ + 'footer' => null, + 'header' => null, +]) + +class(['w-full text-left divide-y table-auto']) }}> + @if ($header) + + + {{ $header }} + + + @endif + + + {{ $slot }} + + + @if ($footer) + + + {{ $footer }} + + + @endif +
    diff --git a/packages/tables/resources/views/index.blade.php b/packages/tables/resources/views/index.blade.php new file mode 100644 index 0000000000..31f20f5c4f --- /dev/null +++ b/packages/tables/resources/views/index.blade.php @@ -0,0 +1,273 @@ +@php + $actions = $getActions(); + $columns = $getColumns(); + $contentFooter = $getContentFooter(); + $header = $getHeader(); + $headerActions = $getHeaderActions(); + $heading = $getHeading(); + $isBulkActionsDropdownVisible = $isSelectionEnabled() && $getSelectedRecordCount(); + $isSearchVisible = $isSearchable(); + $isFiltersDropdownVisible = $isFilterable(); + + $getHiddenClasses = function (\Filament\Tables\Columns\Column $column): ?string { + if ($breakpoint = $column->getHiddenFrom()) { + return match ($breakpoint) { + 'sm' => 'sm:hidden', + 'md' => 'md:hidden', + 'lg' => 'lg:hidden', + 'xl' => 'xl:hidden', + '2xl' => '2xl:hidden', + }; + } + + if ($breakpoint = $column->getVisibleFrom()) { + return match ($breakpoint) { + 'sm' => 'hidden sm:table-cell', + 'md' => 'hidden md:table-cell', + 'lg' => 'hidden lg:table-cell', + 'xl' => 'hidden xl:table-cell', + '2xl' => 'hidden 2xl:table-cell', + }; + } + + return null; + }; +@endphp + +
    + + @if ($hasTableHeader = ($header || $heading || $headerActions || $isBulkActionsDropdownVisible || $isSearchVisible || $isFiltersDropdownVisible)) + @if ($header) + {{ $header }} + @elseif ($heading || $headerActions) +
    + + + {{ $heading }} + + + + {{ $getDescription() }} + + + + +
    + @endif + +
    + @if ($isBulkActionsDropdownVisible || $isSearchVisible || $isFiltersDropdownVisible) +
    +
    + @if ($isBulkActionsDropdownVisible) + + @endif +
    + + @if ($isSearchVisible || $isFiltersDropdownVisible) +
    + @if ($isSearchVisible) +
    + +
    + @endif + + @if ($isFiltersDropdownVisible) + + @endif +
    + @endif +
    + @endif +
    + @endif + +
    ! $hasTableHeader, + 'border-t' => $hasTableHeader, + ])> + @if (($records = $getRecords())->count()) + + + @if ($isSelectionEnabled()) + + @endif + + @foreach ($columns as $column) + + {{ $column->getLabel() }} + + @endforeach + + @if (count($actions)) + + @endif + + + @foreach ($records as $record) + + @if ($isSelectionEnabled()) + + @endif + + @foreach ($columns as $column) + @php + $column->record($record); + @endphp + + + {{ $column }} + + @endforeach + + @if (count($actions)) + + @endif + + @endforeach + + @if ($contentFooter) + + {{ $contentFooter->with(['columns' => $columns, 'records' => $records]) }} + + @endif + + + @else + @if ($emptyState = $getEmptyState()) + {{ $emptyState }} + @else +
    + + + {{ $getEmptyStateHeading() }} + + + + {{ $getEmptyStateDescription() }} + + +
    + @endif + @endif +
    + + @if ($isPaginationEnabled()) +
    + +
    + @endif +
    + +
    + @php + $action = $getMountedAction(); + @endphp + + + @if ($action) + @if ($action->isModalCentered()) + + {{ $action->getModalHeading() }} + + + @if ($subheading = $action->getModalSubheading()) + + {{ $subheading }} + + @endif + @else + + + {{ $action->getModalHeading() }} + + + @endif + + @if ($action->hasFormSchema()) + {{ $getMountedActionForm() }} + @endif + + + + @foreach ($action->getModalActions() as $modalAction) + {{ $modalAction }} + @endforeach + + + @endif + +
    + +
    + @php + $action = $getMountedBulkAction(); + @endphp + + + @if ($action) + @if ($action->isModalCentered()) + + {{ $action->getModalHeading() }} + + + @if ($subheading = $action->getModalSubheading()) + + {{ $subheading }} + + @endif + @else + + + {{ $action->getModalHeading() }} + + + @endif + + @if ($action->hasFormSchema()) + {{ $getMountedBulkActionForm() }} + @endif + + + + @foreach ($action->getModalActions() as $modalAction) + {{ $modalAction }} + @endforeach + + + @endif + +
    +
    diff --git a/packages/tables/src/Actions/Action.php b/packages/tables/src/Actions/Action.php new file mode 100644 index 0000000000..175befc055 --- /dev/null +++ b/packages/tables/src/Actions/Action.php @@ -0,0 +1,103 @@ +name($name); + } + + public static function make(string $name): static + { + $static = new static($name); + $static->setUp(); + + return $static; + } + + protected function setUp(): void + { + } + + public function call(array $data = []) + { + if ($this->isHidden()) { + return; + } + + $action = $this->getAction(); + + if (! $action instanceof Closure) { + return; + } + + return app()->call($action, [ + 'data' => $data, + 'livewire' => $this->getLivewire(), + 'record' => $this->getRecord(), + ]); + } + + public function hidden(bool | callable $condition = true): static + { + $this->isHidden = $condition; + + return $this; + } + + public function isHidden(): bool + { + if (! $this->isHidden instanceof Closure) { + return $this->isHidden; + } + + if (! $this->getRecord()) { + return false; + } + + return app()->call($this->isHidden, [ + 'livewire' => $this->getLivewire(), + 'record' => $this->getRecord(), + ]); + } + + public function toHtml(): string + { + return $this->render()->render(); + } + + public function render(): View + { + return view($this->getView(), array_merge($this->data(), [ + 'action' => $this, + ])); + } +} diff --git a/packages/tables/src/Actions/BulkAction.php b/packages/tables/src/Actions/BulkAction.php new file mode 100644 index 0000000000..067c741016 --- /dev/null +++ b/packages/tables/src/Actions/BulkAction.php @@ -0,0 +1,70 @@ +name($name); + } + + public static function make(string $name): static + { + $static = new static($name); + $static->setUp(); + + return $static; + } + + protected function setUp(): void + { + } + + public function call(array $data = []) + { + if ($this->isHidden()) { + return; + } + + $action = $this->getAction(); + + if (! $action instanceof Closure) { + return; + } + + try { + return app()->call($action, [ + 'data' => $data, + 'livewire' => $this->getLivewire(), + 'records' => $this->getRecords(), + ]); + } finally { + if ($this->shouldDeselectRecordsAfterCompletion()) { + $this->getLivewire()->deselectAllTableRecords(); + } + } + } +} diff --git a/packages/tables/src/Actions/ButtonAction.php b/packages/tables/src/Actions/ButtonAction.php new file mode 100644 index 0000000000..28d6574253 --- /dev/null +++ b/packages/tables/src/Actions/ButtonAction.php @@ -0,0 +1,24 @@ +iconPosition = $position; + + return $this; + } + + public function getIconPosition(): ?string + { + return $this->iconPosition; + } +} diff --git a/packages/tables/src/Actions/Concerns/BelongsToTable.php b/packages/tables/src/Actions/Concerns/BelongsToTable.php new file mode 100644 index 0000000000..bb97c8ee14 --- /dev/null +++ b/packages/tables/src/Actions/Concerns/BelongsToTable.php @@ -0,0 +1,28 @@ +table = $table; + + return $this; + } + + public function getTable(): Table + { + return $this->table; + } + + public function getLivewire(): HasTable + { + return $this->getTable()->getLivewire(); + } +} diff --git a/packages/tables/src/Actions/Concerns/CanBeHidden.php b/packages/tables/src/Actions/Concerns/CanBeHidden.php new file mode 100644 index 0000000000..3af92d1187 --- /dev/null +++ b/packages/tables/src/Actions/Concerns/CanBeHidden.php @@ -0,0 +1,20 @@ +isHidden = $condition; + + return $this; + } + + public function isHidden(): bool + { + return $this->isHidden; + } +} diff --git a/packages/tables/src/Actions/Concerns/CanBeMounted.php b/packages/tables/src/Actions/Concerns/CanBeMounted.php new file mode 100644 index 0000000000..1251ba701a --- /dev/null +++ b/packages/tables/src/Actions/Concerns/CanBeMounted.php @@ -0,0 +1,32 @@ +mountUsing = $callback; + + return $this; + } + + public function getMountUsing(): callable + { + return $this->mountUsing ?? function ($action, ?ComponentContainer $form = null) { + if (! $action->shouldOpenModal()) { + return; + } + + if (! $form) { + return; + } + + $form->fill(); + }; + } +} diff --git a/packages/tables/src/Actions/Concerns/CanDeselectRecordsAfterCompletion.php b/packages/tables/src/Actions/Concerns/CanDeselectRecordsAfterCompletion.php new file mode 100644 index 0000000000..b24e2aa60d --- /dev/null +++ b/packages/tables/src/Actions/Concerns/CanDeselectRecordsAfterCompletion.php @@ -0,0 +1,20 @@ +shouldDeselectRecordsAfterCompletion = $condition; + + return $this; + } + + public function shouldDeselectRecordsAfterCompletion(): bool + { + return $this->shouldDeselectRecordsAfterCompletion; + } +} diff --git a/packages/tables/src/Actions/Concerns/CanOpenModal.php b/packages/tables/src/Actions/Concerns/CanOpenModal.php new file mode 100644 index 0000000000..5d375a4d30 --- /dev/null +++ b/packages/tables/src/Actions/Concerns/CanOpenModal.php @@ -0,0 +1,150 @@ +isModalCentered = $condition; + + return $this; + } + + public function modalActions(?array $actions = null): static + { + $this->modalActions = $actions; + + return $this; + } + + public function modalButton(?string $label = null): static + { + $this->modalButtonLabel = $label; + + return $this; + } + + public function modalHeading(?string $heading = null): static + { + $this->modalHeading = $heading; + + return $this; + } + + public function modalSubheading(?string $subheading = null): static + { + $this->modalSubheading = $subheading; + + return $this; + } + + public function modalWidth(?string $width = null): static + { + $this->modalWidth = $width; + + return $this; + } + + public function getModalActions(): array + { + if ($this->modalActions !== null) { + return $this->modalActions; + } + + $color = $this->getColor(); + + $actions = [ + ButtonAction::make('submit') + ->label($this->getModalButtonLabel()) + ->submit() + ->color($color !== 'secondary' ? $color : null), + ButtonAction::make('cancel') + ->label(__('tables::table.actions.modal.buttons.cancel.label')) + ->cancel() + ->color('secondary'), + ]; + + if ($this->isModalCentered()) { + $actions = array_reverse($actions); + } + + return $actions; + } + + public function getModalButtonLabel(): string + { + if ($this->modalButtonLabel) { + return $this->modalButtonLabel; + } + + if ($this->isConfirmationRequired()) { + return __('tables::table.actions.modal.buttons.confirm.label'); + } + + return __('tables::table.actions.modal.buttons.submit.label'); + } + + public function getModalHeading(): string + { + return $this->modalHeading ?? $this->getLabel(); + } + + public function getModalSubheading(): ?string + { + if ($this->modalSubheading) { + return $this->modalSubheading; + } + + if ($this->isConfirmationRequired()) { + return __('tables::table.actions.modal.requires_confirmation_subheading'); + } + + return null; + } + + public function getModalWidth(): string + { + if ($this->modalWidth) { + return $this->modalWidth; + } + + if ($this->isConfirmationRequired()) { + return 'sm'; + } + + return '4xl'; + } + + public function isModalCentered(): bool + { + if ($this->isModalCentered !== null) { + return $this->isModalCentered; + } + + if (in_array($this->getModalWidth(), ['xs', 'sm'])) { + return true; + } + + return $this->isConfirmationRequired(); + } + + public function shouldOpenModal(): bool + { + return $this->isConfirmationRequired() || $this->hasFormSchema(); + } +} diff --git a/packages/tables/src/Actions/Concerns/CanOpenUrl.php b/packages/tables/src/Actions/Concerns/CanOpenUrl.php new file mode 100644 index 0000000000..d15c4283cf --- /dev/null +++ b/packages/tables/src/Actions/Concerns/CanOpenUrl.php @@ -0,0 +1,44 @@ +shouldOpenUrlInNewTab = $condition; + + return $this; + } + + public function url(string | callable | null $url, bool $shouldOpenInNewTab = false): static + { + $this->shouldOpenUrlInNewTab = $shouldOpenInNewTab; + $this->url = $url; + + return $this; + } + + public function getUrl(): ?string + { + if ($this->url instanceof Closure) { + return app()->call($this->url, [ + 'livewire' => $this->getLivewire(), + 'record' => $this->getRecord(), + ]); + } + + return $this->url; + } + + public function shouldOpenUrlInNewTab(): bool + { + return $this->shouldOpenUrlInNewTab; + } +} diff --git a/packages/tables/src/Actions/Concerns/CanRequireConfirmation.php b/packages/tables/src/Actions/Concerns/CanRequireConfirmation.php new file mode 100644 index 0000000000..f5be632704 --- /dev/null +++ b/packages/tables/src/Actions/Concerns/CanRequireConfirmation.php @@ -0,0 +1,20 @@ +isConfirmationRequired = true; + + return $this; + } + + public function isConfirmationRequired(): bool + { + return $this->isConfirmationRequired; + } +} diff --git a/packages/tables/src/Actions/Concerns/HasAction.php b/packages/tables/src/Actions/Concerns/HasAction.php new file mode 100644 index 0000000000..227af3896f --- /dev/null +++ b/packages/tables/src/Actions/Concerns/HasAction.php @@ -0,0 +1,20 @@ +action = $action; + + return $this; + } + + public function getAction(): string | callable | null + { + return $this->action; + } +} diff --git a/packages/tables/src/Actions/Concerns/HasColor.php b/packages/tables/src/Actions/Concerns/HasColor.php new file mode 100644 index 0000000000..ade5b5338c --- /dev/null +++ b/packages/tables/src/Actions/Concerns/HasColor.php @@ -0,0 +1,20 @@ +color = $color; + + return $this; + } + + public function getColor(): ?string + { + return $this->color; + } +} diff --git a/packages/tables/src/Actions/Concerns/HasFormSchema.php b/packages/tables/src/Actions/Concerns/HasFormSchema.php new file mode 100644 index 0000000000..928d2214af --- /dev/null +++ b/packages/tables/src/Actions/Concerns/HasFormSchema.php @@ -0,0 +1,25 @@ +formSchema = $schema; + + return $this; + } + + public function getFormSchema(): array + { + return $this->formSchema; + } + + public function hasFormSchema(): bool + { + return (bool) count($this->getFormSchema()); + } +} diff --git a/packages/tables/src/Actions/Concerns/HasIcon.php b/packages/tables/src/Actions/Concerns/HasIcon.php new file mode 100644 index 0000000000..6da819594f --- /dev/null +++ b/packages/tables/src/Actions/Concerns/HasIcon.php @@ -0,0 +1,20 @@ +icon = $icon; + + return $this; + } + + public function getIcon(): ?string + { + return $this->icon; + } +} diff --git a/packages/tables/src/Actions/Concerns/HasLabel.php b/packages/tables/src/Actions/Concerns/HasLabel.php new file mode 100644 index 0000000000..7af3bfa4f9 --- /dev/null +++ b/packages/tables/src/Actions/Concerns/HasLabel.php @@ -0,0 +1,26 @@ +label = $label; + + return $this; + } + + public function getLabel(): string + { + return $this->label ?? (string) Str::of($this->getName()) + ->before('.') + ->kebab() + ->replace(['-', '_'], ' ') + ->ucfirst(); + } +} diff --git a/packages/tables/src/Actions/Concerns/HasName.php b/packages/tables/src/Actions/Concerns/HasName.php new file mode 100644 index 0000000000..d598091ed1 --- /dev/null +++ b/packages/tables/src/Actions/Concerns/HasName.php @@ -0,0 +1,20 @@ +name = $name; + + return $this; + } + + public function getName(): string + { + return $this->name; + } +} diff --git a/packages/tables/src/Actions/Concerns/HasRecord.php b/packages/tables/src/Actions/Concerns/HasRecord.php new file mode 100644 index 0000000000..f8dd772abd --- /dev/null +++ b/packages/tables/src/Actions/Concerns/HasRecord.php @@ -0,0 +1,22 @@ +record = $record; + + return $this; + } + + public function getRecord(): ?Model + { + return $this->record; + } +} diff --git a/packages/tables/src/Actions/Concerns/HasRecords.php b/packages/tables/src/Actions/Concerns/HasRecords.php new file mode 100644 index 0000000000..9e6f37197f --- /dev/null +++ b/packages/tables/src/Actions/Concerns/HasRecords.php @@ -0,0 +1,22 @@ +records = $records; + + return $this; + } + + public function getRecords(): ?Collection + { + return $this->records; + } +} diff --git a/packages/tables/src/Actions/Concerns/HasView.php b/packages/tables/src/Actions/Concerns/HasView.php new file mode 100644 index 0000000000..ceb4af4a80 --- /dev/null +++ b/packages/tables/src/Actions/Concerns/HasView.php @@ -0,0 +1,20 @@ +view = $view; + + return $this; + } + + public function getView(): string + { + return $this->view; + } +} diff --git a/packages/tables/src/Actions/IconButtonAction.php b/packages/tables/src/Actions/IconButtonAction.php new file mode 100644 index 0000000000..77c139239d --- /dev/null +++ b/packages/tables/src/Actions/IconButtonAction.php @@ -0,0 +1,10 @@ +name($name); + } + + public static function make(string $name): static + { + $static = new static($name); + $static->setUp(); + + return $static; + } + + protected function setUp(): void + { + } + + public function toHtml(): string + { + return $this->render()->render(); + } + + public function render(): View + { + return view($this->getView(), array_merge($this->data(), [ + 'action' => $this, + ])); + } +} diff --git a/packages/tables/src/Actions/Modal/Actions/ButtonAction.php b/packages/tables/src/Actions/Modal/Actions/ButtonAction.php new file mode 100644 index 0000000000..860616421f --- /dev/null +++ b/packages/tables/src/Actions/Modal/Actions/ButtonAction.php @@ -0,0 +1,24 @@ +iconPosition = $position; + + return $this; + } + + public function getIconPosition(): ?string + { + return $this->iconPosition; + } +} diff --git a/packages/tables/src/Actions/Modal/Actions/Concerns/CanCancelAction.php b/packages/tables/src/Actions/Modal/Actions/Concerns/CanCancelAction.php new file mode 100644 index 0000000000..cb8c7c67fb --- /dev/null +++ b/packages/tables/src/Actions/Modal/Actions/Concerns/CanCancelAction.php @@ -0,0 +1,20 @@ +canCancelAction = $condition; + + return $this; + } + + public function canCancelAction(): bool + { + return $this->canCancelAction; + } +} diff --git a/packages/tables/src/Actions/Modal/Actions/Concerns/CanSubmitForm.php b/packages/tables/src/Actions/Modal/Actions/Concerns/CanSubmitForm.php new file mode 100644 index 0000000000..51f6a2737e --- /dev/null +++ b/packages/tables/src/Actions/Modal/Actions/Concerns/CanSubmitForm.php @@ -0,0 +1,20 @@ +canSubmitForm = $condition; + + return $this; + } + + public function canSubmitForm(): bool + { + return $this->canSubmitForm; + } +} diff --git a/packages/tables/src/Actions/Modal/Actions/Concerns/HasAction.php b/packages/tables/src/Actions/Modal/Actions/Concerns/HasAction.php new file mode 100644 index 0000000000..270c242c94 --- /dev/null +++ b/packages/tables/src/Actions/Modal/Actions/Concerns/HasAction.php @@ -0,0 +1,20 @@ +action = $action; + + return $this; + } + + public function getAction(): string | null + { + return $this->action; + } +} diff --git a/packages/tables/src/Actions/Modal/Actions/Concerns/HasColor.php b/packages/tables/src/Actions/Modal/Actions/Concerns/HasColor.php new file mode 100644 index 0000000000..550c9d8388 --- /dev/null +++ b/packages/tables/src/Actions/Modal/Actions/Concerns/HasColor.php @@ -0,0 +1,20 @@ +color = $color; + + return $this; + } + + public function getColor(): ?string + { + return $this->color; + } +} diff --git a/packages/tables/src/Actions/Modal/Actions/Concerns/HasIcon.php b/packages/tables/src/Actions/Modal/Actions/Concerns/HasIcon.php new file mode 100644 index 0000000000..1579d6930a --- /dev/null +++ b/packages/tables/src/Actions/Modal/Actions/Concerns/HasIcon.php @@ -0,0 +1,20 @@ +icon = $icon; + + return $this; + } + + public function getIcon(): ?string + { + return $this->icon; + } +} diff --git a/packages/tables/src/Actions/Modal/Actions/Concerns/HasLabel.php b/packages/tables/src/Actions/Modal/Actions/Concerns/HasLabel.php new file mode 100644 index 0000000000..cab287672d --- /dev/null +++ b/packages/tables/src/Actions/Modal/Actions/Concerns/HasLabel.php @@ -0,0 +1,26 @@ +label = $label; + + return $this; + } + + public function getLabel(): string + { + return $this->label ?? (string) Str::of($this->getName()) + ->before('.') + ->kebab() + ->replace(['-', '_'], ' ') + ->ucfirst(); + } +} diff --git a/packages/tables/src/Actions/Modal/Actions/Concerns/HasName.php b/packages/tables/src/Actions/Modal/Actions/Concerns/HasName.php new file mode 100644 index 0000000000..832dfcf099 --- /dev/null +++ b/packages/tables/src/Actions/Modal/Actions/Concerns/HasName.php @@ -0,0 +1,20 @@ +name = $name; + + return $this; + } + + public function getName(): string + { + return $this->name; + } +} diff --git a/packages/tables/src/Actions/Modal/Actions/Concerns/HasView.php b/packages/tables/src/Actions/Modal/Actions/Concerns/HasView.php new file mode 100644 index 0000000000..5ad243fcc0 --- /dev/null +++ b/packages/tables/src/Actions/Modal/Actions/Concerns/HasView.php @@ -0,0 +1,20 @@ +view = $view; + + return $this; + } + + public function getView(): string + { + return $this->view; + } +} diff --git a/packages/tables/src/Columns/BadgeColumn.php b/packages/tables/src/Columns/BadgeColumn.php new file mode 100644 index 0000000000..18ee479371 --- /dev/null +++ b/packages/tables/src/Columns/BadgeColumn.php @@ -0,0 +1,11 @@ +falseIcon($icon); + $this->falseColor($color); + + return $this; + } + + public function falseColor(?string $color): static + { + $this->falseColor = $color; + + return $this; + } + + public function falseIcon(?string $icon): static + { + $this->falseIcon = $icon; + + return $this; + } + + public function true(?string $icon = null, ?string $color = null): static + { + $this->trueIcon($icon); + $this->trueColor($color); + + return $this; + } + + public function trueColor(?string $color): static + { + $this->trueColor = $color; + + return $this; + } + + public function trueIcon(?string $icon): static + { + $this->trueIcon = $icon; + + return $this; + } + + public function getFalseColor(): ?string + { + return $this->falseColor; + } + + public function getFalseIcon(): ?string + { + return $this->falseIcon; + } + + public function getStateColor(): ?string + { + $state = $this->getState(); + + if ($state === null) { + return null; + } + + return $state ? $this->getTrueColor() : $this->getFalseColor(); + } + + public function getStateIcon(): ?string + { + $state = $this->getState(); + + if ($state === null) { + return null; + } + + return $state ? $this->getTrueIcon() : $this->getFalseIcon(); + } + + public function getTrueColor(): ?string + { + return $this->trueColor; + } + + public function getTrueIcon(): ?string + { + return $this->trueIcon; + } +} diff --git a/packages/tables/src/Columns/Column.php b/packages/tables/src/Columns/Column.php new file mode 100644 index 0000000000..57a996ac26 --- /dev/null +++ b/packages/tables/src/Columns/Column.php @@ -0,0 +1,58 @@ +name($name); + } + + public static function make(string $name): static + { + $static = new static($name); + $static->setUp(); + + return $static; + } + + protected function setUp(): void + { + } + + public function toHtml(): string + { + return $this->render()->render(); + } + + public function render(): View + { + return view($this->getView(), array_merge($this->data(), [ + 'column' => $this, + ])); + } +} diff --git a/packages/tables/src/Columns/Concerns/BelongsToTable.php b/packages/tables/src/Columns/Concerns/BelongsToTable.php new file mode 100644 index 0000000000..3c30594e51 --- /dev/null +++ b/packages/tables/src/Columns/Concerns/BelongsToTable.php @@ -0,0 +1,28 @@ +table = $table; + + return $this; + } + + public function getTable(): Table + { + return $this->table; + } + + public function getLivewire(): HasTable + { + return $this->getTable()->getLivewire(); + } +} diff --git a/packages/tables/src/Columns/Concerns/CanBeHidden.php b/packages/tables/src/Columns/Concerns/CanBeHidden.php new file mode 100644 index 0000000000..4b53d2d738 --- /dev/null +++ b/packages/tables/src/Columns/Concerns/CanBeHidden.php @@ -0,0 +1,48 @@ +isHidden = $condition; + + return $this; + } + + public function hiddenFrom(string $breakpoint): static + { + $this->hiddenFrom = $breakpoint; + + return $this; + } + + public function visibleFrom(string $breakpoint): static + { + $this->visibleFrom = $breakpoint; + + return $this; + } + + public function getHiddenFrom(): ?string + { + return $this->hiddenFrom; + } + + public function getVisibleFrom(): ?string + { + return $this->visibleFrom; + } + + public function isHidden(): bool + { + return $this->isHidden; + } +} diff --git a/packages/tables/src/Columns/Concerns/CanBeSearchable.php b/packages/tables/src/Columns/Concerns/CanBeSearchable.php new file mode 100644 index 0000000000..34e38fbbf2 --- /dev/null +++ b/packages/tables/src/Columns/Concerns/CanBeSearchable.php @@ -0,0 +1,40 @@ +isSearchable = true; + $this->searchColumns = $condition; + } else { + $this->isSearchable = $condition; + $this->searchColumns = null; + } + + return $this; + } + + public function getSearchColumns(): array + { + return $this->searchColumns ?? $this->getDefaultSearchColumns(); + } + + public function isSearchable(): bool + { + return $this->isSearchable; + } + + protected function getDefaultSearchColumns(): array + { + return [Str::of($this->getName())->afterLast('.')]; + } +} diff --git a/packages/tables/src/Columns/Concerns/CanBeSortable.php b/packages/tables/src/Columns/Concerns/CanBeSortable.php new file mode 100644 index 0000000000..aa2d008006 --- /dev/null +++ b/packages/tables/src/Columns/Concerns/CanBeSortable.php @@ -0,0 +1,40 @@ +isSortable = true; + $this->sortColumns = $condition; + } else { + $this->isSortable = $condition; + $this->sortColumns = null; + } + + return $this; + } + + public function getSortColumns(): array + { + return $this->sortColumns ?? $this->getDefaultSortColumns(); + } + + public function isSortable(): bool + { + return $this->isSortable; + } + + protected function getDefaultSortColumns(): array + { + return [Str::of($this->getName())->afterLast('.')]; + } +} diff --git a/packages/tables/src/Columns/Concerns/CanCallAction.php b/packages/tables/src/Columns/Concerns/CanCallAction.php new file mode 100644 index 0000000000..dc740f8726 --- /dev/null +++ b/packages/tables/src/Columns/Concerns/CanCallAction.php @@ -0,0 +1,36 @@ +action = $action; + + return $this; + } + + public function callAction() + { + $action = $this->getAction(); + + if (! $action instanceof Closure) { + return; + } + + return app()->call($action, [ + 'livewire' => $this->getLivewire(), + 'record' => $this->getRecord(), + ]); + } + + public function getAction(): string | callable | null + { + return $this->action; + } +} diff --git a/packages/tables/src/Columns/Concerns/CanFormatState.php b/packages/tables/src/Columns/Concerns/CanFormatState.php new file mode 100644 index 0000000000..d2be883d6a --- /dev/null +++ b/packages/tables/src/Columns/Concerns/CanFormatState.php @@ -0,0 +1,76 @@ +formatStateUsing(fn ($state): ?string => $state ? Carbon::parse($state)->translatedFormat($format) : null); + + return $this; + } + + public function dateTime(string $format = 'M j, Y H:i:s'): static + { + $this->date($format); + + return $this; + } + + public function enum(array $options, $default = null): static + { + $this->formatStateUsing(fn ($state): string => $options[$state] ?? ($default ?? $state)); + + return $this; + } + + public function limit(int $length = 100, string $end = '...'): static + { + $this->formatStateUsing(fn ($state): string => Str::limit($state, $length, $end)); + + return $this; + } + + public function formatStateUsing(callable $callback): static + { + $this->formatStateUsing = $callback; + + return $this; + } + + public function money(string $currency = 'usd', bool $shouldConvert = false): static + { + $this->formatStateUsing(function ($state) use ($currency, $shouldConvert): string { + return (new Money\Money( + $state, + (new Money\Currency(strtoupper($currency))), + $shouldConvert, + ))->format(); + }); + + return $this; + } + + public function getFormattedState() + { + $state = $this->getState(); + + if ($this->formatStateUsing instanceof Closure) { + $state = app()->call($this->formatStateUsing, [ + 'livewire' => $this->getLivewire(), + 'record' => $this->getRecord(), + 'state' => $state, + ]); + } + + return $state; + } +} diff --git a/packages/tables/src/Columns/Concerns/CanOpenUrl.php b/packages/tables/src/Columns/Concerns/CanOpenUrl.php new file mode 100644 index 0000000000..883d9b8796 --- /dev/null +++ b/packages/tables/src/Columns/Concerns/CanOpenUrl.php @@ -0,0 +1,46 @@ +shouldOpenUrlInNewTab = $condition; + + return $this; + } + + public function url(string | callable | null $url, bool $shouldOpenInNewTab = false): static + { + $this->shouldOpenUrlInNewTab = $shouldOpenInNewTab; + $this->url = $url; + + return $this; + } + + public function getUrl(): ?string + { + $record = $this->getRecord(); + + if ($this->url instanceof Closure) { + return app()->call($this->url, [ + 'livewire' => $this->getLivewire(), + 'record' => $record, + ]); + } + + return $this->url ?? $this->getTable()->getRecordUrl($record); + } + + public function shouldOpenUrlInNewTab(): bool + { + return $this->shouldOpenUrlInNewTab; + } +} diff --git a/packages/tables/src/Columns/Concerns/HasColors.php b/packages/tables/src/Columns/Concerns/HasColors.php new file mode 100644 index 0000000000..ac2aebc4bd --- /dev/null +++ b/packages/tables/src/Columns/Concerns/HasColors.php @@ -0,0 +1,40 @@ +colors = $colors; + + return $this; + } + + public function getStateColor(): ?string + { + $state = $this->getState(); + $stateColor = null; + + foreach ($this->getColors() as $color => $condition) { + if (is_numeric($color)) { + $stateColor = $condition; + } elseif ($condition instanceof Closure && $condition($state)) { + $stateColor = $color; + } elseif ($condition === $state) { + $stateColor = $color; + } + } + + return $stateColor; + } + + public function getColors(): array + { + return $this->colors; + } +} diff --git a/packages/tables/src/Columns/Concerns/HasLabel.php b/packages/tables/src/Columns/Concerns/HasLabel.php new file mode 100644 index 0000000000..6715d9557b --- /dev/null +++ b/packages/tables/src/Columns/Concerns/HasLabel.php @@ -0,0 +1,26 @@ +label = $label; + + return $this; + } + + public function getLabel(): string + { + return $this->label ?? (string) Str::of($this->getName()) + ->before('.') + ->kebab() + ->replace(['-', '_'], ' ') + ->ucfirst(); + } +} diff --git a/packages/tables/src/Columns/Concerns/HasName.php b/packages/tables/src/Columns/Concerns/HasName.php new file mode 100644 index 0000000000..3fc7e6b706 --- /dev/null +++ b/packages/tables/src/Columns/Concerns/HasName.php @@ -0,0 +1,20 @@ +name = $name; + + return $this; + } + + public function getName(): string + { + return $this->name; + } +} diff --git a/packages/tables/src/Columns/Concerns/HasRecord.php b/packages/tables/src/Columns/Concerns/HasRecord.php new file mode 100644 index 0000000000..0065c8a07c --- /dev/null +++ b/packages/tables/src/Columns/Concerns/HasRecord.php @@ -0,0 +1,22 @@ +record = $record; + + return $this; + } + + public function getRecord(): ?Model + { + return $this->record; + } +} diff --git a/packages/tables/src/Columns/Concerns/HasState.php b/packages/tables/src/Columns/Concerns/HasState.php new file mode 100644 index 0000000000..bcdac31af2 --- /dev/null +++ b/packages/tables/src/Columns/Concerns/HasState.php @@ -0,0 +1,50 @@ +getStateUsing = $callback; + + return $this; + } + + public function default($state): static + { + $this->defaultState = $state; + + return $this; + } + + public function getDefaultState() + { + return $this->defaultState; + } + + public function getState() + { + if ($this->getStateUsing instanceof Closure) { + $state = app()->call($this->getStateUsing, [ + 'livewire' => $this->getLivewire(), + 'record' => $this->getRecord(), + ]); + } else { + $state = Arr::get($this->getRecord(), $this->getName()); + } + + if ($state === null) { + return value($this->getDefaultState()); + } + + return $state; + } +} diff --git a/packages/tables/src/Columns/Concerns/HasView.php b/packages/tables/src/Columns/Concerns/HasView.php new file mode 100644 index 0000000000..02912bd566 --- /dev/null +++ b/packages/tables/src/Columns/Concerns/HasView.php @@ -0,0 +1,20 @@ +view = $view; + + return $this; + } + + public function getView(): string + { + return $this->view; + } +} diff --git a/packages/tables/src/Columns/Concerns/InteractsWithTableQuery.php b/packages/tables/src/Columns/Concerns/InteractsWithTableQuery.php new file mode 100644 index 0000000000..b3b6b012b6 --- /dev/null +++ b/packages/tables/src/Columns/Concerns/InteractsWithTableQuery.php @@ -0,0 +1,124 @@ +isHidden()) { + return $query; + } + + if ($this->queriesRelationships()) { + $query->with([$this->getRelationshipName()]); + } + + return $query; + } + + public function applySearchConstraint(Builder $query, string $searchQuery, bool &$isFirst): Builder + { + if ($this->isHidden()) { + return $query; + } + + if (! $this->isSearchable()) { + return $query; + } + + $searchOperator = match ($query->getConnection()->getDriverName()) { + 'pgsql' => 'ilike', + default => 'like', + }; + + foreach ($this->getSearchColumns() as $searchColumnName) { + if ($this->queriesRelationships()) { + $query->{$isFirst ? 'whereHas' : 'orWhereHas'}( + $this->getRelationshipName(), + fn ($query) => $query->where( + $searchColumnName, + $searchOperator, + "%{$searchQuery}%", + ), + ); + } else { + $query->{$isFirst ? 'where' : 'orWhere'}( + $searchColumnName, + $searchOperator, + "%{$searchQuery}%" + ); + } + + $isFirst = false; + } + + return $query; + } + + public function applySort(Builder $query, string $direction = 'asc'): Builder + { + if ($this->isHidden()) { + return $query; + } + + if (! $this->isSortable()) { + return $query; + } + + foreach (array_reverse($this->getSortColumns()) as $sortColumnName) { + if ($this->queriesRelationships()) { + $relatedModel = $this->getRelatedModel($query); + $relationship = $this->getRelationship($query); + + $query->orderBy( + $relatedModel + ->query() + ->select($sortColumnName) + ->whereColumn( + "{$relatedModel->getTable()}.{$relationship->getOwnerKeyName()}", + "{$this->getQueryModel($query)->getTable()}.{$relationship->getForeignKeyName()}", + ), + $direction, + ); + } else { + $query->orderBy( + $sortColumnName, + $direction, + ); + } + } + + return $query; + } + + public function queriesRelationships(): bool + { + return Str::of($this->getName())->contains('.'); + } + + protected function getRelatedModel(Builder $query): Model + { + return $this->getRelationship($query)->getModel(); + } + + protected function getRelationship(Builder $query): Relation + { + return $this->getQueryModel($query)->{$this->getRelationshipName()}(); + } + + protected function getRelationshipName(): string + { + return (string) Str::of($this->getName())->beforeLast('.'); + } + + protected function getQueryModel(Builder $query): Model + { + return $query->getModel(); + } +} diff --git a/packages/tables/src/Columns/IconColumn.php b/packages/tables/src/Columns/IconColumn.php new file mode 100644 index 0000000000..629395fad6 --- /dev/null +++ b/packages/tables/src/Columns/IconColumn.php @@ -0,0 +1,51 @@ +options = $options; + + return $this; + } + + public function getStateIcon(): ?string + { + $state = $this->getState(); + $stateIcon = null; + + foreach ($this->getOptions() as $icon => $condition) { + if (is_numeric($icon)) { + $stateIcon = $condition; + } elseif ($condition instanceof Closure && $condition($state)) { + $stateIcon = $icon; + } elseif ($condition === $state) { + $stateIcon = $icon; + } + } + + return $stateIcon; + } + + public function getOptions(): array + { + $options = $this->options; + + if ($options instanceof Arrayable) { + $options = $options->toArray(); + } + + return $options; + } +} diff --git a/packages/tables/src/Columns/ImageColumn.php b/packages/tables/src/Columns/ImageColumn.php new file mode 100644 index 0000000000..ef59dee364 --- /dev/null +++ b/packages/tables/src/Columns/ImageColumn.php @@ -0,0 +1,129 @@ +disk(config('tables.default_filesystem_disk')); + } + + public function disk(string $disk): static + { + $this->disk = $disk; + + return $this; + } + + public function height(int | string | null $height): static + { + $this->height = $height; + + return $this; + } + + public function rounded(bool $condition = true): static + { + $this->isRounded = $condition; + + return $this; + } + + public function size(int | string $size): static + { + $this->width($size); + $this->height($size); + + return $this; + } + + public function width(int | string | null $width): static + { + $this->width = $width; + + return $this; + } + + public function getDisk(): Filesystem + { + return Storage::disk($this->getDiskName()); + } + + public function getDiskName(): string + { + return $this->disk ?? config('tables.default_filesystem_disk'); + } + + public function getHeight(): ?string + { + if ($this->height === null) { + return null; + } + + if (is_integer($this->height)) { + return "{$this->height}px"; + } + + return $this->height; + } + + public function getImagePath(): ?string + { + $state = $this->getState(); + + if (! $state) { + return null; + } + + if (filter_var($state, FILTER_VALIDATE_URL) !== false) { + return $state; + } + + $storage = $this->getDisk(); + + if ( + $storage->getDriver()->getAdapter() instanceof AwsS3Adapter && + $storage->getVisibility($state) === 'private' + ) { + return $storage->temporaryUrl( + $state, + now()->addMinutes(5), + ); + } + + return $storage->url($state); + } + + public function getWidth(): ?string + { + if ($this->width === null) { + return null; + } + + if (is_integer($this->width)) { + return "{$this->width}px"; + } + + return $this->width; + } + + public function isRounded() + { + return $this->isRounded; + } +} diff --git a/packages/tables/src/Columns/TextColumn.php b/packages/tables/src/Columns/TextColumn.php new file mode 100644 index 0000000000..3491025e5d --- /dev/null +++ b/packages/tables/src/Columns/TextColumn.php @@ -0,0 +1,10 @@ +fileExists($path)) { + $this->error("$path already exists, aborting."); + + return true; + } + } + + return false; + } + + protected function copyStubToApp(string $stub, string $targetPath, array $replacements = []): void + { + $filesystem = new Filesystem(); + + if (! $this->fileExists($stubPath = base_path("stubs/filament/{$stub}.stub"))) { + $stubPath = __DIR__ . "/../../../stubs/{$stub}.stub"; + } + + $stub = Str::of($filesystem->get($stubPath)); + + foreach ($replacements as $key => $replacement) { + $stub = $stub->replace("{{ {$key} }}", $replacement); + } + + $stub = (string) $stub; + + $this->writeFile($targetPath, $stub); + } + + protected function fileExists(string $path): bool + { + $filesystem = new Filesystem(); + + return $filesystem->exists($path); + } + + protected function writeFile(string $path, string $contents): void + { + $filesystem = new Filesystem(); + + $filesystem->ensureDirectoryExists( + (string) Str::of($path) + ->beforeLast('/'), + ); + + $filesystem->put($path, $contents); + } +} diff --git a/packages/tables/src/Commands/Concerns/CanValidateInput.php b/packages/tables/src/Commands/Concerns/CanValidateInput.php new file mode 100644 index 0000000000..53e5e0031c --- /dev/null +++ b/packages/tables/src/Commands/Concerns/CanValidateInput.php @@ -0,0 +1,31 @@ +validateInput(fn () => $this->ask($question), $field, ['required']); + } + + protected function validateInput(callable $callback, string $field, array $rules): string + { + $input = $callback(); + + $validator = Validator::make( + [$field => $input], + [$field => $rules], + ); + + if ($validator->fails()) { + $this->error($validator->errors()->first()); + + $input = $this->validateInput($callback, $field, $rules); + } + + return $input; + } +} diff --git a/packages/tables/src/Commands/InstallCommand.php b/packages/tables/src/Commands/InstallCommand.php new file mode 100644 index 0000000000..72fa270d89 --- /dev/null +++ b/packages/tables/src/Commands/InstallCommand.php @@ -0,0 +1,68 @@ +delete(resource_path('js/bootstrap.js')); + $filesystem->copyDirectory(__DIR__ . '/../../stubs/scaffolding', base_path()); + + $this->info('Scaffolding installed successfully.'); + + $this->comment('Please run `npm install && npm run dev` to compile your new assets.'); + + return static::SUCCESS; + } + + protected static function updateNpmPackages(bool $dev = true): void + { + if (! file_exists(base_path('package.json'))) { + return; + } + + $configurationKey = $dev ? 'devDependencies' : 'dependencies'; + + $packages = json_decode(file_get_contents(base_path('package.json')), true); + + $packages[$configurationKey] = static::updateNpmPackageArray( + array_key_exists($configurationKey, $packages) ? $packages[$configurationKey] : [] + ); + + ksort($packages[$configurationKey]); + + file_put_contents( + base_path('package.json'), + json_encode($packages, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT).PHP_EOL + ); + } + + protected static function updateNpmPackageArray(array $packages): array + { + return array_merge( + [ + '@alpinejs/trap' => '^3.4', + '@tailwindcss/forms' => '^0.3', + '@tailwindcss/typography' => '^0.4', + 'alpinejs' => '^3.4', + 'tailwindcss' => '^2.2', + ], + Arr::except($packages, [ + 'axios', + 'lodash', + ]), + ); + } +} diff --git a/packages/tables/src/Commands/MakeColumnCommand.php b/packages/tables/src/Commands/MakeColumnCommand.php new file mode 100644 index 0000000000..e740248562 --- /dev/null +++ b/packages/tables/src/Commands/MakeColumnCommand.php @@ -0,0 +1,68 @@ +argument('name') ?? $this->askRequired('Name (e.g. `StatusSwitcher`)', 'name')) + ->trim('/') + ->trim('\\') + ->trim(' ') + ->replace('/', '\\'); + $columnClass = (string) Str::of($column)->afterLast('\\'); + $columnNamespace = Str::of($column)->contains('\\') ? + (string) Str::of($column)->beforeLast('\\') : + ''; + + $view = Str::of($column) + ->prepend('tables\\columns\\') + ->explode('\\') + ->map(fn ($segment) => Str::kebab($segment)) + ->implode('.'); + + $path = app_path( + (string) Str::of($column) + ->prepend('Tables\\Columns\\') + ->replace('\\', '/') + ->append('.php'), + ); + $viewPath = resource_path( + (string) Str::of($view) + ->replace('.', '/') + ->prepend('views/') + ->append('.blade.php'), + ); + + if ($this->checkForCollision([ + $path, + ])) { + return static::INVALID; + } + + $this->copyStubToApp('Column', $path, [ + 'class' => $columnClass, + 'namespace' => 'App\\Tables\\Columns' . ($columnNamespace !== '' ? "\\{$columnNamespace}" : ''), + 'view' => $view, + ]); + + if (! $this->fileExists($viewPath)) { + $this->copyStubToApp('ColumnView', $viewPath); + } + + $this->info("Successfully created {$column}!"); + + return static::SUCCESS; + } +} diff --git a/packages/tables/src/Concerns/BelongsToLivewire.php b/packages/tables/src/Concerns/BelongsToLivewire.php new file mode 100644 index 0000000000..bc8008be24 --- /dev/null +++ b/packages/tables/src/Concerns/BelongsToLivewire.php @@ -0,0 +1,22 @@ +livewire = $livewire; + + return $this; + } + + public function getLivewire(): HasTable + { + return $this->livewire; + } +} diff --git a/packages/tables/src/Concerns/CanPaginateRecords.php b/packages/tables/src/Concerns/CanPaginateRecords.php new file mode 100644 index 0000000000..2a7c07b890 --- /dev/null +++ b/packages/tables/src/Concerns/CanPaginateRecords.php @@ -0,0 +1,49 @@ +resetPage(); + } + + protected function getTableRecordsPerPage(): int + { + return intval($this->tableRecordsPerPage); + } + + protected function getTableRecordsPerPageSelectOptions(): array + { + return [5, 10, 25, 50]; + } + + protected function getDefaultTableRecordsPerPageSelectOption(): int + { + return 10; + } + + protected function isTablePaginationEnabled(): bool + { + return true; + } + + protected function getTablePaginationPageName(): string + { + return $this->getIdentifiedTableQueryStringPropertyNameFor('page'); + } + + public function resetPage(?string $pageName = null): void + { + $this->livewireResetPage($pageName ?? $this->getTablePaginationPageName()); + } +} diff --git a/packages/tables/src/Concerns/CanSearchRecords.php b/packages/tables/src/Concerns/CanSearchRecords.php new file mode 100644 index 0000000000..f1d05e2d34 --- /dev/null +++ b/packages/tables/src/Concerns/CanSearchRecords.php @@ -0,0 +1,56 @@ +getCachedTableColumns() as $column) { + if (! $column->isSearchable()) { + continue; + } + + return true; + } + + return false; + } + + public function updatedTableSearchQuery(): void + { + $this->deselectAllTableRecords(); + + $this->resetPage(); + } + + protected function applySearchToTableQuery(Builder $query): Builder + { + $searchQuery = $this->getTableSearchQuery(); + + if ($searchQuery === '') { + return $query; + } + + foreach (explode(' ', $searchQuery) as $searchQueryWord) { + $query->where(function (Builder $query) use ($searchQueryWord) { + $isFirst = true; + + foreach ($this->getCachedTableColumns() as $column) { + $column->applySearchConstraint($query, $searchQueryWord, $isFirst); + } + }); + } + + return $query; + } + + protected function getTableSearchQuery(): string + { + return trim(strtolower($this->tableSearchQuery)); + } +} diff --git a/packages/tables/src/Concerns/CanSelectRecords.php b/packages/tables/src/Concerns/CanSelectRecords.php new file mode 100644 index 0000000000..2a4fb24891 --- /dev/null +++ b/packages/tables/src/Concerns/CanSelectRecords.php @@ -0,0 +1,139 @@ +selectedTableRecords = []; + } + + public function toggleSelectAllTableRecords(): void + { + $query = $this->getFilteredTableQuery(); + + $allRecords = $query->pluck($query->getModel()->getKeyName()); + + if ($allRecords->count() > $this->getSelectedTableRecordCount()) { + $this->selectedTableRecords = $allRecords->toArray(); + + return; + } + + $this->deselectAllTableRecords(); + } + + public function toggleSelectTableRecordsOnPage(): void + { + $pageRecords = $this->getTableRecords() + ->pluck($this->getTableQuery()->getModel()->getKeyName()) + ->toArray(); + + if (array_diff($pageRecords, $this->selectedTableRecords)) { + $this->selectTableRecords($pageRecords); + + return; + } + + $this->deselectTableRecords($pageRecords); + } + + public function toggleSelectTableRecord(string $record): void + { + if (! $this->isTableRecordSelected($record)) { + $this->selectTableRecord($record); + + return; + } + + $this->deselectTableRecord($record); + } + + public function areAllTableRecordsOnCurrentPageSelected(): bool + { + if (! $this->isTablePaginationEnabled()) { + $allRecordsCount = $this->getAllTableRecordsCount(); + $selectedRecordsCount = $this->getSelectedTableRecordCount(); + + return $allRecordsCount && ($allRecordsCount === $selectedRecordsCount); + } + + $pageRecords = $this->getTableRecords() + ->pluck($this->getTableQuery()->getModel()->getKeyName()) + ->toArray(); + + return (bool) ! array_diff($pageRecords, $this->selectedTableRecords); + } + + public function areAllTableRecordsSelected(): bool + { + $allRecordsCount = $this->getAllTableRecordsCount(); + $selectedRecordCount = $this->getSelectedTableRecordCount(); + + return (bool) $selectedRecordCount && ($allRecordsCount === $selectedRecordCount); + } + + public function getAllTableRecordsCount(): int + { + return $this->getFilteredTableQuery()->count(); + } + + public function getSelectedTableRecords(): Collection + { + return $this->getTableQuery()->find($this->selectedTableRecords); + } + + public function getSelectedTableRecordCount(): int + { + return count($this->selectedTableRecords); + } + + public function isTableRecordSelected(string $record): bool + { + return in_array($record, $this->selectedTableRecords); + } + + public function isTableSelectionEnabled(): bool + { + return (bool) count($this->getCachedTableBulkActions()); + } + + protected function deselectTableRecord(string $record): void + { + $key = array_search($record, $this->selectedTableRecords); + + unset($this->selectedTableRecords[$key]); + } + + protected function deselectTableRecords(array $records): void + { + foreach ($records as $record) { + if (! $this->isTableRecordSelected($record)) { + continue; + } + + $this->deselectTableRecord($record); + } + } + + protected function selectTableRecord(string $record): void + { + $this->selectedTableRecords[] = $record; + } + + protected function selectTableRecords(array $records): void + { + foreach ($records as $record) { + if ($this->isTableRecordSelected($record)) { + continue; + } + + $this->selectTableRecord($record); + } + } +} diff --git a/packages/tables/src/Concerns/CanSortRecords.php b/packages/tables/src/Concerns/CanSortRecords.php new file mode 100644 index 0000000000..27e09aa88d --- /dev/null +++ b/packages/tables/src/Concerns/CanSortRecords.php @@ -0,0 +1,77 @@ +tableSortColumn) { + if ($this->tableSortDirection === 'asc') { + $direction = 'desc'; + } elseif ($this->tableSortDirection === 'desc') { + $column = null; + $direction = null; + } else { + $direction = 'asc'; + } + } else { + $direction = 'asc'; + } + + $this->tableSortColumn = $column; + $this->tableSortDirection = $direction; + + $this->updatedTableSort(); + } + + public function getTableSortColumn(): ?string + { + return $this->tableSortColumn; + } + + public function getTableSortDirection(): ?string + { + return $this->tableSortDirection; + } + + protected function getDefaultTableSortColumn(): ?string + { + return null; + } + + protected function getDefaultTableSortDirection(): ?string + { + return null; + } + + public function updatedTableSort(): void + { + $this->resetPage(); + } + + protected function applySortingToTableQuery(Builder $query): Builder + { + $columnName = $this->tableSortColumn; + + if (! $columnName) { + return $query; + } + + $column = $this->getCachedTableColumn($columnName); + + if (! $column) { + return $query; + } + + $column->applySort($query, $this->tableSortDirection ?? 'asc'); + + return $query; + } +} diff --git a/packages/tables/src/Concerns/HasActions.php b/packages/tables/src/Concerns/HasActions.php new file mode 100644 index 0000000000..75bb4d0ed1 --- /dev/null +++ b/packages/tables/src/Concerns/HasActions.php @@ -0,0 +1,112 @@ +cachedTableActions = collect($this->getTableActions()) + ->filter(fn (Action $action): bool => ! $action->isHidden()) + ->mapWithKeys(function (Action $action): array { + $action->table($this->getCachedTable()); + + return [$action->getName() => $action]; + }) + ->toArray(); + } + + public function callMountedTableAction() + { + $action = $this->getMountedTableAction(); + + if (! $action) { + return; + } + + $data = $this->getMountedTableActionForm()->getState(); + + try { + return $action->record($this->getMountedTableActionRecord())->call($data); + } finally { + $this->dispatchBrowserEvent('close-modal', [ + 'id' => 'action', + ]); + } + } + + public function mountTableAction(string $name, ?string $record = null) + { + $this->mountedTableAction = $name; + + $action = $this->getMountedTableAction(); + + if (! $action) { + return; + } + + $this->mountedTableActionRecord = $record; + + $this->cacheForm('mountedTableActionForm'); + + app()->call($action->getMountUsing(), [ + 'action' => $action, + 'form' => $this->getMountedTableActionForm(), + 'record' => $this->getMountedTableActionRecord(), + ]); + + if (! $action->shouldOpenModal()) { + return $this->callMountedTableAction(); + } + + $this->dispatchBrowserEvent('open-modal', [ + 'id' => 'action', + ]); + } + + public function getCachedTableActions(): array + { + return $this->cachedTableActions; + } + + public function getMountedTableAction(): ?Action + { + if (! $this->mountedTableAction) { + return null; + } + + return $this->getCachedTableAction($this->mountedTableAction) ?? $this->getCachedTableEmptyStateAction($this->mountedTableAction) ?? $this->getCachedTableHeaderAction($this->mountedTableAction); + } + + public function getMountedTableActionForm(): ComponentContainer + { + return $this->mountedTableActionForm; + } + + public function getMountedTableActionRecord(): ?Model + { + return $this->resolveTableRecord($this->mountedTableActionRecord); + } + + protected function getCachedTableAction(string $name): ?Action + { + return $this->getCachedTableActions()[$name] ?? null; + } + + protected function getTableActions(): array + { + return []; + } +} diff --git a/packages/tables/src/Concerns/HasBulkActions.php b/packages/tables/src/Concerns/HasBulkActions.php new file mode 100644 index 0000000000..c757eab710 --- /dev/null +++ b/packages/tables/src/Concerns/HasBulkActions.php @@ -0,0 +1,102 @@ +cachedTableBulkActions = collect($this->getTableBulkActions()) + ->filter(fn (BulkAction $action): bool => ! $action->isHidden()) + ->mapWithKeys(function (BulkAction $action): array { + $action->table($this->getCachedTable()); + + return [$action->getName() => $action]; + }) + ->toArray(); + } + + public function callMountedTableBulkAction() + { + $action = $this->getMountedTableBulkAction(); + + if (! $action) { + return; + } + + $data = $this->getMountedTableBulkActionForm()->getState(); + + try { + return $action->records($this->getSelectedTableRecords())->call($data); + } finally { + $this->dispatchBrowserEvent('close-modal', [ + 'id' => 'bulk-action', + ]); + } + } + + public function mountTableBulkAction(string $name) + { + $this->mountedTableBulkAction = $name; + + $action = $this->getMountedTableBulkAction(); + + if (! $action) { + return; + } + + $this->cacheForm('mountedTableBulkActionForm'); + + app()->call($action->getMountUsing(), [ + 'action' => $action, + 'form' => $this->getMountedTableBulkActionForm(), + 'records' => $this->getSelectedTableRecords(), + ]); + + if (! $action->shouldOpenModal()) { + return $this->callMountedTableBulkAction(); + } + + $this->dispatchBrowserEvent('open-modal', [ + 'id' => 'bulk-action', + ]); + } + + public function getCachedTableBulkActions(): array + { + return $this->cachedTableBulkActions; + } + + public function getMountedTableBulkAction(): ?BulkAction + { + if (! $this->mountedTableBulkAction) { + return null; + } + + return $this->getCachedTableBulkAction($this->mountedTableBulkAction); + } + + public function getMountedTableBulkActionForm(): ComponentContainer + { + return $this->mountedTableBulkActionForm; + } + + protected function getCachedTableBulkAction(string $name): ?BulkAction + { + return $this->getCachedTableBulkActions()[$name] ?? null; + } + + protected function getTableBulkActions(): array + { + return []; + } +} diff --git a/packages/tables/src/Concerns/HasColumns.php b/packages/tables/src/Concerns/HasColumns.php new file mode 100644 index 0000000000..3c648600c9 --- /dev/null +++ b/packages/tables/src/Concerns/HasColumns.php @@ -0,0 +1,54 @@ +cachedTableColumns = collect($this->getTableColumns()) + ->filter(fn (Column $column): bool => ! $column->isHidden()) + ->mapWithKeys(function (Column $column): array { + $column->table($this->getCachedTable()); + + return [$column->getName() => $column]; + }) + ->toArray(); + } + + public function callTableColumnAction(string $name, string $recordKey) + { + $record = $this->resolveTableRecord($recordKey); + + if (! $record) { + return; + } + + $column = $this->getCachedTableColumn($name); + + if (! $column) { + return; + } + + return $column->record($record)->callAction(); + } + + public function getCachedTableColumns(): array + { + return $this->cachedTableColumns; + } + + protected function getCachedTableColumn(string $name): ?Column + { + return $this->getCachedTableColumns()[$name] ?? null; + } + + protected function getTableColumns(): array + { + return []; + } +} diff --git a/packages/tables/src/Concerns/HasContentFooter.php b/packages/tables/src/Concerns/HasContentFooter.php new file mode 100644 index 0000000000..440e98015d --- /dev/null +++ b/packages/tables/src/Concerns/HasContentFooter.php @@ -0,0 +1,13 @@ +cachedTableEmptyStateActions = collect($this->getTableEmptyStateActions()) + ->filter(fn (Action $action): bool => ! $action->isHidden()) + ->mapWithKeys(function (Action $action): array { + $action->table($this->getCachedTable()); + + return [$action->getName() => $action]; + }) + ->toArray(); + } + + public function getCachedTableEmptyStateActions(): array + { + return $this->cachedTableEmptyStateActions; + } + + protected function getCachedTableEmptyStateAction(string $name): ?Action + { + return $this->getCachedTableEmptyStateActions()[$name] ?? null; + } + + protected function getTableEmptyState(): ?View + { + return null; + } + + protected function getTableEmptyStateActions(): array + { + return []; + } + + protected function getTableEmptyStateDescription(): ?string + { + return null; + } + + protected function getTableEmptyStateHeading(): ?string + { + return null; + } + + protected function getTableEmptyStateIcon(): ?string + { + return null; + } +} diff --git a/packages/tables/src/Concerns/HasFilters.php b/packages/tables/src/Concerns/HasFilters.php new file mode 100644 index 0000000000..dd7c5a99a1 --- /dev/null +++ b/packages/tables/src/Concerns/HasFilters.php @@ -0,0 +1,92 @@ +cachedTableFilters = collect($this->getTableFilters()) + ->filter(fn (Filter $filter): bool => ! $filter->isHidden()) + ->mapWithKeys(function (Filter $filter): array { + $filter->table($this->getCachedTable()); + + return [$filter->getName() => $filter]; + }) + ->toArray(); + } + + public function getCachedTableFilters(): array + { + return $this->cachedTableFilters; + } + + public function getTableFiltersForm(): Forms\ComponentContainer + { + return $this->tableFiltersForm; + } + + public function isTableFilterable(): bool + { + return (bool) count($this->getCachedTableFilters()); + } + + public function updatedTableFilters(): void + { + $this->deselectAllTableRecords(); + + $this->resetPage(); + } + + protected function applyFiltersToTableQuery(Builder $query): Builder + { + $data = $this->getTableFiltersForm()->getState(); + + return $query->where(function (Builder $query) use ($data) { + foreach ($this->getCachedTableFilters() as $filter) { + $filter->apply( + $query, + $data[$filter->getName()] ?? [], + ); + } + }); + } + + protected function getTableFilters(): array + { + return []; + } + + protected function getTableFiltersFormColumns(): int | array + { + return 1; + } + + protected function getTableFiltersFormSchema(): array + { + return array_map( + fn (Filter $filter) => Forms\Components\Group::make() + ->schema($filter->getFormSchema()) + ->statePath($filter->getName()), + $this->getCachedTableFilters(), + ); + } + + protected function getTableFiltersFormWidth(): ?string + { + return match ($this->getTableFiltersFormColumns()) { + 2 => '2xl', + 3 => '4xl', + 4 => '6xl', + default => null, + }; + } +} diff --git a/packages/tables/src/Concerns/HasHeader.php b/packages/tables/src/Concerns/HasHeader.php new file mode 100644 index 0000000000..aab0bcba20 --- /dev/null +++ b/packages/tables/src/Concerns/HasHeader.php @@ -0,0 +1,54 @@ +cachedTableHeaderActions = collect($this->getTableHeaderActions()) + ->filter(fn (Action $action): bool => ! $action->isHidden()) + ->mapWithKeys(function (Action $action): array { + $action->table($this->getCachedTable()); + + return [$action->getName() => $action]; + }) + ->toArray(); + } + + public function getCachedTableHeaderActions(): array + { + return $this->cachedTableHeaderActions; + } + + protected function getCachedTableHeaderAction(string $name): ?Action + { + return $this->getCachedTableHeaderActions()[$name] ?? null; + } + + protected function getTableDescription(): ?string + { + return null; + } + + protected function getTableHeader(): ?View + { + return null; + } + + protected function getTableHeaderActions(): array + { + return []; + } + + protected function getTableHeading(): string | Closure | null + { + return null; + } +} diff --git a/packages/tables/src/Concerns/HasRecordAction.php b/packages/tables/src/Concerns/HasRecordAction.php new file mode 100644 index 0000000000..cbeb355d89 --- /dev/null +++ b/packages/tables/src/Concerns/HasRecordAction.php @@ -0,0 +1,13 @@ +getTableQuery(); + + $this->applyFiltersToTableQuery($query); + + $this->applySearchToTableQuery($query); + + return $query; + } + + public function getTableRecords(): Collection | LengthAwarePaginator + { + if ($this->records) { + return $this->records; + } + + $query = $this->getFilteredTableQuery(); + + foreach ($this->getCachedTableColumns() as $column) { + $column->applyEagreLoading($query); + } + + $this->applySortingToTableQuery($query); + + if ($this->isTablePaginationEnabled()) { + return $this->records = $query->paginate( + $this->getTableRecordsPerPage(), + ['*'], + $this->getTablePaginationPageName(), + )->onEachSide(1); + } else { + return $this->records = $query->get(); + } + } + + protected function resolveTableRecord(?string $key): ?Model + { + return $this->getTableQuery()->find($key); + } +} diff --git a/packages/tables/src/Concerns/InteractsWithTable.php b/packages/tables/src/Concerns/InteractsWithTable.php new file mode 100644 index 0000000000..017bd892d5 --- /dev/null +++ b/packages/tables/src/Concerns/InteractsWithTable.php @@ -0,0 +1,122 @@ +table = $this->getTable(); + + $this->cacheTableActions(); + $this->cacheTableBulkActions(); + $this->cacheTableEmptyStateActions(); + $this->cacheTableHeaderActions(); + + $this->cacheTableColumns(); + + $this->cacheTableFilters(); + + if ($this->tableFilters === null) { + $this->getTableFiltersForm()->fill(); + } + } + + public function mountInteractsWithTable(): void + { + if ($this->isTablePaginationEnabled()) { + $this->tableRecordsPerPage = $this->getDefaultTableRecordsPerPageSelectOption(); + } + + $this->tableSortColumn = $this->getDefaultTableSortColumn(); + $this->tableSortDirection = $this->getDefaultTableSortDirection(); + } + + protected function getCachedTable(): Table + { + return $this->table; + } + + protected function getTable(): Table + { + return $this->makeTable() + ->contentFooter($this->getTableContentFooter()) + ->description($this->getTableDescription()) + ->emptyState($this->getTableEmptyState()) + ->emptyStateDescription($this->getTableEmptyStateDescription()) + ->emptyStateHeading($this->getTableEmptyStateHeading()) + ->emptyStateIcon($this->getTableEmptyStateIcon()) + ->enablePagination($this->isTablePaginationEnabled()) + ->filtersFormWidth($this->getTableFiltersFormWidth()) + ->getRecordUrlUsing($this->getTableRecordUrlUsing()) + ->header($this->getTableHeader()) + ->heading($this->getTableHeading()) + ->recordsPerPageSelectOptions($this->getTableRecordsPerPageSelectOptions()); + } + + protected function getTableQueryStringIdentifier(): ?string + { + return null; + } + + protected function getIdentifiedTableQueryStringPropertyNameFor(string $property): string + { + if (filled($this->getTableQueryStringIdentifier())) { + return $this->getTableQueryStringIdentifier() . ucfirst($property); + } + + return $property; + } + + protected function getForms(): array + { + return $this->getTableForms(); + } + + protected function getTableForms(): array + { + return [ + 'form' => $this->makeForm() + ->schema($this->getFormSchema()) + ->model($this->getFormModel()), + 'mountedTableActionForm' => $this->makeForm() + ->schema(($action = $this->getMountedTableAction()) ? $action->getFormSchema() : []) + ->model($this->getMountedTableActionRecord() ?? $this->getTableQuery()->getModel()::class) + ->statePath('mountedTableActionData'), + 'mountedTableBulkActionForm' => $this->makeForm() + ->schema(($action = $this->getMountedTableBulkAction()) ? $action->getFormSchema() : []) + ->model($this->getTableQuery()->getModel()::class) + ->statePath('mountedTableBulkActionData'), + 'tableFiltersForm' => $this->makeForm() + ->schema($this->getTableFiltersFormSchema()) + ->columns($this->getTableFiltersFormColumns()) + ->statePath('tableFilters') + ->reactive(), + ]; + } + + protected function makeTable(): Table + { + return Table::make($this); + } +} diff --git a/packages/tables/src/Contracts/HasTable.php b/packages/tables/src/Contracts/HasTable.php new file mode 100644 index 0000000000..2d4516029b --- /dev/null +++ b/packages/tables/src/Contracts/HasTable.php @@ -0,0 +1,64 @@ +table = $table; + + return $this; + } + + public function getTable(): Table + { + return $this->table; + } + + public function getLivewire(): HasTable + { + return $this->getTable()->getLivewire(); + } +} diff --git a/packages/tables/src/Filters/Concerns/CanBeDefault.php b/packages/tables/src/Filters/Concerns/CanBeDefault.php new file mode 100644 index 0000000000..29c6bde282 --- /dev/null +++ b/packages/tables/src/Filters/Concerns/CanBeDefault.php @@ -0,0 +1,20 @@ +isDefault = $condition; + + return $this; + } + + public function isDefault(): bool + { + return $this->isDefault; + } +} diff --git a/packages/tables/src/Filters/Concerns/CanBeHidden.php b/packages/tables/src/Filters/Concerns/CanBeHidden.php new file mode 100644 index 0000000000..671573a6d0 --- /dev/null +++ b/packages/tables/src/Filters/Concerns/CanBeHidden.php @@ -0,0 +1,20 @@ +isHidden = $condition; + + return $this; + } + + public function isHidden(): bool + { + return $this->isHidden; + } +} diff --git a/packages/tables/src/Filters/Concerns/HasFormSchema.php b/packages/tables/src/Filters/Concerns/HasFormSchema.php new file mode 100644 index 0000000000..0a3b94c1c1 --- /dev/null +++ b/packages/tables/src/Filters/Concerns/HasFormSchema.php @@ -0,0 +1,26 @@ +formSchema = $schema; + + return $this; + } + + public function getFormSchema(): array + { + return $this->formSchema ?? [ + Checkbox::make('isActive') + ->label($this->getLabel()) + ->default($this->isDefault()), + ]; + } +} diff --git a/packages/tables/src/Filters/Concerns/HasLabel.php b/packages/tables/src/Filters/Concerns/HasLabel.php new file mode 100644 index 0000000000..aab181cd0f --- /dev/null +++ b/packages/tables/src/Filters/Concerns/HasLabel.php @@ -0,0 +1,26 @@ +label = $label; + + return $this; + } + + public function getLabel(): string + { + return $this->label ?? (string) Str::of($this->getName()) + ->before('.') + ->kebab() + ->replace(['-', '_'], ' ') + ->ucfirst(); + } +} diff --git a/packages/tables/src/Filters/Concerns/HasName.php b/packages/tables/src/Filters/Concerns/HasName.php new file mode 100644 index 0000000000..053d6de806 --- /dev/null +++ b/packages/tables/src/Filters/Concerns/HasName.php @@ -0,0 +1,20 @@ +name = $name; + + return $this; + } + + public function getName(): string + { + return $this->name; + } +} diff --git a/packages/tables/src/Filters/Concerns/InteractsWithTableQuery.php b/packages/tables/src/Filters/Concerns/InteractsWithTableQuery.php new file mode 100644 index 0000000000..a629f71c3a --- /dev/null +++ b/packages/tables/src/Filters/Concerns/InteractsWithTableQuery.php @@ -0,0 +1,43 @@ +isHidden()) { + return $query; + } + + if (! $this->hasQueryModificationCallback()) { + return $query; + } + + if (! ($data['isActive'] ?? true)) { + return $query; + } + + $callback = $this->modifyQueryUsing; + $callback($query, $data); + + return $query; + } + + public function query(callable $callback): static + { + $this->modifyQueryUsing = $callback; + + return $this; + } + + protected function hasQueryModificationCallback(): bool + { + return $this->modifyQueryUsing instanceof Closure; + } +} diff --git a/packages/tables/src/Filters/Filter.php b/packages/tables/src/Filters/Filter.php new file mode 100644 index 0000000000..5c9d243a7e --- /dev/null +++ b/packages/tables/src/Filters/Filter.php @@ -0,0 +1,38 @@ +name($name); + } + + public static function make(string $name): static + { + $static = new static($name); + $static->setUp(); + + return $static; + } + + protected function setUp(): void + { + } +} diff --git a/packages/tables/src/Filters/SelectFilter.php b/packages/tables/src/Filters/SelectFilter.php new file mode 100644 index 0000000000..f82b1fdfcb --- /dev/null +++ b/packages/tables/src/Filters/SelectFilter.php @@ -0,0 +1,81 @@ +isStatic) { + return $query; + } + + if ($this->hasQueryModificationCallback()) { + return parent::apply($query, $data); + } + + if (blank($data['value'])) { + return $query; + } + + $query->where($this->getColumn(), $data['value']); + + return $query; + } + + public function column(string $name): static + { + $this->column = $name; + + return $this; + } + + public function options(array | Arrayable $options): static + { + $this->options = $options; + + return $this; + } + + public function static(bool $condition = true): static + { + $this->isStatic = $condition; + + return $this; + } + + public function getColumn(): string + { + return $this->column ?? $this->getName(); + } + + public function getOptions(): array + { + $options = $this->options; + + if ($options instanceof Arrayable) { + $options = $options->toArray(); + } + + return $options; + } + + public function getFormSchema(): array + { + return $this->formSchema ?? [ + Select::make('value') + ->label($this->getLabel()) + ->options($this->getOptions()), + ]; + } +} diff --git a/packages/tables/src/Table.php b/packages/tables/src/Table.php new file mode 100644 index 0000000000..868d53bc3a --- /dev/null +++ b/packages/tables/src/Table.php @@ -0,0 +1,332 @@ +livewire($livewire); + } + + public static function make(HasTable $livewire): static + { + return new static($livewire); + } + + public function description(?string $description): static + { + $this->description = $description; + + return $this; + } + + public function emptyState(?View $view): static + { + $this->emptyState = $view; + + return $this; + } + + public function emptyStateDescription(?string $description): static + { + $this->emptyStateDescription = $description; + + return $this; + } + + public function emptyStateHeading(?string $heading): static + { + $this->emptyStateHeading = $heading; + + return $this; + } + + public function emptyStateIcon(?string $icon): static + { + $this->emptyStateIcon = $icon; + + return $this; + } + + public function enablePagination(bool $condition = true): static + { + $this->isPaginationEnabled = $condition; + + return $this; + } + + public function contentFooter(?View $view): static + { + $this->contentFooter = $view; + + return $this; + } + + public function filtersFormWidth(?string $width): static + { + $this->filtersFormWidth = $width; + + return $this; + } + + public function getRecordUrlUsing(?Closure $callback): static + { + $this->getRecordUrlUsing = $callback; + + return $this; + } + + public function header(?View $view): static + { + $this->header = $view; + + return $this; + } + + public function heading(string | Closure | null $heading): static + { + $this->heading = $heading; + + return $this; + } + + public function recordsPerPageSelectOptions(array $options): static + { + $this->recordsPerPageSelectOptions = $options; + + return $this; + } + + public function areAllRecordsOnCurrentPageSelected(): bool + { + return $this->getLivewire()->areAllTableRecordsOnCurrentPageSelected(); + } + + public function areAllRecordsSelected(): bool + { + return $this->getLivewire()->areAllTableRecordsSelected(); + } + + public function getActions(): array + { + return $this->getLivewire()->getCachedTableActions(); + } + + public function getAllRecordsCount(): int + { + return $this->getLivewire()->getAllTableRecordsCount(); + } + + public function getBulkActions(): array + { + return $this->getLivewire()->getCachedTableBulkActions(); + } + + public function getColumns(): array + { + return $this->getLivewire()->getCachedTableColumns(); + } + + public function getContentFooter(): ?View + { + return $this->contentFooter; + } + + public function getDescription(): ?string + { + return $this->description; + } + + public function getEmptyState(): ?View + { + return $this->emptyState; + } + + public function getEmptyStateActions(): array + { + return $this->getLivewire()->getCachedTableEmptyStateActions(); + } + + public function getEmptyStateDescription(): ?string + { + return $this->emptyStateDescription; + } + + public function getEmptyStateHeading(): string + { + return $this->emptyStateHeading ?? __('tables::table.empty.heading'); + } + + public function getEmptyStateIcon(): string + { + return $this->emptyStateIcon ?? 'heroicon-o-x'; + } + + public function getFilters(): array + { + return $this->getLivewire()->getCachedTableFilters(); + } + + public function getFiltersForm(): ComponentContainer + { + return $this->getLivewire()->getTableFiltersForm(); + } + + public function getFiltersFormWidth(): ?string + { + return $this->filtersFormWidth; + } + + public function getHeader(): ?View + { + return $this->header; + } + + public function getHeaderActions(): array + { + return $this->getLivewire()->getCachedTableHeaderActions(); + } + + public function getHeading(): ?string + { + return value($this->heading); + } + + public function getMountedAction(): ?Action + { + return $this->getLivewire()->getMountedTableAction(); + } + + public function getMountedActionForm(): ComponentContainer + { + return $this->getLivewire()->getMountedTableActionForm(); + } + + public function getMountedBulkAction(): ?BulkAction + { + return $this->getLivewire()->getMountedTableBulkAction(); + } + + public function getMountedBulkActionForm(): ComponentContainer + { + return $this->getLivewire()->getMountedTableBulkActionForm(); + } + + public function getRecords(): Collection | LengthAwarePaginator + { + return $this->getLivewire()->getTableRecords(); + } + + public function getRecordsPerPageSelectOptions(): array + { + return $this->recordsPerPageSelectOptions; + } + + public function getRecordUrl(Model $record): ?string + { + $callback = $this->getRecordUrlUsing; + + if (! $callback) { + return null; + } + + return $callback($record); + } + + public function getSelectedRecordCount(): int + { + return $this->getLivewire()->getSelectedTableRecordCount(); + } + + public function getSortColumn(): ?string + { + return $this->getLivewire()->getTableSortColumn(); + } + + public function getSortDirection(): ?string + { + return $this->getLivewire()->getTableSortDirection(); + } + + public function isFilterable(): bool + { + return $this->getLivewire()->isTableFilterable(); + } + + public function isPaginationEnabled(): bool + { + return $this->isPaginationEnabled; + } + + public function isRecordSelected(string $record): bool + { + return $this->getLivewire()->isTableRecordSelected($record); + } + + public function isSelectionEnabled(): bool + { + return $this->getLivewire()->isTableSelectionEnabled(); + } + + public function isSearchable(): bool + { + return $this->getLivewire()->isTableSearchable(); + } + + public function toHtml(): string + { + return $this->render()->render(); + } + + public function render(): View + { + return view('tables::index', array_merge($this->data(), [ + 'table' => $this, + ])); + } +} diff --git a/packages/tables/src/TableComponent.php b/packages/tables/src/TableComponent.php new file mode 100644 index 0000000000..b49c22e6e3 --- /dev/null +++ b/packages/tables/src/TableComponent.php @@ -0,0 +1,11 @@ +name('tables') + ->hasCommands($this->getCommands()) + ->hasConfigFile() + ->hasTranslations() + ->hasViews(); + } + + protected function getCommands(): array + { + $commands = [ + Commands\InstallCommand::class, + Commands\MakeColumnCommand::class, + ]; + + $aliases = []; + + foreach ($commands as $command) { + $class = 'Filament\\Tables\\Commands\\Aliases\\' . class_basename($command); + + if (! class_exists($class)) { + continue; + } + + $aliases[] = $class; + } + + return array_merge($commands, $aliases); + } +} diff --git a/packages/tables/stubs/Column.stub b/packages/tables/stubs/Column.stub new file mode 100644 index 0000000000..16ec97b697 --- /dev/null +++ b/packages/tables/stubs/Column.stub @@ -0,0 +1,10 @@ + + {{ $getState() }} + diff --git a/packages/tables/stubs/scaffolding/resources/css/app.css b/packages/tables/stubs/scaffolding/resources/css/app.css new file mode 100644 index 0000000000..5fdcc74c06 --- /dev/null +++ b/packages/tables/stubs/scaffolding/resources/css/app.css @@ -0,0 +1,5 @@ +@import '../../vendor/filament/forms/dist/module.esm.css'; + +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/packages/tables/stubs/scaffolding/resources/js/app.js b/packages/tables/stubs/scaffolding/resources/js/app.js new file mode 100644 index 0000000000..04960a76b9 --- /dev/null +++ b/packages/tables/stubs/scaffolding/resources/js/app.js @@ -0,0 +1,10 @@ +import Alpine from 'alpinejs' +import FormsAlpinePlugin from '../../vendor/filament/forms/dist/module.esm' +import Trap from '@alpinejs/trap' + +Alpine.plugin(FormsAlpinePlugin) +Alpine.plugin(Trap) + +window.Alpine = Alpine + +Alpine.start() diff --git a/packages/tables/stubs/scaffolding/resources/views/layouts/app.blade.php b/packages/tables/stubs/scaffolding/resources/views/layouts/app.blade.php new file mode 100644 index 0000000000..1f2bdb9818 --- /dev/null +++ b/packages/tables/stubs/scaffolding/resources/views/layouts/app.blade.php @@ -0,0 +1,26 @@ + + + + + + + + + + {{ config('app.name') }} + + + + @livewireStyles + + + + @livewireScripts + + @stack('scripts') + + + + {{ $slot }} + + diff --git a/packages/tables/stubs/scaffolding/tailwind.config.js b/packages/tables/stubs/scaffolding/tailwind.config.js new file mode 100644 index 0000000000..71fe9c9608 --- /dev/null +++ b/packages/tables/stubs/scaffolding/tailwind.config.js @@ -0,0 +1,24 @@ +const colors = require('tailwindcss/colors') + +module.exports = { + mode: 'jit', + purge: [ + './resources/**/*.blade.php', + './vendor/filament/forms/resources/views/**/*.blade.php', + './vendor/filament/tables/resources/views/**/*.blade.php', + ], + theme: { + extend: { + colors: { + danger: colors.rose, + primary: colors.blue, + success: colors.green, + warning: colors.yellow, + }, + }, + }, + plugins: [ + require('@tailwindcss/forms'), + require('@tailwindcss/typography'), + ], +} diff --git a/packages/tables/stubs/scaffolding/webpack.mix.js b/packages/tables/stubs/scaffolding/webpack.mix.js new file mode 100644 index 0000000000..f816fa231d --- /dev/null +++ b/packages/tables/stubs/scaffolding/webpack.mix.js @@ -0,0 +1,7 @@ +const mix = require('laravel-mix') + +mix.js('resources/js/app.js', 'public/js') + .postCss('resources/css/app.css', 'public/css', [ + require('tailwindcss'), + ]) + .version() diff --git a/phpstan.neon b/phpstan.neon new file mode 100644 index 0000000000..f05edb640c --- /dev/null +++ b/phpstan.neon @@ -0,0 +1,6 @@ +parameters: + paths: + - packages/forms/src + - packages/spatie-laravel-media-library-plugin/src + - packages/spatie-laravel-tags-plugin/src + level: 5 diff --git a/phpunit.xml.dist b/phpunit.xml.dist new file mode 100644 index 0000000000..a07ca456f8 --- /dev/null +++ b/phpunit.xml.dist @@ -0,0 +1,30 @@ + + + + + + ./tests/ + + + + + + + + + + + + + diff --git a/tests/Pest.php b/tests/Pest.php new file mode 100644 index 0000000000..7cb960e0d7 --- /dev/null +++ b/tests/Pest.php @@ -0,0 +1,8 @@ +extend('toBeSameModel', function (Model $model) { + return $this + ->is($model)->toBeTrue(); +}); diff --git a/tests/database/factories/PostFactory.php b/tests/database/factories/PostFactory.php new file mode 100644 index 0000000000..e1078111c5 --- /dev/null +++ b/tests/database/factories/PostFactory.php @@ -0,0 +1,22 @@ + User::factory(), + 'content' => $this->faker->paragraph(), + 'tags' => $this->faker->words(), + 'title' => $this->faker->sentence(), + ]; + } +} diff --git a/tests/database/factories/UserFactory.php b/tests/database/factories/UserFactory.php new file mode 100644 index 0000000000..eb811e0847 --- /dev/null +++ b/tests/database/factories/UserFactory.php @@ -0,0 +1,23 @@ + $this->faker->name(), + 'email' => $this->faker->unique()->safeEmail(), + 'email_verified_at' => now(), + 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password + 'remember_token' => Str::random(10), + ]; + } +} diff --git a/tests/database/migrations/create_posts_table.php b/tests/database/migrations/create_posts_table.php new file mode 100644 index 0000000000..5a4fa29b92 --- /dev/null +++ b/tests/database/migrations/create_posts_table.php @@ -0,0 +1,24 @@ +id(); + $table->foreignId('author_id'); + $table->text('content')->nullable(); + $table->json('tags')->nullable(); + $table->string('title'); + $table->timestamps(); + }); + } + + public function down(): void + { + Schema::dropIfExists('posts'); + } +}; diff --git a/tests/database/migrations/create_users_table.php b/tests/database/migrations/create_users_table.php new file mode 100644 index 0000000000..2c9a716c57 --- /dev/null +++ b/tests/database/migrations/create_users_table.php @@ -0,0 +1,25 @@ +id(); + $table->string('name'); + $table->string('email')->unique(); + $table->timestamp('email_verified_at')->nullable(); + $table->string('password'); + $table->rememberToken(); + $table->timestamps(); + }); + } + + public function down(): void + { + Schema::dropIfExists('users'); + } +}; diff --git a/tests/src/Admin/Auth/LoginTest.php b/tests/src/Admin/Auth/LoginTest.php new file mode 100644 index 0000000000..b1db1dd39c --- /dev/null +++ b/tests/src/Admin/Auth/LoginTest.php @@ -0,0 +1,101 @@ +get(route('filament.auth.login'))->assertSuccessful(); +}); + +it('can authenticate', function () { + $this->assertGuest(); + + $userToAuthenticate = User::factory()->create(); + + livewire(Login::class) + ->set('email', $userToAuthenticate->email) + ->set('password', 'password') + ->call('authenticate') + ->assertRedirect(route('filament.pages.dashboard')); + + $this->assertAuthenticatedAs($userToAuthenticate); +}); + +it('can authenticate and redirect user to their intended URL', function () { + session()->put('url.intended', $intendedUrl = Str::random()); + + $userToAuthenticate = User::factory()->create(); + + livewire(Login::class) + ->set('email', $userToAuthenticate->email) + ->set('password', 'password') + ->call('authenticate') + ->assertRedirect($intendedUrl); +}); + +it('can redirect unauthenticated app requests', function () { + $this->get(route('filament.pages.dashboard'))->assertRedirect(route('filament.auth.login')); +}); + +it('cannot authenticate with incorrect credentials', function () { + $userToAuthenticate = User::factory()->create(); + + livewire(Login::class) + ->set('email', $userToAuthenticate->email) + ->set('password', 'incorrect-password') + ->call('authenticate') + ->assertHasErrors(['email']); + + $this->assertGuest(); +}); + +it('can throttle authentication attempts', function () { + $this->assertGuest(); + + $userToAuthenticate = User::factory()->create(); + + foreach (range(1, 5) as $i) { + livewire(Login::class) + ->set('email', $userToAuthenticate->email) + ->set('password', 'password') + ->call('authenticate'); + + $this->assertAuthenticated(); + + auth()->logout(); + } + + livewire(Login::class) + ->set('email', $userToAuthenticate->email) + ->set('password', 'password') + ->call('authenticate') + ->assertHasErrors(['email']); + + $this->assertGuest(); +}); + +it('can validate `email` is required', function () { + livewire(Login::class) + ->assertSet('email', '') + ->call('authenticate') + ->assertHasErrors(['email' => ['required']]); +}); + +it('can validate `email` is valid email', function () { + livewire(Login::class) + ->set('email', 'invalid-email') + ->call('authenticate') + ->assertHasErrors(['email' => ['email']]); +}); + +it('can validate `password` is required', function () { + livewire(Login::class) + ->assertSet('password', '') + ->call('authenticate') + ->assertHasErrors(['password' => ['required']]); +}); diff --git a/tests/src/Admin/Fixtures/Pages/Settings.php b/tests/src/Admin/Fixtures/Pages/Settings.php new file mode 100644 index 0000000000..3ebc69b8bd --- /dev/null +++ b/tests/src/Admin/Fixtures/Pages/Settings.php @@ -0,0 +1,9 @@ +schema([ + Forms\Components\TextInput::make('title')->required(), + Forms\Components\MarkdownEditor::make('content'), + Forms\Components\BelongsToSelect::make('author_id') + ->relationship('author', 'name') + ->required(), + Forms\Components\TagsInput::make('tags'), + ]); + } + + public static function table(Table $table): Table + { + return $table + ->columns([ + Tables\Columns\TextColumn::make('title'), + Tables\Columns\TextColumn::make('author.name'), + ]); + } + + public static function getPages(): array + { + return [ + 'index' => Pages\ListPosts::route('/'), + 'create' => Pages\CreatePost::route('/create'), + 'view' => Pages\ViewPost::route('/{record}'), + 'edit' => Pages\EditPost::route('/{record}/edit'), + ]; + } +} diff --git a/tests/src/Admin/Fixtures/Resources/PostResource/Pages/CreatePost.php b/tests/src/Admin/Fixtures/Resources/PostResource/Pages/CreatePost.php new file mode 100644 index 0000000000..9f8380238e --- /dev/null +++ b/tests/src/Admin/Fixtures/Resources/PostResource/Pages/CreatePost.php @@ -0,0 +1,11 @@ +toContain(Settings::class); +}); diff --git a/tests/src/Admin/Pages/TestCase.php b/tests/src/Admin/Pages/TestCase.php new file mode 100644 index 0000000000..1419b42e6d --- /dev/null +++ b/tests/src/Admin/Pages/TestCase.php @@ -0,0 +1,23 @@ +actingAs(User::factory()->create()); + } + + protected function getPackageProviders($app): array + { + return array_merge(parent::getPackageProviders($app), [ + PagesServiceProvider::class, + ]); + } +} diff --git a/tests/src/Admin/Resources/Pages/CreateRecordTest.php b/tests/src/Admin/Resources/Pages/CreateRecordTest.php new file mode 100644 index 0000000000..48cdd1b367 --- /dev/null +++ b/tests/src/Admin/Resources/Pages/CreateRecordTest.php @@ -0,0 +1,39 @@ +get(PostResource::getUrl('create'))->assertSuccessful(); +}); + +it('can create', function () { + $newData = Post::factory()->make(); + + livewire(PostResource\Pages\CreatePost::class) + ->set('data.author_id', $newData->author->getKey()) + ->set('data.content', $newData->content) + ->set('data.tags', $newData->tags) + ->set('data.title', $newData->title) + ->call('create'); + + $this->assertDatabaseHas(Post::class, [ + 'author_id' => $newData->author->getKey(), + 'content' => $newData->content, + 'tags' => json_encode($newData->tags), + 'title' => $newData->title, + ]); +}); + +it('can validate input', function () { + $newData = Post::factory()->make(); + + livewire(PostResource\Pages\CreatePost::class) + ->set('data.title', null) + ->call('create') + ->assertHasErrors(['data.title' => 'required']); +}); diff --git a/tests/src/Admin/Resources/Pages/EditRecordTest.php b/tests/src/Admin/Resources/Pages/EditRecordTest.php new file mode 100644 index 0000000000..277e8057f5 --- /dev/null +++ b/tests/src/Admin/Resources/Pages/EditRecordTest.php @@ -0,0 +1,65 @@ +get(PostResource::getUrl('edit', [ + 'record' => Post::factory()->create(), + ]))->assertSuccessful(); +}); + +it('can retrieve data', function () { + $post = Post::factory()->create(); + + livewire(PostResource\Pages\EditPost::class, [ + 'record' => $post->getKey(), + ]) + ->assertSet('data.author_id', $post->author->getKey()) + ->assertSet('data.content', $post->content) + ->assertSet('data.tags', $post->tags) + ->assertSet('data.title', $post->title); +}); + +it('can save', function () { + $post = Post::factory()->create(); + $newData = Post::factory()->make(); + + livewire(PostResource\Pages\EditPost::class, [ + 'record' => $post->getKey(), + ]) + ->set('data.author_id', $newData->author->getKey()) + ->set('data.content', $newData->content) + ->set('data.tags', $newData->tags) + ->set('data.title', $newData->title) + ->call('save'); + + expect($post->refresh()) + ->author->toBeSameModel($newData->author) + ->content->toBe($newData->content) + ->tags->toBe($newData->tags) + ->title->toBe($newData->title); +}); + +it('can validate input', function () { + $post = Post::factory()->create(); + $newData = Post::factory()->make(); + + livewire(PostResource\Pages\EditPost::class, [ + 'record' => $post->getKey(), + ]) + ->set('data.title', null) + ->call('save') + ->assertHasErrors(['data.title' => 'required']); +}); diff --git a/tests/src/Admin/Resources/Pages/ListRecordsTest.php b/tests/src/Admin/Resources/Pages/ListRecordsTest.php new file mode 100644 index 0000000000..dfcb4b102f --- /dev/null +++ b/tests/src/Admin/Resources/Pages/ListRecordsTest.php @@ -0,0 +1,10 @@ +get(PostResource::getUrl('index'))->assertSuccessful(); +}); diff --git a/tests/src/Admin/Resources/Pages/ViewRecordTest.php b/tests/src/Admin/Resources/Pages/ViewRecordTest.php new file mode 100644 index 0000000000..96fc20bb16 --- /dev/null +++ b/tests/src/Admin/Resources/Pages/ViewRecordTest.php @@ -0,0 +1,33 @@ +get(PostResource::getUrl('view', [ + 'record' => Post::factory()->create(), + ]))->assertSuccessful(); +}); + +it('can retrieve data', function () { + $post = Post::factory()->create(); + + livewire(PostResource\Pages\ViewPost::class, [ + 'record' => $post->getKey(), + ]) + ->assertSet('data.author_id', $post->author->getKey()) + ->assertSet('data.content', $post->content) + ->assertSet('data.tags', $post->tags) + ->assertSet('data.title', $post->title); +}); diff --git a/tests/src/Admin/Resources/RegistrationTest.php b/tests/src/Admin/Resources/RegistrationTest.php new file mode 100644 index 0000000000..ad5cdc5fd5 --- /dev/null +++ b/tests/src/Admin/Resources/RegistrationTest.php @@ -0,0 +1,12 @@ +toContain(PostResource::class); +}); diff --git a/tests/src/Admin/Resources/ResourceTest.php b/tests/src/Admin/Resources/ResourceTest.php new file mode 100644 index 0000000000..a6ed6ae18f --- /dev/null +++ b/tests/src/Admin/Resources/ResourceTest.php @@ -0,0 +1,59 @@ +toBeInstanceOf(Builder::class) + ->getModel()->toBeInstanceOf(Post::class); +}); + +it('can generate a slug based on the model name', function () { + expect(PostResource::getSlug()) + ->toBe('posts'); +}); + +it('can generate a label based on the model name', function () { + expect(PostResource::getLabel()) + ->toBe('post'); +}); + +it('can generate a plural label based on the model name', function () { + expect(PostResource::getPluralLabel()) + ->toBe('posts'); +}); + +it('can retrieve a record\'s title', function () { + $post = Post::factory()->create(); + + expect(PostResource::getRecordTitle($post)) + ->toBe($post->title); +}); + +it('can resolve record route binding', function () { + $post = Post::factory()->create(); + + expect(PostResource::resolveRecordRouteBinding($post->getKey())) + ->toBeSameModel($post); +}); + +it('can retrieve a page\'s URL', function () { + $post = Post::factory()->create(); + $resourceSlug = PostResource::getSlug(); + + expect(PostResource::getUrl('create')) + ->toContain($resourceSlug) + ->toContain('create'); + expect(PostResource::getUrl('edit', ['record' => $post])) + ->toContain($resourceSlug) + ->toContain(strval($post->getRouteKey())); + expect(PostResource::getUrl('index'))->toContain($resourceSlug); + expect(PostResource::getUrl('view', ['record' => $post])) + ->toContain($resourceSlug) + ->toContain(strval($post->getRouteKey())); +}); diff --git a/tests/src/Admin/Resources/ResourcesServiceProvider.php b/tests/src/Admin/Resources/ResourcesServiceProvider.php new file mode 100644 index 0000000000..7c22246513 --- /dev/null +++ b/tests/src/Admin/Resources/ResourcesServiceProvider.php @@ -0,0 +1,18 @@ +actingAs(User::factory()->create()); + } + + protected function getPackageProviders($app): array + { + return array_merge(parent::getPackageProviders($app), [ + ResourcesServiceProvider::class, + ]); + } +} diff --git a/tests/src/Forms/ComponentContainerTest.php b/tests/src/Forms/ComponentContainerTest.php new file mode 100644 index 0000000000..03c26ccf1a --- /dev/null +++ b/tests/src/Forms/ComponentContainerTest.php @@ -0,0 +1,97 @@ +getLivewire()->toBe($livewire); +}); + +it('has components', function () { + $components = []; + + foreach (range(1, $count = rand(2, 10)) as $i) { + $components[] = new Component(); + } + + $componentsBoundToContainer = ($container = ComponentContainer::make(Livewire::make())) + ->components($components) + ->getComponents(); + + expect($componentsBoundToContainer) + ->toHaveCount($count) + ->each( + fn ($component) => $component + ->toBeInstanceOf(Component::class) + ->getContainer()->toBe($container), + ); +}); + +it('belongs to parent component', function () { + $container = ComponentContainer::make(Livewire::make()) + ->parentComponent($component = new Component()); + + expect($container) + ->getParentComponent()->toBe($component); +}); + +it('can return a component by name and callback', function () { + $container = ComponentContainer::make(Livewire::make()) + ->components([ + $input = Field::make($statePath = Str::random()), + ]); + + expect($container) + ->getComponent($statePath)->toBe($input) + ->getComponent(fn (Component $component) => $component->getName() === $statePath)->toBe($input); +}); + +it('can return a flat array of components', function () { + $container = ComponentContainer::make(Livewire::make()) + ->components([ + $fieldset = Fieldset::make(Str::random()) + ->schema([ + $field = TextInput::make(Str::random()), + ]), + $section = Section::make(Str::random()), + ]); + + expect($container) + ->getFlatComponents() + ->toHaveCount(3) + ->toMatchArray([ + $fieldset, + $field, + $section, + ]); +}); + +it('can return a flat array of fields', function () { + $container = ComponentContainer::make(Livewire::make()) + ->components([ + Fieldset::make(Str::random()) + ->schema([ + $field = TextInput::make($name = Str::random()), + ]), + $section = Section::make(Str::random()), + ]); + + expect($container) + ->getFlatFields() + ->toHaveCount(1) + ->toMatchArray([ + $name => $field, + ]); +}); diff --git a/tests/src/Forms/ComponentTest.php b/tests/src/Forms/ComponentTest.php new file mode 100644 index 0000000000..2d9a1bc519 --- /dev/null +++ b/tests/src/Forms/ComponentTest.php @@ -0,0 +1,70 @@ +container($container = ComponentContainer::make(Livewire::make())); + + expect($component) + ->getContainer()->toBe($container); +}); + +it('can access container\'s Livewire component', function () { + $component = (new Component()) + ->container(ComponentContainer::make($livewire = Livewire::make())); + + expect($component) + ->getLivewire()->toBe($livewire); +}); + +it('has child components', function () { + $components = []; + + foreach (range(1, $count = rand(2, 10)) as $i) { + $components[] = new Component(); + } + + $componentsBoundToContainer = ($parentComponent = new Component()) + ->container(ComponentContainer::make(Livewire::make())) + ->childComponents($components) + ->getChildComponentContainer() + ->getComponents(); + + expect($componentsBoundToContainer) + ->toHaveCount($count) + ->each( + fn ($component) => $component + ->toBeInstanceOf(Component::class) + ->getContainer()->getParentComponent()->toBe($parentComponent), + ); +}); + +it('has a label', function () { + $component = (new Component()) + ->container(ComponentContainer::make(Livewire::make())) + ->label($label = Str::random()); + + expect($component) + ->getLabel()->toBe($label); +}); + +it('can have meta', function () { + $component = (new Component()) + ->meta('foo', 'bar') + ->meta('bob', 'baz'); + + expect($component) + ->hasMeta('foo')->toBeTrue() + ->getMeta('foo')->toBe('bar') + ->getMeta(['foo', 'bob'])->toEqual([ + 'foo' => 'bar', + 'bob' => 'baz', + ]); +}); diff --git a/tests/src/Forms/EventsTest.php b/tests/src/Forms/EventsTest.php new file mode 100644 index 0000000000..e002d53231 --- /dev/null +++ b/tests/src/Forms/EventsTest.php @@ -0,0 +1,26 @@ +expectExceptionMessage($event); + + ComponentContainer::make(Livewire::make()) + ->components([ + (new Component()) + ->registerListeners([ + $event => [ + fn () => throw new Exception($event), + ], + ]), + ]) + ->dispatchEvent($event); +}); diff --git a/tests/src/Forms/FieldTest.php b/tests/src/Forms/FieldTest.php new file mode 100644 index 0000000000..c0b92773de --- /dev/null +++ b/tests/src/Forms/FieldTest.php @@ -0,0 +1,40 @@ +container(ComponentContainer::make(Livewire::make())); + + expect($field) + ->getStatePath()->toBe($name); +}); + +it('sets its fallback label from its name', function () { + $field = (new Field($name = Str::random())) + ->container(ComponentContainer::make(Livewire::make())); + + expect($field) + ->getLabel()->toBe( + (string) Str::of($name) + ->afterLast('.') + ->kebab() + ->replace(['-', '_'], ' ') + ->ucfirst(), + ); +}); + +it('has state binding modifiers', function () { + $field = (new Field(Str::random())) + ->container(ComponentContainer::make(Livewire::make())) + ->stateBindingModifiers($modifiers = [Str::random(), Str::random()]); + + expect($field) + ->applyStateBindingModifiers($expression = Str::random())->toBe(implode('.', array_merge([$expression], $modifiers))); +}); diff --git a/tests/src/Forms/Fixtures/Livewire.php b/tests/src/Forms/Fixtures/Livewire.php new file mode 100644 index 0000000000..fa7ebb782a --- /dev/null +++ b/tests/src/Forms/Fixtures/Livewire.php @@ -0,0 +1,24 @@ +data; + } +} diff --git a/tests/src/Forms/GridTest.php b/tests/src/Forms/GridTest.php new file mode 100644 index 0000000000..3bee7f4ed1 --- /dev/null +++ b/tests/src/Forms/GridTest.php @@ -0,0 +1,110 @@ +columns([ + 'default' => $defaultColumns = rand(1, 12), + 'sm' => $columnsAtSm = rand(1, 12), + 'md' => $columnsAtMd = rand(1, 12), + 'lg' => $columnsAtLg = rand(1, 12), + 'xl' => $columnsAtXl = rand(1, 12), + '2xl' => $columnsAt2xl = rand(1, 12), + ]); + + expect($container) + ->getColumns() + ->toHaveKey('default', $defaultColumns) + ->toHaveKey('sm', $columnsAtSm) + ->toHaveKey('md', $columnsAtMd) + ->toHaveKey('lg', $columnsAtLg) + ->toHaveKey('xl', $columnsAtXl) + ->toHaveKey('2xl', $columnsAt2xl); +}); + +test('can get number of container columns at one breakpoint', function () { + $container = ComponentContainer::make(Livewire::make()) + ->columns([ + '2xl' => $columnsAt2xl = rand(1, 12), + ]); + + expect($container) + ->getColumns('2xl')->toBe($columnsAt2xl); +}); + +test('can get number of container columns from parent component', function () { + $container = ComponentContainer::make(Livewire::make()) + ->parentComponent((new Component())->columns([ + 'default' => $defaultColumns = rand(1, 12), + 'sm' => $columnsAtSm = rand(1, 12), + 'md' => $columnsAtMd = rand(1, 12), + 'lg' => $columnsAtLg = rand(1, 12), + 'xl' => $columnsAtXl = rand(1, 12), + '2xl' => $columnsAt2xl = rand(1, 12), + ])); + + expect($container) + ->getColumns() + ->toHaveKey('default', $defaultColumns) + ->toHaveKey('sm', $columnsAtSm) + ->toHaveKey('md', $columnsAtMd) + ->toHaveKey('lg', $columnsAtLg) + ->toHaveKey('xl', $columnsAtXl) + ->toHaveKey('2xl', $columnsAt2xl); +}); + +test('can set number of container columns at `lg` breakpoint', function () { + $container = ComponentContainer::make(Livewire::make()) + ->columns($columnsAtLg = rand(1, 12)); + + expect($container) + ->getColumns('lg')->toBe($columnsAtLg); +}); + +test('can get component column span at all breakpoints', function () { + $component = (new Component()) + ->container(ComponentContainer::make(Livewire::make())) + ->columnSpan([ + 'default' => $defaultSpan = rand(1, 12), + 'sm' => $spanAtSm = rand(1, 12), + 'md' => $spanAtMd = rand(1, 12), + 'lg' => $spanAtLg = rand(1, 12), + 'xl' => $spanAtXl = rand(1, 12), + '2xl' => $spanAt2xl = rand(1, 12), + ]); + + expect($component) + ->getColumnSpan() + ->toHaveKey('default', $defaultSpan) + ->toHaveKey('sm', $spanAtSm) + ->toHaveKey('md', $spanAtMd) + ->toHaveKey('lg', $spanAtLg) + ->toHaveKey('xl', $spanAtXl) + ->toHaveKey('2xl', $spanAt2xl); +}); + +test('can get component column span at one breakpoint', function () { + $component = (new Component()) + ->container(ComponentContainer::make(Livewire::make())) + ->columnSpan([ + '2xl' => $spanAt2xl = rand(1, 12), + ]); + + expect($component) + ->getColumnSpan('2xl')->toBe($spanAt2xl); +}); + +test('can set component column span at `default` breakpoint', function () { + $component = (new Component()) + ->container(ComponentContainer::make(Livewire::make())) + ->columnSpan($defaultSpan = rand(1, 12)); + + expect($component) + ->getColumnSpan('default')->toBe($defaultSpan); +}); diff --git a/tests/src/Forms/HiddenComponentsTest.php b/tests/src/Forms/HiddenComponentsTest.php new file mode 100644 index 0000000000..f72df52231 --- /dev/null +++ b/tests/src/Forms/HiddenComponentsTest.php @@ -0,0 +1,99 @@ +container(ComponentContainer::make(Livewire::make())) + ->hidden(); + + expect($component) + ->isHidden()->toBeTrue(); +}); + +test('components can be hidden based on condition', function () { + $statePath = Str::random(); + + $container = ComponentContainer::make(Livewire::make()) + ->components([ + (new Component()) + ->when(fn (callable $get) => $get($statePath) === false), + ]) + ->fill([ + $statePath => true, + ]); + + expect($container->getComponents()) + ->toHaveCount(0); + + $container->components([ + (new Component()) + ->whenTruthy($statePath), + ]); + + expect($container->getComponents()) + ->toHaveLength(1); + + $container->components([ + (new Component()) + ->whenFalsy($statePath), + ]); + + expect($container->getComponents()) + ->toHaveLength(0); + + $container + ->components([ + (new Component()) + ->whenFalsy([$statePath, 'bob']), + ]) + ->fill([ + 'bob' => true, + ]); + + expect($container->getComponents()) + ->toHaveLength(0); + + $container + ->components([ + (new Component()) + ->whenTruthy([$statePath, 'bob']), + ]) + ->fill([ + 'bob' => true, + ]); + + expect($container->getComponents()) + ->toHaveLength(1); +}); + +test('hidden components are not returned from container', function () { + $components = []; + + foreach (range(1, $visibleCount = rand(2, 10)) as $i) { + $components[] = new Component(); + } + + foreach (range(1, rand(2, 10)) as $i) { + $components[] = (new Component())->hidden(); + } + + $componentsBoundToContainer = ($container = ComponentContainer::make(Livewire::make())) + ->components($components) + ->getComponents(); + + expect($componentsBoundToContainer) + ->toHaveCount($visibleCount) + ->each( + fn ($component) => $component + ->toBeInstanceOf(Component::class) + ->isHidden()->toBeFalse() + ->getContainer()->toBe($container), + ); +}); diff --git a/tests/src/Forms/StateBindingModifiersTest.php b/tests/src/Forms/StateBindingModifiersTest.php new file mode 100644 index 0000000000..ca7c28f7e9 --- /dev/null +++ b/tests/src/Forms/StateBindingModifiersTest.php @@ -0,0 +1,47 @@ +container(ComponentContainer::make(Livewire::make())); + + expect($component) + ->getStateBindingModifiers()->toBe(['defer']); +}); + +test('component state binding can be reactive', function () { + $component = (new Component()) + ->container(ComponentContainer::make(Livewire::make())) + ->reactive(); + + expect($component) + ->getStateBindingModifiers()->toBe([]); +}); + +test('component state binding can be lazy', function () { + $component = (new Component()) + ->container(ComponentContainer::make(Livewire::make())) + ->lazy(); + + expect($component) + ->getStateBindingModifiers()->toBe(['lazy']); +}); + +test('components inherit their state binding modifiers', function () { + $component = (new Component()) + ->container( + ComponentContainer::make(Livewire::make()) + ->parentComponent( + (new Component())->stateBindingModifiers($modifiers = [Str::random()]), + ), + ); + + expect($component) + ->getStateBindingModifiers()->toBe($modifiers); +}); diff --git a/tests/src/Forms/StateTest.php b/tests/src/Forms/StateTest.php new file mode 100644 index 0000000000..d8f6998a96 --- /dev/null +++ b/tests/src/Forms/StateTest.php @@ -0,0 +1,183 @@ +statePath($containerStatePath = Str::random()); + + expect($container) + ->getStatePath()->toBe($containerStatePath); +}); + +test('container has state path and inherits state path from parent component', function () { + $container = ComponentContainer::make(Livewire::make()) + ->parentComponent( + (new Component()) + ->container(ComponentContainer::make(Livewire::make())) + ->statePath($parentComponentStatePath = Str::random()), + ) + ->statePath($containerStatePath = Str::random()); + + expect($container) + ->getStatePath()->toBe("{$parentComponentStatePath}.{$containerStatePath}"); +}); + +test('component has state path', function () { + $component = (new Component()) + ->container(ComponentContainer::make(Livewire::make())) + ->statePath($componentStatePath = Str::random()); + + expect($component) + ->getStatePath()->toBe($componentStatePath); +}); + +test('component inherits state path from container', function () { + $component = (new Component()) + ->container( + ComponentContainer::make(Livewire::make()) + ->statePath($containerStatePath = Str::random()), + ); + + expect($component) + ->getStatePath()->toBe($containerStatePath); +}); + +test('component has state path and inherits state path from container', function () { + $component = (new Component()) + ->container( + ComponentContainer::make(Livewire::make()) + ->statePath($containerStatePath = Str::random()), + ) + ->statePath($componentStatePath = Str::random()); + + expect($component) + ->getStatePath()->toBe("{$containerStatePath}.{$componentStatePath}"); +}); + +test('state can be hydrated from array', function () { + ComponentContainer::make($livewire = Livewire::make()) + ->statePath('data') + ->components([ + (new Component()) + ->statePath($statePath = Str::random()), + ]) + ->fill([$statePath => ($state = Str::random())]); + + expect($livewire) + ->getData()->toBe([$statePath => $state]); +}); + +test('state can be hydrated from defaults', function () { + ComponentContainer::make($livewire = Livewire::make()) + ->statePath('data') + ->components([ + (new Component()) + ->statePath($statePath = Str::random()) + ->default($state = Str::random()), + ]) + ->fill(); + + expect($livewire) + ->getData()->toBe([$statePath => $state]); +}); + +test('custom logic can be executed after state is hydrated', function () { + ComponentContainer::make($livewire = Livewire::make()) + ->statePath('data') + ->components([ + (new Component()) + ->statePath($statePath = Str::random()) + ->afterStateHydrated(fn (Component $component, $state) => $component->state(strrev($state))), + ]) + ->fill([$statePath => ($value = Str::random())]); + + expect($livewire) + ->getData()->toBe([$statePath => strrev($value)]); +}); + +test('custom logic can be executed after state is updated', function () { + ComponentContainer::make($livewire = Livewire::make()) + ->statePath('data') + ->components([ + (new Component()) + ->statePath($statePath = Str::random()) + ->afterStateUpdated(fn (Component $component, $state) => $component->state(strrev($state))), + ]) + ->fill([$statePath => ($state = Str::random())]) + ->callAfterStateUpdated("data.{$statePath}"); + + expect($livewire) + ->getData()->toBe([$statePath => strrev($state)]); +}); + +test('state can be dehydrated', function () { + $container = ComponentContainer::make(Livewire::make()) + ->statePath('data') + ->components([ + (new Component()) + ->statePath($statePath = Str::random()) + ->default($state = Str::random()), + ]) + ->fill(); + + expect($container) + ->dehydrateState()->toBe([ + 'data' => [$statePath => $state], + ]); +}); + +test('state can be dehydrated using custom logic', function () { + $container = ComponentContainer::make(Livewire::make()) + ->statePath('data') + ->components([ + (new Component()) + ->statePath($statePath = Str::random()) + ->default($state = Str::random()) + ->dehydrateStateUsing(fn ($state) => strrev($state)), + ]) + ->fill(); + + expect($container) + ->dehydrateState()->toBe([ + 'data' => [$statePath => strrev($state)], + ]); +}); + +test('custom logic can be executed before state is dehydrated', function () { + $container = ComponentContainer::make(Livewire::make()) + ->statePath('data') + ->components([ + (new Component()) + ->statePath($statePath = Str::random()) + ->default($state = Str::random()) + ->beforeStateDehydrated(fn (Component $component, $state) => $component->state(strrev($state))), + ]) + ->fill(); + + expect($container) + ->dehydrateState()->toBe([ + 'data' => [$statePath => strrev($state)], + ]); +}); + +test('components can be excluded from state dehydration', function () { + $container = ComponentContainer::make(Livewire::make()) + ->statePath('data') + ->components([ + (new Component()) + ->statePath(Str::random()) + ->default(Str::random()) + ->dehydrated(false), + ]) + ->fill(); + + expect($container) + ->dehydrateState()->toBe([]); +}); diff --git a/tests/src/Forms/ValidationTest.php b/tests/src/Forms/ValidationTest.php new file mode 100644 index 0000000000..19dfdbb2fa --- /dev/null +++ b/tests/src/Forms/ValidationTest.php @@ -0,0 +1,90 @@ +statePath('data') + ->components([ + $field = (new Field(Str::random())) + ->required(), + ]) + ->validate(); + } catch (ValidationException $exception) { + $rules = array_keys($exception->validator->failed()[$field->getStatePath()]); + } + + expect($rules) + ->toContain('Required'); +}); + +test('fields use custom validation rules', function () { + $rules = []; + + try { + ComponentContainer::make(Livewire::make()) + ->statePath('data') + ->components([ + $field = (new Field(Str::random())) + ->rule('email') + ->default(Str::random()), + ]) + ->fill() + ->validate(); + } catch (ValidationException $exception) { + $rules = array_keys($exception->validator->failed()[$field->getStatePath()]); + } + + expect($rules) + ->toContain('Email'); +}); + +test('fields can be conditionally validated', function () { + $rules = []; + + try { + ComponentContainer::make(Livewire::make()) + ->statePath('data') + ->components([ + $field = (new Field(Str::random())) + ->required($isRequired = rand(0, 1)), + ]) + ->validate(); + } catch (ValidationException $exception) { + $rules = array_keys($exception->validator->failed()[$field->getStatePath()]); + } + + if ($isRequired) { + expect($rules) + ->toContain('Required'); + } else { + expect($rules) + ->not->toContain('Required'); + } +}); + +test('first invalid field can be focused', function () { + $container = ComponentContainer::make(Livewire::make()) + ->statePath('data') + ->components([ + (new Field(Str::random())), + $fieldToFocus = (new Field($firstInvalidFieldName = Str::random())), + (new Field($secondInvalidFieldName = Str::random())), + ]); + + expect($container) + ->getInvalidComponentToFocus([ + "data.{$firstInvalidFieldName}", + "data.{$secondInvalidFieldName}", + ])->toBe($fieldToFocus); +}); diff --git a/tests/src/Models/Post.php b/tests/src/Models/Post.php new file mode 100644 index 0000000000..6de6606a17 --- /dev/null +++ b/tests/src/Models/Post.php @@ -0,0 +1,29 @@ + 'array', + ]; + + protected $guarded = []; + + public function author(): BelongsTo + { + return $this->belongsTo(User::class, 'author_id'); + } + + protected static function newFactory() + { + return PostFactory::new(); + } +} diff --git a/tests/src/Models/User.php b/tests/src/Models/User.php new file mode 100644 index 0000000000..aa8e45349b --- /dev/null +++ b/tests/src/Models/User.php @@ -0,0 +1,30 @@ +loadMigrationsFrom(__DIR__ . '/../database/migrations'); + } + + protected function getEnvironmentSetUp($app): void + { + $app['config']->set('auth.providers.users.model', User::class); + } +} diff --git a/webpack.mix.js b/webpack.mix.js new file mode 100644 index 0000000000..c001b26a43 --- /dev/null +++ b/webpack.mix.js @@ -0,0 +1,22 @@ +const mix = require('laravel-mix'); +const tailwindcss = require('tailwindcss'); + +mix.disableSuccessNotifications() +mix.options({ + terser: { + extractComments: false, + }, +}) +mix.setPublicPath('packages/admin/dist') +mix.setResourceRoot('packages/admin/resources') +mix.sourceMaps() +mix.version() + +mix.js('packages/admin/resources/js/app.js', 'packages/admin/dist') + +mix + .postCss('packages/admin/resources/css/app.css', 'packages/admin/dist', [ + tailwindcss('packages/admin/tailwind.config.js'), + ]).options({ + processCssUrls: false, + })